Yield in Python Tutorial: Generator & Udbytte vs retureksempel

Indholdsfortegnelse:

Anonim

Hvad er Python-udbytte?

Udbytte nøgleordet i python fungerer som en returnering med det eneste

forskellen er, at i stedet for at returnere en værdi, giver den et generatorobjekt tilbage til den, der ringer op.

Når en funktion kaldes, og udførelsestråden finder et udbytte-nøgleord i funktionen, stopper funktionsudførelsen ved selve linjen, og den returnerer et generatorobjekt tilbage til den, der ringer op.

I denne Python-tutorial lærer du:

  • Hvad er Python-udbytte?
  • Syntaks
  • Hvad er generatorer i Python?
  • Forskel mellem normal funktion v / s generatorfunktion.
  • Hvordan læses værdierne fra generatoren?
  • Generatorer er engangsbrug
  • Eksempel: Generatorer og kapacitet for Fibonacci-serien
  • Eksempel: Opkaldsfunktion med afkast
  • Hvornår skal man bruge Yield i stedet for Return i Python
  • Udbytte vs. retur

Syntaks

yield expression

Beskrivelse

Python-udbytte returnerer et generatorobjekt. Generatorer er specielle funktioner, der skal gentages for at få værdierne.

Udbytte-nøgleordet konverterer udtrykket givet til en generatorfunktion, der giver et generatorobjekt tilbage. For at få objektets værdier skal det gentages for at læse de værdier, der er givet til udbyttet.

Eksempel: Udbyttemetode

Her er et simpelt eksempel på udbytte. Funktionen testyield () har et nøgleord med strengen "Velkommen til Guru99 Python Tutorials". Når funktionen kaldes, udskrives output, og det giver et generatorobjekt i stedet for den aktuelle værdi.

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

Produktion:

Det givne output er et generatorobjekt, der har den værdi, vi har givet for at give.

Men vi får ikke den besked, vi skal give for at give i output!

For at udskrive den meddelelse, der er givet, skal den gentage generatorobjektet som vist i eksemplet nedenfor:

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

Produktion

Welcome to Guru99 Python Tutorials

Hvad er generatorer i Python?

Generatorer er funktioner, der returnerer et gentageligt generatorobjekt. Værdierne fra generatorobjektet hentes en ad gangen i stedet for den komplette liste sammen, og for at få de faktiske værdier kan du bruge en for-loop ved hjælp af metoden next () eller list ().

Brug af generatorfunktionen

Du kan oprette generatorer ved hjælp af generatorfunktion og ved hjælp af generatorudtryk.

En generatorfunktion er som en normal funktion, i stedet for at have en returværdi vil den have et afkast nøgleord.

For at oprette en generatorfunktion skal du tilføje et nøgleord. De følgende eksempler viser, hvordan man opretter en generatorfunktion.

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

Produktion:

HELLO

Forskel mellem normal funktion v / s generatorfunktion.

Lad os forstå, hvordan en generatorfunktion er forskellig fra en normal funktion.

Der er 2 funktioner normal_test () og generator_test ().

Begge funktioner antager at vende tilbage til strengen "Hello World". Normal_test () bruger return og generator_test () bruger 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

Produktion:

Hello World

Outputtet viser, at når du kalder den normale funktion normal_test (), returneres Hello World-streng. For en generatorfunktion med afkastnøgleord returnerer den og ikke strengen.

Dette er den største forskel mellem en generatorfunktion og en normal funktion. For at få værdien fra generatorobjektet skal vi enten bruge objektet indeni til loop eller bruge næste () -metoden eller gøre brug af listen ().

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

En anden forskel at tilføje til normal funktion v / s generatorfunktion er, at når du kalder en normal funktion, starter udførelsen og stopper, når den kommer tilbage, og værdien returneres til den, der ringer op. Så når udførelsen starter, kan du ikke stoppe den normale funktion imellem, og den stopper kun, når den kommer på retur-nøgleord.

Men i tilfælde af generatorfunktion, når udførelsen starter, når den får det første udbytte, stopper den udførelsen og giver generatorgenemnet tilbage. Du kan bruge generatorobjektet til at hente værdierne og også sætte en pause og genoptage i henhold til dine krav.

Hvordan læses værdierne fra generatoren?

Du kan læse værdierne fra et generatorobjekt ved hjælp af en liste (), for-loop og ved hjælp af næste () metode.

Brug af: liste ()

En liste er et gentageligt objekt, der har sine elementer inden for parentes. Brug af liste () på et generatorobjekt giver alle de værdier, generatoren har.

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

Produktion:

[0, 2, 4, 6, 8]

Brug: for-in

