python 生成器generator

gennerator的作用隔跟list类似,但是它不直接生成,而是记录了一种计算方式(算法),每次要用到其中的一个值的时候再去计算后返回结果。

  • 一般生成方式:中括号里面填入列表生成式,eg:
    >>> (r*r for r in range(10))
    <generator object <genexpr> at 0x7f8bb3a16e08>
    

    调用方式:

    >>> gg = (r*r for r in range(10))
    >>> next(gg)
    0
    >>> next(gg)
    1
    >>> next(gg)
    4
    
    >>> gg = (r*r for r in range(10))
    >>> for g in gg :
    ...     print(g)
    ...
    0
    1
    4
    9
    16
    25
    36
    49
    64
    81
    
  •  用函数+yield关键字生成:
    >>> def obb(max):
    ...     num,a,b = 0,0,1
    ...     while num<max:
    ...             yield b
    ...             a,b = b,a+b
    ...             num= num+1
    ...     return 'okok'
    ...
    >>> b = obb(5)
    >>> b
    <generator object obb at 0x7f8bb3a2e0a0>
    >>> next(b)
    1
    >>>
    >>> next(b)
    1
    >>> next(b)
    2
    >>> next(b)
    3
    >>> next(b)
    5
    

    迭代完了之后的generator无法再次使用:

    >>> c = obb(6)
    >>> for s in c:
    ...     print(s)
    ...
    1
    1
    2
    3
    5
    8
    >>> for s in c:
    ...     print(s)
    ...
    >>>
    >>> next(c)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration
    

    使用while不断遍历,知道最后获得正常的renturn 结果:

    >>> d = obb(4)
    >>> while True:
    ...     try:
    ...             print(next(d))
    ...     except StopIteration as e :
    ...             print('generator return value : ',e.value)
    ...             break
    ...
    1
    1
    2
    3
    generator return value :  okok

猜你喜欢

转载自blog.csdn.net/qq_39399594/article/details/84326407