Wächst ein Programm für ein größeres Projekt, muss man trotzdem die Übersicht behalten können.
Das Schlüsselkonzept vieler erfolgreichen Programmiersprachen ist "Modularisierung": es handelt sich hierbei um abgekapselte Einheiten des Programms, die jeweils in sich geschlossen sind und Teil eines größeren Programmes sein können. Wir haben bereits "Klassen" kennengelernt, welche Funktionalitäten in handliche Bausteine abkapseln. Objektorientierte Programmierung ist ein gutes Konzept, um die wachsende Komplexität in den Griff zu bekommen. Klassen bilden eine natürliche Einheit um Ordnung in das gesamte Progamm zu bringen.
Dies scheitert jedoch, wenn immer mehr unterschiedliche Klassen, Funktionen und Strukturen ins Spiel kommen -- dafür gibt es "Module".
Die Verwendung von Modulen ist bereits an vielen Stellen vorgekommen:
es handelt sich um die import
-Statements.
Diese laden ein Modul bzw. importieren bestimmte Symbole (welche Variablen, Funktionen oder Sub-Module sein können).
Solch ein Modul kann im eigenen Programm liegen, oder global verfügbar sein.
Beispiel: Das math
Modul wird importiert,
wobei dann die einzelnen Funktionen als Attribute zur Verfügung stehen:
import math
print(math.sqrt(4))
2.0
Beispiel: Hier werden die Funktionen sqrt
und sin
aus dem Modul math
importiert.
from math import sqrt, sin
print(sin(3.1415))
print(sqrt(2))
9.265358966049026e-05 1.4142135623730951
Es können auch eigene Namen für die importierten Module oder Elemente vergeben werden. Dadurch wird verhindert, dass es zu Namenskollisionen kommt!
Beispiel: sqrt
wird sowohl aus der math
als auch der sympy
Bibliothek importiert -- mit den Namen csqrt
bzw. symsqrt
-- und anschließend verwendet:
from math import sqrt as csqrt
from sympy import sqrt as symsqrt
print(csqrt(5))
print(symsqrt(5).evalf(50))
2.23606797749979 2.2360679774997896964091736687312762354406183596115
Genauso die PyPlot API von Matplotlib:
%matplotlib inline
import matplotlib.pyplot as plt
Eigene Module können auf (mindestens) zwei Arten erstellt werden:
*.py
Datei ist ein Modul.*.py
Dateien mit einer darin enthaltenen __init__.py
Datei.
Diese muss vorhanden sein, darf aber leer sein.
Wenn sie Code enthält, wird dieser beim Laden des Moduls ausgeführt.Module können an beliebiger Stelle im Dateisystem abgelegt werden. Sie müssen jedoch in der Liste der sys.path
Pfade enthalten sein. Diese Liste wird beim Import des gewünschten Moduls durchsucht.
import sys
sys.path
['', '/projects/anaconda3/lib/python35.zip', '/projects/anaconda3/lib/python3.5', '/projects/anaconda3/lib/python3.5/plat-linux', '/projects/anaconda3/lib/python3.5/lib-dynload', '/projects/anaconda3/lib/python3.5/site-packages', '/projects/anaconda3/lib/python3.5/site-packages/Pint-0.7.2-py3.5.egg', '/projects/anaconda3/lib/python3.5/site-packages/contextlib2-0.5.3-py3.5.egg', '/projects/anaconda3/lib/python3.5/site-packages/cycler-0.10.0-py3.5.egg', '/projects/anaconda3/lib/python3.5/site-packages/docopt-0.6.2-py3.5.egg', '/projects/anaconda3/lib/python3.5/site-packages/pyramid-1.5.7-py3.5.egg', '/projects/anaconda3/lib/python3.5/site-packages/pyramid_jinja2-2.5-py3.5.egg', '/projects/anaconda3/lib/python3.5/site-packages/pyramid_mako-1.0.2-py3.5.egg', '/projects/anaconda3/lib/python3.5/site-packages/IPython/extensions', '/projects/61d9dd50-f69c-4c02-a474-f5706dfceb69/.sage/ipython_genutils-0.1.0']
import site