探索Python的魔法工具箱:functools

文章目录

  • 探索Python的魔法工具箱:functools
    • 背景
    • 库介绍
    • 安装
    • 简单库函数使用方法
      • lru_cache
      • partial
      • reduce
      • cmp_to_key
      • total_ordering
    • 场景应用
      • 缓存数据库查询结果
      • 固定函数参数
      • 计算序列的累积和
      • 自动补全比较方法
      • 将比较函数转换为key函数
    • 常见Bug及解决方案
      • Bug 1: `lru_cache`不更新缓存
      • Bug 2: `partial`函数参数错误
      • Bug 3: `reduce`函数没有初始值
    • 总结

在这里插入图片描述

探索Python的魔法工具箱:functools

背景

在Python的世界里,代码的简洁性和效率同样重要。functools库就是这样一个神奇的存在,它提供了多种高阶函数和装饰器,帮助我们编写更简洁、更Pythonic的代码。这个库的功能涵盖了函数的缓存、偏函数应用、以及函数的组合等高级特性,是每个Python开发者工具箱中不可或缺的一部分。

库介绍

functools是Python的标准库之一,它包含了许多有用的工具,用于扩展和增强函数的功能。这些工具包括缓存装饰器、偏函数、以及函数组合等。

安装

由于functools是Python标准库的一部分,你不需要通过pip安装它。只需确保你使用的是Python 3.2或更高版本,就可以直接导入并使用它。

import functools

简单库函数使用方法

lru_cache

lru_cache是一个装饰器,用于缓存函数的返回值,避免重复计算。

@functools.lru_cache(maxsize=128)
def fibonacci(n):if n < 2:return nreturn fibonacci(n-1) + fibonacci(n-2)

partial

partial用于固定函数的一些参数,创建一个新的函数。

import mathsqrt = functools.partial(math.sqrt, 1)
print(sqrt(4))  # 输出 1.0

reduce

reduce用于将一个函数应用于序列的元素,从而将其缩减为单个值。

from functools import reducenumbers = [1, 2, 3, 4, 5]
result = reduce(lambda x, y: x+y, numbers)
print(result)  # 输出 15

cmp_to_key

cmp_to_key用于将比较函数转换为key函数。

from functools import cmp_to_keydef compare(x, y):if x < y:return -1elif x > y:return 1else:return 0sorted_list = sorted([3, 1, 4, 1, 5, 9], key=cmp_to_key(compare))
print(sorted_list)  # 输出 [1, 1, 3, 4, 5, 9]

total_ordering

total_ordering用于自动为类生成缺失的比较方法。

from functools import total_ordering@total_ordering
class Student:def __init__(self, name, grade):self.name = nameself.grade = gradedef __eq__(self, other):return self.grade == other.gradedef __lt__(self, other):return self.grade < other.grade# 现在Student类有了完整的比较方法

场景应用

缓存数据库查询结果

使用lru_cache缓存数据库查询结果,减少数据库访问次数。

@functools.lru_cache(maxsize=100)
def get_user(user_id):# 模拟数据库查询return {"id": user_id, "name": "John Doe"}

固定函数参数

在Web框架中,使用partial固定请求处理函数的某些参数。

from flask import Flask, requestapp = Flask(__name__)@app.route('/greet/<name>')
def greet(name):return functools.partial("Hello, {}!".format, name)()

计算序列的累积和

使用reduce计算一个列表的累积和。

from functools import reducenumbers = [1, 2, 3, 4, 5]
cumulative_sum = reduce(lambda x, y: x+y, numbers, 0)
print(cumulative_sum)  # 输出 15

自动补全比较方法

使用total_ordering自动补全比较方法,简化类的定义。

from functools import total_ordering@total_ordering
class Point:def __init__(self, x, y):self.x = xself.y = ydef __eq__(self, other):return (self.x, self.y) == (other.x, other.y)# 现在Point类有了完整的比较方法

将比较函数转换为key函数

在排序时,使用cmp_to_key将比较函数转换为key函数。

from functools import cmp_to_keydef compare(a, b):if a < b:return -1elif a > b:return 1else:return 0data = [5, 2, 9, 1, 5, 6]
sorted_data = sorted(data, key=cmp_to_key(compare))
print(sorted_data)  # 输出 [1, 2, 5, 5, 6, 9]

常见Bug及解决方案

Bug 1: lru_cache不更新缓存

错误信息:functools.cached_property object is not callable

解决方案:确保lru_cache装饰的函数没有参数,或者使用cache_info来检查缓存状态。

