2014-11-08 97 views
0

这是一个稍微轻薄的问题:蟒蛇归咎于另一名lambda函数

我有很多filter-map-reduce功能的Python代码。

我发现它有点痛苦重新打字例如。

filter(lambda x: x['identity'] == 'creosote', skits)

每次。我希望能够做到像

filter(f(x['identity']==creosote),skits)

代替。我试过了:

def f(y): 
    f = lambda(x: y) 

但这似乎并不奏效。由于

我得到一个NameError: name 'x' is not defined

我试图做到的是为“符号链接” lambda x:的东西,这样我就不必键入它。

回答

1

你可以这样做:

def f(x): 
    return x['identity'] == 'creosote' 

那么你就只是做filter(f, skits)

没有办法有类似f(x['identity'] == 'creosote')而不必评估表达x['identity'] == 'creosote'之前f被调用(这意味着,除其他事项外,可变x具有封闭范围进行定义)。如果你想推迟执行,你必须把表达式放在一个函数中,你可以用lambda或者完整的def来完成。

Python没有允许您按照您的建议执行“符号链接”的宏。您不能将一些文本别名到Python中的其他文本;你只能评估格式良好的表达式。 lambda不是函数,它是Python语法的一部分,所以你不能将它别名到别的东西上,就像你不能做plus = +然后做4 plus 3一样。

+0

感谢@BrenBarn,寻找更多的东西一般,但。 Lambda只是每一次输入一个口。 – 2014-11-08 04:30:01

+0

@TahnoonPasha:就像我说的那样,没有办法绕过它。如果你不使用'lambda',那么你在函数调用之前放入函数的任何东西都会被调用。没有宏可以像你想要的那样做“符号链接”。 (你可以尝试缩短事物的其他方法,但是,用户3的答案。) – BrenBarn 2014-11-08 04:36:47

+0

谢谢@BrenBarn – 2014-11-08 04:58:43

1

你可以通过xy的功能,如果xy不同的是:

def f(x, y): 
    return (x==y) 

,并调用该函数为:

filter(f(x['identity'], 'creosote'),skits) 
+0

您将不得不通过''creosote''(即作为字符串)。 – BrenBarn 2014-11-08 04:35:23

+0

谢谢我编辑过..以前我假设他有他的代码中的变量,他没有在问题中发帖......再次感谢。 – user3 2014-11-08 04:38:02

+0

我试过这个@ user3,它不适合我。 – 2014-11-08 05:01:15