Funcții Lambda și Programare Funcțională
Funcții Lambda
Funcțiile lambda sunt funcții anonime (fără nume), definite într-o singură linie.
Sintaxă
lambda parametri: expresie
Exemple
# Funcție clasică
def dublu(x):
return x * 2
# Echivalent lambda
dublu = lambda x: x * 2
dublu(5) # 10
Cu mai mulți parametri
suma = lambda a, b: a + b
suma(3, 4) # 7
produs = lambda a, b, c: a * b * c
produs(2, 3, 4) # 24
Funcția map()
Aplică o funcție pe fiecare element al unui iterabil.
numere = [1, 2, 3, 4, 5]
# Cu funcție normală
def patrat(x):
return x ** 2
rezultat = list(map(patrat, numere))
# [1, 4, 9, 16, 25]
# Cu lambda
rezultat = list(map(lambda x: x ** 2, numere))
# [1, 4, 9, 16, 25]
# Cu mai multe iterabile
a = [1, 2, 3]
b = [10, 20, 30]
sume = list(map(lambda x, y: x + y, a, b))
# [11, 22, 33]
Funcția filter()
Filtrează elementele care satisfac o condiție.
numere = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# Numerele pare
pare = list(filter(lambda x: x % 2 == 0, numere))
# [2, 4, 6, 8, 10]
# Șiruri nevide
texte = ["", "hello", "", "world", ""]
nevide = list(filter(lambda s: s, texte))
# ['hello', 'world']
# Sau mai simplu cu None
nevide = list(filter(None, texte))
# ['hello', 'world']
Funcția reduce()
Reduce un iterabil la o singură valoare (necesită import).
from functools import reduce
numere = [1, 2, 3, 4, 5]
# Suma
suma = reduce(lambda a, b: a + b, numere)
# 15 (calculat: ((((1+2)+3)+4)+5))
# Produs
produs = reduce(lambda a, b: a * b, numere)
# 120
# Cu valoare inițială
suma = reduce(lambda a, b: a + b, numere, 100)
# 115
Funcția sorted() cu key
cuvinte = ["banana", "mar", "portocala", "kiwi"]
# Sortare după lungime
sortate = sorted(cuvinte, key=len)
# ['mar', 'kiwi', 'banana', 'portocala']
# Sortare după al doilea caracter
sortate = sorted(cuvinte, key=lambda s: s[1])
# Sortare obiecte
studenti = [
{"nume": "Ana", "nota": 9},
{"nume": "Ion", "nota": 7},
{"nume": "Maria", "nota": 10}
]
sortati = sorted(studenti, key=lambda s: s["nota"], reverse=True)
Combinarea Funcțiilor
numere = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# Suma pătratelor numerelor pare
rezultat = reduce(
lambda a, b: a + b,
map(
lambda x: x ** 2,
filter(lambda x: x % 2 == 0, numere)
)
)
# 220
# Alternativ cu comprehension (mai clar):
rezultat = sum(x**2 for x in numere if x % 2 == 0)
# 220
Când să Folosești Lambda
Potrivit pentru:
- Funcții scurte, de o singură expresie
- Argumente pentru
map(),filter(),sorted()
Evită când:
- Logica e complexă
- Funcția e folosită în mai multe locuri
- E nevoie de documentație
De Reținut
Lambda este utilă pentru funcții simple, dar comprehensions sunt adesea mai citibile. Alege soluția care face codul mai clar.
Întrebări de Verificare
- Care este sintaxa unei funcții lambda?
- Ce face
filter(None, lista)? - De ce are nevoie
reduce()de import? - Când e mai bine să folosești comprehension în loc de map/filter?