Python' 16 + 4'输入计算器

时间:2015-12-06 16:34:12

标签: python numbers calculator

我正在尝试找到一种创建计算器的方法,例如用户可以输入 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]))

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)可以提供很多帮助,尤其是在添加括号,功率和类似功能的情况下。