在Python中何时使用yield而不是return


最近,我看到有很多项目在结构中使用 yield 关键字,不管是否需要它。

所以我决定研究一下这个问题,想和你们分享一些相关信息。

首先要做的是。

yield语句只在定义生成器函数时使用,并且只在生成器函数的主体中使用。

在一个函数定义中使用yield语句,足以使该定义创建一个生成器函数,而不是一个普通的函数。

yield语句暂停了函数的执行,并将一个值送回给调用者,但保留了足够的状态,以使函数能够在它离开的地方恢复。当恢复时,该函数在最后一次屈服运行后立即继续执行。这使得它的代码能够随着时间的推移产生一系列的值,而不是像列表一样一次性计算并送回这些值。

让我们通过一个例子来看看这个。

def simpleGeneratorFun():
    yield 1
    yield 2
    yield 3

for value in simpleGeneratorFun():
    print(value)

该代码的输出将是。

1
2
3

当执行屈服语句时,生成器的状态被冻结,   expression_list 的值被返回给 next() 的调用者。我们所说的 "冻结 "是指所有的本地状态都被保留,包括本地变量的当前绑定、指令指针和内部评估堆栈。足够多的信息被保存下来,以便在下一次调用 next() 时,该函数可以完全像 yield 语句只是另一个外部调用一样进行。

yield-vs-return-in-python

yield 语句在 try ... finally 结构体的 try 子句中是不允许的。困难在于不能保****会被恢复,因此不能保证 finally 块会被执行。

return 将一个指定的值送回给它的调用者,而 yield 可以产生一个值的序列。

当我们想对一个序列进行迭代,但不想将整个序列存储在内存中时,我们应该使用 yield

yield 用在 Python 生成器中。一个生成器函数的定义和普通函数一样,但是每当它需要生成一个值时,它都是用 yield 关键字而不是返回。如果一个 def 的主体包含 yield ,该函数就自动成为一个生成器函数。

def nextSquare():
    i = 1;
    # An Infinite loop to generate squares 
    while True:
        yield i*i                
        i += 1  # Next execution resumes 
                # from this point     

for num in nextSquare():
    if num > 100:
         break   
    print(num)

该代码的输出将是。

1
4
9
16
25
36
49
64
81
100

就这样了!