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)اختبر فهمك