擅长:python、mysql、java
<p>使其成为<code>lambda</code>:</p>
<pre><code>has_o = lambda names: (name for name in names if 'o' in name)
for name in has_o(["hello","rrrrr"]):
print(name.upper())
for name in has_o(["hello","rrrrr"]):
print(name.upper())
</code></pre>
<p><code>lambda</code>是一个单行程序,<em>每次都返回一个新的生成器。在这里,我选择能够传递输入列表,但是如果它是固定的,您甚至不需要参数:</p>
^{pr2}$
<p>在最后一种情况下,请注意这样一个事实:如果<code>names</code>发生更改或被重新分配,<code>lambda</code>将使用新的<code>names</code>对象。可以使用默认值技巧修复名称重新指定:</p>
<pre><code>has_o = lambda lst=names: (name for name in lst if 'o' in name)
</code></pre>
<p>您可以通过使用默认值和复制技巧来修复<code>names</code>的后续修改(当您认为您的第一个目标是避免创建列表时,这并不是非常有用:):</p>
<pre><code>has_o = lambda lst=names[:]: (name for name in lst if 'o' in name)
</code></pre>
<p>(现在选择:)</p>