Funktionen sind in Python Werte wie alle anderen: Du kannst sie in Variablen speichern, in Listen legen und als Argumente an andere Funktionen übergeben. Darauf bauen die Werkzeuge dieses Kapitels auf.
Funktionen als Werte
def verdopple(x):
return x * 2
f = verdopple # ohne Klammern: die Funktion selbst, kein Aufruf
print(f(21))
def wende_an(funktion, wert):
return funktion(wert)
print(wende_an(verdopple, 5))
print(wende_an(str.upper, "hallo"))42 10 HALLO
Lambda: kleine namenlose Funktionen
Ein Lambda-Ausdruck ist eine Funktion in einer Zeile ohne Namen: lambda parameter: ausdruck. Das Ergebnis des Ausdrucks wird automatisch zurückgegeben.
quadrat = lambda x: x * x
addiere = lambda a, b: a + b
print(quadrat(6))
print(addiere(2, 3))
print((lambda s: s.upper())("python"))36 5 PYTHON
Lambdas sind nützlich für kurze Hilfsfunktionen, die du nur einmal brauchst, vor allem als Argument für sorted, max, min, map und filter.
sorted, min und max mit key
woerter = ["Banane", "Kiwi", "Apfel", "Zitrone"]
print(sorted(woerter, key=lambda w: len(w)))
print(max(woerter, key=len))
print(min(woerter, key=lambda w: w[-1]))
personen = [{"name": "Mia", "alter": 25}, {"name": "Tom", "alter": 19}]
juengste = min(personen, key=lambda p: p["alter"])
print(juengste["name"])['Kiwi', 'Apfel', 'Banane', 'Zitrone'] Zitrone Banane Tom
map: auf jedes Element anwenden
map(funktion, sammlung) wendet eine Funktion auf alle Elemente an und liefert einen Iterator (mit list() wird daraus eine Liste):
zahlen = [1, 2, 3, 4]
print(list(map(lambda x: x ** 2, zahlen)))
print(list(map(str, zahlen)))
print(list(map(lambda a, b: a + b, [1, 2], [10, 20])))[1, 4, 9, 16] ['1', '2', '3', '4'] [11, 22]
filter: Elemente auswählen
filter(funktion, sammlung) behält die Elemente, für die die Funktion einen wahren Wert liefert:
zahlen = range(1, 11)
print(list(filter(lambda x: x % 3 == 0, zahlen)))
print(list(filter(None, [0, 1, "", "a", [], [2]]))) # entfernt "falsche" Werte[3, 6, 9] [1, 'a', [2]]
Comprehension oder map/filter?
Dasselbe geht oft mit List Comprehensions, die in Python meist als lesbarer gelten:
zahlen = [1, 2, 3, 4, 5, 6]
print([x ** 2 for x in zahlen if x % 2 == 0])
print(list(map(lambda x: x ** 2, filter(lambda x: x % 2 == 0, zahlen))))[4, 16, 36] [4, 16, 36]
reduce: auf einen Wert zusammenfassen
Aus functools kommt reduce, das eine Liste Schritt für Schritt zu einem Wert verdichtet:
from functools import reduce
print(reduce(lambda a, b: a * b, [1, 2, 3, 4, 5]))
print(reduce(lambda a, b: a + b, ["a", "b", "c"]))120 abc
Für Summen, Minimum und Maximum gibt es aber sum, min und max, die deutlich klarer sind.
Funktionen zurückgeben
Eine Funktion kann eine andere Funktion erzeugen (Funktionsfabrik):
def multiplikator(faktor):
return lambda x: x * faktor
mal3 = multiplikator(3)
mal10 = multiplikator(10)
print(mal3(7), mal10(7))21 70
Merke
- Funktionen sind Werte: speicherbar, übergebbar, zurückgebbar
lambda x: ausdruckist eine kleine namenlose Funktionkey=beisorted,min,maxnimmt eine Funktionmapwendet an,filterwählt aus,reducefasst zusammen- Comprehensions sind oft lesbarer als
map/filter
Aufgabe
Sortiere die Liste [(1, "b"), (3, "a"), (2, "c")] einmal nach der Zahl und einmal nach dem Buchstaben.