k4v*_*vin 5 python lambda lambda-calculus currying functools
我想使用functools中的partial来部分应用函数的第二个参数,我知道使用lambda很容易,而不是部分如下
>>> def func1(a,b):
... return a/b
...
>>> func2 = lambda x:func1(x,2)
>>> func2(4)
2
Run Code Online (Sandbox Code Playgroud)
但我严格要在这里使用局部(为了学习)所以我想出了这个.
>>> def swap_binary_args(func):
... return lambda x,y: func(y,x)
...
>>> func3 = partial(swap_binary_args(func1),2)
>>> func3(4)
2
Run Code Online (Sandbox Code Playgroud)
是否可以将此策略扩展到我可以在任何地方部分应用任何参数的级别,如下面的伪代码
>>>def indexed_partial(func, list_of_index, *args):
... ###do_something###
... return partially_applied_function
>>>func5=indexed_partial(func1, [1,4,3,5], 2,4,5,6)
Run Code Online (Sandbox Code Playgroud)
在我们的例子中,我可以使用此功能如下
>>>func6=indexed_partial(func1, [1], 2)
Run Code Online (Sandbox Code Playgroud)
是否有可能像我想要的索引部分?我有什么类似的东西,我不知道吗?更重要的是索引部分的想法一般是一个好的或坏的想法为什么?
这个问题已被标记为可能的重复可以部分应用不带关键字参数的函数的第二个参数吗? 在那个问题中,OP问是否有可能部分应用第二个参数但在这里我问的是如何烹饪一个可以部分应用任意参数的函数
小智 1
我也认为你所要求的事情不能(容易?)用functools.partial. partial也许最好的(也是最易读的)解决方案是与关键字参数一起使用。但是,如果您想使用位置参数(以及因此索引的部分参数),这里是一个可能的定义indexed_partial:
def indexed_partial(func, list_of_index, *args):
def partially_applied_function(*fargs, **fkwargs):
nargs = len(args) + len(fargs)
iargs = iter(args)
ifargs = iter(fargs)
posargs = ((ifargs, iargs)[i in list_of_index].next() for i in range(nargs))
return func(*posargs, **fkwargs)
return partially_applied_function
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
224 次 |
| 最近记录: |