假期第(11)天
元组-1
l 元组也是Python的重要序列结构。从形式上,元组的
所有元素放在一对圆括号中,元素之间使用逗号分隔。
>>> x = (1, 2, 3) #直接把元组赋值给一个变量
>>> type(x) #使用type()函数查看变量类型
<class 'tuple'>
>>> x = (3) #这和x = 3是一样的
>>> x
3
>>> x = (3,) #如果元组中只有一个元素,则其后的逗号不能省
>>> x
(3,)
>>> x = ()
#空元组1
>>> x = tuple()
#空元组2
>>> x
()
>>> tuple(range(5))
#将其他迭代对象转换为元组
(0, 1, 2, 3, 4)
元祖与生成器推导式3
6
36
元组-2
l 元组属于不可变序列,一旦创建,不能修改元素的值,
不能增加或删除元素,只能使用del命令删除元组
l 元组也支持切片操作,但是只能通过切片来访问元组
中的元素,而不支持使用切片来修改元组中元素的值,
也不支持使用切片操作来为元组增加或删除元素
l 可以认为元组是轻量级的列表,或者"常量列表";元
组的访问和处理速度比列表更快
l 如果定义了一系列常量值,主要用途仅是对它们进行
遍历或其他类似用途,而不需要对其元素进行任何修
改,那么安全角度建议使用元组而不用列表。
l 作为不可变序列,与整数、字符串一样,元组可用作
字典的键,而列表则永远都不能当做字典键使用,也
不能作为集合中的元素,因为列表不是不可变的,或
者说不可哈希
元祖与生成器推导式3
37
7
元组注意事项
l 注意:虽然元组属于不可变序列,其元素的值是不可
改变的,但是如果元组中包含可变序列,情况就又变
得复杂了。例如下面的代码:
>>> x = ([1, 2], 3) #包含列表的元组
>>> x[0][0] = 5 #修改元组中列表元素
>>> x
([5, 2], 3)
>>> x[0].append(8) #为元组中的列表增加元素,x[0]不变
>>> x
([5, 2, 8], 3)
>>> x[0] = x[0] + [10] #试图修改元组的值,失败,
raceback (most recent call last):
File "<pyshell#83>", line 1, in <module>
x[0] = x[0] + [10]
TypeError: 'tuple' object does not support item assignment
元祖与生成器推导式3
38
8
生成器推导式
l 形式上看,生成器推导式使用圆括号而不是列表推导
式所使用的方括号
l 与列表推导式不同的是,生成器推导式的结果是一个
生成器对象,而不是列表,也不是元组
l 使用生成器对象的元素时,可以根据需要将其转化为
列表或元组,也可以使用生成器对象的__next__()方
法或者内置函数next()进行遍历,或者直接将其作为
迭代器对象来使用
l 不管用哪种方法访问其元素,当所有元素访问结束以
后,如果需要重新访问其中的元素,必须重新创建该
生成器对象(惰性特征)
元祖与生成器推导式3
39
9
生成器推导式示例
>>> g = ((i+2)**2 for i in range(10))
#创建生成器对象
>>> g
<generator object <genexpr> at 0x0000000003095200>
>>> tuple(g)
#将生成器对象转换为元组
(4, 9, 16, 25, 36, 49, 64, 81, 100, 121)
>>> list(g)
#生成器对象已遍历结束,没有元素了
[]
>>> g = ((i+2)**2 for i in range(10))
>>> g.__next__()
#生成器对象的__next__()方法获取元素
4
>>> next(g) #使用内置函数next()获取生成器对象中的元素
9
>>> g = ((i+2)**2 for i in range(10))
>>> for item in g:
#使用循环直接遍历生成器对象中的元素
print(item, end=' ')
4 9 16 25 36 49 64 81 100 121
元祖与生成器推导式40
4
0
生成器对象
l 包含yield语句的函数可用来创建可迭代的生成器对象
def f():
a, b = 1, 1 #序列解包,同时为多个元素赋值
while True:
yield a #暂停执行,需要时再产生一个新元素
a,b=b,a+b #序列解包,继续生成新元素
a = f() #创建生成器对象
for i in range(10): #斐波那契数列中前10个元素
print(a.__next__(), end=' ')
for i in f(): #斐波那契数列中第一个大于100的元素
if i > 100:
print(i, end=' ')
break