python itertools 模块讲解
1、介绍
itertools 是python的迭代器模块,itertools提供的工具相当高效且节省内存。 使用这些工具,你将能够创建自己定制的迭代器用于高效率的循环。 - 无限迭代器 itertools包自带了三个可以无限迭代的迭代器。这意味着,当你使用他们时,你要知道要的到底是最终会停止的迭代器,还是需要无限地迭代鞋去。 (1)count(初值=0,步长=1):count 迭代器会返回从传入的起始参数开始的均匀间隔的数值。count 也可以接收指定的步长参数。我们来看一个简单的例子: ‘‘‘ 遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书! ‘‘‘ >>> 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 次之后停止“。 >>> from itertools import islice >>> for i in islice(count(10),5): ... print(i) ... 10 11 12 13 14 (3)cycle:这里我们创建了一个 for 循环,使其在三个字母 XYZ 间无限循环。当然,我们并不真地想要永远循环下去,所以我们添加了一个简单的计数器来跳出循环。 ‘‘‘ 遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书! ‘‘‘ >>> 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 - 可终止迭代器 >> 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 模块,然后添加进去: >>> import operator >>> list(accumulate(range(1,5),operator.mul)) [1,2,24] 这里我们传入了数字 1-4 到 accumulate 迭代器中。我们还传入了一个函数:operator.mul,这个函数将接收的参数相乘。所以每一次迭代,迭代器将以乘法代替除法(1×1=1,1×2=2,2×3=6,以此类推)。 ‘‘‘ 遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书! ‘‘‘ >>> 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,4]] 这并不是我想要的。itertools 模块提供一个优雅得多的方法用chain 来合并这些列表: >>> from itertools import chain >>> my_list = list(chain([‘foo‘,‘bar‘],cmd,numbers)) >>> my_list [‘foo‘,‘ls‘,‘/some/dir‘,4] 许多聪明的读者可能想到了,实际上不使用 itertools,也有其他方法能够实现这一要求。你可以这样做: ‘‘‘ 遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,‘bar‘] >>> my_list += cmd + numbers >>> my_list [‘foo‘,4] 这些方法当然都是可行的。在我知道 chain 之前,我可能会这样做,但我个人认为这个例子中, chain 更为优雅,也更容易理解。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |