شرح مفصّل · البنود 7 إلى 13

بايثون بأمثلة من حياتنا 🧃

هنا نشرح النصوص والقوائم والقواميس والشروط والحلقات خطوة خطوة، وكل فكرة نربطها بشيء تعرفه من حياتك: طابور المخبز، منيو المطعم، إشارة المرور، الحصّالة… لا تحتاج أن تحفظ شيئاً — فقط افهم الفكرة، ثم اضغط Run وجرّب بنفسك.

→ الرجوع للدرس الأساسي

★ قبل ما نبدأ

كل قسم في هذه الصفحة مرتّب بنفس الطريقة، حتى تعرف دائماً أين أنت:

📖

قصة من الحياة

نبدأ بمثال تعرفه قبل أي كود.

💻

الكود

نفس الفكرة لكن بلغة بايثون. اضغط Run لتجرّبه.

🔍

خطوة بخطوة

جداول تبيّن ماذا يحدث داخل الكمبيوتر في كل سطر.

❓

اختبر نفسك

أسئلة قصيرة، والجواب مخفي حتى تفكر أولاً.

💡 نصيحة للطالب

بعد ما تشغّل أي مثال، غيّر فيه شيئاً صغيراً (اسم، رقم، كلمة) وشغّله مرة ثانية. هكذا تتعلم البرمجة فعلاً — بالتجربة وليس بالحفظ.

7 النصوص Strings

النص هو أي كلام نكتبه بين علامتي تنصيص: "Ahmad" ، "مرحبا" ، "0791234567".

🚃
القصة: قطار العربات

تخيّل النص قطاراً، وكل حرف فيه عربة. كل عربة عليها رقم مكتوب حتى نعرف مكانها.

لكن انتبه: في بايثون العدّ يبدأ من صفر وليس من واحد — تماماً مثل المصعد: الطابق الأرضي رقمه 0، والذي فوقه رقم 1.

A0
h1
m2
a3
d4

الخطوة 1 الوصول لحرف معيّن

نكتب اسم المتغير، ثم رقم العربة بين قوسين مربعين [ ]:

name = "Ahmad"
print(name[0])    # العربة رقم 0 = أول حرف
print(name[1])    # العربة رقم 1 = ثاني حرف
print(name[4])    # العربة رقم 4 = آخر حرف
print(len(name))  # len = كم عربة في القطار؟
A
h
d
5
⚠ لاحظ

الاسم فيه 5 حروف، لكن آخر رقم هو 4 (لأننا بدأنا من 0). لو كتبت name[5] سيظهر خطأ، لأنه لا توجد عربة رقم 5:

name = "Ahmad"
print(name[5])
IndexError: string index out of range

الخطوة 2 العدّ من الآخر (بالسالب)

🧍‍♂️🧍‍♀️🧍
القصة: طابور المخبز

لو سألتك «مين آخر واحد في الطابور؟» لا تحتاج أن تعدّ الطابور كله من أوله — تنظر مباشرة إلى آخره. في بايثون: -1 يعني آخر واحد، و -2 يعني الذي قبله.

A0-5
h1-4
m2-3
a3-2
d4-1
name = "Ahmad"
print(name[-1])   # آخر حرف
print(name[-2])   # الحرف قبل الأخير
d
a

الخطوة 3 قصّ جزء من النص (Slicing)

✂️
القصة: رقم الهاتف

رقم الهاتف 0791234567: أول 3 أرقام تخبرك بالشركة، والباقي هو رقم الشخص. والبنك عندما يرسل لك رسالة يعرض فقط آخر 4 أرقام من بطاقتك.

القاعدة: [من : إلى] — نبدأ من الرقم الأول، ونتوقف قبل الرقم الثاني.

00
71
92
13
24
35
46
57
68
79
← phone[0:3] يأخذ 0 و 1 و 2 ويتوقف قبل 3
phone = "0791234567"
print(phone[0:3])   # من 0 إلى ما قبل 3  → مفتاح الشركة
print(phone[3:])    # من 3 إلى النهاية   → رقم الشخص
print(phone[-4:])   # آخر 4 أرقام        → مثل رسالة البنك
print(phone[:3])    # إذا تركنا البداية فارغة = من الأول
079
1234567
4567
079

الخطوة 4 أدوات جاهزة للنصوص

بايثون تعطيك «أدوات» جاهزة تستعملها بكتابة نقطة بعد اسم المتغير:

