2013-06-21 76 views
1

我想寫一個簡單的數字猜猜器程序。在這個特定的程序中,python猜測用戶正在想的是一個數字,而不是相反的方向。Python猜測我的號碼(反向號碼猜測)UnboundLocalError

我的代碼返回一個UnboundLoalError。

此外,這一切似乎都太長和繁瑣。我怎樣才能縮短它?

謝謝。

# Guesses a number 

from random import randint 
number = "" 

def numberGuesser(): 
    while True: 
     print "Think of a number between 1 and 50" 
     raw_input("Hit a key when ready") 
     number = randint(1,50) 
     answer = raw_input("Is your number: %d?. y/n> " % number) 
     if answer == 'y': 
      print "Great!" 
      raw_input("Hit a key to exit.") 
     elif answer == 'n': 
      greater_or_smaller() 
     else: 
      print "Please type y or n" 



def greater_or_smaller(): 
    while True: 
     greater_or_smaller = raw_input("Is\ 
your number greater or smaller than %d? g/s> " % number) 
     if greater_or_smaller == 'g': 
      number = randint(number, 50) 
      answer = raw_input("Is your number %d? y/n> " % number) 
      if answer == 'y': 
       print "Hooray!" 
      elif answer == 'n': 
       greater_or_smaller() 

     elif greater_or_smaller == 's': 
      number = randint(1, number) 
      answer = raw_input("Is your number %d? y/n> " % number) 
      if answer == 'y': 
       print "Hooray!" 
      elif answer == 'n': 
       greater_or_smaller() 


numberGuesser() 
+2

注意python給你帶來的錯誤。你會看到一行出現的地方,並根據錯誤的名稱,你可以很快找出實際的錯誤。此外,如果您傳遞'number'作爲參數並擺脫全局變量會更好。 –

+0

@millimoose正如我所說,簡短的回答:)我寫了另一個評論與擴大的答案。我想我現在會刪除我的第一條評論。 –

+0

另外:你正在一個名字相同的函數中使用名爲'greater_or_smaller'的變量。這通常是一個壞主意。在你的情況下,因爲你遞歸地調用了函數,所以這是個不錯的主意(即一個bug) - 你會嘗試「調用」你讀入的'str'。 – millimoose

回答

1

此:

 if greater_or_smaller == 'g': 
      number = randint(number, 50) 
      answer = raw_input("Is your number %d? y/n> " % number) 
      if answer == 'y': 
       print "Hooray!" 
      elif answer == 'n': 
       greater_or_smaller() 

     elif greater_or_smaller == 's': 
      number = randint(1, number) 
      answer = raw_input("Is your number %d? y/n> " % number) 
      if answer == 'y': 
       print "Hooray!" 
      elif answer == 'n': 
       greater_or_smaller() 

可能是:

 if greater_or_smaller in ['g','s']: 
      number = randint(number, 50) if greater_or_smaller == 'g' else randint(1, number) 
      answer = raw_input("Is your number %d? y/n> " % number) 
      if answer == 'y': 
       print "Hooray!" 
      elif answer == 'n': 
       greater_or_smaller() 

此外,你應該寫一個小函數來處理互動與用戶,以確保答案被包含在預期答案列表。

喜歡的東西:

def get_input(prompt_text, valid_options): 
    x = raw_input(prompt_text) 
    while x not in valid_options: 
     print x, "is not a valid value. Expected are :", valid_options 
    return x 
1

因爲函數greater_or_smallerraw_input調用使用變量number,然後分配給它你得到這個錯誤。將global number放在函數的頂部,錯誤將消失。 (但是,聽聽你在這裏得到的其他建議)。

說明:要分配或修改全局變量,必須先將其聲明爲全局變量。 (只要不在函數中的任何位置分配它,就可以使用全局/非局部變量而不聲明它是全局變量)。