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/02 06:58] 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 54: | Line 54: | ||
Hinweis: wenn '' | Hinweis: wenn '' | ||
+ | |||
+ | <hidden Lösungsvorschlag> | ||
+ | <code python> | ||
+ | import sys | ||
+ | voci = [ ["ein Byte", "un octet" | ||
+ | |||
+ | # Wiederholen, | ||
+ | for paar in voci: | ||
+ | ok = False # Benutzer hat noch nicht richtig geantwortet | ||
+ | anzahlfehler = 0 # Für dieses Wort, noch keinen Fehler | ||
+ | while not ok: | ||
+ | # Wort auf Deutsch anzeigen | ||
+ | print(f" | ||
+ | if anzahlfehler> | ||
+ | print(f" | ||
+ | # Eingabe vom Benutzer einlesen (Zeilenumbruch abschneiden mit strip) | ||
+ | eingabe = sys.stdin.readline().strip() | ||
+ | |||
+ | if eingabe==paar[1]: | ||
+ | ok = True # Damit wird die Schleife dann beendet | ||
+ | else: | ||
+ | anzahlfehler = anzahlfehler + 1 # Fehlerzähler erhöhen | ||
+ | </ | ||
+ | </ | ||
</ | </ | ||
Line 85: | Line 109: | ||
{" | {" | ||
{" | {" | ||
- | with open(" | + | with open(" |
- | f.write(json.dumps(voci, | + | f.write(json.dumps(voci, |
f.write(" | f.write(" | ||
</ | </ | ||
Line 97: | Line 121: | ||
<code python> | <code python> | ||
import json | import json | ||
- | with open(" | + | with open(" |
- | voci = json.loads(f.read()) | + | voci = json.loads(f.read()) |
+ | |||
+ | # Jetzt kann mit der Variablen voci wie vorhin gearbeitet werden: | ||
print(voci) | print(voci) | ||
</ | </ | ||
Line 131: | Line 157: | ||
</ | </ | ||
+ | |||
+ | <hidden Lösungsvorschlag> | ||
+ | <code pyton voci-mit-dict-von-datei.py> | ||
+ | import sys | ||
+ | import os | ||
+ | import json | ||
+ | |||
+ | ################## | ||
+ | # 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()) | ||
+ | |||
+ | ########## | ||
+ | # Lernen # | ||
+ | ########## | ||
+ | |||
+ | # Wiederholen, | ||
+ | for paar in voci: | ||
+ | ok = False # Benutzer hat noch nicht richtig geantwortet | ||
+ | anzahlfehler = 0 | ||
+ | while not ok: | ||
+ | # Wort auf Deutsch anzeigen | ||
+ | print(f" | ||
+ | if anzahlfehler> | ||
+ | print(f" | ||
+ | # Eingabe vom Benutzer | ||
+ | eingabe = sys.stdin.readline().strip() | ||
+ | |||
+ | if eingabe==paar[' | ||
+ | ok = True | ||
+ | else: | ||
+ | anzahlfehler = anzahlfehler + 1 | ||
+ | </ | ||
+ | </ | ||
====== Intelligenteres Abfragen ====== | ====== Intelligenteres Abfragen ====== | ||
Wörter, die man schon gut kann, sollten nicht (oder kaum) abgefragt werden. Andere sollten hingegen häufiger abgefragt werden. Auch sollte die Reihenfolge der Wörter zufällig sein. | Wörter, die man schon gut kann, sollten nicht (oder kaum) abgefragt werden. Andere sollten hingegen häufiger abgefragt werden. Auch sollte die Reihenfolge der Wörter zufällig sein. | ||
Line 136: | Line 208: | ||
Dazu gibt es verschiedenste Ansätze. Ein ganz einfacher ist folgender: | Dazu gibt es verschiedenste Ansätze. Ein ganz einfacher ist folgender: | ||
* Zu jedem Wortpaar wird zusätzlich ein Score '' | * Zu jedem Wortpaar wird zusätzlich ein Score '' | ||
- | * Gestartet wird bei 0 | + | * Ganz am Anfang sind alle Scores |
* Hat man das Wort richtig, wird '' | * Hat man das Wort richtig, wird '' | ||
* Hat man das Wort falsch, wird '' | * Hat man das Wort falsch, wird '' | ||
Line 164: | 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 176: | 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, | ||
+ | </ | ||
+ | </ | ||