دورة Python للمبتدئين

3: البرمجة بلغة بايثون – الحلقات For و While و الدالة If

Python3.8

السلام عليكم و رحمة الله و بركاته، نتمناكم بخير.

في هذا الدرس، سنتطرق إلى أهم المفاهيم في لغة بايثون:

  • تعبير الشرط If statement
  • حلقة while
  • حلقة for
  • الدالة range()

If statements

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

1 – نبحث عن المكان المناسب الذي يسترعي شروطا معينة
2 – نقوم ببسط الخيمة على الأرض
3 – نقوم بتثبيت الأوتاد و ربطها بالحبال
4 – نقوم بتثبيت الأعمدة الداخلية
5 – …إلخ.

فإذا لم نختر مكانا يسترعي تلك الشروط المعينة مسبقا، لا يمكن أن ننتقل إلى الأوامر التالية: 2، 3، 4… و هذا هو مبدأ if statements.

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

مثال:

x = 10 
if x > 20:
    print("Bigger than 20")
elif x < 20:
    print("Smaller than 20")
else:
    print("The end.")

تحليل الشفرة:

لدينا المتغير x يحمل القيمة العددية 10.

بعدها حددنا شرطا معينا بعد تعبير if و هو x > 20 ، بتحقق هذا الشرط سيُنَفَّذ الأمر print(“Bigger than 20”) . و إذا لم يتحقق، سنتجاوز ذلك الأمر.

ننتقل للسطر الموالي و الذي يوجد فيه تعبير elif و يحمل شرطا آخر و هو x < 20 ، إذا تحقق هذا الشرط سننفذ الأمر print(“Smaller than 20”) .أما إذا لم يتحقق، سننتقل إلى السطر الموالي دون تنفيذ ذلك الأمر.

في السطر الموالي لدينا تعبير else و في هذه الحالة سننفذ الأمر النهائي في كل الحالات و هو: print(“The end.”)

إذا: لكتابة شفرة شرطية، نستعمل التعبير if، بحيث:
if – تمثل الشرط الأول الذي سنتأكد من تحققه، و إذا تحقق الشرط، ننفذ الأمر الذي يتواجد مباشرة أسفلها. إذا لم يتحقق الشرط، نتجاوز ذلك الأمر و لا يتم تنفيذه
elif – هو اختصار else if، أي إذا لم يتحقق الشرط السابق، نضع شرطا آخر للتحقق منه، عند تحققه ننفذ الأمر الذي يوجد أسفله مباشرة، عندما لا يتحقق الشرط، نتجاوز الأمر و ننتقل للسطر الموالي. (تستعمل عند وجود عدة شروط)
else – هو السطر النهائي، أي عندما لا يتحقق أي شرط من الشروط أعلاه، نقوم بتنفيذ الأمر الموجود أسفل هذا التعبير.

سؤال: ما النتيجة التي ستظهر عندما ننفذ الشفرة السابقة؟

جربوا كتابة الكود بنفسكم في IDLE، بهذه الطريقة:

نفتح الـ IDLE و نضغط بعدها على File
نضغط بعدها على New File، أو ببساطة نضغط على Ctrl+N كما هو موضح
ستظهر صفحة جديدة فارغة، و نكتب الشفرة هناك
بعدها نضغط على Run ثم على Run Module أو على F5 مباشرة
نضغط على Ok و نحفظ الملف في مكان ما تحت اسم معين

النتيجة :

Smaller than 20

لنغير العدد من 10 إلى 30 مثلا و نقارن النتيجة التي ستظهر:

x = 30
if x>20:
    print("Bigger than 20")
elif x<20:
    print("Smaller than 20")
else:
    print("The end.")

النتيجة:

Bigger than 20

نلاحظ أن التعبير الأخير else لم يشتغل في كلتا الحالتان، ذلك لأننا قارننا العدد بالرقم 20 فقط، فإذا لم يكن العدد أكبر من 20، فسيكون بشكل أوتوماتيكي أصغر منه. و العكس صحيح.

لنغير إذا الشروط و ندخل العدد 25 في المتغير x، بحيث:
– الشرط الأول: x > 30
– الشرط الثاني: x < 20

x = 25
if x > 30:
    print("Bigger than 30")
elif x < 20:
    print("Smaller than 20")
else:
    print("The end.")

لنشغل الشفرة:

The end.

تظهر جملة The end. و هذا يدل على أن الأمر المرتبط بالتعبير else قد تم تنفيذه ذلك لأن الشرطين السابقين لم يتحققا.

