昨天学完了装饰器,今天我们来学生成器。为了说明生成器的作用,我先来写一个这样的语句
也就是把0到199之间的所有偶数打印出来,但是,有时候我们并不知道要打印多少个偶数,然而我们还是把大范围的数字存进了内存,这样就造成了资源的浪费,这个时候我们就可以使用生成器来避免这一问题,使用生成器之后,等到想要取哪个范围的数字的时候,再把数字一个一个取出来就可以了。生成器的创建创建生成器主要有两种方法方法一这种方法其实很简单,只要把上图的[]改为()即可
从打印结果可以看到,现在even是一个生成器,现在,我们使用next()把里面的数字提取出来
每一次使用next()函数都把生成器中的一个值提取出来。另外,还可以使用''生成器.__next__()''的方式,它和next(生成器)是等价的。
当然,我们不难想到,使用for循环也是可以的
需要注意的是,当生成器没有值可以提取时,继续提取会报错,为了演示方便,我把上面的范围缩小一点
方法二这种方法是使用创建生成器函数来创建生成器当一个函数存在yield语句时,那么这个函数就不再是普通的函数,而是一个生成器函数
从运行结果中,我们可以明显地看到现在g是一个生成器,既然是生成器,我们就可以把里面的值给提取出来
接着简单说明一下yield和return的区别yield和return的区别我个人yield和return最大的区别就是,一个是暂停,另一个是停止,我们都知道,当遇到return语句时,函数会停止运行,也就是说会跳出函数,而yield则不会,它会暂停在该yield语句运行的地方。什么意思呢?看下面的代码你就知道了yield
从以上四段代码可以知道,每次运行到yield语句时则暂停在此地方,当提取下一个生成器的值时,则从上一个yield语句的下一个语句开始执行,直到遇到yield语句,当生成器没有值可以提取时则报错,然而,如果使用for语句,那么print('我在末尾')也是可以执行的。
return
结果并不是0,1,2,3,4,也就是说遇到return语句就跳出了函数,这和yield有非常明显的区别send()send()是用来给上一个yield添加返回值的方法,这样说可能大家都还不明白,我举个例子给大家看看
也就说说yield1没有返回值,同样yield2和yield3也没有,而send()方法就是给它们添加返回值的,我们来试试。
额,报错了。注意看报错的原因,大概意思就是不可以给刚开始的生成器传值,这是显然的,因为在前面我已经说过了,send()方法是给上一个yield语句传值的,而第一个yield根本就没有上一个yield语句,理所当然就会报错了,所以对于第一个yield语句,我们应该给它传一个空值
然后,我们给第一个yield语句添加返回值看看
这样,yield1就有了返回值''python''关闭生成器关闭生成器可以使用g.close()方法
关闭生成器之后,yield3就不可以再执行,从而抛出异常''StopIteration''本期就到这里,祝大家有个好心情。
领取专属 10元无门槛券
私享最新 技术干货