python高级特性-生成器

#生成器generator

python中,一边循环一边计算的机制,成为生成器
利用生成器,可以减少内存使用

  1. 生成方法一生成器表达式

    1
    2
    3
    a = (x for x in range(10))
    for b in a: print(b,end=' ')
    print()
  2. 生成方法二生成器函数

    1
    2
    3
    4
    5
    6
    7
    def fib(maxn):
    n,a,b = 0,0,1
    while n<maxn:
    yield b
    a,b = b,a+b
    n = n+1
    a = fib(8);print(a)#a是一个generator
  3. 输出方法一for循环迭代输出

    1
    2
    for x in a: print(x,end=' ')
    print()
  4. 输出方法二next()迭代输出

    1
    2
    3
    4
    5
    6
    7
    8
    while True :
    try:
    x = next(a)
    print(x,end=' ')
    except StopIteration as e:
    print('\nGenertor return value:',e.value)
    break
    print(a)

每次调用next()的时候,遇到yield返回,下一次从返回处继续执行
循环不断调用yield,就会不断中断,从而边计算边取值,达到节省内存效果
可以用yield方法调用,当没有更多元素时,抛出StopIteration错误

  1. 注意:生成器只能遍历一次

    1
    2
    3
    4
    5
    #以下代码只能输出一组结果
    for x in a: print(x,end=' ')
    print()
    for x in a: print(x,end=' ')
    print()
  2. 利用打印杨辉三角

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    def test(maxn):
    ans = [1];yield ans
    ans = [1,1];yield ans
    n,tmp = 2,[1,1]#等式右边相当于一个tuple分别给等式左边变量赋值
    while n<maxn:
    ans = []
    n = n+1
    ans.append(1)
    for i in range(n-2):
    ans.append(tmp[i]+tmp[i+1])
    ans.append(1)
    tmp = ans
    yield ans
    a = test(10)
    for x in a:
    print(x)