Cum să utilizați funcțiile Lambda în Python [With Examples]

În acest material educativ, vei explora în profunzime funcțiile lambda în Python, de la structura sintactică la diversele lor utilizări, acompaniate de exemple de cod relevante.

În Python, funcțiile lambda reprezintă funcții anonime, caracterizate printr-o sintaxă simplificată și o integrare facilă cu alte funcții predefinite. La finalul acestui ghid, vei fi capabil să creezi funcții lambda și să determini momentele optime de utilizare, în comparație cu funcțiile Python tradiționale.

Să începem explorarea!

Funcția Lambda în Python: Sintaxă și Ilustrații

Prezentăm sintaxa generală pentru definirea unei funcții lambda în Python:

lambda parametru(i):valoare returnată

În sintaxa menționată anterior:

  • Cuvântul cheie „lambda” inițiază definirea unei funcții lambda, urmat de unul sau mai mulți parametri pe care funcția îi va accepta.
  • Două puncte separă parametrii de valoarea pe care funcția o returnează.

💡 În procesul de definire a unei funcții lambda, este esențial ca valoarea returnată să fie calculată printr-o expresie evaluată pe o singură linie de cod. Această cerință va deveni mai clară odată cu analizarea exemplelor practice.

Exemple de Funcții Lambda în Python

Cea mai eficientă metodă de a înțelege funcțiile lambda este de a le analiza prin rescrierea funcțiilor Python standard în format lambda.

👩🏽‍💻 Te încurajăm să scrii codul prezentat într-un mediu REPL Python sau în editorul online Python de pe tipstrick.ro.

#1. Să analizăm funcția square(), care acceptă un număr, num, ca argument și returnează pătratul acestuia.

def square(num):
        return num*num

Poți testa funcția cu diferite argumente pentru a-i verifica funcționalitatea:

>>> square(9)
81
>>> square(12)
144

Această expresie lambda poate fi atribuită unei variabile, cum ar fi „patrat1”, pentru o definire mai succintă: patrat1 = lambda num: num*num, permițând ulterior apelarea funcției „patrat1” cu diverse valori. Cu toate acestea, având în vedere că funcțiile lambda sunt anonime, ar trebui evitată atribuirea lor unor variabile.

În cazul funcției square(), „num” este parametrul, iar „num*num” este valoarea returnată. Aceste componente se pot combina într-o expresie lambda, care poate fi apelată direct, după cum urmează:

>>> (lambda num: num*num)(2)
4

Acest model ilustrează conceptul de funcție imediat invocată, unde funcția este apelată imediat după ce este definită.

#2. În continuare, să transformăm o altă funcție simplă, add(), care primește două numere, num1 și num2, și returnează suma lor.

def add(num1,num2):
        return num1 + num2

Să apelăm funcția add() cu câteva perechi de numere:

>>> add(4,3)
7
>>> add(12,5)
17
>>> add(12,6)
18

În această funcție, num1 și num2 sunt parametrii, iar num1 + num2 este valoarea returnată.

>>> (lambda num1, num2: num1 + num2)(3,7)
10

Funcțiile Python pot accepta și valori implicite pentru parametri. Să modificăm funcția add() și să setăm valoarea implicită a parametrului num2 la 10.

def add(num1, num2=10):
        return num1 + num2

În apelurile de funcție de mai jos:

  • În primul apel, num1 este 1, iar num2 este 3. Atunci când se specifică valoarea pentru num2 la apelarea funcției, această valoare este folosită, iar funcția returnează 4.
  • Dacă este furnizat un singur argument (num1 este 7), valoarea implicită 10 este atribuită lui num2, iar funcția va returna 17.
>>> add(1,3)
4
>>> add(7)
17

Când creezi funcții cu parametri care au valori implicite, acestea pot fi specificate direct în expresia lambda.

>>> (lambda num1, num2 = 10: num1 + num2)(1)
11

Când este Recomandată Utilizarea Funcțiilor Lambda în Python?

Acum că ai înțeles principiile de bază ale funcțiilor lambda în Python, iată câteva situații specifice în care acestea se dovedesc utile:

  • Funcțiile lambda sunt ideale când ai nevoie de o funcție simplă, al cărei rezultat este calculat pe o singură linie de cod și care nu este necesară în altă parte a modulului. Am oferit câteva exemple practice care vor clarifica acest aspect.
  • Funcțiile lambda sunt perfecte pentru utilizare cu funcții predefinite precum map(), filter() și reduce().
  • De asemenea, funcțiile lambda facilitează sortarea structurilor de date, cum ar fi listele și dicționarele.

