Per selezionare solo un elemento di un generatore utilizzare break
in for
un'istruzione, oppurelist(itertools.islice(gen, 1))
Secondo il tuo esempio (letteralmente) puoi fare qualcosa del tipo:
while True:
...
if something:
for my_element in myfunct():
dostuff(my_element)
break
else:
do_generator_empty()
Se vuoi " ottenere un solo elemento dal generatore [una volta generato] ogni volta che mi piace " (suppongo che il 50% sia l'intenzione originale e l'intenzione più comune) quindi:
gen = myfunct()
while True:
...
if something:
for my_element in gen:
dostuff(my_element)
break
else:
do_generator_empty()
In questo modo è generator.next()
possibile evitare l' uso esplicito di e la gestione di fine input non richiede la gestione (criptica) delle StopIteration
eccezioni o confronti di valori di default aggiuntivi.
La sezione else:
of for
statement è necessaria solo se vuoi fare qualcosa di speciale in caso di end-of-generator.
Nota su next()
/ .next()
:
In Python3 il .next()
metodo è stato rinominato .__next__()
per una buona ragione: è considerato di basso livello (PEP 3114). Prima di Python 2.6 la funzione incorporata next()
non esisteva. Ed è stato anche discusso di passare next()
al operator
modulo (che sarebbe stato saggio), a causa della sua rara necessità e discutibile inflazione dei nomi predefiniti.
L'uso next()
senza impostazione predefinita è ancora una pratica di livello molto basso: lanciare il criptico StopIteration
come un fulmine a ciel sereno nel normale codice dell'applicazione. E l'utilizzo next()
con sentinel predefinito - che dovrebbe essere l'unica opzione per un accesso next()
diretto builtins
- è limitato e spesso dà ragione a strane logiche / leggibilità non pitoniche.
In conclusione: usare next () dovrebbe essere molto raro, come usare le funzioni del operator
modulo. Usando for x in iterator
, islice
, list(iterator)
e altre funzioni di accettare un iteratore senza soluzione di continuità è il modo naturale di usare iteratori sul livello di applicazione - e quasi sempre possibile. next()
è di basso livello, un concetto in più, invisibile - come mostra la domanda di questo thread. Mentre ad esempio l'uso di break
in for
è convenzionale.