python中星号的特殊用法:解包和拆包


前言

在Python中星号(*)除了作乘法运算,还有什么其他用法呢?在变量前加一个星号和两个星号有什么区别呢?什么是打包和拆包呢?


提示:本文参考了Python中的星号:运算和参数传递

一、星号变量

当函数中传入的参数个数不确定时,考虑在形参变量前加上星号,而对于加一个星号和两个星号的区别在于:

*args传入的参数为非关键字参数,本质上是元祖

*kwargs传入的参数为关键字参数,本质上是字典

二、打包和拆包

对函数传递的参数进行打包指的是将传递给函数的元素打包成元祖或字典,而拆包则是将传递给函数的一个列表,元祖或字典拆解为多个独立的元素

1.打包

单星号(打包成元祖)

代码如下(示例):

def fun_1(a, *b): 
    print(a)
    print(b)


fun_1(1, 2, 3, 4)

结果展示:

1
(2, 3, 4)

双星号(打包成字典)

代码如下(示例):

def fun_1(value1, **b):
    print(value1)
    # print(a)
    print(b)


fun_1(1, e=4, f=5, d=6)

结果展示:

1
{'e': 4, 'f': 5, 'd': 6}

单星号和双星号

代码如下(示例):

def fun_1(value1, *a, **b):
    print(value1)
    print(a)
    print(b)


fun_1(1, 2, 3, e=4, f=5, d=6)

结果展示:

1
(2, 3)
{'e': 4, 'f': 5, 'd': 6}

2.拆包

拆解的过程在ddt中经常用到

单星号列表拆分:
代码如下(示例):

def func(a,*lis):
    print(a)
    print(lis)
    
    
# 单星号列表拆分
list_1 = [1, 2, 3]
func(*list_1)

结果展示:

1
(2, 3)

单星号元祖拆分:
代码如下(示例):

def func(a, *lis):
    print(a)
    print(lis)


# 单星号元祖拆分
list_1 = (1, 2, 3, 4)
func(*list_1)

结果展示:

1
(2, 3, 4)

单星号字典拆分
注意:单星号字典拆分只能得到字典的键(key),不能得到字典的值(value)
代码如下(示例):

def func_dic(*dic):
    print(dic)


# 单星号字典拆分(注意:只能获取字典的key,无法获取字典的value)
dic_1 = {"username": "ljx", "password": "124356", "hobby": "play"}
print(*dic_1)

结果展示:

username password hobby

那么,如何通过拆解获取字典的值呢?

双星号字典拆分

def work(**dic):
    print(dic.get("username"))
    print(dic.get("password"))
    print(dic.get("hobby"))


dic_2 = {"username": "lhf", "password": "654321", "hobby": "play"}
work(**dic_2)

结果展示:

lhf
654321
play

三、从函数定义与调用角度理解打包与拆包

从函数的定义和调用的角度理解打包与拆包:函数定义时带星号的形参扮演的是打包的角色,而函数调用时,传入函数的带星号的实参扮演的则是拆包的角色

话不多说,上代码分析:

def work_fun(a, *b):  # *b则将2 3 56 6打包成元祖(2, 3, 56, 6)
    print(a)
    print(b)


my_list = [1, 2, 3, 56, 6]
# print(*my_list)      # 1 2 3 56 6
work_fun(*my_list)     # *my_list将列表拆解为1 2 3 56 6

总结

小白一枚,如有错误,还请指出,谢谢~

写完了才发现还是不够了解,看到了下面这篇文章,豁然开朗:
浅谈python3打包与拆包在函数的应用详解

  • 12
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
拆包解包Python非常常见的操作。在Python拆包是指将一个可迭代对象(如列表、元组等)的元素分别赋值给多个变量的过程。解包则是相反的操作,将多个变量的值打包成一个可迭代对象。这种操作非常方便,可以一次性地同时操作多个变量。 拆包操作可以通过以下方式进行: a, b = b, a 这个操作实际上是利用元组的特性进行拆包,将b和a构成一个元组,然后将元组的值分别赋给a和b。这样就实现了变量的交换。 另外,拆包操作也可以应用在函数调用、列表解析和生成器表达式等地方。通过将一个可迭代对象拆解成多个变量,可以方便地传递参数、操作数据等。 解包操作符包括*和**。*可迭代解包操作符可以将一个可迭代对象拆解成多个元素,而**字典解包操作符可以将一个字典拆解成多个键值对。这些操作符的使用可以在函数调用、推导式和生成器表达式灵活地进行解包操作。 更详细的信息可以参考PEP448,它提出了*可迭代解包操作符和**字典解包操作符的扩展用法,允许在更多位置、任意次数和其他情况下进行解包操作。同时,还可以参考相关的资料,如GeeksforGeeks和CSDN的文章,来了解更多关于拆包解包的示例和用法123 #### 引用[.reference_title] - *1* [python基础语法之拆包(解包)](https://blog.csdn.net/qq_41621362/article/details/105437215)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] - *2* [python装包解包](https://blog.csdn.net/water19111213/article/details/107642335)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] - *3* [Python解包用法](https://blog.csdn.net/cnds123/article/details/129885450)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值