Skip to content

Commit f0ccddd

Browse files
committed
Funktionen, Bedingungen und Schleifen hinzugefügt.
1 parent 7b654a5 commit f0ccddd

35 files changed

+731
-0
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -127,3 +127,5 @@ dmypy.json
127127

128128
# Pyre type checker
129129
.pyre/
130+
131+
/**/.idea
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
content:
2+
- task1
3+
- task2

Funktionen, Schleifen und Bedingungen/Bedingungen/task1/__init__.py

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
hausaufgaben_gemacht = False
2+
3+
if not hausaufgaben_gemacht:
4+
essen = False
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
type: theory
2+
custom_name: Was sind Bedingungen?
3+
files:
4+
- name: main.py
5+
visible: true
6+
- name: __init__.py
7+
visible: false
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# Was sind Bedingungen?
2+
3+
"Wenn du deine Hausaufgaben nicht machst, dann gibt es heute kein Abendessen!"
4+
So oder so ähnlich hat jeder diesen Satz wahrscheinlich schon einmal gehört.
5+
6+
Solche Kausalitätszusammenhänge lassen sich (vereinfacht) auch im Computer abbilden.
7+
Der Computer ist eine streng logisch denkende Maschine.
8+
Ihm fallen logische Ausdrücke und Aussagen sehr leicht und wahrscheinlich löst er Aufgaben dieses Typs schneller als du
9+
selbst – solange man sie ihm begreiflich machen kann.
10+
11+
Um einem Computer Logik nahezubringen, muss man die Aussagen, die man überprüfen möchte, in die sogenannte Boolesche
12+
Algebra überführen.
13+
In dieser haben Ausdrücke nur die Werte "wahr", `True` und `1` oder "falsch", `False` und `0`.
14+
15+
Ein Satz wie "Ich gieße meine Blumen jeden Tag, an dem es nicht regnet oder schneit und mittwochs" ist für uns erstmal
16+
leicht zu erfassen und wahrscheinlich auch manuell schnell auszuwerten.
17+
Sätze wie "Ich mag Bücher, in denen eine Protagonistin mitspielt, die rote Haare hat, und dessen Genre Horror ist oder
18+
dessen Cover blau-grün ist, aber nur wenn das Genre dann nicht Fantasy lautet, genauso gefallen mir Abenteuerberichte,
19+
die eine Motorrad-Reise entlang der Ostküste Australiens beschreiben" sind auf den ersten Blick eher schwer zu
20+
verstehen und nicht so leicht zu prüfen.
21+
22+
Hier haben wir eine Vielzahl an Merkmalen, die wir für ein Buch überprüfen müssen – und bestenfalls widerspricht sich
23+
keines davon.
24+
25+
Das "Mögen" eines Buches lässt sich also in mehrere unabhängige Bedingungen zerlegen:
26+
27+
Für den ersten Teil des Satzes erkennen wir die folgenden Merkmale:
28+
29+
* Es muss eine Protagonistin geben (A)
30+
* diese muss rote Haare haben (B)
31+
* Das Genre des Buches muss "Horror" lauten (C)
32+
33+
Für den zweiten Teil des Satzes finden wir die folgenden Merkmale:
34+
35+
* Das Cover muss blau-grün sein (D)
36+
* Das Genre darf nicht "Fantasy" lauten (E)
37+
38+
Der letzte Teil beschreibt die Bücher mit diesen Merkmalen:
39+
40+
* Das Genre muss "Abenteuerbericht" sein (F)
41+
* Es muss um eine Motorrad-Reise gehen (G)
42+
* Diese Reise muss an der Ostküste Australiens stattgefunden haben (H)
43+
44+
So weit, so gut.
45+
Wir möchten dieser Person nun ein Buch schenken.
46+
Dank der detaillierten Beschreibung der Wunschlektüre stehen wir nun im Laden und haben eigentlich das perfekte Buch
47+
gefunden:
48+
49+
Wir haben eine Protagonistin mit roten Haaren, das Cover ist blau-grün und es handelt sich um einen Abenteuerbericht.
50+
51+
Wollen wir nun prüfen, ob das Buch infrage kommt, dann müssen wir Schritt für Schritt jedes Merkmal in jeder der drei
52+
Listen kontrollieren.
53+
Sobald wir für eine der drei Listen alle Merkmale bestätigen können, können wir dieses Buch kaufen.
54+
55+
Fangen wir an:
56+
57+
Wir haben eine Protagonistin, diese hat rote Haare, das Genre ist aber nicht Horror.
58+
Auf die erste Kategorie von Büchern trifft das Buch nicht zu.
59+
60+
Für die zweite Kategorie sieht es besser aus:
61+
Das Cover ist blau-grün und das Genre ist nicht Fantasy – es ist ein Abenteuerbericht.
62+
Top!
63+
Die dritte Kategorie brauchen wir nicht mehr überprüfen, denn wir haben ja eine der drei Schubladen getroffen.
64+
65+
Obwohl wir viele Beschränkungen haben, wie das Buch sein darf und wie nicht, so ist unsere Entscheidung letzten Endes
66+
ein "Ja" oder ein "Nein".
67+
Hier kommen wir wieder zurück zu den Boolschen Ausdrücken.
68+
69+
<div class="hint">
70+
Für die, die es interessiert:
71+
Ein Boolscher Ausdruck zu dem Satz oben könnte etwa <code>(A^B^C)v(D^E)v(F^G^H)</code> lauten.
72+
Die <code>v</code>s stehen dabei für "Oder" und die <code>^</code>s für "Und".
73+
Es müssen also A, B <strong>UND</strong> C zutreffen <strong>ODER</strong> D <strong>UND</strong> E <strong>ODER
74+
</strong> F, G <strong>UND</strong> H.
75+
</div>
76+
77+
78+
Wir wollen nicht damit anfangen und diesen Buchauswahl-Algorithmus in Code zwängen.
79+
Es soll nur ein (hoffentlich) anschauliches Beispiel sein, wie solche Bedingungen gestaltet sein können.
80+
81+
Im folgenden Abschnitt schauen wir uns an, wie wir Bedingungen in Python implementieren können.

