حلقات بايثون: دليل شامل للمبتدئين

التكرار هو جانب أساسي من لغات البرمجة. فهو يسمح لك بتنفيذ جزء من التعليمات البرمجية بشكل متكرر حتى يتم استيفاء شرط الخروج، وعند هذه النقطة سينتقل البرنامج إلى الجزء التالي من التعليمات البرمجية. في بايثون، هناك نوعان مختلفان من التكرار: حلقة for وحلقة while. كل حلقة لها طريقتها الخاصة في التنفيذ والخروج، ومعرفة متى تستخدم الحلقة الصحيحة هي مهارة مهمة للمبرمجين المبتدئين. في هذا الدليل الشامل، سنشرح كل ما تحتاج إلى معرفته حول التكرار في بايثون.

حلقة for

تُستخدم حلقة for في بايثون عندما يكون لديك كتلة من التعليمات البرمجية التي تريد تنفيذها عددًا ثابتًا من المرات. لتنفيذ حلقة for، تحتاج إلى البدء بعنصر قابل للتكرار، على سبيل المثال قائمة أو مصفوفة. ثم قم ببساطة بتكرار محتويات العنصر القابل للتكرار. لنبدأ بتحديد قائمة ببعض الأعداد الصحيحة، والتي يمكننا بعد ذلك تكرارها على النحو التالي:

>>> data = [2, 5, 3, 7]
>>> for element in data:
...     print(element)
... print('finished')
2
5
3
7
finished

في التكرار الأول لحلقة for، يتم تعيين المتغير element إلى القيمة الأولى في القائمة؛ ثم يتم طباعته في وحدة التحكم. يتم تكرار ذلك لكل قيمة في القائمة، وعند هذه النقطة تنتهي الحلقة.

لاحظ أن كتلة كود print(element) لها مسافة بادئة. تخبر المسافة البادئة البرنامج بما يوجد داخل الحلقة. نظرًا لعدم وجود مسافة بادئة للسطر الأخير، فهو خارج الحلقة ويتم تنفيذه مرة واحدة فقط عند انتهاء الحلقة.

لفهم آلية العمل بشكل أفضل، حاول وضع مسافة بادئة لسطر print('finished') بحيث يكون داخل الحلقة. قم بتشغيل الكود مرة أخرى وشاهد ما يحدث.

أخيرًا، بدلاً من استخدام عبارة print() البسيطة، يمكن تنفيذ أي كتلة أخرى من التعليمات البرمجية أو دالة داخل الحلقة.

حلقات for مع ()range

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

لنبدأ بالتفكير في دالة range()، والتي ستستخدمها طوال الوقت للتكرار. تحتوي على ثلاثة وسيطات: start وstop وstep. مطلوب فقط stop؛ الوسيطتان start وstep لهما قيمتان افتراضيتان 0 و1 على التوالي. إليك كيفية تنفيذ حلقة for باستخدام range():

>>> for index in range(1, 7, 2):
...     print(index)
1
3
5

هنا، قمنا بتعريف start = 1، وstop = 7، وstep = 2، مما يؤدي إلى طباعة كل رقم ثاني بين 1 و7. لاحظ أن الحلقة تنتهي قبل الرقم 7، حيث لا يتم تضمين قيمة stop في ناتج دالة range().

في المثال التالي، سنستخدم الدالتين المضمنتين range() وlen() لتنفيذ حلقة for، كما هو موضح أدناه:

>>> data = [2, 5, 3, 7]
>>> for index in range(len(data)):
...     print(data[index])
2
5
3
7

نتيجة الحلقة هي نفس المثال الأول (بدون عبارة print('finished')). بدلاً من التكرار مباشرةً عبر عناصر القائمة، نكرر عبر الفهارس التي تم إنشاؤها من range(). الوسيطة إلى range() هي طول القائمة – في هذا المثال، 4. نستخدم بعد ذلك هذه الفهارس للحصول على عنصر القائمة: data[index].

