首頁  >  文章  >  後端開發  >  python具名元組如何使用

python具名元組如何使用

王林
王林轉載
2023-05-02 23:13:051487瀏覽

collections.namedtuple用來建構帶有字段名的元組。對應類型為typing.NamedTuple(可用作超類別)。

具名元組

namedtuple物件的定義:

collections.namedtuple(typename, field_names, verbose=False, rename=False, defaults=None, module=None) :

  • typename:元組名稱

  • field_names:是欄位序列(如,[‘x’, ‘y’]) ;

  • rename:當true時,當欄位名稱無效時(如,重新名稱或使用關鍵字)會被自動替換為位置名稱(如,_1);

  • defaults:字段的預設值,若為iterable對象,則依序對應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 )建構具名元組:

c = Color._make([10, 20, 30, 0.1])
nc = Color._make((10, 20, 30, 0.1))

print("r:", c.r)

元組操作

具名元組修改:不能直接修改裡面的值,可透過_replace建構一個新的:

c = {"r": 50, "g": 205, "b": 50, "alpha": 0.5}
nc = c._replace(r=100)

#把字典轉換為具名元組:

c = {"r": 50, "g": 205, "b": 50, "alpha": 0.5}
nc = Color(**c)

具名元組轉換為字典(透過_asdict方法):

c = Color(r=50, g=0, b=0, alpha=0.5)
d = c._asdict()

具名元組轉換為元組:

c = Color(r=50, g=0, b=0, alpha=0.5)
t = tuple(c)

屬性

  • 屬性_fields包含所有欄位的元組:如('r', 'g', 'b', 'alpha');

  • 屬性__annotations__包含欄位與對應類型的字典:如{'r': e13446bebb88208a1ed1b67eb6c71d15, 'g': e13446bebb88208a1ed1b67eb6c71d15, 'b': 15fe1a1f411018ce39706d720ae2d2a8, 'alpha': e13446bebb88208a1ed1b67eb6c71d15};

  • 屬性_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是一種非常通用的資料結構,很容易被濫用,同時相對namedtuple,有以下問題:

  • ##字典是不可散列,因此無法將其儲存在set或其他字典中;

  • 字典是可變的,可以根據需要添加任意數量的新鍵;

  • #與dict類似,在namedtuple中可以將值指派給單一變數並根據需要使用。但:

    namedtuple是不可變的,不會意外新增新的值(鍵);
資料類別

資料類詳情可參考《資料類別(dataclass)簡介》。

dataclass修飾######python3.7中引入了資料類別(Data Class),可看做是「具有預設值的可變namedtuple」:######### ###可方便地新增doc;############可定義可選欄位;##########
from dataclasses import dataclass

# frozen设为true后,字段内容将不允许修改(与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)

以上是python具名元組如何使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除