2024-04-26 07:43:03 发布
网友
我遇到了一个非常聪明的小函数,它接受两个函数,在给定一个参数x的情况下,将一个函数应用到另一个函数上:
x
def compose(f,g): return lambda *x: f(g(*x))
现在我的问题是*x,因为我看不到它在这里做任何事情。为什么不能很简单x(没有星号)?在
*x
以下是我的测试:
测试的问题在于组合函数this和{}只接受一个参数,因此compose函数中的*点丢失(并且收到“只接受1个参数”错误)。在
this
compose
*
当您想要传入未打包的元组时,*运算符的功能就很明显了,并且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的签名。在
g
你的问题是只使用第一部分,即*args,并使用不同的(非传统的)名称*x。在
*args
如果g(在测试中是that)也可以接受可变数量的参数,那么lambda *x: f(g(*x))可能会很有用。在
that
lambda *x: f(g(*x))
否则,就没那么多了。在
其目的是允许使用任意数量的参数调用组合函数,并将所有这些参数传递给组合中的内部函数。在
测试的问题在于组合函数}只接受一个参数,因此
this
和{compose
函数中的*
点丢失(并且收到“只接受1个参数”错误)。在当您想要传入未打包的元组时,
*
运算符的功能就很明显了,并且lambda支持这一点:试试这个简单的map reduce示例:
为了补充@Frederic的回答,如果} construct ,这将是最灵活的:
compose
使用标准^{这样,
compose
与任何g
函数一起工作,而不管g
的签名。在你的问题是只使用第一部分,即
*args
,并使用不同的(非传统的)名称*x
。在如果
g
(在测试中是that
)也可以接受可变数量的参数,那么lambda *x: f(g(*x))
可能会很有用。在否则,就没那么多了。在
其目的是允许使用任意数量的参数调用组合函数,并将所有这些参数传递给组合中的内部函数。在
相关问题 更多 >
编程相关推荐