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