Ge efter Python Handledning: Generator & avkastning vs avkastning exempel

Vad รคr Python avkastning?

Nyckelordet yield i python fungerar som en retur med den enda

Skillnaden รคr att istรคllet fรถr att returnera ett vรคrde, ger det tillbaka ett generatorobjekt till den som ringer.

Nรคr en funktion anropas och exekveringstrรฅden hittar ett yield-nyckelord i funktionen, stannar funktionsexekveringen vid sjรคlva raden och den returnerar ett generatorobjekt tillbaka till anroparen.

syntax

yield expression

BESKRIVNING

Python yield returnerar ett generatorobjekt. Generators รคr specialfunktioner som mรฅste itereras fรถr att fรฅ vรคrdena.

Nyckelordet yield omvandlar uttrycket som ges till en generatorfunktion som ger tillbaka ett generatorobjekt. Fรถr att fรฅ fram vรคrdena pรฅ objektet mรฅste det itereras fรถr att lรคsa de vรคrden som ges till avkastningen.

Exempel: Avkastningsmetod

Hรคr รคr ett enkelt exempel pรฅ avkastning. Funktionen testyield() har ett yield nyckelord med strรคngen "Welcome to Guru99 Python Tips och trix". Nรคr funktionen anropas skrivs utdata ut och det ger ett generatorobjekt istรคllet fรถr det faktiska vรคrdet.

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

Produktion:

<generator object testyield at 0x00000028265EB9A8>

Den givna utgรฅngen รคr ett generatorobjekt, som har det vรคrde vi har gett fรถr att ge.

Men vi fรฅr inte det budskap vi mรฅste ge fรถr att ge resultat!

Fรถr att skriva ut meddelandet som ges till avkastning mรฅste generatorobjektet itereras som visas i exemplet nedan:

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

output = testyield()
for i in output:
    print(i)

Produktion:

Welcome to Guru99 Python Tutorials

Vad รคr Generatorsi Python?

Generators รคr funktioner som returnerar ett itererbart generatorobjekt. Vรคrdena frรฅn generatorobjektet hรคmtas ett i taget istรคllet fรถr hela listan tillsammans och fรถr att fรฅ de faktiska vรคrdena kan du anvรคnda en for-loop, med hjรคlp av metoden next() eller list().

Anvรคnda Generator fungera

Du kan skapa generatorer med generatorfunktion och med generatoruttryck.

En generatorfunktion รคr som en normal funktion, istรคllet fรถr att ha ett returvรคrde kommer den att ha ett nyckelord fรถr avkastning.

Fรถr att skapa en generatorfunktion mรฅste du lรคgga till ett nyckelord fรถr avkastning. Fรถljande exempel visar hur man skapar en generatorfunktion.

def generator():
    yield "H"
    yield "E"
    yield "L"
    yield "L"
    yield "O"

test = generator()
for i in test:
    print(i)

Produktion:

H
E
L
L
O

Skillnad mellan normal funktion v/s Generator funktion.

Lรฅt oss fรถrstรฅ hur en generatorfunktion skiljer sig frรฅn en normal funktion.

Det finns 2 funktioner normal_test() och generator_test().

Bรฅda funktionerna รคr tรคnkt att returnera strรคngen "Hello World". Normal_test() anvรคnder retur och generator_test() anvรคnder avkastning.

# 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

Produktion:

Hello World
<generator object generator_test at 0x00000012F2F5BA20>

Utdata visar att nรคr du anropar den normala funktionen normal_test() returnerar den Hello World-strรคng. Fรถr en generatorfunktion med nyckelord avkastning returnerar den och inte strรคngen.

Detta รคr huvudskillnaden mellan en generatorfunktion och en normal funktion. Fรถr att nu fรฅ vรคrdet frรฅn generatorobjektet mรฅste vi antingen anvรคnda objektet inuti fรถr loop eller anvรคnda metoden next() eller anvรคnda list().

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

Ytterligare en skillnad att lรคgga till normal funktion v/s generatorfunktion รคr att nรคr du anropar en normal funktion kommer exekveringen att starta och stoppa nรคr den kommer till avkastning och vรคrdet returneras till den som ringer. Sรฅ nรคr exekveringen startar kan du inte stoppa den normala funktionen dรคremellan och den kommer bara att sluta nรคr den stรถter pรฅ returnera nyckelord.

Men i hรคndelse av generatorfunktion nรคr exekveringen vรคl startar nรคr den fรฅr den fรถrsta avkastningen stoppar den exekveringen och ger tillbaka generatorobjektet. Du kan anvรคnda generatorobjektet fรถr att fรฅ vรคrdena och รคven pausa och รฅteruppta enligt dina krav.

Hur lรคser man av vรคrdena frรฅn generatorn?

Du kan lรคsa vรคrdena frรฅn ett generatorobjekt med hjรคlp av en list(), for-loop och nรคsta()-metoden.

Anvรคnder: list()

En lista รคr ett itererbart objekt som har sina element inom parentes. Att anvรคnda list() pรฅ ett generatorobjekt kommer att ge alla vรคrden som generatorn har.

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

Produktion:

[0, 2, 4, 6, 8]

Anvรคnder: for-in

I exemplet finns det en funktion definierad even_numbers() som ger dig alla jรคmna tal fรถr n definierade. Anropet till funktionen even_numbers() kommer att returnera ett generatorobjekt, som anvรคnds inuti for-loop.

Exempel:

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)

Produktion:

0
2
4
6
8

