logo

NamedTuple في بايثون

في بايثون، هناك نوع 'خاص' من الصف يسمى 'المسمى صف'. غالبًا ما يشعر مبتدئو بايثون بالحيرة حيال ذلك، خاصة متى ولماذا يجب علينا تنفيذه.

نظرًا لأن NamedTuple عبارة عن صف، فيمكنه تنفيذ جميع الوظائف التي يمكن أن يؤديها الصف. ومع ذلك، فهي أكثر من مجرد صف بايثون بسيط. في لغات الكمبيوتر الأخرى، تمامًا كما هو الحال مع لغة C++، فهي تشبه إلى حد كبير 'الفئة'. إنه نوع فرعي من الصف مع حقول محددة وطول محدد تم تصميمه برمجيًا وفقًا لمواصفاتنا. سيشرح هذا البرنامج التعليمي Python NamedTuples ويوضح كيفية استخدامها ومتى ولماذا يجب علينا استخدامها.

ما هو بايثون Tuple؟

نعتقد أننا يجب أن نعيد النظر في الصفوف في بايثون قبل المتابعة.

الصف في لغة بايثون عبارة عن حاوية يمكنها تخزين العديد من القيم. النظر في الحالة التالية.

شفرة

 numbers = (34, 32, 56, 24, 75, 24) 

وكما نرى، فإننا نستخدم الأقواس لتعريفه. يتم استخدام الفهارس للوصول إلى العناصر. (ضع في اعتبارك أن الفهرسة في بايثون تبدأ من الصفر.)

شفرة

 numbers[1] 

انتاج:

 32 

يتم فصل صف الأرقام[1] في بايثون بحقيقة أننا لا نستطيع تعديل عناصره، أي أن عناصر الصف غير قابلة للتغيير.

بايثون NamedTuple بناء الجملة

يجب علينا أولاً استيراد NamedTuple من الوحدة المدمجة في بايثون والتي تسمى المجموعات، كما هو موضح:

 from collections import namedtuple 

ما يلي هو بناء الجملة الأساسي لإنشاء NamedTuple:

 namedtuple(Name,[Names of Values]) 

اسم إنها المعلمة الخاصة بالعنوان الذي نريد أن نعطيه NamedTuple، و

[أسماء القيم] هو عنصر نائب للقائمة التي تحتوي على أسماء القيم أو السمات المختلفة.

مثال بايثون المسمى Tuple

الخطوة الأولى، كما قلنا سابقًا، هي استيراد NamedTuple.

 from collections import namedtuple 

يمكننا الآن استخدام بناء الجملة من الجزء السابق لإنشاء NamedTuple:

 Student = namedtuple('Student',['Name','Class','Age','Subject','Marks']) 

في هذا المثال،

حرف إلى سلسلة

نختار استدعاء NamedTuple Student ونذكر أسماء القيم، 'الاسم'، و'الفصل'، و'العمر'، و'الموضوع'، و'العلامات' في القائمة. وقمنا بإنشاء أول NamedTuple - Student.

الآن يمكننا إنشاء منزل Student1 بالمواصفات المطلوبة باستخدام Student كما يلي:

شريحة مجموعة جافا
 Studnet1 = Student('Itika', 11, 15, 'English', 79) 

مطلوب فقط القيم أو المحتوى المحدد الذي يجب أن تحتويه التسميات أو الحقول في [أسماء القيم] الخاصة بنا.

لإجراء إدخال لطالب جديد، على سبيل المثال Student2، انسخ قيمه والصقها في حقول المتغير الجديد.

 Studnet2 = Student('Arshia', 12, 17, 'Maths', 93) 

سنرى أنه يمكننا استخدام الطالب كمخطط لتسجيل الطلاب الجدد كما نريد دون الحاجة إلى استدعاء تسميات الحقول في كل مرة.

كيفية الحصول على قيم NamedTuple باستخدام التدوين النقطي

يمكننا استخدام طريقة النقطة للحصول على قيم مثيلات NamedTuple Student1 وStudent2. وفيما يلي بناء الجملة:

 . 

يوضح نموذج التعليمات البرمجية التالي هذا:

شفرة

 print (Student1.Age) print (Student1.Class) print (Student1.Subject) print (Student1.Marks) print (Student1.Name) 

انتاج:

 15 11 'English' 79 'Itika' 

وبالمثل، يمكننا استرداد المتغيرات المتعلقة بـ NamedTuple Student2 باستخدام Student2.Age، وStudent2.Class، وما إلى ذلك.

طرق الوصول إلى NamedTuple

