1. 迭代器 (Iterator)
1.1 什么是迭代器
迭代器是一个可以记住遍历位置的对象,它实现了迭代器协议(包含 __iter__() 和 __next__() 方法)。
1.2 创建迭代器
# 自定义迭代器类
class MyIterator:
def __init__(self, max_value):
self.max_value = max_value
self.current = 0
def __iter__(self):
return self
def __next__(self):
if self.current < self.max_value:
self.current += 1
return self.current
else:
raise StopIteration
# 使用自定义迭代器
my_iter = MyIterator(5)
for num in my_iter:
print(num) # 输出: 1 2 3 4 5
1.3 内置迭代器函数
# iter() 和 next() 函数
my_list = [1, 2, 3, 4, 5]
my_iter = iter(my_list)
print(next(my_iter)) # 输出: 1
print(next(my_iter)) # 输出: 2
print(next(my_iter)) # 输出: 3
# 手动遍历剩余元素
while True:
try:
item = next(my_iter)
print(item)
except StopIteration:
break
2. 生成器 (Generator)
2.1 什么是生成器
生成器是一种特殊的迭代器,使用 yield 关键字来返回值,可以暂停和恢复函数的执行。
2.2 创建生成器函数
def simple_generator():
yield 1
yield 2
yield 3
# 使用生成器
gen = simple_generator()
print(next(gen)) # 输出: 1
print(next(gen)) # 输出: 2
print(next(gen)) # 输出: 3
# 或者使用 for 循环
for value in simple_generator():
print(value)
2.3 实用的生成器示例
# 生成斐波那契数列
def fibonacci(limit):
a, b = 0, 1
count = 0
while count < limit:
yield a
a, b = b, a + b
count += 1
# 使用生成器
for num in fibonacci(10):
print(num, end=" ") # 输出: 0 1 1 2 3 5 8 13 21 34
# 无限计数器
def infinite_counter():
count = 0
while True:
yield count
count += 1
counter = infinite_counter()
print(next(counter)) # 输出: 0
print(next(counter)) # 输出: 1
2.4 生成器表达式
# 类似于列表推导式,但使用圆括号
squares = (x**2 for x in range(10))
print(next(squares)) # 输出: 0
print(next(squares)) # 输出: 1
# 一次性获取所有值
all_squares = list(squares)
print(all_squares) # 输出: [4, 9, 16, 25, 36, 49, 64, 81]
3. 推导式 (Comprehensions)
3.1 列表推导式
# 基本语法
squares = [x**2 for x in range(10)]
print(squares) # 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# 带条件的列表推导式
even_squares = [x**2 for x in range(10) if x % 2 == 0]
print(even_squares) # 输出: [0, 4, 16, 36, 64]
# 嵌套循环
pairs = [(x, y) for x in range(3) for y in range(3)]
print(pairs) # 输出: [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2), (2,0), (2,1), (2,2)]
3.2 字典推导式
# 创建字典
square_dict = {x: x**2 for x in range(5)}
print(square_dict) # 输出: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
# 交换键值对
original = {'a': 1, 'b': 2, 'c': 3}
swapped = {value: key for key, value in original.items()}
print(swapped) # 输出: {1: 'a', 2: 'b', 3: 'c'}
# 带条件的字典推导式
even_squares_dict = {x: x**2 for x in range(10) if x % 2 == 0}
print(even_squares_dict) # 输出: {0: 0, 2: 4, 4: 16, 6: 36, 8: 64}
3.3 集合推导式
# 创建集合(自动去重)
unique_squares = {x**2 for x in [1, 2, 2, 3, 3, 3, 4]}
print(unique_squares) # 输出: {1, 4, 9, 16}
# 带条件的集合推导式
even_unique = {x for x in range(10) if x % 2 == 0}
print(even_unique) # 输出: {0, 2, 4, 6, 8}
4. 综合应用示例
4.1 文件处理
# 使用生成器处理大文件
def read_large_file(file_path):
with open(file_path, 'r', encoding='utf-8') as file:
for line in file:
yield line.strip()
# 使用推导式处理数据
file_reader = read_large_file('data.txt')
long_lines = [line for line in file_reader if len(line) > 50]
4.2 数据处理管道
# 创建数据处理管道
def number_generator(limit):
for i in range(limit):
yield i
def filter_even(numbers):
for num in numbers:
if num % 2 == 0:
yield num
def square(numbers):
for num in numbers:
yield num ** 2
# 组合使用
pipeline = square(filter_even(number_generator(10)))
result = list(pipeline)
print(result) # 输出: [0, 4, 16, 36, 64]
4.3 内存高效的数据处理
# 使用生成器表达式节省内存
# 传统方法(占用更多内存)
data = [x**2 for x in range(1000000)] # 创建完整列表
# 生成器方法(内存高效)
data_gen = (x**2 for x in range(1000000)) # 按需生成
# 处理大数据集
def process_large_dataset():
return sum(x**2 for x in range(1000000) if x % 2 == 0)
result = process_large_dataset()
print(f"结果: {result}")
5. 关键区别和最佳实践
5.1 迭代器 vs 生成器
-
迭代器:需要实现
__iter__()和__next__()方法 -
生成器:使用
yield关键字,自动实现迭代器协议
5.2 内存使用考虑
# 列表推导式 - 立即创建完整列表
list_comp = [x**2 for x in range(1000000)] # 高内存使用
# 生成器表达式 - 按需生成值
gen_exp = (x**2 for x in range(1000000)) # 低内存使用
5.3 性能建议
-
处理大数据时优先使用生成器
-
需要多次访问数据时使用列表推导式
-
使用
yield from委托生成器 -
合理使用
itertools模块中的工具
1320

被折叠的 条评论
为什么被折叠?



