python中两个连续的yield语句是如何工作的?
我在合并和拆分部分偶然发现了这段代码python中两个连续的yield语句是如何工作的?,python,python-3.x,generator,yield,Python,Python 3.x,Generator,Yield,我在合并和拆分部分偶然发现了这段代码 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()是如何工作的。它包
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
s,当对其调用\uuuuuuuuuuuuuuuuuuuuuuu
时,它将执行,直到遇到下一个yield。然后返回生成的表达式,生成器暂停,直到再次调用它的\uuuuu next\uuuu
方法
在生成器上运行两个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
生成器有效地允许函数多次返回。每次执行
yield
语句时,值都返回给调用者,调用者可以继续执行函数
通常,它们在for
循环中用作iterables
以下函数将iterable中的每个元素递增一个量:
def公司(nums公司):
对于nums中的i:
收益率i+公司
下面是一个用法示例:
gen=inc_每个([1,2,3,4],100)
打印(列表(gen)#[101、102、103、104]
list
用于将任意iterable(在本例中为生成器)转换为列表
您描述的函数执行两个yield语句:
def make_iterables_to_chain():
收益率[1,2,3]
收益率['a','b','c']
如果调用它,它将返回一个生成器,如果遍历该生成器,将生成列表[1,2,3]
和['a','b','c']
gen=make_iterables_to_chain()
打印(列表(gen))35;[[1,2,3],'a','b','c']]
itertools.chain.from\u iterable
将获取一个(可能无限)iterable并将其“展平”,返回一个(可能无限)iterable作为结果
以下是一种实现方法:
def from_iterable(iterables):
对于iterables中的iterable:
因为我在iterable:
产量一
您的意思是,当第一次调用make_iterables_to_chain()时,它给出第一个yield语句,即[1,2,3],当第二次调用时,它给出第二个yield语句,即[a]、[b]、[c]。@iPeedster生成器表达式实际上有一个附加的间接层。当您调用make\u iterables\u to\u chain
时,它返回一个生成器对象,可以使用iter()
和next()
进行迭代(尽管这通常由for
循环自动处理)。所以函数本身只被调用一次,但是结果对象可以被迭代,并且可以产生多个值。可能只有一个yield语句,但它不是在循环中吗?有两个。我只是不明白两个屈服点的基本原理。我认为一旦遇到收益率,它就不会转到其他收益率,但事实并非如此。