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
相关产品推荐
相关产品推荐

