我在日常开发中,经常会看到 yield from
这个关键词,每次都很纳闷它和yield到底是神马关系。这次就来一探究竟:
yield
和 yield from
在Python中都用于生成器函数,但它们的使用场景和目的有所区别:
yield
yield
用于一个生成器函数中,以产生一个值。当生成器函数调用到yield
时,函数的状态(包括局部变量等)会被保存下来,下次从这个位置继续执行。yield
可以用来简化生成器的创建过程,使得函数能以延迟执行的方式(惰性求值)一次返回一个值,这对于处理大型数据集或无穷序列等场景非常有用。- 使用
yield
,开发者需要手动控制每个元素的迭代和产出。
示例:
def my_generator():
yield 1
yield 2
yield 3
gen = my_generator()
for i in gen:
print(i)
这将输出:
1
2
3
yield from
yield from
是在 Python 3.3 中引入的,是语法上的一个增强。它主要用于在一个生成器中委托另一个生成器,或更一般地说,是用于在一个生成器中产出另一个可迭代对象的所有元素。yield from <expr>
的工作方式是,将<expr>
解析为一个可迭代对象,并从中迭代每一个元素,将这些元素直接产出,无需手动写循环进行迭代。- 使用
yield from
可以简化内部循环的代码,特别是当要委托的生成器比较复杂或者结构较深时,yield from
能够清楚地表达出程序的意图,同时减少模板代码的数量。
示例:
def sub_generator():
yield 1
yield 2
def main_generator():
yield from sub_generator()
yield from [3, 4]
gen = main_generator()
for i in gen:
print(i)
这将输出:
1
2
3
4
总结
yield
直接产生值;yield from
用于委托其他生成器或可迭代对象,以便产出其所有值。- 事实上,
yield from
不仅仅是迭代器的快捷方式,它还可以更好地处理异常和创建双向通信的生成器(协程)。