一、介绍
itertools 是python的迭代器模块,itertools提供的工具至关高效且节省内存。
使用这些工具,你将可以建立本身定制的迭代器用于高效率的循环。
- 无限迭代器
itertools包自带了三个能够无限迭代的迭代器。这意味着,当你使用他们时,你要知道要的究竟是最终会中止的迭代器,仍是须要无限地迭代鞋去。
(1)count(初值=0, 步长=1):count 迭代器会返回从传入的起始参数开始的均匀间隔的数值。count 也能够接收指定的步长参数。咱们来看一个简单的例子:python
>>> from itertools import count >>> for i in count(10): #从10开始无限循环 ... if i > 20: ... break ... else: ... print(i) ... 10 11 12 13 14 15 16 17 18 19 20
(2)islice(count(10), 5):从 10 开始,输出 5 个元素后结束。islice 的第二个参数控制什么时候中止迭代。但其含义并非”达到数字 5 时中止“,而是”当迭代了 5 次以后中止“。app
>>> from itertools import islice >>> for i in islice(count(10), 5): ... print(i) ... 10
11
12
13
14
(3)cycle:这里咱们建立了一个 for 循环,使其在三个字母 XYZ 间无限循环。固然,咱们并不真地想要永远循环下去,因此咱们添加了一个简单的计数器来跳出循环。函数
>>> from itertools import cycle >>> count = 0 >>> for item in cycle('XYZ'): ... if count > 7: ... break ... print(item) ... count += 1 ... X Y Z X Y Z X Y
- 可终止迭代器
(1)accumulate(可迭代对象[, 函数])
accumulate 迭代器将返回累计求和结果,或者传入两个参数的话,由传入的函数累积计算的结果。默认设定为相加,咱们赶快试一试吧:工具
>> from itertools import accumulate >>> list(accumulate(range(10))) [0, 1, 3, 6, 10, 15, 21, 28, 36, 45]
这里,咱们 导入了 accumulate,而后传入 10 个数字,0-9。迭代器将传入数字依次累加,因此第一个是 0 ,第二个是 0+1, 第三个是 1+2,如此下去。如今咱们导入 operator 模块,而后添加进去:spa
>>> import operator >>> list(accumulate(range(1, 5), operator.mul)) [1, 2, 6, 24]
这里咱们传入了数字 1-4 到 accumulate 迭代器中。咱们还传入了一个函数:operator.mul,这个函数将接收的参数相乘。因此每一次迭代,迭代器将以乘法代替除法(1×1=1, 1×2=2, 2×3=6, 以此类推)。
accumulate 的文档中给出了其余一些有趣的例子,例如贷款分期偿还,混沌递推关系等。这绝对值得你花时间去看一看。
(2)chain(*可迭代对象)
chain 迭代器可以将多个可迭代对象合并成一个更长的可迭代对象。实际上,我参与的一个项目中最近就须要这一功能。我有一个列表,里面已经包含一些元素,接着想把另外两个列表添加到最初那个列表中。注意,咱们想添加的是两个列表的元素。最初,我是这样作的:
方式一: code
>>> my_list = ['foo', 'bar'] >>> numbers = list(range(5)) >>> cmd = ['ls', '/some/dir'] >>> my_list.append(cmd) >>> my_list.append(numbers) >>> my_list ['foo', 'bar', ['ls', '/some/dir'], [0, 1, 2, 3, 4]]
这并非我想要的。itertools 模块提供一个优雅得多的方法用chain 来合并这些列表:
方式二:对象
>>> from itertools import chain >>> my_list = list(chain(['foo', 'bar'], cmd, numbers)) >>> my_list ['foo', 'bar', 'ls', '/some/dir', 0, 1, 2, 3, 4]
许多聪明的读者可能想到了,实际上不使用 itertools,也有其余方法可以实现这一要求。你能够这样作:
方式三:blog
>>> my_list = ['foo', 'bar'] >>> my_list += cmd + numbers >>> my_list ['foo', 'bar', 'ls', '/some/dir', 0, 1, 2, 3, 4]
这些方法固然都是可行的。在我知道 chain 以前,我可能会这样作,但我我的认为这个例子中, chain 更为优雅,也更容易理解。内存
未完待续。。。。文档