python 里面列表前面加星号, 例如 : *[1, 2, 3],这是什么用法?

1、先说作用:

作用是:将列表解开成几个独立的参数,传入函数。类似的运算符还有两个星号(**),是将字典解开成独立的元素作为形参。

例如:add(a,b)函数需要输入两个数,在主函数中list =  [1, 2]    c = add(*list),此处*list就表示的是将list中的两个数拆开之后分别输入,等价于c = add(list[0], list[1])。

这样做的目的是为了简化代码

2、再放代码:

def add(a, b):
    return a + b


data = [4, 3]
print(add(*data))
print(add(data[0], data[1]))
# 等价于 print add(4, 3)
data = {'a': 4, 'b': 3}  # 当将字典传入作为形参时。。。形参的名字和字典的键的名字要相同
print(add(**data))  # 这里可以两个*,但后续直接对字典操作则出错
# 等价于 print add(4, 3)

a = [1, 2, 3]
b = (1, 2, 3)
c = {1: "a", 2: "b", 3: "c"}
print(a, "====", *a)
print(b, "====", *b)
print(c, "====", *c)  # 打印的是键,而不是值

其中的几个注意点:

1、当将字典传入作为形参时。。。形参的名字和字典的键的名字要相同,如图,字典的键为a,b,所以形参的名字也是a,b

2、只有在作为实参输入时,**data是正确的。如果直接对一个字典做**dict,python会报错。

3、*dict得到的是而不是值,如代码中的*c

3、对向量操作

不光是列表、元组、字典,由numpy生成的向量也可以拆分;

4、用途

了解过函数中*args和**kwargs的人应该知道,这两个形参都接收若干个参数,通常我们将其称为参数组;

*args:接收若干个位置参数,转换成元组tuple形式

**kwargs:接收若干个关键字参数,转换成字典dict形式

ps:需要注意的是位置参数*args,一定要在关键字参数**kwargs前

例子:

def output(*args):
    print(type(args))
    for i in args:
        print(i)


list = [1, 2, 3]
output(list)
output(*list)

输出:
<class 'tuple'>
[1, 2, 3]
<class 'tuple'>
1
2
3

不难发现,如果不加*,add函数将整个列表当做一个元素使用,也就是add(([1,2,4,5],))。而带有*号的参数,此时相当于add((1, 2, 4, 5));

5、*号也可以作用于二维的列表

显然也是将列表进行拆分,结果是两个一维列表;如下代码所示

# 作用于二维列表
array = [[1, 2, 3],
         [4, 5, 6]
         ]
print(array)
print(*array)
print(type(array))
print(type(*array))

输出:
[[1, 2, 3], [4, 5, 6]]
[1, 2, 3] [4, 5, 6]
<class 'list'>

print(type(*array))
TypeError: type() takes 1 or 3 arguments

如图,print(type(*array))会报错,这是因为type的输入不是一个导致的,这也说明,*号运算符将二维列表拆成两个列表

这么一看,这个带*变量的作用,就仿佛是把列表解开一层似的,而python中有一个zip函数,功能与之相反。

zip是将一个或多个可迭代对象进行包装压缩,返回将结果是列表;

通俗的说:zip()压缩可迭代对象,*号解压可迭代对象;

最后需要注意的是:

可迭代对象才可以使用*号拆分;

带*号变量严格来说并不是一个变量,而更应该称为参数,它是不能赋值给其他变量的,但可以作为参数传递;

参考:

https://blog.csdn.net/weixin_40877427/article/details/82931899

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