Python'da “adlandırılmış tuples” nedir?


906

Python 3.1'deki değişiklikleri okurken, beklenmedik bir şey buldum:

Sys.version_info grubu artık adlandırılmış bir gruptur :

Daha önce adlandırılmış tuples hakkında daha önce hiç duymadım ve öğelerin ya sayılarla (tuples ve listelerde olduğu gibi) ya da tuşlarla (dikte gibi) dizine alınabileceğini düşündüm. Her iki şekilde de endekslenmesini hiç beklemiyordum.

Böylece, sorularım:

  • Tuples adı nedir?
  • Nasıl kullanılır?
  • Normal tuples yerine neden / ne zaman adlandırılmış tuples kullanmalıyım?
  • Neden / ne zaman adlandırılmış tuples yerine normal tuples kullanmalıyım?
  • Herhangi bir "adlandırılmış liste" var mı (adlandırılmış grubun değiştirilebilir bir sürümü)?

Yanıtlar:


1196

Adlandırılmış tuples temel olarak oluşturulması kolay, hafif nesne türleridir. Adlandırılmış grup örneklerine nesne benzeri değişken kayıttan kaldırma veya standart grup sözdizimi kullanılarak başvurulabilir. structDeğişmez olmaları dışında, benzer veya diğer yaygın kayıt türlerine benzer şekilde kullanılabilirler . Python 2.4 ve Python 3.0'da eklenmiştir, ancak Python 2.4'te uygulama için bir reçete vardır .

Örneğin, bir noktayı bir demet olarak temsil etmek yaygındır (x, y). Bu, aşağıdaki gibi koda yol açar:

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)

Adlandırılmış bir demet kullanarak daha okunabilir hale gelir:

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)

Ancak, adlandırılmış tuples hala normal tuples ile geriye doğru uyumludur, bu nedenle aşağıdakiler yine de çalışır:

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

Bu nedenle, nesne gösteriminin kodunuzu daha pitonik ve daha kolay okunabilir hale getireceğini düşündüğünüz her yerde tuples yerine adlandırılmış tuples kullanmalısınız . Şahsen bunları, özellikle fonksiyonlara parametre olarak aktarırken çok basit değer türlerini temsil etmek için kullanmaya başladım. Tuple ambalajın içeriğini görmeden fonksiyonları daha okunabilir hale getirir.

Ayrıca, işlevi olmayan sıradan değişmez sınıfları , yalnızca bunlarla alanları değiştirebilirsiniz. Hatta adlandırılmış grup türlerinizi temel sınıflar olarak da kullanabilirsiniz:

class Point(namedtuple('Point', 'x y')):
    [...]

Ancak, gruplarda olduğu gibi, adlandırılmış gruplardaki özellikler değişmezdir:

>>> Point = namedtuple('Point', 'x y')
>>> pt1 = Point(1.0, 5.0)
>>> pt1.x = 2.0
AttributeError: can't set attribute

Değerleri değiştirmek istiyorsanız, başka bir türe ihtiyacınız vardır. Değişkenlere yeni değerler ayarlamanızı sağlayan değiştirilebilir kayıt türleri için kullanışlı bir tarif var .

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

Ancak, yeni alanlar eklemenize izin veren "adlandırılmış liste" biçiminin farkında değilim. Bu durumda sadece bir sözlük kullanmak isteyebilirsiniz. Adlandırılmış tuples, pt1._asdict()döndürür kullanılarak sözlüklere dönüştürülebilir {'x': 1.0, 'y': 5.0}ve tüm olağan sözlük işlevleri ile çalıştırılabilir.

Daha önce belirtildiği gibi, bu örneklerin oluşturulduğu daha fazla bilgi için belgelere bakmalısınız .


35
python 3.7'den, dataclasses'u alternatif olarak düşünün (backport 3.6 için kullanılabilir, ancak önceki sürümlerde değil)
innov8

3
__slots__
Değişken

veri değil rcdtype kullanmanın temel nedeni nedir
Voyager


Bu her zaman bulduğunuz cevap olduğu için, artık typing.NamedTupletip ipuçlarına izin veren ve özellikle alt sınıflandırma için de uygun olduğunu belirtmek gerekir .
DerWeh

101

namedtuple , bir tuple sınıfı yapmak için fabrika fonksiyonudur . Bu sınıfla, ada göre de çağrılabilen tuples oluşturabiliriz.

import collections

#Create a namedtuple class with names "a" "b" "c"
Row = collections.namedtuple("Row", ["a", "b", "c"], verbose=False, rename=False)   

row = Row(a=1,b=2,c=3) #Make a namedtuple from the Row class we created

print row    #Prints: Row(a=1, b=2, c=3)
print row.a  #Prints: 1
print row[0] #Prints: 1

row = Row._make([2, 3, 4]) #Make a namedtuple from a list of values

print row   #Prints: Row(a=2, b=3, c=4)

5
ayrıntılı ve yeniden adlandırma parametreleri varsayılan olarak False olarak ayarlanmıştır, bu nedenle bu değere açıkça ayarlanmaları gerekmez.
Trismegistos

namedtuple is a factory function for making a tuple class.muhtemelen buradaki tek doğru cevap: P
Mr_and_Mrs_D

90

Tuples adı nedir?

Adlandırılmış bir demet bir demettir.

Bir demetin yapabileceği her şeyi yapar.

Ama bu sadece bir demetten daha fazlası.

Adlandırılmış alanlar ve sabit bir uzunluk ile, belirtiminize göre programlı olarak oluşturulan bir demetin belirli bir alt sınıfıdır.

Bu, örneğin, bir tuple alt sınıfı oluşturur ve sabit uzunlukta (bu durumda üç) olmanın yanı sıra, bir tupleın kırılmadan kullanıldığı her yerde kullanılabilir. Bu Liskov'un ikame edilebilirliği olarak bilinir.

Python 3.6'da yeni olan , adlandırılmış bir gruptyping.NamedTupleoluşturmak içinile bir sınıf tanımı kullanabiliriz:

from typing import NamedTuple

class ANamedTuple(NamedTuple):
    """a docstring"""
    foo: int
    bar: str
    baz: list

Yukarıdakiler, aşağıdakilerle aynıdır, ancak yukarıdakiler ayrıca tip ek açıklamalarına ve bir doktora işaretine sahiptir. Aşağıdakiler Python 2+ sürümünde mevcuttur:

>>> from collections import namedtuple
>>> class_name = 'ANamedTuple'
>>> fields = 'foo bar baz'
>>> ANamedTuple = namedtuple(class_name, fields)

Bu onu başlatır:

>>> ant = ANamedTuple(1, 'bar', [])

İnceleyebilir ve özelliklerini kullanabiliriz:

>>> ant
ANamedTuple(foo=1, bar='bar', baz=[])
>>> ant.foo
1
>>> ant.bar
'bar'
>>> ant.baz.append('anything')
>>> ant.baz
['anything']

Daha derin açıklama

Adlandırılmış tuples'i anlamak için önce bir tupleın ne olduğunu bilmeniz gerekir. Bir demet aslında değişmezdir (bellekte yerinde değiştirilemez) listesidir.

Düzenli bir demet nasıl kullanabilirsiniz:

>>> student_tuple = 'Lisa', 'Simpson', 'A'
>>> student_tuple
('Lisa', 'Simpson', 'A')
>>> student_tuple[0]
'Lisa'
>>> student_tuple[1]
'Simpson'
>>> student_tuple[2]
'A'

Bir tuple'i yinelenebilir ambalajı açarak genişletebilirsiniz:

>>> first, last, grade = student_tuple
>>> first
'Lisa'
>>> last
'Simpson'
>>> grade
'A'

Adlandırılmış tuples, öğelerine sadece dizin yerine adla erişilmesine izin veren tuples!

