Treci la conținutul principal

Un generator este o funcție care se poate opri și apoi poate continua mai târziu.

Când apelezi o funcție generator, primești înapoi un obiect generator, iar acest obiect este un iterator.

Codul lui nu a rulat încă deloc. Începe să se execute doar când iterezi peste generator.

Exemplu

O funcție generator simplă:

Prompt
Scrie un program Python care definește o funcție generator my_generator() care produce 1, 2 și 3. Folosește o buclă for pentru a itera peste generator și a afișa fiecare valoare.
Ieșire: program Python complet

Cuvântul cheie yield

Ceea ce transformă o funcție într-un generator este cuvântul cheie yield.

Când ajunge la un yield, funcția dă înapoi o valoare și își salvează starea. Când generatorului i se cere altă valoare, el continuă exact de unde s-a oprit.

return încheie o funcție definitiv, dar yield doar o întrerupe, așa că o funcție îl poate folosi de mai multe ori.

Exemplu

Un generator care produce, pe rând, o serie de numere:

Prompt
Scrie un program Python care definește un generator count_up_to(n) care produce numerele de la 1 la n folosind o buclă while. Folosește o buclă for pentru a afișa fiecare număr până la 5.
Ieșire: program Python complet

Generatorii economisesc memorie

Un generator produce valorile pe măsură ce este nevoie de ele, în loc să le țină pe toate în memorie.

Asta face o diferență reală la seturile mari de date:

Exemplu

Un generator pentru o secvență foarte lungă:

Prompt
Scrie un program Python care definește un generator large_sequence(n) care produce numerele de la 0 la n-1. Creează un generator pentru 1000000 de numere și afișează primele 3 valori folosind next().
Ieșire: program Python complet

Folosirea next() cu generatori

Funcția next() îți permite să parcurgi manual un generator, pas cu pas.

După ce toate valorile au fost produse, încă un apel ridică o excepție StopIteration.

Exemplu

Prompt
Scrie un program Python care definește un generator simple_gen() care produce "Emil", "Tobias" și "Linus". Folosește next() de trei ori pentru a afișa fiecare valoare.
Ieșire: program Python complet

Exemplu

Prompt
Scrie un program Python care definește un generator simple_gen() care produce 1 și 2. Folosește next() de trei ori pentru a demonstra excepția StopIteration la al treilea apel.
Ieșire: program Python complet

Expresii generator

Expresiile generator creează generatori cu o sintaxă apropiată de list comprehension. Singura diferență sunt parantezele rotunde în locul celor pătrate:

Exemplu

Un list comprehension alături de o expresie generator:

Prompt
Scrie un program Python care creează un list comprehension [x * x for x in range(5)] și îl afișează. Apoi creează o expresie generator (x * x for x in range(5)), afișează obiectul generator și afișează valorile lui sub formă de listă.
Ieșire: program Python complet

Exemplu

Transmiterea unei expresii generator către sum:

Prompt
Scrie un program Python care calculează suma pătratelor numerelor de la 0 la 9 folosind sum() cu o expresie generator. Afișează totalul.
Ieșire: program Python complet

Generator pentru șirul Fibonacci

Șirul Fibonacci se potrivește perfect cu un generator.

Poate continua să producă valori la nesfârșit, fără să-ți epuizeze memoria:

Exemplu

Afișează primele 100 de numere Fibonacci:

Prompt
Scrie un program Python care definește un generator Fibonacci infinit folosind yield. Afișează primele 100 de numere Fibonacci folosind next().
Ieșire: program Python complet

Metodele generatorilor

Pentru un control mai avansat, generatorii vin cu câteva metode speciale:

Exemplu

Cu metoda send(), poți transmite o valoare în generator:

Prompt
Scrie un program Python care definește un echo_generator() care primește valori prin yield și le afișează. Pregătește generatorul cu next(), apoi trimite "Hello" și "World".
Ieșire: program Python complet

Exemplu

Metoda close() închide generatorul:

Prompt
Scrie un program Python care definește un generator my_gen() cu un bloc try/finally, care produce 1, 2, 3 și afișează „Generator închis” în finally. Obține prima valoare cu next(), apoi închide generatorul.
Ieșire: program Python complet