Funktionen kennen wir aus der Mathematik als (vereinfacht gesagt) Rechenvorschriften, um ein oder mehrere Objekte in andere umzurechnen. Zum Beispiel erhält die Funktion \(f(x) = x^2\) einen Wert für den Parameter \(x\) und gibt dessen Quadrat als Ergebnis zurück. Nun können wir Funktionswerte wie \(f(4) = 16\) berechnen.
Dieses Konzept existiert auch in Python. Zum Beispiel existiert die Funktion round(x)
, die eine als Parameter übergebene Zahl x
kaufmännisch rundet.
>>> round(4.2)
4
>>> round(6.66)
7
>>> round(-5)
-5
Die Schreibweise funktionsname(parameterwert)
orientiert sich an der mathematischen Notation.
In Python lassen sich auch eigene Funktionen definieren. Dieses Konzept kennen wir bereits aus der visuellen Programmierung: In Scratch können wir “neue Blöcke” erstellen, hinter denen sich selbst definierte Unterprogramme verbergen (siehe Abschnitt Unterprogramme).
In Python lassen sich mit dem Schlüsselwort def
eigene Funktionen definieren. Die einfachste Form dafür lautet def
Funktionsname ():
Das folgende Beispiel definiert eine Funktion bzw. Unterprogramm mit dem Funktionsnamen “waagerechte_linie”, das beim Aufruf eine Zeile mit 40 Strichzeichen in die Konsole schreibt:
def waagerechte_linie():
print('----------------------------------------')
Die erste Zeile, die mit def
eingeleitet wird, nennen wir den Funktionskopf, den Rest den Funktionsrumpf. Der Funktionsrumpf enthält das eigentliche Unterprogramm, also die Anweisungen, die beim Aufruf der Funktion ausgeführt werden sollen.
Im Funktionskopf können wir zusätzlich Parameter festlegen, über die der Funktion beim Aufruf Werte übergeben werden können, die in der Funktionsausführung eine Rolle spielen. Dazu schreiben wir in die Klammern die Namen der Parameter. Bei der Abarbeitung dieser Funktion werden die Parameter dann wie lokale Variablen verwendet, die nur innerhalb der Funktion sichtbar sind. Mehrere Parameter werden mit Komma getrennt angegeben.
def unterschiedlich_lange_linie(laenge):
print('-' * laenge)
def sehr_flexible_linie(laenge, zeichen):
print(zeichen * laenge)
Beim Funktionsaufruf muss darauf geachtet werden, dass für alle Parameter geeignete Werte angegeben werden.
Die Aufrufe der drei oben definierten Funktionen könnten dann beispielsweise folgendermaßen aussehen:
>>> waagerechte_linie()
-------------------------------------------
>>> unterschiedlich_lange_linie(10)
----------
>>> sehr_flexible_linie(15, '=')
===============
>>> sehr_flexible_linie(5, '-')
-----
Die Definition einer Funktion ist für sich genommen wertlos, solange die Funktion nirgendwo im Programm aufgerufen wird. Erst beim Aufruf einer Funktion wird der Programmteil, der durch die Funktion definiert wird, ausgeführt.
Mit dem Schlüsselwort return
kann das Ergebnis einer Funktion an die Aufrufstelle zurückgegeben werden. Die Funktionsausführung endet an dieser Stelle.
def quadrat(x):
return x * x
Funktionen mit Rückgabewert können im Programm nicht nur als Anweisungen, sondern als Ausdrücke eingesetzt werden. Das bedeutet, dass sie z. B. in mathematischen Berechnungen oder Parametern von weiteren Funktionsaufrufen eingesetzt werden können.
>>> quadrat(5)
25
>>> quersumme(1234)
10
>>> quersumme(3190701205)
28
>>> quersumme(quersumme(3190701205))
10
>>> quadrat(11) + quersumme(11)
123
Funktionen können natürlich sehr viel umfangreicher sein, als nur einfache mathematische Ausdrücke auszuwerten und als Ergebnis zurückzugeben. Prinzipiell können die Unterprogramme, die in den Funktionsrümpfen stehen, beliebig komplex sein – also Anweisungssequenzen, Kontrollstrukturen, Ein- und Ausgaben sowie weitere Funktionsaufrufe enthalten.
def quersumme(zahl):
zahl_als_string = str(zahl)
summe = 0
for ziffer in zahl_als_string:
summe = summe + int(ziffer)
return summe
Dieser Abschnitt wird noch ergänzt.
Wie viele andere Programmiersprachen verfügt Python nur über sehr wenige eingebaute Funktionen, z. B. len()
, int()
oder range()
. Diese Funktionen stellen die wichtigsten Funktionalitäten zum Programmieren und die wichtigsten Datentypen zur Verfügung. Alles, was man darüber hinaus benötigen könnte, wird von so genannten Bibliotheken zur Verfügung gestellt, wobei jede Bibliothek eine klar definierte Funktionalität erfüllt.
In Python sind einige Bibliotheken standardmäßig vorinstalliert und können mit import
genutzt werden. Dazu gehören u. a.:
Name | Zweck |
---|---|
math | Mathematische Funktionen wie Wurzeln, Sinus/Kosinus, Logarithmen usw. |
os | Zugriff auf das Betriebssystem |
sys | Zugriff auf Attribute und Funktionen des Python-Interpreters |
random | Generieren von Zufallszahlen |
tkinter | Programmieren von grafischen Benutzeroberflächen |
turtle | Zeichnen von Turtle-Grafiken |
datetime | Operationen mit Datum und Zeit |
shutil | Komplexere Operationen auf Dateien |
Daneben lassen sich auch weitere Bibliotheken von Drittanbietern nachinstallieren. Die offizielle Sammlung von Python-Bibliotheken ist der Python Package Index (PyPI) mit der Homepage https://pypi.org. Python-Programmierende können eigene Bibliotheken erstellen und über den PyPI veröffentlichen. Dort findet man unter anderem nützliche Bibliotheken wie:
Name | Zweck |
---|---|
bottle | Ein einfacher Webserver |
cryptography | Eine Bibliothek mit kryptografischen Funktionen |
numpy | Verbesserte mathematische Operationen |
pandas | Ein mächtiges Werkzeug zur Datenanalyse |
pillow | Funktionen zur Bildverarbeitung |
urllib3 | Ein einfacher HTTP-Client |
Im PyPI sind beliebte und vielgenutzte Pakete wie die Webserver Django, Bottle und Flask zu finden, aber auch Nonsens-Pakete wie shittypackage und teilweise sogar bösartige Pakete. Darum sollte man beim Benutzen von PyPI-Paketen eine gewisse Vorsicht walten lassen und sich vorher über diese Pakete informieren.
Zum Einbinden einer Bibliothek in ein Python-Programm wird das Schlüsselwort import
verwendet. Entweder bindet man die ganze Bibliothek mit import math
ein oder pickt sich einzelne Funktionen heraus, etwa die Funktion sqrt
zum Berechnen der Quadratwurzel. In diesem Fall schreibt man from math import sqrt
. Mit from math import *
können alle Funktionen und Konstanten aus der math
-Bibliothek importiert werden.
Im ersten Fall muss man dann, um auf die Konstanten und Funktionen der Bibliothek zugreifen zu können, den Namen der Bibliothek (mit Punkt getrennt) vor die Aufrufe setzen: Für \(\sqrt{4}\) schreibt man dann math.sqrt(4)
. Im zweiten Fall (from math import sqrt
oder from math import *
) schreibt man einfach sqrt(4)
, um die Funktion aufzurufen.
Ganze Bibliothek importieren | Einzelne Funktionen aus einer Bibliothek importieren | Alle Funktionen aus einer Bibliothek importieren | |
---|---|---|---|
Einbinden | import math | from math import sqrt | from math import * |
\(\sqrt{4}\) | math.sqrt(4) → 2 | sqrt(4) → 2 | sqrt(4) → 2 |
\(\pi\) | math.pi → 3.141592653589793 | pi → Fehler, weil nur sqrt importiert wurde! | pi → 3.141592653589793 |
Vorteile | Keine Namensverwirrung, weil beim Funktionsaufruf der Bibliotheksname mit angegeben werden muss | Entlastet den Arbeitsspeicher, weil nur wirklich benötigte Funktionen geladen werden | Importiert eine ganze Bibliothek, ermöglicht aber kompakte Notation. |
Nachteile | Größerer Schreibaufwand und unintuitive Notationen wie datetime.datetime | Verwirrende Fehlermeldungen, wenn man nicht importierte Funktionen verwenden möchte | Risiko von Namensverwirrungen, z. B. gibt es ceil -Funktionen in den Bibliotheken math , numpy und torch . |
Thonny enthält eine Paket-Verwaltung für PyPI, die sich im Menü unter Extras → Verwalte Plug-Ins… aufrufen lässt.
Dieses Fenster gestattet es, im PyPI nach Paketen zu suchen:
Details zu einzelnen Bibliotheken anzuzeigen:
und Pakete zu installieren oder deinstallieren: