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)

我们来分析一下:

  1. 两个函数什么内容都没有,一个函数用了return,一个用了yield
  2. 我们将两个函数的返回值分别赋值给 a 和 b
  3. 然后我们打印 a 和 b

代码就这么简单,我们来分析一下输出,输出如下
在这里插入图片描述
我们可以看到

  1. 使用return语句的函数返回的值打印出来是 1
  2. 使用yield语句的函数返回的值打印出来是一串字符,这字符串表示的是 b 这个变量是一个名为 test_yield的生成器对象,内存地址是 0x7ficfef0e8d0
  3. 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

我们来看代码改变了什么?

  1. 我们给yield语句外面套了一个死循环
  2. 我们使用了三个next语句

那么这段代码又做了什么呢?
在我们调用b = test_yield()的时候,b这个变量就被赋值成了一个生成器,这个生成器里面有一个死循环,当我们将变量b传给next()函数的时候,test_yield()就会执行到yield语句,将 2 返回,然后停下来,程序就跳出了test_yield(),回到了入口main里面,当再次调用next函数的时候,程序又回到test_yield()上次停止的地方,继续执行。

看到这里就很明白了:
yield语句最牛逼的作用就是可以暂停一个函数的执行,在合适的时候再回到yield语句的地方。这样的话,我们就可以在某个函数执行一半的时候停下来,回到调用的地方做一些事情,然后在回到函数执行停止的地方继续执行,这样就可以搞很多的骚操作了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值