10 个看似令人困惑但却非常出色的 Python 功能!

Python 以其简洁和易读性闻名,但一些特性初看可能让人摸不着头脑。然而,一旦你掌握了它们,就会发现它们能极大地提升代码的效率和优雅度。让我们一起探索这 10 个看似复杂但能彻底改变编程体验的 Python 功能!

What Is a 'Python Environment'? (For Beginners) | by Mark Jamison | TDS  Archive | Medium

1. 海象运算符 (:=) —— 在表达式内赋值

Python 语法- 海象运算符:= - 上海-悠悠- 博客园

Python 3.8 引入的海象运算符 (:=) 允许在表达式中直接赋值,减少代码重复。

之前:

data = input("请输入内容:")
if len(data) > 5:
    print("输入内容过长!")

之后:

if (data := input("请输入内容:")) and len(data) > 5:
    print("输入内容过长!")

海象运算符让循环和条件语句更加简洁,显著提升代码可读性。

2. 生成器 —— 高效的数据流

Generators in Python | Board Infinity

生成器通过按需计算(惰性求值)实现高效数据处理,非常适合处理大型数据集。

之前(列表推导):

nums = [x**2 for x in range(1000000)]  # 占用大量内存!

生成一个 完整的列表list),所有计算结果会立即存储在内存中。

之后(生成器):

nums = (x**2 for x in range(1000000))  # 内存占用极低

生成器按需生成值,它不会立即计算所有值,极大节省内存,特别适合处理大型或无限序列。

方式 内存占用 计算速度(首次) 是否可重复使用 适用场景
列表推导式 `[x\2 for x in …]`** 高(存储所有数据) 快(预先计算) ✅ 可多次访问 需要随机访问或多次遍历
生成器表达式 `(x\2 for x in …)`** 低(惰性计算) 慢(按需计算) ❌ 只能遍历一次 只需遍历一次,节省内存

3. 循环中的 else —— 出乎意料的强大

Else in Python Loops? | Python's Gurus

Python 的 forwhile 循环支持 else 块,仅在循环未被 break 中断时执行。

示例:

for num in range(2, 10):
    for i in range(2, num):
        if num % i == 0:
            break  # 找到除数,不是素数
    else:
        print(num, "是素数")  # 仅在循环完成时运行

这种机制为检查循环是否完整执行提供了优雅的解决方案,特别适用于搜索算法。

4. collections.defaultdict —— 告别键错误

Omni Analytics Group (📈,📈) على X: "A #python #defaultdict from the  collections package extends the functionality of a standard #dictionary by  setting a default object (or “factory”) for keys not present in

collections 模块的 defaultdict 自动为缺失的键初始化值,避免 KeyError

之前:

counts = {}
counts["apple"] += 1  # KeyError: 'apple'

之后:

from collections import defaultdict
counts = defaultdict(int)
counts["apple"] += 1  # 无错误!

这简化了字典计数逻辑,减少了冗余的条件检查。

5. 函数参数解包 (args, *kwargs)

Understanding *args and *kwargs arguments in Python

Python 的 *args**kwargs 允许动态解包位置参数和关键字参数,使函数调用更加灵活。

示例:

def greet(*names, greeting="你好"):
    for name in names:
        print(f"{greeting}{name}!")

greet("小明", "小红", "小刚", greeting="嗨")

这让函数能够轻松处理可变数量的参数,提升代码的通用性。

6. 推导式 —— 不仅限于列表

List Comprehension in Python Explained for Beginners

除了广为人知的列表推导,Python 还支持集合和字典推导,代码更简洁高效。

示例:

squares = {x: x**2 for x in range(5)}  # 字典推导
unique_numbers = {x for x in [1, 2, 2, 3, 4]}  # 集合推导

推导式比传统循环更短、执行更快,适用于列表、集合和字典。

7. @property 装饰器 —— 更优雅的 Getter 和 Setter

Properties | Pydon't 🐍 | mathspp

@property 装饰器简化了只读或计算属性的定义,无需显式的 getter 方法。

之前:

class Person:
    def __init__(self, name):
        self._name = name
    
    def get_name(self):
        return self._name

p = Person(name="小明")
p.get_name()

之后:

class Person:
    def __init__(self, name):
        self._name = name
    
    @property
    def name(self):
        return self._name

p = Person(name="小明")
p.name

这让代码更符合 Python 风格,增强了可读性。

8. itertools —— 无限且高效的迭代

Python Itertools: Five Interesting Functions that you Should Know

itertools 模块提供了强大的迭代工具,适合处理大型或无限序列。

示例:

from itertools import cycle

colors = cycle(["红", "蓝", "绿"])
for _ in range(5):
    print(next(colors))  # 无限循环!

itertools 的工具(如 cyclepermutationscombinations)极大简化了复杂的迭代任务。

9. F-Strings —— 终极字符串格式化

Guide to String Formatting in Python Using F-strings | Built In

F 字符串 (f"") 比 .format()% 更简洁,执行速度也更快。

示例:

name = "小明"
age = 25
print(f"我的名字是 {name},今年 {age} 岁。")  # 简洁优雅!

F 字符串可读性强,性能优异,是字符串格式化的首选方式。

10. dataclasses —— 自动生成样板代码

Python Dataclasses | Python Central

Python 3.7+ 的 dataclass 装饰器为轻量级类自动生成 __init____repr__ 等方法,减少样板代码。

之前:

class Car:
    def __init__(self, brand, year):
        self.brand = brand
        self.year = year
    
    def __repr__(self):
        return f"Car({self.brand}, {self.year})"

之后:

from dataclasses import dataclass

@dataclass
class Car:
    brand: str
    year: int

c = Car(brand="xyz", year=2025)

dataclasses 简化了类定义,节省时间并降低出错风险。

总结

从海象运算符到数据类,这 10 个 Python 功能展现了 Python 的强大与优雅。尽管它们初看可能复杂,但一旦熟练掌握,就能显著提升你的编码效率和代码质量。