Python3 实用新特性速览:从 f-strings 到 Data Classes
本文梳理了 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 的新功能。希望读者能学以致用,编写出更清晰、直观的代码。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













