Kodax

Tuples (الصفوف) — هياكل البيانات

الصفوف (Tuples)

الـ tuple مثل القائمة: مجموعة مرتبة يمكن الوصول لعناصرها بالفهرس. الفرق الجوهري أنها غير قابلة للتعديل بعد إنشائها.

point = (3, 5)
point[0]        # 3
point[0] = 10   # TypeError: 'tuple' object does not support item assignment

لماذا نريد شيئاً لا يتغير؟

- التعبير عن النية: إحداثيات نقطة أو تاريخ (سنة، شهر، يوم) قيمة واحدة مركبة لا يجب أن يتغير جزء منها بالخطأ.

- مفاتيح القواميس: المفتاح يجب أن يكون غير قابل للتعديل، لذلك يمكن استخدام tuple مفتاحاً ولا يمكن استخدام list.

- إرجاع عدة قيم من دالة: return a, b ترجع tuple.

الإنشاء

t = (1, 2, 3)
t = 1, 2, 3       # الأقواس اختيارية، الفاصلة هي ما يصنع الـ tuple
single = (5,)     # عنصر واحد: الفاصلة ضرورية
not_tuple = (5)   # هذا مجرد الرقم 5
empty = ()

التفكيك (Unpacking)

من أكثر الميزات استخداماً في Python:

x, y = (3, 5)
a, b = 1, 2
name, age, city = ("منى", 21, "البصرة")
a, b = b, a            # تبديل قيمتين في سطر واحد
first, *rest = [1, 2, 3, 4]   # first=1, rest=[2, 3, 4]

عدد المتغيرات يجب أن يساوي عدد العناصر (إلا مع *)، وإلا تحصل على ValueError.

العمليات المتاحة

الفهرسة، التقطيع، len، in، الدمج +، التكرار *، و count() و index(). أما append و remove فغير موجودة لأنها تعدّل.

List أم Tuple؟

| استخدم list | استخدم tuple |

|---|---|

| مجموعة عناصر متشابهة يتغير عددها (قائمة طلاب) | قيمة مركبة ثابتة البنية (نقطة، لون RGB) |

| تحتاج إضافة وحذف | تحتاج مفتاح قاموس أو حماية من التعديل |

ملاحظة دقيقة

الـ tuple نفسها لا تتغير، لكن إذا احتوت قائمة، فالقائمة الداخلية يمكن تعديلها: t = ([1], 2) ثم t[0].append(9) مسموح.

تمرين

اكتب دالة stats(numbers) ترجع tuple فيها (الأصغر، الأكبر، المتوسط)، وفكّكها في ثلاثة متغيرات. ثم أنشئ قاموساً مفاتيحه إحداثيات (x, y) وقيمه أسماء أماكن.

# إنشاء tuple
coordinates = (10, 20)
colors = ("أحمر", "أخضر", "أزرق")
single = (42,)  # الفاصلة مهمة لعنصر واحد!

# الوصول للعناصر
print(coordinates[0])  # 10
print(colors[-1])      # أزرق

# Tuple unpacking
x, y = coordinates
print(f"x={x}, y={y}")

# Unpacking متقدم
first, *rest = (1, 2, 3, 4, 5)
print(first)  # 1
print(rest)   # [2, 3, 4, 5]

# Tuple في دالة
def get_min_max(numbers):
    return min(numbers), max(numbers)

minimum, maximum = get_min_max([5, 2, 8, 1, 9])
print(f"Min: {minimum}, Max: {maximum}")

# Tuple كمفتاح قاموس
locations = {
    (0, 0): "البداية",
    (10, 5): "الوسط",
    (20, 10): "النهاية"
}
print(locations[(10, 5)])  # الوسط

# العمليات على Tuples
t1 = (1, 2, 3)
t2 = (4, 5, 6)
print(t1 + t2)      # (1, 2, 3, 4, 5, 6)
print(t1 * 2)       # (1, 2, 3, 1, 2, 3)
print(len(t1))      # 3
print(2 in t1)      # True
print(t1.count(2))  # 1
print(t1.index(2))  # 1

# تحويل
list_data = [1, 2, 3]
tuple_data = tuple(list_data)
back_to_list = list(tuple_data)
اختبر فهمك