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