Python 101, Probeklausur 2025-12-09, BESPRECHUNG#

Prof. Dr. Johannes Busse, HAW LA, busse@haw-landshut.de

Familienname:

Vorname:

MatNr:

Papierklausur:

  • Anfangsbuchstaben vom Familiennamen am rechten Rand einkreisen

  • am linken Rand einkreisen: Studiengang, Studienbeginn

  • Falls Sie mehr Schreibraum benötigen: Nutzen Sie nicht die Rückseite, sondern die jeweils gegenüberliegende Seite einer Aufgabe.

  • Bitte lassen Sie den Korrektur-Rand rechts frei.

  • Es wird ausschließlich die Papier-Version der Klausur bewertet!

Das Jupyter Notebook ist lediglich ein erlaubtes Hilfsmittel unter vielen anderen Hilfsmitteln, ähnlich einem Taschenrechner. Zwar wird der Dozent bei der Korrektur nach Möglichkeit auch das elektronische Notebook anschauen. ber bewertet wird nur die Papierklausur. Übertragen Sie also alle Ergebnisse aus dem Notebook auf Papier.

Diese Klausur hat 40 Pkte (=100%), plus ein paar wenige Sonderpunkte. Unverbindlicher Notenspiegel: ab 18 Punkte = Note 4.0, 20=3.7, 22=3.3, …, 28=2.3, 34=1.3, 36=1.0

Punkte und Note Erstkorrektur:

ggf. Note Zweitkorrektur:

import datetime, os
print(f"{datetime.datetime.now()}, {os.getcwd()}")
2026-01-29 16:09:56.640398, /media/sf_abc123/l/LA_2025_ws/python-101/md

Aufgabe Operatoren (4 Pkte)#

(2025-12-09: gestrichen)

Aufgabe: String säubern (Gruppe A) (4 Pkte)#

gegeben:

  • zwei Strings s und verboten

gesucht:

  • ein String ok, aus dem alle Zeichen aus verboten entfernt sind

# Kontext
s = "Hallo, Welt! wie gehts?"
verboten = ".,;?!"

ergebnis = []
for c in list(s):
    #print(c)
    if c not in verboten:
        ergebnis.append(c)

print(ergebnis)
['H', 'a', 'l', 'l', 'o', ' ', 'W', 'e', 'l', 't', ' ', 'w', 'i', 'e', ' ', 'g', 'e', 'h', 't', 's']
# Ihr Ergebnis
ok = "".join(ergebnis)
ok
'Hallo Welt wie gehts'
# Kontext
s = "Hallo, Welt! wie gehts?"
verboten = ".,;?!"
ok = ""

ok =  "".join(  [ c  for c in list(s) if c not in verboten ] )

ok
'Hallo Welt wie gehts'
# Test
ok == 'Hallo Welt wie gehts'
True

Aufgabe: Pasch gewürfelt? (Gruppe A) (4 Pkte)#

Würfeln Sie mit mit n Würfeln. (n kann auch deutlich größer sein als 2.) Es entsteht eine Liste von Werten, ggf. mit Wiederholungen.

gesucht:

  • Stellen Sie fest, ob Sie einen Pasch gewürfelt haben, d.h. ob alle Würfel den gleichen Wert zeigen.

  • Lösen Sie, indem Sie eine entsprechende Funktion definieren.

Lösungshinweis: Die einfachste Lösung erzeugt aus der Liste ein Set. Aber es gibt auch andere Lösungen.

set( [ 2, 3, 2, 2 ] )
{2, 3}
# Kontext
wuerfe_1 = [ 1, 1, 1 ]     # ein Pasch
wuerfe_2 = [ 2, 3, 2, 2 ]  # kein Pasch

# Ihre Lösung

def pasch(x):

    if len( set(x)) == 1:
        return True
    else:
        return False
    
    # oder ganz kurz:
    # return len( set(x)) == 1

# Ihr Ergebnis
pasch(wuerfe_1), not pasch(wuerfe_2)
(True, True)
# Test
pasch(wuerfe_1) == True, pasch(wuerfe_2) == False
(True, True)

Aufgabe: Wie viele “große” Würfe? (Gruppe A) (4 Pkte)#

Gegeben:

  • Eine Liste von einigen Würfen mit 2 Würfeln.

Gesucht:

  • Wie viele “große” Würfe wurden gewürfelt?

