Python 函数编编程的三大法宝map+filter+reduce分享

目录
  • 一、map
    • map 传入内置 Python 函数
    • map 高级用法
  • 二、map 与列表推导式
  • 三、选择可迭代对象中的元素:filter
  • 四、合并可迭代对象中的元素: reduce
  • 五、总结

众所周知,Python 支持多种编程范式:过程式(使用基础的语句)、面向对象编程和函数式编程。

Python 也提供了其他函数式编程语言的工具:

  • 利用 map 在一个可迭代对象的各项上调用函数的工具
  • 利用 filter 来过滤项
  • 利用 reduce 把函数作用在成对的项上来运行结果的工具

一、map

在没有循环的情况下处理可迭代对象:map

有时我们需要对列表、集合、字典等可迭代序列做的一个操作就是:对其中每一个元素值进行某种操作,把其结果收集起来。

比如选出数据库中的某一列进行加减操作,或者针对某些特殊的值做平方的处理。

我们先来看一个例子:

>>> test = [1, 2, 3, 4, 5, 6]
>>> square = []
>>> for x in test:
    square.append(x*x)

    
>>> square
[1, 4, 9, 16, 25, 36]
>>>

此时就可以利用 Pythonmap,允许您在不使用循环的显式中处理和转换所有项目,该技术通常称为映射。当您需要将转换函数应用于可迭代并将其转换为新的迭代时,map 就能够有其用武之地。

>>> test = [1, 2, 3, 4, 5, 6]
>>> 
>>> def square(num):
    return num*num

>>> list(map(square, test))
[1, 4, 9, 16, 25, 36]
>>>

如上,我们会传入一个自定义的函数 ​​square()​​  来更加一般化地使用它,也就是对列表中的每一个元素都应用这个函数。

map 对列表中的每一个元素都调用了 square 函数,并将返回值收集到一个新的列表中。

正因为我们需要自定义一个 square 函数,结合上一篇文章 ​ ​lambda 函数​​的简单介绍中。我们可以利用 lambda 直接生成这个匿名函数,也就是可以写出这样的代码实现相同的功能:

>>> list(map((lambda x: x*x), test))
[1, 4, 9, 16, 25, 36]
>>>

map 传入内置 Python 函数

除了自定义函数,还可以 map 中传入内置的 Python 函数。例如,如果您有一个字符串列表,您可以轻松地创建一个计算该字符串列表长度的新列表:

>>> name = ["Sam", "Dwen", "Kyrie"]
>>> list(map(len, name))
[3, 4, 5]
>>>

map 高级用法

map 不单能实现 for 循环能实现的同样的方式,还有性能优势。map 的高级用法比如:在一个可序列类型中,map 会按照顺序,并行地从各个序列中逐项取出一组又一组参数,然后传入函数中:

>>> pow(2, 8)
256
>>> pow(3,8)
6561
>>> list(map(pow, [1,2,3], [8, 8, 8]))
[1, 256, 6561]
>>>

能看到上述代码的结果,map 对传入的每个序列并行各自取一个值。

二、map 与列表推导式

map 调用其实与列表推导式相似。

>>> test = [1, 2, 3, 4, 5, 6]
>>> [x*x for x in test]
[1, 4, 9, 16, 25, 36]
>>> list(map((lambda x: x*x), test))
[1, 4, 9, 16, 25, 36]

但是 map 在一般情况下会比列表推导式运行更快,而且编写的代码也会更少。而且有一点很重要:通过使用圆括号而不是方括号来包围一个推导,能创建一个按需产生值的对象,减少了内存又减少了程序的响应时间。

三、选择可迭代对象中的元素:filter

map 函数是将 Python 函数式编程工具集中一个主要也相对明确的代表。而 filter 和 reduce 分别实现了基于一个测试函数选择可迭代对象的元素,以及向”元素对“ 应用函数的功能。

下面来看一个调用 filter 挑出一个序列中大于零的元素:

>>> list(range(-10, 10))
[-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(filter((lambda x : x > 0), range(-10, 10)))
[1, 2, 3, 4, 5, 6, 7, 8, 9]

filter 对于序列或可迭代对象中的元素,如果函数对该元素返回了 True 值,这个元素就会被加入到结果列表中。

与 map 一样,filter 也能用一个 for 循环来等效,但是 filter 是内置的、简明的,通常也运行得更快:

>>> result = []
>>> for x in range(-10, 10):
    if x > 0:
        result.append(x)

        
>>> resullt
[1, 2, 3, 4, 5, 6, 7, 8, 9]

同样的功能,我们也能用列表推导式来实现:

>>> [x for x in range(-10,10) if x > 0]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

四、合并可迭代对象中的元素: reduce

Python的 reduce()是一种函数,它在 Python 标准库中居住在一个名为 ​​functools​​  的模块中:

from functools import reduce

通过 reduce 来计算一个列表中所有元素加起来的和:

>>> reduce((lambda x, y: x + y),[1,2,3,4,5])
15

reduce 会将当前的和列表中的下一个元素传入列出的 lambda 函数,在默认条件下,序列中的第一个元素初始化了起始值。

使用 reduce 的这种用法也与如下使用 for 循环实现了同样的功能:

>>> test = [1, 2, 3, 4, 5]
>>> result = test[0]
>>> for x in test[1:]:
    result  = result + x
    
>>> result
15

五、总结

  • map 包括将转换函数应用于可迭代对象以生成新的可迭代对象。新迭代中的项是通过对原始迭代中的每个项调用转换函数来生成的。
  • filter 包括将谓词或布尔值函数应用于迭代以生成新的可迭代。通过筛选原始可迭代中的任何项目,以使谓词函数返回 false 的任何项目生成的项目。
  • reduce 包括将 reduce 函数应用于迭代以产生单个累积值。

到此这篇关于Python 函数编编程的三大法宝map+filter+reduce分享的文章就介绍到这了,更多相关Python 法宝map+filter+reduce内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python中几个常用函数的正确用法-lambda/filter/map/reduce

    目录 1 lambda 2 filter 3 map 4 reduce 5 联合使用 lambda/filter/map/reduce这几个函数面试中很肯定会用到,本篇主要介绍这几个函数的用法. 1 lambda 匿名函数,用法如下: # lambada 参数,参数,参数 : 返回的表达式 示例1: f = lambda x, y: x * y print(f(2, 3)) # 6 示例2: r = (lambda x, y: x+y)(1, 2) print(r) # 3 2 filter f

  • Python lambda表达式filter、map、reduce函数用法解析

    前言 lambda是表达式,用于创建匿名函数,可以和filter.map.reduce配合使用. 本文环境Python3.7. 一.lambda表达式 lambda 只包含一个语句,用于创建匿名函数. 语法: lambda [arg1 [,arg2,.....argn]]:expression arg1 -- 参数,可以有多个 expression -- 表达式 使用例子: f1 = lambda x : x > 10 print(f1(1)) #输出:False print(f1(11)) #

  • python中三种高阶函数(map,reduce,filter)详解

    map(function,seq[,seq2]) 接收至少两个参数,基本作用为将传入的函数依次作用到序列的每个元素,并且把结果作为新的序列 返回一个可迭代的map对象 function:函数对象 py2中可为None,作用等同于zip() 如: py3中不可为None,None是不可调用.不可迭代对象 seq:可迭代对象,可以传一个或多个 # 传一个: def func(i):return i*2 print([i for i in map(func,[1,'2'])]) # [2,'22']

  • Python函数的返回值、匿名函数lambda、filter函数、map函数、reduce函数用法实例分析

    本文实例讲述了Python函数的返回值.匿名函数lambda.filter函数.map函数.reduce函数用法.分享给大家供大家参考,具体如下: 函数的返回值: 函数一旦执行到   return,函数就会结束,并会返回return 后面的值,如果不使用显式使用return返回,会默认返回None . return None可以简写为   return. def my_add(x,y): z=x+y return z print(my_add(1,2))##打印的是返回值 def my_add_

  • 简单了解python filter、map、reduce的区别

    这篇文章主要介绍了简单了解python filter.map.reduce的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python中有一些非常有趣的函数,面试的时候可能会遇到.今天也来总结一下,不过该类的网上资料也相当多,也没多少干货,只是习惯性将一些容易遗忘的功能进行整理. lambda 为关键字.filter,map,reduce为内置函数. lambda:实现python中单行最小函数. g = lambda x: x * 2

  • python 内置函数-range()+zip()+sorted()+map()+reduce()+filter()

    目录 range函数 zip() 函数 其它内置函数 数据类型转换相关内置函数 变量相关函数 数学相关函数 进制相关函数 高阶函数 sorted(iterable,[reverse,key]) map(func, *iterables) reduce(func,iterable) filter(func,iterable) range函数 能够生成一个指定的数字序列 使用案例: ''' range(start,stop,step) 参数: start : 开始的值 ,默认值为0 stop : 结

  • Python 函数编编程的三大法宝map+filter+reduce分享

    目录 一.map map 传入内置 Python 函数 map 高级用法 二.map 与列表推导式 三.选择可迭代对象中的元素:filter 四.合并可迭代对象中的元素: reduce 五.总结 众所周知,Python 支持多种编程范式:过程式(使用基础的语句).面向对象编程和函数式编程. Python 也提供了其他函数式编程语言的工具: 利用 map 在一个可迭代对象的各项上调用函数的工具 利用 filter 来过滤项 利用 reduce 把函数作用在成对的项上来运行结果的工具 一.map 在

  • 详解Python中高阶函数(map,filter,reduce,sorted)的使用

    目录 什么是高阶函数 自定义一个高阶函数 常用的内置高阶函数 map函数 参数说明 功能 实例 filter函数 功能 实例 reduce函数 功能 实例 sorted函数 参数说明 功能 实例 sort和sorted 总结 什么是高阶函数 高阶函数就是能够把函数当成参数传递的函数就是高阶函数,换句话说如果一个函数的参数是函数,那么这个函数就是一个高阶函数. 高阶函数可以是你使用def关键字自定义的函数,也有Python系统自带的内置高阶函数. 自定义一个高阶函数 我们下面的例子中,函数 sen

  • 一文详解Python中的Map,Filter和Reduce函数

    目录 1. 引言 2. 高阶函数 3. Lambda表达式 4. Map函数 5. Filter函数 6. Reduce函数 7. 总结 1. 引言 本文重点介绍Python中的三个特殊函数Map,Filter和Reduce,以及如何使用它们进行代码编程.在开始介绍之前,我们先来理解两个简单的概念高阶函数和Lambda函数. 2. 高阶函数 把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式. 举例如下: def higher(your_function, som

  • Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】

    本文实例讲述了Python 网络编程之TCP客户端/服务端功能.分享给大家供大家参考,具体如下: demo.py(TCP客户端): import socket def main(): # 1. 创建tcp的套接字 tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2. 链接服务器 # tcp_socket.connect(("192.168.33.11", 7890)) server_ip = input(

  • Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】

    本文实例讲述了Python 网络编程之UDP发送接收数据功能.分享给大家供大家参考,具体如下: demo.py(UDP发送数据): import socket # 导入socket模块 def main(): # 创建一个udp套接字 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 绑定本机ip和端口号 (发送数据时,如果不绑定,系统会随机分配端口号.接收数据时,一般需要手动绑定ip和端口) udp_socket.b

  • 这三个好用的python函数你不能不知道!

    一.前言 我想介绍这些功能的主要原因是它们可以帮助您避免编写循环.在某些情况下,循环运行可能会很昂贵,除此之外,这些功能将有助于提高速度. 以下是本文将涵盖的功能: map() filter() reduce() 即使你之前已经掌握了这些功能,用更多的理论和例子来强化你的知识也没有害处. 所以不用多说,让我们开始吧! 二.map() map()函数接受另一个函数作为形参,以及某种数组.其思想是将一个函数(作为参数传入的函数)应用到数组中的每一项. 这很有用,有两个原因: 1.你不必写循环 2.它

  • python 函数的缺省参数使用注意事项分析

    本文实例讲述了python 函数的缺省参数使用注意事项.分享给大家供大家参考,具体如下: python的函数支持4种形式的参数:分别是必选参数. 缺省参数. 可变长参数.关键字参数:而且参数的书写顺序也是又一定规定的,顺序如下 def fun(param, default_params, arbitrary_params, keyword_param) 下面针对缺省型参数分析一些注意事项 先定义这样子一个函数 def test_fun(a=[]): a.append('a') print a i

  • Python map和reduce函数用法示例

    先看map.map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回. 举例说明,比如我们有一个函数a(x)=x*2,要把这个函数作用在一个list [1, 2, 3, 4, 5]上,就可以用map()实现如下: 复制代码 代码如下: >>> def a(x): ...     return x * 2 ... >>> map(a, [1,2,3,4,5]) [2, 4, 6, 8, 10] map传入

  • python函数map()和partial()的知识点总结

    map()是python的一个内建函数, 他能够通过函数来处理序列,比如,我们相关一个数组[0,1,2,3,4,5]所有的数字都+2 , 当然,我们可以这么做 old = [0,1,2,3,4,5] new = [] for item in old: new.append(item+2) print new 有点小题大做的感觉,map就是解决这个问题的 old = [0,1,2,3,4,5] new = map((lambda x:x+2),old) print new map 可以把这个某个函

随机推荐