python-序列解包的多种形式和用法

序列解包(Sequence Unpacking)是Python中非常重要和常用的一个功能,可以使用非常简洁的形式完成复杂的功能,大幅度提高了代码的可读性,减少了程序员的代码输入量。例如,可以使用序列解包功能对多个变量同时进行赋值。

>>> x, y, z = 1, 2, 3 #多个变量同时赋值

>>> v_tuple = (False, 3.5, 'exp')

>>> (x, y, z) = v_tuple

>>> x, y, z = v_tuple

>>> x, y, z = range(3)#可以对range对象进行序列解包

>>> x, y, z = map(str, range(3)) #使用迭代对象进行序列解包

序列解包也可以用于列表、字典、enumerate对象、filter对象等等,但是对字典使用时,默认是对字典“键”进行操作,如果需要对“键:值”对进行操作,需要使用字典的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

('c', 3)

>>> b, c, d = s #使用字典时不用太多考虑元素的顺序

>>> b

'c'

>>> b, c, d = s.values()

>>> print(b, c, d)

1 3 2

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

>>> 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('The value on position {0} is {1}'.format(i,v))

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

另外,序列解包还支持下面的用法:

>>> print(*[1, 2, 3], 4, *(5, 6))

1 2 3 4 5 6

>>> *range(4), 4

(0, 1, 2, 3, 4)

>>> {*range(4), 4, *(5, 6, 7)}

{0, 1, 2, 3, 4, 5, 6, 7}

>>> {'x': 1, **{'y': 2}}

{'y': 2, 'x': 1}

 

注:本文节选自《Python程序设计》(第2版)(董付国编著,清华大学出版社,2016年6月出版)

未经允许不得转载!python-序列解包的多种形式和用法