1、模块导入
import itertools
内置模块,主要用于创建迭代器。返回iterator
import itertools as it
# 模块重命名
from itertools import permutations,product
# 常见导入
2、无限迭代器
2.1 count(start=0,step=1)
创建一个能生成均匀分布序列或等差数列的迭代器
start指起点,step指步长,不限于浮点数
注意:count()
生成的是无限序列迭代器,所以用于循环中,需要额外添加终止条件
k=0 # 用于计数,以控制循环
for item in itertools.count(1,1.2):
k+=1
if k==10:break
print("k={0},item={1:.1f}".format(k,item))
# .nf 保留小数点后n位的浮点数
# 输出
k=1,item=1
k=2,item=2.2
k=3,item=3.4000000000000004
k=4,item=4.6000000000000005
k=5,item=5.800000000000001
k=6,item=7.000000000000001
k=7,item=8.200000000000001
k=8,item=9.4
k=9,item=10.6
若步长是浮点数时,改为start+step*i for i in count() 可以获取更好的精度
- 优化
for k in itertools.count():
item=1+1.2*k
if k==10:break
print("k=%d,item=%f"%(k,item))
"""
k=0,item=1.000000
k=1,item=2.200000
k=2,item=3.400000
k=3,item=4.600000
k=4,item=5.800000
k=5,item=7.000000
k=6,item=8.200000
k=7,item=9.400000
k=8,item=10.600000
k=9,item=11.800000
2.2 cycle(iterable)
创建一个迭代器,从一个iterable中循环取元素并输出
注意:迭代器会将输入的iterable取出元素存储一份copy,在第一遍遍历完iterable后,是从copy中循环取出元素并输出,所以需要一份额外的存储空间
k=0
for item in itertools.cycle("ABCDEF"):
print("k={0},item={1}".format(k,item))
k+=1
if k==10:break
"""
k=0,item=A
k=1,item=B
k=2,item=C
k=3,item=D
k=4,item=E
k=5,item=F
k=6,item=A
k=7,item=B
k=8,item=C
k=9,item=D
"""
2.3 repeat(onject[,times])
创建迭代器,重复输出object,如果未指定times会无限输出。若指定times则指定输出次数
for item in itertools.repeat("不要回答!",3):
print("{0}".format(item))
"""
不要回答!
不要回答!
不要回答!
"""
- 经典用法:用于map或zip提供一个常数值串
# print(list(map(pow,range(10)))) # 报错
print(list(map(pow,range(10),itertools.repeat(2))))
"""
[0, 1, 8, 27, 64, 125, 216, 343, 512, 729]
"""
3、终止于最短序列的迭代器
3.1 accumulate(iterable[,func,*,initial=None])
生成能够返回输入iterable参数的部分和的迭代器
print(list(itertools.accumulate([1,2,3,4,5])))
"""
# 输出 [1, 3, 6, 10, 15]
缺省情况下,默认求和运算,即列表滚动和
"""
# func指定运算,但必须时二元数值运算符
import operator
# operator.mul(a,b) # a*b
print(list(itertools.accumulate([1,2,3,4,5],operator.mul)))
"""
# 输出 [1, 2, 6, 24, 120] 即迭代相乘
"""
initial指定初始值的话,第一个输出是由initial指定,所以输出比输入元素多一个
print(list(itertools.accumulate([1,2,3,4,5],operator.mul,initial=10)))
"""
# 输出 [10, 10, 20, 60, 240, 1200]
"""
3.2 chain(*iterables)
创建一个迭代器,接受多个iterables参数,将它们串接起来,然后遍历
print(list(itertools.chain("ABCD",["1","2","3"],{"name":"baicao"})))
"""
# 输出 ['A', 'B', 'C', 'D', '1', '2', '3', 'name']
"""
3.3 chain.from_iterable(iterable)
# 类方法
print(list(itertools.chain.from_iterable(["bai","cao","name"])))
"""
# 输出 ['b', 'a', 'i', 'c', 'a', 'o', 'n', 'a', 'm', 'e']
即迭代对象的单一元素若仍是迭代对象,则仍逐一遍历
"""
3.4 compress(data,selectors)
根据selectors
所列的各元素对原数据进行过滤处理,挑出对应的selectors
元素为True
的data
元素
selectors
与data
的元素是一一对应的
print(list(itertools.compress("ABCDEFG",[0,0,1,1,0,1,0])))
"""
输出 ['C', 'D', 'F'] ,即只有selectors参数中1所对应的data的元素才能被选中输出
"""
若data
与selectors
长度不相等,则以较短的元素进行遍历
print(list(itertools.compress("ABCDEFG",[0,0,1,1,0]))) # ['C', 'D']
print(list(itertools.compress("ABCDEFG",[0,0,1,1,0,1,0,1,0]))) # ['C', 'D', 'F']
3.5 dropwhile()
print(list(itertools.dropwhile("ABCDEF")))
# Drop items from the iterable while predicate(item) is true.
# Afterwards, return every element until the iterable is exhausted.
1、https://blog.csdn.net/qaqlalala/article/details/122882618
2、https://zhuanlan.zhihu.com/p/478079775
3、https://blog.csdn.net/xcntime/article/details/115675908
4、python chain.from_iterable()
网友评论