
你是否曾经编写过一个循环,检查字典中是否存在键,然后再向其中添加值?而不是这样写:
word_counts = {}words = ["apple", "banana", "apple", "orange", "banana", "banana"]for word in words: if word not in word_counts: word_counts[word] = 0 word_counts[word] += 1你可以使用 collections.defaultdict 来简化这个操作:
from collections import defaultdictword_counts = defaultdict(int)words = ["apple", "banana", "apple", "orange", "banana", "banana"]for word in words: word_counts[word] += 1为什么这很强大去除了手动检查键存在性的需求。简化代码复杂性,使其更易于阅读。自动处理缺失值,无需额外逻辑。用例:日志聚合: 轻松统计系统日志中日志级别的出现次数。数据分组: 在不手动初始化列表的情况下,将项目列表存储在键下。动态对象创建: 在解析 JSON 时自动填充嵌套字典。2. 一行代码的禅意:超越基础的列表推导式
Python 的列表推导式功能强大,但它们不仅仅可以用来创建列表。看看这个:
展平嵌套列表:nested = [[1, 2, 3], [4, 5], [6, 7, 8]]flattened = [num for sublist in nested for num in sublist]print(flattened) # [1, 2, 3, 4, 5, 6, 7, 8]过滤映射words = ["hello", "world", "Python", "is", "awesome"]capitalized_long_words = [word.upper() for word in words if len(word) > 5]print(capitalized_long_words) # ['PYTHON', 'AWESOME']为什么这很强大通过将过滤和转换合并为一步,加快数据处理速度。使代码更易读、更简洁。比传统循环提高性能。用例:数据清洗: 快速过滤和转换大型数据集。JSON 处理: 轻松从 API 响应中提取和格式化值。机器学习管道: 准备数据集,进行特征选择和转换。3. 数据类技巧:不仅用于存储数据@dataclass 装饰器通常用于简单的数据存储,但你是否知道它还可以简化 API 设计?比较以下传统类:
class User: def __init__(self, name, age): self.name = name self.age = ageuser = User("Alice", 30)与一个 dataclass:
from dataclasses import dataclass@dataclassclass User: name: str age: intuser = User("Alice", 30)自动生成方法数据类自动提供 __init__、__repr__ 以及比较方法,因此可以立即使用:
user1 = User("Alice", 30)user2 = User("Alice", 30)print(user1 == user2) # True为什么这很强大消除了样板代码,使类更容易维护。提供自动数据验证,带有类型提示。默认使对象可比较。用例:配置管理: 将应用程序设置存储在结构化对象中。API 响应处理: 轻松将 JSON 反序列化为 Python 对象。数据科学模型: 简洁地表示结构化数据集。4. 文件之外的上下文管理器你可能已经使用过 with open() 来处理文件,但你是否知道你可以创建自己的上下文管理器?它们可以用来管理数据库连接、时间执行等!
示例:代码执行计时import timefrom contextlib import contextmanager@contextmanagerdef timer(): start = time.time() yield end = time.time() print(f"Execution time: {end - start:.4f} seconds")with timer(): time.sleep(1)为什么这很强大确保执行后正确清理资源。通过移除手动 try-finally 块提高可读性。有助于调试性能瓶颈。用例:资源管理: 自动关闭数据库连接。性能监控: 测量代码块的执行时间。线程安全: 管理多线程应用程序中的锁。自定义日志: 自动记录函数执行时间。5. 为您代劳的魔法方法双下划线(dunder)方法让您定义对象的行为。以下是三个必须了解的方法:
__getitem__:使对象可索引class MyList: def __init__(self, items): self.items = items def __getitem__(self, index): return self.items[index]my_list = MyList([1, 2, 3])print(my_list[1]) # 2__call__:将对象转换为函数class Greeter: def __call__(self, name): return f"Hello, {name}!"greet = Greeter()print(greet("Alice")) # Hello, Alice!__slots__:节省内存如果您的类具有固定属性集,__slots__ 可以节省内存:
class User: __slots__ = ["name", "age"] def __init__(self, name, age): self.name = name self.age = age这为什么强大允许对象表现得像内置的 Python 结构。减少了大型应用程序中的内存开销。使对象与运算符进行直观交互。用例:自定义数据结构: 实现高效、专业的对象。减少开销: 优化性能关键应用中的内存使用。运算符重载: 定义对象与内置 Python 操作之间的交互方式。改进调试: 为对象字符串表示形式自定义,以便于更轻松地记录日志。总结这些 Python 技巧一开始可能看起来像是魔法,但它们只是编写更好代码的聪明方法。无论您是在简化字典使用 defaultdict,创建自定义的 with 语句,还是使用 dataclass 来减少样板代码,这些技术都会使您成为一个更高效的 Python 程序员。