Lesson 6
حائط اللوب
1. حائط اللوب
while
تكرار حلقة تكرار الإجراءات عدة مرات حتى يتم تقييم بعض الحالات إلى False
. يتم إعطاء الشرط قبل هيئة الحلقة ويتم فحصه قبل كل تنفيذ للجسم الدائري. عادةً ، يتم استخدام حلقة while
عندما يكون من المستحيل تحديد العدد الدقيق لتكرار الحلقة مقدمًا.
يشبه بناء جملة حلقة while
في أبسط هذه الحالة:
while some condition: a block of statements
بايثون يتحقق أولا من الشرط. إذا كانت False ، يتم إنهاء الحلقة ويتم تمرير التحكم إلى العبارة التالية بعد نص الحلقة while
. إذا كان الشرط صحيحًا ، فسيتم تنفيذ نص الحلقة ، ثم يتم فحص الشرط مرة أخرى. هذا يستمر في حين أن الشرط هو صحيح. بمجرد أن تصبح الحالة False ، تنتهي الحلقة ويتم تمرير التحكم إلى العبارة التالية بعد الحلقة.
على سبيل المثال ، يطبع جزء البرنامج التالي مربعات كافة الأعداد الصحيحة من 1 إلى 10. وهنا يمكن استبدال حلقة "while" بواسطة for ... in range(...)
حلقة:
i = 1 while i <= 10: print(i ** 2) i += 1
في هذا المثال ، يتكرر المتغير i
داخل الحلقة من 1 إلى 10. ويطلق على هذا المتغير الذي تتغير قيمته مع كل تكرار حلقة جديدة العداد. لاحظ أنه بعد تنفيذ هذا الجزء ، يتم تعريف قيمة المتغير i
وتساوي 11
، لأن i == 11
الشرط i <= 10
هو False للمرة الأولى.
هنا مثال آخر على استخدام حلقة while
لتحديد عدد الأرقام لعدد صحيح n
:
n = int(input()) length = 0 while n > 0: n //= 10 # هذا يعادل n = n // 10 length += 1 print(length) # 4
في كل تكرار نقوم بقص الرقم الأخير من الرقم باستخدام القسمة الصحيحة بمقدار 10 ( n //= 10
). في length
متغير نعد كم مرة فعلنا ذلك.
يوجد في بايثون طريقة أخرى أسهل لحل هذه المشكلة:
.
2. تدفق السيطرة على حلقة: آخر
يمكن للمرء أن يكتب أي else:
العبارة بعد جسم الحلقة التي يتم تنفيذها مرة واحدة بعد نهاية الحلقة:
i = 1 while i <= 10: print(i) i += 1 else: print('Loop ended, i =', i)
من النظرة الأولى ، لا يبدو أن هذا التصريح منطقي ، لأن else:
يمكن وضع نص العبارة بعد نهاية الحلقة. عبارة "آخر" بعد حلقة فقط منطقية عند استخدامها في تركيبة مع break
التعليمات. إذا حدث break
أثناء تنفيذ الحلقات المترجمة لمترجم Python ، فإنه يتوقف فوراً عن تنفيذ الحلقة ويخرج منها. في هذه الحالة ، لا يتم تنفيذ فرع else:
. لذلك ، يتم استخدام break
لإحباط تنفيذ الحلقة أثناء منتصف أي تكرار.
في ما يلي مثال على شكل جاك أسود: برنامج يقرأ الأرقام ويجمعها حتى يصبح المجموع أكبر أو يساوي 21. وينتهي تسلسل الإدخال بالرقم 0 حتى يتمكن البرنامج من التوقف حتى إذا كان مجموع مجموع جميع الأرقام أقل من 21.
دعونا نرى كيف تتصرف على المدخلات المختلفة.
الإصدار 1. يتم إنهاء الحلقة بشكل طبيعي بعد التحقق من الشرط ، لذلك يتم تنفيذ فرع "آخر".
total_sum = 0 a = int(input()) while a != 0: total_sum += a if total_sum >= 21: print('Total sum is', total_sum) break a = int(input()) else: print('Total sum is less than 21 and is equal to', total_sum, '.')
الإصدار 2. يتم إحباط الحلقة بواسطة break
، بحيث يتم تخطي فرع "آخر".
total_sum = 0 a = int(input()) while a != 0: total_sum += a if total_sum >= 21: print('Total sum is', total_sum) break a = int(input()) else: print('Total sum is less than 21 and is equal to', total_sum, '.')
يمكن أيضًا استخدام فرع "Else" مع حلقة "for". لنلق نظرة على المثال عندما يقوم البرنامج بقراءة 5 أعداد صحيحة ولكن يتوقف بشكل صحيح عند استيفاء العدد الصحيح السلبي الأول.
الإصدار 1. يتم إنهاء الحلقة بشكل طبيعي ، لذلك يتم تنفيذ فرع "آخر".
for i in range(5): a = int(input()) if a < 0: print('Met a negative number', a) break else: print('No negative numbers met')
الإصدار 2. يتم إحباط الحلقة ، لذلك لا يتم تنفيذ فرع "آخر".
for i in range(5): a = int(input()) if a < 0: print('Met a negative number', a) break else: print('No negative numbers met')
3. تدفق التحكم في الحلقة: تابع
هناك تعليمة أخرى تستخدم للتحكم في تنفيذ العروة هو continue
. إذا يجتمع بيثون مترجم continue
في مكان ما في منتصف حلقة تكرار، فإنه يتخطى كل الإرشادات المتبقية والعائدات الى التكرار التالي.
for num in range(2, 10): if num % 2 == 0: print("Found an even number", num) continue print("Found a number", num)
إذا تم وضع break
continue
داخل العديد من الحلقات المتداخلة ، فإنها تؤثر فقط على تنفيذ الأعمق. دعونا ننظر إلى مثال سخيف بدلاً من ذلك لشرح ذلك:
for i in range(3): for j in range(5): if j > i: # يكسر فقط على الخط 2 break print(i, j)
التعليمات break
و continue
وبالإحباط، إذا كنت تستطيع تنفيذ فكرتك دون استخدامها. هنا هو مثال نموذجي للاستخدام السيئ لل break
: هذا الرمز بحساب عدد الأرقام في عدد صحيح.
n = int(input()) length = 0 while True: length += 1 n //= 10 if n == 0: break print('Length is', length)
هو أنظف وأسهل للقراءة لإعادة كتابة هذه الحلقة مع شرط حلقة ذات مغزى:
n = int(input()) length = 0 while n != 0: length += 1 n //= 10 print('Length is', length)
4. مهمة متعددة
في بايثون ، من الممكن أن تقوم جملة تخصيص واحدة بتغيير قيمة العديد من المتغيرات. دعنا نرى:
a, b = 0, 1
يمكن كتابة التأثير الموضح أعلاه على النحو التالي:
a = 0 b = 1
الفرق بين النسختين هو أن التعيين المتعدد يتغير قيم متغيرين في وقت واحد.
التفويض المتعدد مفيد عندما تحتاج إلى تبادل قيم متغيرين. في لغات البرمجة القديمة دون دعم من مهمة متعددة يمكن القيام بذلك باستخدام المتغير المساعد:
a = 1 b = 2 tmp = a a = b b = tmp print(a, b) # 2 1
في بايثون ، يمكن كتابة نفس المبادلة في سطر واحد:
a = 1 b = 2 a, b = b, a print(a, b) # 2 1
يجب أن يحتوي الجانب الأيمن من "=" على قائمة مفصولة بفواصل لأسماء المتغيرات. يمكن أن يكون الجانب الأيمن أي تعبيرات مفصولة بفواصل. يجب أن يكون الجانب الأيسر والقوائم الجانب الأيمن متساوية الطول.