首页 > 编程语言 >python高级用法之命名元组namedtuple

python高级用法之命名元组namedtuple

时间:2023-03-20 11:00:48浏览次数:47  
标签:namedtuple name user1 python 13578451256 元组 user

1.tuple类型数据的获取

大家都知道,元组里面的数据获取只能通过下标的方式去获取,比如 :a = ('username', 'age', 'phone'),要获取username的话 ,就需要用a[0]的方式去获取,当元组中数据比较多的时候,用下标的方式获取数据就容易写错索引值。在这些场景下,用tuple存储数据就没那么方便,就会采用其他的方式去存储数据。

今天在学习的时候了解到了namedtuple 这么一种新的数据存储格式。

2.namedtuple 介绍

namedtuple()是产生具有命名字段的元组的工厂函数,namedtuple 比普通tuple具有更好的可读性,可以使代码更易于维护。同时与字典相比,又更加的轻量和高效。

namedtuple还有一个非常好的一点是,它与tuple是完全兼容的。也就是说,我们依然可以用索引去访问一个namedtuple。

namedtuple()调用方式如下:

from collections import namedtuple
namedtuple(typename, field_names, *, verbose=False, rename=False, module=None)

返回一个新类,名为typename,它是元组tuple的子类。它的特性与tuple类似,是可索引可迭代的。

field_names的格式通常为字符串序列,如['name', 'age', 'phone', 'email'],也可以是一个单一的字符串,每个字段以逗号分隔。

如果rename=True,无效的字段名将被自动更换为位置名称,如下所示:

['abc', 'def', 'ghi', 'abc']中无效的字段名为关键字'def'与重复字段名'abc',均视为无效,所以将自动更换为如下形式:['abc', '_1', 'ghi', '_3']。

 

下面演示namedtuple的具体用法:

from collections import namedtuple

userinfo = namedtuple('user_obj', ['name', 'age', 'phone', 'email'])
user1 = userinfo('admin', '18', '13578451256', '[email protected]')

print(type(user1), user1)
print(user1.name)
print(user1.age)

输出:

<class '__main__.user_obj'> user_obj(name='admin', age='18', phone='13578451256', email='[email protected]')

admin

18

从以上演示的代码中可以发现,要获取某个值非常的方便。

演示rename的效果:​​​​​​​

from collections import namedtuple

b = namedtuple('user_obj1', ['name', 'def'], rename=True)
b1 = b('libo' ,'12')

print(b1)

输出:

user_obj1(name='libo', _1='12')

 

3.namedtuple使用场景

以前封装接口测试框架的时候,测试用例是写在excel里面的,读取到的每一行数据都是一个列表,获取元素的时候通过索引去获取的话,如果万一哪一天用例模板要加一列或者减一列,就有可能要改脚本,因为,之前的想法是,读取excel的每一行内容转成dict进行存储,用excel表头的内容当做dict的key,这样读取数据处理起来就非常麻烦:

现在,学了namedtuple之后,那么读取excel存储的格式就可以改为namedtuple进行存储,后面取数还是按照类似dict的方式去进行提取,方便多了,代码也比较优雅。这里暂时不演示改之前读excel的脚本了,等后面重新设计框架的时候可以考虑用namedtuple。

4.谈一下我对namedtuple的认知

感觉namedtuple跟java编程里面的javabean实体类比较相似,定义了一个class,以及class下的一些属性值,每创建一条namedtuple的数据都是生成了对应class的一个实例对象,最终把这些对象存到list里面就是对象的集合。​​​​​​​

from collections import namedtuple

#就好比有一个user_obj对象,里面有4个属性
userinfo = namedtuple('user_obj', ['name', 'age', 'phone', 'email'])  

# 分别创建3个对象
user1 = userinfo('admin', '18', '13578451256', '[email protected]')
user2 = userinfo('demo', '19', '13512345678', '[email protected]')
user3 = userinfo('user03', '35', '13875456545', '[email protected]')

user_list = [user1, user2, user3]

for i in user_list:
    print(i.name)

 

标签:namedtuple,name,user1,python,13578451256,元组,user
From: https://www.cnblogs.com/yeyuzhuanjia/p/17235562.html

相关文章

  • 接口测试——python接口开发(二)
    1.python接口开发框架Flask简介与安装Flask接口测试框架的简介与安装Flask是轻量级的web开发框架相比于其他框架,Flask更自由,灵活相比于其他框架,Flask更容易上手Fl......
  • 【全民Python】 Python3的Scoket服务器客户端
      一.客户端'''@File:4网络编程Socket客户端.py@Time:2023/03/1509:54:17@Author:幻世界'''#coding:utf-8fromsocketimport*print("============......
  • apple M1 python开发,django,安装mysqlclient并使用
    前言此笔记记录了MBPM1芯片的苹果本,解决mysqlclient虽然安装成功,但是会遇到_namenotdefound的解决办法解决过程内容参考:https://github.com/PyMySQL/mysqlclient/iss......
  • python实现一个遗传算法
    ###################  importrandom#染色体长度CHROMO_LENGTH=20#种群大小POP_SIZE=50#交叉概率CROSS_RATE=0.8#变异概率MUTATE_RATE=0.01#......
  • Python 多进程、多线程对比(转载)
    https://www.runoob.com/w3cnote/python-single-thread-multi-thread-and-multi-process.html具体实验见原文,这里只是引用实验结果,方便查询......
  • 记一次,使用python实现一键在爱发电发布带图片的动态
    1、背景本人喜欢转载一些youtube上的视频到b站上面,然后就会有些观众想要视频的封面,那我总不可能一个一个发吧,太麻烦了。故打算将资源发布到爱发电上面。但是爱发电却没有......
  • 随机森林python代码
    载入数据importpandasaspd#Loaddatamelbourne_file_path='../input/melbourne-housing-snapshot/melb_data.csv'melbourne_data=pd.read_csv(melbourne_file......
  • biopython Sequence相关
    参考:http://biopython.org/DIST/docs/tutorial/Tutorial.html1.构建Seq()对象fromBio.SeqimportSeqmyseq=Seq("AGTACACTCA")print(myseq)#AGTACACTCAprint(typ......
  • Python之json模块
    1.python的json模块介绍Python的json模块提供了处理JSON数据的功能。JSON(JavaScriptObjectNotation)是一种轻量级的文本数据格式,使用类似于JavaScript对象的方式......
  • Python之random模块
    1.python的random模块介绍Python的random模块是用于生成随机数的标准库,支持生成伪随机数、shuffle操作和随机选择操作等。下面是random模块的方法分类介绍2.生成随机数......