Seite 1 von 2

Verfasst: Montag 28. August 2006, 21:35
von Devec
ver 0.4.1


Code: Alles auswählen

try:
   howManyVok = input( 'wie viele vokabeln :' )
except NameError:
   print "Keine zahl eingegeben\n"
   off = raw_input('um zu beenden OK Druecken') 
   print off

dictonary = {'again': 'wieder', 'almost': ['fast', 'beinahe'], 'always':'immer', 'cake': 'Kuchen', 'free': ['Frei', 'umsonst', 'befreien'], 'hair': 'Haare', 'morning': 'Morgen', 'now': 'Jetzt', 'rush': ['Eile','Hetze','eilen'], 'map': 'Karte'}



while howManyVok != 0:
    rightanswer = dictonary.popitem()  
    answer = raw_input("'" + rightanswer[0] + "'Auf Deutsch:\n")
    if answer == rightanswer[1]:
        print "Richtig"
    else:
        print "falsch"
        print "richtig waere", rightanswer[1]
    howManyVok-=1

off = raw_input('um zu beenden OK Druecken') 
print off  

@sigma in war eine ganz schlchet idee ich hab das programm nach langen rumtüffteln mit in nicht mit in anstatt == hinbekomemn :\

Verfasst: Montag 28. August 2006, 22:30
von Craven
Hi Devec

Wenn das Dictionary leer wird, kommt ein KeyError

Code: Alles auswählen

import os, sys

try:
	howManyVok = input( 'wie viele vokabeln :' )
except NameError:
	print "Keine zahl eingegeben\n"
	off = raw_input('um zu beenden OK Druecken')
	print off

dictonary = {'again': ['wieder', 'nochmal'], 'almost': ['fast', 'beinahe'], 'always':'immer', 'cake': 'Kuchen', 'free': ['Frei', 'umsonst', 'befreien'], 'hair': 'Haare', 'morning': 'Morgen', 'now': 'Jetzt', 'rush': ['Eile','Hetze','eilen'], 'map': 'Karte'}



while howManyVok != 0:
	try:
		rightanswer = dictonary.popitem()
	except KeyError:
		print "\n", "empty!", "\n"
		break
	answer = raw_input("'" + rightanswer[0] + "'Auf Deutsch:\n")
	if answer == rightanswer[1]:
		print "Richtig"
	else:
		print "falsch"
		print "richtig waere", rightanswer[1]
	howManyVok-=1

off = raw_input('um zu beenden OK Druecken:   ')

if off == 'ok':
	print off
	os.sys.exit()
else:
	print "sry, so far u can ONLY exit ^^"
	os.sys.exit()
Jetzt nicht mehr :wink:
Ist nicht die eleganteste Lösung, aber was solls ^^

MfG,
Craven

edit: ausversehen ein tab zuviel ^^

Verfasst: Montag 28. August 2006, 22:52
von DatenMetzgerX
oder...

Code: Alles auswählen

import os, sys

try:
    howManyVok = input( 'wie viele vokabeln :' )
except NameError:
    print "Keine zahl eingegeben\n"
    off = raw_input('um zu beenden OK Druecken')
    print off

dictonary = {'again': ['wieder', 'nochmal'], 'almost': ['fast', 'beinahe'], 'always':'immer', 'cake': 'Kuchen', 'free': ['Frei', 'umsonst', 'befreien'], 'hair': 'Haare', 'morning': 'Morgen', 'now': 'Jetzt', 'rush': ['Eile','Hetze','eilen'], 'map': 'Karte'}



while howManyVok != 0:
    if not len(dictonary) > 0:
        print "\nempty!\n"
        break
    rightanswer = dictonary.popitem()
    answer = raw_input("'" + rightanswer[0] + "'Auf Deutsch:\n")
    if answer == rightanswer[1]:
        print "Richtig"
    else:
        print "falsch"
        print "richtig waere", rightanswer[1]
    howManyVok-=1

off = raw_input('um zu beenden OK Druecken:   ')

if off == 'ok':
    print off
    os.sys.exit()
else:
    print "sry, so far u can ONLY exit ^^"
    os.sys.exit() 

