python具名元組(namedtuple)的具體使用
collections.namedtuple用于構(gòu)造帶字段名的元組。對應(yīng)類型為typing.NamedTuple(可用作超類)。
具名元組
namedtuple對象的定義:
collections.namedtuple(typename, field_names, verbose=False, rename=False, defaults=None, module=None):
- typename:元組名稱
- field_names:是字段序列(如,[‘x’, ‘y’]);
- rename:為true時,字段名無效時(如,重名或使用關(guān)鍵字)會被自動替換為位置名(如,_1);
- defaults:字段的默認(rèn)值,若為iterable對象,則依次對應(yīng)field_names中字段的缺省值;
from collections import namedtuple Color = namedtuple("Color", "r g b alpha") def convert_to_color(desc: str, alpha: float = 0.0): ? ? if desc == "green": ? ? ? ? return Color(r=50, g=205, b=50, alpha=alpha) ? ? elif desc == "blue": ? ? ? ? return Color(r=50, g=0, b=255, alpha=alpha) ? ? else: ? ? ? ? return Color(r=50, g=0, b=0, alpha=alpha)
從可迭代對象(Iterable)構(gòu)造具名元組:
c = Color._make([10, 20, 30, 0.1]) nc = Color._make((10, 20, 30, 0.1)) print("r:", c.r)
元組操作
具名元組修改:不能直接修改里面的值,可通過_replace構(gòu)造一個新的:
c = {"r": 50, "g": 205, "b": 50, "alpha": 0.5} nc = c._replace(r=100)
把字典轉(zhuǎn)換為具名元組:
c = {"r": 50, "g": 205, "b": 50, "alpha": 0.5} nc = Color(**c)
具名元組轉(zhuǎn)換為字典(通過_asdict方法):
c = Color(r=50, g=0, b=0, alpha=0.5) d = c._asdict()
具名元組轉(zhuǎn)換為元組:
c = Color(r=50, g=0, b=0, alpha=0.5) t = tuple(c)
屬性
- 屬性_fields包含所有字段的元組:如('r', 'g', 'b', 'alpha');
- 屬性__annotations__包含字段與對應(yīng)類型的字典:如{'r': <class 'float'>, 'g': <class 'float'>, 'b': <class 'float'>, 'alpha': <class 'float'>};
- 屬性_field_defaults保證有初始值的字段與初始值的字典:如{'alpha': 0.0};
排序
具名元組排序:通過operator庫中的attrgetter可指定排序字段:
from operator import attrgetter colors = [ ? ? Color(r=50, g=205, b=50, alpha=0.1), ? ? Color(r=50, g=205, b=50, alpha=0.5), ? ? Color(r=50, g=0, b=0, alpha=0.3) ] out = sorted(colors, key=attrgetter("alpha")) print(out)
與字典比較
字典dict是一種非常通用的數(shù)據(jù)結(jié)構(gòu),很容易被濫用,同時相對namedtuple,有以下問題:
- 字典是不可散列,因此無法將其存儲在set或其他字典中;
- 字典是可變的,可以根據(jù)需要添加任意數(shù)量的新鍵;
與dict類似,在namedtuple中可以將值分配給單個變量并根據(jù)需要使用。但:
namedtuple是不可變的,不會意外添加新的值(鍵);
數(shù)據(jù)類
數(shù)據(jù)類詳情可參見《數(shù)據(jù)類(dataclass)簡介》。
dataclass修飾
python3.7中引入了數(shù)據(jù)類(Data Class),可看做是“具有默認(rèn)值的可變namedtuple”:
- 可方便地添加doc;
- 可定義可選字段;
from dataclasses import dataclass # frozen設(shè)為true后,字段內(nèi)容將不允許修改(與namedtuple完全類似) # 否則可修改字段;并可任意添加字段(如,c.n=1); @dataclass(frozen=True) class DColor: ? ? """A regular class that represents a color.""" ? ? r: float ? ? g: float ? ? b: float ? ? alpha: float = 0.0 # c = DColor(r=10, g=20, b=30) c = DColor(10, 20, 30)
繼承NamedTuple
通過繼承NamedTuple也可方便定義(同時可定義字段的初始值,有初始值的字段必須在無初始字段后面):
from typing import NamedTuple class NColor(NamedTuple): ? ? """A namedtuple that represents a color.""" ? ? r: float ? ? g: float ? ? b: float ? ? alpha: float = 0.0 nc = NColor(100, 110, 120) ? ?
到此這篇關(guān)于python具名元組(namedtuple)的具體使用的文章就介紹到這了,更多相關(guān)python具名元組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Python實(shí)現(xiàn)保存剪貼板中的圖像
這篇文章主要為大家詳細(xì)介紹了如何使用Python創(chuàng)建一個簡單的GUI應(yīng)用程序,實(shí)現(xiàn)保存剪貼板中的圖像功能,文中的示例代碼講解詳細(xì),需要的可以參考下2023-09-09Python MySQLdb 執(zhí)行sql語句時的參數(shù)傳遞方式
這篇文章主要介紹了Python MySQLdb 執(zhí)行sql語句時的參數(shù)傳遞方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03詳解Python中位運(yùn)算的簡單實(shí)現(xiàn)
位運(yùn)算就是直接對整數(shù)在內(nèi)存中對應(yīng)的二進(jìn)制位進(jìn)行操作,一般是將數(shù)字化為二進(jìn)制數(shù)后進(jìn)行操作。本文將利用Python語言實(shí)現(xiàn)位運(yùn)算,感興趣的可以了解一下2022-06-06Python+OpenCV繪制多instance的Mask圖像
Mask圖像中,不同值表示不同的實(shí)例(instance)。本文將詳細(xì)為大家講講如何利用OpenCV繪制多instance的Mask圖像,感興趣的可以學(xué)習(xí)一下2022-06-06Python結(jié)合百度語音識別實(shí)現(xiàn)實(shí)時翻譯軟件的實(shí)現(xiàn)
這篇文章主要介紹了Python結(jié)合百度語音識別實(shí)現(xiàn)實(shí)時翻譯軟件的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Python算法的時間復(fù)雜度和空間復(fù)雜度(實(shí)例解析)
算法復(fù)雜度分為時間復(fù)雜度和空間復(fù)雜度,簡單而講時間復(fù)雜度指的是語句執(zhí)行次數(shù),空間復(fù)雜度指的是算法所占的存儲空間,本文通過代碼給大家介紹Python算法的時間復(fù)雜度和空間復(fù)雜度問題,感興趣的朋友一起看看吧2019-11-11Python tkinter的grid布局及Text動態(tài)顯示方法
今天小編就為大家分享一篇Python tkinter的grid布局及Text動態(tài)顯示方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10基于循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的古詩生成器
這篇文章主要為大家詳細(xì)介紹了基于循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的古詩生成器,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-03-03