【python】详解map函数的用法之函数并行作用解析

Python函数编程中的map(func, seq1[, seq2,…]) 函数是将func作用于seq中的每一个元素其中seq须是可迭代对象,并将所有的调用的结果作为一个list返回。如果func为None,作用同zip()

本文参考自:Python中map()函数浅析一文,感谢精彩分享。

下面举得例子来帮助我们更好的理解这个工作过程:

1、对可迭代函数’iterable’中的每一个元素应用‘function’方法,将结果作为list返回。

#首先我们定义一个平方函数
In [1]: def powerful(x):
   ...:     return x**2
#待map的数组
In [2]: ls = [1,2,3,4]
#使用map函数使得powerful函数作用于数组的每一个数字,返回一个map对象
In [3]: map(powerful,ls)
Out[3]: <map at 0x19044366e48>
#将map对象列表显示出来
In [4]: list(map(powerful,ls))
Out[4]: [1, 4, 9, 16]

2、如果给出了额外的可迭代参数,则对每个可迭代参数中的元素‘并行’的应用‘function’。(翻译的不好,这里的关键是‘并行’)

#生成一个3维度的函数
In [7]: def powers(x,y,z):
   ...:     return x**2+y**2+z**2
   ...:
#定义数组,数组个数与函数中的参数数量要一一对应
In [8]: listone = [1,2,3]
In [9]: listtwo = [1,1,1]
In [10]: listthree = [2,2,2]
#map使得函数Powers作用于每一个列表的每一个元素,位置要对应
In [11]: list(map(powers,listone,listtwo,listthree))
Out[11]: [6, 9, 14]

3、在python2中,如果’function’给出的是‘None’,自动假定一个‘identity’函数,此时等同于zip函数【将对象中对应的元素打包成一个个tuple(元组),然后返回由这些tuples组成的list(列表)。若传入参数的长度不等,则返回list的长度和参数中长度最短的对象相同。利用*号操作符,可以将list unzip(解压)。】
注:python3中已经没有这个用法。

In [1]:list1 = [11,22,33]
In [2]:map(None,list1)
Out[2]:[11, 22, 33]
In [3]:list1 = [11,22,33]
In [4]:list2 = [44,55,66]
In [5]:list3 = [77,88,99]
In [6]:map(None,list1,list2,list3)
Out[6][(11, 44, 77), (22, 55, 88), (33, 66, 99)]

4、不等同于使用列表解析,列表解析的原理是(嵌套for循环)做了笛卡尔乘积

#使用列表解析并不会得到我们想要的结果
In [28]: [powers(x,y,z) for x in listone for y in listtwo for z in listthree]
Out[28]:
[6, 6, 6, 6, 6, 6, 6, 6, 6, 9, 9, 9, 9, 9, 9, 9, 9, 9, 14, 14, 14, 14, 14, 14, 14, 14, 14]

#上述列表解析等同于:
In [30]: result = []
In [31]: for x in listone:
    ...:     for y in listtwo:
    ...:         for z in listthree:
    ...:             result.append(powers(x,y,z))

5、使用map()函数可以实现将其他类型的数转换成list,但是这种转换也是有类型限制的;

#将元组转为list
In [34]: list(map(int, (1,2,3)))
Out[34]: [1, 2, 3]
#将数字的字符串转化为int整数
In [35]: list(map(int, '1234'))
Out[35]: [1, 2, 3, 4]
#提取字典的key,并将结果存放在一个list中
In [36]: list(map(int, {1:2,2:3,3:4}))
Out[36]: [1, 2, 3]
#如果key不是数字,则转换失败
In [37]: list(map(int, {1:2,2:3,'a':4}))
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-37-1fb5f6e4653c> in <module>()
----> 1 list(map(int, {1:2,2:3,'a':4}))

ValueError: invalid literal for int() with base 10: 'a'
#即使是字符串‘1’,也可以转换
In [38]: list(map(int, {1:2,2:3,'1':4}))
Out[38]: [1, 2, 1]

#字符串转换成元组,并将结果以列表的形式返回
In [39]: list(map(tuple, 'agdf'))
Out[39]: [('a',), ('g',), ('d',), ('f',)]

因此,对给定可迭代对象进行转换数据类型时,需要将数据的类型与转换函数相对应

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值