الأداةماذا تفعل؟مثال من الحياة
.upper()كل الحروف كبيرةمثل تشغيل زر Caps Lock
.lower()كل الحروف صغيرةحتى يتطابق Mouse و mouse عند البحث
.strip()تحذف المسافات من الطرفينالمستخدم كتب اسمه ووضع مسافة بالغلط
.replace(a, b)تستبدل كلمة بكلمة«بحث واستبدال» في Word
.split(",")تقطّع النص إلى قطعتفصل قائمة مشتريات مكتوبة بسطر واحد
inهل الكلمة موجودة؟هل كلمة «مبروك» موجودة في الرسالة؟
username = "  Sara_2010  "        # كتبت اسمها ومعه مسافات بالغلط
print(username.strip())

city = "amman"
print(city.upper())
print(city.capitalize())           # أول حرف فقط كبير

msg = "I love tea"
print(msg.replace("tea", "coffee"))
print("love" in msg)

shopping = "milk,bread,eggs"
print(shopping.split(","))
Sara_2010
AMMAN
Amman
I love coffee
True
['milk', 'bread', 'eggs']
❗ أهم ملاحظة في هذا القسم

هذه الأدوات لا تغيّر النص الأصلي. مثل أن تصوّر ورقة وتكتب على الصورة — الورقة الأصلية تبقى كما هي. إذا أردت حفظ التغيير، خزّنه في المتغير من جديد:

city = "amman"
city.upper()          # عملنا نسخة كبيرة… لكن لم نحفظها!
print(city)

city = city.upper()   # الآن حفظناها في نفس المتغير
print(city)
amman
AMMAN
النص قطار من الحروف، أول عربة رقمها 0، وآخر عربة رقمها -1.
❓ اختبر نفسك — لدينا word = "School"
  1. ماذا يطبع word[0]؟
    الجوابS
  2. ماذا يطبع word[-1]؟
    الجوابl
  3. ماذا يطبع word[1:4]؟
    الجوابcho (الأماكن 1 و 2 و 3)
  4. ماذا يطبع len(word)؟
    الجواب6
  5. ماذا يطبع word.upper()؟
    الجوابSCHOOL

8 القوائم Lists

القائمة تخزّن أكثر من قيمة في متغير واحد، بين قوسين مربعين [ ] وبينها فواصل.

🛒
القصة: ورقة المشتريات

أمك لا تكتب كل غرض على ورقة لحاله، بل تكتب ورقة واحدة فيها: حليب، خبز، بيض. هذه الورقة هي القائمة. بدل ما يكون عندنا 3 متغيرات، يكون عندنا متغير واحد فيه كل الأغراض.

# بدون قائمة: متغير لكل غرض 😩
item1 = "milk"
item2 = "bread"
item3 = "eggs"

# مع قائمة: متغير واحد لكل شيء 😎
shopping = ["milk", "bread", "eggs"]
print(shopping)
print(shopping[0])      # نفس فكرة النصوص: العدّ من 0
print(shopping[-1])     # آخر غرض
print(len(shopping))    # كم غرض في الورقة؟
['milk', 'bread', 'eggs']
milk
eggs
3

الخطوة 1 القائمة تتغيّر: طابور المخبز

🥖
القصة: طابور المخبز

في الطابور ناس يوصلون، وناس يطلعون، وأحياناً نعطي كبير السن أول الدور. القائمة في بايثون تتصرف بالضبط مثل هذا الطابور.

ماذا حدث في الطابور؟الأمر في بايثون
وصل شخص جديد ووقف في آخر الطابورqueue.append("Sami")
أدخلنا شخصاً في مكان محددqueue.insert(0, "Grandpa")
شخص باسمه زهق وترك الطابورqueue.remove("Omar")
الأول انخدم وطلع — ونعرف مين هوfirst = queue.pop(0)
queue = ["Ali", "Omar", "Lina"]

queue.append("Sami")          # وصل سامي
print(queue)

queue.insert(0, "Grandpa")    # جدّو له الأولوية
print(queue)

queue.remove("Omar")          # عمر راح
print(queue)

first = queue.pop(0)          # أول واحد انخدم
print("انخدم:", first)
print(queue)
['Ali', 'Omar', 'Lina', 'Sami']
['Grandpa', 'Ali', 'Omar', 'Lina', 'Sami']
['Grandpa', 'Ali', 'Lina', 'Sami']
انخدم: Grandpa
['Ali', 'Lina', 'Sami']

الخطوة 2 تبديل عنصر: تبديل لاعب