Bunun gibi adlandırılmış bir grup yaparsınız:

>>> from collections import namedtuple
>>> Student = namedtuple('Student', ['first', 'last', 'grade'])

Ayrıca adların boşluklarla ayrılmış tek bir dize, API'nın biraz daha okunabilir bir kullanımı da kullanabilirsiniz:

>>> Student = namedtuple('Student', 'first last grade')

Nasıl kullanılır?

Tuples'in yapabileceği her şeyi yapabilir (yukarıya bakın) ve aşağıdakileri yapabilirsiniz:

>>> named_student_tuple = Student('Lisa', 'Simpson', 'A')
>>> named_student_tuple.first
'Lisa'
>>> named_student_tuple.last
'Simpson'
>>> named_student_tuple.grade
'A'
>>> named_student_tuple._asdict()
OrderedDict([('first', 'Lisa'), ('last', 'Simpson'), ('grade', 'A')])
>>> vars(named_student_tuple)
OrderedDict([('first', 'Lisa'), ('last', 'Simpson'), ('grade', 'A')])
>>> new_named_student_tuple = named_student_tuple._replace(first='Bart', grade='C')
>>> new_named_student_tuple
Student(first='Bart', last='Simpson', grade='C')

Bir yorumcu sordu:

Büyük bir komut dosyasında veya programda, genellikle adlandırılmış bir grup nerede tanımlanır?

Birlikte oluşturduğunuz türler namedtuple temel olarak kolay steno ile oluşturabileceğiniz sınıflardır. Onlara sınıf gibi davran. Bunları modül düzeyinde tanımlayın, böylece turşu ve diğer kullanıcılar onları bulabilir.

Global modül seviyesinde çalışma örneği:

>>> from collections import namedtuple
>>> NT = namedtuple('NT', 'foo bar')
>>> nt = NT('foo', 'bar')
>>> import pickle
>>> pickle.loads(pickle.dumps(nt))
NT(foo='foo', bar='bar')

Bu da tanımın aranmamasını gösterir:

>>> def foo():
...     LocalNT = namedtuple('LocalNT', 'foo bar')
...     return LocalNT('foo', 'bar')
... 
>>> pickle.loads(pickle.dumps(foo()))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
_pickle.PicklingError: Can't pickle <class '__main__.LocalNT'>: attribute lookup LocalNT on __main__ failed

Normal tuples yerine neden / ne zaman adlandırılmış tuples kullanmalıyım?

Kodunuzda tuple elemanlarının semantiğinin ifade edilmesi için kodunuzu geliştirdiğinde kullanın.

Değişmeyen veri özniteliklerine sahip ve herhangi bir işlevsellik içermeyen bir nesne kullanırsanız, bunları nesne yerine kullanabilirsiniz.

İşlev eklemek için bunları alt sınıflara ayırabilirsiniz , örneğin :

class Point(namedtuple('Point', 'x y')):
    """adding functionality to a named tuple"""
        __slots__ = ()
        @property
        def hypot(self):
            return (self.x ** 2 + self.y ** 2) ** 0.5
        def __str__(self):
            return 'Point: x=%6.3f  y=%6.3f  hypot=%6.3f' % (self.x, self.y, self.hypot)

Neden / ne zaman adlandırılmış tuples yerine normal tuples kullanmalıyım?

Muhtemelen adlandırılmış tuples kullanmaktan tuples'a geçmek bir gerileme olacaktır. Açık tasarım kararı, söz konusu ekstra koddan gelen maliyetin, demet kullanıldığında daha iyi okunabilirliğe değip değmeyeceği etrafında odaklanmaktadır.

Adlandırılmış tuples tarafından tuples'e karşı kullanılan fazladan bellek yoktur.

Herhangi bir "adlandırılmış liste" var mı (adlandırılmış grubun değiştirilebilir bir sürümü)?

Statik olarak boyutlandırılmış bir listenin tüm işlevlerini uygulayan oluklu bir nesne veya adlandırılmış bir grup gibi çalışan alt sınıflı bir liste mi arıyorsunuz (ve bir şekilde listenin boyutunun değişmesini engeller).

Şimdi genişletilmiş ve hatta belki de Liskov'un yerine geçebilen bir örnek:

from collections import Sequence

class MutableTuple(Sequence): 
    """Abstract Base Class for objects that work like mutable
    namedtuples. Subclass and define your named fields with 
    __slots__ and away you go.
    """
    __slots__ = ()
    def __init__(self, *args):
        for slot, arg in zip(self.__slots__, args):
            setattr(self, slot, arg)
    def __repr__(self):
        return type(self).__name__ + repr(tuple(self))
    # more direct __iter__ than Sequence's
    def __iter__(self): 
        for name in self.__slots__:
            yield getattr(self, name)
    # Sequence requires __getitem__ & __len__:
    def __getitem__(self, index):
        return getattr(self, self.__slots__[index])
    def __len__(self):
        return len(self.__slots__)

Ve kullanmak için, sadece alt sınıf ve tanımlayın __slots__:

class Student(MutableTuple):
    __slots__ = 'first', 'last', 'grade' # customize 


>>> student = Student('Lisa', 'Simpson', 'A')
>>> student
Student('Lisa', 'Simpson', 'A')
>>> first, last, grade = student
>>> first
'Lisa'
>>> last
'Simpson'
>>> grade
'A'
>>> student[0]
'Lisa'
>>> student[2]
'A'
>>> len(student)
3
>>> 'Lisa' in student
True
>>> 'Bart' in student
False
>>> student.first = 'Bart'
>>> for i in student: print(i)
... 
Bart
Simpson
A

44

namedtuples harika bir özellik, veri için mükemmel bir kap. Verileri "saklamanız" gerektiğinde, aşağıdaki gibi tuples veya sözlükler kullanırsınız:

user = dict(name="John", age=20)

veya:

user = ("John", 20)

Sözlük yaklaşımı ezicidir, çünkü diksiyon tuples'ten değişebilir ve yavaştır. Öte yandan, tupller değişmez ve hafiftir, ancak veri alanlarındaki çok sayıda giriş için okunabilirlikten yoksundur.

Adlandırılmışlar iki yaklaşım için mükemmel bir uzlaşmadır, büyük okunabilirlik, hafiflik ve değişmezliğe sahiptir (ayrıca polimorfiktir!).


9
Adlarına göre adlarına erişiyorsanız, adlandırılmış üçlülerin diktatörlerden çok daha yavaş olduğunu unutmayın: ntuple.foovs ntuple[1]ikincisi çok daha hızlıdır. Daha fazlası: stackoverflow.com/questions/2646157/…
Rotareti

28

adlandırılmış tuples, böyle bir sürümü kontrol eden kodla geriye dönük uyumluluğa izin verir

>>> sys.version_info[0:2]
(3, 1)

bu sözdizimini kullanarak gelecekteki kodun daha açık olmasına izin verirken

>>> sys.version_info.major
3
>>> sys.version_info.minor
1

12

namedtuple

kodunuzu temizlemenin ve daha okunabilir hale getirmenin en kolay yollarından biridir. Grupta neler olduğunu kendi kendine belgeliyor. Namedtuples örnekleri, örnek başına sözlükleri olmadığı için normal tuples kadar bellek verimlidir ve bunları sözlüklerden daha hızlı hale getirir.

from collections import namedtuple

Color = namedtuple('Color', ['hue', 'saturation', 'luminosity'])

 p = Color(170, 0.1, 0.6)
 if p.saturation >= 0.5:
     print "Whew, that is bright!"
 if p.luminosity >= 0.5:
     print "Wow, that is light"

Gruptaki her bir öğeyi adlandırmadan, şöyle okunur:

p = (170, 0.1, 0.6)
if p[1] >= 0.5:
    print "Whew, that is bright!"
if p[2]>= 0.5:
   print "Wow, that is light"

