Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4431370
  • 博文数量: 252
  • 博客积分: 5347
  • 博客等级: 大校
  • 技术积分: 13838
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-30 10:13
文章分类
文章存档

2022年(12)

2017年(11)

2016年(7)

2015年(14)

2014年(20)

2012年(9)

2011年(20)

2010年(153)

2009年(6)

分类: Python/Ruby

2014-05-20 19:42:40

        在python中有一个匿名函数lambda,匿名函数顾名思义就是指:是指一类无需定义标识符(函数名)的函数或子程序。最早引入匿名函数的是LISP语言,LISP是最早的函数编程式语言,我们使用的Vim的插件大部分都是使用LISP语言进行编写的,后来又派生出Emacs LispEmacs的扩展插件就是使用Lisp编写的。在C++11C#中都有匿名函数的存在。下面看看在python中匿名函数的使用。

        下面是我们定义的一个简单的函数,该函数就是完成一个数的平方,

点击(此处)折叠或打开

  1. #!/usr/bin/python
  2. def f(x):
  3.     return x*x
  4. print f(4)

如果在Python中使用lambda实现的话,

点击(此处)折叠或打开

  1. g = lambda x:x*x
  2. print g(4)

  3. print (lambda x:x*x)(4)

从上面的Python代码中并没有专门定义函数,而是使用的匿名函数lambda实现。

在《深入 Python :Dive Into Python》中有下面的一句话,对lambda函数进行

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

lambda 函数是一种风格问题。不一定非要使用它们;任何能够使用它们的地方,都可以定义一个单独的普通函数来进行替换。我将它们用在需要封装特殊的、非重用代码上,避免令我的代码充斥着大量单行函数。

lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边的为表达式。其实lambda返回值是一个函数的地址,也就是函数对象。

g = lambda x:x*x

print g

打印的输出结果: at 0xb74d872c>

上面说到lambda函数也可以使用多个参数,下面看一下使用多个参数的例子:

print   reduce(lambda   x,y:x*y,   range(1,5)) 

上面这句代码并不容易理解其功能,因为涉及到了内置函数reduce,该函数的原型如下:

reduce(...)

reduce(functionA, sequence[, initial]) -> value

 对sequence中的item顺序迭代调用functionfunction必须要有2个参数,并返回一个值。要是有第3个参数,则表示初始值,可以继续调用初始值,sequence为可迭代变量,如List等。reduce函数将sequence中的元素从左到右依次传入函数A中,再用函数A返回的结果替代传入的参数,反复执行。上面这句代码的含义就是:将15的连续整数列表传入lambda函数并用两个数的积替换列表中的数,也就是求5的阶乘。(((1*2*3*4

 例子1:我们可以看一下lambda的嵌套作用域


点击(此处)折叠或打开

  1. def make_incrementor (n): return lambda x: x + n
  2. >>>
  3. >>> f = make_incrementor(2)
  4. >>> g = make_incrementor(6)
  5.  >>>
  6. >>> print f(42), g(42)
  7. 44 48
  8. >>>
  9. >>> print make_incrementor(22)(33)
  10. 55
    上面的代码中定义了一个函数make_incrementor就是对传入的整数进行了加法运算,make_incrementor函数的返回值也相当于调用了一个函数,


阅读(8290) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~