Python:通过计算阶乘来学习lambda和reduce这两个函数的使用
2013-01-12 08:19
876 查看
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的专栏
相关文章推荐
- Python:通过计算阶乘来学习lambda和reduce这两个函数的使用
- Python:通过计算阶乘来学习lambda和reduce这两个函数的使用
- python中的zip、map、reduce 、lambda函数的使用。
- python学习--使用 lambda 函数
- Python高阶函数(Map、Reduce、Filter)和lambda函数一起使用 ,三剑客
- Python学习笔记: Python匿名函数lambda的使用
- Python学习笔记(5):lambda,filter,map,reduce,zip用法整理
- Python学习(一)函数定义、使用与嵌套
- Python学习之功能函数使用方法详解
- python中Groupby使用(四)-通过函数进行分组
- python2,3中内建函数map,reduce,filter,sorted配合lambda
- python几个重要的函数(lambda,filter,reduce,map,zip)
- 【python】filter,map,reduce和lambda函数介绍
- Python学习——reduce()函数的用法
- python学习3:自定义函数使用
- python学习中的reduce()函数和lambda表达式
- python的reduce()函数使用详解
- Python中特殊函数和表达式 filter,map,reduce,lambda
- python lambda和reduce 学习札记1 跟我学python
- 零基础入门学习Python(21)--函数:lambda表达式