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

السؤال

نشر

ما الغرض من إمكانية إستعمال جملة else مع جملة for كما في الكود التالي:

for i in range(10):
    print(i)

    if i == 9:
        print("Found 9")
        break;
else:
    print("Completed successfully")

لماذا لا يتم كتابة دالة print الأخيرة بعد حلقة for بشكل مباشر فقط كالتالي:

for i in range(10):
    print(i)

    if i == 9:
        print("Found 9")
        break;

print("Completed successfully")

ألن يكون من الأسهل فعل ذلك؟ أم هل يوجد فرق بين الطريقة الأولى والثانية؟

Recommended Posts

  • 1
نشر
بتاريخ 3 ساعات قال Fahmy Mostafa:

لماذا لا يتم كتابة دالة print الأخيرة بعد حلقة for بشكل مباشر فقط كالتالي:

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

بتاريخ 3 ساعات قال Fahmy Mostafa:

 


for i in range(10):
    print(i)

    if i == 9:
        print("Found 9")
        break;
else:
    print("Completed successfully")

 

سيتم طباعة كل الأعداد من 0 ل 9 و عند الوصول ل 9 سيتحقق الشرط و يتم تنفيذ break و هنا الحلقة لن يتم إكماله بشكل عادي و بالتالي لن يتم تنفيذ جزء else جرب مثلا التالي:

for i in range(3):
    print(i)

    if i == 9:
        print("Found 9")
        break;
else:
    print("Completed successfully")

سيكون الخرج:

0
1
2
Completed successfully

أي أن جزء else قد تم تنفيذه و بالتالي فإنه قد تم تنفيذ الحلقة كلها و الخروج منها بشكل عادي.

لنٌعطِ مثال آخر و لنفترض أنه طُلب منك إنشاء دالة search للبحث عن عُنصر ما في قائمة و إرجاع الفهرس المتواجد به إن وُجد بإستعمال حلقة for فإذا تم إيجاد العُنصر يتم الخروج من الحلقة دون اكمال بقية العناصر و إذا لم يتم إيجاد العُنصر يتم إرجاع -1

أمامك طريقين إستخدام مُتغير بولياني و تهيئته ب false و عند إيجاد العُنصر يُصبح true ثم القيم ب break للحلقة ثم فحص قيمة المُتغير البولياني و إرجاع القيمة المناسبة:

def search(lst, s):
    found = False
    for i, val in enumerate(lst):
        if val == s:
            found = True
            break
    if not found:
        return -1;
    return i
  
lst = ["foo", "bar", "baz"]
print(search(lst, "baz")) # 2
print(search(lst, "faz")) # -1

أو إستخدام الطريقة for .. else و الإستغناء عن المتغير البولياني:

def search(lst, s):
    for i, val in enumerate(lst):
        if val == s:
            break
    else:
        return -1;
    return i
    
lst = ["foo", "bar", "baz"]    
print(search(lst, "baz")) # 2
print(search(lst, "faz")) # -1

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

  • 0
نشر

هذه بنية برمجية غريبة بعض الشيئ وغير موجودة في باقِ اللغات المشهورة، لكنها تقوم بتعريف لبنة برمجية code block لتتنفذ مع بعضها، حيث أن الجزء الخاص ب else سيعمل دائما بعد إنتهاء الحلقة بشكل كامل (أي بدون وجود break قد تمت خلال تكرار الحلقة) وهي مخالفة لحالة if - else بالمنطق بالنسبة ل else.

الشكل العام لها:

for item in sequence:
    process(item)
else:  # no break
    suite

كمثال لاستخدامها، إن أردنا طباعة نتيجة هل العدد أولي أم لا، حيث يجب التأكد من عدم وجود قاسم لهذا العدد ضمن المجال من 2 حتى n-1 حسب المثال، فإذا انتهت الحلقة بدون break (وجود قاسم للعدد) ستتم طباعة أن العدد أولي:

>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             print(n, 'equals', x, '*', n//x)
...             break # عدد غير أولي لوجود قاسم
...     else:
...         # عدم كسر الحلقة أي عدم وجود قاسم فالعدد أولي
...         print(n, 'is a prime number')

 

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...