Python 中的 Operator 模块可以让它支持函数式编程。

1 计算函数

假设我们需要一个计算阶乘的函数,一般做法是使用递归。如果使用函数式编程,可以有两种方式,一种 lambda,另一种使用 Operator 模块中的算术函数。我们做个比较。

首先使用 lambda 方式来实现:

from functools import reduce

def fact(n):

return reduce(lambda a, b: a * b, range(1, n + 1))

这里用到了 reduce 方法,reduce() 函数语法:reduce(function, iterable[, initializer])。其中的 function 函数有两个参数。reduce() 函数会先对集合中的第 1、2 个元素进行 function 函数处理,得到的结果再与第三个元素进行 function 函数处理,最后得到一个结果1。

reduce() 函数中的 function 使用 lambda 表达式。第二个入参 iterable 使用 range() 方法来生成。

接着使用 Operator 模块中的 mul 函数来实现阶乘:

from operator import mul

def factWithMul(n):

return reduce(mul, range(1, n + 1))

相对来说,使用 Operator 模块中的计算函数,代码更加简洁。

从源码上分析,mul 函数就是计算两个入参的乘积:

def mul(a, b):

"Same as a * b."

return a * b

Operator 模块内部还定义了很多类似的计算函数,比如:

2 过滤函数

operator 模块中还有一类函数能够起到条件过滤的作用。

首先介绍 itemgetter 函数。假设定义了一个 f 函数,f = itemgetter(2),那么如果调用 f(r),实际会返回 r[2]。也就是说,传入的入参 r,最终返回的只是 r 的索引值为 2 (从 1 开始计算)那一部分。

itemgetter 函数应用场景是:根据元组的某个字段对元组列表进行排序。比如我们有一段 JSON 格式的城市数据,需要对其简称进行排序:

from operator import itemgetter

