https://www.jb51.net/article/123094.htm
迭代器(生成器)在Python中是一种很常用也很好用的数据结构,比起列表(list)来说,迭代器最大的优势就是延迟计算,按需使用,从而提高开发体验和运行效率,以至于在Python 3中map,filter等操作返回的不再是列表而是迭代器。
话虽这么说但大家平时用到的迭代器大概只有range了,而通过iter函数把列表对象转化为迭代器对象又有点多此一举,这时候我们今天的主角itertools就该上场了。itertools中的函数大多是返回各种迭代器对象,其中很多函数的作用我们平时要写很多代码才能达到,而在运行效率上反而更低,毕竟人家是系统库。目前主要用来循环的。
注意:迭代器有点像列表,但是不是列表,它是采用现用现生成的机制,
注意下面:
import itertools
x = itertools.accumulate(range(10))
print(list(x)) # 第一次打印结果:[0, 1, 3, 6, 10, 15, 21, 28, 36, 45]
print(list(x)) # 第二次打印结果:[] 是个空列表
'''累加:生成的数与前面一个数相加'''
import itertools
for i in itertools.accumulate(range(10)):
print(i)
''' 连接多个列表或者迭代器:像append函数,追加进去 '''
x = itertools.chain(range(3), range(4), [3,2,1])
print(list(x)) # [0, 1, 2, 0, 1, 2, 3, 3, 2, 1]
''' 求列表或生成器中指定数目的元素不重复的所有组合:自己和自己的组合'''
x = itertools.combinations(range(4), 3) # 从range(4)中任意选出来3个数进行组合
print(list(x)) # [(0, 1, 2), (0, 1, 3), (0, 2, 3), (1, 2, 3)]
''' 允许重复元素的组合,自己和自己的组合 '''
x = itertools.combinations_with_replacement('ABC', 2)
print(list(x)) # [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]
''' 组合:两个迭代器的组合 '''
x = itertools.product('ABC', range(3))
print(list(x)) # [('A', 0), ('A', 1), ('A', 2), ('B', 0), ('B', 1), ('B', 2), ('C', 0), ('C', 1), ('C', 2)]
''' 生成指定数值的,指定个数的迭代器 '''
x = itertools.repeat(1, 5) #生成5个数,每个数都是1
print(list(x)) # [1, 1, 1, 1, 1]
''' '''
''' '''