⚽
القصة: تبديل في المباراة

المدرب يُخرج اللاعب رقم 1 ويُدخل مكانه لاعباً جديداً — في نفس المكان.

team = ["Ali", "Omar", "Lina"]
team[1] = "Sami"      # سامي يأخذ مكان عمر
print(team)
['Ali', 'Sami', 'Lina']

الخطوة 3 قائمة أرقام: علامات الصف

📝
القصة: المعلّم وكشف العلامات

المعلم يريد أن يعرف: أعلى علامة، أقل علامة، المجموع، والمعدل. بدل الآلة الحاسبة، بايثون تعطيه الجواب بسطر واحد.

grades = [70, 85, 90, 60, 95]

print("أعلى علامة:", max(grades))
print("أقل علامة:", min(grades))
print("المجموع:", sum(grades))
print("المعدل:", sum(grades) / len(grades))
print("هل في أحد جاب 100؟", 100 in grades)

grades.sort()                  # ترتيب من الأصغر للأكبر
print(grades)

grades.sort(reverse=True)      # من الأكبر للأصغر
print("الأوائل الثلاثة:", grades[0:3])
أعلى علامة: 95
أقل علامة: 60
المجموع: 400
المعدل: 80.0
هل في أحد جاب 100؟ False
[60, 70, 85, 90, 95]
الأوائل الثلاثة: [95, 90, 85]
💡 الفرق بين remove و pop

remove("Omar") تحذف بالاسم.   pop(0) تحذف بالمكان وتعطيك الشيء الذي حذفته.

القائمة مثل طابور: نضيف بـ append، نحذف بـ remove أو pop، ونبدّل بـ [ ].
❓ اختبر نفسك — لدينا nums = [10, 20, 30]
  1. بعد nums.append(40) كيف تصبح القائمة؟
    الجواب[10, 20, 30, 40]
  2. ثم بعد nums[0] = 5؟
    الجواب[5, 20, 30, 40]
  3. ثم بعد nums.remove(30)؟
    الجواب[5, 20, 40]
  4. كم يطبع sum(nums) الآن؟
    الجواب65

9 Tuple و Set

هما «أقارب» القائمة، لكن لكل واحد منهما شخصية مختلفة.

أولاً Tuple: الأشياء التي لا تتغير

🎂
القصة: تاريخ ميلادك

تاريخ ميلادك (السنة، الشهر، اليوم) ثابت — لا أحد يستطيع أن يغيّره. نفس الشيء لإحداثيات بيتك على الخريطة، أو أيام الأسبوع. لمثل هذه الأشياء نستخدم Tuple بأقواس عادية ( ).

birthday = (2010, 5, 17)       # سنة، شهر، يوم
print("سنة الميلاد:", birthday[0])
print("الشهر:", birthday[1])
سنة الميلاد: 2010
الشهر: 5

جرّب أن تغيّر سنة ميلادك… بايثون سترفض:

birthday = (2010, 5, 17)
birthday[0] = 2012
TypeError: 'tuple' object does not support item assignment

ثانياً Set: لا تكرار أبداً

☝️
القصة: جهاز البصمة في المدرسة

علي بصم مرتين، ولينا بصمت مرتين… لكن في كشف الحضور كل طالب يظهر مرة واحدة فقط. هذا هو الـ Set: يحذف التكرار تلقائياً، ولا يهمه الترتيب. نكتبه بأقواس معقوفة { }.

attendance = {"Ali", "Lina", "Ali", "Omar", "Lina"}
print("عدد الحاضرين:", len(attendance))   # 3 وليس 5!

attendance.add("Sami")                    # سامي وصل متأخر
print("هل علي حاضر؟", "Ali" in attendance)
print("هل هدى حاضرة؟", "Huda" in attendance)
عدد الحاضرين: 3
هل علي حاضر؟ True
هل هدى حاضرة؟ False

استعمال مفيد جداً: معرفة كم شيئاً مختلفاً في قائمة فيها تكرار:

votes = ["red", "blue", "red", "green", "blue", "red"]   # تصويت الصف على لون
print("عدد الأصوات:", len(votes))
print("عدد الألوان المختلفة:", len(set(votes)))
عدد الأصوات: 6
عدد الألوان المختلفة: 3

المقارنة بين الثلاثة

✏️

List [ ]

ورقة مكتوبة بقلم رصاص: تضيف، تمسح، تعدّل كما تريد.

🪨

Tuple ( )

