Python-将一个函数传递给另一个函数


92

我正在使用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)或切换规则Rule2(v)

Answers:


147

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

def a(x):
    return "a(%s)" % (x,)

def b(f,x):
    return f(x)

print b(a,10)

43
函数是python中的一流对象。您可以传递它们,将它们包括在字典,列表等中。只是不要在函数名称后添加括号。例如,对于名为的函数myfunctionmyfunction表示函数本身,myfunction()表示调用该函数并获取其返回值。
nosklo

1
如果函数是对象上的方法并使用该对象的属性来执行其工作,该怎么办?
CpILL

2
如果我传递的函数具有不同数量的输入参数怎么办?然后,我应该使用关键字参数吗?
H. Vabri '17

如果这两个函数位于单独的python文件中怎么办?
阿德里安·希门尼斯

24

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

def test ():
   print "test was invoked"

def invoker(func):
   func()

invoker(test)  # prints test was invoked

是。在上面的示例中,invoker函数在调用函数时需要提供这些参数。
codeape 2014年

15

为了同时传递函数和函数的任何参数:

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


9

只需将其传递进来,就像这样:

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

9

通过删除括号,函数名称可以成为变量名称(并因此作为参数传递)。通过添加括号,变量名可以成为函数名。

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

if puzzle == type1:
    rules = Rule1
else:
    rules = Rule2

def Game(listA, listB, rules):
    if rules( v ) == True:
        do...
    else:
        do...
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.