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

105
我正在使用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)

5个回答

168

像处理其他参数一样将其传递即可:

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

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

print b(a,10)

46
在Python中,函数是一等对象。你可以将它们传递给其他函数,将它们包含在字典、列表等数据结构中。只需不要在函数名后面加上括号即可。例如,对于名为myfunction的函数:myfunction表示函数本身,myfunction()表示调用该函数并获取其返回值。 - nosklo
1
如果函数是对象上的方法,并使用该对象的属性来完成其工作,那该怎么办? - CpILL
4
如果我传递的函数具有不同数量的输入参数怎么办?那我应该使用关键字参数吗? - H. Vabri
如果这两个函数在不同的Python文件中怎么办? - Adrian Jimenez

29

把函数视为变量在你的程序中,这样你就可以轻松地将它们传递给其他函数:

def test ():
   print "test was invoked"

def invoker(func):
   func()

invoker(test)  # prints test was invoked

是的。在上面的例子中,“invoker”函数在调用该函数时需要提供这些参数。 - codeape

17

将函数和任何参数传递给函数:

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)

根据你所做的事情,定义装饰器可能是有意义的,或者可以使用functools.partial


10

通过省略括号,函数名称可以变成变量名称(从而作为参数传递)。通过添加括号,变量名称可以变成函数名称。

在您的示例中,将变量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...

10

就像这样直接传入即可:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接