在Python开发中,掌握高级语法特性是提升代码质量与效率的关键。本文将深入剖析上下文管理器、生成器、迭代器以及正则表达式等核心概念,结合实际代码示例,帮助你在日常编程中写出更优雅、更健壮的代码。
上下文管理器:优雅的资源管理
文件操作是编程中最常见的任务之一。许多开发者习惯用open()打开文件后手动调用close(),但这样容易因异常导致资源泄漏。例如以下代码存在安全隐患:


关键问题:文件读写时可能产生IOError,一旦出错,f.close()将不会执行。传统解决方案是使用try...except...finally:

但这种方式代码冗长,容易遗忘。而上下文管理器(with语句)提供了更简洁、安全的方案:

一个类只要实现了__enter__()和__exit__()两个方法,即可成为上下文管理器。with语句执行完后会自动调用__exit__(),即使出现异常也会执行。例如自定义File类:


⚠️ 注意:__enter__()需返回操作文件对象,__exit__()负责清理资源。这种模式在C++、Java等语言中也有类似实现(如RAII、try-with-resources)。
♻️ 迭代器与生成器:高效的数据遍历
迭代器(Iterator)是Python中用于逐个访问集合元素的对象,它必须实现__iter__()和__next__()方法。例如:
"""
演示自定义迭代器
概述: 自定义的类,只要重写了__iter__()和__next__()方法, 就可以称为迭代器
目的: 惰性加载, 用的时候才会获取
"""
# 需求: 模拟range(1,6)
for i in range(1, 6):
print(i)
# 自定义迭代器
class MyIterator:
# 重写init魔法方法,初始化属性,指定范围
def __init__(self, start, end):
self.current_value = start # 当前值, 默认为开始值
self.end = end # 结束值
# 重写inter魔法方法, 返回迭代器对象本身
def __iter__(self):
return self
# 迭代方法, 返回当前值, 并更新当前值
def __next__(self):
if self.current_value >= self.end:
raise StopIteration # 抛出异常, 迭代结束
value = self.current_value # 保存当前值, 返回给调用者
self.current_value += 1 # 更新当前值
return value
for i in MyIterator(1, 6):
print(i)
而生成器(Generator)是一种更简洁的迭代器实现,它使用yield关键字按需生成数据,而非一次性加载所有数据到内存。创建生成器有两种方式:
- 生成器推导式:类似列表推导式,但使用圆括号
- yield函数:函数中包含yield关键字即为生成器
"""
生成器推导式
"""
# 创建生成器
# 注意1: 括号()代表 这是一个生成器,不是元组
# 注意2: 括号()里面写的是数据生成的规则,返回一个对象
my_generator = (i * 2 for i in range(10))
print(my_generator) # at 0x000001D4D7597A00>
# next函数获取生成器下一个值
# value = next(my_generator)
# print(value)
# 遍历生成器
for i in my_generator:
print(i)

"""
yield生成器
"""
def my_generator(n):
for i in range(n):
yield i
if __name__ == '__main__':
g= my_generator(5)
# 获取生成器的下个值
# result = next(g)
# print(result)
# 遍历生成器
# while True:
# try:
# result = next(g)
# print(result)
# except StopIteration:
# break
# 遍历生成器
# for循环内部自动处理了停止迭代异常,使用起来更加方便
for i in g:
print(i)

实战案例:在机器学习中,常需要分批喂数据给模型。使用生成器封装数据迭代器,可以优雅地实现每8个样本一批:
import math
def dataset_loader(bath_size):
# 读歌词
with open('data.txt', 'r', encoding='utf-8') as file:
lines = file.readlines()
# 总计歌词总行数
lyrics_number = len(lines)
# 计算批次数
batches_number = math.ceil(lyrics_number / bath_size)
# 遍历每批数据
for i in range(batches_number):
yield lines[i * bath_size : i * bath_size + bath_size]
if __name__ == '__main__':
for batch in dataset_loader(4):
print(batch)

相比之下,生成器比传统迭代器代码更简洁、内存更高效,特别适合处理大数据流。在TypeScript或JavaScript中,生成器通过function*实现类似功能。
️ Property属性:让方法像属性一样使用
@property装饰器允许将方法当作属性调用,简化代码。定义方式有两种:
- 装饰器方式:使用
@property和@方法名.setter - 类属性方式:
属性名 = property(获取方法, 设置方法)
"""
修饰器方式
"""
class Person:
def __init__(self, age):
self.__age = age
# 获取属性
@property
def age(self):
return self.__age
# 修改属性
@age.setter
def age(self, age):
self.__age = age
if __name__ == '__main__':
p = Person(18)
print(p.age)
p.age = 20
print(p.age)
"""
类属性方式
"""
class Person:
def __init__(self):
self.__age = 0
# 获取属性
def get_age(self):
return self.__age
# 修改属性
def set_age(self, age):
self.__age = age
# 类属性方式的property属性 (封装操作age的方法)
age = property(get_age, set_age)
if __name__ == '__main__':
p = Person()
print(p.age)
p.age = 20
print(p.age)
✅ 这种模式在Java、C++等语言中通过Getter/Setter实现,但Python的@property让代码更简洁、更Pythonic。
[AFFILIATE_SLOT_1]正则表达式:字符串处理的瑞士军刀
正则表达式(Regular Expression)是一种描述字符串匹配模式的工具。Python通过re模块支持正则,常用于:
- 数据验证:手机号、邮箱、IP地址格式校验
- 数据检索:爬虫抓取、日志分析
- 数据隐藏:如将手机号中间四位替换为*
- 数据过滤:论坛敏感词拦截

使用re.match()进行匹配的基本步骤:
- 导入模块:
import re - 匹配:
result = re.match(pattern, string) - 提取:
result.group()



匹配单个字符
正则支持多种单字符匹配模式:










匹配多个字符
使用量词控制重复次数:






匹配首尾字符
使用^和$限定开头和结尾:






匹配分组
使用括号()对匹配内容分组,方便提取:





还可以为分组命名:(?P<分组名>),并通过(?P=分组名)引用:

正则表达式在不同语言中语法基本一致,但Python的re模块提供了丰富的标志位(如re.IGNORECASE)和函数(如findall、sub),极大提升了开发效率。
总结
本文系统梳理了Python高级语法中的四大核心内容:上下文管理器让资源管理更安全;生成器与迭代器让数据遍历更高效;@property让属性访问更优雅;正则表达式让字符串处理更强大。掌握这些特性,你将能写出更简洁、更健壮的Python代码。无论是开发Web应用、数据分析脚本还是自动化工具,这些技术都会成为你工具箱中的利器。
浙公网安备 33010602011771号