Skip to content
Snippets Groups Projects
seminar04.ipynb 72.4 KiB
Newer Older
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
schwabmi's avatar
schwabmi committed
    "# 4: Fallstudie: Schnittstellenentwurf\n",
Miriam Brauer's avatar
Miriam Brauer committed
    "[Chapter 4: Case Study: interface design](http://greenteapress.com/thinkpython/html/thinkpython005.html)\n",
    "\n",
Michel Schwab's avatar
Michel Schwab committed
    "In diesem Kapitel lernen wir anhand einer Fallstudie, wie wir Funktionen entwerfen können, die gut zusammenarbeiten.\n",
Miriam Brauer's avatar
Miriam Brauer committed
    "\n",
    "Wir lernen außerdem das `turtle`-Modul kennen, mit dessen Hilfe wir Graphiken erzeugen können.\n",
    "\n",
schwabmi's avatar
schwabmi committed
    "\n",
    "**Auch hier gilt wieder: Stellen Sie sicher, dass Sie die Konzepte der vorherigen Notebooks verstanden haben bevor Sie fortfahren.**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h1>Inhaltsverzeichnis<span class=\"tocSkip\"></span></h1>\n",
    "<div class=\"toc\"><ul class=\"toc-item\"><li><span><a href=\"#Ihre-Lernziele\" data-toc-modified-id=\"Ihre-Lernziele-1\"><span class=\"toc-item-num\">1&nbsp;&nbsp;</span>Ihre Lernziele</a></span></li><li><span><a href=\"#Exkurs:-Was-mir-an-Python-gefällt\" data-toc-modified-id=\"Exkurs:-Was-mir-an-Python-gefällt-2\"><span class=\"toc-item-num\">2&nbsp;&nbsp;</span>Exkurs: Was mir an Python gefällt</a></span></li><li><span><a href=\"#Python-für-das-turtle-Modul\" data-toc-modified-id=\"Python-für-das-turtle-Modul-3\"><span class=\"toc-item-num\">3&nbsp;&nbsp;</span>Python für das <code>turtle</code>-Modul</a></span></li><li><span><a href=\"#Das-turtle-Modul\" data-toc-modified-id=\"Das-turtle-Modul-4\"><span class=\"toc-item-num\">4&nbsp;&nbsp;</span>Das <code>turtle</code>-Modul</a></span></li><li><span><a href=\"#Einfache-Wiederholung\" data-toc-modified-id=\"Einfache-Wiederholung-5\"><span class=\"toc-item-num\">5&nbsp;&nbsp;</span>Einfache Wiederholung</a></span></li><li><span><a href=\"#4-Übungen\" data-toc-modified-id=\"4-Übungen-6\"><span class=\"toc-item-num\">6&nbsp;&nbsp;</span>4 Übungen</a></span><ul class=\"toc-item\"><li><span><a href=\"#Verkapselung\" data-toc-modified-id=\"Verkapselung-6.1\"><span class=\"toc-item-num\">6.1&nbsp;&nbsp;</span>Verkapselung</a></span></li><li><span><a href=\"#Verallgemeinerung\" data-toc-modified-id=\"Verallgemeinerung-6.2\"><span class=\"toc-item-num\">6.2&nbsp;&nbsp;</span>Verallgemeinerung</a></span></li><li><span><a href=\"#Schnittstellenentwurf\" data-toc-modified-id=\"Schnittstellenentwurf-6.3\"><span class=\"toc-item-num\">6.3&nbsp;&nbsp;</span>Schnittstellenentwurf</a></span></li><li><span><a href=\"#Refactoring\" data-toc-modified-id=\"Refactoring-6.4\"><span class=\"toc-item-num\">6.4&nbsp;&nbsp;</span>Refactoring</a></span></li></ul></li><li><span><a href=\"#Ein-Entwicklungsplan\" data-toc-modified-id=\"Ein-Entwicklungsplan-7\"><span class=\"toc-item-num\">7&nbsp;&nbsp;</span>Ein Entwicklungsplan</a></span></li><li><span><a href=\"#Docstring\" data-toc-modified-id=\"Docstring-8\"><span class=\"toc-item-num\">8&nbsp;&nbsp;</span>Docstring</a></span></li><li><span><a href=\"#Debugging\" data-toc-modified-id=\"Debugging-9\"><span class=\"toc-item-num\">9&nbsp;&nbsp;</span>Debugging</a></span></li><li><span><a href=\"#Glossar\" data-toc-modified-id=\"Glossar-10\"><span class=\"toc-item-num\">10&nbsp;&nbsp;</span>Glossar</a></span></li><li><span><a href=\"#Übung\" data-toc-modified-id=\"Übung-11\"><span class=\"toc-item-num\">11&nbsp;&nbsp;</span>Übung</a></span><ul class=\"toc-item\"><li><span><a href=\"#Aufgabe-1\" data-toc-modified-id=\"Aufgabe-1-11.1\"><span class=\"toc-item-num\">11.1&nbsp;&nbsp;</span>Aufgabe 1</a></span></li><li><span><a href=\"#Aufgabe-2\" data-toc-modified-id=\"Aufgabe-2-11.2\"><span class=\"toc-item-num\">11.2&nbsp;&nbsp;</span>Aufgabe 2</a></span></li><li><span><a href=\"#Aufgabe-3\" data-toc-modified-id=\"Aufgabe-3-11.3\"><span class=\"toc-item-num\">11.3&nbsp;&nbsp;</span>Aufgabe 3</a></span></li><li><span><a href=\"#Aufgabe-4\" data-toc-modified-id=\"Aufgabe-4-11.4\"><span class=\"toc-item-num\">11.4&nbsp;&nbsp;</span>Aufgabe 4</a></span></li><li><span><a href=\"#Aufgabe-5\" data-toc-modified-id=\"Aufgabe-5-11.5\"><span class=\"toc-item-num\">11.5&nbsp;&nbsp;</span>Aufgabe 5</a></span></li></ul></li></ul></div>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ihre Lernziele\n",
    "\n",
    "Beschreiben Sie in 2-3 Stichpunkten kurz was Sie im Seminar heute lernen wollen. Klicken Sie dazu doppelt auf diesen Text und bearbeiten Sie dann den Text:\n",
    "\n",
    "- \n",
    "- \n",
    "- \n",
    "\n",
    "\n",
