位置传递
我们在定义函数时候已经对函数进行了参数传递调用,但是那只是粗浅的位置传递
示例
def sum(a,b,c): d = a+b+c return d print(sum(1,2,3))
调用函数sum的时候,1,2,3分别传递给a,b,c
关键字传递
关键字传递是根据每个参数的名字传递参数
print(sum(c=3,b=2,a=1))
关键字可以跟位置传递混合使用,但是位置参数要出现在关键字参数之前
print(sum(1,c=3,b=2))
参数默认值
在定义参数时,使用形如a=10的方式,可以给参数赋予默认值(default),如果参数最终没有被传递值,将使用该默认值。
def sum(b,c,a=10): d = a+b+c return d print(sum(c=3,b=2))
默认值需要写在最后,否则报错!
调用时候没有a的值,则使用了默认值
打印屏幕结果为:
包裹传递
在定义函数时候,我们并不知道调用函数的时候需要传递多少个参数。这时候,使用包裹传递会非常有用
下面是包裹位置传递的例子
def func(*num): print(type(num)) print(num) func(1,2,3) func(1,2,3,44,56)
两次调用,尽管参数个数不同,但是都是基于函数func定义。在func的参数表中,所有的参数被name收集,根据位置合成了一个元组(tuple),这就是包裹传递
在元组前加*
下面是包裹关键字传递的例子
def func(**dict): print(type(dict)) print(dict) func(a=1,b=2,c=3) func(a=1,b=2,c=3,d=44,e=56)
dict是一个字典,收集所有的关键字,传递函数给func。为了提醒Python,参数dict是包裹关键字传递所用的字典,
在dict前加**
解包裹
*与**也可以在调用的时候使用
下面为例子:
def func(a,b,c): print(a,b,c) args = (1,6,3) func(*args)
所谓的解包裹,就是在传递tuple时,让tuple的每一个元素对应一个位置参数。在调用func时使用*,是为了提醒Python:我想要把args拆成分散的三个元素,分别传递给a,b,c。
相应的,也存在对词典的解包裹,使用相同的func定义,然后:
def func(a,b): print(a,b) dict={'a':1,'b':2} func(**dict)
注意:请注意定义时和调用时的区分。包裹和解包裹并不是相反操作,是两个相对独立的过程。