lehrkraefte:blc:informatik:glf22:python:woertlitrainer

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
lehrkraefte:blc:informatik:glf22:python:woertlitrainer [2022/12/12 09:33]
Ivo Blöchliger [Besserer Programmierstil]
lehrkraefte:blc:informatik:glf22:python:woertlitrainer [2022/12/16 07:02] (current)
Ivo Blöchliger [Python Snippets]
Line 236: Line 236:
 for i in range(10):  # 10 mal wiederholen, zum Testen for i in range(10):  # 10 mal wiederholen, zum Testen
     # Vokabular sortieren, wobei ein Eintrag mit score+zufallszahl bewertet wird:     # Vokabular sortieren, wobei ein Eintrag mit score+zufallszahl bewertet wird:
-    voci = sorted(voci, key = lambda eintrag: eintrag['s']+random.random())+    voci.sort(key = lambda eintrag: eintrag['s']+random.random())
     print(f"Erster Eintrag ist jetzt: {voci[0]}")     print(f"Erster Eintrag ist jetzt: {voci[0]}")
 </code> </code>
Line 333: Line 333:
 daten_speichern(voci, datei) daten_speichern(voci, datei)
 </code> </code>
 +
 +Dazu gibt es einen [[https://fginfo.ksbg.ch/~ivo/videos/informatik/22-23/09-woertli-trainer-refactoring.mp4|Screencast]], oder als [[https://bldsg-my.sharepoint.com/:v:/g/personal/ivo_bloechliger_ksbg_ch/EcT9M_iPJspIrRz0shkQa54BrZ2OdumLJKvhopAFmU3Bnw?e=bpmcYw|SharePoint-Stream]] (neu auch für jeden Internauten, zumindest für 18 Monate)
  
 <hidden Lösungsvorschlag> <hidden Lösungsvorschlag>
-<code python voci-v2.py>+<code python voci-refactored.py>
 import sys  import sys 
 import os import os
Line 341: Line 343:
 import random import random
  
 +##################
 +# Daten einlesen #
 +##################
  
 +def dateinamen_bestimmen():
 +    datei = "voci.json"
 +    if len(sys.argv)>1:  # Falls es ein zusätzliches Kommandozeilenargument gibt
 +        datei = sys.argv[1]
 +    print(f"Versuche Daten aus der Datei {datei} einzulesen")
 +    if not os.path.exists(datei):   # Falls die Datei nicht existiert, abbrechen
 +        print(f"Sorry, die Datei {datei} existiert nicht!")
 +        exit(-1)  # Abbruch mit Fehler
 +    return datei
  
-def wort_bestimmen(voci): 
-    voci.sort(key = lambda eintrag: eintrag['s']+random.random()) 
-    # Aktuelles paar ist das erste in der Liste 
-    return voci[0] 
  
 +def scores_hinzufuegen(voci):
 +    for paar in voci:
 +        if not "s" in paar:  # Gibt es den Schlüssel s bereits? Falls nein, hinzufügen.
 +            paar["s"] = 0
  
-def wort_abfragen(paar, anzahlfehler): + 
-        print(f"Übersetze: {paar['d']}     (score {paar['s']})"+def daten_einlesen(): 
-        if anzahlfehler>2: +    # Datei bestimmen (default oder von der Kommandozeile) 
-            print(f"   Hinweis: {paar['f']}"+    dateinamen = dateinamen_bestimmen() 
-        # Eingabe vom Benutzer +    # Daten einlesen 
-        eingabe = sys.stdin.readline().strip() +    with open(dateinamen, "r") as f:   # Datei zum Lesen (read) öffnen 
-        return eingabe+        voci = json.loads(f.read())       # Inhalt lesen, interpretieren und in die Variable voci speichern. 
 +    # Scores hinzufügen, falls nötig 
 +    scores_hinzufuegen(voci) 
 +    return voci, dateinamen 
 + 
 + 
 +########## 
 +# Lernen # 
 +########## 
 + 
 +def hole_eingabe(paar, anzahlfehler): 
 +    # Wort auf Deutsch anzeigen 
 +    print(f"Übersetze: {paar['d']}     (score {paar['s']})"
 +    if anzahlfehler>2: 
 +        print(f"   Hinweis: {paar['f']}"
 +    # Eingabe vom Benutzer 
 +    return sys.stdin.readline().strip()
  
  
 def wort_korrekt(eingabe, paar, anzahlfehler): def wort_korrekt(eingabe, paar, anzahlfehler):
-    if (eingabe!=paar['f'])+    if eingabe != paar['f']: 
-        return False # Funktion sofort beenden. +        return False   # Funktion sofort beenden 
-    # Also ist die eingabe korrekt, kein if nötig, weil return die Funktion beendet+    # Eingabe ist korrekt
     if anzahlfehler>1:     if anzahlfehler>1:
         paar['s'] -= 1         paar['s'] -= 1
         if (paar['s']<0):         if (paar['s']<0):
             paar['s']=0             paar['s']=0
-        return True  # Funktion beenden +        return True 
-    # Weniger als zwei Fehler, also Score nach oben anpassen +    paar['s'] += 2 - anzahlfehler
-    paar['s'] += 2-anzahlfehler+
     return True     return True
  
  
-def wort_lernen(paar): +def wort_abfragen(paar):
-    """Liefert True, wenn das Programm abgebrochen werden soll. Sonst False."""+
     anzahlfehler = 0     anzahlfehler = 0
-    while True:  # Endlosschleife +    while True:  # Endlos Schleife 
-        eingabe = wort_abfragen(paar, anzahlfehler)+        eingabe = hole_eingabe(paar, anzahlfehler)
         if eingabe=="x":         if eingabe=="x":
-            return True   # Fertig, mit Programmabbruch+            return True   # Programmabbruch
         if wort_korrekt(eingabe, paar, anzahlfehler):         if wort_korrekt(eingabe, paar, anzahlfehler):
-            return False  # Fertig ohne Programmabbruch+            return False  # Wort korrekt, aber Programm nicht beenden
         anzahlfehler = anzahlfehler + 1         anzahlfehler = anzahlfehler + 1
 +
 +
 +def wort_bestimmen(voci):
 +    voci.sort(key = lambda eintrag: eintrag['s']+random.random())
 +    # Aktuelles paar ist das erste in der Liste
 +    return voci[0]
  
  
 def abfragen(voci): def abfragen(voci):
-    """Abfragen, bis der Benutzer das Programm beendet""" +    while True: # Endlosschleife
-    while True:+
         paar = wort_bestimmen(voci)         paar = wort_bestimmen(voci)
-        programmAbbruch = wort_lernen(paar)+        programmAbbruch = wort_abfragen(paar)
         if programmAbbruch:         if programmAbbruch:
-            break+            return
  
  
-def dateinamen_bestimmen(): +def daten_speichern(voci, dateinamen): 
-    datei = "voci.json" +    with open(dateinamen, "w") as f:   # Datei zum Schreiben (write) öffnen
-    if len(sys.argv)>1:  # Falls es ein zusätzliches Kommandozeilenargument gibt +
-        datei = sys.argv[1] +
-    print(f"Versuche Daten aus der Datei {datei} einzulesen"+
-    if not os.path.exists(datei):   # Falls die Datei nicht existiert, abbrechen +
-        print(f"Sorry, die Datei {datei} existiert nicht!"+
-        exit(-1)  # Abbruch mit Fehler +
-    return datei +
- +
- +
-def scores_hinzufuegen(voci): +
-    for paar in voci: +
-        if not "s" in paar:  # Gibt es den Schlüssel s bereits? Falls nein, hinzufügen. +
-            paar["s"] = 0 +
- +
- +
-def daten_einlesen(): +
-    """Daten einlesen, entweder aus Standarddatei voci.json oder von der Kommandozeile.""" +
-    datei = dateinamen_bestimmen() +
-    # Daten einlesen +
-    with open(datei, "r") as f:   # Datei zum Lesen (read) öffnen +
-        voci = json.loads(f.read())       # Inhalt lesen, interpretieren und in die Variable voci speichern. +
-    scores_hinzufuegen(voci) +
-    return voci, datei +
- +
- +
-def daten_speichern(voci, datei): +
-    """Speichert die Daten im JSON-Format in den gegebenen Dateinamen""" +
-    with open(datei, "w") as f:   # Datei zum Schreiben (write) öffnen+
         f.write(json.dumps(voci, indent=2))    # Daten in Datei schreiben         f.write(json.dumps(voci, indent=2))    # Daten in Datei schreiben
         f.write("\n")         f.write("\n")
-    print("Daten gespeichert") 
  
-##################### 
-### Hauptprogramm ### 
-##################### 
  
-voci, datei = daten_einlesen()+voci, dateiname = daten_einlesen()
 abfragen(voci) abfragen(voci)
-daten_speichern(voci, datei)+daten_speichern(voci, dateiname)
 </code> </code>
 </hidden> </hidden>
  
  • lehrkraefte/blc/informatik/glf22/python/woertlitrainer.1670834002.txt.gz
  • Last modified: 2022/12/12 09:33
  • by Ivo Blöchliger