Python中的函数(三)
在前面两篇文章中已经探讨了函数的一些相关用法,下面一起来了解一下函数参数类型的问题。在C语言中,调用函数时必须依照函数定义时的参数个数以及类型来传递参数,否则将会发生错误,这个是严格进行规定的。然而在Python中函数参数定义和传递的方式相比而言就灵活多了。
一.函数参数的类型
之前我们接触到的那种函数参数定义和传递方式叫做位置参数,即参数是通过位置进行匹配的,从左到右,依次进行匹配,这个对参数的位置和个数都有严格的要求。而在Python中还有一种是通过参数名字来匹配的,这样一来,不需要严格按照参数定义时的位置来传递参数,这种参数叫做关键字参数。下面举两个例子:
def display(a,b): print a print b display('hello','world')
这段程序是想输出'hello world',可以正常运行。如果像下面这样写的话,结果可能就不是预期的样子了:
def display(a,b): print a print b #这样会报错 display('hello') #这样会输出'world hello' display('world','hello')
可以看出在Python中默认的是采用位置参数来传参。这样调用函数必须严格按照函数定义时的参数个数和位置来传参,否则将会出现预想不到的结果。下面这段代码采用的就是关键字参数:
def display(a,b): print a print b #下面2句达到的效果是相同的 display(a='world',b='hello') display(b='hello',a='world')
可以看到通过指定参数名字传递参数的时候,参数位置对结果是没有影响的。
关键字参数最厉害的地方在于它能够给函数参数提供默认值。比如:
def display(a='hello',b='wolrd'): print a+b display() display(b='world') display(a='hello') display('world')
在上面的代码中,分别给a和b指定了默认参数,即如果不给a或者b传递参数时,它们就分别采用默认值。在给参数指定了默认值后,如果传参时不指定参数名,则会从左到右依次进行传参,比如display('world')没有指定'world'是传递给a还是b,则默认从左向右匹配,即传递给a。
使用默认参数固然方便,但是有一点要非常注意,在重复调用函数时默认形参会继承之前一次调用结束之后该形参的值。下面看一个例子:
def insert(a,L=[]): L.append(a) print L insert('hello') insert('world')
其运行结果为:
二.任意个数参数
一般情况下我们在定义函数时,函数参数的个数是确定了的,然而某些情况下我们是不能确定参数的个数的,比如要存储某个人的名字和它的小名,某些人小名可能有2个或者更多个,此时无法确定参数的个数,就可以使用收集参数了,使用收集参数只需在参数前面加上'*'或者'**'。
def storename(name,*nickName): print 'real name is %s' %name for nickname in nickName: print nickname storename('jack') storename(u'詹姆斯',u'小皇帝') storename(u'奥尼尔',u'大鲨鱼',u'三不沾')
'*'和'**'表示能够接受0到任意多个参数,'*'表示将没有匹配的值都放在同一个元组中,'**'表示将没有匹配的值都放在一个dictionary中。
def printvalue(a,**d): print 'a=%d' %a for x in d: print x+'=%d' %d[x] printvalue(1,b=2,c=3)
最后需要补充一点:Python中函数是可以返回多个值的,如果返回多个值,会将多个值放在一个元组或者其他类型的集合中来返回。
def function(): x=2 y=[3,4] return x,y print function()
关于函数的东西暂时就只讲这么多了,具体的用法和细节需要在平时写代码中慢慢理解和积累。