1. 位置参数
比如power(x,y)中的x和y就是一个位置参数,调用函数时按位置顺序赋值给参数x和y。
2. 默认参数
当定义多个参数时,在调用函数时部分参数可能不需要传值,就需要将该参数赋一个默认值,比如:
def child_info(name,gender,age=6,city='Chengdu'):
pass
当不需要提供年龄和城市,只提供必需的两个参数,调用结果就是默认值;只有和默认参数不一致的学生才需要提供。注:当不按顺序提供参数时,调用需提供参数名,比如:child_info('Adam','male',city='Tianjing'),此时age仍然使用默认值。
定义默认参数要牢记一点:默认参数必须指向不变对象!
3. 可变参数
定义函数的参数个数不固定时,而定义函数必须要输入确定的参数,此时普通做法是通过作为list或tuple传进来,但此方法不实用可演变为在参数前面加一个*号。在函数内部,参数接收到的仍是一个tuple,当调用该函数时,可以传入任意的参数,包括0个参数。比如:
def cal(*numbers)
sum=0
for n in numbers:
sum=sum+n*n
return sum
计算1的平方+2的平方时:cal(1,2) ----而不是写成cal([1,2])。
如果已有一个list或tuple(如:nums=[1,2,3],要调用一个可用参数的话可以这样写:cal(nums[0],nums[1],nums[2])
总结:*nums表示把nums这个list的所有元素作为可变参数传进去。这种写法相当有用,而且很常见。
4. 关键字参数
允许传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组长为一个dict。比如:
def person(name,age,**kw):
print(name,age,kw)
即表示除了name和age是必选参数外,还接受关键字参数kw。
1)在调用函数时可以只传入必选参数:person('Lily',30)
2)也可传入任意个数的关键字参数:person('Bob',35,city='Beijing')或person('Adam',45,gender='M',job='Tester')
3)如果已有一个dict(如:extra={'city':'Beijing','job':'Tester}),要调用一个关键字参数的话可以这样写:person(Jack',22,**extra)
总结:“”extra表示把extra这个dict的所有key-value用关键字参数传入到函数**kw参数,kw就获得了一个dict。
5.命名关键字参数
是关键字函数的补充使用,当传入任意含参数名的参数时,需要在函数内部对传入的参数通过kw检查。当需要限制关键字参数的名字时,可以用命名关键字参数。用法:参数中需要一个特分隔符*,*后面的参数被视为命名关键字参数。
6.参数组合
对以上参数类型组合使用,除了可变参数和命名关键字参数无法混合。注:参数定义的顺序:必选参数,默认参数,可变参数/命名关键字参数,关键字参数。
总结:对于任意函数,都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的。*args是可变参数,接收的是一个tuple;**kw是关键字参数,接收的是dict。