Python:为什么这个元组打印结果而“None”?还有:有没有更好的方法来达到这个结果?

2024-09-29 22:19:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要用一个给定的数字来计算,有多少个“五”、“二”和“一”可以进入这些数字。抱歉,我的英语有点有限,无法解释:) 也许举个例子更好:

锻炼: 打印邮票(8) 结果应该是:(1,1,1)(一个5p印章,一个2p印章和一个1p印章)

我已经找到了实现这个目标的方法,但是tuple()正在打印结果并显示“None”,我不知道为什么。 我还想知道有没有更好、更短的方法来得到正确的结果。在

这就是我所做的:

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) 无

更新:I´ve found a better solution,我把它贴在这里,以防有人想找到更好的解决方案:

^{pr2}$

Tags: 方法数字p2印章p5p1tupledinero
2条回答

将函数内部的“print”更改为“return”,当您调用“print stamps(8)”时,应该可以修复它。另外,不,对于您简单地选择图章值5、2、1,除了您正在做的之外,没有其他更有效的方法来找到一个好的解决方案(唯一可能的改进可能是使用for循环,如果您的图章值比只有3个多)如果您的图章值更复杂,那么您可以通过使用动态规划。在

正如人们所说,可以将print改为return,但是代码的一大改进是使用%(或模)运算符。在

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)

在你的代码中这一行:

^{pr2}$

执行整数除法,而下面的函数通过将除数的倍数乘以原始数并减去它来得到余数:

p5a=p5*5
resultado1=dinero-p5a
dinero=resultado1

大多数语言都提供一个modulo function,它只需一个步骤即可完成此操作:

dinero=dinero%5

这对于被3除的部分也是一样的,当你被1除时,永远不会有整数remainer,所以你可以完全删除代码。在

Python还有一种方法,可以使用返回除数和模的^{}再次缩短此值:

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)

最后,您可以完全生成它,方法是让另一个函数同时使用amount和一个stamp值数组并调用它:

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)

关于代码执行速度:

我对一些选项运行了timeit,对/和{}的调用甚至比对{}的单个调用都要快:

> 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

相关问题 更多 >

    热门问题