77、Python之函数式编程:一文搞懂functools模块的核心应用

news2024/9/24 9:01:26

引言

Python作为一种支持多范式的编程语言,除了在“一切皆对象”的理念支持下的,函数对象也是一等公民、各种高阶函数的自然实现、lambda表达式快速编写纯函数之外。还有一个内置的模块functools,能够更好地支持我们在Python中应用函数式编程。

本文的主要内容有:

1、functools模块概览

2、偏函数

3、自定义排序

4、属性缓存

5、其他已经介绍过的功能

functools模块概览

functools模块是Python标准库中的一部分,提供了一系列高阶函数和操作函数的工具,涵盖了偏函数、聚合操作、性能优化、多态处理、装饰器开发、自定义排序和属性缓存等多种功能。

通过理解和使用这些工具,可以大大提高代码的灵活性、性能和可维护性。无论是函数式编程,还是面向对象编程等,在日常的开发任务中,functools都是一个不可或缺的利器。

偏函数

functools模块有很多重要的功能,其中一个就是偏函数(Partial function)。

需要注意的是,这里的偏函数与数学意义上的偏函数(偏导数)是不一样的。

Python中的偏函数是用于对函数固定参数的函数,作用就是把一个函数中的某些参数固定住,类似于设置默认值的逻辑,返回一个新的函数,从而使得多元函数的调用变得更加简单,从而对使用者更加友好。

先看下定义:

aed5d0cef0323cda76cd14d44dfd405f.jpeg

然后以实际代码看一下partial的使用:

from functools import partial


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


add_one_two = partial(add, 1, 2)
print(add_one_two)
print(add_one_two(3))

执行结果:

f5860c4726ea4179c535ff0cf62b4477.jpeg

需要说明的是,偏函数虽然与柯里化比较相似,但是,两者在使用上还是有所区别的。偏函数是固定部分参数,直接生成新的函数。而柯里化,是逐步进行函数参数的传递,嵌套函数,每个函数只接收一个参数。在调用上,偏函数是一次性传递所有剩余参数,柯里化是逐层传递每一个参数。

自定义排序

functools模块提供了一个total_ordering的装饰器,用于自动生成缺失的排序方法。

首先看下定义:

fb4f652c691015a28711a740c0b556ce.jpeg

只要定义比较方法,比如<、>、<=、>=中的一个方法,该装饰器可以帮助自动推导出另外几个方法。

还是直接看代码:

from functools import total_ordering


@total_ordering
class DaGongRen:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __lt__(self, other):
        return self.age < other.age

    # == / != 还是要自己手工定义的
    def __eq__(self, other):
        return self.age == other.age


zs = DaGongRen('张三', 18)
ls = DaGongRen('李四', 23)
ww = DaGongRen('王五', 18)

print(zs < ls)
print(zs <= ls)
print(zs > ls)
print(zs >= ls)
print(zs == ls)
print(zs != ls)
print(zs == ww)

执行结果:

0938f2349812d2bd4ac9c9740add50fa.jpeg

可以看到,我们在代码中只定义了__lt__方法,total_ordering装饰器自动根据该方法实现了另外3个用于比较的方法。

需要说明的是,==、!=还是自行定义__eq__方法来实现。

属性缓存

在面向对象中,我们介绍过property属性装饰器,有些计算的属性,如果比较消耗性能,还可以使用functools中提供的cached_property来实现计算结果的缓存。

直接以代码为例:

from functools import cached_property
from math import pi


class Circle:
    def __init__(self, radius):
        self.radius = radius

    @cached_property
    def area(self):
        print('进行圆的面积计算')
        return pi * self.radius * self.radius


circle = Circle(10)
print(circle.area)
print('=' * 20)
print(circle.area)

执行结果:

55bee97fb9c7d06ceae4020cfb9c89a1.jpeg

可以看到,第二次调用时,并没有执行area()方法的调用。

其他已经介绍过的功能

functools中还有其他功能,我们在前面的文章中都已经介绍过了,这里就不展开详细说明了,只是简单列举回顾一下:

