zoukankan      html  css  js  c++  java
  • 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来承载数据
    • 需要使用元组来处理数据的所有场景都可以
    *******请大家尊重原创,如要转载,请注明出处: 转载自:https://www.cnblogs.com/keyou1/,谢谢!!*******
    *******有任何疑问,欢迎加入软件测试交流群:699968364(加群时,请备注:博客园-可优)。博主QQ:3429173264*******
  • 相关阅读:
    flask与Django的区别
    flask特殊装饰器
    flaskjinjia2模板
    flask类视图
    flask路由系统
    flask初识
    python2与python3 的安装与环境变量的添加
    WebGL_0007:强制横屏的参考
    NodeJS_0011:nodejs重定向到一个链接或本地的页面的方法
    NodeJS_0006:nodejs响应超时处理
  • 原文地址:https://www.cnblogs.com/keyou1/p/10844042.html
Copyright © 2011-2022 走看看