While loop - Learn Python 3 - Snakify

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 متغير نعد كم مرة فعلنا ذلك.

يوجد في بايثون طريقة أخرى أسهل لحل هذه المشكلة: length = len(str(i)) .

Advertising by Google, may be based on your interests

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')

Advertising by Google, may be based on your interests

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)
Advertising by Google, may be based on your interests

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

يجب أن يحتوي الجانب الأيمن من "=" على قائمة مفصولة بفواصل لأسماء المتغيرات. يمكن أن يكون الجانب الأيمن أي تعبيرات مفصولة بفواصل. يجب أن يكون الجانب الأيسر والقوائم الجانب الأيمن متساوية الطول.

Advertising by Google, may be based on your interests