python编程快速入手——让繁琐工作自动化
第四章学习记录
4.1列表数据类型
4.1.1用下标取得列表中的单个值
假定列表[‘cat’,‘bat’,‘rat’,‘elephant’]保存在名为spam的变量中。
如spam[0]表示列表中的第一个值,以此类推
下标只能是整数,不能是浮点值
列表也可以包含其他列表值
如spam=[[‘cat’,‘bat’],[10,20,30,40,50]]
spam[0][1]第一个下标表示使用哪个列表值,第二个下标表明该列表值中的值
4.1.2负数下标
整数值-1指的是列表中的最后一个下标,-2指的是列表中倒数第二个下标,以此类推
4.1.3利用切片取得子列表
“切片”可以从列表中取得多个值,结果是一个新列表
spam[2]是一个列表和下标(一个整数)
spam[1:4]是一个列表和切片(两个整数)
在一个切片中,第一个整数是切片开始处的下标,第二个整数是切片结束处的下标
切片向上增长,直至第二个下标的值,但不包括它
快捷方法:可省略切片中冒号两边的一个下标或两个下标
省略第一个下标相当于使用0,或列表的开始
省略第二个下标相当于使用列表的长度,意味着切片直至列表的末尾
如
spam=[‘cat’,‘bat’,‘rat’,‘elephant’]
spam[:2]
[‘cat’,‘bat’]spam[1:]
[‘bat’,‘rat’,‘elephant’]spam[:]
[‘cat’,‘bat’,‘rat’,‘elephant’]
4.1.4用len()取得列表的长度
len()函数将返回传递给它的列表中值的个数
4.1.5用下标改变列表中的值
如spam[1]=‘balabala’
意味着‘“将列表spam下标1处的值赋值为‘balabala’”
4.1.6列表连接和列表复制
+操作符可以连接两个列表,得到一个新列表
[1,2,3]+[‘A’,‘B’,‘C’]
[1,2,3,‘A’,‘B’,‘C’]
*操作符可以用于一个列表个一个整数,实现列表的复制
[‘X’,‘Y’,‘Z’]*3
[‘X’,‘Y’,‘Z’,‘X’,‘Y’,‘Z’,‘X’,‘Y’,‘Z’]spam=[1,2,3]
spam=spam+[‘A’,‘B’,‘C’]
spam
[1,2,3,‘A’,‘B’,‘C’]
4.1.7用del语句从列表中删除值
del语句将删除列表中下标处的值,表中被删除值后面的所有值,都将向前移动一个下标
spam=[‘cat’,‘bat’,‘rat’,‘elephant’]
del spam[2]
spam
[‘cat’,‘bat’,‘elephant’]
4.2使用列表
4.2.1列表用于循环
循环是针对一个列表或类似列表中的每个值,重复的执行代码块
——————
for i in range(4)
print(i)
——————
程序输出将是:
——————
0
1
2
3
——————
4.2.2 in和not in 操作符
利用in和not in操作符,可以确定一个值是否在列表中,连接两个值:一个要在列表中查找的值,以及待查找的列表
这些表达式将求值为布尔值
4.2.3多重赋值技巧
多重赋值技巧是一种快捷方式,可以在一行代码中,用列表中的值为多个变量赋值
如用
cat=[‘fat’,‘black’,‘loud’]
size,color,disposition=cat
代替
cat=[‘fat’,‘black’,‘loud’]
size=cat[0]
color=cat[1]
disposition=cat[2]
变量的数目和列表的长度必须严格相等
4.3增强的赋值操作
针对+、-、*、/、和%操作符都有增强的赋值操作符
增强的赋值操作符 | 等价的赋值语句 |
---|---|
spam+=1 | spam=spam+1 |
spam-=1 | spam=spam-1 |
spam*=1 | spam=spam*1 |
spam/=1 | spam=spam/1 |
spam%=1 | spam=spam%1 |
4.4方法
4.4.1用inde()方法在列表中查找值
列表值有一个index()方法,可以传入一个值,如果该值存在于列表中,就返回它的下标;如果该值不在列表中,Python就报ValueError
spam=[‘Hello’,‘hi’,‘howdy’,‘heyas’]
spam.index(‘Hello’)
0spam.index(‘heyas’)
3spam.index(‘howdy howdy howdy’)
Traceback (most recent call last):
File “<pyshell#4>”, line 1, in
spam.index(‘howdy howdy howdy’)
ValueError: ‘howdy howdy howdy’ is not in list
如果列表中存在重复的值,就返回它第一次出现的下标
spam=[‘Zophie’,‘Pooka’,‘dog’,‘bat’]
spam.index(‘Pooka’)
1
4.4.2用append()和insert()方法在列表中添加值
spam=[‘cat’,‘dog’,‘bat’]
spam.append(‘moose’)
spam
[‘cat’, ‘dog’, ‘bat’, ‘moose’]
此方法将参数添加到列表的末尾
insert()方法可以在列表任意下标处插入一个值
[‘cat’, ‘dog’, ‘bat’, ‘moose’]
spam=[‘cat’,‘dog’,‘bat’]
spam.insert(1,‘chicken’)
spam
[‘cat’, ‘chicken’, ‘dog’, ‘bat’]
4.4.3用remove()方法从列表中删除值
给remove()方法传入一个值,它将从被调用的列表中删除
spam=[‘cat’,‘bat’,‘rat’,‘elephant’]
spam.remove(‘bat’)
spam
[‘cat’, ‘rat’, ‘elephant’]
试图删除列表中不存在的值,将导致ValueError错误
如果该值在列表中出现多次,只有第一次出现的值会被删除
4.4.4用sort()方法将列表的值排序
数值的列表或字符串的列表,能用sort()方法排序
spam=[2,5,3.14,1,-7]
spam.sort()
spam
[-7, 1, 2, 3.14, 5]
也可以将单词按字母表顺序排列
也可以指定reverse关键字参数为True,让sort()按逆序排序
spam.sort(reverse=True)
spam
[5, 3.14, 2, 1, -7]
关于sort()方法需要注意的三件事
1、sort()方法当场对列表排序
2、不能对既有数字又有字符串值得列表排序
3、sort()方法对字符串排序时,使用"ASCII字符顺序",而不是实际的字母顺序
即意味着大写字母排在小写字母之前
如
spam=[‘Alice’,‘ants’,‘Bob’,‘badgers’,‘Carol’,‘cats’]
spam.sort()
spam
[‘Alice’, ‘Bob’, ‘Carol’, ‘ants’, ‘badgers’, ‘cats’]
如果需要按照普通的字典顺序来排序,就在sort()方法调用时,将关键字参数key设置为str.lower
spam=[‘a’,‘z’,‘A’,‘Z’]
spam.sort(key=str.lower)
spam
[‘a’, ‘A’, ‘z’, ‘Z’]
4.5例子程序:神奇8球和列表
4.5.1类似列表的类型:字符串和元组
列表并不是唯一表示序列值的数据类型
对于列表的许多操作,也可以用于字符串:按下标取值、切片、用于for循环、用于len(),以及用于in 和not in操作符
name=‘Zophie’
name[0]
‘Z’name[-2]
‘i’name[0:4]
‘Zoph’'Zo’in name
True'z’in name
False
4.6.1可变和不可变数据类型
列表是“可变的”数据类型,它的值可以添加、删除或改变
字符串是“不可变的”,它不能被更改
对字符串中的一个字符重新赋值,将导致TypeError错误
name=‘Zophie a cat’
name[7]=‘the’
Traceback (most recent call last):
File “<pyshell#22>”, line 1, in
name[7]=‘the’
TypeError: ‘str’ object does not support item assignment
“改变”一个字符串的正确方式,是使用切片和连接
构造一个“新的”字符串,从老的字符串那里复制一部分
name=‘Zophie a cat’
newName=name[0:7]+‘the’+name[8:12]
name
‘Zophie a cat’newName
‘Zophie the cat’
egga=[1,2,3]
eggs=[1,2,3]
eggs=[4,5,6]
eggs
[4, 5, 6]eggs=[1,2,3]
del eggs[2]
del eggs[1]
del eggs[0]
eggs
[]eggs.append(4)
eggs
[4]
4.6.2元组数据类型
“元组”数据类型的与列表数据的不同之处
1、元组输入时用圆括号(),而不是用方括号[]
eggs=(‘hello’,42,0.5)
eggs[0]
‘hello’eggs[1:3]
(42, 0.5)len(eggs)
3
2、元组与列表的主要区别在于,元组像字符串一样,是不可变的
元组不能让他们的值被修改、添加或删除
eggs=(‘hello’,42,0.5)
eggs[1]=99
Traceback (most recent call last):
File “<pyshell#47>”, line 1, in
eggs[1]=99
TypeError: ‘tuple’ object does not support item assignment
4.6.3用list()和tuple()函数来转换类型
函数list()和tuple()将返回传递给它们的值的列表和元组版本
tuple([‘cat’,‘dog’,5])
(‘cat’, ‘dog’, 5)list([‘cat’,‘dog’,5])
[‘cat’, ‘dog’, 5]list(‘hello’)
[‘h’, ‘e’, ‘l’, ‘l’, ‘o’]
4.7引用
spam=42
cheese=spam
spam=100
spam
100cheese
42
列表中
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]
变量包含对列表值的引用,而不是列表值本身
4.7.1传递引用
当函数被调用时,参数的值被复制给变元
对于列表,这意味着变元得到的是引用的拷贝
4.7.2copy模块的copy()和deepcopy()函数
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()函数将同时复制它们内部的列表