迭代器的优势
迭代器是Python的核心概念,能提高数据处理效率。使用迭代器可以节省内存,适合处理大数据。
# 列表方式 - 一次性加载所有数据
numbers = [x for x in range(1000000)]
# 生成器方式 - 按需生成
numbers = (x for x in range(1000000))
迭代器基本概念
理解迭代器协议。
my_list = [1, 2, 3]
iterator = iter(my_list)
print(next(iterator)) # 1
print(next(iterator)) # 2
print(next(iterator)) # 3
# print(next(iterator)) # StopIteration
自定义迭代器
实现__iter__和__next__方法。
classMyIterator:
def__init__(self, start, end):
self.current = start
self.end = end
def__iter__(self):
return self
def__next__(self):
if self.current >= self.end:
raise StopIteration
value = self.current
self.current += 1
return value
for num in MyIterator(0, 5):
print(num)
生成器函数
使用yield创建生成器。
deffibonacci(n):
a, b = 0, 1
for _ in range(n):
yield a
a, b = b, a + b
for num in fibonacci(10):
print(num)
生成器表达式
简洁的生成器创建方式。
# 生成器表达式
squares = (x ** 2for x in range(10))
# 列表推导式对比
squares_list = [x ** 2for x in range(10)]
# 生成器节省内存
import sys
print(sys.getsizeof(squares)) # 约100字节
print(sys.getsizeof(squares_list)) # 约900字节
无限生成器
生成无限序列。
definfinite_counter():
count = 0
whileTrue:
yield count
count += 1
counter = infinite_counter()
for _ in range(5):
print(next(counter))
迭代器链
多个迭代器可以组合使用。
defeven_numbers(n):
return (x for x in range(n) if x % 2 == 0)
defsquare_numbers(numbers):
return (x ** 2for x in numbers)
result = square_numbers(even_numbers(10))
for num in result:
print(num)
实战案例:处理大型CSV文件
用生成器处理超大文件。
defread_large_file(filepath):
with open(filepath, 'r') as f:
for line in f:
yield line.strip().split(',')
deffilter_rows(rows, condition):
for row in rows:
if condition(row):
yield row
rows = read_large_file('large_data.csv')
filtered = filter_rows(rows, lambda r: float(r[2]) > 1000)
for row in filtered:
print(row)
itertools模块实战
强大的迭代工具库。
import itertools
# 无限迭代器
counter = itertools.count(start=1, step=2)
# 循环迭代器
cycle = itertools.cycle(['A', 'B', 'C'])
# 重复迭代器
repeat = itertools.repeat(10, times=3)
# 组合迭代器
product = itertools.product([1, 2], ['a', 'b'])
总结
生成器和迭代器是Python处理大数据的实用工具,掌握它们能提高代码效率。