3.python中map,filter,reduce以及内部实现原理剖析

简介:

一.map函数,对任何可迭代序列中的每一个元素应用对应的函数。(不管处理的是什么类型的序列,最后返回的都是列表。)

作用已经在标题中介绍过了,那么先来说说map函数的用法吧。

map(处理逻辑可以是函数也可以是lambda表达式,可迭代的序列)

现在有一个列表。

l1 = [1,2,3,4,5]

现在需要给这个列表里的每一个元素都+1。(当然,使用for循环可以做到对序列中的每个元素进行处理,但使用map函数会更加方便。)

首先,定义一个逻辑函数,要如何对序列中的每一个元素进行处理。

def plus(x):

    return x + 1

#每个元素都+1

print map(plus,l1)

#将map函数应用到l1的每一个元素中。

输出的结果为。

>>>[2, 3, 4, 5, 6]


当然,传入map函数中的逻辑函数还可以使用lambda表达式来表示,还拿刚才的例子演示。

l1 = [1,2,3,4,5]

print map(lambda x:x+1,l1)

>>>[2, 3, 4, 5, 6]


那么map函数是怎么做到的?内部功能是如何实现的?下面就来对map函数的内部进行剖析。

下面这个函数就可以实现和python内置的map函数一模一样的功能。

def map_func(func,seq):

    map_list = []

    for i in seq:

        map_list.append(func(i))

    return map_list


注意!上面说的map函数的使用方法是针对python2.7版本的,针对python3以上的版本不适用,因为从python3开始,map函数不再返回列表,返回的则是一个迭代器,如果想变成列表的话,还需要使用list() 函数做一个转换。



二.filter函数,对序列中的元素进行判断筛选。(返回的结果依旧是个列表。)

fileter函数在拿到一个序列的时候,会开始循环迭代这个序列中的每一个元素,对每一个元素都进行一次if判断,结果为True的加入到列表中,为False的,直接丢掉。

下面是filter函数的简单用法。

一个列表,将这个列表中小于5的元素,全部都列出来。(当然...这么简单的需求也可以使用for循环实现)

filter函数用法和map函数一样都是 filter(函数,可迭代序列)

l1 = [1,2,3,4,5,6,7,8,9,10]


def greater_than(x):

    if x < 5:

        return True

    else:

        return False


print filter(greater_than,l1)

>>>[1, 2, 3, 4]


filter函数依旧可以使用lambda表达式来代替逻辑函数。

print filter(lambda x:x<5,l1)


下面来剖析一下filter函数的工作原理,自己手动写一个和filter功能一模一样的函数:

def filter_func(func,seq):

    filter_list = []

    for s in seq:

        if func(s):

            filter_list.append(s)

    return filter_list


注意啦!这里面的filter函数和map函数一样,用法都是针对python2.7的,在python3中对这个函数做了一些改动,返回的不再是个列表,而是个迭代器。


三.reduce函数,将序列中所有的元素进行合并运算。

现在有个列表,现在需要每个元素要逐个相乘。


l1 = [1,2,3,4,5,6,7,8,9,10]

#reduce函数规定了,一定要传递一个支持一个二元操作的函数

#下面就是定义好的逻辑函数

def bin_func(x,y):

    return x * y


print reduce(plus,l1)

>>> 3628800

下图是reduce函数的工作原理:

wKioL1jNAN2A82opAAC63NnUCNs013.png


接下来,解剖下reduce函数的实现代码。

def reduce_func(func,seq,init_num=None):

    if init_num != None:

        ret = init_num

    else:

        ret = seq.pop(0)

    for i in seq:

        ret=func(ret,i)    #如果这条逻辑不好理解的话,可以仔细想想1*2*3*4 = ((1*2)*3)*4 

    return ret


print reduce_func(bin_func,l1)


>>>3628800


reduce函数使用lambda表达式。

print reduce_func(lambda x,y:x*y,l1)


注意!在python3当中,这个reduce函数被放到了functools这个模块中了,需要倒入functools才可以使用这个函数。


最后总结一下:

map函数用于处理序列中每一个元素。

filter函数用于过滤序列中每一个元素。

reduce函数用于做序列的合并操作。

reduce即为化简,它是这样一个过程:每次迭代,将上一次的迭代结果(第一次时为init的元素,如没有init则为seq的第一个元素)与下一个元素一同执行一个二元的func函数。在reduce函数中,init是可选的,如果使用,则作为第一次迭代的第一个元素使用。






      本文转自苏浩智 51CTO博客,原文链接:http://blog.51cto.com/suhaozhi/1907951,如需转载请自行联系原作者





相关文章
|
1月前
|
缓存 算法 测试技术
Python中的装饰器:原理与实践
【2月更文挑战第29天】 在Python编程领域,装饰器是一种强大的工具,它允许我们在不修改原始函数代码的情况下,增加或修改函数的行为。本文将深入探讨Python装饰器的概念、实现原理以及实际应用,帮助读者掌握这一技术并在实际项目中灵活运用。
|
1月前
|
数据采集 NoSQL Redis
Python爬虫-代理池原理和搭建
代理池架构,代理池的实现
42 0
|
1月前
|
Python
请解释 Python 中的生成器的工作原理。
【2月更文挑战第20天】【2月更文挑战第58篇】请解释 Python 中的生成器的工作原理。
|
13天前
|
机器学习/深度学习 人工智能 算法
|
19天前
|
Python
python中的filter
【4月更文挑战第4天】`Python`的`filter()`函数用于从序列中过滤出符合条件的元素,返回迭代器。它接受一个判断函数和一个可迭代对象作为参数,对可迭代对象的每个元素应用函数,返回值为`True`的元素会被保留。若需得到列表,需用`list()`转换。例如,下面的代码定义了一个检测偶数的函数`is_even()`,并用它过滤出一个数字列表中的偶数,最终打印出这些偶数。
18 0
python中的filter
|
27天前
|
Python
Python内置函数map、split、join讲解
Python内置函数map、split、join讲解
31 0
|
1月前
|
算法 Python
深入理解Python虚拟机:super超级魔法的背后原理
深入理解Python虚拟机:super超级魔法的背后原理
|
1月前
|
Python
Python中的装饰器:原理与应用
【2月更文挑战第27天】 装饰器在Python中是一种强大而灵活的工具,它允许我们在不修改原始函数代码的情况下,增加函数的功能。本文将深入探讨装饰器的原理,并通过实例展示如何在Python中使用装饰器。
9 2
|
1月前
|
缓存 Python
Python中的装饰器:原理与应用
【2月更文挑战第26天】 装饰器在Python中是一种强大且灵活的工具,它允许我们在不修改函数代码的情况下增强函数的功能。本文将深入探讨装饰器的原理,并通过实例展示如何在实际项目中应用装饰器。
12 4
|
1月前
|
Python
python 判断 map中是否存在key为a的值
在Python中,你可以使用`in`关键字来判断一个key是否存在于map(字典)中。例如: ```python my_map = {'a': 1, 'b': 2, 'c': 3} if 'a' in my_map: print('Key "a" exists in the map') else: print('Key "a" does not exist in the map') ``` 这段代码会输出"Key 'a' exists in the map",因为字典`my_map`中存在key为'a'的值。

热门文章

最新文章