Saagikus Pythoni õpetuses: generaator & Saagis vs tagastamise näide

Lang L: none (table-of-contents):

Anonim

Mis on Pythoni saagikus?

Püütoni tootluse märksõna töötab nagu tagastamine ainsaga

erinevus seisneb selles, et väärtuse tagastamise asemel annab see helistajale tagasi generaatori objekti.

Kui funktsioon kutsutakse ja teostusniit leiab funktsioonist tootluse märksõna, peatub funktsiooni täitmine sellel real ise ja see tagastab helistajale tagasi generaatori objekti.

Selles Pythoni õpetuses saate teada:

  • Mis on Pythoni saagikus?
  • Süntaks
  • Mis on Pythoni generaatorid?
  • Erinevus tavalise funktsiooni v / s generaatori funktsiooni vahel.
  • Kuidas lugeda generaatori väärtusi?
  • Generaatorid on ühekordsed
  • Näide: Fibonacci seeria generaatorid ja saagikus
  • Näide: helistamisfunktsioon tootlusega
  • Millal kasutada Pythonis Returni asemel tootlust
  • Saagikus vs tagasitulek

Süntaks

yield expression

Kirjeldus

Pythoni saagis tagastab generaatori objekti. Generaatorid on erifunktsioonid, mida tuleb väärtuste saamiseks korrata.

Saagise märksõna teisendab antud avaldise generaatori funktsiooniks, mis annab tagasi generaatori objekti. Objekti väärtuste saamiseks tuleb see korrata, et lugeda saagisele antud väärtusi.

Näide: saagise meetod

Siin on lihtne näide saagikusest. Funktsioonil testyield () on tootlus märksõna stringiga "Welcome to Guru99 Python Tutorials". Funktsiooni kutsumisel prinditakse väljund välja ja see annab tegeliku väärtuse asemel generaatori objekti.

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

Väljund:

Antud väljund on generaatori objekt, millel on väärtus, mille oleme andnud saagiseks.

Kuid me ei saa sõnumit, mida peame andma väljundi tootmiseks!

Tulemuseks antud teate printimiseks tuleb generaatori objekt itereerida, nagu on näidatud allpool toodud näites:

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

Väljund

Welcome to Guru99 Python Tutorials

Mis on Pythoni generaatorid?

Generaatorid on funktsioonid, mis tagastavad itereeritava generaatori objekti. Generaatori objekti väärtused tõmmatakse ükshaaval täieliku loendi asemel kokku, et saada tegelikud väärtused, mida saate kasutada for-loop jaoks, kasutades meetodit next () või list ().

Generaatori funktsiooni kasutamine

Generaatorid saate luua generaatori funktsiooni ja generaatori avaldise abil.

Generaatori funktsioon on nagu tavaline funktsioon, selle tagastusväärtuse asemel on tootluse märksõna.

Generaatori funktsiooni loomiseks peate lisama tootluse märksõna. Järgmised näited näitavad, kuidas luua generaatori funktsioon.

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

Väljund:

HELLO

Erinevus tavalise funktsiooni v / s generaatori funktsiooni vahel.

Mõistkem, kuidas generaatori funktsioon erineb tavalisest funktsioonist.

Seal on 2 funktsiooni normal_test () ja generator_test ().

Mõlemad funktsioonid eeldavad stringi "Hello World" tagastamist. Normaalne_test () kasutab tagasitulekut ja generaatori_test () saagikust.

# 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

Väljund:

Hello World

Väljund näitab, et kui helistate tavalisele funktsioonile normal_test (), tagastab see string Hello World. Saagis märksõnaga generaatori funktsiooni korral tagastab väärtus , mitte stringi.

See on peamine erinevus generaatori funktsiooni ja normaalse funktsiooni vahel. Nüüd generaatoriobjekti väärtuse saamiseks peame kas kasutama tsüklis olevat objekti või kasutama meetodit next () või kasutama loendit ().

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

Veel üks erinevus tavalise funktsiooni v / s generaatori funktsiooni lisamiseks on see, et kui helistate tavalisele funktsioonile, käivitatakse ja peatatakse täitmine, kui see naaseb ja väärtus helistajale tagastatakse. Nii et kui käivitamine algab, ei saa te tavapärast funktsiooni vahepeal peatada ja see peatub ainult siis, kui ta satub tagasi märksõna.

Kuid generaatori funktsiooni korral, kui käivitamine algab esimese saagi saamisel, peatab see täitmise ja annab generaatori objekti tagasi. Väärtuste saamiseks võite kasutada generaatorobjekti ning peatada ja jätkata vastavalt oma nõudele.

Kuidas lugeda generaatori väärtusi?

Generaatori objekti väärtusi saate lugeda loendi (), for-loop ja meetodi next () abil.

Kasutades: list ()

Loend on korduv objekt, mille elemendid on sulgudes. Generaatori objekti list () kasutamine annab kõik väärtused, mida generaator omab.

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

Väljund:

[0, 2, 4, 6, 8]

