Python3 实用新特性速览:从 f-strings 到 Data Classes

Oliver
Oliver
发布时间:2026-10-12| 4人浏览过
原创

本文梳理了 Python3 中提升开发效率的关键新特性,涵盖 3.0 至 3.7+ 版本。重点解析 f-strings 字符串格式化、Pathlib 路径处理、Type Hinting 类型提示、Enum 枚举类、lru_cache 缓存装饰器、扩展迭代解包及 Data Classes 数据类。通过对比 Python2 与 Python3 的代码差异,帮助开发者写出更简洁、直观且高性能的现代 Python 代码。

概述

随着 2020 年 Python 2 官方维护期的结束,大量项目已迁移至 Python 3。然而在实际开发中,许多开发者仍沿用 Python 2 的思维模式编写 Python 3 代码。本文旨在总结 Python 3 中更便捷的新特性,帮助读者提高编码效率。

f-strings (3.6+)

在 Python 中,我们常使用 format 函数进行字符串格式化,例如:

user = "Jane Doe"action = "buy"log_message = 'User {} has logged in and did an action {}.'.format(
 user,
 action)print(log_message)输出:User Jane Doe has logged in and did an action buy.

Python 3 提供了一种更灵活便捷的字符串格式化方式——f-strings。上述代码可改写为:

user = "Jane Doe"action = "buy"log_message = f'User {user} has logged in and did an action {action}.'print(log_message)输出: User Jane Doe has logged in and did an action buy.

Pathlib (3.4+)

f-strings 虽然便捷,但对于文件路径处理,Python 提供了更专业的解决方案。Pathlib 是 Python 3 中用于处理文件路径的库,示例如下:

from pathlib import Pathroot = Path('post_sub_folder')print(root)输出结果: post_sub_folder
path = root / 'happy_user'# 输出绝对路劲print(path.resolve())输出结果:/root/post_sub_folder/happy_user

Type hinting (3.5+)

静态类型与动态类型是软件工程中的热点话题,观点各异。作为动态类型语言,Python 3 引入了 Type hinting(类型提示)功能,例如:

def sentence_has_animal(sentence: str) -> bool:
 return "animal" in sentence
sentence_has_animal("Donald had a farm without animals")# True

Enumerations (3.4+)

Python 3 提供的 Enum 类使得枚举类型的实现变得简单,例如:

from enum import Enum, autoclass Monster(Enum):
  ZOMBIE = auto()
  WARRIOR = auto()
  BEAR = auto()print(Monster.ZOMBIE)输出: Monster.ZOMBIE

此外,Python 3 的 Enum 还支持比较操作和迭代遍历。

for monster in Monster:
  print(monster)输出: Monster.ZOMBIE   Monster.WARRIOR   Monster.BEAR

Built-in LRU cache (3.2+)

缓存是现代软件开发的常见技术。Python 3 提供了 lru_cache 装饰器以优化缓存使用,实例如下:

import timedef fib(number: int) -> int:
  if number == 0: return 0
  if number == 1: return 1
  return fib(number-1) + fib(number-2)start = time.time()fib(40)print(f'Duration: {time.time() - start}s')# Duration: 30.684099674224854s

利用 lru_cache 可优化上述代码,显著降低执行时间。

from functools import lru_cache@lru_cache(maxsize=512)def fib_memoization(number: int) -> int:
  if number == 0: return 0
  if number == 1: return 1
  return fib_memoization(number-1) + fib_memoization(number-2)start = time.time()fib_memoization(40)print(f'Duration: {time.time() - start}s')# Duration: 6.866455078125e-05s

Extended iterable unpacking (3.0+)

代码如下:

head, *body, tail = range(5)print(head, body, tail)输出: 0 [1, 2, 3] 4py, filename, *cmds = "python3.7 script.py -n 5 -l 15".split()print(py)print(filename)print(cmds)输出:python3.7
   script.py   ['-n', '5', '-l', '15']first, _, third, *_ = range(10)print(first, third)输出: 0 2

Data classes (3.7+)

Python 3 提供的 dataclass 装饰器简化了数据对象的处理,无需手动实现 __init__() 和 __repr__() 方法。假设原有代码如下:

class Armor:
  def __init__(self, armor: float, description: str, level: int = 1):
    self.armor = armor    self.level = level    self.description = description  def power(self) -> float:
    return self.armor * self.level
armor = Armor(5.2, "Common armor.", 2)armor.power()# 10.4print(armor)# <__main__.Armor object at 0x7fc4800e2cf8>

使用 dataclass 实现相同功能的代码可简化为:

from dataclasses import dataclass@dataclassclass Armor:
  armor: float
  description: str
  level: int = 1
  def power(self) -> float:
    return self.armor * self.level
armor = Armor(5.2, "Common armor.", 2)armor.power()# 10.4print(armor)# Armor(armor=5.2, description='Common armor.', level=2)

Implicit namespace packages (3.3+)

通常,Python 通过打包代码(在目录中添加 __init__.py)来实现复用,官方示例如下:

sound/             Top-level package
   __init__.py        Initialize the sound package
   formats/         Subpackage for file format conversions
       __init__.py
       wavread.py
       wavwrite.py
       aiffread.py
       aiffwrite.py
       auread.py
       auwrite.py       ...
   effects/         Subpackage for sound effects
       __init__.py
       echo.py
       surround.py
       reverse.py       ...
   filters/         Subpackage for filters
       __init__.py
       equalizer.py
       vocoder.py
       karaoke.py

在 Python 2 中,上述目录结构下的每个子目录都必须包含 __init__.py 文件,以便其他模块调用其中的 Python 代码。而在 Python 3 中,通过 Implicit Namespace Packages(隐式命名空间包),可以省略 __init__.py 文件。

sound/             Top-level package
   __init__.py        Initialize the sound package
   formats/         Subpackage for file format conversions
       wavread.py
       wavwrite.py
       aiffread.py
       aiffwrite.py
       auread.py
       auwrite.py       ...
   effects/         Subpackage for sound effects
       echo.py
       surround.py
       reverse.py       ...
   filters/         Subpackage for filters
       equalizer.py
       vocoder.py
       karaoke.py

结语

受限于篇幅,本文仅列举了部分 Python 3 的新功能。希望读者能学以致用,编写出更清晰、直观的代码。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。