Funkcje lambda w Pythonie

Czym są funkcje lambda?

â € <
W Pythonie funkcje są obiektami: mogą być przypisywane do zmiennych, mogą być zwracane z innych funkcji, przechowywane na listach lub dyktatach i przekazywane jako parametry dla innych funkcji. Weźmy na przykład pod uwagę map() wbudowana funkcja. Jego składnia jest map(function, iterable) i służy do wygodnej aplikacji function do każdego elementu iterable.

map() faktycznie zwraca iterator obiekt. W praktyce rzutujemy wynik jako a list, tuple, set, dictitp., w zależności od tego, co jest wygodniejsze.
â € <
Załóżmy, że chcesz wyrównać do kwadratu każdy składnik listy za pomocą funkcji map() funkcjonować. W tym celu zdefiniujemy a square() funkcję i użyj jej jako parametru dla 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]

â € <
Jeśli jednak jedynym zastosowaniem naszego square() funkcją jest utworzenie tej listy, czystsze jest użycie a lambda funkcjonować:

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]

W Pythonie lambda funkcje są anonimowymi funkcjami, które biorą swoją nazwę i składnię od Alonzo Churcha rachunek lambda. Ich składnia to:

lambda x_1,..., x_n : expression(x_1, ..., x_n)

Tworzy to anonimową funkcję, która otrzymuje jako dane wejściowe zmienne x_1, ..., x_n i zwraca ocenione expression(x_1, ..., x_n).
â € <
Celem lambda functions ma być używany jako parametr dla funkcji, które akceptują funkcje jako parametr, tak jak zrobiliśmy to z map() powyżej. Python pozwala przypisać a lambda funkcję do zmiennej, ale Przewodnik po stylu PEP 8 odradza to. Jeśli chcesz przypisać zmiennej prostą funkcję, lepiej zrobić to jako definicję jednowierszową. Zapewnia to, że wynikowy obiekt ma odpowiednią nazwę, poprawiając czytelność śledzenia wstecznego:

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__)

Dlaczego warto używać funkcji lambda?

Po ostatnim akapicie możesz się zastanawiać, dlaczego chcesz użyć a lambda funkcjonować. W końcu wszystko, co można zrobić z lambda funkcję można wykonać za pomocą nazwanej funkcji.
â € <
Odpowiedź na to jest taka lambda Funkcje cel jest żyć wewnątrz większych wyrażeń reprezentujących obliczenia. Jednym ze sposobów myślenia o tym jest analogia ze zmiennymi i wartościami. Rozważ następujący kod:

x = 2

Zmienna x jest symbolem zastępczym (lub nazwą) liczby całkowitej 2. Na przykład dzwoniąc print(x) i print(2) daje dokładnie ten sam wynik. W przypadku funkcji:

def square(x): return x**2

Funkcja square() jest symbolem zastępczym do obliczania kwadratu liczby. To obliczenie można zapisać w bezimienny sposób jako lambda x: x**2.
â € <
Podążając za tą filozoficzną dygresją, zobaczmy kilka przykładów zastosowań dla lambda funkcje.
â € <

Używanie lambdy z funkcją sorted().

Połączenia sorted() funkcja sortuje obiekt iterowalny. Akceptuje funkcję jako swoją key argument, a wynik funkcji zastosowanej do każdego elementu iterowalnego jest używany do uporządkowania elementów.
â € <
To doskonale pasuje do lambda funkcja: ustawiając key parametr z a lambda funkcji możemy sortować według dowolnego rodzaju atrybutu elementów. Na przykład możemy posortować listę imion według nazwiska:

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']

Używanie Lambdy z funkcją „filter()”.

Połączenia filter() funkcja ma następującą składnię: filter(function, iterable) i wyprowadza elementy iterable które oceniają function(element) jako prawda (jest podobny do an WHERE klauzula w SQL). Możemy użyć lambda działa jako parametry dla filter() aby wybrać elementy z iterowalnego.

Rozważ następujący przykład:

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() stosuje lambda funkcjonować lambda x: (x % 3 == 0) and (x % 5 == 0) do każdego elementu range(0,100)i zwraca a filter obiekt. Uzyskujemy dostęp do elementów, rzucając je jako list.
â € <

Używanie Lambdy z funkcją map().

â € <
Nasz ostatni przykład to coś, co widzieliśmy we wstępie — plik map() funkcjonować. The map() składnia funkcji to: map(function, iterable), map() dotyczy function do każdego elementu iterable, powrót A map obiekt, do którego można uzyskać dostęp przez rzutowanie na a list.

Widzieliśmy, jak można to zastosować do list, ale można to zastosować do dykt za pomocą dict.items() metoda:

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

lub do ciągu:

my_string = 'abcdefg'
''.join(map(lambda x: chr(ord(x)+2),my_string))
'cdefghi'

Zapoznaj się z naszym praktycznym, praktycznym przewodnikiem dotyczącym nauki Git, zawierającym najlepsze praktyki, standardy przyjęte w branży i dołączoną ściągawkę. Zatrzymaj polecenia Google Git, a właściwie uczyć się to!

Możemy użyć map() funkcji w pomysłowy sposób — jednym z przykładów jest zastosowanie wielu funkcji do tego samego wejścia.

Załóżmy na przykład, że tworzysz interfejs API, który otrzymuje ciąg tekstowy i chcesz zastosować do niego listę funkcji.

Każda funkcja wyodrębnia jakąś cechę z tekstu. Cechy, które chcemy wyodrębnić, to liczba słów, drugie słowo i czwarta litera czwartego słowa:

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']

â € <

Wnioski

â € <
W tym przewodniku zbadaliśmy funkcjonalność lambda funkcje w Pythonie. Widzieliśmy to lambda funkcje są funkcjami anonimowymi, które mają być używane jako parametr funkcji wbudowanej dla innych funkcji. Widzieliśmy kilka przypadków użycia, a także kiedy ich nie używać.
â € <
Podczas programowania należy pamiętać o cytacie Donalda Knutha: „Programy mają być odczytywane przez ludzi i tylko przypadkowo wykonywane przez komputery”. Mając to na uwadze, lambda Funkcje są użytecznym narzędziem do uproszczenia naszego kodu, ale należy ich używać mądrze.

Znak czasu:

Więcej z Nadużycie stosu