码迷,mamicode.com
首页 > 编程语言 > 详细

Python函数和函数式编程(2): 匿名函数--lambda

时间:2016-08-07 18:47:53      阅读:268      评论:0      收藏:0      [点我收藏+]

标签:

原文地址:http://blog.csdn.net/majianfei1023/article/details/45269343

 

一. lambda函数:

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

def f(x):  
    return x * 2  
      
g = lambda x : x * 2  


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

 

但是lambda存在的意义是什么吗?其实很简单,简单来说,python lambda会创建一个函数对象,但不会把这个函数对象赋给一个标识符,而def则会把函数对象赋值给一个变量。

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

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

你可能会这么写:

def func():  
    result = []  
    for i in xrange(100):  
        if i % 3 == 0:  
            result.append(i)  
    return result  

 

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

def func(x):  
    return x%3 == 0  
  
filter(func,[i for i in xrange(100)])  

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

filter(lambda x:x%3==0,[i for i in xrange(100)])  

 

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

 更简单的方式是使用列表推导式。

print [i for i in xrange(100) if i%3==0]

 

二. lambda与def

上面的例子中,可知lambda函数只是创建简单的函数对象,是一个函数的单行版本,但是这种语句由于性能的原因,调用的时候绕过函数的栈分配。python lambda还有哪些和def不一样呢?

1 、python lambda会创建一个函数对象,但不会把这个函数对象赋给一个标识符,而def则会把函数对象赋值给一个变量。

如:

>>> def foo():return foo()
>>> foo
<function foo at 0x011A34F0>

2、python lambda它只是一个表达式,而def则是一个语句。lambda表达式运行起来像一个函数,当被调用时创建一个框架对象。

三. lambda函数的用途

个人认为有以下:

1、对于单行函数,使用lambda可以省去定义函数的过程,让代码更加精简。

2、在非多次调用的函数的情况下,lambda表达式即用既得,提高性能

注意:如果for..in..if能做的,最好不要选择lambda

 

 

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

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

我们有一个触发器函数:

def addBtnClickHander(btn,func):  
    # 这个是通用接口,不可修改  
      
    def hander():  
        widget = "%s_name"%btn  # 根据btn取得  
        func(widget)  
      
    return hander  

 

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

def main():  
    btn = enter btn  
      
    addBtnClickHander(btn,onClick)  
      
def onClick(widget):  
    print "onClick:",widget  

 

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

def main():  
    btn = enter btn  
    name = name  
    addBtnClickHander(btn,lambda widget:onClick(widget,name))  
      
def onClick(widget,name):  
    print "onClick:",widget,name  

 

 

Python函数和函数式编程(2): 匿名函数--lambda

标签:

原文地址:http://www.cnblogs.com/xhwang/p/5746661.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!