البرمجة بلغة بايثون (الفصل السادس)
- أبريل 12, 2023
- تم النشر بواسطة: كود خانة
- الفئة: البرمجة بلغة بايثون
التكرار (While loop):
في الدرس السابق (درس الشروط) تعلمنا كيفية استخدام المقارنة والعمليات المنطقية لتنفيذ كود معين في حال تحقق الشرط ولكن تنفيذ الكود كان لمرة واحدة فقط وفي هذا الدرس سنتعلم شيء مشابه للشروط ولكن هذه المرة سنستخدم حلقات التكرار يعني في حال تحقق الجملة البرمجية سيتم تنفيذ الكود لعدد معين من المرات ، ونحن من نقوم بتحديد عدد مرات تنفيذ هذا الكود ولتوضيح ذلك انظر الى الكود التالي
الجملة الشرطية (الدرس السابق)
1 2 3 4 |
# if statement x = 4 if x > 1: print('Hello world!') |
1 |
Hello world! |
الجملة التكرارية (بأستخدام while)
1 2 3 4 5 |
# while loop x = 4 while x > 1: print('Hello world!') x = x - 1 |
1 2 3 |
Hello world! Hello world! Hello world! |
الان سنشرح الكود الذي في الاعلى بالتفصيل من خلال الخطوات التالية:
- في جملة if الشرطية تم تنفيذ الكود مرة واحدة لان هذا هو دور جملة if تنفذ الكود في حال كانت قيمة المقارنة True
- اما في while ايضا كان لدينا مقارنة ولكن هنا سيتم تنفيذ الكود مادامت قيمة المقارنة True يعني في المرة الاولى كانت قيمة x=4 وكانت حقا x اكبر من 1 يعني ناتج المقارنة سيكون True وبما انه True سندخل الى داخل الكود لتنفيذه واول شيء داخل الكود هو اطبع !Hello world وثاني شيء هو x=x-1 يعني اصبحت قيمة x=3
- الان وظيفة while هي التكرار وسوف تعاد العملية من جديد ولكن الان قيمة x=3 ومازال قيمة المقارنة True لان x > 1 وسيتم تنفيذ الكود مرة اخرى وهي امر الطباعة ثم x=x-1 وستصبح الان قيمة x=2
- ومازالت المقارنة x > 1 قيمتها True ولذلك سيتم تنفيذ امر الطباعة للمرة الثالثة وسيتم تحديث قيمة x من خلال x = x-1 وستصبح x=1
اما الان اصبحت قيمة المقارنة False لان x=1 هذا يعني انها ليست اكبر من 1 ولذلك سيتوقف اللوب او التكرار ولن يتم تنفيذ الكود مرة اخرى
اهم ملاحظة في التكرار while يجب ان يكون هناك عداد يوقف اللوب او التكرار (في المثال السابق العداد كان x=x-1) لانه بدون هذا العداد سيتم تنفيذ اللوب الى مالانهاية لانه في كل مرة سوف يتم الرجوع فيها الى المقارنة ستكون قيمة x =4 وهي اكبر من 1 وسيتم تنفيذ الكود مرة اخرى ومرة اخرى وبدون توقف وهذا يسمى برمجيا infinite loop ويجب ان نحذر منه لانه سيتسبب في تعليق البرنامج او المشروع
ولفهم while loop والعداد بشكل اوضح لنأخذ مثال الاخر:
في هذا المثال لدينا متغير اسمه i وقيمته 1 ونريد تنفيذ بلوك من الكود هذا البلوك هو عبارة عن طباعة تربيع الـ i ثم زيادة الـ i بمقدار 1 ثم طباعة قيمة i الجديدة ونريد تنفيذ هذا البلوك من الكود مادامت i اصغر من 4
1 2 3 4 5 |
i = 1 while i < 4: print(i**2) i = i + 1 print('New i =' , i) |
1 2 3 4 5 6 |
1 New i = 2 4 New i = 3 9 New i = 4 |
ايضا سنشرح الكود الذي في الاعلى على شكل خطوات مبسطه من اجل استيعابه بشكل اكبر:
- اول مرة كانت قيمة i=1 وهي فعلا اصغر من 4 ولذلك ناتج المقارنة سيكون True وسيسمح لها بالدخول الى البلوك البرمجي الذي نريد تنفيذه وتم طباعة 1 تربيع الواحد وهي 1 ثم تم تحديث قيمة i =i+1 فأصبحت i=2 ووضعنا جملة طباعة اخرى في بلوك الكود بعد تحديث i من اجل طباعة قيمة i الجديدة وكما هو واضح تم طباعة New i = 2
- ثم تم تكرار اللوب وايضا i اصغر من 4 لان 2 اصغر من 4 وتم طباعة تربيع i حيث تربيع 2 هو اربعة ثم حدثنا i واضفنا لها واحد واصبحت 3 وطبعنا قيمة i الجديدة
- وتم تكرار اللوب مرة اخرى حيث i مازالت ينطبق عليها الشرط لان 3 اصغر من اربعة وقمنا بطباعة مربع الثلاثة وهو 9 ثم حدثنا i واصبحت 4 وطبعنا قيمة i الجديدة
- وتم تكرار اللوب ولكن هنا سيتم توقف اللوب ولن يتم تنفيذ الاكواد لان i قيمتها الان 4 وهي ليست اصغر من 4 ولاينطبق عليها الشرط ولن يتم الدخول الى بلوك الاكواد المكون من ثلاث سطور داخل while لان الدخول مسموح فقط عندما يتحقق الشرط ولذلك ستتوقف عملية اللوب
ملاحظة: نستطيع صناعة لوب داخل لوب ونستطيع استخدام الشروط if, else داخل اللوب
مساحة تجريبية:
تمرين برمجي (1):
لدينا المتغير التالي
1 |
counter = -4 |
1- انشئ while loop يكون شرطه counter != 0
2- السطر الاول في هذا اللوب هو طباعة كلمة Great job
3- اضف شرط من نوع if شرطه هو هل counter > 0 (يعني موجبة) اذا تحقق هذا الشرط قم بتحديث العداد بالشكل التالي counter = counter – 1
4- اضف else (يعني في حال كانت سالبة) قم بتحديث العداد بالشكل التالي counter = counter + 1
5- اطبع قيمة counter
# Initialize counter = -4
counter = -4
#1 Code the while loop
__________________:
#2 Print Great job
__________________
#3 if counter positive
______________:
# Decrease counter
_____________________
#4 else (negative)
____:
# Increase counter
_____________________
#5 Print counter
______________
# Initialize counter = -4
counter = -4
#1 Code the while loop
while counter != 0:
#2 Print Great job
print("Great job")
#3 if counter positive
if counter > 0:
# Decrease counter
counter = counter - 1
#4 else (negative)
else:
# Increase counter
counter = counter + 1
#5 Print counter
print(counter)
Ex().has_equal_ast(exact=False)
success_msg("اجابة صحيحة، احسنت")
قم بتجربة تغيير قيمة العداد counter اجعل قيمته مثلاً 6 ولاحظ الناتج
ملاحظة: الفكرة من هذا التمرين هو صناعة لوب يعمل مادام العداد لا يساوي 0 وهناك شرط داخل هذا اللوب في حال كانت قيمة العداد موجبة تتناقص حتى تصل الى الصفر فيتوقف اللوب وفي حال كانت قيمة العداد سالبة تتزايد حتى تصل الى الصفر فيتوقف اللوب
التكرار ( for loop):
اللوب من نوع for هو من اهم الامور التي عليك تعلمها واتقانها واحترافها في اي لغة برمجية وخاصة لغة بايثون ولذلك في هذا الدرس سوف نقوم بشرح اللوب من نوع for بالتفاصيل مع عدة انواع من الوظائف التي تستخدم معه بالاضافة الى طريقة استخدامه مع مختلف انواع البيانات مثل القوائم والنصوص والارقام والدكشنري والتوبلز
التكرار من نوع for هو ايضا لوب مثل while ينفذ كود معين لعدة مرات ونحن من نقوم بتحديد عدد مرات التكرار ولكن فرق for عن while هو انه for لاتأخذ شرط او عملية مقارنة بل تأخذ متغير متكرر يعني قابل للتكرار (له عدة قيم) مثل القوائم تأخذ اكثر من قيمة او النصوص او الدكشنري او التوبلز وايضا تأخذ for متغير ممكن ان نسميه اي اسم نريد حيث هذا المتغير ستكون قيمته هي قيمة كل عنصر داخل القائمة او النص او الدكشنري او التوبلز والشكل البسيط للوب هو
1 2 |
for i in [10, 20, 30]: print(i) |
1 2 3 |
10 20 30 |
من اجل التوضيح اكثر لنأخذ المثال التالي ولنفرض انه لدينا قائمة الاصدقاء والتي فيها العديد من الاصدقاء حيث لو اردنا طباعة كل عنصر في القائمة يعني اسم كل صديق في القائمة سنحتاج الى استخدام الاندكس لكل عنصر بالقائمة وسنحتاج الى كتابة الكود الطويل التالي
1 2 3 4 5 6 7 |
friends = ['Ahmed', 'Ali', 'Sara', 'Khaled', 'Yasser'] print(friends[0]) print(friends[1]) print(friends[2]) print(friends[3]) print(friends[4]) |
1 2 3 4 5 |
Ahmed Ali Sara Khaled Yasser |
في حين بأمكاننا طباعة جميع العناصر في القائمة (جميع اسماء الاصدقاء) بأستخدام for وبكل سهولة من خلال الكود التالي
1 2 3 |
friends = ['Ahmed', 'Ali', 'Sara', 'Khaled', 'Yasser'] for f in friends: print(f) |
1 2 3 4 5 |
Ahmed Ali Sara Khaled Yasser |
تمرين برمجي (2):
لدينا قائمة المساحات التالية
1 |
areas = [14.35, 15.0, 19.0, 12.5, 8.75] |
قم بطباعة كل عنصر داخل القائمة areas بأستخدام for loop
areas = [14.35, 15.0, 19.0, 12.5, 8.75]
# Code the for loop
___ area __ areas:
_____(____)
areas = [14.35, 15.0, 19.0, 12.5, 8.75]
# Code the for loop
for area in areas:
print(area)
Ex().has_equal_ast(exact=False)
success_msg("اجابة صحيحة، احسنت")
استخدام التكرار في النصوص:
ايضا بأمكاننا استخدام النصوص في اللوب وبأمكاننا طباعة كل حرف في النص لانه يتم التعامل مع النصوص على اساس ان كل حرف في النص هو عنصر وايضا بأمكاننا استخدام المثودز والوظائف داخل اللوب ومثال على ذلك نريد طباعة كل حرف في جملة موجودة في متغير اسمه s ونريد في نفس الوقت تحويل الحروف الى كبيرة بأستخدام المثود capitalize
1 2 3 4 |
s = 'hi there' for x in s: print(x.capitalize()) |
1 2 3 4 5 6 7 8 |
H I T H E R E |
طباعة الاندكس والقيمة (enumerate):
بأمكاننا استخدام العديد من الوظائف المفيدة في اللوب وأحد هذه الوظائف هي enumerate والتي تستخدم مع المتغيرات التي تأخذ اكثر من عنصر مثل القوائم والنصوص والخ.. وتعطينا اندكس العنصر وقيمة العنصر كما بأمكاننا ترتيب الناتج وحسب رغبتنا او حسب البرنامج او المشروع الذي نعمل عليه مثال على ذلك
لدينا قائمة فيها مجموعه من اسماء الاصدقاء. سنقوم في الكود التالي بطباعة اسم واندكس كل صديق في المجموعه بأستخدام الوظيفة ()enumerate
1 2 3 4 |
Friends = ['Ahmed', 'Ali', 'Sara', 'Khaled', 'Yasser'] for index , friend in enumerate(Friends): print(index, friend) |
1 2 3 4 5 |
0 Ahmed 1 Ali 2 Sara 3 Khaled 4 Yasser |
وايضاً نستطيع تجميل الناتج وترتيبه اكثر كما في الكود التالي
1 2 |
for index , friend in enumerate(Friends): print('Friend ' + str(index) + ': ' + str(friend)) |
1 2 3 4 5 |
Friend 0: Ahmed Friend 1: Ali Friend 2: Sara Friend 3: Khaled Friend 4: Yasser |
تمرين برمجي (3):
لدينا قائمة المساحات التالية
1 |
areas = [14.35, 15.0, 19.0, 12.5, 8.75] |
قم بأنشاء for loop يستخدم الوظيفة enumerate حيث يقوم بطباعة الاندكس والقيمة لكل عنصر موجود في قائمة المساحات ويطبعها بطريقة مفهومة وسهلة القراءة تشبه المثال السابق ولكن اضف على الاندكس رقم 1 بحيث يبدأ الاندكس من الواحد وليس من الصفر ومثال على ذلك اول عنصر سيتم طباعته سيكون هذا شكله
Room 1: 14.35
areas = [14.35, 15.0, 19.0, 12.5, 8.75]
# Code the for loop
for index, area in ________________:
print('Room ' + ___(_________) + ': ' + ___(_________))
areas = [14.35, 15.0, 19.0, 12.5, 8.75]
# Code the for loop
for index, area in enumerate(areas):
print('Room ' + str(index + 1) + ': ' + str(area))
Ex().has_equal_ast(exact=False)
success_msg("اجابة صحيحة، احسنت")
وظيفة (range):
تستخدم لانشاء رينج معين او باللغة العربية مدى معين من الارقام وتستخدم كثيرا عندما نريد تنفيذ شيء معين لعدد من المرات وأسهل طريقة لتحديد عدد مرات التنفيذ هي بأستخدام الوظيفة ()range وهي بسيطه جدا ومفيدة جدا وممكن ان تأخذ رقم معين وتولد لنا ارقام تبدأ من الصفر او ممكن ان تأخذ مدى معين من رقم الى اخر او ممكن ان تأخذ مدى معين مع قفزات مثلا قفزتين والخ… والمثال التالي يوضح ذلك
مدى من 5 ارقام
1 2 3 |
# 5 numbers start from Zero for i in range(5): print(i) |
1 2 3 4 5 |
0 1 2 3 4 |
مدى يبدأ من الرقم 3 وينتهي بالرقم 8 (الرقم الاخير غير داخل)
1 2 3 |
# From number 3 to number 8 for i in range(3, 8): print(i) |
1 2 3 4 5 |
3 4 5 6 7 |
مدى يبدأ من الرقم 2 وينتهي بالرقم 9 وحجم القفزة رقمين 2
1 2 3 |
# From number 2 to number 9 with 2 steps for i in range(2, 9, 2): print(i) |
1 2 3 4 |
2 4 6 8 |
قائمة عناصرها قوائم:
من المحتمل ان تكون عناصر القائمة التي نتعامل معها عبارة عن قوائم حيث كل قائمة تعتبر عنصر في القائمة الرئيسية ولذلك في هذه الحالة من الممكن طباعة القوائم الموجودة داخل القائمة الرئيسية بأستخدام for كما تعلمنا سابقا وايضا بالامكان طباعة تجزئة القوائم الداخلية للقائمة الرئيسية بأستخدام الاندكس ومثال على ذلك لدينا قائمة اسمها الاصدقاء تحتوي على عدة قوائم داخلية حيث كل قائمة داخلية تحتوي على اسم الصديق وعمره ونريد اولا طباعة كل قائمة داخلية
1 2 3 4 5 |
friends = [ ['Ahmed', 30], ['Ali', 29], ['Sara', 25], ['Khaled',32], ['Nor', 27] ] for f in friends: print(f) |
1 2 3 4 5 |
['Ahmed', 30] ['Ali', 29] ['Sara', 25] ['Khaled', 32] ['Nor', 27] |
وثانيا نريد تجميل الكود وذلك من خلال طباعة الاسم داخل القائمة الداخلية وبجانبه العمر وبشكل مرتب
1 2 |
for f in friends : print("The name is: " + str(f[0]) + " Age: " + str(f[1]) + " Years") |
1 2 3 4 5 |
The name is: Ahmed Age: 30 Years The name is: Ali Age: 29 Years The name is: Sara Age: 25 Years The name is: Khaled Age: 32 Years The name is: Nor Age: 27 Years |
تمرين برمجي (4):
لدينا قائمة المنزل التالية والتي تحتوي على اسم كل جزء من المنزل ومساحته
1 2 3 4 5 |
house = [ ['hallway', 14.35], ['kitchen', 15.0], ['living room', 19.0], ['bedroom', 12.5], ['bathroom', 8.75] ] |
انشئ for loop يقوم بطباعة اسم ومساحة كل جزء من المنزل بطريقة مرتبه تشبه المثال السابق بحيث يكون اول عنصر مطبوع بهذا الشكل
hallway area is 14.35m
house = [ ['hallway', 14.35],
['kitchen', 15.0],
['living room', 19.0],
['bedroom', 12.5],
['bathroom', 8.75] ]
# Code the for loop
for x in _____:
print(___(____) + ' area is ' + ___(____) + 'm')
house = [ ['hallway', 14.35],
['kitchen', 15.0],
['living room', 19.0],
['bedroom', 12.5],
['bathroom', 8.75] ]
# Code the for loop
for x in house:
print(str(x[0]) + ' area is ' + str(x[1]) + 'm')
Ex().has_equal_ast(exact=False)
success_msg("اجابة صحيحة، احسنت")
وظيفة (zip):
تستخدم وظيفة ()zip للدمج بين عناصر قائمتين مما يمكننا من طباعة عناصر هاتين القائمتين معاً ولتوضيحها اكثر لنفترض ان لدينا قائمة تحتوي على اسماء الاصدقاء وقائمة اخرى تحتوي على اعمار الاصدقاء ونريد دمج هذين القائمتين معا وطباعة كل اسم والعمر الذي يقابله في القائمة الاخرى
1 2 3 4 5 |
friends_names = ['Ahmed', 'Ali', 'Sara', 'Khaled', 'Nor'] friends_ages = [30, 29, 25, 32, 27] for name , age in zip(friends_names, friends_ages): print(name, age) |
1 2 3 4 5 |
Ahmed 30 Ali 29 Sara 25 Khaled 32 Nor 27 |
تمرين برمجي (5):
لدينا القائمتين التاليتين حيث تحتوي الاولى على اسماء غرف المنزل وتحتوي الاخرى على مساحة كل غرفه
1 2 |
rooms = ['hallway','kitchen', 'living room', 'bedroom','bathroom'] areas = [14.35, 15.0, 19.0, 12.5, 8.75] |
انشئ for loop يقوم بدمج القائمتين بأستخدام الوظيفه ()zip ثم يطبع اسم كل غرفة ومساحتها بطريقة مرتبه بحيث يكون اول عنصر مطبوع بهذا الشكل
hallway area is 14.35m
rooms = ['hallway','kitchen', 'living room', 'bedroom','bathroom']
areas = [14.35, 15.0, 19.0, 12.5, 8.75]
# Code the for loop
for room, area in ___(_____, _____):
print(___(____) + ' area is ' + ___(____) + 'm')
rooms = ['hallway','kitchen', 'living room', 'bedroom','bathroom']
areas = [14.35, 15.0, 19.0, 12.5, 8.75]
# Code the for loop
for room, area in zip(rooms, areas):
print(str(room) + ' area is ' + str(area) + 'm')
Ex().has_equal_ast(exact=False)
success_msg("اجابة صحيحة، احسنت")
التكرار واللوب في القاموس
لقد تعلمنا سابقا عملية التكرار واللوب في القوائم والنصوص وكذلك الحال في التوبلز فهي مشابهة للقوائم وفي هذا الدرس سنتعلم اللوب في الفهرس. تعلمنا سابقا ان الفهرس تختلف عن جميع الانواع السابقة لانها تحتوي بداخلها على مفاتيح وقيم واذا استخدمنا اللوب العادي في الفهرس سنحصل فقط على المفاتيح بدون القيم كما في الكود التالي
1 2 3 4 |
students = {'Ahmed' : 87, 'Waleed' : 69, 'Hesham' : 92} for name in students: print(name) |
1 2 3 |
Waleed Ahmed Hesham |
ومن اجل الحصول على المفاتيح والقيم يجب ان نستخدم المثود ()items والتي تقوم بتجزئة الدكشنري على شكل مفتاح وقيمة في كل تكرار
1 2 3 4 |
students = {'Ahmed' : 87, 'Waleed' : 69, 'Hesham' : 92} for k , v in students.items(): print(k , v) |
1 2 3 |
Waleed 69 Ahmed 87 Hesham 92 |
تمرين برمجي (6):
لدينا قاموس الدول وعواصمها التالي
1 2 |
countries = {'iraq' : 'baghdad', 'egypt' : 'cairo', 'jordan' : 'amman', 'saudi arabia' : 'riyadh'} |
انشئ for loop الذي يقوم بطباعة اسم كل دولة وعاصمتها بشكل مرتب بحيث يكون اول عنصر مطبوع على الشكل التالي
the capital of iraq is baghdad
countries = {'iraq' : 'baghdad', 'egypt' : 'cairo',
'jordan' : 'amman', 'saudi arabia' : 'riyadh'}
# Iterate over countries
for key, value in _________________:
print('the capital of ' + ________ + ' is ' + __________)
countries = {'iraq' : 'baghdad', 'egypt' : 'cairo',
'jordan' : 'amman', 'saudi arabia' : 'riyadh'}
# Iterate over countries
for key, value in countries.items():
print('the capital of ' + str(key) + ' is ' + str(value))
Ex().has_equal_ast(exact=False)
success_msg("اجابة صحيحة، احسنت")
انشاء قائمة او قاموس بطريقة مختصره:
في بعض المشاريع او البرامج نحتاج الى انشاء قائمة او قاموس بأستخدام اللوب والطريقة التقليدية لإنشاء قائمة بأستخدام for loop هي التالية:
لنفترض اننا نريد انشاء قائمة تحتوي على الارقام من 0 الى 9 وبقفزات قيمتها خطوتين
1 2 3 4 5 6 |
new_list = [] for i in range(0, 9, 2): new_list.append(i) print(new_list) |
1 |
[0, 2, 4, 6, 8] |
في الحقيقة هذه الطريقة صحيحة ولكن بأمكاننا اختصارها واستخدام كود اكثر احترافي حيث بأمكاننا كتابة for loop داخل القائمة نفسها واضافة القيم لهذا القائمة بدون استخدام append والكود التالي يوضح ذلك
1 2 |
new_list = [i for i in range(0, 9, 2)] print(new_list) |
1 |
[0, 2, 4, 6, 8] |
وايضا بأمكاننا التلاعب في القيم مثلاً تربيعها او عمل اي عملية رياضية اخرى عليها كما في الكود التالي
1 2 3 |
# i square new_list = [i**2 for i in range(0, 9, 2)] print(new_list) |
1 |
[0, 4, 16, 36, 64] |
وكذلك الحال مع القواميس حيث بامكاننا انشاء قاموس بطريقة مختصرة ولكن هنا يجب ان نستخدم الاقواس المذنبة { } وايضا يجب ان نستخدم مفتاح وقيمة ليس فقط قيمة كما في القوائم ومثال على ذلك نريد انشاء قاموس يأخذ مفاتيح من 0 الى 10 وبقفزات قيمتها 3 خطوات ويأخذ قيم لهذه المفاتيح هي عبارة عن مربع المفتاح
1 2 |
new_dict = {x : x**2 for x in range(0, 10, 3)} print(new_dict) |
1 |
{0: 0, 3: 9, 6: 36, 9: 81} |
تمرين برمجي (7):
قم بأنشاء قاموس بأستخدام for loop حيث يأخذ مفاتيح من 1 الى 6 ويأخذ قيم عبارة عن المفتاح زائد 100 واخزن هذا القاموس في متغير اسمه plus_dict
# Use for loop to create plus_dict
plus_dict = {_____________________________}
# Print out plus_dict
print(plus_dict)
# Use for loop to create plus_dict
plus_dict = {i : i+100 for i in range(1,6)}
# Print out plus_dict
print(plus_dict)
Ex().has_equal_ast(exact=False)
success_msg("اجابة صحيحة، احسنت")