今天在用到map函数的时候产生了一些问题,发现自己对于map函数的理解还是不够深刻,于是又查阅了相关的资料来学习和了解其功能,学习后写出自己的理解和看法,最主要的是它的返回值类型。
map是python中一个内置的函数,map函数的使用格式一般为: map(函数名, 序列名)
可以将一个或多个指定的序列根据选定的函数做映射。
值得注意的是在python3中,map() 所返回的不再是一个list, 而是一个可迭代的map对象。类似于<map object at 0x034B3E90>
这样的。如果想转化为list类型,就用list(map())转化一下就可以了
下面通过看几个实例来便于我们了解map()函数:
1.将列表中的元素从 int类型 转化为 str 类型
这里给出一个list: list_1 = [1, 2, 3]
我们可以通过type(list_1[0])
查看的元素类型。
这里list_1[0]的类型是int类型,下面可以通过map函数来将其元素类型转化为 str 类型。
>>> new_list = map(str, list_1)
>>> new_list
<map object at 0x036F28F0>
>>> type(new_list)
<class 'map'>
我们可以看到new_list
返回的是一个可迭代类型行的map对象。
而对于这个map对象我们可以使用list()方法来进行类型转化。
>>> list(new_list)
['1', '2', '3']
此时我们可以清楚的看到列表list_1中的元素已经从 int 转化为 str 了。
完整代码:
list_1 = ['1', '2', '3']
new_list = list(map(str, list_1))
print(new_list)
在这里我们搞清楚了:map函数返回的值并不是list类型,如果我们需要使用list类型,就必须再调用list()方法来将他进行类型转化----list(map(function, iterable))。
ps: 其实如果仅仅想实现list中元素类型的转化用 列表解析 会更简单,这里是为了研究map函数才选择map去完成这个任务的
列表解析的做法:
list_1 = [1, 2, 3, 4]
new_list = [str(i) for i in list_1]
print(new_list)
其结果和上面使用map方法是一样的。
2.x = map(int, ‘3’) 和 x,y = map(int, input().split())
我们先直观的看一下二者的结果区别:
>>> x = map(int, '3')
>>> x
<map object at 0x036F2E30>
>>> x,y = map(int, input().split())
1 2
>>> x
1
>>> y
2
开始我在这就有一个疑问就是为什么一个x是map对象,而另一个x就是一个int实数了呢?
我对于这个现象的l理解就是map()函数返回值的类型没有变,都是可迭代的map对象。只不过刚开始我过于重视map对象这个字眼,而忽视了可迭代这个关键字。
我将上面的例子改一下可能就好理解许多。
>>> x = ['3']
>>> x
['3']
>>> x,y = ['1', '2']
>>> x
'1'
>>> y
'2'
我们可以将map对象变为list对象,都是可迭代类型,这么一来,这两个实例的结果为什么不同就不言而喻了。第一个x相当于接受了整个对象,而x,y则只是接受了对象里面的元素。
>>> map(int, input().split())
1 2
<map object at 0x036F2F90>
我们可以看到map(int, input().split())
返回的其实和x = map(int, '3')
的相同,仅仅就是因为他是可迭代的,所以在赋值的时候产生了差异。
对此我写下了我的理解:
①map 返回的是一个可迭代类型的值,但绝对不是list。
②x,y = map(int, input().split()) 将可迭代类型的值分开保存了,所以x, y 各有各的值(1和2)。
③x = map(int, ‘3’),map返回的仍然是一个可迭代对象,但是此对象只有一个元素,因此当赋值给x的时候并不是将其中的一个元素赋给了x,而是将整个对象赋给了x。就相当于 x,y = [1, 2] 和 x = [1] 一样,前面的x的值仅仅只是int类型的1,而后面的x则是列表类型的[1]。
其实以上的实例都很无聊,没有什么意义也没有什么含金量,但是通过对这两个实例的研究使我更加深刻地理解了map函数的作用和细节,收获还是很大的。
反思:
能出现这样的问题说明自己的基础知识还是不够牢固,还是有很多疑问当初学习的时候没有搞清楚,导致后面的学习会陷入很多不必要的坑点。这个暑假一定要将python基础在扎扎实实的学习一遍。
总结:
map()函数的返回值是一个 可迭代类型的map对象,通常用list()方法进行类型转换后使用。