lambda vs def
lambda tworzy krótką, anonimową funkcję z jednym wyrażeniem, a def definiuje nazwaną funkcję, która może mieć wiele instrukcji, wartości domyślne i docstring.
Porównanie w tabeli
#Liczba instrukcji w ciele
Słowo return
Nazwa funkcji
Docstring
Przypisanie do zmiennej
Typowe użycie
Przykład
#students = [("Ania", 92), ("Kuba", 78)]
by_score_lambda = sorted(students, key=lambda s: s[1], reverse=True)
def by_score(student):
return student[1]
by_score_def = sorted(students, key=by_score, reverse=True)
print(by_score_lambda)
print(by_score_lambda == by_score_def)Definicja i zastosowanie
#Obie tworzą funkcję, którą można wywołać, przekazać dalej jako argument albo przypisać do zmiennej. W obu przypadkach parametry działają tak samo: pozycyjne, nazwane, z wartościami domyślnymi.
Różnią się tym, co mogą zawierać. Po lambda stoi tylko jedno wyrażenie, którego wynik jest automatycznie zwracany, bez słowa return i bez miejsca na instrukcje warunkowe czy pętle. def otwiera wcięty blok, w którym zmieści się dowolna liczba instrukcji, z własnymi return, if i pętlami, a także docstringiem. Funkcja z def ma własną nazwę, która pojawia się w śladach błędów, a lambda widnieje tam jako <lambda>.
Użyj lambda, gdy funkcja jest krótka i potrzebna tylko w jednym miejscu, najczęściej jako argument, np. key= w sorted() albo funkcja w map(). Użyj def, gdy logika jest dłuższa, zajmuje więcej niż jedną linię, powinna mieć nazwę i docstring, albo gdy używasz jej w kilku miejscach.
Składnia
#lambda parametry: wyrazenie
def nazwa(parametry):
return wartoscWięcej przykładów
#describe = lambda score: "zaliczone" if score >= 60 else "niezaliczone"
print(describe(75))
print(describe(40))def divide(a, b):
return a / b
divide_lambda = lambda a, b: a / b
print(divide.__name__)
print(divide_lambda.__name__)Dobre praktyki
#- Jeśli lambda robi się długa albo zagnieżdżona, zamień ją na zwykłą funkcję przez
def. Będzie czytelniejsza i łatwiejsza do testowania. - Przy sortowaniu po polu rozważ też
operator.itemgetter(1)albooperator.attrgetter("points")zamiast lambdy. - Nie przypisuj lambdy do zmiennej tylko po to, żeby dać jej nazwę (
f = lambda x: x + 1). Lepiej od razu napisaćdef f(x): return x + 1.
Powiązane hasła
#- lambdaKrótka funkcja anonimowa zapisana w jednym wyrażeniu.
- defDefiniuje funkcję: nazwany blok kodu z parametrami, który można wywoływać wielokrotnie.
- sorted()Zwraca nową, posortowaną listę z elementów dowolnej kolekcji.
- map()Wywołuje funkcję dla każdego elementu i zwraca iterator wyników.
- filter()Zwraca iterator elementów, dla których funkcja zwraca prawdę.
Widzisz błąd albo brakuje przykładu? Napisz do nas.