Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python中迭代器和生成器的区别?

Python中迭代器和生成器的区别?

作者头像
程序员小猿
发布于 2021-01-19 01:52:00
发布于 2021-01-19 01:52:00
1.7K00
代码可运行
举报
文章被收录于专栏:程序IT圈程序IT圈
运行总次数:0
代码可运行
公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助!

小猿会从最基础的面试题开始,每天一题。如果参考答案不够好,或者有错误的话,麻烦大家可以在留言区给出自己的意见和讨论,大家是要一起学习的 。

废话不多说,开始今天的题目:

问:说说Python中迭代器和生成器的区别?

答:Python中生成器能做到迭代器能做的所有事,而且因为自动创建了__iter__()和next()方法,生成器显得特别简洁,而且生成器也是高效的,使用生成器表达式取代列表解析,同时节省内存。除了创建和保持程序状态的自动生成,当发生器终结时,还会自动跑出StopIterration异常。

列表、元组、字典、字符串都是可迭代对象。

数字、布尔值都是不可迭代的。

下面分别来说说这两者的具体区别:

1、迭代器

迭代器对象要求支持迭代器协议的对象。在Python中,支持迭代器协议就是实现对象的__iter__()和next()方法。其中__iter__()方法返回迭代器对象本身;next()方法返回容器的下一个元素,在结尾时引发StopIteration异常。

下面用个简单的列表来说迭代器的用法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
list = [1,2,3,4] # list是可迭代对象
lterator = iter(list) # 通过iter()方法取得list的迭代器
print(next(lterator)) # 1 通过next()获取下一个位置的值
print(next(lterator)) # 2
print(next(lterator)) # 3
print(next(lterator)) # 4

输出:
1
2
3
4

看完上面代码,我想很多人纳闷列表怎么可以有一个迭代器。由于面试题篇幅有限,大家如果想了解可迭代对象怎么可以获取迭代器呢?我下次面试题会继续展开分享 。

2、生成器

生成器(generator)就是一个函数,它提供了一种实现迭代器协议的便捷方式。生成器与普通函数的区别在于它包含 yield 表达式,并且不需要定义 __iter__()和__next__()。

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

下面用个简单的例子来说生成器的用法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 普通序列
>>> g = []
>>> for x in range(5):
>>>  g.append(x)
>>> g
[0, 1, 2, 3, 4]

# 生成器
def f():
 for x in range(5):
  yield x # 返回并记录函数状态
        
# next
f = f()
>>> next(f) # 每调用一次next,就执行一次yield | 依靠这种需要才生产的工作机制,大大的节省资源
0
>>> next(f)
1
>>> next(f)
2
>>> next(f)
3
>>> next(f)
4

# for next
>>> for x in range(5):
>>>  print(next(f))
0
1
2
3
4

