python中函数的总结之三
1、 可变长参数
在函数中可变长参数分为两种:一种是非关键字参数,表示为元组;一种是关键字参数,表示为字典。
具体看下面的例子代码,相当于单元测试:
#!/usr/bin/env python
#'this is a example of the unit test'
def testit(func,*nkwargs,**kwargs):
'this is the test of the function'
try:
retval = func(*nkwargs,**kwargs) #调用函数来进行测试
result = (True,retval) #返回值为一个元组
except Exception,diag:
result = (False,str(diag))
return result def main():
'this is the unittest input'
funcs = (int,long,float)
vars = (12,12.34,'12','12.34')
for eachFunc in funcs:
print '-'*20
for eachVal in vars:
result = testit(eachFunc,eachVal)
if result[0]:
print '%s(%s) = ' % (eachFunc.__name__,eachVal),result[1]
else:
print '%s(%s) FAILED:' % (eachFunc.__name__,eachVal),result[1] if __name__== '__main__':
main()
在主函数main中,主要是输入的参数和需要测试的方法,在循环中,依次对函数进行了测试
辅助函数testit接收了三个参数,一个是函数对象,一个是非关键字参数,一个是关键字参数
返回值为一个元组,然后使用元组的值来进行判断,是否成功调用。
2、 内建函数reduce
内建函数reduce的语法如下:
reduce(func,seq[,init])
将二元函数作用域seq序列的元素,每次使用seq的两个元素,当前的元素和下一个序列的元素,当指定了init的时候,那么表示使用init的值和第一个元素,连续的将现在的结果和下面的值作用于获得的随后结果上,最后,返回一个单一的值。
例子如下:
>>> reduce(lambda x,y :x+y,(1,2,3,4))
10
>>> reduce(lambda x,y :x+y,(1,2,3,4),10)
20
使用了一个lambda函数,来计算两个元素相加,在以上的例子中,表示将序列每个元素进行相加,最后得到一个结果,指定了init=10之后,表示也是相加的结果
3、偏函数
一个带有n个参数的,偏函数将一个参数固化为固定参数,并返回第一个和带n-1个函数的函数对象,在这里使用的functools模块的partial,如下例子:
>>> from operator import add,mul
>>> from functools import partial
>>> add1 = partial(add,1)
>>> add1(10)
11
>>> add1(11)
12
在add的时候,本来是需要两个参数的,然后固定一个参数为1,那么每次调用的时候,只要调用偏函数即可。
#!/usr/bin/env python from functools import partial
import Tkinter root = Tkinter.Tk()
MyButton = partial(Tkinter.Button,root,fg='white',bg='blue') #固化其中的背景色和前置颜色
b1 = MyButton(text='Button1 ') #在生成的时候,直接使用偏函数对象即可
b2 = MyButton(text='Button2 ')
qb = MyButton(text='QUIT ',bg='red',command=root.quit) #偏函数对象中的参数可以修改
b1.pack()
b1.pack()
qb.pack(fill=Tkinter.X,expand=True)
root.title('PFAs!')
root.mainloop()
在以上代码中,主要是进行固话部分参数,例如背景颜色,前面的颜色,从而不用在每次进行定义的时候都进行定义,这就是偏函数的引用,也就是固话其中的一些参数,从而简化代码。
3、 传递参数
函数是可以被引用的(访问或者以其他变量作为别名),也作为参数传入函数,已经作为字典和列表等容器对象的元素。
函数是可以调用:一是可以用其他的变量作为函数的别名;而是可以通过函数操作来调用他们
如:
foo——表示函数对象的引用
foo()——便是函数对象的调用
#!/usr/bin/env python def convert(func,seq):
return [func(eachNum) for eachNum in seq] #调用函数 if __name__ == '__main__':
myseq = (123,45.67,9999L)
print convert(int,myseq) #直接进行函数对象的引用
python函数的形参集合由在调用时要传入函数的的所有参数的组成,这参数与函数声明中的列表精确配对。
a、 位置参数:所有的位置参数必须出现在任何一个默认参数之前,位置参数必须传入,不按位置用关键字参数传入
b、 关键字参数
c、 默认参数---主要是用来方便使用,使用默认参数的时候,使用方便。
4、 递归
递归主要是用来用来一种循环的方式来使用,在使用递归的时候,必须有基本的条件从而可以结束:
#!/usr/bin/env python
def factoral(n):
if n == 0 or n == 1:
return n
else:
return n*factoral(n-1)
print factoral(4)
以上为一个递归的例子,主要是用来求阶乘。在使用递归的时候,必须确定结束的条件,从而来进行循环递归。
5、闭包和装饰器例子
主要用来写入日志,在调用函数之前或者之后进行写入日志的操作,代码如下:
#!/usr/bin/env python
from time import time def logged(when):
def log(f,*args,**kargs): #主要的记录日志的函数
print '''Called:
function:%s
args:%s
kargs:%r''' %(f,args,kargs) def pre_logged(f): #在函数使用之前的记录
def wrapper(*args,**kargs):
log(f,*args,**kargs)
return f(*args,**kargs)
return wrapper def post_logged(f):#在函数使用之后记录
def wrapper(*args,**kargs):
now = time()
try:
return f(*args,**kargs)
finally:
log(f,*args,**kargs)
print 'time delta:%s' %(time()-now)
return wrapper try:
return {'pre':pre_logged,'post':post_logged}[when] #查看调用何种函数进行处理
except KeyError,e:
raise ValueError(e),'must be pre or post' @logged('pre')#装饰器1
@logged('post')#装饰器2
def hello(name):
print 'Hello',name hello('WORD')
python中函数的总结之三的更多相关文章
- python 中函数的参数
一.python中的函数参数形式 python中函数一般有四种表现形式: 1.def function(arg1, arg2, arg3...) 这种是python中最常见的一中函数参数定义形式,函数 ...
- python 中函数参数传递形式
python中函数参数的传递是通过赋值来传递的.函数参数的使用又有俩个方面值得注意:1.函数参数是如何定义的 2.在调用函数的过程中参数是如何被解析 先看第一个问题,在python中函数参数的定义主要 ...
- python中函数的参数解析
python中函数的各种参数梳理: 1.形参:函数定义时传入的参数 2.实参:函数调用时传入的参数 (有形参必传实参,形参里自身特点可不传的,可传可不传) 3.缺省参数:不传为默认值,传了会覆盖(下面 ...
- (转)python中函数参数中如果带有默认参数list的特殊情况
在python中函数参数中如果带有默认参数list遇到问题 先看一段代码 1 2 3 4 5 6 7 8 9 def f(x,l=[]): for i in range(x): ...
- 学以致用三十二-----python中函数的括号使用
一直以来对python中函数括号的使用,有点分不清楚,到底什么时候用括号,什么时候不用括号,造成了很大看困惑. 今天来总结下. class aaa(): y = 'you' def __init__( ...
- python中函数的参数
函数参数(一) 思考一个问题,如下: 现在需要定义一个函数,这个函数能够完成2个数的加法运算,并且把结果打印出来,该怎样设计?下面的代码可以吗?有什么缺陷吗? def add2num(): a = 1 ...
- python中函数的定义和详细的使用方法
1. 函数的概念,函数是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集 2. 函数的作用,使用函数可以加强代码的复用性,提高程序编写的效率 3. 函数的使用,函数必须先创建才 ...
- Python中函数的参数传递与可变长参数
转自旭东的博客原文 Python中函数的参数传递与可变长参数 Python中传递参数有以下几种类型: (1)像C++一样的默认缺省函数 (2)根据参数名传参数 (3)可变长度参数 示例如下: (1)默 ...
- python中函数参数传递的几种方法
转自 http://www.douban.com/note/13413855/ Python中函数参数的传递是通过“赋值”来传递的.但这条规则只回答了函数参数传递的“战略问题”,并没有回答“战术问题 ...
随机推荐
- BI
http://www.cnblogs.com/biwork/p/3276455.html http://www.cnblogs.com/biwork/p/3328879.html http://www ...
- 解决:Eclipse调试的时候报错'Launching XXX' has encountered a problem. Cannot connect to VM.
问题如下图: 原因:开了代理(我使用的是Proxifier)如图 解决方案:关闭Proxifier即可
- Nand flash uboot 命令详解【转】
转自:http://blog.chinaunix.net/uid-14833587-id-76513.html nand info & nand device 显示flash的信息: DM36 ...
- eclipse中启动tomcat报错 java.lang.ClassNotFoundException
之前启动还好好的,某次启动tomcat就莫名其妙的报了这个java.lang.ClassNotFoundException的错. 检查maven依赖包,发现这个类是存在的. 然后一通clean操作 ...
- char和vchar
Varchar往往用来保存可变长度的字符串.简单的说,我们只是给其固定了一个最大值,然后系统会根据实际存储的数据量来分配合适的存储空间. 为此相比CHAR字符数据而言,其能够比固定长度类型占用更少的存 ...
- [转载] 推荐的C++书籍以及阅读顺序
2014-06-17 转载自 oiramario 的文章 推荐的C++书籍以及阅读顺序 当读者有一定c/c++基础 推荐的阅读顺序: level 1 从<<essential c++> ...
- 《OD学Oozie》20160807Oozie
一.引入 MapReduce Job Hive 脚本任务 同一个业务:先后.定时调度 工作流: 定义工作流程 activity jbpm oozie: 大数据工作流定义与调度框架 专门定义与调度Map ...
- AutoCompleteTextView与TextWatcher的结合
/******************************************************************************************** * au ...
- R语言iris数据集的层次聚类
data=iris[,-5]dist.e=dist(data,method='euclidean')model1=hclust(dist.e,method='ward') #分3类result=cut ...
- IOS中tableView每组的头部控件、通过tableView的代理方法控制某一行的cell能否达到高亮选中状态
一.tableView每组的头部控件 1.控件宽度默认就是tableView的宽度 2.控件高度由下面的代理方法决定 - (CGFloat)tableView:(UITableView *)table ...