Python

Python Menu

Map, Filter, und Reduce sind Paradigmen der funktionalen Programmierung. Sie erlauben es dem Programmierer (also dir), einfacheren, kürzeren Code zu schreiben, ohne sich unbedingt um Feinheiten wie Schleifen und Verzweigungen kümmern zu müssen.

Im Wesentlichen ermöglichen diese drei Funktionen die Anwendung einer Funktion auf eine Reihe von Iterablen auf einen Schlag. map und filter sind in Python eingebaut (im Modul __builtins__) und müssen nicht importiert werden. reduce hingegen muss importiert werden, da es sich im Modul functools befindet. Um ein besseres Verständnis der Funktionsweise zu bekommen, beginnen wir mit map.

Map

Die Funktion map() in Python hat die folgende Syntax:

map(func, *iterables)

Wobei func die Funktion ist, auf die jedes Element in iterables (so viele wie sie sind) angewendet werden würde. Beachte das Sternchen(*) bei iterables? Es bedeutet, dass es so viele iterables wie möglich geben kann, insofern func genau diese Anzahl als erforderliche Eingangsargumente hat. Bevor wir zu einem Beispiel übergehen, ist es wichtig, dass du das Folgende beachtest:

In Python 2 gibt die Funktion "map()" eine Liste zurück. In Python 3 hingegen gibt die Funktion ein map-Objekt zurück, das ein Generator-Objekt ist. Um das Ergebnis als Liste zu erhalten, kann die eingebaute Funktion list() auf dem map-Objekt aufgerufen werden. d.h. list(map(func, *iterables)). Die Anzahl der Argumente für func muss der Anzahl der aufgelisteten Iterablen entsprechen. Sehen wir uns die Anwendung dieser Regeln anhand der folgenden Beispiele an.

Traditioneller Code:

personen = ['alfred', 'tabitha', 'william', 'arla'] obere_Personen = []
for person in personen: personen_ = person.upper() obere_Personen.append(personen_)
print(obere_Personen)

Mit der Funktion map():

personen = ['alfred', 'tabitha', 'william', 'arla']
obere_Personen = list(map(str.upper, personen))
print(obere_Personen)

Ein Beispiel unter Verwendung der Funktionen "round()" und "range()":

kreis_Flächen = [6.56773, 9.57668, 4.00914, 56.24241, 9.01344, 32.00013]
ergebnis = list(map(round, kreis_Flächen, range(1,7)))
print(ergebnis)

Ein Beispiel für die Verwendung der Funktion zip()

meine_zeichen = ['a', 'b', 'c', 'd', 'e'] meine_zahlen = [1,2,3,4,5]
ergebnis = list(zip(meine_zeichen, meine_zahlen))
print(ergebnis)

Filter

Während map() jedes Element in der Iterablen durch eine Funktion durchläuft und das Ergebnis aller Elemente, die die Funktion durchlaufen haben, zurückgibt, verlangt filter() zunächst, dass die Funktion boolesche Werte (wahr oder falsch) zurückgibt, und durchläuft dann jedes Element in der Iterablen durch die Funktion, wobei diejenigen, die falsch sind, "weggefiltert" werden. Sie hat die folgende Syntax:

filter(func, iterable)

Folgende Punkte sind bei filter() zu beachten:

  • Im Gegensatz zu map() wird nur eine Iterable benötigt.
  • Das Argument func muss einen booleschen Typ zurückgeben. Tut es das nicht, gibt filter einfach die übergebene iterable zurück. Da nur eine iterable benötigt wird, ist es implizit, dass func nur ein Argument annehmen muss.
  • filter durchläuft jedes Element in der iterable durch func und gibt nur die Elemente zurück, die als wahr ausgewertet werden.

Beispiel:

noten = [66, 90, 68, 59, 76, 60, 88, 74, 81, 65, 92, 85]
def ist_Musterstudent(score): return score > 80
bestanden = list(filter(ist_Musterstudent, noten))
print(bestanden)

Beispiel:

meineStrings = ("demigod", "rewire", "madam", "fortran", "python", "xamarin", "salas", "PHP")
palindrome = list(filter(lambda wort: wort == wort[::-1], meineStrings))
print(palindrome)

Reduce

reduce wendet eine Funktion mit zwei Argumenten kumulativ auf die Elemente einer Iterablen an, optional beginnend mit einem Anfangsargument. Sie hat die folgende Syntax:

reduce(func, iterable[, initial])

Dabei ist func die Funktion, auf die jedes Element in der iterable kumulativ angewendet wird, und initial ist der optionale Wert, der bei der Berechnung vor die Elemente der iterable gesetzt wird und als Vorgabe dient, wenn die iterable leer ist. Zu reduce() ist Folgendes zu beachten:

  • func benötigt zwei Argumente, von denen das erste das erste Element in iterable ist (wenn initial nicht übergeben wird) und das zweite das zweite Element in iterable. Wenn initial übergeben wird, dann wird es zum ersten Argument von func und das erste Element in iterable wird zum zweiten Element.

Beispiel:

from functools import reduce
meineZahlen = [3, 4, 6, 9, 34, 12]
def benutzerdefinierte_summe(erste, zweite): return erste + zweite
ergebnis = reduce(benutzerdefinierte_summe, meineZahlen) print(ergebnis)

Beispiel mit initial:

from functools import reduce
meineZahlen = [3, 4, 6, 9, 34, 12]
def benutzerdefinierte_summe(erste, zweite): return erste + zweite
ergebnis = reduce(benutzerdefinierte_summe, meineZahlen, 10) print(ergebnis)

Übung

Verwende jeweils map, filter und reduce, um den fehlerhaften Code zu korrigieren.

from functools import reduce
# Verwende map, um das Quadrat jeder Zahl gerundet auszugeben. # auf drei Dezimalstellen meine_floats = [4.35, 6.09, 3.25, 9.77, 2.16, 8.88, 4.59]
# Verwende den Filter, um nur die Namen zu drucken, die kleiner sind als # oder gleich sieben Buchstaben meine_namen = ["olumide", "akinremi", "josiah", "temidayo", "omoseun"]
# Verwende reduce, um das Produkt dieser Zahlen auszugeben. meine_zahlen = [4, 6, 9, 23, 5]
# Korrigiere jeweils alle drei. map_ergebnis = list(map(lambda x: x, meine_floats)) filter_ergebnis = list(filter(lambda name: name, meine_namen, meine_namen)) reduce_ergebnis = reduce(lambda num1, num2: num1 * num2, meine_zahlen, 0)
print(map_ergebnis) print(filter_ergebnis) print(reduce_ergebnis)
from functools import reduce
meine_floats = [4.35, 6.09, 3.25, 9.77, 2.16, 8.88, 4.59] meine_namen = ["Jeff", "Alex", "Jonathan", "Richelle", "Anna"] meine_zahlen = [4, 6, 8, 10, 2]
map_ergebnis = list(map(lambda x: round(x ** 2, 3), meine_floats)) filter_ergebnis = list(filter(lambda name: len(name) <= 7, meine_namen)) reduce_ergebnis = reduce(lambda num1, num2: num1 * num2, meine_zahlen)
print(map_ergebnis) print(filter_ergebnis) print(reduce_ergebnis)
test_output_contains("[18.922, 37.088, 10.562, 95.453, 4.666, 78.854, 21.068]") test_output_contains("['Jeff', 'Alex', 'Anna']") test_output_contains("3840") success_msg("Hervorragend!")

Einführung

Python Basics

Python Advance

Data Science Python Tutorials

Python Eingebaute Funktionen