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

我正在用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)规则将被切换。

只要通过它像其他任何参数:

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

在你的程序中把函数当作variables处理,这样你就可以简单地将它们传递给其他函数:

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

函数名可以通过删除括号变成variables名(因此可以作为parameter passing)。 variables名称可以通过添加括号成为函数名称。

在你的例子中,将variablesrules等同于你的一个函数,而忽略了括号和提到的参数。 然后在你的game()函数中,用括号和v参数调用rules( v )

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

只要通过它,像这样:

 Game(list_a, list_b, Rule1) 

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

 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 

一个广义的方法

为了将函数和parameter passing给函数(例如,对不同的函数使用相同的迭代例程),请考虑以下( 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) 

一些解释

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

对于python3.x

  • print(a+b)而不是print a+b
  • kwargs.items()而不是kwargs.iteritems()