擅长:python、mysql、java
<p>关于#1,是的,他们将被评估多次。在</p>
<p>对于#2,其方法是在单独的理解中计算和过滤:</p>
<p>浓缩版:</p>
<pre><code>[(x,fx,gx) for (x,fx,gx) in ((x,fx,g(fx)) for (x,fx) in ((x,f(x)) for x in bigList) if fx < p) if gx<q]
</code></pre>
<p>扩展的较长版本使其更易于遵循:</p>
^{pr2}$
<p>这将尽可能少地调用<code>f</code>和<code>g</code>(每个<code>f(x)</code>的值不是<code>< p</code>将永远不会调用{<cd2>},并且对于<code>bigList</code>中的每个值,<code>f</code>只调用一次)。在</p>
<p>如果您愿意,也可以使用中间变量获得更简洁的代码:</p>
<pre><code>a = ( (x,f(x)) for x in bigList )
b = ( (x,fx,g(fx)) for (x,fx) in a if fx<p )
results = [ c for c in b if c[2] < q ] # faster than writing out full tuples
</code></pre>
<p><code>a</code>和<code>b</code>使用生成器表达式,这样它们就不必实际实例化列表,并在必要时进行简单的求值。在</p>