Scopri come questo tipo di funzione alternativa può aiutarti a ridurre l'ingombro della memoria.

Se stai leggendo righe da un file di registro o elaborando un lungo elenco di elementi, un'opzione è caricare tutti i dati in memoria. Tuttavia, questo approccio può utilizzare molta memoria e ostacolare le prestazioni. I generatori offrono una soluzione preziosa.

I generatori eliminano la necessità di caricare tutti i dati in memoria contemporaneamente. Sono utili quando si gestiscono set di dati di grandi dimensioni, sequenze infinite o qualsiasi scenario in cui l'efficienza della memoria è fondamentale.

Cosa sono i generatori?

Un generatore è una funzione speciale che consente di eseguire l'iterazione su una sequenza di valori. Invece di restituire un set completo di dati, generano (o producono) un valore alla volta. Ciò li rende efficienti per lavorare con sequenze di dati grandi o illimitate.

UN normale funzione Python in genere calcola un valore e lo restituisce. Ma i generatori funzionano diversamente. Possono produrre più valori nel tempo sospendendo e riprendendo l'esecuzione tra ogni rendimento.

instagram viewer

La distinzione chiave tra funzioni regolari e generatori è che invece di utilizzare il file ritorno parola chiave per produrre un risultato, utilizzano i generatori prodotto.

Come creare un generatore

Per creare un generatore, invece del file ritorno dichiarazione, utilizzare a prodotto dichiarazione all'interno della funzione. IL prodotto La parola chiave non solo indica alla funzione di restituire un valore, ma le consente anche di salvare il suo stato, consentendone la ripresa futura.

Ecco un esempio di una semplice funzione generatore:

defnumeric_generator():
yield1
yield2
yield3

gen = numeric_generator()

Questa funzione del generatore produce valori numerici da 1 a 3.

IL prodotto L'istruzione salva lo stato della funzione, preservando le variabili locali tra le chiamate, per riprenderla quando si richiede il valore successivo.

Assegnare una funzione generatrice a una variabile crea un oggetto generatore con cui puoi lavorare.

Lavorare con i generatori

I generatori hanno molteplici applicazioni. Puoi usarli nei cicli for O all'interno delle comprensioni delle liste, così come altre strutture iterabili. I generatori possono anche servire come argomenti per le funzioni.

Dopo aver creato un generatore, puoi scorrere su di esso utilizzando un ciclo for:

for i in numeric_generator():
print(i)

Puoi anche usare il Prossimo funzione per recuperare i valori uno per uno:

print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3

Questo ti dà un maggiore controllo sull'oggetto generatore.

I generatori possono tenere traccia del loro stato. Ogni istruzione yield in una funzione agisce come un checkpoint. Quando chiami il Prossimo() funzione sull'oggetto generatore, l'esecuzione riprende dal punto di snervamento precedente.

Puoi anche passare valori a un generatore utilizzando Inviare():

defgenerator_with_send():
# First yield: Receive a value
x = yield
print(f"Received: {x}")

# Second yield: Receive another value
y = yield
print(f"Received: {y}")

# Third yield: Yield the sum
yield x + y

gen = generator_with_send()

# Start generator and reach first yield
next(gen)

# Send 10 into generator, received at first yield
result = gen.send(10)

# Send 5 into generator, received at second yield
result = gen.send(5)

# Print result of third yield
print(result)

IL Inviare() Il metodo ti consente di recuperare valori dal generatore e di inviarli nuovamente alla funzione del generatore, mettendola effettivamente in pausa e consentendoti di controllarne l'esecuzione. IL Inviare() Il metodo è utile quando si scrivono coroutine o si utilizzano generatori per scopi avanzati.

Utilizzo delle espressioni del generatore

Le espressioni del generatore forniscono un modo conciso per creare un generatore semplice e anonimo. Sono simili alle comprensioni delle liste ma usano parentesi invece di parentesi quadre.

Ecco un esempio:

gen = (i**2for i in range(10))

for x in gen:
print(x)

Il codice crea un'espressione generatrice che produce i quadrati dei numeri da 0 a 9. Le espressioni del generatore sono ideali per generare pigramente una sequenza di valori.

Utilizzo di generatori per l'elaborazione dei dati

I generatori Python sono un modo conveniente per descrivere flussi di dati e creare iteratori senza tenere tutto in memoria. Puoi migliorare in modo significativo la tua programmazione imparando a utilizzare i generatori, semplificando la gestione di attività di elaborazione dati impegnative.

La prossima volta che lavori con set di dati di grandi dimensioni, tieni a mente i generatori e delega loro le attività ad alta intensità di lavoro, in modo che il tuo codice rimanga reattivo ed efficiente.