1 位置参数和关键字参数
- 根据函数定义的参数位置来传递参数,参数不能少;
- 关键字参数必须置于位置参数之后,因为python函数在解析参数时, 是按照顺序来的, 位置参数是必须先满足, 才能考虑其他可变参数。
def print_hello(name, sex):
pass
print_hello('du', 1)
print_hello('du', sex = 1)
print_hello(name = 'du', sex = 1)
print_hello(sex = 1, name = 'du')
# 错误
print_hello(name = 'du', 1)
File "<ipython-input-85-0c54b0f6425d>", line 2
print_hello(name = 'du', 1)
^
SyntaxError: positional argument follows keyword argument
2 默认参数
- 为参数提供默认值,调用函数时可传可不传该默认参数的值;
- 注意:所有位置参数必须出现在默认参数前,包括函数定义和调用。
# 正确的默认参数定义方式--> 位置参数在前,默认参数在后
def print_hello(name, sex=1):
pass
# 错误的定义方式
def print_hello(sex=1, name):
pass
print_hello('du')
print_hello('du', 2)
3 可变参数
- 当不确定参数个数时可用包裹位置参数,或者包裹关键字参数。
3.1 包裹packing与unpacking
a = (1, 2, 3)
a1, a2, a3 = a
print("a1=%d, a2=%d, a3=%d" % (a1, a2, a3))
3.2 包裹位置传递
- 传进的所有参数被args收集,然后组合为一个元组(tuple)
def func(*args):
sum = 0
for arg in args:
sum += arg
print(sum)
func()
func(1)
func(1, 2, 3)
3.3 包裹关键字参数
- 传进的所有参数被kargs收集,然后组合为一个字典(dict键值对)
def func(**kargs):
print(kargs)
func(a=1)
func(a=1, b=2, c=3)
4 混合应用
- 先后顺序规则:位置参数、默认参数、包裹位置、包裹关键字
- 包裹位置必须在包裹关键字之前
def func(name, age, sex=1, *args, **kargs):
print(name)
print(age)
print(sex)
print(args)
print(kargs)
print('------------------')
func('du', 25, 2, 'music', 'sport', good=2)
func('du', 25, 'music', 'sport', good=2) # 'music'传入给sex值,而‘sport’为参数args收集,组合为元组
def func1(x, *args, a=4, **kargs): # 没办法修改到默认参数a
pass
def func2(x, a=4, *args, **kargs): # 传入的第二个参数为a
pass
文章内容借鉴如下:
1、https://www.jianshu.com/p/c4c27db76f66
2、廖雪峰学习网站Python内容