2.5.1 通过map方法实现序列的映射

如果我们要让某个函数作用到序列上,就可以用map方法来实现。Mapmap方法能起到映射的作用,语法如下:


     map(function, iterable,…)

其中,function表示映射函数,iterable表示待映射的序列。序列的个数可以是一个,也可以是多个。在调用map方法时,会对iterable序列中的每个元素执行function方法,并返回结果。

Python 3的map用法和Python 2的不同,在如下的MapDemo.py代码里将演示基于Python 3的map用法。


01 # coding=utf-8
02 def increase(x):     # 加1操作
03     return x+1
04 newList = map(increase, [1,3,5])
05 print(newList) # 错误的用法
06 # 结果要做转换
07 print(list(newList)) # [2, 4, 6]
08 def tagStudent(score):
09     if score>90:
10         return "Good"
11     else:
12         return "Normal"
13 print(map(tagStudent,[100,80])) # 错误的用法
14 # ['Good', 'Normal']
15 print(list(map(tagStudent,[100,80])))
16 # 演示多个序列的lambda表达式
17 sum=map(lambda a,b: a+b, [1,2,3], [2,4,6])
18 print(list(sum))# [3, 6, 9]

在第2行和第3行里,我们定义了实现加1操作的increase操作。在第4行的map方法里,第1个参数是increase方法,第2个参数是一个序列,该map方法会把针对序列加1操作的结果返回给newList变量。

在第5行里,我们给出了错误的用法,事实上我们需要把返回对象newList通过像第7行那样的方法转换成list对象后才能使用。这里转换成list是因为第4行里待map(映射)的序列是list类型的,如果是set等类型,那么在使用时也要像第7行那样先转换成对应的类型。

在第8行到第12行里,我们定义了一个根据分数分类学生的tagStudent方法。在第13行的map方法里,第1个参数是tagStudent方法,第2个是序列,同时演示了错误的用法。在第15行的用法中,我们同样能看到用list转换的动作。

在map方法里,第1个参数可以是方法名,也可以是lambda表达式。比如在第17行里,第1个参数是lambda表达式,作用是返回两个数的和。该map方法能处理2个序列,从第18行的输出结果中能看到映射结果。

总之,从上述代码里,我们能体会到map函数针对序列的“映射”作用。