Python的位置参数、默认参数、关键字参数、可变参数之间的区别
Python的位置参数、默认参数、关键字参数、可变参数之间的区别
转自https://www.cnblogs.com/bingabcd/p/6671368.html
1. 位置参数
- 调用函数时需根据定义的参数位置来传参
-
def print_hello(name, sex): print('hello %s %s, welcome to python world!' % (name, '先生')) print_hello('Nick', '先生') # 输出:hello Nick 先生, welcome to python world!
位置参数必须严格按照顺序传参
2. 关键字参数
- 在函数调用时,通过"键值对"形式作为函数的形参,不用按照位置给函数传参
- 注意:
- 关键字参数必须在位置参数右边→
- 对同一个形参不能重复传值
-
# 按照顺序为函数形参传值 def msg(name, age, sex): print("Hello, your name is %s, age is %s, sex is %s" % (name, age, sex)) msg('Nick', 23, 'male') # 输出:Hello, your name is Nick, age is 23, sex is male # 有位置参数和关键字参数时,关键字参数在位置参数后面 msg('Tony', 12, sex='male') # 参数中有多个关键字参数时,关键字参数不分先后顺序 msg(sex='female', name='Amy', age=56)
3. 默认参数
- 在定义函数时,可以为形参提供默认值。对于有默认值的形参,调用函数时如果为该参数传值,则使用传入值,否则使用默认值
- 注意:
- 在调用函数时可以不给有默认值的形参传值
- 无论函数的定义还是调用,默认参数的定义应该在位置形参右边
- 只在定义时赋值一次
- 默认参数通常应该定义成不可变类型
-
# 正确的默认参数定义方式-->位置参数在前,默认参数灾后 def print_hello(name, city='Shenzhen'): print('%s live in %s' % (name, city)) print_hello('Henry') # 输出:Henry live in Shenzhen # 错误的定义方式 # def print_hello2(city='Shenzhen', name): # pass # 如果使用的是PyCharm IDE,输入完函数头部时就会提示出错 # 调用时传入city值,则默认值不会被使用 print_hello('Kevin', 'Beijing') # 输出:Kevin live in Beijing
4. 可变参数
- 定义函数时,有时候我们不确定调用的时候会传递多少个参数(不传参也行)。此时,可用包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递。
- 包裹位置传递
-
def func(*args): print(type(args)) # 传入的参数会被视作一个元组 print(args) for x in args: print(x) func(1) func(1, 2, 3) # 输出: # <class 'tuple'> # (1,) # 1 # <class 'tuple'> # (1, 2, 3) # 1 # 2 # 3
- 包裹关键字传递
-
def func(**kwargs): print(type(kwargs)) print(kwargs) for k, v in kwargs.items(): print(k, ": ", v) func(a=1) func(a=1, b=2, c=3) # 输出: # <class 'dict'> # {'a': 1} # a : 1 # <class 'dict'> # {'a': 1, 'b': 2, 'c': 3} # a : 1 # b : 2 # c : 3
-
位置参数,默认参数,可变参数的混合使用,使用顺序是:位置参数 --> 默认参数 --> 包裹位置参数 --> 包裹关键字(定义和调用都要遵循)
-
def func(name, age, sex=1, *args, **kwargs): print('位置参数:') print(args) print('默认参数') print(sex) print('*args参数(即可变参数--被当做元组处理)') for x in args: print(x) print('**kwargs参数(被当做字典处理)') for k, v in kwargs.items(): print(k, ": ", v) func('Cate', 14, 0, 'friendly', 'talented', 'easy-going', company='Apache', salary=30000) # 输出: # 位置参数: # ('friendly', 'talented', 'easy-going') # 默认参数 # 0 # *args参数(即可变参数--被当做元组处理) # friendly # talented # easy-going # **kwargs参数(被当做字典处理) # company : Apache # salary : 30000