Výukový program pre výťažok v Pythone: Generátor & Príklad výnosu vs návratnosti

Obsah:

Anonim

Aký je výnos Pythonu?

Kľúčové slovo výnos v pythone funguje ako návrat s jediným

rozdiel je v tom, že namiesto vrátenia hodnoty vráti volajúcemu objekt generátora.

Keď sa volá funkcia a vlákno vykonania nájde vo funkcii kľúčové slovo výnos, vykonanie funkcie sa zastaví na samotnom riadku a vráti objekt generátora späť volajúcemu.

V tomto výučbe pre Python sa dozviete:

  • Aký je výnos Pythonu?
  • Syntax
  • Čo sú generátory v Pythone?
  • Rozdiel medzi funkciou generátora Normálna funkcia v / s.
  • Ako načítať hodnoty z generátora?
  • Generátory sú jednorazové
  • Príklad: Generátory a výťažok pre sériu Fibonacci
  • Príklad: volanie funkcie s výnosom
  • Kedy použiť Yield namiesto Return v Pythone
  • Výnos vs. návratnosť

Syntax

yield expression

Popis

Výnos Pythonu vráti objekt generátora. Generátory sú špeciálne funkcie, ktoré je potrebné opakovať, aby sa získali hodnoty.

Kľúčové slovo výnos prevedie zadaný výraz na funkciu generátora, ktorá vráti objekt generátora. Ak chcete získať hodnoty objektu, je potrebné ho iterovať, aby sa načítali hodnoty dané výťažkom.

Príklad: Výťažková metóda

Tu je jednoduchý príklad výťažku. Funkcia testyield () má kľúčové slovo výťažku s reťazcom „Vitajte na výukových programoch Guru99 Python“. Keď sa funkcia volá, výstup sa vytlačí a namiesto skutočnej hodnoty dá objekt generátora.

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

Výkon:

Daný výstup je objekt generátora, ktorý má hodnotu, ktorú sme dali za výnos.

Ale nedostávame správu, ktorú musíme dať, aby sme priniesli výstup!

Ak chcete vytlačiť správu danú výnosu, bude potrebné iterovať objekt generátora, ako je znázornené v príklade nižšie:

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

Výkon

Welcome to Guru99 Python Tutorials

Čo sú generátory v Pythone?

Generátory sú funkcie, ktoré vracajú iterovateľný objekt generátora. Hodnoty z objektu generátora sa načítajú po jednom namiesto celého zoznamu spolu. Z tohto dôvodu získate skutočné hodnoty pomocou metódy for-loop pomocou metódy next () alebo list ().

Pomocou funkcie Generátor

Generátory môžete vytvárať pomocou funkcie generátora a výrazu generátora.

Funkcia generátora je ako normálna funkcia, namiesto návratovej hodnoty bude mať kľúčové slovo výnos.

Ak chcete vytvoriť funkciu generátora, budete musieť pridať kľúčové slovo výťažku. Nasledujúce príklady ukazujú, ako vytvoriť funkciu generátora.

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

Výkon:

HELLO

Rozdiel medzi funkciou generátora Normálna funkcia v / s.

Poďme pochopiť, ako sa funkcia generátora líši od normálnej funkcie.

Existujú 2 funkcie normal_test () a generator_test ().

Obidve funkcie majú vrátiť reťazec „Hello World“. Normal_test () používa výnos a generator_test () používa výnos.

# 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ýkon:

Hello World

Výstup ukazuje, že keď zavoláte normálnu funkciu normal_test (), vráti reťazec Hello World. Pre funkciu generátora s kľúčovým slovom výnos vráti a nie reťazec.

Toto je hlavný rozdiel medzi funkciou generátora a normálnou funkciou. Teraz, aby sme dostali hodnotu z objektu generátora, musíme buď použiť objekt vo vnútri cyklu for, alebo použiť metódu next () alebo použiť list ().

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

Ešte jeden rozdiel, ktorý je potrebné pridať k funkcii generátora normálnej funkcie v / s, je ten, že keď zavoláte normálnu funkciu, spustenie sa zastaví a zastaví, keď sa vráti, a hodnota sa vráti volajúcemu. Takže keď sa spustí vykonávanie, nemôžete medzi nimi zastaviť normálnu funkciu a zastaví sa iba vtedy, keď narazí na kľúčové slovo return.

Ale v prípade funkcie generátora, akonáhle sa spustenie spustí, keď získa prvý výnos, zastaví vykonávanie a vráti objekt generátora. Objekt generátora môžete použiť na získanie hodnôt a tiež na pozastavenie a opätovné spustenie podľa vašich požiadaviek.

Ako načítať hodnoty z generátora?

Hodnoty môžete načítať z objektu generátora pomocou list (), for-loop a pomocou metódy next ().

Použitie: list ()

Zoznam je opakovateľný objekt, ktorý má svoje prvky v zátvorkách. Použitím zoznamu () na objekte generátora získate všetky hodnoty, ktoré generátor obsahuje.

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

Výkon:

[0, 2, 4, 6, 8]

Použitie: na vstup

V príklade je definovaná funkcia even_numbers (), ktorá vám dá všetky párne čísla pre n definovaných. Volanie funkcie even_numbers () vráti objekt generátora, ktorý sa používa vo vnútri cyklu for.

Príklad:

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ýkon:

02468

Pomocou next ()

Metóda next () vám poskytne nasledujúcu položku v zozname, poli alebo objekte. Keď je zoznam prázdny a ak sa volá next (), vráti chybu so signálom stopIteration. Táto chyba z next () naznačuje, že v zozname už nie sú žiadne položky.

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ýkon:

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

Generátory sú jednorazové

V prípade generátorov sú k dispozícii na použitie iba raz. Ak ich skúsite znova použiť, bude prázdne.

Napríklad:

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ýkon:

02468Calling the generator again: []

V prípade, že chcete, aby sa výstup použil znova, budete musieť uskutočniť volanie, aby ste opäť fungovali.

Príklad: Generátory a výťažok pre sériu Fibonacci

Nasledujúci príklad ukazuje, ako používať generátory a výťažok v Pythone. Tento príklad vygeneruje sériu Fibonacci.

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ýkon:

0112358

Príklad: volanie funkcie s výnosom

V tomto príklade uvidíme, ako sa dá nazvať funkcia s výnosom.

Nasledujúci príklad má funkciu nazvanú test (), ktorá vracia štvorec daného čísla. Existuje ďalšia funkcia s názvom getSquare (), ktorá používa test () s kľúčovým slovom yield. Výstup udáva druhú mocninu pre daný číselný rozsah.

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ýkon:

0149162536496481

Kedy použiť Yield namiesto Return v Pythone

Kľúčové slovo Python3 Yield vráti generátor volajúcemu a vykonávanie kódu sa spustí, až keď bude generátor iterovaný.

Návrat do funkcie je koniec plnenie funkcie, a jediná hodnota je daná späť volajúcemu.

Tu je situácia, kedy by ste mali namiesto výnosov použiť Yield

  • Ak je veľkosť dát veľká, použite namiesto výnosov výnos
  • Výnos je najlepšou voľbou, keď potrebujete, aby vaše spustenie bolo vo veľkých množinách dát rýchlejšie
  • Výnos použite, ak chcete vrátiť volajúcej funkcii veľkú množinu hodnôt
  • Výnos je efektívny spôsob výroby údajov, ktoré sú veľké alebo nekonečné.

Výnos vs. návratnosť

Tu sú rozdiely medzi výnosom a výnosom

Výťažok Návrat
Výnos vráti objekt generátora volajúcemu a vykonávanie kódu sa spustí, až keď bude generátor iterovaný. Návrat vo funkcii je koniec vykonania funkcie a volajúcemu sa vráti jedna hodnota.
Keď sa funkcia volá a narazí na kľúčové slovo výnos, vykonávanie funkcie sa zastaví. Vráti objekt generátora späť volajúcemu. Vykonávanie funkcie sa spustí až po vykonaní objektu generátora. Keď sa funkcia volá, spustí sa spustenie a hodnota sa vráti späť volajúcemu, ak existuje návratové kľúčové slovo. Návrat vo vnútri funkcie označuje koniec vykonávania funkcie.
výnosový výraz návratový výraz
Keď sa použije kľúčové slovo výnos, nepoužíva sa žiadna pamäť. Pamäť je pridelená pre vrátenú hodnotu.
Veľmi užitočné, ak sa musíte vyrovnať s obrovskou veľkosťou dát, pretože pamäť sa nevyužíva. Pohodlné pre veľmi malú veľkosť dát.
Výkon je lepší, ak sa kľúčové slovo výnos použije pre veľkú veľkosť údajov. Ak je veľkosť dát veľká, použije sa veľa pamäte, ktorá bude brzdiť výkon.
Čas vykonania je rýchlejší v prípade výťažnosti pre veľkú veľkosť dát. Použitý čas vykonania je väčší, pretože sa vykonáva ďalšie spracovanie pre prípad, že by veľkosť vašich údajov bola veľká, pre malú veľkosť údajov to bude fungovať dobre.

Zhrnutie:

  • Kľúčové slovo výnos v pythone funguje ako návrat, iba s tým rozdielom, že namiesto vrátenia hodnoty vráti volajúcemu funkciu generátora.
  • Generátor je špeciálny typ iterátora, ktorý po použití už nebude k dispozícii. Hodnoty nie sú uložené v pamäti a sú k dispozícii iba pri vyvolaní.
  • Hodnoty z generátora je možné načítať pomocou metód for-in, list () a next ().
  • Hlavný rozdiel medzi výnosom a výnosom je ten, že výnos vráti volajúcemu späť funkciu generátora a návrat dáva volajúcemu jednu hodnotu.
  • Výnos neukladá žiadnu z hodnôt do pamäte a výhodou je, že je užitočné, keď je veľkosť dát veľká, pretože žiadna z hodnôt nie je uložená v pamäti.
  • Výkon je lepší, ak sa v porovnaní s kľúčovým slovom výnos použije návrat na veľkú veľkosť údajov.