当前位置: 首页 > news >正文

Python 中支持函数式编程的 operator 与 functools 包

引言

尽管 Python 之父 Guido 表明 Python 的目标并非成为函数式编程语言,但借助operator和functools等包,我们能轻松实现函数式编程风格。本文将详细介绍这两个包。

operator 模块

算术运算符函数

在函数式编程里,常需把算术运算符当作函数使用。例如计算阶乘,使用reduce函数时,若不使用operator模块,需用lambda表达式

lambda a, b: a*b

来计算序列元素之积;而使用operator.mul可避免编写此类平凡的匿名函数。

from functools import reduce 
from operator import mul def fact(n): return reduce(mul, range(1, n + 1)) 

itemgetter 函数

itemgetter能替代从序列中取出元素的lambda表达式。它会自行构建函数,用于提取集合中指定索引位置的元素。例如,可根据元组的某个字段对元组列表排序。

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构建的函数会返回提取值构成的元组,且它支持序列、映射及任何实现__getitem__方法的类。

attrgetter 函数

attrgetter与itemgetter类似,它创建的函数根据名称提取对象的属性。传入多个属性名时,也会返回提取值构成的元组。若参数名包含.点号,它会深入嵌套对象获取指定属性。

from collections import namedtuple 
LatLong = namedtuple('LatLong', 'lat long') 
Metropolis = namedtuple('Metropolis', 'name cc pop coord') 
metro_areas = [Metropolis(name, cc, pop, LatLong(lat, long)) for name, cc, pop, (lat, long) in metro_data] 
from operator import attrgetter 
name_lat = attrgetter('name', 'coord.lat')  
for city in sorted(metro_areas, key=attrgetter('coord.lat')):  print(name_lat(city)) 

methodcaller 函数

methodcaller会自行创建函数,该函数会在对象上调用参数指定的方法,还可冻结某些参数,实现部分应用。

from operator import methodcaller s = 'The time has come' upcase = methodcaller('upper') 
print(upcase(s)) 

使用 functools.partial 冻结参数

partial 函数简介

functools.partial是一个高阶函数,用于部分应用一个函数,即基于一个函数创建新的可调用对象,固定原函数的某些参数,使接受多个参数的函数改编成适用于回调 API 的少参数函数。

from operator import mul 
from functools import partial 
triple = partial(mul, 3) 
print(triple(7)) 
print(list(map(triple, range(1, 10)))) 

实际应用示例

在处理多国语言文本时,可使用partial构建便利的 Unicode 规范化函数。

import unicodedata, functools 
nfc = functools.partial(unicodedata.normalize,  'NFC') 
s1 = 'café' 
s2 = 'cafe\u0301' 
print(nfc(s1) == nfc(s2)) 

应用于自定义函数

还可将partial应用到自定义函数上,冻结定位参数和关键字参数。

from tagger import tag 
from functools import partial 
picture = partial(tag, 'img', cls='pic - frame') 
print(picture(src='wumpus.jpeg'))  

partialmethod 函数

functools.partialmethod函数(Python 3.4 新增)作用与partial类似,不过是用于处理方法的。

lru_cache 函数

functools模块中的lru_cache函数会做备忘(memoization),存储耗时函数的调用结果,避免重新计算。

总之,operator和functools包为 Python 实现函数式编程提供了强大的支持,合理运用这些工具能让代码更加简洁高效。

http://www.xdnf.cn/news/198757.html

相关文章:

  • 第一节:Linux系统简介
  • Android显示学习笔记本
  • 打造即插即用的企业级云原生平台——KubeSphere 4.1 扩展组件在生产环境的价值全解
  • 解决跨域实现方案
  • 用vite动态导入vue的路由配置
  • 本地部署Qwen-7B实战 vLLM加速推理
  • 网络协议之为什么要分层
  • 论文分享 | 基于区块链和签名的去中心化跨域认证方案
  • 受限字符+环境变量RCE
  • vue3:v-model的原理示例
  • python练习:求数字的阶乘
  • 思科bsp社招面试
  • JavaScript 与 Java 学习笔记
  • day9 python 热力图与子图的绘制
  • MYSQL——时间字段映射Java类型
  • 庙算兵棋推演AI开发初探(7-神经网络训练与评估概述)
  • FTP-网络文件服务器
  • 使用 Vue3 + Webpack 和 Vue3 + Vite 实现微前端架构(基于 Qiankun)
  • iVX 图形化编程如何改写后端开发新范式
  • EXCEL中跨行匹配两组数据
  • 流域生态系统碳排放、碳循环模拟与评估技术应用
  • 【基础篇】static_config采集配置详解
  • Vue 3 中通过 createApp 创建的 app 实例的所有核心方法,包含完整示例、使用说明及对比表格
  • 深入解析 PyTorch 中的 torch.distributions模块与 Categorical分布
  • 2025吃鸡变声器软件推荐
  • 【Vue3 组合式 API 在大型项目中的实践:useOperatorData 封装与应用】
  • 如何开发动态贴纸功能?一体化美颜SDK的技术实现思路与实战方案
  • Java 入门宝典--注释、关键字、数据类型、变量常量、类型转换
  • 服务器部署,Nginx安装和配置
  • 思维链理解汇总