Grundlagen Python (5/5): komplexere Datenstrukturen, externe Daten

Bildschirm mit Code - Grundlagen Python

Dieser Blog erklärt die Grundlagen der Programmiersprache Python anhand eines Projektes – ein Programm, mit dem sich Kopfrechnen trainieren lässt. Am Ende dieser Revision kann das Programm weitere Aufgabetypen abfragen sowie Spielstand laden und speichern.

Kopfrechnen Version 1.0

Link zum ausführbaren Code auf GitHub: https://github.com/dr-bach/python/blob/main/Kopfrechnen_1_0.ipynb

Wir finalisieren in dieser Revision unser Programm und geben ihm eine echte Versionsnummer.

Grundlagen Python: komplexere Datenstrukturen

Statt einzelnen Variablen zu benutzen, kann man verschiedene Gruppen bilden, auch Containerklassen genannt – dazu gehören Listen, Sets (entspricht dem mathematischen Konzept von Mengen) und Dictionaries.


Eine Liste besteht aus verschiedenen Variablen (auch unterschiedliche Typen), auf die über eine Schleife oder einen Index zugegriffen werden kann. Der Index beginnt mit dem Wert Null, so dass der höchste Indexwert (Anzahl Elemente)-1 beträgt. Würde man versuchen auf ein nicht existierendes Element zuzugreifen, gibt Python eine IndexError Fehlermeldung aus.

staedte = ["Berlin", "München", "Hamburg", "Köln"]
print("Millionenstädte in Deutschland")
for s in staedte:
  print("- ",s)

print(f"Deutschlands zweitgrößte Stadt ist {staedte[1]}")
Millionenstädte in Deutschland
-  Berlin
-  München
-  Hamburg
-  Köln
Deutschlands zweitgrößte Stadt ist München

Vorsicht mit dem Index, insbesondere weil diese mit Null beginnt. Versucht man auf einen Listenwert zuzugreifen, der nicht existiert, gibt es einen Fehler (den man natürlich mit try abfangen kann).

Man kann Listen auch häufig als Auswahl übergeben, z.B. die zufällige Auswahl eines Rechenzeichens

import random
rechenart=random.choice(["+","-","*",":"])

print(rechenart)

Wir erweitern das Programm um die Rechenarten Subtraktion, Multiplikation (das kleine Einmaleins) und Division, die zufällig ausgewählt werden können. Für jede Rechenart erzeugen wir eine eigene Funktion. Außerdem teilen diese sich eine Funktion, die zwei Zufallszahlen in den Grenzen min und max erzeugt.
Die Division wird mit einem Zwischenschritt realisiert, der einer umgekehrten Multiplikation entspricht. Zusätzlich erweitern wir den Zahlenraum für Addition und Subtraktion bis 100 (angleichen an die Multiplikation 10*10=100).


Neben Listen gibt es beispielsweise noch Dictionaries. Diese kann man sich als Liste mit eindeutigen Index vorstellen (der nicht eine fortlaufende Zahl sein muss). Wir benutzen dies, um ergebnisse in richtig und falsch zu werden.
Später werden wir noch auf andere Datenstrukturen zu sprechen kommen.

ergebnisse = {
    'richtig': 3,
    'falsch': 2
}

ergebnisse['richtig']+=1

Der Zugriff auf die Werte erfolgt dann beispielsweise auf einzelne Schlüssel oder auf das ganze Dictionary

print(ergebnisse)
richtig = ergebnisse['richtig']
print(richtig)
{'richtig': 4, 'falsch': 2}
4

Grundlagen Python: externe Daten (lesen und schreiben)

Bisher wurden Variablen und Datenstrukturen allein im Speicher des Computers behalten.
Als Dateien bezeichnet man allgemein separate Daten, die permanent (d.h. außerhalb des Arbeitsspeichers) beispielsweise in einer Cloud abgelegt sind (wobei dieses darstellen). Die Daten selbst können verschiedene Formate haben wie Text (häufig mit der Endung txt), Bilder (jpg, png, gif, …), Ton (mp3, wav, …) und viele weitere.
Wir wollen das Dictionary in der Form „Schlüsselelement = Wert“ zeilenweise in eine Textdatei sichern. Dazu müssen wir diese zunächst öffnen (oder erzeugen, falls sie nicht existiert) und über den Befehl write schreiben.
Beim Lesen kehrt sich der Vorgang um, wobei wir das Schlüsselelement vom Wert durch das Gleichheitszeichen trennen.

# Datei zum Schreiben öffnen
with open('ergebnisse.txt', 'w') as f: 
    for key, value in ergebnisse.items(): # Schreibe die Werte des Dictionaries in die Datei
        f.write(f"{key} = {value}\n")

# Datei zum Lesen öffnen
with open('ergebnisse.txt', 'r') as f: 
    for line in f: # Lese den Inhalt der Datei zeilenweise
        key, value = line.strip().split(' = ') # Teile die Zeile anhand des Gleichheitszeichens auf
        if value.isdigit(): # der value-String muss in Integer gewandelt werden
            value = int(value)
        ergebnisse[key] = value

Programm

###
# Bibliotheken laden
###

import random


###
# Funktionen definieren
###

def willkommen_anzeigen():
    print("Willkommen beim Kopfrechnen.")
    print("Dir werden jetzt Rechenaufgaben gestellt.")
    print("Wenn Du aufhören möchtest, tippe statt des Ergebnis das Wort 'ende' ein")

