[编程基础] Python中*args和**kwargs参数的使用

本文详细介绍了Python编程中*args和**kwargs的使用,包括它们的作用、如何接收可变数量的参数,以及在函数定义中的位置规则。同时,文章还探讨了*和**在Python 3.5以上版本的新功能——解包,并展示了各种解包示例。通过实例,读者可以更好地理解这两种特殊参数在实际编程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文主要介绍Python中*args和**kwargs参数的使用

1 使用

在Python中,定义函数时可以使用两个特殊符号,以允许它们接受可变数量的参数。这两个特殊符号为*和**。通常*和args一起使用,**和kwargs一起使用。事实上args和kwargs可以用任何名称替代,之所以用args和kwargs仅仅是为了遵从通俗约定。args为arguments的缩写,表示多个参数。kwargs为 keyword arguments 的缩写,表示多个关键字参数。

Python中,(*)会把接收到的参数转为一个元组,而(**)会把接收到的参数转为一个字典。所以*args表示将传入多个参数(包括0个参数)变为元组,**kwargs表示将传入多个带名称的参数(包括0个参数)变为字典。具体例子下面分别介绍。

*args的使用

def func(*args):
    # 打印参数类型
    print(type(args))
    # 打印参数
    print(args)
    
func("a", "b", "c")
func(["a", "b", "c"])
# 将一个列表变为元组,需要在传入参数的前面加上一个*
func(*["a", "b", "c"])
<class 'tuple'>
('a', 'b', 'c')
<class 'tuple'>
(['a', 'b', 'c'],)
<class 'tuple'>
('a', 'b', 'c')

**kwargs的使用

def func(**kwargs):
    # 转为字典
    print(type(kwargs))
    for key, value in kwargs.items():
        print("{} = {}".format(key,value))
    
func(param1="a", param2="b", param3="c")
# 也可以直接传入一个字典
dicts={'param1':"a", 'param2':"b", 'param3':"c"}
func(**dicts)
<class 'dict'>
param1 = a
param2 = b
param3 = c
<class 'dict'>
param1 = a
param2 = b
param3 = c

*args和**kwargs共同使用

def fun(*args, **kwargs):
    print("args:", args)
    print("kwargs:", kwargs)
fun("a", "b", "c", param1="a", param2="b", param3="c")
fun(*["a","b","c"], param1="a", param2="b", param3="c")
args: ('a', 'b', 'c')
kwargs: {'param1': 'a', 'param2': 'b', 'param3': 'c'}
args: ('a', 'b', 'c')
kwargs: {'param1': 'a', 'param2': 'b', 'param3': 'c'}

此外也可以传入其他单独参数名,如下面的例子,传入name和age参数。name参数在第一位,不输入参数名name也会将第一个输入参数视为name。函数中间的参数如age,则需要指定参数名。

def fun(name, *args, age=None, **kwargs):
    print("name:", name)
    print("args:", args)
    print("age:", age)
    print("kwargs:", kwargs)

fun(1, 2, 3, a=1, b=2, c=3)
fun("helloworld", 1, 2, 3, age=12, a=1, b=2, c=3)
name: 1
args: (2, 3)
age: None
kwargs: {'a': 1, 'b': 2, 'c': 3}
name: helloworld
args: (1, 2, 3)
age: 12
kwargs: {'a': 1, 'b': 2, 'c': 3}

**但是要注意的是,*args必须放在**kwargs前面且**kwarg要位于所有参数最后,因为非默认参数必须在默认参数之前处理,不然会出错。

2 拓展

事实上,在Python3.5以上版本,*和**多了一个功能叫做解包(unpacking)。解包的意思就是将迭代对象里面的元素逐个取出来。迭代的意思就是,当对元组,列表,字典,集合,字符串使用for循环语句的时候,可以依次拿到里面的数据,这样的过程称为遍历,也叫迭代。通过解包就是将元组,列表,字典,集合,字符串每一个单独的值拆分开来。其中*可以用于任何一种Python迭代对象,**只能用于字典。如下面的例子通过*解包对象,输出不再是迭代对象的本身,而是迭代对象的内容。但是这类语言结构最好不要使用,可读性较差。

