最近,我看到有很多项目在结构中使用 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
语句在 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
就这样了!