Zurück


Hilfe holen und Funktionen verwenden Logo von Python

Du hast Funktionen wie abs und print bereits gesehen. Python hat aber äußerst viele Funktionen und deine eigenen zu definieren ist ein großer Teil des programmierens mit Python.
In diesem Kapitel lernst du mehr über die Verwendung und Definition der Funktionen.

Hilfe holen

Erinnerst du dich noch, was die abs Funktion macht?
Falls du dich nicht mehr erinnerst, hilft dir die help() Funktion. Mit dieser Funktion hältst du auch eines der wichtigsten Werkzeuge
von Python in den Händen, um andere Funktionen verstehen zu können.
Hier, ein Beispiel dafür: help(round)

Help bei der eingebauten Funktion:

round(number, ndigits=None)
Rundet eine Zahl je nach Anweisung.


Return Wert ist ein Integer, wenn ndigits auf None gesetzt wird.
Sonst nimmt der Return Wert den Typ der Nummer an. Ndigits darf negativ sein.

help() zeigt uns zwei Sachen:

1. Den Header der Funktion round(number, ndigits=None). In diesem Fall zeigt es uns das round(). Ein Argument, welches eine Zahl
als Eingabe benötigt. Wir können auch ein separates Argument für ndigits eingeben.

2. Eine kurze englische Beschreibung, was die Funktion macht (in diesem Fall wurde es auf Deutsch übersetzt).

Ein häufig Vorkommender Fehler:

Wenn du nach einer Funktion suchst, solltest du nur nach der Funktion suchen und nicht nach dem Ergebnis der Funktion.
Was passiert, wenn wir die Funktion round() aufrufen, während wir um Hilfe bitten?

help(round(-2.01))

Kurzgefasst erzählt es dir viel zu viel über Integers, aber wieso? round() ist in dem help() also sollte help() zuerst ausgeführt werden,
oder? In Python werden Funktionen von innen nach außen aufgerufen, deswegen erzählt uns die help-Funktion viel über Integers.
round() ist eine sehr einfache Funktion mit einem kurzen docstring. Help wird am nützlichsten, wenn es komplexere und sehr konfigurierbar
Funktionen wie print erklären muss. Nicht eingeschüchtert werden, es schaut zwar nach sehr viel aus, aber probiere, die Zeilen, die dir Unbekannt vorkommen, zu interpretieren.

help(print)

Help bei der eingebauten Funktion:

print(…)

print(value, …, sep=‘ ‚, end=‘\n’, file=sys.stdout, flush=False)

Druckt den Wert auf den Stream, oder zu sys.stdout by default.
Optionale Schlüsselargumente:

File: ein File-artiges Objekt (stream); geht normalerweise zur derzeitigen sys.stdout.
Sep: String eingefügt zwischen den Werten, normalerweise 1 Abstand.
End: Ein String, der nach dem letzten Wert eingehängt wird, normalerweise auf einer neuen Zeile.
Flush: ob es mit Gewalt den Stream fluten soll.




Vielleicht hast du erkannt, dass es ein Argument namens sep für print() gibt. Noch dazu hast du vielleicht
erkannt, dass hier entschieden wird, wie die Werte getrennt werden.

Funktionen Definieren

Eingebaute Funktionen sind zwar sehr hilfreich, aber man kommt nicht sehr weit, wenn man sich nur auf diese verlässt.
Aus diesem Grund müssen wir unsere eigenen Funktionen definieren. Hier ein einfaches Beispiel dazu.

def wenigster_unterschied(a, b, c):

diff1 = abs(a - b)
diff2 = abs(b - c)
diff3 = abs(a - c)
return min(diff1, diff2, diff3)


Das erstellt eine Funktion namens wenigster_unterschied. Diese nimmt drei Argumente namens a, b und c.
Wenn es mit def anfängt, dann definiert man eine Funktion und der eingeschobene Block nach dem Doppelpunkt ist, was die Funktion macht.
Return ist ein äußerst wichtiger Baustein, der häufig mit Funktionen zusammen eingesetzt wird. Sobald eine Funktion auf Return trifft,
schließt sie sich selbst und gibt die Werte, die Rechts vom Return sind zum calling context.

Wenn dir noch unklar ist, was wenigster_unterschied() macht, dann schau dir noch folgende Beispiele an:

print(
wenigster_unterschied(1, 10, 100),
wenigster_unterschied(1, 10, 10),
wenigster_unterschied(5, 6, 7),
#Man kann die print() ausgaben mit Komma teilen, wie cool ist das denn?

)

9 0 1


help(wenigster_unterschied)

Help auf Funktion wenigster_unterschied in module __main__:
wenigster_unterschied(a, b, c)
Unseren code kann Python leider nicht in die deutsche Sprache übersetzen, aber wir können das mit einem docstring machen.

Docstrings


def wenigster_unterschied(a, b ,c):

