Chinaunix首页 | 论坛 | 博客
  • 博客访问: 858696
  • 博文数量: 253
  • 博客积分: 6891
  • 博客等级: 准将
  • 技术积分: 2502
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-03 11:01
文章分类

全部博文(253)

文章存档

2016年(4)

2013年(3)

2012年(32)

2011年(184)

2010年(30)

分类: Python/Ruby

2012-02-27 11:28:54

  1. g = lambda x : x**2
  2. print g(4)
在python中使用lambda来创建匿名函数。lambda来源于LISP语言。lambda的形式如下:
  • lambda arg1,arg2... :
lambda会创建一个函数对象,但不会把这个函数对象赋给一个标识符,而def则不同,它在创建函数对象的同时会进行这种操作。这是lambda的第一个特点。lambda的第二个特点是,它只是一个表达式,而不是一个语句。如果单独使它成为了一个语句,比如:
  • lambda x: print x
如果你在你的python程序中写下了这么一行,那么毫无意义,这一行代码会创建一个函数对象,但马上又给丢弃了,因为你没有使用它的返回值,即那个函数对象。也正是由于lambda只是一个表达式,它可以直接作为list或dictionary的成员,比如:
  • L = [lamba x: x**2, lambda x: x**3]
在这个地方没有办法用def语句直接代替。第三,lambda表达式在“:”后只能有一个表达式。也就是说,在def中, 可以放在return后的也可以放在lambda,不能放在return后也不能放在这里。更本质地说,后面的表达式是能够返回一个值的,不能返回值的不 能放在这里。因此,像if或for或print这种语句就不能用于lambda中,lambda一般只用来定义简单的函数。
在lambda中循环语句也是可以模拟的,用的是map函数。比如:
  • F=lambda x: map((lambda y: y**2), x)
当然,这种东西看起来就很复杂,如果可能最好不要嵌套使用lambda。print也是可以模拟的:
  1. import sys
  2. pp = lambda x: sys.stdout.write(str(x)+'/n')
  3. pp(8) ===> 8

Python中,也有几个定义好的全局函数方便使用的,他们就是filter, map, reduce。

>>> foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]
>>>
>>> print filter(lambda x: x % 3 == 0, foo)
[18, 9, 24, 12, 27]
>>>
>>> print map(lambda x: x * 2 + 10, foo)
[14, 46, 28, 54, 44, 58, 26, 34, 64]
>>>
>>> print reduce(lambda x, y: x + y, foo)
139





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