Přejít na hlavní obsah

Python a enclosing proměnné, jak fungují a příklady použití

  • Adam Staňková
  • Postupy

Python je objektově orientovaný programovací jazyk, který se široce používá k vývoji webových aplikací, vědeckému výzkumu, analýze dat a mnoha dalším. Jednou z výkonných funkcí Pythonu je podpora encosing proměnných, které vám umožní zachovat stav funkcí a zachovat přístup k určitým proměnným, i když funkce již dokončila své spuštění.

Enclosing proměnné jsou vytvářeny při definování funkcí v jiných funkcích. Když vnořená funkce používá proměnné z vnější funkce, vytvoří objekt "uzavření", který obsahuje přístup k těmto proměnným. Uzávěr zachovává stav proměnných v době oznámení a tyto hodnoty nadále používá, a to i poté, co externí funkce dokončí své provádění.

Použití enclosing proměnných může být užitečné, když vnitřní funkce musí mít přístup k proměnným externí funkce, ale tyto proměnné nemusí být dostupné jiným částem programu. Může to být například užitečné, když vnitřní funkce musí zachovat počítadlo nebo globální stav, který by měl být viditelný pouze pro tuto funkci.

Python a enclosing proměnné: co to je?

To je způsobeno skutečností, že v Pythonu mohou být funkce vzájemně vnořeny a každá vnitřní funkce má přístup k proměnným externí funkce.

Když vnořená funkce odkazuje na proměnnou, hledá tuto proměnnou nejprve ve svém vnitřním místním jmenném prostoru a poté ve vnějším místním jmenném prostoru funkce, ve kterém se nachází. Pokud proměnná není nalezena, nadále obchází vnější prostory názvů, dokud nenajde hledanou proměnnou nebo nedosáhne globální oblasti viditelnosti.

Je důležité si uvědomit, že změna hodnoty enclosing proměnné uvnitř vnořené funkce vytvoří kopii této proměnné v místní oblasti viditelnosti vnořené funkce a změny se nebudou promítat do proměnné v externí funkci. Klíčové slovo "nonlocal" je však možné použít před proměnnou v vnořené funkci k označení, že je třeba použít proměnnou z externí funkce.

Níže je uveden příklad použití enclosing proměnných v Pythonu:

def outer():x = "hello"def inner():nonlocal xx = "world"print(x)inner()print(x)outer()

Enlcosing proměnné a zkraty v Pythonu: základní pojmy

Enclosing proměnné jsou proměnné definované v okolních funkcích, které se používají uvnitř zkratu. Když funkce uzávěr získá přístup k proměnné enclosig, ve skutečnosti získá přístup k kopii této proměnné uložené v paměti v době určení zkratu. To znamená, že hodnota enclosing proměnné v zkratu bude taková, jaká byla v době uzavření, nikoli v době hovoru.

Zkraty jsou mocným nástrojem v Pythonu, který umožňuje vytvářet funkce s dynamickým chováním, kde lze enclosing proměnné změnit uvnitř zkratu a uložit svůj stav mezi hovory Funkce.

def make_multiplier(x):def multiplier(n):return x * nreturn multipliermultiply_by_5 = make_multiplier(5)print(multiply_by_5(3)) # Выведет: 15print(multiply_by_5(7)) # Выведет: 35

V uvedeném příkladu funkce make_multiplier vytváří a vrací funkci multiplier. Externí funkce make_multiplier přijímá argument x a ukládá jej do enclosing proměnné. Vnořená funkce multiplier uzavírá hodnotu x a vrací výsledek násobení na hodnotu parametru n.

Vytvoření uzávěru nám umožňuje zachovat hodnotu argumentu x uvnitř multiplier a použít jej pro následné hovory Funkce multiply_by_5. Enclosing proměnná x je přidružená proměnná v uzavření multiplier a zachovává svou hodnotu mezi hovory Funkce multiply_by_5.

Zkraty a enclosing proměnné nám umožňují vytvořit flexibilnější a škálovatelnější kód v Pythonu, rozdělit funkčnost na menší části a zachovat stav mezi hovory funkcí.

Které proměnné jsou enclosing proměnné?

Enclosing proměnné jsou vytvořeny, když je funkce definována uvnitř jiné funkce. Vnitřní funkce může odkazovat na proměnné z vnější funkce. Pokud je vnitřní funkce k dispozici z externího kódu, enclosing proměnné také nejsou k dispozici.

Enclosing proměnné jsou užitečné, když potřebujete přenést data nebo stav z jedné funkce do vnořené funkce. Umožňují ukládat stav proměnných mezi hovory funkcí a usnadňují přenos dat.

Následující příklad ukazuje použití enclosing proměnných:

def outer_function(x):def inner_function(y):return x + yreturn inner_functionadd_5 = outer_function(5)result = add_5(3) # Рузультат: 8

