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() oder print())

  • 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 Wert 42 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