问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

python 迭代器和生成器的区别

发布网友 发布时间:2022-04-21 20:27

我来回答

2个回答

热心网友 时间:2022-05-10 08:59

Num01–>迭代器
定义:
对于list、string、tuple、dict等这些容器对象,使用for循环遍历是很方便的。在后台for语句对容器对象调用iter()函数。iter()是python内置函数。
iter()函数会返回一个定义了next()方法的迭代器对象,它在容器中逐个访问容器内的元素。next()也是python内置函数。在没有后续元素时,next()会抛出一个StopIteration异常,通知for语句循环结束。
迭代器是用来帮助我们记录每次迭代访问到的位置,当我们对迭代器使用next()函数的时候,迭代器会向我们返回它所记录位置的下一个位置的数据。实际上,在使用next()函数的时候,调用的就是迭代器对象的_next_方法(Python3中是对象的_next_方法,Python2中是对象的next()方法)。所以,我们要想构造一个迭代器,就要实现它的_next_方法。但这还不够,python要求迭代器本身也是可迭代的,所以我们还要为迭代器实现_iter_方法,而_iter_方法要返回一个迭代器,迭代器自身正是一个迭代器,所以迭代器的_iter_方法返回自身self即可。
一些术语的解释:
1,迭代器协议:对象需要提供next()方法,它要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代。
2,可迭代对象:实现了迭代器协议对象。list、tuple、dict都是Iterable(可迭代对象),但不是Iterator(迭代器对象)。但可以使用内建函数iter(),把这些都变成Iterable(可迭代器对象)。
3,for item in Iterable 循环的本质就是先通过iter()函数获取可迭代对象Iterable的迭代器,然后对获取到的迭代器不断调用next()方法来获取下一个值并将其赋值给item,当遇到StopIteration的异常后循环结束
Python自带容器对象案例:
# 随便定义一个listlistArray=[1,2,3]# 使用iter()函数iterName=iter(listArray)
print(iterName)# 结果如下:是一个列表list的迭代器# <list_iterator object at 0x0000017B0D984278>print(next(iterName))
print(next(iterName))
print(next(iterName))
print(next(iterName))#没有迭代到下一个元素,直接抛出异常# 1# 2# 3# Traceback (most recent call last):# File "Test07.py", line 32, in <mole># StopIteration123456789101112131415161718

Python中一个实现了_iter_方法和_next_方法的类对象,就是迭代器,如下案例是计算菲波那切数列的案例
class Fib(object):
def __init__(self, max):
super(Fib, self).__init__()
self.max = max def __iter__(self):
self.a = 0
self.b = 1
return self def __next__(self):
fib = self.a if fib > self.max: raise StopIteration
self.a, self.b = self.b, self.a + self.b return fib# 定义一个main函数,循环遍历每一个菲波那切数def main():
# 20以内的数
fib = Fib(20) for i in fib:
print(i)# 测试if __name__ == '__main__':
main()12345678910111213141516171819202122232425262728

解释说明:
在本类的实现中,定义了一个_iter_(self)方法,这个方法是在for循环遍历时被iter()调用,返回一个迭代器。因为在遍历的时候,是直接调用的python内置函数iter(),由iter()通过调用_iter_(self)获得对象的迭代器。有了迭代器,就可以逐个遍历元素了。而逐个遍历的时候,也是使用内置的next()函数通过调用对象的_next_(self)方法对迭代器对象进行遍历。所以要实现_iter_(self)和_next_(self)这两个方法。
而且因为实现了_next_(self)方法,所以在实现_iter_(self)的时候,直接返回self就可以。
总结一句话就是:
在循环遍历自定义容器对象时,会使用python内置函数iter()调用遍历对象的_iter_(self)获得一个迭代器,之后再循环对这个迭代器使用next()调用迭代器对象的_next_(self)。
注意点:_iter_(self)只会被调用一次,而_next_(self)会被调用 n 次,直到出现StopIteration异常。
Num02–>生成器
作用:
>延迟操作。也就是在需要的时候才产生结果,不是立即产生结果。12

注意事项:
>生成器是只能遍历一次的。
>生成器是一类特殊的迭代器。123

分类:
第一类:生成器函数:还是使用 def 定义函数,但是,使用yield而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行。
如下案例加以说明:
# 菲波那切数列def Fib(max):
n, a, b = 0, 0, 1
while n < max: yield b
a, b = b, a + b
n = n + 1
return '亲!没有数据了...'# 调用方法,生成出10个数来f=Fib(10)# 使用一个循环捕获最后return 返回的值,保存在异常StopIteration的value中while True: try:
x=next(f)
print("f:",x) except StopIteration as e:
print("生成器最后的返回值是:",e.value) break123456789101112131415161718

