基础篇_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类型,只要是可迭代对象就行。

posted @ 2020-02-22 16:42  BNTU  阅读(142)  评论(0)    收藏  举报