Tuotto Python-opetusohjelmassa: Generaattori & Tuotto vs. paluuesimerkki

Sisällysluettelo:

Anonim

Mikä on Python-tuotto?

Tuotto-avainsana pythonissa toimii kuin tuotto ainoan kanssa

ero on se, että arvon palauttamisen sijaan se antaa takaisin generaattoriobjektin soittajalle.

Kun funktio kutsutaan ja suorituslanka löytää tuotosta avainsanan, funktion toteutus pysähtyy itse kyseisellä rivillä ja palauttaa generaattoriobjektin takaisin soittajalle.

Tässä Python-opetusohjelmassa opit:

  • Mikä on Python-tuotto?
  • Syntaksi
  • Mitä generaattorit ovat Pythonissa?
  • Ero normaalitoiminnossa v / s Generator-toiminto.
  • Kuinka lukea arvot generaattorista?
  • Generaattorit ovat kertakäyttöisiä
  • Esimerkki: Generaattorit ja tuotto Fibonacci-sarjalle
  • Esimerkki: Soittotoiminto tuotolla
  • Milloin tuottoa käytetään palautuksen sijaan Pythonissa
  • Tuotto vs. paluu

Syntaksi

yield expression

Kuvaus

Python-tuotto palauttaa generaattoriobjektin. Generaattorit ovat erikoistoimintoja, jotka on toistettava arvojen saamiseksi.

Tuotto-avainsana muuntaa annetun lausekkeen generaattoritoiminnoksi, joka antaa takaisin generaattoriobjektin. Objektin arvojen saamiseksi se täytyy toistaa lukemaan saannolle annetut arvot.

Esimerkki: Saantomenetelmä

Tässä on yksinkertainen esimerkki sadosta. Funktiolla testyield () on tuottoavainsana merkkijonolla "Welcome to Guru99 Python Tutorials". Kun funktio kutsutaan, tulosteet tulostetaan ja ne antavat generaattoriobjektin todellisen arvon sijaan.

def testyield():yield "Welcome to Guru99 Python Tutorials"output = testyield()print(output)

Tuotos:

Annettu lähtö on generaattoriobjekti, jolla on saamamme arvo.

Mutta emme saa viestiä, joka meidän on annettava tuotoksen tuottamiseksi!

Tulostettavaksi annetun viestin tulostaminen edellyttää iteroida generaattoriobjekti alla olevan esimerkin mukaisesti:

def testyield():yield "Welcome to Guru99 Python Tutorials"output = testyield()for i in output:print(i)

Tuotos

Welcome to Guru99 Python Tutorials

Mitä generaattorit ovat Pythonissa?

Generaattorit ovat toimintoja, jotka palauttavat iteroitavan generaattoriobjektin. Generaattoriobjektin arvot haetaan yksi kerrallaan täydellisen luettelon sijasta, jolloin saadaan todelliset arvot, joita voit käyttää for-loopille, käyttämällä next () tai list () -menetelmää.

Generator-toiminnon käyttäminen

Voit luoda generaattoreita generaattoritoiminnolla ja generaattorin lausekkeella.

Generaattoritoiminto on kuin normaali toiminto, sen sijaan, että sillä olisi palautusarvo, sillä on tuottoavainsana.

Generaattoritoiminnon luomiseksi sinun on lisättävä tuotto-avainsana. Seuraavat esimerkit osoittavat, miten luodaan generaattoritoiminto.

def generator():yield "H"yield "E"yield "L"yield "L"yield "O"test = generator()for i in test:print(i)

Tuotos:

HELLO

Ero normaalitoiminnossa v / s Generator-toiminto.

Ymmärretään, miten generaattorin toiminto eroaa normaalista toiminnosta.

On 2 toimintoa: normaali_testi () ja generaattorin_testi ().

Molempien toimintojen oletetaan palauttavan merkkijono "Hello World". Normaali_testi () käyttää paluuta ja generaattoritesti () käyttää tuottoa.

# 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

Tuotos:

Hello World

Lähtö osoittaa, että kun kutsut normaalitoiminnon normal_test (), se palauttaa Hello World -merkkijonon. Generaattoritoiminnolle, jolla on tuotto-avainsana, se palauttaa eikä merkkijonon.

Tämä on tärkein ero generaattoritoiminnon ja normaalitoiminnon välillä. Nyt saadaksesi arvon generaattoriobjektista meidän on joko käytettävä objektia silmukassa tai käytettävä next () -menetelmää tai hyödynnettävä listaa ().

print(next(generator_test())) # will output Hello World

Vielä yksi ero lisättäväksi normaalitoimintoihin v / s generaattoritoiminto on, että kun soitat normaalitoimintoa, suoritus alkaa ja pysähtyy, kun se palaa takaisin ja arvo palautetaan soittajalle. Joten kun toteutus alkaa, et voi pysäyttää normaalia toimintoa välissä ja se pysähtyy vasta, kun se palaa avainsanaan.

Mutta generaattoritoiminnon tapauksessa, kun suoritus alkaa, kun se saa ensimmäisen tuoton, se pysäyttää suorituksen ja antaa takaisin generaattorikohteen. Voit käyttää generaattoriobjektia arvojen saamiseen ja myös keskeyttää ja jatkaa takaisin vaatimuksesi mukaan.

Kuinka lukea arvot generaattorista?

Voit lukea arvot generaattoriobjektista käyttämällä listaa (), for-loopia ja next () -menetelmää.

Käyttämällä: list ()

Lista on toistettava objekti, jonka elementit ovat suluissa. Generaattoriobjektin luettelon () käyttö antaa kaikki generaattorin hallussa olevat arvot.

