13

给定以下带有两个参数的函数 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)

有什么更好的方法?

4

4 回答 4

24

首先,没有必要使用 lambda AND partial - 它们是替代品:

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

其次,partial只要您知道参数的名称,您就可以将第二个参数与 绑定:

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

或者,使用列表推导:

[f(x, fixed) for x in srclist]
于 2012-04-25T11:46:35.930 回答
6

给定以下带有两个参数的函数 f,将 map 仅应用于 x 的标准方法是什么?

关于柯里化和偏应用的一点讨论

用 FP 术语来说,你的函数f“uncurried”的——虽然它在概念上需要两个参数,但它们被捆绑在一个产品结构中。在 Python 中,一切都是非咖喱的,一直都是。你必须一次给出所有论点,或者一个都不给出。

为了解决这个问题,有各种技巧,但从概念上讲,你只想“咖喱”这个函数。也就是说,transform f(x,y)into f(x)which 返回一个新函数g(y)

在默认使用柯里化的语言中,您可以轻松地编写此翻译:

-- 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,将您的 curriedf及其产品参数分开,并在它们都可用时应用它们。相反的也很简单:

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

这与部分应用有何关系?

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

在非柯里化语言中,每个参数都可以依次应用(例如,部分地,关于函数的数量)。在柯里化语言中,您必须首先使用一些技巧来取消函数的柯里化,如上面的示例所示。

我认为在 curried-by-default 环境中更灵活,因为部分应用程序是免费的。在这样的环境中,通常将修改数据结构的函数链接到管道中。例如整数修改的管道:

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

只是一个部分应用的、非柯里化的函数链,由组合而成,每个函数都对前一个函数的输出进行操作。这可能很好,因为它在视觉上分离了关注点。

于 2012-04-25T14:52:27.990 回答
5
map(lambda x: f(fixed,x), thelist)

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

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

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

于 2012-04-25T11:46:52.290 回答
2

有什么问题:

def add(x, y):
    return x + y

l = [1, 2, 3]

from functools import partial
plus10 = map(partial(add, y=10), l)
print plus10

## [11, 12, 13]
于 2012-04-25T14:30:23.893 回答