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.

Tiivistรค tรคmรค viesti seuraavasti: