Nach etwas fragen ohne es umzudefinieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
erik32547
User
Beiträge: 4
Registriert: Donnerstag 3. September 2015, 21:13

Ich würde gerne nach etwas fragen, ohne es umzudefinieren, also zum Beispiel:

wort1 = gut
wort1a = nice

Und jetzt würde ich nach wort1 fragen und die antwort darauf soll wort1a sein. Wenn die antwort falsch ist, sollen aber wort1 und wort1a nicht verändert werden.
Das Programm soll mir beim Vokabeln lernen helfen :)
BlackJack

@erik32547: Die Frage ist mir ehrlich gesagt nicht ganz klar. Wenn Du die Namen nicht neu definieren willst, dann tu das doch einfach nicht.

Was soll die 1 in dem Namen? Gibt es auch einen mit einer 2? Am Ende sogar noch welche mit 3 und anderen Ziffern? Dann machst Du ziemlich sicher etwas falsch.
Benutzeravatar
sparrow
User
Beiträge: 4599
Registriert: Freitag 17. April 2009, 10:28

Was BlackJack meint ist:
Du möchtest keine Variablennamen nummerieren. Immer wenn du damit anfangen willst, möchtest du eigentlich eine Datenstruktur nehmen. Eine Liste, ein Tuple oder ein Dictionary.
erik32547
User
Beiträge: 4
Registriert: Donnerstag 3. September 2015, 21:13

BlackJack hat geschrieben:@erik32547: Die Frage ist mir ehrlich gesagt nicht ganz klar. Wenn Du die Namen nicht neu definieren willst, dann tu das doch einfach nicht.

