为什么我不能在python中输入完成时打破循环?

时间:2018-05-24 16:19:03

标签: python

我试图用完做退出循环,不接受非整数,我做错了什么?

while True:
    try:
        num = int(input("Enter a number or enter done: "))
        if (num % 2) == 0:
            print("Number is Even")
        elif (num % 2) == 1:
            print("Number is Odd")
        else:
            num == 'done'
            break
    except:
            print ('Invalid Input')
print ('Done')

3 个答案:

答案 0 :(得分:3)

因为这一行在这里:

num = int(input("Enter a number or enter done: "))

将您的输入转换为int。字符串done无法转换为int,只会直接显示您的例外情况,而不是您的if .. elif代码。

在将输入转换为int:

之前,您可以尝试检查done
while True:
    try:
        num_str = input("Enter a number or enter done: ")
        if num_str == 'done':
            break

        num = int(num_str)
        if (num % 2) == 0:
            print("Number is Even")
        else:
            print("Number is Odd")

    except:
        print('Invalid Input')

print('Done')

答案 1 :(得分:2)

您需要在之前检查输入,然后尝试将其转换为int。数字永远不能等于'done'

不需要elif (num % 2) == 1:;如果一个数字不均匀,唯一的另一种可能是它很奇怪,所以你可以使用else:

try:仅放在执行转换的语句周围也好一点。

while True:
    response = input("Enter a number or enter done: ")
    if response == 'done':
        break;

    try:
        num = int(response)
    except:
        print ('Invalid Input')
        continue

    if (num % 2) == 0:
        print("Number is Even")
    else:
        print("Number is Odd")

print ('Done')

答案 2 :(得分:1)

当您键入'done'时,您的程序会尝试将字符串转换为int。这会引发一个被捕获的ValueError。然后循环重新开始。

由于您需要保留用户输入以在'done'强制转换失败时检查int是否为try-except,我建议您不要依赖str.isdigit阻止,而是使用{{ 1}}而不是。

while True:
    answer = input("Enter a number or enter done: ")

    if answer.isdigit() and int(answer) % 2 == 0:
        print("Number is Even")

    elif answer.isdigit() and int(answer) % 2 == 1:
        print("Number is Odd")

    elif answer.lower() == 'done':
        break

    else:
        print('Invalid input')

print ('Done')

旁注

如果您想使用try-except块,那么您应该具体了解要捕获的异常,否则您可能会捕获表示实际错误的异常,甚至会发现KeyboardInterrupt错误,这将阻止退出您的程序。

# Good
try:
    ...
except ValueError:
    ...

# Bad
try:
    ...
except:
    ...