有人能在这些例子中解释发电机是如何工作的吗?在
在本例中来自http://www.dabeaz.com/generators/index.html
wwwlog = open("access-log")
bytecolumn = (line.rsplit(None,1)[1] for line in wwwlog)
bytes = (int(x) for x in bytecolumn if x != '-')
print "Total", sum(bytes)
在这个例子中(x*x代表x范围内的x(1100000000))
我有这个疑问的原因是:
^{2}$与列表或场景相比,使用生成器有什么优势吗?在
1.当我们像这样链式生成器时,在执行sum()之前是否会有任何实际的工作发生?在
2.为什么我们需要分开做}这样做有好处吗?在
line.split(None,1)[1]
和{在这个例子中(x*x代表x范围内的x(1100000000))
3.Python2是否计算了范围(1100000000)?在
4.如果是这样,是在该语句期间还是在发生器首次运行期间
5.Python3中的情况不同吗?在
为了回答您的第四个问题和您在评论中提出的问题,我认为learning python by Mark Lutz的这一部分可能会有所帮助:
生成器表达式:迭代器满足理解
在Python的所有最新版本中,迭代器和列表理解的概念是 结合了语言的一个新功能,生成器表达式。句法上,gen- 运算符表达式与普通的列表理解类似,但它们都包含在 用括号代替方括号:
^{pr2}$事实上,至少在函数的基础上,对列表理解进行编码本质上是相同的 将生成器表达式包装在列表内置调用中,以强制它生成 立即生成列表:
列表理解等价
然而,在操作上,生成器表达式与构建表达式有很大不同 结果列表在内存中,它们返回一个生成器对象,该对象反过来支持 迭代协议在任何迭代上下文中一次生成一个结果列表:
我们通常不会在生成器ex的引擎盖下看到下一个迭代器机器- 这样的压力是因为for循环会自动为我们触发:
正如我们已经了解到的,每个迭代上下文都会这样做,包括sum、map和 排序的内置函数;列表理解;以及我们学习的其他迭代上下文 关于第14章,比如any、all和list内置函数。 请注意,在生成器表达式周围不需要括号(如果需要的话) 包含在其他括号中的唯一项,如函数调用的项。额外的帕伦- 但是,在第二次调用sorted:
生成器表达式主要是一种内存空间优化,而不是- 要求一次构造整个结果列表,如方括号中的列表 理解是正确的。它们在实践中也可能运行得稍慢,所以它们可能是 最好只用于非常大的结果集。关于per的更权威的声明- 不过,formance必须等待我们在本章后面编写的计时脚本。在
sum
)。在bytes = (int(x) for x in (line.rsplit(None,1)[1] for line in wwwlog) if x != '-')
range
返回一个列表,您需要xrange
来生成类似生成器的对象。在range
的行为类似于python2的xrange
。同样的情况也发生在其他函数上,比如map
和filter
。在生成器的主要优点是不会一次存储全部内容。它们的主要缺点是只能迭代一次。在
相关问题 更多 >
编程相关推荐