Python控制台计算器输入1*5时输出不符合预期问题排查
Python计算器懒提示片段缺失问题排查
问题复现
程序运行后输入算式1 * 5,预期输出:
You are ... lazy ... very lazy 5.0 Do you want to store the result? (y / n):
实际输出缺少... very lazy片段:
You are ... lazy 5.0 Do you want to store the result? (y / n):
附问题代码:
msg_0 = "Enter an equation" msg_1 = "Do you even know what numbers are? Stay focused!" msg_2 = "Yes ... an interesting math operation. You've slept through all classes, haven't you?" msg_3 = "Yeah... division by zero. Smart move..." msg_4 = "Do you want to store the result? (y / n):" msg_5 = "Do you want to continue calculations? (y / n):" msg_6 = " ... lazy" msg_7 = " ... very lazy" msg_8 = " ... very, very lazy" msg_9 = "You are" memory = 0 def is_one_digit(v): v = float(v) if -10 < v < 10 and v.is_integer(): return True else: return False def check(v1, v2, v3): msg = "" if is_one_digit(v1) and is_one_digit(v2): msg = msg + msg_6 if (v1 == 1 or v2 == 1) and v3 == "*": msg = msg + msg_7 if (v1 == 0 or v2 == 0) and (v3 == "*" or v3 == "+" or v3 == "-"): msg = msg + msg_8 if msg != "": msg = msg_9 + msg print(msg) while True: calc = input(msg_0) try: x = calc.split()[0] oper = calc.split()[1] y = calc.split()[2] if x == "M": x = memory if y == "M": y = memory float(x) float(y) if oper in ["+", "-", "*", "/"]: check(x, y, oper) if oper == "+": result = float(x) + float(y) print(result) elif oper == "-": result = float(x) - float(y) print(result) elif oper == "*": result = float(x) * float(y) print(result) elif oper == "/": if float(y) != 0: result = float(x) / float(y) print(result) else: print(msg_3) continue user_input = input(msg_4) if user_input == "y": memory = result user_i = input(msg_5) if user_i == "y": continue elif user_i == "n": break else: user_i = input(msg_5) elif user_input == "n": user_i = input(msg_5) if user_i == "y": continue elif user_i == "n": break else: user_i = input(msg_5) else: user_input = input(msg_5) else: print(msg_2) except ValueError: print(msg_1) continue
根因定位
问题出在变量类型不匹配:
- 从输入流拆分得到的
x、y默认是字符串类型,代码中float(x)、float(y)仅做了类型合法性校验,没有将转换后的数值重新赋值给变量,传入check()函数的依然是字符串格式的"1"、"5"。 is_one_digit()函数内部主动做了float(v)转换,所以判断两个操作数都是个位数的逻辑可以正常触发,成功拼接... lazy片段。- 触发
... very lazy的判断条件为(v1 == 1 or v2 == 1) and v3 == "*",字符串"1"和整数1做等值比较结果为False,条件不触发,对应提示片段不会被拼接。
注意:判断操作数为0拼接... very, very lazy的逻辑也存在同样的类型问题,输入含0的简单算式时也会出现提示缺失。
修复方案
在类型校验环节将转换后的浮点数赋值回原变量即可,替换原代码中:
float(x) float(y)
为:
x = float(x) y = float(y)
修改后传入check()的x、y均为数值类型,所有等值判断可以正常命中,提示输出符合预期。
内容的提问来源于stack exchange,提问作者J. Moe
相关产品推荐
相关产品推荐

