اذهب إلى المحتوى
  • 0

سؤال

بدر عبدالكريم عبدالجبار

السؤال

نشر

السلام عليكم

عندي مشكلة في فهم الكود الذي في الصورة المرفقة ؟ لم أفهم لماذا ظهر سطر الطباعة (الذي مكتوب في السطر ١٢) في الناتج النهائي ؟

عندي مشكلة في فهم (else) المربوطة مع (for) ؟ متى يتم تفعيل الكود الذي بداخلها ؟

Screenshot 2026-11-01 at 6.03.20 AM.png

Recommended Posts

  • 0
نشر

قاعدة for ... else

الكتلة التي داخل else المربوطة بـ for تنفذ إذا انتهت الحلقة بشكل طبيعي دون أن تنفذ break.

يعني إذا انتهت الحلقة وحدها (مرت على كل العناصر) - ينفذ else و إذا خرجت من الحلقة بـ break - لا ينفذ else ويمكن قراءتها هكذا for ... وإن لم يحدث break فنفذ else

لماذا ظهرت الرسالة عندك؟

المشكلة في مكان كتابة else (مستوى المسافة البادئة / indentation) في الصورة، else مكتوبة عند بداية السطر تماماً، أي أنها تتبع الحلقة الخارجية for school_name, وليس if.

وهذا ما حدث عند إدخال 2200 الحلقة الخارجية مرت على Codezilla ولم تجد تطابقاً ثم مرّت على Oxford ووجدت "2200"، فطبعت الرسالة وتنفذ break لكن هذا break يكسر الحلقة الداخلية فقط (حلقة student_code) ولا يكسر الحلقة الخارجية فتنتهي الحلقة الخارجية بشكل طبيعي (لم يكن هناك break مباشر داخلها) - فينفذ else - تظهر رسالة The student is not our schools.

يجب أن نكسر الحلقتين معاً عند العثور على الطالب أبسط طريقة هي استخدام متغير علامة (flag) 

schools = {
    "Codezilla": {"1100": "Mo Gouda", "1101": "Islam Hesham"},
    "Oxford": {"2200": "Badri A.", "2201": "Imano A."},
}

user_input = input("Enter School or Student Code: ").strip().lower()

found = False

for school_name, school_students in schools.items():
    for student_code, student_name in school_students.items():
        if user_input == student_code or user_input == student_name.lower():
            print(f"\nThe student ({student_name}) is in this school: {school_name}")
            found = True
            break          # يكسر الحلقة الداخلية
    if found:
        break              # يكسر الحلقة الخارجية

else:
    print("\nThe student is not in our schools")

الآن عند إدخال 2200 سيحدث break داخلي ثم break خارجي، فلن ينفذ else.

  • 0
نشر

أمر الإيقاف break يقوم بإنهاء الحلقة الداخلية فقط، بينما تكتمل الحلقة الخارجية حتى النهاية دون أن تتعرض لأي break خاص بها، مما يؤدي لتفعيل الـ else المربوطة بها.

الكود الموجود داخل else التابعة لحلقة for يتم تنفيذه في حالة واحدة فقط، إذا انتهت حلقة for بشكل طبيعي وكامل دون أن يتم كسرها أو إيقافها بواسطة الأمر break، أي يمكنك اعتبار كلمة else هنا وكأنها تعني nobreak.

لديك حلقتا تكرار متداخلتان: حلقة خارجية للمدارس السطر 6، وحلقة داخلية للطلاب السطر 7.

جملة else تقع على نفس مستوى المسافة البادئة للحلقة الخارجية، مما يعني أنها مربوطة بالحلقة الخارجية وليس الداخلية، حيث مفسر بايثون يقوم بتفسير الكود بناءً على المسافات في بداية الأسطر.

عندما أدخلت الرقم 2200، وجده البرنامج داخل مدرسة Oxford، فقام بطباعة جملة تواجد الطالب  ثم نفذ الأمر break والذي أوقف الحلقة الداخلية فقط (بحث الطلاب داخل مدرسة Oxford)، لكنه لم يوقف الحلقة الخارجية.

بعد توقف الحلقة الداخلية، عاد البرنامج للحلقة الخارجية، وبما أن Oxford هي آخر مدرسة في القاموس، فقد انتهت الحلقة الخارجية بشكل طبيعي.

لأن الحلقة الخارجية انتهت طبيعياً دون أن يوقفها break خاص بها، قام بايثون بتفعيل الـ else التابعة لها وطبع الرسالة الموجودة في السطر 12.

للخروج من الحلقتين معاً فور العثور على الطالب ومنع تنفيذ else، قم بتمرير أمر continue و break معاً لإيقاف الحلقة الخارجية أيضاً كما يلي:

for school_name, school_students in schools.items():
    for student_code, student_name in school_students.items():
        if (user_input == student_code) or (user_input == student_name.lower()):
            print(f"\nThe student ({student_name}) is in this school: {school_name}")
            break
    else:
        continue  
    break  
else:
    print("\nThe student is not in our schools")

 

  • 0
نشر

وعليكم السلام ورحمة الله وبركاته .

في لغة بايثون يمكنك وضع جملة else بعد حلقة التكرار for :

  • وينفذ الكود الذي بداخل ال else فقط إذا انتهت حلقة ال for بشكل طبيعي وكامل أي عبرت على جميع العناصر في القواميس أو القوائم حتى نهايتها.
  • وإذا تم إيقاف حلقة ال for في منتصف عملها باستخدام أمر break فإن كود ال else يتخطى ولا يتم تنفيذه أبدا.

أما بخصوص ظهور سطر 12 فالسبب يعود إلى مكان وضع ال break و المسافات البادئة (Indentation) لل else :

  • ال break أوقفت الحلقة الداخلية فقط قفي السطر رقم 10 أمر ال break موجود داخل الحلقة الداخلية وعندما أدخلت 2200 وجد الطالب وطبع رسالة النجاح في السطر 9 ثم نفذ break. ولكن هذا ال break أخرج البرنامج من الحلقة الداخلية فقط ولم يخرج من الحلقة الخارجية.
  • أما الحلقة الخارجية أكملت دورتها فبعد خروج البرنامج من الحلقة الداخلية استمرت الحلقة الخارجية حتى انتهت بشكل طبيعي دون أن تواجه أي break يخصها هي بالذات.
  • وال else تابعة للحلقة الخارجية وبما أن الحلقة الخارجية انتهت بشكل طبيعي دون انقطاع فاعتبرت بايثون أن حلقة ال for انتهت بنجاح كامل فقامت بتنفيذ ال else وطبعت رسالة الخطأ : The student is not our schools.

ولكي تتجنب طباعة رسالة الخطأ عندما يتم العثور على الطالب بالفعل يمكنك استخدام متغير تحكم (Flag) لإيقاف الحلقة الخارجية أيضا أو نقل الكود داخل دالة (function) واستخدام return.

found = False  # متغير علم للتحقق

for school_name, school_students in schools.items():
    for student_code, student_name in school_students.items():
        if (user_input == student_code) or (user_input == student_name):
            print(f"\nThe student ({student_name}) is in this school: {school_name}")
            found = True
            break
    if found:
        break
        
if not found:
    print("\nThe student is not our schools")

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...