2015-12-24 27 views
0

只是隨便學習python在這裏,並試圖寫fizzbuzz。我正在讀一本書讓我去,但只是想嘗試自己的東西,因爲我認爲這將爲我學習最好的,因爲它通常在學習的東西時。所以這是我的本錢:變量不想定義,一般建議

def input_and_test(): 
    print "Gimme something and it better be a number or shit ain't gon work" 
    inputt = raw_input() 
    inputt = str(inputt) 

    try: 
     input_data_type = int(inputt) 
    except ValueError: 
     print "Yeah that sure as hell ain't a number, sonny" 
     input_and_test() 
    else: 
     print 'Great, now lemme check' 

input_and_test() 

input_lenght = len(inputt) 
input_lenght = int(int(input_lenght) - 1) 
last_number = inputt[input_lenght] 

if input == 1: 
    print 'Even' 
elif last_number == 0 or last_number == 2 or last_number == 4 or last_number == 6 or last_number == 8: 
    print 'Even' 
else: 
    print 'Odd' 

現在,我敢肯定,這是可怕的低效但是,這並不重要,因爲我想學習如何做這個「辦法」。它會引發這個錯誤:

Traceback (most recent call last): 
    File "C:\Python27\test.py", line 16, in <module> 
    input_lenght = len(inputt) 
NameError: name 'inputt' is not defined 

爲什麼?我沒有在我剛纔調用的第一個函數中定義inputt嗎?有沒有更好的方法來取代異常處理,並再次啓動功能的一部分,修復所有這些?關於這個代碼的任何不好的事情(除了它不是最佳的fizzbuzz),我應該在將來避免?再次抱歉,這是令人討厭的糟糕,這個問題可能很簡單。我感謝任何和所有的幫助!

+0

函數中定義的變量在函數外部是不可見的,除非用'global'聲明它們。 – Barmar

+1

你應該儘量避免使用全局變量。函數應該從參數中獲得輸入,並使用'return'將數據返回給調用者。 – Barmar

+0

確保你發佈了正確縮進的代碼。由於Python使用縮進來解析代碼的結構,因此我們需要了解如何縮進代碼以理解它。 – Barmar

回答

3

正如Barmar在評論中所說的,您應該真的使用return將函數的輸出轉換爲調用代碼。下面是你可以有更好的return寫你的函數:

def input_and_test(): 
    print "Gimme something and it better be a number or shit ain't gon work" 
    inputt = raw_input() 
    inputt = str(inputt) 

    try: 
     input_data_type = int(inputt) 
    except ValueError: 
     print "Yeah that sure as hell ain't a number, sonny" 
     return input_and_test() 
    else: 
     print 'Great, now lemme check' 
     return inputt 

inputt = input_and_test() 

input_lenght = len(inputt) 
input_lenght = int(int(input_lenght) - 1) 
last_number = inputt[input_lenght] 

if input == 1: 
    print 'Even' 
elif last_number == 0 or last_number == 2 or last_number == 4 or last_number == 6 or last_number == 8: 
    print 'Even' 
else: 
    print 'Odd' 

在上面的代碼中,我獨自離開了你的變量名,用在兩個地方所使用的名稱inputt。但是這可能會讓你感到困惑,因爲inputt裏面的的功能與inputt以外的的功能不是同一個變量。所以我會將你的函數內變量重命名爲一個不同的名字(我個人喜歡使用名稱result作爲「這個函數最終要返回的值)」,這樣你就可以更容易地看到什麼是怎麼回事:?

def input_and_test(): 
    print "Gimme something and it better be a number or shit ain't gon work" 
    result = raw_input() 
    result = str(result) 

    try: 
     input_data_type = int(result) 
    except ValueError: 
     print "Yeah that sure as hell ain't a number, sonny" 
     return input_and_test() 
    else: 
     print 'Great, now lemme check' 
     return result 

inputt = input_and_test() 

input_lenght = len(inputt) 
input_lenght = int(int(input_lenght) - 1) 
last_number = inputt[input_lenght] 

if input == 1: 
    print 'Even' 
elif last_number == 0 or last_number == 2 or last_number == 4 or last_number == 6 or last_number == 8: 
    print 'Even' 
else: 
    print 'Odd' 

在那裏,現在兩個不同的變量有兩個不同的名字

現在,你看到我是如何在功能兩種不同return語句是很明顯你爲什麼,或你需要我擴大這個答案來解釋爲什麼return input_and_test()行是必要的嗎?

+0

啊,這個更清潔。您將輸入設置爲該功能輸出的內容;說得通。我沒有得到的唯一的事情是如何知道如果ValueError被引發重新開始。編輯:哦,沒關係,返回函數將使它自己再次調用。非常感謝,我現在明白了! – applepieftw

+0

@applepieftw - 簡短版本:它第二次調用'input_and_test()',這是* recursion *的一個例子。 (有關遞歸的解釋,請參見http://www.python-course.eu/recursive_functions.php,如果您需要更多示例,請參閱Google「遞歸」。)並且由於* inner *調用返回的任何內容都將立即返回*外*電話,這幾乎相當於說「只要回到起點再試一次」。這個術語是「尾遞歸」,但這是一個更高級的話題,你應該在以後處理。 – rmunn

+0

是的,我知道這是遞歸,但我會解決內外部函數的工作方式,就像你最終提出的那樣。嘗試這個,然後在這裏得到幫助是非常有用和樂趣。再次感謝:) – applepieftw

1

你必須從你的函數返回值。

input_and_test添加結束:

return inputt 

然後,在每一個地方,你叫input_and_test地方,存儲值:

inputt = input_and_test() 

你必須這樣做,因爲inputt是內部的局部變量input_and_test,所以每次調用該函數時,都會在其中創建一個新的inputt變量。一旦函數退出,變量就消失了。

+0

還有一個地方,他需要一個'return'語句,正如我在答案中指出的那樣。在他遞歸的'ValueError'塊之外,還需要一個'return'語句,否則如果'except'塊被運行,他會隱式地返回'None'。 – rmunn

+0

@rmunn實際上,如果他存儲在'inputt'中,然後在末尾返回'inputt'(而不是在其後),那麼它仍然有效。這是我想到的。但你的解決方案也是正確的。 – zvone