先说说函数定义,我们都知道,下面的代码定义了一个函数funcA
def funcA():
下面这个函数funcB就有两个参数了,
我们可以在函数定义中使用参数默认值,比如
我们要定义一个函数的时候,必须要预先定义这个函数需要多少个参数(或者说可以接受多少个参数)。一般情况下这是没问题的,但是也有在定义函数的时候,不能知道参数个数的情况(想一想C语言里的printf函数),在Python里,带*的参数就是用来接受可变数量参数的。看一个例子 好了,一颗星我们弄清楚了,下面轮到两颗星。
上面的例子里,调用函数的时候,传递的参数都是根据位置来跟函数定义里的参数表匹配的,比如funcB(100, 99)和funcB(99, 100)的执行结果是不一样的。在Python里,还支持一种用关键字参数(keyword argument)调用函数的办法,也就是在调用函数的时候,明确指定参数值付给那个形参。比如还是上面的funcB(a, b),我们通过这两种方式调用
另外,在函数调用中,可以混合使用基于位置匹配的参数和关键字参数,前题是先给出固定位置的参数,比如
好了,经过以上铺垫,两颗星总算可以出场了: 常规参数,*参数及**参数可以同时使用,具体怎么用?看看Python Reference Manual吧,关于Function definitions的那些章节。其实,笨想也能猜出来啊,o(∩_∩)o... 综上: *—>() 元组tuple **—>{} 字典dict
对于参数解包: 例如在built-in模块中的range()函数,默认是接受两个参数_start和_stop。如果他们不能分开写,我们就可以用*运算符来直接解包tuple或者list。 即,tuple和list可以运用*运算法来存储keywords参数。 >>> range(3, 6) # normal call with separate arguments[3, 4, 5] >>> args = [3, 6]>>> range(*args) # call with arguments unpacked from a list[3, 4, 5] 因此,相同的方式,dict类型可以通过**运算符用来存储关键字参数。 >>> def parrot(voltage, state='a stiff', action='voom'): ... print "-- This parrot wouldn't", action, ... print "if you put", voltage, "volts through it.", ... print "E's", state, "!" ... >>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"} >>> parrot(**d) -- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised ! |
|