迭代器(iterator),它提供了一种遍历容器中元素的方式,而不需要暴露容器的内部结构.__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)它允许你按需要生产值,而不是一次性计算并存储所有值.生成器适合处理大数据流或无限序列每次调用next()时,生成器从上次yield的位置继续执行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 异常
生成器表达式创建生成器的方式,类似于列表推导式,使用圆括号. 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转换为列表.# 假设有一个非常大的日志文件需要处理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')
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]
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 # 生成当前数字