Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
lehrkraefte:blc:informatik:glf22:python:woertlitrainer [2022/12/12 08:48] Ivo Blöchliger [Frei wählbare Datei] |
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): | for i in range(10): | ||
# 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[' | + | voci.sort(key = lambda eintrag: eintrag[' |
print(f" | print(f" | ||
</ | </ | ||
Line 248: | Line 248: | ||
* Wenn das Programm beendet wird, sollen die Daten wieder geschrieben werden, damit die Scores erhalten bleiben. | * Wenn das Programm beendet wird, sollen die Daten wieder geschrieben werden, damit die Scores erhalten bleiben. | ||
* Erstellen Sie eine JSON-Datei mit dem aktuellen Französisch-Vokubular (gerne auch kollaborativ, | * Erstellen Sie eine JSON-Datei mit dem aktuellen Französisch-Vokubular (gerne auch kollaborativ, | ||
+ | |||
+ | <hidden Lösungsvorschlag> | ||
+ | <code python voci-v1.py> | ||
+ | import sys | ||
+ | import os | ||
+ | import json | ||
+ | import random | ||
+ | |||
+ | ################## | ||
+ | # Daten einlesen # | ||
+ | ################## | ||
+ | |||
+ | # Datei bestimmen (default oder von der Kommandozeile) | ||
+ | datei = " | ||
+ | if len(sys.argv)> | ||
+ | datei = sys.argv[1] | ||
+ | print(f" | ||
+ | if not os.path.exists(datei): | ||
+ | print(f" | ||
+ | exit(-1) | ||
+ | |||
+ | # Daten einlesen | ||
+ | with open(datei, " | ||
+ | voci = json.loads(f.read()) | ||
+ | |||
+ | # Scores hinzufügen, | ||
+ | for paar in voci: | ||
+ | if not " | ||
+ | paar[" | ||
+ | |||
+ | ########## | ||
+ | # Lernen # | ||
+ | ########## | ||
+ | |||
+ | # Wiederholen, | ||
+ | programmEnde = False | ||
+ | print(" | ||
+ | while not programmEnde: | ||
+ | # Wörter Sortieren: | ||
+ | voci = sorted(voci, | ||
+ | # Aktuelles paar ist das erste in der Liste | ||
+ | paar = voci[0] | ||
+ | # Abfrage vorbereiten | ||
+ | ok = False # Benutzer hat noch nicht richtig geantwortet | ||
+ | anzahlfehler = 0 | ||
+ | while not ok: # Wiederholen, | ||
+ | # Wort auf Deutsch anzeigen | ||
+ | print(f" | ||
+ | if anzahlfehler> | ||
+ | print(f" | ||
+ | # Eingabe vom Benutzer | ||
+ | eingabe = sys.stdin.readline().strip() | ||
+ | if eingabe==" | ||
+ | programmEnde = True | ||
+ | break # innere while-Schlaufe verlassen | ||
+ | |||
+ | if eingabe==paar[' | ||
+ | ok = True | ||
+ | if anzahlfehler==0: | ||
+ | paar[' | ||
+ | elif anzahlfehler==1: | ||
+ | paar[' | ||
+ | else: | ||
+ | paar[' | ||
+ | if (paar[' | ||
+ | paar[' | ||
+ | else: | ||
+ | anzahlfehler = anzahlfehler + 1 | ||
+ | |||
+ | # Daten speichern: | ||
+ | with open(datei, " | ||
+ | f.write(json.dumps(voci, | ||
+ | f.write(" | ||
+ | </ | ||
+ | </ | ||
</ | </ | ||
+ | ====== Besserer Programmierstil ====== | ||
+ | Im Moment ist das Programm ein schon ziemlich unübersichtlicher Klumpen. Um das Programm übersichtlicher zu gestalten, werden wir einzelne Programmteile in Funktionen auslagern, damit das Programm am Schluss in 3 Zeilen passt: | ||
+ | |||
+ | <code python> | ||
+ | voci, datei = daten_einlesen() | ||
+ | abfragen(voci) | ||
+ | daten_speichern(voci, | ||
+ | </ | ||
+ | |||
+ | Dazu gibt es einen [[https:// | ||
+ | |||
+ | <hidden Lösungsvorschlag> | ||
+ | <code python voci-refactored.py> | ||
+ | import sys | ||
+ | import os | ||
+ | import json | ||
+ | import random | ||
+ | |||
+ | ################## | ||
+ | # Daten einlesen # | ||
+ | ################## | ||
+ | |||
+ | def dateinamen_bestimmen(): | ||
+ | datei = " | ||
+ | if len(sys.argv)> | ||
+ | datei = sys.argv[1] | ||
+ | print(f" | ||
+ | if not os.path.exists(datei): | ||
+ | print(f" | ||
+ | exit(-1) | ||
+ | return datei | ||
+ | |||
+ | |||
+ | def scores_hinzufuegen(voci): | ||
+ | for paar in voci: | ||
+ | if not " | ||
+ | paar[" | ||
+ | |||
+ | |||
+ | def daten_einlesen(): | ||
+ | # Datei bestimmen (default oder von der Kommandozeile) | ||
+ | dateinamen = dateinamen_bestimmen() | ||
+ | # Daten einlesen | ||
+ | with open(dateinamen, | ||
+ | voci = json.loads(f.read()) | ||
+ | # Scores hinzufügen, | ||
+ | scores_hinzufuegen(voci) | ||
+ | return voci, dateinamen | ||
+ | |||
+ | |||
+ | ########## | ||
+ | # Lernen # | ||
+ | ########## | ||
+ | |||
+ | def hole_eingabe(paar, | ||
+ | # Wort auf Deutsch anzeigen | ||
+ | print(f" | ||
+ | if anzahlfehler> | ||
+ | print(f" | ||
+ | # Eingabe vom Benutzer | ||
+ | return sys.stdin.readline().strip() | ||
+ | |||
+ | |||
+ | def wort_korrekt(eingabe, | ||
+ | if eingabe != paar[' | ||
+ | return False # Funktion sofort beenden | ||
+ | # Eingabe ist korrekt | ||
+ | if anzahlfehler> | ||
+ | paar[' | ||
+ | if (paar[' | ||
+ | paar[' | ||
+ | return True | ||
+ | paar[' | ||
+ | return True | ||
+ | |||
+ | |||
+ | def wort_abfragen(paar): | ||
+ | anzahlfehler = 0 | ||
+ | while True: # Endlos Schleife | ||
+ | eingabe = hole_eingabe(paar, | ||
+ | if eingabe==" | ||
+ | return True # Programmabbruch | ||
+ | if wort_korrekt(eingabe, | ||
+ | return False # Wort korrekt, aber Programm nicht beenden | ||
+ | anzahlfehler = anzahlfehler + 1 | ||
+ | |||
+ | |||
+ | def wort_bestimmen(voci): | ||
+ | voci.sort(key = lambda eintrag: eintrag[' | ||
+ | # Aktuelles paar ist das erste in der Liste | ||
+ | return voci[0] | ||
+ | |||
+ | |||
+ | def abfragen(voci): | ||
+ | while True: # Endlosschleife | ||
+ | paar = wort_bestimmen(voci) | ||
+ | programmAbbruch = wort_abfragen(paar) | ||
+ | if programmAbbruch: | ||
+ | return | ||
+ | |||
+ | |||
+ | def daten_speichern(voci, | ||
+ | with open(dateinamen, | ||
+ | f.write(json.dumps(voci, | ||
+ | f.write(" | ||
+ | |||
+ | |||
+ | voci, dateiname = daten_einlesen() | ||
+ | abfragen(voci) | ||
+ | daten_speichern(voci, | ||
+ | </ | ||
+ | </ | ||