描述

functools.reduce() 函数会对参数序列中元素进行累积。函数将一个数据集合(列表,元组等)中的所有数据进行下列操作:用传给reduce中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第3个数据用 function 函数运算,最后返回一个结果。

语法

functools.reduce() 函数语法:

functools.reduce(function, iterable[, initializer])

假设function为bin_func,iterable为seq,则functools.reduce( bin_func, seq ) 的执行流程为:

参数

  • function -- 函数,有两个参数
  • iterable -- 可迭代对象
  • initializer -- 可选,初始参数

返回值

返回函数计算结果。

示例

以下示例展示了 reduce() 的使用方法:

def add(x, y):
return x + y functools.reduce(add, [1, 2, 3, 4, 5]) # 计算列表和:(((1+2)+3)+4)+5
functools.reduce(lambda x, y: x + y, [1, 2, 3, 4, 5])  # 使用 lambda 匿名函数,等价于add(x,y)

实现

functools.reduce函数的实现大致如下:

def reduce(function, iterable, initializer=None):
it = iter(iterable)
if initializer is None:
value = next(it)
else:
value = initializer
for element in it:
value = function(value, element)
return value

可选参数initializer的默认值为None,functools.reduce函数可简化为:

def reduce(function, iterable):
it = iter(iterable) # 返回一个iterator迭代器
value = next(it) # 取得迭代器it的第1个值,赋值给value for element in it: # 遍历迭代器it,取第2,3,4,...,n个元素
value = function(value, element) # 将value(第1个元素)和element(第2个元素)给function,并将结果赋值给value
return value

在掌握了reduce函数的实现原理后,initializer不为None的情况也就很好理解了 -- value的初始值为initializer,element则从迭代器的第1个值开始遍历

作用

filter()、map()、reduce()是Python的函数式编程的内容,最基本的用法是替代循环,也可以用来实现很多复杂功能:

import functools

def even_filter(nums):
return filter(lambda x: x % 2 == 0, nums) # 选择偶数 def multiply_by_three(nums):
return map(lambda x: x * 3, nums) # 乘以3 def convert_to_string(nums):
return map(lambda x: 'The Number: %s' % x, nums) # 打印输出 def pipeline_func(data, fns):
return functools.reduce(lambda a, x: x(a), fns, data) if __name__ == "__main__": nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 巧妙地利用reduce函数,实现了以下语句的功能
# pipeline = convert_to_string(multiply_by_three(even_filter(nums)))
pipeline = pipeline_func(nums, [even_filter, multiply_by_three, convert_to_string]) for element in pipeline:
print(element)
# 输出结果

The Number: 6
The Number: 12
The Number: 18
The Number: 24
The Number: 30

拓展阅读

Python进阶内容(三)--- reduce的更多相关文章

  1. Python进阶内容(四)--- 迭代器(Iterator)与生成器(Generator)

    迭代器 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器和带yield的ge ...

  2. Python进阶内容(一)--- 高阶函数 High order function

    0. 问题 # 本文将围绕这段代码进行Python中高阶函数相关内容的讲解 # 文中所有代码的兼容性要求为:Python 3.6,IPython 6.1.0 def addspam(fn): def ...

  3. python进阶学习三——第四天

    一. iter&yield迭代器 1.1 iter names = iter(['zeng', 'chun', 'yun']) print(names) print(names.__next_ ...

  4. Python进阶内容(二)--- 装饰器

    谈装饰器前,需要明白一件事,Python 中的函数和 Java.C++不太一样,Python 中的函数可以像普通变量一样当做参数传递给另外一个函数,例如: def foo(): print(" ...

  5. Python进阶内容(五)--- type和object的关系

    面向对象编程(OOP)的两大关系 继承与实现 继承关系: 子类继承自父类(base),可以使用父类的一些方法(method)和属性(attribute) 实现关系: 以类为模板,实例化一个对象,即:对 ...

  6. Python进阶(三)

    匿名函数 匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果.用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突.此外,匿名函数也是一个函数对象,也可以把匿名函 ...

  7. Python 进阶(三)面向对象编程基础

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAkMAAAFGCAIAAADmfgziAAAgAElEQVR4nOx993vT1v7/93/5EEt2Eg

  8. Python进阶内容(六)--- 函数式编程

    斐波那契数列(Fibonacci)的递归与非递归实现 费波那契数列由0和1开始,之后的数就由之前的两数相加 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...

  9. Python进阶(三十五)-Fiddler命令行和HTTP断点调试

    Python进阶(三十五)-Fiddler命令行和HTTP断点调试 一. Fiddler内置命令   上一节(使用Fiddler进行抓包分析)中,介绍到,在web session(与我们通常所说的se ...

随机推荐

  1. Android中相机和相冊使用分析

    Android中相机和相冊使用分析 欢迎转载,但请尊重原创(文章来自不易,转载请标明转载出处,谢谢) 在手机应用程序中,使用自带的相机拍照以及相冊选择喜欢的图片是最常见只是的用户需求,那么怎么合理使用 ...

  2. freemarker将文件读写到HTML中

    freemarker将文件读写到HTML中 1.设计思路 (1)写freemarker模板方法 (2)写測试文件方法 (3)新建ftl文件 (4)在指定的路径下.新建目录 2.写freemarker模 ...

  3. HTTP响应状态码含义参考

    1xx:信息 100 Continue服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求.101 Switching Protocols服务器转换协议:服务器将遵从客 ...

  4. 聊聊属性方法property的用法

    写之前随便百度了一下博客,又看到廖雪峰的博客了.果然置顶的能力很强. 我想说其实property的用法并不是主要用来做类型检查.反而更多应该是用于简化操作的目的. 写之前想聊一个古老的话题.年初的时候 ...

  5. springboot+CXF开发webservice对外提供接口(转)

    文章来源:http://www.leftso.com/blog/144.html 1.项目要对外提供接口,用webservcie的方式实现 2.添加的jar包 maven: <dependenc ...

  6. Android开发之常见事件响应方式

    常见的事件有   (1)单击事件 onClickListener (2)长按事件 onLongClickListener (3)滑动事件 onTouchListener (4)键盘事件 onKeyLi ...

  7. Android 开发,你遇上 Emoji 头疼吗?

    在 Android 中,如果需要使用的到 Emoji 表情,你会发现在某些设备上,有一些 Emoji 表情会被以豆腐块 "☐" 的形式显示,这是因为当前设备并不支持这个 Emoji ...

  8. SQL Server 数据库引擎怎样记录完整备份后修改过的数据

    SQL Server 使用两个内部数据结构跟踪被大容量复制操作修改的区,以及自上次完整备份后修改的区.这些数据结构极大地加快了差异备份的速度.当数据库使用大容量日志恢复模式时,这些数据结构也可以加快将 ...

  9. HTML干货

    什么也不想说 <%@ page language="java" import="java.util.*" pageEncoding="utf-8 ...

  10. lua的通用print函数

    1.前言 最近在做关于openresty方面的工作,涉及到lua脚本语言,经常需要打日志查看内容.普通的print函数遇到nil或table时,非常无力.而项目中的代码经常遇到参数为nil或table ...