# 元组解包
my_tuple=(1,2,3)
print(*my_tuple)
1 2 3
# 列表解包
my_list=[1,2,3]
print(*my_list)
1 2 3
# 字典解包
my_dir={"a":1,"b":2}
print(*my_dir)
a b
# 字符串解包
my_string="hello"
print(*my_string)
h e l l o
# 集合解包
my_set=set('hello')
print(*my_set)
e l o h

除此之外,还可以单独解包某个值如下所示

my_list = [1, 2, 3, 4, 5]
 
a, *b, c = my_list
 
print(a)
print(b)
print(c)
1
[2, 3, 4]
5

此外解包符还能用于迭代器的合并

# 列表合并
my_list1=[1,2,3]
my_list2=[4,5]
my_list=[*my_list1,*my_list2]
print(my_list)
[1, 2, 3, 4, 5]
# 字典合并
my_dir1={"a":1,"b":2}
my_dir2={"c":3,"d":4,"e":5}
my_dir={**my_dir1, **my_dir2}
print(my_dir)
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

对于字符串,*也能进行一系列的拆分

# 将字符串变为列表
hello = [*"hello"]
print(hello)
['h', 'e', 'l', 'l', 'o']
# 将字符串变为字典
hello = {*"hello"}
print(hello)
{'e', 'l', 'o', 'h'}

3 参考

Python *args and **kwargs

Python中*和**的区别

Python中的args和kwargs

Python编程中,`*args``**kwargs`是两个非常有用的特性,它们允许函数接收不定数量的位置参数关键字参数。这使得函数能够处理比定义时更多样化的输入,为函数的调用者提供便利。具体来说,`*args`允许函数接收任意数量的位置参数,这些参数在函数内部作为元组(tuple)处理;而`**kwargs`则允许接收任意数量的关键字参数,这些参数在函数内部作为字典(dict)处理。利用这些特性,我们可以设计出更为通用灵活的函数接口。 参考资源链接:[Python进阶指南:核心概念与技巧解析](https://wenku.csdn.net/doc/4w6stmvyfs?spm=1055.2569.3001.10343) 当设计一个函数时,你可能会遇到参数数量不确定的情况,例如在日志记录、数据处理、函数重载等场景。通过`*args``**kwargs`,我们可以轻松地将这些不定数量的参数传递给函数。例如,日志记录函数可能需要记录任意数量的变量,此时`*args`可以接收这些变量,而`**kwargs`可以用来记录额外的信息。 在使用`*args``**kwargs`时,需要注意函数的健壮性可维护性。例如,为了确保参数数量的正确性,你可能需要在函数内部进行参数数量的检查,或者提供合适的默认值。此外,当函数返回值包含`*args`或`**kwargs`时,应考虑是否需要将它们转换为列表或字典,以便于后续处理。 而在编写具有这些特性的函数时,必须注意代码的清晰性。在函数体内,应当小心处理这些参数,避免在处理过程中发生错误。例如,确保对`**kwargs`中的关键字进行检查,以避免命名冲突或意外覆盖。 总而言之,`*args``**kwargs`是Python中增强函数灵活性的有力工具,但在使用时需要注意正确性代码的清晰度。如果想要更深入了解这些高级特性,建议阅读《Python进阶指南:核心概念与技巧解析》一书。该书详细讲解了这些特性的使用技巧,涵盖了从基础到高级的广泛主题,适合希望在Python编程上进阶的开发者。 参考资源链接:[Python进阶指南:核心概念与技巧解析](https://wenku.csdn.net/doc/4w6stmvyfs?spm=1055.2569.3001.10343)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值