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

unn*_*ium 8 python yield generator python-3.x

我在合并和拆分部分偶然发现了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()
Run Code Online (Sandbox Code Playgroud)

我不明白make_iterables_to_chain()的工作方式。它包含两个yield语句,它如何工作?我知道生成器是如何工作的,但是那里只有一个yield语句。

请帮忙!

Jim*_*ard 9

单个yield作品的运作方式相同。

yield生成器中可以有任意多的s,在生成器上__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 
Run Code Online (Sandbox Code Playgroud)


Cha*_*er5 5

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

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

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

def inc_each(nums, inc):
    for i in nums:
        yield i + inc
Run Code Online (Sandbox Code Playgroud)

下面是一个用法示例:

gen = inc_each([1, 2, 3, 4], 100)
print(list(gen)) # [101, 102, 103, 104]
Run Code Online (Sandbox Code Playgroud)

list此处用于将任意可迭代对象(在本例中为生成器)转换为列表。

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

def make_iterables_to_chain():
    yield [1, 2, 3]
    yield ['a', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)

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

gen = make_iterables_to_chain()
print(list(gen)) # [[1, 2, 3], ['a', 'b', 'c']]
Run Code Online (Sandbox Code Playgroud)

itertools.chain.from_iterable将采用一个(可能是无限的)可迭代对象并将其“压平”,返回一个(可能是无限的)可迭代对象作为结果。

这是一种可以实现的方法:

def from_iterable(iterables):
    for iterable in iterables:
        for i in iterable:
            yield i
Run Code Online (Sandbox Code Playgroud)