python教程命名元组示例分析
目录
from collections import namedtupleSubscriber = namedtuble('Subscriber', ['addr', 'joined'])sub = Subscriber('jonesy@example.com', '2012-10-19')print(sub)# Subscriber(addr='jonesy@example.com', joined='2012-10-19') print(sub.addr)# 'jonesy@example.com'print(sub.joined)# '2012-10-19'
尽管namedtuple的实例看起来像一个普通的类实例,但它的实例与普通的元组是可互换的,而且支持所有普通元组所支持的操作。例如:索引和分解
print(len(sub))# 2addr, joined = subprint(addr)# 'jonesy@example.com' print(joined)# '2012-10-19'
【python教程命名元组示例分析】命名元组的主要作用在于将代码同它所控制的元素位置间解耦。所以,如果从数据库调用中得到一个大型的元组列表,而且通过元素的位置来访问数据,那么假如在表单中新增了一列数据,那么代码就会崩溃。但如果首先将返回的元组转型为命名元组,就不会出现问题。
from collections import namedtuple Stock = namedtuple('Stock', ['name', 'shares', 'price'])def compute_cost(records):total = 0.0for rec in records:s = Stock(*rec)total += s.shares * s.price# 若此处为 total += s[1] * s.[2] 则数据一变,代码也不对return total
注意:namedtuple 是不可变的 (immutable)
s = Stock('ACEM', 100, 123.45)print(s)# Stock(name='ACME', share=100, price=123.45)s.share = 75# Traceback (most recent call last):# File "", line 1, in# AttributeError: can't set attribute
如果需要修改任何属性,可以通过使用 namedtuple 实例的 _replace() 方法来实现,该方法创建了一个全新的命名元组,并对相应的值做替换。
s = s._replace(share=75)print(s)# Stock(name='ACME', share=75, price=123.45)
_replace() 方法有一个微妙的用途,那就是它可以作为一种简便的方法填充具有可选或缺失字段的命名元组。要做到这点,首先创建一个包含默认值的“原型”元组,然后使用 _replace() 方法创建一个新的实例,把相应的值替换掉
from collection import namedtupleStock = namedtuple('Stock', ['name', 'share', 'price', 'data', 'time'])# Create a prototype instancestock_prototype = Stock('', 0, 0.0, None, NOne) # Function to convert a dictionary to a Stockdef dict_to_stock(s):return stock_prototype.replace(**s)
让我们来演示一下上面的代码是如何工作的:
>>> a = {'name': 'ACME', 'shares': 100, 'price': 123.45}>>> dict_to_stock(a)Stock(name='ACME', shares=100, price=123.45, date=None, time=None)>>> b = {'name': 'ACME', 'shares': 100, 'price': 123.45, 'date': '12/17/2012'}>>> dict_to_stock(b)Stock(name='ACME', shares=100, price=123.45, date='12/17/2012', time=None)
如果我们的目标是定义一个高效的数据结构,而且将来会修改各种实例属性,那么使用 namedtuple 并不是最佳选择
以上就是python教程命名元组示例分析的详细内容,更多关于python命名元组的资料请关注脚本之家其它相关文章!
推荐阅读
- 2.6|2.6 Photoshop操作步骤的撤消和重做 [Ps教程]
- python学习之|python学习之 实现QQ自动发送消息
- 逻辑回归的理解与python示例
- python自定义封装带颜色的logging模块
- 【Leetcode/Python】001-Two|【Leetcode/Python】001-Two Sum
- 漫画初学者如何学习漫画背景的透视画法(这篇教程请收藏好了!)
- Python基础|Python基础 - 练习1
- Python爬虫|Python爬虫 --- 1.4 正则表达式(re库)
- Python(pathlib模块)
- python青少年编程比赛_第十一届蓝桥杯大赛青少年创意编程组比赛细则