lambda in Python

Python Lambda, jest jednolinijkową, anonimową funkcją. Nie jest skomplikowana, jednak na początku jej zrozumienie bardzo często stwarza problemy. Podobnie zresztą jak funkcja rekurencyjna.  A nie potrzebnie. W rzeczywistości bardzo łatwo się jej nauczyć, co z resztą pokażemy poniżej.

Jej najprostsza postać wygląda tak:

lambda <parametry> : <wyrażenie>

Jest to funkcja która nie ma nazwy. Poprzez użycie słowa kluczowego 'lambda' informujemy Python, że właśnie taką anonimową funkcję chcemy utworzyć. Następnie podajemy listę parametrów, które chcemy aby przyjmowała, używamy „:”, oraz definiujemy jej zawartość.

Przykładowo:

lambda x, y: x + y

W tym przypadku funkcja przyjmuje 2 parametry – x oraz y, a następnie zwraca ich sumę. Zaraz wszystko wytłumaczę, zanim jednak to zrobię, spójrzmy na jeszcze kilka przykładów:

lambda x : x + 1    # funkcja przyjmuje jeden parametr, a następnie dodaje jeden i zwraca wynik
lambda _ : _ + 1    # ta funkcja robi dokładnie to samo, ale zamiast nazwy parametru podajemy znak _
lambda x, y : x + y # to już znamy

# a tutaj przypiszemy funkcję do 'zmiennej', a następnie ją wykonamy

zmienna = lambda x,y: x+y
zmienna(2,3)

# tutaj wywołamy funkcję bez przypisywania do 'zmiennej'

(lambda x,y: x+y)(3,4)

Dość przykładów, pora zrozumieć do czego nam się może przypadać i jak działa.

Na czym polega lambda w Python

Aby zrozumieć naszą lambdę, musimy najpierw uświadomić sobie że istnieje coś takiego jak funkcje wyższego rzędu.

Funkcja wyższego rzędu jest to zwykła funkcja, z tą różnicą, że przyjmuje jako parametr inną funkcję, lub zwraca funkcję. W znakomitej większości przypadków tworzymy funkcję, która przyjmuje jako parametr liczby, ciągi znaków lub może listy. Taką jak ta:

def funkcja(x):
    return x+1

Funkcja wyższego rzędu, może wyglądać tak:

def funkcja(f,liczba):
    return f(liczba)

Pierwszym parametrem jest funkcja 'f', natomiast drugi liczba.

Możemy wywołać naszą funkcję wyższego rzędu, w następujący sposób:

# funkcja wyższego rzędu
    
def funkcja(f,liczba):
    return f(liczba)


# Dwie zwykłe funkcje

def dodaj_jeden(x):
    return x + 1

def kwadrat(parametr):
    return parametr*parametr
    

# Wywołanie funkcji wyższego rzędu
    
funkcja(dodaj_jeden,7) # dodaj 1
funkcja(kwadrat,7) # podniesiemy ją do kwadratu

Co się dzieje?

  1. Zdefiniowaliśmy funkcję wyższego rzędu
  2. Zdefiniowaliśmy 2 zwykłe funkcję. Jedna dodaje 1, druga podnosi do kwadratu
  3. Wywołaliśmy funkcję wyższego rzędu, poprzez przekazanie jako parametr 2 zwykłych funkcji

Grze jest w tym wszystkim lambda?

Funkcja wyższego rzędu oraz funkcja lambda

2 zwykłe funkcje, z powyższego przykładu, zdefiniowaliśmy TYLKO I WYŁĄCZNIE na potrzeby wywołania funkcji wyższego rzędu. Jest to sposób prawidłowy, jednak często taki zapis można skrócić, i tym samym ułatwić sobie życie, poprzez zastosowanie właśnie funkcji lambda:

# funkcja wyższego rzędu
    
def funkcja(f,liczba):
    return f(liczba)

funkcja(lambda x: x+1, 7)
funkcja(lambda x: x*x, 7)