@functools.lru_cache(maxsize=128)
def fibonacci(n):if n < 2:return nreturn fibonacci(n-1) + fibonacci(n-2)# 检查缓存状态
print(fibonacci.cache_info())

Bug 2: partial函数参数错误

错误信息:TypeError: not all arguments converted

解决方案:确保partial函数的参数数量正确。

import math# 正确的参数数量
sqrt = functools.partial(math.sqrt, 1)
print(sqrt(4))  # 输出 1.0

Bug 3: reduce函数没有初始值

错误信息:TypeError: reduce() of empty sequence with no initial value

解决方案:确保reduce函数有初始值。

from functools import reducenumbers = [1, 2, 3, 4, 5]
result = reduce(lambda x, y: x+y, numbers, 0)
print(result)  # 输出 15

总结

functools库是Python编程中的一个强大工具,它通过提供高阶函数和装饰器,帮助我们编写更高效、更简洁的代码。无论是缓存函数结果、固定函数参数,还是实现复杂的函数组合,functools都能提供强大的支持。掌握这个库,将使你的Python编程之旅更加顺畅。

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 3266 K次乘运算后的最终数组II 题解

题目大意 原题面 给你一个数组 nums&#xff0c;然后进行 k 轮游戏&#xff0c;每轮游戏都会选择数组当中最小的元素然后乘上一个数 multiplier&#xff08;题目给出&#xff09;&#xff0c;问你 k 轮游戏结束之后&#xff0c;这个数组长什么样子&#xff0c;所有的元素要对 …

事务管理与锁机制

title: 事务管理与锁机制 date: 2024/12/14 updated: 2024/12/14 author: cmdragon excerpt: 在数据库系统中,事务管理至关重要,它确保多个数据库操作能够作为一个单一的逻辑单元来执行,从而维护数据的一致性和完整性。一个良好的事务管理系统能够解决并发操作带来的问题…

各种消息中间件介绍

消息中间件是一种在分布式系统中实现消息传递的软件架构&#xff0c;它允许不同的应用程序或系统组件之间异步地交换信息。 1. Apache Kafka Kafka是一个分布式流处理平台&#xff0c;能够处理高吞吐量的数据。它主要用于构建实时数据管道和流应用程序。 • Broker&#xff1a;…

mall-admin-web开源项目搭建教程(图文)

本章教程,介绍如何在本地部署运行mall-admin-web这个开源项目。 开源地址:https://gitee.com/macrozheng/mall-admin-web mall-admin-web是一个电商后台管理系统的前端项目,基于Vue+Element实现。主要包括商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计…

使用FastGPT制做一个AI网站日志分析器

越来越的多网站面临每天上千次的扫描和各类攻击&#xff0c;及时发现攻击IP&#xff0c;并有效的屏蔽不良访问成为网站安全的重要保障&#xff0c;这里我们使用AI来完成对网站日志的日常分析。 我们来使用FastGPT来制做一个AI网站日志析器&#xff0c;下面就开始&#xff1a; …

npm : 无法加载文件 D:\nodejs\npm.ps1

问题描述 npm run serve 启动一个Vue项目&#xff0c;报错如下&#xff1a; npm : 无法加载文件 D:\nodejs\npm.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/? LinkID135170 中的 about_Execution_Policies。…

UE4_贴花_贴花基础知识一

贴花可以将材料和各种材料元素投影到表面上。您可以使用它们来添加独特的效果。贴花 是一种可以投射到网格体&#xff08;包括静态网格体和骨骼网格体&#xff09;上的材质。无论这些网格体的移动性&#xff08;Mobility&#xff09;是静态&#xff08;Static&#xff09;还是可…

ShardingSphereProxy:快速入门

使用 Docker 运行 ShardingSphere 在基于 Docker 安装 ShardingSphere 时&#xff0c;按照官方文档《使用 Docker :: ShardingSphere》所提供的步骤操作即可。 在运行ShardingSphereProxy之前&#xff0c;我们需要基于我们的测试场景修改配置文件&#xff0c;我测试场景中主要…

Unity 获取鼠标点击位置物体贴图颜色

