في البرمجة، يشير التكرار إلى تكرار نفس العملية أو المهمة عدة مرات. في بايثون، هناك نوعان مختلفان من التكرار، حلقة while
وحلقة for
. والفرق الرئيسي بينهما هو الطريقة التي يحددان بها دورة التنفيذ أو معايير التوقف.
تمر حلقة for عبر مجموعة من العناصر وتنفذ الكود داخل الحلقة لكل عنصر في المجموعة. هناك أنواع مختلفة من الكائنات في Python يمكن استخدامها كمجموعة، مثل القوائم والمجموعات والنطاقات والسلاسل.
من ناحية أخرى، تأخذ حلقة while
شرطًا وتستمر في التنفيذ طالما تم استيفاء الشرط. بعبارة أخرى، تتوقف الحلقة عن التنفيذ عندما يصبح الشرط خاطئًا (أي لم يتم استيفاؤه).
تتطلب حلقة for
مجموعة من العناصر ليتم تكرارها. حلقة while
أكثر عمومية ولا تتطلب مجموعة؛ يمكننا استخدامها من خلال توفير شرط فقط.
في هذه المقالة، سوف ندرس 8 أمثلة لمساعدتك في الحصول على فهم شامل لحلقات while
في بايثون.
المثال 1: حلقة While الأساسية في بايثون
دعونا نلقي نظرة على مثال بسيط لحلقة while
لفهم هيكلها ووظيفتها:
>>> i = 0
>>> while i < 5:
>>> print(i)
>>> i += 1
النتيجة:
0
1
2
3
4
الشرط في مثال حلقة while
هذا هو أن يكون المتغير i
أقل من 5. يتم تعيين القيمة الأولية للمتغير i
على 0 قبل حلقة while
. تتحقق حلقة while
أولاً من الشرط. نظرًا لأن 0 أقل من 5، يتم تنفيذ الكود الموجود داخل حلقة while
: يطبع قيمة i
ثم يزيد قيمة i
بمقدار 1. الآن قيمة i هي 1. ثم يعود الكود إلى بداية حلقة while
. نظرًا لأن 1 أقل من 5، يتم تنفيذ الكود الموجود داخل حلقة while
مرة أخرى.
تتكرر هذه الحلقة حتى يصبح المتغير i
هو 5. عندما يصبح المتغير i
هو 5، يتوقف الشرط i < 5
عن كونه صحيحًا ويتوقف تنفيذ حلقة while
. يمكن ترجمة حلقة while هذه إلى اللغة الإنجليزية البسيطة على أنها “بينما يكون i أقل من 5، اطبع i وزد قيمته بمقدار 1”.
هناك العديد من حالات الاستخدام لحلقات while
. دعنا نكتشفها من خلال حل بعض أمثلة حلقات while في Python. تأكد من زيارة حلقات بايثون: دليل شامل للمبتدئين لمعرفة المزيد عن حلقات while والمفاهيم الأساسية الأخرى.
المثال 2: استخدام عداد في حلقة while
لا نعرف دائمًا مسبقًا عدد المرات التي سيتم فيها تنفيذ الكود داخل حلقة while
. وبالتالي، من الجيد إعداد عداد داخل الحلقة. في مثال حلقة while
التالي، يمكنك معرفة كيفية استخدام العداد:
>>> counter = 0
>>> num = 0
>>> while num != 5:
>>> num = int(input("Tell me a number between 0 and 10: "))
>>> counter += 1
>>> print(f"You guessed the correct number in {counter} times.")
نبدأ بإنشاء متغير counter
عن طريق تعيين قيمته إلى 0. في هذه الحالة، نطلب من المستخدم إدخال رقم بين 0 و10. يتحقق الشرط في حلقة while
مما إذا كان إدخال المستخدم يساوي 5. طالما أن الإدخال ليس مساويًا لـ 5، فسيتم تنفيذ الكود داخل الحلقة حتى يُطلب من المستخدم إدخال رقم.
عندما يخمن المستخدم الرقم الصحيح (أي أن المدخل يساوي 5)، يخرج الكود من الحلقة. ثم نخبر المستخدم بعدد التخمينات التي استغرقها لتخمين الرقم الصحيح عن طريق طباعة قيمة العداد. لا تتردد في اختباره بنفسك لمعرفة كيفية عمل العداد في هذا المثال.
المثال 3: حلقة while مع قائمة
على الرغم من أن حلقات for
مفضلة عندما تريد تكرار قائمة، يمكننا أيضًا استخدام حلقة while
لهذه المهمة. إذا فعلنا ذلك، نحتاج إلى ضبط شرط حلقة while
بعناية. يتكرر مقطع التعليمات البرمجية التالي عبر قائمة تسمى cities ويطبع اسم كل مدينة في القائمة:
>>> cities = ["London", "Istanbul", "Houston", "Rome"]
>>> i = 0
>>> while i < len(cities):
>>> print(cities[i])
>>> i += 1
النتيجة:
London
Istanbul
Houston
Rome
هناك شيئان يجب فهمهما حول كيفية عمل حلقة while
هذه. تعطينا الدالة len()
طول قائمة المدن، والذي يساوي عدد العناصر في القائمة. يتم استخدام المتغير i
في مكانين. الأول في شرط حلقة while
، حيث نقارنه بطول القائمة. والثاني في فهرس القائمة لتحديد العنصر الذي سيتم طباعته من القائمة. يتم تهيئة المتغير بقيمة 0. يحدد التعبير cities[0]
العنصر الأول في القائمة، وهو لندن.
بعد تنفيذ دالة print()
داخل حلقة while
، تتم زيادة قيمة i
بمقدار 1 ويختار cities[1]
العنصر الثاني من القائمة، وهكذا. يخرج الكود من الحلقة عندما يصبح 4. بحلول ذلك الوقت، سيتم طباعة جميع العناصر الموجودة في القائمة.
القوائم هي واحدة من أكثر هياكل البيانات استخدامًا في بايثون. لكتابة برامج فعالة، تحتاج إلى فهم شامل للقوائم وكيفية التعامل معها.
المثال 4: حلقة while مع القاموس
إن إنشاء حلقة while
باستخدام القاموس يشبه إنشاء حلقة while
باستخدام قائمة. ومع ذلك، نحتاج إلى بعض العمليات الإضافية لأن القاموس عبارة عن بنية بيانات أكثر تعقيدًا.
يتكون القاموس في بايثون من أزواج مفتاح-قيمة. ماذا نعني بأزواج مفتاح-قيمة؟ يصف هذا بنية بيانات مكونة من جزأين حيث ترتبط القيمة بالمفتاح. في القاموس التالي، الأسماء هي المفاتيح والنتائج الرقمية المقابلة هي قيم القاموس:
>>> scores = {"Jane": 88, "John": 85, "Emily": 92}
توجد طرق مختلفة لتكرار القاموس. سننشئ حلقة while
تمر عبر قاموس scores وتطبع الأسماء ونتائجها:
>>> scores = {"Jane": 88, "John": 85, "Emily": 92}
>>> keys = list(scores.keys())
>>> i = 0
>>> while i < len(scores):
>>> print(keys[i], ":", scores[keys[i]])
>>> i += 1
النتيجة:
Jane : 88
John : 85
Emily : 92
يعيد التابع keys()
مفاتيح القاموس، والتي يتم تحويلها بعد ذلك إلى قائمة باستخدام منشئ list()
. وبالتالي، فإن متغير keys
الذي تم إنشاؤه قبل حلقة while
هو ['Jane', 'John', 'Emily']
. شرط حلقة while
مشابه للمثال السابق. يتم تنفيذ الكود داخل الحلقة حتى تصبح قيمة i
أكبر من عدد العناصر في القاموس (أي طول القاموس). يعطينا التعبير keys[i]
العنصر i
في قائمة keys
. يعطينا التعبير scores[keys[i]]
قيمة المفتاح المعطى بواسطة keys[i]
. على سبيل المثال، العنصر الأول في قائمة keys هو Jane ويعيد scores['Jane']
القيمة المرتبطة بـ Jane في قاموس scores، وهي 88.
المثال 5: حلقات while المتداخلة
حلقة while
المتداخلة هي ببساطة حلقة داخل حلقة أخرى. نوفر شروطًا منفصلة لكل حلقة while
. نحتاج أيضًا إلى التأكد من إجراء الزيادات بشكل صحيح حتى لا يدخل الكود في حلقة لا نهائية.
>>> i = 1
>>> while i < 10:
>>> j = 1
>>> while j < 10:
>>> print(i, "*", j, "=", i*j)
>>> j += 1
>>> i += 1
النتيجة:
1 * 1 = 1
1 * 2 = 2
1 * 3 = 3
1 * 4 = 4
1 * 5 = 5
1 * 6 = 6
1 * 7 = 7
1 * 8 = 8
1 * 9 = 9
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8
…
تم اختصار النتيجة الناتجة لأغراض العرض التوضيحي.
تمر الحلقة الأولى عبر الأعداد الصحيحة من 1 إلى 9. لكل تكرار للحلقة الأولى (أي لكل رقم من 1 إلى 9)، يتم تنفيذ حلقة while
الموجودة داخلها (أي الحلقة المتداخلة). تمر الحلقة المتداخلة في مثالنا أيضًا عبر الأعداد الصحيحة من 1 إلى 9.
إن التنفيذ داخل حلقة while الثانية هو ضرب قيمتي i وj. حيث أن i هي القيمة من حلقة while الخارجية وj هي القيمة من حلقة while المتداخلة. وبالتالي، يقوم الكود بتكرار الأعداد الصحيحة من 1 إلى 9 لكل عدد صحيح من 1 إلى 9.
في النتيجة، لدينا جدول ضرب. النقطة المهمة هنا هي إجراء الزيادات بدقة. يجب زيادة كل من المتغيرين i وj داخل حلقة while الخاصة بهما.
المثال 6: الحلقات اللانهائية وعبارة break
نظرًا لأن حلقات while تستمر في التنفيذ حتى لا يتم استيفاء الشرط المحدد بعد الآن، فقد ننتهي إلى حلقة لا نهائية إذا لم يتم تعيين الشرط بشكل صحيح.
فيما يلي مثال لحلقة while لا نهائية. القيمة الأولية لـ i هي 10 وتتحقق حلقة while مما إذا كانت قيمة i أكبر من 5، وهو أمر صحيح. داخل الحلقة، نطبع قيمة i ونزيدها بمقدار 1 حتى تكون دائمًا أكبر من 5 وستستمر حلقة while في التنفيذ إلى الأبد.
>>> i = 10
>>> while i > 5:
>>> print(i)
>>> i += 1
هناك طريقة أخرى لإنشاء حلقات while لا نهائية وهي عن طريق إعطاء الشرط كـ while True
.
>>> while True:
>>> # execute this code
توفر عبارة break
طريقة للخروج من الحلقة. حتى لو كان الشرط لا يزال صحيحًا، فعندما يرى الكود عبارة break
، فإنه سيخرج من الحلقة. دعنا نجري مثالاً لإظهار كيفية عمل break:
>>> scores = [54, 83, 67, 74, "fifty", 65, 87]
>>> i = 0
>>> while i < len(scores):
>>> if not isinstance(scores[i], int):
>>> break
>>> print(scores[i])
>>> i += 1
النتيجة
54
83
67
74
تمر حلقة while على قائمة scores وتطبع العناصر الموجودة فيها. قبل طباعة العنصر، يوجد عبارة if للتحقق مما إذا كان العنصر عددًا صحيحًا. إذا لم يكن كذلك، يخرج الكود من حلقة while بسبب عبارة break. إذا كان العنصر عددًا صحيحًا، يستمر تنفيذ الحلقة ويتم طباعة العنصر.
مثال 7: استخدام continue في حلقة while
إن عبارة continue
تشبه إلى حد كبير عبارة break. يخرج أمر break من حلقة while، وبالتالي يستمر الكود في تنفيذ القطعة التالية من الكود إذا كانت موجودة. من ناحية أخرى، تعيد continue عنصر التحكم إلى بداية حلقة while، وبالتالي يستمر تنفيذ حلقة while باستخدام القيمة التالية. دعنا نكرر مثال حلقة while السابق، هذه المرة باستخدام continue بدلاً من break لفهم الفرق:
>>> scores = [54, 83, 67, 74, "fifty", 65, 87]
>>> i = 0
>>> while i < len(scores):
>>> if not isinstance(scores[i], int):
>>> continue
>>> print(scores[i])
>>> i += 1
النتيجة:
54
83
67
74
65
87
عندما يكون هناك عبارة break ولم يتم استيفاء الشرط للقيمة “fifty”، يخرج الكود من حلقة while. ومع ذلك، عندما نستخدم عبارة continue، يستمر تنفيذ حلقة while من العنصر التالي، وهو 65.
المثال 8: حلقة while مع جملة else
في بايثون، يمكن استخدام حلقة while مع شرط else. عندما يصبح الشرط في حلقة while خاطئًا، يتم تنفيذ كتلة else. ومع ذلك، إذا كان هناك عبارة break داخل كتلة حلقة while، يخرج الكود من الحلقة دون تنفيذ كتلة else.
دعونا نأخذ مثالاً لفهم هذه الحالة بشكل أفضل:
>>> names = ["Jane", "John", "Matt", "Emily"]
>>> names_to_search = "John"
>>> i = 0
>>> while i < len(names):
>>> if name_to_search == names[i]:
>>> print("Name found!")
>>> break
>>> i += 1
>>> else:
>>> print("Name not found!")
النتيجة:
يبحث هذا الكود عن اسم في قائمة names المعطاة. وعند العثور على الاسم، يطبع “تم العثور على الاسم!” ويخرج من الحلقة. وإذا لم يتم العثور على الاسم بعد المرور عبر جميع الأسماء في قائمة names، يتم تنفيذ كتلة else، والتي تطبع “لم يتم العثور على الاسم!”.
إذا لم يكن لدينا عبارة break داخل حلقة while، فإن كتلة التعليمات البرمجية ستطبع كلاً من “تم العثور على الاسم!” و”لم يتم العثور على الاسم!” إذا كان الاسم موجودًا في القائمة. لا تتردد في اختبار ذلك بنفسك.
أخطاء while الشائعة
تعتبر حلقات while مفيدة جدًا لكتابة برامج قوية وفعالة. ومع ذلك، هناك بعض النقاط المهمة التي يجب وضعها في الاعتبار إذا كنت تريد استخدامها بشكل صحيح.
إن الخطأ الأكبر هو نسيان زيادة متغير الحلقة – أو عدم زيادته بشكل صحيح. قد يؤدي كلا الأمرين إلى حلقات لا نهائية أو حلقات لا تعمل كما هو متوقع. قد يتطلب هذا الأمر اهتمامًا إضافيًا، خاصة عند العمل مع حلقات متداخلة.
نصيحة أخرى: لا تفرط في استخدام عبارة break. ضع في اعتبارك أنها تخرج من حلقة while بالكامل. إذا وضعت عبارة break مع شرط if، فلن تنفذ حلقة while الجزء المتبقي. تذكر الأمثلة التي قمنا بها على عبارات break وcontinue. من الأفضل استخدام عبارة continue إذا كنت تريد إكمال الحلقة بالكامل.
لقد تعلمنا حلقات while في Python من خلال حل 8 أمثلة. ركز كل مثال على حالة استخدام محددة أو مكون معين من حلقات while. لقد تعلمنا أيضًا عبارات break وcontinue وكيف تعمل على تحسين وظائف حلقات while.
اكتشاف المزيد من بايثون العربي
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.