美文网首页
python的itertools模块

python的itertools模块

作者: 转身丶即天涯 | 来源:发表于2019-08-27 19: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类:

    • 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

    相关文章

      网友评论

          本文标题:python的itertools模块

          本文链接:https://www.haomeiwen.com/subject/frreectx.html