Jak používat funkce Lambda v Pythonu [With Examples]

Photo of author

By etechblogcz

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 se num2 rovnat 3 a funkce vrátí 4.
  • Pokud však zadáme pouze jeden argument (např. add(7)), pro num2 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() a reduce().
  • 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 je True, pokud je num liché a
  • num%2!=0 je False, pokud je num 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 na True, 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() a reduce(), a jako parametr key pro úpravu řazení iterovatelných objektů v Pythonu.

Dále se podívejte, jak se v Pythonu provádí celočíselné dělení.