公众号:尤而小屋
编辑:Peter
作者:Peter
大家好,我是Peter~
在Python中有两个重要的符号:*
和**
,本文通过实际案例来详细讲解它们的用法。
算术运算符 迭代器解包 字典解包 迭代器组包 字典组包 定义函数参数收集 调用函数参数收集
功能1:算术运算符
首先二者可以作为算术运算符号来使用。
星号*:用于乘法运算 双星号**:用于指数运算
a = 2
b = 3
单星号用于乘法运算:
a * b # 2乘以3
6
双星号用于乘法运算:
a ** b # 2的3次方
8
功能2:迭代器解包
解包:解包操作允许将一个容器对象(如列表、元组、字典等)中的多个元素分配给对应的多个变量。
给定一个列表:赋值生成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
[]
功能3:字典解包
# 定义字典
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}
功能4:组包
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
}
功能5:定义函数参数收集
在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(元组形式)。
功能6:调用函数参数收集
单星号使用
def test5(x,y):
print("x: ", x)
print("y: ", y)
元组中元素的个数和函数参数的个数要匹配:
paramters = (1,2)
test5(*paramters)
x: 1
y: 2
双星号使用
def test6(x,y):
print("x: ", x)
print("y: ", y)
传入参数的键名和函数的参数名字要保持一致:
paramters = {"x":10,"y":20}
test6(**paramters)
x: 10
y: 20