Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中两个连续的yield语句是如何工作的?_Python_Python 3.x_Generator_Yield - Fatal编程技术网

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语句,但它不是在循环中吗?有两个。我只是不明白两个屈服点的基本原理。我认为一旦遇到收益率,它就不会转到其他收益率,但事实并非如此。