從上學時開始,通常是用C來求階乘,今天無事,用python寫了一下,主要在於學習lambda和reduce這兩個函數的使用。
實現:
[python]
- #!/usr/bin/env python
- #-*- coding: utf-8 -*-
-
- import time
-
- def test_factorial_reduce():
- '''''
- Function:使用reduce函數
- Input:NONE
- Output: NONE
- author: socrates
- blog:http://blog.csdn.net/dyx1024
- date:2012-02-19
- '''
- time_begin = time.clock()
- print reduce(lambda x,y:x*y, range(1, long(raw_input("please input a number ( > 0):"))))
- print "Use time: %s" % (time.clock() - time_begin)
-
- return;
-
- def test_factorial_math():
- '''''
- Function:使用math庫函數
- Input:NONE
- Output: NONE
- author: socrates
- blog:http://blog.csdn.net/dyx1024
- date:2012-02-19
- '''
- import math
- time_begin = time.clock()
- print math.factorial(long(raw_input("please input a number ( > 0):")))
- print "Use time: %s" % (time.clock() - time_begin)
-
- if __name__ == '__main__':
-
- print '*' * 50 + "Use reduce" + '*' * 50
- test_factorial_reduce()
-
- print '*' * 50 + "Use math api" + '*' * 50
- test_factorial_math()
測試:
[plain]
- **************************************************Use reduce**************************************************
- please input a number ( > 0):50
- 608281864034267560872252163321295376887552831379210240000000000
- Use time: 3.3163365735
- **************************************************Use math api**************************************************
- please input a number ( > 0):50
- 30414093201713378043612608166064768844377641568960512000000000000
- Use time: 3.70409004496
我們感興趣的不在程序本身,我想更多地會關注lambda和reduce這兩個函數,我們來看一下:
lambda
手冊中這樣描述:
[plain]
- lambda
- An anonymous inline function consisting of a single expression which is evaluated when the function is called. The syntax to create a lambda function is lambda [arguments]: expression
其實lambda就是個匿名函數,它本身是一個表達式,而def為一個語句,這就是說lambda可以用於函數中做為參數等,但def這個語句不能。
我們的 lambda x,y:x*y 語句等價於下面這個函數:
[python]
- def my_func(x, y):
- return x * y
reduce
手冊中這樣描述:
[plain]
- reduce(function, iterable[, initializer])
- Apply function of two arguments cumulatively to the items of iterable, from left to right, so as to reduce the iterable to a single value. For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates ((((1+2)+3)+4)+5). The left argument, x, is the accumulated value and the right argument, y, is the update value from the iterable. If the optional initializer is present, it is placed before the items of the iterable in the calculation, and serves as a default when the iterable is empty. If initializer is not given and iterable contains only one item, the first item is returned.
就是用函數function對序列,如list中的元素進行處理,每次處理兩個數據項(一個是前次處理的結果,一個是序列中的下一個元素),如此反復的遞歸處理,最後對整個序列求出一個單一的返回值。
改寫一下上面的程序,很快可以理解這句話的意思:
[python]
- def my_func(x, y):
- print 'x = %d, y = %d' %(x, y)
- return x * y
-
- print reduce(my_func, range(1, long(raw_input("please input a number ( > 0):"))))
運行結果:
[plain]
- please input a number ( > 0):50
- x = 1, y = 2
- x = 2, y = 3
- x = 6, y = 4
- x = 24, y = 5
- x = 120, y = 6
- x = 720, y = 7
- x = 5040, y = 8
- x = 40320, y = 9
- x = 362880, y = 10
- x = 3628800, y = 11
- x = 39916800, y = 12
- x = 479001600, y = 13
- x = 6227020800, y = 14
- x = 87178291200, y = 15
- x = 1307674368000, y = 16
- x = 20922789888000, y = 17
- x = 355687428096000, y = 18
- x = 6402373705728000, y = 19
- x = 121645100408832000, y = 20
- x = 2432902008176640000, y = 21
- x = 51090942171709440000, y = 22
- x = 1124000727777607680000, y = 23
- x = 25852016738884976640000, y = 24
- x = 620448401733239439360000, y = 25
- x = 15511210043330985984000000, y = 26
- x = 403291461126605635584000000, y = 27
- x = 10888869450418352160768000000, y = 28
- x = 304888344611713860501504000000, y = 29
- x = 8841761993739701954543616000000, y = 30
- x = 265252859812191058636308480000000, y = 31
- x = 8222838654177922817725562880000000, y = 32
- x = 263130836933693530167218012160000000, y = 33
- x = 8683317618811886495518194401280000000, y = 34
- x = 295232799039604140847618609643520000000, y = 35
- x = 10333147966386144929666651337523200000000, y = 36
- x = 371993326789901217467999448150835200000000, y = 37
- x = 13763753091226345046315979581580902400000000, y = 38
- x = 523022617466601111760007224100074291200000000, y = 39
- x = 20397882081197443358640281739902897356800000000, y = 40
- x = 815915283247897734345611269596115894272000000000, y = 41
- x = 33452526613163807108170062053440751665152000000000, y = 42
- x = 1405006117752879898543142606244511569936384000000000, y = 43
- x = 60415263063373835637355132068513997507264512000000000, y = 44
- x = 2658271574788448768043625811014615890319638528000000000, y = 45
- x = 119622220865480194561963161495657715064383733760000000000, y = 46
- x = 5502622159812088949850305428800254892961651752960000000000, y = 47
- x = 258623241511168180642964355153611979969197632389120000000000, y = 48
- x = 12413915592536072670862289047373375038521486354677760000000000, y = 49
- 608281864034267560872252163321295376887552831379210240000000000