假设我有一个包含数学运算符的列表,就像这样:
operators = ['+','-','*','/']
我从这里随机选择一个运算符,就像这样
op = random.choice(operators)
如果我有两个数字,比如4和2,我该如何让Python使用这些数字进行数学运算(以名称“op”表示)?
您最好不要将运算符指定为文本。只需使用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>]
在这里,你定义了一个函数,它接受参数x
和y
,并计算x+2*y
(当然你也可以自己定义任意表达式)。
如果你确信你传递给 eval
的内容是安全的,那么可以使用它:
num1 = 4
num2 = 2
operators = ['+','-','*','/']
op = random.choice(operators)
res = eval(str(num1) + op + str(num2))
请记住,eval
会在不运行任何检查的情况下执行代码,请小心使用。如果使用ast
进行安全评估,请参考这里了解更多关于此主题的详细信息。
eval(..)
被认为是危险的。除非你绝对没有选择,最好避免使用它。 - Willem Van Onsemast
模块中的 literal_eval
。 - Ma0literal_eval
不适用于所有运算符,请尝试ast.literal_eval('2*3')
; 我其实很惊讶它适用于+
和-
。 - Chris_Rands
operator.div
。它要么是operator.floordiv
或者operator.truediv
(请参见这里获取操作符列表)。 - Willem Van Onsem