Python中比元组更好用的namedtuple
一、思考

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的更多相关文章
- python中的元组
在python中,元组是不可变类型 可通过以下案例说明: >>> c1 = ['1','2'] >>> c = (1,2,c1) >>> c (1 ...
- 6、python中的元组
元组(tuple)是python中有序.不可变的数据结构.元组还是python四种数据结构中唯一一种不可变的数据结构. 一.前言 元组在很多方面都变现得跟列表一样,除了列表储存得对象是可变得,而元组储 ...
- 11.python中的元组
在学习什么是元组之前,我们先来看看如何创建一个元组对象: a = ('abc',123) b = tuple(('def',456)) print a print b
- python学习之【第五篇】:Python中的元组及其所具有的方法
1.前言 Python的元组(tuple)与列表很相似,不同之处在于元组不能被修改,即元组一旦创建,就不能向元组中的增加新元素,不能删除元素中的元素,更不能修改元组中元素.但是元组可以访问任意元素,可 ...
- python中关于元组的操作
元组的基本操作:1.创建一个元组: tuple=(1,26); tuple1=(","sy"); 创建一个空元组: tuple=(); 元组中只包含一个元素时,需要在元素 ...
- python中列表 元组 字典 集合的区别
列表 元组 字典 集合的区别是python面试中最常见的一个问题.这个问题虽然很基础,但确实能反映出面试者的基础水平. (1)列表 什么是列表呢?我觉得列表就是我们日常生活中经常见到的清单.比如,统计 ...
- **python中列表 元组 字典 集合
列表 元组 字典 集合的区别是python面试中最常见的一个问题.这个问题虽然很基础,但确实能反映出面试者的基础水平. 1.列表 列表是以方括号“[]”包围的数据集合,不同成员以“,”分隔. 列表的特 ...
- python 中列表 元组 字典 集合的区别
先看图片解释 (1)列表 什么是列表呢?我觉得列表就是我们日常生活中经常见到的清单.比如,统计过去一周我们买过的东西,把这些东西列出来,就是清单.由于我们买一种东西可能不止一次,所以清单中是允许有重复 ...
- python中一些元组知识
元组 Python 的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号 ( ),列表使用方括号 [ ]. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. 实例(Pytho ...
随机推荐
- LuoguP2115 [USACO14MAR]破坏Sabotage【二分答案】By cellur925
本来是想找一道生成树的题做的...结果被洛咕的标签骗到了这题...结果是二分答案与生成树一点mao关系都没有.... 题目大意:给你一个序列,请你删去某一个$l~r$区间的值($2<=i< ...
- iOS 设置UITextView的Placeholder
代码如下: - (void)setupTextView { UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(0, ...
- Centos6.8 搭建 Mysql 主从复制
实例环境: MySQL-Master:Centos-6.8:192.168.153.130 MySQL-Slave:Centos-6.8:192.168.153.131 1.两台服务器安装mysql ...
- SpringBoot | contrller的使用
@Controller 处理http请求 @RestController Spring4之后新加的注解,原来返回json需要@ResponseBody配合@Controller @RequestMap ...
- 洛谷 P3327 [SDOI2015]约数个数和 || Number Challenge Codeforces - 235E
https://www.luogu.org/problemnew/show/P3327 不会做. 去搜题解...为什么题解都用了一个奇怪的公式?太奇怪了啊... 公式是这样的: $d(xy)=\sum ...
- set有关的函数的用法(The SetStack Computer UVA - 12096)
#include<bits/stdc++.h> using namespace std; typedef set<int> Set; map<Set,int> ID ...
- Lucas+中国剩余定理 HDOJ 5446 Unknown Treasure
题目传送门 题意:很裸,就是求C (n, m) % (p1 * p2 * p3 * .... * pk) 分析:首先n,m<= 1e18, 要用到Lucas定理求大组合数取模,当然p[]的乘积& ...
- 题解报告:NYOJ #78 圈水池(打印凸包顶点)
描述: 有一个牧场,牧场上有很多个供水装置,现在牧场的主人想要用篱笆把这些供水装置圈起来,以防止不是自己的牲畜来喝水,各个水池都标有各自的坐标,现在要你写一个程序利用最短的篱笆将这些供水装置圈起来!( ...
- JAVA常用设计模式(静态化调用和实例化调用的区别,编辑可见 )
用newInstance()与用new是区别的,区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类,且newInstance()只能调用无参构造函数. 最大的区别在于内存.静态方法 ...
- c#学习系列之装箱拆箱
1. 装箱和拆箱是一个抽象的概念 2. 装箱是将值类型转换为引用类型 :拆箱是将引用类型转换为值类型 利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的 ...