彻底弄懂Python中单星号和双星号的使用

2024-07-18 15:07:32 浏览数 (3)

公众号:尤而小屋 编辑:Peter 作者:Peter

大家好,我是Peter~

在Python中有两个重要的符号:***,本文通过实际案例来详细讲解它们的用法。

  • 算术运算符
  • 迭代器解包
  • 字典解包
  • 迭代器组包
  • 字典组包
  • 定义函数参数收集
  • 调用函数参数收集

功能1:算术运算符

首先二者可以作为算术运算符号来使用。

  • 星号*:用于乘法运算
  • 双星号**:用于指数运算
代码语言:python代码运行次数:0复制
a = 2
b = 3

单星号用于乘法运算:

代码语言:python代码运行次数:0复制
a * b  # 2乘以3

6

双星号用于乘法运算:

代码语言:python代码运行次数:0复制
a ** b  # 2的3次方

8

功能2:迭代器解包

解包:解包操作允许将一个容器对象(如列表、元组、字典等)中的多个元素分配给对应的多个变量。

给定一个列表:赋值生成3个变量

代码语言:python代码运行次数:0复制
lst = [1,2,3,4,5]

x,y,*z = lst  # 使用一个星号
代码语言:python代码运行次数:0复制
print("x:",x)
print("y:",y)
print("z:",z)
代码语言:python代码运行次数:0复制
x: 1
y: 2
z: [3, 4, 5]

从结果中我们看到,x和y各占有一个元素,剩下的全部打包给了z(z是列表的形式)。

在这种情况下,不能使用双星号,下面代码直接报错:

代码语言:python代码运行次数:0复制
lst = [1,2,3,4,5]
x,y,**z = lst  # 不能使用双星号

SyntaxError: invalid syntax

除了列表,还可以对其他序列或者迭代器进行处理:

代码语言:python代码运行次数:0复制
x,y,*z = (1,2,3,4,5)  # 元组

print(x)
print(y)
print(z)
代码语言:python代码运行次数:0复制
1
2
[3, 4, 5]
代码语言:python代码运行次数:0复制
x,y,*z = range(1,6)  # range迭代器

print(x)
print(y)
print(z)
代码语言:python代码运行次数:0复制
1
2
[3, 4, 5]
代码语言:python代码运行次数:0复制
x,y,*z = "python"  # 字符串

print(x)
print(y)
print(z)
代码语言:python代码运行次数:0复制
p
y
['t', 'h', 'o', 'n']

星号除了在末尾,还可以在其他任意位置:

代码语言:python代码运行次数:0复制
x,*y,z = (1,2,3,4,5)  

print(x)
print(y)  # x和z各占一个元素,其他全部给y
print(z)
代码语言:python代码运行次数:0复制
1
[2, 3, 4]
5
代码语言:python代码运行次数:0复制
*x,y,z = (1,2,3,4,5)  

print(x)  # y和z各占一个元素,其他全部给x
print(y)
print(z)
代码语言:python代码运行次数:0复制
[1, 2, 3]
4
5

特殊情况:如果左边变量个数比右边多,那么带有星号的变量默认是空列表

代码语言:python代码运行次数:0复制
x,y,*z = (1,2)  

print(x)  
print(y)
print(z)  # 结果为空列表
代码语言:python代码运行次数:0复制
1
2
[]

功能3:字典解包

代码语言:python代码运行次数:0复制
# 定义字典
dic = {"name":"Mike","age":20,"weight":150,"height":170}
代码语言:python代码运行次数:0复制
x,y,*z = dic  # x,y,*z = dic.keys()  

print(x)
print(y)
print(z)
代码语言:python代码运行次数:0复制
name
age
['weight', 'height']

可以看到:默认是对字典的键进行解包。

也可以对字典的或者字典的整个键值对进行解包:

代码语言:python代码运行次数:0复制
x,y,*z = dic.values()  # 值

print(x)
print(y)  
print(z)
代码语言:python代码运行次数:0复制
Mike
20
[150, 170]
代码语言:python代码运行次数:0复制
x,y,*z = dic.items()  # 键值对

print(x) 
print(y)
print(z)
代码语言:python代码运行次数:0复制
('name', 'Mike')
('age', 20)
[('weight', 150), ('height', 170)]

单星号对字典的键进行解包:

代码语言:python代码运行次数:0复制
{*dic}
代码语言:python代码运行次数:0复制
{'age', 'height', 'name', 'weight'}

双星号对字典的键值对进行解包:

代码语言:python代码运行次数:0复制
{**dic}
代码语言:python代码运行次数:0复制
{'name': 'Mike', 'age': 20, 'weight': 150, 'height': 170}

功能4:组包

Python中的表达式使用星号和双星号可以实现列表或者字典等对象的拼接报错,避免使用for循环语句。

迭代器组包

代码语言:python代码运行次数:0复制
numbers1 = [1,2,3]
numbers2 = [4,5,6]

基于表达式解包将二者进行合成,生成大的列表:

代码语言:python代码运行次数:0复制
[*numbers1, *numbers2]   # 两个列表合并

