› كل الدروس
الدرس 10 من 12 24 دقيقة

Tuples

بيانات مقفولة — مش هتتغيّر بالغلط

الفكرة باختصار

tuple زي list بالظبط، بفرق واحد: بعد ما تتعمل مينفعش تتغيّر أبدًا.

بعد الدرس ده هتعرف

  • تفرّق بين tuple و list وتعرف تختار
  • تفك tuple في variables في سطر واحد
  • ترجّع أكتر من value من function
  • تستخدم tuple كـ key في dictionary
1

شوف الفكرة الأول

قبل أي code — افهم بيحصل إيه

2

الشرح

فكرة واحدة في كل خطوة

1

الشكل والفرق

list بأقواس مربعة []، وtuple بأقواس عادية ().

القراءة والتقطيع واللف — كلهم نفس الحاجة بالظبط.

الفرق الوحيد: list بتتغيّر، وtuple لأ.

Python
1point = (3, 7)
2print(point[0])
3print(len(point))
4for x in point:
5 print(x)
الناتج
3
2
3
7
2

جرّب تغيّره — هيرفض

لو حاولت تعدّل item في tuple، Python هترفض بـ TypeError.

ودي ميزة مش عيب: معناها إن البيانات محمية من التغيير بالغلط.

Python
1point = (3, 7)
2point[0] = 10
3

ليه نستخدمه أصلاً؟

1. أمان — لو البيانات المفروض ما تتغيّرش (إحداثيات، تاريخ، إعدادات)، tuple بيمنع أي غلطة.

2. أسرع وأخف — بياخد ذاكرة أقل من list.

3. ينفع يبقى key في dictionary — و list لأ.

القاعدة العملية: مجموعة بتتغيّر → list. مجموعة ثابتة → tuple.

Python
1locations = {(30.0, 31.2): "Cairo", (31.2, 29.9): "Alexandria"}
2print(locations[(30.0, 31.2)])
الناتج
Cairo
4

الفك (unpacking) — أحلى حاجة فيه

تقدر توزّع items tuple على variables في سطر واحد.

عدد variables لازم يساوي عدد items بالظبط.

Python
1point = (3, 7)
2x, y = point
3print(f"x={x}, y={y}")
4
5a, b = 1, 2
6a, b = b, a
7print(a, b)
الناتج
x=3, y=7
2 1
5

function ترجّع أكتر من value

function بترجّع value واحدة بس. بس لو رجّعت tuple، فعليًا بترجّع كذا value مع بعض.

ودي الطريقة العادية في Python — مش حيلة.

Python
1def stats(nums):
2 return min(nums), max(nums), sum(nums)/len(nums)
3
4low, high, avg = stats([80, 95, 72])
5print(f"min {low} · max {high} · avg {avg:.1f}")
الناتج
min 72 · max 95 · avg 82.3
6

مع dictionaries

.items() أصلاً بترجّع tuples. عشان كده بنفكّها في loop كده for k, v in d.items().

و enumerate() بتعمل نفس الحاجة — بتدّيك (الرقم، item).

Python
1grades = {"Abdelrahman": 90, "Mona": 78}
2for name, g in grades.items():
3 print(f"{name} → {g}")
4
5for i, name in enumerate(["a", "b"]):
6 print(i, name)
الناتج
Abdelrahman → 90
Mona → 78
0 a
1 b
7

list من tuples — شكل أي جدول

أكتر تركيبة هتشوفها في البيانات الحقيقية: list بتتغيّر جواها rows ثابتة.

list بتكبر وتصغر (بتضيف rows)، لكن row نفسه بيفضل زي ما هو.

والفك في loop بيخلّي code يتقرا زي الجملة: for name, dept, grade in rows.

Python
1rows = [("Abdelrahman", "IT", 90), ("Mona", "CS", 78)]
2rows.append(("Omar", "IT", 65))
3for name, dept, grade in rows:
4 print(f"{name:<12}{dept:<4}{grade:>4}")
الناتج
Abdelrahman IT    90
Mona        CS    78
Omar        IT    65
8