实现 Ray ray Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hit)) {textureCoord hit.textureCoord;textureCoord.x * textureMat.width;textureCoord.y * textureMat.height;textureColor textureMat.GetPixel(Mathf.Flo…

Python高性能web框架-FastApi教程:(3)路径操作装饰器方法的参数

路径操作装饰器方法的参数 1. 定义带有参数的POST请求路由 app.post(/items,tags[这是items测试接口],summary这是items测试的summary,description这是items测试的description,response_description这是items测试的response_description) def test():return {items: items数据…

基于SpringBoot的嗨玩旅游网站:一站式旅游信息服务平台的设计与实现

摘要 在旅游需求日益增长的今天&#xff0c;一个全面、便捷的旅游信息服务平台显得尤为重要。嗨玩旅游网站正是为了满足这一需求而设计的在线平台&#xff0c;它提供了包括景点信息、旅游线路、商品信息、社区信息和活动推广等在内的丰富旅游目的地信息&#xff0c;旨在帮助用…

【K8S系列】Kubernetes 资源对象的 YAML 文件示例及其详细介绍

在 Kubernetes 中&#xff0c;YAML 文件用于定义各种资源对象的配置&#xff0c;包括 Pods、Deployments、Services 等。以下是一些常见 Kubernetes 资源对象的 YAML 文件示例及其详细介绍。 一、Pod Pod 是 Kubernetes 中最基本的部署单位&#xff0c;通常包含一个或多个容器…

MVP模式的理解和实践

MVP&#xff08;Model-View-Presenter&#xff09;模式是一种用于组织代码的架构模式&#xff0c;主要用于用户界面的开发。它通过将应用程序的三个主要组件分开&#xff0c;提高了应用的可维护性和可测试性。本文将详细介绍MVP模式的理解和实践&#xff0c;并通过Java语言提供…

微信小程序中 crypto-js 加解密全攻略

一、引言 在微信小程序开发中&#xff0c;数据的安全至关重要。加解密技术在保护用户数据和应用程序的安全性方面起着关键作用。小程序在与服务器进行数据交互时&#xff0c;面临着数据泄露、篡改等安全风险。为了确保用户信息的安全&#xff0c;选择合适的加解密算法变得尤为…

Mac mini m4本地跑大模型(ollama + llama + ComfyUI + Stable Diffusion | flux)

change log 2024-12-11 10:28&#xff08;推荐重新观看&#xff09; 针对绘画大模型的使用做进一步的详细操作&#xff08;flux1dev&#xff09; 见篇节&#xff08;绘画大模型&#xff09; 2024-12-10 更新了基础的chat大模型和绘画大模型的基础环境搭建。 安装chat大模型&am…

jenkins harbor安装

Harbor是一个企业级Docker镜像仓库‌。 文章目录 1. 什么是Docker私有仓库2. Docker有哪些私有仓库3. Harbor简介4. Harbor安装 1. 什么是Docker私有仓库 Docker私有仓库是用于存储和管理Docker镜像的私有存储库。Docker默认会有一个公共的仓库Docker Hub&#xff0c;而与Dock…

Flutter 内嵌 unity3d for android

前言&#xff1a; 最近刚整完 unity3d hybridCLR 更新代码和资源&#xff0c;我们 趁热打铁 将 Unity3D 嵌入 Flutter 应用中。实现在 Flutter 使用 Unity3D, 可以做 小游戏 大游戏&#xff1b; 之前都是 内嵌 Webview 来实现的。虽然 CocosCreator 做出来的效果也不错&#xf…

移远EC200A-CN的OPENCPU使用GO开发嵌入式程序TBOX

演示地址&#xff1a; http://134.175.123.194:8811 admin admin 演示视频&#xff1a; https://www.bilibili.com/video/BV196q2YQEDP 主要功能 WatchDog 1. 守护进程 2. OTA远程升级 TBOX 1. 数据采集、数据可视化、数据上报&#xff08;内置Modbus TCP/RTU/ASCII,GPS协…

健康管理系统(Koa+Vue3)

系统界面(源码末尾获取) 系统技术 Vue3 Koa Nodejs Html Css Js ....... 系统介绍 系统比较简单,轻轻松松面对结业课堂作业.采用的是基于nodejs开发的Koa框架作为后端,采用Vue框架作为前端,完成快速开发和界面展示. 系统获取 啊啊啊宝/KoaVue3https://gitee.com/ah-ah-b…

KALI安装操作及过程

以下是在计算机上安装 Kali Linux 的详细教程&#xff1a;&#xff08;通常我直接使用虚拟机&#xff09; 解压虚拟机安装包&#xff0c;直接在虚拟机中打开KALI &#xff08;将内存改为4GB&#xff09; 初始密码账号&#xff1a;kali 一、准备工作 下载 Kali Linux 镜像文件…