"""Gib die kleinste Differenz zwischen a, b oder c aus.
>>> wenigster_unterschied(1, 5, -5)
4
"""

diff1 = abs(a - b)
diff2 = abs(b - c)
diff3 = abs(a - c)

return min(diff1, diff2, diff3)


Der Docstring ist ein String, der über mehrere Zeilen laufen kann und der sofort nach dem Header der Funktion aufgeschrieben wird.
Dieser wird mit einem dreifach Anführungszeichen gekennzeichnet und bei einem help() Aufruf sehen wir das auch.

help(wenigster_unterschied)
Help auf Funktion wenigster_unterschied in module __main__:
wenigster_unterschied(a, b ,c)

Gib die kleinste Differenz zwischen a, b oder c aus.
>>> wenigster_unterschied(1, 5, -5)
4


Wenn du ein guter Programmierer werden möchtest, solltest du immer einen docstring schreiben, sonst vergisst du noch, was deine Funktion macht,
außer du willst es gleich nach dem ersten nutzen wegwerfen.

Funktionen die nicht einen Return Wert liefern

Was würde passieren, wenn wir den Return Baustein nicht in unserer Funktion verwenden?

def wenigster_unterschied(a, b ,c):

"""Gib die kleinste Differenz zwischen von a, b oder c aus.
"""
diff1 = abs(a - b)
diff2 = abs(b - c)
diff3 = abs(a - c)
min(diff1, diff2, diff3)


print(

wenigster_unterschied(1, 10, 100),
wenigster_unterschied(1, 10, 10),
wenigster_unterschied(5, 6, 7),
)
None None None

Anders als in anderen Sprachen "null" zu verwenden, wird hier "None" verwendet.
Ohne das Return Statement verliert wenigster_unterschied seinen Zweck, jedoch gibt es Funktionen mit Nebeneffekten, die sogar besser ohne
ein Return Funktionieren. Wir kennen schon zwei Funktionen die wir nur wegen ihren Nebeneffekten aufrufen: print() und help().
Deren Nebeneffekt ist, dass sie Text auf dem Bildschirm zeigen. Weitere nützliche Nebeneffekte sind Input Modifizierung oder etwas in eine Datei zu schreiben.

mystery = print()
print(mystery)
None

Voreingestellte Argumente

Nachdem wir help(print) gemacht haben, konnten wir sehen, dass es ein paar Argumente gab, die schon Voreinstellungen haben.
In diesem Beispiel könnten wir einen Wert für sep eingeben und etwas spezielles zwischen unsere Strings geben.

print(1, 2, 3, sep =" < ")
1 < 2 < 3

Wenn wir aber gar nichts eingeben, dann wird einfach ein Abstand zwischen den Strings ausgegeben.

Ein paar optionale Argumente mit Voreinstellungen einzufügen, die man selbst definieren kann, ist ziemlich einfach:

def gruesse(wer="Heinz"):

print("Hallo,", wer)

gruesse()
gruesse(wer="Ai GYM")

#In unserem Fall müssen wir nicht den Namen des Arguments spezifizieren, weil es nur dieses eine gibt.
gruesse("Welt")

Hallo, Heinz

Hallo, Ai GYM

Hallo, Welt



Funktionen über Funktionen

Eine mächtige, jedoch abstrakte Taktik ist es, Funktionen als Argumente für andere Funktionen anzuwenden.
Das ist zwar ein bisschen schwer zu verstehen, aber diese Beispiele erklären es gut:

def mal_fuenf(x):
return 5 * x


def call(fnktn, arg):
"""erhöhe fnktn auf arg"""
Return fnktn(arg)


def quadrat(fnktn, arg):
"""erhöhe fnktn mit dem Ergebnis von fnktn auf arg"""
return fnktn(fnktn(arg))


print(
call(mal_fuenf, 1),
quadrat(mal_fuenf, 1),
"sep='\n',"
#'\n' fängt bei einer neuen Zeile an."

)

5
25

Funktionen, die mit anderen Funktionen arbeiten, heißen "Funktion höherer Ordnung".
Du wirst in der nahen Zukunft zwar nicht viele davon machen, aber es gibt ein paar Funktionen höherer Ordnung,
die Python bereits eingebaut hat und die du vielleicht einsetzen wirst.

Dafür können wir ein sonderbares Beispiel mit der max Funktion vorzeigen.
Normalerweise zeigt max das größte seiner argumente, aber wenn wir es in einer Funktion mit optionalen Argumenten
kombinieren, gibt es uns das Argument x, womit wir den key(x) maximieren können.

def modulo_5(x):
"""Den Rest von x nach der Division mit 5"""
return x % 5


print(
'Welche Zahl ist am größten?',
max(100, 51, 14),
'Welche Zahl ist die größte nach Modulo 5?'',
max(100, 51, 14, key=modulo_5),
sep='\n',

)
Welche Zahl ist am größten
100
Welche Zahl ist die größte nach Modulo 5?
14