Vydat se Python Návod: Generator Příklad & výnos vs návratnost

Co je to Python výtěžek?

Klíčové slovo yield v pythonu funguje jako návrat s jediným

rozdíl je v tom, že místo vracení hodnoty vrací volajícímu objekt generátoru.

Když je zavolána funkce a vlákno provádění najde klíčové slovo výnosu ve funkci, provádění funkce se zastaví na tomto řádku samotném a vrátí objekt generátoru zpět volajícímu.

Syntax

yield expression

Description

Python výnos vrací objekt generátoru. Generators jsou speciální funkce, které je nutné pro získání hodnot opakovat.

Klíčové slovo výnos převádí daný výraz na funkci generátoru, která vrací objekt generátoru. Chcete-li získat hodnoty objektu, musíte jej iterovat, aby se načetly hodnoty dané výnosu.

Příklad: Výtěžková metoda

Zde je jednoduchý příklad výnosu. Funkce testyield() má klíčové slovo yield s řetězcem „Welcome to Guru99 Python Návody“. Když je funkce volána, výstup se vytiskne a místo skutečné hodnoty poskytne objekt generátoru.

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

Výstup:

<generator object testyield at 0x00000028265EB9A8>

Daným výstupem je objekt generátoru, který má hodnotu, kterou jsme zadali pro výtěžek.

Ale nedostáváme zprávu, kterou musíme dát, abychom získali výstup!

Chcete-li vytisknout zprávu zadanou k výnosu, budete muset iterovat objekt generátoru, jak je znázorněno v příkladu níže:

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

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

Výstup:

Welcome to Guru99 Python Tutorials

Jaké jsou Generators ve Python?

Generators jsou funkce, které vracejí objekt iterovatelného generátoru. Hodnoty z objektu generátoru se načítají jedna po druhé místo celého seznamu společně, a proto pro získání skutečných hodnot můžete použít for-loop pomocí metody next() nebo list().

Použití Generator funkce

Generátory můžete vytvářet pomocí funkce generátor a pomocí výrazu generátoru.

Funkce generátoru je jako normální funkce, namísto návratové hodnoty bude mít klíčové slovo výnos.

Chcete-li vytvořit funkci generátoru, budete muset přidat klíčové slovo výnos. Následující příklady ukazují, jak vytvořit funkci generátoru.

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

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

Výstup:

H
E
L
L
O

Rozdíl mezi normální funkcí v/s Generator funkce.

Pojďme pochopit, jak se funkce generátoru liší od normální funkce.

Existují 2 funkce normal_test() a generator_test().

Předpokládá se, že obě funkce vrátí řetězec „Hello World“. Normal_test() používá return a generator_test() používá výnos.

# 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

Výstup:

Hello World
<generator object generator_test at 0x00000012F2F5BA20>

Výstup ukazuje, že když zavoláte normální funkci normal_test(), vrátí řetězec Hello World. Pro funkci generátoru s klíčovým slovem výnos se vrací a ne řetězec.

To je hlavní rozdíl mezi funkcí generátoru a normální funkcí. Nyní, abychom získali hodnotu z objektu generátoru, musíme buď použít objekt uvnitř cyklu for, nebo použít metodu next() nebo použít list().

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

Další rozdíl, který lze přidat k normální funkci v/s generátoru funkce, je ten, že když zavoláte normální funkci, provádění se spustí a zastaví, když se dostane do zpáteční a hodnota je vrácena volajícímu. Takže když se spustí provádění, nemůžete mezi tím zastavit normální funkci a zastaví se pouze tehdy, když narazí na klíčové slovo return.

Ale v případě funkce generátoru, jakmile provádění začne, když získá první výnos, zastaví provádění a vrátí objekt generátoru. Pomocí objektu generátoru můžete získat hodnoty a také pozastavit a obnovit podle vašich požadavků.

Jak číst hodnoty z generátoru?

Hodnoty z objektu generátoru můžete číst pomocí list(), for-loop a pomocí metody next().

Použití: list()

Seznam je iterovatelný objekt, který má své prvky v závorkách. Použití list() na objektu generátoru poskytne všechny hodnoty, které generátor uchovává.

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

Výstup:

[0, 2, 4, 6, 8]

Použití: for-in

V příkladu je funkce definovaná sudá_čísla(), která vám poskytne všechna sudá čísla pro definované n. Volání funkce sudá_čísla() vrátí objekt generátoru, který se používá uvnitř for-loop.