الطريقة المذكورة أعلاه أكثر تعقيدًا بعض الشيء من المثال الأول، لكن الميزة هي أنه يمكنك الوصول إلى كل من الفهرس وعناصر القائمة. لرؤية ذلك، يمكن لتعديل بسيط للمثال أعلاه أيضًا طباعة الفهرس:

>>> data = [2, 5, 3, 7]
>>> for index in range(len(data)):
...     print(index, data[index])
0 2
1 5
2 3
3 7

نظرًا لأنه من الشائع أن تحتاج إلى الوصول إلى كل من فهرس القائمة والعناصر، فهناك دالة أخرى مضمنة مفيدة لتسهيل ذلك. سنستكشف هذا في القسم التالي.

حلقات for مع ()enumerate

يمكن استخدام الدالة المضمنة enumerate() للحصول على نفس النتيجة كما في المثال السابق، ولكن باستخدام قدر أقل من التعليمات البرمجية. وهذا يجعلها أكثر كفاءة وقابلية للقراءة، كما هو موضح أدناه:

>>> data = [2, 5, 3, 7]
>>> for index, element in enumerate(data):
...     print(index, element)
0 2
1 5
2 3
3 7

تذكر أن الفهرسة في بايثون تبدأ من 0. ولكن في كثير من الحالات، يكون من العملي طباعة الفهرس الأول على أنه 1. ويمكن تحقيق ذلك بسهولة عن طريق تحديد وسيطة البداية في دالة enumerate(). ما عليك سوى القيام بما يلي:

>>> data = [2, 5, 3, 7]
>>> for index, element in enumerate(data, start=1):
...     print(index, element)
1 2
2 5
3 3
4 7

حلقات for في الاتجاه المعاكس

في بعض المواقف، قد ترغب في تكرار عملية التكرار من الخلف إلى الأمام. وهناك عدة طرق للقيام بذلك. إذا كانت لديك قائمة أو مصفوفة، فيمكنك استخدام خدعة تقطيع بسيطة لعكس عملية التكرار، ثم تكرارها بشكل طبيعي:

>>> data = [2, 5, 3, 7]
>>> for element in data[::-1]:
...     print(element)
7
3
5
2

إن القيام بتقطيع القائمة بهذه الطريقة يعادل تحديد قيم start وstop وstep، كما رأينا مع دالة range(). يؤدي جعل step = -1 إلى عكس القائمة.

يمكن تحقيق نفس النتيجة من خلال الاستفادة من دالة أخرى مدمجة في بايثون، وهي دالة reverse(). ما عليك سوى توفير القائمة كوسيطة، وتشغيل التعليمات البرمجية مرة أخرى لطباعة العناصر من الخلف إلى الأمام.

حلقات while في بايثون

النوع الثاني من الحلقات في بايثون هو حلقة while، والتي تسمح لك بالتكرار إلى ما لا نهاية. وعلى النقيض من حلقات for، لا تتطلب حلقات while منك أولاً تعريف مُكرر ثم تكراره. يكون بناء جملة حلقة while على النحو التالي:

>>> while True:
...    print('Looping')

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

في المثال أعلاه، حاول تغيير True إلى False. ستجد أن الحلقة لا تعمل على الإطلاق. في مرحلة الإنتاج، إذا قدمت تعبيرًا يتم تقييمه إلى True (على سبيل المثال 2 < 3)، فسيتم تشغيل الحلقة؛ إذا أصبح التعبير False (على سبيل المثال 3 < 3)، فستتوقف الحلقة.

الآن دعونا نرى مثالاً لدالة تنتهي فعليًا:

>>> number = 0
>>> while number < 3:
...     print('Looping')
...     number += 1
Looping
Looping
Looping

هنا، كان علينا أولاً تعريف الرقم، ثم التحقق مما إذا كان أقل من 3. إذا كان الأمر كذلك، نطبع شيئًا، ثم نزيد الرقم بمقدار واحد. عامل += هو طريقة ملائمة لزيادة القيمة؛ المثال أعلاه يعادل number = number + 1.

