|
|
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
|
"cells": [ |
|
|
|
|
|
{ |
|
|
|
|
|
"cell_type": "markdown", |
|
|
|
|
|
"id": "dc8e0f84e056e789", |
|
|
|
|
|
"metadata": {}, |
|
|
|
|
|
"source": [ |
|
|
|
|
|
"# Turtle Graphics\n", |
|
|
|
|
|
"\n", |
|
|
|
|
|
"![Turtle](img/turtle_comic.png)\n", |
|
|
|
|
|
"\n", |
|
|
|
|
|
"Erinnern Sie sich noch an **Reeborg**? Wir lernen heute eine Freundin von **Reeborg** kennen, die sich ebenfalls durch Python steuern lässt: **Sophia**!\n", |
|
|
|
|
|
"\n", |
|
|
|
|
|
"**Sophia** ist eine Schildkrötendame, die immer einen Stift mit sich führt. Bei jeder Bewegung hinterlässt sie daher einen Strich auf dem Boden - es sei denn, sie hat den Stift gerade angehoben. Wie **Reeborg** versteht auch **Sophia** eine Reihe von Befehlen, z.B.:\n", |
|
|
|
|
|
"\n", |
|
|
|
|
|
"| Befehl | Beschreibung |\n", |
|
|
|
|
|
"|----------------|---------------------------------------------------|\n", |
|
|
|
|
|
"| `penup()` | Hebt den Stift an (bis er wieder abgesetzt wird) |\n", |
|
|
|
|
|
"| `pendown()` | Setzt den Stift wieder ab |\n", |
|
|
|
|
|
"| `forward(100)` | Bewegt die Schildkröte um 100 Schritte nach vorne |\n", |
|
|
|
|
|
"\n", |
|
|
|
|
|
"Der letzte Befehl ist interessant, weil wir zum ersten Mal in den Klammern einen Wert eingetragen haben. Damit wird der Befehl viel flexibler, da wir jetzt ganz unterschiedliche Entfernungen eintragen können. Ein solcher dem Befehl mitgegebener Wert heißt auch **Parameter**.\n", |
|
|
|
|
|
"\n", |
|
|
|
|
|
"## Initialisierung\n", |
|
|
|
|
|
"\n", |
|
|
|
|
|
"Damit **Sophia** malen kann, müssen wir sie aber erst mal aus dem Garten holen und auf ein Blatt Papier setzen. Das Reinholen machen wir mit\n", |
|
|
|
|
|
"\n", |
|
|
|
|
|
" `from ipyturtlenext import Turtle`\n", |
|
|
|
|
|
" \n", |
|
|
|
|
|
" Auf das Papier setzen wir die Schildkröte mit dem Befehl\n", |
|
|
|
|
|
" \n", |
|
|
|
|
|
" `sophia = Turtle(400, 200)`\n", |
|
|
|
|
|
" \n", |
|
|
|
|
|
"Wieder sehen wir **Parameter**, diesmal sogar zwei! Sie geben die Breite (400) und die Höhe (200) des Papiers in Schildkrötenschritten an. Die Schildkröte setzen wir immer genau in die Mitte des Papiers, d.h. sie könnte jetzt nach links und nach rechts je 200 Schritte laufen, nach oben und nach unten je 100 Schritte.\n", |
|
|
|
|
|
"\n", |
|
|
|
|
|
"Und noch etwas sehen wir hier das erste Mal: Der Befehl gibt uns etwas zurück, nämlich die Schildkröte selbst. Wir müssen ihr einen Namen geben, damit wir sie später ansprechen können. Wir nennen sie hier `sophia` - ist ja klar.\n", |
|
|
|
|
|
"\n", |
|
|
|
|
|
"Jetzt könnte es eigentlich losgehen und **Sophia** könnte malen. Wir würden es nur nicht sehen. Damit wir immer verfolgen können, wo die Schildkröte gerade ist und was sie schon gezeihnet hat, müssen wir einmal ihren Namen hinschreiben." |
|
|
|
|
|
] |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"cell_type": "code", |
|
|
|
|
|
"execution_count": 1, |
|
|
|
|
|
"id": "d70d7e4f36f35348", |
|
|
|
|
|
"metadata": { |
|
|
|
|
|
"ExecuteTime": { |
|
|
|
|
|
"end_time": "2024-07-12T14:36:30.469068Z", |
|
|
|
|
|
"start_time": "2024-07-12T14:36:30.371897Z" |
|
|
|
|
|
} |
|
|
|
|
|
}, |
|
|
|
|
|
"outputs": [], |
|
|
|
|
|
"source": [ |
|
|
|
|
|
"from ipyturtle2 import TurtleWidget\n" |
|
|
|
|
|
] |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"cell_type": "code", |
|
|
|
|
|
"execution_count": 2, |
|
|
|
|
|
"id": "f865f3f86f2f6c1c", |
|
|
|
|
|
"metadata": {}, |
|
|
|
|
|
"outputs": [], |
|
|
|
|
|
"source": [ |
|
|
|
|
|
"sophia = TurtleWidget(400, 200)" |
|
|
|
|
|
] |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"cell_type": "code", |
|
|
|
|
|
"execution_count": 3, |
|
|
|
|
|
"id": "95b42bd88ad128b", |
|
|
|
|
|
"metadata": {}, |
|
|
|
|
|
"outputs": [ |
|
|
|
|
|
{ |
|
|
|
|
|
"data": { |
|
|
|
|
|
"application/vnd.jupyter.widget-view+json": { |
|
|
|
|
|
"model_id": "3a9d3f580f7a479abd4871682c52e1ce", |
|
|
|
|
|
"version_major": 2, |
|
|
|
|
|
"version_minor": 0 |
|
|
|
|
|
}, |
|
|
|
|
|
"text/plain": [ |
|
|
|
|
|
"TurtleWidget()" |
|
|
|
|
|
] |
|
|
|
|
|
}, |
|
|
|
|
|
"execution_count": 3, |
|
|
|
|
|
"metadata": {}, |
|
|
|
|
|
"output_type": "execute_result" |
|
|
|
|
|
} |
|
|
|
|
|
], |
|
|
|
|
|
"source": [ |
|
|
|
|
|
"sophia" |
|
|
|
|
|
] |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"cell_type": "markdown", |
|
|
|
|
|
"id": "52fe6e4c13bb7191", |
|
|
|
|
|
"metadata": {}, |
|
|
|
|
|
"source": [ |
|
|
|
|
|
"Ok, das sieht jetzt nicht ganz wie eine Schildkröte aus, aber mit etwas Fantasie kann man sie sich schon vorstellen. Und wir sehen auch, dass sie nach rechts schaut. Das macht sie am Anfang immer. " |
|
|
|
|
|
] |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"cell_type": "markdown", |
|
|
|
|
|
"id": "4b98fa7bfb3e7e25", |
|
|
|
|
|
"metadata": {}, |
|
|
|
|
|
"source": [ |
|
|
|
|
|
"## Erste Schritte\n", |
|
|
|
|
|
"\n", |
|
|
|
|
|
"Bei **Reeborg** haben wir die Befehle jetzt einfach hingeschrieben und er hat sie ausgeführt. **Sophia** ist da etwas zickig, sie möchte direkt angesprochen werden. Damit sie also etwas macht, muss immer ihr Name, ein Punkt und anschließend der Befehl angegeben werden." |
|
|
|
|
|
] |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"cell_type": "code", |
|
|
|
|
|
"execution_count": 17, |
|
|
|
|
|
"id": "f94d6c1158c6bea3", |
|
|
|
|
|
"metadata": {}, |
|
|
|
|
|
"outputs": [], |
|
|
|
|
|
"source": [ |
|
|
|
|
|
"sophia.forward(20)" |
|
|
|
|
|
] |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"cell_type": "markdown", |
|
|
|
|
|
"id": "b88c4dc209e183e2", |
|
|
|
|
|
"metadata": {}, |
|
|
|
|
|
"source": [ |
|
|
|
|
|
"Das gibt es ziemlich häufig in Python: `sophia` steht hier für ein (Schildkröten-) **Objekt**, dem wir eine **Nachricht** (nämlich den Befehl `forward` mit dem Parameter `20`) schicken. Anschließend entscheidet das **Objekt**, ob und was zu tun ist. Das Verhalten kann nämlich vom **Zustand** des **Objekts** abhängen.\n", |
|
|
|
|
|
"\n", |
|
|
|
|
|
"Wenn **Sopia** beispielsweise den Stift gerade angehoben hat, dann bewegt der Befehl `forward(5)` die Schildkröte nur 5 Schritte nach vorne, ohne dass etwas gemalt wird. Der gleiche Befehl hinterlässt aber bei abgesetztem Stift zusätzlich eine Linie." |
|
|
|
|
|
] |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"cell_type": "code", |
|
|
|
|
|
"execution_count": 18, |
|
|
|
|
|
"id": "14371706097df06e", |
|
|
|
|
|
"metadata": {}, |
|
|
|
|
|
"outputs": [], |
|
|
|
|
|
"source": [ |
|
|
|
|
|
"for _ in range(10):\n", |
|
|
|
|
|
" sophia.penup()\n", |
|
|
|
|
|
" sophia.forward(5)\n", |
|
|
|
|
|
" sophia.pendown()\n", |
|
|
|
|
|
" sophia.forward(5)" |
|
|
|
|
|
] |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"cell_type": "markdown", |
|
|
|
|
|
"id": "85a3cb67454a19e8", |
|
|
|
|
|
"metadata": {}, |
|
|
|
|
|
"source": [ |
|
|
|
|
|
"## Weitere Befehle\n", |
|
|
|
|
|
"\n", |
|
|
|
|
|
"**Sophia** ist ziemlich klug (kein Wunder, bei dem Namen). Deswegen versteht sie noch einige weitere Befehle:\n", |
|
|
|
|
|
"\n", |
|
|
|
|
|
"| Befehl | Beschreibung |\n", |
|
|
|
|
|
"|---------------------|-----------------------------------------------------------------------|\n", |
|
|
|
|
|
"| `reset()` | Löscht alle Zeichnungen und setzt die Schildkröte wieder in die Mitte |\n", |
|
|
|
|
|
"| `right(90)` | Dreht die Schildkröte um 90 Grad nach rechts |\n", |
|
|
|
|
|
"| `left(90)` | Dreht die Schildkröte um 90 Grad nach links |\n", |
|
|
|
|
|
"| `back(50)` | Bewegt die Schildkröte um 50 Schritte rückwarts |\n", |
|
|
|
|
|
"| `pencolor('Green')` | Setzt die Stiftfarbe auf Grün |\n", |
|
|
|
|
|
"\n", |
|
|
|
|
|
"Der letzte Befehl ist wieder interessant, weil er einen **Text** als Parameter hat. Texte werden in Python in Hochkommas eingeschlossen, wobei es egal ist, ob es einfache `'` oder doppelte `\"` Hochkommas sind - es muss das öffnende Hochkomma mit dem schließenden zusammenpassen." |
|
|
|
|
|
] |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"cell_type": "code", |
|
|
|
|
|
"execution_count": 28, |
|
|
|
|
|
"id": "65704e37ac3f5151", |
|
|
|
|
|
"metadata": {}, |
|
|
|
|
|
"outputs": [], |
|
|
|
|
|
"source": [ |
|
|
|
|
|
"sophia.reset()\n", |
|
|
|
|
|
"sophia.pencolor('Green')\n", |
|
|
|
|
|
"sophia.forward(30)\n", |
|
|
|
|
|
"sophia.pencolor('Blue')\n", |
|
|
|
|
|
"sophia.forward(30)\n", |
|
|
|
|
|
"sophia.pencolor('Red')\n", |
|
|
|
|
|
"sophia.forward(30)\n", |
|
|
|
|
|
"sophia.pencolor('White')\n", |
|
|
|
|
|
"sophia.forward(30)\n", |
|
|
|
|
|
"sophia.pencolor('Black')\n", |
|
|
|
|
|
"sophia.forward(30)" |
|
|
|
|
|
] |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"cell_type": "markdown", |
|
|
|
|
|
"id": "acb6bac35da67d50", |
|
|
|
|
|
"metadata": {}, |
|
|
|
|
|
"source": [ |
|
|
|
|
|
"Neben der Angabe der Stiftfarbe als Text versteht es **Sophia** auch, wenn wir die **RGB**-Farbe angeben. **RGB** steht dabei für die Basisfarben **Rot**, **Grün** und **Blau**. Jede Farbe kann dabei aus [drei Zahlenwerten](https://www.w3schools.com/colors/colors_rgb.asp) angegeben werden, die die Intensität der drei Basisfarben in einem Bereich von 0 bis 255 festlegen. \n", |
|
|
|
|
|
"\n", |
|
|
|
|
|
"| RGB | Farbe |\n", |
|
|
|
|
|
"|-------------------|------------------------------------------------|\n", |
|
|
|
|
|
"| `(0, 255, 0)` | Nur die Basisfarbe Grün --> ein kräftiges Grün |\n", |
|
|
|
|
|
"| `(0, 0, 0)` | Keine Basisfarbe --> Schwarz |\n", |
|
|
|
|
|
"| `(255, 255, 255)` | --> Weiß |\n", |
|
|
|
|
|
"| `(199, 36, 38)` | --> Ohm-Rot |\n" |
|
|
|
|
|
] |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"cell_type": "code", |
|
|
|
|
|
"execution_count": 29, |
|
|
|
|
|
"id": "2a686339083f1096", |
|
|
|
|
|
"metadata": {}, |
|
|
|
|
|
"outputs": [], |
|
|
|
|
|
"source": [ |
|
|
|
|
|
"sophia.pencolor(199,36,38)\n", |
|
|
|
|
|
"sophia.forward(30)" |
|
|
|
|
|
] |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"cell_type": "markdown", |
|
|
|
|
|
"id": "8d076b787614cd34", |
|
|
|
|
|
"metadata": {}, |
|
|
|
|
|
"source": [ |
|
|
|
|
|
"## Quadrat\n", |
|
|
|
|
|
"\n", |
|
|
|
|
|
"Wäre es nicht schick, wenn wir auch für **Sophia** wieder eigene Befehle definieren könnten, um unseren bewährten Top-Down-Ansatz verwenden zu können? Es könnte beispielsweise hilfreich sein, ein Quadrat zeichnen zu können:" |
|
|
|
|
|
] |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"cell_type": "code", |
|
|
|
|
|
"execution_count": 82, |
|
|
|
|
|
"id": "8e4ab483b5a1e319", |
|
|
|
|
|
"metadata": { |
|
|
|
|
|
"ExecuteTime": { |
|
|
|
|
|
"end_time": "2024-07-12T14:28:47.087514Z", |
|
|
|
|
|
"start_time": "2024-07-12T14:28:47.084512Z" |
|
|
|
|
|
} |
|
|
|
|
|
}, |
|
|
|
|
|
"outputs": [], |
|
|
|
|
|
"source": [ |
|
|
|
|
|
"def quadrat(turtle):\n", |
|
|
|
|
|
" for _ in range(4):\n", |
|
|
|
|
|
" turtle.forward(30)\n", |
|
|
|
|
|
" turtle.left(90)\n" |
|
|
|
|
|
] |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"cell_type": "code", |
|
|
|
|
|
"execution_count": 84, |
|
|
|
|
|
"id": "8eccfb3a-da38-44a0-8dc3-1faa9cd59a6e", |
|
|
|
|
|
"metadata": { |
|
|
|
|
|
"ExecuteTime": { |
|
|
|
|
|
"end_time": "2024-07-12T14:29:04.619926Z", |
|
|
|
|
|
"start_time": "2024-07-12T14:29:04.560924Z" |
|
|
|
|
|
} |
|
|
|
|
|
}, |
|
|
|
|
|
"outputs": [ |
|
|
|
|
|
{ |
|
|
|
|
|
"data": { |
|
|
|
|
|
"application/vnd.jupyter.widget-view+json": { |
|
|
|
|
|
"model_id": "f35fad2102e84536b0630ad03f7a5dcd", |
|
|
|
|
|
"version_major": 2, |
|
|
|
|
|
"version_minor": 0 |
|
|
|
|
|
}, |
|
|
|
|
|
"text/plain": [ |
|
|
|
|
|
"Turtle(height=200, width=400)" |
|
|
|
|
|
] |
|
|
|
|
|
}, |
|
|
|
|
|
"execution_count": 84, |
|
|
|
|
|
"metadata": {}, |
|
|
|
|
|
"output_type": "execute_result" |
|
|
|
|
|
} |
|
|
|
|
|
], |
|
|
|
|
|
"source": [ |
|
|
|
|
|
"from ipyturtlenext import Turtle\n", |
|
|
|
|
|
"\n", |
|
|
|
|
|
"sophia = Turtle(400, 200)\n", |
|
|
|
|
|
"\n", |
|
|
|
|
|
"sophia\n" |
|
|
|
|
|
] |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"cell_type": "code", |
|
|
|
|
|
"execution_count": 83, |
|
|
|
|
|
"id": "f5bdc5a4-32f5-46aa-b943-f2ca65703b90", |
|
|
|
|
|
"metadata": { |
|
|
|
|
|
"ExecuteTime": { |
|
|
|
|
|
"end_time": "2024-07-12T14:28:51.267178Z", |
|
|
|
|
|
"start_time": "2024-07-12T14:28:50.837050Z" |
|
|
|
|
|
} |
|
|
|
|
|
}, |
|
|
|
|
|
"outputs": [], |
|
|
|
|
|
"source": [ |
|
|
|
|
|
"quadrat(sophia)" |
|
|
|
|
|
] |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"cell_type": "code", |
|
|
|
|
|
"execution_count": 73, |
|
|
|
|
|
"id": "5175923a-321e-4644-a14e-55e2fce46a97", |
|
|
|
|
|
"metadata": {}, |
|
|
|
|
|
"outputs": [], |
|
|
|
|
|
"source": [ |
|
|
|
|
|
"sophia.reset()\n" |
|
|
|
|
|
] |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"cell_type": "code", |
|
|
|
|
|
"execution_count": 71, |
|
|
|
|
|
"id": "68803797-b2f1-4c92-a8a3-1fb070b6a013", |
|
|
|
|
|
"metadata": {}, |
|
|
|
|
|
"outputs": [], |
|
|
|
|
|
"source": [ |
|
|
|
|
|
"sophia.forward(30)\n" |
|
|
|
|
|
] |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"cell_type": "code", |
|
|
|
|
|
"execution_count": 72, |
|
|
|
|
|
"id": "426f5191-ff28-4b53-beb5-bdea32134348", |
|
|
|
|
|
"metadata": {}, |
|
|
|
|
|
"outputs": [], |
|
|
|
|
|
"source": [ |
|
|
|
|
|
"sophia.left(90)\n" |
|
|
|
|
|
] |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"cell_type": "code", |
|
|
|
|
|
"execution_count": 76, |
|
|
|
|
|
"id": "1344f0ee-cc44-474d-a483-c614ed362a65", |
|
|
|
|
|
"metadata": {}, |
|
|
|
|
|
"outputs": [ |
|
|
|
|
|
{ |
|
|
|
|
|
"name": "stdout", |
|
|
|
|
|
"output_type": "stream", |
|
|
|
|
|
"text": [ |
|
|
|
|
|
"90.0\n" |
|
|
|
|
|
] |
|
|
|
|
|
} |
|
|
|
|
|
], |
|
|
|
|
|
"source": [ |
|
|
|
|
|
"print(sophia.heading())" |
|
|
|
|
|
] |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"cell_type": "code", |
|
|
|
|
|
"execution_count": 75, |
|
|
|
|
|
"id": "84e43ec3-e1c7-4893-bad7-48c504e0cb30", |
|
|
|
|
|
"metadata": {}, |
|
|
|
|
|
"outputs": [], |
|
|
|
|
|
"source": [ |
|
|
|
|
|
"sophia.reset()" |
|
|
|
|
|
] |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"cell_type": "code", |
|
|
|
|
|
"execution_count": 81, |
|
|
|
|
|
"id": "df4f78d5-e0ab-4ecb-9721-d4b4ca9acc9f", |
|
|
|
|
|
"metadata": { |
|
|
|
|
|
"ExecuteTime": { |
|
|
|
|
|
"end_time": "2024-07-12T14:28:16.103262Z", |
|
|
|
|
|
"start_time": "2024-07-12T14:28:16.100383Z" |
|
|
|
|
|
} |
|
|
|
|
|
}, |
|
|
|
|
|
"outputs": [ |
|
|
|
|
|
{ |
|
|
|
|
|
"data": { |
|
|
|
|
|
"text/plain": [ |
|
|
|
|
|
"90.0" |
|
|
|
|
|
] |
|
|
|
|
|
}, |
|
|
|
|
|
"execution_count": 81, |
|
|
|
|
|
"metadata": {}, |
|
|
|
|
|
"output_type": "execute_result" |
|
|
|
|
|
} |
|
|
|
|
|
], |
|
|
|
|
|
"source": [ |
|
|
|
|
|
"sophia.heading()" |
|
|
|
|
|
] |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"cell_type": "code", |
|
|
|
|
|
"execution_count": 80, |
|
|
|
|
|
"id": "64c22a12dd6b09e6", |
|
|
|
|
|
"metadata": { |
|
|
|
|
|
"ExecuteTime": { |
|
|
|
|
|
"end_time": "2024-07-12T14:28:10.445179Z", |
|
|
|
|
|
"start_time": "2024-07-12T14:28:10.281461Z" |
|
|
|
|
|
} |
|
|
|
|
|
}, |
|
|
|
|
|
"outputs": [], |
|
|
|
|
|
"source": [ |
|
|
|
|
|
"sophia.reset()\n", |
|
|
|
|
|
"sophia.left(0)" |
|
|
|
|
|
] |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"cell_type": "code", |
|
|
|
|
|
"execution_count": null, |
|
|
|
|
|
"id": "e82d0257b336c800", |
|
|
|
|
|
"metadata": {}, |
|
|
|
|
|
"outputs": [], |
|
|
|
|
|
"source": [] |
|
|
|
|
|
} |
|
|
|
|
|
], |
|
|
|
|
|
"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": 5 |
|
|
|
|
|
} |