码迷,mamicode.com
首页 > 其他好文 > 详细

operator模块和functools模块

时间:2019-09-29 20:05:49      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:range   bsp   计算   def   UNC   创建   print   return   接受   

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模块

标签:range   bsp   计算   def   UNC   创建   print   return   接受   

原文地址:https://www.cnblogs.com/xiangxiaolin/p/11609324.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!