From 2770563f1f1416fb1673b6ebebb46cbdbcaad0b2 Mon Sep 17 00:00:00 2001 From: Christoph Giess Date: Mon, 10 Oct 2022 11:12:03 +0200 Subject: [PATCH] =?UTF-8?q?Schl=C3=BCsselqualifikation=20Einf=C3=BChrunng?= =?UTF-8?q?=20in=20Python?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 50 +++ NOTES.adoc | 42 +++ README.adoc | 43 +++ jupyter_book/01_taschenrechner.ipynb | 275 +++++++++++++++ jupyter_book/02_hilfe.ipynb | 186 ++++++++++ jupyter_book/03_funktionen.ipynb | 250 ++++++++++++++ jupyter_book/03_funktionen.ipynb.orig | 242 +++++++++++++ jupyter_book/04_bedingungen_variablen.ipynb | 195 +++++++++++ jupyter_book/05_texte.ipynb | 279 +++++++++++++++ jupyter_book/05_texte.ipynb.orig | 271 +++++++++++++++ jupyter_book/06_schleifen_arrays.ipynb | 362 ++++++++++++++++++++ jupyter_book/07_zufallszahlen.ipynb | 313 +++++++++++++++++ jupyter_book/Makefile | 8 + jupyter_book/_config.yml | 22 ++ jupyter_book/_toc.yml | 10 + jupyter_book/intro.md | 19 + jupyter_book/logo_mars.png | Bin 0 -> 3581 bytes jupyter_book/requirements.txt | 1 + python_intro.pdf | Bin 0 -> 86287 bytes 19 files changed, 2568 insertions(+) create mode 100644 .gitignore create mode 100644 NOTES.adoc create mode 100644 README.adoc create mode 100644 jupyter_book/01_taschenrechner.ipynb create mode 100644 jupyter_book/02_hilfe.ipynb create mode 100644 jupyter_book/03_funktionen.ipynb create mode 100644 jupyter_book/03_funktionen.ipynb.orig create mode 100644 jupyter_book/04_bedingungen_variablen.ipynb create mode 100644 jupyter_book/05_texte.ipynb create mode 100644 jupyter_book/05_texte.ipynb.orig create mode 100644 jupyter_book/06_schleifen_arrays.ipynb create mode 100644 jupyter_book/07_zufallszahlen.ipynb create mode 100644 jupyter_book/Makefile create mode 100644 jupyter_book/_config.yml create mode 100644 jupyter_book/_toc.yml create mode 100644 jupyter_book/intro.md create mode 100644 jupyter_book/logo_mars.png create mode 100644 jupyter_book/requirements.txt create mode 100644 python_intro.pdf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..73003a7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,50 @@ +# --> Temporary files +privat +temp +*.swp +*~ + +# ---> Latex +*.aux +*.log +*.nav +*.out +*.snm +*.toc +*.vrb +*.synctex.gz + +# ---> Mercurial +.hg/ +.hgignore +.hgsigs +.hgsub +.hgsubstate +.hgtags + +# ---> Dart +# Don’t commit the following directories created by pub. +.buildlog +.pub/ +.dart_tool/ +build/ +packages +.packages + +# Or the files created by dart2js. +*.dart.js +*.js_ +*.js.deps +*.js.map + +# Include when developing application packages. +pubspec.lock + +# Mac file +.DS_Store + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ diff --git a/NOTES.adoc b/NOTES.adoc new file mode 100644 index 0000000..f0a27a3 --- /dev/null +++ b/NOTES.adoc @@ -0,0 +1,42 @@ += Notizen + +== TODOs für Vorlesung +* Visualisierung von +** Funktionsaufrufen +** Arrays +* Besser erklären +** Dokumentation lesen +** Funktionsaufruf +** Googeln + +Das war wirklich Neuland für die, dass alles irgendwo mit einem Beispiel erklärt ist. Funktionen aufzurufen war für sie totale Verwirrung und Magie. Die Logik dahinter zu erklären und wie der Computer das Programm "liest" war echt 20x nötig. + + +== Infos von Oliver + +- link:https://www.youtube.com/watch?v=_DUuzZd0iVA[Jupiter Installation] +- link:https://www.youtube.com/watch?v=1S4Cgtkxqhs[Grundlagen zu Notebooks] + + +== Bücher zu Jupyter + +* für Kurs nur bedingt hilfreich + + +=== Jupyter Cookbook - Over 75 Recipes ... (Packt) + +NOTE: von 2018, default Python 2 + +* Installation verschiedener Kernel +* Beispiele verwenden Python, R, JS, Julia -> nicht alles brauchbar +* Notebooks mit Widgets interaktiv machen +* Security - jeder Jupyter-Kernel kann beliebigen Code ausführen +* JupyterLab = Next Generation Jupyter - neue Features ausprobieren + + +=== Thoughtful Data Science (Packt) + +NOTE: von 2018 + +* eigentlich Werbung/Beschreibung für link:https://github.com/pixiedust/pixiedust[PixieDust] +* evtl einfacher als Pandas/MathPlotLib/... aber wieder etwas ungewartetes. diff --git a/README.adoc b/README.adoc new file mode 100644 index 0000000..2df5c22 --- /dev/null +++ b/README.adoc @@ -0,0 +1,43 @@ += Digital Basics: Einführung in die Programmierung mit Python + +== Ziele + +Wir werden gemeinsam + +* eurer erstes Computerprogramm schreiben +* die Grundlagen der Programmiersprache Python erlernen +* erarbeiten, wie man dem Computer sagt, was er tun soll +* die Basis zur Lösung komplexere Programmieraufgaben schaffen +* einige Denkweisen von Informatikern kennen lerenen + +== Zielgruppe + +Das Seminar richtet sich an + +* komplette Anfänger ohne irgendwelche Erfahrungen im Programmieren +* Studierende aller Fachrichtungen und aus allen Semestern, +* Absolventen und Doktoranden aller Fachrichtungen, +die ohne jegliche Voraussetzungen ihre ersten Computerprogramme schreiben möchten. + +== Inhalte + +* Wie rede ich mit dem Rechner +* Erste Schritte mit Python +* Datentypen und ihre Operationen +* Funktionen und Module +* Programme aus Funktionen zusammenbauen + +== Methoden + +* Vortrag +* Übungen +* individuelles Feedback / Support +* Vorstellung der Ergebnisse in der Gruppe +* Diskussion + + +*Seminardauer:* 5 UE + +*Teilnehmerzahl:* 6-20 + +*Referent:* Christoph Giess, MARS diff --git a/jupyter_book/01_taschenrechner.ipynb b/jupyter_book/01_taschenrechner.ipynb new file mode 100644 index 0000000..42bc31f --- /dev/null +++ b/jupyter_book/01_taschenrechner.ipynb @@ -0,0 +1,275 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "1a44722c-9586-4418-ad7f-8a3c964a9db8", + "metadata": {}, + "source": [ + "# Taschenrechner\n", + "Wir fangen ganz einfach an und schauen, wie sich Python als Taschenrechner macht:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "1e6aecc1-1fbc-4cd9-9330-1a66fa612ec6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "1 + 2" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "f19f790e-bac5-4e31-a205-d2008bfc6e22", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "24" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "2 * 3 * 4" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "82d3380b-1d01-4475-8222-2198d8d4856a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "43" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "1 + 3 * 14" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "62b5e2b5-2bb5-42c3-b80e-8f43347faf5f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "56" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(1+3) * 14" + ] + }, + { + "cell_type": "markdown", + "id": "98a86261-0a33-4570-9064-ad57765e8aa0", + "metadata": {}, + "source": [ + "## Aufgabe\n", + "❓ Jetzt seid ihr dran! Denkt an den Mathe-Unterricht zurück und versucht\n", + "* Minus\n", + "* Division\n", + "* Potenzieren\n", + "* Quadratwurzel" + ] + }, + { + "cell_type": "markdown", + "id": "e2b5f4f4-a5da-4b70-9e11-1a13c8b1c111", + "metadata": {}, + "source": [ + "## Lösung" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "6d6e56ec-fded-4a99-8941-e88c323eb561", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "5 - 2" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "a151e074-017d-4be4-be9e-0181dca4cd9e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2.5" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "5 / 2" + ] + }, + { + "cell_type": "markdown", + "id": "e2ba9ae6-a19e-449a-a1d3-06be54dff4b3", + "metadata": {}, + "source": [ + "Kommazahlen gibt's auch. Diese müssen, wie im Englischen üblich, mit Punkt statt mit Komma angegeben werden." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "b26ab8eb-cbf6-486e-a0a2-dfa086125742", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "64" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "2 ** 6" + ] + }, + { + "cell_type": "markdown", + "id": "5e7be5dd-bbcf-4f68-9cfb-662ac00f86c9", + "metadata": {}, + "source": [ + "Potenzieren war schon tricky. Die ** kann man sich aber einfach merken wenn man daran denkt das Potenzieren mehrfaches Multiplizieren ist.\n", + "\n", + "Für die Quadratwurzel müssen wir aber noch ein bisschen über Python lernen." + ] + }, + { + "cell_type": "markdown", + "id": "cec7a8a1-ce22-41a0-b0e2-b6107e9b9bc3", + "metadata": {}, + "source": [ + "# Packages\n", + "\n", + "Der Kern der Programmiersprache Python kann relativ wenig. Die meiste Funktionalität liegt in Packages.\n", + "\n", + "So ein Package muss mittels `import` verfügbar gemacht werden bevor man dessen Funktionen nutzen kann." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "c04b1fca-a1f5-4ba2-90a8-216c3cc41556", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2.0" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import math\n", + "math.sqrt(4)" + ] + }, + { + "cell_type": "markdown", + "id": "dd7f5220-4b6d-4e76-8cdf-ed04b9d8e8d6", + "metadata": {}, + "source": [ + "## Aufgabe\n", + "❓ Das Package `math` enhält noch eine Reihe weiterer\n", + "Funktionen, die aus dem Mathe-Unterricht bekannt sind. Welche sind das?" + ] + }, + { + "cell_type": "markdown", + "id": "9b1cbddd-4599-4dbd-b439-5276c78e0ccd", + "metadata": {}, + "source": [ + "## Lösung\n", + "Durch ausprobieren kann man `sin`, `cos` und `tan` finden.\n", + "\n", + "Das ist aber aufwändig. Einfacher geht's mit der Hilfe-Funktion." + ] + } + ], + "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.9.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/jupyter_book/02_hilfe.ipynb b/jupyter_book/02_hilfe.ipynb new file mode 100644 index 0000000..e9e0d8f --- /dev/null +++ b/jupyter_book/02_hilfe.ipynb @@ -0,0 +1,186 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 5, + "id": "2a1f4fb4-1e20-4441-90f2-98ce7606e088", + "metadata": { + "slideshow": { + "slide_type": "skip" + }, + "tags": [ + "hide-input" + ] + }, + "outputs": [], + "source": [ + "import math" + ] + }, + { + "cell_type": "markdown", + "id": "c4e44c9e-0eea-48d3-b478-8723995efe97", + "metadata": {}, + "source": [ + "# Hilfe\n", + "\n", + "Hilfe kann man sich für Packages oder Funktionen anzeigen lassen:\n", + "\n", + "`help(math)`\n", + "\n", + "`help(math.sin)`" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "18821bb6-e5a7-4367-ac55-60c468d78a02", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on built-in function sin in module math:\n", + "\n", + "sin(x, /)\n", + " Return the sine of x (measured in radians).\n", + "\n" + ] + } + ], + "source": [ + "help(math.sin)" + ] + }, + { + "cell_type": "markdown", + "id": "bf381088-a36b-400d-8a8e-9491c85ee637", + "metadata": { + "tags": [] + }, + "source": [ + "Das **/** ist kein Parameter sondern eine Info für fortgeschrittene Programmierer ([Details](https://www.python.org/dev/peps/pep-0570/positional-only%20parameters)). Wir ignorieren dies.\n", + "\n", + "ℹ️ `` zeigt verfügbare Funktionen an. Probiert:\n", + "\n", + "`math.`\n", + "\n", + "`math.c`" + ] + }, + { + "cell_type": "markdown", + "id": "2d4ee0f4-7d02-4935-bfd9-9c04efb7de4d", + "metadata": {}, + "source": [ + "## Aufgabe\n", + "\n", + "❓ Berechne sin und cos von 0°, 90° und 180°!" + ] + }, + { + "cell_type": "markdown", + "id": "d89f4342-623b-4b6e-be90-e6774c62a65f", + "metadata": {}, + "source": [ + "## Lösung\n", + "\n", + "War das Ergebnis richtig?\n", + "\n", + "Die Hilfe sagt, dass man den Parameter von `sin`/`cos` in Radians (Bogenmaß) angeben muss. Gegeben waren aber Grad. D.h. wir müssen dies erst umrechnen. Dazu gibt es auch eine Funktion `math.radians()`. Somit wäre die Lösung:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "0e612c09-f8b5-4dc2-80c7-49f03e510937", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1.0" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "math.sin(math.radians(90))" + ] + }, + { + "cell_type": "markdown", + "id": "89d942ed-7aac-48d7-ba5e-2d1c0e09a2d3", + "metadata": {}, + "source": [ + "ℹ️ Funktionen sind schachtelbar\n", + "\n", + "ℹ️ Ein Programm besteht aus ineinander geschachtelten Funktionsaufrufen." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "3197696b-bf76-46b7-99db-67ad482516ca", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1.2246467991473532e-16" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "math.sin(math.radians(180))" + ] + }, + { + "cell_type": "markdown", + "id": "c5b2d7d1-d7e4-4372-933c-19063452d1dd", + "metadata": {}, + "source": [ + "Mmh, das sollte 0 sein.\n", + "\n", + "ℹ️ Beim Rechnen mit Kommazahlen ist die Genauigkeit begrenzt." + ] + }, + { + "cell_type": "markdown", + "id": "0923f3a5-8e2e-4044-a316-598da598f3db", + "metadata": {}, + "source": [ + "❓ Was wäre, wenn es `math.radians()` nicht geben würde?" + ] + } + ], + "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.9.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/jupyter_book/03_funktionen.ipynb b/jupyter_book/03_funktionen.ipynb new file mode 100644 index 0000000..882bf97 --- /dev/null +++ b/jupyter_book/03_funktionen.ipynb @@ -0,0 +1,250 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "5e2e3e9d-9d88-43b8-a7b6-351a8dd8eb9d", + "metadata": {}, + "source": [ + "# Funktionen\n", + "Wenn es `math.radians()` nicht gäbe, dann könnten wir die uns selbst schreiben:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "5e0982b9-eb6d-4db7-ba96-cceac29821ae", + "metadata": {}, + "outputs": [], + "source": [ + "import math\n", + "def rad(x):\n", + " return x * 2 * math.pi / 360" + ] + }, + { + "cell_type": "markdown", + "id": "38cc7e3f-8186-4ed8-81ae-d199c3cb9d5e", + "metadata": {}, + "source": [ + "Zur Unterscheidung heißt sie einfach nur `rad()`.\n", + "Das Package `math` muss importiert sein um `pi` zu verwenden." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "333d5172-b326-460e-9851-6e5271bcab79", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3.141592653589793" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rad(180)" + ] + }, + { + "cell_type": "markdown", + "id": "1b67ecf5-cf68-4c29-ae90-39d2a0f6ce00", + "metadata": {}, + "source": [ + "## Aufgabe\n", + "❓ Das sieht schon toll aus. Geht das aber auch besser?" + ] + }, + { + "cell_type": "markdown", + "id": "b792d4e1-41ce-4622-8298-077355437419", + "metadata": {}, + "source": [ + "## Lösung\n", + "Beim Programmieren ist es oft nicht leicht zu entscheiden was **besser** ist.\n", + "\n", + "Man könnnte `x * math.pi / 180` schreiben. Das spart evtl. die Berechnung von `2 / 360`.\n", + "Warum `evtl`? Weil manche Programmiersprachen dies selbständig optimieren.\n", + "Warum ist das kürzere nicht besser? Die Formel, die man in der Schule gelernt hat ist so nicht direkt wiederzuerkennen und somit das Programm schwerer zu verstehen.\n", + "\n", + "Wichtig ist aber immer eine gute Dokumentation von Funktionen." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "2ec6f0f0-4109-4aef-92dd-d247c43cc4b3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on function rad in module __main__:\n", + "\n", + "rad(x)\n", + "\n" + ] + } + ], + "source": [ + "help(rad)" + ] + }, + { + "cell_type": "markdown", + "id": "537bad50-0e57-463c-9d70-b6c0b60de395", + "metadata": {}, + "source": [ + "Mmh, das sieht nicht so toll aus.\n", + "\n", + "Es braucht einen [Docstring](https://www.python.org/dev/peps/pep-0257/),\n", + "um hier etwas vernünftiges angezeigt zu bekommen." + ] + }, + { + "cell_type": "markdown", + "id": "b5f77780-5a55-4471-9bed-7295e95f34a3", + "metadata": {}, + "source": [ + "## Aufgabe\n", + "Schreibt die Funktion `rad()` so um, dass `help(rad)` einen hilfreichen Text anzeigt." + ] + }, + { + "cell_type": "markdown", + "id": "4c1d9d64-00bf-4418-8416-5fd7c3eba36c", + "metadata": {}, + "source": [ + "## Lösung\n", + "Wir verwenden einfach den Hilfetext von `math.rad`." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "ab898f30-4161-49c8-b8be-e9631349bb2a", + "metadata": {}, + "outputs": [], + "source": [ + "def rad(x):\n", + " \"\"\"Convert angle x from degrees to radians.\"\"\"\n", + " return x * 2 * math.pi / 360" + ] + }, + { + "cell_type": "markdown", + "id": "de201d97-2f1d-4798-9732-77c40ba99b78", + "metadata": {}, + "source": [ + "## Aufgabe\n", + "Schreibt eine Funktion, die die Seitenlänge eines rechtwinkligen Dreiecks anhand des Satzes von Pythagoras berechnet. Zur Erinnerung, der lautet a² + b² = c².\n", + "\n", + "Überlegt:\n", + "* Was sind die Parameter?\n", + "* Was soll das Ergebnis sein?\n", + "* Wie kann man das Berechnen?\n", + "* Wie soll die Funktion heißen?\n", + "* Was soll die Hilfe zeigen" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "1f69e422-69dc-4563-8ca3-2e8a15a8ee74", + "metadata": {}, + "outputs": [], + "source": [ + "def pyth(a, b):\n", + " \"\"\"Berechnet Hypothenuse eines rechtwinkligen Dreiecks mit Seitenlängen a und b\"\"\"\n", + " return math.sqrt(a*a + b*b)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "8cb40698-547a-4abd-a076-a14e05584a2c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "5.0" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pyth(3, 4)" + ] + }, + { + "cell_type": "markdown", + "id": "26f52ec4-a4aa-4b96-a247-2c0816e10a39", + "metadata": {}, + "source": [ + "## Aufgabe\n", + "❓ Schreibt eine Funktion, die die kleinere von zwei Zahlen zurück gibt." + ] + }, + { + "cell_type": "markdown", + "id": "c724390e-e029-4bd3-be92-3e0a1ffac267", + "metadata": {}, + "source": [ + "## Lösungen\n", + "**Lösung 1**\n", + "\n", + "Das ist unnötig. Die Funktion gibt es schon. Sie heißt `min()`\n", + "\n", + "**Lösug 2**\n", + "\n", + "Das ist zwar unnötig, aber wenn es denn sein muss:\n", + "\n", + " def my_min(a, b):\n", + " return min(a, b)\n", + "\n", + "**Lösung 3**\n", + "\n", + "Wie man das selbst implementiert lernen wir erst im nächsten Kapitel." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "892db341-2524-4f29-918c-9dd035b07982", + "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.9.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/jupyter_book/03_funktionen.ipynb.orig b/jupyter_book/03_funktionen.ipynb.orig new file mode 100644 index 0000000..1c1c54d --- /dev/null +++ b/jupyter_book/03_funktionen.ipynb.orig @@ -0,0 +1,242 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "5e2e3e9d-9d88-43b8-a7b6-351a8dd8eb9d", + "metadata": {}, + "source": [ + "# Funktionen\n", + "Wenn es `math.radians()` nicht gäbe, dann könnten wir die uns selbst schreiben:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "5e0982b9-eb6d-4db7-ba96-cceac29821ae", + "metadata": {}, + "outputs": [], + "source": [ + "import math\n", + "def rad(x):\n", + " return x * 2 * math.pi / 360" + ] + }, + { + "cell_type": "markdown", + "id": "38cc7e3f-8186-4ed8-81ae-d199c3cb9d5e", + "metadata": {}, + "source": [ + "Zur Unterscheidung heißt sie einfach nur `rad()`.\n", + "Das Package `math` muss importiert sein um `pi` zu verwenden." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "333d5172-b326-460e-9851-6e5271bcab79", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3.141592653589793" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rad(180)" + ] + }, + { + "cell_type": "markdown", + "id": "1b67ecf5-cf68-4c29-ae90-39d2a0f6ce00", + "metadata": {}, + "source": [ + "## Aufgabe\n", + "❓ Das sieht schon toll aus. Geht das aber auch besser?" + ] + }, + { + "cell_type": "markdown", + "id": "b792d4e1-41ce-4622-8298-077355437419", + "metadata": {}, + "source": [ + "## Lösung\n", + "Beim Programmieren ist es oft nicht leicht zu entscheiden was **besser** ist.\n", + "\n", + "Man könnnte `x * math.pi / 180` schreiben. Das spart evtl. die Berechnung von `2 / 360`.\n", + "Warum `evtl`? Weil manche Programmiersprachen dies selbständig optimieren.\n", + "Warum ist das kürzere nicht besser? Die Formel, die man in der Schule gelernt hat ist so nicht direkt wiederzuerkennen und somit das Programm schwerer zu verstehen.\n", + "\n", + "Wichtig ist aber immer eine gute Dokumentation von Funktionen." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "2ec6f0f0-4109-4aef-92dd-d247c43cc4b3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on function rad in module __main__:\n", + "\n", + "rad(x)\n", + "\n" + ] + } + ], + "source": [ + "help(rad)" + ] + }, + { + "cell_type": "markdown", + "id": "537bad50-0e57-463c-9d70-b6c0b60de395", + "metadata": {}, + "source": [ + "Mmh, das sieht nicht so toll aus.\n", + "\n", + "Es braucht einen [Docstring](https://www.python.org/dev/peps/pep-0257/),\n", + "um hier etwas vernünftiges angezeigt zu bekommen." + ] + }, + { + "cell_type": "markdown", + "id": "b5f77780-5a55-4471-9bed-7295e95f34a3", + "metadata": {}, + "source": [ + "## Aufgabe\n", + "Schreibt die Funktion `rad()` so um, dass `help(rad)` einen hilfreichen Text anzeigt." + ] + }, + { + "cell_type": "markdown", + "id": "4c1d9d64-00bf-4418-8416-5fd7c3eba36c", + "metadata": {}, + "source": [ + "## Lösung\n", + "Wir verwenden einfach den Hilfetext von `math.rad`." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "ab898f30-4161-49c8-b8be-e9631349bb2a", + "metadata": {}, + "outputs": [], + "source": [ + "def rad(x):\n", + " \"\"\"Convert angle x from degrees to radians.\"\"\"\n", + " return x * 2 * math.pi / 360" + ] + }, + { + "cell_type": "markdown", + "id": "de201d97-2f1d-4798-9732-77c40ba99b78", + "metadata": {}, + "source": [ + "## Aufgabe\n", + "Schreibt eine Funktion, die die Seitenlänge eines rechtwinkligen Dreiecks anhand des Satzes von Pythagoras berechnet. Zur Erinnerung, der lautet a² + b² = c².\n", + "\n", + "Überlegt:\n", + "* Was sind die Parameter?\n", + "* Was soll das Ergebnis sein?\n", + "* Wie kann man das Berechnen?\n", + "* Wie soll die Funktion heißen?\n", + "* Was soll die Hilfe zeigen" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "1f69e422-69dc-4563-8ca3-2e8a15a8ee74", + "metadata": {}, + "outputs": [], + "source": [ + "def pyth(a, b):\n", + " \"\"\"Berechnet Hypothenuse eines rechtwinkligen Dreiecks mit Seitenlängen a und b\"\"\"\n", + " return math.sqrt(a*a + b*b)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "8cb40698-547a-4abd-a076-a14e05584a2c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "5.0" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pyth(3, 4)" + ] + }, + { + "cell_type": "markdown", + "id": "26f52ec4-a4aa-4b96-a247-2c0816e10a39", + "metadata": {}, + "source": [ + "## Aufgabe\n", + "❓ Schreibt eine Funktion, die die kleinere von zwei Zahlen zurück gibt." + ] + }, + { + "cell_type": "markdown", + "id": "c724390e-e029-4bd3-be92-3e0a1ffac267", + "metadata": {}, + "source": [ + "## Lösungen\n", + "**Lösung 1**\n", + "\n", + "Das ist unnötig. Die Funktion gibt es schon. Sie heißt `min()`\n", + "\n", + "**Lösug 2**\n", + "\n", + "Das ist zwar unnötig, aber wenn es denn sein muss:\n", + "\n", + " def my_min(a, b):\n", + " return min(a, b)\n", + "\n", + "**Lösung 3**\n", + "\n", + "Wie man das selbst implementiert lernen wir erst im nächsten Kapitel." + ] + } + ], + "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.9.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/jupyter_book/04_bedingungen_variablen.ipynb b/jupyter_book/04_bedingungen_variablen.ipynb new file mode 100644 index 0000000..3f88a81 --- /dev/null +++ b/jupyter_book/04_bedingungen_variablen.ipynb @@ -0,0 +1,195 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "c17b2056-f461-4edd-bcbc-c53a1e8aafe4", + "metadata": {}, + "source": [ + "# Bedinungen & Variablen\n", + "## Bedingungen\n", + "\n", + "Achtet auf Doppelpunkte und Einrückung!" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "ac3cb812-7fb5-40ed-9328-864d9dd7a1b8", + "metadata": {}, + "outputs": [], + "source": [ + "def my_min(a, b):\n", + " if a < b:\n", + " return a\n", + " else:\n", + " return b" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "be0a975d-2fb9-4be2-ad94-46de2819c72f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-5" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_min(-2, -5)" + ] + }, + { + "cell_type": "markdown", + "id": "e1f7fc12-e2e3-4c7e-a949-61d3ca9360dc", + "metadata": {}, + "source": [ + "## Kommentare\n", + "\n", + "Programme können durch Kommentare leichter verstanden werden.\n", + "\n", + " \"\"\" Das ist ein\n", + " mehrzeiliger\n", + " Kommentar \"\"\"\n", + " \n", + " sin(0) # Kommentar bis Ende der Zeile\n", + " \n", + "ℹ️ Vernünftige Funktionsnamen sind aber noch wichtiger!" + ] + }, + { + "cell_type": "markdown", + "id": "d77d67a3-6161-46bf-bb3f-754391b729c8", + "metadata": {}, + "source": [ + "## Variablen\n", + "\n", + "In Funktionen habt ihr schon Variablen verwendet.\n", + "Diese lassen sich aber auch direkt zuweisen:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "4055653c-cbec-464b-aeac-a8d140fdb815", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "35" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = 7\n", + "b = 5\n", + "c = a * b\n", + "# welchen Wert hat c?\n", + "c" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "f07ba1f6-9a39-43e4-813e-c3901b1ae350", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "35" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "b = 8\n", + "# welchen Wert hat c jetzt?\n", + "c" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "ce519d1a-05d9-4307-a2c0-b6dad33d6053", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "56" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# c ist immer noch 35 weil es noch nicht neu berechnet wurde\n", + "c = a * b\n", + "# jetzt sollte es 56 sein\n", + "c" + ] + }, + { + "cell_type": "markdown", + "id": "e9505ef6-2904-475b-837b-bba119c16b7a", + "metadata": {}, + "source": [ + "ℹ️ Warum muss `c` eingegeben werden um das Ergebnis zu sehen?\n", + "\n", + "Ein Ergebnis wird nur angezeigt, wenn der Aufruf irgendetwas zurück gibt:\n", + " \n", + "* Berechnung wie 1 + 2 -> Ergebnis\n", + "* Funktionaufruf -> das return-te\n", + "* Zuweisung a = b -> nix\n", + "* Variablenname -> Wert der Variable" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "65aea755-4369-4985-8dfd-c239a015dd03", + "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.9.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/jupyter_book/05_texte.ipynb b/jupyter_book/05_texte.ipynb new file mode 100644 index 0000000..5fef710 --- /dev/null +++ b/jupyter_book/05_texte.ipynb @@ -0,0 +1,279 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "df41324e-da47-4d61-a80d-a7bd29198c8d", + "metadata": {}, + "source": [ + "# Texte\n", + "\n", + "Bisher haben wir nur mit Zahlen gearbeitet, d.h. Python als besseren Taschenrechner verwendet.\n", + "Jetzt wollen wir auch Texte verwenden.\n", + "\n", + "Text wird auch Zeichenkette oder String genannt.\n", + "\n", + "Texte haben wir auch schon gesehen, z.B.:\n", + "\n", + "* Variablennamen `a`, `b`, `c`\n", + "* Funktionsnamen wie `my_min` und `cos`\n", + "\n", + "Um Texte, mit denen wir rechnen wollen, von Variablen und Funktionen zu unterscheiden, müssen wir diese in \" oder ' einschließen." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "7ae417ae-c8d5-4f0e-a280-16265f3fa2d3", + "metadata": {}, + "outputs": [], + "source": [ + "a = 'Wort'\n", + "b = \"Zwei Worte\"\n", + "c = \"\"\"Ein mehrzeiliger Text\n", + "muss in\n", + "drei Hochkommatas\n", + "eingeschlossen werden.\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "8af71ec8-1c40-4106-bbd4-3b0bdd2968f7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Wort'" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "14c7d057-124d-4e3b-b6be-a966687930e1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Ein mehrzeiliger Text\\nmuss in\\ndrei Hochkommatas\\neingeschlossen werden.'" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "c" + ] + }, + { + "cell_type": "markdown", + "id": "2e280d2d-eda2-473d-8997-94de82444f48", + "metadata": {}, + "source": [ + "ℹ️ mit \\ lassen sich Sonderzeichen darstellen\n", + "\n", + "* \\\\ = \\\n", + "* \\n = Zeilenumbruch\n", + "* \\t = Tabulator" + ] + }, + { + "cell_type": "markdown", + "id": "41dc4823-c5f0-4ffb-a6c6-c091789cf309", + "metadata": {}, + "source": [ + "## Aufgabe\n", + "❓ Was kann man alles mit Texten machen?\n", + "\n", + "Tipp:\n", + "* `c.`\n", + "* `help(str)`" + ] + }, + { + "cell_type": "markdown", + "id": "a376173a-66db-485f-acfe-818c44ad7320", + "metadata": {}, + "source": [ + "## Lösung\n", + "Die Aufgabe war so einfach, die braucht keine Lösung." + ] + }, + { + "cell_type": "markdown", + "id": "d6a2bb1b-120c-48bf-aed5-ec11fe83f50a", + "metadata": {}, + "source": [ + "## Aufgabe\n", + "❓ Schreibt eine Funktion, die als Parameter ein englisches Wort akzeptiert und dessen Pluralform zurückliefert." + ] + }, + { + "cell_type": "markdown", + "id": "59669fc1-2dc6-43a6-a297-3304f190d8ea", + "metadata": {}, + "source": [ + "## Lösung\n", + "Wir ignorieren die Sonderfälle und beschränken uns darauf, dBuchstaben **s** anzufügen wenn das Wort nicht damit endet." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "45aa62f3-1257-4499-b2fb-b818cc1dbd21", + "metadata": {}, + "outputs": [], + "source": [ + "def plural(s):\n", + " if s.endswith('s'):\n", + " return s\n", + " else:\n", + " return s + 's'" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "ddfbc878-4c16-48a8-852c-97379f447ab9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'horses'" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "plural(\"horse\")" + ] + }, + { + "cell_type": "markdown", + "id": "0e1833b4-aa3b-41b4-9602-0e36103e0070", + "metadata": {}, + "source": [ + "## Rechnen mit Texten\n", + "Texte kann man addieren und multiplizieren:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "17a904df-8ffc-467a-8744-e2a4fd8b2134", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Hallo Python'" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = \"Hallo\"\n", + "b = \"Python\"\n", + "a + ' ' + b" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "8c7599a2-c199-433b-bc74-5da51688bdd1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'HalloHalloHallo'" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a * 3" + ] + }, + { + "cell_type": "markdown", + "id": "854d1c91-d4ea-478f-822e-3a3736fb5ff3", + "metadata": {}, + "source": [ + "Das kann man z.B. nutzen, um einen langen Strich zu erzeugen:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "ef7ad859-36f3-46a4-9f5c-972eb45ad0e7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'________________________________________________________________________________'" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "'_' * 80" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cf941b04-99bd-41ce-ac04-4fd3b7a9564b", + "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.9.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/jupyter_book/05_texte.ipynb.orig b/jupyter_book/05_texte.ipynb.orig new file mode 100644 index 0000000..485aa08 --- /dev/null +++ b/jupyter_book/05_texte.ipynb.orig @@ -0,0 +1,271 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "df41324e-da47-4d61-a80d-a7bd29198c8d", + "metadata": {}, + "source": [ + "# Texte\n", + "\n", + "Bisher haben wir nur mit Zahlen gearbeitet, d.h. Python als besseren Taschenrechner verwendet.\n", + "Jetzt wollen wir auch Texte verwenden.\n", + "\n", + "Text wird auch Zeichenkette oder String genannt.\n", + "\n", + "Texte haben wir auch schon gesehen, z.B.:\n", + "\n", + "* Variablennamen `a`, `b`, `c`\n", + "* Funktionsnamen wie `my_min` und `cos`\n", + "\n", + "Um Texte, mit denen wir rechnen wollen, von Variablen und Funktionen zu unterscheiden, müssen wir diese in \" oder ' einschließen." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "7ae417ae-c8d5-4f0e-a280-16265f3fa2d3", + "metadata": {}, + "outputs": [], + "source": [ + "a = 'Wort'\n", + "b = \"Zwei Worte\"\n", + "c = \"\"\"Ein mehrzeiliger Text\n", + "muss in\n", + "drei Hochkommatas\n", + "eingeschlossen werden.\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "8af71ec8-1c40-4106-bbd4-3b0bdd2968f7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Wort'" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "14c7d057-124d-4e3b-b6be-a966687930e1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Ein mehrzeiliger Text\\nmuss in\\ndrei Hochkommatas\\neingeschlossen werden.'" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "c" + ] + }, + { + "cell_type": "markdown", + "id": "2e280d2d-eda2-473d-8997-94de82444f48", + "metadata": {}, + "source": [ + "ℹ️ mit \\ lassen sich Sonderzeichen darstellen\n", + "\n", + "* \\\\ = \\\n", + "* \\n = Zeilenumbruch\n", + "* \\t = Tabulator" + ] + }, + { + "cell_type": "markdown", + "id": "41dc4823-c5f0-4ffb-a6c6-c091789cf309", + "metadata": {}, + "source": [ + "## Aufgabe\n", + "❓ Was kann man alles mit Texten machen?\n", + "\n", + "Tipp:\n", + "* `c.`\n", + "* `help(str)`" + ] + }, + { + "cell_type": "markdown", + "id": "a376173a-66db-485f-acfe-818c44ad7320", + "metadata": {}, + "source": [ + "## Lösung\n", + "Die Aufgabe war so einfach, die braucht keine Lösung." + ] + }, + { + "cell_type": "markdown", + "id": "d6a2bb1b-120c-48bf-aed5-ec11fe83f50a", + "metadata": {}, + "source": [ + "## Aufgabe\n", + "❓ Schreibt eine Funktion, die als Parameter ein englisches Wort akzeptiert und dessen Pluralform zurückliefert." + ] + }, + { + "cell_type": "markdown", + "id": "59669fc1-2dc6-43a6-a297-3304f190d8ea", + "metadata": {}, + "source": [ + "## Lösung\n", + "Wir ignorieren die Sonderfälle und beschränken uns darauf, dBuchstaben **s** anzufügen wenn das Wort nicht damit endet." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "45aa62f3-1257-4499-b2fb-b818cc1dbd21", + "metadata": {}, + "outputs": [], + "source": [ + "def plural(s):\n", + " if s.endswith('s'):\n", + " return s\n", + " else:\n", + " return s + 's'" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "ddfbc878-4c16-48a8-852c-97379f447ab9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'horses'" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "plural(\"horse\")" + ] + }, + { + "cell_type": "markdown", + "id": "0e1833b4-aa3b-41b4-9602-0e36103e0070", + "metadata": {}, + "source": [ + "## Rechnen mit Texten\n", + "Texte kann man addieren und multiplizieren:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "17a904df-8ffc-467a-8744-e2a4fd8b2134", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Hallo Python'" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = \"Hallo\"\n", + "b = \"Python\"\n", + "a + ' ' + b" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "8c7599a2-c199-433b-bc74-5da51688bdd1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'HalloHalloHallo'" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a * 3" + ] + }, + { + "cell_type": "markdown", + "id": "854d1c91-d4ea-478f-822e-3a3736fb5ff3", + "metadata": {}, + "source": [ + "Das kann man z.B. nutzen, um einen langen Strich zu erzeugen:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "ef7ad859-36f3-46a4-9f5c-972eb45ad0e7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'________________________________________________________________________________'" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "'_' * 80" + ] + } + ], + "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.9.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/jupyter_book/06_schleifen_arrays.ipynb b/jupyter_book/06_schleifen_arrays.ipynb new file mode 100644 index 0000000..6055ffa --- /dev/null +++ b/jupyter_book/06_schleifen_arrays.ipynb @@ -0,0 +1,362 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "a6eda542-00bd-401a-a2cd-735f182ffee4", + "metadata": {}, + "source": [ + "# Schleifen und Arrays\n", + "## For-Schleifen\n", + "\n", + "Addiere die Zahlen 1 bis 100 ist eine Aufgabe, die man effizient mit der [Gaußschen Summenformel](https://de.wikipedia.org/wiki/Gau%C3%9Fsche_Summenformel) lösen kann.\n", + "Wir wollen aber den Computer die einzelnen Berechnungen durchführen lassen.\n", + "Hierfür muss dieser\n", + "* von 1 bis 100 Zählen\n", + "* und diese Zahl jeweils auf die bisherige Summe addieren\n", + "\n", + "Als Funktion sieht das so aus:" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "92c0754d-0ad9-4920-97f1-fba219b24fcd", + "metadata": {}, + "outputs": [], + "source": [ + "def sum(start, end):\n", + " sum = 0\n", + " for i in range(start, end):\n", + " sum = sum + i\n", + " return sum" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "0abe90ed-f16c-4f85-91a2-72e3a16144ec", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "5050" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sum(1,101)" + ] + }, + { + "cell_type": "markdown", + "id": "9088fa07-2889-4470-9903-df1a5c1e1b3f", + "metadata": {}, + "source": [ + "ℹ️ Bei der Programmierung hält man sich i.d.R. daran, dass bei einem Bereich\n", + "* der erste Wert dazu gehört\n", + "* der zweite Wert aber nicht mehr.\n", + "\n", + "Damit ist ein Jahr z.B. definiert als 1.1.2022 - 1.1.2023.\n", + "Das gilt auch für die Funktion `range()`, die einen Zahlenbereich liefert." + ] + }, + { + "cell_type": "markdown", + "id": "9a878b57-d866-43e5-a5af-863eea90b1b5", + "metadata": {}, + "source": [ + "## Arrays\n", + "Bisher hatten Variablen genau einen Wert, eine Zahl oder einen Text.\n", + "Manchmal ist es aber praktisch, mehrere Werte darin zu speichern, z.B. den zu erwartenden Kontostand in den nächsten Jahren wenn man Geld mit einem bestimmten Zinssatz angelegt hat.\n", + "\n", + "Für so etwas gibt es Arrays." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "ea885cba-1b89-4ce2-b1e6-bcb737e0158b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1]" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Array mit den Werten 1, 2 und 3\n", + "a = [1,2,3]\n", + "# 8 mal der Arry [1], d.h. [1, 1, 1, 1,1, 1, 1, 1]\n", + "b = [1] * 8\n", + "# Arrays kann man aneinanderfügen\n", + "c = a + b\n", + "c" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "aaf07a48-d337-4418-8d98-1e1abe35a1f4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 1]" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# die Reihenfole umdrehen - Achtung: es wird nichts zurückgeliefert, c wird intern geändert\n", + "c.reverse()\n", + "c" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "bdc988c6-a831-4303-a7c1-38aaeed2772f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Auf einzelne Elemente des Arrays kann man zugreifen\n", + "a[0] + a[1]" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "6fa6c3ef-b765-49b5-aebe-8ef53009b202", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[1, 2, 3, 4]" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Ein neues Element hinten an den Array anhängen\n", + "a.append(4)\n", + "a" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "16ac89fe-daf4-4472-9d7d-613530f37a76", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "24" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Einen Array kann man statt range() auch in einer for-Schleife verwenden\n", + "# Hier erhält die Variable i in jeden Durchlauf der Schleife einen Wert des Arrays a\n", + "# Abhängig von der Berechung in der Schleife muss das Ergebnis (hier prod)\n", + "# vorher initialisiert werden\n", + "prod = 1\n", + "for i in a:\n", + " prod = prod * i\n", + " \n", + "prod" + ] + }, + { + "cell_type": "markdown", + "id": "d60f9fd7-9b3f-4a1f-a572-c7e4407dd561", + "metadata": {}, + "source": [ + "## Aufgabe\n", + "❓ Schreibe eine Funktion, die als Parameter einen **Anlagebetrag**, einen **Zins** und die **Laufzeit** in Jahren entgegennimmt, \n", + "die Zinsrechnung durchführt (Zinsen werden wieder angelegt) und einen Array zurückliefert, bei dem das 0te Element den aktuellen Geldbetrag enthält und die darauffolgenden Elemente den Kontostand nach jeweils n Jahren." + ] + }, + { + "cell_type": "markdown", + "id": "67f9d6d7-9d51-4217-8555-b4e409848775", + "metadata": {}, + "source": [ + "## Lösung" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "f0eca3d7-6b3e-4f06-869b-cbc563cce9c8", + "metadata": {}, + "outputs": [], + "source": [ + "def zinsrechnung(anlagebetrag, zins, jahre):\n", + " \"\"\"Berechnet den Kontonstand der nächsten Jahre\n", + " \n", + " anlagebetrag\n", + " Der inital angelegte Betrag\n", + " zins\n", + " Der vereinbarte Zins. Dieser bleibt über die gesamte Laufzeit gleich. Ein Zins von 1.5% muss als 1.5 angegeben werden.\n", + " jahre\n", + " Die Anlagedauer in Jahren.\n", + " \n", + " Das Ergebis ist ein Array mit jahre + 1 Elementen.\n", + " Das 0. Element enthält den Anlagebetrag, das 1. Element den Gesamtbetrag nach Verzinsung nach dem ersten Jahr, ...\n", + " \"\"\"\n", + " \n", + " result = [anlagebetrag] # Initialisieren mit anlagebetrag\n", + " factor = (1 + zins / 100) # ist für jeden Schleifendurchlauf gleich, muss man nur einmal berechnen\n", + " \n", + " for i in range(0, jahre):\n", + " result.append(result[i] * factor)\n", + " \n", + " return result" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "738f1035-38a9-45ad-ad94-e0ec4831c00d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[1000, 1010.0, 1020.1, 1030.301]" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "zinsrechnung(1000, 1, 3)" + ] + }, + { + "cell_type": "markdown", + "id": "33c234e2-bb8d-4164-bf83-ab2929d228e6", + "metadata": {}, + "source": [ + "## Aufgabe\n", + "\n", + "❓ Jetzt erweitern wir die vorherige Aufgabe.\n", + "Der Zinssatz kann variabel sein. Er wird als Array neben dem anlagebetrag der Funktion übergeben." + ] + }, + { + "cell_type": "markdown", + "id": "75d53e88-adf8-481f-a385-852a27315a1b", + "metadata": {}, + "source": [ + "## Lösung" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "055c6f9f-5623-454a-b6ae-5579b05c6ca4", + "metadata": {}, + "outputs": [], + "source": [ + "def variabler_zins(anlagebetrag, zinsen):\n", + " \"\"\"Berechnet den Kontonstand der nächsten Jahre\n", + " \n", + " anlagebetrag\n", + " Der inital angelegte Betrag\n", + " zinsen\n", + " Array mit den Zinssätzen der nächsten Jahre. [1.0, 1.5] bedeutet, \n", + " dass der Kontostand für 2 Jahre berechnet werden soll und im 1. Jahr 1.0%\n", + " und im 2. Jahr 1.5% Zinsen gezahlt werden und die Zinsen wiederangelegt werden.\n", + " \n", + " Das Ergebis ist ein Array mit jahre + 1 Elementen.\n", + " Das 0. Element enthält den Anlagebetrag, das 1. Element den Gesamtbetrag nach Verzinsung nach dem ersten Jahr, ...\n", + " \"\"\"\n", + " jahre = len(zinsen)\n", + " result = [anlagebetrag]\n", + " for i in range(0, jahre):\n", + " result.append(result[i] * (1+ zinsen[i]/100))\n", + " return result" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "26510caa-6a87-4b8e-98fc-bc1d9dfc5f85", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[1000, 1010.0, 1025.1499999999999, 1045.6529999999998]" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "variabler_zins(1000, [1.0, 1.5, 2.0])" + ] + } + ], + "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.9.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/jupyter_book/07_zufallszahlen.ipynb b/jupyter_book/07_zufallszahlen.ipynb new file mode 100644 index 0000000..ba5f393 --- /dev/null +++ b/jupyter_book/07_zufallszahlen.ipynb @@ -0,0 +1,313 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "471b22f4-5b9d-423d-bf7d-6cef078b175e", + "metadata": {}, + "source": [ + "# Simulationen\n", + "\n", + "Aufbauend auf der letzten Aufgabe möchten wir jetzt simulieren, welches Ertrag wir erwarten können, wenn der Zinnsatz zufällig schwankt. Dafür benötigen wir eine Möglichkeit, diesen Zufall zu berechnen." + ] + }, + { + "cell_type": "markdown", + "id": "b298aa38-556e-43d4-aee1-0047477a53fa", + "metadata": {}, + "source": [ + "## Zufallszahlen\n", + "\n", + "Das Package `random` enthält Funktionen zu Erzeugung von Zufallszahlen.\n", + "Probieren wir es aus:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "2f9a1ee9-0a3f-4ee0-a6e1-d6bc61291889", + "metadata": {}, + "outputs": [], + "source": [ + "import random" + ] + }, + { + "cell_type": "markdown", + "id": "327159f5-1e19-4334-9738-e9cc8a0c9d47", + "metadata": {}, + "source": [ + "`help(random)` liefert eine lange Dokumentation. Wir brauchen nur einen kleinen Teil davon." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "7ba2a1a0-745d-4c9b-bbdf-8e562a445204", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3.27\n", + "0.57\n", + "0.12\n", + "3.79\n", + "1.4\n", + "1.25\n", + "1.14\n", + "0.71\n", + "3.77\n", + "0.52\n" + ] + } + ], + "source": [ + "# Initialisierung - gleicher seed liefert gleiche Zufallszahlen!\n", + "random.seed(42)\n", + "samples = 10\n", + "for i in range(samples):\n", + " tmp = random.randint(0, 400)\n", + " print(tmp / 100)" + ] + }, + { + "cell_type": "markdown", + "id": "b8a2a8fe-fbb4-4ab7-b927-841d949f3cf6", + "metadata": {}, + "source": [ + "## Aufgabe\n", + "Was tut das kleine Beispiel?\n", + "Baue eine Funktion, die einen Array der Länge **n** zurückliefert.\n", + "Der Inhalt sollen Zufallszahlen mit 2 Nachkommastellen sein die zwischen **from** und **to* liegen." + ] + }, + { + "cell_type": "markdown", + "id": "7ed88639-c037-415a-b93f-bcdc8cb49a7c", + "metadata": {}, + "source": [ + "## Lösung" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "3ffef006-eac3-41f6-9334-f22db10dc0d0", + "metadata": {}, + "outputs": [], + "source": [ + "def rand_numbers(n, start, end):\n", + " digits = 2; # falls es mal nur 1 oder 3 Nachkommastellen werden sollen\n", + " factor = 10 ** digits;\n", + " result = []\n", + " for i in range(n):\n", + " result.append(random.randint(start * factor, end * factor) / factor)\n", + " \n", + " return result" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "34cda81b-7611-439e-8ba2-3f01c210fa76", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[9.12, 36.56, 4.6, 4.44, 9.67]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rand_numbers(5, 2, 44)" + ] + }, + { + "cell_type": "markdown", + "id": "976b757c-09fa-4492-8996-8129049dc0bf", + "metadata": {}, + "source": [ + "## Aufgabe\n", + "\n", + "Schreibe eine neue Funktion, die diese Funktion als Zinsen in der Funktion zur variablen Zinsberechnung verwendet." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "cf269399-9603-4fc6-ae16-c40562d4d8dc", + "metadata": { + "tags": [ + "hide-input" + ] + }, + "outputs": [], + "source": [ + "def variabler_zins(anlagebetrag, zinsen):\n", + " jahre = len(zinsen)\n", + " result = [anlagebetrag]\n", + " for i in range(0, jahre):\n", + " result.append(result[i] * (1+ zinsen[i]/100))\n", + " return result" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "16d443c6-6b7c-4362-9048-92f23f44da3a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[100, 101.49999999999999, 104.03749999999998, 107.67881249999998]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "variabler_zins(100, [1.5, 2.5, 3.5])" + ] + }, + { + "cell_type": "markdown", + "id": "ebbfb7e2-f7e1-4c1d-9f2e-6b5ad896be11", + "metadata": {}, + "source": [ + "## Lösung" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "ac0de40d-c851-40e8-9f18-2c68c25cd7f0", + "metadata": {}, + "outputs": [], + "source": [ + "def variabler_zufallszins(anlagebetrag, jahre, min_zins, max_zins):\n", + " return variabler_zins(anlagebetrag, rand_numbers(jahre, min_zins, max_zins))" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "5d41f256-22ff-4604-9680-011cfbe77511", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[1000,\n", + " 1005.5000000000001,\n", + " 1011.4324500000001,\n", + " 1024.479928605,\n", + " 1040.256919505517,\n", + " 1040.8810736572204]" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "variabler_zufallszins(1000, 5, 0, 2)" + ] + }, + { + "cell_type": "markdown", + "id": "5af14f52-76be-448b-b15f-2fe0d7d50a13", + "metadata": {}, + "source": [ + "## Aufgabe\n", + "Eine einzelne Simulation hat nicht viel Aussagekraft. Schreibe eine Funktion, die die Simulation **n** mal ausführt und von jeder Ausführung das Endergebnis zurückgibt." + ] + }, + { + "cell_type": "markdown", + "id": "b4192e1f-8e0d-4de8-b6fb-215849aeb02f", + "metadata": {}, + "source": [ + "## Lösung" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "e5ef01b5-bdce-4a3e-8d29-a3081126bdab", + "metadata": {}, + "outputs": [], + "source": [ + "def simulate(anlagebetrag, jahre, min_zins, max_zins, n):\n", + " result = []\n", + " for i in range(n):\n", + " tmp = variabler_zufallszins(anlagebetrag, jahre, min_zins, max_zins)\n", + " result.append(tmp[-1]) # letztes Element in Array hat Index -1, vorletztes -2, usw.\n", + " \n", + " return result" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "441e6fc3-66e5-41bf-9bb2-c01c475ad0b8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[1052.6442959071103,\n", + " 1064.427091942078,\n", + " 1083.9725955171834,\n", + " 1089.3384949096728,\n", + " 1093.7917438123886,\n", + " 1099.7624262587865,\n", + " 1112.5348861022283,\n", + " 1123.567897245912,\n", + " 1128.9355107957267,\n", + " 1167.8728995649053]" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results = simulate(1000, 5, 0, 4, 10)\n", + "results.sort()\n", + "results" + ] + } + ], + "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.9.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/jupyter_book/Makefile b/jupyter_book/Makefile new file mode 100644 index 0000000..c0d6ce1 --- /dev/null +++ b/jupyter_book/Makefile @@ -0,0 +1,8 @@ +all: html pdf + +html: + jupyter-book build . +pdf: + jupyter-book build --builder pdflatex . +clean: + rm -rf _build diff --git a/jupyter_book/_config.yml b/jupyter_book/_config.yml new file mode 100644 index 0000000..8108bfb --- /dev/null +++ b/jupyter_book/_config.yml @@ -0,0 +1,22 @@ +# See https://jupyterbook.org/customize/config.html + +title: Einführung in die Programmierung mit Python +author: MARS – Center for Entrepreneurship +email: c.giess@hs-mannheim.de +copyright: "2022" +logo: logo_mars.png + +only_build_toc_files: true + +execute: + execute_notebooks: force + +latex: + latex_documents: + targetname: python_intro.tex + +sphinx: + extra_extensions: + - sphinx_jupyterbook_latex + config: + language: German diff --git a/jupyter_book/_toc.yml b/jupyter_book/_toc.yml new file mode 100644 index 0000000..ef7ebe4 --- /dev/null +++ b/jupyter_book/_toc.yml @@ -0,0 +1,10 @@ +format: jb-book +root: intro +chapters: +- file: 01_taschenrechner +- file: 02_hilfe +- file: 03_funktionen +- file: 04_bedingungen_variablen +- file: 05_texte +- file: 06_schleifen_arrays +- file: 07_zufallszahlen diff --git a/jupyter_book/intro.md b/jupyter_book/intro.md new file mode 100644 index 0000000..c7ba222 --- /dev/null +++ b/jupyter_book/intro.md @@ -0,0 +1,19 @@ +# Dieser Kurs + +Der Kurs richtet sich an Personen, die über keinerlei Erfahrung im Programmieren verfügen, dies aber lernen möchten. + +Wir werden gemeinsam in entspannter Atmosphäre die ersten kleinen Programme erstellen und dabei die Grundlagen der Programmiersprache Python kennen lernen. + +# Kurzvorstellung +* Wer bin ich? +* Wer seid ihr und was wollt ihr am Ende des Kurses machen? + +# Los gehts + +* Jupyter + * https://jupyter.org/try-jupyter/lab/ + * Notebook Pyolite + * Python im Webbrowser + * Input-Zeile bedienen + * Python Programm (Code) und Dokumentation ([Markdown](https://de.wikipedia.org/wiki/Markdown)) + diff --git a/jupyter_book/logo_mars.png b/jupyter_book/logo_mars.png new file mode 100644 index 0000000000000000000000000000000000000000..eeba023ad4c1d0ec1a0172bdd595a300d544e547 GIT binary patch literal 3581 zcmVZ?IJa+Zx^MTro$kQks#N;+x%=$%t^KY2eS3fVG$r9r7tyFm-b2_7LP8$^H8bpbwiLk2c-W zU!X+5(l09iA9T|}pcg_)OnW-`Z~vtquEuYk<(^KEtn?Lt@~@IjYT<`Z;%64&+%wTU zk>!3$4Gi?Q;~BhkQ*1OdVu+aOB9EkD>VDV8Gqj{#k=V5x-@f1Oeb~LRtwh3!@XJf0!XJtS0AYv-0Kj`^ z%x6yf5%c>TI8Ko>1UQEsJN4=1{Oq;d`eqWj;2q6iwYdS131&14o+0D8`E@S;f-Sug zogMU%J-;$aHWmv6!VsGYK=4r$-Rz~6+%P`g3jyBix%D{za{h5k$T$S6H_#6U63%(a zj-G3`e>fZ~MV##0#E|*i1Jv_7UAux-I@G|DmVg~Q^%U@&hGIn-{j7O4?Zj56l zlMs|3>e=Wz9xM=)s!0+6qX@=)biz$=xk1A^HgTH4Ijvo%Ph5!3?hrX70d!+ggaAl% zbOtuCc+I3@gJ)vHadV!|gY&=2<|81({+VG6^dvZ^x3+7^a@XBs-XV>CW8;=4X~B?K za%GEVXV@L9nwbKfr}xq^E8JlVp#TnUH#T~JExXFSxjjT4Asl#D14z?`JXy4GW|Pit zLPszMf`dnmK9_;dM4GqKzwfWoq(8L71D$(jaL(?$+pl@Lq)F$-7*3Q1I!6}GW@YWl zR`ePj#A@6c75sD_x57_8emHJ8z{r_q+qbsc{J&&RuUYkgHo7j6I;g}X+&ooBXW47= zrQ9!oBm@H4i9R%c)E)O_<|d864F~8wiO$(S-R`=3f**&>S(3{}?`)#yQz zqbmkGp&_iCfOOaiav1iPY-D)vXAiq%t>?3~Kd!u7GQHMgRGh?tQRIuo)kE-b2Ept3kj_ zgqfjWn(XakP2qxO`*4F|lcl3xV?kEV1fUQUu58te3=1Ydz%57~nBd&1Zg<@dZcEVM zZPnudYPt@io_nb>UwM`5Uor`v?1un5zu6W~z$6a{j{Iql|HdAq3~P5OdAdRfXH2j& zn%HIXsr!M%)a1}3f7>oT)x)fplY;o{dTrjqS??=Pf#EPp@1;TV>EALjWg`?#6A^Bl zVpp`Ff$TPR8TJG_XM&y9$k2Egl===u12JR1fkV zB!bL2*Wb@)p5159xY0|^TDuOOh^1yGE2rwDJa-2ger|8J6>j=sa z*cVGgxL&Ki>8xZ}mgSOWJ2_v<1PRnYBy!)_q3^yBkZI?d(SEju}w{IY1rw9^CognP^-hv;BVc-wSCAs zko!%x!NWty=>53oJp+9F!VQ^xZ?P9}pzY(vSZeidZNY!L18JneU}aXyQVq1vw*o+m z=h}k5bvJe-B|(muFiZ8s=7}|xIU0Ith4|%rGJU@*_5!f9@KF+HBDH#MDEb?BAqFz6 zYU04US?srPQL7!DWuM%tE_Z(?49NRo1zBkb05}|WD6p?QH#T}{6?NCMZqwayJn#rY zAWf1m$@7_lziAit8nSM<;TIqW7G)ap`12lQ9HJ2gSqTy_9Ql5rc4eS8 zy;A6kyKUV+ILSwsA1Hmq#`Av?7Z8{_DPx3M*@6eLF8VWe_5 z1HcnLP}B0d=rNsg>u$J;*pX*0xem#<{yXT~REU(&Y&1 zTAh}3X=b?`PhJ3wIq#*1X<_r~Oy`sReS|`~2Lqk80vn3{mOa>1tkVN&!4)L-8XS}x zi2n6Ni4@+`Oef6e%o$_Pd!qB|*`k+kNs{#7A}!Kcwh{5_Zg*Fw`iu<`64m1Y0U#*J z6R1y+gL;r4@Vrj}s3-4@=v*0~4d0! zR8;NEXk>WF+M4;-ivZN*hLPx%GQqu>`1i#E0Ry94qe8>X=tFn;1()OEB_x5gOjozM z#scpt;Ia!bsjcQ#D8(?f78&T&vB93X)RHt>D%a#f>q2+z^~|+EK|6PA{z7(knKafD zg}N-I12nnKt^WnuTI(Fo;k{@5$#W~HVCFL3q71{#&-n#6GuHwcL>@AgH(pmyJ!h;) znRrKmH+=<@+Ug(8s@3fPx@5zh8ND9InOs9q!y#O7ho5sXWNFxhb1>s&7ucuHacK?r zAc0Inh)>KuekPZlS97IOi6QMI(A&=6@Qqb*pUX9c(0n3KzTX}4=cOWkSruj=dG48| zirv8g2{U=`lVG!Fxw~(xCmHP5!Qi{(bH?*0fOLx#5t;b$X>G?F)};J`zQ`NbSfTy5Jw#`Dp{r&+}d{hD%1T~z)|ia z_qq1dq4eCRV!$LghmKAyUdHWjTjU@S^g@{27MaQ~tc;Bt!rRPG0ZOTFaPtu0y)D1mJ@Vt=UHZa?8XIu`9b9}) zsm()=>V~g#^HxA1@{qym@S|gTtQ!RbsM#~I;#!`+7^uCe8wI_TW7VZn`YMrq8l+-c>;@D{+v1KBr9fl+4@c4O{e+(wIRX%Qv#7a<2 zgdoYDeZku1g#7fRafY(f?DN;kto-d@n8{3C-Ql>uP^Mj(cDsIMT@Ol<+Ra9TTJ%y5 zTiytVf6#K%L&FSZ+QZjwFMXAMI}}MGDSY~3Wv7Mwbo-YFBq;=oV}($<%dEsFN%mbF zZ;VJUePnlc_|WOfv?tkiYnmAzepHf;Fw99J$*y0i?DTNx(e@utlrO&X7?EBGG7IM} zO$8RF%?oS(M;g)ARLKwiK-uZxn2*}J4K>;yWDHL)71(FLRGK{V7uw4k%h#(T_4coS zr|dL4^^^A2wi@jZKC08RIF=Mv-l}Z7GVS)U&uG_fsSaDa_l8MxY{?~7C`iKuo_7${ z=%thAd#jXbS9Y3R`h}EjUAFf3+fSb=eLgtRVpJGHF9b>9$u%KALz!uI!`DmK{~y?T z0I24@|NVot&9VFpyZ`&r=mqv}3$hYJmegC{)WSvVE#Q&w@YGYra{=*gVDNU9>ozco z@ZUegyrYpMh~Arjg)@Nn-XGbF3h&4t*}QxB6Q}ootC)-4=XY&)sgwo$Qd+qP4&ZB=YkZ0m__v*J84PksM)&foTKdtbbF>teMw z*6eMrKKkghPjW>uae8J3c3ASmo6BcdPGTlv2V-kkK0ZcqD_d7HXGU>bBUdvqGZP0> zGe%i6dka@fVis-|0RdPSS7$RLJ6O+kyQFscAtCrMpS%G^rjW~9-FX^FRN}cB$#5!S zTgz2rT74oPmNnvFR6w||Zvc852nGC&eJfdDzBb2|>F9g#NfTMV z{jB&NDjuYp0?75xx-9)%q7URKZ5hp|hVP!-#LglqoXuMFq&*6MXpP~mD^>uzTqhxJ zh;frM>eQIS0{P3*1p=`g?L!0BW%f01y>NC0*AY&h1o^~=yEfyyntL*5vzKBvf9h8g zZ2QPm9%Yqe8%-*Ejv?ZV?@{X-AK+k_=$+tr>m9MEh( znug^}wIMk78WT7xni7-im>Uy+M+C#IrauK)Ls9BUcR-v7I-Rz^%wlfGcLwZx0>OK$ zLV>Vm_NM)e$W>J)!hP>Mh;v%3V7=r|% zrGRb!&noQys0uSH3)jEaxy+ezKBPb%z4n6D?}Iok4Wda$tdMS@X_Y%pn=mr(-UeJ5 zxs0DfksyPWPOxf?Lv;d(UhAvB9ZP%_T1ok0X_r5jgtFf1L@Mm;&xJn&&9?lpP(xPs zcRcTRbHq@0Ad(oN42JXfi=L0j{6D9lV^I@gxcK1~#c7U)Le!;`K%Kl_&y}b{q_s-W z1xD>Qg)84M%X$@hqYV^llxn&mnzQJ`qm9U8?`}D{VtVJ2pAQC8lfQhmqM*Nz356Y_ zj_BYO6~|%Gn=P1U$yDt#tV)Hq{a`&CZ8vqo0#-1cz2MImpU9}3kz6l4cDy(oy*I|L z9O0%N6G(?bD4#K<*x6|ZFn?1F~-%bG}NQ($j_Nr zlHX8XYM0tv`eQ36E*aC(Eyd2ix;X6+pwRoI-6JLm*(3b(HDEKuN35djvVRoz)1rjI z{!zRcoXi2k9;&;!znJxm^o*WVFv^?JT1?4nO42w`cJ^jwJ8S${YfKxdD`3<`4fhs#%i50VPt0qCHy~m|qgBY} zOn3!GVUC`4rg&OqzP#+Pm->8Rs$+3$Pv&GRg&-Wb`RK!_w z5L$vigdcit6~Ft-S^tp!p(j1bbsOiA;;2s1(95!#z6E%phQ@Q3dg)WBtEWO6@fJpn zw!&%Hymys3DkT)JfRJ`aIW}{&bGkSXCOY7>%g7W;1Q_i7|6eyoQVx}{46naU z_~%F`J4T?W_m@Mr>h3pjV*1{zctIN4IfT5t$NT$Sgpph)BFAfNZg`JNvfxW64+-zL zX^MlH=lJK=82qqa7}ReT*GMJ3%;Pt#@1*Yt-xG}Kpz7nb!4PW&H(BPj`aHb4zm6)s zQVzEalQRR(AG&j2(qi}vt_K={Wb3mO2DS(Q5&5Aew>2gS!xhUKqVJ7J-%e=N@M$s^ z_4?%6iian?ve_$n%f{KfZ(RdiJ?u(a5Y12c6kIu?RORHbNxP)Zon7>lRp<%#!n;JF zlltI~weWW4w=eSwNdobl=ofqKLWb3fu z@eU=B9x|MnsA9qV=9;|)PQV8H&;px5YjC+;e%t@^OSG>AK870!REE-WJn(}xw`Ptd zPS09k{rHxE%B1lSctAXow&c~}=evx<#9PLu1A^nwZeG$o0_$s$3>gKEN%}}nI%_I> zMQMO}5LZI@rKhpSix$5v(H zH#JoI6}EqMRg|kfom~n0bCOV+nfjT9)&ZR^wxb)gSQ{cgQhhpl7=Bl8(nWK(gGQwP;OJ(g72)D5d$}$90!eScEdEc{x?o@WzcvXK$Fc)Ol8ho7ZHMppM1WR-;Sx;w>W-@TsCq`ln>LVpy zy%$kT-^P?jqV`A~_`t=p5ba2E?r^@jdH5r;ckT1cHSjhAKPPt07vm9V`<)fP6gBwv z_zlX2xzteQW)M`$md3et`BT;A$F~@2Miri|0jFnX{~(2f`809iC9V|de#G$m=WNM6 zo$Di+z8?b)4(&zo+H8hy`pn2~1? z;C+>YWk?_Q&CXunSlKyRWqgtOD3SS~&ldd=@Z~4(!#?qOwh-?nzra#<)>LgKkhj8= z3AMXMEE%U@^Wan?PfKvz;CaRyH|Oc>R@4Fau27*d14IqB$^#(UWQiAH+I)J=?6{Pe zmUY%SA-s`)=esUxwGjMuJMY(aOlq`$_PH`IUr{NAC&sPK~=f za(Pf{Z(#lZ-c5I!xh2Jp65gG0g*flVCJ%!$BwD^;eEzm#!B011>o>sivn)X9_+Zqe z#`WWhkv3Ip^gnkQC(}RKWz5Vh|EAS)HK&peDd2lfs6B&7z#uXz8HkiqZPo0v@99%T zI|Ck*_-z@yKE@;s>$keMYjH{uVufCd73MYlRK!6)urcUAf;;?6)+lie78xxbfDYp1 zxxom3-W4&GOmI^OP6sQ1mvv}?2q2z?w*@GmrL=w&AlH@Sfe z@|lrrcR`OMPL`*_7vd71F~JDJO3BoP8#oSl4(S)t~^u#f{BWJet@88F$c zNakom0w&>+crFR0^O=DniqIz5b)9)Bw7;`&Q#-z=R0e|we-Y0tzjBy!hnJ<+-mIme zvXHeGZY6Yp@us1|>_(H?X{IdG4~$--7F&^Y<@8WAaubqlkho-UXlDcj;P|K&(bPvf z9>yUbd=^^Ai6_ml){t}!85CdN-IxxmMXjV);XF~`j$OT2dFsXnN#%p_$u%d?*h+(= zhi09pbtQAUokg_|)-`XULKC|JGp@1g24YG;n4;7}DG|!0L~;d5E$FnqHJ;2>nkOd{ ztEr|l(1*Xg!E>qSD|)Sd6S|FK>?9mJS-HB=Pl#~_! zd%LC6c{qe!_`@Hr>5z11k(RI9SUdK)W^@@vkP_VB`}T7&inJQQJ5Y1fAG?yiM@nFO z<=vT#BdplYo0JWgyVQg^#k;lLqeiMk!R!3Do=XdyH*t^3aNN4Km26r44>_F)h=Mut z*Yhypk6SB?+Z}?3#M=6{j^HASv3mGIlI)nhAdSc%4lQX}>;%}DoQji=7yQF+q1(|b zZ?_2Q(4RI*FZ#t7f#%&DB}o^7kN8pQ$hypwY$@Vev=ChnOD5rYNf3uAgK-jNL3~dK z98JMcHtVIA@}%zka%b7~*Vt!Nh&N#l*AQMzSu6v1EiJ)@lu~f>JYpPp<@N37Ey6b1 zCE6}r@E#j)cCmuC`uJ4odw9pq!K1ofU9IS#8Gy2rg4)RZw6gRit52l%CR1hfEcfP9 zRUeO)CY(@2yrn(mATPlRtrPayuMgUb3sIU1SB%A>m(oXir}xE%Eple-&F64p9hepe zasiQo+Nr{>^l}w{)&?(8R=8PuQS!#&yXm4PC%|vTSX{AKBY%XU?<2JsukQb z|AnVm{|QgAFth$^H*{0%whtkJ-vpvRfe|qq!b>WJOWT#$Dy{xPwEIjmA6s0h0}lI2 zm54bG2>3oTP2Ujf5pthW*eYcCQN?-MW%T-}YLG*(3y&+}uSB$L&_x6z-=^;ujEU{& z@Y58FjJN}xhinp3T#uhPmr*f3s%;+4PjVQ&k4<3z2 zmARh1)4qK#p7zuyNH>vT(0@UO>z^RQ%*4(7uh1-M0h|vwkh@N3Z@@(Y`*+ovhea!s zY9{Q^c9gkS^=Z?e4Gr$ztO7l6jLPXG=B!uXl&}k+ruGc8iie_SMfMcn6rSsb4p_bO z=RU1R^RI^DdlP2q5O`5NB#gku4JGk^rN%Y4y}gc7mPE{b$E7x7%Nq6wFUtJvdSibh zP80CV_4TBebJR5aW;2oO--E^|;ta3-9?}rfqGW9|^xF{2`^n+9^Z5>w`J}kN37PB% zLoFK8H%d7F99%9I&s!7@l^%^Zrz;&G1;MIhV$Ofx&^_x0OaeC9{-OD@SLKl`k2QU|h4EyWb;aOP-Syj1!r=#-hww=+HH z$&_xsRM3st+Gq(gUp}}HJ&uP6d6j>R?l@_d-FxB$Ie}4&3%_k72%Wp427(`cC&@;W9?3Wk^(uDbZlh* zuSNXgxCVp86Ki6kk_J^+`TUt}$=u)#lqt3W{P}dRHdRgH$pIFSVsa)o(DF2#o5b>B z)b{rr3;P(0DPO5Z{1G*CyHw}bt*^Gn1_qegb`9CBdY-kKG9sH&tT`k;n)$q2dBKr^-^Z>yMNcICT0Wh{yS5DDZjfcg z-dOk+rrrkv49Ey`a^SK{Nbt!zXA%uDAesYV7zLX4Dvoq5LC$*{aB*t#udCalCFv`l z9Z@Qx4T?Eq%0QUmvxGcFaM^`;OXQbSe{=wJA|^?zm@0sxWTL?*kdP~!#iH$#O|>&R zKkRJ)O=I99($rgUeVBJnx9PERUdi5We&nm5H7UnP|Gjrc_+P?|0!m-M-K z$o2s^yUpAdm;n2JmpHkg#ZC`Rm{wv&6) zZ2g(bCewcbLQ+u{P4yjNln>S|g*d1Nybz3(WNcvAFWFoG+azj=xwWlO;rBq0jyUxI zN6s;esWbwTm&l^*Ci;Q-Ahc#FI&NQMY6)?G;A9b*WR!3^B~kwTP<2Qd z&mcLXks`Er-ZIdH5XETf+Qz3$5h4Ro5_!lL)&kz(M^Q5JDH*({mcwYJoLcdB7zgx0 z?!E3EM)COcsa>w@V$hw)pKF8@#|4$YwyE@m_L|oj_2VgH&4EgA8;NUlm6wbB49Be+ zx+O7=M}gOg9zrQ2^-h_ls+aE#e7F2;E+f9jKwNp+uLo(yNbwA7$0fO}uO&G|KK9&Y z(yD?^Yjwc=gB1S8c{&%aEw;cy4!PsXWO{L);VEAhOb%v$mDB=L`w?T=8NNgH#u~#? z+XKC-Dv3Bd=8}8hFZCQgr55C7SgHDuJF4pN#zglTp>l;^8~Th&0h~^F+?^NPhcIz6`=>6B(sqqG^E-wih?*C5pN~%mk02suuDU1 zNg$A6p&-KOeiiYTUVYqTS}+85n)eI=@dJGeDR#`IWQ7#G9nX`UXs_`UM%G2fr>x0@ zQ^?cNqHu)Si}(S(Ym_N^r0iUMrC}%E5)aQ)w>V0}=7sRM#L(d6RBKt|z}AL{DYoIU z;kB|B!k^V*sbW3}-z&dSngU3-C+Zl+COGe_;O4JSGytXQy_E>i2^#O#gO&vd`0mM0 znt*LN%rQ)`1|fc8rbE1ks%=;)=7Z5UwF%Ii+oc#TmZs|q11*BwfM%-V-eUt=X>hw; zRR^na&ewh&7E`p43`=f9CR4U5nfC5PbhK>6gPokLC-|*8hMF_bb){YYV9jad?*JV1WrMAwL8w%3lr{x;e1(`Zjp`CNVG1XGlyUMlJ ze}Oq=+V^%kw|AQ0lvo96NY$Awc@a2Dfv1EqNMpyCrSsrjWyZHZA#mHsY#(j(J|XCp zeY;H6xfk4eBh~WqCD*Ez`YC;gz&aFc5DNI5z3wl-7bxfkJaZ{3|PId!icekz78!#=qy|!H*YF7 zosD8^#P^FsJ=!HibThaJb#1?iqdVI5%cqmqj=r?1Q;EfrIKXPLR)LAI54cXG1?RGa z+DffuN4b#(s+USQsnW&9k5evUTl&IAdhdvPmJ4xkqF=L?48!JXI*Dlgi-dV6npoQL z=gPVpYWGF~Kfcmdy-_s6I}1ZR)~azxpSt$-pN;_;n_D6J1g*vl@-hTLUf6vf4eupx z#n2y`yb(rw0U1wL`pv+@C9Vtt+nrwmns@!vAebh zoMI~hFHP@@lIXk*Mqt0lp9<0$NOdVgAg@dBw)>4sNwena3DGAcFT||=e`zrs|48ey zG5wp?ZPpxjCgp_hKB0XEHy!~d;B~j^M8l@DQ-0z%(eCNmbe?#37U-F+R6Ln zK#E$(J_wJ>jE!@DCvE5W`Q&Ux3|x`t+O>GEiEW!Dq)YQeN-%#YI{~{3^Xq0+SS2AV z#uLNR@9SOXouS7bIxMRAcN(QPBZ(miVTo`Wtd@u`LoYvPTAX7tvn4&al9{d`)Cg5D zJf`g-9+u|keb1j@>LT8-vY}lN?0|lN(kLgAWvX~v1y9r?7t%5)c&a?%>`N?(iqPPt z`uY*H^>~mok?^&sOEFgs{9b#4Yc8cim*a0MHh5pC$a8<$3jztv<;HZ`uPn{uzqnX^ z54f`v)+`r4(sC=xlEMR5`<>3w8ReXfqYsONo6$1fS4ydoaYI-i4Qah?HLt9+?3U60 zdnVQ$ZJ#G{xn|Kqw~=PaaO2m&8ZqOM9ZjlvL1SHU(rFvBWDY!j?C=V;-7bhK)=wpp zoqjKMH)UdSjMktYzik$`ZY)Ymj`6d=FpzoNVz=57a6SvSB!*hEuuzjj97co(w+p2z z5TO9sj<&^`&^w0y1=3gvij6IbwS_3FTd9-ZLsIJ3=i8(2+I9la z1>rSiZ-xSoh~1#Kt_^IUASnAaR_9NOSd}e8mN9B<9HvM<#|9@>Fw9Taw2-y1Wd?)S zld)WPKE*h0{JoDeqo)<7e509I3}etnGV+>)IC@#+>rue_68H&^J`5i<+vAV9AftjU zr3i6_;*|Ow_}k_VtUbB>)Xy7u@Rc=2ZLarNIfb74D%O*>n}3H{DVLm0o|3kkc=X6c zI%MSYVlpi0%CKrHqT0rIn%KNE^4K8Gnn2soVL}iZI&Kqb*Sq*)z-1!-JSGVv~fA)>yJyq=SH~O~7+{`|N!jHHY8uUMN4@+`x)uUXH&4jGkpxJE4T#}`x9Qc@<)^D< zvOcV?rFW+-+oBC`*IqAYdclV}jiheB=dRJAEKya;=14bjl4BCxPiw7*{;9(q*UxBZ zaY;eBnXn{PQ!!JPbnEbBY2)Dp@YF6#Q_d$4vZ_d>$AUKR>aZRS#W-@@y)v;IE3yF^Qd2({JH!fM2BD&0w zPM6AePySS;PKUlw3>TfzHb(yWfZFJfn4aM6DhcPC!m`>p?PR4&%ilc!Z4mH`WdKqV z{9ovs`=8J^%fFvjyD0+X!I|N^fEb@aa=Gc3l4?k)1?IeixO}eLrl>S7N=haaV z6LF|B-l#Ku2z&($Nci`n8FktO==t?^^A1u_*ho`!gB$oV_Q-~vDvDnhToem6N59@lJ0ml4BQ(A9-sqIfen@`llw0An zYRznqT(@L1+lwH8uuDo0+dgJw*|+@8pg`yx>^s|os&2BT_)oaF|B>g#%)-k3ug*@5 z=6KxycDs9Ub+N?tzyd_jBv9wCsCu^y{rgRUlhZ>z|`qCT)VbN)_jIwDR=xd_f$ONS%H2 zSmE8{=M9&5fB|DK24R|O1Sm^92yT%DXexHO?d#ExZfZH|;MepO`Q4;%;eXT;<4vC9 zUq$`4lwz390=-OP)+wyB8q{5n-H$NaUi6GGg(y$5>N#?LCQ9@CbycfncfGJpl9R}F z(}wb04=}MD?mRT*(0@&4PvkMv=MA29i=0^>5d6?EhuDEIw7(>T=3$nu@}M&5(||t&&m!ZixjAUy#uAT3&nM}&AcdK{ z%Eb_!JYC(mHc%h*Kx9$ps`*Ug-xx1*?>Ryv_D0A+hpb{9pl8&n+IILeZRsy^L4k+= zKrWCIC3{jaWQ^h?g69gK-*Q-w`=G9hH~2(ggy>~N57^|bBgN1=bZsKxb>2VOx=-xn z-Z6}d15QbaN)O7_`GMuMAd{cRe4s0eGFz5mt3a`py(^_7u)*e-$3bgC>_-Wi(+EF( zuJ+xkJ$_g|C=`B9R)~+KLdO&|%D29*}k=$^9TNb2!`!Xiry4Dlnm_=g8eiS^x&nxN2UVPRs!wIbmHwr_I_?OAHG<*OfQ8EjfbpJC~>)}U)xm~yV6Jq6`HcxAJkKo ztPS|HJ-K1zlzrP_JT8@&?V4q@8q|zSIZxCmyuOX(PcPHIVowKc1_IABNXnA?k&;9x zasDoJa)CXse-{6c#YM7TL|v*dW`)|QPWJnl(Hg_PF6wf$uDxB3JFxql`-5D!i#(JE^sT3o1s2*$^Fg`O5YOunc*r}mPSla+NeQb%X_?2<9qe9$*hn+U`H30 z>qURaHjmAb3x6m~a!S(Nu5Ar8JPdcY;)uOCR)(BMUT?I*I`rcAXyvMlXFH0%hF6Kx z!0!vuw(FmG+ObAM*{YZH#q|dTP<>6bjgJZR60-nI)paaRoNUF$I`7 zeM7Ce49U1Ap7tgHX=MS9r8roOpg63}`@G^Zzg8_|HZGb`GY0CC4c( z8Hc~**z=?@NmQ?%QjUfEtXS}W?Iy#~|FN6e@BhbcI*I9)Z&*X`OuluLjNBJ}AJWpt z)Fk@|8K!<^OfR$Weid0U0L;V#%4X^zP^udN2cZ!YaPZz^;OC5_7aLA7vt@)HMW zTOldp3uc*DPrOI(qI=Z}Vbm>(Z1u%4$}gNW9n-$#S5-x<;mm`ckptS}Y+w2Dy$rp4 z42;pU{n=}^r)2)Z)nAuSEz8V(zc6$ z%1E|>keFJ`21L*GHSaeyE&i#MwA**eA87lA16HqW*ogK!g{aEZgyP}+VV1yC7&4y| zN|7l1ID*)%g^Aj{%d zEe)p0IG3$XxeO)Bj-~a|-$ZT7LJHh%vh7A8U+#p)QMmxlG|o1RZMg8;=cxvV<{soK zwqj(U9oNtW^Sm{GPEs)4re}OrbJ>HrjoFjws5zh+S#mO|Nj)QtcUU1hTP7-kN?{Ux z{Rbw112qbZ>)1Sg^`h5QT?1bxtsouumy4R@_YIV;BLg(=uW24mNMHgN@A_SiIU9zl zfeJoYiLa~;a(@QHvaq=XAr*$+zlTGHPv&DoQhs3(5EX-@H06&R(hD*Irlco-3v(R`jZ?%@w z-{8q4N@wrWz8bhF&~dSzg~`GQnrB^s+@oJX(LB1M*&2*6xHH6xwlnmS(=$vI2CD9De<@IuY?X%A+aN;v3hB>FHy;WU$Oyap39Df<8}Ow2ZIA16OJ1 za3<8!=a6w>EEDz=jBMr?lvwgmnw^^`>CzKckR+dUZUq)tL8I(vK)b-+pF!(r2hWSx zaLPf2Yj4_Dz~Y9&|8}II4=-K#DDajJ`=htOl5%`&f)H=EfmvFp(v#x z=6);TO`B`xzXh$adhpD1{~pRBe9%hP`82pQ$&K=N6{yS(LS&aszf=|Ba2d%$`>Y+> zJg&YvI6>^zCd7tf2Sk3nL@5cllDPKbTx}CXKaJrd%CU~R6p2k5IzXtVS{B=(;LfF> z5D*A;ARA4n!PJD_hd`)|6s+?E2NvF#cZv+n9i=!0Ea?|9n?fWOtB)0^DJLWUs7-|u z&wXie;-Ln)orG4<=;O;%4pVCjTdp*|&)UPgr|qB3CwNwkB`BbaPWmnWW1N0yaj(2` z6xuV}YZ78(T)D^&Zx{YRc&u91J)Xp8{;;dHBVWPuCD+EH@2ACE%diAoh8Yy4Y7MrB5e5e+%`k3R@0+hVw9QL_D#(n<7CyLwa_~}0fvEm^0LiVgH&2I zlQTH@>SzuwU+Oc~rSMj4UNlYNTdUc;A<6UF#5&@>B&+yMo^{-=*;(Y0HmPtf#Gtwo z4~b;kYiUWR_o;)o=)M}O_e35!$iL+duW!bw^ErKA(>kjY{D9lny*~Lb-Q}N6DoiZ@ zCcUS$r|b_o{&pAYcd#Pq@8nuSOyOXcVBL1vI&*_$tP3(OWBRYJC7)JO^5*V%whiYE z^pWU4lny0$0O!9jrM?#T**?+%K)7zdU*~n+UuRA)w^-d&=z;2t@hgz(^y;&Kemo;3 z`uGz;!s12A^fDP4m?#F(nY1g%ci`>Hm}rq>l}b>!3YfYK8kw=#enCD_`pS<2gQYv9 z2ZEGa5gbi@%qAP351$vm7e2Jfx`A;fN4?NTO)?i{+$4xPSN;W7sW8e8z$WHfDVSx+ zPtH)W`Jrgm+}MF|`m!S{1??Dc?&< zL+%esav9VOA?v}eoM-%XD^gQzmkHnYh$@VU_6g3)-Lvu#N6WhpSGGccI=5d6&~*Mg za>%KeX9c)rIjo1F44c!%3$)}@Sq&I!KyCWK#50wm@6d=KM`d*r%i@oL>VbJnR1Jfa zum;X4W6mO3LboWDl9Kl7V9K6FiVklE_3y*lbvpuf`n|JjBz|vG4)_b4+w6Dj8CaI| zDJyV1^udY7T#<`@TD7JL9RSA!O+D_S^i@`#QHhu7hc%73ygZEv~Z4JDlvk{{5JL#_akMFd27E% zRM{G4FZEhcyI^yKw+xIKCAoLKNqzgKg`o4g3nuFdZrZ94JE{k$`$dhc4~{iOfe>zj zzf*S|WtG^~N|ez|kE&T$-u}p=l3moT1kU@yb_GKpcM-ub7B-A$UabLZYj0R%XzG_f zv<>_7!7ma@gq(ojEy#Iv{u)i%3N~v3LAkp(A68LPP%+FUuBg#ce789&zLV1!NGK3U^)IIQ56uIoAR<3H zd5`STPIw*PP^hw^9b~cmR+uM=(415gWV)chGR#9K{thnKU)8d;0}LT?O#>*M)KxjsAbe!-u?fub%B9mH9$!C{Uyd-uR*h5n5N5CpwgmW^gliNxlb(3kv6Tq+eI(}Q2Bm?c@w z`v8i}>*7?cq895GVbPcF!onh);<{NymDXhX+4g?s%=G~!<2{Vu}9~t{UeOoid1aeroP&Nj9pObbWVt$i7nX_wufaz z88u%&31{tQqXY^?L!L@X+B81i-2zGWJjXM9{cwnD>~J)dKFN2%$c$xGSOqh*QL)>N zGSa%EvEObkVSjyQAy8XWC>)i_3cT|IOr<3{g~B>e+aVaVRaV9uTL1}nX$8sW`l>c9 zZOuD)WK%)VPrZB5N~q;Pft1v5L6M2qRSaC&W<#c#rPZaxk*MPj5E}u>7${@NBU#%~ zyQDRiyk!C^$Cfxv9pb0nA&@ALFG_=dTJT*fAg*zjC!5<=l^%D>yo#3ef$Tz^gk)~m zPIQ3gU`yt9zAf*e+CWOJAC9f|UT1f~9)EIlgfxFz;Q;uxCaN2?6nSZ1z`|E0?K9oG zj4uvReL;)HoQX4pU12q&60tz^mUM+_%z}yO+7CmV2SlYd?weB_rOaugiP=aX zaGTODSWS<{5nCP$b-}Yx8hlc_^hbm{wY16E#u;EA1@w?HMsr+4jgrn_`Z9yZ+%8diU+t?1#)1(HVq zaBI#Ju73N1-94d&11XsXO+LmLOtBP$_81#`bEisu91%1yz(j#}CHOq9W)tK{CozGb z$$wT88oyfLx_GLF9f@YcvsR#z^JfQ{AuKJgK&gPq&=kM78Om$UT@8W$S8q}wB#z*& z?{!k)5_+%OOHpKf&24!u+V>bD7B7O^1AzMv=4M-q60C`}4{50)OF3S)c32DYv!D*0 zwW6jAlv(t32WV$Nm;5~T&zcr-uD-i)x}($&lIZ=_8S5a9>i%|3?@8>N#j^DLzviZh zd70*aN(N@8e|GDMg`MNyCQ@xF2Rcr~o)e8lBFk6~YtR@0cqW(x9dlp2!&&>z6P9aa zgS)?eU2#jLGh>56aB+U;D(Vj>w3pPh9n5CQcLjR=gD+?9fWfl-8({BI{tQ6SUsVQu z&Z?EqAfY^@evWRY?#nMpnV0$!MiA@WliFbVnNu3(n_%4Op69Fp-|g5dgqV{obCmf6 zTa|AsuAsyHc#%i@0(4-IL1}_2OWoHwa0bwum%f8(WE^<()I?3&bq{DA?&w4MGWh)c zuFOuN1nKnrv?FMTyaOCV4hsN`MS8ACHYH-rtsfb7&#u#91}BU#sz)0-uC*Q|{p|L$ z+FnlWT>~|QY2&s?2B*4*L;whT>FzY(4H;vxp1q>VaRg~~WZV*H_H_BUQd%Bx|8k)QFcce~kACl^vjnVVqVG{6| zR?kcT4U!0SIKGyB^=4aJjl!Io7RYXWRV&k_PLWq%nkK8_QIq9I+c|%UHnOT-KsT1g zBLSymOkM6PN!6nV!T_u&yI6o(+R58~+~qEJY}{xDz#=k1%Sn_;fDmxbmvFUGgd^H` z$;0XB8x(0JBKkB-HsuNWT|8=~bwr12Bl|d*IEua66+WyhaZD$(Ha5|E4m0q1A6+Mt z@$Fdqo9yrHs)-rI6B+{fZe1OgAT*w#5tI1?@o&btX$3WzEcgV&m$nIatw&u1VIu@? z`4FHI9c2O?Ty)fk+-mMl<C8&5Fn;&q0i_`9^ZFkG_R`n;4CpLvbSm!&b*8#?6|5 z+U#-GJ@IG*a_xNb$joP=08F!o3z~Hu6YY#0x|kWF|(zi z-_rwi-zd>MhL3n`neKz_3s<~yp&ybFb_jQ_FW~HJ5tBv`Ot^BKQY(y0&7sa^ndX$!uvOq0-I=NA! z7H2zd_3(JI(M~3-)v5=U6c98fwYWEJ z)Q*@^#as7dg^QTzQnl-x-Xd@2#^*ckz_XZJ(Dro5GsxDVh=sG~BzavB&tzWKBu;q( zN-yO40+UL^VKZ3vEb>)4jY9K0*p}?CXl+`ZrUX~su=%25*y0}rru}26$tb(4kbYea z**&V7HDh3C-cf{KRko=!82{oHzU-vLsrydaN7}Ef)*kdbrO1~`*?@ZZ(g-Zcqf~Fy z=a1cMv%WjB@s20AsNoW*}x+&9YPrxO$Xg zOCjUZig&a9YCpnk1}aM1EVG3(E8s)-8^G2^`tY0J#*6s{NwJm*0;6~KY{&MTF4C>% zVA9wM;cqL~B_N?ei1p?a_9@2=8)#?b5Yt`9cHveeP>S&UKwqjNBn^vp{!U>#knKYE9(s5 zU6aoweeN>8;fOa}kt6~IA^zW6-?b5sWwp1!TkvsVXO)xB?e@a6SL)2gXt#Aeo=COEw5O^@iQYZ zk9Rcwj5NTOHcXtyJMB{X0fYS4?wRj?u)dCZtAZo7W~oUNrEx8qQ8mje2Y39yvqm5Y zR~bFqteZ1Xr$RT`zz?MG(mpfgje+(k$P4q>?~tB$NvN7n`aQ@|u43<3P%(kkqDXaR z4I50{1r@^>S%aJ_^w|`Y%4g^&8@64U_;ezy5ZIj4dh1e9mbg~7OBsU^TkR02Q2#B( zCevA|21ola!w-9-pOC$fI@ytvSUv_;4%bH$6)p6^MrwM6+(^taX^1a|sj#2vOP~O4 zB;H)Al$XLF1m|{Klex%M%o^i~xrn2v)25L>oVeirH$G#u>A>_&Q=obe-b~8N$dZAI z49GF*+IFX9CSZoKihMcTu>$jNB2}kTDWkS=oZ)s8!3vjLBtt`Uhe&e6=;*^5O4)*o3e;j;9W*a!cPYS}q!WFDcqvDG`!BMH`5)ad;^O`{Rn)8@ z!r?5 ztJ;TEY4{BH=Qh&gsms3{3F_e!t+F_oQ=g!A0@+GhDRYdo3h~6j17rkzHgP3Y1B8qJ zjvtf@0D$Aa@}L;%bZ@-QQS>d+M3*1aec;5=$I?2wmpgMFXwU2tL8&S@{qldV79d>w zJVWccOEp@Tlvsr<6YHYN%XHsXJ;WSh;4me@m4js;*4M<5GJ!5&xR){C&0bb z6-D|j{Emp7CHJMAealmzSI#D00Ee*;R!1+dnV|?Vj|^hVk28fDMOBQBZ2^UI5>vNf zf=a}@Zc?hUn(Zt&p4aGn{7W@o9ntGgfy+2dvI%j-&a_W4FY~AB-yW6o-tOA|08yG* zjko9$m+iOC1gq`2{ zQ2{Mapo>VM3AwNnYAbe$KrhPiIg^lE!S;SkX`qzRsL$uU1+T-4q$9Q{=}xY&$*Gwhl67_XKP zCok*i*UESarm(y;=qTw9S*h~|rRJ!{m51XMC4GwKu!@&m$hwg+B-0q9XarV->GPQA zWbrxs3&MO&t9~#a0y*#KGlGzS8|=5*j9oLKOfITbav934eWOf{>d5MGXyQ$1#_#8Weyt)r(Wr2tvuag!`jAPH5HC&oU^s)?Wxza z?oE1{hm>2^wRA7sg%J>zk_XlGvW_{L!F;*v?*$+(uEPSgpGz(3ADw~p4{IjM13ZW| z2rq?5x-DUePJgz&u3hWNTs(G`k+nadl5pCxhOjk&EyF5l$dc$wdtMztIh|!v7cDu+@QS;+=?NPkw;U z=?DLFKmz55a-7^~F^t8hy2|H8RqJS2EeME}h8Df(Us!^B@c= zfOzKy?5#P{NxzfA+?ksKSmWySIkz>$&5P3T*kulExJHxG6;h7H$WBYu@x8+=lpxyk zl_@fFwx&C*k~Uu;5g@atx&n)~0Qd{No?kk~BWEpNUB zct1b>+{WVjx_?Z6+dJ8r6so4`ojRHH4@D-pS(JlyG`?EP$tsAVjPQ-3MeYQM*3?{nRz#A%w7tJp92fi2MbaZ zi+r1xAgHggN_rQ)c}Wp8w4aAGmOB}u+{P#$WkO$lJLO1~Fk|7DBW~`Jwl1A3&L&r_ z>NKVJHEOG68-wFefbv)+czf1!{TMas5->ryng-;HUe$GC0}9`E%+5S!9L9wJaa5o3 z!)O&rgsKUzh~ufUZ0IBadaa51`rcsP81M)Z?ztdgPFcjA!!+9_*vRsH8`gO}mPA+N=((Z=_1v;JLF3gm7m3mk^X^VA;KR)en6R%8N?=@^E6sd$yO_TBBal z;{(a%Ns$|E8gOBj`Uoc!cy^-EC6&rXt>wckC|rnPXziaZ>4X&8T1 z{!gS~*6c+&Qk_spN4ad_nwAKL*!ycl)0l%e-BDp>q0P+=Y^Xh5)Lu%%_MsodJd=T( z*+RnhZX-i(*kkIQR$Ug0Ebn#?R3jwgPJ}4R#$V0HH^&CHWoAi4;qgw#Ljh|~tzV!UO^-bN{?Ir;#m{n*>`n%ad!v|Rq7 zp+J!N644J5I*>g2>k4mcY5!&wEh#}%+!Ke9r4c}O06Dr5rPGWFuI~6s4bsx==B*I% zf@??m<0Na*g^H>KPd<_2$>tuim4x%YrU>ne7ClQqXWF@%+$Bm9wOv~@phfsE*3K$5 zEXA}338yt^f#on0Wb|56izAAkG9kF*d=utz)#Hopw^oIe)p4#ywQ%il8I;Saq&b!z zk}iXa4oGWJvRp{4Yc8}%=1Uj#Ewzgyn^7zBFljx+KP{9Umex+rUQQ`(e;Y;uAm$sB zD1DEjBk>4>?*Am;H%NGhrX?c76pwMZm3Loj(ISl7Ka1EFg)>0wv?jSiVg#B zEwKl)?Nw;Hsr+G$)Jl#H)n{NOA2dp4=lVEws2^;?HuElBUxr4acq>&StSOabGG|R8 zKAoi.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