引 言 *args
和**kwargs
在python函数中有着举足轻重的地位,在不知需要多少参数的情况下,可以接收任意数量的位置参数和关键字参数。它们的存在提升了函数传递参数的灵活性和延展性。
文章目录
一、Python函数参数常见类型介绍
- 在函数定义阶段:位置参数,默认值参数和可变长参数(
*args
和**kwargs
)。 - 在函数调用阶段:位置参数,关键字参数和解包参数列表。
1.1 位置参数
是函数定义中最常见的一种参数定义类型。在函数调用阶段,可以直接按顺序给参数赋值,也可以采用关键字方式传递参数(1.3详细介绍)。
def display(name,number):
print(f"name is: {name} number is: {number}")
display('Bob','01')
###结果###
name is: Bob number is: 01
1.2 默认值参数
在函数定义阶段,对某参数指定默认值,若函数调用阶段,没有给参数赋值使用默认值,若赋值则使用新值。
def display(name,number='02'):
print(f"name is: {name} number is: {number}")
#没有给参数number赋值,使用默认值
display('Bob') # 结果:name is: Bob number is: 02
#给参数name和number都赋值,默认值参数使用新值
display(name='Bob',number='03') # 结果:name is: Bob number is: 03
__注意:__默认值参数在函数定义阶段必须按照从左到右的顺序设置,默认值参数后不能在出现位置参数,否则程序会报错。
def display(name='Bob',number):
print(f"name is: {name} number is: {number}")
display('02')
SyntaxError: non-default argument follows default argument
1.3 关键字参数
在函数调用阶段,按照函数定义的变量名称赋值,其格式为变量名=变量值
。关键字传参因为是按照变量名赋值,所以不需要按照顺序为变量赋值。
def display(name,number='02'):
print(f"name is: {name} number is: {number}")
display(number='03',name='Alice')
###结果###
name is: Alice number is: 03
1.4 可变位置参数*args
和可变关键字参数**kwargs
-
*args
在函数传参时可接收任意数量的位置参数。在函数定义时作为占位符,代表没有被显示定义的可变数量的位置参数。在函数调用时,args会接收这些参数并存入元组中。 -
**kwargs
在函数传参时可接收任意数量的关键字参数。在函数调用时,kwargs会接收任意数量在函数定义阶段中没有对应名称的关键字参数并存入字典中。
(1) *args
示例代码
def fun_1(*args):
print(args)
print(type(args))
fun_1(1,2,3)
####显示结果####
(1, 2, 3)
<class 'tuple'>
(2)**kwargs
示例代码
def func_2(**kwargs):
print(kwargs)
print(type(kwargs))
func_2(a=2,b=5,sport='football')
####显示结果####
{'a': 2, 'b': 5, 'sport': 'football'}
<class 'dict'>
(3) *args
和**kwargs
的结合使用,前部的位置实参按顺序传递给定义的位置参数,剩余位置实参被args接收,没有对应参数名称的关键字参数被kwargs接收。
def display(name,*args,**kwargs):
print(name)
print('args:',args)
for key,value in kwargs.items():
print(f"{key}--{value}")
display('baidu',1,2,3,4,banana=12,apple=15)
###结果###
baidu
args: (1, 2, 3, 4)
banana--12
apple--15
1.5 解包参数列表
在工程项目中,有时实参值已经封装成一个参数列表。要想将这些参数值传递给函数。需要拆包操作。可以通过使用*
和**
完成对位置实参和关键字实参的拆包操作。
def display(name,number='02'):
print(f"name is: {name} number is: {number}")
params = ['Bob','04']
display(*params)
###结果###
name is: Bob number is: 04
二、各种参数综合使用
def shop_display(shop_name,shop_date='2024.1.1',discount=0,*args,**kwargs):
print(f'shop_name: {shop_name}')
print('shop_date:{}'.format(shop_date))
print(f"discount:{discount}")
print('args:',args)
for key,value in kwargs.items():
print(f"product:{key}--count:{value}")
(1)按照位置参数方式赋值,没有赋值变量使用默认值。
shop_display('baidu')
#结果
shop_name: baidu
shop_date:2024.1.1
discount:0
args: ()
(2) 按照位置赋值,但是*args只能接收前三个变量赋值后的剩余位置参数,且容易产生歧义,所以一般情况下,将*args
放置于默认值参数之前。
shop_display('google',1,2,3,4)
#结果
shop_name: google
shop_date:1
discount:2
args: (3, 4)
(3)前部采用位置参数赋值,除第一个参数外,剩余位置参数被args接收。
后部采用关键值方式传递参数,没有出现的关键字参数,被kwargs接收。
def shop_display(shop_name,*args,shop_date='2024.1.1',discount=0,**kwargs):
print(f'shop_name: {shop_name}')
print('shop_date:{}'.format(shop_date))
print(f"discount:{discount}")
print('args:',args)
for key,value in kwargs.items():
print(f"product:{key}--count:{value}")
shop_display('baidu',1,2,3,4,discount=0.9,shop_date='2024.7.10',apple=10,banana=20)
#结果
shop_name: baidu
shop_date:2024.7.10
discount:0.9
args: (1, 2, 3, 4)
product:apple--count:10
product:banana--count:20
注意:在函数赋值时,不能在关键字传参后使用位置参数赋值,程序会报错。
shop_display(shop_name='baidu',1,2,3,4)
#程序报错:
SyntaxError: positional argument follows keyword argument