上一篇
Python迭代器应用场景详解 - 实例教程
- Python
- 2025-08-10
- 930
Python迭代器5大应用场景与实例解析
迭代器是Python中高效处理数据流的核心工具,它通过惰性计算实现内存优化。本文将深入探讨迭代器的实际应用场景,并通过具体代码示例展示其强大功能。
场景一:大数据文件处理
当处理GB级日志文件时,迭代器可避免内存溢出:
def read_large_file(file_path):
with open(file_path, 'r') as file:
for line in file:
yield line.strip()
# 使用示例
log_parser = read_large_file('server.log')
for entry in log_parser:
if 'ERROR' in entry:
process_error(entry) # 逐行处理
关键优势:仅单行数据加载到内存,支持无限大文件处理
场景二:无限序列生成
生成无限序列而无需预先生成所有元素:
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
fib_gen = fibonacci()
print(next(fib_gen)) # 0
print(next(fib_gen)) # 1
print(next(fib_gen)) # 1
# 可无限次调用next()
适用场景:数学序列、实时数据流、轮询操作
场景三:自定义对象迭代
在类中实现__iter__和__next__方法:
class Inventory:
def __init__(self, products):
self.products = products
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index >= len(self.products):
raise StopIteration
result = self.products[self.index]
self.index += 1
return result
# 使用示例
store = Inventory(['apple', 'banana', 'orange'])
for item in store:
print(f"Checking: {item}")
输出顺序:Checking: apple → Checking: banana → Checking: orange
场景四:管道式数据处理
组合多个迭代器构建数据处理管道:
def filter_positive(numbers):
for n in numbers:
if n > 0:
yield n
def square(numbers):
for n in numbers:
yield n ** 2
# 构建处理管道
data = [-2, 5, 0, 13, -8]
pipeline = square(filter_positive(data))
print(list(pipeline)) # [25, 169]
内存效率:每个元素依次通过整个管道,避免中间列表存储
场景五:数据库分批查询
处理海量数据库记录的核心模式:
import psycopg2
def batch_query(query, batch_size=1000):
conn = psycopg2.connect(DATABASE_URL)
cursor = conn.cursor()
cursor.execute(query)
while True:
records = cursor.fetchmany(batch_size)
if not records:
break
yield from records
# 使用示例
user_generator = batch_query("SELECT * FROM users")
for user in user_generator:
process_user(user) # 处理每个用户对象
优势:控制内存占用,避免单次查询返回百万级结果
迭代器最佳实践总结
- 大数据处理:替代列表避免内存溢出
- 延迟计算:需要时生成元素,提升性能
- 通用接口:统一访问集合、文件、数据库等数据源
- 组合使用:通过itertools模块强化功能
- 资源优化:显式控制大型资源的加载过程
掌握迭代器将显著提升代码性能和可维护性,特别在数据处理和算法领域效果显著。
本文由FangShe于2025-08-10发表在吾爱品聚,如有疑问,请联系我们。
本文链接:https://www.521pj.cn/20257754.html
发表评论