تعلم البرمجة مع Python


الدرس: تعلم الحلقات


الصفحة السابقة
الحلقات هي مفهوم جديد بالنسبة لك. سيسمح لك بتكرار عملية معينة عدة مرات حسب الضرورة. قد يبدو المفهوم نظريًا بعض الشيء في البداية ، لكن لا تقلق!

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

لذا ، هل نبدأ؟

مما تتكون؟



كما قلت أعلاه ، الحلقات هي طريقة لتكرار التعليمات في برنامجك عدة مرات. لنأخذ مثالًا بسيطًا ، حتى لو كان قاتمًا في حد ذاته: اكتب برنامجًا يعرض جدول الضرب بـ 7 ، من 1 * 7 إلى 10 * 7.

… ماذا ؟

حسنًا ، هذا مجرد مثال ، لا تجعل هذا الوجه ، وأنا متأكد من أنه سيكون مفيدًا للبعض. أولاً ، يجب أن تصل إلى البرنامج التالي:


print(" 1 * 7 =", 1 * 7)
print(" 2 * 7 =", 2 * 7)
print(" 3 * 7 =", 3 * 7)
print(" 4 * 7 =", 4 * 7)
print(" 5 * 7 =", 5 * 7)
print(" 6 * 7 =", 6 * 7)
print(" 7 * 7 =", 7 * 7)
print(" 8 * 7 =", 8 * 7)
print(" 9 * 7 =", 9 * 7)
print("10 * 7 =", 10 * 7)
 
... والنتيجة:

1 * 7 = 7
 2 * 7 = 14
 3 * 7 = 21
 4 * 7 = 28
 5 * 7 = 35
 6 * 7 = 42
 7 * 7 = 49
 8 * 7 = 56
 9 * 7 = 63
10 * 7 = 70
 
أذكرك أنه يمكنك حفظ أكوادك في ملفات. ستجد الإجراء في الفصل الخاص بكتابة كود Python في الملفات .

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

فلنجرّب نفس البرنامج ، لكن هذه المرة باستخدام متغير ؛ وبالتالي ، إذا قررنا عرض جدول الضرب 6 ، فسيتعين علينا فقط تغيير قيمة المتغير! في هذا المثال ، نستخدم متغيرًا nb يحتوي على 7. ستكون التعليمات مختلفة قليلاً ولكن لا يزال بإمكانك كتابة هذا البرنامج:


nb = 7
print(" 1 *", nb, "=", 1 * nb)
print(" 2 *", nb, "=", 2 * nb)
print(" 3 *", nb, "=", 3 * nb)
print(" 4 *", nb, "=", 4 * nb)
print(" 5 *", nb, "=", 5 * nb)
print(" 6 *", nb, "=", 6 * nb)
print(" 7 *", nb, "=", 7 * nb)
print(" 8 *", nb, "=", 8 * nb)
print(" 9 *", nb, "=", 9 * nb)
print("10 *", nb, "=", 10 * nb)
 
النتيجة هي نفسها ، يمكنك التحقق. لكن الكود لا يزال أكثر إثارة للاهتمام: يمكنك تغيير جدول الضرب لعرضه عن طريق تغيير قيمة المتغير nb .

لكن هذا البرنامج لا يزال غير عملي إلى حد ما وينجز مهمة متكررة للغاية. المبرمجين كسالى جدا ، يفضلون استخدام الحلقات.

الحلقة while



الحلقة التي سأقدمها موجودة في معظم لغات البرمجة الأخرى ولها نفس الاسم. يسمح لك بتكرار مجموعة من التعليمات طالما أن الشرط صحيح (  while يعني "طالما" باللغة الإنجليزية) . آمل أن يكون مفهوم كتلة التعليمات واضحًا لك ، وإلا سأحيلك إلى الفصل السابق.

بناء الجملة while هو:


while condition:
    # instruction 1
    # instruction 2
    # ...
    # instruction N
 
