编程中会用到很多需要迭代的地方,强大的python已经为我们提供了itertools内置库,用来帮助开发人员更便捷的编码。
前言
由于itertools是内置库,不需要任何安装,直接import itertools即可。
概览
按住cmd点击‘itertools’,打开itertools.pyi文件,可以看到itertools库定义的所有函数。
顺便说一句,pycharm中跳转到的是.pyi文件,想跳转到源文件可以在pycharm中设置。
image.png
点击红框中的‘-’,把.pyi删除。这样当你再次按住cmd点击‘itertools’时就会打开源代码文件(*.py)了。
进入到itertools.py文件后,我们先看doc_string。
image.png
作者在doc_string中做了大致描述:创建和使用迭代器的工具。
然后将所有函数大致分为了3类:
- Infinite itertools
- Iterators terminating on the shortest input sequence
- Combinatoric generators
接下来,我就按照doc_string中的分类进行学习。
Infinite itertools,无限迭代器
itertools.count(start=0, step=1)
默认返回一个从0开始,依次+1的自然数迭代器,如果你不停止,它会一直运行下去。
可以用start指定开始的位置,step是每次迭代时的间隔。
itertools.cycle(iterable)
传入一个可迭代对象,然后无限循环迭代。
import itertools
# itertools.count()
l = [1,2,3,4,5]
c = itertools.cycle(l)
for i in c:
print(i)
image.png
itertools.repeat(p_object, times=None)
重复迭代一个对象p_object,如果不指定times,则会迭代无数次,也可以通过times参数指定迭代的次数。
import itertools
# itertools.count()
l = [1,2,3,4,5]
c = itertools.repeat(l, 5)
for i in c:
print(i)
image.png
Iterators terminating on the shortest input sequence
直译过来就是,迭代器终止于最短输入序列。暂时不知道啥意思,继续看吧。
itertools.accumulate(iterable, func)
返回一些列累计值或者其他二进制函数。
我也没看懂,没关系,试呗。
import itertools
# itertools.count()
l = [1,2,3,4,5]
c = itertools.accumulate(l)
print(c)
for i in c:
print(i)
image.png
结果不出意料,accumulate()仍然返回的是一个迭代器,我们给它传了一个list,在for循环中遍历打印的时候发现,它把其中的数值做了累加操作。(迭代第一个数,就是前一个数的和,迭代到第二个数时,就是前两个数的和。。。)
这在做递加操作时会很有用,但是除了list,其他序列也支持么?
为此,我开始做了另外5种测试(list, tuple, str, set, dict),让我感到奇怪的是,就连dict也是可以的。
我们只说一下dict,如果传入的是dict对象,那么会累加迭代dict的key。
import itertools
# itertools.count()
d = {'a': 1, 'b': 2, 'c': 3}
c = itertools.accumulate(d)
print(c)
for i in c:
print(i)
image.png
如果我们想累加dict中的value呢?
很简单,dict.values()将会返回一个value的list,其实就是相当传入一个list,再由accumulate()进行累加。
itertools.chain(*iterables)
这个chain()类是非常实用的,参数可以传入任意个数序列,而且只要是序列即可,不限定序列的数据类型。
比如,我想一起迭代list, tuple, str三个序列,实用itertools.chain()轻松实现。
import itertools
# itertools.count()
l = [1, 2, 3, 4, 5]
t = (1, 2, 3, 4, 5)
s = 'abcdefg'
c = itertools.chain(l, t, s)
print(c)
for i in c:
print(i)
image.png
网友评论