පයිතන්හි “නම් කරන ලද ටුපල්” මොනවාද?


931

පයිතන් 3.1 හි වෙනස්කම් කියවන විට , මට යමක් හමු විය ... අනපේක්ෂිත:

Sys.version_info tuple දැන් නම් කරන ලද tuple :

මීට පෙර නම් කරන ලද ටුපල් ගැන මා අසා නැත, මූලද්‍රව්‍ය සංඛ්‍යා (ටුපල් සහ ලැයිස්තු වැනි) හෝ යතුරු මගින් (ඩික්ට්ස් වැනි) සුචිගත කළ හැකි යැයි මම සිතුවෙමි. මම හිතුවේ නැහැ ඔවුන් දෙයාකාරයෙන්ම සුචිගත කළ හැකිය.

මේ අනුව, මගේ ප්‍රශ්න:

  • ටුපල් ලෙස නම් කර ඇත්තේ කුමක්ද?
  • ඒවා භාවිතා කරන්නේ කෙසේද?
  • සාමාන්‍ය ටුපල් වෙනුවට නම් කළ ටුපල් භාවිතා කළ යුත්තේ ඇයි / කවදාද?
  • නම් කරන ලද ටුපල් වෙනුවට සාමාන්‍ය ටුපල් භාවිතා කළ යුත්තේ ඇයි / කවදාද?
  • කිසියම් ආකාරයක “නම් කරන ලද ලැයිස්තුවක්” (නම් කරන ලද ටුපල් හි විකෘති අනුවාදය) තිබේද?

Answers:


1221

නම් කරන ලද ටුපල් මූලික වශයෙන් නිර්මාණය කිරීමට පහසු, සැහැල්ලු වස්තු වර්ග වේ. වස්තු-වැනි විචල්‍ය විරූපණයන් හෝ සම්මත ටුපල් සින්ටැක්ස් භාවිතයෙන් නම් කරන ලද ටුපල් නිදසුන් සඳහන් කළ හැකිය. ඒවා structවෙනස් කළ නොහැකි ඒවා හැර, ඒ හා සමාන හෝ වෙනත් පොදු වාර්තා වර්ග භාවිතා කළ හැකිය . පයිතන් 2.4 සහ පයිතන් 3.0 හි ඒවා එකතු කරන ලදී, නමුත් පයිතන් 2.4 හි ක්‍රියාත්මක කිරීම සඳහා වට්ටෝරුවක් ඇත .

නිදසුනක් ලෙස, ලක්ෂ්‍යයක් ටුපල් ලෙස නිරූපණය කිරීම සාමාන්‍ය දෙයකි (x, y). මෙය පහත සඳහන් කේත වලට මග පාදයි:

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)

නම් කරන ලද ටුපල් එකක් භාවිතා කිරීමෙන් එය වඩාත් කියවිය හැකිය:

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)

කෙසේ වෙතත්, නම් කරන ලද ටුපල් තවමත් සාමාන්‍ය ටුපල් සමඟ අනුකූල වේ, එබැවින් පහත සඳහන් දෑ තවමත් ක්‍රියාත්මක වේ:

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

මේ අනුව, වස්තු අංකනය මඟින් ඔබේ කේතය වඩාත් පයිතොනික් හා පහසුවෙන් කියවිය හැකි යැයි ඔබ සිතන ඕනෑම තැනක ටුපල් වෙනුවට නම් කළ ටුපල් භාවිතා කළ යුතුය . මම පෞද්ගලිකව ඒවා භාවිතා කිරීමට පටන් ගෙන ඇත්තේ ඉතා සරල වටිනාකම් වර්ග නිරූපණය කිරීම සඳහා ය. ටුපල් ඇසුරුමේ සන්දර්භය නොදැක එය කාර්යයන් වඩාත් කියවිය හැකි කරයි.

තවද, ඔබට කාර්යයන් නොමැති සාමාන්‍ය වෙනස් කළ නොහැකි පන්ති ආදේශ කළ හැකිය . ඔබට නම් කරන ලද ටුපල් වර්ග මූලික පන්ති ලෙස භාවිතා කළ හැකිය:

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

කෙසේ වෙතත්, ටුපල් මෙන්, නම් කරන ලද ටුපල් වල ගුණාංග වෙනස් කළ නොහැක:

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

