如何定义接收两个正整数的Python函数,输入非法时抛出ValueError并提示
问题解答
现有代码问题梳理
- 类型校验顺序错误:先执行了数值正负判断,再校验输入类型,如果输入为字符串,执行
val1 < 0会直接触发类型错误,无法抛出你需要的ValueError - 抛出异常时没有携带'invalid'提示信息,不符合需求
- 函数内部打印语句误用了外部变量
int1、int2,没有使用形参val1、val2,代码耦合性高且容易报错 - 函数调用逻辑没有放在try-except块内,函数内部抛出的异常不会被捕获,会直接中断程序输出错误栈
修正后完整代码
import math def coprimeTestFunction(val1, val2): # 先校验类型,再校验数值范围 if type(val1) != int or type(val2) != int: raise ValueError("invalid") if val1 < 0 or val2 < 0: raise ValueError("invalid") result = math.gcd(val1, val2) if result == 1: print(f'The values {val1} and {val2} are coprime') else: print(f'The values {val1} and {val2} are not coprime, they have a GCD of {result}') try: int1 = int(input('Enter first integer: ')) int2 = int(input('Enter second integer: ')) # 函数调用移到try块内,捕获内部抛出的异常 coprimeTestFunction(int1, int2) except ValueError as e: # 所有异常场景统一输出invalid print("invalid")
核心改动说明
- 调整校验顺序:先判断输入类型是否为int,再判断是否为正整数,避免字符串输入触发类型异常
- 抛出ValueError时直接携带'invalid'信息,符合需求要求
- 函数内打印语句替换为形参,消除对外部变量的依赖
- 将函数调用移入try块,统一捕获输入阶段和函数校验阶段的所有ValueError,统一输出'invalid'提示
- 简化了互质判断的分支逻辑,删除冗余的else分支,
math.gcd返回值一定为正整数,不会出现未覆盖的情况
内容的提问来源于stack exchange,提问作者Jery
相关产品推荐
相关产品推荐