Verfasst: Montag 28. August 2006, 23:08
von Devec
thx ich werd mcih jetzt mal erst wider auf neue versoinen stürzen wenn ich noch bischen gebüffelt hab ^^

Verfasst: Montag 28. August 2006, 23:11
von Craven
Hi DatenMetzgerX

Was genau ist da der Vorteil gegenüber meinem, bzw macht das nen Unterschied :?:

MfG,
Craven

Verfasst: Dienstag 29. August 2006, 07:20
von Michael Schneider
Craven hat geschrieben:Was genau ist da der Vorteil gegenüber meinem, bzw macht das nen Unterschied :?:
Hi Craven,

try-except ist die Narkosehammervariante und sollte als letztes verwendet werden. Mit der erschlägst Du vielleicht nicht unbedingt nur Deine Exception, sondern auch die von ihr abgeleiteten - und nachher fragt man sich: warum funktioniert das nicht und meldet nix mehr? In der Regel würde ich also eine Abfrage vorziehen.

Übrigens sollte eine einfache nonzero-Abfrage reichen:

Code: Alles auswählen

if dictionary:
    rightanswer = dictonary.popitem()
Grüße,
der Michel

Verfasst: Dienstag 29. August 2006, 20:17
von BlackJack
Das ist aber Ansichtssache. In diesem Fall kann man davon ausgehen das es eine Ausnahme ist wenn das Dictionary leer ist, da kann man auch eine Ausnahme benutzen. Es wird ja auch nicht irgendeine Ausnahme behandelt, sondern die für diese Situation spezifische.

Verfasst: Dienstag 29. August 2006, 20:26
von Nirven
Mag in diesem speziellen Fall zutreffen. Aber in etwas komplexerem Code könnte ein keyError auch woanders herkommen. Allgemein ist also 'if dictionary' vorzuziehen, oder?

Hab mir auch schon Gedanken gemacht, ob ich an einer Stelle lieber eine Variable abfrage oder ein try benutze. Michael hat mich glaub ich davon überzeugt, try immer als letzte Methode zu benutzen, sonst gewöhn ich mir nur was "gefährliches" an.

Verfasst: Dienstag 29. August 2006, 20:32
von murph
so ähnlich verhält sich

Code: Alles auswählen

if my_var in my_dic:
    #tue was zu tun ist
else:
    #tue, was sonst in dert except stünde

Verfasst: Dienstag 29. August 2006, 22:08
von Michael Schneider
murph hat geschrieben:so ähnlich verhält sich

Code: Alles auswählen

if my_var in my_dic:
    #tue was zu tun ist
else:
    #tue, was sonst in dert except stünde
Hi Murph,

geht es hier nicht darum, das Dictionary nach und nach zu leeren? Dann kann man doch nur prüfen, ob es leer ist bzw. ob es Elemente enthält. Denn man hat ja keinen Wert my_var, dessen Vorhandensein man prüfen könnte. :-)

Grüße,
Michael

Verfasst: Mittwoch 30. August 2006, 12:35
von BlackJack
Nirven hat geschrieben:Mag in diesem speziellen Fall zutreffen. Aber in etwas komplexerem Code könnte ein keyError auch woanders herkommen. Allgemein ist also 'if dictionary' vorzuziehen, oder?
Allgemein ist keines von beiden vorzuziehen sondern man sollte im Einzelfall entscheiden was der Semantik besser entspricht. IMHO.

Wenn `dictionary` ein komplexeres Objekt ist, dann kann auch ``if dictionary`` aufgrund von Programmierfehlern `False` ergeben obwohl das nicht stimmt.

Letztendlich finde ich das Konstrukt mit dem `poptitem()` sowieso ein bischen fragwürdig. Viel klarer fände ich so etwas:

Code: Alles auswählen

tmp = vocabulary.items()
tmp.shuffle()

for language_a, language_b in tmp[:count]:
    answer = raw_input('please translate "%s": ' % language_a)
    if answer != language_b:
        print 'Uh no, it is "%s".' % language_b
    else:
        print 'Correct.'