PorównaniePorównania

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.

Na tej stronie

Porównanie w tabeli

#
  • Liczba instrukcji w ciele

    lambda
    Jedno wyrażenie
    def
    Dowolna liczba instrukcji
  • Słowo return

    lambda
    Niedozwolone, wynik jest automatyczny
    def
    Wymagane, żeby zwrócić wartość
  • Nazwa funkcji

    lambda
    Brak, pojawia się jako <lambda>
    def
    Własna nazwa, widoczna w śladach błędów
  • Docstring

    def
    Tak
  • Przypisanie do zmiennej

    lambda
    Możliwe, ale niezalecane dla złożonej logiki
    def
    Standardowy sposób definiowania funkcji
  • Typowe użycie

    lambda
    Krótki argument, np. key= w sorted()
    def
    Logika wielokrotnego użytku, dłuższe funkcje

Przykład

#
Python
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)
Wynikzapisany wynik, możesz go sprawdzić
[('Ania', 92), ('Kuba', 78)]
True

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

#
Składnia
lambda parametry: wyrazenie

def nazwa(parametry):
    return wartosc

Więcej przykładów

#
lambda może zawierać tylko jedno wyrażenie
Python
describe = lambda score: "zaliczone" if score >= 60 else "niezaliczone"
print(describe(75))
print(describe(40))
Wynikzapisany wynik, możesz go sprawdzić
zaliczone
niezaliczone
def ma nazwę widoczną w kodzie, lambda nie
Python
def divide(a, b):
    return a / b

divide_lambda = lambda a, b: a / b

print(divide.__name__)
print(divide_lambda.__name__)
Wynikzapisany wynik, możesz go sprawdzić
divide
<lambda>

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) albo operator.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

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.