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

106 投票
5 回答
252416 浏览
提问于 2025-04-15 13:56

我正在用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 个回答

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

29

把函数当作变量来用,这样你就可以很方便地把它们传递给其他函数了:

def test ():
   print "test was invoked"

def invoker(func):
   func()

invoker(test)  # prints test was invoked
170

就像传递其他参数一样,把它直接传进去就可以了:

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

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

print b(a,10)

撰写回答