为什么这个lambda需要*arg,这有什么区别?

2024-04-26 07:43:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我遇到了一个非常聪明的小函数,它接受两个函数,在给定一个参数x的情况下,将一个函数应用到另一个函数上:

def compose(f,g):
    return lambda *x: f(g(*x))

现在我的问题是*x,因为我看不到它在这里做任何事情。为什么不能很简单x(没有星号)?在

以下是我的测试:

^{pr2}$

Tags: lambda函数compose参数returndef情况星号
3条回答

测试的问题在于组合函数this和{}只接受一个参数,因此compose函数中的*点丢失(并且收到“只接受1个参数”错误)。在

当您想要传入未打包的元组时,*运算符的功能就很明显了,并且lambda支持这一点:

试试这个简单的map reduce示例:

this = lambda *i: *[x**2 for x in i]  # map tuple i
that = lambda *b: sum(b) # reduce tuple b

def compose(f,g):
    return lambda *x: f(*g(*x))

compose(that,this)(2,2)

为了补充@Frederic的回答,如果compose使用标准^{} construct,这将是最灵活的:

def compose(f,g):
   return lambda *args, **kwargs: f(g(*args, **kwargs))

这样,compose与任何g函数一起工作,而不管g的签名。在

你的问题是只使用第一部分,即*args,并使用不同的(非传统的)名称*x。在

如果g(在测试中是that)也可以接受可变数量的参数,那么lambda *x: f(g(*x))可能会很有用。在

否则,就没那么多了。在

其目的是允许使用任意数量的参数调用组合函数,并将所有这些参数传递给组合中的内部函数。在

相关问题 更多 >