通过unpacking来赋值要比通过下标去访问元组内的元素更清晰,所需代码量通常也比较少
favorite_snacks = {
'salty': ('pretzels', 100),
'sweet': ('cookies', 180),
'veggie': ('carrots', 20),
}
((type1, (name1, cal1)),
(type2, (name2, cal2)),
(type3, (name3, cal3))) = favorite_snacks.items()
print(f"Favorite {type1} is {name1} with {cal1} calories")
可以通过unpacking原地交换两个变量,不需要专门创建临时变量
list1 = ['a', 'c', 'b']
# change list[1] list[2]
tmp = list[1]
list[1] = list[2]
list[2] = tmp
# unpacking
list[1], list[2] = list[2], list[1]
原因:python处理赋值操作的时候,先对等号右边求值,会新建一个临时元组,将其存入这个元组里(‘b’, ‘c’),然后python对这个临时元组做unpacking,把它里面的元素分别放到等号左边的位置,于是list[1]=‘b’, list[2]=‘c’,做完unpacking后,系统会扔掉这个临时元组
snacks = [('bacon', 350), ('donut', 240)]
for i in range(len(snacks)):
item = snacks[i]
name = item[0]
calories = item[1]
print(f'#{n+1}:{name} has {calories} calories')
# unpacking
for rank, (name, cal) in enumerate(snacks, 1):
print(f'#{rank}:{name} has {cal} calories')
-
unpacking机制运用:构建列表、给函数设计参数列表、传递关键字参数、接收多个返回值等
-
凡是可迭代的对象都能拆分,无论里面还有多少层迭代结构
-
尽量通过unpacking来拆解序列中的数据,而不要通过下标访问,这样可以让代码更简洁清晰