الصف هو تجميعة غير قابلة للتغيير من العناصر في تسلسل.
مثل معظم التجميعات (انظر إلى الأنواع المدمجة list وdict وset)، يمكن أن تحتوي tuples أي نوع (أو أنواعًا متعددة) من البيانات، بما في ذلك tuples أخرى.
يمكن التكرار على عناصر الصف باستخدام البنية for item in <tuple>.
وإذا كنت تحتاج إلى كل من فهرس العنصر وقيمته، فيمكنك استخدام for index, item in enumerate(<tuple>).
مثل أي تسلسل، يمكن الوصول إلى العناصر داخل tuples عبر ترميز الأقواس المربعة باستخدام رقم 0-based index من اليسار أو رقم -1-based index من اليمين.
ويمكن نسخ الصفوف كاملة أو جزئيًا عبر ترميز الشرائح أو <tuple>.copy()، وتدعم tuples كل عمليات التسلسل الشائعة.
ولأنها غير قابلة للتغيير، فإن tuples لا تدعم عمليات التسلسل القابلة للتغيير.
تشغل الصفوف مساحة ذاكرة صغيرة جدًا مقارنة بأنواع التجميعات الأخرى، وزمن الوصول فيها ثابت (O(1)) عند استخدام فهرس.
غير أنها لا يمكن تغيير حجمها أو ترتيبها أو تعديلها بعد إنشائها، لذا فهي أقل مرونة عند الحاجة إلى تغييرات أو تحديثات متكررة على البيانات.
وإذا كنت بحاجة إلى تحديثات أو توسعات متكررة، فقد تكون list أو collections.deque أو array.array بنية بيانات أفضل.
يمكن إنشاء الصفوف بطرق متعددة، إما باستخدام مُنشئ الصنف tuple أو بالتعريف (<element_1>, <element_2>) (الصف الحرفي).
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)
التكرار الافتراضي على dict يكون على المفاتيح.
ولتضمين كل من المفاتيح والقيم في صف مُنشأ من قاموس، استخدم <dict>.items()، التي ستُرجع مكرِّرًا من tuples بالشكل (key, value).
>>> source_data = {"fish": "gold", "monkey": "brown"}
>>> multiple_elements_dict_1 = tuple(source_data)
('fish', 'monkey')
>>> multiple_elements_dict_2 = tuple(source_data.items())
(('fish', 'gold'), ('monkey', 'brown'))
ولأن مُنشئ tuple() لا يأخذ إلا كائنات قابلة للتكرار (أو لا شيء) كوسائط، فمن الأسهل بكثير إنشاء صف من عنصر واحد بالطريقة الحرفية.
>>> no_elements = ()
()
>>> one_element = ("Guava",)
("Guava",)
لاحظ أن الأقواس الهلالية ليست مطلوبة عمومًا لإنشاء tuple بالطريقة الحرفية، بل الفواصل فقط.
غير أن استخدام (<element_1>, <element_2>) يُعد أكثر وضوحًا في معظم الحالات.
وتلزم الأقواس الهلالية أيضًا في حالات الالتباس، مثل صف فارغ أو صف من عنصر واحد، أو عندما تأخذ دالة صفًا كوسيط.
>>> elements_separated_with_commas = "Parrot", "Bird", 334782
("Parrot", "Bird", 334782)
>>> elements_with_commas_and_parentheses = ("Triangle", 60, 60, 60)
("Triangle", 60, 60, 60)
يمكن تضمين بنى بيانات أخرى كعناصر في 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')
يمكن الوصول إلى العناصر داخل الصفوف (مثل نوعي التسلسل الآخرين str وlist) عبر ترميز الأقواس المربعة.
ويمكن أن تكون الفهارس من left --> right (بدءًا من الصفر) أو من right --> left (بدءًا من -1).
ويمكن أيضًا نسخ الصفوف كاملة أو جزئيًا عبر ترميز الشرائح أو باستخدام <tuple>.copy().
>>> student_info = ("Alyssa", "grade 3", "female", 8)
#name is at index 0 or index -4
>>> student_name = student_info[0]
Alyssa
>>> student_name = student_info[-4]
Alyssa
#age is at index 3 or index -1
>>> student_age_1 = student_info[3]
8
>>> student_age_2 = student_info[-1]
8
يمكن التكرار على العناصر داخل الصفوف في حلقة باستخدام الصيغة 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.
غالبًا ما تُستخدم الصفوف كـ_سجلات_ تحتوي بيانات متجانسة تنظيميًا أو مفاهيميًا وتُعامل كوحدة معلومات واحدة، حتى لو كانت العناصر الفردية من أنواع بيانات غير متجانسة.
>>> student_info = ("Alyssa", "grade 3", "female", 8)
وتُستخدم الصفوف أيضًا عندما نحتاج إلى تسلسلات متجانسة غير قابلة للتغيير من البيانات من أجل hashability، أو التخزين في set، أو إنشاء مفاتيح في قاموس.
لاحظ أنه رغم أن tuples غير قابلة للتغيير في معظم الحالات، فبما أنها قد تحتوي أي بنية بيانات أو كائن، فقد تصبح قابلة للتغيير إذا كان أي من عناصرها من نوع قابل للتغيير.
واستخدام نوع بيانات قابل للتغيير داخل tuple يجعله غير قابل للتجزئة.
>>> cmyk_color_map = {
(.69, .3, .48, .1) : ("Teal 700", (59, 178, 146), 0x3BB292),
(0, .5, 1, 0) : ("Pantone 151", (247, 127, 1), 0xF77F01),
(.37, .89, 0, .44) : ("Pantone 267", (89, 16, 142), 0x59108E),
(0, 1, .46, .45) : ("Pantone 228", (140, 0, 76), 0x8C004C)
}
>>> unique_rgb_colors = {
(59, 178, 146),
(247, 127, 1),
(89, 16, 142),
(140, 0, 76),
(76, 0, 140)
}
>>> teal_700 = hash((59, 178, 146))
>>> teal_700 = hash(("Pantone 228", [(140, 0, 76), 0x8C004C]))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
غالبًا ما تُستخدم الصفوف كـ_سجلات_، لكن لا يمكن الوصول إلى البيانات داخلها إلا عبر الموضع/الفهرس.
ويوسّع الصنف namedtuple() في وحدة collections وظائف الصف الأساسية للسماح بالوصول إلى العناصر بالـ_اسم_.
وبالإضافة إلى ذلك، يمكن للمستخدمين تكييف dataclass لتوفير وظائف سمات مسمّاة مشابهة، مع بعض الإيجابيات والسلبيات.