2014-04-11 2 views
5

Mir wurde immer gesagt, dass die integrierte enumerate verwendet werden kann, wenn Sie Anzahl zählen und gleichzeitig durchlaufen müssen.Wie kann die Gesamtzahl beim Iterieren eines Generators korrekt berechnet werden?

Zum Beispiel ist dies ein gemeinsames Idiom in Python (Funktion gen einen Generator zurückgibt):

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

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

Aber wenn der Generator gibt nichts zurück? z.B. enumerate(range(0)) ist die index Variable nicht definiert.

Wir können index Variable vor der for-Schleife definieren, aber gibt es noch mehr Pythonic-Lösung, die ich nicht bewusst war?

+3

Ich bin nicht sicher, was ist so un-Pythonic über eine Variable zu initialisieren, die Sie beabsichtigen, später zu verwenden, . –

Antwort

5

enumerate(gen(), start=1) wird machen index Start von 1 zu zählen, die Notwendigkeit für index+1 zu entfernen. Ansonsten denke ich, was du hast ist schon Pythonic.

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

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

können Sie 'index = -1' verwenden, 'start = 1' löschen und' (index + 1,) 'drucken, wenn' index' innerhalb der Schleife benötigt wird – jfs

1

Wenn Sie beabsichtigen, die index wieder zu verwenden, dann initialisieren es einfach über Ihre for Schleife wie Sie gesagt haben. Es gibt nichts "Un-Pythonic" darüber.

Wenn Sie nicht sicher sind, ob index wird definiert werden, können Sie immer versuchen, verwenden/außer:

>>> 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 
Verwandte Themen