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

阶乘程序异常处理优化请求:统一负数与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}")

关键修改点说明

  1. 统一异常处理:在try块里先把输入转成整数,然后检查是否为负数,如果是就主动抛出ValueError,这样负数输入就和非整数输入一起进入except块,执行attempts_left -=1的逻辑,完全符合你的需求。
  2. 简化提示信息:用f-string和条件表达式动态生成剩余次数的提示,不用单独维护attempts_left字符串,代码更简洁。
  3. 修复变量问题:修正了拼写错误,把模糊的变量名改成语义化的名称(比如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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:08:49