30.1.6. 把数据结构直接拆分到多个变量

Python内置的元组(tuple)类型可以创建不可变的序列,把许多元素依次保存起来。最简单的用法是只用元组保存两个值,例如字典里面的键值对。

snack_calories = {
    "chips": 140,
    "popcorn": 80,
    "nuts": 190,
}

items = tuple(snack_calories.items())
print(items)

first = items[0]
second = items[1]

print(first, second)

city, num = first
print(city, num)

通过unpacking来赋值要比通过下标去访问元组内的元素更清晰,而且这种写法所需的代码量通常比较少。

当然,赋值操作的左边除了可以罗列单个变量,也可以写成列表、序列或任意深度的可迭代对象(iterable)

有了unpacking机制之后,只需要写一行代码就可以交换这两个元素,而不用像刚才那样分成三行来写。

def bubble_sort(a):
    for _ in range(len(a)):
        for i in range(1, len(a)):
            if a[i] < a[i - 1]:
                a[i - 1], a[i] = a[i], a[i - 1]  # swap


name = ["ccc", "bbb", "aaa", "eeee"]
bubble_sort(name)
print(name)

做完unpacking后,系统会扔掉这个临时的元组。

首先调用内置的enumerate函数获得当前要迭代的元组,然后针对这个元组做unpacking,这才是符合Python风格的写法(Pythonic式的写法),我们不需要再通过下标逐层访问了。这种写法可以节省篇幅,而且比较容易理解。

t_snack_calories = tuple(snack_calories.items())

for i, (city, number) in enumerate(t_snack_calories):
    print(f"index:#{i} city:{city} num:{number}")

要点:

unpacking是一种特殊的Python语法,只需要一行代码,就能把数据结构里面的多个值分别赋给相应的变量。

unpacking在Python中应用广泛,凡是可迭代的对象都能拆分,无论它里面还有多少层迭代结构。

尽量通过unpacking来拆解序列之中的数据,而不要通过下标访问,这样可以让代码更简洁、更清晰。