Python如何将名称映射到序列的元素中(代码)

如果下载的源码需要作者授权,请更换源码。本站免费分享资源不会增加授权

本篇文章给大家带来的内容是关于Python如何将名称映射到序列的元素中(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

1、需求

我们的代码是通过位置(即索引或下标)来访问列表会元组的,但有时候这会让代码变得有些难以阅读。我们希望可以通过名称来访问元素,以此减少结构中对位置的依赖性。

2、解决方案

相比普通的元组,collections.namedtuple()(命名元组)只增加了极少的开销就提供了这些便利。实际上collections.namedtuple()是一个工厂方法,它返回的是Python中标准元组类型的子类。我们提供给它一个类型名称以及相应的字段,它就返回一个可实例化的类、为你已经定义好的字段传入值等。

from collections import namedtuple Subscriber=namedtuple('Subsciber',['addr','joined']) sub=Subscriber("1782980833@qq.com","2018-10-23") print(sub) print(sub.addr) print(sub.joined) print(len(sub)) addr,joined=sub print(addr) print(joined) #下面错误,以为你namedtuple是不可变的 #sub.joined="2019"

结果:

Subsciber(addr='1782980833@qq.com', joined='2018-10-23') 1782980833@qq.com 2018-10-23 2 1782980833@qq.com 2018-10-23

尽管namedtuple的实例看起来就像一个普通的类实例,但它的实例与普通的元组是可互换的,而且支持所有普通元组所支持的操作。

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

为了说明这个问题,下面有一些使用普通元组的代码:

def compute_cost(records):     total=0.0     for rec in records:         total+=rec[1]*rec[2]     return total

通过位置来引用元素常常使得代码的表达力不够强,而且也很依赖于记录的具体结构。

下面是使用命名元组的版本:

from collections import namedtuple Stock=namedtuple('Stock',['name','shares','price']) def compute_cost(records):     total=0.0     for rec in records:         s=Stock(*rec)         total+=s.shares*s.price     return total

3、分析

namedtuple的一种可能用法是作为字典的替代,后者需要更多的空间来存储。因此,如果要构建设计字典的大型数据,使用namedtuple会更加高效,但是请注意,与字典不同的是,namedtuple是不可变的。

如果需要修改任何属性,可以通过使用namedtuple实例_replace()方法来实现。该方法会创建一个全新的命名元组,并对相应的值做替换。

from collections import namedtuple Subscriber=namedtuple('Subsciber',['addr','joined']) sub=Subscriber("1782980833@qq.com","2018-10-23")  print(sub)  sub=sub._replace(joined="2018-10-24") print(sub)

结果:

Subsciber(addr='1782980833@qq.com', joined='2018-10-23') Subsciber(addr='1782980833@qq.com', joined='2018-10-24')

_replace()方法有一个微妙的用途,那就是它可以作为一种简单的方法填充具有可选或缺失字段的命名元组。要做到这点,首先创建一个包含默认值得原型数组,然后使用_replace()方法创建一个新的实例,把相应的值替换掉。

from collections import namedtuple Subscriber=namedtuple('Subsciber',['addr','joined','age']) sub=Subscriber("",None,0)  def dict_to_stock(s):     return sub._replace(**s)  a={"addr":"111111@qq.com","joined":"1111-11-11","age":11} a=dict_to_stock(a) print(a)  b={"addr":"111111@qq.com","joined":"1111-11-11"} b=dict_to_stock(b) print(b)

结果:

Subsciber(addr='111111@qq.com', joined='1111-11-11', age=11) Subsciber(addr='111111@qq.com', joined='1111-11-11', age=0)

最后,也是相当重要的是,应该要注意如果我们的目标是定义一个高效的数据结构,而且将来会修改各种实例属性,那么使用namedtuple并不是最佳选择,相反,可以考虑顶一个使用了__slots__属性的类。

本文由(壳先生)整理自网络,如转载请注明出处:https://www.mrshell.com;
本站发布的内容若侵犯到您的权益,请邮件联系 i@mrshell.com 删除,我们将及时处理!
===========================================================================

1. 本站大部分下载资源收集于网络,不保证其完整性以及安全性,请下载后自行测试。
2. 本站资源仅供学习和交流使用,版权归资源原作者所有,请在下载后24小时之内自觉删除。
3. 不得使用于非法商业用途,商用请支持正版!不得违反国家法律,否则后果自负!
4. 若作商业用途,请购买正版,由于未及时购买和付费发生的侵权行为,与本站无关。
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!

=================================================================

壳先生 » Python如何将名称映射到序列的元素中(代码)

发表评论

提供最优质的资源集合

立即查看 了解详情