当前位置: 首页 > 后端技术 > Python

Python生成器和迭代器

时间:2023-03-26 17:17:13 Python

生成器和迭代器生成器Python列表解析和生成器表达式生成器的作用上面已经简单介绍过了使用列表理解创建列表时,由于内存限制,列表的容量也会受到限制,会消耗大量空间。这个时候这个机制就是边循环边计算,也就是生成器出现了。创建生成器创建生成器的方法有很多种。其中之一,使用生成器表达式,将列表推导中的方括号[]更改为圆括号()。下面的例子:>>>L=[x*xforxinrange(10)]>>>L[0,1,4,9,16,25,36,49,64,81]>>>g=(x*xforxinrange(10))>>>gat0x000001FBFD43A048>>>>list(g)[0,1,4,9,16,25,36,49,64,81]由于生成器返回的结果是惰性序列,不会直接返回想要的结果,可以手动遍历一个一个打印:>>>g=(x*xforxinrange(10))>>下一个(g)0>>>下一个(g)1>>>下一个(g)4>>>下一个(g)9>>>下一个(g)16>>>下一个(g)25>>>next(g)36>>>next(g)49>>>next(g)64>>>next(g)81>>>next(g)Traceback(最近调用最后):文件“",line1,StopIteration调用next()返回g的下一个元素的值,当没有更多元素时,会抛出StopIteration错误。如果只是遍历得到结果,可以使用for循环,因为generator是一个可迭代对象:>>>g=(x*xforxinrange(10))>>>foriing:...print(i)...0149162536496481使用for循环遍历时,无需担心StopIteration异常。还有另一种创建生成器的方法。在Python中,使用yield的函数称为生成器函数。使用yield实现斐波那契数列,如下例所示:deffib(n):ct,a,b=0,0,1whilect>>deftest():...print("value1")...yield(1)...print("value2")...yield(2)...print("值3")...yield(3)...>>>t=test()>>>next(t)value11>>>next(t)value22>>>next(t)value33>>>next(t)Traceback(mostrecentcalllast):File"",line1,inStopIteration在上面的代码中,在调用next()之后,打印值1,并产生1输出,停止执行,再次执行next()时,会继续执行上次yield语句停止后,输出值2和2,直到没有元素,抛出异常。这就是生成器函数的工作原理。迭代器在开始迭代器的内容之前,我们先来扩展一下可迭代对象的概念。可以直接在for循环中使用的对象称为可迭代对象:Iterable。可以用isinstance()判断:>>>fromcollectionsimportIterable>>>isinstance('abc',Iterable)True>>>isinstance((xforxinrange(10)),Iterable)True>>>isinstance(100,Iterable)False可以被next()函数调用,不断返回下一个值对象,称为迭代器:Iterator。您还可以使用isinstance()来确定对象是否为Iterator对象:>>>fromcollectionsimportIterator>>>isinstance('abc',Iterator)False>>>isinstance((xforxinrange(10)),Iterator)从True可以看出,生成器也是一个Iterator对象。但是str虽然是Iterable,但不是Iterator,也有列表和字典。但是iter()函数可以把Iterable变成Iterator,例如:>>>isinstance(iter('abc'),Iterator)True>>>isinstance(iter([]),Iterator)TrueCreateaniteratorCreateaniterator需要实现两个方法:__iter__()和__next__()。__iter__()方法返回一个特殊的迭代器对象,该对象实现了__next__()方法以通过StopIteration异常标记迭代完成。__next__()方法返回下一个迭代器对象。实现增量递增1的类,示例如下:>>>classNumberIncrease():...def__iter__(self):...self.x=1...returnself...def__next__(自己):。..i=self.x...self.x+=1...返回i...>>>num_increase=NumberIncrease()>>>num_iter=iter(num_increase)>>>next(num_iter)1>>>next(num_iter)2>>>next(num_iter)3>>>next(num_iter)4>>>next(num_iter)5以上是本文的主要内容。欢迎关注微信公众号《书所集录》