operator模块和functools模块

Posted xiangxiaolin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了operator模块和functools模块相关的知识,希望对你有一定的参考价值。

operator模块
在函数式编程中,经常需要把算术运算符当作函数使用。例如,不使用 递归计算阶乘。求和可以使用 sum 函数,但是求积则没有这样的函数。 我们可以使用 reduce 函数(5.2.1 节是这么做的),但是需要一个函数 计算序列中两个元素之积。示例 5-21 展示如何使用 lambda 表达式解决 这个问题。
  示例 5-21 使用 reduce 函数和一个匿名函数计算阶乘
from functools import reduce
def fact(n):
    return reduce(lambda a, b: a*b, range(1, n+1))
operator 模块为多个算术运算符提供了对应的函数,从而避免编写 lambda a, b: a*b 这种平凡的匿名函数。使用算术运算符函数,可以 把示例 5-21 改写成示例 5-22 那样。
   示例 5-22 使用 reduce 和 operator.mul 函数计算阶乘
from functools import reduce
from operator import mul
def fact(n):
    return reduce(mul, range(1, n+1))
operator 模块中还有一类函数,能替代从序列中取出元素或读取对象 属性的 lambda 表达式:因此,itemgetter 和 attrgetter 其实会自行构建函数。
示例 5-23 展示了 itemgetter 的常见用途:根据元组的某个字段给元 组列表排序。在这个示例中,按照国家代码(第 2 个字段)的顺序打印 各个城市的信息。其实,itemgetter(1) 的作用与 lambda fields: fields[1] 一样:创建一个接受集合的函数,返回索引位 1 上的元素。   示例 5-23 演示使用 itemgetter 排序一个元组列表(数据来自示 例 2-8)
metro_data = [
    (Tokyo, JP, 36.933, (35.689722, 139.691667)),
    (Delhi NCR, IN, 21.935, (28.613889, 77.208889)),
    (Mexico City, MX, 20.142, (19.433333, -99.133333)),
    (New York-Newark, US, 20.104, (40.808611, -74.020386)),
    (Sao Paulo, BR, 19.649, (-23.547778, -46.635833)),
 ]

from operator import itemgetter
for city in sorted(metro_data, key=itemgetter(1)):
    print(city)
如果把多个参数传给 itemgetter,它构建的函数会返回提取的值构成 的元组:
 

以上是关于operator模块和functools模块的主要内容,如果未能解决你的问题,请参考以下文章

22 初始模块 random time collections functools

Python基础22_模块,collections,time,random,functools

python之路---22 初始模块 random time collections functools

python 中的匿名函数lamda和functools模块

functools下的partial模块应用

functools模块