التحويل بين tuple و list

محتاج تعدّل حاجة جوّه tuple؟ مينفعش — بس تقدر تحوّله لـ list، تعدّل، وترجّعه tuple تاني.

list(t) → list من tuple · tuple(xs) → tuple من list

خد بالك إن ده مش تعديل — ده إنشاء حاجة جديدة. والأصلي بيفضل زي ما هو.

Python
1point = (3, 7)
2temp = list(point)
3temp[0] = 10
4moved = tuple(temp)
5print(point)
6print(moved)
الناتج
(3, 7)
(10, 7)
9

الفك في النداءات وfor

الفك مش بس للـ tuple الصريح — Python بتفكّ أي حاجة من اتنين items في سطر واحد:

· k, v = pair
· for k, v in d.items()
· for i, x in enumerate(xs)
· low, high = min_max(nums)

كلهم نفس الفكرة — وده اللي بيخلّي code Python قصير وواضح في نفس الوقت.

Python
1pairs = [("a", 1), ("b", 2)]
2for key, value in pairs:
3 print(key, "=", value)
4first, second = pairs[1]
5print(first, second)
الناتج
a = 1
b = 2
b 2
10

ثابت… بس لحد فين؟

tuple ثابت يعني مينفعش تبدّل items بتاعته — ما تقدرش تحط item مكان item.

بس لو item نفسه حاجة بتتغيّر (زي list)، تقدر تغيّر جوّاها. tuple لسه ثابت — هو لسه بيشاور على نفس list — بس محتوى list اتغيّر.

الفرق ده بيلخبط ناس كتير، والقاعدة البسيطة: عايز ضمان كامل؟ خلّي اللي جوّه ثابت كمان.

Python
1t = ([1, 2], "fixed")
2t[0].append(9)
3print(t)
4print(len(t))
الناتج
([1, 2, 9], 'fixed')
2
3

وده كمان شوفه متحرك

الفكرة دي أسهل ما تتشاف من ما تتقرا

4

أمثلة محلولة

شوف إزاي بنفكّر قبل ما نكتب

مثال 1

إحداثيات ثابتة

المطلوب: خزّن موقع المستشفى (خط عرض وطول) بشكل ما يتغيّرش بالغلط.

نفكّر إزاي؟

  1. 1الإحداثيات ما المفروضش تتعدّل → tuple
  2. 2الفك بيدّي كل value اسم مفهوم
  3. 3القراية والتقطيع زي list بالظبط
مثال 2

function بترجّع تقرير كامل

المطلوب: function بتاخد قراءات وترجّع الأقل والأعلى والمتوسط مرة واحدة.

نفكّر إزاي؟

  1. 1تلات values مع بعض → return a, b, c
  2. 2Python بتلفّهم في tuple تلقائيًا
  3. 3عند الاستقبال بفكّهم في تلات variables
مثال 3

جدول بيانات من tuples

المطلوب: اطبع جدول طلبة كل row فيه اسم وقسم ودرجة.

نفكّر إزاي؟

  1. 1كل row بيانات ثابتة → tuple
  2. 2list من tuples = جدول
  3. 3الفك جوّه loop بيدّي أسماء واضحة
مثال 4

الفك في loop مع enumerate

المطلوب: اطبع ترتيب كل طالب مع اسمه.

نفكّر إزاي؟

  1. 1enumerate بترجّع (الرقم، item) — ده tuple
  2. 2بفكّه في 2 variables جوّه for
  3. 3indexing بيبدأ من صفر، وأقدر أخلّيه من 1
مثال 5

tuple كـ key في dictionary

المطلوب: اربط كل إحداثي باسم مدينة.

نفكّر إزاي؟

  1. 1key لازم يكون حاجة ثابتة
  2. 2list بتتغيّر → مينفعش تبقى key
  3. 3tuple ثابت → ينفع
مثال 6

تبديل من غير variable مؤقت

المطلوب: بدّل 2 values، وكمان دوّر items تلاتة.

