【问题标题】:Python - Passing a function into another functionPython - 将一个函数传递给另一个函数
【发布时间】:2019-07-25 00:17:51
【问题描述】:

我正在使用 python 解决一个难题,根据我要解决的难题,我将不得不使用一组特殊的规则。如何将一个函数传递给 Python 中的另一个函数?

例子

def Game(listA, listB, rules):
   if rules == True:
      do...
   else:
      do...

def Rule1(v):
  if "variable_name1" in v:
      return False
  elif "variable_name2" in v:
      return False
  else:
      return True

def Rule2(v):
  if "variable_name3" and "variable_name4" in v:
      return False
  elif "variable_name4" and variable_name1 in v:
      return False
  else:
      return True

这只是一个伪代码,因此并不具体,但我得到了要编译的代码,但我需要知道如何调用函数 Game 以及它是否正确定义,因为规则将为 Rule1(v) 或 @ 切换987654324@.

【问题讨论】:

    标签: python function first-class-functions


    【解决方案1】:

    只需像任何其他参数一样传递它:

    def a(x):
        return "a(%s)" % (x,)
    
    def b(f,x):
        return f(x)
    
    print b(a,10)
    

    【讨论】:

    • 函数是python中的一等对象。您可以传递它们,将它们包含在字典、列表等中。只是不要在函数名称后包含括号。例如,对于名为myfunction 的函数:myfunction 表示函数本身,myfunction() 表示调用函数并获取其返回值。
    • 如果函数是一个对象的方法并使用该对象的属性来完成它的工作呢?
    • 如果我传递的函数有不同数量的输入参数怎么办?然后我应该使用关键字参数吗?
    • 如果两个函数在不同的python文件中怎么办?
    【解决方案2】:

    将函数视为程序中的变量,以便您可以轻松地将它们传递给其他函数:

    def test ():
       print "test was invoked"
    
    def invoker(func):
       func()
    
    invoker(test)  # prints test was invoked
    

    【讨论】:

    • 是的。在上面的示例中,invoker 函数将需要在调用函数时提供这些参数。
    【解决方案3】:

    把它传入,像这样:

    Game(list_a, list_b, Rule1)
    

    然后你的 Game 函数可能看起来像这样(仍然是伪代码):

    def Game(listA, listB, rules=None):
        if rules:
            # do something useful
            # ...
            result = rules(variable) # this is how you can call your rule
        else:
            # do something useful without rules
    

    【讨论】:

      【解决方案4】:

      通过去掉括号,函数名可以变成变量名(因此可以作为参数传递)。变量名可以通过加括号变成函数名。

      在您的示例中,将变量 rules 等同于您的一个函数,省略括号和参数的提及。然后在您的game() 函数中,使用括号和v 参数调用rules( v )。

      if puzzle == type1:
          rules = Rule1
      else:
          rules = Rule2
      
      def Game(listA, listB, rules):
          if rules( v ) == True:
              do...
          else:
              do...
      

      【讨论】:

        【解决方案5】:

        用于传递函数和函数的任何参数:

        from typing import Callable    
        
        def looper(fn: Callable, n:int, *args, **kwargs):
            """
            Call a function `n` times
        
            Parameters
            ----------
            fn: Callable
                Function to be called.
            n: int
                Number of times to call `func`.
            *args
                Positional arguments to be passed to `func`.
            **kwargs
                Keyword arguments to be passed to `func`.
        
            Example
            -------
            >>> def foo(a:Union[float, int], b:Union[float, int]):
            ...    '''The function to pass'''
            ...    print(a+b)
            >>> looper(foo, 3, 2, b=4)
            6
            6
            6       
            """
            for i in range(n):
                fn(*args, **kwargs)
        

        根据您的操作,定义decorator 或使用functools.partial 可能有意义。

        【讨论】:

          猜你喜欢
          • 2012-08-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-19
          • 1970-01-01
          • 2012-09-25
          • 2020-10-03
          相关资源
          最近更新 更多