一、思考

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. iOS 自建企业级应用(In-House)分发平台

    注意事项 自建分发平台,首先需要有一个可以提供下载功能的服务器,而且服务器需要支持HTTPS协议! 其实,使用七牛云就可以完成这些操作. 推荐方案 七牛云实践方案简述(感兴趣的朋友可以和我交流具体的实 ...

  2. Incorrect string value: '\xE8\x8B\x8F\xE6\x99\xA8...' for column 'user_name' at row 1

    前端插入数据的时候报如下错误: Incorrect string value: '\xE8\x8B\x8F\xE6\x99\xA8...' for column 'user_name' at row ...

  3. B.华华教月月做数学

    链接:https://ac.nowcoder.com/acm/contest/392/B 题意: 找到了心仪的小姐姐月月后,华华很高兴的和她聊着天.然而月月的作业很多,不能继续陪华华聊天了.华华为了尽 ...

  4. Pursuit For Artifacts CodeForces - 652E

    https://vjudge.net/problem/CodeForces-652E 边双啊,就是点双那个tarjan里面,如果low[v]==dfn[v](等同于low[v]>dfn[u]), ...

  5. noip初赛

    运算符       联结词名称 异或 ⊕       非¬(-)     否定 与∧(·) 对应集合∩交集 对应按位与符号& 合取 或∨(+) 对应集合∪并集 对应按位或符号| 析取 条件→ ...

  6. vmware虚拟机启动centOs黑屏

    如图所示  , 我的VM 启动虚拟机之后就变成了上面的样子,一直不动,ping也ping不好,这个时候 : 1. 要么 内存不够了: 2. 要么 网络协议存在问题了: 本地windows环境在管理员的 ...

  7. P1838 三子棋I

    题目描述 小a和uim喜欢互相切磋三子棋.三子棋大家都玩过是吗?就是在九宫格里面OOXX(别想歪了),谁连成3个就赢了. 由于小a比较愚蠢,uim总是让他先. 我们用9个数字表示棋盘位置: 123 4 ...

  8. AJPFX总结Collection集合(下)

    List集合特有方法 特有方法.凡是可以操作角标的方法都是该体系特有的方法. 增          add(index,element);在指定位置添加元素          addAll(index ...

  9. 亲身经历,Java面试题整理

    博主在2015年暑期参加过一些Java开发工程师实习的面试和笔试,在此将重点整理出来,以供大家学习. 资料1: 一.单继承 1.1Java类是否支持多重继承? 答:继承的基本原则是: 子类继承父类的所 ...

  10. 《Python基础教程》 读书笔记 第六章 抽象 函数 参数

    6.1创建函数 函数是可以调用(可能包含参数,也就是放在圆括号中的值),它执行某种行为并且返回一个值.一般来说,内建的callable函数可以用来判断函数是否可调用: >>> x=1 ...