Python Funkce lambda s PŘÍKLADY
V čem je funkce Lambda Python?
A Funkce lambda v Python programování je anonymní funkce nebo funkce bez názvu. Je to malá a omezená funkce, která nemá více než jeden řádek. Stejně jako normální funkce může mít funkce Lambda více argumentů s jedním výrazem.
In Pythonlambda výrazy (nebo lambda formy) se používají ke konstrukci anonymních funkcí. K tomu použijete lambda klíčové slovo (stejně jako používáte def definovat normální funkce). Každá anonymní funkce, kterou definujete Python bude mít 3 základní části:
- Klíčové slovo lambda.
- Parametry (nebo vázané proměnné) a
- Tělo funkce.
Funkce lambda může mít libovolný počet parametrů, ale tělo funkce může obsahovat pouze jedna výraz. Navíc je lambda zapsána na jediném řádku kódu a lze ji také okamžitě vyvolat. To vše uvidíte v akci v nadcházejících ukázkách.
Syntaxe a příklady
Formální syntaxe pro zápis funkce lambda je uvedena níže:
lambda p1, p2: expression
Zde jsou p1 a p2 parametry, které jsou předány funkci lambda. Můžete přidat tolik nebo málo parametrů, kolik potřebujete.
Všimněte si však, že kolem parametrů nepoužíváme závorky jako u běžných funkcí. Poslední část (výraz) je jakýkoli platný výraz pythonu, který pracuje s parametry, které funkci zadáte.
Příklad 1
Nyní, když víte o lambdách, zkusme to na příkladu. Takže otevřete svůj IDLE a zadejte následující:
adder = lambda x, y: x + y print (adder (1, 2))
Zde je výstup:
3
Vysvětlení kódu
Zde definujeme proměnnou, která bude obsahovat výsledek vrácený funkcí lambda.
1. Klíčové slovo lambda používané k definování anonymní funkce.
2. x a y jsou parametry, které předáváme funkci lambda.
3. Toto je tělo funkce, která přidává 2 parametry, které jsme předali. Všimněte si, že se jedná o jeden výraz. Do těla funkce lambda nelze zapsat více příkazů.
4. Zavoláme funkci a vypíšeme vrácenou hodnotu.
Příklad 2
To byl základní příklad pro pochopení základů a syntaxe lambda. Zkusme nyní vytisknout lambdu a uvidíme výsledek. Znovu otevřete svůj IDLE a zadejte následující:
#What a lambda returns string='some kind of a useless lambda' print(lambda string : print(string))
Nyní uložte soubor a stisknutím klávesy F5 spusťte program. Toto je výstup, který byste měli dostat.
Výstup:
<function <lambda> at 0x00000185C3BF81E0>
Co se tady děje? Podívejme se na kód, abychom lépe porozuměli.
Vysvětlení kódu
- Zde definujeme a šňůra který předáte jako parametr lambdě.
- Deklarujeme lambdu, která volá příkaz print a vytiskne výsledek.
Proč ale program nevypíše řetězec, který předáme? Je to proto, že samotná lambda vrací funkční objekt. V tomto příkladu lambda není bytí volal pomocí funkce tisku, ale jednoduše návratu funkční objekt a paměťové místo, kde je uložen. To se vytiskne na konzoli.
Příklad 3
Pokud však napíšete program jako tento:
#What a lambda returns #2 x="some kind of a useless lambda" (lambda x : print(x))(x)
A spusťte jej stisknutím F5, uvidíte výstup jako je tento.
Výstup:
some kind of a useless lambda
Nyní se volá lambda a řetězec, který předáme, se vytiskne na konzole. Ale co je to za podivnou syntaxi a proč je definice lambda obsažena v závorkách? Teď to pochopíme.
Vysvětlení kódu
- Zde je stejný řetězec, který jsme definovali v předchozím příkladu.
- V této části definujeme lambdu a okamžitě ji voláme předáním řetězce jako argumentu. Toto je něco, čemu se říká IIFE a více se o tom dozvíte v nadcházejících částech tohoto tutoriálu.
Příklad 4
Podívejme se na poslední příklad, abychom pochopili, jak se provádějí lambdy a běžné funkce. Takže otevřete svůj IDLE a do nového souboru zadejte následující:
#A REGULAR FUNCTION def guru( funct, *args ): funct( *args ) def printer_one( arg ): return print (arg) def printer_two( arg ): print(arg) #CALL A REGULAR FUNCTION guru( printer_one, 'printer 1 REGULAR CALL' ) guru( printer_two, 'printer 2 REGULAR CALL \n' ) #CALL A REGULAR FUNCTION THRU A LAMBDA guru(lambda: printer_one('printer 1 LAMBDA CALL')) guru(lambda: printer_two('printer 2 LAMBDA CALL'))
Nyní uložte soubor a stiskněte F5 pro spuštění programu. Pokud jste neudělali žádnou chybu, výstup by měl být něco takového.
Výstup:
printer 1 REGULAR CALL printer 2 REGULAR CALL printer 1 LAMBDA CALL printer 2 LAMBDA CALL
Vysvětlení kódu
- Funkce zvaná guru, která má jako první parametr jinou funkci a za ní všechny další argumenty.
- printer_one je jednoduchá funkce, která vypíše předaný parametr a vrátí jej.
- printer_two je podobná jako printer_one, ale bez příkazu return.
- V této části voláme funkci guru a předáváme funkce tiskárny a řetězec jako parametry.
- Toto je syntaxe k dosažení čtvrtého kroku (tj. volání funkce guru), ale pomocí lambdas.
V další části se dozvíte, jak používat funkce lambda s mapa(), snížit(), si filtr() in Python.
Použití lambd s Python vestavěné
Funkce lambda poskytují elegantní a výkonný způsob provádění operací pomocí vestavěných metod v Python. Je to možné, protože lambdy lze vyvolat okamžitě a předat jako argument těmto funkcím.
IIFE v Python Lambda
IIFE představuje okamžitě vyvolané provedení funkce. To znamená, že funkci lambda lze volat, jakmile je definována. Pochopme to na příkladu; rozpálit svůj IDLE a zadejte následující:
(lambda x: x + x)(2)
Zde je výstup a vysvětlení kódu:
Tato schopnost lambdas být okamžitě vyvolána vám umožňuje používat je ve funkcích jako map() a reduction(). Je to užitečné, protože tyto funkce možná nebudete chtít znovu používat.
lambda ve filtru()
Funkce filtru se používá k výběru některých konkrétních prvků ze sekvence prvků. Sekvence může být libovolný iterátor, jako jsou seznamy, množiny, n-tice atd.
Prvky, které budou vybrány, jsou založeny na nějakém předem definovaném omezení. Chce to 2 parametry:
- Funkce, která definuje omezení filtrování
- Sekvence (jakýkoli iterátor jako seznamy, n-tice atd.)
Například,
sequences = [10,2,8,7,5,4,3,11,0, 1] filtered_result = filter (lambda x: x > 4, sequences) print(list(filtered_result))
Zde je výstup:
[10, 8, 7, 5, 11]
Vysvětlení kódu:
1. V prvním příkazu definujeme seznam s názvem sekvence, který obsahuje nějaká čísla.
2. Zde deklarujeme proměnnou nazvanou filter_result, která bude ukládat filtrované hodnoty vrácené funkcí filter().
3. Funkce lambda, která běží na každém prvku seznamu a vrací true, pokud je větší než 4.
4. Vytiskněte výsledek vrácený funkcí filtru.
lambdy v mapě()
funkce map se používá k aplikaci konkrétní operace na každý prvek v sekvenci. Stejně jako filter() má také 2 parametry:
- Funkce, která definuje operaci, která se má provést na prvcích
- Jedna nebo více sekvencí
Zde je například program, který vytiskne druhé mocniny čísel v daném seznamu:
sequences = [10,2,8,7,5,4,3,11,0, 1] filtered_result = map (lambda x: x*x, sequences) print(list(filtered_result))
Výstup:
[100, 4, 64, 49, 25, 16, 9, 121, 0, 1]
[KR1]
Vysvětlení kódu:
- Zde definujeme seznam s názvem sekvence, který obsahuje nějaká čísla.
- Deklarujeme proměnnou nazvanou filter_result, která bude ukládat namapované hodnoty
- Funkce lambda, která běží na každém prvku seznamu a vrací druhou mocninu tohoto čísla.
- Vytiskněte výsledek vrácený funkcí mapy.
lambda v redukovat()
Funkce snížení, podobně jako map(), se používá k aplikaci operace na každý prvek v sekvenci. Od mapy se však liší svým fungováním. Toto jsou kroky, které následuje funkce reduction() pro výpočet výstupu:
Krok 1) Proveďte definovanou operaci na prvních 2 prvcích sekvence.
Krok 2) Uložte tento výsledek
Krok 3) Proveďte operaci s uloženým výsledkem a dalším prvkem v pořadí.
Krok 4) Opakujte, dokud nezůstanou žádné další prvky.
Chce to také dva parametry:
- Funkce, která definuje operaci, která má být provedena
- Sekvence (jakýkoli iterátor jako seznamy, n-tice atd.)
Zde je například program, který vrací součin všech prvků v seznamu:
from functools import reduce sequences = [1,2,3,4,5] product = reduce (lambda x, y: x*y, sequences) print(product)
Zde je výstup:
120
Vysvětlení kódu:
- Import redukce z modulu functools
- Zde definujeme seznam s názvem sekvence, který obsahuje nějaká čísla.
- Deklarujeme proměnnou nazvanou produkt, která bude ukládat sníženou hodnotu
- Funkce lambda, která běží na každém prvku seznamu. Vrátí součin tohoto čísla podle předchozího výsledku.
- Vytiskněte výsledek vrácený funkcí snížení.
Proč (a proč ne) používat funkce lambda?
Jak uvidíte v další části, s lambdami se na úrovni interpretu zachází stejně jako s běžnými funkcemi. Svým způsobem by se dalo říci, že lambdy poskytují kompaktní syntaxi pro zápis funkcí, které vracejí jeden výraz.
Měli byste však vědět, kdy je dobré lambdy používat a kdy se jim vyhnout. V této části se naučíte některé principy návrhu používané vývojáři pythonu při psaní lambd.
Jedním z nejběžnějších případů použití pro lambdy je funkční programování as Python podporuje paradigma (nebo styl) programování známé jako funkční programování.
Umožňuje poskytnout funkci jako parametr jiné funkci (například v mapě, filtru atd.). V takových případech nabízí použití lambda elegantní způsob, jak vytvořit jednorázovou funkci a předat ji jako parametr.
Kdy byste neměli používat Lambdu?
Nikdy byste neměli psát složité funkce lambda v produkčním prostředí. Pro kodéry, kteří udržují váš kód, bude velmi obtížné jej dešifrovat. Pokud zjistíte, že vytváříte složité jednořádkové výrazy, bylo by mnohem lepším postupem definovat správnou funkci. Jako osvědčený postup si musíte pamatovat, že jednoduchý kód je vždy lepší než složitý kód.
Lambdy vs. běžné funkce
Jak již bylo uvedeno, lambdy jsou [vV4][J5] pouze funkce, které nemají žádný identifikátor. Jednodušeji řečeno, jsou to funkce bez jmen (proto anonymní). Zde je tabulka pro ilustraci rozdílu mezi lambdas a běžnými funkcemi v pythonu.
lambdy
Běžné funkce
Syntaxe:
lambda x : x + x
Syntaxe:
def (x) : return x + x
Funkce lambda mohou mít v jejich těle pouze jeden výraz.
Regulární funkce mohou mít ve svém těle více výrazů a příkazů.
Lambdy nemají s nimi spojené jméno. Proto jsou také známé jako anonymní funkce.
Běžné funkce musí mít jméno a podpis.
Lambdy neobsahují příkaz return, protože tělo je vráceno automaticky.
Funkce, které potřebují vrátit hodnotu, by měly obsahovat příkaz return.
Vysvětlení rozdílů?
Primární rozdíl mezi lambda a běžnou funkcí je ten, že funkce lambda vyhodnocuje pouze jeden výraz a dává funkční objekt. Následně můžeme výsledek funkce lambda pojmenovat a použít v našem programu jako v předchozím příkladu.
Běžná funkce pro výše uvedený příklad by vypadala takto:
def adder (x, y): return x + y print (adder (1, 2))
Zde musíme definovat a název pro funkci, která Vrací výsledek, když jsme volání to. Funkce lambda neobsahuje příkaz return, protože bude mít pouze jeden výraz, který je vždy vrácen jako výchozí. Nemusíte ani přiřazovat lambdu, protože ji lze okamžitě vyvolat (viz další část). Jak uvidíte v následujícím příkladu, lambdy se stanou obzvláště silnými, když je použijeme s Pythonvestavěné funkce.
Možná vás však stále zajímá, jak se lambda liší od funkce, která vrací jeden výraz (jako je ten výše). Na úrovni tlumočníka není velký rozdíl. Může to znít překvapivě, ale jakákoli funkce lambda, kterou definujete Python je tlumočníkem považováno za normální funkci.
Jak můžete vidět na diagramu, interpret pythonu při převodu do bajtkódu zachází s těmito dvěma definicemi stejným způsobem. Nyní nemůžete funkci pojmenovat lambda protože je rezervován Python, ale jakýkoli jiný název funkce poskytne stejný bytecode[KR6].
Shrnutí
- Lambdy, také známé jako anonymní funkce, jsou malé omezené funkce, které nepotřebují jméno (tj. identifikátor).
- Každá funkce lambda v Python má 3 základní části:
- Klíčové slovo lambda.
- Parametry (nebo vázané proměnné) a
- Tělo funkce.
- Syntaxe pro zápis lambda je: parametr lambda: výraz
- Lambda může mít libovolný počet parametrů, ale nejsou uzavřeny ve složených závorkách
- Lambda může mít ve svém těle funkce pouze 1 výraz, který je standardně vrácen.
- Na úrovni bajtkódu není velký rozdíl mezi tím, jak interpret zpracovává lambdy a běžné funkce.
- Lambda podporuje IIFE prostřednictvím této syntaxe: (parametr lambda: výraz) (argument)
- Lambdy se běžně používají s následujícími vestavěnými pythony:
- Filtr: filtr (parametr lambda: výraz, iterovatelná sekvence)
- Mapa: mapa (parametr lambda: výraz, iterovatelné sekvence)
- Snížit: snížit (parametr lambda1, parametr2: výraz, iterovatelná sekvence)
- Nepište složité funkce lambda v produkčním prostředí, protože to bude obtížné pro správce kódu.
[J5]Přidal jsem tabulku, ale vysvětlení je nutné k pochopení rozdílů.