1、functools.reduce:用于将一个二元操作函数应用于序列,实现累计地将序列元素计算合并为一个结果。

2、functools.lru_cache:装饰器,用于缓存函数的计算结果,从而提高性能,lru是Least Recently Used的缩写,表示缓存采用的最近最少使用的缓存置换策略。

3、functools.singledispatch:装饰器,用于实现单分派泛函数,允许根据第一个参数的类型调用不同的函数实现,近似实现其他语言中的函数重载。

4、functolls.wraps:装饰器,主要用于确保装饰器不修改被装饰函数的元数据。

总结

本文详细介绍了functools中的各个核心功能的使用,包括偏函数、自定义排序、缓存属性等。functools模块,不仅可以用于函数式编程,面向对象编程中,也可以发挥巨大的作用。

感谢您的拨冗阅读,希望对您有所帮助。

97132d8df638f170fda1e121797eab57.jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2159958.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[笔记]某视觉三维定位系统参数表

表中的参数是彼此关联的&#xff0c;其实是就是视频解算的速度。里面的1秒直接对应1FPS300m秒直接对应3FPS0-20m的识别范围&#xff0c;与摄像头分辨率、视在焦距与摄像头基线有明确的对应关系。它的矩阵非正方。怀疑一组用于远距&#xff0c;一组用于近距&#xff0c;属于固定…

从入门到精通:Spring Boot 100个技术关键词

Spring Boot 是一个基于Spring框架的快速开发框架&#xff0c;旨在简化Spring应用的初始搭建以及开发过程。通过掌握本指南中的100个关键技术关键词&#xff0c;你将逐步了解Spring Boot的核心概念、自动配置、依赖管理、Web开发、数据库操作、安全性、测试等方面的知识。每个关…

基于真实山地场景下的超多目标优化算法求解无人机三维路径规划,MATLAB代码

超多目标优化算法是一类专门用于解决存在三个以上目标函数的最优化问题的算法。这类问题在现实世界中非常常见&#xff0c;例如在工程设计、资源管理、机器学习等领域。由于目标之间的冲突性&#xff0c;很难找到一个单一的解来同时优化所有目标&#xff0c;因此超多目标优化算…

音视频入门基础:FLV专题(4)——使用flvAnalyser工具分析FLV文件

一、引言 有很多工具可以分析FLV格式&#xff0c;这里推荐flvAnalyser。其支持&#xff1a; 1.FLV 文件分析&#xff08;Tag 列表、时间戳、码率、音视频同步等&#xff09;&#xff0c;HEVC(12)/AV1(13) or Enhanced RTMP v1 with fourCC(hvc1/av01)&#xff1b; 2.RTMP/HTT…

全栈开发(二):springBoot3连接mysql数据库

spring.application.namedemo2 spring.datasource.urljdbc:mysql://localhost:3306/数据库名字?useUnicodetrue&characterEncodingUTF-8&serverTimezoneUTC spring.datasource.username账号 spring.datasource.password密码 spring.datasource.driver-class-namecom.m…

CentOS一键安装Mosquitto开源消息代理结合内网穿透实现远程连接

文章目录 前言1. Linux 搭建 Mosquitto2. Linux 安装Cpolar3. 创建MQTT服务公网连接地址4. 客户端远程连接MQTT服务5. 代码调用MQTT服务6. 固定连接TCP公网地址7. 固定地址连接测试 前言 今天和大家分享一下如何在Linux系统中搭建Mosquitto MQTT协议消息服务端,并结合Cpolar内…

IDEA 关闭自动补全功能(最新版本)

文章目录 一、前言二、关闭自动补全三、最终效果 一、前言 在最新的 IDEA 中发布了自动补全功能&#xff0c;当你输入代码时&#xff0c;IDEA 会自动显示你可能想输入的代码&#xff0c;减少手动输入的工作量&#xff0c;它会根据上下文提供正确的选项&#xff0c;提高代码的准…

计算机毕业设计 基于Python内蒙古旅游景点数据分析系统 Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

Vue3教程 - 2 开发环境搭建