İlk örnekte neler olduğunu anlamak çok daha zordur. Adlandırılmış bir çift ile her alanın bir adı vardır. Ve konum veya dizin yerine ada göre erişirsiniz. Bunun yerine p[1]buna doygunluk diyebiliriz. Anlamak daha kolay. Ve daha temiz görünüyor.

Adlandırılmış grubun bir örneğini oluşturmak, sözlük oluşturmaktan daha kolaydır.

# dictionary
>>>p = dict(hue = 170, saturation = 0.1, luminosity = 0.6)
>>>p['hue']
170

#nametuple
>>>from collections import namedtuple
>>>Color = namedtuple('Color', ['hue', 'saturation', 'luminosity'])
>>>p = Color(170, 0.1, 0.6)
>>>p.hue
170

Adlı dosyayı ne zaman kullanabilirsiniz?

  1. Az önce belirtildiği gibi, adlandırılmış grup tuples'ı daha kolay hale getirir. Bu nedenle, gruptaki öğelere başvurmanız gerekiyorsa, bunları adlandırılmış gruplar olarak oluşturmak mantıklıdır.
  2. Bir sözlüğe göre daha hafif olmasının yanı sıra, adlandırılmış sözlüğü de sözlüğün aksine düzeni korur.
  3. Yukarıdaki örnekte olduğu gibi, sözlükten daha fazla adlandırılmış bir örnek oluşturmak daha kolaydır. Ve adlandırılmış gruptaki öğeye referans vermek sözlükten daha temiz görünüyor. p.hueyerine p['hue'].

Sözdizimi

collections.namedtuple(typename, field_names[, verbose=False][, rename=False])
  • namedtuple koleksiyon kütüphanesinde.
  • typename: Bu yeni grup alt sınıfının adıdır.
  • field_names: Her alan için bir ad dizisi. Bir listede ['x', 'y', 'z']veya dizede olduğu gibi bir dizi olabilir x y z(virgülsüz, yalnızca boşluk) veyax, y, z .
  • rename: rename ise Truegeçersiz alan adları otomatik olarak konum adlarıyla değiştirilir. Örneğin , anahtar kelime (işlevlerin tanımlanması için ayrılmış bir sözcük olduğu için) ve yinelenen alan adı ortadan kaldırılarak ['abc', 'def', 'ghi','abc']dönüştürülür.['abc', '_1', 'ghi', '_3']'def''abc' .
  • ayrıntılı: Ayrıntılı ise True, sınıf tanımı oluşturulmadan hemen önce yazdırılır.

İsterseniz adlandırılmış başlıklara konumlarına göre erişmeye devam edebilirsiniz. p[1] == p.saturation. Hala normal bir demet gibi açılmaya devam ediyor.

Yöntemler

Tüm normal tuple yöntemleri desteklenmektedir. Örn: min (), max (), len (), içinde, içinde değil, birleştirme (+), dizin, dilim vb. Not: Bunların tümü bir alt çizgi ile başlar. _replace, _make, _asdict.

_replace Belirtilen alanları yeni değerlerle değiştirerek adlandırılmış grubun yeni bir örneğini döndürür.

Sözdizimi

somenamedtuple._replace(kwargs)

Misal

>>>from collections import namedtuple

>>>Color = namedtuple('Color', ['hue', 'saturation', 'luminosity'])
>>>p = Color(170, 0.1, 0.6)

>>>p._replace(hue=87)
Color(87, 0.1, 0.6)

>>>p._replace(hue=87, saturation=0.2)
Color(87, 0.2, 0.6)

Uyarı : Alan adları tırnak içinde değildir; burada anahtar kelimeler. Unutmayın : Tüller, adlandırılmamış olsalar da, _replacemetoda sahip olsalar bile değişmezdirler . _replaceÜreten bir newörneği; orijinali değiştirmez veya eski değeri değiştirmez. Elbette yeni sonucu değişkene kaydedebilirsiniz.p = p._replace(hue=169)

