第三章:算法-itertools:迭代器函数-生成新值

3.2.3 生成新值
count()函数返回一个迭代器,该迭代器能够无限地生成连续的整数。第一个数可以作为参数传入(默认为0)。这里没有上界参数(参见内置的range(),这个函数对结果集可以有更多控制)。

from itertools import *

for i in zip(count(1),['a','b','c']):
    print(i)

这个例子会停止,因为列表参数会被完全消费。
运行结果:

(1, ‘a’)
(2, ‘b’)
(3, ‘c’)

count()的“开始位置”和“步长”参数可以是可相加的任意的数字值。

import fractions
from itertools import *

start = fractions.Fraction(1,3)
step = fractions.Fraction(1,3)

for i in zip(count(start,step),['a','b','c']):
    print('{}:{}'.format(*i))

在这个例子中,开始点和步长是来自fraction模块的Fraction对象。
运行结果:

1/3:a
2/3:b
1:c

cycle()函数返回一个迭代器,它会无限地重复给定参数的内容。由于必须记住输入迭代器的全部内容,所以如果这个迭代器很长,则可能会耗费大量内存。

from itertools import *

for i in zip(range(7),cycle(['a','b','c'])):
    print(i)

这个例子中使用了一个计数器变量,在数个周期后会中止循环。
运行结果:

(0, ‘a’)
(1, ‘b’)
(2, ‘c’)
(3, ‘a’)
(4, ‘b’)
(5, ‘c’)
(6, ‘a’)

repeat()函数返回一个迭代器,每次访问时会发生成相同的值。

from itertools import *

for i in repeat('over-and-over',5):
    print(i)

repeat()返回的迭代器会一直返回数据,除非提供了可选的times参数来现在次数。
运行结果:

over-and-over
over-and-over
over-and-over
over-and-over
over-and-over

如果既要包含来自其他迭代器的值,也要包含一些不变的值,那么可以结合使用repeat()以及zip()或map()。

from itertools import *

for i,s in zip(count(),repeat('over-and-over',5)):
    print(i,s)

这个例子中就结合了一个计数器值和repeat()返回的常量。
运行结果:

0 over-and-over
1 over-and-over
2 over-and-over
3 over-and-over
4 over-and-over

下面这个例子使用map()将0到4区间的数乘以2。

from itertools import *

for i in map(lambda x,y:(x,y,x * y),repeat(2),range(5)):
    print('{:d} * {:d} = {:d}'.format(*i))

repeat()迭代器不需要被显示限制,因为任何一个输入迭代器结束时map()就会停止处理,而且range()只返回5个元素。
运行结果:

2 * 0 = 0
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8

你可能感兴趣的:(Python标准库)