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

84 python function first-class-functions

我正在使用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
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*kin 135

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

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

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

print b(a,10)
Run Code Online (Sandbox Code Playgroud)

  • 函数是python中的第一类对象.你可以传递它们,将它们包括在dicts,列表等中.只是不要在函数名后面加上括号.例如,对于名为`myfunction`的函数:`myfunction`表示函数本身,`myfunction()`表示调用函数并获取其返回值. (39认同)
  • 如果我传递的函数有不同数量的输入参数怎么办?那么我应该使用关键字参数吗? (2认同)

Pio*_*pla 21

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

def test ():
   print "test was invoked"

def invoker(func):
   func()

invoker(test)  # prints test was invoked
Run Code Online (Sandbox Code Playgroud)


rya*_*lon 13

一种普遍的方法

要将函数和参数传递给函数(例如,对不同的函数使用相同的迭代例程),请考虑以下(python2.x)示例:

def test(a, b):
    '''The function to pass'''
    print a+b

def looper(func, **kwargs):
    '''A basic iteration function'''
    for i in range(5):
        # Our passed function with passed parameters
        func(*tuple(value for _, value in kwargs.iteritems()))

if __name__ == '__main__':
    # This will print `3` five times
    looper(test, a=1, b=2)
Run Code Online (Sandbox Code Playgroud)

一些解释

  • tuple( i for i in (1, 2, 3)) 是一个元组生成器,从列表中的项创建一个元组,设置,元组...在我们的例子中,来自的值 **kwargs
  • *tuple()解压缩其内容的前面,有效地将它们作为参数传递给传递的函数
  • _key因为我们没有使用它,所以在发电机只是一个占位符

用于python3.x:

  • print(a+b) 代替 print a+b
  • kwargs.items() 代替 kwargs.iteritems()


Ian*_*and 8

只需将其传入,如下所示:

Game(list_a, list_b, Rule1)
Run Code Online (Sandbox Code Playgroud)

然后你的游戏功能看起来像这样(仍然是伪代码):

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
Run Code Online (Sandbox Code Playgroud)


小智 8

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

在您的示例中,将变量等同于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...
Run Code Online (Sandbox Code Playgroud)