Python 1.5 – Eigene Befehle (Funktionen)

Bisher haben wir hauptsächlich mit dem Print-Befehl gearbeitet. Im folgenden Kapitel wollen wir besprechen, wie du eigene, deinen Anforderungen angepasste Befehle definieren und aufrufen kannst. Dafür benutzen wir Funktionen.

Was sind Funktionen?

Python kennt, wie die meisten anderen Programmiersprachen, das Konzept von Funktionen.

Du kannst dir eine Funktion wie ein Backrezept vorstellen. Es werden bestimmte Zutaten zusammen gegeben, gemischt und man bekommt am Ende ein definiertes Ergebnis.

Das Tolle ist: Im Grunde kennen wir uns bereits mit Funktionen aus, denn der Print-Befehl, den wir die ganze Zeit benutzt haben, ist eine eben solche Funktion.

Definition einer Funktion

Eine eigene Funktion definiert man in Python mit dem Schlüsselwort def.

Code-Beispiel - Funktion definieren und aufrufen:

# So definierst du eine Funktion
def print_hallo_lerneprogrammieren():
   print("Hallo LerneProgrammieren")

# So rufst du die Funktion auf
print_hallo_lerneprogrammieren()

So ist eine Funktion aufgebaut:

  1. Das Schlüsselwort def zeigt an, dass im Folgenden eine Funktion definiert wird.
  2. "print_hallo_lerneprogrammieren" ist der Name der Funktion. Du kannst den Funktionsnamen frei wählen.
  3. Es folgen die runden Klammern (), die etwaige Parameter der Funktion beinhalten (dazu später mehr).

Diese Teile zusammen bezeichnen wir auch als Signatur der Funktion.

(Hinweis für Fortgeschrittene-Programmierer: Wenn du bereits mit anderen Programmiersprachen vertraut bist, wirst du vielleicht einen Rückgabewert vermissen. Dieser wird in Python nicht als Teil der Signatur angegeben.)

Der Ausdruck print('Hallo LerneProgrammieren') ist der Rumpf der Funktion. Der Rumpf wird ausgeführt, wenn wir die Funktion später aufrufen (siehe Zeile 6)

So wird die Funktion im Code aufgerufen / ausgeführt:

print_hallo_lerneprogrammieren()

Strukturierung von Funktionsblöcken

An dieser Stelle müssen wir eine weitere Methode besprechen, wie Python seine Programme strukturiert. Während viele Programmiersprachen Blöcke in geschweifte Klammern einfassen, regelt Python diese Strukturierung über Einrückungen. Standard sind dabei vier Leerzeichen, aber auch Tabs oder eine unterschiedliche Anzahl an Leerzeichen können genutzt werden. Es ist äußerst wichtig, dass du dich an diese Konvention hältst, da es sonst zu Fehlern im Programm kommt.

(Wenn du möchtest, kannst du mit dem folgenden Code-Beispiel etwas herumspielen. Entferne die Leerzeichen vor print("Hello World") in der zweiten Zeile. Führe dein Programm danach aus. Siehst du die komische Fehlermeldung? Der Editor gibt einen Fehler aus "expected an indended block". Da wir durch das Entfernen der Leerzeichen die Regeln der Einrückung nicht mehr berücksichtigen.)

Code-Beispiel - Einrückung mit Tabs bzw. Leerzeichen in einer Funktion:

def print_hello_world():
  print("Willkommen im Dschungel")

In diesem Beispiel gehört die Codezeile print("Willkommen im Dschungel") zur Funktion. Daher ist sie eingerückt. Bei einem Funktionsaufruf würde diese Zeile ausgeführt werden.

Funktionsaufrufe

Wir wollen uns nun weiter über Funktionen unterhalten. Funktionen sind elementare Bestandteile eines Programms. Computer sind üblicherweise besonders gut darin, eine bestimmte Tätigkeit absolut zuverlässig und immer wieder durchzuführen. Genau das tut eine Funktion.

Code-Beispiel - Print Befehl OHNE Einrückung in einer Funktion:

def print_hello_world():
    print("Hello World")
print("Willkommen im Dschungel")
Code ausprobieren ×

In diesem Beispiel gehört die Codezeile print("Willkommen im Dschungel") nicht zur Funktion. Daher ist sie nicht eingerückt. Bei einem Funktionsaufruf wird die letzte Zeile (Willkommen im Dschungel) nicht ausgeführt.

Dies ist besonders dann nützlich, wenn man ein Programm hat, dessen Module sich über verschiedene Dateien erstrecken. Fürs Erste wollen wir uns einfach merken, dass jedes unserer Programme eine Funktion mit Namen main haben sollte, die den Einstiegspunkt in unser Programm darstellt.

Um sicherzustellen, dass die Funktion main auch aufgerufen wird, bedienen wir uns der if-Abfrage. Was es mit diesen If-Konstrukten auf sich hat, werden wir später besprechen.

An dieser Stelle solltest du also verstanden haben, dass dein Programm eine main-Funktion haben sollte.

(Anmerkung: Es gibt auch Programme bzw. Skripte, die auf die main-Funktion verzichten. Dabei handelt es sich oft um Skripte zur Systemadministration, die auf Strukturierung durch Funktionen verzichten und einfach von oben nach unten durchlaufen. Für alle anderen Programme ist die main-Funktion aber sehr zu empfehlen.)

