在开始今天的主题之前,我们先来将讲一讲lambda表达式,lambda表达式的结果就是返回一个函数地址,lambda表达式只能用于较简单的函数,复杂的函数不能用于lambda表达式,给大家举个例子:
f = lambda x,y: x+y
print(f)
print(f(2,3))
这段代码的结果是:
<function <lambda> at 0x0000018C4A25C400>
5
接下来开始讲map函数的原理,map函数有两个参数(可以有多个参数,具体的内容在实际的过程中用不到),第一个参数是一个函数地址,第二个参数是一个可迭代对对象,比如求一个三位数的个位十位百位上的数字,就看可以很好的用map函数来求。
、
a = input("请输入一个三位数数字")
b,s,g = map(int,a)
print(b,s,g)
利用这种方法比利用c语言的那种方法简单多了!!
接下来我们看看map函数的底层到底是如何实现的:
s = map(lambda x: x+10,[1,2,3])
print(s)
a,b,c = map(lambda x: x+10,[1,2,3])
print(a,b,c)
结果是:
<map object at 0x00000168CAA99358>
111 12 13
map函数返回的结果是一个map对象!!!不是一个列表
然后我们利用最基本的函数如何实现map函数的功能呢?
def demo(x):
return x+10
def mymap(func,mylist):
res = []
for i in mylist:
res.append(func(i))
return res
print(mymap(demo,[1,2,3]))
虽然这样不会产生一个map对象,但是,这种方法能够让我们更好的理解map函数的运行机制!
接下来我们看一看filter函数的实现过程,和map函数一样,filter函数也会返回一个filter对象。
例如下面的代码:
s = filter(lambda x: x>0,[-1,2,3])
print(s)
print(list(s))
结果是:
<filter object at 0x000002C8F4894240>
[ 2, 3]
下面介绍一个filter的运行机制,其本质和map函数的运行机制差不多。
def demo(x):
return x>0
def myfilter(func,mylist):
res = []
for i in mylist:
if func(i):
res.append(i)
return res
print(myfilter(demo,[-1,2,3]))
接下来我们了解一下最后一个函数----reduce函数,它可以处理可迭代对象,是序列进行相加,相乘,相除操作。
但是,使用reduce函数时需要引用functool库。下面来看具体用法:
from functools import reduce
s = reduce(lambda x,y:x+y,[1,2,3])
print(s)
结果是:
6
这个例子告诉我们,filter函数返回的不是filter对象,而是filter函数中第二个参数的类型。
那么filter的实现原理又是什么呢?
def demo(x,y):
return x+y
def myfilter(func,a):
res = a.pop(0)
for i in a:
res = func(res,i)
return res
a = [1,2,3]
s = myfilter(demo,a)
print(s)
总结:map函数处理可迭代对象中的每一个元素,得到一个“列表”;filter函数则是处理可迭代对象中的每个元素,如果为真就保留下来,否则就删除,返回一个filter对象;reduce函数处理序列,把序列进行合并。大致的知识点就是这样,但是,在实际运用的过程中,大家还是得根据实际情况来运用这3个函数。对于以上有错误的地方,大家批评指正!