ඔබට අගයන් වෙනස් කිරීමට හැකි නම්, ඔබට වෙනත් වර්ගයක් අවශ්‍ය වේ. විකෘති කළ හැකි පටිගත කිරීම් සඳහා පහසු වට්ටෝරුවක් ඇත, එමඟින් ගුණාංගවලට නව අගයන් සැකසීමට ඔබට ඉඩ සලසයි.

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

කෙසේ වෙතත්, ඔබට නව ක්ෂේත්‍ර එකතු කිරීමට ඉඩ සලසන “නම් කරන ලද ලැයිස්තුවක්” ගැන මම නොදනිමි. මෙම තත්වය තුළ ඔබට ශබ්ද කෝෂයක් භාවිතා කිරීමට අවශ්‍ය විය හැකිය. නම් කරන ලද ටුපල් ශබ්දකෝෂ බවට පරිවර්තනය කළ හැකි pt1._asdict()ප්‍රතිලාභ භාවිතා කරමින් {'x': 1.0, 'y': 5.0}සුපුරුදු ශබ්දකෝෂ කාර්යයන් සමඟ ක්‍රියාත්මක කළ හැකිය.

දැනටමත් සඳහන් කර ඇති පරිදි, මෙම උදාහරණ සාදන ලද වැඩි විස්තර සඳහා ඔබ ප්‍රලේඛනය පරීක්ෂා කළ යුතුය .


37
පයිතන් 3.7 සිට, ඩේටාක්ලාස් විකල්පයක් ලෙසද සලකන්න (පසුපෙළ 3.6 ට ලබා ගත හැකි නමුත් පෙර සංස්කරණ නොවේ)
නවෝත්පාදන 8

3
ඔබට විකෘති වාර්තා වර්ගයක් අවශ්‍ය නම් - අර්ථ දක්වා ඇති සරල පන්තියක් භාවිතා කරන්න__slots__
මැඩ්සොහාන්

rcdtype not dataclasses භාවිතා කිරීමට ප්‍රධාන හේතුව කුමක්ද
වොයේජර්


ඔබ සැමවිටම සොයා ගන්නා පිළිතුර මෙය බැවින්, typing.NamedTupleවර්ග ඉඟි සඳහා ඉඩ ලබා දෙන සහ උප පංති සඳහා විශේෂයෙන් පහසු වන බව ද සඳහන් කිරීම වටී .
ඩර්වේ

105

nametuple යනු ටුපල් පංතියක් සෑදීම සඳහා කර්මාන්තශාලා කාර්යයකි . එම පංතිය සමඟ අපට නමින් හැඳින්විය හැකි ටුපල් නිර්මාණය කළ හැකිය.

import collections

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

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
වාචික හා නැවත නම් කිරීමේ පරාමිතීන් පෙරනිමියෙන් අසත්‍යයට පෙරනිමි බැවින් ඒවා පැහැදිලිවම මෙම අගයට සැකසීමට අවශ්‍ය නොවේ.
ට්‍රිස්මෙගිස්ටෝස්

namedtuple is a factory function for making a tuple class.මෙහි ඇති එකම නිවැරදි පිළිතුර එය විය හැකිය: P
Mr_and_Mrs_D

99

ටුපල් ලෙස නම් කර ඇත්තේ කුමක්ද?

නම් කරන ලද ටුපල් යනු ටුපල් ය.

එය කළ හැකි සෑම දෙයක්ම කරයි.

නමුත් එය හුදු ටුපල් එකකට වඩා වැඩි ය.

එය නම් කරන ලද ක්ෂේත්‍ර සහ ස්ථාවර දිගක් සහිතව ඔබේ පිරිවිතරයට ක්‍රමලේඛගතව නිර්මාණය කරන ලද ටුපල් එකක විශේෂිත උප පංතියකි.

නිදසුනක් ලෙස, මෙය ටුපල් උප පංතියක් නිර්මාණය කරන අතර, ස්ථාවර දිග හැරුණු විට (මේ අවස්ථාවේ දී, තුනක්), එය කැඩී යාමකින් තොරව ටුපල් එකක් භාවිතා කරන සෑම තැනකම භාවිතා කළ හැකිය. මෙය ලිස්කොව් ආදේශකතාව ලෙස හැඳින්වේ.

