Python Funkce lambda s PŘÍKLADY

⚡ Chytré shrnutí

Lambda funkce v Python jsou malé anonymní funkce definované klíčovým slovem lambda namísto def. Obsahují jeden výraz, přijímají libovolný počet argumentů a často se předávají přímo vestavěným funkcím, jako jsou map(), filter() a sorted().

  • 🔑 Klíčové slovo Lambda: Lambda funkce se zapisuje jako argumenty lambdy: výraz, bez def, bez názvu a bez explicitního příkazu return.
  • 🧮 Jeden výraz: Tělo obsahuje přesně jeden výraz, jehož hodnota je vrácena automaticky, takže příkazy a více řádků nejsou povoleny.
  • 🔗 Vestavěné párování: Lambdy se běžně předávají funkcím map(), filter(), reduce() a sorted() pro transformaci nebo výběr položek v sekvenci.
  • IIFE: Lambda funkci lze definovat a okamžitě volat pomocí vzoru (lambda x: x + x)(2), čímž se okamžitě vrátí výsledek.
  • 🇧🇷 Versus def: Regulární funkce potřebují název a mohou obsahovat mnoho příkazů, zatímco lambdy tuto sílu vyměňují za kompaktní, jednořádkovou syntaxi.
  • 🤖 Asistence AI: Asistenti umělé inteligence, jako je GitHub Copilot, generují lambda výrazy pro klíče mapování, filtrování a řazení z krátkého promptu.

Python Funkce lambda

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 to děláme u běžných funkcí. Poslední část (výraz) je libovolný platný výraz. Python výraz, který operuje 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))

Code Vysvětlení

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 lambdy. Zkusme nyní vytisknout lambdu a podívat se na výsledek. Znovu otevřete váš 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 zde děje? Podívejme se na kód, abychom to lépe pochopili.

Code Vysvětlení:

1. Zde definujeme šňůra který předáte jako parametr lambdě.

2. Deklarujeme lambdu, která volá příkaz print a vypíše výsledek.

Ale proč program nevypíše řetězec, který předáváme? Je to proto, že lambda sama vrací funkční objekt. V tomto příkladu se lambda nevypisuje. volal funkcí tisku, ale je to jednoduše návratu objekt funkce a umístění v paměti, kde je uložen. To se vypíše 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 to stisknutím klávesy 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áváme, se vypíše do konzole. Ale co je to za podivnou syntaxi a proč je definice lambdy uzavřena v hranatých závorkách? Pojďme si to teď vysvětlit.

Code Vysvětlení:

1. Zde je stejný řetězec, jaký jsme definovali v předchozím příkladu.

2. V této části definujeme lambdu a okamžitě ji voláme předáním řetězce jako argumentu. Tomu se říká IIFE a více se o něm dozvíte v následují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 regulární funkce. Otevřete si tedy 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í soubor uložte a stisknutím klávesy F5 spusťte program. Pokud jste neudělali žádné chyby, výstup by měl vypadat nějak takto.

Výstup:

printer 1 REGULAR CALL

printer 2 REGULAR CALL

printer 1 LAMBDA CALL

printer 2 LAMBDA CALL

Code Vysvětlení:

1. Funkce s názvem guru, která přijímá jinou funkci jako první parametr a všechny další argumenty za ní.

2. printer_one je jednoduchá funkce, která vytiskne předaný parametr a vrátí ho.

3. Funkce printer_two je podobná funkci printer_one, ale bez příkazu return.

4. V této části voláme funkci guru a jako parametry jí předáváme funkce tiskárny a řetězec.

5. Toto je syntaxe pro dosažení čtvrtého kroku (tj. volání funkce guru), ale s použitím lambd.

V další části se dozvíte, jak používat funkce lambda s mapa(), snížit(), a 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 lambda funkci lze volat ihned po její definici. Pojďme si to vysvětlit na příkladu; spusťte váš 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 předem definovaném omezení. Přijímá 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]

Code Vysvětlení:

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 provedení určité operace na každý prvek v sekvenci. Stejně jako filter() přijímá 2 parametry:

  1. Funkce, která definuje operaci, která se má provést s prvky
  2. 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]

Code Vysvětlení:

1. Zde definujeme seznam nazývaný posloupnosti, který obsahuje nějaká čísla.

2. Deklarujeme proměnnou s názvem filtered_result, která bude ukládat mapované hodnoty.

