公众号:尤而小屋 编辑:Peter 作者:Peter
大家好,我是Peter~
在Python中有两个重要的符号:*和**,本文通过实际案例来详细讲解它们的用法。
首先二者可以作为算术运算符号来使用。
a = 2
b = 3单星号用于乘法运算:
a * b # 2乘以36
双星号用于乘法运算:
a ** b # 2的3次方8
解包:解包操作允许将一个容器对象(如列表、元组、字典等)中的多个元素分配给对应的多个变量。
给定一个列表:赋值生成3个变量
lst = [1,2,3,4,5]
x,y,*z = lst # 使用一个星号print("x:",x)
print("y:",y)
print("z:",z)x: 1
y: 2
z: [3, 4, 5]从结果中我们看到,x和y各占有一个元素,剩下的全部打包给了z(z是列表的形式)。
在这种情况下,不能使用双星号,下面代码直接报错:
lst = [1,2,3,4,5]
x,y,**z = lst # 不能使用双星号
SyntaxError: invalid syntax除了列表,还可以对其他序列或者迭代器进行处理:
x,y,*z = (1,2,3,4,5) # 元组
print(x)
print(y)
print(z)1
2
[3, 4, 5]x,y,*z = range(1,6) # range迭代器
print(x)
print(y)
print(z)1
2
[3, 4, 5]x,y,*z = "python" # 字符串
print(x)
print(y)
print(z)p
y
['t', 'h', 'o', 'n']星号除了在末尾,还可以在其他任意位置:
x,*y,z = (1,2,3,4,5)
print(x)
print(y) # x和z各占一个元素,其他全部给y
print(z)1
[2, 3, 4]
5*x,y,z = (1,2,3,4,5)
print(x) # y和z各占一个元素,其他全部给x
print(y)
print(z)[1, 2, 3]
4
5特殊情况:如果左边变量个数比右边多,那么带有星号的变量默认是空列表
x,y,*z = (1,2)
print(x)
print(y)
print(z) # 结果为空列表1
2
[]# 定义字典
dic = {"name":"Mike","age":20,"weight":150,"height":170}x,y,*z = dic # x,y,*z = dic.keys()
print(x)
print(y)
print(z)name
age
['weight', 'height']可以看到:默认是对字典的键进行解包。
也可以对字典的值或者字典的整个键值对进行解包:
x,y,*z = dic.values() # 值
print(x)
print(y)
print(z)Mike
20
[150, 170]x,y,*z = dic.items() # 键值对
print(x)
print(y)
print(z)('name', 'Mike')
('age', 20)
[('weight', 150), ('height', 170)]单星号对字典的键进行解包:
{*dic}{'age', 'height', 'name', 'weight'}双星号对字典的键值对进行解包:
{**dic}{'name': 'Mike', 'age': 20, 'weight': 150, 'height': 170}Python中的表达式使用星号和双星号可以实现列表或者字典等对象的拼接报错,避免使用for循环语句。
numbers1 = [1,2,3]
numbers2 = [4,5,6]基于表达式解包将二者进行合成,生成大的列表:
[*numbers1, *numbers2] # 两个列表合并1, 2, 3, 4, 5, 6
[*numbers1, 4, 5] # 列表和其他元素合并 1, 2, 3, 4, 5
[0,*numbers1,4] # 列表和其他元素合并0, 1, 2, 3, 4
上面合并生成的是列表形式,也可以是元组的形式:
(*numbers1, *numbers2) (1, 2, 3, 4, 5, 6)
(*numbers1, 4, 5) (1, 2, 3, 4, 5)
对表达式中的字典解包用双星号:
dic = {"name":"Mike","age":20,"weight":150,"height":170}
{**dic, "score":500} # 新增加一个键值对 {'name': 'Mike', 'age': 20, 'weight': 150, 'height': 170, 'score': 500}两个字典之间的合并:
dic1 = {"english":100,"math":120}{**dic, **dic1} # 两个字典的合并{'name': 'Mike',
'age': 20,
'weight': 150,
'height': 170,
'english': 100,
'math': 120
} 在Python中默认的函数参数顺序是:必选参数、默认参数、*args和**kwargs,比如下面的案例:
def test(name, age=20, *args, **kwargs):
do something单星号只能收集非关键字参数
def test1(x,*args):
"""
x:普通参数
*args:解包参数;非关键字参数non-keyword
"""
print("x: ",x)
print("下面展示args的内容:")
print(args) # 元组形式
for i in args: # 对args中的元素进行迭代
print("i=",i)test1(1,2,3,4,5,6,7) x: 1
下面展示args的内容:
(2, 3, 4, 5, 6, 7)
i= 2
i= 3
i= 4
i= 5
i= 6
i= 7双星号收集关键字参数
def test2(x,**kwargs):
"""
x:普通参数
**kwargs:解包参数;关键字参数keyword
"""
print("x: ",x)
print("下面展示kwargs的内容:")
print(kwargs)test2("Information",name="Peter",age=20, score=100)x: Information
下面展示kwargs的内容:
{'name': 'Peter', 'age': 20, 'score': 100}在Python的参数传参顺序中:
*args参数**kwargs参数def test3(*args,**kwargs):
print("展示args的内容:", args) # 元组形式
print("展示kwargs的内容:", kwargs) # 字典形式test3(1,2,x=3,y=4)展示args的内容: (1, 2)
展示kwargs的内容: {'x': 3, 'y': 4}def test4(x,age=20,*args, **kwargs):
"""
x:普通参数
age:默认参数
*args:非关键字参数non-keyword
**kwargs:关键字参数keyword
"""
print("x: ",x)
print("age:",age)
print("下面展示args的内容:")
print(args)
print("下面展示kwargs的内容:")
print(kwargs)test4(1,2,name="Peter",address="China") x: 1
age: 2
下面展示args的内容:
()
下面展示kwargs的内容:
{'name': 'Peter', 'address': 'China'}在上面的案例中1被赋值给x参数,2被赋值给参数age;
args参数为空元组,剩下的全部赋值给参数kwargs
test4(1,2,3,name="Peter",address="China") x: 1
age: 2
下面展示args的内容:
(3,)
下面展示kwargs的内容:
{'name': 'Peter', 'address': 'China'}在这种情况下,args参数出现了一个元素3(元组形式)。
def test5(x,y):
print("x: ", x)
print("y: ", y)元组中元素的个数和函数参数的个数要匹配:
paramters = (1,2)
test5(*paramters)x: 1
y: 2def test6(x,y):
print("x: ", x)
print("y: ", y)传入参数的键名和函数的参数名字要保持一致:
paramters = {"x":10,"y":20}
test6(**paramters)x: 10
y: 20原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。