我们写东东的时候,往往有一些东西要频繁去复用,那么每个功能是10行代码,复用2次就是20行,这样看来我们的程序如果频繁利用某些代码的话,那么会是我们开发的东西越来越臃肿。那么好的方法有没有呢,那就是函数,函数可以把功能进行模块化,当大量复用的时候,可以有效的减少代码数量。
那么啥叫函数呢?打个土鳖的比方,比如我要从单位回老家的话,需要先坐地铁去火车站,然后乘坐XXx列火车回XX地,然后再打车回家。
好的,那么我们可以把这个过程抽象成一个函数命名为"回老家",当我把这个过程讲述一遍以后,在今后我再提起回老家,就可以想到。要坐地铁去火车站,然后乘坐XXx列火车回XX地,然后再打车回家这样的一个过程。这就是一个函数。
抽象成python代码的话可能是这样的:
def 回老家(): 坐地铁去火车站 乘坐xxx列车 打车回家
好的,上面的def(define)是用来声明一个函数。函数主体就是一个过程。
接下来我们实际编写一个函数:
def SayHello(): print "hello world!"
上面的函数,只要我们引用他,那么他就会打印hello world这句话,
接下来我们就要讲些如何给函数赋值变量了。不然他总执行一个动作,功能上未免有些单一。
函数的参数赋值,基本上分为3类。
第一类,直接引用参数(变量)
def SayHello(a,b,c): print "hello world %s %s %s" %(a,b,c)
1、使用方法:
SayHello("hello","world","!")#依次将"hello","world","!"赋值给a,b,c,缺陷是:如果用户给出的参数个数小于要求个数会报错。
2、使用方法:
SayHello(a="say",b="hello",c="world")#依次将"say","hello","world",赋值给a,b,c,好处是,可以一目了然的知晓赋值了哪些参数。
当然有些时候,我们限定了2个参数,如果用户少给了参数,那么程序会报错,但是用户手抖或者记错了,多写了参数一般情况都是不输出,那岂不是很不爽,是吧?
那好我们接下来看看怎么让用户多输入的参数也能够打印出来。
#-*- encoding:utf8 -*- a="hello" b="world" def say2(a,b,*c): print "系统默认的参数%s %s" %(a,b) if c: print "其他参数", for i in c: print i, say2(a,b,"other","canshu")
这样输出出来:
系统默认的参数hello world
其他参数 other canshu
那好,我们来看看*c做了一个什么操作
#-*- encoding:utf8 -*- a="hello" b="world" def say2(a,b,*c): print "系统默认的参数%s %s" %(a,b) if c: print "c is ",c print "其他参数", for i in c: print i, say2(a,b,"other","canshu") 输出结果: 系统默认的参数hello world c is ('other', 'canshu') 其他参数 other canshu
好的,我们可以看到*c 就是把原来未定义的所有参数,都融合到一起,然后组成了一个列表(关于列表的使用这里就不赘述了)。
在看另一种情况,如果某些同学佯装高端,这么去写
#-*- encoding:utf8 -*- a="hello" b="world" def say2(a,b,*c): print "系统默认的参数%s %s" %(a,b) if c: print "c is ",c print "其他参数", for i in c: print i, say2(a="other",b="world",name="dab")
结果出错:
Traceback (most recent call last):
File "F:\python\python\crossin\test_def.py", line 11, in <module>
say2(a="other",b="world",name="dab")
TypeError: say2() got an unexpected keyword argument 'name'
告诉你类型错误,获取了一个意外的关键词选项。
这个错误是因为name="dab"无法转换为列表。那这种情况可以使用如下代码进行处理。
#-*- encoding:utf8 -*- a="hello" b="world" def say2(a,b,**c): print "系统默认的参数%s %s" %(a,b) if c: print "c is ",c print "其他参数", for i in c: print i, say2(a="other",b="world",name="dab") 结果: 系统默认的参数other world c is {'name': 'dab'} 其他参数 name
从上面的结果可以看到,**c是把多余的选项当作字典进行储存。