1 带星号的 unpacking 操作
拆解单层
car_ages = [0, 9, 4, 8, 7, 20, 19, 1, 6, 15]
car_ages_descending = sorted(car_ages, reverse=True)
oldest, second_oldest, *others = car_ages_descending
print(oldest, second_oldest, others)
oldest, *others, youngest = car_ages_descending
print(oldest, youngest, others)
*others, second_youngest, youngest = car_ages_descending
print(youngest, second_youngest, others)
拆解多层
car_inventory = {
'Downtown': ('Silver Shadow', 'Pinto', 'DMC'),
'Airport': ('Skyline', 'Viper', 'Gremlin', 'Nova'),
}
((loc1, (best1, *rest1)),
(loc2, (best2, *rest2))) = car_inventory.items()
print(f'Best at {loc1} is {best1}, {len(rest1)} others')
print(f'Best at {loc2} is {best2}, {len(rest2)} others')
2 用在迭代器上
- unpacking 操作也可以用在迭代器上,但是这样写与把数据拆分到多个变量里面的那种基本写法相比,并没有太大优势。
- 例如,我可以先构造长度为 2 的取值范围(range),并把它封装在 it 这个迭代器里,然后将其中的值拆分到 first 与 second 这两个变量里。
但这样写还不如直接使用形式相符的静态列表(例如 [1, 2]),那样更简单。
it = iter(range(1, 3))
print(it)
first, second = it
print(f'{first} and {second}')
对迭代器做 unpacking 操作的好处,主要体现在带星号的用法上面,它使迭代器的拆解值更清晰。例如,这里有个生成器,每次可以从含有整个一周的汽车订单的 CSV 文件中取出一行数据。
- 我们可以用下标和切片来处理这个生成器所给出的结果,但这样写需要很多行代码, 而且看着比较混乱。
```python
def generate_csv():
yield (‘Date’, ‘Make’ , ‘Model’, ‘Year’, ‘Price’)
for i in range(100):
yield ('2019-03-25', 'Honda', 'Fit' , '2010', '$3400')
yield ('2019-03-26', 'Ford', 'F150' , '2008', '$2400')
all_csv_rows = list(generate_csv()) header = all_csv_rows[0] rows = all_csv_rows[1:] print(‘CSV Header:’, header) print(‘Row count: ‘, len(rows))

- 利用带星号的 unpacking 操作,我们可以把第一行(表头)单独放在 header 变量里,
- 同时把迭代器所给出的其余内容合起来表示成 rows 变量。
- 这样写就清楚多了。
```python
def generate_csv():
yield ('Date', 'Make' , 'Model', 'Year', 'Price')
for i in range(100):
yield ('2019-03-25', 'Honda', 'Fit' , '2010', '$3400')
yield ('2019-03-26', 'Ford', 'F150' , '2008', '$2400')
it = generate_csv()
header, *rows = it
print('CSV Header:', header)
print('Row count: ', len(rows))