إذا، else تشتغل فقط عندما لا تتحقق الشروط السابقة.

While loop

while تعتبر حلقة تكرارية في بايثون، أي أنها شفرة تسمح لنا بتكرار كود معين طالما يتحقق شرط ما. مثال بسيط سيوضح هذا الأمر، الراتب الشهري للموظف يُرسَلُ إليه كل شهر مادام الموظف مواظبا على العمل. و لكن إن استقل من وظيفته فسيتوقف عن الاستفادة من راتبه. إذا فالراتب سيبقى يُرسل إلى رصيد الموظف طالما هذا الموظف لا زال يشتغل. و بمجرد توقفه عن العمل سيتوقف إرسال الراتب. الشرط هنا هو العمل، و الأمر هو إرسال الراتب لرصيد الموظف.

برمجيا، نكتب صيغة هذه الحلقة كالتالي:

i = 1
while i<10:
    print(i)
    i += 1

في المعطيات لدينا المتغير i يحمل قيمة عددية تساوي 1 ، و من خلال حلقة while، نأمر الحاسوب بطباعة المتغير i و إضافة العدد 1 إليه كل مرة حتى يصل إلى العدد 10 ثم يتوقف.

كيف تشتغل الحلقة؟

أولا، لدينا i = 1 ، نقوم بتنفيذ الأمر print(i) و نظهر محتوى المتغير الذي هو 1، ثم ننتقل إلى السطر التاني و ننفذ العملية i += 1 و هي تعني i = i + 1 ، أي أننا نضيف الرقم 1 إلى i كل مرة. و في هذه الحالة، i = 1 ، إذا i = 1 + 1 = 2 و هنا بلغنا آخر سطر من الحلقة، و يجب أن نعيد الكرة من جديد لأن i = 2 و لم نبلغ العدد 10 بعد.

ثانيا، لدينا i = 2، ننفذ الأمر الأول و نظهر 2، و بعدها ننجز العملية i += 1، إذا i = 2 + 1 = 3. نعيد الكرة من جديد؛

و هكذا إلى أن نصل إلى i = 9، عندما نطبع الرقم 9، ننجز بعدها العملية i += 1، لدينا i = 9، إذا i = 9 + 1 = 10. بما أن شرط تنفيذ و تكرار الحلقة while هو i < 10، أي أصغر قطعا من 10. و مادام الآن i = 10 فستتوقف الحلقة.

1
2
3
4
5
6
7
8
9

يجب الحذر عند اختيار شرط لتنفيذ الحلقة، إذا قمنا باختيار شرط يتحقق دائما و لا يمكن أن يتغير، فإن الحلقة لن تتوقف أبدا عن التكرار.

a = 10
i = 1
while a == 10:
    print(i)
    i += 1

لنمعن النظر في هذه الشفرة و لنفكر ما الذي سيحدث عند تنفيذها. أدعوكم للتفكير في الأمر قليلا.

لنشاهد الآن تنفيذ هذه الشفرة:

Endless Loop

كما نلاحظ، لم تتوقف الحلقة أبدا، ذلك لأن الشرط كان متحققا دائما، إذ أننا لم نغير قيمة المتغير a البتة، فبقي كما هو دائما يساوي 10.

For loop

يتم استعمال حلقة for للتسلسل عبر نص string، قائمة list، قاموس dictionary، مجموعة set، أو مصفوفة (صفوف) tuple .

الخاصية المميزة لحلقة for في بايثون مقارنة مع اللغات الأخرى، هي أنها تتسلسل عبر النصوص و القوائم أيضا بشكل بسيط و سهل جدا.

التسلسل عبر نص:

for i in 'shafrah':
	print(i)

حددنا المتغير i ليحمل قيمة كل جزء مكون للنص الذي أدخلناه.

في هذه الحالة، ستقوم الحلقة for بالمرور عبر كل جزء من النص shafrah ، و ستظهر كل حرف من حروف النص كالتالي:

s
h
a
f
r
a
h

تم إدخال قيمة الحرف الأول و هو الحرف s في المتغير i في أول دورة للحلقة، أما عندما قامت بالدورة الثانية، تم إدخال الحرف الثاني و هو h و الحرف الأول تم حذفه من المتغير i، و بالتالي فالمتغير i لا يحمل الكلمة كاملة، بل حرفا واحدا فقط. و في آخر الحلقة عندما تتوقف، سيحتوي المتغير i على الحرف الأخير h فقط.

