<p>Python列表理解语法使在理解中过滤值变得容易。例如:</p>
<pre><code>result = [x**2 for x in mylist if type(x) is int]
</code></pre>
<p>将返回mylist中整数平方的列表。但是,如果测试涉及一些(代价高昂的)计算,并且您希望对结果进行筛选,会怎样?一种选择是:</p>
<pre><code>result = [expensive(x) for x in mylist if expensive(x)]
</code></pre>
<p>这将导致一个非“false”昂贵(x)值的列表,但是每x调用两次昂贵的()。是否有一个理解语法允许您在每x只调用昂贵一次的情况下执行此测试?</p>
<p>最明显的(我认为也是最可读的)答案是不要使用列表理解或生成器表达式,而是使用真正的生成器:</p>
<pre><code>def gen_expensive(mylist):
for item in mylist:
result = expensive(item)
if result:
yield result
</code></pre>
<p>它需要更多的水平空间,但它更容易看到它的作用一目了然,你最终不会重复自己。</p>