පයිතන් 3.6 හි අළුත් , අපට නම් කළtyping.NamedTupleටුපල් එකක් සෑදීමටපන්ති අර්ථ දැක්වීමක් භාවිතා කළ හැකිය:

from typing import NamedTuple

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

ඉහත සඳහන් කර ඇති ආකාරයට පහත දැක්වෙන ආකාරයට සමාන වේ. පහත දැක්වෙන්නේ පයිතන් 2+ හි ය:

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

මෙය ක්ෂණිකව තහවුරු කරයි:

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

අපට එය පරීක්ෂා කර එහි ගුණාංග භාවිතා කළ හැකිය:

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

ගැඹුරු පැහැදිලි කිරීම

නම් කරන ලද ටුපල් තේරුම් ගැනීමට, ඔබ මුලින්ම දැනගත යුත්තේ ටුපල් යනු කුමක්ද යන්නයි. ටුපල් යනු අත්‍යවශ්‍යයෙන්ම වෙනස් කළ නොහැකි (මතකයේ ස්ථානය වෙනස් කළ නොහැක) ලැයිස්තුවකි.

මෙන්න ඔබ සාමාන්‍ය ටුපල් එකක් භාවිතා කරන්නේ කෙසේද:

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

නැවත සකස් කළ නොහැකි ඇසුරුමකින් ඔබට ටුපල් එකක් පුළුල් කළ හැකිය:

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

නම් කරන ලද ටුපල් යනු හුදෙක් දර්ශකය වෙනුවට ඒවායේ මූලද්‍රව්‍යයන් නමට ප්‍රවේශ වීමට ඉඩ සලසන ටුපල් ය!

ඔබ මේ ආකාරයට නම් කළ ටුපල් එකක් සාදන්න:

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

ඔබට අවකාශයකින් වෙන් කරන ලද නම් සහිත තනි නූලක් භාවිතා කළ හැකිය, ඒපීඅයි තරමක් කියවිය හැකි භාවිතය:

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

ඒවා භාවිතා කරන්නේ කෙසේද?

ටුපල්වරුන්ට කළ හැකි සෑම දෙයක්ම ඔබට කළ හැකිය (ඉහත බලන්න) මෙන්ම පහත සඳහන් දේ කරන්න:

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

විචාරකයෙක් ඇසුවේ:

විශාල ස්ක්‍රිප්ට් එකක හෝ වැඩසටහනක, සාමාන්‍යයෙන් නම් කරන ලද ටුපල් එකක් අර්ථ දක්වන්නේ කොතැනින්ද?

ඔබ නිර්මාණය කරන namedtupleවර්ග මූලික වශයෙන් ඔබට පහසු කෙටිමං සමඟ නිර්මාණය කළ හැකි පන්ති වේ. පංති වගේ සලකන්න. මොඩියුල මට්ටමින් ඒවා නිර්වචනය කරන්න, එවිට අච්චාරු සහ වෙනත් පරිශීලකයින්ට ඒවා සොයාගත හැකිය.

ගෝලීය මොඩියුල මට්ටමින් වැඩ කරන උදාහරණය:

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

අර්ථ දැක්වීම බැලීමට අපොහොසත් වීම මෙයින් පෙන්නුම් කෙරේ:

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

සාමාන්‍ය ටුපල් වෙනුවට නම් කළ ටුපල් භාවිතා කළ යුත්තේ ඇයි / කවදාද?

ඔබේ කේතය වැඩි දියුණු කළ විට ඒවා භාවිතා කරන්න.

වෙනස් නොවන දත්ත ලක්ෂණ සහ ක්‍රියාකාරීත්වයක් නොමැති වස්තුවක් ඔබ භාවිතා කරන්නේ නම් ඔබට වස්තුවක් වෙනුවට ඒවා භාවිතා කළ හැකිය.

ක්‍රියාකාරීත්වය එක් කිරීම සඳහා ඔබට ඒවා උපවර්ග කළ හැකිය , උදාහරණයක් ලෙස :

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)

නම් කරන ලද ටුපල් වෙනුවට සාමාන්‍ය ටුපල් භාවිතා කළ යුත්තේ ඇයි / කවදාද?

