如何计算这些字符串的总和是多少?

时间:2017-12-06 13:58:01

标签: python-3.x

import sys
import random
Num1 = str(random.randint(1,109))
Num2 = str(random.randint(1,109))
Opp = ["+", "-", "*", "^", "/"]

secure_random = random.SystemRandom()

Operator = secure_random.choice(Opp)
if Operator == "^":
    Num2 = "2"
print ("som:", Num1 , Operator , Num2, "= ")

我创建了一些变量,其中一个是opperator,我打印但现在我必须计算它... 我尝试使用eval() 但我无法让这个工作 我该如何计算这笔金额?

3 个答案:

答案 0 :(得分:0)

在这种特殊情况下,您确实可以使用eval,尽管通常您希望尽可能避免使用它,因为没有安全检查执行什么字符串表达式。

您的锻炼是s = Num1+Operator+Num2。你可以通过字符串eval(s)的中间声明,或者通过在eval中键入右边来s。{/ p>

答案 1 :(得分:0)

您还可以在Python中使用类似堆栈的功能来创建自己的计算器。下面是计算器的一个简单示例:

  • 总和,
  • 差异,
  • 乘法
  • 求幂

它可以计算这些表达式:

"1 - 2 * 3 + 4 * 2 - 1 - 2"
"8 / 2 + 1 / 2 * 2 / 2 - 1"

在这个简单的实现中,空格用于分隔标记。下面的源代码中提供了更多测试:

def calc(str):
    tokens = str.split(" ")
    vals = []
    ops = []
    i = 0
    while i < len(tokens):
        t = tokens[i]
        if t == "+":
            processPlus(ops, vals)
        elif t == "*":
            ops.append(t)
        elif t == "-":
            processPlus(ops, vals)
            i, t = incrementAndGet(i, t, tokens)
            vals.append(float(t) * -1)
        elif t == "^":
            previousVal = vals.pop()
            i, t = incrementAndGet(i, t, tokens)
            vals.append(pow(previousVal, float(t)))
        elif t == "/":
            previousVal = vals.pop()
            i, t = incrementAndGet(i, t, tokens)
            vals.append(previousVal / float(t))
        else:
            vals.append(float(t))
        i += 1
    while len(ops) > 0:
        processOp(vals, ops)
    return sum(vals)


def incrementAndGet(i, t, tokens):
    i += 1
    t = tokens[i]
    return i, t


def processPlus(ops, vals):
    if len(ops) > 0:
        processOp(vals, ops)
    ops.append("+")


def processOp(vals, ops):
    op = ops.pop()
    if op == "+":
        vals.append(vals.pop() + vals.pop())
    elif op == "*":
        vals.append(vals.pop() * vals.pop())

# Test section
def check(expr, expected):
    res = calc(expr)
    print(res)
    assert res == expected


check("8 / 2 / 2 / 2", 1.0)
check("8 / 2 + 1 / 2 / 2", 4.25)
check("8 / 2 + 1 / 2 * 2 / 2", 4.5)
check("8 / 2 + 1 / 2 * 2 / 2 - 1", 3.5)
check("1 + 2", 3)
check("1 - 2", -1)
check("2 * 3", 6)
check("1 + 2 * 2", 5)
check("2 * 3 + 2", 8)
check("1 * 2 + 2 * 3", 8)
check("1 * 2 + 2 * 3 + 1", 9)
check("1 * 2 + 2 * 3 + 1 + 2", 11)
check("1 * 2 + 2 * 3 + 1 + 2 * 2", 13)
check("1 - 2 * 3 + 4 * 2 - 1 - 2", 0.0)
check("1 - 2 * 3 + 4 * 2 - 1 - 2 * 2", -2.0)
check("1 - 2 * 3 + 4 * 2 - 1 - 2 * 2 - 3", -5.0)
check("2 ^ 2", 4.0)
check("2 + 3 ^ 2", 11.0)
check("2 + 3 ^ 2 - 1", 10.0)
check("2 + 3 ^ 2 - 1 * 3", 8.0)

答案 2 :(得分:0)

eval()不支持运营商^,但您可以使用它。

import sys
import random
Num1 = str(random.randint(1,109))
Num2 = str(random.randint(1,109))
Opp = ["+", "-", "*", "^", "/"]

secure_random = random.SystemRandom()

Operator = secure_random.choice(Opp)
if Operator == "^":
    Operator = "*"
    Num2 = Num1
result = eval(Num1+Operator+Num2)
print ("som:", Num1 , Operator , Num2, "= ", result)
相关问题