def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)print(list(num))

Tuotos:

[0, 2, 4, 6, 8]

Käyttämällä: for-in

Esimerkissä on funktion määritelty parillinen_numero (), joka antaa sinulle kaikki parilliset numerot määritetylle n: lle. Kutsu funktiolle even_numbers () palauttaa generaattoriobjektin, jota käytetään silmukan sisällä.

Esimerkki:

def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)for i in num:print(i)

Tuotos:

02468

Seuraava ()

Seuraava () -menetelmä antaa sinulle seuraavan kohteen luettelossa, taulukossa tai objektissa. Kun luettelo on tyhjä ja jos seuraava () kutsutaan, se palauttaa StopIteration-signaalin virheen. Tämä virhe seuraavasta () osoittaa, että luettelossa ei ole enää kohteita.

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))

Tuotos:

02468Traceback (most recent call last):File "main.py", line 11, in print(next(num))StopIteration

Generaattorit ovat kertakäyttöisiä

Generaattoreita, joita 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 xnum = even_numbers(10)for i in num:print(i)print("\n")print("Calling the generator again: ", list(num))

Tuotos:

02468Calling the generator again: []

Jos haluat, että lähtöä käytetään uudelleen, sinun on soitettava puhelu toimimaan uudelleen.

Esimerkki: Generaattorit ja tuotto Fibonacci-sarjalle

Seuraava esimerkki näyttää kuinka generaattoreita ja tuottoa käytetään Pythonissa. Esimerkki luo Fibonacci-sarjan.

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)

Tuotos:

0112358

Esimerkki: Soittotoiminto tuotolla

Tässä esimerkissä nähdään, kuinka kutsua funktio, jolla on tuotto.

Alla olevassa esimerkissä on funktio nimeltä testi (), joka palauttaa annetun luvun neliön. On toinen funktio nimeltä getSquare (), joka käyttää testia () tuotto-avainsanalla. Lähtö antaa neliöarvon tietylle lukualueelle.

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)

Tuotos:

0149162536496481

Milloin tuottoa käytetään palautuksen sijaan Pythonissa

Python3 Yield -avainsana palauttaa generaattorin soittajalle ja koodin suorittaminen alkaa vasta, kun generaattori on iteroitu.

Tuotto on funktio on loppuun suorittamisen funktion, ja yksittäinen arvo annetaan takaisin soittajalle.

Tässä on tilanne, jolloin sinun tulisi käyttää tuottoa palautuksen sijaan

  • Käytä tuottoa palautuksen sijaan, kun datan koko on suuri
  • Tuotto on paras valinta, kun tarvitset nopeamman suorituksen suurissa tietojoukoissa
  • Käytä tuottoa, kun haluat palauttaa suuren joukon arvoja kutsutoiminnolle
  • Tuotto on tehokas tapa tuottaa suurta tai ääretöntä dataa.

Tuotto vs. paluu

Tässä ovat erot tuoton ja tuoton välillä

Saanto Palata
Tuotto palauttaa generaattoriobjektin soittajalle, ja koodin suorittaminen alkaa vasta generaattorin iteroinnin jälkeen. Paluu toiminnossa on toiminnon suorittamisen loppu, ja soittajalle palautetaan yksi arvo.
Kun funktio kutsutaan ja se kohtaa tuotto-avainsanan, funktion toteutus pysähtyy. Se palauttaa generaattoriobjektin takaisin soittajalle. Funktion suoritus alkaa vasta, kun generaattoriobjekti on suoritettu. Kun toiminto kutsutaan, toteutus alkaa ja arvo palautetaan soittajalle, jos paluu-avainsanaa on. Paluu funktion sisällä merkitsee toiminnon suorituksen loppua.
saantoilmaisu paluuilmaisu
Muistia ei käytetä, kun tuotosavainsanaa käytetään. Muisti on varattu palautetulle arvolle.
Erittäin hyödyllinen, jos joudut käsittelemään valtavaa datakokoa, koska muistia ei käytetä. Kätevä hyvin pienelle datakoolle.
Suorituskyky on parempi, jos tuotto-avainsanaa käytetään suuriin tietoihin. Paljon muistia käytetään, jos tiedon koko on valtava, mikä haittaa suorituskykyä.
Suoritusaika on nopeampi, jos tuotto on suuri tietokoko. Käytetty suoritusaika on enemmän, koska ylimääräistä käsittelyä tapahtuu, jos datakoko on valtava, se toimii hyvin pienellä datakoolla.

Yhteenveto:

  • Tuottoavainsana pythonissa toimii kuin tuotto ainoana erona on se, että arvon palauttamisen sijaan se antaa takaisin generaattoritoiminnon soittajalle.
  • Generaattori on erityinen iteraattorityyppi, jota käytettäessä se ei ole enää käytettävissä. Arvoja ei tallenneta muistiin, ja ne ovat käytettävissä vain, kun niitä kutsutaan.
  • Generaattorin arvot voidaan lukea for-in, list () ja next () -menetelmillä.
  • Suurin ero tuoton ja paluun välillä on se, että tuotto palauttaa generaattoritoiminnon soittajalle ja paluu antaa soittajalle yhden arvon.
  • Tuotto ei tallenna mitään arvoja muistiin, ja etuna on, että siitä on hyötyä, kun datan koko on suuri, koska mitään arvoja ei ole tallennettu muistiin.
  • Suorituskyky on parempi, jos tuotto-avainsanaa käytetään verrattuna suurten tietojen koon palauttamiseen.