التحكم بالتدفق
درس 2 من 8
2التحكم بالتدفق (Control Flow)
الصورة الكبيرةكيف يتخذ البرنامج قرارات بالشروط ويكرر العمل بالحلقات، ومتى تختار while بدل for، وأشهر أخطاء الحدود.
ماذا تشاهد في الرسم: المتغيّر i يأخذ 0 ثم 1 ثم 2، ومع كل قيمة يسأل الشرط سؤاله فيضيء الجواب: زوجي أو فردي.
خارطة هذا الجزء
المفاهيم بالترتيب، اضغط أيًّا منها للقفز إليه:
طريقان إلى نفس الفكرة
البرنامج بلا شروط مثل قطار على سكة واحدة. الشرط تحويلة: «إن كانت الإشارة حمراء فقف، وإلا فتابع». والحلقة دوّار يعيد القطار نفس اللفّة: «كرّر عشر مرات» أو «استمر ما دام هناك ركّاب». بهاتين القطعتين يصير البرنامج قادرًا على أي شيء.
if/elif/else تختار فرعًا حسب قيمة منطقية. for يمرّ على عناصر مجموعة معلومة مثل range(10)، وwhile يكرر ما دام الشرط صحيحًا وقد لا يتوقف إن لم يتغير. انتبه لأخطاء الحدود off-by-one: range(1, 10) لا يشمل 10. وbreak يخرج وcontinue يتخطى دورة.
قبل أن تبدأ
📦المتغيّر
تعرف كيف تحفظ قيمة في اسم وتطبعها.
⚖️صح أو خطأ
أي مقارنة مثل 5 > 3 جوابها نعم أو لا.
الفكرة الجوهرية
البرنامج حتى الآن ينفّذ الأسطر بالترتيب من الأعلى إلى الأسفل. هنا تتعلّم كيف يقرّر، وكيف يكرّر، بثلاثة أمثلة صغيرة.
1اجعل البرنامج يقرّر
if تعني «إذا». بعدها شرط، ثم نقطتان، ثم الأسطر التي تُنفَّذ إن تحقّق الشرط. المسافة البادئة قبل print ليست زينة؛ هي التي تقول لبايثون إن هذا السطر تابع للشرط.
temperature = 31
if temperature > 30:
print("حار")
else:
print("معتدل")
else تعني «وإلا»، وتُنفَّذ عندما لا يتحقّق الشرط. غيّر 31 إلى 20 وشغّل، لترى الفرع الآخر.
2كرّر عددًا معلومًا من المرات
for تكرّر الأسطر البادئة بمسافة. range(1, 4) تعطي الأرقام من 1 إلى 3، فالرقم الأخير لا يدخل. في كل دورة يأخذ number القيمة التالية.
for number in range(1, 4):
print("الدورة رقم", number)
print("انتهت الحلقة")
السطر الأخير بلا مسافة بادئة، فهو خارج الحلقة ويُنفَّذ مرة واحدة بعد انتهائها.
3اجمع أثناء التكرار
النمط الأكثر شيوعًا في البرمجة كلها: متغيّر يبدأ من صفر، وحلقة تضيف إليه في كل دورة. هنا نجمع أسعارًا.
total = 0
for price in [12, 8, 30]:
total = total + price
print("المجموع الآن:", total)
print("النهائي:", total)
تابع كيف تغيّر total بعد كل دورة. هذا هو «التتبّع»، وهو أفضل طريقة لفهم أي حلقة: اكتب قيم المتغيّرات في كل دورة بيدك.
if أو for، أو نسيان المسافة البادئة في السطر الذي بعدهما. الرسالة ستكون SyntaxError أو IndentationError، وكلاهما يعني أن الشكل ناقص لا المنطق.كيف يعمل، خطوة بخطوة: كيف ينفّذ بايثون حلقة for
يحسب range(3) فيصير عنده 0 ثم 1 ثم 2.
يضع أول قيمة في المتغيّر i.
ينفّذ الأسطر المزاحة تحت الحلقة، ومنها الشرط.
يعود إلى رأس الحلقة بالقيمة التالية، حتى تنتهي القيم.
أعمق قليلًا
التدفق هو ما يجعل البرنامج "يفكر" بدل تنفيذ نفس الأسطر دائمًا بنفس الترتيب: اتخاذ قرارات بـالشروط، وتكرار عمل بـالحلقات.
الرسم 3: بايثون تفحص الشروط بالترتيب من الأعلى، وتُنفّذ أول كتلة شرطها صحيح فقط، ثم تتجاهل الباقي تمامًا.
if / elif / else
سلسلة قرارات حصرية: يُنفَّذ فرع واحد فقط. elif تعني "إن لم يتحقق الشرط السابق، جرّب هذا".
while
يكرر طالما الشرط صحيح، عدد التكرارات غير معروف مسبقًا. خطر شائع: نسيان تحديث المتغيّر يسبب حلقة لا نهائية.
for + range()
يكرر عددًا معروفًا من المرات أو يمر على عناصر تسلسل. range(a, b) يشمل a ويستثني b.
| while | for | |
|---|---|---|
| متى تستخدمه | عدد التكرارات غير معروف (انتظار حدث) | عدد التكرارات معروف أو عبور تسلسل |
| خطر شائع | حلقة لا نهائية إن نسيت تحديث الشرط | خطأ حدود واحد (Off-by-one) مع range |
## مثال: تصنيف درجة طالب (if/elif/else)
score = 82
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
else:
grade = "F"
print(grade) # B
## مثال: جدول ضرب بحلقة for + range
n = 4
for i in range(1, 6): # 1..5 (6 مستثناة)
print(f"{n} x {i} = {n * i}")
## مثال: عد تنازلي بحلقة while
countdown = 3
while countdown > 0:
print(countdown)
countdown -= 1 # لولا هذا السطر: حلقة لا نهائية
print("انطلاق!")
range(5) تعطي 0,1,2,3,4، خمسة عناصر تبدأ من صفر. هذا أكثر خطأ حدود شيوعًا عند القادمين من لغات أخرى.
اختبر فهمك: كم مرة تُطبع الجملة في for i in range(2, 10, 3): print(i)؟
ثلاث مرات: تطبع 2 ثم 5 ثم 8 (كل مرة نضيف الخطوة 3، وتتوقف قبل الوصول أو تجاوز 10).
مثال محلول
for n in range(1, 21): ثم داخلها if n % 3 == 0: print("فيز") وelse: print(n). لاحظ 21 لا 20، لأن range يتوقف قبل الرقم الأخير.خرافة مقابل حقيقة
| الخرافة | الحقيقة |
|---|---|
| else إلزامية بعد كل if. | else اختيارية؛ اكتبها فقط إذا كان عندك شيء تفعله عندما لا يتحقق الشرط. |
range(5) يعطي من 1 إلى 5. | يعطي من 0 إلى 4: خمسة أرقام تبدأ من الصفر وتتوقف قبل الخمسة. |
| while وfor متساويتان، اختر أيهما. | for لعدد معروف أو مجموعة تمشي عليها، وwhile عندما لا تعرف متى تتوقف. وwhile بلا تغيير في شرطها لا تنتهي أبدًا. |
جرّب بنفسك
كتبت for i in range(3): ثم print(i) بمسافة بادئة. ماذا يطبع؟
range(3) تبدأ من صفر وتتوقّف قبل 3، فتعطي 0 و1 و2. ثلاثة أرقام، لكنها تبدأ من الصفر لا من الواحد. هذه القاعدة ستقابلك في كل مكان في بايثون: العدّ يبدأ من صفر.
بطاقات مراجعة سريعة
range(1, 6)؟range(5)؟تحقق من فهمك
كم مرة تعمل for i in range(2, 6)؟
أربع مرات: 2 و3 و4 و5.
متى تختار while بدل for؟
عندما لا تعرف عدد المرات مسبقًا، مثل «استمر حتى يكتب المستخدم خروج».
ما فائدة elif؟
تفحص شرطًا ثانيًا فقط إذا فشل الأول، فلا يتحقق إلا فرع واحد من السلسلة.
مصادر هذا الدرس
مرتّبة بالنوع. ابدأ بالتوثيق الرسمي إذا تبي المرجع الدقيق، وبالمقال أو الفيديو إذا تبي الشرح أولًا.
توثيق رسمي1
أدوات2
خلّصت الدرس؟
سجّل الدخول ليُحفظ تقدّمك.