Python自动化 Python 中比元组更好用的 namedtuple

kouyou · 2019年05月07日 · 最后由 huangchen1019 回复于 2020年04月12日 · 527 次阅读

一、思考

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来承载数据
  • 需要使用元组来处理数据的所有场景都可以
共收到 103 条回复

keyou大佬棒棒哒!

可优大佬最棒!我的作业完成了!赞也点过了!(此条5毛,括号内删除)

3楼 已删除
4楼 已删除

优秀哦,乡亲们!!!

村长666,这是自动化评论

没有灵魂的机器人说:可优真帅!

来交作业了~~~~

狮虎猎物获威名,可怜麋鹿有谁怜?

世间从来强食弱,纵使有理也枉然。

可优大佬讲的东西很有价值!点个赞!

挟飞仙以遨游,抱明月而长终。

厉害了

拔草来了

老师授业解惑,醍醐灌顶

一朵梨花压海棠,玉树临风胜潘安

赞!@@@

可优大佬棒棒的!

可优村长老厉害了!!!!!!!,(作业自动化调试)48376

keyou is a smart man!

keyou is a smart man!!99

可优大佬棒棒的!20190815184756

可优大佬棒棒的!20190815185035

可优大佬bang bang bang!!!

20190815230352:可优大佬,喜欢你课上的图片,既励志又不鸡汤

20190815231822:可优大佬,不上测开还能问问题?

20190815232234:每一发奋努力的背后,必有加倍的赏赐。

20190815232525:可优大佬的课讲的既生动又好听

20190815233411:可优大佬,你走了,没人督促拔草了,田里长满了草

20190815233818:老铁,来深圳呀,哈哈!

20190815234305:可优大佬,还是想说,教完自动化再2撤呀

20190815234706:老铁,记得看望乡亲们呀

20190815235111:可优大佬的课讲的既生动又好听

20190816001626:可优大佬,python自动化测试坑好多,如何避免踩坑?

20190816004830:可优大佬,喜欢你课上的图片,既励志又不鸡汤

文章通俗易懂,内容很有用

可优大佬棒棒哒

干货满满

可优大佬课讲得很棒,再多多练习英文发音就更完美啦!!78

写的真好!

受益匪浅

厉害厉害

可优大佬棒棒的,大赞赞

受益匪浅very good

46楼 已删除

keyou is a smart man!!27

村长,干货满满!+29648赞!

keyou is a smart man!!62

keyou is a smart man!!32

可优老师明明可以靠才华,偏偏要靠颜值

2019-08-18 01:02:37可优老师明明可以靠才华,偏偏要靠颜值

老徐拜读Python 中比元组更好用的 namedtuple

老徐2019-08-18 19:50:21拜读:Python 中比元组更好用的 namedtuple

老徐2019-08-18 19:55:32拜读:Python 中比元组更好用的 namedtuple

可优男神,真厉害啊!什么都会

可优老师,棒棒哒!都是干货!

2019-08-19 17:17:06可优老师明明可以靠才华,偏偏要靠颜值

可有村长起来除草啦

可有村长起来除草啦,内容还不能重复撒!

可优大佬的声音还有磁性。。。20190820003934like.png

20190820011501:老铁,来深圳呀,哈哈!

可优大佬写得真棒!赞赞赞!!!

大佬666_20190820105238

老师授业解惑,学生醍醐灌顶

可优大佬宇宙第一帅!!

可优大佬棒棒哒!! 浅显易懂,受教啦!!

可优男神~~ 浅显易懂,受教啦!!好好学习学习!!

给可优大佬点赞!!_2019-08-20 19:53:23.277300

可优真棒

可优大佬讲课棒棒哒!

大佬棒棒的!20190822223430

可优大佬棒棒的!20190822224432

可优大佬,可优大佬!

2019-08-24 14:25:32可优老师明明可以靠才华,偏偏要靠颜值

可优大佬厉害了,666

干货满满,收益匪浅!2019-08-25 22:33:10

干货满满,收益匪浅!2019-08-25 23:05:31

生活因你而火热

大王叫我来巡山!!我到这儿转一转!!!

大王叫我来巡山!!!我到这儿转一转!!!

点赞可优大佬!666

赞,通俗易懂,已收藏

keyou大佬威武霸气!

2019-08-27 18:13:21可优老师我比你帅多了

受益匪浅

2019-09-09 12:14:39可优老师明明可以靠才华,偏偏要靠颜值

20190920235602:每一发奋努力的背后,必有加倍的赏赐。

20190921122812:可优大佬,你走了,没人督促拔草了,田里长满了草

20190921172016:可优大佬,不上测开还能问问题?

20190921174348:最喜欢上可优大佬的课

可优老师是集颜值与才华于一身的大佬

可优大佬明明可以靠颜值挣钱,非要靠实力

可优大佬在课间休息时间最爱播放的歌曲是:Adele唱的,我也爱听

可优大佬讲课诙谐幽默,易于理解

可优老师得帖子很有价值!!都是干货!!

干货!!真棒。

喜欢可优老师讲课,喜欢看可优老师的帖子。

666文章浅显易懂,手动点赞

满满干货,好好学习!!!

满满干货,好好学习,天天向上!!!

手动点赞!!

手动给可优老师点赞!

这是自动化执行发布的评论!2020_04_12_15_35_04

这是自动化执行发布的评论!2020_04_12_15_37_35

这是自动化执行发布的评论!2020_04_12_15_39_28

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册