解密Python生成器:yield、next、send
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()函数向生成器发送数据以修改生成器的状态。
