Seite 1 von 1
Wiederholungen ganzer Funktionen
Verfasst: Donnerstag 14. April 2005, 17:32
von marco_
Also ich wiedermal ein Problem. Ich habe verschiedene Funktionen (eingeleitet mit def Name():). Diese rufe ich z.B. so auf:
Wenn ich jetzt default() öfter wiederholen will, funktioniert das nicht er ignoriert einfach die Schleife.
Ich hab das z.B. schon so probiert:
Code: Alles auswählen
first()
d = 0
while d < dauer:
default()
d = d + 1
save_vokabeln()
Somit habe ich eine schöne Endlosschleife.
Außerdem denke ich, dass bei Python 2.4 die Ausdrücke += und <= nicht mehr funktionieren, oder irre ich da?
Re: Wiederholungen ganzer Funktionen
Verfasst: Donnerstag 14. April 2005, 17:50
von joe
Hi!
Hilfreich wäre es wenn du ein aufs nötigste reduziertes, aber komplettes beispiel hättest, so z.B.:
Code: Alles auswählen
def first(): print "first"
def default(): print "default"
def save_vokabeln(): print "save_vokabeln"
dauer = 5
first()
d = 0
while d <= dauer:
default()
d += 1
save_vokabeln()
funtioniert wunderbar (version 2.4).
ich denke du wirst dir da irgendwo seiteneffekte eingehandelt haben, z.b. vermeindlich lokale variablen, die tatsächlich globale sind.
joe
Verfasst: Donnerstag 14. April 2005, 17:54
von marco_
Code: Alles auswählen
import random
from os import system
def first():
#system("cd ~/Vocabulary")
level = raw_input("Welches Level soll gefragt werden?")
sprache = raw_input("Welche Sprache?(Lat,Gri oder Eng?")
global dauer
dauer = raw_input("Wieviele Vokabeln fragen?")
global QUELLE
QUELLE = "stage"+level+"_"+sprache+".txt"
global ZIEL
ZIEL = "stage"+str(int(level)+1)+"_"+sprache+".txt"
#Quelle = open(QUELLE)
#Inhalt = Quelle.readlines()
#Quelle.close()
Vokabeln = ["Wort1;Wort2#Übersetzung1;Übersetzung2","Wort3;Wort4#Übersetzung3;Übersetzung4"]
global Vokabeln
#Vokabeln = []
#for line in Inhalt:
# Vokabeln.append(line)
global FALSE
global RIGHT
FALSE = []
RIGHT = []
def default():
now = random.choice(Vokabeln)
words , translations = now.split('#')
translations = translations.rstrip('\n')
words = words.split(';')
translations = translations.split(';')
print "Übersetzung zu:"+str(words)
Antwort = raw_input()
if Antwort in translations:
print "RIGHT"
RIGHT.append(now)
Vokabeln.remove(now)
else:
print "FALSE"
FALSE.append(now)
Vokabeln.remove(now)
first()
d = 0
while d < dauer:
default()
d = d + 1
save_vokabeln()
Ich fürchte es sind die globals in der ersten Funktion. wüsste aber nicht wie ich das sonst lösen könnte da ich sie in der zweiten funktion noch brauche
Verfasst: Donnerstag 14. April 2005, 18:00
von joe
Mit "reduziert" meinte ich, daß man das programm "out of the box" starten kann. Sorry,aber ich hab keine lust zu ergründen wie deine vokabeldateien aussehen.
joe
Verfasst: Donnerstag 14. April 2005, 18:11
von marco_
So hab es editiert. Funktioniert jetzt ohne jegliche Dateien.
Verfasst: Donnerstag 14. April 2005, 18:30
von joe
Grrr, fieser fehler. Hat bei mir auch etwas gedauert. Also, dauer ist bei dir vom typ string, weil raw_input() eben ein string zurückliefert. Du musst also dauer noch in ein int umwandeln: dauer = int(dauer).
joe
Verfasst: Donnerstag 14. April 2005, 21:36
von BlackJack
marco_ hat geschrieben:Ich fürchte es sind die globals in der ersten Funktion. wüsste aber nicht wie ich das sonst lösen könnte da ich sie in der zweiten funktion noch brauche
Kleiner Tip: Man kann Funktionen auch so schreiben, das ihnen Argumente übergeben werden. Dann gibt man die benötigten Variablen als Parameter beim Aufruf mit und muss nicht mit "globals" arbeiten. Wenn man dieses Schlüsselwort verwenden muss, dann hat man meistens einen Fehler im Entwurf.
Verfasst: Freitag 15. April 2005, 17:17
von marco_
@Joe: Vielen,vielen Dank, ist doch wirklich dumm den String in eine Zahl umzuwandeln...
@BlackJack: Wie schaut denn dann die Funktion aus, bzw. wie übergiebt man die Variablen?? Könntest du mal ein kurzes Beispiel zeigen oder einen Link posten??
Verfasst: Freitag 15. April 2005, 17:31
von Leonidas
marco_ hat geschrieben:@BlackJack: Wie schaut denn dann die Funktion aus, bzw. wie übergiebt man die Variablen?? Könntest du mal ein kurzes Beispiel zeigen oder einen Link posten??
Bin zwar nicht BlackJack, aber naja...
Code: Alles auswählen
def func(wert="Default"):
print wert
func()
func("nicht Default")
func(wert="Keyword")
Ist also recht einfach.
Verfasst: Freitag 15. April 2005, 17:43
von marco_
Alles schön und gut, aber wenn ich jetzt zwei funktionen habe und von der ersten ein Argument der Zweiten will? Wie geht das dann?
????????
Verfasst: Freitag 15. April 2005, 17:50
von Leonidas
Ist einfach eine Sache des Designs:
Code: Alles auswählen
def eins():
abc = raw_input()
zwei(abc)
def zwei(abc):
print abc
oder auch
Code: Alles auswählen
def eins():
abc = raw_input()
return abc
def zwei(abc):
print abc
zwei(eins())
Verfasst: Freitag 15. April 2005, 18:17
von marco_
Danke, was man nicht alles lernen kann.
Jetzt ist die def Zeile zwar etwas länger,aber immer noch besser als schlechter Stil