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

作者:mrr 时间:2021-10-17 05:26:58 

前言

在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元组拆包和具名元组解析实例详解网站的支持!

来源:http://www.jqhtml.com/10804.html

标签:python,元组拆包,具名元组
0
投稿

猜你喜欢

  • Git commit --amend 修改提交信息操作

    2022-11-01 02:03:32
  • 解决python -m pip install --upgrade pip 升级不成功问题

    2022-12-15 00:21:55
  • thinkphp的钩子的两种配置和两种调用方法

    2024-05-22 10:02:33
  • php 常用类整理

    2024-05-09 14:46:57
  • Python实现印章代码的算法解析

    2023-10-14 15:18:24
  • 模拟兼容性的 inline-block 属性

    2008-04-08 12:37:00
  • 解析WordPress中函数钩子hook的作用及基本用法

    2023-07-08 03:27:52
  • mysql数据校验过程中的字符集问题处理

    2024-01-28 15:16:16
  • Linux下为不同版本python安装第三方库

    2023-11-12 05:04:35
  • 防止表单重复提交的巧妙方法

    2009-03-09 18:32:00
  • Java基础MAC系统下IDEA连接MYSQL数据库JDBC过程

    2024-01-20 10:41:56
  • 详解使用CUDA+OpenCV加速yolo v4性能

    2022-08-11 03:00:39
  • python各种excel写入方式的速度对比

    2021-04-23 22:30:15
  • Python subprocess库六个实例快速掌握

    2021-02-22 05:53:56
  • Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项

    2021-11-15 18:53:31
  • 详解Python匿名函数(lambda函数)

    2022-09-11 12:33:00
  • Python暴力破解Mysql数据的示例

    2024-01-23 17:29:37
  • Python简单读写Xls格式文档的方法示例

    2021-11-02 13:27:30
  • Golang中int, int8, int16, int32, int64和uint区别浅析

    2024-04-25 15:05:06
  • c#如何利用定时器自动备份数据库详解

    2024-01-27 12:11:33
  • asp之家 网络编程 m.aspxhome.com