schwabmi's avatar
schwabmi committed
    "## Exkurs: Was mir an Python gefällt\n",
    "\n",
    "Man kann schnell und einfach ein Programm aufschreiben und testen. Man muss es weder kompilieren, noch viel \"unnötige\" Syntax kennen:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def factorial(n):\n",
    "    if n < 2:\n",
    "        return 1\n",
    "    else:\n",
    "        return n * factorial(n - 1)\n",
    "\n",
    "print(factorial(5))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
schwabmi's avatar
schwabmi committed
    "## Python für das `turtle`-Modul\n",
    "\n",
    "\n",
    "Da das `turtle`-Modul in Jupyter-Notebooks eventuell nicht so gut funktioniert, kann es von Vorteil sein, `turtle` über die Kommandozeile aufzurufen. Dies ist prinzipiell auf allen Betriebssystemen möglich, aber auf Linux und MacOS deutlich einfacher als auf Windows. Sie können das Programm in Jupyter Notebooks schreiben und unter \"Datei -> Herunterladen als -> Python (.py)\" herunterladen und dann über die Kommandozeile öffnen.\n",
    "\n",
Miriam Brauer's avatar
Miriam Brauer committed
    "\n",
    "\n",
    "Falls Sie Linux nutzen, sollte Python bereits installiert sein. Um das gewünschte Programm zu öffnen tun Sie folgendes: \n",
    "1. Speichern Sie das Programm, das sie aufrufen möchten als Python-Programm mit der Dateiendung `.py`.\n",
    "2. Öffnen Sie die Kommandozeile.\n",
    "3. Gehen Sie in das Verzeichnis, in dem das Programm gespeichert ist. Geben Sie dafür `cd /pfad/zum/verzeichnis`  ein. \n",
Miriam Brauer's avatar
Miriam Brauer committed
    "4. Geben Sie auf der Kommandozeile `python programm.py` ein\n",
    "5. Alternativ können Sie auch direkt `python /pfad/zum/verzeichnis/programm.py` eingeben. \n",
Miriam Brauer's avatar
Miriam Brauer committed
    "\n",
    "Falls Sie MacOS verwenden, gehen Sie folgendermaßen vor:\n",
schwabmi's avatar
schwabmi committed
    "1. Speichern Sie das Programm, dass Sie aufrufen möchten als Python-Programm mit der Dateiendung `.py`.\n",
Miriam Brauer's avatar
Miriam Brauer committed
    "2. Öffnen Sie das Terminal\n",
    "3. Gehen Sie in das Verzeichnis, in welchem das Programm gespeichert ist, indem sie `cd /pfad/zum/verzeichnis`eingeben\n",
