python的itertools模块

2019-08-27  本文已影响0人  转身丶即天涯

编程中会用到很多需要迭代的地方,强大的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类:

接下来,我就按照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
上一篇下一篇

猜你喜欢

热点阅读