Python 用count()计数,内置的range()
函数需要定义范围的上界,而下限和步长值可选。count()
函数与之相反,需要给出起始值和一个可选的步长,无须定义上界。
可以用该函数定义类似于enumerate()
这样的函数。例如可以通过zip()
函数和count()
函数定义enumertae()
函数,如下所示:
enumerate = lambda x, start=0: zip(count(start), x)
将enumerate()
函数定义为用zip()
函数将count()
函数与某个可迭代对象组合起来。
因此下面两个命令是等同的。
>>> list(zip(count(), iter('word')))
[(0, 'w'), (1, 'o'), (2, 'r'), (3, 'd')]
>>> list(enumerate(iter('word')))
[(0, 'w'), (1, 'o'), (2, 'r'), (3, 'd')]
二者都返回一系列二元组,元组的第一个元素是个整数计数器,第二个元素来自可迭代对象。在上面的例子中,迭代器构建于由字符组成的字符串。
zip()
函数与count()
函数配合使用更简单,如下所示:
zip(count(1, 3), some_iterator)
count(b, s)
返回序列 {b, b+f, b+2f, b+3f,…}。上面的例子首先创建了1, 4, 7, 10, ··· 序列,然后用每个元素标记枚举器给出的值。enumerate()
函数也有不足之处:不能改变迭代的步长。使用enumerate()
函数实现的版本如下:
((1 + 3 * e, x) for e, x in enumerate(some_iterator))