第二类:生成器表达式:类似于列表
,只不过是把一对大括号[]变换为一对小括号()。但是,生成器表达式是按需产生一个生成器结果对象,要想拿到每一个元素,就需要循环遍历。
如下案例加以说明:
# 一个列表xiaoke=[2,3,4,5]# 生成器generator,类似于list,但是是把[]改为()gen=(a for a in xiaoke)for i in gen:
print(i)#结果是:2345# 为什么要使用生成器?因为效率。# 使用生成器表达式取代列表推导式可以同时节省 cpu 和 内存(RAM)。# 如果你构造一个列表(list)的目的仅仅是传递给别的函数,# 比如 传递给tuple()或者set(), 那就用生成器表达式替代吧!# 本案例是直接把列表转化为元组kk=tuple(a for a in xiaoke)
print(kk)#结果是:(2, 3, 4, 5)# python内置的一些函数,可以识别这是生成器表达式,外面有一对小括号,就是生成器result1=sum(a for a in range(3))
print(result1)# 列表推导式result2=sum([a for a in range(3)])
print(result2)

热心网友 时间:2022-05-10 10:17

1、迭代器(iterator)是一个实现了迭代器协议的对象,python的一些内置数据类型(列表,数组,字符串,字典等)都可以通过for语句进行迭代,我们也可以自己创建一个容器,实现了迭代器协议,可以通过for,next方法进行迭代,在迭代的末尾,会引发stopIteration异常。
2、生成器(generator)是通过yield语句快速生成迭代器,可以不用iter和next方法
yield可以使一个普通函数变成一个生成器,并且相应的next()方法返回是yield后的值。一种更直观的解释是:程序执行到yield时会返回结果并暂停,再次调用next时会从上次暂停的地方继续开始执行。
显然,生成器自身有构成一个迭代器,每次迭代时使用一个yield返回 的值,一个生成器中可以有多个yield的值
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
2023党课ppt+讲稿配套课件——全面从严治党 继续推进新时代党的建设新... 廉政建设专题党课:力转工作作风、严守政治底线,以忠诚担当的干劲加强... 大一新生证件照要求 新生报名大学照相要照几寸的 人人网是什么网啦 人人网的主要功能是什么? ...OH为主要原料合成六元环状有机物C和高分子化合物D 酸菜不酸是什么原因 十堰公元海二期是什么装修? 十堰公元海二期售楼服务热线是多少? 椰子片怎么做出来的 python中的迭代器有什么用 python异常值处理 python 生成器和迭代器的区别 python stopiteration怎么处理 中国有哪些著名的小吃? 日本有哪些风味食品是有历史故事的 各地的美食有哪些 怎么看自己的是什么时间注册的 吃粽子寓意着什么 微信怎样查看注册时间 吃粽子的寓意 怎么看自己的什么时候注册的 微信朋友圈的照片尺寸设置成多大才不会被压缩? 微信朋友圈长图规格多少!做放朋友圈不清楚! 微信朋友圈图片大小是多大最合适?1.像素2.kb 微信朋友圈一般图片是多大尺寸的? 菊花脑,蚕豆,鸡蛋能下面条吃吗? 做法,番茄炒瓠子怎么做好吃,番茄炒瓠子的家常做法 西红柿炒瓠子怎么做好吃,西红柿炒瓠子的家 干椰子片煲汤的做法大全 python3 有多少内置函数 干海底椰片怎么泡发 iterator和generator之间的区别是什么 如果要关闭python解释器要用哪一个函数呢 软件开发专业难不难啊? 白色干海底椰片煲汤怎么是硬的?不知道的人不要乱... python 怎么把list转换成迭代器 标致4008怎么样?值得买吗? python中denominator是什么方法 标致4008优缺点有哪些?评价如何? python中的迭代器的理解? 试驾标致4008插混版,8AT+四驱,质感很高级 请教Python 这个类for循环怎么理解? 东风标志4008,是一辆不错的法系车吗? python 迭代器生成序列问题 4008的车主,这车怎么样 程序开发中生成器与迭代器的方法与使用? 椰子片和烤椰子片的口感有区别吗? 标致4008黑曜提车及使用报告,谈谈自己的用车感受!