2015-10-13 26 views
5

Sto giocando intorno con generatori per capire meglio come funzionano confusione, ma io sono confuso con il risultato della seguente pezzo di codice:Python Generatore: risultato

>>> def gen(): 
... for i in range(5): 
... yield i 
... 
>>> count=gen() 
>>> for i in count: 
... print count.next() 
... 
1 
3 
Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
StopIteration 
>>> 

cosa sta succedendo qui? Sembra che quando colpisce la riga "for i in count:" il generatore produce il primo valore. Non ne sono sicuro.

EDIT: Vorrei aggiungere che non sto cercando di "farlo bene". Sto cercando di rompere le cose per vedere come reagisce Python. Imparo di più sulla lingua quando genera errori. Questo errore mi ha bloccato ma ora è tutto chiaro. Finora tutte le risposte sono state brevi e dolci. Grazie a tutti!

+2

'per i in count' e' count.next() 'sono * entrambi * cercando di ottenere l'elemento successivo - perché li stai usando entrambi nello stesso ciclo ?! – jonrsharpe

risposta

5

Il codice dovrebbe essere simile a questo codice

:

def gen(): 
    for i in range(5): 
     yield i 

count=gen() 
for i in count: 
    print i 

uscita:

0 
1 
2 
3 
4 

Note:

Quando si esegue un ciclo for i in count voi cercando di ottenere il prossimo oggetto di nuovo qui count.next() si cercando di ottenere il secondo elemento .Quindi in pratica si sta cercando di ottenere elemento +2 dalla posizione corrente

Che cosa succede in te codice è come sono qui di seguito:

passi:

1. for i in count qui il valore successivo è ottenuto che è 0

2. print count.next() qui di nuovo la prossima valore viene chiamato e stampato così 1 è stampato

3. for i in count qui nuovamente valore successivo è chiamato che è 2

4. print count.next() qui nuovamente valore successivo viene chiamato e stampato così 3 è stampato

5. for i in count anche qui viene chiamato il prossimo valore che è 4

6.finalmente qui chiami print count.next() dato che non c'è alcun valore nel generatore. Hai dato l'eccezione StopIteration

2

for i in count: sta già chiamando in seguito (e assegna il valore a i). Quindi il tuo codice chiamerà ancora.

Se si desidera solo per stampare ogni valore

for i in count: 
    print i 

o la strada più lunga

while True: 
    try: 
     print count.next() 
    except StopIteration, si: 
     break 
+0

Il tuo "lungo cammino" è interessante. Pratico anche questo. – solid

3

Perché "per" ciclo già scorrere i valori del generatore, ad ogni passo due valori vengono ceduti: uno in "per" e uno nel corpo del ciclo.

+0

Mi piace molto come hai catturato tutto in una frase. Stavo cercando di formulare una risposta breve ma non ero in grado. – solid