2017-03-08 117 views
0

我到目前爲止創建此代碼...Python函數和變量麻煩

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,它應該繼續我的代碼 - 而是給出錯誤消息'請先輸入一個句子!

我該如何解決這個問題?

+0

爲什麼你需要time.sleeps? – nbro

+0

這是我的代碼的一部分,但這並不真正相關@nbro – Nil

+0

您是否已將'sentence'定義爲全局變量?因爲你向我們展示的代碼應該給出一個錯誤,因爲在函數'option2'中你正在檢查'sentence'是否爲True(或False),但是從你的代碼看,'sentence'似乎沒有被定義任何地方。換句話說,'option1'下的'sentence'是一個局部變量,而不是'option2'中的變量。 – nbro

回答

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() 

或者你可以傳遞參數來回傳遞它。

2

您正在設置本地變量sentence內部函數option1。該變量在option2中不可見,因爲它只能在option1之內,並且在option1完成後將被清除。

如果你要共享的變量,你至少需要在option1將其定義爲global

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

注意,但是,使用全局變量通常是不好的代碼質量的標誌。在你的情況下,option1返回sentencemain並將其從main傳遞到option2會更有意義。

+0

這很好,謝謝! @rainer – Nil