【问题标题】:Partial function call as an argument python [duplicate]部分函数调用作为参数python [重复]
【发布时间】:2017-12-31 23:59:40
【问题描述】:

下面的代码有什么办法吗?

def f1(f2, x):
    return f2(x)

def f2(y, z):
    return y + z

f1(f2(10, ), 20)
output 30

f2 函数未命中 z。所以,我希望f1 将参数x 传递给f2 作为z。 我将不胜感激。

【问题讨论】:

  • 您必须传递一个带有单个参数的可调用对象,使用deflambdafunctools.partial 创建,例如:f1(lambda z: f2(10, z), 20)
  • @jonrsharpe 这里的欺骗目标专注于将参数从一个函数传递给另一个函数,但是这个问题的重点是在进行调用时部分传递参数。我认为这不是正确的欺骗目标
  • OP 仅供参考,其中许多问题也可以通过谷歌搜索您的问题标题和 site:stackoverflow.com 找到,因此请在将来提问之前进行研究。

标签: python function


【解决方案1】:

是的,这就是functools.partial 的意义所在:

from functools import partial

f1(partial(f2, 10), 20)

partial 将函数 f、任意数量的 unnamednamed 参数作为输入。它构造了一个新函数,其中已填写了未命名和命名参数。

有点等价于:

def partial(func, *partialargs, **partialkwargs):
    def g(*args, **kwargs):
        fargs = partialargs + args
        fkwargs = partialkwargs.copy()
        fkwargs.update(kwargs)
        return func(*farg, **fkwargs)
    return g

functools与上述实现相比会显着降低开销。

【讨论】:

    【解决方案2】:

    另一个显示lambda 表达式的选项:

    f1(lambda x: f2(10,x), 20)
    

    @Willem 所示的部分更适合您的特定问题,但 lambda 表达式的灵活性很好了解 - 表达式可能会变得比仅部分调用复杂得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-12
      • 2021-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多