首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:为什么这个元组要打印结果和“无”?还有:是否有更好的方法来实现这一结果?

Python:为什么这个元组要打印结果和“无”?还有:是否有更好的方法来实现这一结果?
EN

Stack Overflow用户
提问于 2013-07-22 01:16:25
回答 2查看 375关注 0票数 1

我需要计算一个给定的数字,多少“5”,“2”和“1”可以进入这些数字。对不起,我的英语对这样的解释有点有限:)也许一个例子更好:

摘录:印花邮票(8)结果应为:(1,1,1) (1枚5p邮票,1枚2p邮票和1枚1p邮票)

我已经找到了实现这一目标的方法,但是tuple()正在打印结果和"None",我不知道为什么。我也想知道,有一个更好,更短的方法来获得正确的结果。

这就是我所做的:

代码语言:javascript
复制
def stamps(dinero):
    p5=dinero/5
    p5a=p5*5
    resultado1=dinero-p5a
    dinero=resultado1
    p2=dinero/2
    p2a=p2*2
    resultado2=dinero-p2a
    dinero=resultado2
    p1=dinero/1
    p1a=p1*1
    resultado3=dinero-p1a
    dinero=resultado3
    print tuple([p5,p2,p1])

我得到的结果是:打印邮票(8)(1,1,1) None

Update: 我找到了一个更好的解决方案,我在这里发布它,以防有人想要一个更好的解决方案:

代码语言:javascript
复制
def stamps(n):
    #Basically, thats the same as return n/5, n%5/2, n%5%2
    return n/5, (n-5*(n/5))/2, (n-5*(n/5))-2*((n-5*(n/5))/2)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-22 01:42:19

正如人们所说的,您可以将打印更改为返回,但是代码的最大改进是使用% (或模块化)操作符。

代码语言:javascript
复制
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)

在您的代码中,这一行:

代码语言:javascript
复制
p5=dinero/5

执行整数除法,而下面是余数,方法是将原数中除数的倍数乘以并减去它:

代码语言:javascript
复制
p5a=p5*5
resultado1=dinero-p5a
dinero=resultado1

大多数语言都提供了一个模函数,它可以在一个步骤中执行此操作:

代码语言:javascript
复制
dinero=dinero%5

这对于除以3的部分是一样的,当除以1时,就没有整数余数了,所以您可以完全删除该代码。

Python还有一种方法,您可以使用divmod()再次缩短它,它返回除数和模数:

代码语言:javascript
复制
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)

最后,您可以完全概括它,方法是让另一个函数同时获取数量和一个邮票值数组,并调用它:

代码语言:javascript
复制
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)

关于代码执行速度的

我在其中一些选项上运行了一个时差,对/%的调用比对divmod()的单个调用都要快

代码语言:javascript
复制
> 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
票数 2
EN

Stack Overflow用户

发布于 2013-07-22 01:33:27

将函数内的“打印”改为“返回”,这将在调用“打印邮票(8)”时修复它。另外,对于您简单选择的邮票值5,2,1,除了您正在做的事情之外,没有其他更有效的方法可以找到一个好的解决方案(唯一可能的改进是,如果您有更多的邮票值而不是只有3个) --如果您的邮票值更复杂,那么您可以通过使用动态编程找到更好的解决方案,使用更少的邮票。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17778626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档