يجب أن تتعرف على شكل كتلة التعليمات ، على الأقل أتمنى ذلك.

ما هو الشرط الذي سوف نستخدمه؟

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

إذا لم يكن الأمر واضحًا ، ألق نظرة على هذا الكود ، فستكون بعض التعليقات كافية لمعرفة ذلك:


nb = 7 # نحتفظ بالمتغير الذي يحتوي على الرقم الذي نريد جدول ضربه
i = 0 # هذا هو متغير العداد الذي سنزيده في الحلقة

while i < 10: # طالما أني أقل بدقة من 10
    print(i + 1, "*", nb, "=", (i + 1) * nb)
    i += 1 #  بمقدار 1 في كل مرة يتم فيها تشغيل الحلقة i نزيد
 
دعنا نحلل هذا الكود سطرًا بسطر:
  1. نقوم بإنشاء مثيل للمتغير nb الذي يستضيف الرقم الذي سنعمل عليه (في هذه الحالة ، 7). يمكنك بالطبع أن تطلب من المستخدم إدخال هذا الرقم ، وأنت تعرف كيفية القيام بذلك الآن.
  2. ننشئ المتغير i الذي سيكون عدادنا أثناء الحلقة . i هو معيار يستخدم عندما يتعلق الأمر بالحلقات والمتغيرات المتزايدة ، ولكن من المنطقي أنه كان من الممكن أن تمنحه اسمًا آخر. نقوم بتهيئته إلى 0.
  3. فاصل الأسطر لا يضر أبدًا!
  4. نجد هنا التعليمات  while التي تم فك شفرتها ، كما أشرت في التعليق ، على أنها  "بما أن i أقل من 10"  . لا تنس « : » في نهاية السطر.
  5. سطر print، عليك أن تتعرف عليه. الآن ، يتكون معظم الصف المعروض من متغيرات ، بصرف النظر عن علامات الرياضيات. لاحظت أنه في كل مرة نستخدم i في هذا السطر ، للعرض أو الحساب ، نضيف 1: هذا يرجع إلى حقيقة أننا في البرمجة اعتدنا عليها (عادة يجب عليك أن نأخذها) لبدء العد من 0. فقط هذا ليس هو الحال مع جدول الضرب ، الذي ينتقل من 1 إلى 10 وليس من 0 إلى 9 ، كما هو الحال بالنسبة لقيم i . بالتأكيد ، كان بإمكاني تغيير الحالة والقيمة الأولية لـ i، أو حتى ضبط الزيادة في i قبل العرض ، لكنني أردت أن أتناول الحالة الأكثر شيوعًا ، تنسيق الحلقة الذي ستجده في أغلب الأحيان. لا شيء يمنعك من إجراء الاختبارات وأشجعك على القيام بذلك.
  6. هنا ، نزيد المتغير i بمقدار 1. إذا كنا في الحلقة الأولى ، i فانتقل من 0 إلى 1. وبعد ذلك ، نظرًا لأنها نهاية كتلة التعليمات ، نعود إلى التعليمات while.  While يتحقق من أن قيمة i لا تزال أقل من 10. إذا كانت هذه هي الحالة (وهي في الوقت الحالي) ، فإننا ننفذ كتلة التعليمات مرة أخرى. إجمالاً ، نقوم بتنفيذ هذه الكتلة 10 مرات ، حتى i تنتقل من 9 إلى 10. ثم ، while تتحقق التعليمات من الشرط ، وتدرك أنها الآن خاطئة (قيمة i لا تقل عن 10 لأنه الآن يساوي 10) ويتوقف. إذا كان هناك أي كود بعد الكتلة ، فسيتم تنفيذه الآن.
