【问题标题】:Python function as a function argument?Python函数作为函数参数?
【发布时间】:2024-05-29 16:35:01
【问题描述】:

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

说:

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

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

  1. 是否允许?
  2. 如果是,我如何在另一个函数中使用该函数?我需要使用 exec()、eval() 或类似的东西吗?永远不需要惹他们。

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

【问题讨论】:

标签: python function arguments


【解决方案1】:

Decorators 在 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()

输出

  • 这是执行前的内部函数
  • 我是参数函数

【讨论】:

    【解决方案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

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:
      def x(a):
          print(a)
          return a
      
      def y(func_to_run, a):
          return func_to_run(a)
      
      y(x, 1)
      

      我认为这是一个更合适的样本。 现在我想知道是否有一种方法可以对函数进行编码,以便在将参数提交给另一个函数时使用。我相信在 C++ 中有,但在 Python 中我不确定。

      【讨论】:

        【解决方案4】:

        这是使用*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 必须按此顺序排列,并且必须是调用函数的函数的最后一个参数。

        【讨论】:

        【解决方案5】:
        def x(a):
            print(a)
            return a
        
        def y(a):
            return a
        
        y(x(1))
        

        【讨论】:

        • 请考虑为您的答案添加一些解释。
        • 这里没有将函数作为参数传递,而是返回值。
        【解决方案6】:

        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 也可以是一个函数吗?如果是的话,你怎么称呼它?
        • @sekai 是的,extraArgs 也可以是一个函数。
        • 这是在哪里记录的?
        【解决方案7】:
        1. 是的。通过在输入参数中包含函数调用,您可以一次调用两个(或更多)函数。

        例如:

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

        当你调用 myfunc 时,你会这样做:

        myfunc(anotherfunc(inputarg1, inputarg2))
        

        这将打印另一个函数的返回值。

        希望这会有所帮助!

        【讨论】:

          【解决方案8】:

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

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

          【讨论】:

            【解决方案9】:
            1. 是的,这是允许的。
            2. 您可以像使用其他任何功能一样使用该功能:anotherfunc(*extraArgs)

            【讨论】:

              【解决方案10】:

              Python 中的函数是一流的对象。但是你的函数定义is a bit off

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

              【讨论】: