Anna periksi Python opetusohjelma: Generator & Tuotto vs tuotto Esimerkki
Mikä on Python tuotto?
Pythonin tuottoavainsana toimii kuin paluu ainoalla
Erona on, että arvon palauttamisen sijaan se antaa takaisin generaattoriobjektin soittajalle.
Kun funktiota kutsutaan ja suoritussäie löytää funktiosta tuotto-avainsanan, funktion suoritus pysähtyy kyseiselle riville ja se palauttaa generaattoriobjektin takaisin kutsujalle.
Syntaksi
yield expression
Tuotetiedot
Python tuotto palauttaa generaattoriobjektin. Generators ovat erikoisfunktioita, jotka on iteroitava arvojen saamiseksi.
Tuottoavainsana muuntaa annetun lausekkeen generaattorifunktioksi, joka palauttaa generaattoriobjektin. Objektin arvojen saamiseksi se on iteroitava lukemaan tuotolle annetut arvot.
Esimerkki: Tuottomenetelmä
Tässä on yksinkertainen esimerkki tuotosta. Funktiolla testyield() on tuottoavainsana merkkijonolla "Tervetuloa Guru99:ään Python Opetusohjelmat". Kun funktiota kutsutaan, tulos tulostetaan ja se antaa generaattoriobjektin todellisen arvon sijaan.
def testyield(): yield "Welcome to Guru99 Python Tutorials" output = testyield() print(output)
lähtö:
<generator object testyield at 0x00000028265EB9A8>
Annettu lähtö on generaattoriobjekti, jolla on tuottolle antamamme arvo.
Mutta emme saa viestiä, joka meidän on annettava päästäksemme tuotoksiin!
Tulostaakseen tuoton antaman viestin, generaattoriobjekti on iteroitava alla olevan esimerkin mukaisesti:
def testyield(): yield "Welcome to Guru99 Python Tutorials" output = testyield() for i in output: print(i)
lähtö:
Welcome to Guru99 Python Tutorials
Mitä ovat Generators Python?
Generators ovat funktioita, jotka palauttavat iteroitavan generaattoriobjektin. Arvot generaattoriobjektista haetaan yksi kerrallaan koko listan sijaan, joten todellisten arvojen saamiseksi voit käyttää for-silmukkaa käyttämällä next()- tai list()-metodia.
Käyttäminen Generator toiminto
Voit luoda generaattoreita käyttämällä generaattorifunktiota ja generaattorilauseketta.
Generaattorifunktio on kuin normaali funktio, sillä palautusarvon sijaan sillä on tuottoavainsana.
Luodaksesi generaattorifunktion sinun on lisättävä tuottoavainsana. Seuraavat esimerkit osoittavat, kuinka generaattorifunktio luodaan.
def generator(): yield "H" yield "E" yield "L" yield "L" yield "O" test = generator() for i in test: print(i)
lähtö:
H E L L O
Ero normaalitoiminnon v/s välillä Generator toiminto.
Ymmärrämme, kuinka generaattorifunktio eroaa normaalista funktiosta.
On 2 funktiota normal_test() ja generator_test().
Molempien funktioiden oletetaan palauttavan merkkijonon "Hello World". Normaali_testi() käyttää paluuta ja generator_test() tuottoa.
# Normal function def normal_test(): return "Hello World" #Generator function def generator_test(): yield "Hello World" print(normal_test()) #call to normal function print(generator_test()) # call to generator function
lähtö:
Hello World <generator object generator_test at 0x00000012F2F5BA20>
Tulos osoittaa, että kun kutsut normaalia funktiota normal_test(), se palauttaa Hello World -merkkijonon. Generaattorifunktiolle tuottoavainsanalla se palauttaa eikä merkkijonoa.
Tämä on tärkein ero generaattoritoiminnon ja normaalin toiminnon välillä. Nyt saadaksemme arvon generaattoriobjektista meidän on joko käytettävä objektia sisällä for loop tai käytettävä next()-metodia tai käytettävä list().
print(next(generator_test())) # will output Hello World
Eräs lisättävä ero normaaliin funktioon v/s generaattorifunktioon on se, että kun kutsut normaalia funktiota, suoritus alkaa ja pysähtyy kun se pääsee palata ja arvo palautetaan soittajalle. Joten kun suoritus alkaa, et voi pysäyttää normaalia toimintoa välillä ja se pysähtyy vain, kun se kohtaa return-avainsanan.
Mutta generaattorifunktion tapauksessa, kun suoritus alkaa, kun se saa ensimmäisen tuoton, se pysäyttää suorituksen ja palauttaa generaattoriobjektin. Voit käyttää generaattoriobjektia saadaksesi arvot ja myös keskeyttää ja jatkaa takaisin tarpeidesi mukaan.
Kuinka lukea arvot generaattorista?
Voit lukea arvot generaattoriobjektista käyttämällä list(), for-loop- ja next()-metodia.
Käytetään: list()
Lista on iteroitava objekti, jonka elementit ovat hakasulkeissa. List():n käyttäminen generaattoriobjektissa antaa kaikki generaattorin arvot.
def even_numbers(n): for x in range(n): if (x%2==0): yield x num = even_numbers(10) print(list(num))
lähtö:
[0, 2, 4, 6, 8]
Käyttö: for-in
Esimerkissä on funktio määritelty parilliset_luvut(), joka antaa sinulle kaikki parilliset luvut määritetylle n:lle. Kutsu funktioon parilliset_luvut() palauttaa generaattoriobjektin, jota käytetään for-silmukassa.
Esimerkiksi:
def even_numbers(n): for x in range(n): if (x%2==0): yield x num = even_numbers(10) for i in num: print(i)
lähtö:
0 2 4 6 8
Seuraava()
next()-metodi antaa sinulle luettelon, taulukon tai objektin seuraavan kohteen. Kun lista on tyhjä, ja jos next():tä kutsutaan, se antaa takaisin virheilmoituksen stopIteration-signaalilla. Tämä virhe alkaen next() osoittaa, että luettelossa ei ole enää kohteita.
def even_numbers(n): for x in range(n): if (x%2==0): yield x num = even_numbers(10) print(next(num)) print(next(num)) print(next(num)) print(next(num)) print(next(num)) print(next(num))
lähtö:
0 2 4 6 8 Traceback (most recent call last): File "main.py", line 11, in <module> print(next(num)) StopIteration
Generators ovat kertakäyttöisiä
Generaattorien tapauksessa ne ovat käytettävissä vain kerran. Jos yrität käyttää niitä uudelleen, se on tyhjä.
Esimerkiksi:
def even_numbers(n): for x in range(n): if (x%2==0): yield x num = even_numbers(10) for i in num: print(i) print("\n") print("Calling the generator again: ", list(num))
lähtö:
0 2 4 6 8 Calling the generator again: []
Jos haluat, että lähtöä käytetään uudelleen, sinun on soitettava puhelu toimiaksesi uudelleen.
Esimerkiksi: Generators ja Fibonacci-sarjan tuotto
Seuraava esimerkki näyttää, kuinka generaattoreita käytetään ja kuinka voit päästä sisään Python. Esimerkki luo Fibonacci-sarjan.
def getFibonnaciSeries(num): c1, c2 = 0, 1 count = 0 while count < num: yield c1 c3 = c1 + c2 c1 = c2 c2 = c3 count += 1 fin = getFibonnaciSeries(7) print(fin) for i in fin: print(i)
lähtö:
<generator object getFibonnaciSeries at 0x0000007F39C8BA20> 0 1 1 2 3 5 8
Esimerkki: Kutsufunktion tuotto
Tässä esimerkissä nähdään, kuinka funktiota kutsutaan tuotolla.
Alla olevassa esimerkissä on funktio nimeltä test(), joka palauttaa annetun luvun neliön. On toinenkin funktio nimeltä getSquare(), joka käyttää test()-funktiota tuottoavainsanan kanssa. Tulos antaa neliöarvon annetulle lukualueelle.
def test(n): return n*n def getSquare(n): for i in range(n): yield test(i) sq = getSquare(10) for i in sq: print(i)
lähtö:
0 1 4 9 16 25 36 49 64 81
Milloin käyttää tuottoa palautuksen sijaan Python
Python3 Tuotto avainsana palauttaa generaattorin soittajalle ja koodin suoritus alkaa vasta, kun generaattori iteroidaan.
A palata funktiossa on funktion suorituksen loppu, ja yksittäinen arvo palautetaan soittajalle.
Tässä on tilanne, jolloin sinun tulisi käyttää tuottoa Returnin sijaan
- Käytä tuottoa tuoton sijaan, kun tietokoko on suuri
- Yield on paras valinta, kun tarvitset nopeampaa suoritusta suurilla tietojoukoilla
- Käytä tuottoa, kun haluat palauttaa suuren joukon arvoja kutsuvaan funktioon
- Tuotto on tehokas tapa tuottaa suurta tai ääretöntä dataa.
Tuotto vs. tuotto
Tässä ovat erot tuoton ja tuoton välillä
tuotto | Palata |
---|---|
Yield palauttaa generaattoriobjektin soittajalle, ja koodin suoritus alkaa vasta, kun generaattori iteroidaan. | Paluu funktiossa on funktion suorituksen loppu, ja yksittäinen arvo palautetaan kutsujalle. |
Kun funktiota kutsutaan ja se kohtaa tuottoavainsanan, funktion suoritus pysähtyy. Se palauttaa generaattoriobjektin takaisin soittajalle. Toiminnon suoritus alkaa vasta, kun generaattoriobjekti suoritetaan. | Kun funktiota kutsutaan, suoritus alkaa ja arvo palautetaan kutsujalle, jos on return-avainsana. Paluu funktion sisällä merkitsee funktion suorituksen loppua. |
tuoton ilmaisu | paluulauseke |
Muistia ei käytetä, kun tuottoavainsanaa käytetään. | Muisti on varattu palautetulle arvolle. |
Erittäin hyödyllinen, jos joudut käsittelemään valtavaa tietokokoa, koska muistia ei käytetä. | Kätevä erittäin pienelle tietokoolle. |
Suorituskyky on parempi, jos tuottoavainsanaa käytetään suurelle tietokoolle. | Muistia käytetään paljon, jos datakoko on valtava, mikä heikentää suorituskykyä. |
Suoritusaika on nopeampi suuren datakoon tuoton tapauksessa. | Käytetty suoritusaika on enemmän, koska ylimääräistä käsittelyä tehdään siinä tapauksessa, että jos tietosi koko on valtava, se toimii hyvin pienellä tietokoolla. |
Yhteenveto
- Pythonin tuottoavainsana toimii kuin return, mutta ainoa ero on, että arvon palauttamisen sijaan se antaa takaisin generaattorifunktion soittajalle.
- Generaattori on erityinen iteraattorityyppi, joka kerran käytettynä ei ole enää käytettävissä. Arvoja ei tallenneta muistiin, ja ne ovat käytettävissä vain kutsuttaessa.
- Generaattorin arvot voidaan lukea käyttämällä for-in-, list()- ja next()-metodeja.
- Suurin ero tuoton ja tuoton välillä on, että tuotto palauttaa generaattorifunktion soittajalle ja return antaa soittajalle yhden arvon.
- Yield ei tallenna mitään arvoista muistiin, ja etuna on, että se on hyödyllinen, kun datakoko on suuri, koska mikään arvoista ei tallennu muistiin.
- Tehokkuus on parempi, jos tuottoavainsanaa käytetään suuren datakoon tuottamiseen verrattuna.