4.3.2 生成器表达式

我们在文章开头的 1.1.1 节中介绍了数组推导,生成器表达式可以理解为惰性版的数组推导:

array = [1, 2, 3]
[x * 2 for x in array] # 数组推导
(x * 2 for x in array) # 生成器表达式

两者的写法非常类似,只是把数组的大括号换成了圆括号,区别在于前者生成了一个新的数组,如果原来的数组占用 M 兆内存,现在两个数组就会占用 2 * M 兆内存。而生成器是懒计算的,并不增加内存占用。

生成器表达式对于大容量的数组,或者无尽数组特别适用,比如可以写一个斐波那契数组:

def fib():
    a = 0
    b = 1
    while True:
        yield b
        a, b = b, a + b

# fib() 可以被当成无尽队列,我们只取前 10 个元素        
for i, n in enumerate(fib()):
    if i < 10:
        print(n)

Last updated