为部分参数应用map

Alf*_*fad 9 python functional-programming

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

def f (x,y):
    print x,y
Run Code Online (Sandbox Code Playgroud)

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

list=[1,2,3]
fixed=10
for s in list:
    f(s,fixed)
Run Code Online (Sandbox Code Playgroud)

一种方法是:

import functools
map(functools.partial(lambda x,y:f(y,x),fixed),list)
Run Code Online (Sandbox Code Playgroud)

什么是更好的方法?

Mar*_*cin 17

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

map(lambda x:f(x,fixed),srclist)
Run Code Online (Sandbox Code Playgroud)

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

map(functools.partial(f,y=fixed),srclist)
Run Code Online (Sandbox Code Playgroud)

或者,使用列表理解:

[f(x, fixed) for x in srclist]
Run Code Online (Sandbox Code Playgroud)


Don*_*art 6

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

关于currying和部分应用的一点讨论

在FP术语中,您的功能f"未经证实的" - 虽然它在概念上采用两个参数,但它们捆绑在一个产品结构中.在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)
Run Code Online (Sandbox Code Playgroud)

因此,分别使用curry您的curried f及其产品参数,并在它们全部可用后应用参数.相反的情况也很简单:

uncurry :: (x -> y -> z) -> ((x,y) -> z)
uncurry f (x,y) =  f x y
Run Code Online (Sandbox Code Playgroud)

这与部分申请有何关系?

  • Currying采用一个带有1(n- product)参数结构的函数,并返回一个带有n个参数的新函数.
  • 部分应用程序采用n个参数的函数并将它们应用于k个参数,从而产生nk剩余参数的函数.

在一种未经证实的语言中,每个参数可以依次应用(例如,部分地,相对于函数的arity).在一个讨论的语言中,你必须先发挥一些技巧来解决这个问题,就像上面的例子一样.

部分应用程序是免费的,我觉得在默认情况下处理是更灵活的.在这样的环境中,通常将将数据结构修改为管道的函数链接在一起.例如整数修改的管道:

(+1) . (*2) . (^3) $ 7
Run Code Online (Sandbox Code Playgroud)

只是一系列部分应用的,未组合的函数组成,每个函数都在前一个函数的输出上运行.这可能很好,因为它可以直观地区分问题.


dda*_*daa 5

map(lambda x: f(fixed,x), thelist)
Run Code Online (Sandbox Code Playgroud)

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

[f(fixed, x) for x in thelist]
Run Code Online (Sandbox Code Playgroud)

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