人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動(dòng)態(tài)

python教程命名元組示例分析

發(fā)布日期:2021-12-30 07:08 | 文章來(lái)源:腳本之家

實(shí)際上 collections.namedtuple() 是一個(gè)工廠方法,它返回的是python中標(biāo)準(zhǔn)元組類型的子類。我們提供給它一個(gè)類型名稱以及相應(yīng)的字段,它就返回一個(gè)可實(shí)例化的類為你已經(jīng)定義好的字段傳入值等。

from collections import namedtuple
Subscriber = 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的實(shí)例看起來(lái)像一個(gè)普通的類實(shí)例,但它的實(shí)例與普通的元組是可互換的,而且支持所有普通元組所支持的操作。例如:索引和分解

print(len(sub))
# 2
addr, joined = sub
print(addr)
# 'jonesy@example.com' 
print(joined)
# '2012-10-19'

命名元組的主要作用在于將代碼同它所控制的元素位置間解耦。所以,如果從數(shù)據(jù)庫(kù)調(diào)用中得到一個(gè)大型的元組列表,而且通過(guò)元素的位置來(lái)訪問(wèn)數(shù)據(jù),那么假如在表單中新增了一列數(shù)據(jù),那么代碼就會(huì)崩潰。但如果首先將返回的元組轉(zhuǎn)型為命名元組,就不會(huì)出現(xiàn)問(wèn)題。

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
  # 若此處為 total += s[1] * s.[2] 則數(shù)據(jù)一變,代碼也不對(duì)
 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 "<stdin>", line 1, in <module>
# AttributeError: can't set attribute

如果需要修改任何屬性,可以通過(guò)使用 namedtuple 實(shí)例的 _replace() 方法來(lái)實(shí)現(xiàn),該方法創(chuàng)建了一個(gè)全新的命名元組,并對(duì)相應(yīng)的值做替換。

s = s._replace(share=75)
print(s)
# Stock(name='ACME', share=75, price=123.45)

_replace() 方法有一個(gè)微妙的用途,那就是它可以作為一種簡(jiǎn)便的方法填充具有可選或缺失字段的命名元組。要做到這點(diǎn),首先創(chuàng)建一個(gè)包含默認(rèn)值的“原型”元組,然后使用 _replace() 方法創(chuàng)建一個(gè)新的實(shí)例,把相應(yīng)的值替換掉

from collection import namedtuple
Stock = namedtuple('Stock', ['name', 'share', 'price', 'data', 'time'])
# Create a prototype instance
stock_prototype = Stock('', 0, 0.0, None, NOne) 
# Function to convert a dictionary to a Stock
def dict_to_stock(s):
 return stock_prototype.replace(**s)

讓我們來(lái)演示一下上面的代碼是如何工作的:

>>> 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)

如果我們的目標(biāo)是定義一個(gè)高效的數(shù)據(jù)結(jié)構(gòu),而且將來(lái)會(huì)修改各種實(shí)例屬性,那么使用 namedtuple 并不是最佳選擇

以上就是python教程命名元組示例分析的詳細(xì)內(nèi)容,更多關(guān)于python命名元組的資料請(qǐng)關(guān)注本站其它相關(guān)文章!

版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開(kāi)通

自選配置、實(shí)時(shí)開(kāi)通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問(wèn)服務(wù)

1對(duì)1客戶咨詢顧問(wèn)

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部