当前位置:首页>python>Python 迭代器和生成器

Python 迭代器和生成器

  • 2026-10-11 08:14:42
Python 迭代器和生成器
一.迭代器
迭代器(iterator),它提供了一种遍历容器中元素的方式,而不需要暴露容器的内部结构.
__iter__():返回迭代器容器对象本身
__next__():返回容器中下一个元素,如果没有更多则抛出StopIteration异常
my_list = [1, 2, 3]my_iter = iter(my_list)  # 通过iter()函数获取迭代器print(next(my_iter))  # 输出: 1print(next(my_iter))  # 输出: 2print(next(my_iter))  # 输出: 3print(next(my_iter))  # 抛出 StopIteration 异常
二.生成器
生成器(Generator)它允许你按需要生产值,而不是一次性计算并存储所有值.生成器适合处理大数据流或无限序列
生成器创建有两种方式
.生成器函数(使用yield关键字)
.生成器表达式(类似于列表推导式)
每次调用next()时,生成器从上次yield的位置继续执行
1.生成器函数
def simple_generator():    print("第一次执行")    yield 1    print("第二次执行")    yield 2    print("第三次执行")    yield 3# 创建生成器对象gen = simple_generator()# 使用 next() 获取值print(next(gen))  # 输出: 第一次执行 \n 1print(next(gen))  # 输出: 第二次执行 \n 2print(next(gen))  # 输出: 第三次执行 \n 3# print(next(gen))  # 抛出 StopIteration 异常
2.生成器表达式
生成器表达式创建生成器的方式,类似于列表推导式,使用圆括号.
    squares_list=[x**2 for x in range(5)]    print(squares_list) #    squares_gen=(x**2 for x in range(5))    print(squares_gen) #<generator object <genexpr> at 0x102433920>    print(list(squares_gen)) #[0, 1, 4, 9, 16]
1).(x**2 for x in range(5))
生成器表达式:(x**2 for x in range(5))是一个生成器表达式(Generator Expression),它不会立即执行计算,而是返回一个生成器对象.
2).print(list(squares_gen))
触发迭代:list(gen)会尝试将生成器gen转换为列表.
3.实用案例
1.处理大型数据集
# 假设有一个非常大的日志文件需要处理def process_log_file(file_path):    with open(file_path) as f:        # 使用生成器表达式逐行处理        error_lines = (line for line in f if 'ERROR' in line)        for error in error_lines:            # 只在实际需要时才处理每一行            print(f"发现错误: {error.strip()}")# process_log_file('server.log')
2.多条件筛选
numbers = range(20)# 复杂的筛选条件filtered = (    x for x in numbers     if x % 2 == 0     if x % 3 == 0     if x > 5)print(list(filtered))  # 输出: [6, 12, 18]
3.扁平化矩阵
matrix = [    [1, 2, 3],    [4, 5, 6],    [7, 8, 9]]# 扁平化矩阵flattened = (num for row in matrix for num in row)print(list(flattened))  # 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9]
flattened=(num fro row in matrix for num in row)等同于如下代码
for row in matrix:      # 先遍历每一行    for num in row:     # 再遍历行中的每个数字        yield num       # 生成当前数字

最新文章

随机文章