序列解包
解包的基础概念
解包是指将可迭代对象中的元素分解并赋值给多个变量的过程。它基于元素的数量和位置,将元素分配给对应的变量,使得我们可以方便地访问和操作这些元素。
解包是Python中常用的一个功能,可以使用非常简洁的代码形式完成复杂的功能,提高代码的可读性,减少代码的输入量。
解包也叫作解压缩,就是将数据字符等从列表、字典、字符串等装有元素的容器取出需要的元素。
这种方法并不限于列表和元组,而是适用于任意序列类型(甚至包括字符串和字节序列)。只要赋值运算符左边的变量数目与序列中的元素数目相等,你都可以用这种方法将元素序列解包到另一组变量中。
解包的使用还可以利用 * 表达式获取单个变量中的多个元素,只要它的解释没有歧义即可。
多变量赋值
>>> a,b,c=1,2,3
>>> a
1
>>> b
2
>>> c
3
在上述代码中,可以在一行代码中同时为多个变量赋值。
字符串解包
它适用于解包字符串类型的可迭代对象。例如,我们可以解包一个包含3个字符的字符串,并将其分别赋值给3个变量。
>>> x,y,z='abc'
>>> x
'a'
>>> y
'b'
>>> z
'c'
元组解包
元组解包与字符串解包的语法相同,它适用于解包元组类型的可迭代对象。例如,我们可以解包一个包含两个元素的元组,并将其分别赋值给两个变量。
point = (3, 4)
x, y = point
在上述代码中,point 是一个包含两个元素的元组。通过将元组元素解包并分配给 x 和 y 这两个变量,我们可以分别获取元组中的每个元素的值。
列表解包
列表解包与元组解包的语法相同,它适用于解包列表类型的可迭代对象。通过列表解包,我们可以将列表中的元素一一赋值给对应的变量。
names = ['Alice', 'Bob', 'Charlie']
first, second, third = names
在上述代码中,names 是一个包含三个元素的列表。通过将列表元素解包并分配给 first、second 和 third 这三个变量,我们可以分别获取列表中的每个元素的值。
>>> x,y,z=sorted([1,3,2])
>>> x
1
>>> y
2
>>> z
3
字典解包
字典解包是一种特殊的解包形式,它允许我们将字典中的键和值分别解包并赋值给对应的变量。通过字典解包,我们可以方便地获取字典中的键和值。
- 解包字典keys()内容
>>> d={'a':1,'b':2,'c':3}
>>> x,y,z=d.keys()
>>> x
'a'
>>> y
'b'
>>> z
'c'
- 解包字典values()内容
>>> d={'a':1,'b':2,'c':3}
>>> x,y,z=d.values()
>>> x
1
>>> y
2
>>> z
3
- 解包字典items()内容
>>> d={'a':1,'b':2,'c':3}
>>> x,y,z=d.items()
>>> x
('a', 1)
>>> y
('b', 2)
>>> z
('c', 3)
对range对象解包
>>> x,y,z=range(3)
>>> x
0
>>> y
1
>>> z
2
>>>
对迭代器对象解包
>>> x,y,z=iter([1,2,3])
>>> x
1
>>> y
2
>>> z
3
对map对象解包
>>> x,y,z=map(str,range(3))
>>> x
'0'
>>> y
'1'
>>> z
'2'
嵌套解包
(a, b), (c, d) = (1, 2), (3, 4)
print(a) # 1
print(b) # 2
print(c) # 3
print(d) # 4
使用序列解包同时遍历多个系列
keys = ['a', 'b', 'c', 'd']
values = [1, 2, 3, 4]
for k, v in zip(keys, values):
print(k, v)
输入结果如下:
a 1
b 2
c 3
d 4
对内置函数enumerate()返回的迭代对象进行遍历
x = ['a', 'b', 'c']
for i, v in enumerate(x):
print('{0} : {1}'.format(i,v))
输出结果如下:
0 : a
1 : b
2 : c
扩展解包
扩展解包是一种高级的解包形式,它允许我们将可迭代对象中的多个元素解包并赋值给单个变量。通过扩展解包,我们可以处理可迭代对象中元素数量不确定的情况。
numbers = [1, 2, 3, 4, 5]
first, second, *rest = numbers
print(first)
print(second)
print(rest)
输出结果如下:
1
2
[3, 4, 5]
在上述代码中,numbers 是一个包含五个元素的列表。通过将前两个元素解包并分配给 first 和 second,同时使用 *rest 来收集剩余的元素,我们可以灵活地处理列表中的元素。
解包的应用场景
解包在 Python 中被广泛应用于各种情况,例如:
快速交换变量的值
可以使用解包一行代码快速交换两个变量的值,例如
a, b = b, a
函数返回多个值
函数可以返回多个值作为元组,并使用解包来接收这些值,方便地进行处理。
处理迭代器和生成器的输出
通过解包可以方便地获取迭代器和生成器产生的元素。
快速访问字典的键和值
通过字典解包,可以方便地获取字典中的键和值,便于进一步处理。
模拟考题
考题1 单选题
关于Python序列解包,下列表述错误的是?( )
A. 解压缩就是将数据字符等从列表等装有元素的容器取出需要的元素。
B. 解压缩就是将数据字符等从字典等装有元素的容器取出需要的元素
C. 解压缩就是将数据字符等从可迭代对象等装有元素的容器取出需要的元素。
D. 解压缩就是将数据字符等从字符串等装有元素的容器取出需要的元素。
答案:C
解析:序列解包也叫作解压缩,就是将数据字符等从列表、字典、字符串等装有元素的容器取出需要的元素,函数不可以
考题2 单选题
下列Python序列解包,正确的输出是?( )
fruit=['apple','peach','orange']
weight=[65,77,68]
for i,j in zip(fruit,weight):
print(i,j,end=' ')
A. 'apple','peach','orange',65,77,68
B. apple peach orange 65 77 68
C. apple 65 peach 77 orange 68
D. apple 65 , peach 77 , orange 68
答案:C
解析:zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象.
考题3 判断题
Python中如果x,y,z=map(str,range(3)),那么y=1。( )
答案:错误
解析:y=’1’