3 الشرط والتكرار
يسير تنفيذ الجمل البرمجية في اللغات الإجرائية -مثل بايثون- من الأعلى للأسفل. فإذا كتبنا الكود التالي:
فإن جملة التعيين التالية تكتُب قيمة 2
في نفس المحلّ الذي كتبت عليه جملة التعيين الأولى 1
. لذا ظهرت النتيجة: 2
.
كثيرًا ما نحتاج للتحكم فيما يُنفَّذ وما يُهمل أو ما يتكرر من الجمل البرمجية. فمن الحالات التي يتغير فيها الترتيب:
- التنفيذ المشروط: تعليق تنفيذ قطعة كود على حصول حالة (أو أحوال) معيَّنة
- التكرار: تكرار تنفيذ قطعة كود عددًا من المرات أو معلَّقًا بتمام شرط
3.1 الجملة الشرطية
الجملة الشرطية هي جملة مركَّبة من كلمة if
وتعبير منطقي ثم الجمل التي يتعلق تنفيذها بناءً على هذا الشرط (وتكون داخل المحاذاة):
تنبيه: المحاذاة العمودية
لاحظ أن المحاذاة العمودية (Indentation) (المسافات البيضاء أسفل كلمة if
) في الكود أعلاه ليست لمجرد تسهيل قراءة الكود، بل هي التي تحدد التعليمات المشروطة. عادةً ما تكون المحاذاة عبارة عن 4 مسافات أو 2 أو أكثر، لكن لابد أن تكون موحَّدة طوال الكود.
لاحظ: بدون المحاذاة الصحيحة، سيظهر خطأ في الكود:
إذا قمت بزيادة المحاذاة لكل من جملتي print()
، فسوف يعمل الكود بتدفِّقٍ غيرِ الذي قصدناه ابتداءً. أي أنه سيطبع Outside
عندما يكون في الواقع داخل اللَّبِنَة الشرطية.
يؤدي الكود السابق إلى خطأ منطقي لن يظهر أبدًا كخطأ ولن يوقف البرنامج. لذا كن حذرًا مع المحاذاة في كتابة كود بايثون!
3.2 التعبيرات المنطقية
أما الشروط فتستند إلى الجبر الثنائي (Boolean Logic) الذي نجد له في بايثون كلمتين من أصل اللغة هما:
- كلمة
True
ويعبَّر عنها بالرقم:1
- كلمة
False
ويعبَّر عنها بالرقم:0
وكلاهُما يندرج تحت نوع خاصّ من نوع الأرقام وهو النوع البولي (bool
) نسبةً لعالم الرياضيات جورج بول الذي وضع أسسه.
أما الجملة الشرطية أو التعيين الشرطي ونحوه، فيتعلَّق بتحقق عبارة منطقية. فمن العبارات المنطقية: عبارة المقارنة:
العلامة | الوصف |
---|---|
a == b |
يساوي |
a != b |
لا يساوي |
a > b |
أكبر من |
a < b |
أصغر من |
a >= b |
أكبر من أو يساوي |
a <= b |
أصغر من أو يساوي |
هنا نستكشف عبارات تؤول إلى قيَم منطقية. العبارة الأولى: خمسة أكبر من تسعة؟
العبارة الثانية: هل طول كذا أكبر من طول كذا؟
تركيب الشروط
يجوز دمج عدة شروط بعمليات الجمع والتخيير والحصر والعكس، فناتجها منطقي ملخص في الجدول التالي:
A | B | AND | OR | XOR |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
- الجمع: AND (و): تخرج 1 فقط إذا كان كلا المدخلين 1.
- التخيير: OR (أو): تخرج 1 إذا كان أحد المدخلين على الأقل 1.
- الحصر: XOR (أو الحصرية): تخرج 1 إذا كان المدخلان مختلفين.
- العكس: NOT (ليس): تخرج عكس المدخل (1 يصبح 0، و0 يصبح 1).
على سبيل المثال:
You are eligible to donate blood
يؤول طرفي المعامل and
لقيمة منطقية هكذا:
age > 18
تؤول إلىTrue
لأنage=20
وهو أكبر من18
weight > 45
تؤول إلىTrue
لأنweight=50
وهو أكبر من45
- فتكون الجملة إذًا:
True and True
وهي تؤول إلىTrue
تستعمل الأقواس لتجميع الشروط لإيقاع الترتيب المنطقي المراد:
age < 16
تؤول إلىFalse
لأنage=16
ليست أصغر من16
temperature < 20
تؤول إلىTrue
لأنtemperature=15
أصغر من20
فعلاًnot is_wearing_coat
تؤول إلىFalse
لأنis_wearing_coat=True
وهي عكسها- إذًا الجملة بين القوسين
(temperature < 20 and not is_wearing_coat)
تؤول إلىTrue and False
وهي تؤول إلىFalse
- إذًا الجملة
age < 16 or (False)
تؤول إلىFalse or False
وهي تؤول إلىFalse
يُنظَر للشرط بأكمله كقيمة منطقية واحدة تكون True
أو False
ولا بأس بتجزئته حينما يسهل بذلك الفهم:
تسلسل المقارنات
تفهم بايثون المقارنات المتسلسلة. فعبارة x < y <= z
تكافئ x < y and y <= z
:
كذلك تراها تستعمل في المساواة:
3.3 الجملة الشرطية المتكاملة
الصيغة المتكاملة للجملة الشرطية على النحو التالي:
- كلمة
if
(إذا) تبدأ الجملة المركبة الشرطية - قد توجد
else
(وإلا) مرة. وهي تعمل عند تخلُّف العبارة المنطقية السابقة لها سواءً كانت السابقة لهاif
أوelif
. - وقد توجد
elif
بينهما مرة أو أكثر (وهي اختصار لكلمةelse if
وتعني: وإلا فإن)، فتعمل مثلelse
معلَّقة بعبارة منطقية مثلif
.
جرب
استكشف المنطق التالي بتغيير قيمة x
كل مرة للتبع ما يحصل في كل مرة:
x = -5
x = 0
x = 1
x = 5
x = -5
if x < 0:
x = 0
print('Set to zero')
elif x == 0:
print('Zero')
elif x == 1:
print('Single')
else:
print('More')
print("Always:", x)
Set to zero
Always: 0
وهذا تصوير لسير الأفعال لنفس الكود. ملاحظة: اضغط على الزر Prev
أو Next
للتنقل بين خطوات التنفيذ الفعلية:
لاحظ أن العبارة الأخيرة خارج كل اللَّبِنات الشرطية لذا يتم تنفيذها دائمًا.
3.4 جملة التعيين المشروط
تستطيع في بايثون أن تجعل جملة التعيين تأخذ قيمتها بحسب شرطٍ معين. مثلاً:
وهي مكافئة للكود التالي:
ويحصل تسلسل التعيين المشروط بالصيغة التالية:
3.5 تضمين الجمل الشرطية
جمل الشرط المضمنة هي جمل if
داخل جمل if
أخرى. على سبيل المثال:
ننبه مرة أخرى أن المحاذاة مهمة. يجب أن تكون جملة if
الداخلية ذات محاذاة أكثر من جملة if
الخارجية.
مثال
افترض أننا نريد تعيين درجة لطالب بناءً على نتيجته، وفقًا للجدول التالي:
Mark | Grade |
---|---|
95-100 | A+ |
90-94 | A |
85-89 | B+ |
80-84 | B |
70-79 | C |
60-69 | D |
0-59 | F |
score = 95
if score >= 90:
if score >= 95:
print("Outstanding: A+")
else:
print("Excellent: A")
elif score >= 80:
if score >= 85:
print("Very Good: B+")
else:
print("Good: B")
elif score >= 70:
print("Okay: C")
elif score >= 60:
print("Poor: D")
else:
print("Failed: F")
Outstanding: A+
وهذا تصوير له:
3.6 التكرار
حلقة التكرار: هي الرجوع بالتنفيذ لجملة سابقة (غالبًا تكون سطرًا سابقًا) وذلك يحصل عددًا من المرات أو معلَّقًا بشرط.
فللتكرار طريقتان:
- سرد متوالية (
for
): حيث يعيَّن متغير التكرار لكل عنصر في المتوالية، واحدًا تلوَ الآخر. (وسيأتي ذكره في باب المتسلسلات) - التكرار بشرط (
while
): حيث يستمر التكرار مادام الشرط متحققًا. (وهو موضوع هذا القسم)
التكرار بشرط
نبدأ بالتكرار بالطريقة غير المحددة، وهي جُملة تبدأ بالكلمة while
على النحو التالي. كأنها if
متكررة إلى حين تخلُّف الشرط (أن يصبح False
). وإن لم يتحقق الشرط أصلاً فلا ينفذ الكود المضمَّن أصلا:
مثال:
لنقم بتتبع الخطوات عندما تكون i = 0
:
0 < 5
تؤولTrue
، فنطبع0
ونزيدi
لتصبح 11 < 5
تؤولTrue
، فنطبع1
ونزيدi
لتصبح 22 < 5
تؤولTrue
، فنطبع2
ونزيدi
لتصبح 33 < 5
تؤولTrue
، فنطبع3
ونزيدi
لتصبح 44 < 5
تؤولTrue
، فنطبع4
ونزيدi
لتصبح 55 < 5
تؤولFalse
،فنخرج من الحلقة- نطبع
Done
وهذا تصوير لسير الأفعال لنفس الكود. ملاحظة: اضغط على الزر Prev
أو Next
للتنقل بين خطوات التنفيذ الفعلية:
لاحظ أن نسيان جملة الزيادة (i += 1
) يجعل الشرط دائمًا صحيحًا، فيدور البرنامج في حلقة لا نهيائة ولا يخرج أبدًا. ويعتبر هذا خطأ برمجيًّا يتعذر على الكود التعامل معه بنفسه؛ بل يجب على المبرمج أن يكتشفه. وسيأتي الكلام عن أنواع الأخطاء في البرمجة في باب الأخطاء.
الخروج من الحلقة
- تستخدم كلمة
break
لإيقاف عملية التكرار كلها. - تستخدم كلمة
continue
للانتقال إلى الكرة التالية متخطيةً بقية الخطوات في الكرة الحالية.
أولاً نمثل لاستعمال جملة break
على النحو التالي:
وهذا مثال لاستخدام عبارة continue
للتخطي:
أما جملة break
المضمنة تحت طبقتين من التكرار فإن الذي يتوقف هو التكرار الداخلي فقط، ولا يتوقف الخارجي. وهذا مثال: