【问题标题】:Python: Mathematical Operations using Operators from a listPython:使用列表中的运算符进行数学运算
【发布时间】:2017-08-07 18:46:08
【问题描述】:

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

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

我从这里取一个随机运算符,像这样

op = random.choice(operators)

如果我取两个数字,比如 4 和 2,我如何让 Python 对这些数字进行数学运算(在名称“op”下)?

【问题讨论】:

    标签: python list math operators


    【解决方案1】:

    您最好不要将运算符指定为文本。只需使用 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>]

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

    【讨论】:

    • 谢谢!我曾尝试使用 operator.div,但我一直收到错误消息?
    • @DW_0505:是的,没有operator.div。它是operator.floordivoperator.truediv(有关运算符列表,请参阅here)。
    • 感谢您的帮助!
    【解决方案2】:

    如果你绝对确定你传递给它的东西是安全的,你可以使用eval

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

    请记住,eval 执行代码时不会对其进行任何检查,因此请小心。在使用ast 进行安全评估时,请参阅this 了解有关该主题的更多详细信息。

    【讨论】:

    • eval(..) 被认为是危险的。你最好避免它,除非你别无选择。
    • @WillemVanOnsem 同意。我只是用给定的参数提供答案:)
    • @Ev.Kounis literal_eval 不适用于所有运营商,请尝试ast.literal_eval('2*3');我真的很惊讶它可以与 +- 一起使用
    • @Chris_Rands 似乎在某些情况下,加法和减法也失败了。见上面的链接,
    • @Ev.Kounis 谢谢,另见:stackoverflow.com/questions/40584417/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多