【python】——Python中的*和**的作用和含义

本文深入探讨了Python中的*和**参数,它们用于函数调用和定义,实现可变参数的功能。*args用于收集位置参数,形成元组;**kwargs用于收集关键字参数,形成字典。通过示例展示了如何在函数调用中使用*和**进行参数解包,以及在函数定义中作为打包参数。同时,文章通过多个复杂示例解释了*argc和**kwargc在函数中的作用,揭示了它们在处理多个参数时的灵活性。

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

Python中的 * 和 ** 的作用和含义

python中的*和**被称为打包和解包参数,主要作用是能够让函数支持任意数量的参数,但是在函数定义和调用中,有着不同的使用场景,具体看下面的例子

打包参数

作为打包参数时,一般在函数形参定义时使用

  • 的作用:在调用函数时,将传给函数的所有位置的实参收集到一个元组中,并将该元组作为一个整体赋值给函数形参
def func(*args):
	print(args)

>>>func(1,2,3,4)
(1,2,3,4)

**的作用:在调用函数时,将传给函数的所有位置的实参收集到一个字典中,并将该字典赋值给形参

def func(**kwargs):
	print(kwargs)

>>>func(a=1,b=2)
{'a':1,'b':2}
解包参数

作为解包参数时,一般在函数实参传入时使用
*的作用:在函数调用时,*能够将list或元组解包成不同的参数

def func(a,b,c,d):
	print(a,b,c,d)

>>> args = (1,2,3,4)
>>> func(*args)
1 2 3 4
>>> args = [1,2,3,4]
>>> func(*args)
1 2 3 4

**的作用:在函数调用中,**会将已经打包好的字典,解包成独立的key-value对,并将解包后的参数传给函数形参

def func(a,b,c,d):
	print(a,b,c,d)

>>> kwargs = {"a":1,"b":2,"c":3,"d":4}
>>>func(**kwargs)
1 2 3 4
经典问题:func(*argc,**kwargc)中 *argc与 **kwargc的作用是什么?

有个上面的铺垫,显然这里*argc是tuple的打包参数,**kwargc是dict的打包参数
举个例子

def foo(*args,**kwargs):
    print ('args=',args)
    print ('kwargs=',kwargs)
    print ('**********************') 

if __name__=='__main__':
    foo(1,2,3)
    foo(a=1,b=2,c=3)
    foo(1,2,3,a=1,b=2,c=3)
    foo(1,'b','c',a=1,b='b',c='c')
args= (1, 2, 3)
kwargs= {}
**********************
args= ()
kwargs= {'a': 1, 'b': 2, 'c': 3}
**********************
args= (1, 2, 3)
kwargs= {'a': 1, 'b': 2, 'c': 3}
**********************
args= (1, 'b', 'c')
kwargs= {'a': 1, 'b': 'b', 'c': 'c'}
**********************

增加难度的例子

def foo(*args,**kwargs):
    print ('args=',args)
    print ('kwargs=',kwargs)
    print ('**********************') 

v = (1,2,4)
d = {'a':1, 'b':12}
# 需要注意当打包参数的输入本身就是一个整体的tuple或者tuple时,传给形参后其实是会再将其打包一次
foo(v)
foo(d)
foo(v,d)

输出

args= ((1, 2, 4),)
kwargs= {}
**********************
args= ({'a': 1, 'b': 12},)
kwargs= {}
**********************
args= ((1, 2, 4), {'a': 1, 'b': 12})
kwargs= {}
**********************

再增加难度的例子
在函数定义时:*表示打包,在函数体内部时,*表示的其实是解包

def foo(*argc,**kwargc):
	# 未解包参数
	print(argc)
	# 在函数体内解包后的参数
	print(*argc)

v = (1,2,4)
d = {'a':1,'b':2}
foo(v,d)

输出

((1, 2, 4), {'a': 1, 'b': 12})
(1, 2, 4) {'a': 1, 'b': 12}

再再再增加难度的例子
打包和解包参数并不能脱离函数而存在

c = {"name":'zhang',"age":2}

>>> **c # 打包和解包参数不能单独使用
>>> "Name:{name},Age:{age}".format(**c)
'Name:zhang, Age:2'
### Python 函数参数解析 #### 1. 参数类型概述 Python 支持多种类型的函数参数,包括位置参数、默认值参数、关键字参数、可变位置参数 `*args` 可变关键字参数 `**kwargs`。这些参数使得函数更加灵活强大。 #### 2. 定义带有不定长参数的函数 当不确定调用者会传入多少个参数时,可以使用 `*args` 来接收任意数量的位置参数[^3]: ```python def example_args(*args): print(f"Received arguments: {args}, type is {type(args)}") example_args(1, "two", 3.0) ``` 对于关键字参数,则可以通过 `**kwargs` 接收任意数量的关键字参数: ```python def example_kwargs(**kwargs): for key, value in kwargs.items(): print(f"{key} -> {value}") example_kwargs(name="Alice", age=30) ``` #### 3. 组合使用不同类型的参数 可以在同一个函数定义中混合使用上述提到的各种参数类型。需要注意的是,如果同时存在普通参数其他特殊形式的参数,它们之间应该按照一定的顺序排列:首先是普通的必选参数,其次是具有默认值得参数,默认值之后是可以接受多个输入项的形式化参数(即 `*args`),最后才是能够收集额外命名变量的形式化参数(也就是 `**kwargs`)。下面是一个例子来展示这一点: ```python def complex_function(required_arg, default_arg='default', *args, **kwargs): print(f"Required argument: {required_arg}") print(f"Default argument: {default_arg}") print(f"*args received: {args}") print(f"**kwargs received: {kwargs}") complex_function('must provide this one', extra_positional=987654321, another_extra_keyword=True) ``` #### 4. 打包与解包操作 除了作为形参外,星号运算符还可以用来做实参的打包或解包工作。比如当我们有一个列表想要将其所有成员一次性当作独立元素传递给某个只接受单个数值或其他对象的方法/函数时就可以利用这种特性;反之亦然——如果我们希望把几个单独的对象组合起来作为一个整体对待的话也可以这样做[^4]。 ##### 实际应用案例 - 解包序列赋值给函数 假设我们已经得到了一组数据存储在一个元组里边,并且现在要把它分发到不同的地方去处理,这时便可以用到解构语法: ```python data_tuple = ('apple', 'banana', 'cherry') first_item, second_item, third_item = data_tuple print(first_item) # 输出 apple print(second_item) # 输出 banana print(third_item) # 输出 cherry ``` 同样地,在调用其他支持多参数输入的功能模块之前也允许先准备好待传输的数据集合再通过这种方式展开后再交给对方处理 : ```python numbers_list = [1, 2, 3] max_value = max(*numbers_list) print(max_value) # 输出最大数 ```
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值