_make

Mevcut bir diziden veya yinelenebilirden yeni bir örnek oluşturur.

Sözdizimi

somenamedtuple._make(iterable)

Misal

 >>>data = (170, 0.1, 0.6)
 >>>Color._make(data)
Color(hue=170, saturation=0.1, luminosity=0.6)

>>>Color._make([170, 0.1, 0.6])  #the list is an iterable
Color(hue=170, saturation=0.1, luminosity=0.6)

>>>Color._make((170, 0.1, 0.6))  #the tuple is an iterable
Color(hue=170, saturation=0.1, luminosity=0.6)

>>>Color._make(170, 0.1, 0.6) 
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "<string>", line 15, in _make
TypeError: 'float' object is not callable

Sonuncusuna ne oldu? Parantez içindeki öğe yinelenebilir olmalıdır. Böylece parantez içindeki bir liste veya grup çalışır, ancak yinelenebilir olarak çevrelenmeyen değerlerin sırası bir hata döndürür.

_asdict

Alan adlarını karşılık gelen değerlerle eşleyen yeni bir OrderedDict döndürür .

Sözdizimi

somenamedtuple._asdict()

Misal

 >>>p._asdict()
OrderedDict([('hue', 169), ('saturation', 0.1), ('luminosity', 0.6)])

Referans : https://www.reddit.com/r/Python/comments/38ee9d/intro_to_namedtuple/

Adlandırılmış tuple'a benzer ancak adlandırılabilir bir listeye de sahiptir https://pypi.python.org/pypi/namedlist


Bununla birlikte, PEP8'e göre , tek bir alt çizginin kendi davranışı olan bir “zayıf“ iç kullanım ”göstergesi” olarak kabul edildiğini unutmayın. İle başlayan fonksiyonları kullanırken dikkatli olun _!
Jens

8

Adlandırılmış üçlü nedir?

Adından da anlaşılacağı gibi, namedtuple, adı olan bir demettir. Standart grupta, dizin kullanarak elemanlara erişirken, adlandırılmış grup kullanıcının elemanlar için isim tanımlamasına izin verir. Bu, özellikle csv (virgülle ayrılmış değer) dosyalarını işlemek ve kodun indekslerin (çok pitonik olmayan) kullanımı ile dağınık hale geldiği karmaşık ve büyük veri kümesiyle çalışmak çok kullanışlıdır.

Nasıl kullanılır?

>>>from collections import namedtuple
>>>saleRecord = namedtuple('saleRecord','shopId saleDate salesAmout totalCustomers')
>>>
>>>
>>>#Assign values to a named tuple 
>>>shop11=saleRecord(11,'2015-01-01',2300,150) 
>>>shop12=saleRecord(shopId=22,saleDate="2015-01-01",saleAmout=1512,totalCustomers=125)

Okuma

>>>#Reading as a namedtuple
>>>print("Shop Id =",shop12.shopId)
12
>>>print("Sale Date=",shop12.saleDate)
2015-01-01
>>>print("Sales Amount =",shop12.salesAmount)
1512
>>>print("Total Customers =",shop12.totalCustomers)
125

CSV İşlemede İlginç Senaryo:

from csv import reader
from collections import namedtuple

saleRecord = namedtuple('saleRecord','shopId saleDate totalSales totalCustomers')
fileHandle = open("salesRecord.csv","r")
csvFieldsList=csv.reader(fileHandle)
for fieldsList in csvFieldsList:
    shopRec = saleRecord._make(fieldsList)
    overAllSales += shopRec.totalSales;

print("Total Sales of The Retail Chain =",overAllSales)

5

İçerideki Python'da adlandırılmış tuple adı verilen bir konteyner iyi bir şekilde kullanılır, bir sınıf tanımı oluşturmak için kullanılabilir ve orijinal demetin tüm özelliklerine sahiptir.

