详解Python中的序列解包(2)

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命令式编程和函数式编程

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dongfuguo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值