两个连续的yield语句如何在python中工作?

时间:2017-09-27 05:42:46

标签: python python-3.x generator yield

我在合并和拆分部分偶然发现了来自pymotw.com的代码。

from itertools import *


def make_iterables_to_chain():
    yield [1, 2, 3]
    yield ['a', 'b', 'c']


for i in chain.from_iterable(make_iterables_to_chain()):
    print(i, end=' ')
print()

我无法理解make_iterables_to_chain()是如何工作的。它包含两个yield语句,它是如何工作的? 我知道生成器是如何工作的,但只有一个 yield 语句。

请帮助!

2 个答案:

答案 0 :(得分:7)

单个yield的工作方式相同。

你可以在生成器中拥有任意数量的yield,当调用__next__时,它将执行直到它碰到下一个产量。然后,您返回生成的表达式,生成器暂停,直到再次调用__next__方法。

在生成器上运行几个next调用以查看:

>>> g = make_iterables_to_chain()  # get generator
>>> next(g) # start generator, go to first yield, get result
[1, 2, 3]
>>> next(g) # resume generator, go to second yield, get result
['a', 'b', 'c']
>>> # next(g) raises Exception since no more yields are found 

答案 1 :(得分:0)

生成器有效地允许函数多次返回 。每次执行yield语句时,该值都将返回给调用者,调用者可以继续执行该函数。

通常,它们在for循环中用作迭代。

以下函数将迭代中的每个元素递增一个量:

def inc_each(nums, inc):
    for i in nums:
        yield i + inc

以下是用法示例:

gen = inc_each([1, 2, 3, 4], 100)
print(list(gen)) # [101, 102, 103, 104]
此处使用

list将任意可迭代(在本例中为生成器)转换为列表。

您描述的函数执行两个yield语句:

def make_iterables_to_chain():
    yield [1, 2, 3]
    yield ['a', 'b', 'c']

如果你调用它,它会返回一个生成器,如果迭代,生成列表[1, 2, 3]['a', 'b', 'c']

gen = make_iterables_to_chain()
print(list(gen)) # [[1, 2, 3], ['a', 'b', 'c']]

itertools.chain.from_iterable将采用(可能是无限的)可迭代的迭代次数和"展平"它,返回一个(可能是无限的)可迭代的结果。

这是一种可以实施的方式:

def from_iterable(iterables):
    for iterable in iterables:
        for i in iterable:
            yield i