Ich habe diese Woche angefangen, das Programmieren zu lernen, also spiele ich mit kleinen Programmen herum, die ich erstelle, um ein besseres Verständnis für die Funktionsweise zu bekommen.

Eines der Programme, die ich erstellt habe, ist ein Pig Latin-Übersetzer, der sich wiederholt, bis der Benutzer beendet wird. Das Programm funktioniert, aber die Logik ergibt für mich keinen Sinn.

pyg = "ay" #Pig Latin words end with ay.

def translate(): #Creating a function.
    original = input("Enter a word: ").lower() #Ask for input then convert to lower.
    if len(original) > 0 and original.isalpha() : #isalpha() verifies only abc's and more than one letter.
        first = original[0] #Assigns the first letter of the string to first.
        latin = original[1:] + first + pyg #Adds original starting at 2nd letter with first and pyg.
        print(latin)
    else:
        print("You did not enter a valid word, please try again.")
        translate() #If you did not enter valid word, then call function again until you do.

translate() #Don't forget to actually call the function after you define it.

#Set run to False.
#Can be set to True if while (run != True) is set to while (run == True).
run = False

#Defining cont(). Ask for imput and error handling.
def cont():
    loop = input("Would you like to convert another word? (y/n): ").lower()
    if loop == "y" :
        run = True
    elif loop == "n" :
        run = False
        print("Thank you for using this program, have a nice day!")
        exit()
    else :
        print("You did not enter a valid response, please try again.")
        cont()

cont()

#Infinite loop as long as run is not equal to True.
while (run != True) :
    translate()
    cont()

Meine Frage ist, warum funktioniert dieses Programm? Ich habe run auf False gesetzt und die Schleife so eingestellt, dass sie läuft, solange run! = True. Kein Problem, aber als ich cont () definiert habe, habe ich run so eingestellt, dass es den Wert True annimmt, wenn der Benutzer "y" eingibt. True! = True sollte False sein (wenn ich es richtig verstehe) und die Schleife sollte enden, aber stattdessen funktioniert sie so, wie ich es wollte.

Ist das ein Codierungsfehler, den ich gemacht habe, oder denke ich nur falsch darüber nach? Danke im Voraus.

Bearbeiten: Vielen Dank an alle, die geantwortet haben. Ich hatte noch nichts über lokale und globale Variablen gelernt.

0
Syferion 14 Aug. 2015 im 23:53

4 Antworten

Beste Antwort

Um das zu erweitern, was andere bereits angegeben haben, run in diesen Zeilen

if loop == "y" :
    run = True
elif loop == "n" :
    run = False

Beziehen sich nicht auf dasselbe run, das durch definiert ist

#Can be set to True if while (run != True) is set to while (run == True).
run = False

run in der Funktion cont ist eine lokale Variable für Ihre Funktion, nicht die global definierte run.

Es gibt (zumindest) einige Möglichkeiten, dies zu beheben. Die bevorzugte (imo) Methode besteht darin, cont einen neuen Wert zurückzugeben, der run zugewiesen werden soll. Das würde so aussehen

#Defining cont(). Ask for imput and error handling.
def cont(_run):
    loop = input("Would you like to convert another word? (y/n): ").lower()
    if loop == "y" :
        return _run
    elif loop == "n" :
        return not _run
    else :
        print("You did not enter a valid response, please try again.")
        return cont(_run)

...

#Infinite loop as long as run is not equal to True.
while (run != True) :
    translate()
    run = cont(run)

Die andere (weniger bevorzugte) Möglichkeit besteht darin, die globale Variable run in Ihrer Funktion cont zu verwenden. Dies wird mit dem Schlüsselwort global erreicht.

Das würde so aussehen:

#Defining cont(). Ask for imput and error handling.
def cont():
    global run
    loop = input("Would you like to convert another word? (y/n): ").lower()
    if loop == "y" :
        run = True
    elif loop == "n" :
        run = False
        print("Thank you for using this program, have a nice day!")
        exit()
    else :
        print("You did not enter a valid response, please try again.")
        cont()

** Paar Randnotizen
In meinem ersten Beispiel gebe ich _run zurück, wenn der Wert y ist, und not _run, wenn der Wert n ist. Auf diese Weise können Sie Ihren anfänglichen run -Wert auf True ändern und die while -Bedingung ändern, ohne die cont -Funktion selbst ändern zu müssen.

Sie müssen den Wert run überhaupt nicht ändern, wenn Sie den globalen Wert verwenden und der Benutzer n eingibt, da Sie ihn beenden, bevor die Funktion zurückkehrt.

Möglicherweise ist es besser, wenn Sie Ihre bedingten Prüfungen if in ändern

if loop in ("yes", "y"):
if loop in ("no", "n"):

Da viele Leute nicht die vollständigen Anweisungen lesen :)

1
sberry 14 Aug. 2015 im 21:06

Das Problem ist, dass die in cont() definierte Variable run nicht mit der im globalen Bereich definierten Variablen run identisch ist. (Wenn Sie nicht sicher sind, was ich damit meine, sollten Sie sich https://docs.python.org/3.4/tutorial/classes.html#python-scopes-and-namespaces. Vielleicht wäre ein besserer Ansatz für Ihren Code {{X3} } return True oder False. Es ist auch intuitiver und lesbarer, True zu verwenden, wenn Sie fortfahren möchten. So würde ich es umschreiben.

pyg = "ay" #Pig Latin words end with ay.

def translate(): #Creating a function.
    original = input("Enter a word: ").lower() #Ask for input then convert to lower.
    if len(original) > 0 and original.isalpha() : #isalpha() verifies only abc's and more than one letter.
        first = original[0] #Assigns the first letter of the string to first.
        latin = original[1:] + first + pyg #Adds original starting at 2nd letter with first and pyg.
        print(latin)
    else:
        print("You did not enter a valid word, please try again.")
        translate() #If you did not enter valid word, then call function again until you do.

#Defining cont(). Ask for imput and error handling.
def cont():
    while True:
        loop = input("Would you like to convert another word? (y/n): ").lower()
        if loop == "y":
            return True
        elif loop == "n": 
            print("Thank you for using this program, have a nice day!")
            return False
        else :
            print("You did not enter a valid response, please try again.")

translate()
while cont():
    translate()
0
Joseph Stover 14 Aug. 2015 im 21:20

Das run in der Funktion cont ist eine lokale Variable. Das Ändern des Werts hat keine Auswirkung auf die globale Variable, auf die sich die while-Schleife bezieht.

1
Daniel Roseman 14 Aug. 2015 im 21:00

Ich denke, das liegt wahrscheinlich am Umfang Ihrer Laufvariablen. weil Sie nicht von Ihrer cont-Funktion zurückkehren. Ich glaube, was Ihr! = True Check sieht, wird außerhalb dieser Funktion immer False sein, obwohl Sie das Programm natürlich innerhalb der Funktion erfolgreich beenden können.

0
Cody Braun 14 Aug. 2015 im 21:00