python lambda的用法

欢迎转载,转载请注明原文地址:http://blog.csdn.net/majianfei1023/article/details/45269343


lambda函数也叫匿名函数,函数没有具体的名称。先来看一个最简单例子:


[python]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. def f(x):  
  2.     return x * 2  
  3.       
  4. g = lambda x : x * 2  

看一下 f 和 g的写法有什么不同,f是定义了一个函数,传进去一个参数x,然后x*2,g是定义了一个lambda,后面跟着一个x(这个就是参数),然后跟着一个 : x * 2 (这就是执行的操作),所以以上的 f = g。它们是完全一样的东西,你可以这么写:f(10),或者这么写: g(10)。

但是lambda存在的意义是什么吗?其实很简单,简单来说, lambda 表达式通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用。

比如,在Python中有着几个内置函数,像 map,filter,reduce,我假设你了解它们的用法。

出个简单的不能再简单的编程题:打印100以内的为3的倍数的数。

你可能会这么写:

[python]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. def func():  
  2.     result = []  
  3.     for i in xrange(100):  
  4.         if i % 3 == 0:  
  5.             result.append(i)  
  6.     return result  

或者你比较了解Python的特性,可以用filter过滤:

[python]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. def func(x):  
  2.     return x%3 == 0  
  3.   
  4. filter(func,[i for i in xrange(100)])  

无论怎样,我们都需要定义一个函数,或求值,或过滤,能不能不用这么麻烦,这么简单的编程题,每次要定义一个函数,很麻烦,lambda该上场了,

[python]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. filter(lambda x:x%3==0,[i for i in xrange(100)])  

就这么一句,搞定。注意看这个lambda,跟上面的那个func,做的是完全一样的操作,只不过是不用去显示的定义它。


基础的讲完了,下面看看项目中我们怎么用lambda的吧:

比如在cocos2d-x中我们需要给按钮增加点击事件,然后点击之后触发。

我们有一个触发器函数:

[python]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. def addBtnClickHander(btn,func):  
  2.     # 这个是通用接口,不可修改  
  3.       
  4.     def hander():  
  5.         widget = "%s_name"%btn  # 根据btn取得  
  6.         func(widget)  
  7.       
  8.     return hander  




我们在函数里面给一个按钮加一个点击事件:

[python]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. def main():  
  2.     btn = 'enter btn'  
  3.       
  4.     addBtnClickHander(btn,onClick)  
  5.       
  6. def onClick(widget):  
  7.     print "onClick:",widget  


但是我们经常需要传递额外参数给onClick点击事件,比如传递按钮的name啊等等,这个时候lambda是一个不错的选择。

[python]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. def main():  
  2.     btn = 'enter btn'  
  3.     name = 'name'  
  4.     addBtnClickHander(btn,lambda widget:onClick(widget,name))  
  5.       
  6. def onClick(widget,name):  
  7.     print "onClick:",widget,name  


当然我们也可以使用decorator代替lambda来增加参数,

详情请看:http://blog.csdn.NET/majianfei1023/article/details/45001021

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值