zoukankan      html  css  js  c++  java
  • python itertools 模块

    itertools 是python的迭代器模块,itertools提供的工具相当高效且节省内存。
    使用这些工具,你将能够创建自己定制的迭代器用于高效率的循环

    一 无限迭代器

    itertools包自带了三个可以无限迭代的迭代器。这意味着,当你使用他们时,你要知道要的到底是最终会停止的迭代器,还是需要无限地迭代下去。
    (1)count(初值=0, 步长=1):count 迭代器会返回从传入的起始参数开始的均匀间隔的数值。count 也可以接收指定的步长参数。我们来看一个简单的例子:

    >>> from itertools import count
    >>> for i in count(10): #从10开始无限循环
    ... if i > 20: 
    ... break
    ... else:
    ... print(i)
    ... 
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

    (2)islice(count(10), 5):从 10 开始,输出 5 个元素后结束。islice 的第二个参数控制何时停止迭代。但其含义并不是”达到数字 5 时停止“,而是”当迭代了 5 次之后停止“。

    from itertools import islice
    from itertools import count
    for i in islice(count(10), 5):
      print(i)

    10
    11
    12
    13
    14

    (3)cycle: 使字符串中的字符一遍一遍的挨个输出,一次输出一个。这里我们创建了一个 for 循环,使其在三个字母 XYZ 间无限循环。当然,我们并不真地想要永远循环下去,所以我们添加了一个简单的计数器来跳出循环。

    >>> from itertools import cycle
    >>> count = 0
    >>> for item in cycle('XYZ'):
    ... if count > 7:
    ... break
    ... print(item)
    ... count += 1
    ... 
    X
    Y
    Z
    X
    Y
    Z
    X
    Y

    二 可终止迭代器

    (1)accumulate(可迭代对象[, 函数])
       accumulate 迭代器将返回累计求和结果,或者传入两个参数的话,由传入的函数累积计算的结果。默认设定为相加,我们赶快试一试吧:

    list(accumulate(range(10))):list(xxx) 是将xxx的结果放到一个列表中 如list(range(5))=[0,1,2,3,4]

    >> from itertools import accumulate
    >>> list(accumulate(range(10)))
    [0, 1, 3, 6, 10, 15, 21, 28, 36, 45]

      这里,我们 导入了 accumulate,然后传入 10 个数字,0-9。迭代器将传入数字依次累加,所以第一个是 0 ,第二个是 0+1, 第三个是 1+2,如此下去。现在我们导入 operator 模块,然后添加进去:

    >>> import operator
    >>> list(accumulate(range(1, 5), operator.mul))
    [1, 2, 6, 24]

      这里我们传入了数字 1-4 到 accumulate 迭代器中。我们还传入了一个函数:operator.mul,这个函数将接收的参数相乘。所以每一次迭代,迭代器将以乘法代替除法(1×1=1, 1×2=2, 2×3=6, 以此类推)。
      accumulate 的文档中给出了其他一些有趣的例子,例如贷款分期偿还,混沌递推关系等。这绝对值得你花时间去看一看。
    (2)chain(*可迭代对象)
        chain 迭代器能够将多个可迭代对象合并成一个更长的可迭代对象。可以把一组迭代对象串联起来,形成一个更大的迭代器,实际上,我参与的一个项目中最近就需要这一功能。我有一个列表,里面已经包含一些元素,接着想把另外两个列表添加到最初那个列表中。注意,我们想添加的是两个列表的元素。

    from itertools import chain
    my_list =list(chain(列表1,列表2,列表3)) 
    ------或者-----
    列表1 += 列表2 + 列表3 #:my_list += cmd + numbers
    例子:
    >>> for c in itertools.chain('ABC', 'XYZ'):
    ...     print(c)
    # 迭代效果:'A' 'B' 'C' 'X' 'Y' 'Z'

    最初,我是这样做的:

        方式一: 

    复制代码
    >>> my_list = ['foo', 'bar']
    >>> numbers = list(range(5))
    >>> cmd = ['ls', '/some/dir']
    >>> my_list.append(cmd)
    >>> my_list.append(numbers)
    >>> my_list
    ['foo', 'bar', ['ls', '/some/dir'], [0, 1, 2, 3, 4]]
    复制代码

       这并不是我想要的。itertools 模块提供一个优雅得多的方法用chain 来合并这些列表:
        方式二:

    >>> from itertools import chain
    >>> my_list = list(chain(['foo', 'bar'], cmd, numbers))
    >>> my_list
    ['foo', 'bar', 'ls', '/some/dir', 0, 1, 2, 3, 4]

         许多聪明的读者可能想到了,实际上不使用 itertools,也有其他方法能够实现这一要求。你可以这样做:
        方式三:

    >>> my_list = ['foo', 'bar']
    >>> my_list += cmd + numbers
    >>> my_list
    ['foo', 'bar', 'ls', '/some/dir', 0, 1, 2, 3, 4]

       这些方法当然都是可行的。在我知道 chain 之前,我可能会这样做,但我个人认为这个例子中, chain 更为优雅,也更容易理解。

    此模块其他内容可参看廖雪峰:https://www.baidu.com/link?url=NOhFRUCDSHTJukIM9HLrhEA9U6kng3BSbAV1-BAM5VWVpAsPM4oksX40tmZ3MAFoc-Xuxiww7FIPb3tquLpd9bo4GKis1UwQLu08knsR8yJ4hd7tGoyxVhz6HwQLSUywGtLvJAd4kKUfoZRBC0Z57kg1Y9lZjvrma0RMZhEY6gEPKpFjUc_8GWlXFFzN37MY&wd=&eqid=b5158ab500011387000000025e5a183c

  • 相关阅读:
    【看完想不会都难的系列教程】- (3) JQuery+JQueryUI+Jsplumb 实现拖拽模块,流程图风格
    数据库~大叔通过脚本生成poco实体
    Git~分支真的很轻
    jenkins~管道Pipeline里使用公用类库
    docker~run起来之后执行多条命令
    jenkins~管道Pipeline的使用,再见jenkinsUI
    通过数组初始化链表的两种方法:指向指针的引用node *&tail和指向指针的指针(二维指针)node **tail
    NYOJ 16 矩形嵌套(动态规划)
    SPOJ 416
    sqlserver,执行生成脚本时“引发类型为“System.OutOfMemoryException”的异常”(已解决)
  • 原文地址:https://www.cnblogs.com/forforever/p/12392938.html
Copyright © 2011-2022 走看看