更好的阅读体验&#xff1a;点这里 &#xff08; www.foooor.com &#xff09; 2 开发环境搭建 要进行 Vue 开发&#xff0c;需要安装 Node.js&#xff0c;因为构建 Vue 项目的工具&#xff0c;例如 Webpack、Vite等&#xff0c;这些工具依赖于Node.js环境来运行。 Node.js…

谷歌网站收录查询,怎么查看网站在谷歌的收录情况

在进行谷歌网站收录查询时&#xff0c;我们需采取一种既专业又系统的方法&#xff0c;以确保能够准确评估网站在谷歌搜索引擎中的可见性和收录状态。这一过程不仅关乎技术细节&#xff0c;还涉及到对搜索引擎优化&#xff08;SEO&#xff09;策略的理解与应用。以下是一个基于专…

视频无损压缩工具+预览视频生成工具

视频无损压缩工具 功能与作用 &#xff1a;视频无损压缩工具是一种能够减少视频文件大小&#xff0c;但同时保持视频质量的工具。它通过先进的编码技术和算法&#xff0c;有效降低视频文件的存储空间&#xff0c;同时保证视频的清晰度和观感。这对于需要分享或存储大量视频内容…

仓颉编程语言4,遇到BUG求助

本来准备整仓颉链接Mysql数据库。参考&#xff1a;GitCode - 全球开发者的开源社区,开源代码托管平台 这种方式是拿mysql官方的dll&#xff0c;编译一下&#xff0c;然后再封装成仓颉数据库驱动。这种方式不够逼格&#xff0c;所以准备解析mysql网络协议&#xff0c;从0开始写…

c++9月23日

1.My_string 头文件 #ifndef MY_STRINGHEAD_H #define MY_STRINGHEAD_H#include <iostream> #include <cstring> using namespace std;class My_string { private:char *ptr;//指向字符数组的指针int size;//字符数组的最大容量int len ;//当前字符串的长度 publ…

SaaS 软件转型计划

目录 一、转型目标 1、背景与趋势分析 2、转型策略与实施路径 3、预期成果与展望 二、现状分析 1、产品评估&#xff1a;从传统到SaaS的华丽转身 2、客户群体洞察&#xff1a;倾听需求&#xff0c;引领变革 3、销售渠道优化&#xff1a;拓宽路径&#xff0c;触达更多客…

python request库的使用

安装和使用 requests库支持python3.8&#xff0c;注意版本 pip install requests 在项目中引用时如下&#xff1a; import requests访问网站 request访问网站一般用get和post两种方式 get requests库提供了get方法&#xff0c;可以用get方式访问网站&#xff0c;相当于在浏览…

如何检测并阻止机器人活动

恶意机器人流量逐年增加&#xff0c;占 2023 年所有互联网流量的近三分之一。恶意机器人会访问敏感数据、实施欺诈、窃取专有信息并降低网站性能。新技术使欺诈者能够更快地发动攻击并造成更大的破坏。机器人的无差别和大规模攻击对所有行业各种规模的企业都构成风险。 但您的…

【Go】探索Go语言中的Map

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-23

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-23 本期&#xff0c;我们对大语言模型在表情推荐, 软件安全和 自动化软件漏洞检测等方面如何应用&#xff0c;提供几篇最新的参考文章。 1 Semantics Preserving Emoji Recommendation with Large Language Mod…

高清8k电脑壁纸分享

Hello&#xff01;欢迎各位新老朋友来看小弟博客&#xff0c;祝大家事业顺利&#xff0c;财源广进&#xff01;&#xff01; 主题&#xff1a;高清壁纸分享 文件太大上传不上去&#x1f605;&#x1f605;&#x1f605;&#x1f605;&#x1f605;&#xff0c;需要的朋友自取&…

C语言 | Leetcode C语言题解之第433题最小基因变化

题目&#xff1a; 题解&#xff1a; int minMutation(char * start, char * end, char ** bank, int bankSize) {int m strlen(start);int **adj (int **)malloc(sizeof(int *) * bankSize);int endIndex -1;for (int i 0; i < bankSize; i) {adj[i] (int *)malloc(si…