Python生成器和迭代器区别与联系

简单对比

迭代器是一个更抽象的概念,任何对象,如果它的类有next方法和iter方法返回自己的本身,对于string、list、dict、tuple等这类容器对象,使用for循环会更加方便。在后台for语句对容器对象调用iter()函数,iter()是Python内置函数。

iter()会返回一个定义了next()方法的迭代器对象,在容器中逐个访问容器内元素,next()也是Python的内置函数,无后续元素时,next()会抛出一个StopIteration异常

生成器是创建迭代器简单而强大的工具,像正规函数,在需要返回数据的时候使用yield语句,每次next()被调用时,生成器会返回它脱离的位置。

迭代器和生成器区别主要在于生成器可以做迭代器的事情,生成器是一种特殊的迭代器。

个人理解: 生成器是特殊的迭代器,封装好迭代器的功能更便于使用,迭代器更偏向于底层功能的实现和开发。

详细分析

迭代器

Python中一个实现_iter_方法和_next_方法的类对象,就是迭代器。
是一个能记住遍历位置的对象,遍历时只能往前,不能后退。迭代器常用方法有 iter() 和 next().
把一个类作为迭代器使用需要在类中实现两个函数:iter() 和 next().

生成器

Python 中使用了 yield 的函数称为生成器,生成器函数返回一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
生成器函数自动实现了迭代器协议,能更方便地实现。
生成器函数 和 生成器表达式都可以提供生成器,只需要简单地将列表推导的中括号替换成圆括号即可

二者区别

1.迭代器是访问容器的一种方式,也就是说容器已经出现。我们是从已有元素拓印出一份副本,只为我们此次迭代使用。而生成器则是,而生成器则是自己生成元素的。
2.在用法上生成器只需要简单函数写法,配合yield就能实现。而迭代器真正开发中很难使用到。我们可以把生成器看做,python给我们提供的特殊接口实现的迭代器。
3.生成器是只能遍历一次的。

为什么使用生成器

Python使用生成器对延迟操作提供了支持。在需要的时候才产生结果,而不是立即产生结果。
1、节省资源消耗,和声明序列不同的是生成器在不使用的时候几乎不占内存,也没有声明计算过程!
2、使用的时候,生成器是随用随生成,用完即刻释放,非常高效!
3、可在单线程下实现并发运算处理效果。

yeild 与 return的区别

相同点:都是返回函数执行的结果
不同点:return 在返回结果后结束函数的运行,而yield 则是让函数变成一个生成器,生成器每次产生一个值(yield语句),函数被冻结,被唤醒后再产生一个值

内容学习补充

迭代器

迭代器:

iterable:可迭代的东西
str, list, tuple, dict, set, open()

获得迭代器的两种方案:
1. iter()内置函数可以直接拿到迭代器
2. iter() 特殊方法

从迭代器中拿到数据:
1. next()内置函数
2. next() 特殊方法

for里面一定是要拿迭代器的,所以所有不可迭代的东西都不能用for循环
for循环里面一个有__next__的出现

总计:迭代器统一了不同数据类型的遍历工作

迭代器本身也是可以迭代的

迭代器本身的特性:
1. 只能向前不能反复。
2. 特别节省内存
3. 惰性机制

it = "你叫什么名字".__iter__()
print(it.__next__())
print(it.__next__())
print(it.__next__())

生成器

生成器:
生成器的本质就是迭代器

创建生成器的两种方案:
    1. 生成器函数
    2. 生成器表达式

生成器函数
    生成器函数有一个关键字yield
    生成器函数执行的时候,并不会执行函数,得到的是生成器

    yeild:只要函数中出现了yield,他就是一个生成器函数
        作用:
            1. 可以返回数据
            2. 可以分段的执行函数中的内容,通过__next__()可以执行到下一个yield的位置  

    优势:
        用好了,特别的节省内存
def order():
    lst = []
    for i in range(1000):
        lst.append('衣服'+str(i))
        if len(lst) == 50:
            yield lst
            lst.clear()

gen = order()
print(gen.__next__()) # lst中只存在50个内存
print(gen.__next__())

参考链接:https://www.cnblogs.com/songshutai/p/15668864.html
参考链接:http://blog.itpub.net/69952527/viewspace-2730909/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fighting_1997

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值