Python3 CookBook-迭代器与生成器

以下测试代码全部基于 Python3。

反向迭代

想要反向迭代一个序列很容易,使用内置函数 reversed() 便可以做到,如下:

反向迭代的特点是,需要预先知道迭代对象的大小,或者对象实现了__reversed__() 方法,如果两者都不符合,那么,必须先将对象转换成一个列表才可以。

有一个需要注意的问题就是,如果迭代对象元素很多的话,在转换成列表的过程中会耗费大量的内存。

想解决这个问题,可以在自定义类上实现 __reversed__() 方法来解决,代码如下:

这个方法可以使代码非常的高效,因为它不再需要将数据填充到一个列表中,然后再去反向迭代这个列表。

迭代器切片

在处理列表相关问题时,使用切片操作非常方便,但遗憾的是,迭代器并不支持标准的切片操作,主要原因就是因为,我们事先并不知道迭代器和生成器的长度。

想在迭代器和生成器上使用切片操作,可以使用 itertools.islice() 函数:

但是这里有一个问题,islice() 函数会消耗掉传入的数据,比如我再调用一次这个函数,返回的结果就发生了变化。

所以,如果想多次使用切片的结果,就需要把数据存起来。

顺序迭代合并后的排序迭代对象

假设现在有多个排序序列,现在想把它们合并,并且得到一个新的排序序列,应该怎么做呢?

heapq.merge() 函数可以完美解决这个问题:

需要注意的一点是,传入的序列必须是排过序的。

如果序列中元素过多,也并不需要担心效率问题,通过上面代码也可以看出,heapq.merge() 函数的返回结果依然是一个生成器,并非是列表。

未完待续。。。

data:text/html;charset=UTF-8;base64,

5p625p6E5biI5a2m5Lmg5Lqk5rWB576k5Y+35pivNTc1NzUxODU0Cg==

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180125A0AG8800?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券