جملة الإيقاف break في بايثون (Break Statement)

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

جملة break هي أداة قوية للتحكم في تدفق البرنامج. تسمح لك بإيقاف حلقة التكرار فوراً والخروج منها، بغض النظر عن الشرط الأصلي للحلقة. هذا يوفر الوقت وموارد الحاسوب، ويجعل برامجك أكثر كفاءة وذكاءً.

في هذا الدرس المفصل، ستتعلم كل ما تحتاجه عن جملة break: متى تستخدمها، كيف تعمل مع الحلقات المتداخلة، وكيف تتفاعل مع جملة else في الحلقات.

1. مفهوم جملة break وآلية عملها

جملة break هي كلمة مفتاحية محجوزة في بايثون تُستخدم حصرياً داخل حلقات التكرار (for و while). وظيفتها بسيطة وحاسمة: الخروج الفوري من الحلقة الحالية. بمجرد أن يرى المفسر كلمة break، يحدث التالي:

  1. التوقف الفوري: يتوقف تنفيذ أي كود متبقي في الدورة الحالية
  2. تجاهل الدورات المتبقية: لا يتم تنفيذ أي دورات تكرار مستقبلية
  3. تخطي else: لا يتم تنفيذ كتلة else التابعة للحلقة إن وجدت
  4. الانتقال: ينتقل التنفيذ مباشرة لأول سطر بعد الحلقة
basic_break_concept.py
# مثال توضيحي: البحث عن عنصر في قائمة
products = ["Laptop", "Phone", "Tablet", "Camera", "Watch", "Speaker"]
target = "Camera"

print("بدء البحث في قائمة المنتجات:")
print("-" * 40)

for product in products:
    print(f"   فحص المنتج: {product}")
    
    if product == target:
        print(f"\n   [تم العثور على {target}]")
        print("   إيقاف البحث فوراً...")
        break  # الخروج من الحلقة
    
print("-" * 40)
print("انتهى تنفيذ البرنامج")
النتيجة
بدء البحث في قائمة المنتجات: ---------------------------------------- فحص المنتج: Laptop فحص المنتج: Phone فحص المنتج: Tablet فحص المنتج: Camera [تم العثور على Camera] إيقاف البحث فوراً... ---------------------------------------- انتهى تنفيذ البرنامج
ملاحظة: لاحظ أنه لم يتم فحص "Watch" و "Speaker" لأن break أوقفت الحلقة بمجرد العثور على "Camera".

2. استخدام break مع حلقة for

مع حلقة for، تُستخدم break عادةً عندما نبحث عن عنصر معين في مجموعة ونريد التوقف بمجرد العثور عليه، أو عندما نريد معالجة عناصر حتى نصل لشرط معين.

مثال: إيجاد أول رقم سالب

find_first_negative.py
# البحث عن أول رقم سالب في قائمة
numbers = [5, 12, 8, 3, -7, 15, -2, 9]

print("البحث عن أول رقم سالب:")
print("-" * 30)

first_negative = None

for num in numbers:
    print(f"فحص الرقم: {num}")
    
    if num < 0:
        first_negative = num
        print(f"   -> تم العثور على رقم سالب!")
        break

print("-" * 30)
if first_negative is not None:
    print(f"أول رقم سالب هو: {first_negative}")
else:
    print("لا توجد أرقام سالبة في القائمة")
النتيجة
البحث عن أول رقم سالب: ------------------------------ فحص الرقم: 5 فحص الرقم: 12 فحص الرقم: 8 فحص الرقم: 3 فحص الرقم: -7 -> تم العثور على رقم سالب! ------------------------------ أول رقم سالب هو: -7

مثال: تحديد حد أقصى للمعالجة

limit_processing.py
# معالجة عناصر حتى الوصول لحد معين
items = ["item1", "item2", "item3", "item4", "item5", "item6", "item7"]
max_items = 4

print(f"معالجة أول {max_items} عناصر فقط:")
print("-" * 30)

processed = 0
for item in items:
    if processed >= max_items:
        print(f"\n[تم الوصول للحد الأقصى: {max_items} عناصر]")
        break
    
    print(f"معالجة: {item}")
    processed += 1

print("-" * 30)
print(f"تمت معالجة {processed} عناصر من أصل {len(items)}")

3. استخدام break مع حلقة while

جملة break تصبح أكثر أهمية مع حلقة while، خاصة مع نمط while True (الحلقة اللانهائية المتعمدة). هذا النمط شائع جداً في البرامج التفاعلية والألعاب والخوادم.

