Python - 将一个函数传递给另一个函数
Posted
技术标签:
【中文标题】Python - 将一个函数传递给另一个函数【英文标题】:Python - Passing a function into another function 【发布时间】:2010-11-23 21:00:01 【问题描述】:我正在使用 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)
或 @ 切换987654324@.
【问题讨论】:
【参考方案1】:只需像任何其他参数一样传递它:
def a(x):
return "a(%s)" % (x,)
def b(f,x):
return f(x)
print b(a,10)
【讨论】:
函数是python中的一等对象。您可以传递它们,将它们包含在字典、列表等中。只是不要在函数名称后包含括号。例如,对于名为myfunction
的函数:myfunction
表示函数本身,myfunction()
表示调用函数并获取其返回值。
如果函数是一个对象的方法并使用该对象的属性来完成它的工作呢?
如果我传递的函数有不同数量的输入参数怎么办?然后我应该使用关键字参数吗?
如果两个函数在不同的python文件中怎么办?【参考方案2】:
将函数视为程序中的变量,以便您可以轻松地将它们传递给其他函数:
def test ():
print "test was invoked"
def invoker(func):
func()
invoker(test) # prints test was invoked
【讨论】:
是的。在上面的示例中,invoker
函数将需要在调用函数时提供这些参数。【参考方案3】:
用于传递函数和函数的任何参数:
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
可能有意义。
【讨论】:
【参考方案4】:把它传入,像这样:
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
【讨论】:
【参考方案5】:通过去掉括号,函数名可以变成变量名(因此可以作为参数传递)。变量名可以通过加括号变成函数名。
在您的示例中,将变量 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...
【讨论】:
以上是关于Python - 将一个函数传递给另一个函数的主要内容,如果未能解决你的问题,请参考以下文章