logo

Generatori in Python

Un generatore in Python è una funzione che restituisce un iteratore utilizzando la parola chiave Yield. In questo articolo discuteremo come funziona la funzione generatore in Python.

Funzione generatore in Python

Una funzione generatrice in Python è definita come una normale funzione, ma ogni volta che deve generare un valore, lo fa con il comando parola chiave rendimento piuttosto che ritornare. Se il corpo di una def contiene yield, la funzione diventa automaticamente una funzione generatrice Python.

Crea un generatore in Python

In Python, possiamo creare una funzione generatrice semplicemente utilizzando la parola chiave def e la parola chiave yield. Il generatore ha la seguente sintassi in Pitone :



def function_name():  yield statement>

Esempio:

In questo esempio creeremo un semplice generatore che produrrà tre numeri interi. Quindi stamperemo questi numeri interi usando Python per ciclo .

Python3




# A generator function that yields 1 for first time,> # 2 second time and 3 third time> def> simpleGeneratorFun():> >yield> 1> >yield> 2> >yield> 3> > # Driver code to check above generator function> for> value>in> simpleGeneratorFun():> >print>(value)>

>

>

Produzione:

1 2 3>

Oggetto generatore

Le funzioni Python Generator restituiscono un oggetto generatore che è iterabile, ovvero può essere utilizzato come oggetto Iteratore . Gli oggetti generatore vengono utilizzati chiamando il metodo successivo dell'oggetto generatore o utilizzando l'oggetto generatore in un ciclo for in.

Esempio:

In questo esempio, creeremo una semplice funzione generatrice in Python per generare oggetti utilizzando il metodo funzione next() .

Python3




# A Python program to demonstrate use of> # generator object with next()> > # A generator function> def> simpleGeneratorFun():> >yield> 1> >yield> 2> >yield> 3> > # x is a generator object> x>=> simpleGeneratorFun()> > # Iterating over the generator object using next> > # In Python 3, __next__()> print>(>next>(x))> print>(>next>(x))> print>(>next>(x))>

>

jlist

>

Produzione:

1 2 3>

Esempio:

In questo esempio, creeremo due generatori per i numeri di Fibonacci, il primo un generatore semplice e il secondo generatore utilizzando a per ciclo .

Python3




# A simple generator for Fibonacci Numbers> def> fib(limit):> > ># Initialize first two Fibonacci Numbers> >a, b>=> 0>,>1> > ># One by one yield next Fibonacci Number> >while> a yield a a, b = b, a + b # Create a generator object x = fib(5) # Iterating over the generator object using next # In Python 3, __next__() print(next(x)) print(next(x)) print(next(x)) print(next(x)) print(next(x)) # Iterating over the generator object using for # in loop. print(' Using for in loop') for i in fib(5): print(i)>

>

>

Produzione:

0 1 1 2 3  Using for in loop 0 1 1 2 3>

Espressione del generatore Python

In Python, l'espressione generatore è un altro modo di scrivere la funzione generatore. Utilizza Python comprensione delle liste tecnica ma invece di archiviare gli elementi in un elenco in memoria, crea oggetti generatori.

Sintassi dell'espressione del generatore

L'espressione del generatore in Python ha la seguente sintassi:

(expression for item in iterable)>

Esempio:

In questo esempio, creeremo un oggetto generatore che stamperà i multipli di 5 compresi nell'intervallo da 0 a 5 che sono anche divisibili per 2.

Python3




# generator expression> generator_exp>=> (i>*> 5> for> i>in> range>(>5>)>if> i>%>2>=>=>0>)> > for> i>in> generator_exp:> >print>(i)>

>

>

Produzione:

0 10 20>

Applicazioni dei generatori in Python

Supponiamo di creare un flusso di numeri di Fibonacci, l'adozione dell'approccio del generatore lo rende banale; dobbiamo solo chiamare next(x) per ottenere il successivo numero di Fibonacci senza preoccuparci di dove o quando finisce il flusso di numeri. Un tipo più pratico di elaborazione del flusso consiste nella gestione di file di dati di grandi dimensioni come i file di registro. I generatori forniscono un metodo efficiente in termini di spazio per tale elaborazione dei dati poiché solo le parti del file vengono gestite in un dato momento. Possiamo anche utilizzare gli Iteratori per questi scopi, ma Generator fornisce un modo rapido (non abbiamo bisogno di scrivere i metodi __next__ e __iter__ qui).