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 zwracaiterator
obiekt. W praktyce rzutujemy wynik jako alist
,tuple
,set
,dict
itp., w zależności od tego, co jest wygodniejsze.
â € <
Załóżmy, że chcesz wyrównać do kwadratu każdy składnik listy za pomocą funkcjimap()
funkcjonować. W tym celu zdefiniujemy asquare()
funkcję i użyj jej jako parametru dlamap()
:
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**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__)
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.