【发布时间】:2017-08-07 18:46:08
【问题描述】:
假设我有一个包含数学运算符的列表,像这样
operators = ['+','-','*','/']
我从这里取一个随机运算符,像这样
op = random.choice(operators)
如果我取两个数字,比如 4 和 2,我如何让 Python 对这些数字进行数学运算(在名称“op”下)?
【问题讨论】:
标签: python list math operators
假设我有一个包含数学运算符的列表,像这样
operators = ['+','-','*','/']
我从这里取一个随机运算符,像这样
op = random.choice(operators)
如果我取两个数字,比如 4 和 2,我如何让 Python 对这些数字进行数学运算(在名称“op”下)?
【问题讨论】:
标签: python list math operators
您最好不要将运算符指定为文本。只需使用 lambda 表达式,或 operator 模块:
import operator
import random
operators = [operator.add,operator.sub,operator.mul,operator.floordiv]
op = random.choice(operators)
然后您可以通过使用两个参数调用op,例如:
result = <b>op(2,3)</b>
例如:
>>> 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(当然你可以自己定义任意表达式)。
【讨论】:
operator.div。它是operator.floordiv 或operator.truediv(有关运算符列表,请参阅here)。
如果你绝对确定你传递给它的东西是安全的,你可以使用eval:
num1 = 4
num2 = 2
operators = ['+','-','*','/']
op = random.choice(operators)
res = eval(str(num1) + op + str(num2))
请记住,eval 执行代码时不会对其进行任何检查,因此请小心。在使用ast 进行安全评估时,请参阅this 了解有关该主题的更多详细信息。
【讨论】:
eval(..) 被认为是危险的。你最好避免它,除非你别无选择。
literal_eval 不适用于所有运营商,请尝试ast.literal_eval('2*3');我真的很惊讶它可以与 + 和 - 一起使用