Python迭代器与生成器:从入门到精通的完全指南
本文将用最通俗易懂的方式讲解Python迭代器和生成器的核心概念,通过大量实例帮你彻底掌握这两个重要的Python特性。1. 引言:为什么要学迭代器和生成器?想象一下,你需要处理一个包含1000万条数据的文件,如果一次性把所有数据加载到内存,你的电脑可能就卡死了。这时,迭代器和生成器就能大显身手了!它们可以逐个处理数据,大大节省内存。实际应用场景:处理大型文件(日志文件、CSV文件)读取数据库查询结果生成无限序列(斐波那契数列、素数序列)数据处理流水线异步编程2. 前置知识:什么是可迭代对象?在深入迭代器之前,先理解可迭代对象(Iterable):# 常见的可迭代对象 my_list = [1, 2, 3, 4, 5] # 列表 my_tuple = (1, 2, 3) # 元组 my_string = "Hello" # 字符串 my_dict = {"a": 1, "b": 2} # 字典 my_set = {1, 2, 3} # 集合 my_range = range(5) # range对象 # 判断是否是可迭代对象 from collections.abc import Iterable print(isinstance(my_list, Iterable)) # True print(isinstance(123, Iterable)) # False # 可迭代对象可以用for循环遍历 for item in my_list: print(item)可迭代对象的特点:可以被遍历,但不知道遍历的位置。3. 迭代器(Iterator)详解3.1 什么是迭代器?迭代器是可以记住遍历位置的对象。它从第一个元素开始访问,直到所有元素被访问完,只能前进不能后退。# 创建迭代器 my_list = [1, 2, 3, 4, 5] # 方法1:使用iter()函数 list_iterator = iter(my_list) print(type(list_iterator)) # class 'list_iterator' # 方法2:调用可迭代对象的__iter__()方法 list_iterator2 = my_list.__iter__() # 使用next()获取下一个元素 print(next(list_iterator)) # 1 print(next(list_iterator)) # 2 print(next(list_iterator)) # 3 print(next(list_iterator)) # 4 print(next(list_iterator)) # 5 # print(next(list_iterator)) # ❌ StopIteration异常3.2 迭代器协议迭代器必须实现两个方法:__iter__():返回迭代器自身__next__():返回下一个元素,没有元素时抛出StopIteration异常# 手动实现一个迭代器 class MyCounter: """自定义计数器迭代器""" def __init__(self, start, end): self.current = start self.end = end def __iter__(self): # 返回迭代器自身 return self def __next__(self): if self.current = self.end: result = self.current self.current += 1 return result else: # 遍历结束时抛出StopIteration raise StopIteration # 使用自定义迭代器 counter = MyCounter(1, 5) print("逐个获取元素:") print(next(counter)) # 1 print(next(counter)) # 2 print(next(counter)) # 3 print("\n使用for循环:") # 注意:这里从4开始,因为上面已经消耗了3个元素 for num in counter: print(num) # 4, 5 # 重新创建迭代器 counter2 = MyCounter(1, 3) print("\n转换为列表:") print(list(counter2)) # [1, 2, 3]3.3 迭代器的内部工作原理# 模拟for循环的工作原理 def my_for_loop(iterable): """手动模拟for循环的内部机制""" iterator = iter(iterable) # 获取迭代器 while True: try: item = next(iterator) # 获取下一个元素 print(f"处理元素: {item}") except StopIteration: break # 遍历结束 # 测试 my_for_loop([10, 20, 30]) # 输出: # 处理元素: 10 # 处理元素: 20 # 处理元素: 303.4 实用迭代器示例# 示例1:文件读取迭代器 class FileReader: """逐行读取文件的迭代器""" def __init__(self, filename): self.filename = filename self.file = None def __iter__(self): self.file = open(self.filename, 'r', encoding='utf-8') return self def __next__(self): line = self.file.readline() if line: return line.strip() else: self.file.close() raise StopIteration def __del__(self): if self.file and not self.file.closed: self.file.close() # 使用文件读取迭代器 print("文件读取迭代器示例:") reader = FileReader("data.txt") # 假设有这个文件 for i, line in enumerate(reader, 1): print(f"第{i}行: {line}") if i = 5: # 只读取前5行 break # 示例2:无限序列迭代器 class FibonacciIterator: """斐波那契数列迭代器""" def __init__(self, max_count=10): self.max_count = max_count self.count = 0 self.a, self.b = 0, 1 def __iter__(self): return self def __next__(self): if self.count = self.max_count: raise StopIteration result = self.a self.a, self.b = self.b, self.a + self.b self.count += 1 return result print("\n斐波那契数列:") fib = FibonacciIterator(10) for num in fib: print(num, end=" ") # 0 1 1 2 3 5 8 13 21 34 print()4. 生成器(Generator)详解4.1 什么是生成器?生成器是特殊的迭代器,但更简单、更优雅。它使用yield语句而不是__next__()方法。# 生成器函数 vs 普通函数 def normal_function(): """普通函数:一次性返回所有结果""" result = [] for i in range(5): result.append(i) return result # 一次性返回列表 def generator_function(): """生成器函数:逐个返回结果""" for i in range(5): yield i # 使用yield而不是return print(f"继续执行,i={i}") # yield之后会暂停,下次从这继续 # 对比使用 print("普通函数结果:", normal_function()) # [0, 1, 2, 3, 4] print("\n生成器函数:") gen = generator_function() # 创建生成器对象 print(type(gen)) # class 'generator' # 逐个获取值 print(next(gen)) # 0 print(next(gen)) # 1 (会打印"继续执行,i=0") print(next(gen)) # 2 (会打印"继续执行,i=1") # 使用for循环获取剩余值 fo
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2480327.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!