Python笔记004-元组的拆包和命名元组

以下是我学习《流畅的Python》后的个人笔记,现在拿出来和大家共享,希望能帮到各位Python学习者。

首次发表于:科技老丁哥,ID: TechDing,敬请关注。

本篇主要知识点:

元组的拆包就是将元组内部的每个元素按照位置一一对应的赋值给不同变量,可以应用到变量赋值,函数参数赋值,获取元组中特定位置的元素值等场合。

namedtuple: 用于存储对象序列,不能改变元素值,可以像dict一样通过名字进行访问,可以通过_asdict()转换为dict,其作用相当于只有属性没有方法的类。

1. 元组的拆包

Python中的元组tuple和列表list类似,不同之处在于元组的元素不能修改,所以被经常称为不可变列表,在形式上,元组用小括号()表示,而列表用中括号[]表示。

元组的拆包就是将元组内部的每个元素按照位置一一对应的赋值给不同变量,比如:

tupleA=(10,20.5)

first,second=tupleA # 对二元素元组拆包

print(first) # 10

print(second) # 20.5

a,b,c,d=('A',20.15,2019,'10:15:14') # 多元素元组的拆包

print(a) # A

print(b) # 20.15

print(c) # 2019

print(d) # 10:15:14

如果拆包应用于上面的简单赋值,那倒是没什么新奇之处。拆包其实被经常用于给函数的参数赋值,比如:

def func1(a,b):

print('a: ',a,'b: ',b)

tupleA=(10,20.5)

func1(*tupleA) # 拆包后作为函数的参数,a: 10 b: 20.5

另外一种拆包的应用场景是,某些函数返回一个tuple,而我们需要对其进行拆包,比如:

def func2(x):

return (x,x*2,x*x)

data1,data2,data3=func2(3)

print(data1) # 3

print(data2) # 6

print(data3) # 9

在拆包时,有的元素不是我们所需要的,那就用占位符来代替,即用_代表一个占位符,而*代表多个占位符

data1,_,data3=func2(3) # 用_代表一个变量

print(data1) # 3

data1,*rest=func2(3)

print(data1) # 3

print(rest) # [6,9]

嵌套元组,顾名思义是元组中包含有元组,对其进行拆包和普通元组的拆包类似。

areas=[('hubei','wuhan',1200,(150,260)),

('hunan','changsha',3600,(100,200)),

('shandong','jinan',800,(260,180))]

for province,city,data1,(data2,data3) in areas:

print('P:{}, C:{}, data2:{},data3:{}'.format(province,city,data2,data3))

2. 命名元组

命名元组(namedtuple)类似于tuple,都可以用于存储对象序列,但是它比tuple更加强大,除了延续tuple不能改变元素值这一特性之外,还有其本身的特点,比如可以像dict一样通过名字访问元素值,还可以通过_asdict()转换为dict类型。

命名元组可以构建一个带有字段名的元组和一个有名字的类,其消耗的内存和元组是一样的。

在面向对象的思想下,如果我们需要构建一个简单的类,只是用于存储几个简单的属性,而没有具体的方法,我们可以写成:

class PersonCls:# 定义一个类,只有属性,没有具体的方法,用于存储某些属性值

def __init__(self,name,age,score):

self.name=name

self.age=age

self.score=score

def __repr__(self):

return 'PersonCls(name={},age={},score={})'.format(self.name,self.age,self.score)

PC1=PersonCls('Jack',20,85)

PC2=PersonCls('Rose',18,92)

print(PC1) # PersonCls(name=Jack,age=20,score=85)

print(PC2) # PersonCls(name=Rose,age=18,score=92)

print(PC1.age) # 20

print(PC2.score) # 92

这样的写法是可行的,但不是Python风格,对这种情况,完全可以交给namedtuple来做,比如,在python里面的写法为:

from collections import namedtuple

Person=namedtuple('Person',['name', 'age', 'score']) # 构造一个namedtuple类

P1=Person('Jack',20,85) # 构建具体的实例,其赋值顺序要一一对应

P2=Person(age=18,name='Rose',score=92) # 如果指定变量名,顺序不用一一对应

print(P1) # Person(name='Jack', age=20, score=85)

print(P2) # Person(name='Rose', age=18, score=92)

print(P1.age) # 可以像dict一样通过属性名进行访问

print(P2.score) # 92

上面的Person=namedtuple('Person',['name', 'age', 'score'])就相当于构建一个只有属性没有方法的Person类,其属性为:‘name’, ‘age’, ‘score’,代码更加简单,且更有Python味儿。在内存上来说,会比定义一个类要小一些,因为此时不需要用__dict__来存放实例的属性。

命名元组除了从tuple继承来的属性之外,还有其专有属性,最常用的是_fields, _make(), _asdict()。如下:

# namedtuple专有属性:

from collections import namedtuple

Person=namedtuple('Person',['name', 'age', 'score'])

print(Person._fields) # ('name', 'age', 'score')

# _fields属性是一个包含这个类所有属性名称的tuple

person1=('zhangsan',25,59)

p1=Person._make(person1) # _make()接受一个可迭代对象生成一个实例

print(p1) # Person(name='zhangsan', age=25, score=59)

print(p1._asdict()) # OrderedDict([('name', 'zhangsan'), ('age', 25), ('score', 59)])

# _asdict()将实例的属性和值以OrderedDict的方式展示出来。

首次发表于:科技老丁哥,ID: TechDing,敬请关注。

本文所有代码都已经上传到我的github,欢迎下载

参考资料:

《流畅的Python》,Luciano Ramalho (作者) 安道 , 吴珂 (译者)。

python 元组拆包_Python笔记004-元组的拆包和命名元组相关推荐

  1. python财务编程_Python笔记 财务小白的 day4 python编程基础(2)

    [本文的我,是一个文科财务工作者.在单位信息化全靠人做的年代,确实工作压力大也忙不过来.9102年的我,深感不学习点新知识迟早要被淘汰.所以今天开始记录自己的python小白笔记,各位见笑.] 编程基 ...

  2. python创建只包含一个元素的元组时_Python中声明只包含一个元素的元组数据方法...

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  3. python数值比较器_python笔记16(数据处理笔记1)

    学习线性代数的时候,想要可视化,但是仅仅是三维坐标系,我都感觉到手画图很不直观.所以这次的python学习,一方面是把之前没学完的学完,另一方面,也是想了解下图形绘制的技术.以下内容和6.00笔记10 ...

  4. python编程财务_Python笔记 财务小白的 day3 python编程基础(1)

    [本文的我,是一个文科财务工作者.在单位信息化全靠人做的年代,确实工作压力大也忙不过来.9102年的我,深感不学习点新知识迟早要被淘汰.所以今天开始记录自己的python小白笔记,各位见笑.] 编程基 ...

  5. python pymysql实例_python笔记-mysql命令使用示例(使用pymysql执行)

    一.mysql命令使用 学习完mysql现在来进行一些测试 1.1.进入mysql 终端输入一下命令,进入数据库 mysql -uusername -p 1.2 进入数据库 在mysql终端输入如下命 ...

  6. python gpu编程_Python笔记_第四篇_高阶编程_进程、线程、协程_5.GPU加速

    Numba:高性能计算的高生产率 在这篇文章中,笔者将向你介绍一个来自Anaconda的Python编译器Numba,它可以在CUDA-capable GPU或多核cpu上编译Python代码.Pyt ...

  7. python今日内容_python笔记15

    今日内容 模块知识 内置模块 time datetime json 其他 内容回顾 & 作业题 重要知识点 构造字典和函数对应关系,避免重复的if else a=1 b=2 ==> a, ...

  8. [转载] python定义整型常量_Python笔记——数据类型、变量和常量

    参考链接: Python变量,常量和文字 数据类型 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频 ...

  9. python格式化字符串_Python笔记7:三种方式构建字符串-格式化

    主要内容: 小目标:掌握字符串 主要内容:字符串格式化,占位符 字符串非常重要,只要做编程,你不可能离开字符串 如果看完这篇文章,你还是弄不明白格式化: 你来找我,我保证不打你,我给你发100的大红包 ...

  10. 《Python Cookbook 3rd》笔记(1.11):命名切片

    命名切片 问题 你的程序已经出现一大堆已无法直视的硬编码切片下标,然后你想清理下代码. 解法 假定你有一段代码要从一个记录字符串中几个固定位置提取出特定的数据字段 (比如文件或类似格式): ##### ...

最新文章

  1. “中台不就是微服务吗?有啥区别?”
  2. dropbox解决办法
  3. break后面的语句还执行吗_【自学C#】|| 笔记 5 条件语句if、switch
  4. java中什么是同步_Java中,“synchronized”(同步)是什么意思?什么时候应该用synchronized? - Break易站...
  5. Java项目打war包的方法
  6. 《WF编程》系列之3 - 漫游工作流:Visual Studio 2005 扩展
  7. 【VBS】归纳 Visual Basic Script 内置函数
  8. python定义一个1xn矩阵_Python实现的矩阵类实例
  9. matlab怎么找出奇数个数_用MATLAB绘制系统根轨迹和性能分析
  10. ASP.NET Core性能改进【转载】
  11. 利用arcgis软件画地图
  12. that being said
  13. Mybatis---简单缓存了解
  14. 代码圈复杂度治理小结
  15. 如何做云班课上的计算机作业,云班课不分组怎么提交作业
  16. 转:告诉你一个真实的数字化
  17. git patch 使用
  18. 使用python和xlwings合并excel文件
  19. JAVA日记之mybatis-3一对一,一对多,多对多xml与注解配置 ----喝最烈的酒.
  20. mac连接手机 vm_苹果 Mac 上的虚拟机怎么联接 iPhone

热门文章

  1. 关于大内存(大于4G)支持的问题
  2. KY RD9700_USB网卡驱动
  3. 苹果7pnfc功能门禁卡_苹果手机门禁卡nfc功能
  4. 2022年嵌入式系统设计师考试大纲
  5. 东财《国际贸易法》综合作业
  6. ITOP4412----Uboot2020移植记录
  7. 【Python实例】获取今日零点的datetime
  8. 高精地图应用(四)横向定位
  9. python为什么是蛇的天敌_蛇的天敌有哪些?
  10. Vue中Swiper以及vue-awesome-swiper的安装和问题