我有一个函数,在这个函数里面我应该执行3个函数的另一个函数。
简单的方法应该是传递一个参数,根据该参数执行if-elif来执行函数,但是我想知道通过params传递一个函数的名称是可行的,并使用它,比如:
FunctionA(Param1, Param2, FunctionNameToUse)
....Code....
FunctionNameToUse(Value1, Value2)
....Code....
endFunctionA
根据functionA的调用方式,它将使用一个函数或另一个函数,我不知道我是否解释得很好......
感谢队友!
答案 0 :(得分:3)
函数本身是Python中的第一类对象。所以没有必要传递名称:传递实际的函数本身,然后你可以直接调用它。
def func1(a, b):
pass
def func2(a, b):
pass
def functionA(val1, val2, func):
func(val1, val2)
# now call functionA passing in a function
functionA("foo", "bar", func1)
答案 1 :(得分:0)
在python中,函数是第一类值,这意味着它们可以作为参数传递,从函数返回等等。
所以你想要采取的方法应该有效(但是你没有传递名字,你正在通过实际的功能)。
查看标准库中的map
和filter
,他们就是这样做的。
答案 2 :(得分:-1)
是的,你可以。正如其他人所提到的,函数是一流的对象,即你可以做任何你能想到的事情(更多信息请参见What are "first class" objects?)。
那么,当您将函数作为参数传递时,这是如何工作的?如果你已经使用了任何一个ComSci类,你就会知道每个进程在内存中都有一个特殊区域为其代码分配;您在此处定义了所有功能。无论何时调用函数,CPU都会将程序计数器(一个指向它正在执行的任何代码的特殊指针)移动到该函数代码的开头,然后从那里开始。因此,在将函数加载到内存中之后,调用它所需要的只是它的地址。当您将函数A的“name”作为参数传递给Python中的另一个函数B时,您所做的实际上是传递一个引用(在C术语中,一个指针),该引用包含代表内存中A的代码的地址。