interactive_menu.py
# قائمة تفاعلية
print("=" * 40)
print("        القائمة الرئيسية")
print("=" * 40)
print("1. عرض الرصيد")
print("2. إيداع مبلغ")
print("3. سحب مبلغ")
print("4. الخروج")
print("-" * 40)

balance = 1000

while True:
    choice = input("\nاختر رقم العملية: ")
    
    if choice == "1":
        print(f"   الرصيد الحالي: {balance} ريال")
        
    elif choice == "2":
        amount = int(input("   المبلغ المراد إيداعه: "))
        balance += amount
        print(f"   تم الإيداع. الرصيد الجديد: {balance} ريال")
        
    elif choice == "3":
        amount = int(input("   المبلغ المراد سحبه: "))
        if amount <= balance:
            balance -= amount
            print(f"   تم السحب. الرصيد الجديد: {balance} ريال")
        else:
            print("   رصيد غير كاف!")
            
    elif choice == "4":
        print("\n   جاري الخروج...")
        print("   شكراً لاستخدامك النظام")
        break  # الخروج من الحلقة اللانهائية
        
    else:
        print("   اختيار غير صحيح!")

print("=" * 40)

مثال: التحقق من صحة الإدخال مع حد للمحاولات

input_validation.py
# التحقق من إدخال رقم صحيح
print("أدخل رقماً بين 1 و 100")
max_attempts = 5
attempts = 0

while attempts < max_attempts:
    attempts += 1
    user_input = input(f"[{attempts}/{max_attempts}] أدخل الرقم: ")
    
    # التحقق من أن الإدخال رقم
    if not user_input.isdigit():
        print("   يجب إدخال رقم صحيح!")
        continue
    
    number = int(user_input)
    
    # التحقق من النطاق
    if 1 <= number <= 100:
        print(f"   تم قبول الرقم: {number}")
        break  # إدخال صحيح، الخروج
    else:
        print("   الرقم يجب أن يكون بين 1 و 100")
else:
    # يُنفذ فقط إذا استنفدت المحاولات بدون break
    print("\n   استنفدت جميع المحاولات!")

4. break والحلقات المتداخلة (Nested Loops)

من أهم النقاط التي يجب فهمها جيداً: جملة break تؤثر فقط على الحلقة الأقرب إليها (الحلقة التي تحتويها مباشرة). إذا كنت داخل حلقة متداخلة، فإن break ستخرجك من الحلقة الداخلية فقط، وستستمر الحلقة الخارجية في العمل.

nested_break_behavior.py
# توضيح سلوك break مع الحلقات المتداخلة
print("جدول الضرب المحدود")
print("=" * 40)

for i in range(1, 4):  # الحلقة الخارجية
    print(f"\nجدول ضرب العدد {i}:")
    
    for j in range(1, 10):  # الحلقة الداخلية
        result = i * j
        
        if result > 15:
            print(f"   [توقف: النتيجة تجاوزت 15]")
            break  # يخرج من الحلقة الداخلية فقط
        
        print(f"   {i} x {j} = {result}")
    
    print(f"   انتهى جدول العدد {i}")

print("\n" + "=" * 40)
print("انتهى البرنامج")
النتيجة
جدول الضرب المحدود ======================================== جدول ضرب العدد 1: 1 x 1 = 1 1 x 2 = 2 ... 1 x 9 = 9 انتهى جدول العدد 1 جدول ضرب العدد 2: 2 x 1 = 2 ... 2 x 7 = 14 [توقف: النتيجة تجاوزت 15] انتهى جدول العدد 2 جدول ضرب العدد 3: 3 x 1 = 3 ... 3 x 5 = 15 [توقف: النتيجة تجاوزت 15] انتهى جدول العدد 3 ======================================== انتهى البرنامج

كيفية الخروج من جميع الحلقات

إذا أردت الخروج من جميع الحلقات المتداخلة، يمكنك استخدام متغير علم (Flag) أو وضع الحلقات في دالة واستخدام return.

break_all_loops.py
# الطريقة الأولى: استخدام متغير علم
found = False
target = 5

for i in range(3):
    if found:
        break
    for j in range(3):
        if found:
            break
        value = i * 3 + j
        print(f"فحص: ({i}, {j}) = {value}")
        if value == target:
            print(f"   تم العثور على {target}!")
            found = True

# الطريقة الثانية: استخدام دالة (أفضل)
def search_matrix():
    for i in range(3):
        for j in range(3):
            value = i * 3 + j
            if value == target:
                return (i, j)  # الخروج من كل شيء
    return None

5. العلاقة بين break و else في الحلقات

