في Python، يُعدّ الصف مجموعة غير قابلة للتغيير من العناصر في تسلسل.
وكمعظم المجموعات، يمكن لـtuples أن تحتوي على أي نوع (أو أنواع متعددة) من البيانات، بما في ذلك tuples أخرى.
تدعم الصفوف جميع عمليات التسلسل الشائعة، لكنها لا تدعم عمليات التسلسل القابلة للتغيير.
يمكن تكرار المرور على عناصر الصف باستخدام بنية for item in <tuple>.
وإذا احتجت إلى كلٍّ من فهرس العنصر وقيمته، يمكنك استخدام for index, item in enumerate(<tuple>).
وكأي تسلسل، يمكن الوصول إلى عناصر tuples عبر الترميز بالأقواس المربعة باستخدام رقم 0-based index من اليسار أو رقم -1-based index من اليمين.
كما يمكن نسخ الصفوف كاملة أو جزئية باستخدام ترميز الشرائح (<tuple>[<start>:<stop>:<step>]).
يمكن إنشاء الصفوف بطرق متعددة، إما باستخدام مُنشئ الصنف tuple(<iterable>) أو التعريف الحرفي tuple.
tuple() فارغًا أو مع قابل للتكرار:>>> no_elements = tuple()
()
# The constructor *requires* an iterable, so single elements must be passed in a list or another tuple.
>>> one_element = tuple([16])
(16,)
السلاسل النصية قابلة للتكرار، لذا فإن استخدام str واحدة كوسيط إلى مُنشئ tuple() قد يُنتج نتائج مفاجئة:
# String elements (characters) are iterated through and added to the tuple
>>> multiple_elements_string = tuple("Timbuktu")
('T', 'i', 'm', 'b', 'u', 'k', 't', 'u')
عندما يكون لديك قابل للتكرار مفرد، تُضاف عناصره واحدًا تلو الآخر:
>>> multiple_elements_list = tuple(["Parrot", "Bird", 334782])
("Parrot", "Bird", 334782)
>>> multiple_elements_set = tuple({2, 3, 5, 7, 11})
(2,3,5,7,11)
نظرًا لأن مُنشئ tuple(<iterable>) لا يقبل سوى الكائنات القابلة للتكرار (أو لا شيء) كوسائط، فمن الأسهل بكثير إنشاء صف من عنصر واحد عبر الأسلوب الحرفي.
>>> no_elements = ()
()
>>> one_element = ("Guava",)
("Guava",)
يمكن تضمين بنى بيانات متداخلة كعناصر داخل tuple، بما في ذلك tuples أخرى:
>>> nested_data_structures = ({"fish": "gold", "monkey": "brown", "parrot" : "grey"}, ("fish", "mammal", "bird"))
({"fish": "gold", "monkey": "brown", "parrot" : "grey"}, ("fish", "mammal", "bird"))
>>> nested_data_structures_1 = (["fish", "gold", "monkey", "brown", "parrot", "grey"], ("fish", "mammal", "bird"))
(["fish", "gold", "monkey", "brown", "parrot", "grey"], ("fish", "mammal", "bird"))
يمكن دمج الصفوف باستخدام عامل الجمع +، الذي يفكّ كل tuple لإنشاء tuple جديد مدمج.
>>> new_via_concatenate = ("George", 5) + ("cat", "Tabby")
("George", 5, "cat", "Tabby")
#likewise, using the multiplication operator * is the equivalent of using + n times
>>> first_group = ("cat", "dog", "elephant")
>>> multiplied_group = first_group * 3
('cat', 'dog', 'elephant', 'cat', 'dog', 'elephant', 'cat', 'dog', 'elephant')
يمكن الوصول إلى العناصر داخل tuple عبر الترميز بالأقواس المربعة باستخدام رقم 0-based index من اليسار أو رقم -1-based index من اليمين.
student_info = ("Alyssa", "grade 3", "female", 8 )
#gender is at index 2 or index -2
>>> student_gender = student_info[2]
'female'
>>> student_gender = student_info[-2]
'female'
#name is at index 0 or index -4
>>> student_name = student_info[0]
Alyssa
>>> student_name = student_info[-4]
Alyssa
يمكن التكرار على العناصر داخل tuple في حلقة باستخدام صيغة for item in <tuple>.
وإذا احتجت إلى كلٍّ من الفهارس والقيم، يمكنك استخدام for index, item in enumerate(<tuple>).
>>> student_info = ("Alyssa", "grade 3", "female", 8 )
>>> for item in student_info:
... print(item)
...
Alyssa
grade 3
female
8
>>> for index, item in enumerate(student_info):
... print("Index is: " + str(index) + ", value is: " + str(item) +".")
...
Index is: 0, value is: Alyssa.
Index is: 1, value is: grade 3.
Index is: 2, value is: female.
Index is: 3, value is: 8.
يمكن استخدام عامل in للتحقق من العضوية في tuple.
>>> multiple_elements_list = tuple(["Parrot", "Bird", 334782])
("Parrot", "Bird", 334782)
>>> "Parrot" in multiple_elements_list
True
آزارا وروي زميلان في فريق يتنافسان في مسابقة للبحث عن الكنز بطابع القراصنة. إحداهما لديها قائمة بالكنوز مع إحداثياتها على الخريطة، والأخرى لديها قائمة بأسماء المواقع مع إحداثياتها على الخريطة. وقد حصلتا أيضًا على خرائط فارغة تحمل علامة لنقطة البداية مكتوب عليها «أنت هنا».
| قائمة آزارا | قائمة روي | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
لكن الأمور غير منظمة بعض الشيء: يبدو أن إحداثيات آزارا منسّقة ومرتبة بشكل مختلف عن إحداثيات روي، وعليهما مواصلة التنقل بين القائمتين لمعرفة أي الكنوز تنتمي إلى أي المواقع. وبما أنهما من محبي Python الناشئين، فقد لجآ إليك طلبًا للمساعدة في كتابة برنامج صغير (مجموعة دوال في الحقيقة) لتنظيم معلومات رحلة البحث بشكل أفضل.
نفّذ الدالة get_coordinate() التي تأخذ زوجًا (treasure, coordinate) من قائمة آزارا وتُرجع إحداثي الخريطة المستخرج فقط.
>>> get_coordinate(('Scrimshawed Whale Tooth', '2A'))
2A
نفّذ الدالة convert_coordinate() التي تأخذ إحداثيًا بالصيغة "2A" وتُرجع صفًا بالصيغة ("2", "A").
>>> convert_coordinate("2A")
("2", "A")
نفّذ الدالة compare_records() التي تأخذ زوجًا (treasure, coordinate) وسجلًا (location, coordinate, quadrant) وتقارن الإحداثيات في كل منهما.
أعِد True إذا تطابقت الإحداثيات، وأعِد False إذا لم تتطابق.
أعِد تنسيق الإحداثيات حسب الحاجة لإجراء مقارنة دقيقة.
>>> compare_records(('Brass Spyglass', '4B'), ('Seaside Cottages', ('1', 'C'), 'blue'))
False
>>> compare_records(('Model Ship in Large Bottle', '8A'), ('Harbor Managers Office', ('8', 'A'), 'purple'))
True
نفّذ الدالة create_record() التي تأخذ زوجًا (treasure, coordinate) من قائمة آزارا وسجلًا (location, coordinate, quadrant) من قائمة روي وتُرجع (treasure, coordinate, location, coordinate, quadrant) إذا تطابقت الإحداثيات.
إذا لم تتطابق الإحداثيات، فأعِد السلسلة النصية "not a match".
أعِد تنسيق الإحداثي حسب الحاجة لإجراء مقارنة دقيقة.
>>> create_record(('Brass Spyglass', '4B'), ('Abandoned Lighthouse', ('4', 'B'), 'Blue'))
('Brass Spyglass', '4B', 'Abandoned Lighthouse', ('4', 'B'), 'Blue')
>>> create_record(('Brass Spyglass', '4B'), ('Seaside Cottages', ('1', 'C'), 'blue'))
"not a match"
نظّف السجلات المدموجة من آزارا وروي بحيث تبقى مجموعة واحدة فقط من الإحداثيات في كل سجل. وأعِدّ تقريرًا حتى يتمكنا من رؤية قائمة واحدة بكل ما يحتاجان إلى وضعه على خريطتيهما.
نفّذ الدالة clean_up() التي تأخذ صفًا من الصفوف (كل شيء من القائمتين)، وتمر عبر الصف الخارجي، وتُسقط الإحداثيات غير المرغوبة من كل صف داخلي، وتضيف كل سجل إلى «تقرير».
نسّق «التقرير» وأعِده بحيث يظهر سجل منظّف واحد في كل سطر.
>>> clean_up((('Brass Spyglass', '4B', 'Abandoned Lighthouse', ('4', 'B'), 'Blue'), ('Vintage Pirate Hat', '7E', 'Quiet Inlet (Island of Mystery)', ('7', 'E'), 'Orange'), ('Crystal Crab', '6A', 'Old Schooner', ('6', 'A'), 'Purple')))
"""
('Brass Spyglass', 'Abandoned Lighthouse', ('4', 'B'), 'Blue')\n
('Vintage Pirate Hat', 'Quiet Inlet (Island of Mystery)', ('7', 'E'), 'Orange')\n
('Crystal Crab', 'Old Schooner', ('6', 'A'), 'Purple')\n
"""
سجّل في Exercism لتتعلّم وتتقن Python عبر 17 مفهومًا146 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.