2011-01-14 14 views
5

Quello che voglio fare è stampare gli interi da 0 a 5 nel codice qui sotto, ma tutto ciò che ottengo è un indirizzo dell'iteratore?Utilizzo di un iteratore per stampare numeri interi

def main(): 

    l = [] 
    for i in range(0,5): 
     l.append(i) 

    it = iter(l) 

    for i in range(0,5): 
     print it 
     it.next() 

if __name__ == '__main__': 
    main() 
+0

Solo così si sa, chiamando 'next()' restituisce il prossimo valore nell'iteratore. Quindi il corpo del ciclo dovrebbe leggere 'print it.next()'. –

+0

Modo rapido per produrre il tuo iteratore: it = iter (range (5)) – nakedfanatic

risposta

9

Per accedere ai valori restituiti da un iteratore, si utilizza il metodo del iteratore next() in questo modo:

try: 
    while True: 
     val = it.next() 
     print(val) 
except StopIteration: 
    print("Iteration done.") 

next() ha sia lo scopo di far avanzare l'iteratore e restituendo l'elemento successivo. StopIteration viene lanciato quando viene eseguita l'iterazione.

Dal momento che questo è abbastanza ingombrante, tutto questo è avvolto bene nella for-sintassi:

for i in it: 
    print(i) 
print("Iteration done.") 

Più link:

+0

Sul primo blocco di codice, è possibile non includere l'istruzione try? – pandoragami

+0

Sì, ma l'eccezione verrà generata ulteriormente. –

+0

sembra nella versione 3 (o giù di lì) è necessario cambiare accanto a __next__ – kdubs

3

Quando si ha un iteratore, è necessario iterarlo su di esso, non su un intervallo.

for i in it: 
    print(i) 
+0

C'è un modo per dereferenziare un iteratore come in C++ usando * it? – pandoragami

+0

No, Python non usa affatto i puntatori. E perché vorresti? Il dereferenziamento è usato per ottenere un valore, e Python ti dà già questo valore. Cerca di non pensare in termini C++ quando lavori con Python. – Hollister

+1

Python 'it.next()' è approssimativamente equivalente a C++ '* it ++'. Non puoi separare le operazioni. –

3

Quando si utilizza il ciclo for, in realtà si sta chiamando il metodo dell'oggetto iteratore __next__ implicitamente. Quindi, non useresti semplicemente qualcosa come l'intervallo, ma invece usi semplicemente l'iteratore stesso.

for i in it: 
    print i 

Per quello che vale, xrange in Python 2 e range in Python 3 restituisce un iteratore, quindi basta scrivere il tuo primo ciclo con quelli di avere la soluzione desiderata,

Problemi correlati