python迭代器和生成器

本文讲解了可迭代对象、迭代器及生成器的概念,并对比了列表与生成器在内存使用效率上的显著差别。通过具体案例说明了生成器如何节省内存空间。

可迭代对象:内部必须有一个__iter__()方法

迭代器:可迭代对象的基础上必须有一个__next__()方法 

next: 是通过实例变量不断记录每次运行推导返回值实现的,下次运行,便可基于上次返回值及推导算法,返回下一个推导值

生成器本质是一个使用了yield返回值的函数,支持使用next()函数不断返回下一个值,同时支持使用send函数向生成器发送消息

生成的这个特性,为解决为优化内存使用效率提供了途径

因为比如一个包含1万个变量的列表,和一个包含推导算法的生成器,其内存占用空间,可能前者是后者的几个数量级倍数,比如下面的

a=[i for i in range(10000)] #运行sys.getsizeof(a)后,为87616

a=(i for i in range(10000))#运行sys.getsizeof(a)后,为112,直接减少了8千倍的内存占用空间
 

def read_file(fpath): 
    BLOCK_SIZE = 1024 
    with open(fpath, 'rb') as f: 
        while True: 
            block = f.read(BLOCK_SIZE) #第一次block指向是一个不可变对象
            if block: 
                yield block            #再次循环block是指向另一个不可变对象
            else:                      #第一个不可变对象 由于引用的次数为0 就被删除啦,
                return                 #所以省空间

详细请看:

python之迭代器和生成器全解--包含实现原理及应用场景_一秋闲谈的博客-优快云博客_python迭代器的应用场景

Python 编程里,迭代器生成器是极为重要的概念,它们为处理序列数据提供了高效、灵活且优雅的方式,对于编写高效、简洁且易于维护的 Python 代码至关重要[^1]。 迭代器允许逐个访问容器中的元素。从概念上来说,迭代器是实现了迭代器协议的对象,即包含 `__iter__()` `__next__()` 方法的对象。`__iter__()` 方法返回迭代器对象本身,而 `__next__()` 方法返回容器中的下一个元素。当没有更多元素时,`__next__()` 方法会引发 `StopIteration` 异常。例如,使用 `iter()` 函数可以将可迭代对象(如列表)转换为迭代器: ```python my_list = [1, 2, 3] my_iterator = iter(my_list) print(next(my_iterator)) # 输出 1 print(next(my_iterator)) # 输出 2 print(next(my_iterator)) # 输出 3 # 再次调用 next(my_iterator) 会引发 StopIteration 异常 ``` 生成器则可以按需生成数据,避免一次性生成大量数据占用过多内存。生成器有两种创建方式,一种是使用生成器函数,另一种是使用生成器表达式。生成器函数是包含 `yield` 关键字的函数,当函数被调用时,它返回一个生成器对象。每次调用生成器的 `__next__()` 方法时,函数会执行到 `yield` 语句,返回 `yield` 后面的值,并暂停执行。下次调用 `__next__()` 方法时,函数会从暂停的地方继续执行。示例如下: ```python def test_generator(n): for i in range(n): yield i ** 2 generator1 = test_generator(3) print(next(generator1)) # 输出 0 print(next(generator1)) # 输出 1 print(next(generator1)) # 输出 4 # 再次调用 next(generator1) 会引发 StopIteration 异常 ``` 生成器表达式类似于列表推导式,但使用圆括号而不是方括号。例如: ```python my_generator = (i ** 2 for i in range(3)) print(next(my_generator)) # 输出 0 print(next(my_generator)) # 输出 1 print(next(my_generator)) # 输出 4 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值