يسمح لنا استخدام حلقات التكرار في برمجة الحاسوب بأتمتة وتكرار المهام المتشابهة مرّاتٍ عدِّة. وسنشرح في هذا الدرس كيفية استخدام حلقة for
في بايثون.
حلقة for
تؤدي إلى تكرار تنفيذ جزء من الشيفرات بناءً على عدّاد أو على متغير، وهذا يعني أنَّ حلقات for
تستعمل عندما يكون عدد مرات تنفيذ حلقة التكرار معلومًا قبل الدخول في الحلقة، وذلك على النقيض من حلقات while
المبنية على شرط.
حلقات for
تُبنى حلقات for
في بايثون كما يلي:
for [iterating variable] in [sequence]: [do something]
ستُنفَّذ الشيفرات الموجودة داخل حلقة التكرار عدِّة مرات إلى أن تنتهي الحلقة.
لننظر إلى كيفية مرور الحلقة for
على مجالٍ من القيم:
for i in range(0,5):
print(i)
سيُخرِج البرنامج السابق عند تشغيله الناتج الآتي:
0
1
2
3
4
ضبطنا المتغير i
في حلقة for
ليحتوي على القيمة التي ستُنفَّذ عليها حلقة التكرار، وكان مجال القيم التي ستُسنَد إلى هذا المتغير من 0 إلى 5.
ثم طبعًا قيمة المتغير في كل دوران لحلقة التكرار، لكن أبقِ في ذهنك أنَّنا نميل إلى بدء العد من الرقم 0 في البرمجة، وعلى الرغم من عرض خمسة أرقام، لكنها تبدأ بالرقم 0 وتنتهي بالرقم 4.
من الشائع أن ترى استخدامًا لحلقة for
عندما تحتاج إلى تكرار كتلة معيّنة من الشيفرات لعددٍ من المرات.
استخدام حلقات التكرار مع الدالة range()
إحدى أنواع السلاسل غير القابلة للتعديل في بايثون هي تلك الناتجة من الدالة range()
، وتستخدم الدالة range()
في حلقات التكرار للتحكم بعدد مرات تكرار الحلقة.
عند التعامل مع الدالة range()
عليك أن تمرر معاملًا رقميًا أو معاملين أو ثلاثة معاملات:
-
start
يشير إلى القيم العددية الصيحية التي ستبدأ بها السلسلة، وإذا لم تُمرَّر قيمة لهذا المعامل فستبدأ السلسلة من 0 -
stop
هذا المعامل مطلوب دومًا وهو القيمة العددية الصحيحة التي تمثل نهاية السلسلة العددية لكن دون تضمينها -
step
هي مقدار الخطوة، أي عدد الأرقام التي يجب زيادتها (أو إنقاصها إن كنّا نتعامل مع أرقام سالبة) في الدورة القادمة، وقيمة المعاملstep
تساوي 1 في حال لم تُحدَّد له قيمة
لننظر إلى بعض الأمثلة التي نُمرِّر فيها مختلف المعاملات إلى الدالة range()
.
لنبدأ بتمرير المعامل stop
فقط، أي أنَّ السلسلة الآتية من الشكل range(stop)
:
for i in range(6):
print(i)
كانت قيمة المعامل stop
في المثال السابق مساويةً للرقم 6، لذا ستمر حلقة التكرار من بداية المجال 0 إلى نهايته 6 (باستثناء الرقم 6 كما ذكرنا أعلاه):
0
1
2
3
4
5
المثال الآتي من الشكل range(start ,stop)
الذي تُمرَّر قيم بدء السلسلة ونهايتها:
for i in range(20,25):
print(i)
المجال –في المثال السابق– يتراوح بين 20 (بما فيها الرقم 20) إلى 25 (باستثناء الرقم 25)، لذا سيبدو الناتج كما يلي:
20
21
22
23
24
الوسيط step
الخاص بالدالة range()
شبيه بمعامل الخطوة الذي نستعمله عند تقسيم [السلاسل النصية](آلية فهرسة السلاسل النصية وطريقة تقسيمها في بايثون 3) لأنه يستعمل لتجاوز بعض القيم ضمن السلسلة.
يأتي المعامل step
في آخر قائمة المعاملات التي تقبلها الدالة range()
وذلك بالشكل الآتي range(start, stop, step)
. لنستعمل المعامل step
مع قيمة موجبة:
for i in range(0,15,3):
print(i)
سيؤدي المثال السابق إلى إنشاء سلسلة من الأرقام التي تبدأ من 0 وتنتهي عند 15 لكن قيمة المعامل step
هي 3، لذا سيتم تخطي رقمين في كل دورة، أي سيكون الناتج كالآتي:
0
3
6
9
12
يمكننا أيضًا استخدام قيمة سالبة للمعامل step
للدوران إلى الخلف، لكن علينا تعديل قيم start
و stop
بما يتوافق مع ذلك:
for i in range(100,0,-10):
print(i)
قيمة المعامل start
في المثال السابق هي 100، وكانت قيمة المعامل stop
هي 0، والخطوة هي -10
، لذا ستبدأ السلسلة من الرقم 100 وستنتهي عند الرقم 0، وسيكون التناقص بمقدار 10 في كل دورة، ويمكننا ملاحظة ذلك في الناتج الآتي:
100
90
80
70
60
50
40
30
20
10
الخلاصة: عندما نبرمج باستخدام لغة بايثون، فسنجد أننا نستفيد كثيرًا من السلاسل الرقمية التي تنتجها الدالة range()
.
استخدام حلقة for مع أنواع البيانات المتسلسلة
يمكن الاستفادة من القوائم (من النوع list) وغيرها من أنواع البيانات المتسلسلة واستعمالها كمعاملات لحلقات for
، فبدلًا من الدوران باستخدام الدالة range()
فيمكننا تعريف قائمة ثم الدوران على عناصرها.
سنُسنِد في المثال الآتي قائمةً إلى متغير، ثم سنستخدم حلقة for
للدوران على عناصر القائمة:
sharks = ['hammerhead', 'great white', 'dogfish', 'frilled', 'bullhead', 'requiem']
for shark in sharks:
print(shark)
في هذه الحالة، قمنا بطباعة كل عنصر موجود في القائمة؛ وصحيحٌ أننا استعملنا الكلمة shark
كاسم للمتغير، لكن يمكنك استعمال أي اسم صحيح آخر ترغب به، وستحصل على نفس النتيجة:
hammerhead
great white
dogfish
frilled
bullhead
requiem
الناتج السابق يُظهِر دوران الحلقة for
على جميع عناصر القائمة مع طباعة كل عنصر في سطرٍ منفصل.
يشيع استخدام القوائم والأنواع الأخرى من البيانات المتسلسلة مثل السلاسل النصية وبنى tuple مع حلقات التكرار لسهولة الدوران على عناصرها. يمكنك دمج هذه الأنواع من البيانات مع الدالة range()
لإضافة عناصر إلى قائمة، مثلًا:
sharks = ['hammerhead', 'great white', 'dogfish', 'frilled', 'bullhead', 'requiem']
for item in range(len(sharks)):
sharks.append('shark')
print(sharks)
الناتج:
['hammerhead', 'great white', 'dogfish', 'frilled', 'bullhead', 'requiem', 'shark', 'shark', 'shark', 'shark', 'shark', 'shark']
أضفنا هنا السلسلة النصية 'shark'
خمس مرات (وهو نفس طول القائمة sharks
الأصلي) إلى القائمة sharks
.
يمكننا استخدام حلقة for
لبناء قائمة جديدة:
integers = []
for i in range(10):
integers.append(i)
print(integers)
هيّئنا في المثال السابق قائمةً فارغةً باسم integers
لكن حلقة التكرار for
ملأت القائمة لتصبح كما يلي:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
وبشكلٍ شبيهٍ بما سبق، يمكننا الدوران على السلاسل النصية:
sammy = 'Sammy'
for letter in sammy:
print(letter)
الناتج:
S
a
m
m
y
يمكن الدوران على بنى tuple كما هو الحال في القوائم والسلاسل النصية.
عند المرور على عناصر نوع البيانات dictionary، فمن المهم أن تبقي بذهنك البنية الخاصة به (key:value) لكي تضمن أنَّك تستدعي العنصر الصحيح من المتغير. هذا مثالٌ بسيطٌ نعرض فيه المفتاح (key) والقيمة (value):
sammy_shark = {'name': 'Sammy', 'animal': 'shark', 'color': 'blue', 'location': 'ocean'}
for key in sammy_shark:
print(key + ': ' + sammy_shark[key])
الناتج:
name: Sammy
animal: shark
location: ocean
color: blue
عند استخدام متغيرات من النوع dictionary مع حلقات for
فيكون المتغير المرتبط بحلقة التكرار متعلقًا بمفتاح القيم، وعلينا استخدام التعبير dictionary_variable[iterating_variable]
للوصول إلى القيمة الموافقة للمفتاح. ففي المثال السابق كان المتغير المرتبط بحلقة التكرار باسم key
وهو يُمثِّل المفاتيح، واستعملنا التعبير sammy_shark[key]
للوصول إلى القيمة المرتبطة بذاك المفتاح.
الخلاصة: تُستعمَل حلقات التكرار عادةً للدوران على عناصر البيانات المتسلسلة وتعديلها.
حلقات for المتشعّبة
يمكن تشعّب حلقات التكرار في بايثون، كما هو الحال في بقية لغات البرمجة.
حلقة التكرار المتشعبة هي الحلقة الموجودة ضمن حلقة تكرار أخرى، وهي شبيهة بعبارات if
المتشعّبة. تُبنى حلقات التكرار المتشعبة كما يلي:
for [first iterating variable] in [outer loop]: # Outer loop
[do something] # Optional
for [second iterating variable] in [nested loop]: # Nested loop
[do something]
يبدأ البرنامج بتنفيذ حلقة التكرار الخارجية، ويُنفَّذ أوّل دوران فيها، وأوّل دوران سيؤدي إلى الدخول إلى حلقة التكرار الداخلية، مما يؤدي إلى تنفيذها إلى أن تنتهي تمامًا. ثم سيعود تنفيذ البرنامج إلى بداية حلقة التكرار الخارجية، ويبدأ بتنفيذ الدوران الثاني، ثم سيصل التنفيذ إلى حلقة التكرار الداخلية، وستُنفَّذ حلقة التكرار الداخلية بالكامل، ثم سيعود التنفيذ إلى بداية حلقة التكرار الخارجية، وهلّم جرًا إلى أن ينتهي تنفيذ حلقة التكرار الخارجية أو إيقاف حلقة التكرار عبر استخدام [التعبير break
](كيفية استخدام تعابير break و continue و pass عند التعامل مع حلقات التكرار في بايثون 3) أو غيره من التعابير.
لنُنشِئ مثالًا يستعمل حلقة for
متشعبة لكي نفهم كيف تعمل بدقة. حيث ستمر حلقة التكرار الخارجية في المثال الآتي على قائمة من الأرقام اسمها num_list
، أما حلقة التكرار الداخلية فستمر على قائمة من السلاسل النصية اسمها alpha_list
:
num_list = [1, 2, 3]
alpha_list = ['a', 'b', 'c']
for number in num_list:
print(number)
for letter in alpha_list:
print(letter)
سيظهر الناتج الآتي عند تشغيل البرنامج:
1
a
b
c
2
a
b
c
3
a
b
c
يُظهِر الناتج السابق أنَّ البرنامج أكمل أوّل دوران على عناصر حلقة التكرار الخارجية بطباعة الرقم 1
، ومن ثم بدأ تنفيذ حلقة التكرار الدخلية مما يطبع الأحرف a
و b
و c
على التوالي. وبعد انتهاء تنفيذ حلقة التكرار الداخلية، فعاد البرنامج إلى بداية حلقة التكرار الخارجية طابعًا الرقم 2
، ثم بدأ تنفيذ حلقة التكرار الداخلية (مما يؤدي إلى إظهار a
و b
و c
مجددًا). وهكذا.
يمكن الاستفادة من حلقات for
المتشعبة عند المرور على عناصر قوائم تتألف من قوائم. فلو استعملنا حلقة تكرار وحيدة لعرض عناصر قائمة تتألف من عناصر تحتوي على قوائم، فستُعرَض قيم القوائم الداخلية:
list_of_lists = [['hammerhead', 'great white', 'dogfish'],[0, 1, 2],[9.9, 8.8, 7.7]]
for list in list_of_lists:
print(list)
الناتج:
['hammerhead', 'great white', 'dogfish']
[0, 1, 2]
[9.9, 8.8, 7.7]
وفي حال أردنا الوصول إلى العناصر الموجودة في القوائم الداخلية، فيمكننا استعمال حلقة for
متشعبة:
list_of_lists = [['hammerhead', 'great white', 'dogfish'],[0, 1, 2],[9.9, 8.8, 7.7]]
for list in list_of_lists:
for item in list:
print(item)
الناتج:
hammerhead
great white
dogfish
0
1
2
9.9
8.8
7.7
الخلاصة: نستطيع الاستفادة من حلقات for
المتشعبة عندما نريد الدوران على عناصر محتوى في قوائم.
الخلاصة
رأينا في هذا الدرس كيف تعمل حلقة التكرار for
في لغة بايثون، وكيف نستطيع إنشاءها واستعمالها. حيث تستمر حلقة for
بتنفيذ مجموعة من الشيفرات لعددٍ مُحدِّدٍ من المرات.
هذه المقالة جزء من سلسة مقالات حول تعلم البرمجة في بايثون 3.
ترجمة –وبتصرّف– للمقال How To Construct For Loops in Python 3 لصاحبته Lisa Tagliaferri
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.