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
jahr = int( g[:4] ) #...
monat = int( g[5:7] ) #...
tag = int( g[8:] ) #...
# oder auch so
jahr, monat, tag = g[0:4], g[5:7], g[8:] #...
# Testausgabe
jahr, monat, tag
('1910', '06', '22')
# jahr, monat, tag mit List-Comprehension
jahr, monat, tag = [ int(x) for x in g.split("-") ] #...
# Testausgabe
jahr, monat, tag
(1910, 6, 22)
# das dict "zu Fuß" erstellt
d = {"jahr": jahr, "monat": monat, "tag": tag} #...
# Testausgabe
jahr, monat, tag, d
(1910, 6, 22, {'jahr': 1910, 'monat': 6, 'tag': 22})
# oder das dict ganz fancy mit zip()
schlüssel = ["jahr", "monat", "tag"] #...
d = dict( zip( schlüssel, [ int(x) for x in g.split("-") ] )) #...
# Testausgabe
jahr, monat, tag, d
(1910, 6, 22, {'jahr': 1910, 'monat': 6, 'tag': 22})
# 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}
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 ):
jmt_liste = [ int(x) for x in datumstring.split("-") ] #...
datum_dict = {}
# dict zu Fuß erstellen
datum_dict["jahr"] = jmt_liste[0] #...
datum_dict["monat"] = jmt_liste[1] #...
datum_dict["tag"] = jmt_liste[2] #...
# oder mit zip()
jmt_keys = [ "jahr", "monat", "tag" ]
datum_dict = dict( zip( jmt_keys, jmt_liste ) ) #...
#print( datum_dict )
return datum_dict
ergebnis = { k: datum_2_dict(v) for k, v in gd.items() }
ergebnis
{'Zuse': {'jahr': 1910, 'monat': 6, 'tag': 22},
'Turing': {'jahr': 1912, 'monat': 6, 'tag': 23}}
assert ergebnis == { "Zuse": {"jahr": 1910, "monat": 6, "tag": 22}, "Turing": {"jahr": 1912, "monat": 6, "tag": 23} }
Aufgabe: Aufgabe 42#
(Platzhalter)
gegeben:
…
gesucht:
…
# Kontext
ergebnis = ...
# hier schlau programmieren
ergebnis = 42 #...
# Testausgabe Ihrer Lösung (ggf. auch `print()` ausprobieren)
# print(ergebnis)
ergebnis
42
# Diese Tests sollen erfüllt sein
ergebnis == 42
True