<p>首先,对现有代码的最简单的更改是去掉嵌套循环。只要有<code>for</code>循环和一个<code>if</code>:</p>
<pre><code>for i in range(1, maximum+1):
if i*i > maximum:
break
print(i*i)
</code></pre>
<p>或者只需执行<code>while</code>循环并手动递增:</p>
^{pr2}$
<p>有一件事:注意我用了<code>range(1, maximum+1)</code>?范围是半开的:<code>range(1, maximum)</code>给了我们所有到<code>maximum</code>的数字,我们需要包括<code>maximum</code>本身,以使所有到<code>maximum</code>平方的数字都是1。(这就是在<code>while</code>版本中使用<code><=</code>而不是{<cd10>}的相同原因。在</p>
<hr/>
<p>但让我们玩得开心点。如果你有所有的自然数:</p>
<pre><code>numbers = itertools.count(1)
</code></pre>
<p>…你可以把它变成所有的方块:</p>
<pre><code>squares = (i*i for i in numbers)
</code></pre>
<p>不要担心它们的数量是无限的;我们在计算它们,一旦通过<code>maximum</code>,我们就会停止:</p>
<pre><code>smallsquares = itertools.takewhile(lambda n: n<=maximum, squares)
</code></pre>
<p>…现在我们有了一个很好的有限序列,我们可以打印出来:</p>
<pre><code>print(*smallsquares)
</code></pre>
<p>或者,如果您更喜欢if all在一行(在这种情况下,您可能还喜欢<code>from itertools import count, takewhile</code>):</p>
<pre><code>print(*takewhile(lambda n: n<=maximum, (i*i for i in count(1)))
</code></pre>
<p>但实际上,lambda表达式有点难看;也许(使用<code>from functools import partial</code>和<code>from operator import ge</code>)它更易读:</p>
<pre><code>print(*takewhile(partial(ge, maximum), (i*i for i in count(1)))
</code></pre>