详解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小屋(Python_xiaowu)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-10-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏思考的代码世界

Python基础学习00天

13030
来自专栏技术博客

C#项目代码规范

   小菜就是小菜,几个人搞出来的项目,让公司大牛稍微看了下,最后送出了惨不忍睹四个字。命名各种各样,五花八门,大写英文、小写英文、大写拼音、小写拼音、英文和拼...

43740
来自专栏LEo的网络日志

python技巧分享(十一)

14940
来自专栏大愚Talk

我对变量产生了这些想法

最近在学习Golang的过程中,发现一个有意思的事情,有的文章说函数调用传参时 slice 是引用传递,有的说是值传递。为什么同一个东西大家会不同认识?为了搞清...

10710
来自专栏零基础使用Django2.0.1打造在线教育网站

关于JAVA你必须知道的那些事(二):封装

时隔近一年,我突然想起来这个文章还没有发完,所以就继续开始写。也不知道自己上次写到哪里了,不管了这里从面向对象的三个特性说起。

9410
来自专栏前端小栈

转 javascript基础详解-执行环境与作用域链

函数调用都有与之相关的作用域和上下文。从根本上说,范围是基于函数(function-based)而上下文是基于对象(object-based)。换句话说,作用域...

6610
来自专栏xingoo, 一个梦想做发明家的程序员

剑指OFFER之二进制中1的个数(九度OJ1513)

题目描述: 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 输入: 输入可能包含多个测试样例。 对于每个输入文件,第一行输入一个整数T,代表测...

20490
来自专栏hrscy

Swift2.1-下标脚本下标脚本

类,结构体和枚举可以定义下标脚本,下标脚本可以认为是访问集合(collection),列表或序列的成员元素。你可是使用下标脚本来设置或通过索引检索值,而不需要调...

9230
来自专栏lgp20151222

JQuery跳出each循环的方法(包含数组遍历)

break----用return false;  continue --用return ture;

14230
来自专栏前端桃园

通俗的方式理解动态类型,静态类型;强类型,弱类型

31940

扫码关注云+社区

领取腾讯云代金券