全部博文(252)
分类: Python/Ruby
2014-05-20 19:42:40
在python中有一个匿名函数lambda,匿名函数顾名思义就是指:是指一类无需定义标识符(函数名)的函数或子程序。最早引入匿名函数的是LISP语言,LISP是最早的函数编程式语言,我们使用的Vim的插件大部分都是使用LISP语言进行编写的,后来又派生出Emacs Lisp,Emacs的扩展插件就是使用Lisp编写的。在C++11和C#中都有匿名函数的存在。下面看看在python中匿名函数的使用。
下面是我们定义的一个简单的函数,该函数就是完成一个数的平方,
点击(此处)折叠或打开
如果在Python中使用lambda实现的话,
点击(此处)折叠或打开
从上面的Python代码中并没有专门定义函数,而是使用的匿名函数lambda实现。
在《深入 Python :Dive Into Python》中有下面的一句话,对lambda函数进行
总的来说,lambda 函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值。lambda 函数不能包含命令,包含的表达式不能超过一个。不要试图向 lambda 函数中塞入太多的东西;如果你需要更复杂的东西,应该定义一个普通函数,然后想让它多长就多长。
lambda 函数是一种风格问题。不一定非要使用它们;任何能够使用它们的地方,都可以定义一个单独的普通函数来进行替换。我将它们用在需要封装特殊的、非重用代码上,避免令我的代码充斥着大量单行函数。
lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边的为表达式。其实lambda返回值是一个函数的地址,也就是函数对象。
g = lambda x:x*x
print g
打印的输出结果:
上面说到lambda函数也可以使用多个参数,下面看一下使用多个参数的例子:
print reduce(lambda x,y:x*y, range(1,5))
上面这句代码并不容易理解其功能,因为涉及到了内置函数reduce,该函数的原型如下:
reduce(...)
reduce(functionA, sequence[, initial]) -> value
对sequence中的item顺序迭代调用function,function必须要有2个参数,并返回一个值。要是有第3个参数,则表示初始值,可以继续调用初始值,sequence为可迭代变量,如List等。reduce函数将sequence中的元素从左到右依次传入函数A中,再用函数A返回的结果替代传入的参数,反复执行。上面这句代码的含义就是:将1到5的连续整数列表传入lambda函数并用两个数的积替换列表中的数,也就是求5的阶乘。(((1*2)*3)*4)
例子1:我们可以看一下lambda的嵌套作用域
点击(此处)折叠或打开