I eksemplet er der en funktion defineret lige_numre (), der giver dig alle lige tal for det n definerede. Opkaldet til funktionen even_numbers () returnerer et generatorobjekt, der bruges inde 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)

Produktion:

02468

Brug af næste ()

Den næste () metode giver dig det næste element i listen, arrayet eller objektet. Når listen er tom, og hvis næste () kaldes, vil den give en fejl med stopIteration signal. Denne fejl fra næste () indikerer, at der ikke er flere elementer på 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))

Produktion:

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

Generatorer er engangsbrug

I tilfælde af generatorer er de kun tilgængelige til brug en gang. Hvis du prøver at bruge dem igen, er de tomme.

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

Produktion:

02468Calling the generator again: []

Hvis du vil have output igen, skal du foretage opkaldet til at fungere igen.

Eksempel: Generatorer og kapacitet for Fibonacci-serien

Følgende eksempel viser, hvordan man bruger generatorer og udbytte i Python. Eksemplet genererer 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)

Produktion:

0112358

Eksempel: Opkaldsfunktion med afkast

I dette eksempel vil se, hvordan man kalder en funktion med udbytte.

Eksemplet nedenfor har en funktion kaldet test (), der returnerer kvadratet for det givne nummer. Der er en anden funktion kaldet getSquare (), der bruger test () med udbytte nøgleord. Outputtet giver kvadratværdien for det givne nummerinterval.

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)

Produktion:

0149162536496481

Hvornår skal man bruge Yield i stedet for Return i Python

Python3 Yield- nøgleord returnerer en generator til den, der ringer op, og udførelsen af ​​koden starter kun, når generatoren gentages.

Et afkast i en funktion er slutningen af ​​funktionsudførelsen, og en enkelt værdi gives tilbage til den, der ringer op.

Her er situationen, hvor du skal bruge Yield i stedet for Return

  • Brug udbytte i stedet for afkast, når datastørrelsen er stor
  • Udbytte er det bedste valg, når du har brug for din udførelse for at være hurtigere på store datasæt
  • Brug udbytte, når du vil returnere et stort sæt værdier til opkaldsfunktionen
  • Udbytte er en effektiv måde at producere data, der er store eller uendelige.

Udbytte vs. retur

Her er forskellene mellem Yield og Return

Udbytte Vend tilbage
Yield returnerer et generatorobjekt til den, der ringer op, og udførelsen af ​​koden starter kun, når generatoren gentages. Et afkast i en funktion er slutningen af ​​funktionsudførelsen, og en enkelt værdi gives tilbage til den, der ringer op.
Når funktionen kaldes, og den møder udbytte-nøgleordet, stopper udførelsen af ​​funktionen. Det returnerer generatorobjektet tilbage til den, der ringer op. Funktionsudførelsen starter kun, når generatorobjektet udføres. Når funktionen kaldes, starter udførelsen, og værdien gives tilbage til den, der ringer op, hvis der er retur-nøgleord. Returen inde i funktionen markerer afslutningen af ​​funktionens udførelse.
give udtryk returnere udtryk
Der bruges ikke hukommelse, når udbytte-søgeordet bruges. Hukommelsen allokeres til den returnerede værdi.
Meget nyttigt, hvis du skal håndtere enorm datastørrelse, da hukommelsen ikke bruges. Praktisk til meget lille datastørrelse.
Ydelsen er bedre, hvis udbytte-søgeordet bruges til stor datastørrelse. Der bruges meget hukommelse, hvis datastørrelsen er enorm, hvilket vil hæmme ydeevnen.
Udførelsestiden er hurtigere i tilfælde af udbytte til stor datastørrelse. Den anvendte udførelsestid er mere, da der er ekstra behandling udført, hvis din datastørrelse er enorm, fungerer den fint for lille datastørrelse.

Resumé:

  • Udbytte nøgleordet i python fungerer som et afkast med den eneste forskel er, at det i stedet for at returnere en værdi giver en generatorfunktion tilbage til den, der ringer op.
  • En generator er en særlig type iterator, der, når den er brugt, ikke vil være tilgængelig igen. Værdierne er ikke gemt i hukommelsen og er kun tilgængelige, når de kaldes op.
  • Værdierne fra generatoren kan læses ved hjælp af metoden for-in, list () og next ().
  • Hovedforskellen mellem udbytte og afkast er, at udbytte returnerer en generatorfunktion til den, der ringer op, og afkastet giver en enkelt værdi til den, der ringer.
  • Yield gemmer ikke nogen af ​​værdierne i hukommelsen, og fordelen er, at det er nyttigt, når datastørrelsen er stor, da ingen af ​​værdierne er gemt i hukommelsen.
  • Ydelsen er bedre, hvis udbytte-søgeordet bruges i sammenligning for at vende tilbage til stor datastørrelse.