Python Pakete#

Häufig umfassen Rechungen komplexere Operationen als die Standardrechenoperationen wie Addition, Subtraktion, Multiplikation und Division oder es werden mathematische Konstanten wie \(\pi\) oder \(e\) benötigt. In diesem Fall steht eine umfassende Sammlung von Paketen (auch „Bibliotheken“ oder „Module“ genannt) zur Verfügung, die viele nützliche Funktionen und Werkzeuge beinhalten.

Ein Paket ist eine Sammlung von Funktionen, Klassen und Modulen, die für bestimmte Anwendungsbereiche entwickelt wurden – etwa zum Rechnen mit Matrizen, zur Datenverarbeitung, zur Darstellung von Grafiken oder zur Arbeit mit Dateien. Durch die Nutzung von Paketen können Sie:

  • auf bewährte und getestete Funktionen zurückgreifen,

  • Ihren eigenen Code kürzer und lesbarer gestalten,

  • sich auf die Lösung Ihres konkreten Problems konzentrieren, ohne grundlegende Funktionen selbst implementieren zu müssen.

Installation von (externen) Paketen#

In Python unterscheidet man zwischen zwei verschieden Arten von Paketen: Pakete der Standardbibliothek und externe Pakete.

  • Pakete der Standardbibliothek werden automatisch mit Python zusammen installiert, zum Beispiel wenn Sie dem Installationguide folgen.

  • Externe Pakete werden von Dritten entwickelt und müssen manuell installiert werden - in der Regel über die Paketmanager pip oder conda.

Wenn Sie dem Installationguide gefolgt sind, um Python auf Ihrem Rechner zu installieren, wurden bereits viele gängige (externe) Pakete auch außerhalb der Standardbibliothek vorinstalliert. Auch in diesem Jupyter Book stehen Ihnen die gängigsten Pakete bereits zur Verfügung. Aus diesem Grund verzichten wir an dieser Stelle auf eine ausführliche Anleitung zur Installation eines Paketmanagers.

Importieren von Paketen#

Um ein Paket in Ihrem eigenen Python-Programm nutzen zu können, müssen Sie es zunächst importieren. Dies geschieht mit dem Schlüsselwort \(\texttt{import}\) unabhänging davon, ob es ein externes Paket oder ein Paket der Standardbibliothek ist.

Als Beispiel binden wir das externe Paket NumPy ein, welches Sie im Verlauf des Kurses noch genauer kennenlernen werden. Dieses Paket stellt zahlreiche mathematische Funktionen und Konstanten zur Verfügung, mit denen sich unter anderem Berechnungen mit reellen Zahlen, Vektoren und Matrizen durchführen lassen – beispielsweise:

Mathe

\(\texttt{numpy}\)

\(\pi\)

pi

\(e\)

e

\(\sqrt{x}\)

sqrt(x)

\(\sin(x)\)

sin(x)

\(\cos(x)\)

cos(x)

\(\vert x \vert\)

abs(x)

\(e^x\)

exp(x)

In Python gibt es verschiedene Optionen ein Paket oder gezielt einzelne Funktion daraus zu importieren. Im Folgenden geben wir Ihnen eine Übersicht über die verschiedenen Optionen, sowie die zuhehörige Syntax zum Aufrufen einer Funktion. Als Beispiel dient das Paket NumPy und die darin enthaltene Funktion \(\texttt{sqrt}\).

Zunächst können Sie sich das Paket NumPy als eine Art Werkzeugkasten vorstellen, welches mit dem Etikett NumPy versehen ist. Die Funktionen innerhalb des Pakets sind die Werkzeuge darin – und Python ist die Handwerkerin, die damit arbeitet.

Option I - \(\texttt{import}\)#

Der Befehl import numpy stellt das Paket NumPy zur Verfügung:

import numpy 

numpy.sqrt(x)

Mit dem Befehl import numpy übergeben Sie Python den gesamten Werkzeugkasten. Die Werkzeuge bleiben zunächst im Kasten. Erst mit dem Aufruf numpy.sqrt weisen Sie Python an, ein bestimmtes Werkzeug – in diesem Fall die Funktion \(\texttt{sqrt}\) – aus dem Kasten herauszunehmen und zu verwenden.

In komplexeren Projekt wird typischerweise eine Vielzahl verschiedener Pakete benötigt. Aus diesem Grund wird bei import numpy der Paketname – also der „Werkzeugkasten“ – als Präfix mit angegeben. Der Zusatz numpy. gibt dabei eindeutig an, in welchem Paket sich die Funktion \(\texttt{sqrt}\) befindet.

Option II - \(\texttt{import _ as _ }\)#

Der Befehl import numpy as np stellt das Paket NumPy unter dem kurzen Alias \(\texttt{np}\) zur Verfügung:

import numpy as np 

np.sqrt(x)

Sie können sich das so vorstellen: Python erhält wie zuvor den gesamten Werkzeugkasten – aber dieses Mal mit einem neuen Label. Das ursprüngliche Etikett NumPy wird durch \(\texttt{np}\) ersetzt, wodurch sich die Schreibweise im weiteren Code vereinfacht. An der Funktionsweise ändert sich nichts: Python greift weiterhin mit np.sqrt gezielt auf das Werkzeug \(\texttt{sqrt}\) im Kasten \(\texttt{np}\) zu. Diese Variante ist in der Praxis sehr weit verbreitet.

