<p>我有一个<code>hack</code>在list/dict理解中创建别名。您可以使用<code>for alias_name in [alias_value]</code>技巧。例如,您有一个昂贵的函数:</p>
<pre class="lang-py prettyprint-override"><code>def expensive_function(x):
print("called the very expensive function, that will be $2")
return x*x + x
</code></pre>
<p>还有一些数据:</p>
^{pr2}$
<p>然后你要对每个元素应用昂贵的函数,并基于它进行过滤。你要做的是:</p>
<pre class="lang-py prettyprint-override"><code>result = [
(x, expensive)
for x in data
for expensive in [expensive_function(x)] #alias
if expensive > 3
]
print(result)
</code></pre>
<p>第二个for将只迭代大小为1的列表,使其成为别名。输出将显示这个昂贵的函数被调用了12次,每个数据元素只调用一次。然而,函数的结果被使用(最多)两次,一次用于滤波器,一次用于输出。在</p>
<p>请始终确保像我一样使用多行来布局这样的理解,并将#alias附加到别名所在的行。如果您使用别名,理解get相当复杂,您应该帮助未来的代码读者了解您正在做什么。这不是perl,你知道;)。在</p>
<p>为了完整性,输出:</p>
<pre class="lang-py prettyprint-override"><code>called the very expensive function, that will be $2
called the very expensive function, that will be $2
called the very expensive function, that will be $2
called the very expensive function, that will be $2
called the very expensive function, that will be $2
called the very expensive function, that will be $2
called the very expensive function, that will be $2
called the very expensive function, that will be $2
called the very expensive function, that will be $2
called the very expensive function, that will be $2
called the very expensive function, that will be $2
called the very expensive function, that will be $2
[(4, 20), (7, 56), (3, 12), (7, 56), (2, 6), (3, 12), (4, 20), (7, 56), (3, 12)]
</code></pre>
<p>代码:<a href="http://ideone.com/7mUQUt" rel="noreferrer">http://ideone.com/7mUQUt</a></p>