Ce sunt funcțiile Lambda?
În Python, funcțiile sunt obiecte: pot fi atribuite variabilelor, pot fi returnate de la alte funcții, stocate în liste sau dict și trecute ca parametri pentru alte funcții. Luați în considerare, de exemplu, map()
functie incorporata. Sintaxa sa este map(function, iterable)
și este folosit pentru a aplica cu ușurință function
la fiecare element al iterable
.
map()
returnează de fapt oiterator
obiect. În practică, aruncăm rezultatul ca alist
,tuple
,set
,dict
, etc, oricare este mai convenabil.
Să presupunem că doriți să pătrați fiecare termen dintr-o listă folosindmap()
funcţie. Pentru a face asta, vom defini asquare()
funcția și utilizați-o ca parametru pentrumap()
:
my_list = [1,2,3,4,5]
def square(x):
return x**2
my_modified_list = list(map(square, my_list))
print(my_modified_list)
[1, 4, 9, 16, 25]
Cu toate acestea, dacă singura utilizare a noastră square()
funcția este de a crea această listă, este mai curat să utilizați a lambda
funcţie:
my_list = [1,2,3,4,5]
my_modified_list = list(map(lambda x: x**2, my_list))
print(my_modified_list)
[1, 4, 9, 16, 25]
În Python, lambda
funcțiile sunt funcții anonime care își iau numele și sintaxa din cea a lui Alonzo Church Calcul lambda. Sintaxa lor este:
lambda x_1,..., x_n : expression(x_1, ..., x_n)
Aceasta creează o funcție anonimă care primește ca intrare variabilele x_1, ..., x_n
și returnează evaluat expression(x_1, ..., x_n)
.
Scopul lambda
functions va fi folosit ca parametru pentru functiile care accepta functii ca parametru, asa cum am facut noi map()
de mai sus. Python vă permite să atribuiți un lambda
funcţie la o variabilă, dar Ghid de stil PEP 8 sfătuiește împotriva ei. Dacă doriți să atribuiți o funcție simplă unei variabile, este mai bine să o faceți ca o definiție pe o singură linie. Acest lucru asigură că obiectul rezultat este denumit corect, îmbunătățind lizibilitatea urmăririi:
anonymous_square = lambda x : x**2
def named_square(x): return x**2
print(anonymous_square.__name__)
print(named_square.__name__)
a = anonymous_square
b = named_square
print(a.__name__)
print(b.__name__)
De ce să folosiți funcțiile Lambda?
După ultimul paragraf, s-ar putea să vă întrebați de ce ați dori să utilizați a lambda
funcţie. La urma urmei, orice se poate face cu a lambda
funcția poate fi realizată cu o funcție numită.
Răspunsul la aceasta este că lambda
funcție scop este de a trăi în interiorul unor expresii mai mari reprezentând un calcul. O modalitate de a gândi la acest lucru este prin analogie cu variabilele și valorile. Luați în considerare următorul cod:
x = 2
Variabila x
este un substituent (sau un nume) pentru întregul 2
. De exemplu, sunând print(x)
și print(2)
oferă exact aceeași ieșire. În cazul funcțiilor:
def square(x): return x**2
Funcția square()
este un substituent pentru calcularea punerii la pătrat a unui număr. Acest calcul poate fi scris într-un mod fără nume ca lambda x: x**2
.
În urma acestei digresiuni filozofice, să vedem câteva exemple de aplicații pentru lambda
funcții.
Utilizarea Lambda cu funcția sortat().
sorted()
funcția sortează un iterabil. Acceptă o funcție ca ea key
argument, iar rezultatul funcției aplicate fiecărui element al iterabilului este folosit pentru a ordona elementele.
Acest lucru este perfect potrivit pentru a lambda
funcția: prin setarea key
parametru cu a lambda
functie, putem sorta dupa orice fel de atribut al elementelor. De exemplu, putem sorta o listă de nume după nume:
name_list = ['Grace Hopper', 'Ada Lovelace', 'Emmy Noether', 'Marie Curie']
sorted_by_surname = sorted(name_list, key = lambda x: x.split()[1])
print(sorted_by_surname)
['Marie Curie', 'Grace Hopper', 'Ada Lovelace', 'Emmy Noether']
Utilizarea Lambda cu funcția „filter()”.
filter()
funcția are următoarea sintaxă: filter(function, iterable)
și emite elementele de iterable
care evaluează function(element)
ca adevărat (este asemănător cu un WHERE
clauză în SQL). Putem folosi lambda
funcţionează ca parametri pentru filter()
pentru a selecta elemente dintr-un iterabil.
Luați în considerare următorul exemplu:
num_list = list(range(0,100))
multiples_of_15= filter(lambda x: (x % 3 == 0) and (x % 5 == 0), num_list)
print(list(multiples_of_15))
[0, 15, 30, 45, 60, 75, 90]
filter()
aplică lambda
funcţie lambda x: (x % 3 == 0) and (x % 5 == 0)
la fiecare element al range(0,100)
, și returnează a filter
obiect. Accesăm elementele prin turnarea lui ca list
.
Utilizarea Lambda cu funcția map().
Ultimul nostru exemplu este ceva ce am văzut în introducere – the map()
funcţie. map()
sintaxa funcției este: map(function, iterable)
, și map()
se aplică function
la fiecare element al iterable
, revenind a map
obiect care poate fi accesat prin turnare la a list
.
Am văzut cum acest lucru poate fi aplicat listelor, dar ar putea fi aplicat dictelor folosind dict.items()
metodă:
my_data = {'Mary':1, 'Alice':2, 'Bob':0}
map_obj = map(lambda x: f'{x[0]} had {x[1]} little lamb', my_data.items())
print(', '.join((map_obj)))
Mary had 1 little lamb, Alice had 2 little lamb, Bob had 0 little lamb
sau la un șir:
my_string = 'abcdefg'
''.join(map(lambda x: chr(ord(x)+2),my_string))
'cdefghi'
Consultați ghidul nostru practic și practic pentru a învăța Git, cu cele mai bune practici, standarde acceptate de industrie și fisa de cheat incluse. Opriți căutarea pe Google a comenzilor Git și de fapt învăţa aceasta!
Putem folosi map()
funcția în moduri ingenioase – un exemplu este aplicarea mai multor funcții la aceeași intrare.
De exemplu, să presupunem că creați un API care primește un șir de text și doriți să îi aplicați o listă de funcții.
Fiecare funcție extrage anumite caracteristici din text. Caracteristicile pe care dorim să le extragem sunt numărul de cuvinte, al doilea cuvânt și a patra literă a celui de-al patrulea cuvânt:
def number_of_words(text):
return len(text.split())
def second_word(text):
return text.split()[1]
def fourth_letter_of_fourth_word(text):
return text.split()[3][3]
function_list = [number_of_words, second_word, fourth_letter_of_fourth_word]
my_text = 'Mary had a little lamb'
map_obj = map(lambda f: f(my_text), function_list)
feature_list = list(map_obj)
print(feature_list)
[5, 'had', 't']
Concluzie
În acest ghid, am explorat funcționalitatea lui lambda
funcții în Python. Am văzut asta lambda
funcțiile sunt funcții anonime care trebuie utilizate ca parametru de funcție inline pentru alte funcții. Am văzut câteva cazuri de utilizare, precum și când să nu le folosim.
Când programați, este important să aveți în vedere citatul lui Donald Knuth: „Programele sunt menite să fie citite de oameni și doar întâmplător pentru ca computerele să le execute”. Având în vedere acest lucru, lambda
funcțiile sunt un instrument util pentru a ne simplifica codul, dar ar trebui folosite cu înțelepciune.