الحلقات التكرارية في بايثون: for وwhile
45 دقيقة تقريبًا
- variable
- string
- list
- dictionary
- if
- comparison
- set
- for
- in
- iteration
- indentation
- range
- while
- break
- continue
- endswith
يحسب العدّاد في الأعلى تمارين الدرس، وعددها 15، أما القراءة وتشغيل الأمثلة فلا تُحتسب.
قبل ما ندخل في الكود، خلينا نفهم المشكلة اللي الـ Loops بتحلها.
تخيل إن عندك 4 روابط:
https://example.com/page1 https://example.com/page2 https://example.com/page3 https://example.com/page4
الكود شغال، لكن المشكلة إنك كتبت print() أربع مرات.
لو عندك 10,000 URL، هل هتكتب print() عشرة آلاف مرة؟
طبعًا لا.
هنا تظهر فكرة Loop.
لكن التكرار ممكن يحصل بطريقتين مختلفتين، وده السبب إن عندنا for وعندنا while.
أولًا: for
الـ Mindset
استخدم for لما يكون عندك مجموعة من العناصر وعايز تعمل حاجة على كل عنصر فيها.
مثال بسيط:
دي List فيها 3 أسماء.
عايز أطبع كل اسم.
بدل ما أكتب:
Islam Ahmed Ali
أقدر أستخدم:
Islam Ahmed Ali
دلوقتي نفهم الكود كلمة كلمة.
ما معنى for؟
لما تكتب:
تقدر تقرأها بالعربي:
names، نفذ الكود الموجود أسفل for.for هنا معناها إن Python هيمر على العناصر واحدًا واحدًا.
ما معنى in؟
in هنا معناها: داخل.
إذن:
تقريبًا معناها: لكل name داخل names.
من أين جاءت name؟
عندنا القائمة:
ولما كتبنا:
إحنا أنشأنا متغير اسمه name.
Python هيضع فيه عنصرًا واحدًا من القائمة في كل مرة.
name = "Islam"في أول مرة، وينفذprint(name)فتظهر Islamname = "Ahmed"في المرة الثانية، فتظهر Ahmedname = "Ali"في المرة الثالثة، فتظهر Ali
إذن الكود:
يمكن تخيله داخليًا كأنه:
Islam Ahmed Ali
والناتج في الحالتين واحد.
for عملت التكرار بدل منك.ما معنى Iteration؟
هتقابل مصطلح مهم اسمه Iteration.
في الكود:
عندنا 3 Iterations.
name = "Islam"الدورة الأولىname = "Ahmed"الدورة الثانيةname = "Ali"الدورة الثالثة
إذن لو عندك 100 عنصر، غالبًا الـ for ستعمل 100 Iterations.
هل لازم أسمي المتغير name؟
لا.
الكود ده صحيح:
Islam Ahmed Ali
وده كمان صحيح:
Islam Ahmed Ali
لكن الأفضل تختار اسمًا يوضح نوع العنصر.
لو عندك:
الأفضل:
/home /about /contact
بدل:
url أوضح.الـ Indentation مع for
الـ Indentation هنا أساسية جدًا.
شوف المثال:
Islam Ahmed Ali Finished
ليه Finished ظهرت مرة واحدة؟
لأن print("Finished") ليست داخل الـ for. لاحظ إنها بدأت من أول السطر.
لكن لو كتبنا:
Islam Finished Ahmed Finished Ali Finished
ليه؟ لأن print(name) و print("Finished") الاتنين داخل الـ for.
ودي قاعدة مهمة جدًا.
أول تطبيق SEO باستخدام for
عندنا URLs:
/home /about /services /contact
اللي حصل:
url = "/home"Iteration 1url = "/about"Iteration 2url = "/services"Iteration 3url = "/contact"Iteration 4
إذن لو عندك List فيها URLs، الـ for تقدر تمر عليها واحدة واحدة.
دمج for مع if
الآن نبدأ نجمع الدروس مع بعضها.
عندنا Status Codes:
نريد طباعة الأكواد التي ليست 200.
نكتب:
404 500
تعالى نمشي دورة دورة.
الدورة الأولى
status = 200. الشرط status != 200 يعني 200 != 200، والنتيجة False.
إذن لا يتم تنفيذ print(status).
الدورة الثانية
status = 404. الشرط يصبح 404 != 200، وده True.
إذن print(status) تطبع 404.
الدورة الثالثة
status = 200. الشرط False، فلا تتم الطباعة.
الدورة الرابعة
status = 500. الشرط 500 != 200 يعني True، فتطبع 500.
وعشان كده الناتج النهائي هو 404 و 500.
استخدام List فيها Dictionaries
دلوقتي ناخد شكل بيانات أقرب للشغل الحقيقي.
إحنا عندنا هنا List. داخل الـ List عندنا Dictionaries.
نجرب الأول:
{'url': '/home', 'status': 200}
{'url': '/about', 'status': 404}
{'url': '/services', 'status': 200}
{'url': '/contact', 'status': 500}ليه؟ لأن المتغير page في كل Iteration يحتوي على Dictionary كاملة.
page = {"url": "/home", "status": 200}أول دورةpage = {"url": "/about", "status": 404}ثاني دورة…وهكذا
طباعة الـ URL فقط
لو عايز قيمة url الموجودة داخل كل Dictionary:
/home /about /services /contact
ليه كتبنا page["url"]؟ لأن page نفسها Dictionary.
مثلًا في أول Iteration page تساوي {"url": "/home", "status": 200}، وعندما نكتب page["url"] نحصل على /home.
طباعة الصفحات التي بها مشكلة فقط
الآن نجمع: List + Dictionary + for + if.
الكود:
/about /contact
ليه؟
- 1أول صفحة
{"url": "/home", "status": 200}. الشرط200 != 200يعني False. لا يتم طباعة شيء. - 2ثاني صفحة
{"url": "/about", "status": 404}. الشرط404 != 200يعني True. فتتم طباعة/about. - 3ثالث صفحة Status الخاص بها 200، فلا تتم طباعتها.
- 4رابع صفحة Status الخاص بها 500، فتتم طباعة
/contact.
ثانيًا: range()
أحيانًا لا يكون عندك List تريد المرور عليها، لكن عايز تعمل شيء عددًا معينًا من المرات.
هنا نستخدم range().
مثال:
0 1 2 3 4
range(5) لم تطبع 5. لأن range(5) تبدأ من صفر، وتتوقف قبل 5.تحديد البداية والنهاية
ممكن تكتب:
1 2 3 4 5
ليه؟ لأن range(1, 6) تعني: ابدأ من 1 وتوقف قبل 6.
range(start, stop) — والـ stop لا تدخل في الناتج.إضافة Step
ممكن نكتب:
0 2 4 6 8
القيم هنا معناها: range(0, 10, 2) يعني ابدأ من 0، توقف قبل 10، تحرك كل مرة بمقدار 2.
0246810الرقم التالي، لكننا نتوقف قبل 10
ثالثًا: while
الـ Mindset
for تقول: عندي مجموعة عناصر، لف عليها.
لكن while تقول: استمر في التكرار طالما الشرط True.
يعني while لا تعتمد أساسًا على List، بل على Condition.
مثال بسيط:
1 2 3 4 5
تعالى نفهم ده بهدوء.
البداية
كتبنا number = 1. إذن حاليًا number تساوي 1.
بعدها while number <= 5 — Python تسأل: هل 1 أصغر من أو يساوي 5؟ الإجابة True، فتدخل داخل الـ while.
1 <= 5 → Trueتطبع 1، ثمnumber = 22 <= 5 → Trueتطبع 2، ثمnumber = 33 <= 5 → Trueتطبع 3، ثمnumber = 44 <= 5 → Trueتطبع 4، ثمnumber = 55 <= 5 → Trueتطبع 5، ثمnumber = 66 <= 5 → Falseفتتوقف
إذن الناتج النهائي: 1 و 2 و 3 و 4 و 5.
لماذا number = number + 1 مهمة؟
لو حذفناها:
1 1 1 1 1 1 1 1 ...
ماذا سيحدث؟ في البداية number = 1، والشرط 1 <= 5 يعني True، فتطبع 1. لكن number لم تتغير.
فتعود while وتسأل مرة أخرى 1 <= 5 — ما زالت True. فتطبع 1، ثم تعود مرة أخرى. وتستمر بلا نهاية.
Infinite Loop — يعني Loop لا تنتهي.إذن مع while اسأل نفسك دائمًا: ما الذي سيحدث داخل الـ Loop ويجعل الشرط يتحول في النهاية من True إلى False؟
في مثالنا number = number + 1 هي التي غيرت قيمة number.
TimeoutError بدل ما التاب يعلّق.الفرق الأساسي بين for و while
احفظ المنطق، وليس الكود.
for
عندي مجموعة عناصر وعايز أعمل حاجة على كل عنصر.
مثال SEO: for url in urls: يعني مر على كل URL.
while
عايز أكرر حاجة طالما شرط معين متحقق.
مثال: while attempts < 3: يعني استمر طالما عدد المحاولات أقل من 3.
رابعًا: break
قبل الكود، نفهم الـ Mindset.
break معناها: أوقف الـ Loop الحالية بالكامل الآن.مثال:
1 2
ليه لم يظهر 3 و 4 و 5؟ نمشي عليها.
number = 11 == 3يعني False، فتطبع 1number = 2الشرط False، فتطبع 2number = 33 == 3يعني True، فيتم تنفيذ breaknumber = 4لم نصل إليهاnumber = 5لم نصل إليها
break يعني: اخرج من الـ for فورًا. وبالتالي لا تصل إلى 4 و 5.
ولا يتم طباعة 3 نفسها، لأن break حدثت قبل print(number).
خامسًا: continue
الـ continue مختلفة.
مثال:
1 2 4 5
لاحظ إن 3 فقط اختفت. لكن 4 و 5 تم تنفيذهم عادي.
ليه؟ عندما number = 3 تم تنفيذ continue، ومعناها: خلاص، سيب باقي كود الـ Iteration الحالية وروح للـ Iteration التالية.
فالـ print() لم تعمل مع 3. لكن الـ Loop لم تتوقف — انتقلت إلى number = 4 ثم number = 5.
الفرق بين break و continue
شوف المثالين جنب بعض.
break
1 2
معناها: عند 3، وقف الـ Loop كلها.
continue
1 2 4 5
معناها: تجاهل 3 فقط وكمل.
break = وقف الـ Loop. continue = تجاهل الدورة الحالية فقط.مثال SEO على continue
عندنا:
نفترض إننا لا نريد معالجة الصور. نكتب:
/home /about /contact
مهم، استخدمنا هنا endswith() ومعناها ببساطة: هل النص ينتهي بشيء معين؟
True
لذلك عند الصور تم تنفيذ continue فتم تجاهلها.
Mindset سريع قبل المثال النهائي
دلوقتي عندنا أربع أفكار.
forعندي مجموعة عناصر، لف عليهاwhileكرر طالما الشرط Truecontinueتجاهل العنصر الحالي وكملbreakوقف الـ Loop الحالية بالكامل
دلوقتي هنضع الأربعة في مثال واحد. وده أهم مثال في الدرس.
المثال النهائي: for + while + continue + break
عندنا الكود:
/home /about /home /about /home /about
دلوقتي هنفكك المثال بالكامل.
أولًا: البيانات
دي List فيها 5 عناصر. بعدها:
يعني عدد المحاولات يبدأ بصفر.
أين تتبع attempts = attempts + 1؟
بص على الـ Indentation:
السطر attempts = attempts + 1 داخل الـ while. إذن هو تابع للـ while. لكنه ليس داخل الـ for.
لاحظ المستوى: while attempts < 3: وداخلها for url in urls:، وكل ما هو داخل for يأخذ Indentation إضافية مثل print(url). لكن attempts = attempts + 1 رجعنا مستوى للخلف.
for تخلص أو تتوقف، زود attempts بمقدار 1.نبدأ التنفيذ
في البداية attempts = 0. الـ while تختبر 0 < 3، والنتيجة True. إذن ندخل أول محاولة.
المحاولة الأولى
الـ for تبدأ من أول عنصر في List. وده مهم جدًا.
while تعيد تشغيل الكود، الـ for الجديدة تبدأ من أول الـ List، ولا تكمل من المكان الذي توقفت عنده في المحاولة السابقة.url = "/home"مش صورة، ومش/stop —فتطبع/homeurl = "/image.jpg"endswith(.jpg)يعني True، فـ continueurl = "/about"مش صورة، ومش/stop —فتطبع/abouturl = "/stop"الشرط True، فـ breakurl = "/contact"لم نصل إليهاattempts = 1بعد ما الـ for وقفت
إذن لا نصل إلى print(url) مع /image.jpg، ولذلك لا تظهر في النتيجة.
والـ break معناها: أوقف الـ for الحالية بالكامل. إذن لن تصل الـ for إلى العنصر التالي /contact. وده سبب مهم جدًا في إن /contact لا تظهر نهائيًا.
نخرج من الـ for لكننا ما زلنا داخل الـ while، فنصل إلى attempts = attempts + 1. وكانت attempts = 0 فتصبح attempts = 1.
المحاولة الثانية
الـ while تعود وتختبر 1 < 3 يعني True. إذن تبدأ دورة جديدة.
وهنا نقطة مهمة جدًا: الـ for الموجودة داخلها تبدأ مرة أخرى من /home وليس من /contact. ليه؟ لأن دي for جديدة بدأت من أول القائمة.
url = "/home"تطبع/homeurl = "/image.jpg"continueurl = "/about"تطبع/abouturl = "/stop"breakattempts = 2
المحاولة الثالثة
الـ while تسأل 2 < 3 يعني True. إذن تبدأ مرة ثالثة، والـ for تبدأ مرة أخرى من أول عنصر.
url = "/home"تطبع/homeurl = "/image.jpg"continueurl = "/about"تطبع/abouturl = "/stop"breakattempts = 3
هل توجد محاولة رابعة؟
الـ while ترجع لاختبار الشرط 3 < 3، والنتيجة False. إذن تتوقف.
لهذا حصلنا على 3 محاولات فقط.
0 < 3 → Trueالمحاولة الأولى1 < 3 → Trueالمحاولة الثانية2 < 3 → Trueالمحاولة الثالثة3 < 3 → Falseتوقف
لماذا /contact لم تظهر ولا مرة؟
لأن ترتيب القائمة هو /home ثم /image.jpg ثم /about ثم /stop ثم /contact. وفي كل محاولة، عندما تصل الـ for إلى /stop يتم تنفيذ break فتنتهي الـ for.
إذن لم تصل أصلًا إلى /contact. ولا في المحاولة الأولى، ولا الثانية، ولا الثالثة.
لماذا /image.jpg لم تظهر؟
لأن continue جعلت Python تتخطى هذه الـ Iteration فقط. يعني /image.jpg تم الوصول إليها، لكن تم تجاهلها.
أما /contact فالوضع مختلف: Python لم تصل إليها أصلًا بسبب break.
/image.jpg تم الوصول إليها ثم تجاهلها. contact لم يتم الوصول إليها أصلًا.الفرق بين continue و break داخل المثال
عند /image.jpg حدث continue، فكان المعنى: سيب العنصر ده وروح للعنصر اللي بعده. فانتقلنا إلى /about.
لكن عند /stop حدث break، فكان المعنى: وقف الـ for كلها. لذلك لم ننتقل إلى /contact.
Mindset الدرس بالكامل
لو قابلتك مشكلة وعايز تعرف تستخدم إيه، فكر هكذا.
عندي مجموعة بيانات
مثل URLs أو Keywords أو Status Codes أو Pages، وعايز أمر عليها واحدة واحدة؟ استخدم for.
عايز التكرار يستمر بناءً على شرط؟
مثل: استمر طالما attempts أقل من 3. استمر طالما فيه صفحة تالية. استمر طالما API ما زالت ترجع بيانات. استخدم while.
أنا داخل Loop وعايز أتجاهل العنصر الحالي فقط؟
مثل: لقيت صورة ومش عايز أحلل الصور. استخدم continue.
أنا داخل Loop وعايز أوقفها تمامًا؟
مثل: وصلت للحد الأقصى. وجدت العنصر الذي أبحث عنه. وصلت إلى قيمة معينة وأريد إنهاء العملية. استخدم break.
الاختبار
السؤال الأول
اشرح بأسلوبك الفرق بين for و while و continue و break. ولا أريد تعريفات محفوظة، أريد الـ Mindset بتاعتك لكل واحدة.
اكتب إجابتك الأول. الفايدة في إنك تحاول قبل ما تشوف.
السؤال الثاني
ما الناتج؟
السؤال الثالث
كم Iteration ستحدث في الكود ده؟ وما قيمة url في كل Iteration؟
السؤال الرابع
ما الناتج؟
السؤال الخامس
ما الناتج؟
السؤال السادس
ما الناتج؟
ولماذا لم يظهر الرقم 5؟
السؤال السابع
ما الناتج؟
السؤال الثامن
ما الناتج؟ واشرح لنفسك قيمة number في كل دورة.
السؤال التاسع
ما المشكلة في الكود ده؟ وما اسم المشكلة التي ستحدث؟
السؤال العاشر
ما الناتج؟ واشرح لنفسك لماذا لم يظهر رقم معين.
السؤال الحادي عشر
ما الناتج؟ واشرح لنفسك لماذا لم تظهر الأرقام الموجودة بعد 3.
السؤال الثاني عشر، أهم سؤال
اطبع الـ URLs التي الـ Status Code الخاص بها ليس 200
اكتب كود يستخدم for و if لطباعة الـ URLs التي الـ Status Code الخاص بها ليس 200.
السؤال الثالث عشر، تحدي الدرس
بدون تشغيل الكود، توقع الناتج بالكامل:
توقّع الناتج بالكامل قبل ما تشغّل.
كم محاولة ستحدث؟ ولماذا image.jpg و contact لم تظهرا؟
لو جاوبت على الأسئلة دي كلها وفهمت ليه /contact مظهرتش ولا مرة، يبقى انت فاهم الـ Loops فعلاً — مش حافظ شكلها.
بقيت تمارين لم تحلّها
0/15التمارين المتبقية: 15 من 15. يُحتسب الدرس مكتملًا حين تحلّها كلها، ويمكنك العودة إليها متى شئت.
أحسنت، وصلت إلى نهاية الدرس.