Python:通過計算階乘來學習lambda和reduce這兩個函數的使用

來源:互聯網
上載者:User
Python:通過計算階乘來學習lambda和reduce這兩個函數的使用閱讀:128次   時間:2012-02-20 05:26:25   字型:[大
中 小]

 從上學時開始,通常是用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() 
#!/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 
**************************************************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
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 
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. 
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):")))) 
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 
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

摘自 Socrates的專欄
 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.