Utilizarea Funcțiilor Lambda cu Funcții Predefinite în Python

1. Funcția Lambda în Combinare cu map()

Funcția map() aplică o funcție specifică fiecărui element dintr-o structură iterabilă. Sintaxa generală este următoarea:

Să generăm o listă de numere și să folosim funcția map() pentru a crea o altă listă care conține pătratul fiecărui număr din lista originală. Funcția lambda va defini operația de ridicare la pătrat.

>>> nums = [4,5,6,9]
>>> list(map(lambda num:num*num,nums))
[16, 25, 36, 81]

Întrucât funcția map() returnează un obiect de tip map, este necesar să-l transformăm într-o listă.

▶️ Vezi acest tutorial despre funcția map() în Python.

2. Funcția Lambda în Conexiune cu filter()

Să presupunem că avem următoarea listă de numere:

>>> nums = [4,5,6,9]

Să presupunem că dorim să filtrăm această listă și să reținem doar numerele impare.

Pentru aceasta, putem folosi funcția încorporată filter() din Python.

Funcția filter() acceptă o condiție și o structură iterabilă: filter(condiție, iterabil). Rezultatul include doar elementele care îndeplinesc condiția specificată. Rezultatul poate fi transformat într-un obiect iterabil, cum ar fi o listă.

Pentru a filtra numerele pare, trebuie să reținem doar numerele impare. În acest caz, expresia lambda ar fi lambda num: num%2!=0. Operația num%2 calculează restul împărțirii lui num la 2.

  • Expresia num%2!=0 este adevărată când num este impar.
  • Expresia num%2!=0 este falsă când num este par.
>>> nums = [4,5,6,9]
>>> list(filter(lambda num:num%2!=0,nums))
[5, 9]

3. Integrarea Funcției Lambda cu reduce()

Funcția reduce() operează pe o structură iterabilă și o funcție. Aceasta reduce structura iterabilă prin aplicarea repetată a funcției pe elementele sale.

Pentru a utiliza funcția reduce(), trebuie să o importăm din modulul functools, care este inclus în Python:

>>> from functools import reduce

Să utilizăm funcția reduce() pentru a calcula suma tuturor numerelor din listă. Definind o expresie lambda: lambda num1,num2:num1+num2, ca funcție de reducere, vom putea realiza acest lucru.

Operația de reducere se desfășoară astfel: f(f(f(4,5),6),9) = f(f(9,6),9) = f(15,9) = 24. Aici, f reprezintă operația de însumare a două elemente din listă, definită de funcția lambda.

>>> from functools import reduce
>>> nums = [4,5,6,9]
>>> reduce(lambda num1,num2:num1+num2,nums)
24

Personalizarea Sortării cu Funcții Lambda în Python

Pe lângă utilizarea funcțiilor lambda cu funcții predefinite ca map(), filter() și reduce(), le putem utiliza și pentru a particulariza funcțiile și metodele utilizate în sortare.

1. Sortarea Listelor în Python

În manipularea listelor Python, adesea este necesară sortarea lor pe baza unor criterii specifice. Metoda încorporată sort() poate fi utilizată pentru sortarea listelor direct, în timp ce funcția sorted() creează o copie sortată a listei.

Sintaxa funcției sorted() este: sorted(iterabil, cheie=…, invers=True | False).

– Parametrul cheie este folosit pentru a personaliza criteriile de sortare.
– Parametrul invers controlează ordinea sortării (crescătoare sau descrescătoare). Valoarea implicită este False.

În cazul sortării numerelor sau șirurilor de caractere, ordinea implicită este cea crescătoare sau alfabetică. Totuși, pot exista situații în care un criteriu de sortare personalizat este necesar.

Să considerăm următoarea listă de fructe. Să presupunem că dorim să obținem o copie sortată a acestei liste, ordonată după numărul aparițiilor caracterului „p” în fiecare șir, în ordine descrescătoare.

>>> fruits = ['apple','pineapple','grapes','mango']