3. Funkce lambda, která běží na každém prvku seznamu a vrací druhou mocninu daného čísla.

4. Vypište výsledek vrácený funkcí map.

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:

  1. Funkce, která definuje operaci, která má být provedena
  2. 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

Code Vysvětlení:

1. Importujte reduce z modulu functools.

2. Zde definujeme seznam nazývaný posloupnosti, který obsahuje nějaká čísla.

3. Deklarujeme proměnnou s názvem součin, která bude uchovávat redukovanou hodnotu.

4. Lambda funkce, která se spouští s každým prvkem seznamu. Vrátí součin daného čísla dle předchozího výsledku.

5. Vypište výsledek vrácený funkcí reduce.

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 vhodné používat lambdy a kdy se jim vyhnout. V této části se seznámíte s některými principy návrhu používanými Python vývojáři při psaní lambda výrazů.

Jedním z nejběžnějších případů použití lambd je funkcionální programování, jako např. 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í lambd 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 funkce, které nemají vázaný identifikátor. Jednoduše řečeno, jedná se o funkce bez názvu (tudíž anonymní). Zde je tabulka ilustrující rozdíl mezi lambdami a regulárními funkcemi v Python.

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í žádný název. Proto se jim také říká 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í vracet 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í Funkce lambda neobsahuje příkaz return, protože bude mít pouze jeden výraz, který se ve výchozím nastavení vždy vrátí. Nemusíte ani lambdu přiřazovat, protože ji lze okamžitě vyvolat (viz předchozí část). Jak uvidíte, lambdy se stávají obzvláště silnými, když je používáme 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.

Na úrovni bajtkódu jsou obě definice zpracovány stejným způsobem. Python interpret. Nyní nemůžete pojmenovat funkci lambda protože je rezervován Python, ale jakýkoli jiný název funkce vrátí stejný bajtkód.

Nejčastější dotazy

Ano. Lambda může používat podmíněný výraz, například lambda x: 'even' if x % 2 == 0 else 'odd'. Nemůže obsahovat celý příkaz if, protože tělo lambdy musí být jeden výraz, nikoli blok příkazů.

Obecně ne. PEP 8 doporučuje použít def, když funkce potřebuje název, protože navázání lambdy na proměnnou jí sice dává název, ale ztrácí přehlednost. traceback, který poskytuje def. Lambdy se nejlépe předávají přímo funkcím jako sorted(), map() nebo filter().

Ne. Na úrovni bajtkódu. Python Zachází s lambdou a ekvivalentní def stejně, takže neexistuje žádná rychlostní výhoda. Lambda ukládá pouze řádek kódu; neprovádí se rychleji než pojmenovaná funkce vykonávající stejnou práci.

Ano. Lambda funkce může číst proměnné z okolního rozsahu a tvoří tak uzávěr. Uvnitř smyčky buďte opatrní: lambda funkce zachycuje samotnou proměnnou, nikoli její aktuální hodnotu, proto ji zmrazte pomocí výchozího argumentu, například lambda x, n=n: x + n.

Předejte lambda jako klíčový argument metodě sorted() nebo list.sort(). Například sorted(users, key=lambda u: u['age']) seřazuje položky podle věku. Lambda říká Python kterou hodnotu porovnat pro každý prvek, což poskytuje stručné vlastní řazení bez samostatné pojmenované funkce.

Ne přímo, protože anonymní lambda nemá žádný název, na který by se mohla odkazovat. Tomuto problému se dá předejít přiřazením lambdy proměnné a voláním tohoto názvu, ale normální def funkce je pro rekurzi jasnější a doporučenější volbou.

Lambdy funkce pohánějí rychlé, inline transformace v kódu umělé inteligence a strojového učení. Datoví vědci je předávají funkcím PANDA .apply(), map() a filter() pro čištění nebo změnu tvaru dat a jako klíčové funkce pro třídění prvků je kee...ping kompaktní předzpracování uvnitř větších trénovacích kanálů.

GitHub Copilot navrhuje kompletní lambda výrazy z krátkého komentáře nebo okolního kódu, včetně správných parametrů a výrazu pro volání map(), filter() nebo sorted(). Může také navrhnout převod podrobného lambda výrazu na přehlednější pojmenovanou funkci, pokud je důležitá čitelnost.

Shrňte tento příspěvek takto: