美文网首页
python 学习笔记:将名称映射到序列中

python 学习笔记:将名称映射到序列中

作者: 潼潼夏 | 来源:发表于2020-02-15 15:44 被阅读0次

    问题

    通过名称来访问元素,减少结构中对位置的依赖性

    解决方案

    collections.namedtuple()——命名元组,只增加了极小的开销。
    collections.namedtuple()是一个工厂方法,它返回的是python中标准元组类型的子类。我们提供给它一个类型名称以及相应的字段,它就返回一个可实例的类、已经定义好的字段传入值。

    示例1:

    from collections import namedtuple
    
    Subsrceber = namedtuple('Subsrceber',['addr','joined'])
    sub = Subsrceber('a@exame.com','2012-3-10')
    print sub
    #sub=Subsrceber(addr='a@exame.com', joined='2012-3-10')
    print sub.addr
    #sub.addr = a@exame.com
    print sub.joined
    #$sub.joined=2012-3-10
    

    namedtuple的实例与普通元组是可互换的,而且支持所有普通元组所支持的操作,例如索引(indexing)和分解(unpacking);

    示例2:

    print len(sub)
    #len(sub)=2
    addr,joined = sub
    print addr
    #addr=a@exame.com
    print joined
    #joined=2012-3-10
    

    命名元组的主要作用在于将代码同它所控制的元素位置间解耦。所以,如果从数据库调用中得到一个大型的元组列表,而且通过元素的位置来访问数据,那么假如在表单中新增一类数据,那么代码就会崩溃。但如果首先将返回的元组转型为命名元组,就不会出现问题。

    namedtuple的一种可能用法是作为字典的替代,后者需要更多的空间来存储。因此,如果要构建涉及字典的大型数据结构,使用namedtuple会更加高效。注意:namedtuple是不可变的。
    示例2:

    Stock = namedtuple('Stock',['name','share','price'])
    s=Stock('Acme',100,123)
    print s
    #Stock(name='Acme', share=100, price=123)
    s.price=11
    #AttributeError: can't set attribute
    

    需要更改属性,使用namedtuple示例提供的_replace()方法来实现。该方法会创建一个全新的命名元组,并对相应的值做替换。
    示例3:

    s = s._replace(share=44)
    print s
    #Stock(name='Acme', share=44, price=123)
    

    最后,如果要定义一个高效的数据结构,而且将来会修改各种实例属性,那么使用namedtuple并不是最佳选择,可以考虑定义一个使用slots属性的类。

    相关文章

      网友评论

          本文标题:python 学习笔记:将名称映射到序列中

          本文链接:https://www.haomeiwen.com/subject/cetyfhtx.html