كلام محفور على حجر: تقرأه فقط، لا تعدّله.

🎒

Set { }

كيس فيه أغراض: كل غرض مرة واحدة، وبلا ترتيب.

Tuple للأشياء الثابتة، و Set عندما لا نريد تكراراً.
❓ اختبر نفسك
  1. أيام الأسبوع — List أم Tuple؟
    الجوابTuple لأنها لا تتغير
  2. قائمة المشتريات — List أم Tuple؟
    الجوابList لأننا نضيف ونحذف
  3. كم يطبع len({1, 1, 2, 2, 2})؟
    الجواب2

10 القواميس Dictionaries

القاموس يخزّن المعلومات على شكل اسم ← قيمة. الاسم يسمّى مفتاح key.

🪪
القصة: بطاقة الطالب

بطاقة الطالب مكتوب فيها: الاسم: لينا، العمر: 14، الصف: 8A. أنت لا تقول «أعطني المعلومة الثانية»، بل تقول «أعطني العمر». هذا هو القاموس: كل معلومة لها عنوان.

الخطوة 1 لماذا لا نستعمل قائمة؟

student_list = ["Lina", 14, "8A"]
print(student_list[2])     # 🤔 ما هو 8A؟ لازم أتذكر أن رقم 2 هو الصف

student = {
    "name": "Lina",
    "age": 14,
    "class": "8A"
}
print(student["class"])    # 😎 واضح: أعطني الصف
8A
8A
المفتاح (العنوان)القيمة (المعلومة)
"name""Lina"
"age"14
"class""8A"

الخطوة 2 منيو المطعم: إضافة وتعديل وحذف

🥙
القصة: صاحب مطعم الشاورما

في المنيو: كل أكلة ← سعرها. صاحب المطعم أحياناً يغيّر سعراً، أو يضيف أكلة جديدة، أو يشطب أكلة لأنها خلصت.

menu = {"falafel": 0.5, "shawarma": 2.5, "juice": 1}

print("سعر الشاورما:", menu["shawarma"])

menu["juice"] = 1.25        # غلي سعر العصير  ← تعديل (المفتاح موجود)
menu["hummus"] = 1.5        # صنف جديد        ← إضافة (المفتاح غير موجود)
del menu["falafel"]         # الفلافل خلص     ← حذف

print(menu)
سعر الشاورما: 2.5
{'shawarma': 2.5, 'juice': 1.25, 'hummus': 1.5}
📌 لاحظ

نفس الكتابة menu["..."] = ... تُستعمل للتعديل والإضافة: إذا كان المفتاح موجوداً تعدّل، وإذا لم يكن موجوداً تضيف.

الخطوة 3 السؤال عن شيء غير موجود

زبون سأل عن بيتزا… وهي غير موجودة في المنيو:

menu = {"shawarma": 2.5, "juice": 1.25}
print(menu["pizza"])
KeyError: 'pizza'

البرنامج توقف! الحل المهذّب: get — تسأل، وإذا لم تجد الشيء تعطي جواباً احتياطياً بدل الخطأ:

menu = {"shawarma": 2.5, "juice": 1.25}
print(menu.get("pizza", "مش موجودة بالمنيو 😅"))
print(menu.get("juice", "مش موجودة بالمنيو 😅"))
مش موجودة بالمنيو 😅
1.25

الخطوة 4 كل العناوين وكل القيم

menu = {"shawarma": 2.5, "juice": 1.25, "hummus": 1.5}
print("الأكلات:", list(menu.keys()))     # كل المفاتيح
print("الأسعار:", list(menu.values()))   # كل القيم
print("عدد الأصناف:", len(menu))
الأكلات: ['shawarma', 'juice', 'hummus']
الأسعار: [2.5, 1.25, 1.5]
عدد الأصناف: 3
القاموس مثل المنيو: تسأل بالاسم فيعطيك القيمة.
❓ اختبر نفسك — لدينا phone_book = {"Ali": "0791111", "Lina": "0782222"}
  1. كيف تطبع رقم لينا؟
    الجوابprint(phone_book["Lina"])
  2. كيف تضيف عمر برقم 0773333؟
    الجوابphone_book["Omar"] = "0773333"
  3. ماذا يحدث مع phone_book["Sami"]؟
    الجوابخطأ KeyError — الأفضل استعمال get

11 المقارنة والمنطق

هنا الكمبيوتر يجاوب على أسئلة بـ نعم أو لا فقط. في بايثون: نعم = True، لا = False.

