Python itertools内置无限迭代器详解
本文详细介绍Python标准库itertools中的内置无限迭代器,包括count()生成自然数序列、cycle()循环序列、repeat()重复元素以及takewhile()截取有限序列的方法,并演示chain()串联和groupby()分组技巧,帮助开发者高效处理迭代对象。
前言:
Python的标准库itertools提供了大量用于操作迭代对象的实用函数,其中包含几个特殊的“无限”迭代器工具。
1、count()创建自然数序列
import itertools
n = 0
natuals = itertools.count(1)
for m in natuals:
print(m)由于count(n)会创建一个从起始数字n开始直至无穷大的迭代器,上述代码将不断打印自然数序列,无法自动停止,必须通过Ctrl+C强制退出。
运行结果:
0 1 2 3 4 5 6 7 ...
2、cycle()创建序列循环
cycle()会将传入的序列无限次重复输出。
示例1、循环列表中的内容:
natuals = itertools.cycle([1, 2, 3])
for m in natuals:
print(m)运行结果:
1 2 3 1 2 3 1 2 3 ...
示例2、字符串中字符循环:
import itertools
cs = itertools.cycle('ABC') # 注意字符串也是序列的一种
for c in cs:
print(c)运行结果:
A B C A B C A B C ...
3、repeat()把一个元素有限次重复
repeat()默认行为是无限重复一个元素,但若提供第二个参数,则可以限定重复的次数。
ns = itertools.repeat('A', 3)
for n in ns:
print(n)运行结果:
A A A ...
4、takewhile()根据条件判断来截取出一个有限的序列
无限序列仅在for循环迭代时才会持续生成元素,创建迭代对象时并不会预先生成所有元素,内存中也无法存储无限多个元素。尽管无限序列可以无限迭代,但通常我们使用takewhile()等函数根据特定条件截取有限序列。
import itertools
natuals = itertools.count(1)
ns = itertools.takewhile(lambda x: x <= 10, natuals)
print(list(ns))运行结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
迭代器测试:
对于有限数据的迭代器,每次调用都会弹出内部数据。
import itertools
natuals = itertools.count(1)
ns = itertools.takewhile(lambda x: x <= 3, natuals)
for n in ns:
print(n)
print(list(ns))运行结果:
1 2 3 []
5、chain()迭代对象串联
chain()函数可以将多个迭代对象串联起来,形成一个新的、更大的迭代器。
for c in itertools.chain('ABC', 'XYZ'):
print(c)运行结果:
'A' 'B' 'C' 'X' 'Y' 'Z'
6、groupby()迭代器元素分组
groupby()函数用于将迭代器中相邻的重复元素分组提取出来,常用于字符串处理。
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。
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']
至此,关于Python itertools包内置无限迭代器的介绍结束,更多相关Python itertools内置迭代器内容可搜索本站历史文章或继续浏览后续相关文章,希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