Anvรคnder nรคsta()

Next()-metoden ger dig nรคsta objekt i listan, arrayen eller objektet. Nรคr listan รคr tom, och om next() anropas, kommer den att ge tillbaka ett fel med stopIteration-signal. Det hรคr felet, frรฅn next() indikerar att det inte finns fler objekt i listan.

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

Produktion:

0
2
4
6
8
Traceback (most recent call last):
  File "main.py", line 11, in <module>
    print(next(num))
StopIteration

Generators รคr engรฅngsanvรคndning

Om generatorer รคr tillgรคngliga fรถr anvรคndning endast en gรฅng. Om du fรถrsรถker anvรคnda dem igen kommer det att vara tomt.

Till exempel:

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

Produktion:

0
2
4
6
8
Calling the generator again:  []

Om du vill att utgรฅngen ska anvรคndas igen, mรฅste du ringa fรถr att fungera igen.

Exempel: Generators och avkastning fรถr Fibonacci-serien

Fรถljande exempel visar hur man anvรคnder generatorer och ger in Python. Exemplet kommer att generera Fibonacci-serien.

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)

Produktion:

<generator object getFibonnaciSeries at 0x0000007F39C8BA20>
0
1
1
2
3
5
8

Exempel: Anropsfunktion med avkastning

I det hรคr exemplet kommer vi att se hur man anropar en funktion med avkastning.

Exemplet nedan har en funktion som heter test() som returnerar kvadraten pรฅ det givna talet. Det finns en annan funktion som heter getSquare() som anvรคnder test() med nyckelordet yield. Utdata ger kvadratvรคrdet fรถr ett givet talomrรฅde.

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)

Produktion:

0
1
4
9
16
25
36
49
64
81

Nรคr ska man anvรคnda Yield istรคllet fรถr Return in Python

Python3 Utbyte nyckelordet returnerar en generator till den som ringer och exekveringen av koden startar fรถrst nรคr generatorn itereras.

A avkastning i en funktion รคr slutet av funktionsexekveringen, och ett enda vรคrde ges tillbaka till den som ringer.

Hรคr รคr situationen nรคr du ska anvรคnda Yield istรคllet fรถr Return

  • Anvรคnd avkastning istรคllet fรถr avkastning nรคr datastorleken รคr stor
  • Yield รคr det bรคsta valet nรคr du behรถver att din exekvering ska vara snabbare pรฅ stora datamรคngder
  • Anvรคnd avkastning nรคr du vill returnera en stor uppsรคttning vรคrden till den anropande funktionen
  • Yield รคr ett effektivt sรคtt att producera data som รคr stor eller oรคndlig.

Avkastning vs. avkastning

Hรคr รคr skillnaderna mellan avkastning och avkastning

Avkastning Retur
Yield returnerar ett generatorobjekt till den som ringer, och exekveringen av koden startar fรถrst nรคr generatorn itereras. En retur i en funktion รคr slutet pรฅ funktionsexekveringen, och ett enda vรคrde ges tillbaka till den som ringer.
Nรคr funktionen anropas och den stรถter pรฅ nyckelordet yield, stoppas funktionsexekveringen. Det returnerar generatorobjektet tillbaka till den som ringer. Funktionsexekveringen startar fรถrst nรคr generatorobjektet exekveras. Nรคr funktionen anropas startar exekveringen och vรคrdet ges tillbaka till den som ringer om det finns retur nyckelord. Returen inuti funktionen markerar slutet pรฅ funktionskรถrningen.
avkastningsuttryck returnera uttryck
Inget minne anvรคnds nรคr nyckelordet yield anvรคnds. Minnet tilldelas fรถr det returnerade vรคrdet.
Mycket anvรคndbart om du mรฅste hantera enorma datastorlekar eftersom minnet inte anvรคnds. Bekvรคmt fรถr mycket liten datastorlek.
Prestandan รคr bรคttre om nyckelordet yield anvรคnds fรถr stor datastorlek. Mycket minne anvรคnds om datastorleken รคr enorm vilket kommer att hรคmma prestandan.
Exekveringstiden รคr snabbare i hรคndelse av avkastning fรถr stor datastorlek. Exekveringstiden som anvรคnds รคr lรคngre eftersom det gรถrs extra bearbetning i fall om din datastorlek รคr enorm, kommer den att fungera bra fรถr liten datastorlek.

Sammanfattning

  • Nyckelordet yield i python fungerar som en retur med den enda skillnaden รคr att istรคllet fรถr att returnera ett vรคrde, ger det tillbaka en generatorfunktion till den som ringer.
  • En generator รคr en speciell typ av iterator som, nรคr den vรคl har anvรคnts, inte kommer att vara tillgรคnglig igen. Vรคrdena lagras inte i minnet och รคr endast tillgรคngliga vid uppringning.
  • Vรคrdena frรฅn generatorn kan lรคsas med metoderna for-in, list() och next().
  • Den stรถrsta skillnaden mellan avkastning och avkastning รคr att avkastning returnerar en generatorfunktion till den som ringer och retur ger ett enda vรคrde till den som ringer.
  • Yield lagrar inte nรฅgra av vรคrdena i minnet, och fรถrdelen รคr att det รคr anvรคndbart nรคr datastorleken รคr stor, eftersom inget av vรคrdena lagras i minnet.
  • Prestandan รคr bรคttre om nyckelordet yield anvรคnds i jรคmfรถrelse med avkastning fรถr stor datastorlek.

Sammanfatta detta inlรคgg med: