<p>正如人们所说,可以将print改为return,但是代码的一大改进是使用<code>%</code>(或模)运算符。在</p>
<pre><code>def stamps(dinero):
p5=dinero/5
dinero=dinero%5
p2=dinero/2
dinero=dinero%2
p1=dinero/1
return tuple([p5,p2,p1])
print stamps(8)
>>> (1,1,1)
</code></pre>
<p>在你的代码中这一行:</p>
^{pr2}$
<p>执行整数除法,而下面的函数通过将除数的倍数乘以原始数并减去它来得到余数:</p>
<pre><code>p5a=p5*5
resultado1=dinero-p5a
dinero=resultado1
</code></pre>
<p>大多数语言都提供一个<a href="http://docs.python.org/2/reference/expressions.html#binary-arithmetic-operations" rel="nofollow">modulo function</a>,它只需一个步骤即可完成此操作:</p>
<pre><code>dinero=dinero%5
</code></pre>
<p>这对于被3除的部分也是一样的,当你被1除时,永远不会有整数remainer,所以你可以完全删除代码。在</p>
<p>Python还有一种方法,可以使用返回除数和模的<a href="http://docs.python.org/2/library/functions.html#divmod" rel="nofollow">^{<cd2>}</a>再次缩短此值:</p>
<pre><code>def stamps(dinero):
p5,dinero=divmod(dinero,5)
p2,dinero=divmod(dinero,2)
p1=dinero
return tuple([p5,p2,p1])
print stamps(8)
>>> (1,1,1)
</code></pre>
<p>最后,您可以完全生成它,方法是让另一个函数同时使用amount和一个stamp值数组并调用它:</p>
<pre><code>def stamps(dinero):
return allStamps(dinero,[5,2,1])
def allStamps(dinero=1,stamps=[]):
vals = []
for stamp in sorted(list(set(stamps)), reverse=True):
val,dinero=divmod(dinero,stamp)
vals.append(val)
return tuple(vals)
print stamps(8)
>>> (1,1,1)
print allStamps(8,[5,3,1])
>>> (1,1,0)
</code></pre>
<p><strong>关于代码执行速度:</strong></p>
<p>我对一些选项运行了<a href="http://docs.python.org/2/library/timeit.html" rel="nofollow">timeit</a>,对<code>/</code>和{<cd1>}的调用甚至比对{<cd2>}的单个调用都要快:</p>
<pre><code>> python -m timeit 'a=1000;b=a/5;c=b*5;d=a-c;a=d'
10000000 loops, best of 3: 0.156 usec per loop
> python -m timeit 'a=1000;b=a/5;a=a-b*5;'
10000000 loops, best of 3: 0.127 usec per loop
> python -m timeit 'a=1000;a=a-(a/5)*5;'
10000000 loops, best of 3: 0.121 usec per loop
> python -m timeit 'a=1000/13;b=1000%13;'
10000000 loops, best of 3: 0.0755 usec per loop
root@meteordev:~# python -m timeit 'a,b=divmod(1000,13);'
10000000 loops, best of 3: 0.183 usec per loop
</code></pre>