الدوال البرمجية
(Functions)
أنواع الحلقات في برمجية بايثون (Python)
هل خطر ببالك يوماً أن تسجل روتينك اليومي ؟ مثل الإستيقاظ،تناول طعام الإفطار، الذهاب الى المدرسة، العودة الى المنزل، تناول طعام الغداء ، حل الواجبات،تناول طعام العشاء، الذهاب الى النوم وغيرها من الأعمال على مدار اليوم؟
لو كتبتها على مدار أسبوع، سوف تجد أن هناك مجموعة من الأعمال تتكرر معك يومياً وبانتظام، أي أنك ممكن أن تجمعها داخل قوسين وتضع جنبها كلمة : تتكرر طوال الأسبوع.
إن مثل هذه الأعمال التي تتكرر تشبه الى حد كبير مجموعة الأوامر والتعليمات التي تريد تكراراها خلال برنامج بايثون، إذ بدل أن تكرر كتابتها بعدد مرات تنفيذها،نستعيض عن ذلك بمفهوم الحلقة((Loop.
الحلقة: هي عملية تكرار تنفيذ مجموعة من اﻷوامر في البرنامج ، حيث يتم إ ستخدام الحلقات ( Loops ) لجعل الكود يعاد تنفيذه ضمن شروط معينة.
فعند البدء بتشغيل البرنامج،وعندما يمر المفسر على الحلقة التكرارية فإنه يتحقق من الشرط،
إذا كان الشرط (true ) ينفذ اﻷوامر الموجودة بداخل الحلقة التكرارية ثم يعود مرة أخرى لبداية الحلقة التكرارية ليتحقق مرة أخرى من الشرط، فإذا كان الشرط ينتج عنه (true ) سيقوم المفسر بتنفيذ الأوامر الموجودة بداخل الحلقة التكرارية مرة أخرى وتتكرر هذه العملية إلى أن يكون ناتج الشرط (false ( فيتوقف المفسر عن التكرار ويمر على باقي الكود.
ويمثل الرسم التالي مبدأ عمل الحلقات في برمجية بايثون (Python):
حيث انّ البرنامج يقوم بتنفيذ الجملة رقم 1 ثم الجملة رقم 2 وعندما يصل الى الحلقة يقوم البرنامج بتنفيذ الأوامر الموجودة داخل الحلقة التكرارية عدد من المرات طالما كانت نتيجة الشرط صحيحة، وفي حال كانت نتيجة الشرط خطأ، فإن البرنامج يقوم بالانتقال الى الجملة
رقم 3.
تُصنَّف الحلقات في برمجية بايثون (Python ( إلى نوعين، هما:

سوف نتعرف الآن على أنواع الحلقات وجمل التحكم بشكل عام، وسوف نتناولها بالتفصيل لاحقاً.
أولاً:حلقات while (while loops) :
تُستعمَل حلقة (while) لتكرار تنفيذ جملة واحدة أو أكثر طالما تحقَّق شرط مُعيَّن. وفي حال لم يعد هذا الشرط مُتحقِّقًا، فإنَّ البرنامج يتوقَّف عن تنفيذ هذه الجملة أو الجمل.
ثانيا: حلقات for (for loops):
يستخدم هذا النوع من الحلقات لغايات تكرار مجموعة من الجمل البرمجية عدداً محددًا من المرات.
جمل التحكم (Control Statements)
وحتى يتم ضبط هذه الحلقات، فإن برمجية بايثون تحتوي على عدد من جمل التحكم (Control Statements) التي تضبط آلية تنفيذ الحلقة. وسوف نتعرف هنا على نوعين من جمل التجكم هما:
1.جملة التحكم (break) :والتي يتم استخدامها لغايات إيقاف الحلقة اذا تحقق شرط معين ومن ثم يتم تنفيذ الجملة التي تلي الحلقة في البرنامج
2.جملة التحكم (continue): تستخدم لإيقاف الدورة الحالية في الحلقة و الإنتقال إلى الدورة التالية فيها غذا تحقق شرط معين، و يفترض أن تكون موضوعة بداخل جملة شرطية.
وفيما يلي شرح توضيحي حول الحلقات المستخدمة في يرمجية بايثون وآلية استخدامها مع الجمل الشرطية:
حلقات(while (while loops
1.الكلمة المحجوزة: while
2.الصيغة العامة :
while condition:
statements
increment or decrement
حيث تمثل كلمة (while) الكلمة المحجوزة
وكلمة (condition) :الشرط الذي يحدد استمرارية تنفيذ الجمل الموجودة في الحلقة،وفي كل مرة يمر البرنامج على الحلقة يتم التحقق من الشرط،إذ يتم توقف تنفيذ الجمل حين يصبح الشرط غير متحقق.
وكلمة (statement) :الجمل الموجودة داخل الحلقة والمراد من البرنماج تكرار تنفيذها ما دام الشرط متحققاً.
وكلمة (increment):الآلية التي من خلالها يتم زيادة قيمة العداد
وكلمة (decrement) : الآلية التي من خلالها يتم تنقيص قيمة العداد
3.مخطط سير العمليات للحلقة:

مثال
لنكتب الآن برنامجًا يقوم بطباعة قيمة العداد (count) من (1) الى (5) باستخدام الحلقة (while)
Count = 1
While count : 6 >
Print(“count is “, count)
Count+= 1
else:
print(“Loop has ended”)
والآن، لنتتبع الكود الذي في الأعلى لنرى كيف يتم تنفيذ البرنامج:
1.في البداية،يعمل البرنامج على تعريف المتغير الذي يحمل الإسم count ويقوم بإعطائه قيمة أولية هي 1
2.الآن يقوم المفسر بتنفيذ الحلقة، حيث يعمل على التحقق من الشرط: هل قيمة المتغير (count) أقل من (6) ؟
اذا كانت الإجابة نعم، فإن البرنماج يقوم بتنفيذ الجملة التالية في داخل الحلقة.
3.الجملة التي في داخل الحلقة ، تطلب طباعة قيمة المتغير () ، أي ان البرنامج يقوم بطباعة الرقم 1
4.يذهب البرنامج الى تنفيذ الجملة التالية وهي العمل على زيادة قيمة المتغير () بمقدار (1) ثم يعود الى تنفيذ الجلقة مرة أخرى
5.في كل مرة يعود البرنامج لتنفيذ الحلقة،يعمل على التحقق من الشرط مرة أخرى، وطالما كانت نتيجة تطبيق الشرط صحيحة،يعمل البرنامج على تكرار الخطوة رقم (3) والخطوة رقم (4).
في حال لم يعد الشرط صحيحاً، فإن البرنامج يغادر الحلقة، ويذهب الى تنفيذ الجملة التي خارج الحلقة ويطبع عبارة "Loop has ended"

- أُنفِّذ المثال السابق في بيئة بايثون Python وأُلاحِظ الناتج

- أُعدِّل المقطع البرمجي بتغيير جملة count += 1 إلى جملة count += 2 ثمَّ أُنفِّذ البرنامج. ما الناتج المُترتِّب على تنفيذ البرنامج؟

- أُعدِّل المقطع البرمجي بتغيير الشرط count = 6 إلى الشرط count < 6 ثمَّ أُنفِّذ البرنامج. ما الناتج المُترتِّب على تنفيذ البرنامج؟

جملة التحكُّم ( break ) في حلقات (while)
والان لنجعل ذات البرنامج الذي كتبناه سابقا يقوم بطباعة قيمة العداد (count) باستخدام الحلقة (while) ولكن بشرط أن يتوقف البرنامج إذا اصبحت قيمة العداد 4.
في هذه الحالة، يجب استخدام جملة التحكم (break) والتي سوف تعمل على توقف البرنامج عند تحقق الشرط (وهنا قيمة count=4)،بحيث يصبح البرنامج على النحو التالي:
count = 1
while count < 6:
print(count)
if count == 4:
break
count += 1
عند تشغيل البرنامج (الجزء الذي يظهلر عليه رقم 1) ستظهر النتيجة الآتية على شاشة جهاز الحاسوب(الجزء الذي يظهر عليه رقم 2):

جملة التحكُّم continue في حلقات while
تعرَّفْتُ سابقًا أنَّ جملة التحكُّم continue تُستعمَل لإيقاف الدورة الحالية في الحلقة، والانتقال
إلى الدورة التالية فيها إذا تحقَّق شرط مُعيَّن.
مثال:
تعمل جملة التحكُّم continue على طباعة الأرقام من 1 إلى 6 باستثناء الرقم 2 كما يأتي:

جملة else مع حلقات while
تُستعمَل جملة else مع حلقة while لتنفيذ مجموعة من الأوامر البرمجية إذا أصبحت قيمة
الشرط خطأً False أيْ خارج الحلقة.
مثال:
يطبع البرنامج الآتي قيمة العدّاد إذا كانت القيمة أقل من 4 وخلافًا لذلك، فإنَّ البرنامج سيطبع
عبارة "count is no longer less than 4":
count = 1
while count < 4:
print(count)
count += 1
else:
print("count is no longer less than 4")
عند تشغيل البرنامج، ستظهر النتيجة الآتية على شاشة جهاز الحاسوب:


عند تعديل المقطع البرمجي،يصبح الكود كما يلي:

مثال:
البرنامج الآتي يعمل على حساب مجموع الأعداد التي أدخلها المُستخدِم حتى يصل المجموع إلى
30 فأكثر، أو حتى يتمَّ إدخال القيمة 0 . فإذا وصل المجموع إلى 30 فأكثر، طُبِع المجموع
الحالي، وخرج البرنامج من الحلقة. أمّا إذا أُدخِلت القيمة 0 قبل الوصول إلى المجموع 30
فإنَّ البرنامج يطبع رسالة مفادها أنَّ المجموع أقل من 30 ثمَّ يعرض قيمة المجموع النهائية.
s = 0
a = int(input("Enter a number (0 to stop): "))
while a != 0:
s += a
if s >= 30:
print("Sum is equal to", s)
break
a = int(input("Enter a number (0 to stop): "))
else:
print("Sum is equal to", s, ".")
عند تشغيل البرنامج، وإدخال العدد 10 ثمَّ العدد 15 ثمَّ العدد ثمَّ العدد 0 ستظهر النتيجة الآتية على شاشة جهاز الحاسوب:

إذا حُذِفت جملة else الواردة في المثال السابق، فإنَّ النتيجة الآتية ستظهر على شاشة جهاز
الحاسوب عند تشغيل البرنامج:

أُلاحِظ أنَّ وجود جملة else يتيح للمُستخدِم التحكُّم في طباعة الجملة الثانية، بحيث لا تُطبَع إلّّا
بعد خروج البرنامج من الحلقة دون أنْ يتحقَّق الشرط في جملة

لماذا يؤدّي هذان المقطعان البرمجيان إلى حلقة لانهائية؟
لأن الشرط i = = 1 صحيح وسوف يعمل على تنفيذ ما بداخل while بدون توقف وذلك بسبب ّعدم وجود تغيير في قيمة العداد i "مثل i+=2 ............الخ والتي تساعد على ايقاف التكرار .
ما الطرائق التي يُمكِن استعمالها لتجنُّب الحلقات اللانهائية؟
الجواب:
تغيير قيمة العداد بزيادته أو انقاصه حتى يعمل على استمرار عمل الحلقة أو ايقافها .
كيف يُمكِن تعديل المقطع البرمجي على نحوٍ يجعل التنفيذ ينتهي في نقطة مُحدَّدة؟
يمكن تعديل المقطع الأول على النحو التالي: :

ويمكن تعديل المقطع الثاني على النحو التالي: :

حلقاتfor loop ) for )
تُعرَّف حلقة for باستخدام الكلمتين المحجوزتين for و in على النحو الآتي:
for element in sequence:
statements
حيث:
- element : مُتغيِّر يُعرَف داخل الحلقة، وتوضَع فيه إحدى قِيَم المتتابعة sequence التي تُجلَب في كل دورة، وتكون موضوعة بعد هذا المُتغيِّر.
- sequence : سلسلة يريد المُستخدِم الوصول إلى جميع عناصرها.
- statements : جمل موجودة في حلقة for التي سيُكرِّر البرنامج تنفيذها في كل دورة.
والشكل التالي يظهر مخطط سير العمليات لطريقة عمل حلقات (for)

الدالَّة range مع حلقات for
- تُستعمَل الدالَّة range لإرجاع سلسلة من الأرقام، تبدأ بالرقم 0 ( ما لم يُحدَّد رقم آخر ) وتنتهي برقم مُحدَّد
- تزداد range بمقدار 1 ( ما لم يُحدَّد مقدار آخر للزيادة )
تُستخدَم الدالَّة range بثلاث طرائق مختلفة، هي:
range(a) : تُرجِع الدالَّة بهذه الطريقة سلسلة من الأرقام، بَدْءًا بالرقم 0 وانتهاءً بالرقم a-1 حيث a تمثل رقمًا
مثال:
إذا كانت قيمة a هي 5 فإنَّ الدالَّة ستُرجِع سلسلة الأرقام الآتية: 0 ، 1 ، 2 ، 3، 4 .
range(a, b) : تُرجِع الدالَّة بهذه الطريقة سلسلة من الأرقام، بَدْءًا بالرقم a وانتهاءً بالرقم b-1
مثال:
إذا كانت قيمة a هي 1 وقيمة b هي 5 فإنَّ الدالَّة ستُرجِع سلسلة الأرقام الآتية:
1 ، 2 ، 3 ، 4 .
range(a, b, c) : تُرجِع الدالَّة بهذه الطريقة سلسلة من الأرقام على النحو التالي::
تبدأ بالرقم a
تنتهي بالرقم b-1
تتزايد الأرقام بقفزة مقدارها ( c ) .
مثال:
إذا كانت قيمة a هي 1 وقيمة b هي 5 وقيمة c هي 2
a = 1 , b = 5 , c = 2
فإن الدالَّة ستُرجِع سلسلة الأرقام 1 ، 3 ذلك أنَّ السلسلة تبدأ بالعدد 1 والقيمة الابتدائية a ثمَّ تزيد القيمة التالية بمقدار 2 وتزيد القيمة الابتدائية بمقدار 2 فتصبح 3 ولا يتمُّ تضمين القيمة 5 في هذه الحالة؛ لأنَّ السلسلة تتوقَّف عند الرقم b-1 أيْ عند الرقم 4
مثال:
يطبع البرنامج الآتي القِيَم من 1 إلى 4، حيث القيمة 1 هي قيمة a والقيمة 4 هي قيمة b-1
وبتزايد c مقداره 1 :
for x in range(1, 5, 1):
print(x)
عند تشغيل البرنامج، ستظهر النتيجة الآتية على شاشة جهاز الحاسوب:

الحل :
لا ، لن يختلف لأنه مقدار التزايد هو 1
1-
2- 

مثال:
يُبيِّن البرنامج الآتي استخدام الدالَّة range في العَدِّ العكسي من 5 إلى 1 :
for x in range(5, 0, -1):
print(x)
عند تشغيل البرنامج، ستظهر النتيجة الآتية على شاشة جهاز الحاسوب:


مثال:
يطبع البرنامج الآتي القِيَم من 1 إلى 4، ثمَّ يطبع عبارة x contains:", x " حيث x هي القيمة
النهائية ضمن range
for x in range(1, 5, 1):
print(x)
print("x contains:",x)
عند تشغيل البرنامج، ستظهر النتيجة الآتية على شاشة جهاز الحاسوب:

جملة التحكُّم break مع حلقات for
تعمل جملة التحكُّم break مع حلقات for بالطريقة نفسها التي استُخدِمت فيها مع حلقات while
مثال:
يُنفِّذ البرنامج الآتي الحلقة for ويتوقَّف عن ذلك حين تصبح قيمة x تساوي 2 :
for x in range(1, 5, 1):
print(x)
if x == 2:
break
عند تشغيل البرنامج، ستظهر النتيجة الآتية على شاشة جهاز الحاسوب:

الحل : سيطبع فقط 2 على شاشة جهاز الحاسوب كما يلي :

جملة التحكُّم continue مع حلقات for
تُستخدَم جملة التحكُّم continue مع حلقات for بالطريقة نفسها التي استُخدِمت فيها مع حلقات while .
مثال:
يطبع البرنامج الآتي الأعداد 1 و 3 و 4 باستخدام جملة التحكُّم continue :
for x in range(1, 5, 1):
if x == 2:
continue
print(x)
عند تشغيل البرنامج، ستظهر النتيجة الآتية على شاشة جهاز الحاسوب:

جملة else مع حلقات for
يُمكِن استعمال جملة else مع حلقات for لتنفيذ مجموعة من الأوامر عند الخروج من الحلقة.
مثال:
for x in range(1, 5, 1):
print(x)
else:
print("counting is completed.")
عند تشغيل البرنامج، ستظهر النتيجة الآتية على شاشة جهاز الحاسوب:

الحل : عند قيمة x = 2 سيتوقف عمل جملة for ولن ينفذ ما بعد else كما يلي :

حلقات for المُتداخِلة ( Nested for Loops )
يُمكِن كتابة حلقة for في البرنامج داخل حلقة for أُخرى، عندئذٍ سيُنفِّذ البرنامج الحلقة الداخلية
في كل دورة من دورات الحلقة الخارجية.
مثال:
يطبع البرنامج الآتي العناصر الخمسة الأولى من جدولي الضرب للعددين 8 و 7 باستخدام حلقات for المُتداخِلة:
for x in range(7, 9):
print("Multiplication Table", x)
for y in range(1, 6):
print(x, "*", y, "=", x * y)
عند تشغيل البرنامج، ستظهر النتيجة الآتية على شاشة جهاز الحاسوب:


الحل:



الحل :
لن يظهر أي شيء عند تنفيذ المقطع البرمجي
for x in range(5):
pass
أما عند تنفيذ المقطع بدون pass سوف يعطي Syntax error لعدم اكتمال جملة الدوران

الحل : الخطأ بكتابة اشارة المقارنة =
if i % 2 = 0:
الصواب
if i % 2 == 0:
انظر الشكل :
