文章目录
1 基础用法
1.1 乘法
*我们都知道在很多语言中都是乘法的含义
a=3
b=5
result = a*b
1.2 收集多余的元素
这样可以使得等号左边变量和右边的数字不一样
x,y,*z=1,2,3,4,5
print(x,y,z)
输出,可以看到z这里接收到的是一个数组[3,4,5]
1 2 [3, 4, 5]
2 进阶用法
但是实际工程项目中,在函数的参数内也可以看到*,这种情况下是怎么使用的呢?
具体情况分为四种
-
函数定义时候,单个*参数
-
函数定义时候,两个*参数
-
函数调用时候,单个*参数
-
函数调用时候,两个*参数
首先我们有一个整体的概念,*如果在参数中出现,往往是做参数收集或者参数分配的
单个*往往是 负责位置参数
两个*往往是 负责关键字参数(关键字参数是调用函数的时候使用的是键值对的方式,key=value)
稍微有点抽象,我们看每一种情况
2.1 函数定义,单个*参数
这时候我们会发现,可以传入多个位置参数
def test(*args):
print(args)
test(1,2,3,4,5)
输出
(1, 2, 3, 4, 5)
作用是将调用时提供的所有值,放在一个元组里。
2.2 函数定义,两个*参数
如果我们想给函数传入关键字参数,如果用2.1的方式就会报错
所以我们可以通过**的方式
def test(**args):
print(args)
test(a=4,b=5)
输出
{‘a’: 4, ‘b’: 5}
2.3 函数调用,单个*参数
假设你有一个元组
tuple1 = (1,2)
假设你有一个函数
def test(a,b):
这时候,你如果想把这个元组的1,2分别赋值给a,b,有什么快捷方式
可以通过这样的方式调用函数
tuple1 = (1,2)
def test(a,b):
print(a+b)
test(*tuple1)
输出
3
可见他的功能在函数调用时候和函数定义时是相反的,即是位置参数的分配
那么同理对于函数调用,两个*的情况
2.4 函数调用,两个*参数
tuple1 ={'a':1,'b':2}
def test(a,b):
print(a+b)
test(**tuple1)
可见,是将关键字参数字典进行分配,会非常的高效快捷
3 其他特殊情况–混用*
3.1 单独*
我在看代码的时候看到这样一种情况
他实现了一个什么样的效果呢?
self, *, ch, out_ch, ch_mult=(1,2,4,8), num_res_blocks,
attn_resolutions, dropout=0.0, resamp_with_conv=True, in_channels,
resolution, z_channels, double_z=True, use_linear_attn=False, attn_type="vanilla",
**ignore_kwargs):
- 第一个*用来规范代码的,实现的效果是,只能跟随关键字参数,不能跟位置参数,如果跟的话就会报错
- 后面的** 是用来做忽略用的,如果有多余的关键字参数,则直接忽略掉,如果不加的话就会报错
3.2 *args和**kwargs
*args
和**kwargs
用的比较多
def test(*args,a,b,**kwargs):
print(args)
print(a)
print(b)
print(kwargs)
test(1,2,3,4,5,a=6,b=7,c=8,d=9,e=10)
输出
(1, 2, 3, 4, 5)
6
7
{‘c’: 8, ‘d’: 9, ‘e’: 10}
参考