Zjistěte, jak vám tento alternativní typ funkce může pomoci snížit nároky na paměť.
Pokud čtete řádky ze souboru protokolu nebo zpracováváte dlouhý seznam položek, jednou z možností je načíst celá data do paměti. Tento přístup však může spotřebovat hodně paměti a bránit výkonu. Generátory nabízejí cenné řešení.
Generátory eliminují potřebu načítat všechna data do paměti současně. Jsou užitečné při práci s velkými datovými sadami, nekonečnými sekvencemi nebo jakýmkoli scénářem, kde je prvořadá efektivita paměti.
Co jsou generátory?
Generátor je speciální funkce, která vám umožňuje iterovat posloupnost hodnot. Místo toho, aby vracely kompletní sadu dat, generují – nebo poskytují – jednu hodnotu po druhé. Díky tomu jsou efektivní pro práci s velkými nebo neomezenými sekvencemi dat.
A běžná funkce Pythonu obvykle vypočítá hodnotu a vrátí ji. Ale generátory fungují jinak. Mohou získat více hodnot v průběhu času pozastavením a obnovením provádění mezi každým výnosem.
Klíčovým rozdílem mezi běžnými funkcemi a generátory je to, že namísto použití
vrátit se generátory používají klíčové slovo k vytvoření výsledku výtěžek.Jak vytvořit generátor
Chcete-li vytvořit generátor, namísto vrátit se prohlášení, použijte a výtěžek příkaz v rámci funkce. The výtěžek klíčové slovo nejen že dává funkci pokyn, aby vrátila hodnotu, ale také jí umožňuje uložit její stav, což umožňuje budoucí obnovení.
Zde je příklad jednoduché funkce generátoru:
defnumeric_generator():
yield1
yield2
yield3
gen = numeric_generator()
Tato funkce generátoru poskytuje číselné hodnoty od 1 do 3.
The výtěžek příkaz uloží stav funkce se zachováním místních proměnných mezi voláními, aby mohl pokračovat, když požadujete další hodnotu.
Přiřazení funkce generátoru proměnné vytvoří objekt generátoru, se kterým můžete pracovat.
Práce s generátory
Generátory mají mnoho aplikací. Můžete je použít ve smyčkách for nebo v rámci porozumění seznamu, stejně jako další iterovatelné struktury. Generátory mohou také sloužit jako argumenty pro funkce.
Jakmile vytvoříte generátor, můžete jej iterovat pomocí cyklu for:
for i in numeric_generator():
print(i)
Můžete také použít další funkce pro načtení hodnot jednu po druhé:
print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3
To vám dává větší kontrolu nad objektem generátoru.
Generátory mohou sledovat jejich stav. Každý příkaz výnosu ve funkci funguje jako kontrolní bod. Když zavoláte na další() funkce na objektu generátoru, provedení navazuje na předchozí mez kluzu.
Hodnoty můžete také předávat do generátoru pomocí poslat():
defgenerator_with_send():
# First yield: Receive a value
x = yield
print(f"Received: {x}")# Second yield: Receive another value
y = yield
print(f"Received: {y}")# Third yield: Yield the sum
yield x + ygen = generator_with_send()
# Start generator and reach first yield
next(gen)# Send 10 into generator, received at first yield
result = gen.send(10)# Send 5 into generator, received at second yield
result = gen.send(5)
# Print result of third yield
print(result)
The poslat() metoda umožňuje načíst hodnoty z generátoru a odeslat hodnoty zpět do funkce generátoru, čímž ji efektivně pozastaví a umožní vám řídit její provádění. The poslat() metoda je užitečná při psaní korutin nebo použití generátorů pro pokročilé účely.
Použití generátoru výrazů
Generátor výrazů poskytuje stručný způsob, jak vytvořit jednoduchý a anonymní generátor. Jsou podobné jako seznamy, ale místo hranatých závorek používají závorky.
Zde je příklad:
gen = (i**2for i in range(10))
for x in gen:
print(x)
Kód vytvoří generátorový výraz, který dává druhé mocniny čísel 0 až 9. Generátorové výrazy jsou ideální pro líné generování posloupnosti hodnot.
Použití generátorů pro zpracování dat
Generátory Pythonu představují pohodlný způsob, jak popsat datové toky a sestavit iterátory, aniž by bylo nutné vše uchovávat v paměti. Své programování můžete výrazně zlepšit tím, že se naučíte používat generátory, což usnadní zvládání náročných úloh zpracování dat.
Až budete příště pracovat s velkými datovými sadami, mějte na paměti generátory a delegujte na ně úkoly náročné na práci, aby váš kód zůstal citlivý a efektivní.