2013-06-21 45 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放在函数的顶部,错误将消失。 (但是,听听你在这里得到的其他建议)。

说明:要分配或修改全局变量,必须先将其声明为全局变量。 (只要不在函数中的任何位置分配它,就可以使用全局/非局部变量而不声明它是全局变量)。