⚖️
القصة: الميزان عند البقّال

تضع شيئين على الميزان وتسأل: هل هذا أثقل؟ هل هما متساويان؟ الميزان لا يعطيك قصة طويلة — فقط نعم أو لا. عمليات المقارنة هي «ميزان» بايثون.

الخطوة 1 أهم فرق: = و ==

📦

x = 5 إشارة واحدة

«ضع 5 في الصندوق x». هذا أمر وليس سؤالاً.

❓

x == 5 إشارتان

«هل الذي في الصندوق x يساوي 5؟» هذا سؤال وجوابه True أو False.

الخطوة 2 أسئلة من الحياة

الرمزنقرأهسؤال من الحياة
==يساوي؟هل كلمة السر صحيحة؟
!=لا يساوي؟هل الجواب مختلف عن الصحيح؟
>أكبر من؟هل حرارتك أعلى من 37.5؟
<أصغر من؟هل علامتك أقل من 50؟
>=أكبر أو يساوي؟هل معك مصاري تكفي ثمن السندويشة؟
<=أصغر أو يساوي؟هل وزن الشنطة ضمن المسموح؟
my_money = 5
price = 3.5
print("معي مصاري تكفي؟", my_money >= price)

temperature = 38
print("عندي حرارة؟", temperature > 37.5)

password = "1234"
print("كلمة السر صحيحة؟", password == "1234")

print("Ali" == "ali")    # بايثون تفرّق بين الحرف الكبير والصغير!
معي مصاري تكفي؟ True
عندي حرارة؟ True
كلمة السر صحيحة؟ True
False

الخطوة 3 and: الشرطان معاً

🚗
القصة: سواقة السيارة

حتى تسوق سيارة لازم تكون عمرك 18 أو أكثر و معك رخصة. واحد منهما لا يكفي!

عمرك 18+؟معك رخصة؟تسوق؟ (and)
✔ نعم✔ نعم✔ نعم
✔ نعم✘ لا✘ لا
✘ لا✔ نعم✘ لا
✘ لا✘ لا✘ لا
age = 19
has_license = False
print("بقدر أسوق؟", age >= 18 and has_license)
بقدر أسوق؟ False

الخطوة 4 or: واحد منهما يكفي

🏛️
القصة: الدخول المجاني للمتحف

الدخول مجاني إذا كنت طفلاً أقل من 12 أو كبيراً 65 وأكثر. يكفي أن تنطبق عليك واحدة.

طفل؟كبير سن؟مجاني؟ (or)
✔ نعم✘ لا✔ نعم
✘ لا✔ نعم✔ نعم
✘ لا✘ لا✘ لا
age = 70
print("الدخول مجاني؟", age < 12 or age >= 65)

age = 30
print("الدخول مجاني؟", age < 12 or age >= 65)
الدخول مجاني؟ True
الدخول مجاني؟ False

الخطوة 5 not: العكس

is_raining = False
print("الجو حلو للطلعة؟", not is_raining)   # مش ماطر = حلو
الجو حلو للطلعة؟ True
المقارنة سؤال جوابه True أو False، و and تحتاج الاثنين، و or يكفيها واحد.
❓ اختبر نفسك
  1. 10 == 10 ؟
    الجوابTrue
  2. 7 != 7 ؟
    الجوابFalse
  3. 5 > 3 and 2 > 4 ؟
    الجوابFalse (الثاني خطأ)
  4. 5 > 3 or 2 > 4 ؟
    الجوابTrue (الأول يكفي)
  5. not True ؟
    الجوابFalse

12 الشروط if / elif / else

حتى الآن البرنامج ينفّذ كل الأسطر. مع if يصبح البرنامج يقرّر: ينفّذ هذا أو ذاك حسب الموقف.

☔
القصة: قبل ما تطلع من البيت

تسأل نفسك كل يوم: إذا كانت تمطر ← آخذ المظلة. وبعدها في الحالتين أطلع من البيت. أنت تستعمل if كل يوم بدون ما تنتبه!

هل الجو ماطر؟
↓
✔ نعم ← خذ المظلة ☂
✘ لا ← لا تفعل شيئاً
↓
اطلع من البيت 🚶
is_raining = True

if is_raining:
    print("خذ المظلة ☂")

print("اطلع من البيت 🚶")
خذ المظلة ☂
اطلع من البيت 🚶
⚠ شيئان لا تنساهما أبداً

1) النقطتان : في آخر سطر الـ if.

