达永编程网

程序员技术分享与交流平台

Python进阶-Day6:迭代器与生成器

一、基础概念

1. 什么是迭代器?

  • 定义:迭代器是一个能记住遍历位置的"智能指针"
  • 特征: 通过 next() 获取下一个值 遍历结束后会触发 StopIteration 异常 只能前进不能后退

2. 什么是生成器?

  • 定义:一种用函数创建的迭代器(特殊迭代器)
  • 特征: 使用 yield 关键字 自动实现迭代协议 节省内存(需要时生成值)

二、代码示例详解

示例1:手动使用迭代器

# 列表是可迭代对象(Iterable),但不是迭代器
fruits = ["苹果", "香蕉", "橙子"]

# 转换为迭代器
fruit_iter = iter(fruits)  # 相当于 fruits.__iter__()

# 手动获取值
print(next(fruit_iter))  # 苹果(相当于 fruit_iter.__next__())
print(next(fruit_iter))  # 香蕉
print(next(fruit_iter))  # 橙子
# print(next(fruit_iter))  # 报错 StopIteration

示例2:生成器基本用法

# 普通函数 vs 生成器函数
def simple_func():
    return [1,2,3]  # 一次性返回所有数据

def gen_func():
    yield 1  # 暂停函数,返回1
    yield 2  # 从暂停处恢复,返回2
    yield 3  # 继续恢复,返回3

# 测试对比
print(simple_func())  # [1,2,3](立即占用内存)
gen = gen_func()      # 创建生成器对象(不立即执行)

print(next(gen))  # 1(首次调用开始执行到第一个yield)
print(next(gen))  # 2(从上次暂停位置继续)
print(next(gen))  # 3
# print(next(gen))  # 触发 StopIteration

示例3:生成器的实际应用场景

# 生成器处理大文件(避免内存爆炸)
def read_big_file(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        for line in f:  # 文件对象本身就是迭代器
            yield line.strip()  # 逐行处理

# 使用示例(假设文件有100万行)
for line in read_big_file('huge_data.txt'):
    # 每次只处理一行,内存中永远只存一行
    process_data(line)  # 你的数据处理函数


三、斐波那契生成器(带详细注释)

def fibonacci(max_count=None):
    """
    生成斐波那契数列的生成器
    :param max_count: 最大生成数量,None表示无限生成
    """
    a, b = 0, 1  # 初始化前两个值
    count = 0

    while True:
        if max_count is not None and count >= max_count:
            return  # 结束生成
        yield a  # 生成当前值

        # 更新数值(数学公式:F(n) = F(n-1) + F(n-2))
        a, b = b, a + b
        count += 1

# 使用示例1:生成前10个数
print("前10个斐波那契数:")
fib_gen = fibonacci(10)
for num in fib_gen:  # 生成器可以直接用于for循环
    print(num, end=' ')
# 输出:0 1 1 2 3 5 8 13 21 34

# 使用示例2:无限生成(需要手动控制次数)
print("\\\\n\\\\n前5个无限生成的数:")
inf_fib = fibonacci()  # 不传参数表示无限生成
for _ in range(5):
    print(next(inf_fib), end=' ')
# 输出:0 1 1 2 3


四、关键区别总结表

特性

普通函数

生成器函数

迭代器

返回值

立即返回所有结果

生成器对象

迭代器对象

内存占用

极低(按需生成)

取决于实现

执行流程

一次性执行完

可暂停/恢复

逐步推进

典型应用场景

常规数据处理

大数据/无限序列

遍历容器元素


五、新人常见问题

  1. 为什么需要生成器?
  2. 处理海量数据时避免内存溢出(如:读取10GB日志文件)
  3. 需要生成无限序列时(如:实时传感器数据流)
  4. yield 和 return 的区别?
  5. return:结束函数,返回结果
  6. yield:暂停函数,记住当前位置,下次继续执行
  7. 如何判断是否是迭代器?
  8. from collections.abc import Iterator print(isinstance([1,2,3], Iterator)) # False(列表不是迭代器) print(isinstance(iter([1,2,3]), Iterator)) # True

六、动手练习

  1. 基础题:实现一个生成器,生成指定长度的等比数列(如:2的n次方)
  2. 进阶题:创建可以倒计时的生成器(输入5 → 生成5,4,3,2,1)
  3. 挑战题:用生成器实现文件关键词实时搜索(边读取边匹配)

通过今天的学习,你将掌握处理大数据流的核心技能,这是成为Python高手的重要一步!

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言