Python3学习笔记之-常用内建模块(itertools)
目录
Python3学习笔记之-常用内建模块(itertools)
前言
python的内建模块itertools提供了非常有用的用于操作迭代对象的函数。
一、无限迭代器
迭代器 | 实参 | 结果 | 示例 |
---|---|---|---|
start, [step] | start, start+step, start+2*step, ... |
| |
p | p0, p1, ... plast, p0, p1, ... |
| |
elem [,n] | elem, elem, elem, ... 重复无限次或n次 |
|
count()会创建一个无限迭代器,所以代码只能Ctrl+C结束。
import itertools
natuals = itertools.count(1)
for n in natuals:
print(n)
...
1
2
3
...
cycle()会把传入的一个序列无限重复下去:
def cycle(iterable):
# cycle('ABCD') --> A B C D A B C D A B C D ...
saved = []
for element in iterable:
yield element
saved.append(element)
while saved:
for element in saved:
yield element
repeat()负责把一个元素无限重复下去,不过如果提供第二个参数就可以限定重复次数:
ns = itertools.repeat('A', 3)
for n in ns:
print(n)
A
A
A
无限序列只有在for
迭代时才会无限地迭代下去,如果只是创建了一个迭代对象,它不会事先把无限个元素生成出来,事实上也不可能在内存中创建无限多个元素。
无限序列虽然可以无限迭代下去,但是通常我们会通过takewhile()
等函数根据条件判断来截取出一个有限的序列:
natuals = itertools.count(1)
ns = itertools.takewhile(lambda x: x<=10,natuals)
list(ns)
[1,2,3,4,5,6,7,8,9,10]
二、chain()
chain()可以把一组迭代对象小串联起来,形成一个更大的迭代器:
for c in itertools.chain('ABC','XYZ'):
print(c)
#迭代结果: 'A' 'B' 'C' 'X' 'Y' 'Z'
三、groupby()
groupy把迭代器中相邻的重复元素挑出来放在一起:
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']