Funktionen, Schleifen und Bedingungen/Bedingungen/task2/__init__.py

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
type: edu
2+
custom_name: if, else, elif
3+
files:
4+
- name: tests/test_task.py
5+
visible: false
6+
- name: __init__.py
7+
visible: false
8+
- name: tests/__init__.py
9+
visible: false
10+
- name: task.py
11+
visible: true
12+
placeholders:
13+
- offset: 30
14+
length: 322
15+
placeholder_text: return "Ein guter Anfang"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
# if, else, elif
2+
3+
Um den sogenannten Kontrollfluss in Python zu verändern, gibt es die Schlüsselwörter `if`, `else` und `elif`.
4+
Sie helfen uns dabei, unseren Programmablauf zu verändern, indem wir weitere Schritte ausführen, wenn nötig oder andere
5+
überspringen, wenn sie nicht notwendig sind.
6+
7+
Dabei müssen wir uns auf die Boolschen Ausdrücke konzentrieren, die wir im vorigen Abschnitt kennengelernt haben.
8+
Wir können nur prüfen, ob eine bestimmte Bedingung zutrifft oder nicht.
9+
"Ein bisschen zutreffen" oder "ein bisschen nicht zutreffen" gibt es in diesem Fall nicht!
10+
11+
Stellen wir uns vor, wir gehen wandern und kommen an eine Weggabelung.
12+
Um uns zu entscheiden, in welche Richtung wir gehen (nach links oder rechts), wollen wir eine Münze werfen.
13+
Zeigt die Münze Kopf, dann gehen wir nach links, zeigt sie Zahl, dann gehen wir nach rechts.
14+
15+
Wir nehmen an, dass wir öfter abbiegen müssen und uns öfters mittels Münzwurf für einen der beiden Weggabelungen
16+
entscheiden.
17+
Deswegen verwenden wir eine Funktion, der wir als Parameter das Ergebnis des Münzwurfs mitgeben.
18+
Als Ergebnis wollen wir dann wissen, ob wir nach links oder nach rechts abbiegen:
19+
20+
```python
21+
def abbiegen(seite):
22+
if seite == "kopf":
23+
return "links"
24+
else:
25+
return "rechts"
26+
```
27+
28+
Hier siehst du schon wieder viele neue Konzepte:
29+
`if` und `else` sind zwei der drei Schlüsselwörter, die oben bereits vorgestellt wurden.
30+
Dabei erwartet `if` eine Bedingung, die überprüft wird (in diesem Fall ist das `seite == "kopf"`).
31+
Hat der Parameter `seite` also den Wert `"kopf"`, dann ist der Vergleich an dieser Stelle wahr.
32+
Auffällig ist hier das doppelte Gleichheitszeichen.
33+
In der Mathematik schreibt man ein Gleichheitszeichen, um die Gleichheit auszudrücken, in Python und vielen anderen
34+
Programmiersprachen verwendet man zwei davon, um Vergleiche kenntlich zu machen.
35+
Würden wir in der Bedingung nur ein Gleichheitszeichen verwenden, dann würde Python `"kopf"` in `seite` speichern.
36+
37+
Wenn wir Zahlen miteinander vergleichen wollen, dann können wir nicht nur auf Gleichheit, sondern auch auf
38+
Verschiedenheit prüfen.
39+
Vergleiche wie `<` und `>` erlauben es uns, Zahlen in Relation zu setzen.
40+
Außerdem gibt es die Vergleiche `>=` und `<=`, die prüfen, ob eine Zahl größer oder gleich (oder kleiner oder gleich)
41+
einer anderen Zahl ist.
42+
Wenn wir uns nicht sicher sind, ob eine Zahl größer oder kleiner ist, wir aber wissen wollen, ob eine Zahl ungleich
43+
einer anderen Zahl ist, dann können wir `!=` verwenden.
44+
45+
`else` taucht – wenn überhaupt – immer mit einem zugehörigen `if` auf und kann niemals alleine stehen, es muss aber
46+
nicht auftauchen, wie wir gleich sehen werden.
47+
In dem Beispiel oben prüfen wir, ob `seite` den Wert `"kopf"` hat – dann wollen wir nach links abbiegen.
48+
Wenn wir aber nicht Kopf geworfen haben (das heißt nicht nur, dass wir Zahl geworfen haben, die Münze kann
49+
beispielsweise auch auf dem Rand stehengeblieben sein), dann wollen wir in jedem Fall nach rechts gehen.
50+
Und das "in jedem Fall" ist hier wichtig, weil wir an das `else` keine Bedingung mehr knüpfen können.
51+
Der Teil unterhalb von `else` wird immer dann ausgeführt, wenn kein anderer sogenannter Zweig (also keine Bedingung)
52+
zutreffend war.
53+
54+
Doch was ist, wenn wir mehr als zwei Wege haben – angenommen, wir haben drei Wege.
55+
Eine Münze hilft uns dabei nicht mehr weiter, weswegen wir jetzt zu einem Würfel greifen.
56+
Würfeln wir eine 1 oder 2, dann gehen wir nach links, bei einer 3 oder 4 gehen wir geradeaus und bei einer 5 oder 6
57+
biegen wir nach rechts ab:
58+
59+
```python
60+
def abbiegen(augenzahl):
61+
if 1 <= augenzahl <= 2:
62+
return "links"
63+
elif 3 <= augenzahl <= 4:
64+
return "geradeaus"
65+
elif 5 <= augenzahl <= 6:
66+
return "rechts"
67+
```
68+
69+
Python erlaubt es uns, Vergleiche von mehreren Zahlen etwas kompakter zu schreiben.
70+
Wollen wir also sicherstellen, dass die `augenzahl` zwischen `1` und `2` liegt, dann können wir das wie folgt notieren:
71+
`1 <= augenzahl <= 2`
72+
Damit wird ausgedrückt, dass die 1 kleiner oder gleich `augenzahl` und zusätzlich dazu auch `augenzahl` kleiner oder
73+
gleich 2 sein soll.
74+
75+
Diese Ausdrücke lassen sich auch komplexer beschreiben, insbesondere dann, wenn es nicht mehr ausschließlich um Zahlen
76+
geht.
77+
Statt `1 <= augenzahl <= 2` können wir auch `1 <= augenzahl and augenzahl <= 2` schreiben.
78+
Hierbei prüfen wir dieselben Kriterien, allerdings in zwei Schritten und verlangen dann, dass beides zutreffen muss,
79+
indem wir die Bedingungen mit dem Schlüsselwort `and` verbinden.
80+
Erinnern wir uns nochmal an die letzte Aufgabe – hier haben wir auch mit "Und" und "Oder" gearbeitet.
81+
Das Äquivalent für "Oder" ist entsprechend `or`.
82+
83+
Ein vereinfachtes Beispiel der Buchauswahl aus der letzten Aufgabe könnte wie folgt aussehen:
84+
85+
```python
86+
def buchauswahl(genre, protagonistin, coverfarbe):
87+
if protagonistin and genre == "Horror":
88+
return True
89+
if coverfarbe == "blau-grün" and genre != "Fantasy":
90+
return True
91+
return False
92+
```
93+
94+
Hierbei beachten wir nur die ersten beiden Fälle (es gibt eine Protagonistin und das Genre entspricht Horror
95+
und das Buchcover ist blau-grün und das Genre ist nicht Fantasy).
96+
Diese Funktion ist für uns lesbar und verständlich, jedoch lässt sich diese Auswahl noch knapper zusammenfassen.
97+
Ich will niemanden motivieren, solchen Code zu schreiben, wenn man darüber stolpert, dann sollte man sich aber nicht
98+
verunsichern lassen:
99+
100+
```python
101+
def buchauswahl(genre, protagonistin, coverfarbe):
102+
return (protagonistin and genre == "Horror") or (coverfarbe == "blau-grün" and genre != "Fantasy")
103+
```
104+
105+
Statt mit `if`, `elif` und `else` zu arbeiten, schreiben wir alles in eine Zeile und verzichten auf diese
106+
Schlüsselwörter.
107+
Das können wir machen, weil das Schlüsselwort `or` uns gestattet, die beiden Bedingungen miteinander zu verbinden.
108+
Wir prüfen also, ob entweder der erste Teil vor dem `or` oder der zweite Teil nach dem `or` wahr wird.
109+
Es müssen nicht beide Teile wahr werden.
110+
111+
Anders ist es bei dem Schlüsselwort `and` in den Klammern:
112+
Hier müssen beide (oder alle, wenn man mehrmals `and` notiert) Bedingungen erfüllt sein.
113+
Zum Beispiel muss es eine Protagonistin geben und das Buch zum Genre "Horror" gehören.
114+
115+
## Aufgabe
116+
117+
Basierend auf dem Würfel-Beispiel oben sollst du nun eine Funktion schreiben, die deine Würfelwürfe "kommentiert".
118+
Ein Wurf mit einer niedrigen Zahl (1 und 2) soll beispielsweise mit einem "Schade, nur eine 1" kommentiert werden.
119+
Würfe mit einer 3 und 4 können als "Durchschnitt" bezeichnet werden.
120+
Eine 5 kannst du mit einem "So knapp!" kommentieren und die 6 mit "Super! Weiter so!"
121+
Achte darauf, die jeweilige Zahl auch immer im Text zu verwenden.
122+
123+
Eine Beispielausgabe des Programms könnte also wie folgt aussehen:
124+
125+
```
126+
Schade, nur eine 1
127+
Schade, nur eine 2
128+
Eine durchschnittliche 3
129+
Eine durchschnittliche 4
130+
So knapp - leider nur eine 5
131+
Super! Eine 6
132+
```
133+
134+
Teste deine Ausgabe, indem du das Programm mit dem grünen Pfeil oben links neben dem Editorfenster startest.
135+
Bist du mit deiner Lösung zufrieden, dann klicke unter der Aufgabe auf "Check".
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
def kommentar(augenzahl):
2+
if 1 <= augenzahl <= 2:
3+
return "Schade, nur eine " + str(augenzahl)
4+
elif 3 <= augenzahl <= 4:
5+
return "Eine durchschnittliche " + str(augenzahl)
6+
elif augenzahl == 5:
7+
return "So knapp - leider nur eine " + str(augenzahl)
8+
elif augenzahl == 6:
9+
return "Super! Eine " + str(augenzahl)
10+
11+
12+
if __name__ == '__main__':
13+
print(kommentar(1))
14+
print(kommentar(2))
15+
print(kommentar(3))
16+
print(kommentar(4))
17+
print(kommentar(5))
18+
print(kommentar(6))
19+