බොහෝ විට නම් කරන ලද ටුපල් භාවිතා කිරීමෙන් ටුපල් වෙත මාරුවීම ප්‍රතිගාමී විය හැකිය. ටියුප් එක භාවිතා කරන විට කියවිය හැකි වැඩි දියුණු කිරීම සඳහා අමතර කේතයකින් ලැබෙන පිරිවැය වටී ද යන්න පිළිබඳව පෙර සැලසුම් තීරණ ගැනීමේ මධ්‍යස්ථාන කේන්ද්‍රගත වේ.

ටුපල් එදිරිව ටුපල් භාවිතා කරන අමතර මතකයක් නොමැත.

කිසියම් ආකාරයක “නම් කරන ලද ලැයිස්තුවක්” (නම් කරන ලද ටුපල් හි විකෘති අනුවාදය) තිබේද?

ඔබ සොයන්නේ ස්ථිතික ප්‍රමාණයේ ලැයිස්තුවක සියලුම ක්‍රියාකාරීත්වයන් ක්‍රියාත්මක කරන ස්ලට් කළ වස්තුවක් හෝ නම් කරන ලද ටුපල් එකක් මෙන් ක්‍රියා කරන උප පංති ලැයිස්තුවකි (එමඟින් ලැයිස්තුව ප්‍රමාණයෙන් වෙනස් වීම කෙසේ හෝ අවහිර කරයි.)

දැන් පුළුල් වී ඇති අතර සමහර විට ලිස්කොව් ආදේශ කළ හැකි පළමු උදාහරණය:

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

භාවිතා කිරීමට, උප පංතිය සහ අර්ථ දැක්වීම __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

nametuples විශිෂ්ට ලක්ෂණයකි, ඒවා දත්ත සඳහා පරිපූර්ණ බහාලුමක් වේ. ඔබට දත්ත "ගබඩා" කිරීමට සිදු වූ විට, ඔබ ටුපල් හෝ ශබ්ද කෝෂ භාවිතා කරනු ඇත:

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

හෝ:

user = ("John", 20)

ශබ්ද කෝෂය විකෘති හා ටුපල් වලට වඩා මන්දගාමී බැවින් ශබ්ද කෝෂ ප්‍රවේශය අති විශාලය. අනෙක් අතට, ටුපල් වෙනස් කළ නොහැකි හා සැහැල්ලු නමුත් දත්ත ක්ෂේත්‍රයන්හි ඇතුළත් කිරීම් විශාල සංඛ්‍යාවක් සඳහා කියවීමේ හැකියාව අඩුය.

නම් තැබූපල්ස් යනු ප්‍රවේශයන් දෙක සඳහා පරිපූර්ණ සම්මුතියකි, ඒවාට විශාල කියවීමේ හැකියාව, සැහැල්ලුබව සහ වෙනස් කළ නොහැකි බව (ප්ලස් ඒවා බහුමාමක වේ!).


9
ඔබ නම් වලින් ඒවායේ ගුණාංග වලට ප්‍රවේශ වන්නේ නම් නම් කළ නාමයන් නියමයන්ට වඩා මන්දගාමී බව මතක තබා ගන්න: ntuple.fooඑදිරිව එදිරිව ntuple[1]වඩා වේගවත් වේ. වැඩි විස්තර: stackoverflow.com/questions/2646157/…
රොටරෙටි

28

නම් කරන ලද ටුපල්ස් මෙවැනි අනුවාදය සඳහා පරික්ෂා කරන කේත සමඟ පසුගාමී අනුකූලතාවයට ඉඩ දෙයි

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

මෙම වාක්‍ය ඛණ්ඩය භාවිතා කිරීමෙන් අනාගත කේතය වඩාත් පැහැදිලිව දැක්වීමට ඉඩ දෙන අතර

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

12

nametuple

යනු ඔබේ කේතය පිරිසිදු කර එය වඩාත් කියවිය හැකි පහසුම ක්‍රමයකි. එය ටුපල් හි සිදුවන්නේ කුමක්ද යන්න ස්වයං ලේඛනගත කරයි. නම් කරන ලද නිදර්ශන නිත්‍ය ටුපල් මෙන් මතක කාර්යක්‍ෂම වන අතර ඒවාට එක් එක් ශබ්ද කෝෂ නොමැති අතර ඒවා ශබ්දකෝෂවලට වඩා වේගවත් කරයි.

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"