2) المسافة (4 مسافات) قبل الأسطر التي «تتبع» الشرط. السطر الذي بدون مسافة ليس تابعاً للشرط، ويُنفّذ دائماً. جرّب تغيير True إلى False في المثال أعلاه!

الخطوة 1 if و else: طريقان

🏧
القصة: الصرّاف الآلي

إذا المبلغ الذي طلبته أقل من رصيدك أو يساويه ← يعطيك المصاري. وإلا ← يقول لك «رصيدك لا يكفي». لا يوجد احتمال ثالث.

balance = 20
amount = int(input("كم بدك تسحب؟ "))

if amount <= balance:
    print("تفضل مصاريك 💵")
else:
    print("رصيدك ما بكفي ❌")
كم بدك تسحب؟ 50
رصيدك ما بكفي ❌

الخطوة 2 elif: أكثر من طريقين

🚦
القصة: إشارة المرور

الإشارة ليس لها لونان فقط، بل ثلاثة: أحمر ← قف، أصفر ← استعد، أخضر ← امشِ. عندما يوجد أكثر من احتمالين نستعمل elif (اختصار «else if» = وإلا إذا).

light = input("شو لون الإشارة؟ (red / yellow / green): ")

if light == "red":
    print("قف 🛑")
elif light == "yellow":
    print("استعد ⚠")
elif light == "green":
    print("امشِ ✅")
else:
    print("لون غريب! 🤔")
شو لون الإشارة؟ (red / yellow / green): yellow
استعد ⚠
🔍 ماذا يفعل الكمبيوتر عندما تكتب yellow؟
السؤالالجوابماذا يحدث؟
light == "red"✘ Falseيتجاهل ويكمل للسؤال التالي
light == "yellow"✔ Trueيطبع «استعد» ويتوقف عن السؤال
light == "green"—لا يسأله أصلاً

الخطوة 3 الترتيب مهم جداً!

بايثون تنفّذ أول شرط صحيح فقط وتتجاهل الباقي. انظر ماذا يحدث لطالب علامته 95 إذا رتّبنا الشروط بشكل خاطئ:

# ✘ ترتيب خاطئ
score = 95
if score >= 50:
    print("ناجح")
elif score >= 90:
    print("ممتاز")      # لن يصل إليها أبداً!
ناجح
# ✔ ترتيب صحيح: من الأصعب للأسهل
score = 95
if score >= 90:
    print("ممتاز 🌟")
elif score >= 75:
    print("جيد جداً")
elif score >= 50:
    print("ناجح")
else:
    print("راسب")
ممتاز 🌟
💡 مثل الدرج

تخيّل درجاً: تسأل أولاً عن أعلى درجة (90)، ثم التي تحتها (75)، ثم التي تحتها (50). لو بدأت من الأسفل، الكل «يوقف» على أول درجة.

الخطوة 4 شرط داخل شرط

✈️
القصة: المطار

أولاً يفحصون جواز السفر. فقط إذا كان الجواز سليماً، يسألونك عن التذكرة. إذا لم يكن معك جواز، لا أحد يسأل عن التذكرة أصلاً.

has_passport = True
has_ticket = False

if has_passport:
    print("الجواز تمام ✔")
    if has_ticket:
        print("تفضل على الطيارة ✈")
    else:
        print("لازم تشتري تذكرة 🎫")
else:
    print("ما بتقدر تسافر بدون جواز ❌")
الجواز تمام ✔
لازم تشتري تذكرة 🎫
if تسأل، و elif تسأل سؤالاً آخر، و else لكل ما تبقى — وأول جواب صحيح يفوز.
❓ اختبر نفسك — ماذا يطبع هذا الكود إذا كان x = 15؟
x = 15
if x > 20:
    print("A")
elif x > 10:
    print("B")
elif x > 5:
    print("C")
else:
    print("D")
الجواب:
اضغط هناB فقط — مع أن x > 5 صحيح أيضاً، لكن B جاء أولاً.

13 حلقة for

الحلقة تجعل الكمبيوتر يكرّر نفس العمل عدة مرات بدل ما نكتبه مرة بعد مرة.

📚
القصة: المعلّم يوزّع الدفاتر

المعلم لا يقول «يا علي خذ دفترك، يا لينا خذي دفترك، يا عمر خذ دفترك…» ويكتب ذلك 30 مرة. هو يفكر هكذا: لكل طالب في الصف ← أعطه دفتره. هذه الجملة بالضبط هي حلقة for.

