当前位置: 首页 > 知识库问答 >
问题:

如何将嵌套函数作为参数传递

费秦迟
2023-03-14

假设我们有python中的函数:

def _abs(iterable):   #cause its normally for one element only
    return [abs(i) for i in iterable]

def A(list, foo):
    return foo(list)

list = [2,3,-5]
print( A(list,foo=sum) )

>> 0

虽然我可能会将foo=sum传递给A,但我正在寻找一种优雅的方法来传递类似于foo=sum(_abs)的东西来执行sum(_abs(list))

我现在看到的唯一方法是发送一个函数列表[sum,_abs]并按顺序应用它们。有没有更好的办法?

共有3个答案

田意致
2023-03-14
def compose(funcs, funcargs):
    for func in reversed(funcs):
        funcargs = func(funcargs)
    return funcargs
於永寿
2023-03-14

你可以做一个显式的作曲函数

>>> def compose(f, g):
...   return lambda x: f(g(x))
...

然后使用它

>>> A(list, compose(sum, _abs))
10
长孙燕七
2023-03-14

或者,更一般地(即用任意数量的参数函数)组成:

from functools import partial, reduce

def compose(*funcs):
    return partial(reduce, lambda x, f: f(x), reversed(funcs))

(请参阅部分减少的文档-注意,您不需要在Python 2. x中导入减少

然后:

>>> compose(sum, _abs)([2, 3, -5])
10
 类似资料:
  • 问题内容: 这是我的代码: 当我评估f(0)时,将出现错误“ x在分配之前被引用”。 但是,当我使用“ print x”代替“ x = x + 1”时,它将起作用。 似乎在g的范围内,我只能将x用作“使用事件”,而不能用作“绑定事件”。我想问题是f仅将x的值传递给g。 我是否正确理解?如果不是,有人可以解释为什么在引用之前未定义“ x = x + 1”的左侧吗? 谢谢 问题答案: 您正确理解了它。

  • 最近我在使用c语言时遇到了一些问题,基本上是这样的: 在一个函数(比如intmain)中,我声明了一个变量Y=5,我有一个lambda函数,它接收一个值并将Y相加; 我的问题是:我需要将这个lambda函数传递给一个已经存在的函数,这样它就可以在另一个函数内部调用。 我尝试了几件事,但没有一个像我预期的那样工作(有些甚至不起作用): 另一个问题是我不能改变我的receives函数签名,因为代码的剩

  • 问题内容: 在Java中,如何将一个函数作为另一个函数的参数传递? 问题答案: Java 8及以上 如果你的类或接口只有一个抽象方法(有时称为SAM type),则使用Java 8+ lambda表达式,例如: 然后可以在使用MyInterface的任何地方替换lambda表达式: 例如,你可以非常快速地创建一个新线程: 并使用方法引用语法使其更加清晰: 如果没有 lambda表达式,则最后两个示

  • 问题内容: 我有一个通用函数,该函数调用Web服务并将JSON响应序列化回一个对象。 我要完成的是等效于此Java代码 我要完成的方法签名正确吗? 更具体地说,将参数类型指定为正确的做法是正确的吗? 调用该方法时,我将其作为returningClass值传递,但是出现编译 错误“无法将表达式的类型’()’转换为’String’类型” CastDAO.invokeService(“test”, wi

  • 我正试图将dataframe列作为参数传递 但是得到错误 :33:错误:类型不匹配; 找到:org.apache.spark.sql.column 必需:int val df_new=df.withcolumn(“age_category”,ageclassification.agecategory(df(“age”))

  • 问题内容: 如何在不执行“父”函数或不使用函数的情况下将函数作为参数传递?(因为我已经读到它是不安全的。) 我有这个: 它可以工作,但是问题是在调用函数时触发,而不是在函数中使用时触发。 根据我所读的内容,我可以使用来解决它,但这不是最佳实践。如何在JavaScript中将函数作为参数传递? 问题答案: 您只需要删除括号: 然后,这将传递函数而不先执行它。 这是一个例子: