Python中的生成器函数:理解yield和yieldfrom语句
在Python中,生成器是一个特殊的函数,可以在遍历时逐个产生值。使用生成器函数可以轻松地创建生成器对象,并以一种更有效的方式生成数据,而不需要一次性计算所有的值。
生成器函数中最重要的两个关键字是yield和yieldfrom。
yield语句允许将一个结果返回给调用者,同时暂停函数的执行。当函数再次被调用时,它会从yield语句之后的位置继续执行。这意味着生成器函数可以通过迭代逐步返回值,而不需要一次性计算全部结果。
下面是一个简单的生成器函数的示例:
def my_generator():
yield 1
yield 2
yield 3
gen = my_generator()
print(next(gen)) # 输出1
print(next(gen)) # 输出2
print(next(gen)) # 输出3
在这个例子中,my_generator是一个生成器函数。每次调用next(gen)时,函数会执行到下一个yield语句并返回相应的值。这使得我们可以逐个获取生成器的值。
yield表达式还允许接收来自调用者的值。这样,我们可以在每次迭代时将新的值传递给生成器函数。例如:
def my_generator():
value = yield 1
yield value + 2
gen = my_generator()
print(next(gen)) # 输出1
print(gen.send(3)) # 输出5
在这个例子中,gen.send(3)语句将3发送给生成器函数,并在yield表达式的位置得到了返回值5。
yieldfrom语句是Python 3.3中引入的一种特殊的生成器委托机制。它允许一个生成器函数将部分工作委托给另一个生成器,从而减少代码重复。下面是一个使用yieldfrom语句的示例:
def sub_generator():
yield 2
yield 3
def my_generator():
yield 1
yield from sub_generator()
gen = my_generator()
print(next(gen)) # 输出1
print(next(gen)) # 输出2
print(next(gen)) # 输出3
在这个例子中,my_generator中的yield from语句将控制权委托给了sub_generator。调用next(gen)时,会在my_generator中暂停并开始执行sub_generator,直到它耗尽所有的值。一旦sub_generator返回,就会恢复my_generator并继续从之前的位置执行。
总结来说,生成器函数是一种非常强大的工具,可以轻松地创建生成器对象并以一种更有效的方式生成数据。通过使用yield和yieldfrom语句,可以方便地控制生成器函数的执行流程,并与调用者交换数据。
