迭代生成器时计算总数的正确方法是什么?

时间:2014-04-11 21:51:40

标签: python

我总是被告知,当您需要计算数字并同时迭代时,可以使用enumerate内置。

例如,这是Python中常见的习惯用法(函数gen返回生成器):

for index, item in enumerate(gen()):
    # Do something with item

# get the numbers consumed from generator
print("% number of items processed" % (index+1,))

但是如果发电机什么都没有?例如enumerate(range(0))index变量将是未定义的。

我们可以在for循环之前定义index变量,但还有更多我不知道的pythonic解决方案吗?

2 个答案:

答案 0 :(得分:5)

enumerate(gen(), start=1)会使index从1开始计算,从而无需index+1。否则,我认为你拥有的已经是Pythonic。

index = 0
for index, item in enumerate(gen(), start=1):
    # Do something with item

print("%d number of items processed" % (index,))

答案 1 :(得分:1)

如果您打算再次使用index,那么只需将其初始化为for循环,就像您所说的那样。关于此,没有任何“非Pythonic”。

如果您不确定是否定义index,您可以随时使用try / except:

>>> from __future__ import print_function  # for Python 2 compatibility
>>> import sys
>>> 
>>> for i, j in enumerate(range(0)):
...   pass
... 
>>> try:
...   print(i)
... except NameError:
...   print('i was not defined', file=sys.stderr)
... 
i was not defined