今天系统学习了 Python 中迭代器、生成器以及文件操作的核心知识点这些内容是 Python 进阶的重要基础尤其是迭代器和生成器的惰性计算特性在处理大数据场景时能显著优化性能下面对所学内容进行详细梳理。一、迭代器Iterator1. 核心概念可迭代对象能被for循环遍历的对象本质是实现了__iter__方法。检查是否为可迭代对象hasattr(对象, __iter__)返回True则是可迭代对象。常见可迭代对象列表、字符串、元组、自定义类实例手动实现__iter__。迭代器遵循「迭代器协议」的对象需同时满足两个条件能被iter()接收实现__iter__方法且返回自身能被next()逐步取值实现__next__方法。迭代器特性惰性计算按需生成值不一次性加载所有数据降低内存占用一次性状态只能前进遍历后会被消耗无法重复使用调用next()取值无数据时抛出StopIteration异常。2. for 循环的底层逻辑# 以遍历列表为例 names [张三,李四,王五] it iter(names) # 1. 获取可迭代对象的迭代器 while True: try: print(next(it)) # 2. 调用next()取值 except StopIteration: # 3. 捕获异常终止循环 break3. 自定义迭代器自定义迭代器有两种实现方式核心是实现__iter__和__next__方法方式 1类自身作为迭代器迭代器 可迭代对象class Person: def __init__(self, name, age): self.name name self.age age self.__index 0 self.__arr [name, age] def __iter__(self): return self # 返回自身作为迭代器 def __next__(self): if self.__index len(self.__arr): self.__index 1 return self.__arr[self.__index - 1] else: raise StopIteration # 无数据时抛异常 p1 Person(张三,18) for i in p1: print(i) # 遍历输出张三 18方式 2分离可迭代对象和迭代器更符合规范class Person: # 可迭代对象 def __init__(self, name, age): self.name name self.age age self.hobby [] def __iter__(self): return PersonIterator(self) # 返回独立的迭代器对象 class PersonIterator: # 迭代器类 def __init__(self, p): self.p p self.index 0 self.arr [p.name, p.age, p.hobby] def __iter__(self): return self def __next__(self): if self.index len(self.arr): raise StopIteration value self.arr[self.index] self.index 1 return value4. 迭代器的优势惰性计算以斐波那契数列为例对比列表生成和迭代器生成的内存占用import tracemalloc # 迭代器实现惰性计算内存占用极低 class Fib: def __init__(self,total): self.one 1 self.two 1 self.total total self.index 0 def __iter__(self): return self def __next__(self): if self.index self.total: raise StopIteration if self.index 2: self.index 1 return self.one self.three self.one self.two self.one self.two self.two self.three self.index 1 return self.three # 列表实现一次性生成所有数据内存占用高 def fib(n): num [1,1] for i in range(n): num.append(num[i]num[i1]) return num[:n] # 内存对比 tracemalloc.start() f1 Fib(80) m1 tracemalloc.get_traced_memory()[1] print(f迭代器内存占用{m1/1024/1024}MB) # 接近0MB tracemalloc.start() f2 fib(80) m1 tracemalloc.get_traced_memory()[1] print(f列表内存占用{m1/1024/1024}MB) # 远大于迭代器二、生成器Generator生成器是 Python 内置的「简化版迭代器」无需手动实现__iter__和__next__核心是yield关键字。1. 生成器函数的定义函数体中出现yield关键字该函数即为生成器函数调用生成器函数时不会立即执行函数体而是返回一个生成器对象。def test(): print(函数开始执行) yield one # 暂停并返回值 a 200 print(a) yield two res test() # 生成器对象函数未执行 print(type(res)) # class generator2. 生成器的执行逻辑调用next(生成器)或生成器.__next__()函数开始执行遇到yield暂停记录暂停位置再次调用next()从暂停位置继续执行直到再次遇到yield遇到return时抛出StopIteration异常return后的内容作为异常信息返回yield后的值会作为本次next()的返回值。res test() print(next(res)) # 执行到第一个yield输出函数开始执行 → 返回one print(next(res)) # 从暂停位置继续输出200 → 返回two # 第三次next()会抛StopIteration无更多yield3. 生成器的常用操作1for 循环遍历生成器生成器是可迭代对象可直接用for循环def car(): for i in range(3): yield f第{i1}次打印 a car() for i in a: print(i) # 输出第1次打印 第2次打印 第3次打印2yield from批量 yield 可迭代对象的元素def demo(): nums [1, 2, 3] yield from nums # 等价于for num in nums: yield num a demo() print(next(a)) # 1 print(next(a)) # 23send ()双向通信给 yield 传值next()只能取值send()可同时「传值 取值」注意第一次启动生成器需用next()或send(None)a yield 返回值右侧值返回给外部左侧接收外部send的参数。def demo(): print(函数开始执行) a yield 我是第一次返回值 # 接收send的参数 print(a,) b yield 我是第二次返回值 print(b,$$$) return hello d demo() d1 next(d) # 启动生成器返回我是第一次返回值 d2 d.send(55) # 给上一个yield传值55返回我是第二次返回值 try: d3 d.send(777) # 传值777触发return抛StopIteration except StopIteration as e: print(e) # 输出helloreturn的内容三、文件操作1. 文件分类类型编码方式示例文件读取 / 写入要求纯文本文件遵循字符编码如 utf-8.txt、.py、.md需指定编码读取为字符串二进制文件无字符编码按格式存储.mp3、.png、.doc以二进制模式b操作无需编码2. 文件路径绝对路径从文件系统根目录开始如D:\Apython\SPT2603\4.文件操作\1.文件分类.py相对路径以当前工作目录为参照如a.txt当前目录下、../b.txt上级目录。3. 文件操作流程核心步骤创建文件对象 → 操作文件 → 关闭文件推荐用with自动关闭。1读取文件文件打开模式rt文本读取默认、rb二进制读取。方法作用read(size)无参数读取全部内容有参数读取指定字符数文本/ 字节数二进制readline()读取一行size参数仅限制当前行的读取长度readlines()无参数返回所有行的列表有参数读取包含指定字符数的所有行for line in f逐行遍历文件推荐惰性读取低内存# 逐行读取最优方式 with open(a.txt, modert, encodingutf-8) as f: for line in f: print(line, end) # end避免重复换行2写入文件文件打开模式wt清空后写入文件不存在则创建xt排他性创建文件存在则报错at追加写入文件不存在则创建rt/wt读写模式需注意指针位置。# 追加写入 with open(a.txt, modeat, encodingutf-8) as f: f.write(追加的内容) # 强制刷盘跳过缓冲区立即写入文件 f.write(内容) f.flush()3文件指针seek ()调整文件读写指针位置格式f.seek(offset, whence)offset偏移量字节数whence参考点0 文件开头1 当前位置2 文件末尾文本模式twhence1/2时offset只能为 0二进制模式b无限制。with open(a.txt, modert, encodingutf-8) as f: f.seek(0, 2) # 指针移到文件末尾 f.write(在末尾追加内容)四、核心总结迭代器手动实现__iter____next__惰性计算适合大数据场景是可迭代对象的「取值工具」生成器内置迭代器通过yield简化迭代器实现支持send()双向通信代码更简洁文件操作区分文本 / 二进制文件优先用with自动关闭文件读取大文件推荐逐行遍历写入注意模式选择和缓冲区刷盘迭代器和生成器的核心价值惰性计算降低内存占用处理无限序列 / 超大文件时优势显著。