ටුපල්හි එක් එක් මූලද්‍රව්‍යය නම් නොකර, එය මෙසේ කියවනු ඇත:

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"

පළමු උදාහරණයේ සිදුවන්නේ කුමක්ද යන්න තේරුම් ගැනීම එතරම් අපහසු නැත. නම් කරන ලද ටුපල් සමඟ, සෑම ක්ෂේත්‍රයකටම නමක් ඇත. ඔබ එය ස්ථානයට හෝ දර්ශකයට වඩා නමකින් ප්‍රවේශ වේ. ඒ වෙනුවට p[1]අපට එය p.saturation ලෙස හැඳින්විය හැකිය. තේරුම් ගැනීම පහසුය. එය පිරිසිදු බව පෙනේ.

ශබ්ද කෝෂයක් සෑදීමට වඩා නම් කළ නාමයේ නිදසුනක් නිර්මාණය කිරීම පහසුය.

# 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

ඔබට නම් කළ ටුපල් භාවිතා කළ හැක්කේ කවදාද?

  1. දැන් සඳහන් කළ පරිදි, නම් කරන ලද ටුපල් තේරුම් ගැනීම වඩාත් පහසු කරයි. එබැවින් ඔබට ටුපල් එකේ ඇති අයිතම සඳහන් කිරීමට අවශ්‍ය නම් ඒවා නම් කරන ලද ඒවා ලෙස නිර්මාණය කිරීම අර්ථවත් කරයි.
  2. ශබ්ද කෝෂයකට වඩා සැහැල්ලු වීමට අමතරව, නම් කරන ලද ද ශබ්ද කෝෂය මෙන් නොව අනුපිළිවෙල තබා ගනී.
  3. ඉහත උදාහරණයේ දී මෙන්, ශබ්ද කෝෂයට වඩා නම් තැබීමේ නිදසුනක් නිර්මාණය කිරීම සරල ය. නම් කරන ලද ටුපල් හි අයිතමය යොමු කිරීම ශබ්ද කෝෂයකට වඩා පිරිසිදු බව පෙනේ. p.hueවෙනුවට p['hue'].

සින්ටැක්ස්

collections.namedtuple(typename, field_names[, verbose=False][, rename=False])
  • nametuple එකතු කිරීමේ පුස්තකාලයේ ඇත.
  • typename: මෙය නව ටුපල් උප පංතියේ නමයි.
  • field_names: එක් එක් ක්ෂේත්‍ර සඳහා නම් මාලාවක්. එය ලැයිස්තුවක් ['x', 'y', 'z']හෝ නූලක් වැනි අනුක්‍රමයක් විය හැකිය x y z(කොමාවකින් තොරව, හිස් අවකාශය) හෝ x, y, z.
  • නැවත නම් කිරීම: නැවත නම් කිරීම නම් True, අවලංගු ක්ෂේත්‍ර නාම ස්වයංක්‍රීයව ස්ථානීය නම් වලින් ප්‍රතිස්ථාපනය වේ. උදාහරණයක් ලෙස, ['abc', 'def', 'ghi','abc']බවට පරිවර්තනය කරනු ['abc', '_1', 'ghi', '_3']පද ඉවත්, 'def'(එම කටයුතු නිර්වචනය සඳහා වෙන් කළ වචනය නිසා) සහ අනුපිටපත් fieldname 'abc'.
  • verbose: වාචික නම් True, පන්ති අර්ථ දැක්වීම ගොඩනැගීමට පෙර මුද්‍රණය කෙරේ.

ඔබ තෝරා ගන්නේ නම්, ඔබට තවමත් නම් කර ඇති ස්ථාන වලට ඔවුන්ගේ ස්ථානය අනුව ප්‍රවේශ විය හැකිය. p[1] == p.saturation. එය තවමත් සාමාන්‍ය ටුපල් එකක් මෙන් ඉවත් කරයි.

ක්‍රම

සියලුම නිත්‍ය ටුපල් ක්‍රම සඳහා සහය දක්වයි. උදා: min (), max (), len (), in, in in, concatenation (+), index, slice, ආදිය. තවද නම් කිරීම සඳහා අමතර ඒවා කිහිපයක් තිබේ. සටහන: මේ සියල්ල ආරම්භ වන්නේ අවධාරනයකින් ය. _replace, _make, _asdict.

