Tutorial:Programmieren mit Python/Funktionen und Bibliotheken: Unterschied zwischen den Versionen

Aus KGS-Wiki
K (Syntaxhighlight)
K (→‎Bibliotheken: Fehlendes Wort)
 
Zeile 112: Zeile 112:
|-
|-
|{{Python|cryptography}}
|{{Python|cryptography}}
|Eine Bibliothek mit [[Kryptographie|kryptografische]]
|Eine Bibliothek mit [[Kryptographie|kryptografischen Funktionen]]
|}
|}



Aktuelle Version vom 9. Oktober 2024, 13:08 Uhr

Funktionen aufrufen

Funktionen kennen wir aus der Mathematik als (vereinfacht gesagt) Rechenvorschriften, um ein oder mehrere Objekte in andere umzurechnen. Zum Beispiel erhält die Funktion einen Wert für den Parameter und gibt dessen Quadrat als Ergebnis zurück. Nun können wir Funktionswerte wie 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.

Funktionen definieren

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.

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, '.')
.....
⚠️
Achtung

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.

Rückgabewerte

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

Bibliotheken

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). Python-Programmierys 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
⚠️
Achtung

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.

Bibliotheken einbinden und nutzen

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 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 *
math.sqrt(4)2 sqrt(4)2 sqrt(4)2
math.pi3.141592653589793 pi → Fehler, weil nur sqrt importiert wurde! pi3.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.

Bibliotheken in Thonny installieren

Weblinks