Python如何将随机选取的函数作为if判断条件实现数学测验需求
问题原因
- 你给
prob赋值时直接调用了选中的运算函数,而四个运算函数均无返回值,因此prob的值始终为None,后续所有prob == numlist[x]的判断全部不成立,导致反馈逻辑完全被跳过。正确写法是先把选中的函数本身存到变量,再单独执行调用。 - 你试图用
add.addition的方式读取运算结果是错误的,addition是你定义的全局变量,不是add函数的属性,直接调用变量名即可读取。 - 现有代码还有多个隐性问题:除法逻辑中先计算除法再判断除数是否为0,会直接触发报错;减法逻辑未覆盖结果为0的场景,会出现无题目输出的情况;递归生成符合要求的题目可能触发栈溢出;字符串对比答案容错性极低,用户多输一个空格就会被判错。
修复后可用代码
import random def add(): num1 = random.randint(0, 999) num2 = random.randint(0, 999) res = num1 + num2 print(f' {num1}\n+{num2}') return res def sub(): while True: num1 = random.randint(0, 999) num2 = random.randint(0, 999) res = num1 - num2 if res >= 0: break print(f' {num1}\n-{num2}') return res def mult(): num1 = random.randint(1, 12) num2 = random.randint(1, 12) res = num1 * num2 print(f'{num1} * {num2}') return res def div(): while True: num1 = random.randint(0, 150) num2 = random.randint(1, 150) # 直接限定除数不为0 if num1 % num2 == 0: res = num1 // num2 break print(f'{num1} / {num2}') return res numlist = [add, sub, mult, div] def problem(): while True: # 先选函数,再调用,同时拿到返回的正确结果 prob_func = random.choice(numlist) correct_ans = prob_func() # 转换用户输入为数字对比,容错率更高 try: user_ans = int(input("请输入答案:")) except ValueError: print("输入无效,请输入数字") continue if user_ans == correct_ans: print('Congrats! You got it right.') else: print(f'Incorrect. The answer is {correct_ans}.') # 控制是否继续 done = input('Type "done" if you want to be done. Press Enter if you want another problem.\n') if done.lower() == 'done': break problem()
核心修改说明
- 把四个运算函数改为直接返回计算结果,不需要用全局变量存结果,逻辑更简洁也避免了全局变量污染。
- 选函数和调用逻辑拆分,同时直接拿到正确答案,不需要再判断当前是哪类运算,省去了大量冗余的if-else判断。
- 用循环代替递归生成符合要求的减法、除法题目,避免栈溢出风险,同时修复了除数为0、减法结果为负的问题。
- 增加了用户输入有效性校验,避免用户输入非数字内容导致程序崩溃。
内容的提问来源于stack exchange,提问作者Cade
相关产品推荐
相关产品推荐

