带有 yield 的函数在 Python 中被称之为 generator(生成器),简单的说,就是带有yield是函数不再是普通的函数。
那么带有yield的函数和普通的函数究竟有什么区别?
这里通过下面的这个例子进行说明:
# 带有yield的函数
def ff():
print("运行到这儿了")
while True:
y = yield 4
print("y=", y)
f = ff()
print(type(f))
print(next(f))
print("执行下一次")
print(next(f))
上面这行代码执行的结果为:
#带有yield的函数输出
<class 'generator'>
运行到这儿了
4
执行下一次
y= None
4
可以看出来,当带有yield的函数被调用时,函数并不会被执行, 而是先得到一个generator对象。
当执行到第一个print(next(f))代码处,调用next方法时,才开始执行函数内的 print("运行到这儿了") 代码,然后进入while循环,执行到了 y = yield 4 代码处,返回了一个4。
然后执行了print("执行下一次")代码。
之后开始执行第二个 print(next(f))代码,这一次从上一次停止执行的地方开始执行,也就是执行给y赋值的操作,但是之前执行到yield 4 时,直接返回了并没有赋值给y,所以这时候输出的y= None。然后继续函数内的while循环,直到执行到 y = yield 4 代码,再次返回了4。
总结:当函数使用yield后成为生成器(generator),只能用于迭代操作。在调用生成器的过程中,每次遇到yield函数会返回yield的值,在下一次执行next()方法时,就会从上一次退出的位置继续运行。所以使用yield时,只有使用时才会产生数据,消耗内存。