部分参数的应用映射

2024-04-28 13:18:10 发布

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

假设下面的函数f有两个参数,那么只将map应用于x的标准方法是什么?

def f (x,y):
    print x,y

更具体地说,我想用map在一行中执行以下操作。

list=[1,2,3]
fixed=10
for s in list:
    f(s,fixed)

一种方法是:

import functools
map(functools.partial(lambda x,y:f(y,x),fixed),list)

什么是更好的方法?


Tags: 方法lambda函数inimportmapfor参数
3条回答

Given the following function f with two arguments, what is the standard way to apply map to only x?

略论咖喱及部分应用

在FP术语中,函数f"uncurried"-虽然它在概念上接受两个参数,但它们被捆绑在一个产品结构中。在Python中,所有的东西都是未结婚的。你必须立刻给出所有的论点,否则就没有。

要解决这个问题,有各种技巧,但从概念上讲,您只需要“curry”函数。也就是说,将f(x,y)转换为f(x),后者返回一个新函数g(y)

在默认为current的语言中,您可以很容易地编写此翻译:

-- curry: take a function from (x,y) to one from x to a function from y to z
curry :: ((x,y) -> z) -> (x -> y -> z)
curry f x y     = f (x, y)

因此curry分别获取当前的f及其产品参数,并在所有参数都可用时应用这些参数。相反的情况也很简单:

uncurry :: (x -> y -> z) -> ((x,y) -> z)
uncurry f (x,y) =  f x y

这与部分应用程序有何关系?

  • curring接受一个结构为1n-product)参数的函数,并返回一个接受n参数的新函数。
  • 部分应用接受一个n参数的函数,并将它们应用于k参数,从而产生一个n-k剩余参数的函数。

在无载波语言中,每个参数都可以依次应用(例如,部分地应用于函数的arity)。在咖喱语言中,必须先玩一些技巧来取消函数的顺序,如上面的例子所示。

我认为在默认环境下使用curried更灵活,因为部分应用程序是免费的。在这样的环境中,通常将modify a data structure into a pipeline的函数链接在一起。E、 g.整数修改管道:

(+1) . (*2) . (^3) $ 7

只是一个部分应用的、未载波的函数链,每个函数在前一个函数的输出上操作。这可能很好,因为它在视觉上分离了关注点。

首先,不需要使用lambda和partial—它们是可选的:

map(lambda x:f(x,fixed),srclist)

其次,只要知道参数名,就可以用partial绑定第二个参数:

map(functools.partial(f,y=fixed),srclist)

或者,使用列表理解:

[f(x, fixed) for x in srclist]
map(lambda x: f(fixed,x), thelist)

或者根本不使用map(),而是使用列表理解。

[f(fixed, x) for x in thelist]

注意:不要使用list作为变量名,它是一个重要的内置名称(列表类型)。

相关问题 更多 >