المحاضرة 3: شرائح التكرار كاملة
المحاضرة 3: شرائح التكرار (Iteration)
المصادر والنسبة والترخيص
المادة الأصلية: آنا بيل (Ana Bell)، MIT OpenCourseWare (MIT OCW)، معهد ماساتشوستس للتكنولوجيا، مقرر 6.100L: مقدمة في علوم الحاسوب والبرمجة باستخدام Python، خريف 2022 (Fall 2022).
هذه ترجمة وتكييف عربي غير رسمي وفق رخصة CC BY-NC-SA 4.0: النسبة–غير التجاري–المشاركة بالمثل، ولا تعني اعتمادًا أو تأييدًا من MIT أو MIT OCW. شروط الاستخدام والاستشهاد.
منهج الترجمة: لكل صفحة في ملف الشرائح عنوان مستقل ورقم مطابق، بما في ذلك شرائح البناء التدريجي المتكررة. نُقلت المخططات إلى نصوص وجداول تحافظ على تسلسلها وقيمها، ونُقلت التعليقات التوضيحية المرئية في PDF حتى حين لا تظهر في النص المستخرج. الشيفرة وشبه الشيفرة (Pseudocode) محفوظتان بالإنجليزية. لم تُضمَّن صور أو صفحات PDF. صور Nintendo المستثناة من رخصة المصدر محذوفة صراحة في موضعيها.
الشريحة 1: التكرار
التكرار (Iteration).
نزّل الشرائح وملفات .py للمتابعة.
6.100L، المحاضرة 3 — آنا بيل (Ana Bell).
الشريحة 2: مراجعة المحاضرة السابقة
- السلاسل النصية (Strings) تقدم نوع بيانات (Data Type) جديدًا.
- هي تسلسلات من المحارف (Characters)، وأول محرف يقع عند الفهرس (Index)
0. - يمكن فهرستها واقتطاع شرائح (Slices) منها.
- هي تسلسلات من المحارف (Characters)، وأول محرف يقع عند الفهرس (Index)
- الإدخال (Input):
- يتم باستخدام الأمر
input. - كل ما يدخله المستخدم يُقرأ بوصفه كائن سلسلة نصية!
- يتم باستخدام الأمر
- الإخراج (Output):
- يتم باستخدام الأمر
print. - لا تظهر في الصدفة (Shell) إلا الكائنات التي تُطبع في ملف شيفرة
.py.
- يتم باستخدام الأمر
- التفريع (Branching):
- تنفذ البرامج كتل الشيفرة (Code Blocks) عندما تكون الشروط صحيحة.
- في بنية
if-elif-elif…، يُنفَّذ الفرع الخاص بأول شرط قيمتهTrue. - المسافة البادئة (Indentation) مهمة في Python!
الشريحة 3: مراجعة التفريع
الأشكال الأربعة المعروضة:
if <condition>:
< code >
< code >
...
if <condition>:
< code >
< code >
...
else:
< code >
< code >
...
if <condition>:
< code >
< code >
...
elif <condition>:
< code >
< code >
...
elif <condition>:
< code >
< code >
...
if <condition>:
< code >
< code >
...
elif <condition>:
< code >
< code >
...
else:
< code >
< code >
...
- قيمة
<condition>إماTrueأوFalse. - قيّم أول كتلة شرطها المقابل
<condition>يساويTrue.- تبدأ الكتلة بتعليمة
if.
- تبدأ الكتلة بتعليمة
- المسافة البادئة مهمة في Python! تُبرز الشريحة الكلمات المفتاحية والنقطتين
:اللتين تبدآن الكتلة.
الشريحة 4: الغابة الضائعة والتفريع المتداخل
- تخدعك الغابة الضائعة (Lost Woods) في Zelda.
- إذا واصلت الذهاب يمينًا، تبقى عالقًا في الموضع نفسه إلى الأبد.
- للخروج، جازف واذهب في الاتجاه المعاكس.
حذف صريح لمادة طرف ثالث: حُذفت صورة اللعبة المملوكة لـ Nintendo. يذكر المصدر: «© Nintendo. جميع الحقوق محفوظة. هذا المحتوى مستثنى من رخصة المشاع الإبداعي الخاصة بنا». معلومات الاستخدام العادل في MIT OCW.
نص توضيحي مكافئ من المترجم: تخيّل شخصية في ممر بين أشجار. يؤدي اختيار اليمين إلى عرض الممر نفسه مجددًا، بينما يؤدي اختيار اليسار إلى الخروج. تُمثّل الكتل المتداخلة محاولات متتالية، لكن كتابة عدد ثابت منها لا تغطي عددًا غير معلوم من المحاولات.
if <exit right>:
<set background to woods_background>
if <exit right>:
<set background to woods_background>
if <exit right>:
<set background to woods_background>
and so on and on and on...
else:
<set background to exit_background>
else:
<set background to exit_background>
else:
<set background to exit_background>
الشريحة 5: الغابة الضائعة باستخدام حلقة
- تخدعك الغابة الضائعة (Lost Woods) في Zelda.
- إذا واصلت الذهاب يمينًا، تبقى عالقًا في الموضع نفسه إلى الأبد.
- للخروج، جازف واذهب في الاتجاه المعاكس.
حذف صريح لمادة طرف ثالث: حُذفت صورة Nintendo المتكررة. © Nintendo، جميع الحقوق محفوظة؛ الصورة مستثناة من رخصة المشاع الإبداعي للمصدر. معلومات الاستخدام العادل.
نص توضيحي مكافئ من المترجم: يظهر الممر نفسه ما دام المستخدم يختار اليمين. تسأل الحلقة عن الاتجاه من جديد في كل مرة، ثم تعرض مشهد الخروج حين لا يعود الاختيار يمينًا. بخلاف التفريع المتداخل في الشريحة السابقة، لا تتطلب هذه البنية كتابة كل محاولة منفردة.
while <exit_right>:
<set background to woods_background>
<ask user which way to go>
<set background to exit_background>
الشريحة 6: حلقات while
حلقات while (While Loops).
الشريحة 7: مشاهدة كل حلقات مسلسل واحد دفعة واحدة
مخطط التدفق (Flowchart):
- Netflix: ابدأ مشاهدة مسلسل جديد.
- هل توجد حلقات أخرى لمشاهدتها؟
- نعم: شغّل الحلقة التالية، ثم ارجع إلى السؤال نفسه.
- لا: اقترح 3 مسلسلات أخرى مشابهة لهذا المسلسل.
الشريحة 8: تدفق التحكم — حلقات while
while <condition>:
<code>
<code>
...
- يُقيَّم
<condition>إلى قيمة منطقية (Boolean). - إذا كان
<condition>يساويTrue، نفّذ جميع الخطوات داخل كتلة شيفرةwhile. - افحص
<condition>مرة أخرى. - كرر حتى يصبح
<condition>مساويًا لـFalse. - إذا لم يصبح
<condition>مساويًا لـFalseأبدًا، تستمر الحلقة إلى الأبد!!
الشريحة 9: مثال لحلقة while
أنت في الغابة الضائعة. هل تذهب يسارًا أم يمينًا؟ العرض النصي:
You are in the Lost Forest.
************
************
☺
************
************
Go left or right?
مخطط الذاكرة: كان where مرتبطًا بـ "right"، ثم قُطع هذا الارتباط وأصبح مرتبطًا بـ "left".
البرنامج:
where = input("You're in the Lost Forest. Go left or right? ")
while where == "right":
where = input("You're in the Lost Forest. Go left or right? ")
print("You got out of the Lost Forest!")
الشريحة 10: جرّب بنفسك!
ما الذي يُطبع عندما تكتب "RIGHT"؟
where = input("Go left or right? ")
while where == "right":
where = input("Go left or right? ")
print("You got out!")
الشريحة 11: مثال لحلقة while
n = int(input("Enter a non-negative integer: "))
while n > 0:
print('x')
n = n-1
مخطط الذاكرة: يُزال ارتباط n بالقيمة 4، ويُعاد ربطه بالتتابع بالقيم 3، ثم 2، ثم 1، ثم 0.
الشريحة 12: مثال لحلقة while
n = int(input("Enter a non-negative integer: "))
while n > 0:
print('x')
n = n-1
التعليق المرئي في الشريحة يشطب السطر الأخير n = n-1 ويسأل: ماذا يحدث من دون هذا السطر الأخير؟ جرّب ذلك!
للإنهاء:
- اضغط
CTRL-cأوCMD-cفي الصدفة (Shell). - انقر المربع الأحمر في الصدفة.
الشريحة 13: جرّب بنفسك!
شغّل هذه الشيفرة وأوقف الحلقة اللانهائية (Infinite Loop) في بيئة التطوير المتكاملة (IDE) لديك.
while True:
print("noooooo")
الشريحة 14: الفكرة الكبرى
يمكن لحلقات while تكرار الشيفرة داخلها إلى أجل غير مسمّى!
تحتاج أحيانًا إلى تدخلك لإنهاء البرنامج.
الشريحة 15: جرّب بنفسك!
- وسّع هذه الشيفرة لتعرض وجهًا حزينًا عندما يدخل المستخدم حلقة
whileأكثر من مرتين. - تلميح: استخدم متغيرًا بوصفه عدّادًا (Counter).
where = input("Go left or right? ")
while where == "right":
where = input("Go left or right? ")
print("You got out!")
الشريحة 16: تدفق التحكم — حلقات while
مرّ بالتكرار على الأعداد في تسلسل (Sequence).
n = 0
while n < 5:
print(n)
n = n+1
التعليقات التوضيحية في الشريحة:
- اضبط متغير الحلقة (Loop Variable) خارج حلقة
while:n = 0. - اختبر متغير الحلقة في الشرط:
n < 5. - زِد متغير الحلقة داخل حلقة
while:n = n+1. n = n+1مكافئة لـn += 1.
الشريحة 17: نمط شائع
- احسب
4!، أي مضروب (Factorial) العدد 4. iهو متغير الحلقة لدينا.- يتتبع
factorialحاصل الضرب.
x = 4
i = 1
factorial = 1
while i <= x:
factorial *= i
i += 1
print(f'{x} factorial is {factorial}')
التعليقات التوضيحية في الشريحة:
- اضبط متغير الحلقة خارج حلقة
while. - هيّئ حاصل ضرب المضروب بالقيمة
1. - اختبر متغير الحلقة في الشرط.
- احتفظ بحاصل ضرب تراكمي (Running Product):
factorial *= iمكافئة لـfactorial = factorial*i. - زِد متغير الحلقة داخل حلقة
while:i += 1مكافئة لـi = i+1. - رابط Python Tutor (Python Tutor LINK) في الشريحة الأصلية.
الشريحة 18: حلقات for
حلقات for (For Loops).
الشريحة 19: هل ما زلت تشاهد؟
Netflix حين يغلبك النعاس: لا يشغّل سوى 4 حلقات إذا لم تكن منتبهًا.
مخطط التدفق:
- توجد 4 حلقات في التسلسل.
- إذا بقيت حلقات أخرى في التسلسل: شغّل الحلقة التالية، ثم ارجع لفحص التسلسل.
- إذا مررت بجميع الحلقات في التسلسل: يوقف المشاهدة.
الشريحة 20: تدفق التحكم — حلقات while وfor
مرّ بالتكرار على الأعداد في تسلسل.
# very verbose with while loop
n = 0
while n < 5:
print(n)
n = n+1
# shortcut with for loop
for n in range(5):
print(n)
معنى التعليقين: الصياغة مطوّلة جدًا بحلقة while، ومختصرة بحلقة for.
الشريحة 21: بنية حلقات for
for <variable> in <sequence of values>:
<code>
...
- في كل مرور في الحلقة، يأخذ
<variable>قيمة. - في المرة الأولى، يكون
<variable>هو أول قيمة في التسلسل. - في المرة التالية، يحصل
<variable>على القيمة الثانية. - وهكذا، حتى تنفد القيم التي يأخذها
<variable>.
الشريحة 22: تسلسل شائع من القيم
for <variable> in range(<some_num>):
<code>
<code>
...
for n in range(5):
print(n)
التعليق التوضيحي في الشريحة: التسلسل هو 0، ثم 1، ثم 2، ثم 3، ثم 4.
- في كل مرور في الحلقة، يأخذ
<variable>قيمة. - في المرة الأولى، يبدأ
<variable>عند0. - في المرة التالية، يحصل
<variable>على القيمة1. - بعد ذلك، يحصل
<variable>على القيمة2. - …
- وهكذا، حتى يحصل
<variable>علىsome_num -1.
الشريحة 23: تسلسل شائع من القيم
for <variable> in range(<some_num>):
<code>
<code>
...
for n in range(5):
print(n)
مخطط الذاكرة الإضافي: يُقطع ارتباط n بالقيمة السابقة ويُعاد ربطه بالقيم بالترتيب 0، ثم 1، ثم 2، ثم 3، ثم 4.
- في كل مرور في الحلقة، يأخذ
<variable>قيمة. - في المرة الأولى، يبدأ
<variable>عند0. - في المرة التالية، يحصل
<variable>على القيمة1. - بعد ذلك، يحصل
<variable>على القيمة2. - …
- وهكذا، حتى يحصل
<variable>علىsome_num -1.
الشريحة 24: range
- تولّد تسلسلًا من الأعداد الصحيحة (Ints) وفق نمط.
range(start, stop, step):start: أول عدد صحيح يُولَّد.stop: يتحكم في آخر عدد صحيح يُولَّد؛ نصل إلى هذا العدد دون تضمينه.step: تُستخدم لتوليد العدد الصحيح التالي في التسلسل.
- تشبه كثيرًا ما رأيناه في اقتطاع الشرائح (Slicing).
- غالبًا ما نحذف
startوstep.- مثلًا،
for i in range(4)::- القيمة الافتراضية لـ
startهي0. - القيمة الافتراضية لـ
stepهي1.
- القيمة الافتراضية لـ
- مثلًا،
for i in range(3,5)::- القيمة الافتراضية لـ
stepهي1.
- القيمة الافتراضية لـ
- مثلًا،
الشريحة 25: جرّب بنفسك!
ماذا تطبع هذه المقاطع؟
for i in range(1,4,1):
print(i)
for j in range(1,4,2):
print(j*2)
for me in range(4,0,-1):
print("$"*me)
الشريحة 26: المجموع التراكمي
mysumمتغير لتخزين المجموع التراكمي (Running Sum).- تجعل
range(10)قيمةiتساوي0، ثم1، ثم2، ثم … ثم9.
mysum = 0
for i in range(10):
mysum += i
print(mysum)
| الاسم في مخطط الذاكرة | القيمة المرتبط بها |
|---|---|
i |
0 |
mysum |
0 |
الشريحة 27: المجموع التراكمي
mysumمتغير لتخزين المجموع التراكمي (Running Sum).- تجعل
range(10)قيمةiتساوي0، ثم1، ثم2، ثم … ثم9.
mysum = 0
for i in range(10):
mysum += i
print(mysum)
| الاسم في مخطط الذاكرة | القيم المعروضة | الارتباط الحالي |
|---|---|---|
i |
0، 1 |
1 |
mysum |
0، 1 |
1 |
الشريحة 28: المجموع التراكمي
mysumمتغير لتخزين المجموع التراكمي (Running Sum).- تجعل
range(10)قيمةiتساوي0، ثم1، ثم2، ثم … ثم9.
mysum = 0
for i in range(10):
mysum += i
print(mysum)
| الاسم في مخطط الذاكرة | القيم المعروضة | الارتباط الحالي |
|---|---|---|
i |
0، 1، 2 |
2 |
mysum |
1، 3 |
3 |
الشريحة 29: المجموع التراكمي
mysumمتغير لتخزين المجموع التراكمي (Running Sum).- تجعل
range(10)قيمةiتساوي0، ثم1، ثم2، ثم … ثم9.
mysum = 0
for i in range(10):
mysum += i
print(mysum)
| الاسم في مخطط الذاكرة | القيم المعروضة | الارتباط الحالي |
|---|---|---|
i |
0، 1، 2، 3 |
3 |
mysum |
3، 6 |
6 |
الشريحة 30: المجموع التراكمي
mysumمتغير لتخزين المجموع التراكمي (Running Sum).- تجعل
range(10)قيمةiتساوي0، ثم1، ثم2، ثم … ثم9.
mysum = 0
for i in range(10):
mysum += i
print(mysum)
| الاسم في مخطط الذاكرة | القيم المعروضة | الارتباط الحالي |
|---|---|---|
i |
0، 1، 2، 3، …، 9 |
9 |
mysum |
36، 45 |
45 |
الشريحة 31: جرّب بنفسك!
- أصلح هذه الشيفرة لتستخدم المتغيرين
startوendفي النطاق، وتحصل على مجموع القيم بينهما بما يشمل الطرفين. - مثلًا، إذا كان
start=3وend=5، فينبغي أن يكون المجموع12.
mysum = 0
start = ??
end = ??
for i in range(start, end):
mysum += i
print(mysum)
الشريحة 32: حلقات for وrange
حساب المضروب باستخدام حلقة while، وقد رأيناه بالفعل، وباستخدام حلقة for.
x = 4
i = 1
factorial = 1
while i <= x:
factorial *= i
i += 1
print(f'{x} factorial is {factorial}’)
x = 4
factorial = 1
for i in range(1, x+1, 1):
factorial *= i
print(f'{x} factorial is {factorial}')
ملاحظة المترجم: حُفظت علامة الاقتباس المنحنية ’ في نهاية سلسلة المثال الأول كما تظهر في الشريحة الأصلية؛ ليست علامة إغلاق صحيحة في Python. يستخدم ملف الشيفرة الأصلي علامة اقتباس مستقيمة، كما في النسخة الحرفية المرفقة بصفحة التمارين.
الشريحة 33: الفكرة الكبرى
لا تتكرر حلقات for إلا بقدر طول التسلسل.
يأخذ متغير الحلقة هذه القيم بالترتيب.
الشريحة 34: ملخص
- آليات التكرار (Looping Mechanisms):
- حلقات
whileوfor. - تناولنا الكثير من قواعد الصياغة (Syntax) اليوم؛ احرص على الكثير من التدريب!
- حلقات
- حلقات
while:- تتكرر ما دام الشرط صحيحًا.
- يجب التأكد من عدم الدخول في حلقة لانهائية.
- حلقات
for:- يمكنها المرور على نطاقات من الأعداد.
- يمكنها المرور على عناصر سلسلة نصية.
- سنرى قريبًا أشياء أخرى كثيرة يسهل المرور عليها بالتكرار.
الشريحة 35: بيانات MIT OpenCourseWare
MIT OpenCourseWare — https://ocw.mit.edu
6.100L: مقدمة في علوم الحاسوب والبرمجة باستخدام Python.
خريف 2022.
للحصول على معلومات عن الاستشهاد بهذه المواد أو شروط استخدامها، تفضل بزيارة https://ocw.mit.edu/terms.