نفكّر إزاي؟

  1. 1اليمين كله بيتحسب الأول كـ tuple
  2. 2وبعدين بيتفك على الشمال
  3. 3فمفيش value بتضيع في النص
5

ورقة مراجعة

ارجعلها وإنت بتحل — مش محتاج تحفظها

tuple مقابل list
الحاجةمعناهامثالالناتج
(1, 2)tuple — ثابتt = (1, 2)مينفعش يتغيّر
[1, 2]list — بتتغيّرxs = [1, 2]ينفع تعدّل
(5,)tuple من item واحدt = (5,)لاحظ الفاصلة
(5)مش tuple — ده رقمtype((5))<class 'int'>
a, b = tفك itemsx, y = (3, 7)x=3 y=7
a, b = b, aتبديل في سطرa, b = b, aاتبدّلوا
return a, bfunction بترجّع 2 valuesreturn min(x), max(x)tuple
t[i]القراية زي list(3, 7)[0]3
len(t)عدد itemslen((1,2,3))3
key بتاع dictionarytuple ينفع و list لأd[(1,2)] = "x"شغّال
6

الفك والترجيع المتعدد

شوفه بيشتغل سطر سطر

شغّل code خطوة خطوة

لاحظ إن function رجّعت tuple، واتفكّ فورًا في 3 variables. ده نمط هتشوفه كتير في code Python الحقيقي.

1def analyze(readings):◂
2 lowest = min(readings)
3 highest = max(readings)
4 average = sum(readings) / len(readings)
5 return lowest, highest, average
6
7temps = (36.5, 38.9, 37.1, 39.4)
8low, high, avg = analyze(temps)
9print(f"min: {low}")
10print(f"max: {high}")
11print(f"avg: {avg:.2f}")
الذاكرة

لسه مفيش variables

الناتج على الشاشة
لسه ما اتطبعش حاجة…
1

عرّفنا function analyze(readings) — لسه ما اشتغلتش، بس بقت جاهزة

خطوة 112 خطوة
Python الحقيقيCPython 3.14

المحاكاة فوق بتشرحلك خطوة خطوة. دوس هنا عشان تشغّل نفس code على Python حقيقي وتتأكد بنفسك.
أول مرة هيحمّل ~11 ميجا — بعد كده بيبقى فوري.

7

غلطات بتحصل كتير

شوفها هنا بدل ما تضيّع ساعة فيها

غلط
t = (1, 2)
t[0] = 5
صح
t = [1, 2]
t[0] = 5

tuple ثابت. لو محتاج تعدّل، استخدم list من الأول.

غلط
t = (5)
print(type(t))
صح
t = (5,)
print(type(t))

قوس حوالين رقم واحد مش tuple — ده رقم عادي. لازم فاصلة: (5,).

غلط
a, b, c = (1, 2)
صح
a, b = (1, 2)

عدد variables لازم يساوي عدد items بالظبط.

8

مسائل سريعة

فكّر الأول — بعدين اكشف

1

إيه type t؟

1t = (5)
2print(type(t))
2

وإيه type ده؟

1t = (5,)
2print(type(t))
3

إيه الناتج؟

1t = (1, 2, 3)
2print(t[1])
4

إيه الناتج؟

1a, b = 10, 20
2a, b = b, a
3print(a)
5

ليه ده بيطلّع TypeError؟

1t = (1, 2)
2t[0] = 9
6

إيه اللي هيحصل؟

1a, b, c = (1, 2)
7

إيه الناتج؟

1for i, v in enumerate(["a", "b"]):
2 print(i, v)
8

إمتى تختار tuple بدل list؟

9

جرّب بنفسك

اكتب code — ده الجزء اللي بيعلّم فعلاً

جرّب بنفسك

اكتب function min_max بتاخد list وترجّع أصغر وأكبر value. استخدمها وافك النتيجة في 2 variables.

شغّل code خطوة خطوة
1def min_max(nums):
2 # write here
3
4
الذاكرة

لسه مفيش variables