هنا تظهر إحدى أقوى ميزات بايثون: جملة else مع الحلقات. الكود في كتلة else يُنفذ فقط إذا انتهت الحلقة بشكل طبيعي، أي بدون استخدام break. هذا مفيد جداً في خوارزميات البحث.

السيناريو هل يُنفذ else؟
الحلقة انتهت بشكل طبيعي (اكتمل التكرار) نعم
الحلقة توقفت بسبب break لا
الحلقة لم تُنفذ أصلاً (شرط while خاطئ من البداية) نعم
break_vs_else_demo.py
# التحقق مما إذا كان الرقم أولياً
def is_prime(n):
    if n < 2:
        return False
    
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False  # ليس أولياً
    
    return True  # أولي

# اختبار عدة أرقام
numbers_to_check = [17, 24, 31, 45, 53]

print("فحص الأرقام الأولية:")
print("-" * 35)

for num in numbers_to_check:
    for i in range(2, num):
        if num % i == 0:
            print(f"{num}: ليس أولياً (يقبل القسمة على {i})")
            break
    else:
        # ينفذ فقط إذا لم يتم استخدام break
        print(f"{num}: رقم أولي")

print("-" * 35)
النتيجة
فحص الأرقام الأولية: ----------------------------------- 17: رقم أولي 24: ليس أولياً (يقبل القسمة على 2) 31: رقم أولي 45: ليس أولياً (يقبل القسمة على 3) 53: رقم أولي -----------------------------------

6. تطبيق عملي شامل: نظام تسجيل دخول آمن

لنبني نظام تسجيل دخول احترافي يجمع كل ما تعلمناه: محاولات محدودة، تأخير بين المحاولات، وتتبع المحاولات الفاشلة.

secure_login_system.py
import time

# بيانات النظام
users = {
    "admin": "admin123",
    "user1": "password1",
    "guest": "guest"
}

max_attempts = 3
lockout_time = 30  # ثانية

print("=" * 45)
print("           نظام تسجيل الدخول الآمن")
print("=" * 45)

attempts = 0
login_success = False

while attempts < max_attempts:
    attempts += 1
    remaining = max_attempts - attempts
    
    print(f"\n[المحاولة {attempts} من {max_attempts}]")
    username = input("اسم المستخدم: ")
    password = input("كلمة المرور: ")
    
    # التحقق من البيانات
    if username in users and users[username] == password:
        login_success = True
        print("\n" + "-" * 45)
        print(f"   تم تسجيل الدخول بنجاح!")
        print(f"   مرحباً، {username}")
        break
    else:
        print("   بيانات خاطئة!")
        if remaining > 0:
            print(f"   المحاولات المتبقية: {remaining}")
        else:
            print("\n" + "-" * 45)
            print("   تم استنفاد جميع المحاولات!")
            print(f"   تم قفل الحساب لمدة {lockout_time} ثانية")

print("=" * 45)

if login_success:
    print("يمكنك الآن استخدام النظام...")
else:
    print("يرجى المحاولة لاحقاً أو الاتصال بالدعم")

7. أفضل الممارسات والتحذيرات

متى تستخدم break
  • عند البحث والعثور على العنصر المطلوب
  • للخروج من حلقات while True
  • عند تحقق شرط يوجب إيقاف المعالجة
  • لتحسين الأداء بتجنب تكرارات غير ضرورية
  • عند حدوث خطأ يستوجب التوقف
تحذيرات
  • الإفراط في استخدام break يصعب قراءة الكود
  • تذكر أنها تؤثر على الحلقة الأقرب فقط
  • لا تستخدمها خارج الحلقات (ستحصل على خطأ)
  • فكر في بدائل مثل تعديل شرط الحلقة
  • وثق سبب استخدام break بتعليق
ملخص الدرس
  • جملة break توقف الحلقة فوراً وتخرج منها
  • تعمل مع for و while فقط
  • تؤثر على الحلقة الأقرب فقط في حالة الحلقات المتداخلة
  • تمنع تنفيذ كتلة else التابعة للحلقة
  • مفيدة جداً في خوارزميات البحث والتحقق

السؤال التالي: ماذا لو أردنا تخطي دورة معينة فقط بدلاً من إيقاف الحلقة بالكامل؟

الخطوة التالية

تعلم كيفية تخطي دورة محددة والانتقال للدورة التالية باستخدام continue

الدرس التالي: جملة continue (تخطي الدورة)
المحرر الذكي

اكتب الكود وشاهد النتيجة فوراً

جرب الآن مجاناً
قناة ديف عربي

تابع أحدث الدروس والتحديثات مباشرة على واتساب

انضم الآن