2012-05-31 68 views
0

只是一个简单的问题,因为我真的找不到解决我的问题的简单方法。 有没有办法让一个,就是成为一个整数的用户输入,但是当进入 程序不会打破和一个字符串,而不是显示“错误”输入字符串和整数

我一直在试图解决它将字符串转换为整数,反之亦然,但我总是得到“无效的文字为int()与基10”的错误,或者当它显示“错误”,它在无限循环中这样做。

这里是我的代码只是为了帮助清除问题

choice = input("Enter your choice: ") 

while choice != 3: 
    if choice == 1: 
     get_songs() 
     print 
     main() 
    elif choice == 2: 
     read_songs() 
     print 
     main() 
    else: 
     print "Invalid choice" 

所以基本上我希望其他操作字符串的工作以及为整数大于3或小于1

+2

的raw_input使用(),而不是输入()和手动转换,如果失败则捕获异常。 –

+0

Python 2.x或3.x? –

回答

9

,但我不断收到“无效的字面INT()基数为10”错误

你会得到一个例外,特别是ValueError。您可以使用except块捕获异常。欲了解更多信息,请参阅您目前使用的任何语言教程,或试用Google的except block Python

当它显示“Error”时,它在无限循环中这样做。

当您检测到输入不正确时,在再次尝试循环之前需要获取新输入。将输入信息放入循环中。 除了循环之外,不要使用递归(在main内调用main());否则使用递归()。你只会这样迷惑自己。因为在找到合适的choice值之前,直到您进入循环才会得到choice的值,因此您可以更容易明确地将break置于循环之外,而不是试图用循环来控制循环(即在其中进行测试while条件)。

我们也可以使用continue来简化循环结构:我们不是在try块中做所有工作,而是将其限制在我们提取数字的那一部分。我们在except块中使用continue来跳过循环的其余部分,因为我们没有实际的编号,只有在我们执行循环的时候才执行循环的其余部分。 (毕竟,也许代码我们呼吁choice == 1choice == 2可能raise ValueError一些完全不同的原因,我们会想做些什么不同。)

while True: 
    try: 
     choice = int(raw_input("Give me a number")) 
    except ValueError: 
     print "Could you at least give me an actual number?" 
     continue 

    if choice == 1: 
     do_something() 
    elif choice == 2: 
     do_something_else() 
    elif choice == 3: 
     break 
    else: 
     print "Try a different number" 
+0

嗯,我不太熟悉尝试,除了我的教程中的块以外,但看起来非常简单直接。我非常感谢你的回答,这让我有一段时间了!感谢:) 其实,你的答案的一部分是有点混淆,如果用户不输入一个数字,循环的其余部分被跳过,所以这意味着基本上是True:并尝试:创建一个无限循环,直到给出明确的输入? – Jertise

+1

只是为了强调上述内容:使用raw_input而不是输入是一个很好的做法,特别是如果这是为了部署到更广泛的受众而设计的。传递给input()的语句会被评估,接受任意指令会产生一个安全漏洞。 http://docs.python.org/library/functions.html#input – abought

0

因为这个选择总是!= 3,你会得到一个无限循环。 如果跳转到“其他”条件,您应该再次输入。

0

这里有一些东西:我不喜欢让用户围绕字符串输入""

ch = raw_input("Enter choice: ") 
#ch *is* a string at this point 
if ch.isdigit(): 
    choice = int(ch) 
else: 
    print "Invalid choice" 

编辑(从评论):

isdigit可能无法正确处理本地编码。在Python 3中,您可以改用isdecimal。   — J.F.塞巴斯蒂安

+1

'isdigit()'在某些语言环境中可能不正确('int'拒绝输入)。 Python 2使用C'isdigit()':[can isdigit合法地依赖于区域设置在C中](http://stackoverflow.com/q/2898228/4279)。检查输入是ascii('ord(ch)<128')还是更好使用try/except。在Python 3中,改用'isdecimal()'。 – jfs

0

在你的代码中,while循环应该封装的input()线。下面是一个更清晰的选择,但是:

创建一个函数,它获取用户输入:

def getInteger(prompt): 
    while True: 
     userIn = input(prompt) 
     try: 
      return int(userIn) 
     except ValueError: 
      print "Error"