题
我代码强>
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 - )
您需要后if
,else
,for
等冒号和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
替代range
。 xrange
应线性空间的工作,返回数字作为必要的,而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方式?没有人像.....