Ein “großer” Wurf liegt vor, wenn 2 Würfel zusammen mindestens 10 Punkte ergeben.

Hinweis: Da hier nur 2 Würfel im Spiel sind, kann diese Aufgabe auch ohne Bezug auf die vorhergehende Aufgabe gelöst werden.

# Kontext
wuerfe = [ [5,6], [3,6], [2,5], [6,6] ]
   
# Ihre Lösung
anzahl_gross = 0 

summen =  [ sum(x) for x in wuerfe ]
summen
[11, 9, 7, 12]
anzahl_gross = len( [  x for x in summen   if x >= 10  ] )

# Ihr Ergebnis
anzahl_gross
2
anzahl_gross = len( [ sum(x) for x in wuerfe  if sum(x) >= 10     ]  )
anzahl_gross
2
# Test
anzahl_gross == 2
True

Aufgabe: Konfigurationsdatei (4 Pkte)#

gegeben:

  • eine bereits eingelesene Konfigurationsdatei mit key-value-Paaren als String

gesucht:

  • der Inhalt dieser Datei als Dict

Vereinfachende Annahmen: Kein key kommt doppelt vor. In den Values kommt kein Doppelpunkt vor.

Eine Lösung mit Comprehension gibt mehr Punkte.

# Kontext
kernelspec = """display_name: Python 3 (ipykernel)
language: python
name: python3"""

ksd = {}  # kernelspec dict

# Ihre Lösung
... # 
zeilen = kernelspec.split("\n")
zeilen

noch_mehr_gesplittet = [ line.split(":", 1) for line in zeilen ] 

noch_mehr_gesplittet = { line.split(":")[0] : line.split(":")[1] for line in zeilen }

noch_mehr_gesplittet
{'display_name': ' Python 3 (ipykernel)',
 'language': ' python',
 'name': ' python3'}
# Ihr Ergebnis
ksd
{}
# Test
ksd == {'display_name': 'Python 3 (ipykernel)',
 'language': 'python',
 'name': 'python3'}
False
# Ihr Ergebnis
ksd
{}

Aufgabe: Dict als String repräsentieren (4 Pkte)#

gegeben:

  • ein einfaches, flaches Dict, z.B. Volumen einer Verpackung.

gesucht:

  • dieses Dict als String Volumen_string, den man auch in eine Datei ‘rausschreiben könnte: Jede Zeile ein durch Doppelpunkt getrenntes Paar von Key und Value (siehe Test).

Eine Lösung mit f-String und Comprehension passt in eine Zeile ;-)

# Kontext
Volumen = {'Salz': 394, 'Maccaroni': 2101, 'Milch': 1010}

# Ihre Lösung
Volumen_string = ""
... #  

ergebnis = []
for k, v in Volumen.items():
    neu = f"{k}: {v}"
    #neu = k + ": " + str(v)
    ergebnis.append( neu  )
ergebnis
['Salz: 394', 'Maccaroni: 2101', 'Milch: 1010']
# Kontext
Volumen = {'Salz': 394, 'Maccaroni': 2101, 'Milch': 1010}

# Ihre Lösung
Volumen_string = ""

for k, v in Volumen.items():
    neu = f"{k}: {v}"
    #neu = k + ": " + str(v)
    Volumen_string = Volumen_string + "\n" + neu
ergebnis
['Salz: 394', 'Maccaroni: 2101', 'Milch: 1010']
Volumen_string = "\n".join(ergebnis)
# Ihr Ergebnis
Volumen_string
'Salz: 394\nMaccaroni: 2101\nMilch: 1010'
# Test
Volumen_string == 'Salz: 394\nMaccaroni: 2101\nMilch: 1010'
True

Aufgabe: Ortschaften zuordnen (Gruppe A) (4 Pkte)#

gegeben:

  • eine Liste von PLZ und Ortschaften – leider als String angegeben.

gesucht:

  • ein Dict plz_ort, das zu jeder PLZ eine Menge der zugehörigen Ortschaften angibt

# Kontext
Orte = [ "84030 LA", "84032 LA", "84034 LA", "8430 Ergolding", "84032 Altdorf", "84032 Eugenbach"]

plz_ort = {}

# Ihre Lösung