V tomto příkladu interní funkce inner_function odkazuje na proměnnou x z externí funkce outer_function . Proměnná x je enclosing proměnná pro inner_function .

Kontextové zkraty: jak fungují v Pythonu?

Pravidlo použití kontextových zkratů je následující: pokud funkce odkazuje na proměnnou, která je definována mimo ni, Python si zapamatuje odkaz na tuto proměnnou a v případě potřeby ji použije uvnitř funkce. Přitom i když se původní proměnná v budoucnu změní, funkce použije její aktuální hodnotu.

Je důležité poznamenat, že kontextové zkraty nevytvářejí kopii proměnné, ale používají odkaz na ni. To znamená, že pokud se proměnná po vytvoření zkratu změní, změní se také hodnota uvnitř funkce.

Příklad použití kontextových zkratů:

def outer_func(x): def inner_func(y): return x + y return inner_func closure = outer_func(10) result = closure(5)

V tomto příkladu je outer_func externí funkcí, která přijímá argument x a vrací interní funkci inner_func. Vnitřní funkce získá přístup k proměnné x z vnějšího kontextu a přidá k ní svůj argument y. Poté zavoláme vnitřní funkci s argumentem 5 a dostaneme výsledek 15.

Kontextové zkraty jsou velmi užitečné, když je nutné zachovat určitý stav nebo kontext během provozu programu, například při použití funkčních rozhraní nebo asynchronních operací. Umožňují uložit a používat hodnoty proměnných bez použití globálních proměnných nebo jejich přenosu v argumentech funkcí.

Uveďte příklady práce s enclosing proměnnými v Pythonu

Zvažte příklad pro ilustraci, jak fungují enclosing proměnné:

def outer_func(x):def inner_func(y):return x + yreturn inner_funcresult_func = outer_func(10)print(result_func(5))

V tomto příkladu definujeme dvě funkce: outer_func a inner_func. Externí funkce outer_func přijímá argument x a definuje v sobě vnořenou funkci inner_func. Vnořená funkce inner_func přijímá argument y a vrací součet argumentů x a y.

Poté voláme externí funkci outer_func s argumentem 10. Tím se vrátí vnořená funkce inner_func, kterou přiřadíme proměnné result_func.

Enclosing proměnné tedy umožňují přenos dat mezi externími a vnořenými funkcemi v Pythonu a vytvářejí flexibilnější a modulárnější programy.

Proč používat enclosing proměnné v Pythonu?

Použití enclosing proměnných může být obzvláště užitečné, když je třeba vytvořit funkci, která zachová nějakou hodnotu, ale bude k dispozici z jiných funkcí. Pokud máme například hlavní funkci, která způsobuje více vnořených funkcí, lze enclosing proměnné použít k přenosu hodnot mezi těmito funkcemi bez použití argumentů.

Kromě toho enclosing proměnné umožňují zachovat stav funkce mezi hovory. To znamená, že lze použít hodnotu uloženou v enclosing proměnné v různých hovorech funkce, aniž byste museli měnit externí kód. To je zvláště užitečné, když potřebujete uložit některá data, abyste je mohli později použít, jako je mezipaměť nebo počítání částky.

Takže použití enclosing proměnných v Pythonu poskytuje větší flexibilitu a pohodlí při přenosu hodnot a stavů mezi funkcemi. Umožňují vám vytvářet zkraty, ukládat hodnoty a stavy funkcí mezi hovory a poskytují lokalizaci a bezpečnost dat. Enclosing proměnné jsou mocným nástrojem v jazyce Python, který stojí za to použít ve svém kódu k usnadnění práce a vytváření flexibilnějších a efektivnějších programů.

Vlastnosti oblasti viditelnosti enclosing proměnných

Jednou z funkcí oblasti viditelnosti enlcosing proměnných je, že změna hodnot těchto proměnných uvnitř vnořené funkce se odráží i na proměnných ve vnější funkci. To se provádí vytvořením odkazu na enclosing proměnnou, nikoli jejím kopírováním. Změna hodnoty proměnné v rámci funkce proto také změní její hodnotu ve vnější funkci.

Kromě toho je důležité poznamenat, že enclosing proměnné si zachovávají svou hodnotu po dokončení externí funkce. To umožňuje jejich použití uvnitř vnořené funkce i po dokončení externí funkce.

Enclosing proměnné lze také použít uvnitř jiných vnořených funkcí. To znamená, že hodnotu proměnné lze přenést z jedné vnořené funkce do druhé.

Při používání proměnných enclosing však stojí za to být pozorný, abyste se vyhnuli možným konfliktům a chybám. Například při použití pojmenovaných argumentů ve vnitřní funkci se stejnými názvy jako enclosing proměnných může dojít k záměně.