python的列表推导式/列表生成式和生成器表达式

列表表达式和列表生成式是一样的,只是有两种称呼。

格式:

[函数式 for 自变量 in 列表]或[函数式 for 自变量 in 列表 if 条件判断]

print([(x+1,y+1,z**2)for x in range(3) if x%2==0 for y in range(5)for z in range(6)])
[(1, 1, 0), (1, 1, 1), (1, 1, 4), (1, 1, 9), (1, 1, 16), (1, 1, 25), (1, 2, 0), (1, 2, 1), (1, 2, 4), (1, 2, 9), (1, 2, 16), (1, 2, 25), (1, 3, 0), (1, 3, 1), (1, 3, 4), (1, 3, 9), (1, 3, 16), (1, 3, 25), (1, 4, 0), (1, 4, 1), (1, 4, 4), (1, 4, 9), (1, 4, 16), (1, 4, 25), (1, 5, 0), (1, 5, 1), (1, 5, 4), (1, 5, 9), (1, 5, 16), (1, 5, 25), (3, 1, 0), (3, 1, 1), (3, 1, 4), (3, 1, 9), (3, 1, 16), (3, 1, 25), (3, 2, 0), (3, 2, 1), (3, 2, 4), (3, 2, 9), (3, 2, 16), (3, 2, 25), (3, 3, 0), (3, 3, 1), (3, 3, 4), (3, 3, 9), (3, 3, 16), (3, 3, 25), (3, 4, 0), (3, 4, 1), (3, 4, 4), (3, 4, 9), (3, 4, 16), (3, 4, 25), (3, 5, 0), (3, 5, 1), (3, 5, 4), (3, 5, 9), (3, 5, 16), (3, 5, 25)]

生成器表达式:

惰性计算,延迟求值。并不会在生成器表达式被执行时就像列表生成器一样把整个列表返回出来,而只会在你需要列表中某个元素的时候再进行计算并返回。因此,一般在序列过长并且并不需要一次得到所有值时运用生成器表达式。

(函数式 for 自变量 in 列表)或(函数式 for 自变量 in 列表 if 条件判断)

执行到生成器表达式时,程序返回的是一个生成器。

a=[x*x for x in range(5)]
b=(x*x for x in range(5))
print(a,b)
[0, 1, 4, 9, 16] <generator object <genexpr> at 0x0000020EB9169408>

生成器有自己的命令:

next命令:返回生成器中的下一个值

print(next(b),next(b))
0 1

当已经到达生成器的最后一个值,继续next命令会得到一个StopIteration的错误。

生成器是一个可迭代对象,因此最好的使用方法是使用for循环:

for i in b:
    print(i)
0
1
4
9
16

且使用for循环将不会有StopIteration的问题。

猜你喜欢

转载自blog.csdn.net/qq_40703975/article/details/82348110