يمكننا استرداد القيم من NamedTuple باستخدام المؤشرات والكلمات الأساسية والدالة getattr(). يتم ترتيب قيم حقل NamedTuple بشكل صارم. ونتيجة لذلك، قد نستخدم المؤشرات للعثور عليها.

يتم تحويل أسماء الحقول إلى سمات بواسطة NamedTuple. ونتيجة لذلك، يمكن استخدام getattr() لاسترداد البيانات من هذا الحقل.

شفرة

 import collections #create employee NamedTuple Participant = collections.namedtuple('Participant', ['Name', 'Age', 'Country']) #Adding two participants p1 = Participant('Itika', '21', 'India') p2 = Participant('Arshia', '19', 'Australia') #Accessing the items using index print( 'The name and country of the first participant are: ' + p1[0] + ' and ' + p1[2]) #Accessing the items using name of the field print( 'The name and country of the second participant are: ' + p2.Name + ' and ' + p2.Country) #Accessing the items using the method: getattr() print( 'The Age of participant 1 and 2 are: ' + getattr(p1, 'Age') + ' and ' + getattr(p2, 'Age')) 

انتاج:

 The name and country of the first participant are: Itika and India The name and country of the second participant are: Arshia and Australia The Age of participant 1 and 2 are: 21 and 19 

إجراءات تحويل NamedTuple

يمكن تحويل مجموعات مختلفة إلى NamedTuple باستخدام بعض التقنيات. يمكننا أيضًا استخدام الدالة _make() لتحويل قائمة أو مجموعة أو كائنات أخرى قابلة للتكرار إلى مثيل NamedTuple.

يمكننا أيضًا تحويل كائن نوع بيانات القاموس إلى مجموعة NamedTuple. العامل ** مطلوب لهذا التحويل.

باعتباره عنصرًا من نوع بيانات OrderedDict، يمكن لـ NamedTuple إنتاج عناصر باستخدام مفاتيحه. يمكننا استدعاء الدالة _asdict() لتحويلها إلى OrderedDict.

شفرة

 import collections #create employee NamedTuple Participant = collections.namedtuple('Participant', ['Name', 'Age', 'Country']) #List to Participants list_ = ['Itika', '21', 'India'] p1 = Participant._make(list_) print(p1) #Dict to convert Employee dict_ = {'Name':'Arshia', 'Age' : '19', 'Country' : 'Australia'} p2 = Participant(**dict_) print(p2) #Displaying the namedtuple as dictionary participant_dict = p1._asdict() print(participant_dict) 

انتاج:

 Participant(Name='Itika', Age='21', Country='India') Participant(Name='Arshia', Age='19', Country='Australia') {'Name': 'Itika', 'Age': '21', 'Country': 'India'} 

المزيد من العمليات على NamedTuple

تتوفر طرق أخرى، مثل _fields() و_replace. يمكننا تحديد الحقول التي يحتوي عليها NamedTuple عن طريق استدعاء الدالة _fields() . يتم استخدام الدالة _replace() لتبديل قيمة بأخرى.

شفرة

 import collections #create employee NamedTuple Participant = collections.namedtuple('Participant', ['Name', 'Age', 'Country']) #List to Participants p1 = Participant('Itika', '21', 'India') print(p1) print('The fields of Participant: ' + str(p1._fields)) #updating the country of participant p1 p1 = p1._replace(Country = 'Germany') print(p1) 

انتاج:

 Participant(Name='Itika', Age='21', Country='India') The fields of Participant: ('Name', 'Age', 'Country') Participant(Name='Itika', Age='21', Country='Germany') 

كيف يعمل NamedTuple في بايثون؟

دعونا نلقي نظرة على ما يمكننا تحقيقه باستخدام NamedTuple في بايثون.

1. إن NamedTuple في بايثون غير قابل للتغيير.

لا يمكن تعديل NamedTuple في لغة Python، تمامًا مثل نسختها العادية. نحن غير قادرين على تغيير خصائصه.

جافا يلقي في السلسلة

سنحاول تعديل إحدى خصائص صف من اسم 'الطالب' لتوضيح ذلك.

شفرة

 from collections import namedtuple Student = namedtuple('Student',['Name','Class','Age','Subject','Marks']) Student1 = Student('Arshia', 12, 17, 'Maths', 93) Student1.Class = 11 

انتاج:

 AttributeError Traceback (most recent call last) Input In [41], in () 2 Student = namedtuple('Student',['Name','Class','Age','Subject','Marks']) 3 Student1 = Student('Arshia', 12, 17, 'Maths', 93) ----> 4 Student1.Class = 11 AttributeError: can't set attribute 

