阶乘程序异常处理优化请求:统一负数与ValueError处理逻辑
阶乘程序修改与代码优化建议
首先得指出你原代码里的几个关键问题:
- 异常捕获的写法完全不对:
except: ValueError or number < 0这种语法是无效的,Python没法这么解析。咱们要把负数输入的情况和非整数输入统一处理,得在try块里主动检查并抛出异常。 - 变量命名不够清晰:比如
interger是拼写错误(应该是integer),long、c这类变量名看不出用途,可读性太差。 - 重复的字符串拼接逻辑:
attempts_left的生成可以简化,不用写两次if判断。
修改后的代码(实现负数与ValueError统一处理)
# 初始化核心变量 factorial_result = 1 max_attempts = 3 attempts_left = max_attempts while attempts_left > 0: try: # 动态生成提示信息 prompt = "Please enter a non-negative number to find the factorial of" if attempts_left < max_attempts: prompt += f", {attempts_left} attempt{'s' if attempts_left != 1 else ''} remaining." number = int(input(prompt)) # 检查是否为负数,主动抛出ValueError,和非整数输入统一处理 if number < 0: raise ValueError("Negative numbers are not allowed") # 输入有效,退出循环 break except ValueError: print("Invalid input! Please enter a non-negative integer.") attempts_left -= 1 if attempts_left == 0: print("NO MORE ATTEMPTS") else: # 计算阶乘 if number <= 1: factorial_result = 1 print("Your factorial result is 1") else: factorial_expression = "" for i in range(1, number + 1): factorial_result *= i # 构建阶乘表达式字符串 factorial_expression += f"{i}{' * ' if i < number else ''}" print(f"The equation is {factorial_expression} = {factorial_result}")
关键修改点说明
- 统一异常处理:在try块里先把输入转成整数,然后检查是否为负数,如果是就主动抛出
ValueError,这样负数输入就和非整数输入一起进入except块,执行attempts_left -=1的逻辑,完全符合你的需求。 - 简化提示信息:用f-string和条件表达式动态生成剩余次数的提示,不用单独维护
attempts_left字符串,代码更简洁。 - 修复变量问题:修正了拼写错误,把模糊的变量名改成语义化的名称(比如
long改成factorial_expression),可读性大大提升。
代码结构优化建议
- 提取功能为独立函数:把“获取有效输入”和“计算阶乘”拆成单独的函数,让代码模块化,复用性更强。比如:
主逻辑就能简化成:def get_valid_non_negative_integer(max_attempts=3): attempts_left = max_attempts while attempts_left > 0: prompt = "Please enter a non-negative number to find the factorial of" if attempts_left < max_attempts: prompt += f", {attempts_left} attempt{'s' if attempts_left !=1 else ''} remaining." try: num = int(input(prompt)) if num < 0: raise ValueError return num except ValueError: print("Invalid input! Please enter a non-negative integer.") attempts_left -=1 return None def calculate_factorial(n): return 1 if n <=1 else n * calculate_factorial(n-1) # 用递归更简洁,循环也可以number = get_valid_non_negative_integer() if number is None: print("NO MORE ATTEMPTS") else: factorial = calculate_factorial(number) expr = " * ".join(str(i) for i in range(1, number+1)) print(f"The equation is {expr} = {factorial}") - 遵循PEP8规范:变量名用下划线分隔(
factorial_result而非factorialnumber),代码缩进统一用4个空格,换行保持合理的可读性。 - 减少冗余逻辑:比如计算阶乘时,0和1的阶乘都是1,可以合并判断;构建表达式字符串时用
join方法比循环拼接更高效。
内容的提问来源于stack exchange,提问作者draw electric
相关产品推荐
相关产品推荐