كتمرين، خذ المثال السابق وقم بتعديله لطباعة الرقم أيضًا، حتى تتمكن من رؤيته يتزايد قبل توقف الحلقة. من خلال تغيير الشرط، يمكنك التحكم في مدة تشغيل الحلقة.

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

حلقات for وwhile المتداخلة

حتى هذه النقطة، لم نرَ سوى مستوى واحد من التكرار. ولكن يمكن تضمين التكرارات بأي عمق. ألق نظرة على المثال التالي:

>>> for i in range(3):
>>>     for j in range(3):
...         print(i+j)
0
1
2
1
2
3
2
3
4

هنا، نقوم ببساطة بإضافة الفهارس من العنصرين القابلين للتكرار معًا. في هذا المثال، حاول تعديل عبارة print() لطباعة الفهارس والنتيجة لإظهار التعبير الرياضي بالكامل (أي 0+0 = 0، 0+1 = 1، … 2+2 = 4) لمعرفة كيفية عملها بالضبط.

يمكن الجمع بين الأنواع المختلفة من الحلقات. يمكننا إعادة إنشاء الناتج الذي حصلنا عليه أعلاه عن طريق استبدال حلقات for الخارجية بحلقة while، كما هو موضح أدناه:

>>> i=0
>>> while i<3:
...     for j in range(3):
...         print(i+j)
...     i+=1
0
1
2
1
2
3
2
3
4

إذا كان لديك قوائم بايثون متعددة، فيمكنك تكرار كليهما باستخدام حلقات متداخلة. ولكن من الممكن أيضًا تكرار كلتا القائمتين في نفس الحلقة، كما نوضح في كيفية تكرار قوائم متعددة في بايثون.

التحكم في حلقات for و while في بايثون

break

عبارة break هي الأولى من ثلاث طرق للحصول على تحكم أكثر دقة في كيفية تشغيل حلقاتك. يتم استخدامها مع عبارة if-elif-else للخروج من الحلقة مبكرًا إذا تم استيفاء شرط محدد. فيما يلي مثال لكيفية عملها:

>>> for index in range(5):
...     if index == 3:
...         break
...     else:
...         print(index)
0
1
2

في العادة، يجب أن تستمر الحلقة لفترة أطول، مع طباعة الأرقام من 0 إلى 4. توقف عبارة break تنفيذ الحلقة بأكملها مبكرًا إذا تم تقييم الشرط المحدد في عبارة if على أنه صحيح.

ملاحظة: يمكنك حذف جزء else وستعمل الحلقة بنفس الطريقة تمامًا.

continue

تتصرف عبارة continue بشكل مختلف قليلاً. فبدلاً من الخروج مبكرًا من الحلقة، فإنه يتخطى جزءًا من الحلقة ثم يستمر حتى تنتهي الحلقة بشكل طبيعي. قارن المثال التالي بالمثال السابق:

>>> for index in range(5):
...     if index == 3:
...         continue
...     else:
...         print(index)
0
1
2
4

عندما تصل الحلقة إلى عبارة continue، فإنها تتخطى الرقم 3. ثم تستمر في طباعة الفهرس النهائي وتخرج بشكل طبيعي. ملاحظة: هنا، يمكنك أيضًا حذف else – جرب ذلك!

pass

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

>>> for index in range(5):
...     pass

انتقل بحلقات بايثون إلى المستوى التالي

في هذه المقالة، نظرنا في كيفية استخدام حلقات بايثون لتنفيذ جزء من التعليمات البرمجية بشكل متكرر. إن فهم كيفية عمل حلقات for وwhile في بايثون أمر أساسي للبرمجة، حيث ستستخدمها طوال الوقت.

ولكن هناك طرق أخرى، بما في ذلك فهم القائمة ودوال lambda، يمكنك استخدامها للتكرار في بايثون.


اكتشاف المزيد من بايثون العربي

اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

Scroll to Top

اكتشاف المزيد من بايثون العربي

اشترك الآن للاستمرار في القراءة والحصول على حق الوصول إلى الأرشيف الكامل.

Continue reading