Este momentul să utilizăm parametrul cheie. Întrucât un șir este o structură iterabilă, putem folosi metoda .count() pentru a afla numărul aparițiilor unui anumit caracter. Prin urmare, setăm parametrul cheie la lambda x:x.count(‘p’) astfel încât sortarea să se bazeze pe numărul de apariții ale literei ‘p’.

>>> fruits = ['apple','pineapple','grapes','mango']
>>> sorted(fruits,key=lambda x:x.count('p'),reverse=True)
['pineapple', 'apple', 'grapes', 'mango']

În acest exemplu:

  • Criteriul de sortare este numărul de apariții ale caracterului „p”, definit de o expresie lambda.
  • Întrucât parametrul „invers” a fost setat la True, sortarea are loc în ordine descrescătoare a numărului de apariții ale literei „p”.

În lista de fructe, „ananas” conține 3 apariții ale literei „p”, în timp ce „măr”, „struguri” și „mango” conțin 2, 1, respectiv 0 apariții ale aceleiași litere.

Înțelegerea Sortării Stabile

Să luăm un alt exemplu, folosind același criteriu de sortare. Redefinim lista de fructe. În acest caz, litera „p” apare de două ori în „măr”, respectiv o dată în „struguri” și nu apare deloc în „mango” și „pepene galben”.

>>> fruits = ['mango','apple','melon','grapes']
>>> sorted(fruits,key=lambda x:x.count('p'),reverse=True)
['apple', 'grapes', 'mango', 'melon']

În lista rezultată, „mango” precede „pepene galben”, chiar dacă ambele nu conțin litera „p”. Motivul este că funcția sorted() realizează o sortare stabilă; astfel, atunci când numărul de apariții al literei „p” este același pentru două șiruri, ordinea elementelor din lista originală este păstrată.

Pentru un exercițiu rapid, inversează pozițiile „mango” și „pepene galben” în lista de fructe, sortează lista folosind același criteriu și observă rezultatul.

▶️ Află mai multe despre sortarea listelor în Python.

2. Sortarea Dicționarelor în Python

Funcțiile lambda pot fi utilizate și în sortarea dicționarelor Python. Să analizăm dicționarul price_dict, care include articole și prețurile lor.

>>> price_dict = {
... 'Milk':10,
... 'Honey':15,
... 'Bread':7,
... 'Candy':3
... }

Pentru a obține perechile cheie-valoare dintr-un dicționar ca o listă de tuple, putem utiliza metoda încorporată a dicționarului .items():

>>> price_dict_items = price_dict.items()
dict_items([('Milk', 10), ('Honey', 15), ('Bread', 7), ('Candy', 3)])

În Python, toate obiectele iterabile (liste, tuple, șiruri de caractere etc.) folosesc indexarea de la zero. Prin urmare, primul element are indexul 0, al doilea are indexul 1, și așa mai departe.

Dorim să sortăm articolele după valoarea lor, care reprezintă prețul. În fiecare tuple din lista price_dict_items, prețul se află pe poziția cu indexul 1. Prin urmare, setăm parametrul cheie la lambda x:x[1], deoarece el va utiliza valoarea de la indexul 1 (prețul) pentru a sorta dicționarul.

>>> dict(sorted(price_dict_items,key=lambda x:x[1]))
{'Candy': 3, 'Bread': 7, 'Milk': 10, 'Honey': 15}

În rezultat, articolele din dicționar au fost sortate în ordine crescătoare a prețurilor, începând cu „Bomboane”, care costă 3 unități, și terminând cu „Mierea”, care are prețul de 15 unități.

▶️ Consultă acest ghid detaliat despre sortarea dicționarelor Python după cheie și valoare, pentru mai multe informații.

Concluzie

Și iată-l! Ai învățat cum să creezi funcții lambda și să le folosești eficient cu alte funcții predefinite din Python. Iată o recapitulare a principalelor idei:

  • În Python, funcțiile lambda sunt anonime și pot accepta mai multe argumente, returnând o singură valoare; expresia care generează această valoare trebuie să se încadreze într-o singură linie de cod. Ele simplifică și scurtează definirea funcțiilor mici.
  • Sintaxa unei funcții lambda este: lambda parametru(i): valoare returnată.
  • Printre utilizările importante se numără colaborarea cu funcțiile map(), filter() și reduce(), dar și folosirea ca parametru cheie pentru sortarea structurilor iterabile.

În continuare, vei descoperi cum să efectuezi împărțirea întreagă (floor division) în Python.