<分区>
谁能解释一下生成器在这些示例中的工作原理?
在这个例子中来自 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)
- 当我们像这样链接生成器时,除了代码对象创建之外,在我们执行 sum() 之前是否会发生任何实际工作?
- 为什么我们需要做 line.split(None,1)[1] 和 int(x) 分开 - 这样做有优势吗?
在这个例子中(x*x for x in range(1,100000000))
- 当这个表达式被解释器求值时,Python 2 是否计算了 range(1,100000000)?
- 在这条语句期间或在生成器的第一次运行期间发生这种情况吗
- 这在 Python 3 中有什么不同吗?
原因我怀疑是这个片段:
def foo():
for each in range(1,100000):
yield each
a = foo()
# Here range is not evaluated until generator is run or just
# before first yield is hit which is expected.
a=(x for x in range(1,100000))
# I thought also does exact thing as that function and it i is a
# syntactic sugar for a=foo() which also yields a generator object.
与使用列表或更实用的场景相比,使用生成器是否有任何优势?