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
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, inprint(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.