You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python循环异常问题:优化后代码输入非法值时提前终止

问题描述

我有一段可正常运行的Python代码,觉得代码冗余就做了简化优化,但优化后的代码存在问题:在第二个输入框输入非数字或小于0的数值时,虽然会弹出对应提示,但程序直接终止——尽管我已经添加了continue语句。原代码能正常循环校验输入,我希望优化后的代码和原代码功能完全一致,且不想使用过于复杂的实现方式。

相关函数:

def check_valid_number(data):
    return 0 <= data

def even_division(inp1, inp2):
    return inp1 % inp2 == 0

原代码:

num1, check = None, None
proceed_answer = input('Great, we have one more game, wanna play? (y/n): ')

if proceed_answer == 'y':
    while True:
        if num1 is None or not check_valid_number(num1):
            try:
                num1 = float(input('Enter one valid number: '))
            except ValueError:
                print('It must be a number!')
                continue
            if not check_valid_number(num1):
                print('It must be greater than 0!')
                continue
        if check is None or not check_valid_number(check):
            try:
                check = float(input('Enter one more valid number: '))
            except ValueError:
                print('It must be a number!')
                continue
            if not check_valid_number(check):
                print('It must be greater than 0!')
                continue
        if even_division(num1, check):
            print(f'{check} divides evenly into {num1}')
        else:
            print(f'{check} does not divide evenly into {num1}')
        break
elif proceed_answer == 'n':
    print('Okay, bye')

优化后有问题的代码:

num1, check = None, None
proceed_answer = input('Great, we have one more game, wanna play? (y/n): ')

if proceed_answer.lower() == 'y':
    while num1 is None or not check_valid_number(num1):
        try:
            num1 = float(input('Enter one valid number: '))
        except ValueError:
            print('It must be a number!')
            continue
        if not check_valid_number(num1):
            print('It must be greater than 0!')
            continue
        try:
            check = float(input('Enter one more valid number: '))
        except ValueError:
            print('It must be a number!')
            continue
        if not check_valid_number(check):
            print('It must be greater than 0!')
            continue
        if even_division(num1, check):
            print(f'{check} divides evenly into {num1}')
        else:
            print(f'{check} does not divide evenly into {num1}')
else:
    print('Okay, bye')
问题原因

优化后的代码外层while循环只校验num1的合法性,当num1输入合法后,循环条件num1 is None or not check_valid_number(num1)不再成立。此时如果check输入非法,执行continue会回到while循环的条件判断,因为条件不满足,循环直接终止,导致程序退出,而不是重新校验check的输入。

修复方案

把外层循环改回while True(和原代码逻辑一致),这样不管num1是否合法,只要check不合法,就能继续循环校验check的输入。同时保留你优化的proceed_answer.lower()处理,让输入不区分大小写。

修复后的代码:

num1, check = None, None
proceed_answer = input('Great, we have one more game, wanna play? (y/n): ')

if proceed_answer.lower() == 'y':
    while True:
        if num1 is None or not check_valid_number(num1):
            try:
                num1 = float(input('Enter one valid number: '))
            except ValueError:
                print('It must be a number!')
                continue
            if not check_valid_number(num1):
                print('It must be greater than 0!')
                continue
        if check is None or not check_valid_number(check):
            try:
                check = float(input('Enter one more valid number: '))
            except ValueError:
                print('It must be a number!')
                continue
            if not check_valid_number(check):
                print('It must be greater than 0!')
                continue
        if even_division(num1, check):
            print(f'{check} divides evenly into {num1}')
        else:
            print(f'{check} does not divide evenly into {num1}')
        break
else:
    print('Okay, bye')
进一步简化(可选)

如果想避免重复的输入校验逻辑,可以提取一个输入校验函数,让代码更简洁易维护:

def check_valid_number(data):
    return 0 <= data

def even_division(inp1, inp2):
    return inp1 % inp2 == 0

def get_valid_number(prompt):
    while True:
        try:
            num = float(input(prompt))
            if check_valid_number(num):
                return num
            else:
                print('It must be greater than 0!')
        except ValueError:
            print('It must be a number!')

num1, check = None, None
proceed_answer = input('Great, we have one more game, wanna play? (y/n): ')

if proceed_answer.lower() == 'y':
    num1 = get_valid_number('Enter one valid number: ')
    check = get_valid_number('Enter one more valid number: ')
    if even_division(num1, check):
        print(f'{check} divides evenly into {num1}')
    else:
        print(f'{check} does not divide evenly into {num1}')
else:
    print('Okay, bye')

内容的提问来源于stack exchange,提问作者Foo127

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 00:47:39