Výukový program Výnos v Pythonu: Generátor & Příklad výnosu vs návratnost

Obsah:

Anonim

Co je výnos Pythonu?

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

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

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

V tomto výukovém programu pro Python se naučíte:

  • Co je výnos Pythonu?
  • Syntax
  • Co jsou generátory v Pythonu?
  • Rozdíl mezi normální funkcí v / s funkcí generátoru.
  • Jak číst hodnoty z generátoru?
  • Generátory jsou jednorázové
  • Příklad: Generátory a výnos pro řadu Fibonacci
  • Příklad: Volání funkce s výtěžkem
  • Kdy použít výnos místo návratu v Pythonu
  • Výnos vs. návratnost

Syntax

yield expression

Popis

Výnos Pythonu vrací objekt generátoru. Generátory jsou speciální funkce, které je třeba iterovat, aby se získaly hodnoty.

Klíčové slovo výnos převede daný výraz na funkci generátoru, která vrátí objekt generátoru. Chcete-li získat hodnoty objektu, je třeba jej iterovat, aby se přečetly hodnoty dané výtěžku.

Příklad: Výnosová metoda

Zde je jednoduchý příklad výnosu. Funkce testield () má klíčové slovo výnos s řetězcem „Vítejte v tutoriálech Guru99 Python“. Když je funkce volána, výstup je vytištěn a místo skutečné hodnoty dává objekt generátoru.

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

Výstup:

Uvedeným výstupem je objekt generátoru, který má hodnotu, kterou jsme dali k výnosu.

Ale nedostáváme zprávu, kterou musíme dát, abychom se dostali na výstup!

Chcete-li vytisknout zprávu danou výnosu, bude nutné iterovat objekt generátoru, jak je znázorněno v následujícím příkladu:

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

Výstup

Welcome to Guru99 Python Tutorials

Co jsou generátory v Pythonu?

Generátory jsou funkce, které vracejí iterovatelný objekt generátoru. Hodnoty z objektu generátoru se načítají po jednom namísto celého seznamu společně, a proto k získání skutečných hodnot můžete použít smyčku for pomocí metody next () nebo list ().

Pomocí funkce generátoru

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

Funkce generátoru je jako normální funkce, mí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:

HELLO

Rozdíl mezi normální funkcí v / s funkcí generátoru.

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

K dispozici jsou 2 funkce normal_test () a generator_test ().

Obě funkce předpokládají vrácení řetězce „Hello World“. Normální_test () používá návrat a generátor_test () používá 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ýstup:

Hello World

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 vrátí 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ř smyčky for, nebo použít metodu next () nebo použít list ().

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

Ještě jeden rozdíl, který je třeba přidat do funkce generátoru normální funkce v / s, je to, že když zavoláte normální funkci, spuštění se spustí a zastaví, když se vrátí a hodnota se vrátí volajícímu. Když tedy spuštění začne, nemůžete zastavit normální funkci mezi tím a zastaví se pouze tehdy, když narazí na návratové klíčové slovo.

Ale v případě funkce generátoru, jakmile spuštění začne, když získá první výnos, zastaví provádění a vrátí objekt generátoru. Objekt generátoru můžete použít k získání hodnot a také k pozastavení a obnovení zpět podle vašeho požadavku.

Jak číst hodnoty z generátoru?

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

Použití: list ()

Seznam je iterovatelný objekt, který má své prvky v závorkách. Použití seznamu () na objekt generátoru poskytne všechny hodnoty, které 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ýstup:

[0, 2, 4, 6, 8]

Použití: pro vstup

V příkladu je funkce definovaná even_numbers (), která vám dá všechna sudá čísla pro n definovaných. Volání funkce even_numbers () vrátí objekt generátoru, který se používá uvnitř smyčky for.

Pří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ýstup:

02468

Použití next ()

Metoda next () vám poskytne další položku v seznamu, poli nebo objektu. Jakmile je seznam prázdný a je volán next (), vrátí chybu se signálem stopIteration. Tato chyba z next () naznačuje, že v seznamu nejsou žádné další 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ýstup:

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

Generátory jsou jednorázové

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

Napří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ýstup:

02468Calling the generator again: []

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

Příklad: Generátory a výnos pro řadu Fibonacci

Následující příklad ukazuje, jak používat generátory a výtěžek v Pythonu. Příklad vygeneruje řadu 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ýstup:

0112358

Příklad: Volání funkce s výtěžkem

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

Následující příklad má funkci nazvanou test (), která vrací druhou mocninu daného čísla. Existuje další funkce zvaná 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*ndef getSquare(n):for i in range(n):yield test(i)sq = getSquare(10)for i in sq:print(i)

Výstup:

0149162536496481

Kdy použít výnos místo návratu v Pythonu

Klíčové slovo Python3 Yield vrací generátor volajícímu a provádění kódu začíná, pouze když je generátor iterován.

Návrat do funkce je konec plnění funkce, a jediná hodnota je dána zpět volajícímu.

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

  • Pokud je velikost dat velká, použijte výnos místo návratu
  • Výnos je nejlepší volbou, když potřebujete, aby vaše spuštění bylo rychlejší u velkých datových sad
  • Výtěžek použijte, pokud chcete vrátit velkou sadu hodnot do volající funkce
  • 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 návratností

Výtěžek Vrátit se
Výtěžek vrátí objekt generátoru volajícímu a provádění kódu začíná, pouze když je generátor iterován. 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í. Vrací objekt generátoru zpět volajícímu. Výkon funkce se spustí, pouze když je spuštěn objekt generátoru. Když je funkce volána, spustí se spuštění a hodnota se vrátí zpět volajícímu, pokud existuje návratové klíčové slovo. Návrat uvnitř funkce označuje konec provádění funkce.
výtěžek návratový výraz
Při použití klíčového slova yield se nepoužívá žádná paměť. Paměť je přidělena vrácené hodnotě.
Velmi užitečné, pokud se musíte vypořádat s obrovskou velikostí 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 velkou velikost dat. Hodně paměti se používá, pokud je velikost dat obrovská, což bude brzdit výkon.
Čas provedení je rychlejší v případě výnosu pro velkou velikost dat. Použitý čas spuštění je více, protože se provádí další zpracování v případě, že je-li vaše velikost dat obrovská, bude to fungovat dobře pro malou velikost dat.

Souhrn:

  • Klíčové slovo výnos v pythonu funguje jako návrat s jediným rozdílem je, že místo vrácení hodnoty vrátí volajícímu funkci generátoru.
  • Generátor je speciální typ iterátoru, který po použití již nebude k dispozici. Hodnoty nejsou uloženy v paměti a jsou k dispozici pouze při volání.
  • Hodnoty z generátoru lze číst pomocí metod for-in, list () a next ().
  • Hlavní rozdíl mezi výnosem a návratem spočívá v tom, že výnos vrací zpět funkci generátoru volajícímu a návrat dává volajícímu jedinou hodnotu.
  • Výtěžek neukládá žádnou z hodnot do paměti a výhodou je, že je užitečné, když je velikost dat velká, protože žádná z hodnot není uložena v paměti.
  • Výkon je lepší, pokud se klíčové slovo výnos použije ve srovnání s návratem k velké velikosti dat.