Wiederholungen ganzer Funktionen

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.
Antworten
marco_
User
Beiträge: 78
Registriert: Freitag 25. März 2005, 12:24

Also ich wiedermal ein Problem. Ich habe verschiedene Funktionen (eingeleitet mit def Name():). Diese rufe ich z.B. so auf:

Code: Alles auswählen

first()
default()
save_vokabeln()
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?
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
marco_
User
Beiträge: 78
Registriert: Freitag 25. März 2005, 12:24

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
Zuletzt geändert von marco_ am Donnerstag 14. April 2005, 18:11, insgesamt 2-mal geändert.
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
marco_
User
Beiträge: 78
Registriert: Freitag 25. März 2005, 12:24

So hab es editiert. Funktioniert jetzt ohne jegliche Dateien.
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
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.
marco_
User
Beiträge: 78
Registriert: Freitag 25. März 2005, 12:24

@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??
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
marco_
User
Beiträge: 78
Registriert: Freitag 25. März 2005, 12:24

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?

Code: Alles auswählen

def eins():
     abc = raw_input()
def zwei():
     print abc
????????
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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())
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
marco_
User
Beiträge: 78
Registriert: Freitag 25. März 2005, 12:24

Danke, was man nicht alles lernen kann.
Jetzt ist die def Zeile zwar etwas länger,aber immer noch besser als schlechter Stil
Antworten