Python函数和变量很麻烦

时间:2017-03-08 16:06:36

标签: python function

到目前为止我已经创建了这段代码......

def print_slow(str):
    for letter in str:
        sys.stdout.write(letter)
        sys.stdout.flush()
        time.sleep(0.005)

def menu():
    print_slow("-------------[MENU]-------------")
    print(" ")
    print_slow("1) Enter a sentence.")
    print(" ")
    print_slow("2) Find the position of  a word.")
    print(" ")
    print_slow("--------------------------------")
    print(" ")

    print_slow(">>> ")
    choice = str(input(" "))
    print(" ")
    time.sleep(0.5)

    if choice == "1":
        option1()
    if choice == "2":
        option2()

def option1():
    print_slow("Enter sentence")
    sentence = str(input(": "))
    print(" ")
    menu()

def option2():
    if not sentence:
        print_slow("Please enter a sentence first!")
        time.sleep(0.5)
        print(" ")

    else:
        sentenceUppercase = sentence.upper()
        [code goes on...]

基本上当我测试它时,我首先按下选项2,它应该输出'请先输入一个句子!',它确实如此。

然后我按下菜单中的选项1,它应该提示我输入一个句子(我把我的名字叫做bob'作为测试)然后就可以了。

我在输入句子后按了选项2,应该继续我的代码 - 而是提供错误信息'请先输入一个句子!'

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

您在函数sentence中设置了本地变量option1。此变量在option2中不可见,因为它仅位于option1内,并且会在option1完成后清除。

如果您想共享变量,则需要至少在global中将其定义为option1

def option1():
    print_slow("Enter sentence")
    global sentence
    sentence = str(input(": "))
    print(" ")
    menu()

但请注意,使用全局变量通常表示代码质量不佳。在您的情况下,让option1返回sentencemain并将其从main传递给option2会更有意义。

答案 1 :(得分:1)

您的问题在于为sentence分配值。由于您在函数中分配它,当您离开该函数的范围时,您将丢失该值。尝试使用global

sentence = ''

def option1():
    global sentence              # <-- this maintains its value in global scope
    print_slow("Enter sentence")
    sentence = str(input(": "))
    print(" ")
    menu()

def option2():
    global sentence              # <-- and here
    if not sentence:
        print_slow("Please enter a sentence first!")
        time.sleep(0.5)
        print(" ")
    else:
        sentenceUppercase = sentence.upper()

或者您可以使用参数来回传递它。