students = ["Ali", "Lina", "Omar"]

for student in students:
    print("تفضل دفترك يا", student)

print("خلص التوزيع ✔")
تفضل دفترك يا Ali
تفضل دفترك يا Lina
تفضل دفترك يا Omar
خلص التوزيع ✔
🔍 خطوة بخطوة: ماذا يحدث داخل الحلقة؟
الدورةقيمة studentماذا طُبع؟
1"Ali"تفضل دفترك يا Ali
2"Lina"تفضل دفترك يا Lina
3"Omar"تفضل دفترك يا Omar
خلصت الأسماء ← نخرج من الحلقة ونطبع «خلص التوزيع»
📌 من أين جاء المتغير student؟

نحن اخترنا اسمه! في كل دورة، بايثون تضع فيه الاسم التالي من القائمة تلقائياً. يمكنك تسميته s أو kid أو أي اسم — لكن الاسم الواضح أفضل.

الخطوة 1 داخل الحلقة أم خارجها؟

المسافة في بداية السطر تحدد: هل السطر يتكرر أم يُنفّذ مرة واحدة بعد الحلقة؟

for i in range(3):
    print("داخل الحلقة 🔁", i)     # عليه مسافة ← يتكرر
print("خارج الحلقة ⏹")            # بدون مسافة ← مرة واحدة في النهاية
داخل الحلقة 🔁 0
داخل الحلقة 🔁 1
داخل الحلقة 🔁 2
خارج الحلقة ⏹

الخطوة 2 range: كرّر عدداً معيناً من المرات

💪
القصة: تمرين الضغط

المدرّب يقول: «اعمل 5 ضغطات». أنت لا تحتاج قائمة، تحتاج فقط أن تعدّ. range هي «العدّاد».

for i in range(1, 6):
    print("ضغطة رقم", i, "💪")
print("برافو! خلصت التمرين")
ضغطة رقم 1 💪
ضغطة رقم 2 💪
ضغطة رقم 3 💪
ضغطة رقم 4 💪
ضغطة رقم 5 💪
برافو! خلصت التمرين
rangeمعناها بالعربيالأرقام
range(5)5 مرات، ابدأ من 0 (مثل المصعد)0 1 2 3 4
range(1, 6)من 1، وتوقف قبل 61 2 3 4 5
range(0, 11, 2)اقفز درجتين درجتين0 2 4 6 8 10
range(5, 0, -1)عدّ تنازلي5 4 3 2 1
# العدّ التنازلي للصاروخ 🚀
for i in range(5, 0, -1):
    print(i)
print("انطلق 🚀")
5
4
3
2
1
انطلق 🚀

الخطوة 3 الحصّالة: نجمع داخل الحلقة

🐷
القصة: الحصّالة

في أول الأسبوع الحصّالة فاضية (0). كل يوم تضع فيها مبلغاً. في آخر الأسبوع تريد أن تعرف كم صار فيها. هذا أهم نمط في البرمجة: نبدأ من صفر قبل الحلقة، ونضيف داخلها.

week = [2, 0, 5, 1, 3]    # كم دينار وضعت كل يوم
piggy_bank = 0            # الحصالة فاضية في البداية

for money in week:
    piggy_bank = piggy_bank + money     # نفس piggy_bank += money

print("صار بالحصالة:", piggy_bank, "دينار 🐷")
صار بالحصالة: 11 دينار 🐷
🔍 خطوة بخطوة
اليومmoneyالحصالة قبلالحسابالحصالة بعد
1200 + 22
2022 + 02
3522 + 57
4177 + 18
5388 + 311

الخطوة 4 العدّاد: حلقة + شرط

🧑‍🏫
القصة: كم طالب يحتاج حصة تقوية؟

المعلم يمرّ على العلامات واحدة واحدة، وإذا كانت العلامة أقل من 50 يزيد العدّاد واحداً.

grades = [70, 45, 90, 30, 60]
weak = 0

for g in grades:
    if g < 50:
        weak += 1
        print(g, "← يحتاج تقوية")

print("عدد الطلاب المحتاجين تقوية:", weak)
45 ← يحتاج تقوية
30 ← يحتاج تقوية
عدد الطلاب المحتاجين تقوية: 2

الخطوة 5 enumerate: الرقم والاسم معاً

📋
القصة: دفتر الحضور

في دفتر الحضور كل اسم بجانبه رقم: 1- علي، 2- لينا، 3- عمر. enumerate تعطيك الرقم والاسم في نفس الوقت.

