Python基础学习(5) map详解
Python基础学习之map详解
简述
本来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]这种行为,需要看这个可迭代对象是否满足条件
作者:巷北夜未央