Python计算用户输入移动平均时触发TypeError NoneType解包报错问题
错误原因
- 核心报错触发点:
user_input函数触发ValueError异常后没有返回任何值,直接递归调用了main(),导致最初调用user_input的主函数拿到的返回值为None,尝试将None解包为三个变量时直接抛出TypeError: cannot unpack non-iterable NoneType object - 逻辑设计缺陷:你用递归调用
main()的方式做输入重试,会不断堆叠调用栈,即使后续递归链路计算出了结果,上层调用链路的解包操作依然会触发报错,同时输入错误一次就要重填所有内容,使用体验很差。
修复后的可运行代码
def user_input(): # 输入移动平均窗口大小 while True: try: avg_size = int(input("请输入移动平均窗口大小(需小于样本数值数量):")) break except ValueError: print("警告:输入非法值,请输入整数!") # 输入样本数量 while True: try: size = int(input("请输入样本数值的总数量:")) break except ValueError: print("警告:输入非法值,请输入整数!") # 输入样本元素 user_list = [] for i in range(size): while True: try: val = int(input(f"请输入第{i+1}个元素:")) user_list.append(val) break except ValueError: print("警告:输入非法值,请输入整数,重新输入当前元素!") return user_list, size, avg_size def validation(size, avg_size): if size < avg_size: print("警告:移动平均窗口大小不能大于样本数量!") return False elif size == 0 or avg_size == 0 or size == 1: print("警告:当前参数无法计算移动平均!") return False else: print("参数校验通过!") return True def mv_avg(li, size, a_s): avg_li = [] for i in range(size): if i + 1 < a_s: avg_li.append(float('NaN')) else: avg_li.append(sum(li[(i - a_s + 1):i + 1]) / a_s) print(f"计算得到的{a_s}窗口移动平均结果如下:{avg_li}") def main(): while True: value_list, size, avg_size = user_input() if validation(size, avg_size): break mv_avg(value_list, size, avg_size) if __name__ == "__main__": main()
修复说明
- 每个输入环节单独做循环重试,输入错误时只会要求重输当前项,不需要从头重新输入所有内容
- 移除了所有函数内递归调用
main()的错误逻辑,校验不通过时返回布尔值让主循环控制重试 - 异常处理范围更精准,不会因为单个元素输入错误清空已经输入的内容
- 解包操作永远可以拿到正确的三个返回值,不会再触发None解包的报错
内容的提问来源于stack exchange,提问作者Kriti Dixit
相关产品推荐
相关产品推荐

