8个月前曾经发过一篇关于序列解包的文章,见详解Python序列解包,本文再稍作补充。
可以说,序列解包的本质就是把一个序列或可迭代对象中的元素同时赋值给多个变量,如果等号右侧含有表达式,会把所有表达式的值先计算出来,然后再进行赋值。下面是一些序列解包的用法:
#多个变量同时赋值
>>> x, y, z = 1, 2, 3
>>> v_tuple = (False, 3.5, 'exp')
>>> (x, y, z) = v_tuple
>>> x, y, z = v_tuple
#可以对range对象进行序列解包
>>> x, y, z = range(3)
#使用迭代器对象进行序列解包
>>> x, y, z = iter([1, 2, 3])
#使用可迭代的map对象进行序列解包
>>> x, y, z = map(str, range(3))
#交换两个变量的值
>>> a, b = b, a
#sorted()函数返回排序后的列表
>>> x, y, z = sorted([1, 3, 2])
#字符串也支持序列解包
>>> a, b, c = 'ABC'
>>> x = [1, 2, 3, 4, 5, 6]
#切片也支持序列解包
>>> x[:3] = map(str, range(5))
>>> x
['0', '1', '2', '3', '4', 4, 5, 6]
在上面的例子中,a, b = b, a是比较特殊的一个,可以这样理解:先把变量a和b原来的值取出来组成一个元组,然后再把这个元组序列解包赋值给变量a和b。
再例如,下面的代码用来生成斐波那契数列中小于1000的数字:
def fib(n):
a, b = 1, 1
while a < n:
print(a, end=' ')
a, b = b, a+b
print()
在这段代码中第一行a, b = 1, 1和倒数第二行的a, b = b, a+b都属于序列解包的用法,其中a, b = 1, 1很容易理解,但是很多朋友对a, b = b, a+b这个语句不太理解。这个语句的执行过程是这样的:假设现在a=3和b=5,那么先使用这两个变量原来的值计算等号右侧的元组得到(5, 3+5)也就是(5, 8),然后序列解包赋值给变量a和b,结果是a = 5和b = 8。
再例如,之前发过的文章Python两种方法求解登楼梯问题(京东2016笔试题)中,第一段代码就用到了序列解包。
-----------------分割线---------------
今日习题:在Python解释器环境中运行表达式reduce(lambda x,y: max(x,y), (1,5,2,3,4)),查看计算结果,并尝试理解这个代码的原理和执行过程,可以参考详解Python函数式编程之map、reduce、filter和几段小代码解释Python命令式编程和函数式编程。