2014-05-24 47 views
0

我已经找到了这个网页:为什么Python不允许lambda表达式的局部范围内的语句?

http://effbot.org/pyfaq/why-can-t-lambda-forms-contain-statements.htm

然而,它不是那么清楚,为什么原因。兰巴达斯是强大的,在我看来,如果有可能在他们的范围内使用陈述/作业,他们会更多。

例如:(?也许是为了避免使用它们太多,而不是一个简单的DEF)

y = 0 
f = lambda x: y = 5, x+y # Statements first, expression later. 
print f(5) # 10 

一定有人考虑这一点,必须有一个原因,它没有实现。

+2

为什么不'lambda x:x + 5'?此外,可能重复http://stackoverflow.com/questions/1233448/no-multiline-lambda-in-python-why-not – jayelm

+1

@JesseMu:虽然我不会说一个确切的重复,但第二个答案是,我相信OP正在寻找。 – Dair

+1

因为它使可读性变差。同样给匿名函数的名字有点违背了这一点。 –

回答

3

首先需要了解lambda构造创建了一个表达式,其计算结果为创建的函数。这与作为陈述的def完全不同,它的作用是将创建的函数绑定到指定名称的副作用。要使lambda有用,它必须是必须是是一个表达式,否则您不能将它嵌套在其他表达式中。

正如链接FAQ解释的,不允许其他Python表达式嵌套语句。这是因为Python语言的核心语法折衷排除了这种可能性,如persuasively argued by Guido。由于存在一种非常简单的解决方法,即使用def,因此认为不值得使用该语言的语法来容纳lambda中的语句。请注意,lambda不是语言中唯一需要表达式的地方。您不能在ifwhile的测试中声明,也不能在for声明所要求的表达中声明。然而,这被认为是一件好事 - 如果您需要在那里发表声明,只需将它们提取到函数中并调用它即可。与lambda完全相同。

0

之间有什么不同:

f = lambda x: y = 5; x+y 

def f(x): 
    y = 5 
    return x+y 

后者更具可读性,它具有一致的语法,并且唯一需要编写的代码多于使用lambda定义的代码return。所以你的建议没有必要,只有更复杂的规则。

相关问题