{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Seminar Problemorientierte Programmierung\n", "\n", "Falls Sie im Python Programmierkurs sind und dies ihr erstes geöffnetes Jupyter Notebook ist: \n", "\n", "**Herzlichen Glückwunsch! Sie haben die erste Hürde gemeistert. :)**\n", "\n", "Diese Notebooks sind im Wesentlichen eine Übersetzung der 3. Ausgabe des Buches [Think Python](https://greenteapress.com/wp/think-python-3rd-edition/) von Allen B. Downey.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Lernziele und Ablauf diese Seminars\n", "\n", "Unser Lernziel ist, programmieren zu lernen (mit Python :-)). Bis dahin ist es ein weiter Weg. Der beste Tipp ist: üben, üben, üben.\n", "\n", "Das Seminar wird wie folgt ablaufen:\n", "\n", "1. Sie arbeiten als Pair-Programming-Team diese Jupyter-Notebooks durch. \n", " - Währenddessen bin ich für Sie da, um Fragen zu beantworten und Probleme zu lösen\n", " - Nutzen Sie gerne auch das [gemeinsame Etherpad](https://etherpad.gwdg.de/p/Pro2P), um Probleme, Fragen oder fehlerhaften Code zu posten. \n", "2. Alle ca. 15 Minuten unterbrechen wir das Programmieren und Sie wechseln die Rollen (NavigatorIn <--> FahrerIn)\n", "3. Die Schritte 1. und 2. wiederholen wir bis zum Ende des Seminars\n", "4. Zuhause arbeiten Sie gemeinsam das durch, was Sie im Seminar nicht geschafft haben. Dies gilt besonders für die Aufgaben \n", " - Wir werden im Seminar entscheiden, bis zu welchem Notebook Sie kommen sollten.\n", " \n", "## Tipps\n", "\n", " - Arbeiten Sie die Notebooks selbständig im Team durch und probieren Sie möglichst viel aus. Seien Sie kreativ, neugierig und manchmal auch destruktiv. Denn auch durch Fehler lernen Sie.\n", " - Sie können alles in Ihrem Notebook bearbeiten ... nutzen Sie diese Möglichkeit. Ergänzen Sie also Text, löschen Sie, was Sie überflüssig finden, fügen Sie Ihre eigenen Notizen oder Programme hinzu. Dieses Notebook kann Ihr \"Portfolio\" werden: eine Demonstration dessen, was Sie schon können.\n", " - Denken Sie daran, alle Code-Blöcke auszuführen. \"Unbekannter\" Code führt in Jupyter häufig zu leicht vermeidbaren Fehlern.\n", " - Falls Sie mal nicht weiterkommen: helfen Sie sich gegenseitig und versuchen Sie verschiedene Dinge. Schreiben Sie Ihr Problem z.B. einfach mal ganz genau hier im Notebook auf. Oft hilft das Aufschreiben eines Problems schon bei der Lösung eines Problems.\n", "\n", "## Wiederkehrende Abschnitte\n", "\n", " - **Exkurse** sind Material, welches Sie sich nur anschauen brauchen, falls es Sie interessiert. Bitte schauen Sie sich die Exkurse eher zu Hause an, als während des Seminars, damit Sie vorwärts kommen. Die Inhalte der Exkurse sind nicht notwendig, um vorwärts zu kommen, aber hilfreich, um mehr zu lernen.\n", " - **Debugging-Abschnitte** erklären, wie Sie Fehler finden und beheben können.\n", " - **Glossar-Abschnitte** listen die Begriffe auf, die im Kapitel vermittelt wurden. Es ist eine gute Übung für zu Hause, jeden Begriff dort noch einmal in eigenen Worten zu definieren.\n", " - Schließlich gibt es **Übungen**, diese sollten Sie unbedingt durchführen und erst fortfahren, wenn Sie die Aufgaben lösen konnten und verstanden haben." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " \n", "## Hinweise zur Benutzung von Jupyter\n", "\n", "### Jupyter Notebook Grundlagen und Informationen\n", "\n", "- open-source, browserbasiertes Tool für verschiedene Programmiersprachen (wir benutzen Python)\n", "- **Vorteil**: Code, Visualisierungen und Text / Erklärungen in einem Dokument\n", "- Notebook besteht aus Blöcken bzw. Zellen\n", "- Unter der Zelle wird der Rückgabewert des letzten Statements ausgegeben\n", "- Quellcode kann auf mehrere Blöcke aufgeteilt werden (Variablen behalten ihre Gültigkeit/Sichtbarkeit)\n", "- Es gibt zwei Arten von Blöcken: \"Code\" ist für Python-Code, \"Markdown\" ist für Texte, die Sie mit Hilfe der [Markdown-Syntax](https://de.wikipedia.org/wiki/Markdown#Auszeichnungsbeispiele) formatieren können.\n", "- Sie können auf Text doppelt klicken, um sich den Markdown-Quellcode anzuzeigen. Probieren Sie es mit diesem Text aus.\n", "- durch die Tastenkombination \"Strg\" und \"Enter\" oder durch Drücken von dem \"Run\" Button oben im Menü kommen Sie wieder in den Lesemodus \n", "- Wenn Sie mal etwas \"kaputtgespielt\" haben, hilft es evtl., im \"Kernel\"-Menü den \"Restart\"-Eintrag auszuwählen.\n", "\n", "### Standardbrowser\n", "\n", "Bitte verwenden Sie **nicht** Safari oder Internet Explorer. Auch mit Windows Edge gab es in der Vergangenheit Probleme. Wir empfehlen die Verwendung von Firefox, aber auch Google Chrome lief in der Vergangenheit problemlos. Wenn Sie unsicher sind, was ihr aktueller Standardbrowser ist, folgen Sie einfach der folgenden Anleitung zum Ändern des Standardbrowsers und gehen Sie sicher, dass der richtige Standardbrowser ausgewählt ist.\n", "\n", "#### Anleitungen\n", "\n", "**Änderung des Standardbrowsers in...** \n", "\n", "*macOS:* \n", "1. Öffnen sie die Systemeinstellungen.\n", "2. Klicken Sie auf „Allgemein“.\n", "3. Wählen Sie unter „Standard-Webbrowser“ den gewünschten Browser aus.\n", "\n", "*Ubuntu Linux:* \n", "1. Öffnen Sie die System Settings.\n", "2. Klicken Sie auf „Applications“.\n", "3. Wählen Sie in der linken Spalte „Default Applications“ aus.\n", "4. Klicken Sie in der Spalte rechts davon auf „Web Browser“.\n", "5. Wählen Sie „in the following browser:“ aus.\n", "6. Wählen Sie den gewünschten Browser aus.\n", "\n", "*Windows:* \n", "1. Öffnen Sie die Systemsteuerung.\n", "2. Klicken Sie auf „Standardprogramme“.\n", "3. Klicken Sie auf „Standardprogramme festlegen“.\n", "4. Klicken Sie in der Liste auf den gewünschten Browser.\n", "5. Klicken Sie dann auf „Dieses Programm als Standard festlegen“.\n", "\n", "\n", "\n", "### Shortcuts\n", "\n", "**Bitte probieren Sie alle unten stehenden Befehle und verstehen Sie, was gemacht wird. Das ist die Basis, die Sie für das Arbeiten mit Jupyter Notebooks brauchen.**\n", "\n", "Übersicht: *Menü Help -> Keyboard Shortcuts*\n", "\n", "Wichtigste Shortcuts: \n", "\n", "- *Enter*: Editiermodus für selektierte Zelle (grün umrandet)\n", "- *Esc*: Editiermodus verlassen/Kommandomodus (blau umrandet)\n", "- *Strg + Enter*: Selektierte Zelle ausführen\n", "- *Shift + Enter*: Selektierte Zelle ausführen und in nächste Zelle springen\n", "\n", "Im Editiermodus:\n", "- *Tab*: Autocomplete oder Einrücken\n", "- *Shift + Tab*: Einrücken rückwärts\n", "\n", "Im Kommando-/Lesemodus:\n", "- *B*: Zelle darunter einfügen\n", "- *A*: Zelle darüber einfügen\n", "- *DD*: Zelle löschen\n", "- *M*: Zelltyp Markdown (für formatierte beschreibende Texte, zB diese Zelle)\n", "- *Y*: Zelltyp Code (Default)\n", "- *Strg + Shift + k*: Inhaltsverzeichnis einblenden/ausblenden\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Beispiel: Markdown Zelle vs. Code Zelle" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Dies ist eine **Markdown Zelle**. Hier kann jeglicher Text geschrieben werden. Durch Strg+Enter wird er in den Lesemodus gebracht, durch ein einfach Enter (oder Doppelklick) in den Editiermodus.\n", "\n", "Hier werden keine Rechnungen ausgeführt, siehe:\n", "\n", "5+3\n", "\n", "In diesen Feldern werden Erklärungen, Aufgabenstellungen und schriftliche Antworten von euch stehen." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Das ist eine **Code Zelle**, bei Strg+Enter wird die folgende Rechnung ausgeführt und darunter angezeigt\n", "# Mit Enter kommt man in den Editiermodus, mit Strg+Enter wird der Code ausgeführt.\n", "# Der Text kann hier nur stehen, da eine Raute am Anfang der Zeile steht. \n", "# Dadurch werden diese Zeilen nicht ausgeführt.\n", "\n", "31+11\n", "\n", "# In diesen Zellen wird der Python Code geschrieben, manchmal müssen Sie ihn schreiben, \n", "# manchmal steht der Code schon dort und muss von Ihnen nur ausgeführt werden." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Code für *Think Python*\n", "Am Anfang eines Notebooks sehen Sie üblicherweise eine Zelle mit einem Code wie diesem:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from os.path import basename, exists\n", "\n", "def download(url):\n", " filename = basename(url)\n", " if not exists(filename):\n", " from urllib.request import urlretrieve\n", "\n", " local, _ = urlretrieve(url, filename)\n", " print(\"Downloaded \" + str(local))\n", " return filename\n", "\n", "download('https://raw.githubusercontent.com/AllenDowney/ThinkPython/v3/thinkpython.py')\n", "\n", "import thinkpython" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sie müssen nicht wissen, wie dieser Code funktioniert, aber wenn Sie am Ende des Kurses angelangt sind, wird das meiste davon einen Sinn ergeben. Wie Sie sich vielleicht denken können, wird eine Datei heruntergeladen - genauer gesagt, `thinkpython.py`. Diese Datei enthält Python-Code, der speziell für dieses Buch bereitgestellt wurde. \n", "Die letzte Zeile *importiert* diesen Code, was bedeutet, dass wir den Code im Notebook verwenden können.\n", "\n", "In anderen Kapiteln werden Sie Code sehen, der `diagram.py` herunterlädt, mit dem die Diagramme im Buch erstellt werden, sowie `jupyturtle.py`, das in mehreren Kapiteln zur Erstellung von [*Turtle-Grafiken*](https://docs.python.org/3/library/turtle.html) verwendet wird.\n", "\n", "An einigen Stellen werden Sie eine Zelle wie diese sehen, die mit `%%expect` beginnt." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%%expect SyntaxError\n", "\n", "abs 42" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`%%expect` ist nicht Teil von Python - es ist ein [*magischer Befehl*](https://ipython.readthedocs.io/en/stable/interactive/magics.html) von Jupyter, der anzeigt, dass wir erwarten, dass die Zelle einen Fehler produziert. Wenn Sie diesen Befehl sehen, bedeutet das, dass der Fehler beabsichtigt ist. Das tun wir um auf typische Fehler hinzuweisen.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exkurs: Was mir an Python gefällt:\n", "\n", "In dieser Rubrik, die normalerweise am Anfang eines Kapitels steht, möchte ich Ihnen zeigen, wofür ich Python nutze und warum ich es mag. Sie werden vielleicht noch nicht verstehen, was ich genau mache, aber Sie sehen damit schon einmal die Möglichkeiten von Python und können später darauf zurückgreifen. Da dies ein Exkurs ist, können Sie diese Rubrik gerne auch erst einmal überspringen.\n", "\n", "**Hier müssen Sie den Code NIE verändern. Einfach Ausführen durch: *Strg+Enter* oder im Menü unter *> Run*.** \n", "*Sollten Sie den Code doch einmal versehentlich verändert haben, sodass der Exkurs nicht mehr korrekt funktioniert, können Sie das Jupyter-Notebook erneut in Gitlab herunterladen*\n", "\n", "\n", "Ich finde toll, dass ich mit Python ganz einfach Zufallsexperimente durchtesten kann. Das hilft mir, Stochastik besser zu verstehen. Z.B. das Würfeln mit zwei Würfeln:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import random # Zufallszahlen, siehe https://docs.python.org/3/library/random.html\n", "\n", "# Werte initialisieren, größter möglicher Wert bei zwei Würfeln: 6+6=12 \n", "haeufigkeiten = [0 for i in range(13)]\n", "\n", "wuerfe = 1000\n", "for i in range(wuerfe):\n", " # Würfelsumme für zwei Würfel zählen\n", " haeufigkeiten[random.randrange(1,7) + random.randrange(1,7)] += 1\n", "\n", "# Ergebnis als Tabelle ausgeben\n", "print(\"Wir würfeln wiederholt mit zwei sechsseitigen Würfeln und addieren die Augenzahlen zusammen:\")\n", "print(\"Summe Augenzahlen:\", \"\\t\".join([str(i) for i in range(2,13)]), sep='\\t')\n", "print(\"Anzahl der Würfe:\", \"\\t\".join([str(i) for i in haeufigkeiten[2:]]), sep='\\t')\n", "print(\"Wahrscheinlichkeit:\", \"\\t\".join([\"{:2.3f}\".format(i/wuerfe) for i in haeufigkeiten[2:]]), sep='\\t')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "([Random Number](https://xkcd.com/221/), Randall Munroe)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "<img src=\"https://scm.cms.hu-berlin.de/ibi/python/-/raw/master/img/by-nc-sa.png\" alt=\"CC BY-NC-SA\" style=\"width: 150px;\"/>\n", "\n", "Der Text dieses Notebooks ist als freies Werk unter der Lizenz [CC BY-NC-SA 4.0 ](https://creativecommons.org/licenses/by-nc-sa/4.0/) verfügbar.\n", "Der Code dieses Notebooks ist als freies Werk unter der Lizenz [MIT License](https://mit-license.org/) verfügbar.\n", "\n", "Es handelt sich um übersetzte und leicht veränderte Notebooks von [Allen B. Downey](https://allendowney.com) aus [Think Python: 3rd Edition](https://allendowney.github.io/ThinkPython/index.html).\n" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "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.12.2" } }, "nbformat": 4, "nbformat_minor": 4 }