Python 中的 yield 关键字
本教程将解释 Python 中 yield
关键字的用途和用法。yield
关键字是用于在 Python 中定义生成器函数的语句。yield
语句只能在函数体内使用。
生成器函数和常规函数之间的主要区别在于,生成器函数包含一个 yield
表达式而不是 return
语句。yield
语句产生一系列称为生成器迭代器的值作为输出。可以使用 next()
函数或 for
循环从迭代器中获取新值。
每次调用 next()
函数或 for
循环的每次迭代时,yield
语句都会产生或产生一个新值,并保存该函数的位置执行状态,即局部变量的值,等等。在每个新的 next()
函数调用或迭代中,yield
语句从上次保存的状态恢复,这与在每个调用处开始的 return
语句不同。
Python 中 yield
关键字的示例代码
由于 yield
语句的工作方式很清楚,现在让我们研究一下它的用法和示例代码。假设我们有大量数据,并且无法一次将其加载到可迭代对象中,或者我们想要一种内存效率更高的方式来读取数据。我们可以使用 yield 语句创建一个生成器函数;该函数将在每次迭代或 next()
函数调用时读取并产生新的数据块。
下面的示例代码演示了如何在 for
循环中使用 yield
语句在 Python 中创建一个简单的生成器函数。在下面的示例代码中,生成器函数 my_generator()
将产生从 1
到 100
的新数字,并一直工作到 99
为止。
def my_generator():
for x in range(1, 100):
print("new value is generated!")
yield x
我们首先需要一个生成器迭代器对象,以使用 next()
函数或通过迭代来生成值。
gen_iter = my_generator()
现在,使用 next()
函数从生成器迭代器获取新值;我们还可以将 next()
函数用作 iterator.__next__()
,如下面的示例代码所示。
val = next(gen_iter)
print("Value =", val)
val = gen_iter.__next__()
print("Value =", val)
输出:
new value is generated!
Value = 1
new value is generated!
Value = 2
获得新值的另一种方法是使用 for
循环遍历生成器迭代器对象。下面的示例代码演示了如何在 Python 中迭代生成器迭代器对象。
for val in gen_iter:
print("Value =", val)
上面的代码示例将在生成器函数中生成指定范围内的所有 99
值。
我们还可以通过多次使用 yield
语句来创建不具有 for
循环的生成器函数,如下面的示例代码所示。
def my_generator():
x = 1
print("new value is generated!")
yield x
x = x + 1
print("new value is generated!")
yield x
x = x + 1
print("new value is generated!")
yield x
现在,让我们使用新的生成器函数通过 for
循环生成所有值。
gen_iter = my_generator()
for val in gen_iter:
print("Value =", val)
输出:
new value is generated!
Value = 1
new value is generated!
Value = 2
new value is generated!
Value = 3