لا تنسى الزيادة i ! خلاف ذلك ، تقوم بإنشاء ما يسمى حلقة لانهائية ، حيث أن قيمة i لا تزيد أبدًا عن 10  while، وبالتالي فإن الشرط صحيح دائمًا ... لذلك يتم تنفيذ الحلقة إلى ما لا نهاية ، على الأقل من الناحية النظرية . إذا تم تشغيل جهاز الكمبيوتر الخاص بك في حلقة لا نهائية بسبب برنامجك ، لكسر الحلقة ، يجب عليك كتابة CTRL+ Cفي نافذة المترجم الفوري (في نظام Windows أو Linux ). لن يفعل بايثون ذلك من تلقاء نفسه ، لأن شيئًا ما يحدث له. في كلتا الحالتين ، فإنه غير قادر على التفريق بين حلقة لا نهائية وحلقة محدودة: الأمر متروك للمبرمج للقيام بذلك.

الحلقة for



كما قلت سابقًا ، توجد التعليمات while في معظم اللغات الأخرى. في C ++ أو Java ، هناك أيضًا تعليمات for ليس لها نفس المعنى. إنها خاصة إلى حد ما وهي النقطة التي أخاطر فيها بتفويت أمثلة في المستقبل القريب ، حيث تم الكشف عن كل فائدتها في الفصل الموجود في القوائم. لاحظ أنه إذا فعلتم بيرل أو PHP، يمكنك العثور على حلقات for في الكلمة جميلة وثيقة :  foreach .

التعليمات for تعمل على التسلسلات. إنه في الواقع متخصص في تصفح سلسلة من عدة بيانات. لم نر (ولن نرى على الفور) هذه التسلسلات الخاصة إلى حد ما ولكنها واسعة الانتشار ، حتى لو كانت معقدة. ومع ذلك ، هناك نوع واحد واجهناه لبعض الوقت الآن: السلاسل.

السلاسل عبارة عن تسلسلات ... من الشخصيات! يمكنك التكرار عبر سلسلة (وهو أمر ممكن أيضًا ، while لكننا سنرى كيف ذلك لاحقًا) . الآن ، دعونا نلقي نظرة على for .

التعليمات for مبنية على النحو التالي:


for element in sequence:
 
element هو متغير تم إنشاؤه بواسطة for، وليس عليك إنشاء مثيل له. يأخذ على التوالي كل من القيم التي تظهر في التسلسل الذي تم اجتيازه.

ليس واضحا جدا؟ لذلك ، كالعادة ، يتم مسح كل شيء بالكود!


chaine = "Bonjour les ZER0S"
for lettre in chaine:
    print(lettre)
 
مما يعطينا النتيجة التالية:

B
o
n
j
o
u
r
 
l
e
s
 
Z
E
R
0
S
 
هل هذا أوضح؟ في الواقع ، lettre يأخذ المتغير على التوالي قيمة كل حرف موجود في سلسلة الأحرف ( أولاً B ، ثم o ، ثم n… ) . نعرض هذه القيم مع print وتعود هذه الوظيفة إلى السطر بعد كل رسالة ، بحيث تكون جميع الأحرف في عمود واحد. حرفيا ، السطر 2 يعني "للحرف في سلسلة"  . في هذا السطر ، سينشئ المترجم متغيرًا lettre يحتوي على العنصر الأول من السلسلة (بمعنى آخر ، الحرف الأول). بعد تنفيذ الكتلة ، lettre يحتوي المتغير على الحرف الثاني ، وهكذا طالما يوجد حرف في السلسلة.

لاحظ أنه ، فجأة ، لا جدوى من زيادة المتغير lettre ( والذي سيكون أيضًا سخيفًا جدًا لأنه ليس رقمًا ). تعتني Python بالزيادة ، والتي تعد واحدة من المزايا العظيمة للتعليمات for .

مثل الظروف التي رأيناها حتى الآن ، in يمكن استخدامها في مكان آخر غير الحلقة for .


chaine = "Bonjour les ZER0S"
for lettre in chaine:
    if lettre in "AEIOUYaeiouy": 
        print(lettre)
    else: 
        print("*")
 
… يعطي :

