Python中的 列表推导式 可以使用非常简洁的方法来 快速 生成满足特定需求的列表,代码具有非常强的可读性。另外Python的内部实现对列表推导式的 大量优化,可以保证 很快的运行速度。
[表达式 for 变量 in 序列或迭代对象]
下面三段代码的结果是等价的
aList = [x*x for x in range(10)]
print(aList)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
aList = []
for x in range(10):
aList.append(x * x)
print(aList)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
aList =list(map(lambda x: x * x ,range(10)))
print(aList)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
生成器推导式的结果是一个 生成器对象 ,而不是列表,也不是元组。使用生成器对象的元素时,可以根据需要将其转化为列表或者元组,也可以使用生成器对象的__next__()方法或者内置函数 next()进行遍历,或者直接将其作为迭代器对象来使用。
(表达式 for 变量 in 序列或迭代对象)
1、查看生成器的类型
aTuple = (x*x for x in range(10))
print(aTuple)
print(type(aTuple))
at 0x000002056EC36B10>
2、使用__next__() 方法 和 next() 函数进行打印值
aTuple = (x*x for x in range(10))
print(aTuple.__next__())
print(next(aTuple))
0
1
3、使用循环直接遍历生成器对象中的元素
aTuple = (x*x for x in range(10))
for i in aTuple:
print(i,end="")
print(" ")
0
1
4
9
16
25
36
49
64
81
4、包含yield语句的函数可以用来创建可迭代的生成器对象
yield语句相当于return语句,但它返回一个生成器对象。
# 生成斐波那契数列
def fun(): # 序列解包,同时为多个元素赋值
a,b = 1,1
while True:
yield a # 暂停执行,需要时再产生一个新元素
a,b = b, a+b
a = fun() # 创建生成器对象
for i in range(10):
print(a.__next__(),end='')
print()
1
1
2
3
5
8
13
21
34
55
不管用哪种方法访问其元素,当所有元素访问结束以后,如果需要重新访问其中的元素,必须重新创建该生成器对象。
字典推导式与上面两种推导式的作用有相似之处,都是加强代码的可读性,加快运行速度。
{表达式:表达式 for 变量,变量 in 序列或可迭代对象}
1、第一个案例
aDict = {i*i:str(i) for i in range(10)}
print(aDict)
{0: '0', 1: '1', 4: '2', 9: '3', 16: '4', 25: '5', 36: '6', 49: '7', 64: '8', 81: '9'}
2、第二个案例
x = [4,5,6,7]
y = ['1','2','3','4']
aDict = {i:j for i,j in zip(x,y)}
print(aDict)
{4: '1', 5: '2', 6: '3', 7: '4'}