{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Konzept 7: Modularisierung\n", "\n", "Wächst ein Programm für ein größeres Projekt,\n", "muss man trotzdem die Übersicht behalten können.\n", "\n", "Das Schlüsselkonzept vieler erfolgreichen Programmiersprachen ist \"**Modularisierung**\":\n", "es handelt sich hierbei um abgekapselte Einheiten des Programms,\n", "die jeweils in sich geschlossen sind und Teil eines größeren Programmes sein können.\n", "Wir haben bereits \"Klassen\" kennengelernt, welche Funktionalitäten in handliche Bausteine abkapseln.\n", "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.\n", "\n", "Dies scheitert jedoch, wenn immer mehr unterschiedliche Klassen, Funktionen und Strukturen ins Spiel kommen --\n", "dafür gibt es \"*Module*\".\n", "\n", "Die Verwendung von Modulen ist bereits an vielen Stellen vorgekommen:\n", "es handelt sich um die `import`-Statements.\n", "Diese laden ein Modul bzw. importieren bestimmte Symbole (welche Variablen, Funktionen oder Sub-Module sein können).\n", "\n", "Solch ein Modul kann im eigenen Programm liegen, oder global verfügbar sein." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Beispiel:* Das `math` Modul wird importiert,\n", "wobei dann die einzelnen Funktionen als Attribute zur Verfügung stehen:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2.0\n" ] } ], "source": [ "import math\n", "print(math.sqrt(4))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Beispiel*: Hier werden die Funktionen `sqrt` und `sin` aus dem Modul `math` importiert." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "9.265358966049026e-05\n", "1.4142135623730951\n" ] } ], "source": [ "from math import sqrt, sin\n", "print(sin(3.1415))\n", "print(sqrt(2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Es können auch eigene Namen für die importierten Module oder Elemente vergeben werden.\n", "Dadurch wird verhindert, dass es zu Namenskollisionen kommt!\n", "\n", "Beispiel: `sqrt` wird sowohl aus der `math` als auch der `sympy` Bibliothek importiert -- mit den Namen `csqrt` bzw. `symsqrt` -- und anschließend verwendet:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2.23606797749979\n", "2.2360679774997896964091736687312762354406183596115\n" ] } ], "source": [ "from math import sqrt as csqrt\n", "from sympy import sqrt as symsqrt\n", "print(csqrt(5))\n", "print(symsqrt(5).evalf(50))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Genauso die [PyPlot API von Matplotlib](http://matplotlib.org/api/pyplot_api.html):" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Eigene Module\n", "\n", "Eigene Module können auf (mindestens) zwei Arten erstellt werden:\n", "\n", "1. Jede eigenständige `*.py` Datei ist ein Modul.\n", "1. Ein Verzeichnis mehrerer eigenständiger `*.py` Dateien mit einer darin enthaltenen `__init__.py` Datei.\n", " Diese muss vorhanden sein, darf aber leer sein.\n", " Wenn sie Code enthält, wird dieser beim Laden des Moduls ausgeführt.\n", "\n", "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.\n", "\n", "[Module in Python 2](https://docs.python.org/2/tutorial/modules.html)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "['',\n", " '/projects/anaconda3/lib/python35.zip',\n", " '/projects/anaconda3/lib/python3.5',\n", " '/projects/anaconda3/lib/python3.5/plat-linux',\n", " '/projects/anaconda3/lib/python3.5/lib-dynload',\n", " '/projects/anaconda3/lib/python3.5/site-packages',\n", " '/projects/anaconda3/lib/python3.5/site-packages/Pint-0.7.2-py3.5.egg',\n", " '/projects/anaconda3/lib/python3.5/site-packages/contextlib2-0.5.3-py3.5.egg',\n", " '/projects/anaconda3/lib/python3.5/site-packages/cycler-0.10.0-py3.5.egg',\n", " '/projects/anaconda3/lib/python3.5/site-packages/docopt-0.6.2-py3.5.egg',\n", " '/projects/anaconda3/lib/python3.5/site-packages/pyramid-1.5.7-py3.5.egg',\n", " '/projects/anaconda3/lib/python3.5/site-packages/pyramid_jinja2-2.5-py3.5.egg',\n", " '/projects/anaconda3/lib/python3.5/site-packages/pyramid_mako-1.0.2-py3.5.egg',\n", " '/projects/anaconda3/lib/python3.5/site-packages/IPython/extensions',\n", " '/projects/61d9dd50-f69c-4c02-a474-f5706dfceb69/.sage/ipython_genutils-0.1.0']" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import sys\n", "sys.path" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import site" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Anaconda (Python 3)", "language": "python", "name": "anaconda3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 0 }