Python元组拆包和具名元组解析实例详解


Posted in Python onMarch 26, 2018

前言

在Python中元组是一个相较于其他语言比较特别的一个内置序列类型。有些python入门教程把元组成为“不可变的列表”,这种说法是不完备的,其并没有完整的概括元组的特点。除了用作不可变的列表,它还可以用于没有字段名的数据记录。下面的内容就围绕元组作为数据记录属性展开,并介绍带字段名的具名元组函数namedtuple,列表属性不再本文中叙述。

元组对于数据的记录

元组中的每个元素都存放了记录中一个字段的数据,外加这个字段的位置,正是这个位置信息给数据赋予了意义。

下面的一段代码就演示了元组被当作记录来使用。如果在任何的表达式里我们在元组内对元素排序,这些元素多携带的信息就会丢失,因为这些信息是跟它们的位置强关联的。

#把元组作记录
  >>> xiaoming, xiaohua = (16, 18)
  >>> xiaoming
  16
  >>> students_info = [('xiaoming', 16), ('xiaohua', 18), ('hanmeimei', 20)]
  >>> for student in students_info:
    print('%s is %d years old.'%student)
  xiaoming is 16 years old.
  xiaohua is 18 years old.
  hanmeimei is 20 years old.
  >>>

在这个示例中,我们把元组(16,18)里的元素分别赋值给变量xiaoming,xiaohua。同样在for循环中,一个%运算符就把student元组里的元素对应到了Print函数的格式字符串空档中。这两个都是元组拆包的应用。
元组拆包可以应用到任何可迭代对象上,唯一的硬性要求是,被可迭代对象中的元素数量必须要跟接受这些元素的元组的空档数一致。除非用*来表示忽略多余的元素。

元组拆包

最好辨认的元组拆包形式就是平行赋值 ,也就是把一个可迭代对象里的元素,一并赋值到由对应的变量组成的元组中。例如:

>>> age_list = (16,18)
  >>> xiaoming, xiaohua = age_list #这里就是元组拆包

另一个我们熟悉的平行赋值的例子就是交换两个变量的值:

>>> a, b = b, a #Python就是如此的优雅

还可以用*运算符把一个可迭代对象拆开作为函数的参数:

>>> divmod(20,8)
  (2, 4)
  >>> t = (20, 8)
  >>> divmod(*t)
  (2, 4)
  >>> quotient, remainder = divmod(*t)
  >>> quotient, remainder
  (2, 4)

用*来处理剩下的元素

在Python中,函数用*args来获取不确定数量的参数算是一种经典写法了。在Python3中,这个概念被扩展到了平行赋值中:

>>> a, b, *rest = range(5)
  >>> a, b, rest
  (0, 1, [2, 3, 4])
  >>> a, b, *rest = range(3)
  >>> a, b, rest
  (0, 1, [2])
  >>> a, b, *rest = range(2)
  >>> a, b, rest
  (0, 1, [])

在平行赋值中,*运算符前缀智能用在一个变量名前面,但是这个变量可以出现在赋值表达式的任意位置:

>>> a, *others, b, c = range(5)
  >>> a, others, b, c
  (0, [1, 2], 3, 4)
  >>> *others, a, b, c = range(5)
  >>> others, a, b, c
  ([0, 1], 2, 3, 4)

具名元组

在Python中,collections.namedtuple是一个工厂函数,它可以用来构建一个带字段名的元组和一个有名字的类。
用namedtuple构建的类的实例所消耗的内存跟元组是一样的,因为字段名都被存在对应的类里面。这个实例跟普通的对象实例比起来也要小一些,因为python不会用 dict 来存放这些实例的属性。

还是使用上面的小明和小华的例子来展示一下具名元组:

>>> from collections import namedtuple
  >>> Student = namedtuple('Student', 'name age gender')
  >>> xiaoming = Student('xiaoming', 16, 'boy')
  >>> xiaoming
  Student(name='xiaoming', age=16, gender='boy')
  >>> xiaoming.age
  16
  >>> xiaoming[2]
  'boy'

Student = namedtuple(‘Student', ‘name age gender'),创建一个具名元组,需要两个参数,一个是类名,另一个是类的各个字段名。后者可以是有多个字符串组成的可迭代对象,或者是有空格分隔开的字段名组成的字符串(比如本示例)。具名元组可以通过字段名或者位置来获取一个字段的信息。

具名元组的特有属性

类属性_fields:包含这个类所有字段名的元组

>>> xiaoming._fields
  ('name', 'age', 'gender')

类方法_make(iterable):接受一个可迭代对象来生产这个类的实例,作用等价于Student

(*xiaohua_info)
  >>> xiaohua_info = ('xiaohua', 18, 'girl')
  >>> xiaohua = Student._make(xiaohua_info)
  >>> xiaohua
  Student(name='xiaohua', age=18, gender='girl')

实例方法_asdict():把具名元组以collections.OrdereDict的形式返回,可以利用它来把元组里的信息友好的展示出来

>>> xiaohua._asdict()
  OrderedDict([('name', 'xiaohua'), ('age', 18), ('gender', 'girl')])
  >>> for key, value in xiaohua._asdict().items():
    print(key,':',value)
  name : xiaohua
  age : 18
  gender : girl

总结

以上所述是小编给大家介绍的Python元组拆包和具名元组解析实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python安装使用命令行交互模块pexpect的基础教程
May 12 Python
Python判断两个对象相等的原理
Dec 12 Python
Python读取MRI并显示为灰度图像实例代码
Jan 03 Python
python OpenCV学习笔记之绘制直方图的方法
Feb 08 Python
使用python 打开文件并做匹配处理的实例
Jan 02 Python
python IDLE 背景以及字体大小的修改方法
Jul 12 Python
Python 实用技巧之利用Shell通配符做字符串匹配
Aug 23 Python
Python树莓派学习笔记之UDP传输视频帧操作详解
Nov 15 Python
Python基于类路径字符串获取静态属性
Mar 12 Python
10个python3常用排序算法详细说明与实例(快速排序,冒泡排序,桶排序,基数排序,堆排序,希尔排序,归并排序,计数排序)
Mar 17 Python
python subprocess pipe 实时输出日志的操作
Dec 05 Python
Python Django 后台管理之后台模型属性详解
Apr 25 Python
基于循环神经网络(RNN)实现影评情感分类
Mar 26 #Python
基于循环神经网络(RNN)的古诗生成器
Mar 26 #Python
python机器学习之随机森林(七)
Mar 26 #Python
Python实现扣除个人税后的工资计算器示例
Mar 26 #Python
python实现决策树、随机森林的简单原理
Mar 26 #Python
python机器学习之贝叶斯分类
Mar 26 #Python
利用python实现微信头像加红色数字功能
Mar 26 #Python
You might like
php checkdate、getdate等日期时间函数操作详解
2010/03/11 PHP
php中使用parse_url()对网址进行解析的实现代码(parse_url详解)
2012/01/03 PHP
php微信开发之关注事件
2018/06/14 PHP
JavaScript入门学习书籍推荐
2008/06/12 Javascript
根据出生日期自动取得星座的js代码
2010/07/20 Javascript
Javascript计算时间差的函数分享
2011/07/04 Javascript
js将字符串转成正则表达式的实现方法
2013/11/13 Javascript
JS随机漂浮广告代码具体实例
2013/11/19 Javascript
JS 实现列表与多选框选择附预览动画
2014/10/29 Javascript
js实现仿QQ秀换装效果的方法
2015/03/04 Javascript
浅析JavaScript中命名空间namespace模式
2016/06/22 Javascript
BootStrap使用popover插件实现鼠标经过显示并保持显示框
2016/06/23 Javascript
利用Angularjs实现幻灯片效果
2016/09/07 Javascript
从零开始学习Node.js系列教程之SQLite3和MongoDB用法分析
2017/04/13 Javascript
angular中不同的组件间传值与通信的方法
2017/11/04 Javascript
javacript replace 正则取字符串中的值并替换【推荐】
2018/09/13 Javascript
微信小程序自定义键盘 内部虚拟支付
2018/12/20 Javascript
浅谈JS和jQuery的区别
2019/03/27 jQuery
基于vue+uniapp直播项目实现uni-app仿抖音/陌陌直播室功能
2019/11/12 Javascript
[55:25]VGJ.T vs Optic Supermajor小组赛D组 BO3 第三场 6.3
2018/06/04 DOTA
python self,cls,decorator的理解
2009/07/13 Python
Python找出list中最常出现元素的方法
2016/06/14 Python
python决策树之CART分类回归树详解
2017/12/20 Python
python实现二叉查找树实例代码
2018/02/08 Python
python 文件转成16进制数组的实例
2018/07/09 Python
浅谈python requests 的put, post 请求参数的问题
2019/01/02 Python
Python构建图像分类识别器的方法
2019/01/12 Python
Django实现学生管理系统
2019/02/26 Python
python3.6+selenium实现操作Frame中的页面元素
2019/07/16 Python
Django的性能优化实现解析
2019/07/30 Python
pygame实现贪吃蛇游戏(上)
2019/10/29 Python
Elemis美国官网:英国的第一豪华护肤品牌
2018/03/15 全球购物
《狼》教学反思
2014/03/02 职场文书
老公给老婆的保证书
2014/04/28 职场文书
个人对照检查剖析材料
2014/10/13 职场文书
vue使用localStorage持久性存储实现评论列表
2022/04/14 Vue.js