الناتج على الشاشة
لسه ما اتطبعش حاجة…

IndentationError: expected an indented block

بعد النقطتين (:) لازم السطر اللي بعدها يبقى مزاح لجوّه ٤ مسافات.

خطوة 1خطوة واحدة
Python الحقيقيCPython 3.14

المحاكاة فوق بتشرحلك خطوة خطوة. دوس هنا عشان تشغّل نفس code على Python حقيقي وتتأكد بنفسك.
أول مرة هيحمّل ~11 ميجا — بعد كده بيبقى فوري.

تمرين إضافي 2
جرّب بنفسك

اكتب function split_name بتاخد الاسم الكامل وترجّع (الاسم الأول، اسم العيلة). استخدمها وافك النتيجة.

شغّل code خطوة خطوة
1def split_name(full):
2 # write here
3
4
الذاكرة

لسه مفيش variables

الناتج على الشاشة
لسه ما اتطبعش حاجة…

IndentationError: expected an indented block

بعد النقطتين (:) لازم السطر اللي بعدها يبقى مزاح لجوّه ٤ مسافات.

خطوة 1خطوة واحدة
Python الحقيقيCPython 3.14

المحاكاة فوق بتشرحلك خطوة خطوة. دوس هنا عشان تشغّل نفس code على Python حقيقي وتتأكد بنفسك.
أول مرة هيحمّل ~11 ميجا — بعد كده بيبقى فوري.

تمرين إضافي 3
جرّب بنفسك

عندك list من rows (اسم، درجة). اطبع اسم صاحب أعلى درجة.

شغّل code خطوة خطوة
1rows = [("Abdelrahman", 78), ("Mona", 91), ("Omar", 65)]◂
2best = ""
3best_g = 0
4# write here
5
الذاكرة
rows[('Abdelrahman', 78), ('Mona', 91), ('Omar', 65)]
الناتج على الشاشة
لسه ما اتطبعش حاجة…
1

حطّينا [('Abdelrahman', 78), ('Mona', 91), ('Omar', 65)] جوّه rows

خطوة 14 خطوات
Python الحقيقيCPython 3.14

المحاكاة فوق بتشرحلك خطوة خطوة. دوس هنا عشان تشغّل نفس code على Python حقيقي وتتأكد بنفسك.
أول مرة هيحمّل ~11 ميجا — بعد كده بيبقى فوري.

تمرين إضافي 4
جرّب بنفسك

اكتب function stats ترجّع (العدد، المجموع، المتوسط) لـ list أرقام، واعرضهم في تلات سطور.

شغّل code خطوة خطوة
1def stats(nums):
2 # write here
3
4
الذاكرة

لسه مفيش variables

الناتج على الشاشة
لسه ما اتطبعش حاجة…

IndentationError: expected an indented block

بعد النقطتين (:) لازم السطر اللي بعدها يبقى مزاح لجوّه ٤ مسافات.

خطوة 1خطوة واحدة
Python الحقيقيCPython 3.14

المحاكاة فوق بتشرحلك خطوة خطوة. دوس هنا عشان تشغّل نفس code على Python حقيقي وتتأكد بنفسك.
أول مرة هيحمّل ~11 ميجا — بعد كده بيبقى فوري.

10

اختبر نفسك

كل إجابة معاها السبب

1

إيه الناتج؟

1a, b = 10, 20
2a, b = b, a
3print(a)
2

ليه list مينفعش تبقى key في dictionary؟

3

إيه اللي هيتطبع؟

1rows = [("Abdelrahman", 90), ("Mona", 78)]
2for name, g in rows:
3 print(name)
4

إيه الفرق الأساسي بين tuple و list؟

5

إيه اللي هيحصل؟

1t = (1, 2, 3)
2t[0] = 9
6

إيه type t؟

1t = (5)
7

إزاي function ترجّع 2 values؟

خلصت الدرس؟

علّم عليه عشان تعرف إنت وصلت لفين لما ترجع تاني.

الدرس اللي بعده: Regular Expressions ←