In [3]: def fun(test): ...: '''This is a test content''' ...: print("%s" % test) ...: In [4]: print fun.__doc__ #打印函数的说明信息This is a test content
#在数学中函数,执行完成之后,总是会返回一些数值;因为我们借助于函数做一些运算。 #但正如上面定义fun()一样,这个函数我们并没有任何的返回结果,这样的形式一般称之为过程。# 但是在python中二者的区分并不是那么明确。
在c语言中有形参和实参之分,在这里我们参照c语言中的定义。
形参:在定义函数时,指定的参数叫形参。
实参:在调用函数是,给函数传递的值叫实参。
In [5]: def fun(x,y,z): # 这里的x, y,z叫形参 ...: print x ...: print y ...: print z ...: In [6]: fun(1,2,3) # 这里的1,2,3叫实参1 2 3# 在这里我们直接给fun()函数传递了三个数值,他会按照形参出现的位置顺序,把实参的值传递给形参。
In [7]: fun(z=8,x=9,y=7) # 传递实参时使用这种形式,叫关键字参数9 7 8In [8]: fun(8,z=9,y=4) # 关键字参数和位置参数的结合使用8 4 9In [9]: fun(y=6,3,8) # 关键字参数,必须在位置参数之后 File "", line 1 fun(y=6,3,8) SyntaxError: non-keyword arg after keyword arg
在定义函数时,可以直接给形参指定对应的值,若在调用是没有传入数值,则使用默认的值;若在调用时传入了数值,则使用传入的值。
In [10]: def fun1(x,y=5): ....: print x ....: print y ....: In [11]: fun1(4) #调用是没有只传人一个数值4 5In [12]: fun1(4,9) # 调用时传入两个数值4 9In [13]:
In [13]: def fun(test): # 注意这两个参数的异同 ....: print test ....: In [14]: def fun1(*test): # 多了一个*号 ....: print test ....: In [15]: fun(1,2,3)---------------------------------------------------------------------------TypeError Traceback (most recent call last)in ()----> 1 fun(1,2,3) TypeError: fun() takes exactly 1 argument (3 given) In [16]: fun1(1,2,3) # 会以元组的形式返回参数列表(1, 2, 3) In [17]: def fun2(x, *test): # 含有位置参数, ....: print x ....: print test ....: In [18]: fun2(1,2,3,4,5) #×号就是收集其余的位置参数1(2, 3, 4, 5)
若想收集关键字参数,则需要如下这样:
In [19]: fun1(x=1,y=2,z=4)---------------------------------------------------------------------------TypeError Traceback (most recent call last)in ()----> 1 fun1(x=1,y=2,z=4) TypeError: fun1() got an unexpected keyword argument 'x'In [21]: def fun3(**kargs): #定义形参时候使用双*号,可以处理关键字参数 ....: print kargs ....: In [22]: fun3(x=1,y=2,z=4) # 关键字参数以字典形式返回{'y': 2, 'x': 1, 'z': 4}
以上是形参的设置,来处理不同类型的实参。反过来我们也可以把元组,或者字典作为实参,传入到函数的形参里面。
In [23]: def add(x,y): # 定义一个简单的函数 ....: print x +y ....: In [24]: add(4,5) # 调用查看结果,作对比9In [25]: tuple1 = (34,54) # 定义一个元组,In [26]: add(*tuple1) # 把元组作为参数传递给函数88In [27]: dict1 = {"x":43, "y":32} # 定义一个字典, In [28]: add(**dict1) #把字典作为参数传递给函数75In [29]: dict2 = {"a":43, "b":32} # 定义另一个字典 In [30]: add(**dict2) #同样的传递,却失败---------------------------------------------------------------------------TypeError Traceback (most recent call last)in ()----> 1 add(**dict2) TypeError: add() got an unexpected keyword argument 'a'# 在使用字典传递参数时候,字典的key值要和形参的值对应,这里字典的键key值必须为x, y与形参对应