当前位置:  编程技术>python

Python的lambda匿名函数的简单介绍

    来源: 互联网  发布时间:2014-09-04

    本文导语:  lambda函数也叫匿名函数,即,函数没有具体的名称。先来看一个最简单例子: 代码如下:def f(x):return x**2print f(4)Python中使用lambda的话,写成这样 代码如下:g = lambda x : x**2print g(4) lambda表达式在很多编程语言都有对应的实现。比如...

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

代码如下:

def f(x):
return x**2
print f(4)

Python中使用lambda的话,写成这样
代码如下:

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

lambda表达式在很多编程语言都有对应的实现。比如C#:

代码如下:

var g = x => x**2
Console.WriteLine(g(4))

那么,lambda表达式有什么用处呢?很多人提出了质疑,lambda和普通的函数相比,就是省去了函数名称而已,同时这样的匿名函数,又不能共享在别的地方调用。其实说的没错,lambda在Python这种动态的语言中确实没有起到什么惊天动地的作用,因为有很多别的方法能够代替lambda。同时,使用lambda的写法有时显得并没有那么pythonic。甚至有人提出之后的Python版本要取消lambda。

回过头来想想,Python中的lambda真的没有用武之地吗?其实不是的,至少我能想到的点,主要有:

1. 使用Python写一些执行脚本时,使用lambda可以省去定义函数的过程,让代码更加精简。

2. 对于一些抽象的,不会别的地方再复用的函数,有时候给函数起个名字也是个难题,使用lambda不需要考虑命名的问题。

3. 使用lambda在某些时候让代码更容易理解。

lambda基础
lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边的返回值。lambda语句构建的其实是一个函数对象,见证一下:

代码如下:

g = lambda x : x**2
print g


C#3.0开始,也有了lambda表达式,省去了使用delegate的麻烦写法。C#中的lambda表达式关键字是=>,看下面的一个例子:
代码如下:

var array = new int[] {2, 3, 5, 7, 9};
var result = array.Where(n => n > 3); // [5, 6, 9]


C#使用了扩展方法,才使得数组对象拥有了像Where,Sum之类方便的方法。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

非lambda不可?
上面例子中的map的作用,和C#的Where扩展方法一样,非常简单方便。但是,Python是否非要使用lambda才能做到这样的简洁程度呢?在对象遍历处理方面,其实Python的for..in..if语法已经很强大,并且在易读上胜过了lambda。比如上面map的例子,可以写成:

代码如下:

print [x * 2 + 10 for x in foo]

非常的简洁,易懂。filter的例子可以写成:
代码如下:

print [x for x in foo if x % 3 == 0]

同样也是比lambda的方式更容易理解。

所以,什么时候使用lambda,什么时候不用,需要具体情况具体分析,只要表达的意图清晰就好。一般情况下,如果for..in..if能做的,我都不会选择lambda。

lambda broken?
在数学教学中,经常会使用到lambda,比如有一位老兄就遇到这样一个问题。他想创建一个函数数组fs=[f0,...,f9] where fi(n)=i+n. 于是乎,就定义了这么一个lambda函数:

代码如下:

fs = [(lambda n: i + n) for i in range(10)]

但是,奇怪的是,
代码如下:

>>> fs[3](4)
13
>>> fs[4](4)
13
>>> fs[5](4)
13

结果并没有达到这位老兄的预期,预期的结果应该是:
代码如下:

>>> fs[3](4)
7
>>> fs[4](4)
8
>>> fs[5](4)
9

问题其实出在变量i上。上面的代码换个简单的不使用lambda的缩减版本:
代码如下:

i = 1
def fs(n):
return n + i
print fs(1) # 2
i = 2
print fs(1) # 3

可见,上面没有达到预期的原因是lambda中的i使用的是匿名函数外的全局变量。修改一下:
代码如下:

fs = [(lambda n, i=i : i + n) for i in range(10)]
>>> fs[3](4)
7
>>> fs[4](4)
8
>>> fs[5](4)
9

    
 
 

您可能感兴趣的文章:

  • Python类的构造函数,析构函数以及垃圾回收机制详细介绍及代码举例
  • python中去空格函数的用法
  • Python函数默认参数和字典参数及可变参数(带星号参数)
  • 哪位大侠有python的win32com的api函数说明?
  • Python数组条件过滤filter函数使用示例
  • Python过滤函数filter()使用自定义函数过滤序列实例
  • Python使用函数默认值实现函数静态变量的方法
  • python基础教程之lambda表达式使用方法 iis7站长之家
  • Python的函数嵌套的使用方法
  • python中的一些类型转换函数小结
  • Python中apply函数的用法实例教程
  • python del()函数用法
  • python中使用enumerate函数遍历元素实例
  • 使用python实现strcmp函数功能示例
  • Python def函数的定义、使用及参数传递实现代码
  • python函数返回多个值的示例方法
  • Python 执行字符串表达式函数(eval exec execfile)
  • Python获取远程文件大小的函数代码分享
  • Python help()函数用法详解
  • python strip()函数 介绍
  • python的id()函数解密过程
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Python中lambda的用法及其与def的区别解析
  • python基础教程之lambda表达式使用方法
  • Python GUI编程:tkinter实现一个窗口并居中代码
  • 让python同时兼容python2和python3的8个技巧分享
  • Python不使用print而直接输出二进制字符串
  • 使用setup.py安装python包和卸载python包的方法
  • Python中实现json字符串和dict类型的互转
  • 不小心把linux自带的python卸载了,导致安装一个依赖原python的软件不能安装,请问该怎么办?
  • python异常信息堆栈输出到日志文件
  • python读取csv文件示例(python操作csv)
  • python下用os.execl执行centos下的系统时间同步命令ntpdate
  • python基础教程之python消息摘要算法使用示例
  • Python namedtuple对象json序列化/反序列化及对象恢复
  • 新手该如何学python怎么学好python?
  • Python获取网页编码的方法及示例代码
  • 使用python删除nginx缓存文件示例(python文件操作)
  • Python异常模块traceback用法举例
  • python学习手册中的python多态示例代码
  • python之平台独立的调试工具winpdb介绍
  • 请教:system("C:\python2.4\python.exe C:\aa.py");该语句有何错误?为什么运行界面一闪就消失了并且没有运行完,请给出正确语句!
  • 基于Python的Html/xml解析库Beautiful Soup 4.2.1发布
  • python版本的问题
  • 测试Python内部类型及type和isinstance用法区别
  • Mac OS X10.9安装的Python2.7升级Python3.3步骤详解


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3