2014-04-11 13 views
5

Mi viene sempre detto che il enumerate integrato può essere utilizzato quando è necessario contare il numero e iterare allo stesso tempo.Qual è il modo corretto di contare il numero totale quando si itera un generatore?

Per esempio, questo è un idioma comune in Python (funzione gen restituisce un generatore):

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

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

Ma se il generatore non restituisce nulla? per esempio. enumerate(range(0)), la variabile index non sarà definita.

Possiamo definire la variabile index prima del ciclo for, ma c'è qualche altra soluzione pitonica di cui non ero a conoscenza?

+3

Non sono sicuro di ciò che è così poco Pythonic su inizializzazione di una variabile che avete intenzione di utilizzare in seguito . –

risposta

5

enumerate(gen(), start=1) effettuerà il conteggio index da 1, eliminando la necessità di index+1. Altrimenti, penso che quello che hai sia già Pythonic.

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

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

potresti usare 'index = -1', rilascia' start = 1' e stampa '(index + 1,)' se 'index' è richiesto all'interno del ciclo – jfs

1

Se avete intenzione di utilizzare la index ancora una volta, poi basta inizializzare sopra il for ciclo come hai detto. Non c'è niente di "non-Pythonic" su questo.

Se non si è sicuri se index sarà definito, si può sempre usare try/tranne:

>>> 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 
Problemi correlati