Python3函数中的打包与拆包机制详解
本文详细解析Python3中序列拆包与函数打包拆包的应用。涵盖序列赋值规则、函数定义时*与**形参的打包逻辑,以及调用时实参的拆包行为。通过代码示例说明位置参数、默认参数与命名参数的配合,以及多返回值处理的元组打包机制,帮助开发者掌握函数参数的高级用法。
Python序列拆包基础
1、序列(拆包)
*运算符可用于序列拆包操作,支持对字符串、列表、集合、元组及数字等序列类型进行解包处理。
print(*(1,2,3,4,5,6))
#1 2 3 4 5 6
print(*[1,2,3,4,5,6])
#1 2 3 4 5 6
序列拆包赋值的基本语法如下:
需要注意的是,*变量不能位于赋值序列的第一个位置,否则会导致语法错误。
a, b, *c = 0, 1, 2, 3 #获取剩余部分
a, *b, c = 0, 1, 2, 3 #获取中间部分
a, b, *c = 0, 1
a, *b, c = 0, 1
在赋值过程中,系统优先为普通位置变量赋值,剩余部分再分配给*变量。
#测试结果 print(a,b,c) 0 1 [2,3] 0 [1,2] 3 0 1 [] #优先满足普通变量a、b的赋值 0 [] 1 #优先满足普通变量a、c的赋值
函数形参的打包机制
在理解基础序列拆包后,接下来探讨函数定义与调用中的打包和拆包机制。
2、函数定义的多种形参(打包)
函数定义时,各类形参的排列顺序有特定规范。
函数形参的标准顺序为:def 函数名(【位置参数】,【*元组参数】,【默认参数=默认值】,【**字典参数】):
需明确,形参定义中的*和**符号在此处表示将传入参数打包。
【位置参数】:最基础的形参,必须与传入的实参按位置一一对应。 【 * 元组参数】:用于接收字符串、列表、集合、元组、字典或数字等序列,将其打包为元组作为形参。 【**字典参数】:用于接收键值对形式的多个实参,将其打包为字典作为形参。 【默认参数=默认值】:若函数调用时未传入该参数,则使用默认值;若传入了值,则使用传入值。
def 函数名(a,*b,c=3,**d):
print("a:",a)
print('b:',b)
print('c:',c)
print('d:',d)
# *元组参数只接受单一的值,而**字典参数是进行接收键值对
函数名(1,2,3,4,5,6,7,name="小明",age=18,sex="男")
#输出结果:
a: 1
b: (2, 3, 4, 5, 6, 7)
c: 3
d: {'name': '小明', 'age': 18, 'sex': '男'}
函数实参的拆包应用
3、函数调用时的实参(拆包)
def tk(c,d,e,f,g): #d,e,f,g分别接收 1 2 3 4
print(c)
print(d,e,f,g)
a=[1,2,3,4]
b={1,2,3,4}
tk(a,*b) # *b将集合拆解为数字元素序列 1 2 3 4
运行结果: [1, 2, 3, 4] 1 2 3 4
补充说明:
使用命名参数(关键字参数)可显著提升函数调用的灵活性,此时参数传递无需严格遵循位置顺序,但参数名必须与定义一致。

总结:默认参数与命名参数作用类似,区别在于前者属于形参定义,后者属于实参传递方式。
结合实参与形参,进一步分析函数中打包与拆包的具体交互过程。
def tk(a,*b): #2、再将数字元素序列 1 2 3 4打包成元组(1,2,3,4)
print(a)
print(b)
a1=[1,2,3,4]
b1={1,2,3,4}
tk(a1,*b1) #1、先将b1拆包成数字元素序列 1 2 3 4 再传递给元组形参*b
#输出结果: [1, 2, 3, 4] #a1未打包 (1, 2, 3, 4) #b1为打包后的元组
总结:函数形参和函数实参中的*含义不同,前者用于打包,后者用于拆包。
| 对单个值操作 | 对任意值操作 |
|---|---|
| 位置参数、默认参数、命名参数 | *元组参数、 **字典参数 |
函数多返回值处理
4、函数返回多值时的打包
接收函数返回值的两种常见情况如下:
def 函数():
return 返回值1 返回值2 返回值3
#1、当用一个变量接受多个返回值时,会打包成一个元组传递给变量
a=函数()
print(a)
#2、用与之数目对应的变量接受多个返回值
b,c,d=函数()
print(b,c,d)
#输出结果 (返回值1,返回值2,返回值3) #打包成元组 返回值1 返回值2 返回值3
到此这篇关于浅谈python3打包与拆包在函数的应用详解的文章就介绍到这了,更多相关python3打包与拆包内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













