一文读懂python中的map、filter、reduce函数

在开始今天的主题之前,我们先来将讲一讲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个函数。对于以上有错误的地方,大家批评指正!

猜你喜欢

转载自blog.csdn.net/yanzhiguo98/article/details/84437540
今日推荐