文档章节

零基础学python-18.9 序列映射函数:map

raylee2015
 raylee2015
发布于 2015/10/21 08:10
字数 833
阅读 1
收藏 0

这一章节我们来讨论一些序列映射函数:map

map函数,就是引入一个函数,然后对序列(字符串、列表、字典等)的每一个对象进行操作

1.场景:

          对序列的所有对象分别加1

一般我们会先想到使用循环for:

>>> aList=[1,2,3,4,5]
>>> def add(aList):
	for x in range(len(aList)):
		aList[x]+=1

		
>>> add(aList)
>>> aList
[2, 3, 4, 5, 6]
>>>

由于思维的惯性,因此我们第一时间就会想到for,但是,我们现在知道了map这个函数,我们就试试重写函数

>>> def add(x):
	return x+1

>>> aList=[1,2,3,4,5]
>>> list(map(add,aList))
[2, 3, 4, 5, 6]
>>>

我们只需要写一个特定的加法函数,然后使用内建函数map,然后返回一个map的类型

>>> map(add,aList)
<map object at 0x0247B050>
>>> type(map(add,aList))
<class 'map'>
>>>

我们再通过list把map转换成列表,打印出来

两组代码的结果都是一样的,但是明显第二组代码结构简单清晰,当然,对于初学者或者不知道map函数的除外,他们会觉得第一种才是首选

上面的代码引入了一个add的函数,但是,很有可能这个函数在这里只使用一遍,其他地方都不使用了,我们在这里就结合lambda表达式,简化上面的代码

>>> aList=[1,2,3,4,5]
>>> add=lambda x:x+1 #把表达式单独列出来
>>> list(map(add,aList))
[2, 3, 4, 5, 6]
>>> list(map(lambda x:x+1,aList)) <span style="font-family: Arial, Helvetica, sans-serif;">#把表达式单独嵌套在里面</span>
[2, 3, 4, 5, 6]
>>>


结合了lambda表达式,代码只剩下一行,但可读性更差


注意:由于map是使得每个序列对象都进行同样的操作,很多时候都不符合时间的需求,毕竟大多数的时间序列的操作都是需要分支条件来支持的,因此,map的操作具备一定的局限性。


2.多序列

map除了上面支持单序列之外,它还支持多序列

>>> list(map(pow,[1,2,3],[1,2,3]))
[1, 4, 27]
>>> list(map(pow,[1,2,3],[1,2,3],[1,2,3]))
[0, 0, 0]
>>>

从上面可以看出,map支持的多序列必须是满足里面函数的参数个数等于序列个数,例如pow需要两个参数,那么,我们只能提供两个序列,提供三个的时候返回0

>>> list(map(pow,[1,2,3],[1,2]))
[1, 4]
>>>

而且,如果序列里面的对象不相一致,它会自动截取


3.模拟map

下面我们来试一下自己模拟map的实现,我们使用for

>>> def add(x): return x+1

>>> def test(func,aList):
	res=[]
	for item in aList:
		res.append( func(item))
	return res

>>> aList=[1,2,3,4,5]
>>> test(add,aList)
[2, 3, 4, 5, 6]
>>>

上面的代码通过for来模拟map的函数实现,但是由于map是内建函数,使用c语音实现的,所以从性能上来说模拟的map要比内建的map慢


总结:这一章节我们讨论了map的使用场景,还有map对多序列的支持,最后我们还模拟了map的实现。


这一章节就说到这里,谢谢大家

------------------------------------------------------------------

点击跳转零基础学python-目录

 



版权声明:本文为博主原创文章,未经博主允许不得转载。

本文转载自:http://blog.csdn.net/raylee2007/article/details/48628815

共有 人打赏支持
raylee2015
粉丝 6
博文 265
码字总数 44224
作品 0
江门
Python3: fp-growth算法代码(提供py文件,可直接调用)

一、写在前面 fp-growth算法是一个生成频繁项集的算法,其主要利用了FP树的数据结构,整个生成过程只需要遍历数据集2次。 本fp-growth代码是基于开源代码fp-growth的实现(github代码:https...

quiet_girl
05/13
0
0
python内置函数map/reduce/filter

python有几个内置的函数很有意 思:map/filter/reduce,都是对一个集合进行处理,filter很容易理解用于过滤,map用于映射,reduce用于归并。 是python列表方法的三架马车。 filter() 函数: f...

itfanr
2014/12/20
0
0
python lambda函数

python允许用lambda来创建匿名函数,匿名是因为不需要以标准的方式来声明,而def创建的方法是有名称的,它们主要有2个地方不一样 1.lambda表达式返回可调用的函数对象.但不会把这个函数对象赋给...

乐晨
2013/04/12
0
3
Python 2 和 Python 3 主要区别有哪些(一)?

Guido(Python之父,仁慈的独裁者)在设计 Python3 的过程中,受一篇文章 “Python warts” 的影响,决定不向后兼容,否则无法修复大多数缺陷。---摘录自《流畅的Python》 你可能从来没有听说...

liuzhijun
2017/08/02
0
0
python2.x和python3.x的区别

Python的3.0版本,常被称为Python3000,或简称Py3k。相对于Python的早期版本,这是一个较大的升级。 为了不带入过多的累赘,Python3.0在设计的时候没有考虑向下相容。许多针对早期Python版本...

leejia1989
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

设计模式:简单工厂模式(静态共产方法模式)

简单工厂的构成包括三个角色: 1)抽象产品类 2)具体产品类(继承抽闲产品类) 3)工厂类(生产具体产品) 具体代码实现 1、抽象产品类 /** * 抽象类 */public abstract class Car ...

京一
2分钟前
0
0
Lombok使用

1 介绍 Lombok是一个简单的Java库,改工具可以通过注解自动地提供一些方法,简化开发。比如编写POJO时需要为每个属性提供getter()方法和setter()方法,这就可以使用Lombok实现。 2 配置 Lomb...

SuperHeroes
10分钟前
0
0
Confluence 6 删除垃圾内容

属性(profile)垃圾 属性垃圾的定义为,一个垃圾用户在 Confluence 创建了用户,但是这个用户在自己的属性页面中添加了垃圾 URL。 如果你有很多垃圾用户在你的系统中创建了属性,你可以使用...

honeymose
12分钟前
0
0
java虚拟机之内存模型

1. 概述 对于从事 C、C++ 程序开发的人员来说,在内存管理领域,他们既是拥有最高权力的「皇帝」又是从事基础工作的「劳动人民」 --- 既拥有每个对象的「所有权」,又担负着每一个对象生命开...

firepation
15分钟前
0
0
解决linux的-bash: ./xx: Permission denied

解决linux的-bash: ./xx: Permission denied 在linux下执行sh文件时提示下面信息: -bash: ./xx.sh: Permission denied解决:chmod 777 xx.sh 1 2 3 4 Linux chmod +755和chmod +777 ......

DemonsI
26分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部