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

Python 为什么这个lambda需要*arg,这有什么区别?,python,lambda,Python,Lambda,我遇到了一个非常聪明的小函数,它接受两个函数,在给定一个参数x的情况下,将一个函数应用到另一个函数上: def compose(f,g): return lambda *x: f(g(*x)) 现在我的问题是*x,因为我看不出它在这里真的做了什么。为什么不能是简单的x(没有星号) 以下是我的测试: >>> def compose(f,g): ... return lambda *x: f(g(*x)) ... >>> this = lambda

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

def compose(f,g):
    return lambda *x: f(g(*x))
现在我的问题是
*x
,因为我看不出它在这里真的做了什么。为什么不能是简单的
x
(没有星号)

以下是我的测试:

>>> def compose(f,g):
...   return lambda *x: f(g(*x))
... 
>>> this = lambda i: i+1
>>> that = lambda b: b+1
>>> compose(this,that)(2)
4

>>> def compose(f,g):
...   return lambda x: f(g(x))
... 
>>> compose(this,that)(2)
4

>>> def compose(f,g):
...   return lambda *x: f(g(*x))
... 
>>> compose(this,that)(2,2)
TypeError: <lambda>() takes exactly 1 argument (2 given)
>>定义组成(f,g):
...   返回λ*x:f(g(*x))
... 
>>>这=λi:i+1
>>>这等于λb:b+1
>>>写(这个,那个)(2)
4.
>>>def组合(f,g):
...   返回λx:f(g(x))
... 
>>>写(这个,那个)(2)
4.
>>>def组合(f,g):
...   返回λ*x:f(g(*x))
... 
>>>写(这个,那个)(2,2)
TypeError:()正好接受1个参数(给定2个)
如果
g
在您的测试中
)也可以采用不同数量的参数,那么
lambda*x:f(g(*x))
可能会很有用

否则,就不那么多了

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

测试的问题在于组合函数
this
仅接受单个参数,因此,您的
compose
函数中的
*
点丢失(并且您会收到一个“takesjust1参数”错误)

当您希望传入未打包的元组时,
*
运算符的功能变得非常明显,并且您的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
使用以下标准,则最为灵活:

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


你的问题中的一个只是使用第一部分,即
*args
,并使用不同的(非常规)名称,
*x

例如:compose(abs,min)(1,2,-5,-3,-6,12,-9)@jornsharpe,而它解释了
*
/
***
-我认为它并没有解释这个问题的上下文
def compose(f,g):
   return lambda *args, **kwargs: f(g(*args, **kwargs))