生成器yield关键字作用和理解

本文深入探讨Python中生成器和yield关键字的作用,解释如何利用yield降低迭代内存开销,对比列表与生成器在处理大量数据时的效率差异。

生成器yield关键字作用和理解

yield关键字的一个功能就是能有效地降低迭代的内存开销。
如果使用range函数的话,那么函数的内部实现会存储每个迭代的过程,即每个中间变量有个内存空间,这样首先程序使用的内存空间就大了,而且分配内存、回收内存都会导致程序的运行时间加长。但是使用yield实现的xrange函数的话,里面所有中间变量都会只使用一个内存¥i,这样需要的时间和空间都会变小。

在了解yield和迭代:

迭代是一种对数据的操作,例如针对一个list逐一获取其中的元素的过程就叫做迭代。而可迭代是对象的一种特性,迭代操作只能针对拥有可迭代特性的对象进行,常见的可迭代对象包括数组、元组、字典等数据集合。
迭代器也是一种可迭代对象,与普通的可迭代对象的区别在于,迭代器内部实现了next函数用来生成每次迭代循环需要返回的元素。而最后的生成器则又是一种特殊的迭代器,具体体现上就是使用yield语法的函数,讲到这里就提到了yield语法,总的来说yield就是用来产生一个生成器的语法,例如将上述的迭代过程修改为生成器方式可以这样写:
在这里插入图片描述
上述代码的my_generator()即返回了一个生成器对象,每次循环时执行到yield处即返回当时的index的值,到下一次循环时将从上次返回的yield处继续执行,直到index的值不满足小于5的条件时结束整个函数,此时也结束了对这个生成器的迭代过程。
(了解yield和迭代内容选自http://wemedia.ifeng.com/93602193/wemedia.shtml)

那么为什么要使用yield:

因为省内存呀!例如上述两个迭代过程,同样是遍历输出0-4这几个元素,使用列表的方式需要构建出一个长度为5的数组并存储在内存中,而使用生成器的方式只需要一个index变量即可实现,这还是迭代元素较少的情况下,如果迭代的是100万甚至1000万个元素时,列表的方式就需要构建一个长度为100万或者1000万的数组,这时对于内存的使用就是非常大的负担了,而使用生成器的方式,无论是迭代100万还是1000万个元素,依然只需要一个index变量即可实现。
再举个例子,for循环从1到10每次加1循环,不用yield关键字时,i=1,分配给他一个内存空间,进行判断符合,将i=1传入执行方法,执行完方法后i++,判断2符合,然后将i=2传入执行方法,分配给他一个内存空间……这样我们在1、2、3、4、5、6、7、8、9、10每次判断都分配了内存空间,是使用“列表”方法构建了一个数组一样的结构;而使用yield关键字时,他是只用一个内存空间的,具体到这个例子他是先指定一个内存空间,执行方法,然后将i=1传入,判断为true,执行方法,然后i++为2,判断符合传入刚才那个内存空间再执行方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值