_replace නිශ්චිත ක්ෂේත්‍ර නව අගයන් සමඟ ප්‍රතිස්ථාපනය කිරීම නම් කරන ලද ටුපල්හි නව අවස්ථාවක් ලබා දෙයි.

සින්ටැක්ස්

somenamedtuple._replace(kwargs)

උදාහරණයක්

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

දැනුම්දීම : ක්ෂේත්‍ර නාම උපුටා දැක්වීම්වල නොමැත; ඒවා මෙහි මූලික වචන වේ. මතක තබා ගන්න : ටුපල්ස් වෙනස් කළ නොහැකි ය - ඒවා නම් කර තිබුණත් _replaceක්‍රමවේදය තිබුණත් . මෙම _replaceනිපදවන newඋදාහරණයක්; එය මුල් පිටපත වෙනස් නොකරයි හෝ පැරණි අගය ප්‍රතිස්ථාපනය නොකරයි. ඔබට නව ප්‍රති result ලය විචල්‍යයට සුරැකිය හැක.p = p._replace(hue=169)

_make

පවතින අනුක්‍රමයකින් හෝ නැවත කළ හැකි නව අවස්ථාවක් සාදයි.

සින්ටැක්ස්

somenamedtuple._make(iterable)

උදාහරණයක්

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

අන්තිම එකෙන් මොකද වුණේ? වරහන් තුළ ඇති අයිතමය නැවත කළ හැකි විය යුතුය. එබැවින් වරහන් තුළ ලැයිස්තුවක් හෝ ටුපල් එකක් ක්‍රියා කරයි, නමුත් සක්‍රිය කළ නොහැකි ලෙස අගයන් අනුක්‍රමණය කිරීමෙන් දෝෂයක් ලැබේ.

_asdict

ක්ෂේත්‍ර නාම ඒවායේ අනුරූප අගයන්ට අනුරූපණය කරන නව ඇණවුම් නියෝගයක් ලබා දෙයි.

සින්ටැක්ස්

somenamedtuple._asdict()

උදාහරණයක්

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

යොමුව : https://www.reddit.com/r/Python/comments/38ee9d/intro_to_namedtuple/

නම් කරන ලද ටුපල් හා විකෘති https://pypi.python.org/pypi/namedlist ට සමාන නම් සහිත ලැයිස්තුවක් ද ඇත


කෙසේ වෙතත්, PEP8 ට අනුව තනි අවධාරණයක් තමන්ගේම හැසිරීම් සහිත “දුර්වල” අභ්‍යන්තර භාවිතය ”දර්ශකයක් ලෙස සලකනු ලැබේ . ආරම්භ වන කාර්යයන් භාවිතා කිරීමේදී ප්‍රවේශම් වන්න _!
ජෙන්ස්

8

නම් කිරීම යනු කුමක්ද?

නමට අනුව, nametuple යනු නම සහිත ටුපල් ය. සම්මත ටුපල් වලදී, අපි දර්ශකය භාවිතා කරමින් මූලද්‍රව්‍යයන්ට ප්‍රවේශ වෙමු. මෙය සීඑස්වී (කොමාවෙන් වෙන් කළ අගය) ගොනු සැකසීම සහ සංකීර්ණ හා විශාල දත්ත කට්ටලයක් සමඟ වැඩ කිරීම ඉතා පහසුය, එහිදී දර්ශක භාවිතා කිරීමත් සමඟ කේතය අවුල් සහගත වේ (එතරම් පයිතොනික් නොවේ).

ඒවා භාවිතා කරන්නේ කෙසේද?

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

කියවීම

>>>#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 සැකසුම් පිළිබඳ සිත්ගන්නා සිදුවීම:

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

ඇතුළත පයිතන්හි ටුපල් නමින් හැඳින්වෙන බහාලුම් හොඳ භාවිතයක් ඇත, එය පන්තියේ අර්ථ දැක්වීමක් නිර්මාණය කිරීමට භාවිතා කළ හැකි අතර මුල් ටුපල්හි සියලු අංග ඇත.

