0Pricing
Python Academy · Lezione

La parola chiave yield

Scriva funzioni generatrici con yield per creare iteratori personalizzati.

La parola chiave yield è una lezione Python Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Python Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Python Academy include 4 lezioni in totale.

Introduzione

Le funzioni generatrici utilizzano yield per produrre lazy una sequenza di valori, mettendo in pausa l'esecuzione tra un yield e l'altro.

Che cos'è yield

Una funzione con yield è una funzione generatrice. Ogni chiamata a next() riprende l'esecuzione dal punto dell'ultimo yield.
def count_up(n):
    for i in range(n):
        yield i
for x in count_up(3):
    print(x)

Funzione generatrice e funzione normale

Chiamare una funzione generatrice restituisce un oggetto generatore: NON esegue ancora alcun codice. Il codice viene eseguito durante l'iterazione.
def gen():
    print('start')
    yield 1
    print('middle')
    yield 2
g = gen()  # no print yet
print(next(g))  # 'start', then 1

Generatore infinito

def naturals(n=0): while True: yield n; n+=1 è una sequenza infinita. Lo utilizzi con islice o con break.
def naturals(n=0):
    while True:
        yield n
        n += 1
import itertools
print(list(itertools.islice(naturals(), 5)))

yield from

yield from sub_gen() delega a un sottogeneratore e inoltra tutti i valori. Equivale a for x in sub: yield x.
def chain(*iters):
    for it in iters:
        yield from it
print(list(chain([1,2], [3,4], [5])))

Inviare valori con send()

gen.send(value) riprende il generatore e passa un valore che diventa il risultato dell'espressione yield.
def accumulator():
    total = 0
    while True:
        n = yield total
        if n is None: break
        total += n
g = accumulator()
next(g)  # prime
print(g.send(10))
print(g.send(5))

Stato del generatore

Un generatore si mette in pausa a ogni yield e conserva le variabili locali tra una chiamata e l'altra: è una coroutine naturale.
def stateful():
    seen = set()
    while True:
        item = yield
        seen.add(item)
        yield len(seen)
g = stateful()
next(g); g.send('a'); print(next(g)); g.send('b'); print(next(g))

Chiudere un generatore

gen.close() genera GeneratorExit all'interno del generatore. Utilizzi try/finally all'interno del generatore per eseguire le operazioni di pulizia.
def resource_gen():
    try:
        while True:
            yield
    finally:
        print('cleaned up')
g = resource_gen()
next(g)
g.close()

StopIteration e return

return value in un generatore imposta l'attributo value dell'eccezione StopIteration. Viene utilizzato da yield from per recuperarlo.
def gen_with_return():
    yield 1
    yield 2
    return 'done'
g = gen_with_return()
try:
    while True: print(next(g))
except StopIteration as e:
    print('returned:', e.value)

Generatore di Fibonacci

I generatori sono ideali per le sequenze matematiche infinite: yield a; a, b = b, a+b
def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b
import itertools
print(list(itertools.islice(fibonacci(), 10)))

Generatori e classi con __iter__

I generatori sono più semplici rispetto alla scrittura di una classe con __iter__ e __next__. Utilizzi i generatori per sequenze lineari.
# Generator is simpler than:
# class Counter:
#     def __iter__(self): return self
#     def __next__(self): ...
print('generators simplify iterators')

Verifica rapida

Che cosa fa yield from sub() in una funzione generatrice?

Ripasso

yield sospende una funzione generatrice. Le funzioni generatrici restituiscono un oggetto generatore. yield from delega ai sottogeneratori. send() passa valori alla funzione. close() avvia le operazioni di pulizia.

Continui

Ottimo! Prosegua con la lezione successiva per approfondire le Sue competenze.

Domande Frequenti

La lezione «La parola chiave yield» è gratuita?

Sì — il testo completo di «La parola chiave yield» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Python Academy, passa a CoddyKit PRO. Il corso Python Academy include 4 lezioni in totale.

Cosa imparerò in «La parola chiave yield»?

Scriva funzioni generatrici con yield per creare iteratori personalizzati. Eserciti Python Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Python Academy?

Non è richiesta alcuna esperienza precedente. Python Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «La parola chiave yield»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Python Academy?

Sì. Ogni lezione Python Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. List comprehension
  2. Comprehension di insiemi e dizionari
  3. Espressioni generatrici
  4. La parola chiave yield
← Torna a Python Academy