From ef6aab0fefb1b4780bfe0a513af302f30614e7ef Mon Sep 17 00:00:00 2001 From: Miriam Brauer <miriam.brauer@student.hu-berlin.de> Date: Wed, 15 Aug 2018 21:13:09 +0200 Subject: [PATCH] Replace seminar02.ipynb --- notebooks/seminar02.ipynb | 347 +++++++++++++++++++++++++------------- 1 file changed, 232 insertions(+), 115 deletions(-) diff --git a/notebooks/seminar02.ipynb b/notebooks/seminar02.ipynb index ca83659..3e3240a 100644 --- a/notebooks/seminar02.ipynb +++ b/notebooks/seminar02.ipynb @@ -6,24 +6,34 @@ "source": [ "# Seminar Problemorientierte Programmierung\n", "\n", - "## Ihre Lernziele\n", + "## Kapitel 2: Variablen, Ausdrücke und Anweisungen\n", + "[Chapter 2: Variables, expressions and statements](http://greenteapress.com/thinkpython2/html/thinkpython2003.html).\n", + "\n", + "Eine der mächtigsten Fähigkeiten von Programmiersprachen ist, **Variablen** zu verändern. Variablen sind Namen, die auf einen Wert verweisen.\n", + "\n", + "\n", + "### 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", + " - \n", + "\n", "\n", "\n", - "## Exkurs: Was mir an Python gefällt\n", "\n", - "In dieser Rubrik, die immer 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 auch ein Exkurs ist, können Sie diese Rubrik gerne auch erst einmal überspringen." + "### Exkurs: Was mir an Python gefällt\n", + "\n", + "Dieses Programm durchsucht alle Jupyter Notebooks in dem Verzeichnes in dem dieses Notebook gespeichert ist. " ] }, { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "import os\n", @@ -52,21 +62,18 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 2: Variablen, Ausdrücke und Anweisungen\n", - "\n", - "Weiter geht es in [Kapitel 2](http://greenteapress.com/thinkpython2/html/thinkpython2003.html).\n", - "\n", - "Eine der mächtigsten Fähigkeiten von Programmiersprachen ist, **Variablen** zu verändern. Variablen sind Namen, die auf einen Wert verweisen. \n", "\n", "### Zuweisung\n", "\n", - "Die **Zuweisung** ist eine besondere Form der Anweisung. Sie erzeugt eine neue Variable (falls Sie nicht schon existierte) und gibt ihr einen Wert:\n" + "Die **Zuweisung** ist eine besondere Form der Anweisung. Sie erzeugt eine neue Variable und gibt ihr einen Wert. Wenn bereits eine Variable mit dem selben Namen existiert wird dieser nur ein Wert zugewiesen:\n" ] }, { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "nachricht = \"Das ist ein ganz einfacher Mechanismus.\"\n", @@ -79,9 +86,9 @@ "metadata": {}, "source": [ "In diesem Beispiel sehen wir drei Zuweisungen:\n", - "1. die erste weist die Zeichenkette `\"Das ist ein ganz einfacher Mechanismus.\"` einer Variable mit dem Namen `nachricht` zu\n", - "2. die zweite weist die Zahl `17` der Variablen `n` zu und\n", - "3. die dritte weist (einen Näherungswert für) Pi der Variablen `pi` zu.\n", + " - die Erste weist die Zeichenkette `\"Das ist ein ganz einfacher Mechanismus.\"` einer Variable mit dem Namen `nachricht` zu\n", + " - die Zweite weist die Zahl `17` der Variablen `n` zu und\n", + " - die Dritte weist (einen Näherungswert für) Pi der Variablen `pi` zu.\n", "\n", "Legen Sie selbst ein paar Variablen an und weisen Sie Ihnen Werte zu:\n" ] @@ -89,7 +96,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [] }, @@ -106,7 +115,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "diesistabereinelangevariableundtrotzdemmeckertpythonnicht = 1" @@ -122,7 +133,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "so_ist_es_besser_lesbar = \"richtig\"" @@ -138,7 +151,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "0das_gibt_Aerger = 1" @@ -154,7 +169,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "mehr@ = 100" @@ -163,7 +180,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "class = 'Advanced Theoretical Zymurgy'" @@ -190,7 +209,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "print(1 + 2 + 3 + 4 + 5)" @@ -208,28 +229,14 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "42" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ - "n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "n + 25\n" + "42\n", + "n\n", + "n+25" ] }, { @@ -244,7 +251,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "n = 17\n", @@ -262,13 +271,18 @@ "Schreiben Sie eine Folge von drei Anweisungen:\n", "1. Weisen Sie einer Variable `radius` den Wert 3 zu.\n", "2. Weisen Sie einer Variable `umfang` den (Wert des) Ausdrucks zu, der den Umfang eines Kreises mit dem Radius `radius` berechnet\n", - "3. Geben Sie den Wert der Variablen `umfang` mit der Funktion `print` aus." + "3. Geben Sie den Wert der Variablen `umfang` mit der Funktion `print` aus.\n", + "\n", + "\n", + "*Hinweis: Die Formel ist* $U=2π⋅r$" ] }, { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [] }, @@ -290,7 +304,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ " 2 * (3-1)" @@ -306,7 +322,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ " (1+1)**(5-2) " @@ -323,7 +341,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "1 + 2**3" @@ -339,7 +359,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "2 * 3**2" @@ -357,7 +379,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "2*3-1" @@ -373,7 +397,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "6+4/2" @@ -385,7 +411,7 @@ "source": [ "ergibt 8 und nicht 5. \n", "\n", - "- Operatoren mit der gleichen Priorität werden von links nach rechts ausgewertet (ausser Exponentiation). Im Ausdruck `degrees / 2 * pi` wird also zuerst dividiert und dann wird mit `pi` multipliziert. Um stattdessen durch `pi` zu dividieren, können wir Klammern verwenden oder stattdessen `degrees / 2 / pi` schreiben.\n", + "- Operatoren mit der gleichen Priorität werden von links nach rechts ausgewertet (ausser Exponentiation). Im Ausdruck $ degrees/2*π$ wird also zuerst dividiert und dann wird mit $π$ multipliziert. Um stattdessen durch $π$ zu dividieren, können wir Klammern verwenden oder stattdessen $degrees / 2 /π$ schreiben.\n", "\n", "Wir müssen uns die Reihenfolge nicht merken. Wenn wir uns nicht sicher sind, verwenden wir einfach Klammern, um die Reihenfolge festzulegen. \n", "\n", @@ -395,7 +421,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "2 + 3.141 * 4" @@ -415,7 +443,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "'2' - '1'" @@ -424,7 +454,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "'acht' / 'zwei'" @@ -440,7 +472,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "a = \"Donau\"\n", @@ -453,7 +487,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Mit dem Operator `+` können wir Zeichenketten verknüpfen (oder verketten). D.h., die beiden Zeichenketten werden hinereinander geschrieben. \n", + "Mit dem Operator `+` können wir Zeichenketten verknüpfen (oder verketten). D.h., die Zeichenketten werden hinereinander geschrieben. \n", "\n", "Mit dem Operator `*` können wir eine Zeichkette wiederholen: " ] @@ -461,7 +495,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "c * 3" @@ -477,18 +513,25 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], - "source": [] + "source": [ + "3*c" + ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Die beiden Operatoren funktionieren ähnlich wie bei Zahlen: So wie `4*3` gleich `4+4+4` ist, ist `dampf*3` gleich `dampfdampfdampf`. Allerdings gibt es einen wichtigen Unterschied: Welche Eigenschaft erfüllt die Addition bei Zahlen, die die Verknüpfung von Zeichenketten nicht erfüllt?\n", - "- \n", + " -\n", + " - \n", + " - \n", + " - \n", "\n", - "### Kommentare \n", + "## Kommentare \n", "\n", "Sobald Programme größer und komplexer werden, wird es schwer, sie zu verstehen. Die Information, die im Programmcode steckt ist sehr dicht und es fällt oft schwer, nur durch einen Blick auf den Programmcode herauszufinden, was der Code macht und warum. \n", "\n", @@ -498,7 +541,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "pi = 3.1415926\n", @@ -517,7 +562,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "flaeche = 2 * pi * radius**2 # die Fläche eines Kreises berechnen" @@ -539,10 +586,12 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ - "v = 5 # assign 5 to v" + "v = 5 # v den Wert 5 zuweisen" ] }, { @@ -555,7 +604,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "v = 5 # Geschwindigkeit in Meter pro Sekunde" @@ -565,18 +616,27 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Übrigens können wir uns mit aussagekräftigen Variablennamen auch Kommentare sparen. (Andererseits werden Ausdrücke durch sehr lange Namen auch schwerer lesbar ... wir müssen also einen guten Mittelweg finden.) \n", + "Mit aussagekräftigen Variablennamen können wir uns Kommentare sparen, allerdings werden Ausdrücke durch sehr komplexe oder lange Namen schwer lesbar. Wir müssen also einen guten Mittelweg finden.\n", "\n", "Finden Sie heraus, was das folgende Programm tut und fügen Sie aussagekräftige Kommentare hinzu:" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "distance((x1, y1), (x2, y2)) = 5.0\n" + ] + } + ], "source": [ - "import math\n", + "import math \n", + "#Ich verstehe auch nicht genau, was sie hier berechnen. Eventuell ist ein anderes, eindeutigeres Beispiel besser\n", "\n", "x1 = 5\n", "y1 = 4\n", @@ -591,14 +651,43 @@ "print(\"distance((x1, y1), (x2, y2)) = \", distance)" ] }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x1,x2= -0.2857142857142857 -1.0\n" + ] + } + ], + "source": [ + "import math\n", + "#Alternativ Vorschlag. Natürlich deutlich simpler aber fast genauso viele Berechnungen und vielleicht offensichtlicher.\n", + "#Sie sollen ja nur kommentieren üben?\n", + "a=7\n", + "b=9\n", + "c=2\n", + "\n", + "x1=((-b)+math.sqrt((b**2)-(4*a*c)))/(2*a)\n", + "x2=((-b)-math.sqrt((b**2)-(4*a*c)))/(2*a)\n", + "\n", + "print (\"x1,x2=\", x1, x2)" + ] + }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Exkurs: Wieviele Kommentare in einem Programm gut und notwendig sind, ist durchaus umstritten. Wenn Sie mögen, können Sie einen Ausschnitt des Diskurses dazu hier verfolgen:\n", - "- \"Good code is its own best documentation.\" ([Steve McConnell](http://en.wikipedia.org/wiki/Steve_McConnell))\n", - "- http://mikegrouchy.com/blog/2013/03/yes-your-code-does-need-comments.html\n", - "- https://stackoverflow.com/questions/184618/what-is-the-best-comment-in-source-code-you-have-ever-encountered" + "Wieviele Kommentare in einem Programm gut und notwendig sind ist durchaus umstritten. Wenn Sie mögen, können Sie einen Ausschnitt des Diskurses dazu hier verfolgen:\n", + "\n", + "\n", + "- [\"Good code is its own best documentation.\" (Steve McConnell)](http://de.wikipedia.org/wiki/Steve_McConnell)\n", + "- [\"Yes your Code does need comments\" (Mike Grouchy)](http://mikegrouchy.com/blog/2013/03/yes-your-code-does-need-comments.html)\n", + "- [Funny comments](https://stackoverflow.com/questions/184618/what-is-the-best-comment-in-source-code-you-have-ever-encountered)" ] }, { @@ -609,11 +698,9 @@ "\n", "Programme können drei Arten von Fehlern enthalten:\n", "\n", - "- Syntax-Fehler (\"syntax error\")\n", - "- Laufzeit-Fehler (\"runtime error\")\n", - "- Semantische Fehler\n", - "\n", - "Lesen Sie mehr zu den Unterschieden in [Abschnitt 2.8](http://greenteapress.com/thinkpython2/html/thinkpython2003.html#sec23)." + "- Syntax-Fehler (\"syntax error\")- Fehler in der **Syntax**, also der Struktur, des Programmes. Das Programm ist nicht ausführbar bis der Fehler behoben ist. Vor allem zu Beginn, werden Sie vermutlich viele Syntax- Fehler machen, zum Beispiel in dem Sie eine Klammer vergessen. Je mehr Übung Sie haben, desto weniger Syntax-Fehler werden Sie machen und zudem werden Sie diese auch schneller finden. \n", + "- Laufzeit-Fehler (\"runtime error\")- Laufzeit-Fehler treten erst auf, während das Programm läuft. Sie werden auch **exceptions** genannt, da sie üblicherweise bedeuten, dass etwas ausergewöhnliches (und schlechtes) passiert ist. In einfachen Problemen sind Laufzeitfehler selten, Sie werden ihnen vermutlich noch eine Weile nicht begegnen. \n", + "- Semantische Fehler sind Fehler in der **Semantik**- also Fehler, die mit der Bedeutung des Programms zusammenhängen. Das Programm läuft ohne eine Fehlermeldung auszugeben, aber das Ergebnis ist nicht so wie erwartet. Das Programm tut genau das was Sie ihm gesagt haben. Semantische Fehler zu finden ist schwierig, da von der Ausgabe aus rückwärts durch das Programm gearbeitet werden muss. Häufig ist es hilfreich zusätzliche `print`-Anweisungen einzufügen, die Zwischenergebnisse ausgeben, sodass der Punkt gefunden werden kann an dem die erwarteten Ergebnisse von den tatsächlichen abweichen. \n" ] }, { @@ -624,7 +711,7 @@ "\n", "Legen wir uns eine Liste mit den wichtigsten Begriffen an, die wir im Kapitel 2 gelernt haben:\n", "- Variable:\n", - "- Zuweisung:\n", + "- Zuweisung: Eine Zuweisung ist eine Anweisung, bei der einer Variable ein Wert zugewiesen wird\n", "- Schlüsselwort:\n", "- Ausdruck:\n", "- Zeichenketten verknüpfen:\n", @@ -645,29 +732,24 @@ "\n", "#### Aufgabe 1\n", "\n", - "Wenn wir etwas neues lernen, sollten wir es immer gleich ausprobieren. Wir sollten auch versuchen, absichtlich ein paar Fehler einzubauen, um zu schauen, was dann passiert. \n", + "Wenn wir etwas neues lernen, sollten wir es immer gleich ausprobieren. Wir sollten auch versuchen absichtlich ein paar Fehler einzubauen, um zu schauen, was dann passiert. \n", "\n", "- Wir haben gesehen, dass `n = 42` erlaubt ist. Was ist mit `42 = n`?" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "markdown", "metadata": {}, "source": [ - "- Und wie schaut es mit `x = y = 1` aus? (Lassen Sie sich danach die Werte für `x` und `y` mit Hilfe der `print`-Funktion ausgeben.)" + "- Und wie sieht es mit `x = y = 1` aus? (Lassen Sie sich danach die Werte für `x` und `y` mit Hilfe der `print`-Funktion ausgeben.)" ] }, { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [] }, @@ -678,13 +760,6 @@ "- In einigen Programmiersprachen müssen Anweisungen mit einem Semikolon (;) beendet werden. Was passiert, falls wir in Python ein Semikolon ans Ende einer Anweisung schreiben?" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "markdown", "metadata": {}, @@ -695,7 +770,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [] }, @@ -711,11 +788,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "523.5987755982989\n" + ] + } + ], "source": [ - "# Geben Sie hier Ihren Ausdruck zur Berechnung ein" + "# Geben Sie hier Ihren Ausdruck zur Berechnung ein\n" ] }, { @@ -728,7 +813,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "# Geben Sie hier Ihren Ausdruck zur Berechnung ein" @@ -738,26 +825,44 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "(Ergebniskontrolle: Die gesamte Bestellung würde 1126,89€ kosten.)\n", - "\n", - "- Wenn ich mein Haus um 6:52 Uhr verlasse und 1 Meile gemütlich laufe (8:15 Minuten pro Meile), dann 3 Meilen schneller (7:12 Minuten pro Meile) und dann nochmal 1 Meile gemütlich, wann komme ich dann zum Frühstück an?" + "- Wenn ich mein Haus um 6:52 Uhr verlasse und 1 Kilometer gemütlich laufe (8:15 Minuten pro Kilometer), dann 3 Kilometer schneller (7:12 Minuten pro Kilometer) und dann nochmal 1 Kilometer gemütlich, wann komme ich dann zum Frühstück an?" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2286\n" + ] + } + ], "source": [ - "# Geben Sie hier Ihren Ausdruck zur Berechnung ein" + "#Geben Sie hier Ihren Ausdruck zur Berechnung ein" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "(Ankunft ist 7:30 Uhr und 6 Sekunden.) \n", + "#### Ergebnisse\n", + "\n", "\n", + "<a data-flickr-embed=\"true\" href=\"https://www.flickr.com/photos/jasoneppink/4964471335\" title=\"Spoiler Alert\"><img src=\"https://farm5.staticflickr.com/4110/4964471335_1f86a923f3_n.jpg\" width=\"320\" height=\"213\" alt=\"Spoiler Alert\"></a><script async src=\"//embedr.flickr.com/assets/client-code.js\" charset=\"utf-8\"></script>\n", + "\n", + "(Quelle: Jason Eppink, Flickr)\n", + "\n", + "Volumen 523.599; Die gesamte Bestellung würde 1126,89€ kosten; Ankunft ist 7:30 Uhr und 6 Sekunden" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ " Speichern Sie dieses Notebook, so dass Ihre Änderungen nicht verlorengehen (nicht auf einem Pool-Rechner). Rufen Sie dazu im Menü \"File\" den Punkt \"Download as\"->\"Notebook\" auf und nutzen Sie beispielsweise einen USB-Stick, E-Mail, Google Drive, Dropbox oder Ihre [HU-Box](https://box.hu-berlin.de/). \n", "\n" ] @@ -766,16 +871,28 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\n", "\n", - "Herzlichen Glückwunsch! Sie haben das 2. Kapitel geschafft. Weiter geht es in [3: Funktionen](seminar03.ipynb)." + "Herzlichen Glückwunsch! Sie haben das 2. Kapitel geschafft!" ] } ], "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", "name": "python", - "pygments_lexer": "ipython3" + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.2" } }, "nbformat": 4, -- GitLab