Grundlagen-Aufgaben#
LOESUNG siehe Grundlagen-Aufgaben
Über diese Aufgaben:
Die Aufgaben vermitteln einen Eindruck, wie typische praktische kleine Problemstellungen aussehen, die man am Ende von Pyton 101 lösen können sollte. Das dient auch der von den Akkreditierern eingeforderten Kompetenzorientierung; die Leitfrage hier lautet bekanntlich “Was kann man, wenn man die Lernziele von Python 101 erreicht hat?”
Die Aufgaben sind so gestellt, dass sie sich auf Skript-Ebene zunächst mit minimalem technischen Aufwand lösen lassen . Gleichzeitig sind sie offen genug, auch fortgeschrittenere – insbesondere generischere – Lösungsmöglichkeiten zuzulassen. Damit lassenn sie sich auch in Programmier-Praktika einsetzen, bei denen Studierende mit sehr heterogenen Vorkenntnissen teilnehmen: Es gibt kein abschließendes “fertig”, fast immer kann man es auch noch etwas eleganter oder schöner machen.
Aufgaben-Schema#
(Diese Aufgabe ist eine Musteraufgabe, ein Stub, um die Umgebung der Aufgabenlösung in einem Jupyterbook kennenzulernen.)
Aufgaben in der Klausur Python-101 sind typischerweise strukturiert wie hier:
Als Markdown-Zelle:
gegeben: da kommt man her, Kontext
gesucht: da will man hin
Ziel ist eine selbst programmierte Lösung, die das Ergebnis z.B. in einer Variablen wie
ergebnis
ablegt.
Code-Zellen:
eine Zelle, die einen Kontext schafft
so dass man sofort schlau losprogrammieren kann
und die die Testausgabe auch gleicht sieht (
display()
oderprint()
)
eine Zelle, die die eigene Ausgabe mit einem oder mehreren Soll-Werten vergleicht
BEISPIEL:
gegeben:
hier gar nichts besonderes
gesucht:
eine Operation, die der Variablen
ergebnis
den Wert42
zuweist.
# Kontext
ergebnis = ... # irgend eine falsche Lösung
# hier schlau programmieren
ergebnis = 42
# Testausgabe Ihrer Lösung
ergebnis # display(ergebnis) oder print(ergebnis)
42
# Diese Tests sollen erfüllt sein
assert ergebnis == 42
Aufgabe: Datum als String ausgeben#
(echte Aufgabe, hier mit Lösung)
gegeben:
ein Geburtsdatum (z.B. von Alan Turing, 23. Juni 1912) als Dict
z.B.
d = {"jahr": 1912, "monat": 6, "tag": 23}
gesucht:
dieses Datum als String im Format JJJJ-MM-TT
z.B.
d_string == "1912-06-23"
Lösung bitte mit f-strings, es hilft dann die Format-Info :02
, siehe z.B. https://fstring.help/cheat/.
# Kontext
d = {"jahr": 1912, "monat": 6, "tag": 23}
d_string = ...
# hier schlau programmieren
d_string = f"""{d["jahr"]:4}-{d["monat"]:02}-{d["tag"]:02}"""
# Testausgabe Ihrer Lösung (ggf. auch `print()` ausprobieren)
# print(ergebnis)
d_string
'1912-06-23'
assert d_string == '1912-06-23'
Aufgabe: Datum analysieren#
(echte Aufgabe, verschiedene Lösungsansätze)
Teil 1: Ein einzelner Datensatz#
gegeben:
ein Geburtsdatum im Format jjjj-mm-tt
z.B.
g = "1910-06-22"
(ein Computer-Pionier: Wer wars?)
gesucht:
die entsprechenden Werte dieses Geburtsdatum in den Variablen
jahr
,monat
,tag
auch als Dict
d
:{"jahr": 1910, "monat": 6, "tag": 22}
Diese Aufgabe ist “zu Fuß” auch für Programmieranfänger lösbar, eine eher einfache Klausuraufgabe. Wer will, kann auch fancy Lösungen suchen. Ggf. die Beispiellösung anschauen und verstehen.
Hinweis: Wir üben hier an einem trivialen Beispiel grundlegende Operationen. “In echt” würde man natürlich eine Bibliothek wie z.B. https://docs.python.org/3/library/datetime.html verwenden.
# Kontext
g = "1910-06-22"
# jahr, monat, tag zu Fuß extrahieren, mit slicing
... #
... #
... #
# oder auch so
... #
# Testausgabe
jahr, monat, tag
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[5], line 13
10 ... #
12 # Testausgabe
---> 13 jahr, monat, tag
NameError: name 'jahr' is not defined
# jahr, monat, tag mit List-Comprehension
... #
# Testausgabe
jahr, monat, tag
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[6], line 4
1 # jahr, monat, tag mit List-Comprehension
2 #
3 # Testausgabe
----> 4 jahr, monat, tag
NameError: name 'jahr' is not defined
# das dict "zu Fuß" erstellt
... #
# Testausgabe
jahr, monat, tag, d
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[7], line 4
1 # das dict "zu Fuß" erstellt
2 #
3 # Testausgabe
----> 4 jahr, monat, tag, d
NameError: name 'jahr' is not defined
# oder das dict ganz fancy mit zip()
... #
... #
# Testausgabe
jahr, monat, tag, d
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[8], line 6
1 # oder das dict ganz fancy mit zip()
2 #
3 #
4
5 # Testausgabe
----> 6 jahr, monat, tag, d
NameError: name 'jahr' is not defined
# Diese Tests sollen jedenfalls am Ende erfüllt sein
assert jahr == 1910
assert monat == 6
assert tag == 22
assert d == {"jahr": 1910, "monat": 6, "tag": 22}
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[9], line 2
1 # Diese Tests sollen jedenfalls am Ende erfüllt sein
----> 2 assert jahr == 1910
3 assert monat == 6
4 assert tag == 22
NameError: name 'jahr' is not defined
Teil 2, Verallgemeinerung: Mehrere Datensätze#
gegeben:
Ein Dict von Datumsangaben
gesucht:
obige Lösung für das komplette Dict
Vorgehen, Empfehlung:
für die Analyse eines einzelnen Records eine Funktion definieren
und diese dann auf den gesamten Datensatz anwenden
# gd ... Geburtstags-Dictionary
gd = { "Zuse": "1910-06-22", "Turing": "1912-06-23" }
ergebnis = ...
#hier Ihre Lösung
def datum_2_dict( datumstring ):
... #
datum_dict = {}
# dict zu Fuß erstellen
... #
... #
... #
# oder mit zip()
jmt_keys = [ "jahr", "monat", "tag" ]
... #
#print( datum_dict )
return datum_dict
ergebnis = { k: datum_2_dict(v) for k, v in gd.items() }
ergebnis
{'Zuse': {}, 'Turing': {}}
assert ergebnis == { "Zuse": {"jahr": 1910, "monat": 6, "tag": 22}, "Turing": {"jahr": 1912, "monat": 6, "tag": 23} }
---------------------------------------------------------------------------
AssertionError Traceback (most recent call last)
Cell In[11], line 1
----> 1 assert ergebnis == { "Zuse": {"jahr": 1910, "monat": 6, "tag": 22}, "Turing": {"jahr": 1912, "monat": 6, "tag": 23} }
AssertionError:
Aufgabe: Aufgabe 42#
(Platzhalter)
gegeben:
…
gesucht:
…
# Kontext
ergebnis = ...
# hier schlau programmieren
... #
# Testausgabe Ihrer Lösung (ggf. auch `print()` ausprobieren)
# print(ergebnis)
ergebnis
Ellipsis
# Diese Tests sollen erfüllt sein
ergebnis == 42
False