<p>我很难找到窍门:</p>
<pre><code>def diamond(ni):
li = [ i*'*' + (2*(ni-i) - 1)*' ' + (i - i//ni)*'*'
for i in xrange(ni,0,-1)]
li.extend(i*'*' + (2*(ni-i) - 1)*' ' + (i - i//ni)*'*'
for i in range(2,ni+1))
return '\n'.join(li)
print diamond(7)
</code></pre>
<p>抽签</p>
^{pr2}$
<p>注意到了吗</p>
<pre><code>li.extend(i*'*' + (2*(ni-i) - 1)*' ' + (i - i//ni)*'*'
for i in range(2,ni+1))
</code></pre>
<p>做相同的(少于一行)比</p>
<pre><code> li = [ i*'*' + (2*(ni-i) - 1)*' ' + (i - i//ni)*'*'
for i in xrange(ni,0,-1)]
</code></pre>
<p>但反过来,我们可以简化:</p>
<pre><code>def symetric_diamond(ni):
li = [i*'*' + (2*(ni-i) - 1)*' ' + (i - i//ni)*'*'
for i in xrange(ni,0,-1)]
li.extend(li[-2::-1])
return '\n'.join(li)
</code></pre>
<h3>请注意</h3>
<pre><code>print '\n'.join(str(i) for i in xrange(500))
</code></pre>
<p>立即显示,因为程序计算字符串<strong>'\n'.join(str(i)for i in xrange(500))</strong>,然后一次性打印它,而</p>
<pre><code>for i in xrange(500):
print str(i)
</code></pre>
<p>显示的时间要长得多,因为计算机一个接一个地打印500个字符串,每次调用<strong>print</strong>都很长</p>
<p>一。在</p>
<p>还有另一种方法来印钻石,我现在就写。在</p>
<h3>加</h3>
<pre><code>def format_diamond(nl):
ni = (nl+1)/2
li = ['{:{fill}{align}{width}}'.format((2*(ni-x) - 1)*' ',fill='*',align='^',width=2*ni-1)
for x in xrange(ni,0,-1)]
li.extend(li[-2::-1])
return '\n'.join(li)
</code></pre>
<p>->;当<strong>nl</strong>为偶数时,所有这些函数都给出了<strong>nl-1</strong>行的菱形。在</p>
<h2>编辑</h2>
<p>最后,我更喜欢的是:</p>
<pre><code>def symetric_diamond(nl):
'''Returns a diamond of nl lines if nl is odd,
and nl-1 lines if nl is even'''
ni = (nl+1)//2
li = [ (2*ni-1) * '*' ]
li.extend(i*'*' + (2*(ni-i) - 1)*' ' +i*'*' for i in xrange(ni-1,0,-1))
li += reversed(li[0:-1]) # in-place extension
return '\n'.join(li)
</code></pre>
<p>因为就地扩展(有扩展和反转)以及没有可怕的<code>(i - i//ni)*'*'</code></p>