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等)

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

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

命名元组(namedtuple)

1.定义

使用命名元组的步骤:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 将元组封装为一个类,可以通过字段名(属性名)来访问元组中的值
# 支持元组的所有操作
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
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''# 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属性
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 命名元组支持的其他操作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中的元组

    理解 python 中的元组 引言 在 Python 中元组是这样的: 元组是是这样一种数据结构:不变的或者不可改变的(简单来说不能重新赋值) .元素的有序序列.因为元组是 不变的,所以他的数值是不能 ...

  2. Python中使用元组对ndarray矩阵的某个维度进行选取和调序的操作

    大家应该都知道,numpy库中的ndarray可以用所谓的三帽号规则进行切片操作(详情可见我之前写的博文,链接 https://blog.csdn.net/wenhao_ir/article/deta ...

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

    参考文章:python中列表 元组 字典 集合的区别

  4. 在python中排序元组

    在Python中,当你排序一个元组时,如下所示: >>> items = [(1, 'B'), (1, 'A'), (2, 'A'), (0, 'B'), (0, 'a')] > ...

  5. python如果选择不在列表里_具体问题具体分析!Python中比列表更便捷的小方法

    全文共1627字,预计学习时长5分钟 来源:Pexels 学习新事物时,我们常常对所有可能发生的情况都不了解.通过反复试错,我们会总结出一个方法或一个规律来应对新事物可能发生的问题,一旦某个方法十分有 ...

  6. python中的元组和列表的核心区别

    列表和元组都是有序的,可以存储任意数据类型的集合,区别主要在于下面这两 点. 列表是动态的,长度可变,可以随意的增加.删减或改变元素.列表的存储空间略大于元 组,性能略逊于元组. 元组是静态的,长度大 ...

  7. python元祖迭代_如何在Python中迭代元组的堆栈

    我尝试在Python中使用预定义为的DepthFirstSearch类实现DepthFirstSearch算法:class Stack: def __init__(self): self.list = ...

  8. python中的元组及注意事项

    与列表类似,元组也是由任意类型元素组成的序列. 与列表不同的是,元组是不可改变,这意味着一旦元组被定义,将无法再进行增加.删除或修改元素等操作.因此,元组就像一个不可改变的列表. 在许多地方元组都可以 ...

  9. python中定义元组的符号_python中得元组和字符串详解,有这么一篇文章就够了

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云 作者:咸鱼学Python ( 想要学习Python?Pyth ...

最新文章

  1. php 取对象数据_过程式编程和面向对象编程有什么区别?怎么理解php对象的概念?...
  2. Win64 驱动内核编程-12.回调监控进线程创建和退出
  3. 获取上传图片路径方法(新旧方法)
  4. 移动开发者选项手机如何打开真机调试模式
  5. LockSupport的park和unpark
  6. AOL CEO 谈雅虎收购案及后续计划
  7. 梦网云通讯获取状态报告API接口get_rpt说明POST请求示例
  8. 方法:如何解决NetShareEnum返回ERROR_NO_UNICODE_TRANSLATION(1113)的问题
  9. 使用SMART原则快速上手一门编程语言
  10. android 多媒体音频占用情况监听
  11. 使用segue进行页面跳转
  12. 使用鼠标右击Gite Bash Here 将本地文件上传到 GitHub
  13. 快速导出股票日线数据
  14. 从DT时代云栖大会聊聊恒生电子
  15. iOS9 In-house 未受信任的企业级开发者
  16. matlab点类型,Matlab中的类(Class)
  17. 笔记本电脑总是锁定计算机呢,笔记本电脑键盘锁定了怎么办有什么方法解锁
  18. isNaN、Number.isNaN、isFinite、Number.isFinite
  19. 《C++Primer 第五版》——第八章 IO 库
  20. 一文读懂硬件开发EVT/DVT/PVT三大阶段

热门文章

  1. PingUtil in Android
  2. chrome ui源码剖析-Accelerator(快捷键)
  3. OD使用教程16 - 调试篇16
  4. Visual Studio中的Build和Rebuild区别
  5. 5个IO口扫描25个按键的解决方法(转帖)
  6. Android判断Service是否运行
  7. 手机html检测蓝牙打印机,打印机手机确认.html
  8. mysql基础小测试三_数据库---MySQL(三)
  9. 最长回文子串python_最长回文子串(Python)
  10. 47、Power Query-处理典型的中国式二维表格转一维