Póki co nasze rozważania na temat funkcji lambda były bardzo teoretyczne. Spójrzmy zatem na kilka praktycznych przypadków użycia.

Praktyczne zastosowanie funkcji Lambda

A poniżej przykłady z życia wzięte, aczkolwiek przyznam że wszystkie z zakresu analizy danych. Jest to chyba obszar który najczęściej korzysta z lambdy w Python.

  • Filter, map, reduce.

Wszystkie 3 funkcje, wykonują operacje na zbiorze danych. Funkcja Map, zamienia elementy zbioru, funkcja filter filtruje zbiór danych, natomiast funkcja reduce, go redukuje. W jaki sposób? W taki, jaki wskażemy naszą funkcją lambda. Zobaczmy:

lista = [1,3,5,7]
from functools import reduce


print(f"Nasza lista: {lista}\n")
print(f"Przykład zastosowania map: {list( map(lambda _: _*2, lista) )}")
print(f"Przykład zastosowania filter: {list( filter(lambda _: _>3, lista) )}")
print(f"Przykład zastosowania reduce: { reduce(lambda x,y: x+y, lista) }")

lambda w python

Polecam przetestować powyższe funkcje we własnym zakresie. Ich koncepcja jest dość popularna i może się to przydać.

  • Pandas – funkcja apply

A teraz coś, dla miłośników biblioteki Pandas. 

Idea jest prosta. Mamy zbiór danych, tak zwany DataFrame. Teraz dla konkretnej kolumny, chcemy wykonać pewną operację. Dla przykładu, mamy zbiór danych z listą osób oraz informacją i ich płci.

import pandas as pd

x = {"Imie":["Michał","Jakub","Joanna"], "Płeć":["M","M","K"]}
df = pd.DataFrame(x)

Tam gdzie jest wartość 'M', potrzebujemy wstawić wartość 'Mężczyzna', w innym przypadku wartość 'Kobieta'. Do tego celu wykorzystamy funkcję pandas apply której działanie jest bardzo podobne do wcześniej wspomnianej funkcji Map:

df = df["Płeć"].apply(lambda _: "Mężczyzna" if _ == "M" else "Kobieta")

Użyliśmy funkcji lamba, która jest instrukcją dla Pandas co ma zrobić. W wyniku otrzymujemy oczywiście:

lambda

Należy cały czas mieć świadomość że lambda, nie jest żadną magią i ten sam efekt osiągniemy przy zastosowaniu tradycyjnej funkcji.

x = {"Imie":["Michał","Jakub","Joanna"], "Płeć":["M","M","K"]}
df = pd.DataFrame(x)

def zamien(x):
    if x == 'M': return 'Mężczyzna'
    return 'Kobieta'

df['Płeć'].apply(zamien)

Z użyciem lambda jest po prostu szybciej, prościej, bardziej cool.

Wyrażenia regularne w funkcji lambda w Python

Przykład z Python Apply pokazał nam że nasza lambda może zawierać wyrażenia warunkowe.

Ich postać wygląda następująco:

lambda <parametry> : wartość IF wyrażenie prawdziwe ELSE (…)

Dla przykładu, oraz jako ćwiczenie do samodzielnego wykonania:

wiek = lambda x: "dziecko" if x < 10 else ("Nastolatek" if x < 18  else "Dorosły")
wiek(18)

Możliwości wyrażeń warunkowych, nie są duże, ale w wielu przypadkach wystarczą i warto o nich pamiętać.

Podsumowanie lambda

Lambda nie wnosi niczego, czego nie byli byśmy wstanie osiągnąć za pomocą zwykłej funkcji. Jej celem jest jedynie skrócenie zapisu. Trzeba jednak przyznać, że jest bardzo wygodna i jak tylko się ją opanuje, to jej użycie sprawia sporo radości.

Warto poczytać

Sortowanie z użyciem funkcji lambda w Python

Trochę więcej na temat genezy lambdy oraz jej zastosowania w innych językach programowania <tutaj>.

Facebook Comments