部分应用列表理解

Eda*_*aor 1 python haskell functional-programming list-comprehension

我开始学习Haskell,事实证明,在那里,你可以使列表理解成为部分应用的函数.换句话说,它返回一个接受列表的函数,然后在列表上运行列表推导.

例:

boomBangs xs = [ if x < 10 then "BOOM!" else "BANG!" | x <- xs, odd x]

boomBangs can then be called with the actual "xs" argument.
Run Code Online (Sandbox Code Playgroud)

我的问题:在Python中有没有办法做到这一点?我四处寻找并找不到办法,但我可能会遗漏一些东西.

这对于能够做到这一点非常有价值.

编辑:

我的意思似乎有些混乱.

我希望能够定义列表理解,而不必将列表提供给以后工作.

这个想法将是列表理解有效地变成一个接受一个参数的函数,即要处理的列表.

我可以这样做:

my_new_func = [x*2 for x in l] # l is **not defined**
Run Code Online (Sandbox Code Playgroud)

然后在代码中的某个地方:

my_new_func(range(10)) # Returns the answer
Run Code Online (Sandbox Code Playgroud)

这是一种非常好的函数式编程方式.

第二编辑:

这是一种做我想要的方法,但我想知道是否有更好的方法:

boomBangs = lambda lst: [actual list comprehension]

boomBangs(range(10))
Run Code Online (Sandbox Code Playgroud)

Ign*_*ams 5

关于那个特别的部分不是列表理解,它是函数定义.恰好该函数返回一个列表.因此,只需将其定义为Python中的普通函数即可.

boomBangs = lambda xs: ["BOOM!" if x < 10 else "BANG!" for x in xs if odd(x)]

def boomBang(xs):
  return ["BOOM!" if x < 10 else "BANG!" for x in xs if odd(x)]
Run Code Online (Sandbox Code Playgroud)

如果你需要懒惰,请使用genex代替.

boomBangs = lambda xs: ("BOOM!" if x < 10 else "BANG!" for x in xs if odd(x))

def boomBang(xs):
  return ("BOOM!" if x < 10 else "BANG!" for x in xs if odd(x))
Run Code Online (Sandbox Code Playgroud)