如果你还在用xrang的话,可能low爆了,我来介绍一下itertools

itertools是python内置的高效好用的迭代模块,迭代器有一个特色就是惰性求值,也就是只有当这个值被使用的时候才会计算,不需要预先在内存中生成这些数据,所以在遍历大文件、或者无限集合数组的时候,它的优势就格外的突出。

itertools的迭代器函数有三种类型

  1. 无限迭代器:可以生成一个无限的序列,比如等差、等比、自然数都可以。
  2. 有限迭代器:可以接收一个或者多个序列,然后组合、过滤、或者分组。
  3. 组合生成器:序列的排列、组合,求序列的笛卡儿积等。

无限迭代器有三个函数,count(firstval=0, step=1)、cycle(iterable)、repeat(object [,times])。

>>> import itertools
>>> 
>>> dir(itertools)
['__doc__', '__file__', '__name__', '__package__', 'chain', 'combinations', 'combinations_with_replacement', 'compress', 'count', 'cycle', 'dropwhile', 'groupby', 'ifilter', 'ifilterfalse', 'imap', 'islice', 'izip', 'izip_longest', 'permutations', 'product', 'repeat', 'starmap', 'takewhile', 'tee']

count的使用方法,firstval是开始数值,step(默认为1)是步长。比如开始值为5,step为2,那么生成的无限序列就是:5,7,9,11...,是一个开始值为5,差值为2的等差无限序列,你不需要担心没有更多的内存来存储这些数据,他们只有在使用的时候才会计算,如果你只需要5-20的数值,只需要用if判断一下,然后break就可以了。

cycle则是反复循环数值

from __future__ import print_function
import itertools
cycle_strings = itertools.cycle('ABC')
i = 1
for string in cycle_strings:
    if i == 10:
        break
    print('%d => %s' % (i, string), end=' ')
    i += 1

repeat反复生成一个对象

from __future__ import print_function
import itertools
for item in itertools.repeat('hello world', 3):
    print(item)

itertools chain

>>> from __future__ import print_function
>>> import itertools
>>> for item in itertools.chain([1, 2, 3], ['a', 'b', 'c']):
...     print(item, end=' ')
... 
1 2 3 a b c 

答疑:

为什么需要from future import print_function?

  • 由于我们需要不换行答应数据内容,所以需要在文件第一行引入这个hack,然后添加一个参数end,使其等于空格,完成我们不换行,空格相间输出。

0 comments

To reply to the article, please Login or registered