python map

map()函数的作用
返回一个特殊的生成器(详情见yield),对数据(参数2:列表)进行处理(参数1:函数),返回每次处理的结果。
描述有些拗口,不易理解,继续往下一起看源代码。

map()函数原型
map(function, iterable, …)
参数1:是一个函数
参数2:是一个可迭代的对象,也就是常见的list或者可迭代的表达式。

到目前为之已经对什么是map()函数和执行所需参数有一定的了解,然后就开始编写简单的代码,验证到底map()如何使用。

例子1:将[‘adam’, ‘LISA’, ‘barT’]的不规则名称,转换为标准格式名称——首字母大写,其他字母小写。

ori_names = ['adam', 'LISA', 'barT']
def map_fn(s):
    print(map_fn.__str__() + s)
    return s[0].upper() + str(s).lower()[1:]

names = map(map_fn, ori_names)
# 输出map对象的地址
print(names)
# map具有迭代器的特点,访问时执行函数方法
for nm in names:
    print(nm)

代码执行结果:

<map object at 0x0000000003CE9CF8>
<function map_fn at 0x0000000003CEDAE8>adam
Adam
<function map_fn at 0x0000000003CEDAE8>LISA
Lisa
<function map_fn at 0x0000000003CEDAE8>barT
Bart

根据输出结果可见,执行names = map(map_fn, ori_names)语句时,map_fn()并没有被执行(并没有打印出函数执行信息),而是当执行for nm in names时才被调用,与生成器的特征相同,故可以将map()表达式理解为一个具有数据处理功能的特殊生成器

上面的书写方式过于繁琐,不符合python简洁的风格。使用lambda表达式替代函数map_fn,重新实现相同功能。

ori_names = ['adam', 'LISA', 'barT']
for nm in map(lambda name: name[0].upper() + name[1:].lower(), ori_names):
    print(nm)

大家都说python的功能非常丰富,会不会有一个函数已经实现了首字母大写的功能呢?事实确实这样,python中对于常见的使用方式,考虑的非常周全,str类确是提供一个名为capitalize()的方法。
最简版实现,使用str.capitalize()代替lambda表达式,代码如下:

for nm in map(str.capitalize, ori_names):
    print(nm)

例子2:实现列表中的数字与字符串相互转化

numbers = ['11', '22', '33', '55', '66', '77']
print(numbers)
# 输出int数字列表
nums = []
for num in map(int, numbers):
    nums.append(num)
print(nums)
# 输出str数字列表
snums = []
for snum in map(str, nums):
    snums.append(snum)
print(snums)

输出结果:

['11', '22', '33', '55', '66', '77']
[11, 22, 33, 55, 66, 77]
['11', '22', '33', '55', '66', '77']

一段代码中如果多次出现for,一层又一层的代码嵌套,看起来很不爽。使用lambda表达式代替函数定义,同时使用生成器表达式简化for语句,代码如下:

numbers = ['11', '22', '33', '55', '66', '77']
nums = [num for num in map(int, numbers)]
print(nums)
snums = [snum for snum in map(str, nums)]
print(snums)

连续两个包含缩进的for被替换掉,代码整体看起来清爽许多,输出的结果同上。

相关知识点:
lambda表达式、生成器、列表生成式

资源链接:
廖雪峰python教程:map/reduce

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值