Kategorie: das Labor

das Labor ist eine Art Spielwiese für neue Technologien und innovative Ideen

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

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

    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/

  • Grundlagen Python (4/5): Funktionen, Programmierstil

    Grundlagen Python (4/5): Funktionen, Programmierstil

    • Funktionen (mit Parametern und Rückgabewerten)
    • Programmierstil (PEP, Zen of 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 beliebig viele Aufgaben stellen und abschließend eine Gesamtbewertung geben.

    Kopfrechnen Version 0.4

    Bisher haben wir den Code durch Kommentare unterteilt. Dadurch hat unser Programm eine gewisse Struktur, aber die Codeabschnitte sind beispielsweise nicht wiederverwendbar. Unser nächster Schritt wird sein, diese Codeabschnitte in Funktionen zu wandeln (beispielsweise Zufallszahlen, Addition, Hauptprogramm).
    In dieser Version soll solange eine neue Aufgabe gestellt werden, bis statt das Ergebnis das Wort „ende“ eingegeben wird.
    Ausserdem achten wir auf das Zen von Python (soweit möglich).

    Grundlagen Python: Funktionen

    Funktionen sind wesentlich, um Lesbarkeit des Codes zu erhöhen, Fehler zu minimieren und Wiederverwendbarkeit zu ermöglichen. Daher werden wesentliche Programmelemente als Funktion definiert.
    Funktionen werden generell mit dem Schlüsselwort def definiert, gefolgt vom Funktionsnamen, runden Klammer (ggf. mit Parametern) und einem Doppelpunkt. Die auszuführenden Anweisungen werden eingerückt. Mit dem Schlüsselwort return können Werte zurückgegeben werden, beispielsweise um einer Variablen einen Wert zuzuweisen.
    Um die Funktion auszuführen, muss sie dezidiert aufgerufen werden.

    def funktion_ohne_alles():
      print("Hallo Welt")
    
    funktion_ohne_alles()
    Hallo Welt

    Funktionen können (müssen aber nicht) Ergebnisse mit dem Befehl return zurückgeben. Diese zurückgegebenen Werte können (müssen aber nicht) verwendet werden.

    def funktion_mit_rückgabe():
      print("Hallo in der Funktion")
      return "Hallo als Rückgabewert"
    
    funktion_mit_rückgabe()
    
    text=funktion_mit_rückgabe()
    print (text)
    Hallo in der Funktion
    Hallo in der Funktion
    Hallo als Rückgabewert

    Funktionen können (müssen aber nicht) Argumente enthalten, die in der Klammer hinter ihrem Namen aufgelistet werden. Diese können auch vordefiniert sein und ein Parameter überschreibt dann den Standartwert.

    def funktion_mit_parameter(variable="Hallo"):
      print(variable)
    
    funktion_mit_parameter()
    funktion_mit_parameter("Hallo Welt")
    Hallo
    Hallo Welt

    Mit Funktionen kann man auch noch mehr machen, wie die Beispiele unten zeigen.

    def funktion (zeichen="#", zahl1=5, zahl2=1):
      return zeichen*zahl1*zahl2
    
    def funktion_komplex (zeichen="#", zahl1=5, zahl2=1):
      produkt = zahl1*zahl2
      return zeichen*produkt, produkt
    
    variable=funktion("*")
    print(variable)
    variable=funktion("*", 10)
    print(variable)
    variable=funktion("*", 10, 2)
    print(variable)
    variable=funktion("*", zahl2=3, zahl1=3)
    print(variable)
    
    (text,zahl)=(funktion_komplex())
    print(funktion_komplex())
    print(text*zahl)
    *****
    **********
    ********************
    *********
    ('#####', 5)
    #########################

    Grundlagen Python: Programmierstil (PEP, Zen of Python und anderes)

    Wir können zu diesem frühen Zeitpunkt erkennen, dass die steigende Komplexität des Programms mehr Struktur erfordert. In der Literatur gibt es dazu verschiedene Ansätze, hier legen wir als interne Richtlinie folgende Punkte fest:

    • maximal 79 Zeichen pro Zeile (dadurch erhalten wir eine gute Lesbarkeit auf Papier oder Bildschirm – siehe auch vertikale Linie innerhalb der Codefenster),
    • maximal 30 Codezeilen pro Block (auch hier wäre weniger besser)
    • maximal 7 Arbeitsschritte pro Block
    • kommentierte Programmbereiche
      • #initialisierungen: Import von Bibliotheken und Definition von globalen Variablen
      • #aufgabe erstellen: Funktionen, die mit der Aufgabenstellung im Zusammenhang stehen
      • #eingabe bewerten: Funktionen, die die Eingabe und Bewertung durchführen
      • #hauptprogramm: die primäre Funktion und ihr Aufruf

    Außerdem versuchen wir, möglichst wenige globale Variablen zu benutzen.


    PEP 8

    Python-spezifisch gibt es noch einige sogenennate PEPs. PEP 8 steht für „Python Enhancement Proposal 8“ und stellt den „Style Guide for Python Code“ dar. Einige der wichtigsten Punkte sind:

    1. Einrückung: Verwendung von 4 Leerzeichen pro Einrückungsebene (keine Tabulatoren).
    2. Zeilenlänge: Empfehlung, dass Zeilen 79 Zeichen nicht überschreiten sollten, um die Lesbarkeit zu fördern.
    3. Leerzeichen: Verwendung von Leerzeichen um Operatoren und nach Kommas, aber keine Leerzeichen am Ende von Zeilen oder vor Einzugsanfängen.
    4. Zeilen und Zeilenwechsel: Empfehlungen für die Verwendung von Leerzeilen zur logischen Trennung von Codeblöcken.
    5. Naming Conventions: Konventionen für die Benennung von Variablen, Funktionen, Klassen und Modulen, z. B. Verwendung von „snake_case“ für Funktionen und Variablen sowie „CamelCase“ für Klassennamen.
    6. Import-Anweisungen: Richtlinien für die Formatierung von Import-Anweisungen und die Reihenfolge der Imports.

    Vieles davon haben wir schon verwendet bzw. umgesetzt, ohne es explizit zu erwähnen. Ein einheitlicher Stil erleichtert auch die Zusammenarbeit in Projekten und fördert die Lesbarkeit und Wartbarkeit des Codes.


    PEP 20 – The Zen of Python

    Daneben gibt es noch PEP 20, Zen von Python genannt. Die 19 teilweise humorvollen Regeln beinhalten verschiedene Bereiche, Programmieren im Allgemeinen zu verbessern. Man kann sie sich auch als sogenanntes Easter Egg mit import this anzeigen lassen.

    import this
    The Zen of Python, by Tim Peters
    
    Beautiful is better than ugly.
    Explicit is better than implicit.
    Simple is better than complex.
    Complex is better than complicated.
    Flat is better than nested.
    Sparse is better than dense.
    Readability counts.
    Special cases aren't special enough to break the rules.
    Although practicality beats purity.
    Errors should never pass silently.
    Unless explicitly silenced.
    In the face of ambiguity, refuse the temptation to guess.
    There should be one-- and preferably only one --obvious way to do it.
    Although that way may not be obvious at first unless you're Dutch.
    Now is better than never.
    Although never is often better than *right* now.
    If the implementation is hard to explain, it's a bad idea.
    If the implementation is easy to explain, it may be a good idea.
    Namespaces are one honking great idea -- let's do more of those!

    Auf Deutsch könnte man wie folgt übersetzen:

    • Elegant (bzw. schön) ist besser als hässlich.
    • Explizit ist besser als implizit.
    • Einfach ist besser als komplex.
    • Komplex ist aber immer noch besser als kompliziert.
    • Flach ist besser als verschachtelt.
    • Sparsam ist besser als dicht.
    • Lesbarkeit zählt.
    • Sonderfälle sind nicht besonders genug, um die Regeln zu brechen.
    • Wobei Praktikabilität Reinheit schlägt.
    • Fehler sollten niemals stillschweigend passieren.
    • Sofern sie nicht ausdrücklich zum Schweigen gebracht werden.
    • Widerstehe angesichts von Mehrdeutigkeiten der Versuchung zu raten.
    • Es sollte einen – und vorzugsweise nur einen – offensichtlichen Weg geben, dies zu tun.
    • Obwohl dies zunächst nicht offensichtlich ist, es sei denn, Sie sind Niederländer.
    • Jetzt ist besser als nie.
    • Obwohl nie oft besser ist als genau jetzt.
    • Wenn eine Implementierung schwer zu erklären ist, ist es eine schlechte Idee.
    • Wenn eine Implementierung einfach zu erklären ist, könnte es eine gute Idee sein.
    • Namensräume sind eine großartige Idee – machen wir mehr davon!

    Damit können wir nun die vierte Version des Programms fertigstellen.

    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 das Wort 'ende' ein")
    
    def aufgabe_stellen():
        a=random.randint(1, 5) # Zufallszahl erzeugen
        b=random.randint(1, 5) # Zufallszahl erzeugen
        print(f"Wieviel ist {a} + {b}?") # Aufgabe anzeigen
        return a+b # Ergebnis berechnen und zurückgeben
    
    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 antwort_bewerten (ergebnis, antwort):
        if antwort==ergebnis:
            print("Richtig\n")
            return 1
        else:
            print(f"{antwort} ist falsch. Das richtige Ergebnis lautet {ergebnis}\n")
            return 0
    
    def kopfrechnen():
        runden=0
        richtig=0
        willkommen_anzeigen
        while True:
              ergebnis=aufgabe_stellen()
              antwort=antwort_eingeben()
              if antwort<0:
                  break
              else:
                  richtig += antwort_bewerten (ergebnis, antwort)
              runden += 1
        print (f"Du hast insgesamt {richtig} von {runden} Aufgaben richtig")
    
    
    ###
    # hauptprogramm
    ###
    
    kopfrechnen()

    Ein möglicher Ablauf könnte wie folgt aussehen

    Wieviel ist 1 + 2?
    Dein Ergebnis = 3
    Richtig
    
    Wieviel ist 1 + 2?
    Dein Ergebnis = 3
    Richtig
    
    Wieviel ist 3 + 2?
    Dein Ergebnis = 3
    3 ist falsch. Das richtige Ergebnis lautet 5
    
    Wieviel ist 2 + 4?
    Dein Ergebnis = ende
    Spiel wird beendet
    
    Du hast insgesamt 2 von 3 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/

  • Grundlagen Python (3/5): Schleifen mit for und while, Fehlerbehandlung

    Grundlagen Python (3/5): Schleifen mit for und while, Fehlerbehandlung

    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 mehrere Additionsaufgaben stellen und falsche Eingabeformate zurückweisen.

    Kopfrechnen Version 0.3

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

    Als nächstes erweitern wir das Programm dahingehend, dass mehrere Aufgaben gestellt werden. Dies realisieren wir mit Schleifen. Der zu wiederholende Code wird (wie auch bei Verzweigungen) eingerückt und wir unterscheiden zwei Arten von Schleifen.

    Schleifen mit for

    Bei der for Schleife wird eine Zählvariable definiert (oft i für Index genannt), die eine gewisse Anzahl an Durchläufen zählt. Zum einen definieren wir die einzelnen Zähler als range

    • bei einem Parameter von Null an die entsprechende Zahl an Elementen
    • bei zwei Parametern von bis
    • bei drei Parametern von bis mit dem 3. Parameter als Schrittweite

    Alternativ ist es möglich, die Elemente einzeln und durch Kommata getrennt aufzulisten.
    Außerdem kann die Schleife mit break abgebrochen und mit continue ein Durchlauf übersprungen werden.

    for i in range(6):
      print ("Durchlauf", i)
    print()
    
    for i in range(3,6):
      print ("Durchlauf", i)
    print()
    
    for i in range(6,13,5):
      print ("Durchlauf", i)
    print()
    
    for i in -2, -1, 0, 1, 2:
      print (i, "zum Quadrat =", i**2)
    print()
    
    for i in range(5):
      if i>2:
        break
      print ("Durchlauf", i)
    print()
    
    for i in range(5):
      if 1<i<=3:
        continue
      print ("Durchlauf", i)
    print()
    Durchlauf 0
    Durchlauf 1
    Durchlauf 2
    Durchlauf 3
    Durchlauf 4
    Durchlauf 5
    
    Durchlauf 3
    Durchlauf 4
    Durchlauf 5
    
    Durchlauf 6
    Durchlauf 11
    
    -2 zum Quadrat = 4
    -1 zum Quadrat = 1
    0 zum Quadrat = 0
    1 zum Quadrat = 1
    2 zum Quadrat = 4
    
    Durchlauf 0
    Durchlauf 1
    Durchlauf 2
    
    Durchlauf 0
    Durchlauf 1
    Durchlauf 4

    Schleifen lassen sich auch schachteln, beispielsweise um Zeilen und Spalten einer Tabelle zu durchlaufen.

    for x in -1, 0, 1:
      for y in -1, 0, 1:
        print(f"x: {x}, y: {y}")
    x: -1, y: -1
    x: -1, y: 0
    x: -1, y: 1
    x: 0, y: -1
    x: 0, y: 0
    x: 0, y: 1
    x: 1, y: -1
    x: 1, y: 0
    x: 1, y: 1

    Schleifen mit while

    Bei einer while Schleife wird ein Wahrheitswert (Boolean) geprüft und solange ausgeführt, wie diese wahr (True) ist – ähnlich wie bei einer if-Verweigung.
    Man kann einen eigenen Zähler initialisieren, der innerhalb der Schleife hochgezählt werden muss. Oftmals wird jedoch, insbesondere wenn man die Anzahl der Wiederholungen nicht kennt, eine Endlosschleife while True: mit einer Abbruchbedingung über break formuliert – letztere muss dann aber sicher greifen, damit das Programm anschließend fortgesetzt wird!

    i=0
    while i <3:
      print ("Durchlauf", i)
      i+=1
    print()
    
    while i <9:
      print ("Durchlauf", i)
      i+=4
    print()
    
    while True:
      print ("Durchlauf", i)
      i+=1
      if i>10:
        break
    Durchlauf 0
    Durchlauf 1
    Durchlauf 2
    
    Durchlauf 3
    Durchlauf 7
    
    Durchlauf 11

    Fehlerbehandlung

    Bisher kam es zum Programmabbruch (genauer gesagt zu einem ValueError), wenn man statt einer Zahl einen oder mehrere Buchstaben bzw. Sonderzeichen eingegeben hat.
    Um dies zu vermeiden, können wir die Gültigkeit eines Programmschrittes mit Hilfe von try prüfen. Es wird sozusagen versucht, den Schritt durchzuführen – und falls ein Fehler auftaucht, wird eine Alternative ermöglicht.
    Im konkreten Fall soll die Texteingabe in eine Ganzzahl gewandelt werden. Falls dies nicht möglich ist, wird eine Warnmeldung ausgegeben.

    try:
      eingabe = int(input("Bitte gib eine ganze Zahl ein: "))
      print("Deine Zahl lautet ",eingabe)
    except ValueError:
        print("Die Eingabe war keine ganze Zahl")

    Ein möglicher Ablauf könnte wie folgt aussehen

    Bitte gib eine ganze Zahl ein: 5.1
    Die Eingabe war keine ganze Zahl

    Die Abfrage lässt sich in einer while Schleife einbinden um die Eingabe so lange zu wiederholen, bis eine gültige Zahl eingegeben wurde.

    while True:
        try:
          antwort = int(input("Dein Ergebnis = "))
          break
        except ValueError:
          print("Bitte eine Zahl eingeben")

    Ein möglicher Ablauf könnte wie folgt aussehen

    Dein Ergebnis = ö
    Bitte eine Zahl eingeben
    Dein Ergebnis = 21

    Programm

    #Bibliotheken laden
    import random
    
    #globale Variablen festlegen
    runden=5
    
    print(f"Willkommen beim Kopfrechnen. Dir werden {runden} Fragen gestellt")
    
    # Schleife mit Anzahl der Runden
    for i in range(runden):
    
      #Zufallszahlen erzeugen
      a=random.randint(1, 5)
      b=random.randint(1, 5)
    
      #Aufgabe stellen
      print(f"Wieviel ist {a} + {b}?")
    
      #Ergebnis berechnen
      ergebnis=a+b
    
      # Antwort abfragen
      while True:
        try:
          antwort = int(input("Dein Ergebnis = "))
          break
        except ValueError:
          print("Bitte eine Zahl eingeben")
    
      # Antwort bewerten
      if ergebnis==antwort:
        print("Richtig\n")
      else:
        print(f"{antwort} ist falsch. Das richtige Ergebnis lautet {ergebnis}\n")

    Hier könnte ein möglicher Ablauf wie folgt aussehen

    Willkommen beim Kopfrechnen. Dir werden 5 Fragen gestellt
    Wieviel ist 4 + 5?
    Dein Ergebnis = 9
    Richtig
    
    Wieviel ist 4 + 3?
    Dein Ergebnis = ö
    Bitte eine Zahl eingeben
    Dein Ergebnis = 7
    Richtig
    
    Wieviel ist 1 + 4?
    Dein Ergebnis = 5
    Richtig
    
    Wieviel ist 3 + 4?
    Dein Ergebnis = 7
    Richtig
    
    Wieviel ist 1 + 5?
    Dein Ergebnis = 2
    2 ist falsch. Das richtige Ergebnis lautet 6

    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/

  • Grundlagen Python (2/5): Kommentare, Bibliotheken, Verzweigungen

    Grundlagen Python (2/5): Kommentare, Bibliotheken, Verzweigungen

    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 Additionsaufgabe mit zwei Zufallszahlen stellen und das Ergebnis bewerten.

    Kopfrechnen Version 0.2

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

    Grundlagen Python: Kommentare

    Zunächst verleihen wir dem Programm etwas Struktur, indem wir die EVA Elemente als Kommentare einfügen.

    #aufgabe erstellen
    #aufgabe anzeigen
    #ergebnis berechnen
    #antwort abfragen
    #antwort bewerten
    #bewertung anzeigen

    Ein #Kommentar beginnt mit einem vorangestellten #-Symbol, und die restliche Textzeile kann beispielsweise Erklärungen enthalten, die nicht als Anweisung ausgeführt werden.
    Wir ergänzen zunächst nach jedem Kommentar den Programmcode, der dieser Aufgabe entspricht.

    Grundlagen Python: Bibliotheken (am Beispiel Zufallszahlen)

    Als nächstes benötigen wir für das Programm Zufallszahlen. Diese stehen nicht durch normale Funktionen zur Verfügung, sondern müssen aus einer sogenannten Bibliothek extern hinzugefügt werden.
    Die Zufallszahl generieren wir über den Befehl random. Da wir hier eine ganzzahlige Zahl zwischen 1 und 6 erwürfeln wollen, ergänzen wir den Befehl zu random.randint(1, 6).
    Wenn man das Programm mehrfach ausführt, wird jedes Mal eine neue Zufallszahl erzeugt (wobei mehrfach hintereinander dieselbe Zahl „ausgewürfelt“ werden kann). Gibt man zusätzlich den Befehl seed ein, erhält man immer dieselbe Reihenfolge von Zufallszahlen.

    import random
    
    zufallszahl=random.random() # Kommazahl zwischen 0 und 1
    print(f"Die Zufallszahl lautet {zufallszahl}")
    
    zufallszahl=random.randint(1,6) #Ganzzahl zwischen 1 und 6
    print(f"Du hast eine {zufallszahl} gewürfelt")
    
    random.seed(0)
    zufallszahl=random.randint(1,6)
    print(f"Du hast eine {zufallszahl} gewürfelt")
    
    random.seed(0)
    seed=random.randint(1,6)
    print(f"Du hast, wie beim ersten Wurf, wieder eine {seed} gewürfelt")

    Ein möglicher Ablauf könnte wie folgt aussehen

    Die Zufallszahl lautet 0.4271508357655378
    Du hast eine 6 gewürfelt
    Du hast eine 4 gewürfelt
    Du hast, wie beim ersten Wurf, wieder eine 4 gewürfelt

    Wir denken uns eine Aufgabe aus, indem wir zwei Zahlen zwischen 1 und 5 „würfeln“, die anschließend addiert werden sollen (so wird das Ergebnis höchsten 10 sein).

    Grundlagen Python: Verzweigungen

    Bisher wurden immer alle Befehle der Reihe nach ausgeführt, die im Programm aufgelistet wurden. Es ist jedoch in vielen Fällen notwendig zu prüfen, ob eine bestimmte Bedingung erfüllt ist (beispielsweise hier, ob eine Antwort korrekt ist) und nur dann die folgenden Befehle auszuführen. Sprachlich könnte man dies als „wenn… dann….“ ausdrücken. Dies wird in Python mit dem Schlüsselwort if gefolgt von der Bedingung und einem Doppelpunkt umgesetzt. Die Bedingung muss einen Wahrheitswert haben, also ein Boolean mit True (Befehle der Verzweigung werden ausgeführt) oder False. Die auszuführenden Befehle werden alle eingerückt, so dass optisch die Verzweigung vom restlichen Programm zu unterscheiden ist.
    Um Verwechslungen mit Wertezuweisungen von Variablen zu vermeiden, wird die Prüfung auf Gleichheit mit zwei Gleichheitszeichen geschrieben, Ungleichheit mit Ausrufe- und Gleichheitszeichen.

    ergebnis = 3
    eingabe = 2
    
    if ergebnis == eingabe:
      print("Eingabe ist richtig")
    if ergebnis != eingabe:
      print("Eingabe ist falsch")
    Eingabe ist falsch

    Nach if kann man auch else verwenden (ohne weitere Bedingung), wodurch alle anderen Fälle erfasst werden.

    if ergebnis == eingabe:
      print("Eingabe ist richtig")
    else:
      print("Eingabe ist falsch")
    Eingabe ist falsch

    Man kann Abfragen auch schachteln. Da bei den Abfragen nach einem Wahrheitsgehalt unterschieden wird, benutzen wir im folgenden True und False statt komplizierter Ausdrücke.

    if False:
      print("Dieser Text wird nicht angezeigt")
    else:
      if True:
        print("Dieser Text wird angezeigt")
      else:
        print("Dieser Text wird auch nicht angezeigt")
    Dieser Text wird angezeigt

    Außerdem gibt es das Schlüsselwort elif, von dem eins oder mehrere zwischen if und else stehen können und welches wie if eine bestimmte Abfrage übernimmt. Diese werden nacheinander abgefragt, solange nicht eine Bedingung erfüllt ist.

    if ergebnis < eingabe:
      if ergebnis == eingabe-1:
        print(eingabe,"ist ein wenig zu groß. Das richtige Ergebnis lautet", ergebnis)
      else:
        print(eingabe,"ist zu groß. Das richtige Ergebnis lautet", ergebnis)
    elif ergebnis > eingabe:
      print(eingabe,"ist zu klein. Das richtige Ergebnis lautet", ergebnis)
    else:
      print("Die Antwort ist richtig")
    4 ist ein wenig zu groß. Das richtige Ergebnis lautet 3

    Damit stellen wir nun die zweite Version des Programms fertig.

    Code Kopfrechnen 0.2

    #aufgabe erstellen
    import random
    a = random.randint(1, 5)
    b = random.randint(1, 5)
    
    #aufgabe anzeigen
    print ("Wieviel ist", a, "+", b, "?")
    
    #ergebnis berechnen
    ergebnis = a + b
    
    #antwort abfragen
    antwort = int(input("Dein Ergebnis = "))
    
    #antwort bewerten
    if antwort < ergebnis:
      #bewertung anzeigen
      print(antwort,"ist zu klein. Das richtige Ergebnis lautet", ergebnis)
    elif antwort > ergebnis:
      print(antwort,"ist zu groß. Das richtige Ergebnis lautet", ergebnis)
    else:
      print("Die Antwort ist richtig")

    Ein möglicher Ablauf könnte wie folgt aussehen

    Wieviel ist 4 + 1 ?
    Dein Ergebnis = 4
    4 ist zu klein. Das richtige Ergebnis lautet 5

    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/

  • Grundlagen Python (1/5): Variablen, Ausgabe, Eingabe

    Grundlagen Python (1/5): Variablen, Ausgabe, Eingabe

    Dieser Blog erklärt die Grundlagen der Programmiersprache Python anhand eines Projektes – ein Programm, mit dem sich Kopfrechnen trainieren lässt. 

    In zunächst fünf Entwicklungsstufen (auch Versionen genannt) wird das Programm schrittweise verbessert und um Funktionalitäten erweitert. Die Erweiterungen sind thematisch in kleinere Abschnitte gruppiert, um Neues zu vermitteln ohne den Gesamtüberblick zu verlieren.

    Die Kernpunkte der jeweiligen Version sind angegeben und mit GitHub verlinkt, um Code für eigene Projekte abspeichern zu können bzw. in Colab interaktiv auszuprobieren.

    In weiterführenden Programmversionen werden fortgeschrittene Programmiertechniken eingeführt, um Themen wie Data Science und künstliche Intelligenz zu bearbeiten.

    Kopfrechnen Version 0.1

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

    Am Programmierbeispiel lässt sich auch das sogenannte EVA Prinzip der elektronischen Datenverarbeitung erklären, bei dem 3 Elemente (in unterschiedlicher Reihenfolge) zusammenspielen

    • E: Eingabe (Zahlen, Buchstaben, Mausklick oder Touch)
    • V: Verarbeitung (die Algorithmen)
    • A: Ausgabe (Darstellung auf dem Monitor bzw. Display oder drucken, speichern, …).

    In dieser ersten Programmversion geht es darum, eine einfache Additionsaufgabe anzuzeigen und die Antwort des Benutzers abzufragen. Entsprechend wäre das EVA Prinzip hier:

    1. Das Programm erstellt eine Aufgabe (V)
    2. Das Programm zeigt die Aufgabe (A)
    3. Das Programm berechnet das Ergebnis (V)
    4. Das Programm fragt die Antwort ab (E)
    5. Das Programm zeigt die Antwort und das Ergebnis (A)

    Die benötigten Grundlagen werden zunächst theoretisch erklärt und an allgemeinen Beispielen demonstriert (diese geben über Bezug auf das Kopfrechenprogramm oft hinaus). Die Beispiele lassen sich anschaulich in einer interaktiven Umgebung wie Google Colab ausführen.

    Grundlagen Python: Variablen

    Zunächst eine kurze Einführung zu Variablen. Variablen kann man sich als Behälter vorstellen, die Informationen wie Zeichenketten (Texte), Zahlen oder Wahrheitswerte (wahr oder falsch) speichern. Zahlen werden unterteilt in Ganzzahlen (…, -2, -1, 0, 1, 2, …) und Kommazahlen (wobei als Trenner, wie im englischsprachigen Raum üblich, ein Punkt statt ein Komma benutzt wird). Text wird als String gespeichert, Ganzzahlen als Integer, Kommazahlen als Float und Wahrheitswerte als Boolean.

    text = „Hallo Welt“
    ganzzahl = 1
    kommazahl = 3.14
    wahr = True

    Grundlagen Python: Ausgabe

    Für das Programm benötigen wir noch grundlegende Funktionen zur Ein- und Ausgabe.
    Die Ausgabe erfolgt mit der Funktion `print()`. In der Klammer können Texte, Variablen und Steuerzeichen angegeben werden, die beim Erreichen durch das Programm angezeigt werden (eine leere Klammer führt zu einem Zeilenumbruch). 

    print(„Hallo Welt“)

    print()

    print(text)

    print("Hallo Welt")
    print()
    
    print(text)
    • Texte können in in einfachen oder doppelten Anführungsstrichen stehen, aber nicht gemischt (außer, man möchte Anführungsstriche in einem Text anzeigen)
    • Variablen können aus Text und Zahlen bestehen
    • Das Steuerzeichen /n führt zu einen Zeilenumbruch
    • Mehrere Texte und Variablen können durch Kommata zusammengefügt werden, wobei automatisch ein Leerzeichen eingesetzt wird
    • mit der Methode .format lassen sich Variablen in geschweiften Klammern angeben, die mit Null beginnend hochgezählt werden
    • wird ein f hinter die geöffnete Klammer geschrieben, lassen sich Variablennamen direkt in geschweiften Klammern eintragen
    • Texte lassen sich auch mit den mathematischen Funktionen + und * duplizieren (auch hier gilt Punkt- vor Strichrechnung)

    Tipp: Einfach mal ablaufen lassen und die Einträge modifizieren, um sich mit der Funktion vertraut zu machen

    print("Hallo", text, "\nmit Zeilenumbruch")
    print()
    
    print('Hallo "Welt"')
    print()
    
    print(f"Hallo {text}!")
    print(f"Der Wert von Pi beträgt ungefähr {kommazahl},\nPi^2 ist ungefähr {kommazahl*kommazahl}")
    print("{} + {} ist unfähr {}".format(2, ganzzahl, kommazahl))
    print()
    
    form = "*"
    print("Hier ein paar Formen:")
    
    print(form+form)
    print(form+5form) print(50form)
    print()
    
    bruch=10/7
    print(f"normales Float: {bruch:f}")
    print(f"Float formatiert (10 Nachkommastellen): {bruch:.10f}")
    print(f"Float formatiert (5 Vor- und 5 Nachkommastellen): {bruch:10.5f}")
    print(f"Exponential: {bruch:e}")
    print(f"Prozentual: {bruch:%}")
    print()
    
    print("Steuer- und Sonderzeichen mit vorangestelltem Slash (), z.B. \'")

    Grundlagen Python: Eingabe

    Die Eingabe erfolgt über `input()`, wobei dieser Wert einer Variablen zugewiesen wird, genauer gesagt ein String (Zeichenkette). Zusätzlich kann in Klammern, analog zu `print()`, eine Information vor der eigentlichen Abfrage ausgegeben werden (diese darf jedoch nicht aus zusammengesetzten Elementen bestehen).

    Wenn die Eingabe als Zahl interpretiert werden soll, muss sie entsprechend umgewandelt werden (die Schlüsselwörter sind hier `int` für eine Ganzzahl und `float` für eine Kommazahl). Leereingaben sowie nicht-Zahlen (außer wissenschaftliche Notationen wie `1e3`) führen zu einem Fehler. Wie wir solch einen Fehler abfangen, lernen wir in einem späteren Revision.

    print("Bitte einen Text eingeben")
    eingabe = input()
    print("Dein Text:", eingabe)
    print()
    
    zahl = int(input("Deine Lieblingsganzzahl = "))
    print(zahl)
    print()
    
    text = "Deine Lieblingskommazahl (bitte mit Punkt eingeben) = "
    zahl = float(input(text))
    print(zahl)

    Damit können wir nun die erste Version des Programms fertigstellen.

    Code Kopfrechnen 0.1

    a = 3
    b = 5
    
    print ("Wieviel ist", a, "+", b, "?")
    
    ergebnis = a + b
    
    antwort = int(input("Dein Ergebnis = "))
    
    print(f"Deine Antwort war {antwort}. Das richtige Ergebnis lautet {ergebnis}")

    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/