编写递归函数通过input校验用户输入时return返回结果异常问题咨询
问题根因
你当前代码的返回值异常来自两个核心逻辑错误:
- 递归调用结果未回传:异常分支中调用
get_pizza_info()后,你没有将递归得到的正确返回值向上层传递,反而直接返回了None,导致最终调用方拿到的是空值而非校验后的参数 - 递归设计不合理:任意一步输入错误就重新调用整个函数,已经输入正确的内容也需要重复填写,体验极差,且递归层级过高会触发栈溢出报错
解决方案
最小改动修复现有递归逻辑
如果要保留你现有的递归写法,只需要删除异常分支的return None,改为直接返回递归调用的结果即可,同时原函数不需要传入参数,因为所有参数都会被内部输入覆盖:
def get_pizza_info(): try: size = int(input("Enter size from 1-3: ")) except ValueError: print("Error, please enter a whole number. ") return get_pizza_info() try: meats = int(input("Enter number of meat toppings ")) except ValueError: print("Error, enter a whole number. ") return get_pizza_info() try: veg = int(input("Enter number of non-meat toppings ")) except ValueError: print("Error, enter a whole number. ") return get_pizza_info() try: quantity = int(input("Enter number of these pizzas ")) except ValueError: print("Error, enter a whole number. ") return get_pizza_info() if size >= 4: size = 3 if size <= 1: size = 1 if meats <= 1: meats = 1 if veg <= 1: veg = 1 return size, meats, veg, quantity
更推荐的循环实现(生产环境优先使用)
递归实现的体验和稳定性都很差,建议将整数输入校验抽为通用函数,单步输入出错只重输当前项,不需要重复填写之前的正确内容:
# 通用整数输入校验函数,支持设置最小值 def input_valid_int(prompt, min_value=None): while True: try: input_num = int(input(prompt)) if min_value is not None and input_num < min_value: input_num = min_value return input_num except ValueError: print("Error, please enter a whole number. ") def get_pizza_info(): size = input_valid_int("Enter size from 1-3: ", min_value=1) size = 3 if size > 3 else size meats = input_valid_int("Enter number of meat toppings ", min_value=1) veg = input_valid_int("Enter number of non-meat toppings ", min_value=1) quantity = input_valid_int("Enter number of these pizzas ", min_value=1) return size, meats, veg, quantity
该实现的优势:
- 单步错误单步重试,用户体验更好
- 无递归栈溢出风险,稳定性更高
- 通用逻辑复用,代码更简洁易维护
内容的提问来源于stack exchange,提问作者Grelm
相关产品推荐
相关产品推荐

