python生成器和yield语句介绍
python的很多代码中都有yiled语句,在python中的异步编程中,也会用到yield语句,但是python的生成器和yield比较难理解。今天突然就明白了,做个笔记记录一下
return和yield语句对比说明
先来一个简单的对比
要说清楚yield语句,还是得用return语句来对比一下,直接上代码:
def test_return():
return 1
def test_yeild():
yield 2
if __name__ == '__main__':
a = test_return()
b = test_yield()
print(a)
print(b)
我们来分析一下:
- 两个函数什么内容都没有,一个函数用了
return
,一个用了yield
- 我们将两个函数的返回值分别赋值给 a 和 b
- 然后我们打印 a 和 b
代码就这么简单,我们来分析一下输出,输出如下
我们可以看到
- 使用
return
语句的函数返回的值打印出来是 1 - 使用
yield
语句的函数返回的值打印出来是一串字符,这字符串表示的是 b 这个变量是一个名为test_yield
的生成器对象,内存地址是0x7ficfef0e8d0
return
语句返回了一个值,yield
返回了一个对象,对象的名字就是函数的名字,这个对象就是生成器,那生成器是什么呢,请往下看
python的生成器和next()方法
下面的代码和上面的代码只有一处不一样
def test_return():
return 1
def test_yeild():
yield 2
if __name__ == '__main__':
a = test_return()
b = test_yield()
print(a)
print(next(b)) // 就是这里不一样,多了yield语句
我们再来看输出
我们可以看到,yield
也返回了数字,代码改到这,yield语句和return语句的效果是一样的
当我们把装饰器对象传给next()
函数的时候,我们就得到了yield
语句后的那个数字,简单来说将return换成yield后,函数就会返回一个生成器,使用next函数可以取出生成器里面的值
yield的真正作用
yield语句有一个很厉害的作用,就是可以中断一个函数的执行,跳转到调用的地方
def test_return():
return 1
def test_yeild():
while True: // 我们在这里加了死循环
yield 2 // 这里要记得加四个空格缩进
if __name__ == '__main__':
a = test_return()
b = test_yield()
print(a)
print(next(b)) // 第一个next
print(next(b)) // 第二个next
print(next(b)) // 第三个next
我们来看代码改变了什么?
- 我们给
yield
语句外面套了一个死循环 - 我们使用了三个
next
语句
那么这段代码又做了什么呢?
在我们调用b = test_yield()
的时候,b
这个变量就被赋值成了一个生成器,这个生成器里面有一个死循环,当我们将变量b
传给next()
函数的时候,test_yield()
就会执行到yield
语句,将 2 返回,然后停下来,程序就跳出了test_yield()
,回到了入口main里面,当再次调用next
函数的时候,程序又回到test_yield()
上次停止的地方,继续执行。
看到这里就很明白了:
yield语句最牛逼的作用就是可以暂停一个函数的执行,在合适的时候再回到yield语句的地方。这样的话,我们就可以在某个函数执行一半的时候停下来,回到调用的地方做一些事情,然后在回到函数执行停止的地方继续执行,这样就可以搞很多的骚操作了。