Kasutamine: sissetoomiseks

Selles näites on funktsiooni määratletud paarisarvud (), mis annavad teile kõik määratletud n paarisarvud. Funktsiooni even_numbers () kutsumine tagastab generaatori objekti, mida kasutatakse for-loopi sees.

Näide:

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

Väljund:

02468

Järgmise () kasutamine

Järgmine () meetod annab teile järgmise loendi, massiivi või objekti üksuse. Kui loend on tühi ja kui kutsutakse järgmine (), annab see stopIteration signaaliga vea tagasi. See viga järgmisest () näitab, et loendis pole enam üksusi.

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

Väljund:

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

Generaatorid on ühekordsed

Need generaatorid on saadaval ainult üks kord. Kui proovite neid uuesti kasutada, on see tühi.

Näiteks:

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

Väljund:

02468Calling the generator again: []

Kui soovite, et väljundit kasutataks uuesti, peate uuesti toimima kutsuma.

Näide: Fibonacci seeria generaatorid ja saagikus

Järgmine näide näitab, kuidas kasutada Pythonis generaatoreid ja tootlust. Näide loob Fibonacci seeria.

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)

Väljund:

0112358

Näide: helistamisfunktsioon tootlusega

Selles näites näeme, kuidas funktsiooni kutsuda saagisega.

Allpool toodud näites on funktsioon nimega test (), mis tagastab antud arvu ruudu. On veel üks funktsioon getSquare (), mis kasutab tootlust märksõnaga test (). Väljund annab antud arvude vahemiku ruutväärtuse.

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)

Väljund:

0149162536496481

Millal kasutada Pythonis Returni asemel tootlust

Märksõna Python3 Yield tagastab helistajale generaatori ja koodi käivitamine algab alles siis, kui generaator itereeritakse.

Tulu funktsioonis on lõpuks funktsiooni täitmise ja esitatakse üksainus väärtus tagasi helistaja.

Siin on olukord, kui peaksite Returni asemel kasutama Yieldi

  • Kui andmeside suurus on suur, kasutage tagastamise asemel saagikust
  • Saagikus on parim valik, kui vajate, et teie teostus oleks suuremate andmekogumite puhul kiirem
  • Kasutage tootlust, kui soovite helistamisfunktsioonile tagastada suure hulga väärtusi
  • Saagikus on tõhus viis suurte või lõpmatute andmete saamiseks.

Saagikus vs tagasitulek

Siin on erinevused tootluse ja tootluse vahel

Saagikus Tagasi
Saagis tagastab helistajale generaatori objekti ja koodi käivitamine algab alles siis, kui generaator itereeritakse. Funktsiooni tagasipöördumine on funktsiooni täitmise lõpp ja helistajale antakse tagasi üks väärtus.
Kui funktsioon kutsutakse ja see satub tootluse märksõnaga, peatatakse funktsiooni täitmine. See tagastab generaatori objekti helistajale tagasi. Funktsiooni käivitamine algab alles siis, kui generaatori objekt on täidetud. Funktsiooni kutsumisel algab käivitamine ja väärtus tagastatakse helistajale, kui on tagasiside märksõna. Funktsiooni sees olev tagasipöördumine tähistab funktsiooni täitmise lõppu.
saagise väljendus tagastav väljend
Saagise märksõna kasutamisel ei kasutata mälu. Mälu eraldatakse tagastatava väärtuse jaoks.
Väga kasulik, kui peate tegelema tohutu andmemahuga, kuna mälu ei kasutata. Mugav väga väikese andmemahu korral.
Toimivus on parem, kui tootluse märksõna kasutatakse andmete suuruse jaoks. Palju mälu kasutatakse juhul, kui andmete maht on tohutu, mis pärsib jõudlust.
Suure andmeside suuruse korral on täitmisaeg kiirem. Kasutatav täitmisaeg on pikem, kuna täiendavat töötlemist on tehtud juhul, kui teie andmete suurus on suur, töötab see väikese andmeside suuruse korral hästi.

Kokkuvõte:

  • Püütoni tootluse märksõna töötab nagu tootlus, mille ainus erinevus seisneb selles, et väärtuse tagastamise asemel annab see helistajale tagasi generaatori funktsiooni.
  • Generaator on eriline iteraatori tüüp, mida pärast kasutamist enam ei saa. Väärtusi ei salvestata mällu ja need on saadaval ainult siis, kui neid kutsutakse.
  • Generaatori väärtusi saab lugeda meetodiga for-in, list () ja next ().
  • Peamine erinevus tootluse ja tagasipöördumise vahel on see, et tootlus tagastab helistajale tagasi generaatori funktsiooni ja tagastamine annab helistajale ühe väärtuse.
  • Saagikus ei salvesta ühtegi väärtust mällu ja eeliseks on see, et sellest on abi siis, kui andmesuurus on suur, kuna ühtegi väärtust ei salvestata mällu.
  • Toimivus on parem, kui tootluse märksõna kasutatakse võrreldes suure andmeside suurusega.