【问题标题】:Python - use an operator at runtimePython - 在运行时使用运算符
【发布时间】:2014-03-30 09:29:19
【问题描述】:

是否可以在运行时在两个变量之间插入操作(例如*+)? 我不这样做的解决方案是多个 if、elif 语句,但我认为这不是最有效的方法。

编辑:我的意思是我得到两个整数,我想对其中一个和另一个进行运算,例如x * y,但我想将* 更改为另一个运算符(也许它们是调用函数?不确定)例如-+^ 基于输入。

这有意义吗?基本上把它想象成一个计算器。

【问题讨论】:

    标签: python function math operators calculator


    【解决方案1】:

    如果您的运算符列表足够小,您可能可以使用 lambda。

    def operator_factory(op):
        if op == '+':
            return lambda x,y: x + y
        elif op == '-':
            return lambda x,y: x - y
        elif op == '*':
            return lambda x,y: x * y
        elif op == '/':
            return lambda x,y: x / y
        elif op == '^':
            return lambda x,y: x ^ y
    

    您的 if 语句可能取决于用户输入。然后你就这样使用它:

    >>> f = operator_factory('+')
    >>> f(2,3)
    5
    

    【讨论】:

      【解决方案2】:

      例如,要回答后续问题,您可以将 int 子类化,然后实现 __xor__ 以求幂,而不是应用按位或,这由 ^ 运算符调用:

      import operator
      
      class MyInt(int):
          def __xor__(self, other):
              return operator.pow(self, other)
      

      然后:

      >>> i = MyInt(2)
      >>> i
      2
      >>> type(i)
      <class '__main__.MyInt'>
      >>> j = 3
      >>> i^j
      8
      

      【讨论】:

      • 根据上下文,我猜 OP 想要求幂(即 **),而不是 xor。
      • @Teepeemm 你是对的,但为了证明这一点,我需要一个与** 不同的运算符。这有意义吗?
      • 是的。我没有仔细阅读您的答案,没有注意到您将 ^ 重新定义为求幂。
      【解决方案3】:

      @AaronHall's 是您正在寻找的答案,但为了完整起见,我提一下您也可以使用 eval

      var_1 = 2
      var_2 = 3
      op = '+'
      print eval('%s%s%s' % (var_1, op, var_2))
      

      但是,eval is evil,所以要么不要使用,要么谨慎使用。

      【讨论】:

        【解决方案4】:

        我不确定这是否是您要查找的内容,但 operator 模块有很多操作,例如addmul(相乘):

        import operator
        
        var_1 = 2
        var_2 = 3
        
        print(operator.add(var_1, var_2))
        print(operator.mul(var_1, var_2))
        

        将打印

        5
        6
        

        【讨论】:

          猜你喜欢
          • 2018-12-18
          • 2017-08-07
          • 1970-01-01
          • 1970-01-01
          • 2011-04-17
          • 1970-01-01
          • 2023-03-09
          • 2011-05-30
          • 1970-01-01
          相关资源
          最近更新 更多