Příklad:

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)

Výstup:

0
2
4
6
8

Použití next()

Metoda next() vám poskytne další položku v seznamu, poli nebo objektu. Jakmile je seznam prázdný, a pokud je zavolána next(), vrátí chybu se signálem stopIteration. Tato chyba z next() znamená, že v seznamu nejsou žádné další položky.

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

Výstup:

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

Generatorjsou jednorázové

V případě generátorů jsou k dispozici pro použití pouze jednou. Pokud se je pokusíte použít znovu, budou prázdné.

Například:

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

Výstup:

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

V případě, že chcete, aby byl výstup znovu použit, budete muset znovu zavolat, aby fungoval.

Příklad: Generators a výnos pro Fibonacciho řadu

Následující příklad ukazuje, jak používat generátory a výnosy Python. Příklad vygeneruje Fibonacciho řadu.

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)

Výstup:

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

Příklad: Volání funkce s výnosem

V tomto příkladu uvidíte, jak volat funkci s výnosem.

Níže uvedený příklad má funkci nazvanou test(), která vrací druhou mocninu daného čísla. Existuje další funkce nazvaná getSquare(), která používá test() s klíčovým slovem yield. Výstup udává druhou mocninu pro daný číselný rozsah.

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)

Výstup:

0
1
4
9
16
25
36
49
64
81

Kdy použít Yield namísto Return in Python

Python3 Výtěžek klíčové slovo vrací generátor volajícímu a provádění kódu se spustí pouze tehdy, když je generátor iterován.

A zpáteční ve funkci je konec provádění funkce a volajícímu je vrácena jedna hodnota.

Zde je situace, kdy byste měli použít Yield místo Return

  • Pokud je velikost dat velká, použijte výnos namísto návratnosti
  • Výnos je nejlepší volbou, když potřebujete, aby bylo provádění rychlejší na velkých souborech dat
  • Výnos použijte, když chcete volající funkci vrátit velkou sadu hodnot
  • Výnos je efektivní způsob produkce dat, která jsou velká nebo nekonečná.

Výnos vs. návratnost

Zde jsou rozdíly mezi výnosem a výnosem

Výtěžek Návrat
Yield vrací objekt generátoru volajícímu a provádění kódu se spustí pouze při iteraci generátoru. Návrat ve funkci je konec provádění funkce a volajícímu je vrácena jedna hodnota.
Když je funkce volána a narazí na klíčové slovo yield, provádění funkce se zastaví. Vrátí objekt generátoru zpět volajícímu. Provádění funkce se spustí pouze po provedení objektu generátoru. Když je funkce zavolána, spustí se provádění a hodnota je vrácena zpět volajícímu, pokud existuje klíčové slovo return. Návrat uvnitř funkce označuje konec provádění funkce.
výnosový výraz návratový výraz
Při použití klíčového slova výnosu se nepoužívá žádná paměť. Paměť je alokována pro vrácenou hodnotu.
Velmi užitečné, pokud se musíte vypořádat s velkým objemem dat, protože paměť není využívána. Pohodlné pro velmi malou velikost dat.
Výkon je lepší, pokud se klíčové slovo výnos použije pro velký objem dat. Pokud je velikost dat obrovská, což omezuje výkon, používá se hodně paměti.
Doba provádění je rychlejší v případě výnosu pro velký objem dat. Použitá doba provádění je delší, protože se provádí další zpracování v případě, že je velikost vašich dat obrovská, bude to fungovat dobře pro malou velikost dat.

Shrnutí

  • Klíčové slovo výnosu v pythonu funguje jako return s jediným rozdílem, že namísto vracení hodnoty vrací funkci generátoru volajícímu.
  • Generátor je speciální typ iterátoru, který po použití již nebude znovu dostupný. Hodnoty se neukládají do paměti a jsou dostupné pouze při vyvolání.
  • Hodnoty z generátoru lze číst pomocí metod for-in, list() a next().
  • Hlavní rozdíl mezi výnosem a výnosem je v tom, že výnos vrací funkci generátoru zpět volajícímu a návrat dává volajícímu jedinou hodnotu.
  • Yield neukládá žádnou z hodnot do paměti a výhodou je, že je užitečný při velké velikosti dat, protože žádná z hodnot není uložena v paměti.
  • Výkon je lepší, pokud je klíčové slovo výnos použito ve srovnání s návratností pro velké objemy dat.