schwabmi's avatar
schwabmi committed
    "4. Geben Sie im Terminal `python programm.py` ein.\n",
    "5. Alternativ können Sie auch direkt `python /pfad/zum/verzeichnis/programm.py` eingeben. \n",
    "\n",
Miriam Brauer's avatar
Miriam Brauer committed
    "\n",
    "Falls Sie Windows verwenden, brauchen Sie beim ersten Aufruf etwas länger und müssen zusätzliche Schritte vornehmen, bei weiterer Verwendung springen Sie direkt zu Punkt 2 der Anleitung:\n",
    "1. Fügen Sie Python zur PATH-Umgebung hinzu:  \n",
    "    1.1. Finden Sie heraus wo Anaconda und Python gespeichert sind. (Dafür geben sie im Anaconda Prompt `where anaconda`und `where python` ein.)  \n",
Miriam Brauer's avatar
Miriam Brauer committed
    "    1.2. Öffnen Sie den Explorer und öffnen Sie das Rechtsklick-Menü von `Dieser PC`  \n",
    "    1.3. Wählen Sie Eigenschaften  \n",
    "    1.4. Wählen Sie Erweiterte Systemeinstellungen  \n",
    "    1.5. Wählen Sie Umgebungsvariablen  \n",
    "    1.6. Klicken Sie `Path` im unteren Fenster an und dann auf `bearbeiten`  \n",
Miriam Brauer's avatar
Miriam Brauer committed
    "    1.7. Klicken Sie auf `neu`und fügen Sie den Pfad für `Anaconda` hinzu, aber lassen Sie `anaconda.exe` weg  \n",
    "    1.8. Wiederholen Sie dasselbe analog für den `Python`-Pfad, dabei lassen Sie `python.exe` weg.  \n",
schwabmi's avatar
schwabmi committed
    "    1.9. Klicken Sie zweimal okay und schließen Sie die Systemsteuerung  \n",
    "    1.10. Öffnen Sie die Kommandozeile (`cmd` in der Suchleiste eingeben und `enter` drücken) und geben sie `python` oder `python.exe` ein. Wenn Sie Erfolg hatten, öffnet sich Python und Sie können in der Kommandozeile programmieren.  \n",
Miriam Brauer's avatar
Miriam Brauer committed
    "    1.11. Verlassen Sie `python` indem sie `exit()` eingeben.  \n",
    "2. Speichern Sie das Programm, das sie aufrufen möchten als Python-Programm mit der Dateiendung `.py`.\n",
Miriam Brauer's avatar
Miriam Brauer committed
    "3. Geben Sie in der Kommandozeile `python.exe` und den Pfad zu Ihrem Programm ein (also `C:\\Users\\IhrName\\Documents\\nested\\programm.py`)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
schwabmi's avatar
schwabmi committed
    "## Das `turtle`-Modul\n",
    "\n",
    "Führen Sie den folgenden Code aus, um zu testen, ob das `turtle`-Modul installiert ist:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import turtle\n",
    "bob = turtle.Turtle()\n",
    "turtle.mainloop()\n",
    "turtle.bye()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Es sollte sich ein Fenster öffnen, in dem ein kleiner Pfeil zu sehen ist -- dieser repräsentiert die Schildkröte (\"turtle\"). Schließen Sie das Fenster. (Danach erscheint ggf. eine Fehlermeldung -- nicht erschrecken, diese ist im Allgemeinen harmlos.) \n",
schwabmi's avatar
schwabmi committed
    "\n",
    "\n",
    "<details>\n",
    "    <summary type=\"button\" class=\"btn btn-info\"> Hinweis</summary>\n",
    "  <div class=\"alert alert-info\" role=\"alert\">\n",
    "      \n",
    "In Jupyter gibt es manchmal Probleme mit dem `turtle`-Modul. **Wichtig ist, dass Sie stets das Turtle-Fenster schließen.** Manchmal hilft es, den Code nochmal auszuführen oder im Kernel-Menü den Punkt \"Restart & Clear Output\" aufzurufen. Wenn es gar nicht klappt, dann nutzen Sie für die Turtle-Programmierung bitte nicht Jupyter-Notebooks, sondern Python-Dateien und führen diese direkt mit Python aus.   \n",
    "Manchmal vergisst Jupyter Notebooks auch, dass bereits eine Schildkröte existiert, in diesem Fall initialisieren Sie diese bitte einfach am Anfang des gewünschten Code-Blocks.        \n",
    "  </div>       \n",
    "</details>\n",