Was soll die 1 in dem Namen? Gibt es auch einen mit einer 2? Am Ende sogar noch welche mit 3 und anderen Ziffern? Dann machst Du ziemlich sicher etwas falsch.
Ich bin ehrlich gesagt noch Anfänger (hätte bestimmt keiner gedacht) und kenne mich dementsprechend nicht gut aus. Ich möchte ein Programm schreiben mit dem Ich vokabeln lernen kann, nach folgendem muster: Ich definiere erst einmal wort1 als die Erste Sprache (Beispiel wort :,,gut") und mit wort1a dann die andere Sprache (Beispiel wort: ,,nice''), diese werden einer liste hinzugefügt. Dann möchte ich sobald ich alle vokabeln in der Liste habe diese abfragen. Also wenn ich dann z.B nach wort1a (nice) frage, soll die antwort wort1 (gut) sein. Wenn die antwort richtig ist sollen beide Vokabeln in eine andere Liste gesteckt werden und das solange bis die Finale liste erreicht ist in denen die Vokabeln sind die ich dann (wahrscheinlich) kann. Bei falschen antworten genau anders rum.
Tut mit leid für die wahrscheinlich blöde frage :?
BlackJack

@erik32547: Aber was soll die 1 dann in den Namen? Bessere Namen wären `word` und `translation`. Also unter der Voraussetzung dass der Benutzer an der Stelle die Worte eingibt. Denn wenn Du die fest im Programm angibst, dann brauchst Du keine Namen sondern kannst ja gleich eine literale Liste mit den Vokabeln schreiben: ``vocabulary = [('Haus', 'house'), ('Auto', 'car'), ('Papagei', 'parrot'), …]``

Und ich verstehe immer noch nicht wo genau das Problem liegt‽ Welchen Code hast Du und was funktioniert daran nicht?
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Ich würde die Aufgabe folgendermaßen angehen:

1. Schreibe die Vokabeln in eine CSV-Datei:

Code: Alles auswählen

nice; gut
Nimm als Trennzeichen aber nicht ein Komma, sondern ein Semikolon, das Komma brauchst Du, wenn es für das gleiche Wort mehrere Bedeutungen gibt.
2. Lese die Datei ein, teile jede Zeile in zwei Strings auf: englisch, deutsch
3. Stecke die Strings englisch, deutsch in ein Dictionary, benutze deutsch als Key und englisch als value
4. Frage die Keys in zufälliger Reihenfolge ab, vergleiche die Benutzereingabe mit dem zum Key zugehörigen Value, wenn's stimmt entferne das Key-Value-Paar aus dem Dictionary, wenn's nicht stimmt, frage den nächsten Key ab.
5. Wenn Du alle Keys durch hast, fang bei 4. mit dem hoffentlich schon etwas kleinerem Dictionary wieder neu an.
6. Vokabeln die Du auch bei der 2.Abfrage nicht kannst sollten in einer CSV-Datei rausgeschrieben werden

Hierfür brauchst Du
  • Dateien lesen und schreiben
  • Dictionary
  • Schleifen
  • zufällige Reihenfolge
  • Benutzereingaben
Das findest Du alles in "Einstieg in Python" von Thomas Theis (http://www.amazon.de/gp/product/3836228610).
Wenn Software-Entwicklung Musik wäre, dann wäre das ein Blockflöten-Grundkurs.
a fool with a tool is still a fool, www.magben.de, YouTube
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Meinst Du so?

Code: Alles auswählen

wort1 = "gut"
wort1a = "nice"

falsch = True

while falsch:
    if  input(wort1+"? ") == wort1a:
        print("richtig")
        falsch=False
    else:
        print("falsch")
Besser ist allerdings:

Code: Alles auswählen

def check(wort1,wort1a):
    falsch = True
    while falsch:
        if  input(wort1+"? ") == wort1a:
            print("richtig")
            falsch=False
        else:
            print("falsch")

check("gut","nice")
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

"besser" mag die zweite Variante vielleicht sein, aber schlecht ist sie immer noch. Ein Routine die check heißt sollte nicht gleichzeitig eine Eingabe vom Nutzer verlangen. Prinzipiell sollte immer eine Trennung von Eingabe/Ausgabe und eigentlicher Programmlogik vorgenommen werden. Zudem ist das while falsch extrem hässlich. Man würde dort while True verwenden und bei Bedarf mit break die Schleife verlassen.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@/me Eingabe Logik und Ausgabe sind doch getrennt:

Code: Alles auswählen

        if  input(wort1+"? ") == wort1a:
            print("richtig")
input ist die Eingaberoutine, if == ist die Logik und print ist die Ausgaberoutine. Also eine klare Trennung

Aber kürzer ist der Code so:

Code: Alles auswählen

def ask_and_check(wort1,wort1a):
    while input(wort1+"? ") != wort1a: print("falsch")
    print("richtig")
    
ask_and_check("gut","nice")
Zuletzt geändert von Alfons Mittelmeyer am Donnerstag 24. September 2015, 10:56, insgesamt 1-mal geändert.
Benutzeravatar
sparrow
User
Beiträge: 4599
Registriert: Freitag 17. April 2009, 10:28

Nee. Wenn man etwas zusammen in eine Funktion klatscht, dann ist das eben nicht getrennt.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@sparrow Wenn Du meinst:

Code: Alles auswählen

def eingabe(a): return input(a)
def ausgabe(a): print(a)
def stimmt(a,b): return a == b

def ask_and_check(wort1,wort1a):
    while not stimmt(eingabe(wort1+"? "),wort1a): ausgabe("falsch")
    ausgabe("richtig")
    
ask_and_check("gut","nice")
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Schon mal Vokabeln abgefragt? Da gibt es keine Endlosschleifen, man hat einen Versuch, höchstens zwei und danach wird die gesuchte Vokabel genannt und später in einer zweiten Runde erneut abgefragt.

Das

Code: Alles auswählen

def eingabe(a): return input(a)
def ausgabe(a): print(a)
geht auch kürzer:

Code: Alles auswählen

eingabe = input
ausgabe = print
a fool with a tool is still a fool, www.magben.de, YouTube
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

MagBen hat geschrieben:Schon mal Vokabeln abgefragt? Da gibt es keine Endlosschleifen, man hat einen Versuch, höchstens zwei und danach wird die gesuchte Vokabel genannt und später in einer zweiten Runde erneut abgefragt.
Ich will ja auch kein Vokabelprogramm schreiben. Wichtig ist doch nur dabei, dass die Wörter nicht verändert werden. Stell Dir nur vor, der User erik32547 würde sich für eine Datenbank entscheiden. Und wenn jemand dann falsche Eingaben macht, würden plötzliche falsche Wörter in der Datenbank stehen. Das wäre doch schlimm oder? Wenn man die Wörter als Parameter einzeln übergibt, passiert normalerweise nichts dabei. Sehr sicher wäre auch ein Tupel, aber vor einer Liste oder gar einem Dictionary muss man sich hüten.

Ins Auge könnte gehen:

Code: Alles auswählen

Dictionary[wort1] = input(wort1+"? ")
So etwas sollte man vermeiden! Und wenn nicht, dann das Dictionary zumindest nicht nachher wieder auf der Festplatte abspeichern.
Zuletzt geändert von Alfons Mittelmeyer am Donnerstag 24. September 2015, 11:57, insgesamt 1-mal geändert.
Benutzeravatar
sparrow
User
Beiträge: 4599
Registriert: Freitag 17. April 2009, 10:28

Alfons, du schreibst großen Unsinn.

Etwas verändern tut sich bei Python in der Regel nur, wenn man das auch entsprechend vornimmt. Dann ist es egal. Hüten muss man sich vor gar keiner Datenstruktur. Meine Güte.

Und das deine Coderaktion auf den Einwurf, dass man das trennen soll Mist war, hast du bestimmt schon beim Tippen gemerkt.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@sparrow Natürlich muss man sich vor Datenstrukturen hüten, bzw. aufpassen, dass man sie richtig benützt. Hier etwa ist ein kleiner Fehler drin. Aber schon ist es passiert:

Code: Alles auswählen

import json

with open('english_dictionary') as data_file:    
    myDictionary = json.load(data_file)
    
ask_english(wort1,dictionary):
    while True:
        wort1a = dictionary[wort1]
        dictionary[wort1] = input(wort1+"? ")
        if dictionary[wort1] == wort1a:
            print("richtig")
            break
        print("falsch")
        
ask_english('gut',myDictionary)
ask_english('schön',myDictionary)

with open('english_dictionary','w') as data_file:    
    json.dump(myDictionary,data_file)
Und genau darum ging es doch bei dem Problem, dass eine falsche Eingabe nicht das Wort verändert. Und die Lösung ist: es einfach nicht so machen, wie in diesem Beispiel.

Also die Eingabe einfach nur vergleichen. Und mit der Eingabe weder wort1 noch wort1a überschreiben. Erst recht nicht die falsche Eingabe in ein Dictionary schreiben und gleich gar nicht das Dictionary noch abspeichern.
Zuletzt geändert von Alfons Mittelmeyer am Donnerstag 24. September 2015, 12:37, insgesamt 2-mal geändert.
Benutzeravatar
sparrow
User
Beiträge: 4599
Registriert: Freitag 17. April 2009, 10:28

Äh ja... wenn man einen Wert in einem Dictionary ändert. Dann ist der halt anders. Das ist ja der Sinn der Sache.
Man muss sich also keinesfalls davor hüten die richtige Datenstruktur zu benutzen, man muss sie nur richtig verwenden.
Nach dem was du schreibst darfst du auch keine Tuple verwenden. Ach was sag ich, überhaupt keine Variablen, denn die Zuweisung kannst du ja immer überschreiben, ändern, löschen, was auch immer.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

Alfons Mittelmeyer hat geschrieben:Ich will ja auch kein Vokabelprogramm schreiben.
Was Du willst, ist doch völlig egal. Der OP will ein Vokabelprogramm schreiben, also hör auf, seine Thread hier mit Quark zuzumüllen. Keiner Deiner Beiträge in diesem Thread enthält etwas, das den OP weiterbringt.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Sirius3 hat geschrieben:
Alfons Mittelmeyer hat geschrieben:Ich will ja auch kein Vokabelprogramm schreiben.
Was Du willst, ist doch völlig egal. Der OP will ein Vokabelprogramm schreiben, also hör auf, seine Thread hier mit Quark zuzumüllen. Keiner Deiner Beiträge in diesem Thread enthält etwas, das den OP weiterbringt.
Willst Du in diesem Thread nur stänkern? Oder was soll das sein:

- Was Du willst, ist doch völlig egal
- also hör auf, seine Thread hier mit Quark zuzumüllen
- Keiner Deiner Beiträge in diesem Thread enthält etwas, das den OP weiterbringt.

Hör auf hier zu stänkern. Schau Dir lieber an, was der OP will. Und zuerst will er einmal Vokabeln. Und genau dafür habe ich bereits Anregungen gegeben. Brauchst Dir nur den letzten Beitrag anschauen. Und wenn man den abwandelt hat man das:

Code: Alles auswählen

import json

#with open('english_dictionary') as data_file:    
#    EnglishDictionary = json.load(data_file)
    
EnglishDictionary = {}

newDictionary = {
'gut' : 'nice',
'Haus' : 'house',
'Käse' : 'cheese'
}

for german,english in newDictionary.items():
    EnglishDictionary[german] = english
    
with open('english_dictionary','w') as data_file:    
    json.dump(EnglishDictionary,data_file)
BlackJack

@Alfons Mittelmeyer: Was soll jetzt dieses sinnfreie Beispiel? Man könnte `newDictionary` gleich `english_dictionary` nennen statt das ohne Grund elementweise zu kopieren. Und eigentlich könnte man auch gleich die JSON-Datei im Editor schreiben, statt den Umweg über das Python-Programm zu gehen.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

BlackJack hat geschrieben:@Alfons Mittelmeyer: Was soll jetzt dieses sinnfreie Beispiel? Man könnte `newDictionary` gleich `english_dictionary` nennen statt das ohne Grund elementweise zu kopieren. Und eigentlich könnte man auch gleich die JSON-Datei im Editor schreiben, statt den Umweg über das Python-Programm zu gehen.
Was soll da das Gemosere: Was soll jetzt dieses sinnfreie Beispiel?

Und: Man könnte `newDictionary` gleich `english_dictionary` nennen statt das ohne Grund elementweise zu kopieren.

Vielleicht schon mal daran gedacht, dass man da nur einen Teil eingibt und das dann in die Hauptdatei mit reinkopiert? Schließlich sind da die 3. und 4. Zeile nicht rausgelöscht, sondern nur auskommentiert, weil man beim ersten Mal noch keine Hauptdatei hat.

Und gleich mit dem Editor in die JSON Datei schreiben, etwa: "K\u00e4se": "cheese"
Na dann viel Spass dabei.

Und dann geht es noch darum, dass der OP die richtigen Eingaben in einer anderen Datei speichern will. Da muss er doch wissen, wie man das macht - etwas einer Datei hinzufügen.
Antworten