python几个重要的函数(lambda,filter,reduce,map,zip)
一、匿名函数lambda
lambda argument1,argument2,...argumentN :expression using arguments
1、lambda是一个表达式,而不是一个语句。
因为这一点,lambda可以出现在python语法不允许def出现的地方---例如,在一个列表常量中或者函数调用的参数中,此外,作为一个表达式,lambda返回一个值一个值(一个新的函数),可以选择性地值给一个变量名。相反,def语句总是得在头部将一个新的函数赋值给一个变量名,而不是将这个函数作为结果返回。
2、lambda 的主体是一个单个的表达式,而不是一个代码块。
lambda是一个为编写简单的函数设计的,而def用来处理更大的任务。
Example:
>>>f=lambda x,y,z: x+y+z
>>>f(2,3,4)
9
>>>x=(lambda a=”fee”,b=”fie”,c=”foe”: a+b+c)
>>>x(“wee”)
‘weefiefoe’
通常用lambda来编写跳转表,如下:
>>>L = [lambda x: x**2,
lambda x: x**3,
lambda x: x**4 ]
>>>for f in L:
print(f(2))
4
8
16
>>>print(L[0](3))
9
嵌套的lambda,如下:
>>>def action(x):
return (lambda y: x+y)
>>>act=action(99)
>>>act(2)
101
>>>action = (lambda x: (lambda y: x+y))
>>>act = action(99)
>>>act(2)
101
>>>((lambda x: (lambda y: x+y))(99))(2)
101
二、map函数
map(function, sequence[, sequence, ...]) -> iterator
通过定义可以看到,这个函数的第一个参数是一个函数,剩下的参数是一个或多个序列,返回值是一个迭代器。
function可以理解为是一个一对一或多对一函数,map的作用是以参数序列中的每一个元素调用function函数,返回包含每次function函数返回值的迭代器。
返回可迭代对象,需要list调用来显示所有结果。
>>> list(map(lambda x:x+2, [1, 2, 3]))
[3, 4, 5]
>>>list(map(pow,[1,2,3],[2,3,4]))
[1,8,81]
三、filter函数
filter函数会对指定序列执行过滤操作。
filter函数的定义:
filter(function or None, sequence) ->iterator
filter函数会对序列参数sequence中的每个元素调用function函数,最后返回的结果包含调用结果为True的元素。
返回可迭代对象,需要list调用来显示所有结果。
>>>list(filter((lambda x: x>0),range(-5,5)))
[1,2,3,4]
>>>list(filter(None,range(-5,5)))
[-5, -4, -3, -2, -1, 1, 2, 3, 4]
若function为None,则会返回包含非空元素的迭代器。
四、reduce函数
reduce函数,reduce函数会对参数序列中元素进行累积。
reduce函数的定义:
functools.reduce(function, iterable[, initializer]) #python3中reduce是在functools模块中
function参数是一个有两个参数的函数,reduce依次从iterable中取一个元素,和上一次调用function的结果做参数再次调用function。
第一次调用function时,如果提供initial参数,会以iterable中的第一个元素和initial作为参数调用function,否则会以iterable中的前两个元素做参数调用function。
等价于:
def reduce(function, iterable, initializer=None):
it = iter(iterable)
if initializer is None:
value = next(it)
else:
value = initializer
for element in it:
value = function(value, element)
return value
>>> functools.reduce(lambda x, y:x+y, [1,2,3,4])
10
>>> functools.reduce(lambda x, y:x+y, [1,2,3,4], 10)
20
>>> functools.reduce(lambda x, y:x*y, [1,2,3,4])
24
如果没有initial参数,这么算:(((1+2)+3)+4)
如果有initial参数,这么算: ((((10+1)+2)+3)+4)
注意:function函数不能为None,function必须是有2个参数的函数。
五、zip函数
其中sorted()和zip()返回一个序列(列表)对象,reversed()、enumerate()返回一个迭代器(类似序列)
定义:zip([seql, ...])接受一系列可迭代对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些tuples组成的list(列表)。若传入参数的长度不等,则返回list的长度和参数中长度最短的对象相同。
>>> list(zip([1,23,3],[213,45,2])) #两个列表长度一致
[(1, 213), (23, 45), (3, 2)]
>>> list(zip([1,23,3],[213,45,2,34,54])) #两个列表长度不一致,以短的为准
[(1, 213), (23, 45), (3, 2)]
zip一些应用:
>>> [ [ i for i in range(3*n+1,3*n+4) ] for n in range(3) ]
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
1、二维矩阵变换(矩阵的行列互换)
>>>a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>>[ [row[col] for row in a] for col in range(len(a[0]))]
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
>>>list(zip(*a))
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
>>> map(list,zip(*a))
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
2、*操作符与zip函数配合可以实现与zip相反的功能,即将合并的序列拆成多个tuple
>>>>x=[1,2,3],y=['a','b','c']
>>>>zip(*zip(x,y))
[(1,2,3),('a','b','c')]
3、使用zip合并相邻的列表项
>>> a = [1, 2, 3, 4, 5, 6]
>>> list(zip(*([iter(a)] * 2)))
[(1, 2), (3, 4), (5, 6)]
>>> group_adjacent = lambda a, k: zip(*([iter(a)] * k))
>>> list(group_adjacent(a, 3))
[(1, 2, 3), (4, 5, 6)]
>>> list(group_adjacent(a, 2))
[(1, 2), (3, 4), (5, 6)]
>>> list(group_adjacent(a, 1))
[(1,), (2,), (3,), (4,), (5,), (6,)]
>>> list(zip(a[::2], a[1::2]))
[(1, 2), (3, 4), (5, 6)]
>>> list(zip(a[::3], a[1::3], a[2::3]))
[(1, 2, 3), (4, 5, 6)]
>>> group_adjacent = lambda a, k: zip(*(a[i::k] for i in range(k)))
>>> list(group_adjacent(a, 3))
[(1, 2, 3), (4, 5, 6)]
>>> list(group_adjacent(a, 2))
[(1, 2), (3, 4), (5, 6)]
>>> list(group_adjacent(a, 1))
[(1,), (2,), (3,), (4,), (5,), (6,)]
4、使用zip和iterators生成滑动窗口 (n -grams)
>>> from itertools import islice
>>> def n_grams(a, n):
z = (islice(a, i, None) for i in range(n))
return zip(*z)
>>> a = [1, 2, 3, 4, 5, 6]
>>> list(n_grams(a, 3))
[(1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6)]
>>> list(n_grams(a, 2))
[(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
>>>list(n_grams(a, 4))
[(1, 2, 3, 4), (2, 3, 4, 5), (3, 4, 5, 6)]
5、使用zip反转字典
>>> m = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
>>> list(m.items())
[('a', 1), ('c', 3), ('b', 2), ('d', 4)]
>>> list(zip(m.values(), m.keys()))
[(1, 'a'), (3, 'c'), (2, 'b'), (4, 'd')]
>>>dict(zip(m.values(), m.keys()))
{1: 'a', 2: 'b', 3: 'c', 4: 'd'}
python几个重要的函数(lambda,filter,reduce,map,zip)的更多相关文章
- Python中Lambda, filter, reduce and map 的区别
Lambda, filter, reduce and map Lambda Operator Some like it, others hate it and many are afraid of t ...
- Python学习(五)函数 —— 内置函数 lambda filter map reduce
Python 内置函数 lambda.filter.map.reduce Python 内置了一些比较特殊且实用的函数,使用这些能使你的代码简洁而易读. 下面对 Python 的 lambda.fil ...
- Python常用内置函数整理(lambda,reduce,zip,filter,map)
匿名函数lambda lambda argument1,argument2,...argumentN :expression using arguments 1.lambda是一个表达式,而不是一个语 ...
- python进阶学习之匿名函数lambda
定义: lambda 参数列表:return(表达式) 匿名函数的表达式,只允许有一个. 匿名函数一般用于较简单的情况. 实例1: 实例2,配合高阶函数filter()使用: filter()函数是 ...
- 『Python基础-14』匿名函数 `lambda`
匿名函数和关键字lambda 匿名函数就是没有名称的函数,也就是不再使用def语句定义的函数 在Python中,如果要声匿名函数,则需要使用lambda关键字 使用lambda声明的匿名函数能接收任何 ...
- Python学习笔记010——匿名函数lambda
1 语法 my_lambda = lambda arg1, arg2 : arg1 + arg2 + 1 arg1.arg2:参数 arg1 + arg2 + 1 :表达式 2 描述 匿名函数不需要r ...
- 内置函数: filter 和 map
内置函数———filter和map filter filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表.接收两个参数,第一个为函数,第二个为序列,序列的每个元素作 ...
- JavaScript高阶函数之filter、map、reduce
JavaScript高阶函数 filter(过滤) 用法: 用于过滤,就是把数组中的每个元素,使用回调函数func进行校验,回调函数func返回一个布尔值,将返回值为 true 的元素放入新数组 参数 ...
- python中的内置函数lambda map filter reduce
p.p1 { margin: 0; font: 12px "Helvetica Neue" } p.p2 { margin: 0; font: 12px "Helveti ...
- Python 函数lambda(), filter(), map(), reduce()
1 filter filter(function, sequence):对sequence中的item依次执行function(item),将执行结果为True的item组成一个List/String ...
随机推荐
- ubuntu 开热点
原文地址:https://www.cnblogs.com/king-ding/archive/2016/10/09/ubuntuWIFI.html 今天教大家一个简单方法让ubuntu发散wifi热点 ...
- truffle的调用nodeJs的问题
Truffle3.0集成NodeJS并完全跑通(附详细实例,可能的错误) 升级到Truffle3.0 如果之前安装的是Truffle2.0版本,需要主动升级到Truffle3.0,两者的语法变化有点大 ...
- thinkPHP form表单提交参数无法获取
后台打印获取的数据为empty, 找了半天,是因为 input标签没有写name, 真是醉了!记一下,免得以后再犯错了.
- hibernate延时加载机制
延迟加载: 延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作.在Hibernate中提供了对实体对象的延迟加载以及对集合的延迟加载,另 ...
- tomcat中配置JNDI方法
1.项目中spring的数据源配置: <bean id="dataSource" class="org.springframework.jndi.JndiObjec ...
- 【bzoj1257】[CQOI2007]余数之和sum 数论
题目描述 给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod i表示k除以i的余数.例如j(5, 3)=3 m ...
- BZOJ4347 POI2016Nim z utrudnieniem(博弈+动态规划)
由nim游戏的结论,显然等价于去掉一些数使剩下的数异或和为0. 暴力的dp比较显然,设f[i][j][k]为前i堆移走j堆(模意义下)后异或和为k的方案数.注意到总石子数量不超过1e7,按ai从小到大 ...
- 【题解】ZJOI2010贪吃的老鼠
%%%%真的好强...看题解我都看了好久才完全明白.放一下参考的博客,谢谢神犇QAQ 1号博客 2号博客(超级赞的啦) 因为理解的过程太艰辛,所以必须记录一下这道强题:这道题目最难的两个约束就在 ...
- cdh版本的hadoop安装及配置(伪分布式模式) MapReduce配置 yarn配置
安装hadoop需要jdk依赖,我这里是用jdk8 jdk版本:jdk1.8.0_151 hadoop版本:hadoop-2.5.0-cdh5.3.6 hadoop下载地址:链接:https://pa ...
- C++——类继承以及类初始化顺序
对于类以及类继承, 几个主要的问题:1) 继承方式: public/protected/private继承. 这是c++搞的, 实际上继承方式是一种允许子类控制的思想. 子类通过public继承, 可 ...