V tomto návodu se podíváme na lambda funkce v Pythonu. Probereme jejich syntaxi, definování a různé způsoby využití s praktickými příklady.
Lambda funkce jsou v Pythonu anonymní funkce s kompaktní syntaxí. Lze je efektivně využít ve spojení s jinými vestavěnými funkcemi. Na konci tohoto průvodce budete schopni definovat lambda funkce a rozhodovat o jejich použití namísto standardních funkcí v Pythonu.
Začněme!
Python Lambda funkce: Syntax a příklady
Základní syntaxe pro definování lambda funkce v Pythonu vypadá takto:
lambda parametr(y): návratová hodnota
V této syntaxi platí:
lambda
je klíčové slovo, které slouží k definování lambda funkce. Následuje jeden nebo více parametrů, které funkce přijímá.- Dvojtečka (
:
) odděluje parametry od návratové hodnoty.
💡 Při vytváření lambda funkce je důležité, aby návratová hodnota byla vypočítána na základě jediného výrazu, který se vejde na jeden řádek kódu. Pochopíme to lépe, až si ukážeme konkrétní příklady.
Příklady lambda funkcí v Pythonu
Nejlepším způsobem, jak si lambda funkce osvojit, je převést běžné Python funkce do lambda formátu.
👩🏽💻 Můžete si zkoušet kódovat v Python REPL nebo v online Python editoru etechblog.cz.
#1. Podívejme se na funkci square()
, která přijímá číslo num
a vrací jeho druhou mocninu.
def square(num): return num*num
Funkci můžeme vyzkoušet s různými argumenty a ověřit, že funguje správně.
>>> square(9) 81 >>> square(12) 144
Tento lambda výraz lze uložit do proměnné, například square1
, čímž získáme stručnější definici: square1 = lambda num: num*num
. Následně můžeme square1
volat s libovolným argumentem. Je však důležité mít na paměti, že lambda funkce jsou anonymní, takže bychom se měli vyhnout jejich přiřazování proměnným.
U funkce square()
je num
parametr a num*num
je návratová hodnota. Tyto části můžeme zapojit do lambda výrazu a ihned ho volat s argumentem, jak je ukázáno níže:
>>> (lambda num: num*num)(2) 4
Zde se jedná o koncept okamžitě vyvolané funkční exprese, kde funkci voláme hned po jejím definování.
#2. Nyní si přepišme další jednoduchou funkci add()
, která přijímá dvě čísla, num1
a num2
, a vrací jejich součet, num1 + num2
.
def add(num1,num2): return num1 + num2
Vyzkoušejme funkci add()
s různými vstupy:
>>> add(4,3) 7 >>> add(12,5) 17 >>> add(12,6) 18
V tomto případě jsou num1
a num2
dva parametry a num1 + num2
je návratová hodnota.
>>> (lambda num1, num2: num1 + num2)(3,7) 10
Python funkce mohou mít také výchozí hodnoty parametrů. Upravme funkci add()
a nastavme výchozí hodnotu parametru num2
na 10.
def add(num1, num2=10): return num1 + num2
Při volání této funkce:
- Pokud předáme hodnoty obou parametrů (např.
add(1,3)
), bude senum2
rovnat 3 a funkce vrátí 4.
- Pokud však zadáme pouze jeden argument (např.
add(7)
), pronum2
se použije výchozí hodnota 10 a funkce vrátí 17.
>>> add(1,3) 4 >>> add(7) 17
Při vytváření lambda funkcí s výchozími hodnotami parametrů, můžeme je definovat přímo v deklaraci parametrů.
>>> (lambda num1, num2 = 10: num1 + num2)(1) 11
Kdy použít lambda funkce v Pythonu?
Nyní, když jsme si vysvětlili základní koncept lambda funkcí v Pythonu, podívejme se na některé případy, kdy je vhodné je použít:
- Pokud máme funkci, která vrací výsledek z jediného řádku kódu a nepotřebujeme ji volat z jiných částí programu, můžeme použít lambda funkce. Podívali jsme se na několik příkladů takového využití.
- Lambda funkce se často využívají při práci s vestavěnými funkcemi jako
map()
,filter()
areduce()
. - Jsou také užitečné při třídění datových struktur, jako jsou seznamy a slovníky.
Použití Python Lambda s vestavěnými funkcemi
1. Použití lambda s funkcí map()
Funkce map()
bere jako vstup iterovatelný objekt a funkci a aplikuje tuto funkci na každý prvek v iterovatelném objektu, jak je vidět níže:
Vytvořme seznam čísel a pomocí funkce map()
vytvořme nový seznam, který bude obsahovat druhou mocninu každého čísla v původním seznamu. Všimněte si, jak se lambda funkce používá k definování operace umocňování.
>>> nums = [4,5,6,9] >>> list(map(lambda num:num*num,nums)) [16, 25, 36, 81]
Protože map()
vrací objekt typu map
, musíme ho přetypovat na seznam.
▶️ Projděte si tento návod o funkci map()
v Pythonu.
2. Použití lambda s funkcí filter()
Definujme si seznam nums
:
>>> nums = [4,5,6,9]
Řekněme, že z tohoto seznamu chceme vyfiltrovat pouze lichá čísla.
K tomu můžeme použít vestavěnou funkci filter()
v Pythonu.
Funkce filter()
vyžaduje podmínku a iterovatelný objekt jako vstup: filter(podmínka, iterovatelny_objekt)
. Výsledkem jsou pouze ty prvky z původního iterovatelného objektu, které splňují danou podmínku. Vrácený objekt pak můžeme přetypovat na seznam.
Pro odfiltrování sudých čísel ponecháme pouze čísla lichá. Lambda výraz by tedy měl být: lambda num: num%2!=0
. Výraz num%2
vrací zbytek po dělení čísla num
dvěma.
num%2!=0
jeTrue
, pokud jenum
liché anum%2!=0
jeFalse
, pokud jenum
sudé.
>>> nums = [4,5,6,9] >>> list(filter(lambda num:num%2!=0,nums)) [5, 9]
3. Použití lambda s funkcí reduce()
Funkce reduce()
bere jako vstup iterovatelný objekt a funkci. Iterativně aplikuje danou funkci na položky iterovatelného objektu a tím redukuje iterovatelný objekt na jednu hodnotu.
Pro použití funkce reduce()
ji musíme importovat z modulu functools
, který je součástí Pythonu:
>>> from functools import reduce
Použijme reduce()
pro výpočet součtu všech čísel v seznamu nums
. Definujeme lambda výraz: lambda num1,num2:num1+num2
jako funkci pro sčítání dvou čísel.
Redukce probíhá takto: f(f(f(4,5),6),9) = f(f(9,6),9) = f(15,9) = 24
. Kde f
je operace sčítání dvou položek seznamu definovaná lambda funkcí.
>>> from functools import reduce >>> nums = [4,5,6,9] >>> reduce(lambda num1,num2:num1+num2,nums) 24
Python Lambda funkce pro vlastní řazení
Kromě využití lambda funkcí s vestavěnými funkcemi jako map()
, filter()
a reduce()
, můžeme je použít i pro vlastní definici řazení.
1. Řazení Python seznamů
Při práci se seznamy je často potřeba je seřadit dle specifických kritérií. Pro řazení seznamů na místě používáme metodu sort()
. Pokud chceme získat seřazenou kopii seznamu, můžeme použít funkci sorted()
.
Syntaxe pro použití sorted()
je: sorted(iterovatelny_objekt, key=…, reverse= True | False)
.
– Parametr key
se používá pro specifikaci vlastního způsobu řazení.
– Parametr reverse
může být True
nebo False
. Výchozí hodnota je False
.
Při řazení seznamů čísel a řetězců je výchozí řazení vzestupné, respektive abecední. Někdy ale potřebujeme definovat vlastní kritéria.
Vezměme si seznam ovoce. Předpokládejme, že chceme získat seřazenou kopii tohoto seznamu podle počtu výskytů písmene ‘p’ v každém řetězci, sestupně.
>>> fruits = ['apple','pineapple','grapes','mango']
Nyní použijeme volitelný parametr key
. Řetězec je v Pythonu iterovatelný a pro získání počtu výskytů znaku v něm můžeme použít metodu .count()
. Proto nastavíme key
na lambda x:x.count('p')
, čímž zajistíme, že se bude řadit podle počtu výskytů ‘p’ v každém řetězci.
>>> fruits = ['apple','pineapple','grapes','mango'] >>> sorted(fruits,key=lambda x:x.count('p'),reverse=True) ['pineapple', 'apple', 'grapes', 'mango']
V tomto příkladu:
- Klíčem řazení je počet výskytů ‘p’, což jsme definovali lambda výrazem.
- Nastavili jsme parametr
reverse
naTrue
, takže řazení probíhá sestupně podle počtu výskytů ‘p’.
V seznamu ovoce má ‚pineapple‘ 3 výskyty ‚p‘, ‚apple‘ 2, ‚grapes‘ 1 a ‚mango‘ 0.
Stabilní řazení
Předefinujme si seznam fruits
, a použijme stejné kritérium řazení. Zde se ‘p’ vyskytuje dvakrát v řetězci ‘apple’, jednou v ‘grapes’, a vůbec v řetězcích ‘mango’ a ‘melon’.
>>> fruits = ['mango','apple','melon','grapes'] >>> sorted(fruits,key=lambda x:x.count('p'),reverse=True) ['apple', 'grapes', 'mango', 'melon']
Ve výsledném seznamu je ‚mango‘ před ‚melon‘, i když oba neobsahují ‘p’. Proč tomu tak je? Funkce sort()
provádí stabilní řazení. Pokud je počet ‚p‘ pro dva řetězce stejný, zachová se pořadí prvků z původního seznamu fruits
.
Pro rychlé cvičení si zkuste prohodit pozice ‚mango‘ a ‚melon‘ v seznamu fruits
, seřaďte seznam podle stejného kritéria a podívejte se na výsledek.
▶️ Zjistěte více o řazení seznamů v Pythonu.
2. Řazení Python slovníků
Lambda funkce můžeme použít i při řazení slovníků v Pythonu. Mějme slovník price_dict
, který obsahuje položky a jejich ceny.
>>> price_dict = { ... 'Milk':10, ... 'Honey':15, ... 'Bread':7, ... 'Candy':3 ... }
Pro získání párů klíč-hodnota ze slovníku jako seznam n-tic můžeme použít metodu .items()
:
>>> price_dict_items = price_dict.items() dict_items([('Milk', 10), ('Honey', 15), ('Bread', 7), ('Candy', 3)])
V Pythonu se indexuje od nuly, takže první položka má index 0, druhá má index 1 a tak dále.
Chceme řadit podle hodnoty, tedy podle ceny každé položky. V každé n-tici ze seznamu price_dict_items
je cena na indexu 1. Nastavíme tedy klíč na lambda x:x[1]
, protože k řazení slovníku chceme použít položku na indexu 1, tedy cenu.
>>> dict(sorted(price_dict_items,key=lambda x:x[1])) {'Candy': 3, 'Bread': 7, 'Milk': 10, 'Honey': 15}
Ve výstupu jsou položky slovníku seřazeny vzestupně podle ceny: od ‚Candy‘ s cenou 3 až po ‚Honey‘ s cenou 15.
▶️ Pro detailnější informace se podívejte na tento podrobný návod o řazení slovníků v Pythonu podle klíče a hodnoty.
Shrnutí
A to je vše! Naučili jste se, jak definovat lambda funkce a efektivně je využívat v kombinaci s vestavěnými funkcemi Pythonu. Zde je shrnutí nejdůležitějších informací:
- V Pythonu jsou lambda funkce anonymní, mohou přijímat více argumentů a vracet hodnotu. Výraz, který se má vyhodnotit k získání návratové hodnoty, by měl být na jednom řádku kódu. Lambda funkce slouží k zjednodušení definic malých funkcí.
- Lambda funkci definujeme pomocí syntaxe:
lambda parametry: návratová hodnota
. - Mezi důležitá využití patří použití s funkcemi
map()
,filter()
areduce()
, a jako parametrkey
pro úpravu řazení iterovatelných objektů v Pythonu.
Dále se podívejte, jak se v Pythonu provádí celočíselné dělení.