2.8. الصفوف

الصف (tuple) هو تسلسل مرتّب وغير قابل للتغيير من القيم. وبمجرد إنشائه، لا يمكن إضافة العناصر بداخله أو إزالتها أو تغييرها.

2.8.1. إنشاء الصفوف

استخدم الأقواس (أو مجرد الفواصل) لإنشاء صف:

empty   = ()
point   = (3, 4)
triple  = 1, 2, 3                # parentheses are optional
mixed   = (1, "two", 3.14)
nested  = ((1, 2), (3, 4))

2.8.1.1. مطبّ العنصر الواحد

الأقواس حول قيمة هي مجرد أقواس؛ وما يصنع الصف فعلًا هو الفاصلة. فالصف ذو العنصر الواحد يحتاج إلى فاصلة لاحقة:

>>> (1)
1                                # just an int in parens
>>> (1,)
(1,)                             # a one-element tuple
>>> type((1)), type((1,))
(<class 'int'>, <class 'tuple'>)

2.8.2. الطول والفهرسة والتقطيع

مثل القوائم والسلاسل النصية -- len() والفهرسة والتقطيع و in و + / * كلها تعمل بالطريقة نفسها:

>>> point = (3, 4, 5)
>>> len(point)
3
>>> point[0]
3
>>> point[1:]
(4, 5)
>>> 4 in point
True
>>> (1, 2) + (3, 4)
(1, 2, 3, 4)

2.8.3. عدم القابلية للتغيير

الصفوف ليس لها append أو pop أو sort أو أي دالة أخرى في المكان. والإسناد المفهرس يثير TypeError:

>>> point = (3, 4)
>>> point[0] = 99
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object doesn't support item assignment

لـ"تعديل" صف، ابنِ صفًا جديدًا بالقيم المتغيرة.

2.8.4. التفكيك

القوة الخارقة الرئيسية للصف هي التفكيك: إسناد كل عنصر إلى متغير منفصل في عبارة واحدة.

A three-element tuple (1, 2, 3) unpacking into three named variables x, y, z.

يربط التفكيك كل عنصر من الصف بمتغير مسمّى في إسناد واحد.

>>> point = (3, 4)
>>> x, y = point
>>> x
3
>>> y
4

يمكن أن يكون الطرف الأيمن أي كائن قابل للتكرار -- قائمة، أو سلسلة نصية، أو القيمة المُعادة من دالة:

>>> a, b, c = "abc"
>>> a, b, c
('a', 'b', 'c')

* في المقدمة تجمع "البقية" من التفكيك في قائمة:

>>> first, *rest = [10, 20, 30, 40]
>>> first
10
>>> rest
[20, 30, 40]

2.8.5. قيم إرجاع متعددة

يمكن لدالة أن تُعيد صفًا لتسليم عدة قيم دفعة واحدة؛ ويفكّكها المستدعي عند الدخول:

def size_of(rect):
    return (rect[2] - rect[0], rect[3] - rect[1])

width, height = size_of((10, 20, 110, 140))
# width = 100, height = 120

الأقواس على return اختيارية -- فـ return a, b المجرّدة هي صف أيضًا.

2.8.6. الصف مقابل القائمة

دليل عملي لأيهما تختار:

  • الصف للبيانات ثابتة الشكل، التي غالبًا ما تكون غير متجانسة: نقاط (x, y)، وألوان (r, g, b)، وقيم إرجاع متعددة، ووسائط دوال مُحزّمة للاستخدام لاحقًا.

  • القائمة للبيانات متغيرة الطول، التي غالبًا ما تكون متجانسة: قائمة قياسات، أو طابور عناصر للمعالجة، أو أي شيء تتوقع الإلحاق إليه.

الصفوف أيضًا قابلة للتجزئة (طالما أن كل عنصر بداخلها قابل للتجزئة)، لذا يمكن استخدامها كمفاتيح في dict.