සරල පංතියක් ජනනය කිරීම සඳහා නම් කරන ලද ටුපල් භාවිතා කිරීම සුපුරුදු පන්ති අච්චුවට කෙලින්ම යොදවනු ඇත, මෙම ක්‍රමය මඟින් කියවීමේ හැකියාව වැඩි දියුණු කිරීම සඳහා බොහෝ කේත වලට ඉඩ ලබා දෙන අතර පන්තියක් නිර්වචනය කිරීමේදී එයද ඉතා පහසු වේ.


2

නම් කරන ලද ටුපල් භාවිතා කිරීමට තවත් ක්‍රමයක් නම්, පැකේජය ටයිප් කිරීමෙන් නම් කළ ටුපල් භාවිතා කිරීමයි: නම් කළ ටුපල් හි ඉඟි ටයිප් කරන්න

එය භාවිතා කරන්නේ කෙසේදැයි බැලීමට මෙම ලිපියේ ඉහළ පිළිතුරේ උදාහරණය භාවිතා කරමු.

(1) නම් කරන ලද ටුපල් භාවිතා කිරීමට පෙර, කේතය මෙවැන්නකි:

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) දැන් අපි නම් කරන ලද ටුපල් භාවිතා කරමු

from typing import NamedTuple, Number

NamedTuple පන්තියට උරුම වී නව පන්තියේ විචල්‍ය නාමය අර්ථ දක්වන්න. පරීක්ෂණය යනු පන්තියේ නමයි.

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

පංතියෙන් අවස්ථා නිර්මාණය කර ඒවාට අගයන් පවරන්න

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

ගණනය කිරීම සඳහා අවස්ථාවන්හි විචල්යයන් භාවිතා කරන්න

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

1

මේක උත්සාහ කරන්න:

collections.namedtuple()

මූලික වශයෙන්, namedtuplesනිර්මාණය කිරීමට පහසු, සැහැල්ලු වස්තු වර්ග. ඔවුන් සරල කාර්යයන් සඳහා ටියුපල් පහසු බහාලුම් බවට පත් කරයි. සමඟ namedtuples, ඔබ ටුපල් සාමාජිකයින්ට ප්‍රවේශ වීම සඳහා පූර්ණ සංඛ්‍යා දර්ශක භාවිතා කළ යුතු නොවේ.

උදාහරණ:

කේතය 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

කේතය 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

අනෙක් සියල්ලන්ම දැනටමත් එයට පිළිතුරු දී ඇත, නමුත් මම සිතන්නේ මට තව යමක් එකතු කිරීමට තිබේ.

පංතියක් නිර්වචනය කිරීම සඳහා කෙටිමඟක් ලෙස නම් කළ ටුපල් සිතාමතාම සැලකිය හැකිය.

නිර්වචනය කිරීම සඳහා විකාර සහ සාම්ප්‍රදායික ක්‍රමයක් බලන්න a 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'

සම්බන්ධයෙන් 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
කණගාටුයි, නමුත් මෙය වැරදිය. ඇති නම් tuple ද මෙම පහසුකම් සපයයි: red_duck[0]හෝ len(red_duck)හෝ for x in red_duck: print(x). ඊට අමතරව, නම් කරන ලද ටුපල් වෙනස් කළ නොහැකි බැවින් මෙම මෙහෙයුම් අසාර්ථක වනු ඇත: red_duck[0] = 2, red_duck.foo = 'bar'. ඒවා වෙනස් කළ නොහැකි බැවින් නම් කරන ලද ටුපල් dictයතුරු ලෙස භාවිතා කළ හැකිය .
ඩෙනිල්සන් එස් මායා

ඔව්, එය මූලික කරුණු වේ.
කැල්කියුලස්

1
Aw ජාවා නැත, එය "මූලික කරුණු" නොවේ. නම් කරන ලද ටුපල්ස් සාමාන්‍ය පන්තිවලට වඩා සම්පූර්ණයෙන්ම වෙනස් ක්‍රියාකාරීත්ව කට්ටලයක් සඳහා සහාය වේ. සාරාංශයක් ලෙස ටුපල්ස් නම් පංතියක් වන අතර, එයින් අදහස් කරන්නේ පන්ති ටුපල් ලෙස නම් නොකරන බවයි.
connectyourcharger
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.