Krotki nazwane są w zasadzie łatwymi do utworzenia, lekkimi typami obiektów. Do nazwanych instancji krotek można odwoływać się za pomocą obiektowego dereferencji zmiennych lub standardowej składni krotek. Można ich używać podobnie struct
lub innych popularnych typów rekordów, z tym wyjątkiem, że są one niezmienne. Zostały dodane w Python 2.6 i Python 3.0, chociaż istnieje przepis na implementację w Python 2.4 .
Na przykład często reprezentuje się punkt jako krotkę (x, y)
. Prowadzi to do następującego kodu:
pt1 = (1.0, 5.0)
pt2 = (2.5, 1.5)
from math import sqrt
line_length = sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2)
Używanie nazwanej krotki staje się bardziej czytelne:
from collections import namedtuple
Point = namedtuple('Point', 'x y')
pt1 = Point(1.0, 5.0)
pt2 = Point(2.5, 1.5)
from math import sqrt
line_length = sqrt((pt1.x-pt2.x)**2 + (pt1.y-pt2.y)**2)
Jednak nazwane krotki są nadal kompatybilne wstecz z normalnymi krotkami, więc następujące działania nadal będą działać:
Point = namedtuple('Point', 'x y')
pt1 = Point(1.0, 5.0)
pt2 = Point(2.5, 1.5)
from math import sqrt
# use index referencing
line_length = sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2)
# use tuple unpacking
x1, y1 = pt1
Dlatego powinieneś używać krotek nazwanych zamiast krotek wszędzie tam, gdzie według ciebie notacja obiektowa sprawi, że Twój kod będzie bardziej pythonowy i łatwiejszy do odczytania . Osobiście zacząłem je wykorzystywać do reprezentowania bardzo prostych typów wartości, szczególnie gdy przekazuję je jako parametry funkcji. Sprawia, że funkcje są bardziej czytelne, bez dostrzegania kontekstu pakowania krotek.
Ponadto można również zastąpić zwykłe niezmienne klasy, które nie mają żadnych funkcji , a jedynie pola z nimi. Możesz nawet użyć nazwanych typów krotek jako klas podstawowych:
class Point(namedtuple('Point', 'x y')):
[...]
Jednak, podobnie jak w przypadku krotek, atrybuty w krotkach nazwanych są niezmienne:
>>> Point = namedtuple('Point', 'x y')
>>> pt1 = Point(1.0, 5.0)
>>> pt1.x = 2.0
AttributeError: can't set attribute
Jeśli chcesz mieć możliwość zmiany wartości, potrzebujesz innego typu. Istnieje przydatny przepis na modyfikowalne typy rekordów, które pozwalają ustawić nowe wartości atrybutów.
>>> from rcdtype import *
>>> Point = recordtype('Point', 'x y')
>>> pt1 = Point(1.0, 5.0)
>>> pt1 = Point(1.0, 5.0)
>>> pt1.x = 2.0
>>> print(pt1[0])
2.0
Nie znam jednak żadnej formy „nazwanej listy”, która pozwala dodawać nowe pola. W takiej sytuacji możesz po prostu użyć słownika. Krotki nazwane można konwertować na słowniki, za pomocą pt1._asdict()
których zwraca się, {'x': 1.0, 'y': 5.0}
i można nimi operować za pomocą wszystkich zwykłych funkcji słownika.
Jak już wspomniano, należy sprawdzić dokumentację, aby uzyskać więcej informacji, na podstawie których skonstruowano te przykłady.
__slots__
typing.NamedTuple
opcja, która pozwala na podpowiedzi do typów i jest szczególnie wygodna w przypadku podklas.namedtuple to fabryczna funkcja do tworzenia klasy krotek. Dzięki tej klasie możemy tworzyć krotki, które można wywoływać również z nazwy.
źródło
namedtuple is a factory function for making a tuple class.
to chyba jedyna poprawna odpowiedź tutaj: PKrotka o nazwie to krotka.
Robi wszystko, co może krotka.
Ale to coś więcej niż krotka.
Jest to specyficzna podklasa krotki, która jest programowo tworzona zgodnie ze specyfikacją, z nazwanymi polami i stałą długością.
To, na przykład, tworzy podklasę krotki, a poza tym, że ma stałą długość (w tym przypadku trzy), można jej używać wszędzie tam, gdzie krotka jest używana bez zerwania. Jest to znane jako substytucyjność Liskowa.
Nowość w Pythonie 3.6 , możemy użyć definicji klasy
typing.NamedTuple
do utworzenia parametru o nazwie:Powyższe jest takie samo, jak poniżej, z tym że powyższe dodatkowo zawiera adnotacje typu i dokumentację. Poniższe jest dostępne w Python 2+:
To tworzy instancję:
Możemy to sprawdzić i wykorzystać jego atrybuty:
Głębsze wyjaśnienie
Aby zrozumieć nazwane krotki, najpierw musisz wiedzieć, czym jest krotka. Krotka jest zasadniczo niezmienną (nie można jej zmienić w pamięci) listą.
Oto jak możesz użyć zwykłej krotki:
Możesz rozwinąć krotkę za pomocą iterowalnego rozpakowywania:
Krotki nazwane to krotki, które umożliwiają dostęp do ich elementów według nazwy zamiast po prostu indeksu!
Tworzysz nazwę o nazwie:
Możesz także użyć pojedynczego ciągu z nazwami oddzielonymi spacjami, nieco bardziej czytelne użycie interfejsu API:
Możesz zrobić wszystko, co mogą zrobić krotki (patrz wyżej), a także wykonać następujące czynności:
Komentator zapytał:
Typy, które tworzysz,
namedtuple
są w zasadzie klasami, które możesz tworzyć za pomocą prostego skrótu. Traktuj je jak zajęcia. Zdefiniuj je na poziomie modułu, aby marynarka i inni użytkownicy mogli je znaleźć.Przykład roboczy na poziomie globalnego modułu:
A to pokazuje brak wyszukiwania definicji:
Używaj ich, gdy poprawia kod, aby semantyka elementów krotkowych była wyrażona w kodzie.
Możesz użyć ich zamiast obiektu, jeśli w innym przypadku używałbyś obiektu z niezmiennymi atrybutami danych i bez funkcji.
Możesz także podzielić je na klasy, aby dodać funkcjonalność, na przykład :
Prawdopodobnie regresją byłoby przejście od używania krotek nazwanych do krotek. Początkowa decyzja projektowa skupia się na tym, czy koszt dodatkowego kodu jest wart poprawionej czytelności, gdy używana jest krotka.
Nie ma dodatkowej pamięci używanej przez krotki nazwane w porównaniu krotek.
Szukasz obiektu z wycięciem, który implementuje wszystkie funkcje listy o statycznym rozmiarze lub listy o podklasach, która działa jak nazwana krotka (i która w jakiś sposób blokuje zmianę wielkości listy).
Rozbudowany, a może nawet zastępujący Liskov, przykład pierwszego:
Aby użyć, wystarczy podklasę i zdefiniować
__slots__
:źródło
imienniki są świetną funkcją, są idealnym pojemnikiem na dane. Gdy trzeba „przechowywać” dane, należy użyć krotek lub słowników, takich jak:
lub:
Słownikowe podejście jest przytłaczające, ponieważ dyktowanie jest zmienne i wolniejsze niż krotki. Z drugiej strony krotki są niezmienne i lekkie, ale brak ich czytelności dla dużej liczby wpisów w polach danych.
imiona są idealnym kompromisem dla dwóch podejść, mają doskonałą czytelność, lekkość i niezmienność (a ponadto są polimorficzne!).
źródło
ntuple.foo
porównaniu zntuple[1]
tym drugim jest znacznie szybszy. Więcej na ten temat: stackoverflow.com/questions/2646157/...Krotki nazwane umożliwiają zgodność wsteczną z kodem, który sprawdza taką wersję
jednocześnie pozwalając, aby kod w przyszłości był bardziej jednoznaczny dzięki tej składni
źródło
namedtuple
jest jednym z najprostszych sposobów na oczyszczenie kodu i uczynienie go bardziej czytelnym. Dokumentuje sam, co dzieje się w krotce. Instancje nazwane są tak samo wydajne pod względem pamięci jak zwykłe krotki, ponieważ nie mają słowników dla poszczególnych wystąpień, co czyni je szybszymi niż słowniki.
Bez nazywania każdego elementu w krotce, brzmiałby on następująco:
O wiele trudniej jest zrozumieć, co się dzieje w pierwszym przykładzie. W nazwie nazwa, każde pole ma nazwę. I masz do niego dostęp według nazwy zamiast pozycji lub indeksu. Zamiast tego
p[1]
możemy nazwać to p.saturation. Łatwiej to zrozumieć. I wygląda na czystsze.Utworzenie instancji parametru namedtu jest łatwiejsze niż utworzenie słownika.
Kiedy możesz użyć namedtuple
p.hue
raczej niżp['hue']
.Składnia
['x', 'y', 'z']
lub w łańcuchux y z
(bez przecinków, tylko białe znaki) lubx, y, z
.True
zmieniono nazwę , nieprawidłowe nazwy pól są automatycznie zastępowane nazwami pozycyjnymi. Na przykład['abc', 'def', 'ghi','abc']
jest konwertowany na['abc', '_1', 'ghi', '_3']
, eliminując słowo kluczowe'def'
(ponieważ jest to słowo zastrzeżone do definiowania funkcji) i zduplikowaną nazwę pola'abc'
.True
, definicja klasy jest drukowana tuż przed budowaniem.Nadal możesz uzyskać dostęp do imienników według ich pozycji, jeśli tak wybierzesz.
p[1] == p.saturation
. Nadal rozpakowuje się jak zwykła krotka.Metody
Obsługiwane są wszystkie zwykłe metody krotek . Np .: min (), max (), len (), in, not in, concatenation (+), index, slice, itp. I jest kilka dodatkowych dla namedtuple. Uwaga: wszystkie zaczynają się od podkreślenia.
_replace
,_make
,_asdict
._replace
Zwraca nową instancję nazwanej krotki, zastępując określone pola nowymi wartościami.Składnia
Przykład
Uwaga : Nazwy pól nie są w cudzysłowach; są tutaj słowami kluczowymi. Pamiętaj : Tuple są niezmienne - nawet jeśli są nazwane świątyniami i mają odpowiednią
_replace
metodę._replace
Wytwarzanew
z nich; nie modyfikuje oryginału ani nie zastępuje starej wartości. Możesz oczywiście zapisać nowy wynik w zmiennej.p = p._replace(hue=169)
_make
Tworzy nową instancję z istniejącej sekwencji lub iterowalną.
Składnia
Przykład
Co się stało z ostatnim? Element w nawiasie powinien być iterowalny. Tak więc lista lub krotka w nawiasach działa, ale sekwencja wartości bez uwzględnienia jako iterowalnego zwraca błąd.
_asdict
Zwraca nowy OrdersDict, który mapuje nazwy pól na odpowiadające im wartości.
Składnia
Przykład
Odniesienie : https://www.reddit.com/r/Python/comments/38ee9d/intro_to_namedtuple/
Istnieje także lista nazwana, która jest podobna do nazwanej krotki, ale można ją modyfikować https://pypi.python.org/pypi/namedlist
źródło
_
!Co to jest namepleple?
Jak sama nazwa wskazuje, namedtuple to krotka o nazwie. W krotce standardowej uzyskujemy dostęp do elementów za pomocą indeksu, natomiast namedtuple pozwala użytkownikowi zdefiniować nazwę elementów. Jest to bardzo przydatne, szczególnie podczas przetwarzania plików csv (wartości oddzielonych przecinkami) i pracy ze złożonymi i dużymi zbiorami danych, w których kod staje się nieporządny przy użyciu indeksów (nie tak pythonicznych).
Jak z nich korzystać?
Czytanie
Ciekawy scenariusz przetwarzania CSV:
źródło
W Pythonie wewnątrz jest dobre wykorzystanie kontenera zwanego krotką nazwaną, można go użyć do stworzenia definicji klasy i ma wszystkie cechy oryginalnej krotki.
Używanie nazwanej krotki zostanie zastosowane bezpośrednio do domyślnego szablonu klasy w celu wygenerowania prostej klasy, ta metoda pozwala na dużo kodu w celu poprawy czytelności, a także jest bardzo wygodna podczas definiowania klasy.
źródło
Innym sposobem (nowym sposobem) użycia nazwanej krotki jest użycie NamedTuple z paczki do pisania: Wpisz wskazówki w namedtuple
Skorzystajmy z przykładu najwyższej odpowiedzi w tym poście, aby zobaczyć, jak z niej skorzystać.
(1) Przed użyciem nazwanej krotki kod wygląda następująco:
(2) Teraz używamy nazwanej krotki
odziedzicz klasę NamedTuple i zdefiniuj nazwę zmiennej w nowej klasie. test to nazwa klasy.
utwórz instancje z klasy i przypisz im wartości
użyj zmiennych z instancji do obliczenia
źródło
Spróbuj tego:
Zasadniczo
namedtuples
są łatwe do utworzenia, lekkie typy obiektów. Zamieniają krotki w wygodne pojemniki do prostych zadań. Dziękinamedtuples
nie musisz używać indeksów całkowitych w celu uzyskania dostępu do członków krotki.Przykłady:
Kod 1:
Kod 2:
źródło
Wszyscy inni już na to odpowiedzieli, ale myślę, że wciąż mam coś jeszcze do dodania.
Namedtuple można intuicyjnie uznać za skrót do zdefiniowania klasy.
Zobacz kłopotliwy i konwencjonalny sposób zdefiniowania
class
.Jeśli chodzi o
namedtuple
źródło
red_duck[0]
lublen(red_duck)
lubfor x in red_duck: print(x)
. Ponadto nazwane krotki są niezmienne, więc te operacje zakończą się niepowodzeniem:red_duck[0] = 2
,red_duck.foo = 'bar'
. Ponieważ są niezmienne, nazwane krotki mogą być używane jakodict
klucze.