🧩 Funktionen in Python – Code wiederverwenden und strukturieren#
🔹 Warum Funktionen?#
Motivation:
Vermeide Wiederholung
Mache Code verständlicher
Ermögliche Wiederverwendung
# Schlechter Stil: Wiederholung
print("Hallo, Max!")
print("Hallo, Lisa!")
# Besser:
def begruessung(name):
print("Hallo,", name)
begruessung("Max")
begruessung("Lisa")
🔹 Funktionen definieren und aufrufen#
def quadrat(x):
return x * x
ergebnis = quadrat(5)
print(ergebnis) # 25
🔹 Funktionen ohne Rückgabewert#
def begruessung(name):
print("Hallo", name)
🔹 Funktionen mit mehreren Rückgabewerten#
Du kannst eine Funktion ein Tupel zurückgeben lassen wenn Du mehrere Rückgabewerte hast
def rechnung(a, b):
return a + b, a * b
summe, produkt = rechnung(3, 4)
🔹 Standardwerte für Funktionsparameter#
def hallo(name="Welt"):
print("Hallo,", name)
hallo() # → Hallo, Welt
hallo("Anna") # → Hallo, Anna
⚠️ Achtung: Parameter mit Standardwerten dürfen immer nur nach Parameter ohne solche stehen.
def foo(a, b=3): # Das ist ok
return a * b
def bar(a=3, b): # Das ist nicht ok
return a * b
🔹 Globale vs. Lokale Variablen#
x = 5 # Dies ist eine globale Variable
def test():
x = 10 # Dies ist eine lokale Variable
print("In Funktion:", x)
test()
print("Außerhalb:", x)
Man kann eine globale Variable in den lokalen “scope” ziehen um sie zu verwenden.
x = 5 # Dies ist eine globale Variable
def test():
global x # Hierdurch wird die globale Variable x verwendet
x = 10 # Jetzt wird die globale Variable x überschrieben
print("In Funktion:", x)
test()
print("Außerhalb:", x)
⚠️ Achtung: Da dies unerwünschte Nebeneffekte haben kann die schwer zu debuggen sind sollte dies, wo immer möglich, vermieden werden.
🔹Funktionen sind First Class Citizens#
In Python sind Funktionen eigenständige Objekte die dann wiederum z.B. einer Variable zugewiesen werden können bzw. als Rückgabewert oder Parameter einer anderen Funktion verwendet werden können.
def add(a, b):
return a + b
def sub(a, b):
return a - b
def calc(a, b, func):
return f"Das Ergebniss ist {func(a, b)}"
def auswahl():
while True:
wahl = input("Möchte Sie addieren (a) oder subtrahieren (s)?")
if wahl == "a":
return add
if wahl == "s":
return sub
func = auswahl()
print(calc(3,4, func))
🔹 map
und filter
#
Die map() Funktion iteriert über einen Iterator und ruft die angegebene Funktion für jedes Element auf. Sie liefert dann einen neuen Iterator, welche die entsprechenden Rückgabewerte enthält.
def count_vokale(text):
vokale = ['a', 'e', 'i', 'o', 'u']
text = text.lower()
count = 0
for vokal in vokale:
count += text.count(vokal)
return count
for x in map(count_vokale, ['apple', 'banana', 'cherry']):
print(x)
Die filter Funktion iteriert über einen Iterator und ruft die angegebene Funktion für jedes Element auf. Sie liefert dann einen neuen Iterator, welcher nur diejenigen Elemente enthält für die die Funktion True
liefert.
def isPrim(zahl):
for teiler in range(2, zahl):
if zahl % teiler == 0:
return False
return True
for primzahlen in filter(isPrim, range(100)):
print(primzahlen)
🔹 Anonyme lambda
-Funktionen#
Lambda-Funktionen sind anonyme, also namenlose Funktionen, die man direkt inline schreiben kann:
lambda parameter: ausdruck
Beispiel 1: Nur Wörter mit mehr als 4 Buchstaben
woerter = ["Apfel", "Ei", "Bananenbrot", "Hund"]
lange = list(filter(lambda w: len(w) > 4, woerter))
# → ['Apfel', 'Bananenbrot']
Beispiel 2: Quadrate berechnen
zahlen = [2, 3, 5, 7, 11, 13, 17]
quadrate = map(lambda x: x * x, zahlen)
for zahl, quadrat in zip(zahlen, quadrate):
print(f"Das Quadrat von {zahl} ist {quadrat}")
Beispiel 3: Schlüsselelement zum sortieren auswählen
personen = [("Max", 20), ("Anna", 25), ("Ben", 19)]
personen.sort(key=lambda x: x[1])
# → [('Ben', 19), ('Max', 20), ('Anna', 25)]
🧪 Übungsaufgabe: Fakultät#
Schreibe eine Funktion fakultaet
welche rekursiv die Fakultaet berechnet, also
für \(n > 1\) und \(1! = 1\) (Abbruchbedingung).
🎓 Mini-Projekt: Vektoren der Länge nach sortieren#
Schreibe ein kleines Programm welches den Nutzer mehrere zwei-dimensionale Vektoren \(\textbf{x} = (x_1, x_2)\) eingeben lässt. Schreibe dazu eine Funktion welche die \(x_1\) und \(x_2\) Komponente des Vektors abfragt. Der Nutzer soll die beiden Komponenten mit Komma getrennt eingeben können. Verwende wieder split() und strip() um die Komponenten geeignet zu trennen und wandle die erhaltenen Strings mit float() in Gleitkommazahlen um ()
Rufe diese Funktion aus der Hauptschleife auf und füge den Vektor einer ständig wachsenden Liste mit allen Eingaben zu. Gibt der Nutzer keine Zahl ein so soll die Funktion None
liefern. Das ist das Signal für das Hauptprogramm, die Eingabe zu beenden und zum zweiten Teil überzugehen.
Definiere im zweiten Teil eine geeignete Funktion welche die euklische Länge eines Vektor berechnet, also
und sortiere die Liste der Vektoren nach der Länge. Gib anschließend alle Vektoren in sortierter Reihenfolge auf, deren Länge kleiner oder gleich 1 ist.