如果对于参考答案有不认同的,大家可以在评论区指出和补充,欢迎留言!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员小猿 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python迭代器、生成器、列表推倒式
在某种情况下,我们需要节省内存,就只能自己写,我们自己写的能实现迭代器的东西 称之为:“生成器”
Mirror王宇阳
2020/11/10
5600
一文彻底搞懂Python可迭代(Iterable)、迭代器(Iterator)和生成器(Generator)的概念
在Python中可迭代(Iterable)、迭代器(Iterator)和生成器(Generator)这几个概念是经常用到的,初学时对这几个概念也是经常混淆,现在是时候把这几个概念搞清楚了。
阳仔
2019/08/01
6.5K0
迭代器和生成器
一 迭代和可迭代协议 什么叫迭代 1234不可以for循环,是因为它不可迭代。那么如果“可迭代”,就应该可以被for循环了。 这个我们知道呀,字符串、列表、元组、字典、集合都可以被for循环,说明他们都是可迭代的。 我们怎么来证明这一点呢? from collections import Iterable l = [1,2,3,4] t = (1,2,3,4) d = {1:2,3:4
用户1214487
2018/01/23
6600
Python_生成器和迭代器的区别
迭代器和生成器的区别是什么?这个问题面试的时候经常作为灵魂拷问。今天一起从概念到代码梳理一遍,作为总结和记录。
钢铁知识库
2022/08/20
2910
python3--迭代器,生成器
现在是从结果分析原因,能被for循环的就是"可迭代的",但是如果按常规想,for怎么知道谁是可迭代的呢?
py3study
2018/08/02
4770
迭代器与生成器
这一部分待加强!                 (一)迭代器 一:简介     迭代是Python最强大的功能之一,是访问集合元素的一种方式。     迭代器是一个可以记住遍历的位置的对象。     迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。     迭代器只能往前不会后退。     迭代器有两个基本的方法:iter() 创建迭代器对象和 next()访问迭代器。     字典、字符串、列表或元组对象都可用于创建迭代器 二:迭代器的创建     ①把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__()     ②__iter__() 方法返回一个特殊的迭代器对象,     这个迭代器对象实现了 __next__() 方法     并通过 StopIteration 异常标识迭代的完成。     ③__next__() 方法(Python 2 里是 next())会返回下一个迭代器对象 三:迭代器协议的后台机制     for element in (1, 2, 3):             print(element)     在后台,for 语句在容器对象中调用 iter() 。     该函数返回一个定义了 __next__() 方法的迭代器对象,它在容器中逐一访问元素。     没有后续的元素时, __next__() 抛出一个 StopIteration 异常,     通知 for 语句循环结束。     可以用内建的 next() 函数调用 __next__() 方法;     了解了迭代器协议的后台机制,就可以很容易的给自己的类添加迭代器行为。     定义一个 __iter__() 方法,使其返回一个带有 __next__() 方法的对象。     如果这个类已经定义了 __next__() ,那么 __iter__() 只需要返回 self: 三:迭代器使用的必要性     列表效率高,但是需要将内容一次性读入,可能增加内存的负担,     如果列表太大,内存溢出。     range 返回一个列表     xrange 返回一个对象                 (二)生成器 一:简介     ①在 Python 中,使用了 yield 的函数被称为生成器(generator)     跟普通函数不同的是,生成器是一个返回迭代器的函数,     只能用于迭代操作,更简单点理解生成器就是一个迭代器     ②在调用生成器运行的过程中,每次遇到 yield 时函数会暂停,     并保存当前所有的运行信息,返回 yield 的值,     并在下一次执行 next() 方法时从当前位置继续运行。 二:创建生成器     ①一个简单的生成器:my_generator = (x*x for x in range(4))     和列表解析式只是括号不同,大数据处理时代替列表解析式。     ②和return的区别:一般的函数都是止于return,作为生成器的函数,由于有了yield,     遇到他则会暂时挂起,如果之后还有return,则直接抛出StopIteration异常。 三:本节最后一句:编程中可以不使用生成器。
py3study
2020/01/19
4010
3.0 Python 迭代器与生成器
当我们需要处理一个大量的数据集合时,一次性将其全部读入内存并处理可能会导致内存溢出。此时,我们可以采用迭代器Iterator和生成器Generator的方法,逐个地处理数据,从而避免内存溢出的问题。
王 瑞
2023/08/12
3020
python迭代器与生成器小结
这个东西输出可以脑补一下, 结果是[20,21,22,23], 而不是[10, 11, 12, 13]。 当时纠结了半天,一直没搞懂,后来齐老师稍微指点了一下, 突然想明白了--真够笨的,唉。。好了--正好趁机会稍微小结一下python里面的生成器。
py3study
2020/01/03
4020
Python之迭代器和生成器
迭代器 可迭代的数据类型: list   dic   str    set     tuple      f=open()--文件句柄      range      enumerate 不可迭代的数据类型: int    bool 什么叫迭代? 结合我们使用for循环取值的现象,再从字面上理解一下,其实迭代就是,可以将某个数据集内的数据“一个挨着一个的取出来”,就叫做迭代。 什么是可迭代协议? 可以被迭代要满足的要求就叫做可迭代协议。可迭代协议的定义非常简单,就是内部实现了__iter__方法,只要含有_
新人小试
2018/04/12
8410
Python之迭代器和生成器
Python中的 生成器、迭代器
上一次输出的结果为下一次输入的初始值,重复的过程称为迭代,每次重复即一次迭代,并且每次迭代的结果是下一次迭代的初始值
用户7886150
2020/11/30
1.4K0
python生成器和迭代器
第二,本次迭代的要依赖上一次的结果继续往下做,如果中途有任何停顿,都不能算是迭代。
用户7886150
2020/11/30
4990
Python 迭代器与生成器
迭代器:是访问数据集合内元素的一种方式,一般用来遍历数据,但是他不能像列表一样使用下标来获取数据,也就是说迭代器是不能返回的。
昱良
2019/05/28
7780
理解Python 生成器与迭代器
前一段时间和同事聊到Python技术知识,发现自己对生成器,迭代器傻傻分不清楚,于是乎查文档,找资料,有了此文。
用户1278550
2018/08/09
5610
Python基础11-迭代器,生成器
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
2860
Python基础11-迭代器,生成器
python 可迭代对象 迭代器 生成器_Python3迭代器获取
初学者在日常提升Python基本功的时候,可能会被Python的迭代器和生成器搞晕,之前在学习和使用时,本来for in 循环体和enumerate函数用的飞起,觉得自己已经彻底了解了Python的迭代特性,但接触了迭代器和生成器后,突然感觉懵逼,大概率会被可迭代、迭代器、生成器等概念搞的不知所向,本文就是结合日常项目应用,对Python的迭代概念进行系统性的全面解析,包括其底层实现原理,还有一些常见的应用,希望能帮助更多人,同时也算作给自己梳理思路。
全栈程序员站长
2022/11/10
1.1K0
Python 迭代器和生成器
本文介绍了Python迭代器和生成器的概念、用法和示例,以及itertools模块提供的一系列迭代器。生成器是一种特殊的迭代器,内部支持了生成器协议,不需要明确定义__iter__()和next()方法。生成器通过生成器函数产生,生成器函数可以通过常规的def语句来定义,但是不用return返回,而是用yield一次返回一个结果。在Python 2.5中,yield语句变成了yield表达式,可以有一个值。在生成器中,每次调用next()方法,就会返回下一个值。生成器还支持send()方法,用于主动推送一个值。在Python 3.x中,send()方法被移除,可以使用next()方法代替。生成器还支持close()方法,用于关闭生成器,关闭后无法使用send()和next()方法,但可以继续使用__iter__()和__next__()方法。生成器是一种强大的编程工具,可以有效地节省内存和提高代码性能,特别是在处理大量数据时。itertools模块提供了一系列迭代器,包括旋转、组合、笛卡尔积等,可以用于简化复杂的循环和算法。总之,迭代器和生成器是Python中非常重要的概念,可以简化很多繁琐的编程任务,提高代码性能和可读性。
企鹅号小编
2018/01/05
7360
Python 迭代器和生成器
迭代器和生成器
Python使用生成器对延迟操作提供了支持。所谓延迟操作,是指在需要的时候才产生结果,而不是立即产生结果。
全栈程序员站长
2022/07/21
4950
3.0 Python 迭代器与生成器
当我们需要处理一个大量的数据集合时,一次性将其全部读入内存并处理可能会导致内存溢出。此时,我们可以采用迭代器Iterator和生成器Generator的方法,逐个地处理数据,从而避免内存溢出的问题。
王 瑞
2023/10/11
2690
Python 迭代器、生成器和列表解析
迭代器在 Python 2.2 版本中被加入, 它为类序列对象提供了一个类序列的接口。 Python 的迭代无缝地支持序列对象, 而且它还允许迭代非序列类型, 包括用户定义的对象。即迭代器可以迭代不是序列但表现出序列行为的对象, 例如字典的 key , 一个文件的行, 等等。迭代器有以下特性:
py3study
2020/01/03
7500
Python中的迭代器和生成器介绍
迭代器是Python中用于遍历数据集合的一种机制。它是一个实现了迭代协议的对象,可以通过iter()函数来获得迭代器。迭代器需要实现两个方法:__iter__()和__next__()。其中,__iter__()返回迭代器自身,而__next__()返回序列中的下一个元素。当没有元素可以返回时,__next__()应该引发StopIteration异常,表示迭代结束。当我们处理数据集合时,往往需要逐个访问其中的元素,这时就需要用到迭代器(Iterators)。
小博测试成长之路
2023/09/12
2580
Python中的迭代器和生成器介绍
相关推荐
python迭代器、生成器、列表推倒式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验