前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python_生成器和迭代器的区别

Python_生成器和迭代器的区别

作者头像
钢铁知识库
发布2022-08-20 09:03:49
2680
发布2022-08-20 09:03:49
举报
文章被收录于专栏:python爬虫教程

迭代器和生成器的区别是什么?这个问题面试的时候经常作为灵魂拷问。今天一起从概念到代码梳理一遍,作为总结和记录。

区别是:

  • 生成器的好处是延迟计算,一次返回一个结果。也就是说,它不会一次生成所有的结果,这对于大数据量处理,将会非常有用。

基础概念

  1. 迭代:当创建的对象可以被一个接一个读取里面的值,叫迭代。 列表、元组、字典、字符串都是可迭代对象。数字、布尔值是不可迭代的对象。
  2. 迭代器协议:对象需要提供next()方法,通过它返回迭代中的下一项,直到返回终止抛出StopIteration异常。
  3. 可迭代对象:实现了迭代器协议对象。list、tuple、dict都是可迭代对象(Iterable),但不是迭代器对象(Iterator)。 需要使用内建函数iter(),把这些都变成可迭代器对象(Iterable)。
  4. for item in Iterable:循环的本质就是先通过iter()函数获取可迭代对象Iterable的迭代器,然后对获取到的迭代器不断调用next()方法, 来获取下一个值并将其赋值给item,当遇到StopIteration的异常后循环结束。

操作一下

  • 迭代器:Python中一个实现_iter_方法和_next_方法的类对象,就是迭代器。
代码语言:javascript
复制
>>> list = [1,2,3]
>>> lt = iter(list)
>>> print(next(lt))
1
>>> print(next(lt))
2
>>> print(next(lt))
3
>>> print(next(lt))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
  • 生成器:本质上是动态生成迭代的值,使用完直接丢弃,可以有效节省内存空间,但这些值只能被迭代一次。
代码语言:javascript
复制
>>> def g():
...     for i in range(3):
...         yield i
... 
>>> g = g()
>>> next(g)
0
>>> next(g)
1
>>> next(g)
2
>>> next(g)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

yield语句与return语句一样,都起到返回的作用。但yield与return不同,如果执行return语句,直接返回return后面表达式的值。但执行yield语句,返回的是一个生成器对象,而且这个生成器对象的当前值,就是yield语句后面跟的表达式的值。调用yield语句后,当前函数就会返回一个迭代器,而且函数会暂停执行,直到对该函数进行下一次迭代。

生成器是一种惰性的序列,如果我们需要创建一个 0~xxxxxxxxx 的序列,这样大的序列创建出来会占用内存,生成器就解决这样的问题 。

参考链接: http://dwz.date/daG5 http://dwz.date/daG6

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-11-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 区别是:
  • 基础概念
  • 操作一下
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档