我代码

import sys

number=int(sys.argv[1])

if number == 0
    fact=1
else
    fact=number
for (x=1; x<number; x++)
    fact*=x;             // mistake probably here

print fact

我得到的错误

File "factorial.py", line 5
    if number == 0
                 ^
SyntaxError: invalid syntax

你怎么能在Python中的阶乘函数?

有帮助吗?

解决方案

这是你的代码,固定起来工作:

import sys
number = int(sys.argv[1])
fact = 1
for x in range(1, number+1):
    fact *= x

print fact

(阶乘零是一个,任何人谁不知道 - 我不得不看它8 - )

您需要后ifelsefor等冒号和for在Python的工作方式是由C不同。

其他提示

这你的错误是在该行应该读

if number == 0:

请注意在端结肠。

此外,你需要别人和为以后添加相同的结肠。冒号在其他语言的工作方式类似于{}。

最后,那不是如何for循环在Python工作。该代码要使用该列表会

for x in range(1,number):

这将有你写一样的效果,如果你把在一个C语言风格。

编辑:哎呀,for循环我给错了,它会包括0我更新的代码,以纠正这种

据我所知,你可能想这个自己实现教育的原因。

然而,如果没有,我建议使用math模块内置阶乘函数(注意:需要蟒2.6或更高):

>>> import math
>>> math.factorial(5)
120

这个模块是用C,并且因此,这将是比在Python写入它更快得多。 (不过,如果你不计算大的阶乘,它不会真的太慢无论哪种方式)。

原因马克Rushakoff的事实(n)函数是这么多的更有效的是,他错过了断的减少()函数。因此,它实际上从未做过的计算。

更正它读取(和我得到):

import operator, timeit, math
#
def fact1(n):  return reduce(lambda x,y: x*y,  range(1,n+1),1)
def fact1x(n): return reduce(lambda x,y: x*y, xrange(1,n+1),1)
def fact2(n):  return reduce(operator.mul   ,  range(1,n+1),1)
def fact2x(n): return reduce(operator.mul   , xrange(1,n+1),1)
#
def factorialtimer():
    for myfunc in [ "fact1", "fact1x", "fact2", "fact2x" ]:
        mytimer = timeit.Timer(myfunc+"(1500)", "from __main__ import "+myfunc)
        print("{0:15} : {1:2.6f}".format(myfunc, mytimer.timeit(number=1000)))

    mytimer = timeit.Timer("factorial(1500)", "from math import factorial")
    print("{0:15} : {1:2.6f}".format("math.factorial", mytimer.timeit(number=1000)))
对于1500

结果输出!1000X:

fact1           : 3.537624
fact1x          : 4.448408
fact2           : 4.390820
fact2x          : 4.333070
math.factorial  : 4.091470

是的,我已经检查它们都产生相同的价值! 我不明白为什么在lambda x范围是如此之比拉姆达范围更糟。嗯。 版: PythonWin的2.6.2(r262:71605,2009年4月14日,22时40分02秒)。[MSC v.1500 32位(英特尔)]在Win32

嗯......上重新运行它,我得到的东西更可信

fact1           : 7.771696
fact1x          : 7.799568
fact2           : 7.056820
fact2x          : 7.247851
math.factorial  : 6.875827

和关于Python 2.6.5(R265:79063,2010年6月12日,17点07分01秒)[GCC 4.3.4 20090804(释放)1]在Cygwin:

fact1           : 6.547000
fact1x          : 6.411000
fact2           : 6.068000
fact2x          : 6.246000
math.factorial  : 6.276000

中的所有噪声确实,是吗?

下面是一个功能性因子,你几乎问:

>>> def fact(n): return reduce (lambda x,y: x*y, range(1,n+1))
... 
>>> fact(5)
120

它不为事实(0)工作,但你可以不用担心这fact范围之外:)


骂死已要求功能的风格是否比Richie的执行效率。根据我的快速基准(让我吃惊!)是的,我的速度更快。但有几件事情我们可以做些什么来改变。

首先,我们可以用lambda x,y: x*y作为另一个评论建议替代operator.mul。 Python的lambda运营商带有一个不可忽略的开销。其次,我们可以为xrange替代rangexrange应线性空间的工作,返回数字作为必要的,而range创建一下子整个列表。 (注意然后,你几乎一定要用xrange对于过大的范围内的数字)

因此,新的定义就变成:

>>> import operator
>>> def fact2(n): return reduce(operator.mul, xrange(1,n+1))
... 
>>> fact2(5)
120

要我吃惊的是,这实际上导致性能的下降。这里的Q&d基准:

>>> def fact(n): return (lambda x,y: x*y, range(1,n+1))
... 
>>> t1 = Timer("fact(500)", "from __main__ import fact")
>>> print t1.timeit(number = 500)
0.00656795501709

>>> def fact2(n): return reduce(operator.mul, xrange(1,n+1))
...
>>> t2 = Timer("fact2(500)", "from __main__ import fact2")
>>> print t2.timeit(number = 500)
0.35856294632

>>> def fact3(n): return reduce(operator.mul, range(1,n+1))
... 
>>> t3 = Timer("fact3(500)", "from __main__ import fact3")
>>> print t3.timeit(number = 500)
0.354646205902

>>> def fact4(n): return reduce(lambda x,y: x*y, xrange(1,n+1))
... 
>>> t4 = Timer("fact4(500)", "from __main__ import fact4")
>>> print t4.timeit(number = 500)
0.479015111923

>>> def fact5(n):
...     x = 1
...     for i in range(1, n+1):
...             x *= i
...     return x
... 
>>> t5 = Timer("fact5(500)", "from __main__ import fact5")
>>> print t5.timeit(number = 500)
0.388549804688

下面是在任何情况下,我的Python版本要交叉检查我的结果:

Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41) 
[GCC 4.3.3] on linux2

真,最简单的办法是:

def factorial(n):
    x = n
    for j in range(1, n):
        x = j*x
    return x

是,在某种程度上,它的工作原理。

你怎么能不看?我不知道。

一个for环和一乘法器,真正简单是最好的方式,是吗?

编辑:哦,等等,我们正在努力为最CPU-efficeint方式?没有人像.....

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top