def zwei_zufallszahlen(min, max):
    return(random.randint(min, max),random.randint(min, max))

def addition(min, max):
    while True:
        (a,b)=zwei_zufallszahlen(min,max)
        if (a+b)<=max:
            break
    return (a,b,a+b)

def subtraktion(min, max):
    while True:
        (a,b)=zwei_zufallszahlen(min,max)
        if (a-b)>=min:
            break
    return (a,b,a-b)

def multiplikation(min, max):
    (a,b)=zwei_zufallszahlen(min,max)
    return (a,b,a*b)

def division(min, max):
    while True:
        (a,b)=zwei_zufallszahlen(min,max)
        dividend=a*b
        if (a*b)<=max*max:
            break
    return (dividend,b,a)

def aufgabe_stellen():
    rechenart=random.choice(["+","-","*",":"])
    if rechenart == "+":
        (a,b,ergebnis) = addition(1,100)
    elif rechenart == "-":
        (a,b,ergebnis) = subtraktion(1,100)
    elif rechenart == "*":
        (a,b,ergebnis) = multiplikation(1,10)
    else:  #rechenart == ":"
        (a,b,ergebnis) = division(1,10)
    print (f"wieviel ist {a} {rechenart} {b}?")
    return ergebnis

def antwort_eingeben():
    while True:
        eingabe = input("Dein Ergebnis = ")
        if eingabe.lower() == "ende":
            print("Spiel wird beendet\n")
            return -1
        try:
            eingabe = int(eingabe)
            break
        except ValueError:
            print("Bitte eine ganze Zahl oder 'ende' eingeben")
    return eingabe

def speichern(auswertung):
    with open('auswertung.txt', 'w') as f: # Datei zum Schreiben öffnen
        for key, value in auswertung.items(): # Schreibe die Werte des Dictionaries in die Datei
            f.write(f"{key} = {value}\n")

def laden(auswertung):
    with open('auswertung.txt', 'r') as f:
        for line in f:
            key, value = line.strip().split(' = ')
            if value.isdigit():
                value = int(value)
            auswertung[key] = value
    return auswertung

def kopfrechnen():
    auswertung = {
          'richtig': 0,
          'falsch': 0 }

    try:
        auswertung = laden(auswertung)
        print (f"Du hattest bisher {auswertung['richtig']} von {auswertung['richtig']+auswertung['falsch']} Aufgaben richtig")
    except:
        print("Es wird eine neue Auswertung angelegt")
        auswertung = {
            'richtig': 0,
            'falsch': 0 }
    willkommen_anzeigen
    while True:
          ergebnis=aufgabe_stellen()
          antwort=antwort_eingeben()
          if antwort<0:
              break
          if antwort==ergebnis:
              print("Richtig\n")
              auswertung['richtig']+=1
          else:
              print(f"{antwort} ist falsch. Das richtige Ergebnis lautet {ergebnis}\n")
              auswertung['falsch']+=1
    print (f"Du hast insgesamt {auswertung['richtig']} von {auswertung['richtig']+auswertung['falsch']} Aufgaben richtig")
    speichern(auswertung)

###
# hauptprogramm
###

kopfrechnen()

Ein möglicher Ablauf könnte wie folgt aussehen

Du hattest bisher 3 von 5 Aufgaben richtig
wieviel ist 25 + 24?
Dein Ergebnis = 49
Richtig

wieviel ist 62 + 27?
Dein Ergebnis = 89
Richtig

wieviel ist 87 + 3?
Dein Ergebnis = 90
Richtig

wieviel ist 20 : 2?
Dein Ergebnis = 2
2 ist falsch. Das richtige Ergebnis lautet 10

wieviel ist 2 * 4?
Dein Ergebnis = ende
Spiel wird beendet

Du hast insgesamt 6 von 9 Aufgaben richtig

Die kompletten Grundlagen Python

Kopfrechnen Version 0.1

Additionsaufgabe mit zwei Zahlen stellen

  • Variablen
  • Ausgabe mit print()
  • Eingabe mit input()

Link: https://kiwi-strategie.de/grundlagen-python-1-5/

Kopfrechnen Version 0.2

Additionsaufgabe mit zwei Zufallszahlen stellen und das Ergebnis bewerten

  • Kommentare
  • Bibliotheken einbinden (am Beispiel von random)
  • Verzweigungen mit ifelse und elif

Link: https://kiwi-strategie.de/grundlagen-python-2-5/

Kopfrechnen Version 0.3

Mehrere Additionsaufgaben stellen und falsche Eingabeformate zurückweisen

  • Schleifen mit for und while
  • Fehlerbehandlung

Link: https://kiwi-strategie.de/grundlagen-python-3-5/

Kopfrechnen Version 0.4

Beliebig viele Aufgaben stellen mit abschließender Gesamtbewertung

  • Funktionen (mit Parametern und Rückgabewerten)
  • Programmierstil (PEP, Zen of Python)

Link: https://kiwi-strategie.de/grundlagen-python-4-5/

Kopfrechnen Version 1.0

Weitere Aufgabetypen abfragen sowie Spielstand laden und speichern

  • komplexere Datenstrukturen (Listen und Dictionaries)
  • externe Daten lesen und schreiben

Link: https://kiwi-strategie.de/grundlagen-python-5-5/

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert