一、思考

1.什么是元组?

  • 不可变的序列类型
  • “不能修改的列表”

2.元组支持哪些操作?

  • 元组是序列类型,支持序列类型的所有操作
  • 通过索引取值
one_tuple = ("可优", 17, "男", "coding", "Never Stop Learning!")
one_tuple[-1]
  • 切片操作
one_tuple = ("可优", 17, "男", "coding", "Never Stop Learning!")
one_tuple[3:5]
  • 成员操作(in 或者 not in)
one_tuple = ("可优", 17, "男", "coding", "Never Stop Learning!")
"可优" in one_tuple
  • 连接操作(+)
one_tuple = ("可优", 17, "男", "coding", "Never Stop Learning!")
two_tuple = ("That is really right!", )
one_tuple + two_tuple
  • 重复操作符(*)
one_tuple = ("可优", 17, "男", "coding", "Never Stop Learning!")
one_tuple * 2
  • 遍历(for)
one_tuple = ("可优", 17, "男", "coding", "Never Stop Learning!")
for value in one_tuple:
print(value)
  • 求长度(len)
one_tuple = ("可优", 17, "男", "coding", "Never Stop Learning!")
len(one_tuple)
  • 其他内置函数(all、any、max、min、list、tuple、enumerate、sorted等)

3.元组有什么缺点(痛点)?

  • 最大的痛点是只能通过数字索引来取值
  • 当元组中元素非常大时,通过索引取值非常不方便,内存消耗也大

三、命名元组(namedtuple)

1.定义

使用命名元组的步骤:

# 将元组封装为一个类,可以通过字段名(属性名)来访问元组中的值
# 支持元组的所有操作
from collections import namedtuple # 1、定义一个类
Love = namedtuple("Love", "name gender age love_into hobby motto") # 2、创建对象
keyou = Love("可优", "帅男", 17, "Lemon little girl", "Coding", "Never Stop Learning!") # 3、获取命名元组的值
print(keyou[1]) # 支持元组的索引取值
print(keyou[-2:]) # 支持切片
print(keyou.name) # 支持通过字段名来取值

定义命名元组类的三种方法以及rename和defaults参数:

from collections import namedtuple

# 1、定义一个类
# 方法一,传递属性名之间以空格间隔的一个字符串
Love = namedtuple("Love", "name gender age love_into hobby motto") # 方法二,也可以以英文逗号来分隔每一个属性名
Love = namedtuple("Love", "name,gender,age,love_into,hobby,motto") # 方法三,传递一个由属性名组成的序列类型(列表、元组)
fields = ["name", "gender", "age", "love_into", "hobby", "motto"]
Love = namedtuple("Love", fields) # 说明:
# 属性名要符合标识符的命名规范
# 只能由数字、字母、下划线组成
# 不能以数字开头
# 不能与关键字、系统函数或类重名
# 如果属性名,不符合这些规范会报错吗? 会报错
fields = ["1name", "class", "def", "love_into", "hobby", "motto"]
Love = namedtuple("Love", fields) # 如果传了一个不符合规范的属性名,又不想让它报错呢? 可以做到的
# 将rename参数设置为True,当属性名不符合规范时,会自动帮我们将不符合规范的属性名改为下划线加数字索引值
fields = ["1name", "class", "def", "love_into", "hobby", "motto"]
Love = namedtuple("Love", fields, rename=True) # 如果某些属性有默认值呢? 如何设置?
# 可以设置defaults参数,为一个序列类型
# 以从右到左的顺序来为属性赋默认值
fields = ["1name", "class", "def", "love_into", "hobby", "motto"]
Love = namedtuple("Love", fields, rename=True, defaults=["Coding", "Never Stop Learning!"]) # 2、创建对象
# keyou = Love("可优", "帅男", 17, "Lemon little girl", "Coding", "Never Stop Learning!")
# 由于hobby和motto这两个属性已经有默认值了,所有可以不用传这两个参数
keyou = Love("可优", "帅男", 17, "Lemon little girl") # 3、获取命名元组的值
print(keyou[1]) # 支持元组的索引取值
print(keyou[-2:]) # 支持切片
# print(keyou.1name) # 支持通过字段名来取值
print(keyou._0) # 支持通过字段名来取值

2.创建

创建对象的两种方式:

# 创建对象的方式
from collections import namedtuple # 1、定义一个类
Love = namedtuple("Love", "name gender age love_into hobby motto") # 2、创建对象
# 方法一,调用构造器来创建对象
keyou = Love("可优", "帅男", 17, "Lemon little girl", "Coding", "Never Stop Learning!") # 方法二,使用_make方法来创建对象
one_person_value = ["可优", "帅男", 17, "Lemon little girl", "Coding", "Never Stop Learning!"] # 任何一个序列类型都行
keyou = Love._make(one_person_value) # 3、获取命名元组的值
print(keyou[1]) # 支持元组的索引取值
print(keyou[-2:]) # 支持切片
print(keyou.name) # 支持通过字段名来取值

3.取值

获取命名元组中的元素的三种方式:

# 获取命名元组中的元素的方法
from collections import namedtuple # 1、定义一个类
Love = namedtuple("Love", "name gender age love_into hobby motto") # 2、创建对象
one_person_value = ["可优", "帅男", 17, "Lemon little girl", "Coding", "Never Stop Learning!"] # 任何一个序列类型都行
keyou = Love._make(one_person_value) # 3、获取命名元组的值
# 方法一,通过索引取值,也可以通过切片取值
print(keyou[1]) # 支持元组的索引取值
print(keyou[-2:]) # 支持切片 # 方法二,通过字段名来取值
print(keyou.name) # 方法三,通过getattr来取值
print(getattr(keyou, 'gender'))

4.其他操作

命名元组支持的其他操作:

  • _asdict方法
  • _replace方法
  • _fields属性
  • _field_defaults属性
# 命名元组支持的其他操作

from collections import namedtuple

# 1、定义一个类
fields = ["name", "age", "gender", "love_into", "hobby", "motto"]
Love = namedtuple("Love", fields, rename=True, defaults=["Coding", "Never Stop Learning!"]) # 2、创建对象
one_person_value = ["可优", "帅男", 17, "Lemon little girl", "Coding", "Never Stop Learning!"] # 任何一个序列类型都行
keyou = Love._make(one_person_value) # 3、获取命名元组的值
# 方法一,通过索引取值,也可以通过切片取值
# print(keyou[1]) # 支持元组的索引取值
# print(keyou[-2:]) # 支持切片 # 方法二,通过字段名来取值
# print(keyou.name) # 方法三,通过getattr来取值
# print(getattr(keyou, 'gender')) # 4、其他操作
# _asdict方法,将元组转化为字典
one_dict = keyou._asdict()
print(dict(one_dict)) # _replace方法,修改元组中的值,会创建一个新元组,之前的元组未修改
print("keyou的名牌号为:{}".format(id(keyou)))
new_keyou = keyou._replace(age=16)
print("new_keyou的值为:{}\n新门牌号为:{}\n".format(new_keyou, id(new_keyou))) # _fields,获取命名元组的所有属性名
print(keyou._fields) # _field_defaults,获取命名元组的所有属性默认值
print(keyou._fields_defaults)

5.应用场景

  • 将测试数据从Excel(csv、json、数据库)中读取出来,在Python中处理时,往往可以使用namedtuple来承载数据
  • 需要使用元组来处理数据的所有场景都可以

Python中比元组更好用的namedtuple的更多相关文章

  1. python中的元组

    在python中,元组是不可变类型 可通过以下案例说明: >>> c1 = ['1','2'] >>> c = (1,2,c1) >>> c (1 ...

  2. 6、python中的元组

    元组(tuple)是python中有序.不可变的数据结构.元组还是python四种数据结构中唯一一种不可变的数据结构. 一.前言 元组在很多方面都变现得跟列表一样,除了列表储存得对象是可变得,而元组储 ...

  3. 11.python中的元组

    在学习什么是元组之前,我们先来看看如何创建一个元组对象: a = ('abc',123) b = tuple(('def',456)) print a print b

  4. python学习之【第五篇】:Python中的元组及其所具有的方法

    1.前言 Python的元组(tuple)与列表很相似,不同之处在于元组不能被修改,即元组一旦创建,就不能向元组中的增加新元素,不能删除元素中的元素,更不能修改元组中元素.但是元组可以访问任意元素,可 ...

  5. python中关于元组的操作

    元组的基本操作:1.创建一个元组: tuple=(1,26); tuple1=(","sy"); 创建一个空元组: tuple=(); 元组中只包含一个元素时,需要在元素 ...

  6. python中列表 元组 字典 集合的区别

    列表 元组 字典 集合的区别是python面试中最常见的一个问题.这个问题虽然很基础,但确实能反映出面试者的基础水平. (1)列表 什么是列表呢?我觉得列表就是我们日常生活中经常见到的清单.比如,统计 ...

  7. **python中列表 元组 字典 集合

    列表 元组 字典 集合的区别是python面试中最常见的一个问题.这个问题虽然很基础,但确实能反映出面试者的基础水平. 1.列表 列表是以方括号“[]”包围的数据集合,不同成员以“,”分隔. 列表的特 ...

  8. python 中列表 元组 字典 集合的区别

    先看图片解释 (1)列表 什么是列表呢?我觉得列表就是我们日常生活中经常见到的清单.比如,统计过去一周我们买过的东西,把这些东西列出来,就是清单.由于我们买一种东西可能不止一次,所以清单中是允许有重复 ...

  9. python中一些元组知识

    元组 Python 的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号 ( ),列表使用方括号 [ ]. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. 实例(Pytho ...

随机推荐

  1. Java | 基础归纳 | set

    用于存储无序(存入和取出的顺序不一定相同)元素,值不能重复.

  2. the little schemer 笔记(10)

    第十章 What Is  the Value of All of This? entry条目 是由list表组成的 pair 对,pair 对的第一个list表是集合 set.另外,两个list表的长 ...

  3. AtCoder Grand Contest 001 D - Arrays and Palindrome

    题目传送门:https://agc001.contest.atcoder.jp/tasks/agc001_d 题目大意: 现要求你构造两个序列\(a,b\),满足: \(a\)序列中数字总和为\(N\ ...

  4. HDU - 6066 RXD's date

    Bryce1010模板 http://acm.hdu.edu.cn/showproblem.php?pid=6066 #include <iostream> using namespace ...

  5. linux常用的shell命令

    1.shell介绍 shell(外壳)是linux系统的最外层,简单的说,它就是用户和操作系统之间的一个命令解释器. 2.shell命名的使用 ls :查看当前目录的信息,list .        ...

  6. 基于node 搭建http2服务

    1.准备工作:安装node2.安装http2: npm install http2 -g安装完成后,在安装目录中appData/Roaming>npm>node_modules>ht ...

  7. JavaEE中一些缩写的含义

    EJB:Enterprise JavaBeans  (企业JavaBeans) XML:Extensible Markup Lauguage (可扩展标记语言) SOAP:Simple Object ...

  8. Finally语句

  9. 【转】哪个更快:Java堆还是本地内存

    译文出处: shenzhang   原文出处:原文链接 使用Java的一个好处就是你可以不用亲自来管理内存的分配和释放.当你用new关键字来实例化一个对象时,它所需的内存会自动的在Java堆中分配.堆 ...

  10. UOJ#52. 【UR #4】元旦激光炮(交互)

    题意 给出三个已经排好序的数组$a, b, c$ 在$100$次询问内找出第$k$小的元素 Sol 一种很显然的$log^2n$的做法:首先在$a$中二分,然后再$b,c$中二分.这样可以得到$60$ ...