Python基础学习(5) map详解

Python基础学习之map详解

  • 简述
  • 一、我眼中的map
  • 二、深度解析map
  • 三、案例展示
  • 1、输入转换
  • 2、有序对互换位置
  • 3、错误分析
  • 简述

      本来map也没有什么具体应用,但是刚才发现了些许问题,对map有了个人的一些见解,所以抓紧来这里记录一下,方便后续回顾。下面的格式可能与之前的不同,因为样本有些少,但我觉得对于理解map还是非常有用的。

    一、我眼中的map

      第一次了解map是在stl中,跟python的字典类似。而python中的map跟stl中的map又完全不同,python中的map传入的参数是一个函数,另一个参数是可迭代对象,当然也可以传入多个可迭代对象。

    二、深度解析map

      首先,对于map(func,a),第一个参数为函数,第二个参数为可迭代对象,我们这里先不考虑多个可迭代对象的情况。func中的参数,指代的是a中元素,也就是说,map(func,a)是对a中的每一个元素进行func的操作,每一个操作后的元素,是一个map元素,而这些map元素,最后组成了map可迭代对象。我们可以进行list()对其可视化。
      这里其实应加入讲解图片的,我也能用manim生成,但最近时间紧张,确实没空用manim生成图片,这里就还是用代码讲解,后续再补填图片。

    a=[1,2,3,4,5,6,7] #指的是可迭代对象
    def func(x):
    	return x**2
    b=map(func,a)
    print(b)# 看看b的类型
    print(list(b))#可视化b
    

    输出结果:

    结合代码带入上面的话分析:
      注意我上面第一个加黑的地方"func中的参数,指代的是a中元素" ,这里的fun参数就是代码中的x,而传入的x,则是代码中的1、2、3等等这些a中的元素。后面第二处加黑的"每一个元素进行func的操作",指的是a中的元素(1、2、3、4等等)进行func的操作,也就是平方的操作。

      传入函数的话,出错不太明显,容易出错的地方是传入匿名函数,对其中的x把握不准的话,就会产生无法匹配的问题,从而出错。

    三、案例展示

      首先要明确,穷举永远也穷举不完的,需要知道内在关系,想要熟练应用,只能多加练习,而出错在所难免,从错误中总结,才能更加熟练地应用。

    1、输入转换

    a=list(map(int,input().split()))
    

      这是最基本的了,不多说了。

    2、有序对互换位置

    a=[(1,2),(3,4),(5,6)]
    b=map(lambda x:(x[1],x[0]),a)
    print(list(b))
    

    输出:

      结合上面讲解的分析一下,x指的是a中的元素,分别是(1,2)、(3,4)等等,而对于(1,2)来说,是一个元组类型,我们可以通过下标访问,其实也就是x[0]、x[1]访问元组内部的单一元素。从这个角度来看,x的操作对象并没有任何问题。再来看一下产生的效果,仍是个有序对,只不过互换位置了,也没有问题。

    3、错误分析

      下面还是之前的一个奇偶组成有序对的案例,因为今天刚进行了map操作,也就是上面的有序对互换位置,导致我有些混乱,然后产生了下面的错误。不过通过下面的错误,确实让我理解了许多。

    p1=[1,2,3,4,5,6]
    
    #以下是正确的展示
    result=[(p1[i],p1[i+1])for i in range(0,2*n,2)]
    result=list(zip(p1[::2],p1[1::2]))
    
    #一下是错误的展示
    result=list(map(lambda x:(x[i],x[i+1]),p1)for i in range(0,2*n,2)) #1
    result=[map(lambda x:(x[i],x[i+1]),p1)for i in range(0,2*n,2)] #2
    result = [int(map(lambda x: (x[i], x[i+1]), p1)) for i in range(0, 2*n, 2)]#3
    
    result=[zip(p1[::2],p1[1::2])]#4 
    result=[zip(p1[i],p1[i+1])for i in range(0,2*n,2)]#5
    result=[list(zip(p1[i],p1[i+1]))for i in range(0,2*n,2)]#6
    
    #下面的注释是当时瞬时理解,可以看看,但其实上面也都说过了
    
    #果然,还是在实践中出现了问题
    #现在来看看map(func,a)
    #其中,a是一个可迭代对象,func中的参数,一定是a中可迭代对象的一个元素,然后对这个元素
    #进行func操作,之后会返回一个map类型,接下来对a中下一个元素进行func操作。最后
    #获得的是一个个map类型的元素,最后经过可视化(列表等)就可以看到被func操作之后的新的列表
    

    序号1错误分析
      首先,我们说的列表推导式,这并不满足使用情况(我不确定是否能在list()中使用列表推导式)。其次,内部map第一个参数为p1中元素操作,我们希望返回的是有序对,可最后返回的是map对象,不符合期望,肯定会错,最后,这里的x指的是p1中的元素,却尝试x[i]操作,肯定不行。
    序号2错误分析
      跟上面类似,不再重复说明。
    序号3错误分析
      返回的应该是有序对,而不是int类型,但本质错误还是跟上面类似。
    序号4错误分析
      zip返回的是zip类型的有序对,这样还是不能可视化,需要上面的list()强制转化后才行。
    序号5错误分析
      zip参数是可迭代对象,这里传入的具体的数了,肯定不行。
    序号6错误分析
      错因跟上一个一样。
    总结
      所以通过map,想看看是否能进行x[i]这种行为,需要看这个可迭代对象是否满足条件

    作者:巷北夜未央

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python基础学习(5) map详解

    发表回复