Rückgabewerte und return Statement in Funktionen

Die bisher von uns benutzten Funktionen haben lediglich einen Befehl ausgeführt.

Manche Funktionen haben aber auch einen sogenannten Rückgabewert. Dieser Rückgabewert bestimmt, welchen Wert die Funktion an das Hauptprogramm zurückgibt, aus dem sie aufgerufen wird. Der Rückgabewert wird dabei durch das sogenannte return-Statement bestimmt.

Klingt kompliziert? Es ist ganz einfach. Schau dir folgendes Beispiel an.

Code-Beispiel - Rückgabewert mit return:

def hole_schwert() :
    print("Hole Schwert ab")
    return "Schwert"

In der Funktion hole_schwert() geben wir mit return den Wert "Schwert" zurück Wie sieht das in der Praxis aus?

Nehmen wir an, wir rufen diese Funktion aus der main-Funktion heraus auf:

def hole_schwert():
    return "schwert"

print("Triff Vorbereitungen")
bewaffnung = hole_schwert()
print("Lege Rüstung und " + bewaffnung + " an.")
Code ausprobieren ×

Was ist in dem Code passiert?

Dieses Programm ruft die Funktion hole_schwert() auf und speichert den Rückgabewert der Funktion in der Variablen bewaffnung. Den Wert dieser Variablen können wir uns dann mit dem print-Statement anzeigen lassen.

Im Unterschied zu vielen anderen Programmiersprachen ist es bei Python nicht nötig, den Typ des Rückgabewerts einer Funktion explizit zu spezifizieren. Die Funktion
hole_schwert() hätte genauso gut einen Integerwert, eine Liste oder auch ein Tupel zurückgeben können. Tatsächlich bietet Python auch die Möglichkeit, dass eine Funktion mehrere Werte zurückgibt.

Wir werden alle diese Möglichkeiten in späteren Lektionen noch ausgiebiger besprechen.

An dieser Stelle wollen wir es bei einem weiteren Beispiel mit zwei Rückgabewerten belassen.

Code-Beispiel - Mehrere Rückgabewerte in einer Funktion:

def hole_bewaffnung():
    return "Schwert", "Schild"

# Die nächste Zeile ruft die Funktion "hole_bewaffnung" auf
waffe, schild = hole_bewaffnung()

# Jetzt haben wir die Rückgabewerte erhalten. Lass uns diese mit dem Print-Befehl anzeigen
print("Lege " + waffe + " und "  + schild + " an.") 
Code ausprobieren ×

In Zeile 5 wird die Funktion hole_bewaffnung aufgerufen. Die Rückgabewerte werden in den Variablen waffe und schild gespeichert.

Im Anschluss werden die Werte mit dem print-Befehl ausgegeben. Ganz einfach, oder?

Warum benutzen wir Funktionen?

Funktionen dienen im Wesentlichen zwei Dingen:

  1. Sie kapseln eine Funktionalität in einem definierten Block
  2. Sie machen es möglich, einfach auf die Funktionalität zuzugreifen.

Funktionen dienen damit der Wiederverwendbarkeit und Übersichtlichkeit eines Programms. Wenn du eine gewisse Befehlsabfolge mehrfach in deinem Programm benutzt, solltest du definitiv darüber nachdenken, sie in einer Funktion zu kapseln. Selbst wenn sei nur einmal benutzt wird, kann das Kapseln von Funktionalitäten in Funktionen nützlich sein.

Kurz gesagt: Funktionen sind klasse. Nutze sie so oft und so viel wie möglich.

Code-Aufgabe - Jetzt bist du gefragt:

Kommen wir zurück zum Management unseres Königreiches. Nehmen wir an du willst für deinen Herold eine To-do-Liste schreiben, die eine bestimmte Abfolge von Aufgaben ausgeben soll. Da sich diese Ausgaben öfters wiederholen, beschließt du, diese in einer Funktion zusammenzufassen.

Deine Aufgabe:

  1. Definiere eine Funktion mit dem Namen "baue_burg"
  2. Die Funktion soll eine To-do-Liste mit dem print-Befehl ausgeben (z.B. 1. Finde Bauplatz, 2. Wirb Arbeitskräfte an, 3. Erhebe neue Steuern)
  3. Rufe die Funktion auf

Gib deinen Code hier ein:

Code-Aufgabe - Lösung:

Wenn du nicht weiterkommst, findest du hier die Komplettlösung zu der Aufgabe. Du kannst den folgenden Code in den Online-Editor kopieren & einfügen, um ihn zu testen.

[lp_spoiler title="Spoiler - Lösung anzeigen"]

def baue_burg():
  print("1. Finde Bauplatz")
  print("2. Wirb Arbeitskräfte an")
  print("3. Erhebe neue Steuern")

baue_burg()
Code ausprobieren ×

[/lp_spoiler]

Zusammenfassung zu Funktionen

In der vorliegenden Funktion haben wir gelernt, was eine Funktion ist. Ebenso haben wir gelernt, wie man eigene Funktionen definiert und wann es sinnvoll ist, sich dies zunutze zu machen.

Wir hoffen du hattest Spaß und wir sehen uns in der nächsten Lektion wieder.