3.6 序列解包

序列解包是对多个变量同时进行赋值的简洁形式,也就是把一个序列或可迭代对象中的多个元素的值同时赋值给多个变量,要求等号左侧变量的数量和等号右侧值的数量必须一致。

     > > > x, y, z = 1, 2, 3                 #多个变量同时赋值
     > > > v_tuple = (False, 3.5, 'exp')
     > > > x, y, z = v_tuple
     > > > x, y = y, x                       #交换两个变量的值
     > > > x, y, z = range(3)                #可以对range对象进行序列解包
     > > > x, y, z = map(str, range(3))      #使用可迭代的map对象进行序列解包

序列解包也可以用于列表、字典、enumerate对象、filter对象、zip对象等,但是对字典使用时,默认是对字典“键”进行操作,如果需要对“键:值”对进行操作,需要使用字典的items()方法说明,如果需要对字典“值”进行操作,则需要使用字典的values()方法明确指定。

     > > > a = [1, 2, 3]
     > > > b, c, d = a                       #列表也支持序列解包的用法
     > > > x, y, z = sorted([1, 3, 2])       #sorted()函数返回排序后的列表
     > > > s = {'a':1, 'b':2, 'c':3}
     > > > b, c, d = s.items()               #对字典的元素进行解包
     > > > b
    ('a', 1)
     > > > b, c, d = s                       #对字典的键进行解包
     > > > b
    'a'
     > > > b, c, d = s.values()              #对字典的值进行解包
     > > > print(b, c, d)
    1 2 3
     > > > a, b, c = 'ABC'                   #字符串也支持序列解包
     > > > print(a, b, c)
    A B C

使用序列解包可以很方便地同时遍历多个序列。

     > > > keys = ['a', 'b', 'c', 'd']
     > > > values = [1, 2, 3, 4]
     > > > for k, v in zip(keys, values):    #对zip对象进行解包
        print(k, v)


a 1 b 2 c 3 d 4

下面的代码演示了对内置函数enumerate()返回的迭代对象进行遍历时序列解包的用法。

     > > > x = ['a', 'b', 'c']
     > > > for i, v in enumerate(x):
        print('The value on position {0} is {1}'.format(i, v))
                                #format()是字符串格式化方法,详见7.4.2节


The value on position 0 is a The value on position 1 is b The value on position 2 is c

下面代码对字典的操作也使用到了序列解包。

     > > > s = {'a':1, 'b':2, 'c':3}
     > > > for k, v in s.items():    #字典中每个元素都包含“键”和“值”两部分
        print(k, v)


a 1 c 3 b 2