网站性能检测评分
注:本网站页面html检测工具扫描网站中存在的基本问题,仅供参考。
python中的map类型
Python入门基础之map()、reduce()函数使用 企业视频课程
本文环境都是基于python3.X的,毕竟要学会拥抱未来,拥抱新的知识。Python3 现在已经发展的差不多了。
1、 map()函数
map()是 python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的object并返回。(python2返回列表,Python3返回迭代对象)
map()的使用方法形如map(f(x),Itera),它有两个参数,第一个参数为某个函数,第二个为可迭代对象。
基本用法:
注意:python3中map()返回的是一个object,因为map()转变成了迭代器来节约空间,返回的是可迭代对象。
如果需要list可以直接用list(……)来强制返回一个列表。
Map的主要作用就是:并行!并行!并行!map函数和zip函数都是用来进行并行运算,迭代等。
在多进程编程中,Pool池的用法中一种就是利用map函数开启多进程,可以大大提高程序的效率。
Map原理:
在最简单的形式中,map()带一个函数和队列,将函数作用在序列的每个元素上,然后创建由每次函数应用组成的返回值列表。如下图所示:
调用函数运行:
2、reduce()函数
reduce()的使用方法形如reduce(function, iterable[, initializer]),它的形式和map()函数一样。不过参数f(x)必须有两个参数,initializer是可选的。
reduce 使用了一个二元函数(一个接收带带两个值作为输入,进行了一些计算然后返回一个值作为输出),一个序列,和一个可选的初始化器,卓有成效地将那个列表的内容"减少"为一个单一的值,如同它的名字一样。
请看实例:(注意在Python3中reduce不再是内置函数,而是集成到了functools中,需要导入)
它返回的结果相当于(1+2+3+4+5)
Reduce原理图:
它通过取出序列的头两个元素,将他们传入二元函数来获得一个单一的值来实现。然后又用这个值和序列的下一个元素来获得又一个值,然后继续直到整个序列的内容都遍历完毕以及最后的值会被计算出来为止。
码字不易,多多关照
「python」高阶函数map、reduce的介绍 公司视频课程
map
先看官方介绍:
map(function, iterable, ...)Return an iterator that applies function to every item of iterable, yielding the results.
map函数至少使用2个参数:(函数,可迭代对象),返回的结果是个迭代器。实现的作用是将前面的函数依次在后面的可迭代对象上执行。
>>> def ljds(x):... return x+x...>>> a=[0,1,2,3,4,5,6,7,8,9]>>> b=map(ljds,a)>>> next(b)0>>> next(b)2>>> next(b)4>>> list(b)[6, 8, 10, 12, 14, 16, 18]>>>
代码介绍:函数ljds,参数x,作用是返回一个x加上自己的值。ljds(2)结果是4,ljds('梁家大叔')结果是'梁家大叔梁家大叔'。很基础,解释的有点多余....
a是个列表(可迭代对象)。当执行了3次next(b)后,(b是迭代器)此时的结果只有后面7个元素了,因此list(b)只输出了3-9的ljds(x)。
map还可以接受更多的参数,但第一位的函数只有一个,后面可以继续跟可迭代对象:
>>> def ljds(x,y):... return (x+x,y+y)...>>> a=[1,2,3,4,5]>>> b=[11,22,33,44,55]>>> c=map(ljds,a,b)>>> list(c)[(2, 22), (4, 44), (6, 66), (8, 88), (10, 110)]>>>
这个就没必要解释了。
reduce
官方介绍:
functools.reduce(function, iterable[, initializer])Apply function of two arguments cumulatively to the items of sequence, from left to right, so as to reduce the sequence to a single value.
值得一提的是reduce在python2中可以直接使用,在python3中已经放在了fucntools模块里,用之前要先导入。
reduce调用的函数需要两个参数,依次使用可迭代对象的元素作为这个函数的参数,函数执行的结果和下一个元素再作为参数执行函数,依此类推。如果第一次执行时设置了initial,则是initial和第一个元素作为第一次执行的参数。可能容易晕,直接看代码演示吧。
以前学过一篇课文是讲数学家高斯的,他小时候做数学题,1+2+3……一直加到100,结果是多少,这题用reduce操作应该是这样的:
>>> from functools import reduce>>> def ljds(x,y):... return x+y...>>> a=[x for x in range(101)]>>>reduce(ljds,a)5050>>>
代码解释:
导入reduce,创建一个函数ljds,需要2个参数x,y,返回x+y的结果。
a列表是数字从0到100,那么reduce执行的结果就是:
第一次:因没设置initial,所以ljds的参数就是列表a的最前面的2个元素,即0和1,相加结果是1。
第二次:第一次的结果1作为参数,第3个元素2也作为参数,即ljds(1,2),结果是3.
第三次:ljds(3,3)
……
一直到结束。