【问题标题】:Writing a function in python with addition and subtraction operators as arguments用加法和减法运算符作为参数在python中编写函数
【发布时间】:2018-04-19 19:19:38
【问题描述】:

我真的很困惑,我不知道如何解决以下问题。

想象一下我写了一个很长的代码,我想把这个很长的代码转换成一个函数来防止重复。问题是我需要将“加号”(+)和“减号”(-)作为函数输入。我的意思是我有一个很长的代码,我需要每次更改两个加减法符号,仅此而已,最后根据更改这两个运算符获得输出(这两个运算符实际上是我的变量!)

如您所知,为改变“加减符号”的四种不同状态重复这个长函数会使我的代码越来越长。我想知道是否有任何方法可以只定义一个函数,将这对加法和减法运算符作为输入并为我提供这四种不同条件的输出? 我做了一个简单的例子来澄清这个问题:

想象一下,我有四个类似的“for 循环”,只是在“减号”和“加号”方面有所不同:

edges=set()
a=60; b=40
for i in range(0,300):
    a+=1; b+=1
    if a!=0 and b!=0:
        edges.add((a, b))

a=60; b=40
for i in range(0,300):
    a-=1; b-=1
    if a>=0 and b>=0:
        edges.add((a, b))

a=60; b=40
for i in range(0,300):
    a+=1; b-=1
    if a>=0 and b>=0:
        edges.add((a, b))

a=60; b=40
for i in range(0,300):
    a-=1; b+=1
    if a>=0 and b>=0:
        edges.add((a, b))
print(edges)

如您所见,这四个“for 循环”除了“加号和减号”之外都相同。我只想编写一个函数,而不是这四个重复的“for 循环”。有没有其他方法可以解决这个问题?有人知道吗?

【问题讨论】:

    标签: python function arguments


    【解决方案1】:

    编写函数以接受增量作为参数。

    def add_edges(aincr, bincr):
        for i in range(0,300):
            a += aincr; b += bincr
            if a!=0 and b!=0:
                edges.add((a, b))
    

    然后在调用时传入适当的增量:

    add_edges(1, 1)
    add_edges(-1, -1)
    add_edges(1, -1)
    add_edges(-1, 1)
    

    没有必要传递“加法”或“减法”的概念,因为你可以用数字来做。您可以(如其他答案所示),但尽量不要使事情过于复杂。

    【讨论】:

      【解决方案2】:

      您可以将 add_1 和 minus_1 创建为函数并将它们作为 args 传递给另一个函数:

      def add_1(x):
          return x + 1
      
      def minus_1(x):
          return x - 1
      
      def do_op(a, b, f1, f2):
          for i in range(0,300):
              a, b = f1(a), f2(b)
              if a>=0 and b>=0:
                  edges.add((a, b))
      
      do_op(60, 40, add_1, add_1)
      do_op(60, 40, minus_1, minus_1)
      do_op(60, 40, add_1, minus_1)
      do_op(60, 40, minus_1, add_1)
      print(edges)
      

      您也可以直接传入 lambda:

      do_op(60, 40, lambda x:  x + 1, lambda x:  x + 1)
      do_op(60, 40, lambda x:  x - 1, lambda x:  x + 1)
      do_op(60, 40, lambda x:  x + 1, lambda x:  x - 1)
      do_op(60, 40, lambda x:  x - 1, lambda x:  x - 1)
      

      【讨论】:

      • 将 lambda 的结果分配给名称是违反 Python 风格约定的。这违背了 lambda 函数的唯一目的,即它们是匿名的
      • 是的,你是对的 - 没想到。编辑以显示我的意思:)
      【解决方案3】:

      减法与加负值相同,所以:

      def operation(first_val, second_val, add=True):
          second_val = second_val if add else -second_val
          return first_val + second_val
      

      或使用 += 表示法:

      def increment_decrement(value, add=True):
          step = 1 if add else -1
          value += 1
          return value
      

      【讨论】:

        【解决方案4】:
        import operator
        ops = { "+": operator.add, "-": operator.sub } # etc.
        
        def do_math(a, b, s):
            print(ops[s](a, b))
            
        do_math(5, 3, '-')
        

        免责声明:我使用this post 作为参考。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多