如何从python中的输入运行数学运算

How to run the math from an input in python

我正在用Python创建一个需要运行基本数学操作的游戏。这些操作将由用户提供作为输入。我该怎么做?

到目前为止,我为每个数字和每个运算符都有独立的变量,但是,当我运行代码时,它不将运算符('+','-','*','/')识别为运算符,而是将其识别为字符串。因此,在运行编程时,它将作为1'+'1运行。

1
2
3
4
5
6
7
8
9
10
11
12
print("Now you can solve it.")
vinput1=int(input("Please input the first number"))
print("First number is recorded as", vinput1)

vop1=input("Please input your first operator")
print("Your operator is recorded as", vop1)

vinput2=int(input("Please input the second number"))
print("Second number is recorded as", vinput2)

vsofar = (vinput1, vop1, vinput2)
print(vsofar)

计算机输出:

1
(1, '+', 1)


最安全和最简单的方法是使用if语句检查输入的符号。if语句示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
print("Now you can solve it.")
vinput1=int(input("Please input the first number"))
print("First number is recorded as", vinput1)
vop1=input("Please input your first operator")
print("Your operator is recorded as", vop1)
vinput2=int(input("Please input the second number"))
print("Second number is recorded as", vinput2)

if (vop1 =="-"):
    vsofar = vinput1 - vinput2
    print(vsofar)
elif (vop1 =="+"):
    vsofar = vinput1 + vinput2
    print(vsofar)
elif (vop1 =="/"):
    vsofar = vinput1 / vinput2
    print(vsofar)
elif (vop1 =="*"):
    vsofar = vinput1 * vinput2
    print(vsofar)
else
    print("Invalid operator entered.")

为了快速解释,这些if语句检查输入的运算符(存储在vop1中)是否与-、+、*或/运算符匹配。如果它与其中任何一个匹配,则执行其各自的操作,并将其存储在变量vsofar,cw中,该变量在该操作之后打印在行中。如果所有操作都不起作用,则会打印一条无效的语句。

这是最平淡,最简单,也有点长的路要走。但是,eval()函数不安全。保罗·鲁尼的回答比我的方式短但更复杂。

希望这有帮助!


虽然eval在非常一般的上下文中运行,并且引入安全问题的范围非常大,但ast.literal_eval只用于评估字符串文本,因此范围更窄,因此更安全。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from ast import literal_eval

print("Now you can solve it.")
vinput1=int(input("Please input the first number"))
print("First number is recorded as", vinput1)

vop1=input("Please input your first operator")
print("Your operator is recorded as", vop1)

vinput2=int(input("Please input the second number"))
print("Second number is recorded as", vinput2)

vsofar = (vinput1, vop1, vinput2)

print(literal_eval(''.join(map(str, vsofar))))

否则,创建从运算符到函数的映射,以查找要为每个运算符调用的函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import operator
import sys

ops = {'+': operator.add,
       '-': operator.sub}

v1 = int(input('enter first num'))

op1 = input('input operator')

if not op1 in ops:
    print('unsupported operation')
    sys.exit(1)

v2 = int(input('enter second num'))

print(ops[op1](v1, v2))

最重要的是,您不必在程序逻辑中纠结于添加新的(二进制)操作。您只需将它们添加到dict中,就没有机会在长if/elif链中进行拼写错误。


如果不想使用eval(),可以尝试使用一系列条件来测试运算符,然后根据这些条件执行正确的计算。

1
2
3
4
if vop1 =="+":
    return vinput1 + vinput2
if vop1 =="-":
    return vinput1 - vinput2

你可以评估!

1
2
3
4
5
>>> input1=1
>>> input2=3
>>> vop1="+"
>>> print eval(str(input1)+vop1+str(input2))
4

看看这个

希望这有帮助!