Basit bir sınıf oluşturmak için adlandırılmış tuple kullanımı doğrudan varsayılan sınıf şablonuna uygulanacaktır, bu yöntem okunabilirliği artırmak için çok sayıda kod sağlar ve bir sınıf tanımlarken de çok uygundur.


2

Bir başka yolu (yeni bir yön) tanımlama grubu adında kullanmak yazarak paketinden NamedTuple kullanıyor: Tip ipuçları namedtuple içinde

Nasıl kullanılacağını görmek için bu yayındaki en iyi cevap örneğini kullanalım.

(1) Adlandırılmış tuple kullanılmadan önce kod şöyle:

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)
print(line_length)

(2) Şimdi adlandırılmış demet kullanıyoruz

from typing import NamedTuple, Number

NamedTuple sınıfını devralır ve yeni sınıfta değişken adını tanımlar. test sınıfın adıdır.

class test(NamedTuple):
x: Number
y: Number

sınıftan örnekler oluşturun ve bunlara değerler atayın

pt1 = test(1.0, 5.0)   # x is 1.0, and y is 5.0. The order matters
pt2 = test(2.5, 1.5)

hesaplamak için örneklerden değişkenleri kullanma

line_length = sqrt((pt1.x-pt2.x)**2 + (pt1.y-pt2.y)**2)
print(line_length)

1

Bunu dene:

collections.namedtuple()

Temel olarak, namedtuplesoluşturulması kolay, hafif nesne türleri. Basit görevler için tuplleri uygun kaplara dönüştürürler. İle namedtuples, bir grubun üyelerine erişmek için tamsayı dizinleri kullanmanız gerekmez.

Örnekler:

Kod 1:

>>> from collections import namedtuple

>>> Point = namedtuple('Point','x,y')

>>> pt1 = Point(1,2)

>>> pt2 = Point(3,4)

>>> dot_product = ( pt1.x * pt2.x ) +( pt1.y * pt2.y )

>>> print dot_product
11

Kod 2:

>>> from collections import namedtuple

>>> Car = namedtuple('Car','Price Mileage Colour Class')

>>> xyz = Car(Price = 100000, Mileage = 30, Colour = 'Cyan', Class = 'Y')

>>> print xyz

Car(Price=100000, Mileage=30, Colour='Cyan', Class='Y')
>>> print xyz.Class
Y

-1

Herkes zaten cevap verdi, ama bence hala ekleyeceğim başka bir şey var.

Namedtuple sezgisel olarak bir sınıfı tanımlamak için bir kısayol olarak kabul edilebilir.

A tanımlamak için hantal ve geleneksel bir yol bakın class.

class Duck:
    def __init__(self, color, weight):
        self.color = color
        self.weight = weight
red_duck = Duck('red', '10')

    In [50]: red_duck
    Out[50]: <__main__.Duck at 0x1068e4e10>
    In [51]: red_duck.color
    Out[51]: 'red'

Gelince namedtuple

from collections import namedtuple
Duck = namedtuple('Duck', ['color', 'weight'])
red_duck = Duck('red', '10')

In [54]: red_duck
Out[54]: Duck(color='red', weight='10')
In [55]: red_duck.color
Out[55]: 'red'

2
Üzgünüm, ama bu yanlış. Adlandırılmış demet de şunları destekler: red_duck[0]veya len(red_duck)veya for x in red_duck: print(x). Ayrıca, adlandırılmış tuples değişmez, bu nedenle bu işlemler başarısız olur: red_duck[0] = 2, red_duck.foo = 'bar'. Değişmez olduklarından, adlandırılmış tuples dictanahtar olarak kullanılabilir .
Denilson Sá Maia

Evet, temel bilgiler.
Analiz

1
@ Jawaw Hayır, bu "temel bilgiler" değil. Adlandırılmış tuples, normal sınıflardan tamamen farklı bir işlevselliği destekler. Özünde tuples adlı bir sınıf olsa da, bu sınıfların tuples olarak adlandırıldığı anlamına gelmez.
şarj edin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.