Python支持一种有趣的语法,它允许你快速定义单行的最小函数。这些叫做lambda的函数是从Lisp中借用来的,可以被用在任何需要函数的地方。
出于历史的原因,lambda函数的语法与通常的函数有些细微的不同。
例2.20.lambda函数介绍
>>>deff(x):
...returnx*2...>>>f(3)6>>>g =lambdax: x*2
>>>g(3)6>>>(lambdax: x*2)(3)
6

这是一个通常的函数声明,尽管以前你可能没有看到过定义在交互式窗口中的函数。这个 ... 说明它是一个多行的交互语句。只要在第一行的后面敲入回车,Python IDE会让你接着输入命令。
这是一个lambda函数,它完成同上面普通函数相同的事情。注意这里的简短的语法;没有小括号,return是默认的,并且函数没有名字,只有将它赋值给变量的变量名。
你甚至可以不将lambda函数赋值给一个变量而使用它。这不是举世无双的东西,它只是展示了 lambda 函数只是一个内联函数。

总之,lambda函数是一个可以接收任意多个参数(包括可选参数)并且返回单个表达式值的函数。lambda函数不能包含命令,它们所包含的表达式不能超过一个。不要试图向lambda函数中塞入太多的东西;如果你需要更复杂的东西,应该定义一个普通函数,然后想让它多长就多长。

lambda函数是风格问题。不一定非要使用它们,任何能够使用它们的地方,都可以定义一个分离的普通的函数,用它来替换。我将它们用在需要封装特殊的,非重用的代码上,用许多小的一行函数不会弄乱我的代码。

例2.21. 在inapihelper.py中的lambda函数
processFunc = collapseand(lambdas:" ".join(s.split()))or(lambdas: s)
顺便这里有几件事情需要注意。首先,我们使用了and-or技巧的简单形式,没问题,因为一个lambda函数在一个布尔环境下总为真。(这并不意味着lambda函数不能返回假值。函数本身总是为真,它的返回值可以为任何值。)
第二,我们使用了split函数没带参数。你已经看到过它带1个或2个参数的使用,但是不带参数它按空白进行分割。
例2.22.split不带参数
>>>s ="this is\na\ttest"
>>>printsthis is a test>>>prints.split()
['this', 'is', 'a', 'test']>>>print" ".join(s.split())
'this is a test'

这是一个多行字符串,通过转义字符的定义代替了三重引号。\n是一个回车;\t是一个制表符。
split不带参数按空白进行分割。所以三个空格,一个回车,和一个制表符都是一样的。
你可以将空白统一化,通过分割一个字符串,然后用单个空格作为分隔符将其重新接起来。这就是help函数所做的,将多行文档字符串合并成单行。

那么help函数到底用这些lambda函数,split函数,和and-or技巧做了什么呢?
例2.23. 将函数赋给一个变量
processFunc = collapseand(lambdas:" ".join(s.split()))or(lambdas: s)
processFunc现在是一个函数,但它为哪一个函数要看collapse变量的值。如果collapse为真,processFunc(string)将压缩空白;否则,processFunc(string)将返回未改变的参数。