元组拆包
什么叫元组拆包?
将元组内的元素,依次分配赋值给变量。
拆包有个要求,元组中的元素数量必须跟接受这些元素的空挡数一致,否则会报错:
tuple_test = (1, 2, 3)
a,b=tuple_test
# raise ValueError: too many values to unpack (expected 2)
拆包方式
1. 直接赋值。适合元素较少的情况
tuple_test = (1, 2, 3)
a,b,c = tuple_test
print(a) # 1
print(b) # 2
print(c) # 3
2. 使用占位符_。适合元素较少的情况
tuple_test = (1, 2, 3)
a, b, _ = tuple_test
print(a) # 1
print(b) # 2
这样就只获取到部分数据了,这在取函数返回值时特别有用,比如:
import os
_, filename = os.path.split("/home/dongfanger/.ssh/idrsa.pub")
print(filename) # "idrsa.pub"
3. 使用*变量。适合元素较多的情况
当返回值特别多时,_占位符写起来麻烦,可以用*来处理剩下的元素
a,b,*c,d,e = range(1,10)
print(a) # 1
print(b) # 2
print(c) # [3,4,5,6,7]
print(d) # 8
print(e) # 9
*c是个列表,如果没有足够的值,就会返回一个空列表
*前缀变量能放在任意位置
*还有一个作用,把元组拆开作为函数参数,经典写法*args就是这个道理
def add(x,y):
return x+y
tuple_test = (1, 2)
print(add(*tuple_test)) # 3
嵌套元组拆包
嵌套元组是指元组中有元组,比如(1, 2, 3, (4, 5)),对于嵌套元组,你可能会想要拆两遍:
tuple_nest_test = (1, 2, 3, (4, 5))
a, b, c, d = tuple_nest_test
x, y = d
print(a, b, c, x, y)
实际上能一步到位:
tuple_nest_test = (1, 2, 3, (4, 5))
a, b, c, (x, y) = tuple_nest_test
print(a, b, c, x, y)
元组拆包的另外一个作用:交换两个变量的值
元组拆包提供了语法糖,对于交换两个变量的值的常规写法:
temp = a
a = b
b = temp
优雅写法
a,b=b,a