给定以下带有两个参数的函数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)
什么是更好的方式?
答案 0 :(得分:16)
首先,没有必要使用lambda和partial - 它们是替代品:
map(lambda x:f(x,fixed),srclist)
其次,你可以用partial
绑定第二个参数,只要你知道参数的名称:
map(functools.partial(f,y=fixed),srclist)
或者,使用列表理解:
[f(x, fixed) for x in srclist]
答案 1 :(得分:6)
给定以下带有两个参数的函数f,将map应用于x?
的标准方法是什么
关于currying和部分应用的一点讨论
在FP术语中,您的函数f
是"uncurried" - 虽然它在概念上需要两个参数,但它们捆绑在一个产品结构中。在Python中,一切都是不受欢迎的。你必须立刻给出所有的论据,或者不给它们。
要解决这个问题,有各种各样的技巧,但从概念上讲,你只想“理解”这个功能。也就是说,将f(x,y)
转换为f(x)
,返回一个新函数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
分别使用你的curry f
及其产品参数,并在它们全部可用后应用参数。相反的情况也很简单:
uncurry :: (x -> y -> z) -> ((x,y) -> z)
uncurry f (x,y) = f x y
这与部分申请有何关系?
在一种未经证实的语言中,每个参数可以依次应用(例如,部分地,相对于函数的arity)。在一个讨论的语言中,你必须先发挥一些技巧来解决这个问题,就像上面的例子一样。
我认为在一个默认的环境中更灵活,因为部分应用程序是免费的。在这样的环境中,将modify a data structure into a pipeline的函数链接在一起是很常见的。例如。整数修改的管道:
(+1) . (*2) . (^3) $ 7
只是一系列部分应用的,未组合的函数组成,每个函数都在前一个函数的输出上运行。这可能很好,因为它可以直观地区分问题。
答案 2 :(得分:5)
map(lambda x: f(fixed,x), thelist)
或者甚至根本不使用map()
,而是使用列表推导。
[f(fixed, x) for x in thelist]
PS:不要使用list
作为变量名,它是一个重要的内置名称(列表类型)。
答案 3 :(得分:1)
出了什么问题:
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]