从上学时开始,通常是用C来求阶乘,今天无事,用python写了一下,主要在于学习lambda和reduce这两个函数的使用。
实现:
~~~
#!/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()
~~~
测试:
~~~
**************************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
手册中这样描述:
~~~
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 语句等价于下面这个函数:
~~~
def my_func(x, y):
return x * y
~~~
reduce
手册中这样描述:
~~~
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中的元素进行处理,每次处理两个数据项(一个是前次处理的结果,一个是序列中的下一个元素),如此反复的递归处理,最后对整个序列求出一个单一的返回值。
改写一下上面的程序,很快可以理解这句话的意思:
~~~
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):"))))
~~~
运行结果:
~~~
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
~~~
- 前言
- Python:实现文件归档
- Pyhon:按行输出文件内容
- Python:读文件和写文件
- Python:实现一个小算法
- Python:通过命令行发送新浪微博
- Python:通过摄像头实现的监控功能
- Python:通过摄像头抓取图像并自动上传至新浪微博
- Python:简单的摄像头程序实现
- Python:日志模块logging的应用
- Python:操作嵌入式数据库SQLite
- Python:将句子中的单词全部倒排过来,但单词的字母顺序不变
- Python:语音处理,实现在线朗读RFC文档或本地文本文件
- Python:通过计算阶乘来学习lambda和reduce这两个函数的使用
- Python:通过执行100万次打印来比较C和python的性能,以及用C和python结合来解决性能问题的方法
- Python:使用matplotlib绘制图表
- Python:使用pycha快速绘制办公常用图(饼图、垂直直方图、水平直方图、散点图等七种图形)
- Python:使用pycha快速绘制办公常用图二(使用样式定制个性化图表)
- Python:监控键盘输入、鼠标操作,并将捕获到的信息记录到文件中
- Python:通过获取淘宝账号和密码的实验,来看登陆方式选择的重要性
- Python:通过获取淘宝账号和密码的实验,来看登陆方式选择的重要性(二)
- Python:通过远程监控用户输入来获取淘宝账号和密码的实验(一)
- Python:通过远程监控用户输入来获取淘宝账号和密码的实验(二)
- Python:通过自定义系统级快捷键来控制程序运行
- Python:通过自定义系统级快捷键来控制程序开始或停止记录日志(使用小技巧解决一个貌似无解的问题)
- Python:一个多功能的抓图工具开发(附源码)
- Python:程序发布方式简介一(打包为可执行文件EXE)
- Python:新浪微博应用开发简介(认证及授权部分)
- Python:程序最小化到托盘功能实现
- Python:实用抓图工具开发介绍(含需求分析、设计、编码、单元测试、打包、系统测试、发布各环节)
- Python:桌面气泡提示功能实现
- Python:未来三个月的python学习计划
- Python:pygame模块及SDL库简介
- Python:获取新浪微博用户的收听列表和粉丝列表
- Python:pygame游戏编程之旅一(Hello World)
- Python:pygame游戏编程之旅二(自由移动的小球)
- Python:pygame游戏编程之旅三(玩家控制的小球)
- Python:pygame游戏编程之旅四(游戏界面文字处理)
- Python:pygame游戏编程之旅五(游戏界面文字处理详解)
- Python:pygame游戏编程之旅六(游戏中的声音处理)
- Python:pygame游戏编程之旅七(pygame基础知识讲解1)
- Python:编程“八荣八耻”之我见
- Python:脚本的几种执行方式
- wxPython:简单的wxPython程序
- wxPython:简单的wxPython程序的另一种写法
- wxPython:应用程序对象介绍
- wxPython:输出重定向
- wxPython:关闭wxPython程序
- wxPython:Frame类介绍
- wxPython:面板Panel的使用
- wxPython:工具栏、状态栏、菜单实现
- wxPython:消息对话框MessageDialog
- wxPython:文本对话框TextEntryDialog
- wxPython:列表选择框SingleChoiceDialog
- wxPython:事件处理介绍一
- wxPython:事件处理介绍二
- wxPython: 简单的绘图例子
- wxPython:状态栏介绍
- wxPython:菜单介绍
- wxPython:文件对话框wx.FileDialog
- wxPython:颜色选择对话框wx.ColourDialog
- wxPython:布局管理器sizer介绍
- wxPython:启动画面SplashScreen介绍
- wxPython:绘画按钮BitmapButton介绍
- wxPython:进度条Gauge介绍
- Python: 发送新浪微博(使用oauth2)
- Python:读取新浪微博收听列表
- Python:DNS客户端实现