基础篇_010_函数_map()映射函数
----引导 ===》
1. 现在这里有一个需求: "给你一个列表,要求生成的新列表的元素分别是旧列表元素的平方。eg: num_list = [1, 2, 3, 4, 5],输出的新列表为: num_list_new = [1, 4, 9, 16, 25]"。解决方法如下 ===》
# 1. 写出逻辑代码
num_list = [1, 2, 3, 4, 5]
num_list_new = []
for item in num_list:
num_list_new.append(item ** 2)
print(num_list_new) # 输出:[1, 4, 9, 16, 25]
2. 这个要求写完了,但是现在又有了新的需求: "现在不能只生产一个了,我们要一万个"。定义一个函数,做到代码的复用 ===》
# 2. 将逻辑代码封装在函数内
num_list = [1, 2, 3, 4, 5]
def my_map(your_list):
num_list_new = []
for item in your_list:
num_list_new.append(item ** 2)
return num_list_new
print(my_map(num_list)) # 输出:[1, 4, 9, 16, 25]
3. 现在要求又双叒叕变了: "我们不仅要生产一万个,还要不同的。eg: 所有元素不仅自加一,还能实现其他的,比如自减一,平方...",这个时候首先想到: "要不写个if...elif...else语句?但是很麻烦啊,要写很多分支,而且也不一定能写全,到时候还要跟着需求改",那有没有什么方法可以解决这个麻烦的问题呢?实在是不想写这么多elif分支啊啊啊啊!
当然有,大家回忆一下"基础篇_010_函数_函数式编程"中讲到的高阶函数(本质上就是"基础篇_010_函数_前向引用"中的"函数即变量"的思想),现在有没有一点想法啊【嘿嘿嘿】?都有想法了吭,没错,就是传入函数名,然后在需求函数中调用传入的函数 ===》
# 3. 依据"高阶函数"的思想,传入函数参数
num_list = [1, 2, 3, 4, 5]
def my_map(func, your_list):
num_list_new = []
for item in your_list:
num_list_new.append(func(item))
return num_list_new
def my_add_one(i):
return i + 1
def my_minus_one(i):
return i - 1
def my_square(i):
return i ** 2
print(my_map(my_add_one, num_list)) # 输出:[2, 3, 4, 5, 6]
print(my_map(my_minus_one, num_list)) # 输出:[0, 1, 2, 3, 4]
print(my_map(my_square, num_list)) # 输出:[1, 4, 9, 16, 25]
这样,这个解决方案就被我们写活了,可以处理很多操作,前提是要实现定义这些操作的函数。当然了,这里我们也可以传入"匿名函数",使得这个解决方案更加灵活,eg:print(my_map(lambda x:x + 1, num_list))(关于匿名函数的用法参照文章"基础篇_010_函数_匿名函数")。
----map(func, iterable)函数 ===》
我猜大家都知道了map()函数怎么用了,毕竟上面用的例子都是my_map()。没错,实际上我们在不知不觉中就已经大致上完成了一个很牛批的函数。我们来试验一下这个map()函数 ===》
num_list = [1, 2, 3, 4, 5]
def my_map(func, your_list):
num_list_new = []
for item in your_list:
num_list_new.append(func(item))
return num_list_new
print(my_map(lambda x:x + 1, num_list)) # 输出:[2, 3, 4, 5, 6]
print(map(lambda x:x + 1, num_list)) # 输出:<map object at 0x0000025D645500B8>
你肯定会问了: "卧槽,这map()的返回值是个啥玩意儿啊"。这个map的返回值本质上是一个可迭代的数据类型——迭代器。这个可迭代在之前list...中提到过,补充的话之后再说吧,我也才学到这儿。所以呢,我们可以试着进行这样一番操作 ===》 print(list(map(lambda x:x + 1, num_list))) # 输出:[2, 3, 4, 5, 6]
当然啦,在map()函数中的第二个参数并不要求一定是list类型,只要是可迭代对象就行。

浙公网安备 33010602011771号