Michel Schwab's avatar
Michel Schwab committed
    "Probieren Sie nun Folgendes (am besten in einem eigenen Jupyter-Notebook, einer eigenen Python-Datei oder im folgenden Block, den Sie dann schrittweise ergänzen):"
schwabmi's avatar
schwabmi committed
   "cell_type": "markdown",
   "metadata": {},
   "source": [
schwabmi's avatar
schwabmi committed
    "```python\n",
    "import turtle\n",
    "bob = turtle.Turtle()\n",
    "print(bob)\n",
    "turtle.mainloop() \n",
schwabmi's avatar
schwabmi committed
    "turtle.bye()\n",
    "```"
Miriam Brauer's avatar
Miriam Brauer committed
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Das `turtle`-Modul (mit kleinem `t`) stellt eine Funktion `Turtle` (mit großem `T`) bereit, die ein Turtle-Objekt erzeugt -- dieses weisen wir einer Variable mit dem Namen `bob` zu. Wenn wir `bob` mit `print` ausgeben, erhalten wir eine Ausgabe ähnlich\n",
    "\n",
    "```\n",
    "<turtle.Turtle object at 0xb7bfbf4c>\n",
    "```\n",
    "\n",
Michel Schwab's avatar
Michel Schwab committed
    "Das bedeutet, dass `bob` auf ein Objekt vom Typ `Turtle` verweist, wie es im `turtle`-Modul definiert wird.\n",
Miriam Brauer's avatar
Miriam Brauer committed
    "Der Aufruf von `mainloop` weist das Fenster an, auf Nutzeraktivität zu warten. In diesem Fall kann man als NutzerIn allerdings kaum mehr tun, als das Fenster zu schließen.\n",
Miriam Brauer's avatar
Miriam Brauer committed
    "Sobald wir eine Schildkröte erzeugt haben, können wir eine **Methode** aufrufen, um die Schildkröte im Fenster zu bewegen. Eine Methode ist einer Funktion ähnlich, aber die Syntax ist etwas anders. Zum Beispiel können wir die Schildkröte mit dem Aufruf von \n",
    "\n",
    "```python\n",
    "bob.fd(100)\n",
    "```\n",
    "\n",
    "nach vorne bewegen. Die Methode `fd` gehört zu dem Turtle-Objekt welches wir `bob` nennen. Wenn wir die Methode aufrufen, bitten wir `bob` nach vorne zu gehen (**f**orwar**d**).\n",
    "\n",
    "Das Argument von `fd` ist eine Strecke in Pixeln (den Bildpunkten auf dem Monitor), daher hängt die Entfernung, die `bob` geht, von unserer Monitorauflösung ab.\n",
    "\n",
Michel Schwab's avatar
Michel Schwab committed
    "Andere Methoden, die wir auf einer Schildkröte aufrufen können, sind `bk` für eine Rückwärtsbewegung (**b**ac**k**ward), `lt` für eine Linksdrehung (**l**eft **t**urn) und `rt` für eine Rechtsdrehung (**r**ight **t**urn). Das Argument für `lt` und `rt` ist ein Winkel in Grad.\n",
Michel Schwab's avatar
Michel Schwab committed
    "Jede Schildkröte hat außerdem einen \"Stift\", der entweder \"oben\" oder \"unten\" ist. Wenn der Stift unten ist, berührt der Stift sozusagen das Papier und die Schildkröte hinterlässt eine Spur wenn sie sich bewegt. Die Methoden `pu` und `pd` stehen für \"Stift hoch\" (**p**en **u**p) und \"Stift herunter\" (**p**en **d**own). Diese beiden Methoden brauchen kein Argument als Input.\n",
    "\n",
    "Fügen Sie die folgenden Zeilen zu Ihrem Programm hinzu, um einen rechten Winkel zu zeichnen (nachdem Sie `bob` erzeugt haben und bevor Sie `mainloop` aufrufen):\n",
    "\n",
    "```python\n",
    "bob.fd(100)\n",
    "bob.lt(90)\n",
    "bob.fd(100)\n",
    "```\n",
    "\n",
    "Wenn Sie dieses Programm ausführen, sollte sich `bob` zunächst nach Osten und dann nach Norden bewegen und dabei zwei Strecken zeichnen.\n",
Loading
Loading full blame...