上一章我们学习了 Python 模块与包,掌握了代码复用、工程化组织的核心方法。本章将学习Python 高级语法,涵盖浅拷贝与深拷贝、迭代器、生成器、命名空间与作用域、闭包、装饰器六大核心知识点,彻底掌握 Python 进阶用法,为大模型开发、复杂项目编写打下坚实基础。13.1 浅拷贝与深拷贝
Python 中数据拷贝分三种形式,核心区别在于是否独立、是否拷贝子对象。
13.1.1 浅拷贝实现
import copy# 原始列表(包含不可变类型+可变子列表)list1 = [1, 2, 3, [100, 200, 300]]# 浅拷贝list2 = copy.copy(list1)# 修改不可变元素,互不影响list1[0] = 100# 修改可变子对象,互相影响list1[3].append(400)print(list1) # [100, 2, 3, [100, 200, 300, 400]]print(list2) # [1, 2, 3, [100, 200, 300, 400]]
13.1.2 深拷贝实现
import copylist1 = [1, 2, 3, [100, 200, 300]]# 深拷贝list3 = copy.deepcopy(list1)# 修改任意元素,均互不影响list1[0] = 100list1[3].append(400)print(list1) # [100, 2, 3, [100, 200, 300, 400]]print(list3) # [1, 2, 3, [100, 200, 300]]
13.1.3 拷贝特殊情况
13.2 迭代器
迭代器是可记住遍历位置的对象,只能向前遍历,是 Python 遍历容器的核心机制。
- 可迭代对象 (Iterable):能直接用 for 循环遍历(list、tuple、str、dict 等)
- 迭代器 (Iterator):实现
__iter__()和__next__()方法的对象
from collections.abc import Iterable, Iterator# 判断可迭代对象print(isinstance([], Iterable)) # True# 判断迭代器print(isinstance(iter([]), Iterator)) # True
13.2.2 迭代器使用
# 创建迭代器lst = [1, 2, 3]it = iter(lst)# 逐个取值print(next(it)) # 1print(next(it)) # 2# for循环自动遍历迭代器for i in it: print(i)
13.2.3 自定义迭代器
class Reverse: def __init__(self, data): self.data = data self.index = len(data) def __iter__(self): return self def __next__(self): if self.index == 0: raise StopIteration self.index -= 1 return self.data[self.index]# 反向遍历rev = Reverse([1,2,3,4])for num in rev: print(num)
13.3 生成器
生成器是简化版迭代器,用yield返回值,暂停执行,按需生成数据,节省内存。
13.3.1 创建生成器
# 生成器表达式gen = (x for x in range(5))for i in gen: print(i)
# 斐波那契数列生成器def fibo(): a, b = 0, 1 while True: yield b a, b = b, a + bf = fibo()print(next(f)) # 1print(next(f)) # 1print(next(f)) # 2
13.3.2 生成器 send () 方法
向生成器发送数据,控制生成器执行逻辑:
def gen(): task_id = 0 while True: if task_id == 0: task_id = yield "数字任务" else: task_id = yield "字符任务"g = gen()next(g)print(g.send(1)) # 字符任务print(g.send(0)) # 数字任务
13.4 命名空间
命名空间是名称到对象的映射,用于避免重名冲突,Python 有三类命名空间:
- 内置命名空间:解释器启动创建,包含内置函数 / 异常
- 全局命名空间:模块加载创建,当前模块的变量 / 函数 / 类
- 局部命名空间:函数调用创建,函数内部变量,调用结束销毁
13.5 作用域
作用域是可直接访问命名空间的代码区域,Python 有四层作用域:
- 局部作用域 (Local):函数内部,优先查找
- 嵌套作用域 (Enclosing):外层闭包函数
- 全局作用域 (Global):模块层级
- 内置作用域 (Built-in):Python 内置名称
关键字说明
global:声明变量为全局作用域nonlocal:声明变量为外层嵌套作用域
13.6 闭包
闭包可以保存函数内部数据,在函数执行完毕后仍可复用,满足三个条件:
# 线性函数闭包def linear(a, b): def inner(x): return a * x + b return inner# 生成不同线性函数y1 = linear(1, 1)print(y1(5)) # 6y2 = linear(2, 3)print(y2(5)) # 13
13.7 装饰器
装饰器不修改原函数代码,动态添加功能,本质是接收函数、返回新函数的闭包。
13.7.1 基础装饰器
# 装饰器:给函数添加绝对值处理def abs_decorator(func): def inner(x): x = abs(x) return func(x) return inner# 语法糖使用装饰器@abs_decoratordef sqrt_num(x): import math return math.sqrt(x)print(sqrt_num(-4)) # 2.0
13.7.2 多层装饰器
离函数最近的装饰器先执行:
def int_decorator(func): def inner(x): x = int(x) return func(x) return inner@int_decorator@abs_decoratordef sqrt_num(x): import math return math.sqrt(x)print(sqrt_num("-9")) # 3.0
13.7.3 带参数装饰器
def repeat(n): def decorator(func): def inner(x): for _ in range(n): x = func(x) return x return inner return decorator@repeat(2)def sqrt_num(x): import math return math.sqrt(abs(x))print(sqrt_num(256)) # 2.0
13.7.4 类装饰器
实现__call__()方法的类可作为装饰器:
class AbsDecorator: def __init__(self, func): self.func = func def __call__(self, x): return self.func(abs(x))@AbsDecoratordef sqrt_num(x): import math return math.sqrt(x)print(sqrt_num(-16)) # 4.0
本章核心总结
- 拷贝
- 迭代器:实现
__iter__/__next__,惰性遍历节省内存 - 生成器:
yield暂停执行,按需生成数据,Python 高效遍历核心 - 命名空间 + 作用域:避免重名,
global/nonlocal精准控制变量 - 闭包
- 装饰器:无侵入式增强函数功能,Python 高阶编程必备
掌握本章高级语法,你的 Python 编程能力将完成从基础到进阶的跨越,轻松应对大模型开发、数据处理、框架开发等复杂场景。