التسلسل عبر قائمة:

نفس المنطق مع ما قلناه أعلاه، في هذه الحالة، المتغير i سيتضمن كل عنصر من عناصر القائمة:

l = ["Python","is","fun"]
for i in l:
	print(i)

عند تشغيل الشفرة، يظهر كل عنصر من القائمة كالتالي:

Python
is
fun

التسلسل مع التأكد من تحقق شرط معين:

عندما نرغب في التأكد من أن عناصر قائمة ما تحترم شرطا معينا، نستطيع أن نضيف صيغة الشرط if داخل الحلقة كالتالي:

numbers = [1,2,5,9,12,33,34,57,90,121]
for i in numbers:
	if i%2 == 0:
		print(i)

في هذه الحالة، نتأكد من زوجية الأعداد في القائمة المسماة numbers، و للتأكد من زوجيتها، نستعمل العملية i%2 ، أي ما هو الباقي الذي يبقى عندما نقسم العدد على 2. إذا بقي 0، فهذا يعني أن العدد زوجي، أما إذا لم يكن الباقي 0، فهذا يعني أن العدد فردي.

2
12
34
90

الدالة range():

نستعمل هذه الدالة من أجل التسلسل على مجموعة أرقام. و ذلك موضح في المثال التالي:

for i in range(10):
	print(i)

تتسلسل الحلقة 10 مرات عبر الأرقام من 0 إلى 9.

0
1
2
3
4
5
6
7
8
9

إذا أردنا تحديد مقطع ما معين من الأرقام للتسلسل عبره، نضيف رقم البداية على اليمين و رقم النهاية على اليسار، و يجب ألا ننس أن الرقم الذي يوجد على اليسار غير مُضَمَّن في المجموعة:

for i in range(4,14):
	print(i)

نبدأ من 4 و ننتهي عند 13:

4
5
6
7
8
9
10
11
12
13

عندما نرغب بتحديد خطوة معينة للقفز بها بين أرقام المجموعة، نضيف رقما آخر في الدالة كما التالي:

>>> for i in range(4,14,8):
	print(i)

النتيجة:

4
12

الخطوة هي 8، أي أن العدد الموالي أكبر من العدد الحالي بثمانية أرقام.
نبدأ بالرقم 4، و من ثم ننتقل للرقم الموالي و هو: 4 + 8 = 12. و من ثم ننتقل للرقم الموالي، 12 + 8 = 20. بما أن 20 ليست ضمن ]4:14]، فستتوقف الحلقة عند العدد 12.

>>> for i in range(5,10,2):
	print(i)

النتيجة:

5
7
9

الخطوة هي 2. نبدأ بالعدد 2، و من ثم ننتقل للعدد الموالي و هو: 7 = 5 + 2 . و من ثم ننتقل للعدد الموالي، 9 = 7 + 2.

>>> for i in range(-10, -100, -20):
	print(i)

النتيجة :

-10
-30
-50
-70
-90

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

سؤال: ما المميز في الدالة range() ؟

قد يتساءل أحدكم هذا السؤال، و هو ما الداعي إلى استعمال الدالة range ما دمنا نستطيع استعمال القوائم lists.

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

و لهذا السبب، عندما نطبع الدالة range(2,12) مثلا، لا تظهر لنا الأرقام من 2 إلى 11، بل تظهر الدالة مكتوبة كما هي:

>>> print(range(2,12))
range(2, 12)

أما إذا أردنا أن نصنع قائمة باستعمال دالة range، نستعمل الطريقة التالية:

>>> list(range(2,12))
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

نهاية الدرس الثاني

بلغنا نهاية الدرس الثاني. نتمنى أن يكون الدرس واضحا كفاية، و نرحب بكل انتقاداكم و تساؤلاتكم في قسم التعليقات أسفل الموضوع.

في الدرس القادم سنتطرق لبعض الأمور الخاصة بالحلقات while و for. و بعدها بحول الله سنخصص موضوعا كاملا للتطبيقات.

السابق
2: البرمجة بلغة بايثون – Constants, Variables و أنواع البيانات
التالي
4: البرمجة بلغة بايثون – Break, Continue, Pass

تعليقان

أضف تعليقا

  1. التنبيهات : البرمجة بلغة بايثون: دورة خاصة بالمبتدئين – الدرس الرابع - شِفْرَة

  2. التنبيهات : 8 : البرمجة بلغة بايثون - معالجة الاستثناءات - شِفْرَة

شاركنا برأيك