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

解密Python生成器:yield、next、send

发布时间:2023-05-31 04:23:08

Python中生成器是一种特殊的函数,可以通过yield关键字实现暂停和恢复函数执行的特点,从而可以逐步生成序列。

生成器函数的语法与普通函数相同, 的区别是它使用yield语句返回迭代器。

yield和return语句差异:使用return语句将函数结束并返回值,而使用yield语句可以暂停函数执行并返回一个中间结果,同时可以保留函数的状态,并不是直接结束函数。

生成器的实现非常简单,只需要将返回值改为yield语句即可。下面是一个示例:

def simple_generator():
    yield "Hello"
    yield "world"
    yield "!"

for value in simple_generator():
    print(value)

输出:

Hello
world
!

在这个示例中,我们定义了一个生成器函数simple_generator(),它包含三个yield语句。当函数调用时,它会暂停并返回 个中间结果。在遍历迭代器时,我们可以使用next()函数逐个获取中间结果。

gen = simple_generator()
print(next(gen))  # Hello
print(next(gen))  # world
print(next(gen))  # !

输出:

Hello
world
!

在这个示例中,我们使用next()函数逐个获取中间结果,并输出它们。在获取最后一个值之后,我们不能再使用next()函数获取更多的值,否则会引发StopIteration异常。

除了使用next()函数遍历迭代器外,我们还可以使用send()函数向生成器发送数据。这个函数可以传递一个值给yield语句,从而修改生成器的状态。

下面是一个带有参数的生成器函数示例:

def fibonacci():
    a, b = 0, 1
    while True:
        value = yield a
        if value == "reset":
            a, b = 0, 1
        a, b = b, a + b

在这个示例中,我们定义了一个生成斐波那契数列的函数fibonacci(),它使用while True语句实现无限循环。每次循环中,我们通过yield语句返回斐波那契数列的下一个值。

我们还可以使用send()函数修改生成器的状态,例如通过send("reset")指令重置斐波那契数列的状态:

gen = fibonacci()
print([next(gen) for i in range(10)])  # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
print(gen.send("reset"))
print([next(gen) for i in range(10)])  # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

在这个示例中,我们使用next()函数逐个获取斐波那契数列的前10个值,并通过send("reset")指令重置斐波那契数列的状态。然后我们再次使用next()函数获取新的斐波那契数列前10个值。

总结一下,Python生成器是一种特殊的函数。通过使用yield语句返回迭代器,我们可以实现暂停和恢复函数执行的特点,并逐步生成序列。我们可以使用next()函数遍历迭代器并逐个获取中间结果,也可以使用send()函数向生成器发送数据以修改生成器的状态。