我是 Python 新手,只是在学习语法和各种功能。我想知道是否
x=reduce((lambda x,y: x*y) , [x for x in range(5) if x > 0])
是计算数字阶乘的正确函数吗?
亲切的问候
我是 Python 新手,只是在学习语法和各种功能。我想知道是否
x=reduce((lambda x,y: x*y) , [x for x in range(5) if x > 0])
是计算数字阶乘的正确函数吗?
亲切的问候
类似于http://www.willamette.edu/~fruehr/haskell/evolution.html的东西
# beginner
def fac(n):
f = 1
i = 1
while i <= n:
f *= i
i += 1
return f
# advanced beginner
def fac(n):
return n * fac(n - 1) if n > 1 else 1
# intermediate
def fac(n):
return reduce(lambda x, y: x * y, range(1, n + 1))
# advanced intermediate
import operator
def fac(n):
return reduce(operator.mul, xrange(1, n + 1))
# professional
import math
print math.factorial(5)
# guru
import scipy.misc as sc
print sc.factorial(5, exact=True)
短的:
x = reduce(lambda x,y: x*y, range(1,5))
更短,而不是 lambda:
from operator import mul
x = reduce(mul, range(1,5))
或最短,来自数学模块(感谢 hop):
from math import factorial
factorial(4) # range/xrange above does not include the upper value
差不多——不过如果你想要 5!,你应该做range(6)
. 此外,还有一个小风格问题:您应该用括号而不是方括号将生成器表达式括起来,这样就不需要构建临时列表。最后,if 子句不是必需的——只需使用range
.
def factorial(n):return reduce(lambda x,y:x*y,[1]+range(1,n+1))
使用递归的另一种方法:
def factorial(n):
if n == 0:
return 1
else:
return n*factorial(n-1)
无论如何,最好使用math.factorial。