টিপলস নামকরণ কি?
একটি নামকরণ tuple একটি tuple হয়।
এটি একটি tuple করতে পারেন সবকিছু।
তবে এটি কেবল একটি টিপল ছাড়াও।
এটি একটি টিউপলের একটি নির্দিষ্ট সাবক্লাস যা নামকরণ ক্ষেত্র এবং একটি নির্দিষ্ট দৈর্ঘ্য সহ আপনার স্পেসিফিকেশনটিতে প্রোগ্রামগতভাবে তৈরি করা হয়।
এটি, উদাহরণস্বরূপ, টুপলের একটি সাবক্লাস তৈরি করে এবং স্থির দৈর্ঘ্য (এই ক্ষেত্রে তিনটি) বাদ দিয়ে, এটি যেখানেই ব্যবহৃত হয় বিনাশ ছাড়াই একটি টুপল ব্যবহৃত হয়। এটি লিসকভ সাবস্টিটিবিলিটি হিসাবে পরিচিত।
পাইথন ৩.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']
আরও গভীর ব্যাখ্যা
নামের টিপলগুলি বুঝতে, আপনাকে প্রথমে টিপল কী তা জানতে হবে। একটি টিপল মূলত একটি অপরিবর্তনীয় (স্মৃতিতে স্থান পরিবর্তন করা যায় না) তালিকা list
আপনি কীভাবে নিয়মিত টিপল ব্যবহার করতে পারেন তা এখানে:
>>> 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)
কেন / কখন নামযুক্ত টিপলগুলির পরিবর্তে আমার সাধারণ টিপলগুলি ব্যবহার করা উচিত?
নামযুক্ত টিপলসকে টিপলস থেকে ব্যবহার করে স্যুইচ করার পক্ষে এটি সম্ভবত একটি রিগ্রেশন হবে। টিউপলটি ব্যবহৃত হয় তখন জড়িত অতিরিক্ত কোডের ব্যয়টি উন্নত পাঠযোগ্যতার জন্য মূল্যযুক্ত কিনা এদিকে চারপাশে আপফ্রন্ট ডিজাইন সিদ্ধান্ত কেন্দ্র centers
টিউপলস বনাম টিপলস দ্বারা ব্যবহৃত কোনও অতিরিক্ত মেমরি নেই।
"নামযুক্ত তালিকাগুলি" (নামযুক্ত টুপলের একটি পরিবর্তনীয় সংস্করণ) কি কোনও ধরণের আছে?
আপনি এমন একটি স্লটেড অবজেক্টের সন্ধান করছেন যা স্ট্যাটিক্যালি মাপের তালিকার সমস্ত কার্যকারিতা কার্যকর করে বা একটি উপ-শ্রেণিবদ্ধ তালিকা যা নামকৃত টিপলের মতো কাজ করে (এবং এটি কোনওভাবে আকার পরিবর্তন হতে বাধা দেয়))
এটি এখন প্রসারিত, এবং সম্ভবত লিসকভেরও বিকল্পের প্রথমটির উদাহরণ:
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