Python基础学习笔记(2)

时间:2022-04-18 06:00:55

《Python编程快速上手》

1. None值和print()

在Python中有一个值称为None,它表示没有值。None是NoneType数据类型的唯一值(其他编程语言可能称这个值为null、nil或undefined)。

如果你希望变量中存储的东西不回与一个真正的值混淆,这个没有值的值就可能有用。

还有,没有明确定义return时,会隐式地加上return None。

print()

#1.print()函数自动在传入地字符串末尾添加了换行符。所以会在两行显示,如下所示
print("Hello")
print("World")
>>Hello
>>World

#2.设置end关键字参数,将它变成另一个字符串。如下所示、
print("Hello",end=")
print("World")
>>HelloWorld

#3.如果向print()传入多个字符串值,该函数就会自动用一个空格分隔它们。
print("cats","dogs","mice")
>>cats dogs mice

#4.你可以传入sep关键词参数,替换掉默认地分隔字符串。
print("cats","dogs","mice",seq=",")
>>cats,dogs,mice

2.global语句

全局变量和局部变量:

附注:局部作用域不能使用其他局部作用域内的变量。

def spam():
    eggs = "spam local"
    print(eggs)         # 'spam local'

def bacon():
    eggs = "bacon local"
    print(eggs)         # 'bacon local'
    spam()
    print(eggs)         # 'bacon local'

eggs = "global"
bacon()
print(eggs)             # 'global'

#运行结果
>>bacon local
>>spam local' >>bacon local >>global 

如果需要在一个函数内修改全局变量,就使用global语句。

如果在函数地顶部有global eggs这样的代码,它就告诉Python,“在这个函数中,eggs指的时全局变量,所以不要用这个名字创建一个局部变量。”

def spam():
    global eggs
    eggs = "spam"
eggs = "global"
spam()
print(eggs)

>>spam

在一个函数中,一个变量要么总是全局变量,要么总是局部变量。函数中的代码没有办法先使用名为eggs的局部变量,稍后又在同一个函数中使用全局eggs变量。

如果想在一个函数中修改全局变量中存储的值,就必须对该变量使用global语句。

在一个函数中,如果试图在局部变量赋值之前就使用它,像下面的程序这样,Python就会报错。

def spam():
    print(eggs)        #ERROR!
    eggs = "spam local"

eggs = "global"
spam()

>>UnboundLocalError: local variable 'eggs' referenced before assignment

发生这个错误是因为,Python看到spam()函数中针对eggs的赋值语句,因此认为eggs变量是局部变量。但是因print(eggs)的执行咋eggs赋值之前,局部变量eggs并不存在。Python不回退回到使用全局eggs变量。

3.Python异常处理

错误可以由try和except语句来处理。那些可能出错的语句被放在try子句中。如果发生错误,程序执行就转到接下来的except子句开始处。

def spam(divideBy):
    try:
        return 42/divideBy
    except ZeroDivisionError:
        print("Error:Invalid argument")

print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))

>>21.0
>>3.5

>>Error:Invalid argument.
>>None

>>42.0

对于print(spam(0)),会返回None,因为对于没有return语句的函数定义或者使用不带值的return语句,那就返回None,因为外面有print()这个函数,要对返回的进行打印输出,所以这时就打印输出None。

还有,对try except的执行顺序是,try有问题时执行except,except执行完之后,跳出来try except的执行语句,try内的后续代码不执行,继续执行下面的代码了。

4.Python列表

Python列表: ['cat','bat','rat','elephant']

#Python列表
spam = ['cat','bat','rat','elephant']
#列表中可以嵌套列表,可以通过多重下标来访问
spam1 = [['cat','bat'],['rat','elephant']]

#下表获得列表中的值
sapm[0]
>>‘cat’ 
spam1[0]
>>['cat','bat']
spam[0][1]
>>'bat'

#利用切片获得子列表
spam[1:3]
>>['bat','rat']
spam[:2]
>>['cat','bat']

#用下标改变列表中的值
spam[1] = 'aardvark'
spam
>>['cat','aardvark','rat','elephant']

#列表连接和列表复制
spam = ['A','B','C']
spam * 3
>>['A','B','C','A','B','C','A','B','C']
sapm = spam + [1,2,3]
spam
>>['A','B','C',1,2,3]

#用del语句从列表中删除值
spam = ['cat','bat','rat','elephant']
del spam[2]
spam
>>spam = ['cat','bat','elephant']

#列表由于循环
fruits = ['banana','apple','margo']
for fruit in fruits:
    print(fruit)

#in和not in操作符,可以确定一个值是否在列表中
spam = ['cat','bat','rat','elephant']
'cat' in spam
>>True

#多重赋值技巧
cat = ['fat','black','loud']
size = cat[0]
color = cat[1]
disposition = cat[2]
#使用多重赋值就可以直接用下面的方式(注意数目和长度要必须严格相等)
cat = ['fat','black','loud']
size,color,disposition = cat

附注:“切片”可以从列表中取得多个值,结果是一个新列表。

列表中的方法:

#index()返回下标
spam = ['hello','hi','howdy','heyas']
spam.index('hello')
>>0

#append()和insert()在列表中添加值
spam = ['cat','dog','bat']
spam.append('mose')
spam
>>['cat','dog','bat','mose']

