1. 概述
Python 中的可迭代对象是一个集合,集合里的元素是可以遍历的。Python 的可迭代对象包括:列表 (List)、字典 (Dictionary)、元组 (Tuples)、字符串 (Strings)、集合 (Sets)。
可迭代对象的解包是指将可迭代对象中的值赋值给不同的变量。可以对各种可迭代对象执行解包。
Python 有两种解包方法:
固定长度解包- 接受变量的个数与可迭代对象中元素的个数相同。
任意长度解包- 接受变量的个数小于可迭代对象中元素的个数,用星号表达式 (*)描述要接受或要放弃的不定长度的元素。
固定和任意这两个词到底是什么意思得弄清楚。固定不是说可迭代对象的元素个数是固定的互联网项目,任意也不是说可迭代对象的元素个数是任意长的。它们其实是以变量接收可迭代对象的元素个数来区分的:
2. 固定长度解包
固定长度解包要求接受变量的个数与可迭代对象中元素的个数完全相同,不能多,也不能少。
2.1 解包列表 (List)
下面的代码对一个列表 (List) 进行固定长度解包,这个列表有4个元素,分别是姓名、昵称、年龄、门派。
a_record = ["黄药师", "东邪", 40, "逍遥派"]
name, nickname, age, school = a_record
print("name: " + name)
print("nickname: " + nickname)
print("age: " + str(age))
print("school: " + school)
输出
name: 黄药师
nickname: 东邪
age: 40
school: 逍遥派
上面的代码使用4个变量接受a_record列表的4个元素。
注意:变量的顺序应与列表中元素的顺序保持一致。
2.2 解包时抛弃不需要的元素
固定长度解包要求接受变量的个数与可迭代对象中元素的个数完全相同,但有时候我们只关注部分元素,或者说我们只想接受部分元素可迭代对象是什么意思,这个时候怎么办呢?对于想抛弃的不需要的元素可以在对应的位置用_代替变量。比如我们不想接收年龄这个元素,可以在第3个变量的位置写入_,示例如下:
a_record = ["黄药师", "东邪", 40, "逍遥派"]
name, nickname, _, school = a_record
print("name: " + name)
print("nickname: " + nickname)
print("school: " + school)
输出
name: 黄药师
nickname: 东邪
school: 逍遥派
2.3 解包字典 (Dictionary)
Python 中的字典 (Dictionary) 是可迭代对象,因此可以解包。要注意的是字典 (Dictionary) 解包时接收变量得到的是字典的key。请看下面的示例:
a_record = {"nickname":"东邪", "age":40}
key1, key2 = a_record
print("key1: " + key1)
print("key2: " + key2)
输出
key1: nickname
key2: age
使用获得的key可以从字典中获得对应的值, 如下所示。
>>> a_record[key1]
'东邪'
>>> a_record[key2]
40
2.4 解包元组 (Tuples)
Python 中的元组 (Tuples) 是可迭代对象,因此可以解包。下面的代码接收一个元组的前两个元素。
a_record = (3, 9, 6)
data1, data2, _ = a_record
print("data1: " + data1)
print("data2: " + data2)
输出
data1: 3
data2: 9
2.5 解包可迭代对象中的可迭代对象
如果一个可迭代对象中的某个或某些元素是可迭代对象,也是可以解包的。下面的示例演示了如何接收一个列表中包含的另一个列表。
a_record = [["黄药师", "东邪"], 40, "逍遥派"]
var1, age, school = a_record
print("var1: " + var1)
print("age: " + str(age))
print("school: " + school)
输出
var1: ['黄药师', '东邪']
age: 40
school: 逍遥派
可以看到var1变量接收了列表中的列表。
还可以通过如下方式将列表中的列表的数据接收到。
a_record = [["黄药师", "东邪"], 40, "逍遥派"]
[name, nickname], age, school = a_record
print("name: " + name)
print("nickname: " + nickname)
print("age: " + str(age))
print("school: " + school)
输出
name: 黄药师
nickname: 东邪
age: 40
school: 逍遥派
3. 任意长度解包
任意长度解包需要解决一个问题,即用一种方式来表达“一个变量接收可迭代对象中的多个元素”。Python 的星号表达式 (*)就是解决这个问题的。
下面是一个列表,第一个元素是开始日期,最后一个元素是结束日期,中间是一些测试数据。现在通过任意长度解包可迭代对象是什么意思,把开始日期、测试数据、结束日期提取出来。
a_record = ["2022-3-9", 3, 6, 9, 12, 56, 33, "2022-3-10"]
start_time, *data, end_date = a_record
print("start_time: " + start_time)
print("data: " + str(data))
print("end_date: " + end_date)
输出
start_time: 2022-3-9
data: [3, 6, 9, 12, 56, 33]
end_date: 2022-3-10
也可以用_放弃某些数据的接收,如:
a_record = ["2022-3-9", 3, 6, 9, 12, 56, 33, "2022-3-10"]
start_time, *_, end_date = a_record
print("start_time: " + start_time)
print("end_date: " + end_date)
使用任意长度解包,还可以方便获取可迭代对象的最后一个元素,在我的另一篇文章获取列表的最后一个元素中给出了具体示例,有兴趣的朋友可以去看一下。
4. 总结
本文介绍了什么是可迭代对象的解包,以及解包的两种方式:固定长度解包、任意长度解包,并通过示例演示了解包过程。解包的用途很多,大家可积极探索。
因为没有留言功能,无法与大家互动,甚是遗憾。特别想听到您阅读后的感受,您可以私信我或添加我的微信 (ReadingHere2000) 与我交流,期待您的到来。
本文由公众号ReadingHere原创,保留一切法定权利,侵权必究。欢迎分享、点赞、点亮在看。
【公众号】ReadingHere
