【python】生成器

普通遍历
for i in range(1,10000):
pass

生成器遍历
for i in xrange(1,10000):
pass
这个函数会 yield
很多值而不是只返回一个。这就让一个看上去很普通的函数 转变成一个生成器,一种可以被重复轮询下一个可用值的函数。
首先要注意的是 range 的实现必须预先创建一个列表保存范围内的所有数字。所
以,如果范围从 1 到 10000,这个函数会对 numbers 列表进行 10000 次 append (在第 3 章我们已经讨论过这部分开销),然后返回整个列表。而另一方面,生成器 则能够“返回”很多值。每次代码运行到 yield,该函数都会发射出一个值,然 后当外部代码需求另一个值时,该函数才会继续运行(之前的状态保持不变)并发 射新的值。当该函数运行结束时,一个 StopIteration 异常会被抛出表明该生
成器已经没有更多的值了。结果就是,虽然两个函数最终运行了同样的计算次数, 使用 range 版本的循环多消耗了 10000 倍的内存(如果范围从 1 到 N 则是 N 倍)。

我们主要关注标准库中的 itertools 库。它提供了 Python 内建函数 map、reduce、 filter 和 zip 的生成器版本(在 itertools 中分别是 imap、ireduce、ifilter 和 izip),以及其他很多有用的函数。特别值得注意的有:
islice
允许对一个无穷生成器进行切片。
chain
将多个生成器链接到一起。
takewhile
给生成器添加一个终止条件。
cycle
通过不断重复将一个有穷生成器变成无穷。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值