تدعم حلقات for عبارة break للخروج من الحلقة قبل الانتهاء من التكرار على العناصر القابلة للتكرار.
color_options = ["blue", "green", "purple"]
is_purple_an_option = False
for color in color_options:
if color == "purple":
is_purple_an_option = True
break
غالبًا ما تكون هناك طريقة أفضل لكتابة الكود الخاص بك من استخدام break في حلقة.
استخدام فحص الاحتواء بدلاً من ذلك
غالبًا ما يتم استخدام عبارة break في Python عندما تحتاج إلى شرط break مبكر، وهو شرط يشير إلى أنك لا تحتاج إلى تكرار المزيد لأنك وجدت ما تبحث عنه.
على سبيل المثال، إليك حلقة تتحقق من قيمة معينة ثم تنقطع:
color_options = ["blue", "green", "purple"]
is_purple_an_option = False
for color in color_options:
if color == "purple":
is_purple_an_option = True
break
حلقة for هذه تتحقق مما إذا كان العنصر القابل للتكرار يحتوي على قيمة معينة مرة واحدة على الأقل. إذا كان الأمر كذلك، نقلب متغيرًا منطقيًا من False إلى True.
بدلاً من استخدام حلقة for هذه، يمكننا استخدام عامل in الخاص بـ Python على العنصر القابل للتكرار الخاص بنا:
color_options = ["blue", "green", "purple"]
is_purple_an_option = "purple" in color_options
تدعم جميع العناصر القابلة للتكرار عامل in وفي الواقع في بعض العناصر القابلة للتكرار (مثل المجموعات والقواميس) يكون ذلك أسرع من التكرار.
التحقق مما إذا كان بعض/كل العناصر يتطابق مع حالة معينة
ماذا لو كنا نتحقق من حالة أكثر تفصيلاً والتي لا تمثل المساواة تمامًا؟
points_per_user = [3, 12, 28, 105]
anyone_has_one_hundred_points = False
for points in points_per_user:
if points > 100:
anyone_has_one_hundred_points = True
break
للتحقق مما إذا كانت أي عناصر تطابق حالة أكثر تعقيدًا، يمكننا استخدام any أو all:
points_per_user = [3, 12, 28, 105]
anyone_has_one_hundred_points = any(
points > 100
for points in points_per_user
)
دوال any وall في بايثون تُنتج أكوادًا أكثر وصفًا من نظيراتها في حلقة for.
العثور على أول قيمة مطابقة
لذا يمكننا استخدام any أو all أو مشغل بايثون للتحقق من الشروط… ولكن ماذا لو احتجنا إلى الحصول على القيمة الفعلية المطابقة بدلاً من مجرد قيمة منطقية تشير إلى ما إذا كان هناك تطابق أم لا؟
words = ["Look", "at", "these", "excellent", "words"]
first_long_word = None
for word in words:
if len(word) > 4:
first_long_word = word
break
ولتحقيق هذه الغاية، يمكننا استخدام تعبير المولد والدالة التالية المضمنة:
words = ["Look", "at", "these", "excellent", "words"]
long_words = (
word
for word in words
if len(word) > 4
)
first_long_word = next(long_words, None)
لاحظ أيضًا أنه إذا كان الأشخاص الذين تعمل معهم غير ملمين بـ next، فقد يكون نهج حلقة for أكثر وضوحًا وبالتالي أكثر تفضيلًا.
جمع العناصر حتى يتم استيفاء الشرط
حسنًا، مثال شائع آخر: ماذا لو احتجنا إلى التكرار حتى يتم استيفاء شرط معين، وجمع كل العناصر قبل أن يصبح هذا الشرط صحيحًا؟
items = ["chair", "desk", "", "lamp", "rubber duck"]
all_items_before_a_blank = []
for item in items:
if not item:
break
all_items_before_a_blank.append(item)
تحتوي وحدة itertools في Python على أداة يمكنها القيام بذلك تمامًا:
from itertools import takewhile
items = ["chair", "desk", "", "lamp", "rubber duck"]
all_items_before_a_blank = list(takewhile(bool, items))
تقبل أداة takewhile دالةً مُسندةً (نعم، يُمكن تمرير الدوال إلى دوال أخرى في بايثون) وكائنًا قابلًا للتكرار للتكرار فوقه. تُمرر كل كائن قابل للتكرار إلى دالة المُسند، ومن ثم تُعيد الدالة القيمة True طالما أنها تُريد الاستمرار في قبول القيم.
تعيد دالة takewhile مُكررًا (قابلاً للتكرار كسولًا)، تمامًا كما تفعل معظم أدوات التكرار المساعدة في itertools.
ضع في اعتبارك بدائل عبارة break
عبارة break مفيدة. غالبًا ما يُمكن إعادة كتابة الحلقات التي تتضمن شروط break مبكرة لاستخدام أداة مساعدة تُؤدي وظيفة break المبكرة، ولكن ليس دائمًا (وأحيانًا لا تُسهّل قراءتها).
في المرة القادمة التي تجد نفسك تستخدم عبارة break في حلقة for اسأل نفسك: “ما هو الغرض من هذه العبارة break” و”هل يوجد مساعد حلقة في Python يمكن أن يساعدني في إنجاز هذا؟”
| عندما تريد | بدلاً من break، ضع في اعتبارك |
|---|---|
| التحقق من وجود قيمة | in المعامل |
| التحقق مما إذا كان أي عنصر يتطابق مع الحالة | any() دالة |
| ابحث عن أول عنصر مطابق | next() مع مولد |
| جمع العناصر حتى الشرط | itertools.takewhile() |
اكتشاف المزيد من بايثون العربي
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.