Python函数作为函数参数吗?


116

Python函数可以作为另一个函数的参数吗?

说:

def myfunc(anotherfunc, extraArgs):
    # run anotherfunc and also pass the values from extraArgs to it
    pass

所以这基本上是两个问题:

  1. 可以吗?
  2. 如果是的话,如何在其他函数中使用该函数?我需要使用exec(),eval()还是类似的东西?从来不需要与他们搞混。

顺便说一句,extraArgs是anotherfunc参数的列表/元组。


Answers:


138

Python函数可以作为另一个函数的参数吗?

是。

def myfunc(anotherfunc, extraArgs):
    anotherfunc(*extraArgs)

更具体地说...带有各种参数...

>>> def x(a,b):
...     print "param 1 %s param 2 %s"%(a,b)
...
>>> def y(z,t):
...     z(*t)
...
>>> y(x,("hello","manuel"))
param 1 hello param 2 manuel
>>>

extraArgs也可以是一个函数吗?如果是这样,您怎么称呼它?
Aysennoussi 2015年

@sekai是的,extraArgs也可以是一个函数。
Manuel Salvadores

3
这在哪里记录?
4dc0

32

这是使用*args(以及可选)的另一种方法**kwargs

def a(x, y):
  print x, y

def b(other, function, *args, **kwargs):
  function(*args, **kwargs)
  print other

b('world', a, 'hello', 'dude')

输出量

hello dude
world

需要注意的是function*args**kwargs必须按照这个顺序和必须的函数调用该函数的最后的参数。


3
有关* args和** kwargs的更多信息,请参见pythontips.com/2013/08/04/args-and-kwargs-in-python-explained
Pipo


4

当然,这就是python在第一个参数为函数的情况下实现以下方法的原因:

  • map(function,iterable,...)-将函数应用于iterable的每个项目并返回结果列表。
  • filter(function,iterable)-从这些iterable的元素构造一个列表,对于这些元素,函数将返回true。
  • reduce(function,iterable [,initializer])-将两个参数的函数从左到右累计应用于iterable的项,以将iterable减少为单个值。
  • Lambdas

2
  1. 是的,允许。
  2. 您可以像使用其他函数一样使用该函数: anotherfunc(*extraArgs)

2
  1. 是。通过在输入参数中包含函数调用,可以一次调用两个(或多个)函数。

例如:

def anotherfunc(inputarg1, inputarg2):
    pass
def myfunc(func = anotherfunc):
    print func

调用myfunc时,请执行以下操作:

myfunc(anotherfunc(inputarg1, inputarg2))

这将打印anotherfunc的返回值。

希望这可以帮助!


2

函数内部的函数:我们也可以将函数用作参数。

换句话说,我们可以说函数的输出也是对象的引用,请参阅下文,内部函数的输出如何引用外部函数,如下所示。

def out_func(a):

  def in_func(b):
       print(a + b + b + 3)
  return in_func

obj = out_func(1)
print(obj(5))

结果将是.. 14

希望这可以帮助。



1
def x(a):
    print(a)
    return a

def y(func_to_run, a):
    return func_to_run(a)

y(x, 1)

我认为这将是一个更适当的示例。现在我想知道的是,是否有一种方法可以编码要在提交给另一个函数的参数中使用的函数。我相信在C ++中,但是在Python中我不确定。


1

装饰器在Python中非常强大,因为它允许程序员将函数作为参数传递,也可以在另一个函数中定义函数。

def decorator(func):
      def insideFunction():
        print("This is inside function before execution")
        func()
      return insideFunction

def func():
    print("I am argument function")

func_obj = decorator(func) 
func_obj()

输出量

  • 这是执行之前的内部函数
  • 我是参数函数
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.