metro_areas = [('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)),

]

for city in sorted(metro_areas, key=itemgetter(1)):

logging.info('city -> %s', city)

运行结果:

INFO - city -> ('Sao Paulo', 'BR', 19.649, (-23.547778, -46.635833))

INFO - city -> ('Delhi NCR', 'IN', 21.935, (28.613889, 77.208889))

INFO - city -> ('Tokyo', 'JP', 36.933, (35.689722, 139.691667))

INFO - city -> ('Mexico City', 'MX', 20.142, (19.433333, -99.133333))

INFO - city -> ('New York-Newark', 'US', 20.104, (40.808611, -74.020386))

城市数据数组中的每一个元素,拆分来看,就是元组形式。 itemgetter 函数取出元组的第二个值作为 sorted 函数的排序依据。

如果传入 itemgetter 的入参不止一个,那么它就是一个过滤函数,只把需要的列过滤出来。

比如我们只需要城市数组中的城市简称与所在坐标,就可以这么做:

cc_name = itemgetter(1, 3)

for city in metro_areas:

logging.info('city -> %s', cc_name(city))

运行结果:

INFO - city -> ('JP', (35.689722, 139.691667))

INFO - city -> ('IN', (28.613889, 77.208889))

INFO - city -> ('MX', (19.433333, -99.133333))

INFO - city -> ('US', (40.808611, -74.020386))

INFO - city -> ('BR', (-23.547778, -46.635833))

Luciano Ramalho (作者),安道,吴珂 (译者).流畅的Python[M].人民邮电出版社,2017:265-269.

python operator用法_说说 Python 中的 Operator 模块相关推荐

  1. python return用法_遗传算法(Python) #4 DEAP框架入门

    1. DEAP框架简介 DEAP(Distributed Evolutionary Algorithms in Python)是一个热门的Python进化算法框架,我们可以用这个框架在Python内实 ...

  2. python生成器用法_理解python中生成器用法

    生成器(generator)概念 生成器不会把结果保存在一个系列中,而是保存生成器的状态,在每次进行迭代时返回一个值,直到遇到StopIteration异常结束. 生成器语法 生成器表达式: 通列表解 ...

  3. python sendkeys用法_使用python中的sendkeys上载文件将打开一个文件选择器弹出窗口...

    需要自动化的组件是antd-upload.在https://ant.design/components/upload/ --> Can be found here 上载按钮可见,但输入的&quo ...

  4. python global用法_【python测试开发栈】python基础语法大盘点

    周边很多同学在用python,但是偶尔会发现有人对python的基础语法还不是特别了解,所以帮大家梳理了python的基础语法(文中的介绍以python3为例).如果你已然是python大牛,可以跳过 ...

  5. python return用法_初学Python要了解什么 装饰器知识汇总有哪些

    初学Python要了解什么?装饰器知识汇总有哪些?在Python学习过程中,有多种方法对函数和类进行加工,相对于其它方式,装饰器语法简单,代码可读性高.因此,装饰器在Python项目中有广泛的应用,比 ...

  6. python enumerate用法_【Python】python enumerate用法总结

    enumerate()说明 enumerate()是python的内置函数 enumerate在字典上是枚举.列举的意思 对于一个可迭代的(iterable)/可遍历的对象(如列表.字符串),enum ...

  7. python map用法_讲解Python map()函数和将map()与多个Iterables一起使用

    map()是Python中的内置函数,可将函数应用于给定可迭代对象中的所有元素,它使您无需使用循环即可编写简单干净的代码. Python map()函数 map()函数采用以下形式: map(func ...

  8. python stdout用法_使用Python子进程从stdout上的C程序捕获输出...

    你不能像那样使用p.stdout;如果您要求"整个标准输出",则只有在过程终止(或管道缓冲器填充,这可能需要很长时间)时才可用. 您需要逐行读取进程的stdout. while T ...

  9. python urllib2用法_使用Python urllib2执行PUT

    我正在尝试使用urllib2来停止,下面是我在stackoverflow上找到的示例: 我不明白为什么我会犯错误. 以下是我的代码摘录:import urllib2 import json conte ...

  10. python 时间序列预测_使用Python进行动手时间序列预测

    python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...

最新文章

  1. 实战分享:淘宝Web 3D应用与游戏开发
  2. 软件构建发布自动化[摘抄]
  3. 现在不坚持,以后都会放弃
  4. java getselectedrow_Java swing(2)自己设计完善的独特功能图书管理系统,获取下拉框等的文字内容等...
  5. C++调用WebService
  6. django - 替换admin的textarea为 富文本
  7. VB实现6大排序算法---动态过程展示(建议收藏)
  8. Redis笔记5-redis高可用方案
  9. linux系统密码自动丢失,Linux系统密码丢失后的5种解决方法
  10. Java设计模式学习记录-模板方法模式
  11. Alexa Top 1000000
  12. 表格筛选后复制粘贴方法
  13. 数据库之SQL更新语句中update set from用法
  14. Legend of Mir(传奇)官方源码学习3、服务端程序初始化过程
  15. mysql tar 卸载_mysql linux 安装卸载
  16. 【读书笔记】【未】杀死一只知更鸟
  17. 春节快乐!发个大红包!
  18. 反思专家型领导---转载--读后感
  19. RSA+AES混合加密实例
  20. CH340驱动安装失败 win10

热门文章

  1. 什么是Android Instant Apps?
  2. 企业如何选择?网站建设中常见的几种类型
  3. 5G(NR)网络中的SRB定义和类型
  4. java string转character_Java中String和Character数组之间的区别。
  5. 华为老总任正非给公司患抑郁症员工的一封信
  6. pythonurllib新浪微博_定向爬虫 - Python模拟新浪微博登录(示例代码)
  7. CA配置证书自动注册
  8. vue结合高德地图V2.0(JSAPI key搭配代理服务器并携带安全密钥转发)
  9. 红米Note5官方刷机日记 - 小米助手Recovery刷机
  10. 流体力学——漩涡运动