Python标准库中的七个“小众但神奇”的实用函数
wxin55 2025-05-08 21:44 1 浏览 0 评论
如果你一直在使用Python,想必已经非常熟悉它极其丰富的标准库,这让开发变得高效且直接。虽然像json、datetime、re这样的热门模块经常被关注,但其实还有一批鲜为人知的函数常常被忽视。
本文将讨论这些函数——有些人可能会觉得它们“无用”,但实际上它们一点也不无用!这些功能奇特、非常细分的小众函数可能会让你产生“谁会需要这个?”的疑问。可总有一天,你会遇到它们正好能解决的问题。
所以,让我们来看看这些其实超级有用的函数吧!
GitHub代码链接
- textwrap.dedent() —— 轻松整理凌乱的多行字符串
你是否曾在Python中书写多行字符串,却因缩进而感到困扰?如果是这样,textwrap.dedent就是你的好帮手!
看看下面这个示例,使用了textwrap的dedent。它可以移除多行字符串中多余的缩进,让你得到没有前导空格的干净文本。
import textwrap
def my_function():
# 如果不使用dedent,所有前导空格都会被保留
description = textwrap.dedent("""
This is a multi-line string
that will have consistent indentation
regardless of how it's indented in the code.
Pretty neat, right?
""").strip()
return description
print(my_function())
输出:
This is a multi-line string
that will have consistent indentation
regardless of how it's indented in the code.
Pretty neat, right?
- difflib.get_close_matches() —— 轻松实现模糊字符串匹配
有时你需要查找字符串之间的相似性,或实现“你是不是想找……”的功能。difflib模块的get_close_matches函数正好能帮你实现。
下面的几个例子展示了如何使用该函数:
import difflib
words = ["python", "javascript", "typescript", "ruby", "golang"]
search = "pythn"
matches = difflib.get_close_matches(search, words, n=3, cutoff=0.6)
print(f"Did you mean: {matches}")
输出:
Did you mean: ['python']
第一个例子是在一组编程语言中找到与“pythn”最接近的匹配项。
第二个例子展示了“typescript”的近似匹配既包含“typescript”也包含“javascript”。
search = "typescript"
matches = difflib.get_close_matches(search, words)
print(f"Matches: {matches}")
输出:
['typescript', 'javascript']
这种方法对于命令行工具、搜索功能,或者任何需要处理拼写错误或近似匹配的场景都非常有用。
- uuid.uuid4() —— 轻松生成全局唯一ID
如果你需要生成唯一标识符,又不想配置数据库或担心ID冲突,可以使用uuid模块中的相关函数。
下面的代码展示了如何生成一个随机UUID对象,可用作唯一标识符:
import uuid
# 生成一个随机UUID
random_id = uuid.uuid4()
print(f"Unique ID: {random_id}")
输出:
Unique ID: fc4c6638-9707-437b-83a1-76206b5f7191
下面的例子展示了如何将UUID嵌入文件名,以确保其唯一性:
# 以字符串形式用于文件名、数据库键等场景
filename = f"document-{uuid.uuid4()}.pdf"
print(filename)
输出:
document-b5ccbe7a-fad9-4611-8163-be1015c634b9.pdf
这些UUID(通用唯一标识符)几乎可以保证全局唯一——即使跨机器、跨时间也不会重复,非常适合用于文件、数据库条目等需要唯一性的场合。
- shutil.get_terminal_size() —— 让CLI应用自适应终端尺寸
想让你的命令行应用根据用户终端的大小自适应?get_terminal_size函数能轻松实现。
用法如下:
import shutil
columns, rows = shutil.get_terminal_size()
print(f"Your terminal is {columns} columns wide and {rows} rows tall")
# 创建一条刚好适合终端宽度的分隔线
print("-" * columns)
输出:
Your terminal is 80 columns wide and 24 rows tall
- itertools.groupby() —— 无需字典也能高效分组
需要按某个关键字对数据分组?itertools.groupby()可以高效实现。
这个例子中,我们先按部门对员工列表排序(groupby要求先排序),然后按部门分组打印每位员工。
from itertools import groupby
from operator import itemgetter
# 示例数据: (姓名, 部门)
employees = [
("Alice", "Engineering"),
("Bob", "Marketing"),
("Charlie", "Engineering"),
("Diana", "HR"),
("Evan", "Marketing"),
]
# 先按部门排序
employees.sort(key=itemgetter(1))
# 按部门分组
for department, group in groupby(employees, key=itemgetter(1)):
print(f"\n{department} Department:")
for name, _ in group:
print(f" - {name}")
输出:
Engineering Department:
- Alice
- Charlie
HR Department:
- Diana
Marketing Department:
- Bob
- Evan
- collections.ChainMap —— 无需合并也能多字典查找
需要在多个字典中查找数据?ChainMap让你无需真正合并字典就能按顺序依次查找。
注意:它不是函数,而是collections模块中非常实用的一个类。
实际用例如下:
from collections import ChainMap
defaults = {"theme": "dark", "language": "en", "timeout": 30}
user_settings = {"theme": "light"}
session_settings = {"timeout": 60}
# 创建多个字典的组合视图
settings = ChainMap(session_settings, user_settings, defaults)
print(settings["theme"])
print(settings["language"])
print(settings["timeout"])
输出:
light
en
60
这创建了一个多字典的视图,依次查找各字典中的值,展示了如何按不同来源优先级检索设置项。
- os.path.commonpath() —— 轻松找出公共目录路径
是否曾需要找出多个文件路径的共同目录?os模块中的path.commonpath函数正好能做到这一点。
下面的代码能找出一组文件路径的最长公共目录,非常适合用于查找一组文件的基准目录:
import os.path
paths = [
"/home/user/documents/work/report.pdf",
"/home/user/documents/personal/taxes.xlsx",
"/home/user/documents/work/presentation.pptx"
]
common = os.path.commonpath(paths)
print(f"Common directory: {common}")
输出:
Common directory: /home/user/documents
如上所示,这个函数在查找一组文件的公共根目录、构建相对路径等任务时非常实用。
结语
正如我们所见,Python标准库包含了许多专用函数,虽然不常用,但在特定场景下能提供非常优雅的解决方案。
下次你为某个常见问题编写复杂函数时,不妨先查查标准库,或许已经有了现成的解决办法!
你最喜欢的Python标准库里的冷门函数是什么?欢迎在评论区留言,我会在未来的文章中整理更多实用函数。祝你编程愉快!
相关推荐
- js获取上传文件类型以及大小的方法
-
前端web上传文件时,需要在上传之前判断一下文件的类型以及文件的大小,HTML为前端的标记语言是无法做到这一点,只能使用javascript动态脚本代码来实现。js获取上传文件大小的方法示例代码:&...
- 资源分享:移动设备类型判断JS(什么叫移动设备)
-
相信很多童鞋在实际开发中都会遇到需要判断设备类型来进行不同页面跳转处理,例如手机端访问移动页面,pc端访问pc页面亦或是ios和安卓扫描同一个二维码跳转至不同的下载页面。有这样一种做法当然了你可以使用...
- JS学习笔记:三、数据类型(js六中数据类型)
-
上节知识点回顾:1.什么是变量2.变量的声明3.一次性声明多个变量并赋值4.变量名的规范5.变量的使用本讲内容:数据类型1.数据类型分类原始类型(基本类型)+引用类型原始类型:数字、字符串、布尔类...
- JavaScript中常用数据类型,你知道几个?
-
本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注!作者|慕课网精英讲师Lison这篇文章我们了解一下JavaScript中现有的八个数据类型,当然这并不是JavaScr...
- JS自有类型系统的问题区分竟如此简单?
-
嗨,我是勾勾。今天想要和你分享的是如何区分强弱类型与JS自有类型系统的问题。类型系统的区分我们在区分不同编程语言时会有一些界定的标准。通常来讲,我们会从类型安全和类型检查上进行区分。类型安全强类型弱类...
- 抛弃 typeof,这样判断 JavaScript 类型更准确
-
JavaScript作为一门动态类型语言,类型判断一直是开发者面临的常见挑战。众所周知,typeof操作符存在诸多局限性,无法准确区分数组、对象、null等类型。那么,有没有更精确、更优雅的类型判断方...
- 有哪些好玩的 Python 代码?(python有什么好玩的项目)
-
Python是一门非常强大且灵活的编程语言,它不仅可以用来编写复杂的软件应用,还能用来创造一些有趣的小程序和游戏。以下是一些好玩的Python代码示例,涵盖了基础语法、字符串处理、图形绘制等多个...
- Python统计快乐8的两码组合数据随机新的两码三码
-
我们利用Python统计出快乐8的两码组合数据,来生成新的快乐8选二,选三等组合fromcollectionsimportCounterimportrandom#输入新的快乐8两码统计...
- 10 个鲜为人知的 Python 可视化概念和技巧
-
数据可视化可视化是我们以各种可视化形式描述数据的操作,从图表、图形到信息图形。它是探索性数据分析(EDA)中最重要的部分之一,因为它使我们能够轻松掌握变量之间的关系以及对后期特征工程和建模有用的数...
- 用Python搞个随机简单的迷宫(python做迷宫)
-
为了增加一点趣味打发鼓噪的情绪,玩个简单的迷宫,方便以后搞游戏迷宫。堵路的就简单用#符号吧,如果弄成界面的话可以用图片来,比图墙的图片。因为是随机的,不是固定的一个迷宫,我们少不了random模块...
- 面试干货——某度Python面试题,转发收藏
-
目录1、Python是如何进行内存管理的?2、什么是lambda函数?它有什么好处?3、Python里面如何实现tuple和list的转换?4、请写出一段Python代码实现删除一个list里面的重复...
- Python while循环深度解析:从基础到实战,一文全掌握!
-
一、循环的本质:重复执行的魔法在编程世界中,循环是实现自动化的核心工具。想象你需要重复做100次相同的事情,手动编写100次代码显然不现实。这时候,循环就像一位不知疲倦的助手,帮你完成重复性任务。Py...
- 如何在 Python 中随机排列列表元素
-
在本教程中,我们将学习在Python中如何打乱列表元素顺序,随机排列列表元素。如何随机排列列表是一项非常有用的技能。它在开发需要选择随机结果游戏中非常有用。它还适用于数据相关的工作中,可能需要提取...
- Python快速入门教程7:循环语句(python循环语句有哪些)
-
一、循环语句简介循环语句用于重复执行一段代码块,直到满足特定条件为止。Python支持两种主要的循环结构:for循环和while循环。二、for循环基本语法for循环用于遍历序列(如列表、元组、字符串...
- 用Python进行机器学习(6)随机森林
-
上一节我们讲到了决策树这个算法,但是一棵决策树可能会存在过拟合的现象,而且对数据微小的变化也比较敏感,为了解决这些问题,我们可以通过多棵树的方式,也就是今天要介绍的随机森林。随机森林算法也就是Rand...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- hive行转列函数 (63)
- sourcemap文件是什么 (54)
- display none 隐藏后怎么显示 (56)
- 共享锁和排他锁的区别 (51)
- httpservletrequest 获取参数 (64)
- jstl包 (64)
- qsharedmemory (50)
- watch computed (53)
- java中switch (68)
- date.now (55)
- git-bash (56)
- 盒子垂直居中 (68)
- npm是什么命令 (62)
- python中+=代表什么 (70)
- fsimage (51)
- nginx break (61)
- mysql分区表的优缺点 (53)
- centos7切换到图形界面 (55)
- 前端深拷贝 (62)
- kmp模式匹配算法 (57)
- jsjson字符串转json对象 (53)
- jdbc connection (61)
- javascript字符串转换为数字 (54)
- mybatis 使用 (73)
- 安装mysql数据库 (55)