*
o
*
*
o
u
*
*
*
e
*
*
*
E
*
*
*
 
هنا ! يعرض المترجم الحروف إذا كانت حروف العلة(vowel) وإذا لم تكن كذلك ، يعرض "*" . لاحظ أن الرقم 0 لا يظهر في النهاية ، وليس لدى بايثون أي فكرة عن أنه حرف "o" منمق.

تذكر هذا الاستخدام in في حالة واحدة. نريد أن نعرف ما إذا كان أي عنصر موجودًا في مجموعة معينة (هنا ، إذا كان الحرف واردًا في "AEIOUYaeiouy") . سنجد هذه الوظيفة لاحقًا.

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

الكلمة break


Break تتيح لك الكلمة الرئيسية ببساطة مقاطعة حلقة. غالبًا ما يتم استخدامها في شكل حلقة لا أوافق عليها كثيرًا:


while 1: #   صحيح دائمًا -> حلقة لا نهائية 1
    lettre = input("Tapez 'Q' pour quitter : ")
    if lettre == "Q":
        print("Fin de la boucle")
        break
 
الحلقة while لديها شرط 1، وهذا يعني أن الشرط سيكون دائمًا صحيحًا. بعبارة أخرى ، عند النظر إلى السطر while، نفكر في حلقة لا نهائية. في الممارسة العملية ، يُطلب من المستخدم كتابة حرف ( "Q" للإنهاء). وطالما لم يقم المستخدم بإدخال هذا الحرف ، يطالبه البرنامج بكتابة حرف مرة أخرى. عندما يكتب "Q" ، يطبع البرنامج Fin de la boucleوتنتهي الحلقة بالكلمة الأساسية break .

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

إنه مثال بسيط بعض الشيء ولكن يمكنك رؤية الصورة الكبيرة. في هذه الحالة ، وفي رأيي ، في معظم الحالات التي break يتم استخدامها فيها ، يمكن للمرء أن يفلت من تحديد حالة حقيقية على سطر while . على سبيل المثال ، لماذا لا تنشئ قيمة منطقية تكون صحيحة طوال الحلقة وخطأ عندما تحتاج الحلقة إلى الإنهاء؟ أو اختبار مباشرة إذا كان lettre != « Q »في while؟

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

الكلمة continue


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


i = 1
while i < 20: # طالما أن القبمة  أقل من 20
    if i % 3 == 0:
        i += 4 # i  نضيف 4 للمتغير 
        print("On incrémente i de 4. i est maintenant égale à", i)
        continue #  دون تنفيذ الاسطر الباقية while   نعود الى  
    print("La variable i =", i)
    i += 1 
 
ها هي النتيجة:

La variable i = 1
La variable i = 2
On incrémente i de 4. i est maintenant égale à 7
La variable i = 7
La variable i = 8
On incrémente i de 4. i est maintenant égale à 13
La variable i = 13
La variable i = 14
On incrémente i de 4. i est maintenant égale à 19
La variable i = 19
 
كما ترى ، تزداد كل ثلاث جولات من الحلقة iبمقدار 4. في الكلمة الأساسية continue، لا تنفذ Python نهاية الكتلة ولكنها تعود إلى بداية الحلقة ، وتختبر حالة مرة أخرى while . بعبارة أخرى ، عندما تصل بايثون إلى السطر 6 ، فإنها تقفز إلى السطر 2 دون تنفيذ السطرين 7 و 8. في الحلقة الجديدة ، يستأنف Python التنفيذ الطبيعي للحلقة (  continue يتجاهل نهاية الكتلة فقط من أجل جولة الحلقة الحالية ) .

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

باختصار


  • تُستخدم الحلقة لتكرار جزء من التعليمات البرمجية بناءً على المسند.
  • يمكنك إنشاء حلقة باستخدام الكلمة الأساسية while متبوعة بالمسند.
  • يمكنك تصفح تسلسل باستخدام بناء الجملة for element in sequence: .