Saznajte kako vam ova alternativna vrsta funkcije može pomoći u smanjenju memorijskog otiska.

Ako čitate retke iz datoteke dnevnika ili obrađujete poduži popis stavki, jedna od opcija je učitavanje svih podataka u memoriju. Međutim, ovaj pristup može koristiti puno memorije i ometati izvedbu. Generatori nude vrijedno rješenje.

Generatori eliminiraju potrebu za učitavanjem svih podataka u memoriju istovremeno. Korisni su pri rukovanju velikim skupovima podataka, beskonačnim nizovima ili bilo kojim scenarijem u kojem je učinkovitost memorije najvažnija.

Što su generatori?

Generator je posebna funkcija koja vam omogućuje ponavljanje niza vrijednosti. Umjesto vraćanja kompletnog skupa podataka, oni generiraju — ili daju — jednu po jednu vrijednost. To ih čini učinkovitima za rad s velikim ili neograničenim nizovima podataka.

A regularna Python funkcija obično izračunava vrijednost i vraća je. Ali generatori rade drugačije. Oni mogu dati više vrijednosti tijekom vremena pauziranjem i nastavkom izvršenja između svakog prinosa.

instagram viewer

Ključna razlika između regularnih funkcija i generatora je da umjesto korištenja povratak ključna riječ za stvaranje rezultata, koriste generatori prinos.

Kako napraviti generator

Za stvaranje generatora, umjesto povratak izjava, koristite a prinos izjava unutar funkcije. The prinos ključna riječ ne samo da daje upute funkciji da vrati vrijednost, već joj također dopušta da spremi svoje stanje, dopuštajući budući nastavak.

Evo primjera jednostavne funkcije generatora:

defnumeric_generator():
yield1
yield2
yield3

gen = numeric_generator()

Ova funkcija generatora daje numeričke vrijednosti od 1 do 3.

The prinos naredba sprema stanje funkcije, čuvajući lokalne varijable između poziva, kako bi se nastavilo kada zatražite sljedeću vrijednost.

Dodjeljivanje funkcije generatora varijabli stvara objekt generatora s kojim možete raditi.

Rad s generatorima

Generatori imaju višestruku primjenu. Možete ih koristiti u for petljama ili unutar shvaćanja popisa, kao i druge strukture koje se mogu ponavljati. Generatori također mogu poslužiti kao argumenti za funkcije.

Nakon što ste izradili generator, možete iterirati preko njega koristeći for petlju:

for i in numeric_generator():
print(i)

Također možete koristiti Sljedeći funkcija za dohvaćanje vrijednosti jednu po jednu:

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

Ovo vam daje veću kontrolu nad objektom generatora.

Generatori mogu pratiti svoje stanje. Svaka naredba yield u funkciji djeluje kao kontrolna točka. Kada nazovete Sljedeći() funkciju na objektu generatora, izvođenje se nastavlja od prethodne točke popuštanja.

Također možete proslijediti vrijednosti u generator pomoću poslati():

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)

The poslati() metoda vam omogućuje dohvaćanje vrijednosti iz generatora i slanje vrijednosti natrag u funkciju generatora, učinkovito ga pauzirajući i omogućujući vam da kontrolirate njegovo izvršenje. The poslati() metoda je zgodna pri pisanju korutina ili korištenju generatora za napredne svrhe.

Korištenje izraza generatora

Izrazi generatora pružaju sažet način za stvaranje jednostavnog i anonimnog generatora. Slični su razumijevanju popisa, ali koriste zagrade umjesto zagrada.

Evo primjera:

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

for x in gen:
print(x)

Kod stvara generatorski izraz koji daje kvadrate brojeva od 0 do 9. Izrazi generatora idealni su za lijeno generiranje niza vrijednosti.

Korištenje generatora za obradu podataka

Python generatori su prikladan način za opisivanje tokova podataka i izgradnju iteratora bez zadržavanja svega u memoriji. Možete značajno poboljšati svoje programiranje tako što ćete naučiti koristiti generatore, što će vam olakšati rješavanje izazovnih zadataka obrade podataka.

Sljedeći put kada budete radili s velikim skupovima podataka, imajte na umu generatore i delegirajte im radno intenzivne zadatke, tako da vaš kod ostane osjetljiv i učinkovit.