无法理解python生成器

这个问题在这里已经有了答案:

  • “yield”关键字有什么作用? 36个答案

  • 生成器(像所有迭代器)只能迭代一次。 到print_gen(x)完成时, x 。 任何进一步尝试从x获取新值都会导致StopIteration被提升。

    这工作:

    x = do_gen()
    y = (incr_gen(i) for i in do_gen())
    print_gen(x)
    print_gen(y)
    

    因为这会创建两个独立的独立发电机 在您的版本中,您分配给y的生成器表达式期望x生成更多值。

    当您对它们依次使用next()函数时,更容易看出x生成器与y共享:

    >>> def do_gen():
    ...     for i in range(3):
    ...         yield i
    ... 
    >>> def incr_gen(y):
    ...     return y + 1
    ... 
    >>> x = do_gen()
    >>> y = (incr_gen(i) for i in x)
    >>> next(x)  # first value for the range
    0
    >>> next(y)  # second value from the range, plus 1
    2
    >>> next(x)  # third value from the range
    2
    >>> next(y)  # no more values available, generator done
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration
    

    请注意next(y)提出的StopIteration

    链接地址: http://www.djcxy.com/p/1547.html

    上一篇: Trouble understanding python generators

    下一篇: How does a function in Python remember its values after it returns?