前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >彻底弄懂Python中单星号和双星号的使用

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

原创
作者头像
皮大大
发布2024-07-18 15:07:32
1130
发布2024-07-18 15:07:32
举报
文章被收录于专栏:python编程

公众号:尤而小屋 编辑: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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 功能1:算术运算符
  • 功能2:迭代器解包
  • 功能3:字典解包
  • 功能4:组包
    • 迭代器组包
      • 字典组包
      • 功能5:定义函数参数收集
        • 单星号参数收集
          • 双星号参数收集
            • 单星号+双星号联用
            • 功能6:调用函数参数收集
              • 单星号使用
                • 双星号使用
                相关产品与服务
                容器服务
                腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档