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:

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?

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?

Code: Alles auswählen

def eins():
     abc = raw_input()
def zwei():
     print abc
????????

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