diff --git a/Kapitel_1._Einstieg_in_die_Welt_von_Python.ipynb b/Kapitel_1._Einstieg_in_die_Welt_von_Python.ipynb index 83423fa..2a51c07 100644 --- a/Kapitel_1._Einstieg_in_die_Welt_von_Python.ipynb +++ b/Kapitel_1._Einstieg_in_die_Welt_von_Python.ipynb @@ -1147,7 +1147,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.6" + "version": "3.9.4" } }, "nbformat": 4, diff --git a/Aufgaben_zur_Vorbereitung_von_Kapitel_1.ipynb b/Lektion1_Definieren_von_Parametern_und_Funktionen.ipynb similarity index 63% rename from Aufgaben_zur_Vorbereitung_von_Kapitel_1.ipynb rename to Lektion1_Definieren_von_Parametern_und_Funktionen.ipynb index 33f96e2..73e3235 100644 --- a/Aufgaben_zur_Vorbereitung_von_Kapitel_1.ipynb +++ b/Lektion1_Definieren_von_Parametern_und_Funktionen.ipynb @@ -4,11 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Vorbereitung Kapitel 1. Einstieg in die Welt von Python:\n", + "# Lektion 1. Definieren von Parametern und Funktionen:\n", "\n", "In unserer heutigen digitalen Welt sind Computer nicht mehr aus unserem Alltag wegzudenken. Ob in der Finanzwelt, Industrie aber auch in der Wissenschaft erledigen Computer in Sekundenschnelle komplizierte Rechnungen und helfen dem Anwender komplizierte Sachverhalte vereinfacht wiederzugeben. Daher empfiehlt es sich insbesondere als Physiker zumindest die Grundlagen einer beliebigen Programmiersprache zu beherrschen.\n", "\n", - "Im folgenden werden wir uns gemeinsam die Grundzüge der Programmiersprache **Python** erarbeiten. Ein besonderes Augenmerk liegt hierbei auf den verschiedenen Herausforderungen, die das Analysieren von experimentellen Daten mit sich bringt. Um Sie bestens auf die Anforderungen im **physikalischen Grundpraktikum (PGP)** vorzubereiten, lernen wir im Folgenden wie man:\n", + "Im Folgenden werden wir uns gemeinsam die Grundzüge der Programmiersprache **Python** erarbeiten. Ein besonderes Augenmerk liegt hierbei auf den verschiedenen Herausforderungen, die das Analysieren von experimentellen Daten mit sich bringt. Um Sie bestens auf die Anforderungen im **physikalischen Grundpraktikum (PGP)** vorzubereiten, lernen wir im Folgenden wie man:\n", "\n", "* einfache Rechnungen mit Python durchführt\n", "* \"Mathematische\" Funktionen definiert\n", @@ -16,7 +16,7 @@ "* Daten in Form von Graphen richtig darstellt\n", "* eine Ausgleichsgerade von Datenpunkten berechnen kann.\n", "\n", - "Damit Sie das neu erlernte Wissen direkt vertiefen können, wird dieses Notebook an verschiedenen Stellen kleinere Aufgaben für Sie bereithalten. Die Aufgaben sind durch orangefarbene Boxen hervorgehoben. Es gilt alle Aufgaben zu bearbeiten!" + "Damit Sie das neu erlernte Wissen direkt vertiefen können, wird dieses Notebook an verschiedenen Stellen kleinere Aufgaben für Sie bereithalten. Die Aufgaben sind durch orangefarbene Boxen hervorgehoben. Es gilt alle Aufgaben zu bearbeiten!\n" ] }, { @@ -85,6 +85,15 @@ "Des Weiteren können Sie [hier](https://www.cheatography.com/weidadeyue/cheat-sheets/jupyter-notebook/) eine Auflistung weiterer Jupyter-Befehle finden." ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Noch ein kleiner Tipp:\n", + "\n", + "Diese Notebooks sollen ein interaktives Erlernen von Python ermöglichen. D.h. sollte Ihnen etwas unklar sein nach einem Beispiel erstellen Sie ruhig einfach eine neue Zelle **A**bove oder **B**elow und probieren Sie es aus!" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -217,12 +226,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2019-10-27T12:25:06.101225Z", - "start_time": "2019-10-27T12:25:06.087057Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "3**2 * (2 - 8 ) " @@ -232,12 +236,111 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Um unsere Rechnungen besser zu strukturieren, können wir Zahlen auch Variablen zuordnen. Hierzu verwenden wir das Gleichheitszeichen, um einer Variablen (*links*) einem Wert (*rechts*) zuzuordnen." + "
\n", + " \n", + "#### Aufgabe 2. Der Taschenrechner:\n", + "\n", + "Im folgenden wollen wir nun das einfache Rechnen üben berechnen Sie die folgenden Zahlen:\n", + " \n", + "1. $ 155 - 5^2 + 25 \\cdot (5 - 10) $\n", + "2. $ \\sqrt{155} + \\sqrt[3]{14} $\n", + "3. $ 2^{(5-3)^4} $\n", + "\n", + "Um Ihnen nicht nur die Aufgaben, sondern auch die Lösungen bereitzustellen werden Sie die nachfolgende oder ähnliche Felder finden. Sofern Sie ihren Mauszeiger über das Wort bewegen und es anklicken wird der entsprechende Hilfetext erscheinen. Verwenden Sie diese jedoch erst sofern Sie fertig sind oder wirklich nicht mehr weiterwissen. Meistens verbirgt sich die Lösungen zu den Aufgaben in den vorher gezeigten Beispielen. \n", + "\n", + "
\n", + "
\n", + "\n", + "\n", + "**Hinsweise (click me):**\n", + "\n", + "\n", + "\n", + "* Hinweise erstellen Sie für jede Aufgabe eine neue Zelle damit Ihnen das Ergebnis angezeigt wird.\n", + "* Wie können Wurzeln mit Hilfe von Exponenten dargestellt werden?\n", + "\n", + "
\n", + " \n", + "
\n", + "
\n", + "\n", + "\n", + "**Lösung Zahlenwerte (click me):**\n", + "\n", + "\n", + "\n", + "1. 5\n", + "2. 14.86\n", + "3. 65536\n", + "\n", + "
\n", + " \n", + "
\n", + "
\n", + "\n", + "\n", + "**Lösung Code (click me):**\n", + "\n", + "\n", + "\n", + "1. `155 - 5**2 + 25 * (5 - 10)` \n", + "2. `155**(1/2) + 14**(1/3)` \n", + "3. `2**((5-3)**4)`\n", + "\n", + "
\n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Sehr schön Sie haben bereits die zweite Aufgabe gemeistert. Leider läuft beim Programmieren nicht immer alles auf Anhieb glatt und Fehler sind keine Seltenheit. Zum erfolgreichen Programmieren gehört es daher unabdingbar dazu, dass Sie Fehlermeldungen verstehen und beheben können. Zum Glück ist Python in dieser Hinsicht eine sehr informative Sprache, so dass Sie mit ein wenig Übung Fehlermeldung ganz leicht verstehen können. Jetzt am Anfang gibt es noch nicht viel, dass wir falsch machen können. Gucken wir uns einmal einen einfachen und beliebten Fehler an:" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "ename": "ZeroDivisionError", + "evalue": "division by zero", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/tmp/ipykernel_6083/2354412189.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;36m1\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mZeroDivisionError\u001b[0m: division by zero" + ] + } + ], + "source": [ + "1/0" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Sie sehen das Python den von Ihnen eingebene Befehl nicht ausführen kann und Ihnen daher eine Fehlermeldung mit einem sogennanten Traceback zurückgibt:\n", + "\n", + "![images/Fehlermeldung_div0.png](images/Fehlermeldung_div0.png)\n", + "\n", + "Im Allgemeinen besteht so ein Traceback aus einer Information welcher Aufschluss über die Art des Fehlers gibt, hier `ZeroDivisionError` und einer Zeilen und Code Angebe welche Ihnen die fehlerhafte Codezeile anzeigt. Bei machen Fehlern kann es jedoch auch sein, dass der Fehler sich in einer vorherigen Zeile befindet, jedoch erst später auftritt. Hierfür werden wir später nochmal Beispiele sehen. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Kommen wir nun jedoch ersteinmal wieder zum Rechnen zurück. Um unsere Rechnungen besser zu strukturieren, können wir Zahlen auch Variablen zuordnen. Hierzu verwenden wir das Gleichheitszeichen, um einer Variablen (*links*) einem Wert (*rechts*) zuzuordnen." + ] + }, + { + "cell_type": "code", + "execution_count": 7, "metadata": { "ExecuteTime": { "end_time": "2019-10-27T12:25:06.116447Z", @@ -251,14 +354,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": { "ExecuteTime": { "end_time": "2019-10-27T12:25:06.132372Z", "start_time": "2019-10-27T12:25:06.119281Z" } }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "5" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "a" ] @@ -272,7 +386,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "metadata": { "ExecuteTime": { "end_time": "2019-10-27T12:25:06.149182Z", @@ -284,9 +398,16 @@ "variable = 2" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Und wir können neben Zahlen auch das Ergebnis komplexere Rechnungen einer Variablen zuordnen: " + ] + }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "metadata": { "ExecuteTime": { "end_time": "2019-10-27T12:25:06.164477Z", @@ -295,35 +416,59 @@ }, "outputs": [], "source": [ - "variable_die_eine_multiplikation_beinhaltet = a * variable" + "variable_die_das_ergebnis_eine_multiplikation_beinhaltet = a * variable" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "6.666666666666667" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "variable_die_eine_multiplikation_beinhaltet" + "variable_die_das_ergebnis_eine_multiplikation_beinhaltet" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ + "Theoretisch ist es möglich auch Großbuchstaben und andere Zeichen in Variablennamen zu verwenden. Hier empfiehlt es sich aber den [Standard welcher in der Python-Community](https://www.python.org/dev/peps/pep-0008/#id43) genutzt wird zu halten. Dies führt dazu, dass Code einheitlicher und somit besser verständlich ist. Bei Variablennamen wird empfohlen nur Kleinbuchstaben und Unterstriche für die Worttrennung zu verwenden. Darüber hinaus sollten als Namen nach möglichkeit Nomen verwendet werden. \n", + "\n", "Bei der Definition von Variablen ist es wichtig, auf die Reihenfolge zu achten. Dies gilt nicht nur innerhalb einer Zelle..." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": { "ExecuteTime": { "end_time": "2019-10-27T12:25:06.180459Z", "start_time": "2019-10-27T12:25:06.167499Z" } }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "21" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "a = 4\n", "b = 3\n", @@ -341,7 +486,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": { "ExecuteTime": { "end_time": "2019-10-27T12:25:06.195614Z", @@ -355,7 +500,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": { "ExecuteTime": { "end_time": "2019-10-27T12:25:06.211590Z", @@ -369,18 +514,129 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "metadata": { "ExecuteTime": { "end_time": "2019-10-27T12:25:06.231469Z", "start_time": "2019-10-27T12:25:06.212585Z" } }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "12" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "a * b" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Rechenoperatoren können auch mit dem `=`-Zeichen verbunden werden. Dies ermöglicht es das Überschreiben einer Variablen zu verkürzen:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "i = 1\n", + "i = i + 1\n", + "i" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "i += 1\n", + "i" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Dies geht mit allen gängigen Rechenoperatoren:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "10" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = 5\n", + "a *= 2\n", + "a" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3.3333333333333335" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a /=3\n", + "a" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -390,14 +646,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": { "ExecuteTime": { "end_time": "2019-10-27T12:25:06.247553Z", "start_time": "2019-10-27T12:25:06.233424Z" } }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "10" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "a = 2\n", "b = 5\n", @@ -407,14 +674,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "metadata": { "ExecuteTime": { "end_time": "2019-10-27T12:25:06.279581Z", "start_time": "2019-10-27T12:25:06.251320Z" } }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "10.0" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "a = 2\n", "b = 5.0\n", @@ -426,11 +704,98 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In der oberen Zelle ist **c** vom Datentyp `int` (*Integer*), was einer Ganzenzahl entspricht. In der unteren Zelle jedoch ist **c** vom Datentyp `float` (*Floating Point Number*) also eine Gleitkommazahl. Dies liegt daran, das wir in der unteren Zelle **b** als Gleitkommazahl definiert haben. Um uns Arbeit abzunehmen, hat Python für uns im Hintergrund dynamisch entschieden, dass somit **c** ebenfalls vom Typ `float` sein muss. \n", + "In der oberen Zelle ist **c** vom Datentyp `int` (*Integer*), was einer ganzen Zahl entspricht. In der unteren Zelle jedoch ist **c** vom Datentyp `float` (*Floating Point Number*) also eine Gleitkommazahl. Dies liegt daran, das wir in der unteren Zelle **b** als Gleitkommazahl definiert haben. Um uns Arbeit abzunehmen, hat Python für uns im Hintergrund dynamisch entschieden, dass somit **c** ebenfalls vom Typ `float` sein muss. \n", "\n", - "Neben den primitiven Datentypen `float` und `int` gibt es noch die wichtigen Datentypen `str` (*string*) was einer Zeichenkette entspricht (z.B. Buchstaben, Wörter und Sätze), `complex` für Komplexe Zahlen und `bool` für Wahrheitswerte. Was genau Wahrheitswerte sind und wofür diese verwendet werden, werden Sie noch im **PGP2** lernen. \n", - "\n", - "Für das **PGP1** sind erstmal nur die Typen `int`, `float` und `str` von Bedeutung." + "Neben den primitiven Datentypen `float` und `int` gibt es noch die wichtigen Datentypen `str` (*string*) was einer Zeichenkette entspricht (z.B. Buchstaben, Wörter und Sätze), `complex` für Komplexe Zahlen und `bool` für Wahrheitswerte. Complexe Zahlen lassen sich mit hilfe des Buchstaben `j` wie folgt darstellen:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1j" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "1j" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Realer und imaginärer Anteil:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(5+2j)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "5 + 2j" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Achtet bei Komplexen Zahlen dadrauf, dass das `j` direkt auf die Zahl folgt. Das folgende führt zu einem Fehler:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'j5' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/tmp/ipykernel_6354/3143615836.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mj5\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mNameError\u001b[0m: name 'j5' is not defined" + ] + } + ], + "source": [ + "j5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "da Python `j5` als einen Variablennamen interpretiert." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Wahrheitswerte werden wir noch etwas später kennenlernen. In aller Regel sind erstmal nur die Typen `int`, `float` und `str` für das Auswerten von Daten von Bedeutung." ] }, { @@ -444,7 +809,7 @@ "source": [ "
\n", " \n", - "#### Aufgabe 2.a.: Beschleunigte Bewegung\n", + "#### Aufgabe 3.a.: Beschleunigte Bewegung\n", "\n", "Die zurückgelegte Distanz eines Objekts, welches eine beschleunigte Bewegung ausführt (z.B. der freie Fall einer Kugel in einem Gravitationsfeld), kann mit Hilfe von \n", "\n", @@ -460,7 +825,7 @@ "\n", "... bis er auf dem Boden aufschlägt? (Reibungseffekte sind zu vernachlässigen)\n", "\n", - "Mit welcher Geschwindigkeit (in km/h) schlägt der Stift auf die Sonnenoberfläche auf?\n", + "Mit welcher Geschwindigkeit (in km/h) schlägt der Stift auf die Sonnenoberfläche auf? Verwenden Sie sinnvolle Namen für die Parameter.\n", "\n", "**Hinweis:** \n", "Sofern Sie alle Berechnungen innerhalb einer Zelle ausführen wollen, können Sie mithilfe der `print`-Funktion die Ergebnisse \"ausdrucken\"/anzeigen lassen. Gehen Sie dabei wie folgt vor:\n", @@ -472,9 +837,214 @@ "print(Variablennamen1) \n", "print(Variablennamen2)\n", "print(Variablennamen3)\n", - "```" + "```\n", + " \n", + "
\n", + "
\n", + "\n", + "\n", + "**Lösung Zahlenwerte (click me):**\n", + "\n", + "\n", + "\n", + "* $t_E \\approx 0.5\\,$s\n", + "* $t_M \\approx 1.2\\,$s\n", + "* $t_S \\approx 0.1\\,$s\n", + "* $v_S \\approx -92\\,$ km/h \n", + "\n", + "\n", + "
\n", + "\n", + "\n", + "
\n", + "
\n", + "\n", + "\n", + "**Lösung Code (click me):**\n", + "\n", + "\n", + "\n", + "```python\n", + "s0 = -1.2 \n", + "\n", + "gE = -9.81\n", + "gM = -1.62\n", + "gS = -274\n", + "\n", + "tE = (s0*2/gE)**0.5\n", + "tM = (s0*2/gM)**0.5\n", + "tS = (s0*2/gS)**0.5\n", + "vS = (tS * gS)*3.6\n", + "print(tE, tM, tS)\n", + "print(vS)\n", + "```\n", + "\n", + "
\n", + "
" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Wie Sie vielleicht bemerkt haben, konnten wir bei unserer Rechnung ähnlich wie beim Taschenrechner keine Einheiten angeben. Dies kann manchmal etwas verwirrend sein, gerade wenn Einheiten auch noch ineinander umgerechnet werden. Z.B m/s bzw. s in km/h.\n", + "\n", + "Es gibt in Python die Möglichkeit SI-Einheiten zu verwenden, dies erfordert jedoch das Einbinden von sogenannten „Packages“. Packages sind kleine und große „Erweiterungen“ für Python welche es dem Nutzer ermöglichen neue Dinge, welche über die Standardfunktion von Python hinaus gehen zu verwenden. Hierzu zählen auch das Zeichnen/Plotten von Graphen und das Fitten von Messdaten. Für einfache Anwendungen reicht es jedoch aus Einheiten als Kommentare darzustellen. Darüber hinaus sollten Sie immer Versuchen ein gleichbleibendes Einheitensystem in Ihren Rechnungen zu verwenden und lediglich die Ergebnisse in die gewünschte Form umwandeln. Dies sieht dann wie folgt aus:" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-706.32\n" + ] + } + ], + "source": [ + "# Zeilenabschnitte, die mit einer Raute beginnen sind\n", + "# ein Kommentar und werden beim ausführen des Codes\n", + "# ignoriert. \n", + "# Kommentare können vielseitig angewendet werden.\n", + "# Sie können zum einen zur Dokumentation dienen\n", + "# und zum anderen können Sie helfen Probleme im\n", + "# Code zu analysieren und zu verstehen.\n", + "\n", + "\n", + "t_freier_fall = 20 # s\n", + "g_erde = -9.81 # m/s**2\n", + "v_erde = t_freier_fall * g_erde # m/s\n", + "v_erde *= 3.6 # km/h\n", + "print(v_erde)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Wie bereits beschrieben können Sie Kommentare auch dazu verwenden gewisse Operationen zu überspringen, um eventuelle Zwischenergebnisse zu testen:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t_freier_fall = 20 # s\n", + "g_erde = -9.81 # m/s**2\n", + "v_erde = t_freier_fall * g_erde # m/s\n", + "# v_erde *= 3.6 # km/h\n", + "print(v_erde)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + " \n", + "#### Aufgabe 4. Erstes Debugging:\n", + "\n", + "Wie bereits erwähnt gehört das Beheben von Fehlern bzw. das sogenannte Debugging leider zum Programmieren dazu. Im Laufe dieses Online-Workshops werden wir Sie daher immer wieder mit Fehlermeldungen konfrontieren, so dass Sie lernen diese zu verstehen und zu beheben. \n", + " \n", + "In der nachfolgenden Zelle haben sich zwei Fehler eingeschlichen führen Sie die Zelle aus um die entsprechenden Tracebacks zu erhalten und beheben Sie nacheinander die Fehler. Wie könnten Sie den Code verändern, um die Fehleranfälligkeit zu reduzieren? \n", + "\n", + " \n", + "**Tipp:**\n", + " \n", + "Sie können sich die Zeilenindex Ihrer Codezelle anzeigen lassen in dem Sie erst die entsprechende Zelle anwählen, mit Hilfe der `ESC`-Taste in den Kommandomodus (blaue Zellumrandung) wechseln und die `L`-Taste verwenden. \n", + " \n", + "Sobald Sie den ersten Fehler behoben haben, führen Sie die Zelle erneut aus um den zweiten Traceback zu erhalten.\n", + " \n", + "\n", + "
\n", + "
\n", + "\n", + "\n", + "**Hinweis Fehler 1. (click me):**\n", + "\n", + "\n", + "\n", + "Bei einem Syntaxfehler handelt es sich meistens um einen Fehler bei dem Operatoren falsch verwendet werden. Achten Sie bei der Fehlermeldung auf die Zeilenangabe und das kleine Dachsymbol, welches Ihnen den Ort des Fehlers aufzeigt. Wie ist denn nochmal die Geschwindigkeit in einer gleichförmig beschleunigten Bewegung definiert? \n", + " \n", + "![images/Fehlermeldung_div0.png](images/A4_syntax_error.png)\n", + "\n", + "
\n", + " \n", + " \n", + "
\n", + "
\n", + "\n", + "\n", + "**Hinweis Fehler 2. (click me):**\n", + "\n", + "\n", + "\n", + "Diese Fehlermeldung ist eindeutig. Vergleichen Sie nocheinmal genau die Schreibweise des Parameters in Zeile 2 mit dem fehlerhaften Namen. Wie können Sie die Häufgkeit dieser Art von Fehler am besten reduzieren?\n", + "\n", + "
\n", + "\n", + "\n", + "
\n", + "
\n", + "\n", + "\n", + "**Zusatzerklärung (click me, aber erst nach lösen der Aufgabe ;-) ):**\n", + "\n", + "\n", + "\n", + "Ist Ihnen aufgefallen, dass Ihnen zu erst der `SyntaxError` angezeigt wurde obwohl dieser erst in einer späteren Zeile auftritt als der `NameError`? Dies liegt daran, das Python beim ausführen Ihres Codes zunächst den gesammten Code überprüft ob dieser auch Interpretiert werden kann, bevor er ausgeführt wird. \n", + "\n", + "
\n", + "\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "invalid syntax (815514423.py, line 7)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"/tmp/ipykernel_6354/815514423.py\"\u001b[0;36m, line \u001b[0;32m7\u001b[0m\n\u001b[0;31m aufschlageschwindigkeitdessteins = fallzeitdesstein*/erdbeschleunigung # m/s\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + ] + } + ], + "source": [ + "erdbeschleunigung = -9.81 # m/s**2 \n", + "fallhoehedesasteins = -1200 # km\n", + "\n", + "fallbeschleunigungmond = -1.62 #m/s**2\n", + "fallzeitmond = (fallhoehedesasteins*2000*fallbeschleunigungmond)**0.5 # s\n", + "fallzeitdesstein = (fallhoehedeassteins*2000*erdbeschleunigung)**0.5 # s\n", + "aufschlageschwindigkeitdessteins = fallzeitdesstein*/erdbeschleunigung # m/s" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Wie können Sie Fehler gleich zu beginng vermeiden?\n", + " \n", + "Gerade beim schreiben von längeren Code-Blöcken schleichen sich sehr leicht Fehler ein, welche schwerer zu beheben sein können. Zum Glück handelt es sich bei Python ja um eine Interpretersprache, d.h. wir können Code direkt ausführen um Ihn auf seine Richtigkeit zu überprüfen. Daher bietet es sich insbesondere in Jupyter-Notebooks an Zellen regelmäßig auszuführen (z.B. immer wenn Sie zwei Zeilen Code geschrieben haben) um eventuelle Fehler frühzeitig zu erkennen. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "markdown", "metadata": {}, @@ -624,7 +1194,7 @@ "source": [ "
\n", " \n", - "#### Aufgabe 2.b.: Beschleunigte Bewegung Zusatz\n", + "#### Aufgabe 3.b.: Beschleunigte Bewegung Zusatz\n", " \n", "Lassen Sie nun Ihre berechneten Werte aus Aufgabe 2 mithilfe von `print` erneut ausgeben. Nutzen Sie jedoch dieses Mal **Formatstrings** für eine schönere und bedeutungsvollere Rückgabe. Achten Sie dabei ins besonders auf:\n", "\n", @@ -864,416 +1434,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Messtabellen in Python:\n", - "\n", - "Damit uns eine Programmiersprache wie Python Arbeit abnehmen kann, sollte es auch möglich sein, größere Datenmengen, wie z.B. die Werte einer Messtabelle, in einer Variablen zu speichern. Python bietet hierfür verschiedene Konzepte an. Jedes dieser Konzepte hat unterschiedliche Stärken und Schwächen. Die gängigsten Methoden sind list, tuple, bzw. sogenannte numpy.arrays und pandas.dataframes. Aufgrund der limitierten Zeit im PGP 1 werden wir uns hier lediglich mit zwei dieser vier Methoden auseinander setzen. \n", - "\n", - "Fangen wir zunächst mit Listen an. Eine Liste ist eine Ansammlung von Werten, welche alle den gleichen oder ganz unterschiedliche Datentypen haben können. Eine Liste kann auf zwei unterschiedliche Art und Weisen erstellt werden:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2019-10-27T12:25:06.446484Z", - "start_time": "2019-10-27T12:25:06.432594Z" - } - }, - "outputs": [], - "source": [ - "Messwerte1 = ['Wert1', 'Wert2', 'Wert3'] # Variante 1\n", - "Messwerte1" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2019-10-27T12:25:06.477151Z", - "start_time": "2019-10-27T12:25:06.449263Z" - } - }, - "outputs": [], - "source": [ - "Messwerte2 = list([2, 0.9, '1']) # Variante 2\n", - "Messwerte2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Sobald wir eine liste erstellt haben, können wir eine ganze Reihe von unterschiedlichen Manipulationen durchführen, um sie nach unserem Belieben zu verändern.\n", - "\n", - "Wir können zum Beispiel die bestehende Liste um einen Wert erweitern (`append`) oder einen zusätzlichen Wert an eine beliebige Stelle in der Liste hinzufügen (`insert`)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2019-10-27T12:25:06.492972Z", - "start_time": "2019-10-27T12:25:06.480376Z" - } - }, - "outputs": [], - "source": [ - "Messwerte1.append('Wert5')\n", - "Messwerte1" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2019-10-27T12:25:06.509050Z", - "start_time": "2019-10-27T12:25:06.496701Z" - } - }, - "outputs": [], - "source": [ - "Messwerte1.insert(4, 'Wert4')\n", - "Messwerte1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Ups, was ist denn in der letzten Zelle passiert? Wert4 wurde ja garnicht an Stelle 4 der Liste gesetzt, Python scheint nicht zählen zu können... \n", - "\n", - "Leider zählt Python doch richtig. In Python läuft der Index von Objekten in einer Liste immer von 0,1,2,3...n. Dies können wir auch ganz einfach überprüfen, indem wir unsere Liste in verschiedene \"Scheiben\" schneiden (so genanntes slicing). Dies geht wie folgt:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2019-10-27T12:25:06.524167Z", - "start_time": "2019-10-27T12:25:06.511411Z" - } - }, - "outputs": [], - "source": [ - "NeueWerte = ['Wert1', 'Wert2', 'Wert3', 'Wert4', 'Wert5', 'Wert6'] " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Die kleinste Scheibe, welche wir abschneiden können, ist ein einzelner Wert:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2019-10-27T12:25:06.540756Z", - "start_time": "2019-10-27T12:25:06.525161Z" - } - }, - "outputs": [], - "source": [ - "NeueWerte[0] # Hier sehen Sie, dass der erste Wert den Index 0 hat." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2019-10-27T12:25:06.556003Z", - "start_time": "2019-10-27T12:25:06.541754Z" - } - }, - "outputs": [], - "source": [ - "wert_index_2 = NeueWerte[2] \n", - "wert_index_2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Wie bei einer Pizza können wir uns natürlich auch größere Stücke nehmen." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2019-10-27T12:25:06.571456Z", - "start_time": "2019-10-27T12:25:06.561307Z" - } - }, - "outputs": [], - "source": [ - "NeueWerte[0:3]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2019-10-27T12:25:06.603263Z", - "start_time": "2019-10-27T12:25:06.579819Z" - } - }, - "outputs": [], - "source": [ - "NeueWerte[2:5] # Python behandelt den letzten Wert wie in einem offenen Intervall [2,5)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2019-10-27T12:25:06.634032Z", - "start_time": "2019-10-27T12:25:06.607460Z" - } - }, - "outputs": [], - "source": [ - "NeueWerte[2:] # Hier werden alle Werte mit dem Index >= 2 zurückgegeben" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2019-10-27T12:25:06.649485Z", - "start_time": "2019-10-27T12:25:06.635504Z" - } - }, - "outputs": [], - "source": [ - "NeueWerte[-3:] # Mit negativen Zahlen fangen Sie vom Ende der Liste an" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Neben `insert`, `append` und `slicing` bietet Python noch ein paar weitere Listenmanipulationen an. Mit Hilfe des `+` Operators können Sie die Werte in einer Liste direkt an eine andere Liste anfügen." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2019-10-27T12:25:06.680320Z", - "start_time": "2019-10-27T12:25:06.654941Z" - } - }, - "outputs": [], - "source": [ - "Messwerte1 + NeueWerte" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "ExecuteTime": { - "end_time": "2019-10-27T12:22:59.315752Z", - "start_time": "2019-10-27T12:22:59.289651Z" - } - }, - "source": [ - "Anders als `append`, welches die zweite Liste als Ganzes an die erste Liste anfügt:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2019-10-27T12:25:06.696566Z", - "start_time": "2019-10-27T12:25:06.684462Z" - } - }, - "outputs": [], - "source": [ - "Messwerte1.append(NeueWerte)\n", - "Messwerte1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Aber aufgepasst, bei `append` wird die Liste, an welche Sie die Daten anhängen (hier Messwerte1), direkt geändert (dies gilt auch für `insert`), während Sie beim `+` Operator die Variable überschreiben müssen, damit die Änderung wirksam wird. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2019-10-27T12:25:06.712798Z", - "start_time": "2019-10-27T12:25:06.700559Z" - } - }, - "outputs": [], - "source": [ - "Messwerte1 = Messwerte1 + NeueWerte\n", - "# Tipp: Dies können Sie auch einfach mithilfe von\n", - "# Messwerte1 += NeueWerte\n", - "Messwerte1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Zwei weitere nützliche Befehle im Zusammenhang von Listen ist die `len`- und `range`-Funktion. \n", - "\n", - "`len` gibt die Länge einer Liste zurück " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2019-10-27T12:25:06.728109Z", - "start_time": "2019-10-27T12:25:06.716256Z" - } - }, - "outputs": [], - "source": [ - "print(Messwerte1)\n", - "len(Messwerte1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`range` erstellt ganzzahlige Werte zwischen zwei ganzen Zahlen" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2019-10-27T12:25:06.745008Z", - "start_time": "2019-10-27T12:25:06.731772Z" - } - }, - "outputs": [], - "source": [ - "range(0, # <-- Startwert\n", - " 5, # <-- Endwert (nicht mehr enthalten, offenes Ende)\n", - " 2 # <-- Schrittweite\n", - " )" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "SIe können die `range` Rückgabe auch wieder in eine Liste umwandeln" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2019-10-27T12:25:06.760820Z", - "start_time": "2019-10-27T12:25:06.748599Z" - } - }, - "outputs": [], - "source": [ - "list(range(0,5,2))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "ExecuteTime": { - "end_time": "2019-10-27T12:24:39.369806Z", - "start_time": "2019-10-27T12:24:39.330456Z" - } - }, - "source": [ - "
\n", - " \n", - "#### Aufgabe 4.a.: Erstellen von Messwerttabellen:\n", - "\n", - "Erstellen Sie für jede Spalte der nachfolgenden Messtabelle eine Liste, welche die Messdaten beinhaltet. Benutzen Sie anschließend den `append` Befehl, um die Daten jeder Spalte an eine weitere Liste namens *daten* anzuhängen. \n", - "\n", - "| Messwertnummer | Spannung [V] | Strom [mA] | Fehler der Spannung [V] | Fehler des Stroms [mA] |\n", - "|----------------|--------------|------------|-------------------------|---------------------------|\n", - "| 1 | 12.00 | 110 | 0.32 | 10 |\n", - "| 2 | 11.78 | 98 | 0.15 | 10 |\n", - "| 3 | 12.56 | 102 | 0.63 | 10 |\n", - "| 4 | 12.34 | 124 | 0.12 | 10 |\n", - "| 5 | 12.01 | 105 | 0.20 | 10 |\n", - "| 6 | 11.94 | 95 | 0.17 | 10 |\n", - "\n", - "\n", - "Verwenden Sie anschließend das Slicing, um die umgesetzte Leistung im Widerstand für die Meswerte 3 und 5 zu berechnen.\n", - "\n", - "**Tipp:**\n", - "\n", - "1. Sie haben bereits die Funktionen für die Leistung in Aufgabe 3 definiert und können sie hier erneut verwenden. \n", - "2. Das Slicen von verschachtelten Listen funktioniert genauso wie bei normalen Listen:\n", - "\n", - "```python\n", - "spalte0 = daten[0] #<-- Wählt die Spalte 0 an \n", - "spalte0[2] #<-- Wählt aus Spalte 0 den Messwert mit Index 2 an\n", - "# oder als Einzeiler:\n", - "daten[0][2] \n", - "```\n", - "\n", - "3. Geben Sie an, wie sich die Messwertnummer zum Listenindex verhält.\n", - "
" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": { - "ExecuteTime": { - "end_time": "2020-02-09T08:32:29.596168Z", - "start_time": "2020-02-09T08:32:29.564926Z" - } - }, - "source": [ - "
\n", - " \n", - "#### Vorbereitungsaufgabe 1.: Werte der Schiefen Ebene in Pyhton übertragen:\n", - "\n", - "Am Python-\"Versuchstag\" selbst wollen wir anhand der Messdaten zur Bestimmung der Fallbeschleunigung auf Planet X das Fitten von Funktionen mittels $\\chi^2$ üben. Als Vorbereitung hierfür sollen Sie die Messdaten der gemessenen Zeiten und Höhen so wie ihre Fehler als Listen in Python eintippen. \n", - "\n", - "Darüber hinaus definieren Sie sich eine Funktion $h(t)$ welche proportional zu $g_{??}$ ist. Diese Funktion soll am Ende des Tages gegen die Messdaten in einem Höhe-gegen-Zeit Diagramm gefittet werden.\n", - " \n", - "**Tipp:**\n", - " \n", - "Um welche Art von Bewegung handelt es sich bei einem freien Fall im luftleeren Raum?\n", - "
" + "Herzlichen Glückwunsch Sie haben das Ende von Lektion 1. erreicht....." ] }, { @@ -1300,7 +1461,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.6" + "version": "3.9.4" } }, "nbformat": 4, diff --git a/Lektion2_Messtabellen.ipynb b/Lektion2_Messtabellen.ipynb new file mode 100644 index 0000000..0c3f4d4 --- /dev/null +++ b/Lektion2_Messtabellen.ipynb @@ -0,0 +1,568 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "21a11be0", + "metadata": {}, + "source": [ + "# Lektion 2. Messtabellen:\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "## Messtabellen in Python:\n", + "\n", + "Damit uns eine Programmiersprache wie Python Arbeit abnehmen kann, sollte es auch möglich sein, größere Datenmengen, wie z.B. die Werte einer Messtabelle, in einer Variablen zu speichern. Python bietet hierfür verschiedene Konzepte an. Jedes dieser Konzepte hat unterschiedliche Stärken und Schwächen. Die gängigsten Methoden sind list, tuple, bzw. sogenannte numpy.arrays und pandas.dataframes. Aufgrund der limitierten Zeit im PGP 1 werden wir uns hier lediglich mit zwei dieser vier Methoden auseinandersetzen. \n", + "\n", + "Fangen wir zunächst mit Listen an. Eine Liste ist eine Ansammlung von Werten, welche alle den gleichen oder ganz unterschiedliche Datentypen haben können. Eine Liste kann auf zwei unterschiedliche Art und Weisen erstellt werden:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "ec6c1c02", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Wert1', 'Wert2', 'Wert3']" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Messwerte1 = ['Wert1', 'Wert2', 'Wert3'] # Variante 1\n", + "Messwerte1" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "21773a54", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[2, 0.9, '1']" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Messwerte2 = list([2, 0.9, '1']) # Variante 2\n", + "Messwerte2" + ] + }, + { + "cell_type": "markdown", + "id": "be844385", + "metadata": {}, + "source": [ + "Sobald wir eine liste erstellt haben, können wir eine ganze Reihe von unterschiedlichen Manipulationen durchführen, um sie nach unserem Belieben zu verändern.\n", + "\n", + "Wir können zum Beispiel die bestehende Liste um einen Wert erweitern (`append`) oder einen zusätzlichen Wert an eine beliebige Stelle in der Liste hinzufügen (`insert`)." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "b8e22f05", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Wert1', 'Wert2', 'Wert3', 'Wert5']" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Messwerte1.append('Wert5')\n", + "Messwerte1" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "9bdd72bf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Wert1', 'Wert2', 'Wert3', 'Wert5', 'Wert4']" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Messwerte1.insert(4, 'Wert4')\n", + "Messwerte1" + ] + }, + { + "cell_type": "markdown", + "id": "8f7316a2", + "metadata": {}, + "source": [ + "Ups, was ist denn in der letzten Zelle passiert? Wert4 wurde ja garnicht an Stelle 4 der Liste gesetzt, Python scheint nicht zählen zu können... \n", + "\n", + "Leider zählt Python doch richtig. In Python läuft der Index von Objekten in einer Liste immer von 0,1,2,3...n. Dies können wir auch ganz einfach überprüfen, indem wir unsere Liste in verschiedene \"Scheiben\" schneiden (so genanntes slicing). Dies geht wie folgt:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "83e9b6f0", + "metadata": {}, + "outputs": [], + "source": [ + "NeueWerte = ['Wert1', 'Wert2', 'Wert3', 'Wert4', 'Wert5', 'Wert6'] " + ] + }, + { + "cell_type": "markdown", + "id": "173ccfee", + "metadata": {}, + "source": [ + "Die kleinste Scheibe, welche wir abschneiden können, ist ein einzelner Wert:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "0b6c1f61", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Wert1'" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "NeueWerte[0] # Hier sehen Sie, dass der erste Wert den Index 0 hat." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "c851e5b0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Wert3'" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "wert_index_2 = NeueWerte[2] \n", + "wert_index_2" + ] + }, + { + "cell_type": "markdown", + "id": "7b9e07f7", + "metadata": {}, + "source": [ + "Wie bei einer Pizza können wir uns natürlich auch größere Stücke nehmen." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "a35f8d4a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Wert1', 'Wert2', 'Wert3']" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "NeueWerte[0:3]" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "9e63410f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Wert3', 'Wert4', 'Wert5']" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "NeueWerte[2:5] # Python behandelt den letzten Wert wie in einem offenen Intervall [2,5)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "27ae7119", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Wert3', 'Wert4', 'Wert5', 'Wert6']" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "NeueWerte[2:] # Hier werden alle Werte mit dem Index >= 2 zurückgegeben" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "bfb5a049", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Wert4', 'Wert5', 'Wert6']" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "NeueWerte[-3:] # Mit negativen Zahlen fangen Sie vom Ende der Liste an" + ] + }, + { + "cell_type": "markdown", + "id": "0735b414", + "metadata": {}, + "source": [ + "Neben `insert`, `append` und `slicing` bietet Python noch ein paar weitere Listenmanipulationen an. Mit Hilfe des `+` Operators können Sie die Werte in einer Liste direkt an eine andere Liste anfügen." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "38098cd2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Wert1',\n", + " 'Wert2',\n", + " 'Wert3',\n", + " 'Wert5',\n", + " 'Wert4',\n", + " 'Wert1',\n", + " 'Wert2',\n", + " 'Wert3',\n", + " 'Wert4',\n", + " 'Wert5',\n", + " 'Wert6']" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Messwerte1 + NeueWerte" + ] + }, + { + "cell_type": "markdown", + "id": "88ce1ac5", + "metadata": {}, + "source": [ + "Anders als `append`, welches die zweite Liste als Ganzes an die erste Liste anfügt:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "e0d648ac", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Wert1',\n", + " 'Wert2',\n", + " 'Wert3',\n", + " 'Wert5',\n", + " 'Wert4',\n", + " ['Wert1', 'Wert2', 'Wert3', 'Wert4', 'Wert5', 'Wert6']]" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Messwerte1.append(NeueWerte)\n", + "Messwerte1" + ] + }, + { + "cell_type": "markdown", + "id": "24c36d81", + "metadata": {}, + "source": [ + "Aber aufgepasst, bei `append` wird die Liste, an welche Sie die Daten anhängen (hier Messwerte1), direkt geändert (dies gilt auch für `insert`), während Sie beim `+` Operator die Variable überschreiben müssen, damit die Änderung wirksam wird. " + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "7763f952", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Wert1',\n", + " 'Wert2',\n", + " 'Wert3',\n", + " 'Wert5',\n", + " 'Wert4',\n", + " ['Wert1', 'Wert2', 'Wert3', 'Wert4', 'Wert5', 'Wert6'],\n", + " 'Wert1',\n", + " 'Wert2',\n", + " 'Wert3',\n", + " 'Wert4',\n", + " 'Wert5',\n", + " 'Wert6']" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Messwerte1 = Messwerte1 + NeueWerte\n", + "# Tipp: Dies können Sie auch einfach mithilfe von\n", + "# Messwerte1 += NeueWerte\n", + "Messwerte1" + ] + }, + { + "cell_type": "markdown", + "id": "c9e1ed86", + "metadata": {}, + "source": [ + "Zwei weitere nützliche Befehle im Zusammenhang von Listen ist die `len`- und `range`-Funktion. \n", + "\n", + "`len` gibt die Länge einer Liste zurück " + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "42f10cd5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Wert1', 'Wert2', 'Wert3', 'Wert5', 'Wert4', ['Wert1', 'Wert2', 'Wert3', 'Wert4', 'Wert5', 'Wert6'], 'Wert1', 'Wert2', 'Wert3', 'Wert4', 'Wert5', 'Wert6']\n" + ] + }, + { + "data": { + "text/plain": [ + "12" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "print(Messwerte1)\n", + "len(Messwerte1)" + ] + }, + { + "cell_type": "markdown", + "id": "6858a55f", + "metadata": {}, + "source": [ + "`range` erstellt ganzzahlige Werte zwischen zwei ganzen Zahlen" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "49eaf0a3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "range(0, 5, 2)" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "range(0, # <-- Startwert\n", + " 5, # <-- Endwert (nicht mehr enthalten, offenes Ende)\n", + " 2 # <-- Schrittweite\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "fe1650e7", + "metadata": {}, + "source": [ + "Sie können die `range` Rückgabe auch wieder in eine Liste umwandeln" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "16670845", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[0, 2, 4]" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list(range(0,5,2))" + ] + }, + { + "cell_type": "markdown", + "id": "7cd394f4", + "metadata": {}, + "source": [ + "
\n", + " \n", + "#### Aufgabe 4.a.: Erstellen von Messwerttabellen:\n", + "\n", + "Erstellen Sie für jede Spalte der nachfolgenden Messtabelle eine Liste, welche die Messdaten beinhaltet. Benutzen Sie anschließend den `append` Befehl, um die Daten jeder Spalte an eine weitere Liste namens *daten* anzuhängen. \n", + "\n", + "| Messwertnummer | Spannung [V] | Strom [mA] | Fehler der Spannung [V] | Fehler des Stroms [mA] |\n", + "|----------------|--------------|------------|-------------------------|---------------------------|\n", + "| 1 | 12.00 | 110 | 0.32 | 10 |\n", + "| 2 | 11.78 | 98 | 0.15 | 10 |\n", + "| 3 | 12.56 | 102 | 0.63 | 10 |\n", + "| 4 | 12.34 | 124 | 0.12 | 10 |\n", + "| 5 | 12.01 | 105 | 0.20 | 10 |\n", + "| 6 | 11.94 | 95 | 0.17 | 10 |\n", + "\n", + "\n", + "Verwenden Sie anschließend das Slicing, um die umgesetzte Leistung im Widerstand für die Meswerte 3 und 5 zu berechnen.\n", + "\n", + "**Tipp:**\n", + "\n", + "1. Sie haben bereits die Funktionen für die Leistung in Aufgabe 3 definiert und können sie hier erneut verwenden. \n", + "2. Das Slicen von verschachtelten Listen funktioniert genauso wie bei normalen Listen:\n", + "\n", + "```python\n", + "spalte0 = daten[0] #<-- Wählt die Spalte 0 an \n", + "spalte0[2] #<-- Wählt aus Spalte 0 den Messwert mit Index 2 an\n", + "# oder als Einzeiler:\n", + "daten[0][2] \n", + "```\n", + "\n", + "3. Geben Sie an, wie sich die Messwertnummer zum Listenindex verhält.\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d85c9d1c", + "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.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/images/A4_syntax_error.png b/images/A4_syntax_error.png new file mode 100755 index 0000000..887523f Binary files /dev/null and b/images/A4_syntax_error.png differ diff --git a/images/Fehlermeldung_div0.png b/images/Fehlermeldung_div0.png new file mode 100755 index 0000000..0282d11 Binary files /dev/null and b/images/Fehlermeldung_div0.png differ