欢迎访问宙启技术站
智能推送

Python中的生成器函数:理解yield和yieldfrom语句

发布时间:2023-07-01 23:59:52

在Python中,生成器是一个特殊的函数,可以在遍历时逐个产生值。使用生成器函数可以轻松地创建生成器对象,并以一种更有效的方式生成数据,而不需要一次性计算所有的值。

生成器函数中最重要的两个关键字是yieldyieldfrom

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并继续从之前的位置执行。

总结来说,生成器函数是一种非常强大的工具,可以轻松地创建生成器对象并以一种更有效的方式生成数据。通过使用yieldyieldfrom语句,可以方便地控制生成器函数的执行流程,并与调用者交换数据。