

各位程序员朋友们,你是否也曾为下面这些场景感到头疼?
"attachment_" 前缀?pip install tomli 安装一个外部库?如果你还在用“老办法”解决这些问题,那么今天这篇文就是为你准备的!Python 在 3.9 到 3.12 版本的迭代中,悄悄塞进了许多“开箱即用”的新内置函数和模块,专治各种代码中的“重复造轮子”和“繁琐操作”。
让我们一起来看看,如何用这些现代 Python 特性,优雅地“偷懒”,让代码更简洁、更高效。
字符串处理是日常编程的基石。以前,如果想去掉字符串特定的前缀或后缀,我们得用 str.startswith()/str.endswith() 判断,然后切片,或者用 str.lstrip()/str.rstrip(),但它们可能误伤无辜字符。
Python 3.9 带来了精准的“外科手术刀”:
str.removeprefix() & str.removesuffix()这两个函数的功能正如其名:仅当字符串以指定前缀/后缀开头/结尾时,才将其移除,否则返回原字符串。简单、安全、意图明确。
# 告别繁琐的切片和条件判断filename = "2023_report_final.pdf"user_input = "admin_"# 旧方法:需要判断再切片if filename.startswith("2023_"): clean_name = filename[5:]print(clean_name) # 输出: report_final.pdf# 新方法:一行搞定,意图清晰clean_name = filename.removeprefix("2023_")print(clean_name) # 输出: report_final.pdf# 更安全的例子path = "project/utils.py"print(path.removesuffix(".txt")) # 后缀不匹配,返回原字符串: project/utils.pyprint(path.removesuffix(".py")) # 后缀匹配,成功移除: project/utils这就像给你的代码工具箱里添了一把精准的剪刀,不再需要先用眼睛瞄,再用普通剪刀估摸着剪了。
Python 的 math 和 statistics 模块一直在扩充,将很多常用的计算函数直接内置,性能经过高度优化,比自己手写循环要快得多。
**math.dist(p, q)**:计算两点间的欧氏距离。支持任意维度,比自己写 sqrt(sum((px-qx)**2 ...)) 更优雅、更不易出错。 **math.comb(n, k) & math.perm(n, k)**:快速计算组合数 C(n, k) 和排列数 A(n, k)。在算法、概率统计场景下非常实用。
import math# 1. 几何距离计算point_a = (1, 2, 3)point_b = (4, 5, 6)distance = math.dist(point_a, point_b)print(f"三维空间两点距离: {distance:.2f}") # 输出: 5.20# 2. 组合数学# 从5个不同的球中取出3个,有多少种取法?ways_to_choose = math.comb(5, 3)print(f"组合数 C(5,3) = {ways_to_choose}") # 输出: 10# 将3面不同的旗子按顺序插在5个孔里,有多少种插法?ways_to_arrange = math.perm(5, 3)print(f"排列数 A(5,3) = {ways_to_arrange}") # 输出: 60statistics 模块新增了 correlation, covariance, linear_regression 等函数,基础数据分析几乎不用依赖 numpy 了。
import statistics# 计算两组数据的相关系数和协方差x = [1, 2, 3, 4, 5]y = [2, 4, 5, 4, 5]corr = statistics.correlation(x, y)covar = statistics.covariance(x, y)print(f"相关系数: {corr:.3f}") # 输出: 0.775print(f"协方差: {covar:.3f}") # 输出: 1.25# 甚至可以进行简单的线性回归slope, intercept = statistics.linear_regression(x, y)print(f"回归方程: y = {slope:.2f}x + {intercept:.2f}")# 输出: y = 0.70x + 1.70对于轻量级的数据分析或脚本任务,这些内置函数能让你摆脱对庞大科学计算库的依赖,快速得出结果。
处理时间时,最让人混乱的就是时区。过去常用 pytz,但它有一些历史包袱。Python 3.9 将 zoneinfo 模块纳入标准库,基于系统的 IANA 时区数据库,用法更现代、直观。
from datetime import datetime, timezonefrom zoneinfo import ZoneInfo # Python 3.9+# 创建一个具有特定时区的时间beijing_time = datetime(2023, 10, 1, 10, 0, tzinfo=ZoneInfo("Asia/Shanghai"))print(f"北京时间: {beijing_time}")# 轻松进行时区转换new_york_time = beijing_time.astimezone(ZoneInfo("America/New_York"))print(f"对应的纽约时间: {new_york_time}")# 获取当前UTC时间,并转换为本地时区utc_now = datetime.now(timezone.utc)local_now = utc_now.astimezone() # 不传参数,转换为系统本地时区print(f"本地时间: {local_now}")hashlib 模块在 3.11 中新增了用纯Python实现的 blake2b 和 blake2s 哈希算法。这意味着在某些环境下(如禁用C扩展),你仍然可以使用这些安全的哈希函数。
import hashlibdata = b"Hello, Modern Python!"# 使用新的纯Python实现的BLAKE2进行哈希hash_obj = hashlib.blake2b(data, digest_size=32)print(f"BLAKE2b 哈希值: {hash_obj.hexdigest()}")TOML 因其清晰的语义,正在迅速取代 INI 和 YAML,成为项目配置(如 pyproject.toml)的新宠。Python 3.11 将 tomllib 模块加入标准库,让你无需任何外部依赖即可解析 TOML。
假设我们有一个 config.toml 文件:
[database]host = "localhost"port = 5432name = "mydb"[server]debug = trueallowed_hosts = ["127.0.0.1", "192.168.1.1"]解析它变得轻而易举:
import tomllib # Python 3.11+with open("config.toml", "rb") as f: # 注意:必须以二进制模式打开 config = tomllib.load(f)print(f"数据库主机:{config['database']['host']}")print(f"调试模式?{config['server']['debug']}")print(f"允许的主机列表:{config['server']['allowed_hosts']}")# 如果你想生成TOML,仍需要安装 `tomli-w` 或 `tomlkit` 等库。这意味着你的下一个项目,从第一天起就可以用上标准的 pyproject.toml 来管理元数据和工具配置,而不用担心环境依赖问题。
从 Python 3.9 到 3.12,每一次更新都围绕着让常见任务更简单、让代码更健壮、让性能更优的目标。我们今天看到的这些新函数和模块,只是冰山一角,但无疑是最实用、最能立刻提升开发体验的部分。
简单总结一下:
str.removeprefix() / removesuffix() 让字符串修剪精准无误。math.dist(), comb(), perm() 以及 statistics 的增强,让基础数学计算和数据分析“自带轮子”。zoneinfo 让时区处理标准化、现代化。tomllib 让 TOML 配置解析成为语言原生能力。技术的进步,就是为了让我们能把精力集中在真正的业务逻辑和创新上,而不是反复解决那些已被完美解决的通用问题。
你已经在用 Python 3.9+ 的哪个版本了?上述新功能中,哪个最让你觉得“早就该有了”?或者你有其他私藏的、能极大提升效率的 Python “偷懒”技巧?
欢迎在评论区分享你的想法和实践经验! 让我们一起交流,共同解锁更高效的 Python 编程姿势。


长按👇关注- 数据STUDIO -设为星标,干货速递