Option III - \(\texttt{from _ import _ }\)#

Der Befehl from numpy import sqrt stellt ausschließlich die Funktion \(\texttt{sqrt}\) aus dem Paket NumPy zur Verfügung:

from numpy import sqrt

sqrt(x)

In diesem Fall wird nur das Werkzeug \(\texttt{sqrt}\) aus dem Werkzeugkasten NumPy entnommen und direkt an Python übergeben. Python kann es dadurch ohne weiteren Verweis auf das Paket verwenden – ein einfacher Aufruf mit sqrt(x) genügt. Diese Methode eignet sich, wenn Sie gezielt nur einzelne Funktionen benötigen und den Code kompakt halten möchten.

Achtung

Da Sie nur \(\texttt{sqrt}\) importiert haben, stehen andere Funktionen aus NumPy – wie zum Beispiel \(\texttt{abs}\), \(\texttt{log}\) oder \(\texttt{sin}\)nicht zur Verfügung.

Wenn Sie jetzt abs(x) aufrufen, wird dabei die eingebaute Python-Funktion \(\texttt{abs}\) verwendet, nicht die Variante aus NumPy. Falls es jedoch keine eingebaute Funktion mit dem entsprechenden Namen gibt, wie zum Beispiel \(\texttt{log}\), und Sie diese nicht explizit importiert haben, führt ein Aufruf wie log(x) zu einer Fehlermeldung. Möchten Sie mehrere Funktionen gleichzeitig importieren, können Sie dies mit Kommata angeben:

from numpy import sqrt, abs

sqrt(x)
abs(x)

Option IV - \(\texttt{from _ import *}\)#

Der Befehl from numpy import * stellt alle Funktionen und Objekte aus dem Paket NumPy unmittelbar zur Verfügung:

from numpy import *

sqrt(x)

Sie können sich das so vorstellen: Mit from numpy import * kippen Sie den gesamten Werkzeugkasten aus – alle Werkzeuge liegen nun offen vor Python. Die Funktion \(\texttt{sqrt}\) wird dadurch direkt verfügbar, ohne dass Python erst im Kasten nachsehen muss.

Aufgabe 1

Importieren Sie aus dem Paket NumPy nur die Konstante \(\pi\) erstellen Sie die Variable \(\texttt{y}\) mit dem Wert \(\frac{\pi}{3}\).

# Ihr Code

Aufgabe 2

Importieren Sie das Paket NumPy unter dem Alias \(\texttt{np}\) und berechnen Sie \(\sin\left( \frac{\pi}{3} \right)\). Speichern Sie das Ergebnis in der Variable \(\texttt{z}\).

# Ihr Code

Zusammenfassung

Importbefehl

Syntax für Funktionsaufruf

import numpy

numpy.sqrt(x)

import numpy as np

np.sqrt(x)

from numpy import sqrt

sqrt(x)

from numpy import *

sqrt(x)

Exkurs: Gleichnamige Funktionen in verschiedenen Paketen#

Beim Arbeiten mit Paketen in Python kann es vorkommen, dass mehrere Pakete ähnliche oder sogar gleichnamige Funktionen bereitstellen. Dies ist nicht ungewöhnlich, da verschiedene Entwicklerteams ähnliche Probleme auf unterschiedliche Weise lösen – beispielsweise mit unterschiedlichem Funktionsumfang, anderer Performance oder alternativer Syntax.

Ein klassisches Beispiel ist die Quadratwurzel-Funktion \(\texttt{sqrt}\). Diese ist sowohl im Standardpaket \(\texttt{math}\) als auch im externen Paket NumPy verfügbar:

import math
import numpy as np

print(math.sqrt(16))  # Ausgabe: 4.0
print(np.sqrt(16))    # Ausgabe: 4.0

Obwohl beide Funktionen denselben Namen tragen und das gleiche Ergebnis liefern, unterscheiden sie sich im Detail – zum Beispiel bei der Unterstützung für Vektoren oder Matrizen. Die \(\texttt{math.sqrt()}\)-Funktion funktioniert nur mit einzelnen Zahlen, die \(\texttt{np.sqrt()}\)-Funktion dagegen auch zusätzlich für Vektoren.

Wenn zwei Pakete Funktionen mit gleichem Namen bereitstellen, besteht die Gefahr von Namenskonflikten – insbesondere dann, wenn Sie beide Funktionen direkt mit from _ import _ importieren. Python ist dann nicht klar ob mit \(\texttt{sqrt}\), die Funktion aus \(\texttt{math}\) oder NumPy gemeint ist und wird eine Fehlermeldung anzeigen. Um dies zu vermeiden, empfiehlt es sich, Pakete immer mit eindeutigen Aliasnamen zu importieren:

import math
import numpy as np

# Klare Unterscheidung über Präfixe
print(math.sqrt(25))
print(np.sqrt(25))

Alternativ sollten Sie auf from _ import _ nur zurückgreifen, wenn sicher ist, dass es keine Namensüberschneidungen gibt oder der Kontext klar eingegrenzt ist.