Python3之内建模块itertools
python的内建模块itertools提供了非常有用的用于操作迭代对象的函数
首先,我们看看itertools提供的几个无限迭代器
1 2 3 4 5 6 7 8 9 | >>> import itertools >>> natuals=itertools.count(1) >>> for n in natuals: ... print(n) ... 1 2 3 ... |
因为count()会创建一个无限迭代器,所以上述代码会打印出自然数序列,根本停不下来,只能按Ctrl+c退出
cycle()
会把传入的一个序列无限重复下去:
1 2 3 4 5 6 7 8 9 10 11 | >>> cs = itertools.cycle( 'abc' ) >>> for c in cs: ... print (c) ... a b c a b c ... |
同样停不下来
repeat()负责把一个元素无限重复下去,不过如果提供第二个参数就可以限定重复次数
1 2 3 4 5 6 7 | >>> ns = itertools.repeat( 'A' , 3 ) >>> for n in ns: ... print (n) ... A A A |
无限序列只有在for迭代时才会无限地迭代下去,如果只是创建了一个迭代对象,它不会事先把无限个元素生成出来,事实上也不可能在内存中创建无限多个元素。
无限序列虽然可以无限迭代下去,但是通常我们会通过takewhile()等函数根据调校判断来截取出一个有限序列
1 2 3 4 | >>> natuals = itertools.count( 1 ) >>> ns = itertools.takewhile( lambda x:x< = 10 ,natuals) >>> list (ns) [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] |
itertools
提供的几个迭代器操作函数更加有用:
chain()
chain()可以把一组迭代对象串联起来,形成一个更大的迭代器
1 2 3 4 5 6 7 8 9 | >>> for c in itertools.chain( 'ABC' , 'XYZ' ): ... print (c) ... A B C X Y Z |
groupby()
groupby()
把迭代器中相邻的重复元素挑出来放在一起:
1 2 3 4 5 6 7 | >>> for key,group in itertools.groupby( 'AAABBBCCAAA' ): ... print (key, list (group)) ... A [ 'A' , 'A' , 'A' ] B [ 'B' , 'B' , 'B' ] C [ 'C' , 'C' ] A [ 'A' , 'A' , 'A' ] |
实际上挑选规则是通过函数完成的,只要作用于函数的的两个元素返回的值相等,这两个元素就被认为是在一组的,而函数的返回值作为组的key。如果我们要忽略大小写分组,就可以让元素'A'和‘a'都返回相同的key
1 2 3 4 5 6 7 | >>> for key,group in itertools.groupby( 'AaaBBbcCAAa' , lambda c:c.upper()): ... print (key, list (group)) ... A [ 'A' , 'a' , 'a' ] B [ 'B' , 'B' , 'b' ] C [ 'c' , 'C' ] A [ 'A' , 'A' , 'a' ] |
练习
计算圆周率可以根据公式
1 2 3 | #step1 创建一个奇数序列 1,3,5,7,9,... #step2 取该序列的前N项 1,3,5,7,9,。。。 2*N-1 #step添加正负符号并用4除 |
pi.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import itertools def pi(N): # step 1: 创建一个奇数序列: 1, 3, 5, 7, 9, ... odd = itertools.count( 1 , 2 ) # step 2: 取该序列的前N项: 1, 3, 5, 7, 9, ..., 2*N-1. odd_n = itertools.takewhile( lambda x: x< 2 * N, odd) # step 3: 添加正负符号并用4除: 4/1, -4/3, 4/5, -4/7, 4/9, ... result = map ( lambda x: 4 / x if x % 4 = = 1 else - 4 / x, odd_n) # step 4: 求和: return sum (result) print (pi( 10 )) print (pi( 20 )) print (pi( 100 )) print (pi( 9999999999 )) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!