Skip to content

Commit 94cdf90

Browse files
committed
fix: Implementing feedback
1 parent 611e4d7 commit 94cdf90

3 files changed

Lines changed: 297 additions & 1 deletion

File tree

020-Projekt_Taschenrechner_I/010-Python_REPL.ipynb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@
326326
" \"type\": \"multiple_choice\",\n",
327327
" \"answers\": [\n",
328328
" { \"code\": \"3**3\", \"correct\": False },\n",
329-
" { \"code\": \"9\", \"correct\": True },\n",
329+
" { \"code\": \"27\", \"correct\": True },\n",
330330
" { \"code\": \"6\", \"correct\": False },\n",
331331
" { \"code\": \"33\", \"correct\": False },\n",
332332
" { \"code\": \"333\", \"correct\": False },\n",
@@ -350,6 +350,9 @@
350350
" { \"answer\": \"NameError:\", \"correct\": True,\n",
351351
" \"match_case\": False, \"fuzzy_threshold\": 0.9,\n",
352352
" \"feedback\": \"Korrekt. Wie in der Fehlermeldung angegeben ist die Variable `test` nicht definiert, weshalb Sie deren Wert nicht auslesen können.\"},\n",
353+
" { \"answer\": \"Traceback\", \"correct\": True,\n",
354+
" \"match_case\": False, \"fuzzy_threshold\": 0.9,\n",
355+
" \"feedback\": \"Korrekt. Sie sehen einen sog. Traceback, welcher es bei komplizierteren Fehlern ermöglicht die ursprüngliche Fehlermeldung zu finden. Der Fehler 'NameError' sagt, dass der Name `test` bisher nicht als Variable, Funktionsname, … definiert wurde.\"},\n",
353356
" ]\n",
354357
" }]\n",
355358
"display_quiz(q, colors=c)"
Lines changed: 290 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,290 @@
1+
---
2+
jupyter:
3+
jupytext:
4+
text_representation:
5+
extension: .md
6+
format_name: markdown
7+
format_version: '1.3'
8+
jupytext_version: 1.18.1
9+
kernelspec:
10+
display_name: Python 3 (ipykernel)
11+
language: python
12+
name: python3
13+
---
14+
15+
<!-- #region editable=true slideshow={"slide_type": ""} -->
16+
---
17+
short_title: REPL
18+
numbering:
19+
heading_1: true
20+
heading_2: true
21+
title: true
22+
---
23+
24+
# Die Read-Eval-Print-Loop (REPL)
25+
26+
Im Kapitel zur Installation haben Sie einmal `python3 --version` im Terminal
27+
ausgeführt um sicherzustellen, dass Sie ein aktuelles und funktionierendes
28+
Python installiert haben. Nun machen Sie die ersten Schritte mit Python Code.
29+
30+
## Starten der Python REPL
31+
32+
:::::{margin}
33+
::::{seealso} Terminal-Nutzung
34+
Im gesamten Kurs werden Eingaben im Terminal wie folgt dargestellt:
35+
:::console
36+
$ echo "Hallo Welt"
37+
Hallo Welt
38+
:::
39+
Dabei beginnen Zeilen mit einem Terminal-Befehl mit `$ ` und darauffolgende
40+
Zeilen bis zum nächsten `$ ` die Ausgabe des Befehls. Wenn Sie die Schritte
41+
nachvollziehen, geben Sie den Befehl selbst ein und 'starten' diesen mit
42+
{kbd}`Enter`.
43+
44+
Es werden nicht alle Ausgaben (vollständig) dargestellt.
45+
46+
Achten Sie darauf, dass Sie ggf. Dateipfade anpassen müssen. Mehr dazu im
47+
[Exkurs: Unix](/030-Exkurs_Unix/Einleitung.md).
48+
::::
49+
:::::
50+
51+
Führen Sie das Programm `python3` im Terminal aus, so startet es in die REPL.
52+
53+
```console
54+
$ python3
55+
Python 3.13.7 (main, Aug 14 2025, 11:12:11) [Clang 17.0.0 (clang-1700.0.13.3)] on darwin
56+
Type "help", "copyright", "credits" or "license" for more information.
57+
>>>
58+
```
59+
60+
Um die REPL zu verlassen, tippen Sie `quit()` oder nutzen Sie (in
61+
Unix-basierten Betriebssysteme) die Tastekombination {kbd}`Strg`+{kbd}`D`.
62+
63+
## Ihr erstes Python
64+
65+
Die REPL verhält sich ähnlich zum Terminal, nur dass nicht Befehle nach
66+
(typischerweise) einem "`$ `" eingegeben werden, sondern dass Python-Code nach
67+
einem "`>>> `" eingegeben wird.
68+
69+
Nachfolgend finden Sie ein paar Beispiele. Probieren Sie diese selbst aus und
70+
ändern Sie sie dann ab.
71+
72+
```python-repl
73+
>>> 2+2
74+
4
75+
```
76+
77+
```python-repl
78+
>>> "Hallo, Welt!"
79+
'Hallo, Welt!"
80+
```
81+
82+
```python-repl
83+
>>> print("Hallo, Welt!")
84+
Hallo, Welt!
85+
```
86+
87+
Ist der Python-Code noch nicht vollständig, so verändert sich der Prompt zu `... `.
88+
89+
```python-repl
90+
>>> print(
91+
...
92+
... "Hallo"
93+
... )
94+
Hallo
95+
```
96+
97+
## Die Struktur einer REPL
98+
99+
Eine REPL (siehe {numref}`fig:repl`) ist ein Programm, welches:
100+
101+
1. _**R**ead_: Einen Befehl oder hier ein Stück Python-Code einliest.
102+
2. _**E**val_: Dann den Code ausführt.
103+
3. _**P**rint_: Das Ergebnis des ausgeführten Codes zurück gibt.
104+
4. _**L**oop_: Und das solange wiederholt, bis es beendet wird (bei Python via
105+
`quit()`).
106+
107+
<!-- #endregion -->
108+
109+
<!-- #region editable=true slideshow={"slide_type": ""} -->
110+
::::{figure}
111+
:name: fig:repl
112+
```mermaid
113+
flowchart LR
114+
115+
start((Start)) --> R[Read]
116+
R --> E[Eval]
117+
E --> P[Print]
118+
P --> L{Loop<br>?}
119+
L -->|yes| R
120+
L -->|no| stop((Stop))
121+
```
122+
123+
Zustandsdiagramm der Bestandteile einer REPL
124+
::::
125+
<!-- #endregion -->
126+
127+
<!-- #region editable=true slideshow={"slide_type": ""} -->
128+
Betrachten wir den Ablauf folgendes Szenarios:
129+
130+
1. Sie starten den Python-Interpreter mit
131+
```bash
132+
$ python3
133+
```
134+
2. Python startet, gibt die Versionsinformationen aus und zeigt Ihnen mit dem
135+
Prompt `>>> ` an, dass es zum Einlesen eines Python-Ausdrucks bereit ist.
136+
137+
Die REPL ist nun im Zustand _Read_.
138+
3. Sie können nun einen Python-Ausdruck eingeben. Dieser kann `print("Hallo")` sein oder aber auch
139+
```
140+
>>> print(
141+
... "Hallo"
142+
... )
143+
```
144+
145+
Während Sie den Ausdruck eingeben bleibt die REPL im Status _Read_. Haben
146+
Sie einen vollständigen Ausdruck eingegeben (Wann ein Ausdruck "vollständig"
147+
ist lernen Sie später.) und drücken Sie dann die Eingabetaste, so wechselt
148+
die REPL in den Zustand _Eval_.
149+
4. Bei der Evaluation des Python-Ausdrucks versucht der Interpreter, den Code
150+
auszuführen. Ist er korrekt (und bezieht sich nur auf Namen(/Variablen), die
151+
bereits definiert wurden), so wird der Code ausgeführt. Nachdem der Code
152+
ausgeführt wurde wechselt die REPL in den Zustand _Print_ und es wird das
153+
**Ergebnis** des gerade ausgeführten Python-Codes gedruckt.
154+
5. Dann wird in den Zustand _Loop_ gewechselt und überprüft, ob eine
155+
Abbruchbedingung erreicht wurde. Ist dies nicht der Fall – soll also wieder
156+
von Anfang begonnen werden so wechselt die REPL zurück in den Zustand _Read_
157+
und der Ablauf springt damit zu Schritt 2. Soll die Schleife nicht fortgesetzt
158+
werden, so geht die REPL über in den Zustand _Stop_ und der Python-Interpreter
159+
wird beendet.
160+
<!-- #endregion -->
161+
162+
<!-- #region editable=true slideshow={"slide_type": ""} -->
163+
## Lernstandskontrolle
164+
<!-- #endregion -->
165+
166+
**Nachvollziehen der Zustände der REPL**
167+
::::{admonition} 💪 Übung
168+
:icon: false
169+
170+
Nachvollziehen Sie die nachfolgende REPL-Interaktion. Was sind Ausgaben per
171+
`print` und was sind Ausgaben durch den Zustand _Print_ der REPL?
172+
173+
```python-repl
174+
>>> hallo = "Hallo Python-Lernende" # 1
175+
>>> hallo # 2
176+
'Hallo Python-Lernende' # 3
177+
>>> print(hallo) # 4
178+
Hallo Python-Lernende # 5
179+
>>> print("Hallo Python-Lernende") # 6
180+
Hallo Python-Lernende # 7
181+
>>>
182+
```
183+
184+
:::{dropdown} ✅ Lösung
185+
186+
_**zu 1:**_ Hier wird eine Variable mit dem Namen `hallo` erzeugt in der das
187+
String-Literal `"Hallo Python-Lernende"` gespeichert wird. Dieser Ausdruck hat
188+
kein Ergebnis, weshalb nach der Zeile sofort der Prompt für die nächste Eingabe
189+
angezeigt wird.
190+
191+
_**zu 2:**_ Hier besteht der Python-Ausdruck nur aus der Variablen mit dem
192+
Namen `hallo`. Eine Variable hat ihren Wert als Ergebnis, weshalb im Zustand
193+
_Print_ der REPL das String-Literat `'Hallo Python-Lernende'` ausgegeben wird
194+
(siehe _**3**_).
195+
196+
Beachten Sie, dass in Python Strings entweder mit `'` oder mit `"` umschlossen
197+
werden können. Sie sind gleichwertig und die Verwendung ist nur relevant, wenn
198+
der String selbst ein `'` oder ein `"` enthält. Der String `"Wie geht's?"`
199+
müssten mit einfachen Anführungszeichen mit Hilfe eines sog. Escape-Zeichens
200+
geschrieben werden: `'Wie geht\'s?'`. Anders herum wäre es bei diesem String:
201+
`"Sie sagte: \"Hallo.\""` bzw. `'Sie sagte: "Hallo."'`.
202+
203+
_**zu 4:**_ Hier wird die Funktion `print()` genutzt um den Wert der Variablen
204+
`hallo` zu drucken. Dies geschieht im Zustand _Eval_ und die Ausgabe dazu ist
205+
in _**5**_ zu sehen. Die Funktion `print()` hat selbst kein Ergebnis, weshalb
206+
nichts zusätzliches durch den Zustand _Print_ ausgegeben wird.
207+
208+
_**zu 6:**_ In diesem Schritt wird wie beim ersten Beispiel die Funktion
209+
`print()` mit einem String-Literal genutzt. Die Ausgabe in _**7**_ ist von der
210+
Version, die die Variable `hallo` nutzt nicht zu unterscheiden.
211+
212+
:::
213+
214+
::::
215+
216+
217+
218+
219+
:::{hint} Kommentare in Python-Code
220+
221+
Die Zahlen am Ende eines Ausdrucks (bspw. `# 1`) sind ein Kommentar, um in der
222+
Musterlösung einzelne Zeilen referenzieren zu können.
223+
224+
In Python beginnen Kommentare mit einem `#` und es wir alles bis zum Zeilenende
225+
vom Interpreter ignoriert. Kommentare sind für Menschen, die den Code lesen
226+
gedacht und nicht für den Computer.
227+
228+
:::
229+
230+
231+
232+
233+
234+
**Nutzung der REPL**
235+
236+
```python editable=true slideshow={"slide_type": ""} tags=["remove-cell"]
237+
from jupyterquiz import display_quiz
238+
c = { '--jq-multiple-choice-bg': '#202080',
239+
'--jq-mc-button-bg': '#fafafa',
240+
'--jq-mc-button-border': '#e0e0e0e0',
241+
'--jq-mc-button-inset-shadow': '#555555',
242+
'--jq-many-choice-bg': '#202080',
243+
'--jq-numeric-bg': '#202080',
244+
'--jq-numeric-input-bg': '#c0c0c0',
245+
'--jq-numeric-input-label': '#101010',
246+
'--jq-numeric-input-shadow': '#999999',
247+
'--jq-string-bg': '#202080',
248+
'--jq-incorrect-color': '#c80202',
249+
'--jq-correct-color': '#009113',
250+
'--jq-text-color': '#fafafa',
251+
'--jq-link-color': '#9abafa' }
252+
```
253+
254+
```python editable=true slideshow={"slide_type": ""} tags=["remove-input"]
255+
q = [{
256+
"question": "Welche Ausgabe erhalten Sie, wenn Sie <pre>>>> 3**3</pre> in die REPL eingeben?",
257+
"type": "multiple_choice",
258+
"answers": [
259+
{ "code": "3**3", "correct": False },
260+
{ "code": "27", "correct": True },
261+
{ "code": "6", "correct": False },
262+
{ "code": "33", "correct": False },
263+
{ "code": "333", "correct": False },
264+
{ "code": "SyntaxError", "correct": False }
265+
]
266+
},
267+
{
268+
"question": "Wie können Sie eine Kommazahl in Python eingeben?<br>Probieren Sie auch die falschen Optionen aus. Was ist deren Ergebnis?",
269+
"type": "multiple_choice",
270+
"answers": [
271+
{ "code": "12,34", "correct": False },
272+
{ "code": "12.34", "correct": True },
273+
{ "code": "1234e-2", "correct": True },
274+
{ "code": "123,4e-1", "correct": False },
275+
]
276+
},
277+
{
278+
"question": "Welche Ausgabe ergibt die folgende Eingabe in die REPL? Geben die Ausgabe bis zum ersten Leerzeichen ein.<pre>>>> test</pre>",
279+
"type": "string",
280+
"answers": [
281+
{ "answer": "NameError:", "correct": True,
282+
"match_case": False, "fuzzy_threshold": 0.9,
283+
"feedback": "Korrekt. Wie in der Fehlermeldung angegeben ist die Variable `test` nicht definiert, weshalb Sie deren Wert nicht auslesen können."},
284+
{ "answer": "Traceback", "correct": True,
285+
"match_case": False, "fuzzy_threshold": 0.9,
286+
"feedback": "Korrekt. Sie sehen einen sog. Traceback, welcher es bei komplizierteren Fehlern ermöglicht die ursprüngliche Fehlermeldung zu finden. Der Fehler 'NameError' sagt, dass der Name `test` bisher nicht als Variable, Funktionsname, … definiert wurde."},
287+
]
288+
}]
289+
display_quiz(q, colors=c)
290+
```

index.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ Die einzelnen Kapitel des Kurses werden auf der nächsten Seite kurz beschrieben
2121

2222
## Inhaltsverzeichnis
2323

24+
_Aktuell gibt es leider einen Bug, der die korrekte Generierung des
25+
Inhaltsverzeichnisses verhindert._
26+
2427
```{table-of-contents}
2528
:depth: 2
2629
```

0 commit comments

Comments
 (0)