偶然遇到yield这个关键字,百度的时候,发现大都是千篇一律的答案,一头雾水的点进来,在一头雾水的出去,根本没有搞明白啥意思。试问一位新手,如何理解这些,今天就整理了一下简单易懂的。
普通函数
Python 中的普通函数大都是这样的:
def normal():
print("I'm a return value_1..")
return 1
函数里的语句将依次执行,并在遇到 return 时立即终止函数的运行并返回值。
因此,像下面这样连续写多个 return 是没有意义的:
def normal():
print("I'm a return 1..")
return 1
# 下面语句永远不会被执行
print("I'm a return 2..")
return 2
生成器
简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,
于是下面把这个函数给修改一下变成一个生成器:
def gen():
print('yield 1..')
yield 1
print('yield 2..')
yield 2
print('yield 3..')
yield 3
执行这个函数:
>>> gen = my_gen()
>>> gen
<generator object my_gen at 0x000002102AC5EAC0>
可以看到,gen 变量被赋值为一个 generator ,即生成器。
生成器有一个最重要的特点,即当它执行到 yield 语句并返回后,生成器不会被立即终止,而是暂停在当前 yield 的位置,等待下一次调用:
>>> next(gen)
yield 1..
>>> next(gen)
yield 2..
>>> next(gen)
yield 3..
>>> next(gen)
Traceback (most recent call last):
File "<ipython-input-34-6e72e47198db>", line 1, in <module>
next(gen)
StopIteration
生成器用 next() 函数调用,且每次调用都从上一次 yield 暂停的位置开始继续向下执行。当所有的 yield 执行完毕后,再一次调用 next() 就会抛出 StopIteration 错误,提示你生成器已经结束了。既然会抛出错误,用 try 语句完善一下就可以了:
def my_gen():
print('yield 1..')
yield 1
print('yield 2..')
yield 2
print('yield 3..')
yield 3
gen = my_gen()
while True:
try:
next(gen)
except StopIteration:
print('Done..')
break
# 输出结果为:
# yield 1..
# yield 2..
# yield 3..
# Done..
就这么简单的几行代码就让你明白什么是yield,一句话概况就是把yield看成是一个return就行。
return和yield区别
return:在函数中返回某个值,返回之后函数不在继续执行,直接退出结束。
yield: 带有yield的函数是一个迭代器,函数返回某个值时,会停留在某个位置,返回函数值后,会在前面停留的位置继续执行,直到程序结束。