كما ترون، فإنه يلقي خطأ في السمة. ونتيجة لذلك، يمكننا أن نستنتج أن NamedTuple غير قابل للتغيير.

2. إنشاء قاموس بايثون من بايثون NamedTuple

في Python، NamedTuple يشبه القاموس، ويمكننا تحويله إلى واحد عن طريق:

شفرة

 from collections import namedtuple Student = namedtuple('Student',['Name','Class','Age','Subject','Marks']) Student1 = Student('Arshia', 12, 17, 'Maths', 93) print ( Student1._asdict() ) 

انتاج:

 {'Name': 'Arshia', 'Class': 12, 'Age': 17, 'Subject': 'Maths', 'Marks': 93} 

نحن نستخدم. طريقة asdict () لهذا الغرض. ينتج عن هذا أيضًا Python OrderedDict.

3. NamedTuple مع القيم الافتراضية

يمكن تكوين فئة صفية مسماة باستخدام المعلمات الافتراضية بنفس الطريقة التي يمكننا بها تعيين القيم الأولية للسمات في فئة عادية. يتم تعيين الإعدادات الافتراضية للسمات الموجودة في أقصى اليمين نظرًا لأن الحقول التي لها قيمة افتراضية يجب أن تظهر بعد كل حقل بدون قيمة افتراضية.

دعونا نعيد تعريف فئة الطالب بإدخال افتراضي واحد فقط.

شفرة

 from collections import namedtuple Student = namedtuple('Student', ['Name','Class','Age','Subject','Marks'], defaults = [100]) Student1 = Student('Arshia', 12, 17, 'Maths') print ( Student1 ) 

انتاج:

 Student(Name='Arshia', Class=12, Age=17, Subject='Maths', Marks=100) 

سيتم تطبيق الرقم الافتراضي 100 على العلامات، وهو الحقل الموجود في أقصى اليمين في إعلاننا إذا قمنا بإنشاء NamedTuple بقيمة واحدة فقط.

هل سيتم تطبيق القيمة الافتراضية للعمر إذا حددنا صراحةً الحقل ليكون 'العمر'؟

شفرة

فرز قائمة الصفيف Java
 from collections import namedtuple Student = namedtuple('Student', ['Name','Class','Age','Subject','Marks'], defaults = [100]) Student1 = Student('Arshia', 12, 17, 'Maths') Student1 = Student(Age = 18) print ( Student1 ) 

انتاج:

 TypeError: Student.__new__() missing 3 required positional arguments: 'Name', 'Class', and 'Subject' 

الجواب هو لا. في NamedTuple، ترتيب الحقول صارم جدًا. حتى لو أعلنا عن أي شيء صراحةً، فإن القيم الافتراضية يجب أن تكون في أقصى اليمين لمنع الغموض والصعوبات المحتملة.

فوائد بايثون Namedtuple

بالطبع، لن يستخدم أحد NamedTuple إذا لم يرَ أي مزايا. إذن، إليك ما لدينا:

1. على عكس الصف القياسي، يمكن لـ NamedTuple في بايثون استرداد المتغيرات حسب عناوينها.

شفرة

 from collections import namedtuple Student = namedtuple('Student', ['Name','Class','Age','Subject','Marks'], defaults = [100]) Student1 = Student('Arshia', 12, 17, 'Maths') print ( Student1.Age ) 

انتاج:

 17 

2. نظرًا لأنها لا تتضمن قواميس لكل مثيل، فإن Python NamedTuple فعال في الذاكرة تمامًا مثل الصف التقليدي. كما أنه أسرع من القاموس لهذا السبب.

خاتمة

لقد تعلمنا كيف تتيح لنا NamedTuples الجمع بين فوائد كل من الصفوف والقواميس، وكيفية إنشاء NamedTuples، وكيفية استخدامها في هذا البرنامج التعليمي. كيفية استرجاع قيم NamedTuples باستخدام التدوين النقطي في بايثون، وكيفية عملها

إذا كان القارئ على دراية بـ Python OOP، فسوف يرى أن هذا مطابق لكيفية عمل فئات Python. تعمل الفئة وسماتها كمخطط لإنشاء العديد من الكائنات أو المثيلات، ولكل منها مجموعتها الخاصة من قيم السمات.

ومع ذلك، لزيادة وضوح الكود الخاص بنا، فإن تحديد فئة وتوفير الخصائص الأساسية يعد أمرًا مفرطًا عادةً، ويكون إنشاء NamedTuples أسرع بكثير بدلاً من ذلك.