Python高级特性之生成器(Generator)

@spiritree  September 15, 2016

如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator

  • 可以通过next()函数获得generator的下一个返回值

但是基本不会用next()来获取值,而是通过for循环来迭代取值。

g = (x * x for x in range(10))
print(g)
<generator object <genexpr> at 0x1022ef630>
print(next(g))
print(next(g))

结果为:
0和1

定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator

def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        L = (b, a + b)
        a = L[0]
        b = L[1]
        n = n + 1
    return 'done'
print(fib(6))

这样就是通过generator来实现求斐波那契数列

杨辉三角定义如下:

      1
    1   1
  1   2   1
1   3   3   1

1 4 6 4 1
1 5 10 10 5 1
把每一行看做一个list,试写一个generator,不断输出下一行的list:

def triangles():
    L = [1]
    while True:
        yield L
        L1 = [0] + L[:]
        L = [L[i]+L1[i] for i in range(len(L))] + [1]
i = 0
for t in triangles():
    print(t)
    i = i  + 1
    if i == 10:
        break

个人遇到的问题:当L=[1]L1=[0, 1]时,L2 = [L[i]+L1[i] for i in range(len(L))] = [1]
并非[1, 1]


添加新评论