(3)迭代器和生成器虽然都执行next()方法时返回下一个元素,迭代器在实例化前就已知所有元素,但是采用惰性计算机制,共有多少元素,下一个元素是什么都是未知的,每一次对生成器对象执行next()方法才会产生下一个元素。
3.2 生成器解析式使用过列表解析式吗?语法格式为:[返回值 for 元素 in 可迭代对象 if 条件]
看下面代码:
>>> li = [] >>> for i in range(5): if i%2==0: li.append(i**2) >>> li [0, 4, 16]
我们可以用列表解析式实现同样功能:
>>> li = [i**2 for i in range(5) if i%2==0] >>> li [0, 4, 16] >>> type(li) <class 'list'>
很简单对不对?简洁了很多,返回的li就是一个列表。咳咳……偏题了,我们要说的是生成器解析式,而且我相信打开我这篇博文的同学大多都熟悉列表解析式,回归正题。
生成器解析式语法格式为:(返回值 for 元素 in 可迭代对象 if 条件)
你没看错,跟列表解析式相比,生成器解析式只是把方括号换成了原括号。来感受一下:
>>> g = (i**2 for i in range(5) if i%2==0) >>> g <generator object <genexpr> at 0x00000222DC2F4468> >>> next(g) 0 >>> next(g) 4 >>> next(g) 16 >>> next(g) Traceback (most recent call last): File "<pyshell#38>", line 1, in <module> next(g) StopIteration
可以看到,生成器解析式返回的就是一个生成器对象,换句话说生成器解析式是生成器的一种定义方式,这种方式简单快捷,当然实现的功能不能太复杂。
4 总结本文全面总结了Python中可迭代对象、迭代器、生成器知识,我相信,只要你认真消化我这篇博文,就能深刻领悟迭代器生成器。
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx