Funktionen
Contents
Funktionen#
Erstmal vorweg: Es gibt in Python keine Main-Funktion wie in C. Der Inhalt der Main-Funktion wird im globalen Bereich geschrieben und ausgeführt. Wenn man im Arbeitsleben Python-Code schreibt, ist dies unerwünscht und wird anders gehandhabt. Das ist für diese Einführung jedoch nicht von Bedeutung.
Erstellen einer Funktion#
Um eine Funktion zu definieren, wird das Keyword def
benutzt.
Anschließend wird der Funktion ein Name zugewiesen und in runden Klammern gibt man die Parameter an.
Man beendet den Funktionskopf nun mit einem Doppelpunkt, nach welchem man die nächste Zeile einrückt und dann den eigentlichen Inhalt der Funktion angibt.
Beispiel:
def ich_printe_falschherum(input_string):
result = ""
for i in range(1, len(input_string)+1):
result += input_string[-i] # Der "+"-operator bei Strings konkateniert
print(result)
ich_printe_falschherum("Hello World!")
# !dlroW olleH
Verallgemeinert:
def funktions_name(parameter1, parameter2, ...):
<Funktionsrumpf>
Es ist ebenfalls möglich Defaultwerte für Parameter anzugeben. Dafür weist man den Parametern bereits einen Wert zu. Sobald ein Defaultwert angegeben wurde, müssen alle Werte rechts davon ebenfalls Defaultwerte haben Beispiel:
def summe_von_bis_zu_vier_zahlen(a, b, c=0, d=0):
return a + b + c + d
print(summe_von_bis_zu_vier_zahlen(1,2))
# 3
print(summe_von_bis_zu_vier_zahlen(1,2,3))
# 6
print(summe_von_bis_zu_vier_zahlen(1,2,3,4))
# 10
Rückgabewerte#
Mit dem Keyword return
kann man angeben, was die Funktion zurückgeben soll.
Die Besonderheit von Python liegt darin, dass man mehrere Werte zurückgeben kann.
Angenommen eine Funktion erhält einen String aus ausschließlich Kleinbuchstaben und soll berechnen, wie viele Vokale und wie viele Konsonanten in dem String vorkommen. Zusätzlich soll die Funktion zurückgeben, ob es weniger Vokale als Konsonanten gibt (in Form eines Wahrheitswertes). In anderen Programmiersprachen müsste man eine Datenstruktur erstellen, um sowohl zwei Integer Werte als auch einen Wahrheitswert zurückgeben zu können. In Python gibt man einfach alle drei zurück, jeweils durch Komma getrennt.
def vokale_und_konsonanten(input_string):
anzahl_vokale = 0
anzahl_konsonanten = 0
for buchstabe in input_string: # Man kann über einen String genauso iterieren wie über eine Liste
if buchstabe in ["a", "e", "i", "o", "u"]:
anzahl_vokale += 1
else:
anzahl_konsonanten += 1
return anzahl_vokale, anzahl_konsonanten, anzahl_vokale < anzahl_konsonanten
anzahl_vokale, anzahl_konsonanten, es_kommen_mehr_konsonanten_vor = vokale_und_konsonanten("algdat")
print(anzahl_vokale)
# 2
print(anzahl_konsonanten)
# 4
print(es_kommen_mehr_konsonanten_vor)
# True
Da kann man wieder auf die Mehrfachzuweisung schließen. Da die Funktion drei Werte zurückgibt und man drei Variablen auf der linken Seite hat, haben beide Seiten des Zuweisungsoperators gleich viele Operanden. Also ist dies eine gültige Zuweisung.
Rekursion#
Rekursion funktioniert in Python genauso wie in anderen Programmiersprachen auch. Eine Funktion ruft sich selbst auf. Als Beispiel die rekursive Berechnung der n-ten Fibonacci-Zahl.
def fib_rek(n):
if n <= 1:
return n
else:
return fib_rek(n-1) + fib_rek(n-2)
print(fib_rek(6))
# 8
Aufgabe#
Erstellen Sie eine Funktion, welche einen positiven Integerwert als Argument erhält und True
zurückgibt, falls der Wert eine gerade Zahl ist. Ansonsten soll False
zurück gegeben werden. Testen Sie die Funktion für ein paar Zahlen ihrer Wahl. Sie müssen nicht sicherstellen, dass wirklich eine positive Ganzzahl eingegeben wurde. Gehen Sie davon aus, dass nichts anderes eingegeben wird. Sie können auch gerne versuchen, mehrere Lösungen zu finden.
# Hier können Sie ihren Versuch schreiben...
Lösung
Die wohl gängigste Lösung mit Modulo:
def is_even_ordinary(value):
if value % 2 == 0:
return True
else:
return False
Eine kompaktere Lösung mit Modulo:
def is_even_ordinary_improved(value):
return value % 2 == 0
Rekursive Lösung. 0
ist als gerade Zahl und 1
als ungerade Zahl bekannt. Wenn der Wert ungleich 0
oder 1
ist,
wird die Funktion rekursiv für den um zwei veringerten Wert aufgerufen bis der Wert entweder 0
oder 1
ist. Die Subtraktion mit 2
sorgt dafür,
dass der Wert gerade oder ungerade im nächsten rekursiven Aufruf bleibt.
def is_even_rek(value):
if value == 0:
return True
elif value == 1:
return False
else:
return is_even(value-2)
Idee: Ob eine Zahl gerade oder ungerade ist, hängt nur von der letzten Ziffer ab. Deswegen konvertieren wir die Zahl in einen String und betrachten nur die letzte Ziffer. Wir casten die letzte Ziffer zurück in eine Zahl und gucken ob die letzte Ziffer in der Liste der bereits bekannten einziffrigen geraden Zahlen enthalten ist.
def is_even_last_digit(value):
return int(str(value)[-1]) in [0, 2, 4, 6, 8]
In Python kann man auch ebenfalls auf Bitebene arbeiten.
Bei dem &
Operator handelt sich um bitweises und.
Da die Bitfolge 1
äquivalent ist zu …00001
,
ist die Länge des linken Wertes egal.
Alles bis auf das letzte Bit wird bei der Operation zu 0
,
womit nur das letzte Bit etwas anderes als 0
sein kann.
Das Ergebnis ist also immer 1 Bit lang.
Bei einer ungeraden Zahl ist das letzte Bit 1
und die Operation würde den Wert 1
zurückgeben.
Bei einer geraden Zahl wäre das letzte Bit 0
und somit würde der Wert 0
zurückgegeben werden.
0
und 1
können zu Booleans gecasted werden.
1
wird beim casten als True
und 0
als False
interpretiert.
Momentan sind True
und False
falsch herum sind, da wir ja True
haben wollen, wenn der Wert gerade ist,
somit müssen wir den Boolean lediglich mit einem not
negieren.
def is_even_bitewise_and(value):
return not bool(value & 1)
Es gibt viele Möglichkeiten, diese Aufgabe zu lösen. Hier handelt es sich lediglich um Beispiele und manche Lösungen sind praktischer als andere. Hier soll lediglich die Vielfalt an möglichen Ansätzen gezeigt werden.