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
<function <lambda> at
0x00AFAAF0>

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才能做到这样的简洁程度呢?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

一、filter(function, sequence)
对sequence中的item依次执行function(item),将执行结果为True的item组成一个List/String/Tuple(取决于sequence的类型)返回:

def f(x):
    return x % 2 != 0 and x % 3 != 0

print filter(f, range(2, 25))
#[5, 7, 11, 13, 17, 19, 23]

def f1(x):
    return x != 'a'

print filter(f1, "abcdef") #bcdef

二、map(function, sequence)  
对sequence中的item依次执行function(item),见执行结果组成一个List返回:

def cube(x):
    return x*x*x
print map(cube, range(1, 11))
#[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]

def cube1(x):
    return x + x
print map(cube1 , "abcde")
#['aa', 'bb', 'cc', 'dd', 'ee']
 
另外map也支持多个sequence,这就要求function也支持相应数量的参数输入:
def add(x, y):
    return x+y
print map(add, range(8), range(8))
#[0, 2, 4, 6, 8, 10, 12, 14]

status_ids = map(lambda x:x.get('status__id'), snaps)

三、reduce(function, sequence, starting_value)
对sequence中的item顺序迭代调用function,如果有starting_value,还可以作为初始值调用,例如可以用来对List求和:
def add(x,y):
    return x + y
print reduce(add, range(1, 11))
注:1+2+3+4+5+6+7+8+9+10

reduce(add, range(1, 11), 20)
注:1+2+3+4+5+6+7+8+9+10+20

四、lambda
这是Python支持一种有趣的语法,它允许你快速定义单行的最小函数,类似与C语言中的宏,这些叫做lambda的函数,是从LISP借用来的,可以用在任何需要函数的地方:
g = lambda x: x * 2
print g(3) #6

print (lambda x: x * 2)(3)  #6

五、sorted
aa = [
   {'name':'zhangsan', 'price':20.01, 'date':'2015-01-09T01:00:00Z'},
   {'name':'lisi', 'price':10.01, 'date':'2013-01-09T01:00:00Z'},
   {'name':'wangwu', 'price':0.01, 'date':'2012-01-09T01:00:00Z'}
]  
sorted(aa, key=lambda s:s.amount) #对list进行排序
sorted(aa, key=lambda s:s.amount, reverse=True)

aa = [<Symbol: Symbol object>, <Symbol: Symbol object>, <Symbol: Symbol object>]
sorted(aa, key=lambda s:s["date"]) #对Symbol对象进行排序,date为Symbol属性
sorted(aa, key=lambda s:s["date"], reverse=True)

六、for特殊用法
for i in range(4):
    print i

se=[x**2 for x in range(4)]
print se #[0, 1, 4, 9]

se=[x**2 for x in range(10) if not x%2]
print se #[0, 4, 16, 36, 64]

python几个特别函数map filter reduce lambda的更多相关文章

  1. python 内置函数 map filter reduce lambda

    map(函数名,可遍历迭代的对象) # 列组元素全加 10 # map(需要做什么的函数,遍历迭代对象)函数 map()遍历序列得到一个列表,列表的序号和个数和原来一样 l = [2,3,4,5,6, ...

  2. python之高阶函数--map()和reduce()

    以下为学习笔记:来自廖雪峰的官方网站 1.高阶函数:简单来说是一个函数里面嵌入另一个函数 2.python内建的了map()和reduce()函数 map()函数接收两参数,一个是函数,一个是Iter ...

  3. python的高阶函数(map,filter,sorted,reduce)

    高阶函数 关注公众号"轻松学编程"了解更多. 1.MapReduce MapReduce主要应用于分布式中. 大数据实际上是在15年下半年开始火起来的. 分布式思想:将一个连续的字 ...

  4. python之内置函数:map ,filter ,reduce总结

    map函数: #处理序列中的每个元素,得到的结果是一个'列表',该列表元素个数及位置与原来一样 filter函数: #遍历序列中的每个元素,判断每个元素得到一个布尔值,如果是true,则留下来 peo ...

  5. 高阶函数map(),filter(),reduce()

    接受函数作为参数,或者把函数作为结果返回的函数是高阶函数,官方叫做 Higher-order functions. map()和filter()是内置函数.在python3中,reduce()已不再是 ...

  6. 高阶函数-map/filter/reduce

    什么样的函数叫高阶函数: 条件:1.函数接受函数作为参数 2.函数的返回值中包含函数 高阶函数之----map函数 map(func, *iterables) --> map objectnum ...

  7. [ Python - 9 ] 高阶函数map和reduce连用实例

    1. 利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456: from functools import reduce def str2num( ...

  8. 高阶函数map,filter,reduce的用法

    1.filter filter函数的主要用途是对数组元素进行过滤,并返回一个符合条件的元素的数组 let nums = [10,20,30,111,222,333] 选出nums中小于100的数: l ...

  9. python常用函数进阶(2)之map,filter,reduce,zip

    Basic Python : Map, Filter, Reduce, Zip 1-Map() 1.1 Syntax # fun : a function applying to the iterab ...

随机推荐

  1. 关于var(string)++的类型自动转换

    展示时间: var miao="50"; var fen="59"; var shi="00"; setInterval(fun, 1000 ...

  2. Redis初始化配置及增删改查

    package com.calc.tools import redis.clients.jedis.JedisPool import redis.clients.jedis.Jedis import ...

  3. JAVA虚拟机内存模型

    一.对于Java程序员来说,在虚拟机的自动内存管理机制下,我们不需要为每一个new操作去写匹配的delete/free操作 但是当我们对于内存的管理了解有能够帮助我们理解Java虚拟机的垃圾回收机制. ...

  4. [Swust OJ 767]--将军回家(Dijkstra算法)

    题目链接:http://acm.swust.edu.cn/problem/767/ Time limit(ms): 1000 Memory limit(kb): 65535   Description ...

  5. js之form表单的获取

    js中获取form的方法: 1. 利用表单在文档中的索引或表单的name属性来引用表单 document.forms[i] //得到页面中的第i个表单 document.forms[formName] ...

  6. C语言之固定格式输出当前时间

    固定格式输出当前时间 编程实现将当前时间用以下形式输出:星期  月  日   小时:分:秒   年 代码如下: #include<stdio.h>#include<stdlib.h& ...

  7. QT中的qmake详解

    关于qmake,好一段时间令我一头雾水,不知道用来干嘛的,只知道怎么用,而且也只懂那么一两个命令,详细看过资料以后整理如下: 1.首先,感性的认识是,qmake可以利用源文件(包括头文件h,实现文件c ...

  8. Google浏览器的缓存文件过大(mega网站导致的)

    到选项里清空所有内容也没有用. 后来手动找了一下,原来在这里,存了在这里存了整整10G的缓存: C:\Users\my\AppData\Local\Google\Chrome\User Data\Pr ...

  9. C# 计算器 如果设置键盘输入的监听事件

    这个事情困扰了我好久,之前java写的计算器程序可以正常运行了,但是因为打包问题(尝试过多次,感觉好麻烦,个人比较崇尚“点子”,注重创新,思来想去之后,决定试试C#模仿java再写一遍),想要用C#模 ...

  10. C/C++用strncpy()与strstr()分割与匹配查找字符串

    最近做题遇到分割与匹配字符串的题目(hdu5311),看来别人的代码,才知道有strncpy()和strstr()函数,于是搜集了一点资料,记录一下基本用法. 一.strncpy() char * s ...