Python:使用列表中的运算符进行数学运算

3

假设我有一个包含数学运算符的列表,就像这样:

operators = ['+','-','*','/']

我从这里随机选择一个运算符,就像这样

op = random.choice(operators)

如果我有两个数字,比如4和2,我该如何让Python使用这些数字进行数学运算(以名称“op”表示)?
2个回答

7

您最好不要将运算符指定为文本。只需使用lambda表达式或operator模块:

<b>import operator</b>
import random

operators = [operator.<b>add</b>,operator.<b>sub</b>,operator.<b>mul</b>,operator.<b>floordiv</b>]
op = random.choice(operators)

您可以通过传递两个参数来调用op,例如:
result = op(2,3)

例如:

>>> import operator
>>> import random
>>> 
>>> operators = [operator.add,operator.sub,operator.mul,operator.floordiv]
>>> op = random.choice(operators)
>>> op
<built-in function sub>
>>> op(4,2)
2

正如您所看到的,random选择了sub运算符,因此它从4中减去了2

如果您想定义一个不受operator支持的函数等,可以使用lambda表达式,例如:

operators = [operator.add,<b>lambda x,y:x+2*y</b>]

在这里,你定义了一个函数,它接受参数xy,并计算x+2*y(当然你也可以自己定义任意表达式)。


谢谢!我尝试使用operator.div,但是一直出现错误? - DW_0505
@DW_0505:是的,没有 operator.div。它要么是 operator.floordiv 或者 operator.truediv(请参见这里获取操作符列表)。 - Willem Van Onsem
谢谢你的帮助! - DW_0505

4

如果你确信你传递给 eval 的内容是安全的,那么可以使用它:

num1 = 4
num2 = 2
operators = ['+','-','*','/']
op = random.choice(operators)
res = eval(str(num1) + op + str(num2))

请记住,eval会在不运行任何检查的情况下执行代码,请小心使用。如果使用ast进行安全评估,请参考这里了解更多关于此主题的详细信息。


1
eval(..) 被认为是危险的。除非你绝对没有选择,最好避免使用它。 - Willem Van Onsem
@TheQuantumPhysicist 你可以使用更安全的 ast 模块中的 literal_eval - Ma0
1
@Ev.Kounis literal_eval 不适用于所有运算符,请尝试ast.literal_eval('2*3'); 我其实很惊讶它适用于+- - Chris_Rands
1
@Chris_Rands 在某些情况下,加减也会失败。请参见上面的链接。 - Ma0
1
@Ev.Kounis 谢谢,另请参见:https://dev59.com/A5zha4cB1Zd3GeqPFXfA - Chris_Rands
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接