Funktionen, Schleifen und Bedingungen/Bedingungen/task2/tests/__init__.py

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import unittest
2+
3+
from task import kommentar
4+
5+
6+
# todo: replace this with an actual test
7+
class TestCase(unittest.TestCase):
8+
def test_kombinationen(self):
9+
komm1 = kommentar(1).replace(str(1), "")
10+
komm2 = kommentar(2).replace(str(2), "")
11+
komm3 = kommentar(3).replace(str(3), "")
12+
komm4 = kommentar(4).replace(str(4), "")
13+
komm5 = kommentar(5).replace(str(5), "")
14+
komm6 = kommentar(6).replace(str(6), "")
15+
16+
self.assertNotEqual(komm1, "Ein guter Anfang")
17+
18+
self.assertEqual(komm1, komm2)
19+
self.assertEqual(komm3, komm4)
20+
self.assertNotEqual(komm1, komm3)
21+
self.assertNotEqual(komm1, komm4)
22+
self.assertNotEqual(komm2, komm3)
23+
self.assertNotEqual(komm2, komm4)
24+
25+
self.assertNotEqual(komm1, komm5)
26+
self.assertNotEqual(komm1, komm6)
27+
self.assertNotEqual(komm3, komm5)
28+
self.assertNotEqual(komm4, komm6)
29+
self.assertNotEqual(komm5, komm6)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
content:
2+
- task1
3+
- task2

