map内置函数分析所得到的思路
map:会根据提供的函数对指定序列做映射。
map(func, *iterables) --> map object Make an iterator that computes the function using arguments from each of the iterables. Stops when the shortest iterable is exhausted. """
根据提示,map有一个函数名参数还有个动态参数,意思是将可迭代的对象打散然后把每一个元素传入函数名作为参数运行让后将函数返回值作为新的值映射传入的参数。
现在有一个列表
l1 = [1,2,3,4,5,6],现在需要生成[1, 4, 9, 16, 25, 36]这样的列表,也就是每个元素平方:
首先l1肯定是个可迭代的对象所有我们可以先构思成这样:map(函数名,l1) l1会将每个元素传入函数作为参数。所以我们这样定义这个函数:
def func(x): return x**2
#这样l1每遍历一个元素函数func都会返回这个元素的平方
#所以就写成了这样:
g = map(func,l1)
print(list(g)) #[1, 4, 9, 16, 25, 36]
接下来我们分析下map原理
在没接触map前,你会写出下面代码:
def func(x): l1 = [] for i in x: i = i**2 l1.append(i) return l1
#我们定义了以上函数,当你输入一个列表时会返回一个新列表每个元素是之前的平方
g=func([1,2,3,4,5)
print(g)#[1,4,8,16,25]
这样确实实现了功能,但是如果我现在改变条件说新列表是原来每个元素的3次方,你又改成了这样:
def func(x): l1 = [] for i in x: i = i**3 l1.append(i) return l1
大家发现了没,其实我改的要求就是 i = i**3这行代码,其实我们可以把这变的条件作为函数,写成i = foo(i),而fun1这个函数为我定义函数的参数传进去,这样我就只需改参数就能实现多个功能:
def func(foo,x):
l1 = []
for i in x:
i = foo(i)
l1.append(i)
return l1
def foo(x):return x**2
print(func(foo,[1,2,3,4]))
大家会说你不是还是要定义另一个函数传进去,这时匿名函数出来了
def func(foo,x): l1 = [] for i in x: i = foo(i) l1.append(i) return l1 print(func(lambda x:x**2,[1,2,3,4])) print(func(lambda x:x**3,[1,2,3,4]))
#这样是不是无论你要我对元列表加减乘除平方或者替换我都只需要改变我传入的函数名参数就行了