我正在尝试找到一种创建计算器的方法,例如用户可以输入
6+8
并获得答案。
我试图找到一种更好的方法让它适用于多个数字或一个函数,以便它可以用于任何事情。
到目前为止,我的代码如下。
calc = input("Enter the calculation ")
nums = []
for i in calc: # Only works for single-digit numbers eg: 6+6
try:
if i != " ":
float(i)
except ValueError:
op = str(i)
lcalc = len(calc)
if lcalc == 3:
calc2 = calc[0]
calc3 = calc[2]
nums.append(int(calc2))
nums.append(int(calc3))
elif lcalc == 5:
calc2 = calc[0:2]
calc3 = calc[3:5]
nums.append(int(calc2))
nums.append(int(calc3))
elif lcalc == 7:
calc2 = calc[0:3]
calc3 = calc[4:7]
nums.append(int(calc2))
nums.append(int(calc3))
print(nums)
if op == "+":
print("Final answer = " +str(sum(nums)))
elif op == "-":
print("Final answer = " +str(nums[0] - nums[1]))
elif op == "/":
print("Final answer = " +str(nums[0] / nums[1]))
elif op == "*":
print("Final answer = " +str(nums[0] * nums[1]))
答案 0 :(得分:0)
最简单的方法是:
calc = input("Enter the calculation: ")
print("Final answer:", eval(calc))
说明:当你输入6+8
时,它也是python表达式,eval()
返回python表达式的结果。
但是用户可以输入任何python表达式(如quit()
或带字符串的东西)。
更好的答案是:
calc = input("Enter the calculation: ")
calc = calc.replace(" ", "")
m_i = calc.find("*")
m_i = len(calc) if m_i == -1 else m_i
d_i = calc.find("/")
d_i = len(calc) if d_i == -1 else d_i
while m_i < len(calc) or d_i < len(calc):
i = min(m_i, d_i)
p_i = calc.rfind("+", 0, i)
s_i = calc.rfind("-", 0, i)
val1_i = max(p_i, s_i)
val1 = int(calc[val1_i + 1:i])
p_i = calc.find("+", i)
p_i = len(calc) if p_i == -1 else p_i
s_i = calc.find("-", i)
s_i = len(calc) if s_i == -1 else s_i
val2_i = min(p_i, s_i)
val2 = int(calc[i + 1:val2_i])
if i == m_i:
ans = str(val1 * val2)
else:
ans = str(val1 // val2)
calc = calc.replace(calc[val1_i + 1:val2_i], ans, 1)
m_i = calc.find("*")
m_i = len(calc) if m_i == -1 else m_i
d_i = calc.find("/")
d_i = len(calc) if d_i == -1 else d_i
val = 0
t = "+"
i = -1
for p, x in enumerate(calc):
if x in "+-":
v = int(calc[i + 1:p])
if t == "+":
val += v
else:
val -= v
i = p
t = x
v = int(calc[i + 1:])
if t == "+":
val += v
else:
val -= v
print("Final answer:", val)
所以第一行就像以前一样。行:
calc = calc.replace(" ", "")
用空字符串替换字符串中的所有空格(因此删除它)。
m_i = calc.find("*")
m_i = len(calc) if m_i == -1 else m_i
d_i = calc.find("/")
d_i = len(calc) if d_i == -1 else d_i
找到最早的/
和*
,如果没有找到将它们设置为字符串的结尾,
while m_i < len(calc) or d_i < len(calc):
i = min(m_i, d_i)
在找到乘法或除法符号时执行的循环,i
是符号的早期,
p_i = calc.rfind("+", 0, i)
s_i = calc.rfind("-", 0, i)
val1_i = max(p_i, s_i)
val1 = int(calc[val1_i + 1:i])
找到左操作数的值(首先找到最后的+
和最后的-
符号,这两个中的较高者加上一个是左操作数的起始索引。)
行:
p_i = calc.find("+", i)
p_i = len(calc) if p_i == -1 else p_i
s_i = calc.find("-", i)
s_i = len(calc) if s_i == -1 else s_i
val2_i = min(p_i, s_i)
val2 = int(calc[i + 1:val2_i])
除了找到正确的操作数外,与之前的非常相似。
if i == m_i:
ans = str(val1 * val2)
else:
ans = str(val1 // val2)
calc = calc.replace(calc[val1_i + 1:val2_i], ans, 1)
计算乘法或除法的结果(我写//
,因为我认为你想要整数除法)并用结果替换表达式。
循环的最后一行与循环前的行相同,所以我不会解释它们。
在最后一个循环中t
是运算符,如果它是+
,val
将会增加最后一个值,否则会减少。
最后一行只打印最终值。
注意:使用正则表达式(re
)可以提供很多帮助,尤其是在添加括号,功率和类似功能的情况下。