0

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

我一直在尝试通过将字符串转换为整数来解决它,反之亦然,但我经常收到“invalid literal for int() with base 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"

所以基本上我希望 else 操作适用于字符串以及大于 3 或小于 1 的整数。

4

4 回答 4

9

但我经常收到“invalid literal for int() with base 10”错误

你得到一个例外,特别是一个ValueError. 您可以使用except块捕获异常。有关更多信息,请参阅您迄今为止使用的任何语言教程,或尝试使用 Google 获取except block Python.

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

当您检测到输入不正确时,您需要在再次尝试循环之前获取新输入。将获取输入的内容放入循环中。除了循环之外,不要main()使用递归(从内部调用);main你只会这样迷惑自己。因为在进入循环之前你不会得到一个值,所以当你找到合适的值时choice更容易显式地退出循环,而不是尝试用它来控制循环(即在条件中测试它) .breakchoicewhile

我们还可以使用它continue来简化循环结构:不是在块中完成所有工作try,而是将其限制在提取数字的部分。当我们没有实际数字时,我们continue在块中使用以跳过循环的其余部分,并且仅在我们有时才执行循环的其余部分。except(毕竟,也许我们要求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"
于 2012-05-31T03:37:22.983 回答
0

由于该选择始终!= 3,因此您将获得无限循环。如果它跳入“else”条件,您应该再次获得输入。

于 2012-05-31T03:32:51.937 回答
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改用。— JF塞巴斯蒂安

于 2012-05-31T03:32:53.437 回答
0

在您的代码中,while循环应该封装该input()行。但是,以下是更清晰的替代方案:

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

def getInteger(prompt):
    while True:
        userIn = input(prompt)
        try:
            return int(userIn)
        except ValueError:
            print "Error"
于 2012-05-31T03:33:08.447 回答