Hva er Python yield?
Avkastningsnøkkelordet i python fungerer som en retur med det eneste
forskjellen er at i stedet for å returnere en verdi, gir den tilbake et generatorobjekt til den som ringer.
Når en funksjon kalles og kjøringstråden finner et avkastningsnøkkelord i funksjonen, stopper funksjonsutførelsen ved selve linjen, og den returnerer et generatorobjekt tilbake til innringeren.
I denne Python-opplæringen lærer du:
- Hva er Python yield?
- Syntaks
- Hva er generatorer i Python?
- Forskjellen mellom normal funksjon v / s generatorfunksjon.
- Hvordan leser jeg verdiene fra generatoren?
- Generatorer er engangsbruk
- Eksempel: Generatorer og avkastning for Fibonacci-serien
- Eksempel: Anropsfunksjon med avkastning
- Når skal du bruke Yield i stedet for Return i Python
- Avkastning vs. retur
Syntaks
yield expression
Beskrivelse
Python-avkastning returnerer et generatorobjekt. Generatorer er spesialfunksjoner som må itereres for å få verdiene.
Avkastningsnøkkelordet konverterer uttrykket gitt til en generatorfunksjon som gir tilbake et generatorobjekt. For å få verdiene til objektet, må det gjentas for å lese verdiene gitt til avkastningen.
Eksempel: Yield Method
Her er et enkelt eksempel på avkastning. Funksjonen testyield () har et avkastningsnøkkelord med strengen "Welcome to Guru99 Python Tutorials". Når funksjonen kalles, blir utskriften skrevet ut, og den gir et generatorobjekt i stedet for den faktiske verdien.
def testyield():yield "Welcome to Guru99 Python Tutorials"output = testyield()print(output)
Produksjon:
Den gitte utgangen er et generatorobjekt som har verdien vi har gitt for å gi.
Men vi får ikke beskjeden vi må gi for å gi i produksjon!
For å skrive ut meldingen gitt for å gi, må gjenta generatorobjektet som vist i eksemplet nedenfor:
def testyield():yield "Welcome to Guru99 Python Tutorials"output = testyield()for i in output:print(i)
Produksjon
Welcome to Guru99 Python Tutorials
Hva er generatorer i Python?
Generatorer er funksjoner som returnerer et iterabelt generatorobjekt. Verdiene fra generatorobjektet hentes en om gangen i stedet for hele listen sammen, og for å få de faktiske verdiene kan du bruke en for-loop ved hjelp av neste () eller list () -metoden.
Bruker generatorfunksjon
Du kan opprette generatorer ved hjelp av generatorfunksjon og ved hjelp av generatoruttrykk.
En generatorfunksjon er som en normal funksjon, i stedet for å ha en returverdi vil den ha et avkastningsnøkkelord.
For å opprette en generatorfunksjon må du legge til et avkastningsnøkkelord. Følgende eksempler viser hvordan du lager en generatorfunksjon.
def generator():yield "H"yield "E"yield "L"yield "L"yield "O"test = generator()for i in test:print(i)
Produksjon:
HELLO
Forskjellen mellom normal funksjon v / s generatorfunksjon.
La oss forstå hvordan en generatorfunksjon er forskjellig fra en normal funksjon.
Det er to funksjoner normal_test () og generator_test ().
Begge funksjonene antar at du skal returnere strengen "Hello World". Normal_test () bruker retur og generator_test () bruker avkastning.
# 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
Produksjon:
Hello World
Utgangen viser at når du kaller normalfunksjonen normal_test (), returnerer den Hello World-strengen. For en generatorfunksjon med avkastningsnøkkelord returnerer den
Dette er hovedforskjellen mellom en generatorfunksjon og en normal funksjon. Nå for å få verdien fra generatorobjektet, trenger vi enten å bruke objektet inni for loop eller bruke neste () -metoden eller bruke listen ().
print(next(generator_test())) # will output Hello World
En annen forskjell å legge til normal funksjon v / s generatorfunksjon er at når du ringer til en normal funksjon, vil utførelsen starte og stoppe når den kommer tilbake og verdien returneres til den som ringer. Så når kjøringen starter, kan du ikke stoppe den normale funksjonen i mellom, og den vil bare stoppe når den kommer over returnøkkelordet.
Men i tilfelle generatorfunksjon når utførelsen starter når den får den første avkastningen, stopper den utførelsen og gir tilbake generatorobjektet. Du kan bruke generatorobjektet for å få verdiene, og også, pause og gjenoppta i henhold til dine krav.
Hvordan leser jeg verdiene fra generatoren?
Du kan lese verdiene fra et generatorobjekt ved hjelp av en liste (), for-loop og ved hjelp av neste () -metoden.
Bruker: liste ()
En liste er et gjentakbart objekt som har elementene i parentes. Å bruke liste () på et generatorobjekt vil gi alle verdiene generatoren har.
def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)print(list(num))
Produksjon:
[0, 2, 4, 6, 8]
Bruke: for-in
I eksemplet er det en funksjonsdefinert jevntall () som gir deg alle partall for n definert. Anropet til funksjonen even_numbers () returnerer et generatorobjekt som brukes i for-loop.
Eksempel:
def even_numbers(n):for x in range(n):if (x%2==0):yield xnum = even_numbers(10)for i in num:print(i)
Produksjon:
02468
Bruke neste ()
Den neste () metoden gir deg neste element i listen, matrisen eller objektet. Når listen er tom, og hvis neste () kalles, vil den gi en feil med stopIteration-signal. Denne feilen, fra neste (), indikerer at det ikke er flere elementer i listen.
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))
Produksjon:
02468Traceback (most recent call last):File "main.py", line 11, inprint(next(num))StopIteration
Generatorer er engangsbruk
I tilfelle av generatorer er de bare tilgjengelig en gang. Hvis du prøver å bruke dem igjen, vil det være tomt.
For eksempel:
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))
Produksjon:
02468Calling the generator again: []
Hvis du vil at utgangen skal brukes igjen, må du ringe til å fungere igjen.
Eksempel: Generatorer og avkastning for Fibonacci-serien
Følgende eksempel viser hvordan du bruker generatorer og avkastning i Python. Eksemplet vil generere Fibonacci-serien.
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)
Produksjon:
0112358
Eksempel: Anropsfunksjon med avkastning
I dette eksemplet vil du se hvordan du kan kalle en funksjon med avkastning.
Eksemplet nedenfor har en funksjon kalt test () som returnerer kvadratet til det angitte tallet. Det er en annen funksjon kalt getSquare () som bruker test () med avkastningsnøkkelord. Utgangen gir kvadratverdien for gitt nummerområde.
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)
Produksjon:
0149162536496481
Når skal du bruke Yield i stedet for Return i Python
Python3 Yield- nøkkelord returnerer en generator til innringeren, og utførelsen av koden starter bare når generatoren er iterert.
En retur i en funksjon er slutten på funksjonsutførelsen, og en enkelt verdi blir gitt tilbake til den som ringer.
Her er situasjonen når du skal bruke Yield i stedet for Return
- Bruk avkastning i stedet for retur når datastørrelsen er stor
- Avkastning er det beste valget når du trenger at utførelsen skal være raskere på store datasett
- Bruk avkastning når du vil returnere et stort sett med verdier til anropsfunksjonen
- Avkastning er en effektiv måte å produsere data som er store eller uendelige.
Avkastning vs. retur
Her er forskjellene mellom avkastning og retur
Utbytte | Komme tilbake |
Utbytte returnerer et generatorobjekt til innringeren, og utførelsen av koden starter bare når generatoren er iterert. | En retur i en funksjon er slutten på funksjonsutførelsen, og en enkelt verdi blir gitt tilbake til den som ringer. |
Når funksjonen kalles og den møter avkastningsnøkkelordet, stopper funksjonens utførelse. Den returnerer generatorobjektet tilbake til innringeren. Funksjonskjøringen starter bare når generatorobjektet kjøres. | Når funksjonen kalles, starter utførelsen og verdien blir gitt tilbake til den som ringer hvis det er retur nøkkelord. Returen inne i funksjonen markerer slutten på funksjonens utførelse. |
gi uttrykk | returnere uttrykk |
Ingen minne brukes når avkastningsnøkkelordet brukes. | Minnet tildeles for verdien som returneres. |
Veldig nyttig hvis du må takle enorm datastørrelse ettersom minnet ikke brukes. | Praktisk for veldig liten datastørrelse. |
Ytelsen er bedre hvis avkastningsnøkkelordet brukes for stor datastørrelse. | Mye minne brukes hvis datastørrelsen er enorm som vil hindre ytelsen. |
Gjennomføringstiden er raskere i tilfelle avkastning for stor datastørrelse. | Utførelsestiden som brukes, er mer da det er gjort ekstra behandling i tilfelle hvis datastørrelsen din er enorm, vil den fungere bra for liten datastørrelse. |
Sammendrag:
- Avkastningsnøkkelordet i python fungerer som en retur med den eneste forskjellen er at i stedet for å returnere en verdi, gir den tilbake en generatorfunksjon til innringeren.
- En generator er en spesiell type iterator som, når den er brukt, ikke vil være tilgjengelig igjen. Verdiene er ikke lagret i minnet og er bare tilgjengelige når de ringes.
- Verdiene fra generatoren kan leses ved hjelp av for-in, list () og next () -metoden.
- Hovedforskjellen mellom avkastning og avkastning er at avkastning returnerer en generatorfunksjon til innringeren og retur gir en enkelt verdi til innringeren.
- Utbytte lagrer ikke noen av verdiene i minnet, og fordelen er at det er nyttig når datastørrelsen er stor, da ingen av verdiene er lagret i minnet.
- Ytelsen er bedre hvis avkastningsnøkkelordet brukes i sammenligning for å returnere for stor datastørrelse.