Kaj je donos Pythona?
Ključna beseda yield v pythonu deluje kot return z edinim
razlika je v tem, da namesto da vrne vrednost, vrne klicatelju objekt generatorja.
Ko je funkcija poklicana in izvršilna nit najde ključno besedo yield v funkciji, se izvajanje funkcije ustavi v tej vrstici in vrne predmet generatorja klicatelju.
V tej vadnici za Python boste izvedeli:
- Kaj je donos Pythona?
- Sintaksa
- Kaj so generatorji v Pythonu?
- Razlika med normalno funkcijo v / s funkcija generatorja.
- Kako prebrati vrednosti iz generatorja?
- Generatorji so enkratne uporabe
- Primer: Generatorji in donos za Fibonaccijeve serije
- Primer: Klicanje funkcije z Yield
- Kdaj uporabiti Yield Namesto Return v Pythonu
- Donos proti donosu
Sintaksa
yield expression
Opis
Python yield vrne objekt generatorja. Generatorji so posebne funkcije, ki jih je treba ponoviti, da dobimo vrednosti.
Ključna beseda yield pretvori izraz v funkcijo generatorja, ki vrne objekt generatorja. Da bi dobili vrednosti predmeta, ga je treba iterirati, da prebere vrednosti, podane donosu.
Primer: metoda donosa
Tu je preprost primer donosa. Funkcija testyield () ima ključno besedo yield z nizom "Dobrodošli v vajah za Guru99 Python". Ko pokličete funkcijo, se natisne izhod in namesto dejanske vrednosti daje objekt generatorja.
def testyield():yield "Welcome to Guru99 Python Tutorials"output = testyield()print(output)
Izhod:
Rezultat je generatorski objekt, ki ima vrednost, ki smo jo dali za donos.
Toda ne bomo dobili sporočila, ki smo ga morali dati, da bomo prinesli rezultate!
Če želite natisniti sporočilo, ki je dano, morate ponoviti objekt generatorja, kot je prikazano v spodnjem primeru:
def testyield():yield "Welcome to Guru99 Python Tutorials"output = testyield()for i in output:print(i)
Izhod
Welcome to Guru99 Python Tutorials
Kaj so generatorji v Pythonu?
Generatorji so funkcije, ki vrnejo iterabilni objekt generatorja. Vrednosti iz predmeta generatorja se pridobijo ena za drugo namesto celotnega seznama skupaj in tako dobite dejanske vrednosti, ki jih lahko uporabite za zanko, z uporabo metode next () ali list ().
Uporaba funkcije Generator
Generatorje lahko ustvarite z uporabo funkcije generatorja in z uporabo izraza generatorja.
Generatorska funkcija je kot običajna funkcija, namesto da ima vrnjeno vrednost, bo imela ključno besedo yield.
Če želite ustvariti funkcijo generatorja, boste morali dodati ključno besedo yield. Naslednji primeri kažejo, kako ustvariti funkcijo generatorja.
def generator():yield "H"yield "E"yield "L"yield "L"yield "O"test = generator()for i in test:print(i)
Izhod:
HELLO
Razlika med normalno funkcijo v / s funkcija generatorja.
Razumejmo, kako se funkcija generatorja razlikuje od običajne funkcije.
Obstajata 2 funkciji normal_test () in generator_test ().
Obe funkciji naj bi vrnili niz "Hello World". Normal_test () uporablja return, generator_test () pa yield.
# Normal functiondef normal_test():return "Hello World"#Generator functiondef generator_test():yield "Hello World"print(normal_test()) #call to normal functionprint(generator_test()) # call to generator function
Izhod:
Hello World
Izhod kaže, da ko prikličete normalno funkcijo normal_test (), vrne niz Hello World. Za funkcijo generatorja s ključno besedo yield vrne
To je glavna razlika med funkcijo generatorja in normalno funkcijo. Zdaj, da dobimo vrednost iz predmeta generatorja, moramo uporabiti predmet znotraj zanke ali uporabiti metodo next () ali pa uporabiti list ().
print(next(generator_test())) # will output Hello World
Še ena razlika, ki jo je treba dodati normalni funkciji v / s generatorja, je ta, da se bo, ko pokličete normalno funkcijo, izvajanje začelo in ustavilo, ko se bo vrnilo in bo vrednost vrnjena klicatelju. Torej, ko se izvajanje začne, običajne funkcije vmes ne morete ustaviti in se bo ustavilo šele, ko pride do ključne besede return.
Toda v primeru funkcije generatorja, ko se izvršitev začne, ko prejme prvi donos, zaustavi izvajanje in vrne objekt generatorja. Z objektom generatorja lahko pridobite vrednosti, pa tudi zaustavite in nadaljujete nazaj po vaših zahtevah.
Kako prebrati vrednosti iz generatorja?
Vrednosti iz predmeta generatorja lahko berete s pomočjo seznama (), for-loop in z uporabo metode next ().
Uporaba: list ()
Seznam je iterable objekt, ki ima svoje elemente v oklepajih. Uporaba list () na objektu generatorja bo dala vse vrednosti, ki jih ima generator.
def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)print(list(num))
Izhod:
[0, 2, 4, 6, 8]
Uporaba: za-v
V primeru je funkcija, definirana even_numbers (), ki vam bo dala vsa parna števila za definirano n. Klic funkcije even_numbers () bo vrnil objekt generatorja, ki se uporablja znotraj zanke for.
Primer:
def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)for i in num:print(i)
Izhod:
02468
Uporaba naslednjega ()
Z metodo next () boste dobili naslednji element na seznamu, matriki ali predmetu. Ko je seznam prazen in če pokličete next (), bo vrnil napako s signalom stopIteration. Ta napaka od next () pomeni, da na seznamu ni več elementov.
def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)print(next(num))print(next(num))print(next(num))print(next(num))print(next(num))print(next(num))
Izhod:
02468Traceback (most recent call last):File "main.py", line 11, inprint(next(num))StopIteration
Generatorji so enkratne uporabe
V primeru generatorjev so na voljo samo enkrat. Če jih poskusite znova uporabiti, bodo prazne.
Na primer:
def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)for i in num:print(i)print("\n")print("Calling the generator again: ", list(num))
Izhod:
02468Calling the generator again: []
Če želite, da se izhod ponovno uporabi, boste morali ponovno poklicati funkcijo.
Primer: Generatorji in donos za Fibonaccijeve serije
Naslednji primer prikazuje, kako uporabljati generatorje in donos v Pythonu. Primer bo ustvaril Fibonaccijevo serijo.
def getFibonnaciSeries(num):c1, c2 = 0, 1count = 0while count < num:yield c1c3 = c1 + c2c1 = c2c2 = c3count += 1fin = getFibonnaciSeries(7)print(fin)for i in fin:print(i)
Izhod:
0112358
Primer: Klicanje funkcije z Yield
V tem primeru bomo videli, kako pokličemo funkcijo z yield.
Spodnji primer ima funkcijo, imenovano test (), ki vrne kvadrat danega števila. Obstaja še ena funkcija, imenovana getSquare (), ki uporablja test () s ključno besedo yield. Izhod daje kvadratno vrednost za dani obseg števil.
def test(n):return n*ndef getSquare(n):for i in range(n):yield test(i)sq = getSquare(10)for i in sq:print(i)
Izhod:
0149162536496481
Kdaj uporabiti Yield Namesto Return v Pythonu
Ključna beseda Python3 Yield vrne generator klicatelju in izvajanje kode se začne šele, ko je generator ponovljen.
Vrnitev v funkciji je konec izvedbo funkcije, in Enotna vrednost je določena nazaj klicatelja.
Tukaj je situacija, ko bi morali uporabiti Yield namesto Return
- Uporabite donos namesto vrnitve, kadar je velikost podatkov velika
- Izkoristek je najboljša izbira, kadar potrebujete hitrejšo izvedbo na velikih naborih podatkov
- Uporabite yield, če želite klicni funkciji vrniti velik nabor vrednosti
- Donos je učinkovit način ustvarjanja velikih ali neskončnih podatkov.
Donos proti donosu
Tu so razlike med donosom in donosom
Donos | Vrni se |
Yield vrne predmet generatorja klicatelju in izvajanje kode se začne šele, ko je generator ponovljen. | Vrnitev funkcije je konec izvajanja funkcije in klicatelju se vrne ena vrednost. |
Ko je funkcija poklicana in naleti na ključno besedo yield, se izvajanje funkcije ustavi. Predmet generatorja vrne klicatelju. Izvajanje funkcije se bo začelo šele, ko se izvrši objekt generatorja. | Ko je funkcija poklicana, se začne izvajanje in vrednost se vrne klicatelju, če obstaja ključna beseda return. Vrnitev znotraj funkcije pomeni konec izvajanja funkcije. |
izraz donosa | vrni izraz |
Ko se uporablja ključna beseda yield, se ne uporablja pomnilnik. | Pomnilnik se dodeli za vrnjeno vrednost. |
Zelo koristno, če imate opravka z veliko velikostjo podatkov, saj se pomnilnik ne uporablja. | Priročno za zelo majhno velikost podatkov. |
Uspešnost je boljša, če se ključna beseda yield uporablja za velike podatke. | Če je velikost podatkov velika, kar ovira delovanje, se porabi veliko pomnilnika. |
Čas izvedbe je hitrejši v primeru izkoristka za velike podatke. | Uporabljeni čas izvedbe je daljši, saj je opravljena dodatna obdelava, če bodo vaše velikosti podatkov velike, se bo ob majhnih podatkih dobro obnesla. |
Povzetek:
- Ključna beseda yield v pythonu deluje kot vrnitev z edino razliko, da namesto vrnitve vrednosti klicatelju vrne funkcijo generatorja.
- Generator je posebna vrsta iteratorja, ki po uporabi ne bo več na voljo. Vrednosti niso shranjene v pomnilniku in so na voljo le, ko jih pokličete.
- Vrednosti iz generatorja je mogoče prebrati s pomočjo metode vhod, seznam () in next ().
- Glavna razlika med yield in return je, da yield vrne klicatelju nazaj funkcijo generatorja, return pa klicatelju da eno vrednost.
- Donos ne shrani nobene vrednosti v pomnilnik, prednost pa je, da je koristno, če je velikost podatkov velika, saj nobena od vrednosti ni shranjena v pomnilniku.
- Uspešnost je boljša, če se ključna beseda yield uporabi v primerjavi za vrnitev za velikost podatkov.