【python进阶】python中的*妙用全解析:高效收集分配参数 | 单个*,两个*,混用情况

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}

参考

Python中的*(星号)和**(双星号)完全详解_python *-CSDN博客

  • 21
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值