【python】常用内置模块itertools的用法(迭代器)


1. 简介

python内置模块itertools中封装了很多高效的迭代器,本文将讲述10个最为常用的迭代器函数。

2. 无限迭代器

2.1. count(start, [step])

输出自start参数开始的无限长度的自然数序列,step参数设置步长,可选。

>>> import itertools as its
>>> a = its.count(1, 2)
>>> for i in a:
...     print(i)
...
1
3
5
...
使用快捷键Ctrl+C暂停打印

2.2. cycle( p)

将一个序列无限循环下去,p参数指定待循环的序列。

>>> import itertools as its
>>> a = its.cycle('ABC')
>>> for i in a:        
...     print(i)       
... 
A
B
C
A
B
C
...
使用快捷键Ctrl+C暂停打印

2.3. repeat(elem, [n])

把一个元素重复n次,如果不指定参数n,则默认无限次。

>>> import itertools as its
>>> a = its.repeat(10, 3)
>>> for i in a:
...     print(i)        
... 
10  
10  
10 

3. 通用迭代器

3.1. accumulate(p, [func])

依次累加序列p中的元素。

>>> import itertools as its
>>> a = its.accumulate([1, 2, 3, 4, 5])
>>> for i in a:
...     print(i)
... 
1   # 1
3   # 1+2
6   # 1+2+3
10  # 1+2+3+4
15  # 1+2+3+4+5

3.2. chain(p, q, […])

串联多个迭代器,形成一个更大的迭代器。

>>> import itertools as its
>>> a = its.chain('ABD', 'DEF')
>>> for i in a:
...     print(i)
... 
A   
B   
D   
D   
E   
F 

3.3. takewhile(pred, seq)

迭代选择器。

>>> import itertools as its
>>> a = its.takewhile(lambda x: x < 5, [1, 3, 5, 7])
>>> for i in a:
...     print(i)
... 
1   
3  

4. 组合迭代器

4.1. product(p, q, […], [repeat=1])

笛卡尔积,等效于嵌套的for循环:

>>> import itertools as its
>>> a = its.product('ABC', repeat=2)
>>> for i in a:
...     print(i)
... 
('A', 'A')
('A', 'B')
('A', 'C')
('B', 'A')
('B', 'B')
('B', 'C')
('C', 'A')
('C', 'B')
('C', 'C')

等价于:

>>> for x in 'ABC':
...     for y in 'ABC':
...         print((x, y))
... 
('A', 'A')
('A', 'B')
('A', 'C')
('B', 'A')
('B', 'B')
('B', 'C')
('C', 'A')
('C', 'B')
('C', 'C')

提问:既然可以用嵌套的for循环来代替,为什么还要封装该函数?

解答:一两个for循环可以,但如果你需要写七八个for循环,代码就很难看了,所以一般都会用该函数替换嵌套的for循环。

该函数可以应用到密码字典的生成中,比如生成一个包含所有由数字组成的长度为8的密码字典:

import itertools as its
iterator = its.product('0123456789', repeat=8)
with open('pwd.txt', 'w') as f:
    for i in iterator:
        f.write(''.join(i)+'\n')

4.2. permutations(p, [r])

product()函数,但元素不允许重复,不会生成AA这样的:

>>> import itertools as its
>>> a = its.permutations('ABC', r=2)
>>> for i in a:
...     print(i)
... 
('A', 'B')
('A', 'C')
('B', 'A')
('B', 'C')
('C', 'A')
('C', 'B')

4.3. combinations(p, r)

permutations()函数,但ABBA这样的视为同一元素,只取AB:

>>> import itertools as its
>>> a = its.combinations('ABC', r=2)
>>> for i in a:
...     print(i)
...
('A', 'B')
('A', 'C')
('B', 'C')

4.4. combinations_with_replacement(p, r)

product()函数,允许重复,但ABBA这样的视为同一元素,只取AB

>>> import itertools as its
>>> a = its.combinations_with_replacement('ABC', r=2)
>>> for i in a:
...     print(i)
...
('A', 'A')
('A', 'B')
('A', 'C')
('B', 'B')
('B', 'C')
('C', 'C')

5. 引用

https://docs.python.org/3.10/library/itertools.html#itertools-recipes

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xavier Jiezou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值