Funcții Lambda în Python

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 o iterator obiect. În practică, aruncăm rezultatul ca a list, tuple, set, dict, etc, oricare este mai convenabil.

Să presupunem că doriți să pătrați fiecare termen dintr-o listă folosind map() funcţie. Pentru a face asta, vom defini a square() funcția și utilizați-o ca parametru pentru map():

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**2def named_square(x): return x**2print(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.

Timestamp-ul:

Mai mult de la Stackabuse