Funktionen, Schleifen und Bedingungen/Funktionen/task1/__init__.py

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
type: choice
2+
is_multiple_choice: true
3+
options:
4+
- text: Funktionen geben immer den selben Wert zur&uuml;ck.
5+
is_correct: false
6+
- text: Funktionen finden im echten Leben keine Anwendung.
7+
is_correct: false
8+
- text: Funktionen helfen dabei, sich beim Programmieren seltener zu wiederholen.
9+
is_correct: true
10+
- text: Parameter beeinflussen eine Funktion nicht.
11+
is_correct: false
12+
files:
13+
- name: task.py
14+
visible: true
15+
- name: __init__.py
16+
visible: false
17+
custom_name: Was sind Funktionen?
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# Was sind Funktionen?
2+
3+
Funktionen sind etwas Alltägliches, auch wenn uns das oft nicht so bewusst ist.
4+
Die Tankfüllung eines Autos ist beispielsweise eine Funktion, die unter anderem abhängig von der zurückgelegten Strecke
5+
ist.
6+
Etwas abstrakter gedacht ist auch der Kontostand eine Funktion, deren Wert sich abhängig von der Zeit verändert – zum
7+
Monatsbeginn gibt es Gehalt und der Kontostand steigt an.
8+
Mit dem ersten Einkauf nimmt der Kontostand wieder ab.
9+
10+
Funktionen können stetig sein (wie die Tankfüllung zum Beispiel) oder unstetig (wie der Kontostand), das heißt, dass man
11+
die Tankfüllung in einen zweidimensionalen Graphen einzeichnen kann, ohne den Stift dafür abzusetzen.
12+
Der Kontostand ist eine nicht-stetige Funktion:
13+
Von dem einen auf den anderen Moment ist mehr oder weniger Geld auf dem Konto, das Geld wird aber nicht Cent für Cent
14+
überwiesen.
15+
Das führt dazu, dass ich an einem Punkt aufhören und den Stift an eine andere Position bewegen muss, um dort
16+
weiterzuzeichnen.
17+
18+
Python (und Programmiersprachen allgemein) nutzen das Konzept von Funktionen meist dazu, um sich wiederholende
19+
Code-Fragmente nur einmal schreiben zu müssen.
20+
Die Funktionalität ("Funktion" steckt hier nicht ohne Grund drin) wird also nur einmal geschrieben und kann dann
21+
beliebig oft wiederverwendet werden.
22+
23+
Wie schon eingangs erwähnt, kann eine Funktion Abhängigkeiten besitzen - beispielsweise die zurückgelegte Strecke oder
24+
der Zeitpunkt, zu dem die Funktion aufgerufen wird.
25+
In der Programmierung nennt man diese Abhängigkeiten Parameter.
26+
Sie können Einfluss auf die Funktion nehmen.
27+
28+
Wir wollen uns einige Funktionen anschauen – erste Beispiele siehst du bereits im Code-Editor.
29+
30+
Doch zuerst kannst du dein Wissen zu Funktionen selbst prüfen:
31+
Welche Aussage(n) über Funktionen treffen zu?
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Berechne die Summe zweier Zahlen
2+
def add(a, b):
3+
return a + b
4+
5+
6+
# Berechne die Differenz zweier Zahlen
7+
def sub(a, b):
8+
return a - b
9+
10+
11+
# Berechne das Produkt zweier Zahlen
12+
def mul(a, b):
13+
return a * b
14+
15+
16+
# Berechne den Quotienten zweier Zahlen
17+
def quot(a, b):
18+
return a / b
19+

Funktionen, Schleifen und Bedingungen/Funktionen/task2/__init__.py

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
type: edu
2+
custom_name: Eine eigene Funktion definieren
3+
files:
4+
- name: task.py
5+
visible: true
6+
placeholders:
7+
- offset: 63
8+
length: 80
9+
placeholder_text: '# Du kannst diesen Teil hier löschen und die Funktion selbst
10+
implementieren.'
11+
- name: __init__.py
12+
visible: false
13+
- name: tests/__init__.py
14+
visible: false
15+
- name: tests/test_task.py
16+
visible: true

0 commit comments

Comments
 (0)