Naučite se, kako vam lahko ta alternativna vrsta funkcije pomaga zmanjšati pomnilniški odtis.

Če berete vrstice iz dnevniške datoteke ali obdelujete dolg seznam elementov, je ena možnost, da naložite celotne podatke v pomnilnik. Vendar lahko ta pristop porabi veliko pomnilnika in ovira delovanje. Generatorji ponujajo dragoceno rešitev.

Generatorji odpravljajo potrebo po nalaganju vseh podatkov v pomnilnik hkrati. Uporabni so pri ravnanju z velikimi nabori podatkov, neskončnimi zaporedji ali katerim koli scenarijem, kjer je učinkovitost pomnilnika najpomembnejša.

Kaj so generatorji?

Generator je posebna funkcija, ki vam omogoča ponavljanje po zaporedju vrednosti. Namesto da bi vrnili celoten nabor podatkov, ustvarijo – ali izdajo – eno vrednost naenkrat. Zaradi tega so učinkoviti za delo z velikimi ali neomejenimi zaporedji podatkov.

A običajna funkcija Python običajno izračuna vrednost in jo vrne. Toda generatorji delujejo drugače. Sčasoma lahko prinesejo več vrednosti, tako da zaustavijo in nadaljujejo izvajanje med vsakim donosom.

Ključna razlika med navadnimi funkcijami in generatorji je, da namesto uporabe vrnitev generatorji uporabljajo ključno besedo za ustvarjanje rezultata donos.

Kako ustvariti generator

Če želite ustvariti generator, namesto vrnitev izjava, uporabite a donos stavek znotraj funkcije. The donos ključna beseda ne le ukaže funkciji, naj vrne vrednost, temveč ji tudi omogoči, da shrani svoje stanje, kar omogoča prihodnje nadaljevanje.

Tukaj je primer preproste funkcije generatorja:

defnumeric_generator():
yield1
yield2
yield3

gen = numeric_generator()

Ta funkcija generatorja daje številske vrednosti od 1 do 3.

The donos stavek shrani stanje funkcije in ohrani lokalne spremenljivke med klici, da se nadaljuje, ko zahtevate naslednjo vrednost.

Če spremenljivki dodelite generatorsko funkcijo, ustvarite generatorski objekt, s katerim lahko delate.

Delo z generatorji

Generatorji imajo več aplikacij. Lahko jih uporabite v for zank oz znotraj razumevanja seznama, kot tudi druge ponovljive strukture. Generatorji lahko služijo tudi kot argumenti za funkcije.

Ko ustvarite generator, ga lahko ponavljate z uporabo zanke for:

for i in numeric_generator():
print(i)

Uporabite lahko tudi Naslednji funkcija za pridobivanje vrednosti eno za drugo:

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

To vam daje večji nadzor nad objektom generatorja.

Generatorji lahko spremljajo svoje stanje. Vsak stavek o donosu v funkciji deluje kot kontrolna točka. Ko pokličete Naslednji() funkcijo na objektu generatorja, se izvajanje nadaljuje s prejšnjo točko tečenja.

Vrednosti lahko posredujete tudi v generator z uporabo pošlji():

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 pošlji() vam omogoča pridobivanje vrednosti iz generatorja in pošiljanje vrednosti nazaj v funkcijo generatorja, ki jo učinkovito zaustavi in ​​vam omogoča nadzor nad njenim izvajanjem. The pošlji() Metoda je priročna pri pisanju korutin ali uporabi generatorjev za napredne namene.

Uporaba generatorskih izrazov

Izrazi generatorja zagotavljajo jedrnat način za ustvarjanje preprostega in anonimnega generatorja. Podobni so razumevanju seznamov, vendar uporabljajo oklepaje namesto oklepajev.

Tukaj je primer:

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

for x in gen:
print(x)

Koda ustvari generatorski izraz, ki daje kvadrate števil od 0 do 9. Generatorski izrazi so idealni za leno generiranje zaporedja vrednosti.

Uporaba generatorjev za obdelavo podatkov

Generatorji Python so priročen način za opis tokov podatkov in gradnjo iteratorjev, ne da bi vse ohranili v pomnilniku. Svoje programiranje lahko znatno izboljšate tako, da se naučite uporabljati generatorje, kar olajša reševanje zahtevnih nalog obdelave podatkov.

Ko boste naslednjič delali z velikimi nabori podatkov, imejte v mislih generatorje in jim dodelite delovno intenzivne naloge, da bo vaša koda ostala odzivna in učinkovita.