Quello che stai indicando è Generator
in Python. Date un'occhiata a: -
Vedere la documentazione: - Generator Expression
che contiene esattamente lo stesso esempio che hai postato
Dalla documentazione: -
I generatori sono uno strumento semplice e potente per la creazione di iteratori. Loro sono scritti come normali funzioni ma usano la dichiarazione di rendimento ogni volta che vogliono restituire i dati. Ogni volta successiva() viene chiamato, il generatore riprende da dove si era-off (si ricorda valorizza tutti i dati e che dichiarazione è stata l'ultima eseguita)
generatori sono simili a List Comprehension
che si utilizza con square brackets
invece di brackets
, ma sono più efficienti in termini di memoria. Non restituiscono allo stesso tempo lo list
completo del risultato, ma restituiscono l'oggetto generatore. Ogni volta che si invoca next()
sull'oggetto generator
, il generatore utilizza yield
per restituire il valore successivo.
List Comprehension
per il codice di cui sopra sarebbe simile: -
[x * x for x in range(10)]
è anche possibile aggiungere le condizioni per filtrare i risultati alla fine del per.
[x * x for x in range(10) if x % 2 != 0]
Questo restituirà un elenco di numbers
moltiplicato per 2 nell'intervallo da 1 a 5, se il numero non è divisibile per 2.
Un esempio di Generators
raffigurante l'uso di yield
può essere: -
def city_generator():
yield("Konstanz")
yield("Zurich")
yield("Schaffhausen")
yield("Stuttgart")
>>> x = city_generator()
>>> x.next()
Konstanz
>>> x.next()
Zurich
>>> x.next()
Schaffhausen
>>> x.next()
Stuttgart
>>> x.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
Quindi, si vede che, ogni chiamata a next()
esegue il prossimo yield()
in generator
. e alla fine getta StopIteration
.
fonte
2012-10-16 17:27:41
generatori e anche le list comprehensions, che sembrano molto simili: '[x * x per x nel range (10)]'. Puoi anche includere una condizione per filtrare i risultati: '[x * x per x nell'intervallo (10) se x% 2 == 0 o x% 3 == 0]'. –