1, 2, 3, 4, 5, 6

代码语言:python代码运行次数:0复制
[*numbers1, 4, 5]  # 列表和其他元素合并 

1, 2, 3, 4, 5

代码语言:python代码运行次数:0复制
[0,*numbers1,4]  # 列表和其他元素合并

0, 1, 2, 3, 4

上面合并生成的是列表形式,也可以是元组的形式:

代码语言:python代码运行次数:0复制
(*numbers1, *numbers2)   

(1, 2, 3, 4, 5, 6)

代码语言:python代码运行次数:0复制
(*numbers1, 4, 5) 

(1, 2, 3, 4, 5)

字典组包

对表达式中的字典解包用双星号:

代码语言:python代码运行次数:0复制
dic = {"name":"Mike","age":20,"weight":150,"height":170} 

{**dic, "score":500}  # 新增加一个键值对 
代码语言:python代码运行次数:0复制
    {'name': 'Mike', 'age': 20, 'weight': 150, 'height': 170, 'score': 500}

两个字典之间的合并:

代码语言:python代码运行次数:0复制
dic1 = {"english":100,"math":120}
代码语言:python代码运行次数:0复制
{**dic, **dic1}  # 两个字典的合并
代码语言:python代码运行次数:0复制
{'name': 'Mike',
'age': 20,
'weight': 150,
'height': 170,
'english': 100,
'math': 120
}

功能5:定义函数参数收集

在Python中默认的函数参数顺序是:必选参数、默认参数、*args和**kwargs,比如下面的案例:

代码语言:python代码运行次数:0复制
def test(name, age=20, *args, **kwargs):
    do something

单星号参数收集

单星号只能收集非关键字参数

代码语言:python代码运行次数:0复制
def test1(x,*args): 
    """
    x:普通参数
    *args:解包参数;非关键字参数non-keyword
    """
    print("x: ",x)
    print("下面展示args的内容:")
    print(args)  # 元组形式
    for i in args:  # 对args中的元素进行迭代
        print("i=",i)
代码语言:python代码运行次数:0复制
test1(1,2,3,4,5,6,7)  
代码语言:python代码运行次数:0复制
x:  1
下面展示args的内容:
(2, 3, 4, 5, 6, 7)
i= 2
i= 3
i= 4
i= 5
i= 6
i= 7

双星号参数收集

双星号收集关键字参数

代码语言:python代码运行次数:0复制
def test2(x,**kwargs):
    """
    x:普通参数
    **kwargs:解包参数;关键字参数keyword
    """
    print("x: ",x)
    print("下面展示kwargs的内容:")
    print(kwargs)
代码语言:python代码运行次数:0复制
test2("Information",name="Peter",age=20, score=100)
代码语言:python代码运行次数:0复制
x:  Information
下面展示kwargs的内容:
{'name': 'Peter', 'age': 20, 'score': 100}

单星号 双星号联用

在Python的参数传参顺序中:

  1. 普通参数
  2. 默认参数
  3. *args参数
  4. **kwargs参数
代码语言:python代码运行次数:0复制
def test3(*args,**kwargs):
    print("展示args的内容:", args) # 元组形式
    print("展示kwargs的内容:", kwargs) # 字典形式
代码语言:python代码运行次数:0复制
test3(1,2,x=3,y=4)
代码语言:python代码运行次数:0复制
展示args的内容: (1, 2)
展示kwargs的内容: {'x': 3, 'y': 4}
代码语言:python代码运行次数:0复制
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)
代码语言:python代码运行次数:0复制
test4(1,2,name="Peter",address="China") 
代码语言:python代码运行次数:0复制
x:  1
age: 2
下面展示args的内容:
()
下面展示kwargs的内容:
{'name': 'Peter', 'address': 'China'}

在上面的案例中1被赋值给x参数,2被赋值给参数age;

args参数为空元组,剩下的全部赋值给参数kwargs

代码语言:python代码运行次数:0复制
test4(1,2,3,name="Peter",address="China") 
代码语言:python代码运行次数:0复制
x:  1
age: 2
下面展示args的内容:
(3,)
下面展示kwargs的内容:
{'name': 'Peter', 'address': 'China'}

在这种情况下,args参数出现了一个元素3(元组形式)。

功能6:调用函数参数收集

单星号使用

代码语言:python代码运行次数:0复制
def test5(x,y):
    print("x: ", x)
    print("y: ", y)

元组中元素的个数和函数参数的个数要匹配:

代码语言:python代码运行次数:0复制
paramters = (1,2)  

test5(*paramters)
代码语言:python代码运行次数:0复制
x:  1
y:  2

双星号使用

代码语言:python代码运行次数:0复制
def test6(x,y):
    print("x: ", x)
    print("y: ", y)

传入参数的键名和函数的参数名字要保持一致:

代码语言:python代码运行次数:0复制
paramters = {"x":10,"y":20}

test6(**paramters)
代码语言:python代码运行次数:0复制
x:  10
y:  20

0 人点赞