Python随笔7:Python内置序列函数之reduce函数

:本文所有代码均经过Python 3.7实际运行检验,保证其严谨性。

Python内置序列函数系列所有文章都以几个术语为基础:可迭代对象(iterable)、迭代器(iterator)、序列(sequence)、生成器(generator)等。若对此不太理解,可移步Python随笔4前面部分查看。

今天讨论的主角reduce函数有点特殊,涉及到本文是否有标题党的嫌疑,所以一开始得做一个说明。

reduce函数在Python2时代是在全局命名空间(name space)里的;但到了Python3时代,它就失去了作为全局的内置函数(built-in function,即不用import而可以直接使用的函数)的资格,而被降级成为了一名相对不那么风光的库函数(library function),需要import才能使用它。

所以,如果按照Python3来看的话,本文主角reduce函数是不能称为“内置序列函数”的,但考虑到其功能确实主要用于序列(可迭代对象),曾经的确是风光无限的内置函数,且NumPy库中也有同样功能的reduce函数存在,所以有必要专门说一下此函数。

由于我们现在的讨论是建立在Python3环境之中的,因此,如果要用这位曾是内置函数的reduce函数,需要先进行import操作:

import functools

或者:

from functools import reduce

两种方式按个人习惯可任选其一。

reduce的具体用法是:

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

function:一个有两个参数的函数。

iterable:可迭代对象,本文统一采用序列中的列表作为可迭代对象的例子。function累积性地对列表中的每个元素从左到右逐一进行二目计算(比如两个数相加或相乘),从而达到减少序列中元素数量的目的,最终把序列中的所有元素利用function累积计算成为了一个元素。reduce的意思是减少,符合这个函数表达的功能。

initializer:function的初始作用元素,默认为None。可选参数。

给几个例子:

from functools import reduce

def add(x, y):
    return x + y
    

reduce(add, [1, 2, 3, 4, 5])
Out[11]: 15

def multiply(x, y):
    return x * y
    

reduce(multiply, [1, 2, 3, 4, 5])
Out[13]: 120

拿reduce(add, [1, 2, 3, 4, 5])作说明,最后结果15怎么来的?就是((((1+2)+3)+4)+5)的结果。换句话说,reduce和add函数在里面起的作用就是,add在列表里从左至右进行累积计算,先计算1+2,再把1+2的结果赋值给add(x, y)里面的x,把3赋值给y,一直这样累积计算下去,直到计算完列表里的所有元素为止。
reduce(multiply, [1, 2, 3, 4, 5])也是一样,累积两个数相乘,最后结果实际上是5个数累积相乘的结果,也就是120。

前面说的是reduce函数functools.reduce(function, iterable[, initializer])中的前两个必选参数,那么最后一个initializer如果参与进来又是什么情况呢?

看下面这个例子:

reduce(add, [1, 2, 3, 4, 5],  6)
Out[14]: 21

添加了一个6之后,最后结果从15变成了21,是什么原因?就是(((((6+1)+2)+3)+4)+5)的计算结果,6是第一次调用函数add(x, y)中的x,1是y,后面2、3、4、5依次累加。

以上就是对functools的库函数reduce的全部介绍。

你可能感兴趣的:(Python随笔7:Python内置序列函数之reduce函数)