python的内建模块itertools提供了非常有用的用于操作迭代对象的函数 (iter- iteration- 迭代对象 tools- 工具) count()会创建一个无限的迭代器,会一直重复下去,只能按Ctrl+c退出
>> > import itertools
>> > natuals = itertools. count( 1 )
>> > for n in natuals:
. . . print ( n)
. . .
1
2
3
. . .
cycle()会把传入的一个序列无限重复下去 (cycle-循环)
>> > import itertools
>> > cs = itertools. cycle( 'ABC' )
>> > for c in cs:
. . . print ( c)
. . .
'A'
'B'
'C'
'A'
'B'
'C'
. . .
repeat()负责把一个元素无限重复下去,不如第二个参数可以指定重复次数
>> > ns = itertools. repeat( 'A' , 3 )
>> > for n in ns:
. . . print ( n)
. . .
A
A
A
chain()可以把一组迭代对象串联起来,形成一个更大的迭代器 (chain-链)
>> > for c in itertools. chain( 'ABC' , 'XYZ' ) :
. . . print ( c)
groupby()把迭代器中相邻的重复元素挑出来放在一起
实际上挑选规则是通过函数完成的,只要作用于函数的两个元素返回的值相等,这两个元素就被认为是在一组的,而函数返回值作为该组的key
>> > for key, group in itertools. groupby( 'AAABBBCCAAA’) :
. . . print ( key, list ( group) )
. . .
A [ 'A' , 'A' , 'A' ]
B [ 'B' , 'B' , 'B' ]
C [ 'C' , 'C' ]
A [ 'A' , 'A' , 'A’]
>> > for key, group in itertools. groupby( 'AaaBBbcCAAa' , lambda c: c. upper( ) ) :
. . . print ( key, list ( group) )
. . .
A [ 'A' , 'a' , 'a' ]
B [ 'B' , 'B' , 'b' ]
C [ 'c' , 'C' ]
A [ 'A' , 'A' , 'a' ]
无限序列只有在for迭代时才会无限的迭代下去,如果只是创建了一个迭代对象,它不会事先把无限个元素生成出来,事实上也不可能在内存中无限多个元素 无限序列虽然可以无限迭代下去,但是通常我们会通过takewhile()等函数根据条件判断来截取出一个有限的序列 (take-取)
>> > natuals = itertools. count( 1 )
>> > ns = itertools. takewhile( lambda x: x <= 10 , natuals)
>> > list ( ns)
[ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ]
itertools模块提供的全部是处理迭代功能的函数,它们的返回值不是list,而是Iterator,只有用for循环迭代的时候才真正计算。