这货特别强大,所以我要深入了解一下:
itertools 是python的迭代器模块,itertools提供的工具相当高效且节省内存。
使用这些工具,你将能够创建自己定制的迭代器用于高效率的循环。
-
无限迭代器
itertools包自带了三个可以无限迭代的迭代器。这意味着,当你使用他们时,你要知道要的到底是最终会停止的迭代器,还是需要无限地迭代下去。
-
count(初值=0, 步长=1):可以设置两个参数,第一个参数为起始点,且包含在内,第二个参数为步长,如果不设置第二个参数则默认步长为1
count 迭代器会返回从传入的起始参数开始的均匀间隔的数值。
count 也可以接收指定的步长参数。
我们来看一个简单的例子:
import itertools
for i in itertools.count(10):#从10开始,步长为1,无限迭代
if i>20:
break
else:
print(i,end=',')
print(type(i))
输出结果:
D:\anaconda\python.exe D:/bilibili大学/python经典习题100道/测试itertools.py
10,11,12,13,14,15,16,17,18,19,20,<class 'int'>
Process finished with exit code 0
-
islice(count(10), 5):
从 10 开始,输出 5 个元素后结束。
islice 的第二个参数控制何时停止迭代。
但其含义并不是”达到数字 5 时停止“,而是”当迭代了 5 次之后停止。
import itertools
for i in itertools.islice(itertools.count(10,2),5):#从10开始,步长为2,迭代5次
if i>20:
break
else:
print(i,end=',')
print()
print(type(i))
*******************************************************
D:\anaconda\python.exe D:/bilibili大学/python经典习题100道/测试itertools.py
10,12,14,16,18,
<class 'int'>
Process finished with exit code 0
-
cycle:无限循环,可以设置一个参数,且只接受可以迭代的参数,如列表,元组,字符串。。。,该函数会对可迭代的所有元素进行循环:
这里我们创建了一个 for 循环使其在三个字母 XYZ 间无限循环。当然,我们并不真地想要永远循环下去,所以我们添加了一个简单的计数器来跳出循环。
import itertools
li = ['x','y','z']
count = 0
for i in itertools.cycle(li):
print(i,end=',')
count += 1
if count >= 10:
break
*****************************************************************
D:\anaconda\python.exe D:/bilibili大学/python经典习题100道/测试itertools.py
x,y,z,x,y,z,x,y,z,x,
Process finished with exit code 0
因为是无限循环,所以添加了外部手段在循环十次后终止迭代
- repeat()可以设置两个参数,其中第一个参数要求可迭代,第二个参数为重复次数,第二个参数如不设置则无限循环,一般来说使用时都会设置第二个参数,用来满足预期重复次数后终止:
import itertools
li = ['a','b','c','d']
for i in itertools.repeat(li,6):
print(i)
***********************************************************************
D:\anaconda\python.exe D:/bilibili大学/python经典习题100道/测试itertools.py
['a', 'b', 'c', 'd']
['a', 'b', 'c', 'd']
['a', 'b', 'c', 'd']
['a', 'b', 'c', 'd']
['a', 'b', 'c', 'd']
['a', 'b', 'c', 'd']
Process finished with exit code 0
-
可终止迭代器
- accumulate(可迭代对象[, 函数]),accumulate 迭代器将返回累计求和结果,或者传入两个参数的话,由传入的函数累积计算的结果。默认设定为相加。
import itertools
import operator
li = list(itertools.accumulate(range(1,10)))
print(li)
lis = list(itertools.accumulate(range(1,10),operator.mul))#乘
print(lis)
******************************************************************************
D:\anaconda\python.exe D:/bilibili大学/python经典习题100道/测试itertools.py
[1, 3, 6, 10, 15, 21, 28, 36, 45]
[1, 2, 6, 24, 120, 720, 5040, 40320, 362880]
Process finished with exit code 0
2 . chain(*可迭代对象)
chain 迭代器能够将多个可迭代对象合并成一个更长的可迭代对象。我有一个列表,里面已经包含一些元素,接着想把另外两个列表添加到最初那个列表中。注意,我们想添加的是两个列表的元素。最初,我是这样做的:
my_list = ['foo', 'bar']
numbers = list(range(5))
cmd = ['ls', '/some/dir']
my_list.append(cmd)
my_list.append(numbers)
print(my_list)
*****************************************************************************
D:\anaconda\python.exe D:/bilibili大学/python经典习题100道/测试itertools.py
['foo', 'bar', ['ls', '/some/dir'], [0, 1, 2, 3, 4]]
Process finished with exit code 0
如果用chain来解决这个问题:
import itertools
my_list = ['foo', 'bar']
numbers = list(range(5))
cmd = ['ls', '/some/dir']
print(list(itertools.chain(my_list,numbers,cmd)))
***********************************************************************
D:\anaconda\python.exe D:/bilibili大学/python经典习题100道/测试itertools.py
['foo', 'bar', 0, 1, 2, 3, 4, 'ls', '/some/dir']
Process finished with exit code 0
是不是觉得chain很优雅,很装逼,也很省内存啊
-
其他迭代器
- itertools.permutations(可迭代对象,每个对象需要的元素),通俗地讲,就是返回可迭代对象的所有数学全排列方式。
import itertools
li = ['a','b','c']
for i in itertools.permutations(li,3):#permutations是排列组合的意思
print(i)
print('*'*20)
m = ['1','2','3']
for j in itertools.permutations(m,2):#permutations是排列组合的意思
print(j)
***********************************************************************
D:\anaconda\python.exe D:/bilibili大学/python经典习题100道/测试itertools.py
('a', 'b', 'c')
('a', 'c', 'b')
('b', 'a', 'c')
('b', 'c', 'a')
('c', 'a', 'b')
('c', 'b', 'a')
********************
('1', '2')
('1', '3')
('2', '1')
('2', '3')
('3', '1')
('3', '2')
-
笛卡尔积:itertools.product(*iterables[, repeat])
直接对自身进行笛卡尔积:
import itertools
li = ['A','B','C']
for i in itertools.product(li,repeat=2):
print(','.join(i))
print(type((','.join(i))))
print(i)
print(type(i))
**********************************************************
D:\anaconda\python.exe D:/bilibili大学/python经典习题100道/测试itertools.py
A,A
<class 'str'>
('A', 'A')
<class 'tuple'>
A,B
<class 'str'>
('A', 'B')
<class 'tuple'>
A,C
<class 'str'>
('A', 'C')
<class 'tuple'>
B,A
<class 'str'>
('B', 'A')
<class 'tuple'>
B,B
<class 'str'>
('B', 'B')
<class 'tuple'>
B,C
<class 'str'>
('B', 'C')
<class 'tuple'>
C,A
<class 'str'>
('C', 'A')
<class 'tuple'>
C,B
<class 'str'>
('C', 'B')
<class 'tuple'>
C,C
<class 'str'>
('C', 'C')
<class 'tuple'>
Process finished with exit code 0
顺便还复习了join()函数,join()函数是连接成一个新的字符串
然后笛卡尔积返回的是元祖结构,repeat也是代表返回每个元祖所含元素的个数
两个元祖笛卡尔积,两个列表笛卡尔积:
import itertools
li_1 = ['A','B','C']
li_2 = ['a','b','c']
for i in itertools.product(li_1,li_2):
print(i)
li_3 = (1,2,3)
li_4 = (4,5,6)
for j in itertools.product(li_3,li_4):
print(j)
*************************************************************
('A', 'a')
('A', 'b')
('A', 'c')
('B', 'a')
('B', 'b')
('B', 'c')
('C', 'a')
('C', 'b')
('C', 'c')
(1, 4)
(1, 5)
(1, 6)
(2, 4)
(2, 5)
(2, 6)
(3, 4)
(3, 5)
(3, 6)
- 组合
- 组合:itertools.combinations(iterable, r)
- 组合(包含自身重复):itertools.combinations_with_replacement(iterable, r)
import itertools
li_1 = ['A','B','C']
li_2 = ['a','b','c']
for i in itertools.combinations(li_1,2):
print(i)
print('*'*20)
for j in itertools.combinations_with_replacement(li_2,2):
print(j)
**********************************************************************
D:\anaconda\python.exe D:/bilibili大学/python经典习题100道/测试itertools.py
('A', 'B')
('A', 'C')
('B', 'C')
********************
('a', 'a')
('a', 'b')
('a', 'c')
('b', 'b')
('b', 'c')
('c', 'c')
Process finished with exit code 0
网友评论