spam = ['cat','dog','bat']
spam.insert(1,'chicken')
spam
>>['cat','chicken','dog','bat']

#remove()方法从列表中删除值,如果想通过下标记删除,del()就很好用,如果通过值删除,remove()就很好用
spam = ['cat','bat','rat','elephant']
spam.remove('bat')
spam
>>['cat','rat','elephant']

#用sort方法将列表中的值排序,也可以指定reverse参数为True,让sort()按逆序排序。
spam = [2,5,3.14,1,-7]
spam.sort()
spam
>>[-7,1,2,3.14,5]
spam = ['ants','cats','dogs','badgers','elephants']
spam.sort()
spam
>>['ants','badgers','cats','dogs','elephants']
spam.sort(reverse=True)
spam
>>['elephants','dogs','cats','badgers','ants']

附注:
1..append()和.insert()都是让列表被“当场修改了”,而不是用spam = spam.append('mose')之类的代码,而且append()和insert()的返回值是None。
2.方法属于单个数据类型,append()和insert()方法是列表方法,只能在列表上调用,不能在其他值上调用,例如字符串和整型。
3.sort()方法中,不能即对有数字又有字符串值的列表排序。
4.sort()方法对字符串排序时,使用“ASCII字符排序”,而不是实际的字典顺序,这意味着大写字母排在小写字母之前。
5.sort()方法中,如果需要按照普通的字典顺序来排序,就在sort()方法调用时,将关键字参数key设置为str.lower。 spam.sort(key=str.lower)

类似列表的类型:字符串和元组

列表并不是唯一表示序列值的数据类型。

例如,字符串和列表实际上很相似,只要你认为字符串是单个文本字符的列表。

对列表的许多操作,也可以用于字符串:按下标取值、切片、用于for循环、用于len(),以及用于in和not in操作符。

name = 'Zohpie'

name[0]
>>'Z'
name[0:4]
>>'Zoph'
'Zo' in name
>>True
for i in name:
    print(i)
>>Z
>o
>p
>h
>i
>e

可变和不可变数据类型

但列表和字符串在一个重要的方面是不同的。

列表是“可变的”数据类型,它的值可以添加、删除或改变。
但是字符串是“不可变的”,它不能被更改。

name = "Zophie"
name[3] = 'p'
>>TypeError: 'str' object does not support item assignment

改变一个字符串的正确方式,是使用切片和连接。

name = "Zophie"
newname = name[0:2]+ 'the' +name[2:]

name
>>Zophie
newname
>>Zothephie

元组是不可改变的,但可以通过切片来改变。

temp = ['小甲鱼','黑夜','A','B']
temp = temp[:2]+ ['C'] +temp[2:]
temp
>>['小甲鱼', '黑夜', 'C', 'A', 'B']

新建元组贴上temp这个标签,原来的元组没有对应标签会被回收。变量名temp相当于标签贴在数据上。

5.Python元组

除了两个方面,“元组”数据类型几乎与列表数据类型一样。

首先,元组输入时用圆括号(),而不是方括号[ ]。

第二,元组与列表的主要区别还在于,元组与字符串一样,是不可变的。

用list()和tuple()函数来转换类型:

#列表转换成元组
tuple(['cat','dog',5])
('cat','dog',5)
#元组转换成列表
tuple(('cat','dog',5))
['cat','dog',5]
#字符串转换成列表
list('hello')
['h','e','l','l','o']
#字符串转换成元组
tuple('hello')
('h','e','l','l','o')

引用和传递引用

#引用
spam = [0,1,2,3,4,5]
cheese = spam
cheese[1] = 'hello!'
spam
>>[0,'hello!',2,3,4,5]
cheese
>>[0,'hello!',2,3,4,5]

代码只改变了cheese列表,但cheese和spam列表同时发生了改变。

当创建列表时,你将对它的引用赋给了变量。代码cheese = spam将spam中的列表引用拷贝到cheese,而不是列表值本身,这意味着存储在spam和cheese中的值,现在指向同一个列表。

在变量必须保存可变数据类型的值时,例如列表或字典,Python就使用引用。
对于不可变的数据类型的值,例如字符串、整型或元组,Python变量就保存值本身。
也就是,列表或字典中变量包含的是值的引用,而不是值的本身。但对于字符串,整型和元组,变量就包含了字符串或整数值。

#传递引用
def eggs(someParameter):
    someParameter.append('Hello')
spam = [1,2,3]
eggs(spam)
print(spam)
>>[1,2,3,'Hello']

尽管spam和someParameter包含了不同的引用,但它们都仍然指向相同的列表。这就是传递引用。

6.copy模块的copy()和deepcopy()函数

在处理列表和字典时,尽管传递引用常常时最方便的方法,但如果函数修改了传入的列表或字典,你可能不希望这些变动影响原来的列表或字典。

#copy模块的copy()函数
import copy
spam = ['A','B','C','D']
cheese = copy.copy(spam)
cheese[1] = 42
spam
>>['A','B','C','D']
cheese
>>['A',42,'C','D']

#如果要复制的列表中包含了列表,那就使用copy.deepcopy()函数来代替
#deepcopy()函数同时复制它们内部的列表

如果需要对一个变量中的列表修改,同时不修改原来的列表,就可以用copy()或deepcopy()。