2013-10-21 90 views
2

我是Python新手,剛剛學習語法和各種函數。我想知道如果Python中的因子函數

x=reduce((lambda x,y: x*y) , [x for x in range(5) if x > 0]) 

是一個正確的函數來計算數的階乘?

親切的問候

+0

東西線你新的編程或新到Python?你應該使用'math'模塊的'factorial'函數。 – hop

回答

6

沿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) 
3

差不多 - 但如果你想5!你應該做range(6)。此外,一個小的風格問題:你應該用圓括號而不是括號括住你的生成器表達式,以便不需要構建臨時列表。最後,if-子句不是必需的 - 只需使用range的雙參數版本即可。

+3

或甚至只是使用'range(1,6)'代替整個列表/發生器的理解。 – Duncan

+0

哈,你打敗了我。 – Sneftel

+0

最重要的是,你可以使用''operator.mul''而不是lambda(第一個''import operator'')。 – fjarri

4

簡稱:

x = reduce(lambda x,y: x*y, range(1,5)) 

短,取而代之的是拉姆達:

from operator import mul 
x = reduce(mul, range(1,5)) 

或最短,從數學模塊(感謝跳):

from math import factorial 
factorial(4) # range/xrange above does not include the upper value 
1
def factorial(n):return reduce(lambda x,y:x*y,[1]+range(1,n+1)) 
+1

更好:'reduce(lambda x,y:x * y,xrange(1,n + 1),1)' –

+0

我使用def來定義函數factorial(n),所以每一行你需要做階乘函數,只需調用factorial(n),所以你避免寫你需要的每一行的reduce(lambda x,y:x * y,xrange(1,n + 1),1) – AlvaroAV

1

另一個使用遞歸方法:

def factorial(n): 
    if n == 0: 
     return 1 
    else: 
     return n*factorial(n-1) 

無論如何,最好使用math.factorial