(c) 2023 Technische Hochschule Augsburg - Fakultät für Informatik - Prof.Dr.Nik Klever - Impressum
Mit dem Lambda-Schlüsselwort können kleine anonyme Funktionen angelegt werden. Die folgende Funktion gibt die Summe ihrer beiden Argumente zurück: lambda a, b: a + b. Lambda-Funktionen können überall dort eingesetzt werden, wo Funktionsobjekte benötigt werden. Sie sind syntaktisch auf einen einzigen Ausdruck beschränkt. Semantisch sind sie nur syntaktischer Zucker für eine normale Funktionsdefinition. Wie verschachtelte Funktionsdefinitionen können Lambda-Funktionen auf Variablen aus dem umgebenden Bereich verweisen:
def make_incrementor(n):
return lambda x: x + n
f = make_incrementor(42)
x=f(0)
print(x)
42
y=f(1)
print(y)
43
Das obige Beispiel verwendet einen Lambda-Ausdruck, um eine Funktion zurückzugeben. Eine weitere Verwendung ist, eine Lambda-Ausdruck als Argument zu übergeben:
pairs = [(1, 'eins'), (2, 'zwei'), (3, 'drei'), (4, 'vier')]
pairs.sort(key=lambda pair: pair[1])
print(pairs)
[(3, 'drei'), (1, 'eins'), (4, 'vier'), (2, 'zwei')]
Schauen wir uns detaillierter Builtin-Funktionen an, die oft mit Iteratoren verwendet werden. Zwei von Pythons Builtin-Funktionen, map() und filter() duplizieren die Features von Generatorausdrücken:
map(f, iterA, iterB, ...) gibt einen Iterator über eine Sequenz zurück:
f(iterA[0], iterB[0], ...), f(iterA[1], iterB[1], ...), f(iterA[2], iterB[2], ...), ....
Wichtig bei map ist, dass es genau soviele Iterator-Objekte geben muss, wie die Funktion f Argumente benötigt !
# Funktionalität von map()
def upper(s):
return s.upper()
x=list(map(upper, ['sentence', 'fragment']))
print(x)
['SENTENCE', 'FRAGMENT']
Mit einer List Comprehension kann natürlich der gleiche Effekt erzielt werden:
y=[upper(s) for s in ['sentence', 'fragment']]
print(y)
['SENTENCE', 'FRAGMENT']
%%Mooc MoocStringAssessment
Es ist das folgenden Dictionary pairs und die Liste order gegeben::
pairs = {'zwei':"zweites Element", 'vier':"viertes Element", 'eins':"erstes Element", 'drei':"drittes Element"}
order = ["eins","zwei","drei","vier"]
print(dict(map(lambda a: (a,pairs[a]),order)))
%%Mooc MoocStringAssessment
Es ist das folgenden Dictionary pairs und die Liste order gegeben::
pairs = {'zwei':"zweites Element", 'vier':"viertes Element", 'eins':"erstes Element", 'drei':"drittes Element"}
order = ["eins","zwei","drei","vier"]
print(dict(map(lambda a,b: (a,b),order,pairs.values())))
filter(predicat, iter) gibt einen Iterator über alle Elemente einer Sequenz zurück, die eine bestimmte Bedingung predicat erfüllen. predicat ist eine Funktion, die den Wahrheitswert einer Bedingung zurückgibt; um ein predicat mit filter() verwenden zu können. muss es einen einzigen booleschen Wert zurückliefern.
def is_even(x):
return (x % 2) == 0
x=list(filter(is_even, range(10)))
print(x)
[0, 2, 4, 6, 8]
Analog wie bei map kann mit einer List Comprehension der gleiche Effekt erzielt werden:
y=list(x for x in range(10) if is_even(x))
print(y)
[0, 2, 4, 6, 8]
enumerate(iter) zählt die Elemente in dem iterierbaren iter-Objekt, wobei ein Tupel mt 2 Elementen, dem Zählwert sowie jedem Element zurückgegeben werden.
for item in enumerate(['subject', 'verb', 'object']):
print(item)
(0, 'subject') (1, 'verb') (2, 'object')
enumerate() wird häufig beim Durchlaufen einer Liste und der Verwendung der Indizes, wenn bestimmte Bedingungen erfüllt sind:
f = """Dies ist ein mehrzeiliger
Text mit einer
Leerzeile dazwischen""".split("\n")
for i, line in enumerate(f):
if line.strip() == '':
print('Leerzeile in Zeile #%i' % i)
Leerzeile in Zeile #2
%%Mooc MoocStringAssessment
Es ist die folgende Liste elemente gegeben:
elemente = ["zweites Element", "viertes Element", "erstes Element", "drittes Element"]
print(dict(enumerate(elemente)))
sorted(iterable, key=None, reverse=False) sammelt alle Elemente des iterable-Objekts in eine Liste, sortiert die Liste und gibt das sortierte Ergebnis zurück. Die Schlüssel- und Reverse-Argumente werden an die sort()-Methode der konstruierten Liste übergeben.
import random
# Generate 8 random numbers between [0, 10000)
rand_list = random.sample(range(10000), 8)
print(rand_list)
[2189, 1269, 3549, 9195, 9522, 2649, 802, 1833]
x=sorted(rand_list)
print(x)
[802, 1269, 1833, 2189, 2649, 3549, 9195, 9522]
y=sorted(rand_list, reverse=True)
print(y)
[9522, 9195, 3549, 2649, 2189, 1833, 1269, 802]
(Für eine ausführlichere Beschreibung der Sortierung siehe die Sorting HOWTO).
Die Builtin-Funktionen any(iter) und all(iter) betrachten die Wahrheitswerte der Elemente des iterierbaren Objektes iterable. any() gibt True zurück, wenn ein Element in iterable ein wahrer Wert ist und all() gibt True zurück, wenn alle Elemente wahr sind:
x=any([0,1,0])
print(x)
True
y=any([0,0,0])
print(y)
False
z=any([1,1,1])
print(z)
True
x=all([0,1,0])
print(x)
False
y=all([0,0,0])
print(y)
False
z=all([1,1,1])
print(z)
True
zip(iterA, iterB, ...) nimmt ein Element aus jedem iterierbaren Objekt iterA, iterB, etc. und gibt sie in einem entsprechenden Tupel zurück:
x=zip(['a', 'b', 'c'], (1, 2, 3))
print(list(x))
[('a', 1), ('b', 2), ('c', 3)]
zip konstruiert keine Liste im Memory und geht nicht alle Iterator-Objekte iterA, iterB, etc. bis zu deren Ende durch, stattdessen werden die Tupel nur konstruiert und zurückgegeben, wenn sie angefordert werden (z.B. über list() - der Fachbegriff für dieses Verhalten ist "faule Berechnung" (lazy evaluation))
Die Funktion zip wird üblicherweise mit Iterator-Objekte der gleichen Länge verwendet. Wenn die Iterator-Objekte verschieden lang sind, wird das resultierende Iterator-Objekt die gleiche Länge wie das kürzeste Iterator-Objekt haben:
x=zip(['a', 'b'], (1, 2, 3))
print(list(x))
[('a', 1), ('b', 2)]
Man sollte unterschiedliche Längen der Iterator-Objekte vermeiden, da Elemente aus den längeren Iteratoren herausgenommen und gelöscht werden kann. Dies bedeutet, dass an dieser Stelle die Iteration beendet werden sollte um nicht in Gefahr zu laufen, ein gelöschtes Element zu überspringen.
%%Mooc MoocStringAssessment
Es ist die folgende Liste elemente gegeben:
elemente = ["zweites Element", "viertes Element", "erstes Element", "drittes Element"]
order = ["eins","zwei","drei","vier"]
print(dict(zip(order,elemente)))
%%Mooc MoocStringAssessment
Testen sie ihr Ergebnis an dem folgenden Code und dem Ergebnis des enumerate-Beispiels von oben
elemente = ["zweites Element", "viertes Element", "erstes Element", "drittes Element"]
print(dict(enumerate(elemente)))
%%Mooc Video
%%Mooc WebReference
https://docs.python.org/3/howto/functional.html
Hinweis: Grundlagen und Einführung in die funktionale Programmierung von Python
%%Mooc WebReference
https://docs.python.org/3/howto/sorting.html
Hinweis: Grundlagen und Einführung in die Sortierung von Python