从简单的案例搞懂python中的yield

你应该知道带有yield关键字的函数不再是一个简单的函数,而是一个生成器generator,那啥叫生成器呢?

生成器

简单说生成器就是迭代器,相应的它也是可以迭代的对象,但是它实现了一边循环,一边进行计算的这种机制。

案例1.列表推导式:

li=[i for i in range(10)]

上述列表推导式实现了一个[0,1,2,3,4,5,6,7,8,9]这样一个列表,但是这个列表是一次性生成所有元素,然后存储在内存中的,假如range中我填入1百万或者1千万的数据呢,内存是有限制的,这样生成这么多的数据,可能就撑爆你的内存了,并且你可能只访问很少的一些数据,这就大大浪费了你的内存。此时生成器的优点就体现出来了:生成器不会一次性生成能容纳所有的数据的列表,即它不会创建完整的列表,这就大大减少了内存的占用

yield关键字

下列代码定义了一个函数f,for循环遍历,使用yield返回i,yield后面的代码是为了测试,

def f():
    for i in range(5):
        yield i

        print('我是yield之后的代码')
        print()


res=f()
for i in res: #对生成器对象进行遍历
    print(i)

我使用的是打断点进行调试,下面将一一证明:

1.带了yield关键字的函数是一个生成器,并且调用函数f()并不会执行函数里面的代码,而是先得到了一个生成器对象,只有遍历时,才会执行。

2.每次函数f()执行到yield处就会停止,下次从yield停止的地方继续执行,即可以记住函数代码执行的位置。

 

(1))带了yield关键字的函数是一个生成器: 在函数调用处打断点,可以看到得到的是一个生成器对象

 

(2)在yield及之后的代码进行打断点,查看执行的顺序:每次函数f()执行到yield处就会停止,下次从yield停止的地方继续执行,即可以记住函数代码执行的位置。

 录制的GIF动图:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值