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


    这一章节我们来讨论一些序列映射函数: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-目录

     



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

  • 相关阅读:
    基础总结篇之一:Activity生命周期
    putExtra方法
    fork函数
    linux中fork()函数详解(原创!!实例讲解) (转载)
    系统调用wait、waitpid和exec函数
    版本控制工具VSS使用介绍
    学习进度条六(第七周)
    阶段冲刺4
    阶段冲刺3
    阶段冲刺2
  • 原文地址:https://www.cnblogs.com/raylee2007/p/4896722.html
Copyright © 2020-2023  润新知