<p>1.当我们像这样链式生成器时,在执行sum()之前是否会有任何实际的工作发生?在</p>
<blockquote>
<p>Generator expression return an object that produces results on demand instead of building a
result list so your answer is No (but it still depends on your mean about <strong>real work</strong>).</p>
</blockquote>
<p>2.为什么我们需要分开做<code>line.split(None,1)[1]</code>和{<cd2>}这样做有好处吗?在</p>
<blockquote>
<p>it just make your code more readable and increase flexibility (based on what you may do with that expression), you can do it in one line :</p>
</blockquote>
<pre><code>(int(line.rsplit(None,1)[1]) for line in wwwlog if ine.rsplit(None,1)[1] != '-')
</code></pre>
<p>在这个例子中(x*x代表x范围内的x(1100000000))</p>
<p>3.Python2是否计算了范围(1100000000)?在</p>
<blockquote>
<p>yes it dose , instead in python 2 you can use <code>xrange</code> that return an iterator.</p>
</blockquote>
<p>4.如果是这样,是在该语句期间还是在发生器首次运行期间</p>
<blockquote>
<p>...?</p>
</blockquote>
<p>5.Python3中的情况不同吗?在</p>
<blockquote>
<p>in python 3 meany of built-in functions return an iterator like <code>open</code> or <code>range</code> </p>
</blockquote>
<p>为了回答您的第四个问题和您在评论中提出的问题,我认为<a href="http://shop.oreilly.com/product/0636920028154.do" rel="nofollow"><strong><em>learning python by Mark Lutz</em></strong></a>的这一部分可能会有所帮助:</p>
<h2>生成器表达式:迭代器满足理解</h2>
<p>在Python的所有最新版本中,迭代器和列表理解的概念是
结合了语言的一个新功能,生成器表达式。句法上,gen-
运算符表达式与普通的列表理解类似,但它们都包含在
用括号代替方括号:</p>
^{pr2}$
<p>事实上,至少在函数的基础上,对列表理解进行编码本质上是相同的
将生成器表达式包装在列表内置调用中,以强制它生成
立即生成列表:</p>
<pre><code>>>> list(x ** 2 for x in range(4))
[0, 1, 4, 9]
</code></pre>
<h2>列表理解等价</h2>
<p>然而,在操作上,生成器表达式与构建表达式有很大不同
结果列表在内存中,它们返回一个生成器对象,该对象反过来支持
迭代协议在任何迭代上下文中一次生成一个结果列表:</p>
<pre><code>>>> G = (x ** 2 for x in range(4))
>>> next(G)
0
>>> next(G)
1
>>> next(G)
4
>>> next(G)
9
>>> next(G)
Traceback (most recent call last):
...more text omitted...
StopIteration
</code></pre>
<p>我们通常不会在生成器ex的引擎盖下看到下一个迭代器机器-
这样的压力是因为for循环会自动为我们触发:</p>
<pre><code>>>> for num in (x ** 2 for x in range(4)):
...
print('%s, %s' % (num, num / 2.0))
...
0, 0.0
1, 0.5
4, 2.0
9, 4.5
</code></pre>
<p>正如我们已经了解到的,每个迭代上下文都会这样做,包括sum、map和
排序的内置函数;列表理解;以及我们学习的其他迭代上下文
关于第14章,比如any、all和list内置函数。
请注意,在生成器表达式周围不需要括号(如果需要的话)
包含在其他括号中的唯一项,如函数调用的项。额外的帕伦-
但是,在第二次调用sorted:</p>
<pre><code>>>> sum(x ** 2 for x in range(4))
14
>>> sorted(x ** 2 for x in range(4))
[0, 1, 4, 9]
>>> sorted((x ** 2 for x in range(4)), reverse=True)
[9, 4, 1, 0]
>>> import math
>>> list( map(math.sqrt, (x ** 2 for x in range(4))) )
[0.0, 1.0, 2.0, 3.0]
</code></pre>
<p>生成器表达式主要是一种内存空间优化,而不是-
要求一次构造整个结果列表,如方括号中的列表
理解是正确的。它们在实践中也可能运行得稍慢,所以它们可能是
最好只用于非常大的结果集。关于per的更权威的声明-
不过,formance必须等待我们在本章后面编写的计时脚本。在</p>