Co je funkce Lambda v Pythonu?
Lambda funkce Python programování je anonymní funkce, nebo funkce, které nemají jméno. Jedná se o malou a omezenou funkci, 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.
V Pythonu se výrazy lambda (nebo formy lambda) používají ke konstrukci anonymních funkcí. K tomu použijete klíčové slovo lambda (stejně jako definujete normální funkce pomocí def ). Každá anonymní funkce, kterou definujete v Pythonu, 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 jeden výraz. Kromě toho je lambda napsána v jednom řádku kódu a lze ji také okamžitě vyvolat. To vše uvidíte v akci v následujících příkladech.
V tomto výukovém programu Lambda v Pythonu se naučíte:
- Syntaxe a příklady
- Používání lambdas s integrovanými moduly Pythonu
- lambdy ve filtru ()
- lambdy na mapě ()
- lambdy v redu ()
- Proč (a proč ne) používat funkce lambda?
- Lambdas vs. běžné funkce
Syntaxe a příklady
Formální syntaxe pro zápis funkce lambda je uvedena níže:
lambda p1, p2: expression
Zde jsou parametry p1 a p2 předávané 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 v pythonu, který pracuje s parametry, které funkci poskytnete.
Příklad 1
Nyní, když víte o lambdách, zkusme to na příkladu. Otevřete tedy IDLE a zadejte následující:
adder = lambda x, y: x + yprint (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žité k definování anonymní funkce.
2. xay jsou parametry, které předá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 jediný výraz. V těle funkce lambda nemůžete psát více příkazů.
4. Zavoláme funkci a vytiskneme vrácenou hodnotu.
Příklad 2
To byl základní příklad k pochopení základů a syntaxe lambda. Zkusme nyní vytisknout lambdu a uvidíme výsledek. Znovu otevřete IDLE a zadejte následující:
#What a lambda returnsstring='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:
at 0x00000185C3BF81E0>
Co se tady děje? Podívejme se na kód, abychom lépe porozuměli.
Vysvětlení kódu
- Zde definujeme řetězec, který předáte jako parametr lambda.
- Deklarujeme lambdu, která volá tiskový příkaz a vytiskne výsledek.
Ale proč program nevytiskne řetězec, který předáme? Je to proto, že samotná lambda vrací funkční objekt. V tomto příkladu není lambda volána funkcí tisku, ale jednoduše vrací funkční objekt a umístění paměti, kde je uložena. To je to, co se vytiskne na konzole.
Příklad 3
Pokud však napíšete takový program:
#What a lambda returns #2x="some kind of a useless lambda"(lambda x : print(x))(x)
A spusťte jej stisknutím klávesy F5, uvidíte takový výstup.
Výstup:
some kind of a useless lambda
Nyní se volá lambda a řetězec, který předáme, se vytiskne na konzole. Co je to ale za divnou syntaxi a proč je definice lambda uvedena v závorkách? Pochopme to teď.
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 voláme ji okamžitě předáním řetězce jako argumentu. Toto se nazývá IIFE a další informace o něm se dozvíte v následujících částech tohoto kurzu.
Příklad 4
Podívejme se na poslední příklad, abychom pochopili, jak jsou prováděny lambdy a běžné funkce. Otevřete tedy IDLE a do nového souboru zadejte následující:
#A REGULAR FUNCTIONdef guru( funct, *args ):funct( *args )def printer_one( arg ):return print (arg)def printer_two( arg ):print(arg)#CALL A REGULAR FUNCTIONguru( printer_one, 'printer 1 REGULAR CALL' )guru( printer_two, 'printer 2 REGULAR CALL \n' )#CALL A REGULAR FUNCTION THRU A LAMBDAguru(lambda: printer_one('printer 1 LAMBDA CALL'))guru(lambda: printer_two('printer 2 LAMBDA CALL'))
Nyní uložte soubor a stisknutím klávesy F5 spusťte program. Pokud jste neudělali žádné chyby, výstup by měl být něco takového.
Výstup:
tiskárna 1 PRAVIDELNÉ HOVOR
tiskárna 2 PRAVIDELNÉ HOVOR
tiskárna 1 LAMBDA HOVOR
tiskárna 2 LAMBDA HOVOR
Vysvětlení kódu
- Funkce zvaná guru, která jako první parametr bere jinou funkci a všechny další argumenty, které ji následují.
- printer_one je jednoduchá funkce, která vytiskne předaný parametr a vrátí jej.
- printer_two is similar to printer_one but without the return statement.
- V této části voláme funkci guru a předáváme funkce tiskárny a řetězec jako parametry.
- Toto je syntaxe pro dosažení čtvrtého kroku (tj. Volání funkce guru), ale s použitím lambdas.
V další části se naučíte, jak používat funkce lambda s map (), redukovat () a filtrovat () v Pythonu.
Používání lambdas s integrovanými moduly Pythonu
Funkce Lambda poskytují elegantní a výkonný způsob provádění operací pomocí vestavěných metod v Pythonu. Je to možné, protože lambdas lze vyvolat okamžitě a předat jako argument těmto funkcím.
IIFE v Python Lambda
IIFE znamená okamžité vyvolání funkce. Znamená to, že funkce lambda je k dispozici, jakmile je definována. Pochopme to na příkladu; spusťte IDLE a zadejte následující:
(lambda x: x + x)(2)
Zde je výstup a vysvětlení kódu:
Tato schopnost okamžitého vyvolání lambd vám umožňuje používat je uvnitř funkcí jako map () a redukovat (). Je to užitečné, protože možná nebudete chtít tyto funkce znovu používat.
lambdy ve filtru ()
Funkce filtru se používá k výběru některých konkrétních prvků ze sekvence prvků. Sekvencí může být libovolný iterátor, například seznamy, množiny, n-tice atd.
Prvky, které budou vybrány, jsou založeny na nějakém předem definovaném omezení. Trvá 2 parametry:
- Funkce, která definuje omezení filtrování
- Sekvence (libovolný 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))
Tady je výstup:
[10, 8, 7, 5, 11]
Vysvětlení kódu:
1. V prvním příkazu definujeme seznam nazvaný sekvence, který obsahuje několik čísel.
2. Zde deklarujeme proměnnou nazvanou filter_result, která uloží 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 na mapě ()
funkce mapy se používá k použití konkrétní operace na každý prvek v sekvenci. Stejně jako filter () trvá také 2 parametry:
- Funkce, která definuje operaci, která má provádět 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, 121, 0, 1]
[KR1]
Vysvětlení kódu:
- Zde definujeme seznam nazvaný sekvence, který obsahuje několik čísel.
- Deklarujeme proměnnou nazvanou filtrovaný_výsledek, která uloží mapované 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.
lambdy v redu ()
Funkce zmenšit, jako je map (), se používá k použití operace na každý prvek v sekvenci. Liší se však od mapy ve svém fungování. Toto jsou kroky, po nichž následuje funkce redukovat () k výpočtu 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.
Trvá také dva parametry:
- Funkce, která definuje operaci, která má být provedena
- Sekvence (libovolný iterátor jako seznamy, n-tice atd.)
Zde je například program, který vrací součin všech prvků v seznamu:
from functools import reducesequences = [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 zmenšení z modulu functools
- Zde definujeme seznam nazvaný sekvence, který obsahuje několik čísel.
- Deklarujeme proměnnou nazvanou produkt, která uloží sníženou hodnotu
- Funkce lambda, která běží na každém prvku seznamu. Vrátí produkt tohoto čísla podle předchozího výsledku.
- Vytiskněte výsledek vrácený funkcí redukce.
Proč (a proč ne) používat funkce lambda?
Jak uvidíte v další části, s lambdami se na úrovni tlumočníka zachází stejně jako s běžnými funkcemi. Svým způsobem by se dalo říci, že lambdas poskytuje kompaktní syntaxi pro funkce psaní, které vracejí jediný 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, které používají vývojáři pythonu při psaní lambdas.
Jedním z nejběžnějších případů použití pro lambdas je funkční programování, protože Python podporuje paradigma (nebo styl) programování známé jako funkční programování.
Umožňuje vám poskytnout funkci jako parametr jiné funkci (například v mapě, filtru atd.). V takových případech nabízí použití lambdas elegantní způsob, jak vytvořit jednorázovou funkci a předat ji jako parametr.
Kdy byste neměli používat Lambdu?
V produkčním prostředí byste nikdy neměli psát komplikované funkce lambda. Pro programátory, kteří udržují váš kód, bude jeho dešifrování velmi obtížné. Pokud zjistíte, že děláte složité jednořádkové výrazy, bylo by mnohem lepší praxí 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.
Lambdas vs. běžné funkce
Jak již bylo uvedeno, lambdas jsou [vV4] [J5] pouze funkce, které k nim nemají vázaný identifikátor. Jednoduše řečeno, jsou to funkce bez jmen (tedy anonymní). Zde je tabulka pro ilustraci rozdílu mezi lambdami a běžnými funkcemi v pythonu.
Lambdas
Pravidelné funkce
Syntax:
lambda x : x + x
Syntax:
def (x) :return x + x
Funkce Lambda mohou mít v těle pouze jeden výraz.
Pravidelné funkce mohou mít v těle více výrazů a příkazů.
Lambdové nemají k sobě přidružené jméno. Proto jsou také známé jako anonymní funkce.
Pravidelné funkce musí mít jméno a podpis.
Lambdy neobsahují návratový příkaz, protože tělo je automaticky vráceno.
Funkce, které potřebují vrátit hodnotu, by měly obsahovat návratový příkaz.
Vysvětlení rozdílů?
Primární rozdíl mezi lambda a běžnou funkcí spočívá v tom, že funkce lambda vyhodnocuje pouze jeden výraz a poskytuje objekt funkce. V důsledku toho můžeme pojmenovat výsledek funkce lambda a použít ji v našem programu jako v předchozím příkladu.
Pravidelná funkce pro výše uvedený příklad by vypadala takto:
def adder (x, y):return x + yprint (adder (1, 2))
Zde musíme definovat název funkce, která vrátí výsledek, když jej zavoláme . Funkce lambda neobsahuje návratový příkaz, protože bude mít pouze jeden výraz, který je ve výchozím nastavení vždy vrácen. Nemusíte ani přiřadit lambdu, protože ji lze okamžitě vyvolat (viz další část). Jak uvidíte v následujícím příkladu, lambdy se stávají obzvláště výkonnými, když je používáme s vestavěnými funkcemi Pythonu.
Možná vás ale stále zajímá, jak se lambdy liší od funkce, která vrací jeden výraz (jako ten výše). Na úrovni tlumočníka není velký rozdíl. Může to znít překvapivě, ale každá funkce lambda, kterou definujete v Pythonu, je interpretem považována za normální funkci.
Jak vidíte na schématu, obě definice jsou zpracovány stejným způsobem interpretem pythonu při převodu na bytecode. Nyní nemůžete pojmenovat funkci lambda, protože je vyhrazena Pythonem, ale jakýkoli jiný název funkce přinese stejný bytecode [KR6].
souhrn
- Lambdy, známé také jako anonymní funkce, jsou malé omezené funkce, které nepotřebují jméno (tj. Identifikátor).
- Každá funkce lambda v Pythonu 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
- Lambdy mohou mít libovolný počet parametrů, ale nejsou uzavřeny v závorkách
- Lambda může mít ve svém těle funkce pouze 1 výraz, který je ve výchozím nastavení vrácen.
- Na úrovni bytecode není velký rozdíl mezi tím, jak tlumočník zachází s lambdami a běžnými funkcemi.
- Lambdas 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 prvky pythonu:
- Filtr: filtr (parametr lambda: výraz, iterovatelná sekvence)
- Mapa: mapa (parametr lambda: výraz, iterovatelné sekvence)
- Zmenšit: zmenšit (lambda parametr1, parametr2: výraz, iterovatelná sekvence)
- Nepište složité funkce lambda v produkčním prostředí, protože pro správce kódu to bude obtížné.
[J5] Přidal jsem tabulku, ale vysvětlení je nutné k pochopení rozdílů.