for po in Orte:
    print(po, po.split( " "))
    plz, ort = po.split(" ")
    
    if plz not in plz_ort:
        plz_ort[plz] = set()

    plz_ort[plz].add(ort)
plz_ort
84030 LA ['84030', 'LA']
84032 LA ['84032', 'LA']
84034 LA ['84034', 'LA']
8430 Ergolding ['8430', 'Ergolding']
84032 Altdorf ['84032', 'Altdorf']
84032 Eugenbach ['84032', 'Eugenbach']
{'84030': {'LA'},
 '84032': {'Altdorf', 'Eugenbach', 'LA'},
 '84034': {'LA'},
 '8430': {'Ergolding'}}
# Ihr Ergebnis
plz_ort
{'84030': {'LA'},
 '84032': {'Altdorf', 'Eugenbach', 'LA'},
 '84034': {'LA'},
 '8430': {'Ergolding'}}
# Test
plz_ort == {'84030': {'LA'},
 '84032': {'Altdorf', 'Eugenbach', 'LA'},
 '84034': {'LA'},
 '8430': {'Ergolding'}}
True

Aufgabe: zusammen kochen (4 Pkte)#

gegeben:

  • ein Dict DasMagIch, das für jede Person die Gerichte angibt, die sie gerne isst

gesucht:

  • eine Funktion gemeinsam(), die für zwei Personen eine Liste der Gerichte zurückgibt, die beide mögen

Falls eine Person nicht im Dict enthalten ist, soll die Funktion None ergeben. Die Reihenfolge der Gerichte im Ergebnis ist unerheblich.

# Kontext
DasMagIch = {
     "Emma" : ["Fisch", "Nudeln", "Pizza", "Schnitzel" ],
     "Peter": [         "Nudeln",          "Schnitzel"],
     "Simon": ["Fisch", "Nudeln", "Pizza",              "Salat"],
     "Leonie" : [       "Nudeln", "Pizza",              "Salat"]}

# Ihre Lösung
def gemeinsam(P1, P2):
    """Gibt die gemeinsamen Lieblingsessen von 2 Personen aus dem Dict `DasMagIch` zurück."""
    das_mag_P1 = set(DasMagIch[P1])
    das_mag_P2 = set(DasMagIch[P2])
    #print(das_mag_P1, das_mag_P2, das_mag_P1.intersection(das_mag_P2))
    return das_mag_P1.intersection(das_mag_P2)
gemeinsam("Emma", "Peter")
{'Nudeln', 'Schnitzel'}
# Ihr Ergebnis
gemeinsam("Emma", "Leonie")
{'Nudeln', 'Pizza'}
# Test
gemeinsam("Emma", "Leonie") == {'Nudeln', 'Pizza'}
True

Aufgabe: Volumen (Gruppe A) (8 Pkte)#

Gegeben

  • ein Dict Abmessungen, das zu jeder Verpackung ihre Verpackungsmaße angibt

Die Verpackungsmaße sind in cm gegeben, L(änge) mal B(reite) mal H(öhe) – aber leider nicht einheitlich: eigentlich sollte es eine Liste sein, manchmal ist es aber lediglich ein String, durch Strichpunkt ; getrennt (Leerzeichen sind in solchen Strings gottseidank nicht enthalten).

gesucht:

  • eine Funktion vol(), die das Volumen in vollen Kubikzentimetern (Datentyp int) berechnet

  • ein Dict Volumen, das zu jeder Verpackung ihr jeweiliges Volumen angibt

# Kontext
Abmessungen = { 
    "Salz":      [ 4.7, 6, 14 ],
    "Maccaroni": [ 5, 19.1, 22 ] ,
    "Milch":     "7.2;7.2;19.5"   
}

Volumen = {k: None for k in Abmessungen }

# Ihre Lösung
def vol(Maße):

    if isinstance(Maße, list):
        l, b, h = Maße
        v = l * b* h
        return v

    elif isinstance(Maße, str):
        l, b, h = Maße.split(";")
        v = float(l) * float(b) * float(h)
        return v

Volumen = { k: vol(v) for k,v in Abmessungen.items() }
# Ihr Ergebnis
Volumen
{'Salz': 394.80000000000007, 'Maccaroni': 2101.0, 'Milch': 1010.8800000000001}
# Test
Volumen == {'Salz': 394, 'Maccaroni': 2101, 'Milch': 1010}
False