python生成器和迭代器

什么是⽣成器
    通过列表⽣成式,我们可以直接创建⼀个列表。但是,受到内存限制,列表
容量肯定是有限的。⽽且,创建⼀个包含100万个元素的列表,不仅占⽤很
⼤的存储空间,如果我们仅仅需要访问前⾯⼏个元素,那后⾯绝⼤多数元素
占⽤的空间都⽩⽩浪费了。所以,如果列表元素可以按照某种算法推算出
来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必
创建完整的list,从⽽节省⼤量的空间
在Python中,这种⼀边循环⼀边计算
的机制,称为⽣成器:generator。

创建⽣成器⽅法1
    要创建⼀个⽣成器,有很多种⽅法。第⼀种⽅法很简单,只要把⼀个列表⽣
成式的 [ ] 改成 ( )

    可以通过 next() 函数获得⽣成器的下⼀个返回值每次调⽤ next(G) ,就计算出 G 的下⼀个元素的值,直到计算到最后⼀个元素,没有更多的元素时,抛出 StopIteration 的异常。
当然,这种不断调⽤ next() 实在是太变态了,正确的⽅法是使⽤ for 循环,
因为⽣成器也是可迭代对象。所以,我们创建了⼀个⽣成器后,基本上永远
不会调⽤ next() ,⽽是通过 for 循环来迭代它,并且不需要关⼼
StopIteration 异常。

创建⽣成器⽅法2
generator⾮常强⼤。如果推算的算法⽐较复杂,⽤类似列表⽣成式的 for 循
环⽆法实现的时候,还可以⽤函数来实现

yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator

 

⽣成器的特点:
1. 节约内存
2. 迭代到下⼀次的调⽤时,所使⽤的参数都是第⼀次所保留下的,即是
说,在整个所有函数调⽤的参数都是第⼀次所调⽤时保留的,⽽不是新
创建的

迭代器:

可以使⽤ isinstance() 判断⼀个对象是否是 Iterable 对象:
from collections import Iterable
isinstance([], Iterable)
True

总结
凡是可作⽤于 for 循环的对象都是 Iterable 类型;
凡是可作⽤于 next() 函数的对象都是 Iterator 类型
集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不过可
以通过 iter() 函数获得⼀个 Iterator 对象。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值