التكرار هو جانب أساسي من لغات البرمجة. فهو يسمح لك بتنفيذ جزء من التعليمات البرمجية بشكل متكرر حتى يتم استيفاء شرط الخروج، وعند هذه النقطة سينتقل البرنامج إلى الجزء التالي من التعليمات البرمجية. في بايثون، هناك نوعان مختلفان من التكرار: حلقة 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، يمكنك استخدامها للتكرار في بايثون.
اكتشاف المزيد من بايثون العربي
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.