前言
在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打包与拆包在函数的应用详解