Python 中的 yield 关键字

Muhammad Waiz Khan 2021年4月29日
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() 将产生从 1100 的新数字,并一直工作到 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

相关文章 - Python Keyword