students = ["Ali", "Lina", "Omar"]
for number, name in enumerate(students, start=1):
    print(number, "-", name)
1 - Ali
2 - Lina
3 - Omar

ونستعملها عندما نريد تعديل كل عنصر في القائمة (مثل ملف Chapter_3.py) — نحتاج الرقم حتى نعرف أين نكتب:

names = ["Ahmad", "Sarah", "John"]
for i, name in enumerate(names):
    names[i] = name + "'s car"      # i = مكان الاسم الحالي
print(names)
["Ahmad's car", "Sarah's car", "John's car"]
🔍 لماذا نكتب names[i] وليس names[0]؟
الدورةinameماذا يُكتب؟
10"Ahmad"في المكان 0 ← Ahmad's car
21"Sarah"في المكان 1 ← Sarah's car
32"John"في المكان 2 ← John's car
لو كتبنا names[0] لكتبنا كل مرة فوق نفس المكان الأول، ولبقي الباقي بدون تغيير.

الخطوة 6 المرور على قاموس: فاتورة المطعم

🧾
القصة: الكاشير

الكاشير يمرّ على طلبك سطراً سطراً: كل أكلة وكميتها، يضرب بالسعر، ويجمع كل شيء في المجموع — بالضبط مثل الحصّالة، لكن على قاموس. .items() تعطينا المفتاح والقيمة معاً.

menu = {"shawarma": 2.5, "juice": 1.25, "hummus": 1.5}
order = {"shawarma": 2, "juice": 3}      # الطلب: أكلة ← كمية

total = 0
for food, qty in order.items():
    cost = menu[food] * qty
    total += cost
    print(f"{food} x{qty} = {cost}")

print(f"المجموع: {total} دينار 🧾")
shawarma x2 = 5.0
juice x3 = 3.75
المجموع: 8.75 دينار 🧾
❗ أخطاء متكررة عند الطلاب

1) نسيان النقطتين : بعد سطر for ← SyntaxError

2) نسيان المسافة قبل السطر الذي يجب أن يتكرر ← IndentationError

3) وضع total = 0 داخل الحلقة ← الحصالة تنفضّ في كل دورة! مكانه قبل الحلقة دائماً.

for تعني «لكل واحد في المجموعة ← افعل كذا»، وما عليه مسافة يتكرر.
❓ اختبر نفسك
  1. كم مرة يُطبع «مرحبا» في for i in range(4): print("مرحبا")؟
    الجواب4
  2. ما الأرقام في range(2, 5)؟
    الجواب2 3 4
  3. ماذا يطبع هذا الكود؟ t = 0 ثم for n in [1, 2, 3]: t += n ثم print(t)
    الجواب6
  4. أين نضع total = 0: قبل الحلقة أم داخلها؟
    الجوابقبل الحلقة

✓ الخلاصة الكبيرة

البندمثال من الحياةتذكّر هذا
7. النصوص🚃 قطار العرباتأول حرف [0]، آخر حرف [-1]
8. القوائم🥖 طابور المخبزappend ، remove ، pop
9. Tuple / Set🎂 تاريخ الميلاد / ☝️ البصمةTuple لا يتغير، Set بلا تكرار
10. القواميس🥙 منيو المطعمmenu["shawarma"] ← السعر
11. المقارنة⚖️ الميزان / 🚗 رخصة القيادة== سؤال، = تخزين
12. الشروط🚦 إشارة المرورأول شرط صحيح يفوز
13. for📚 توزيع الدفاتر / 🐷 الحصالةالمجموع يبدأ من 0 قبل الحلقة
🎯 تحدٍّ أخير يجمع كل شيء

اكتب برنامجاً فيه قاموس لعلامات 4 طلاب، ثم بحلقة for اطبع لكل طالب: «ممتاز» أو «ناجح» أو «راسب»، وفي النهاية اطبع معدل الصف.

عرض الحل
grades = {"Ali": 92, "Lina": 67, "Omar": 41, "Sara": 85}
total = 0

for name, g in grades.items():
    total += g
    if g >= 90:
        print(name, "← ممتاز 🌟")
    elif g >= 50:
        print(name, "← ناجح ✔")
    else:
        print(name, "← راسب ✘")

print("معدل الصف:", total / len(grades))
Ali ← ممتاز 🌟
Lina ← ناجح ✔
Omar ← راسب ✘
Sara ← ناجح ✔
معدل الصف: 71.25