مقدمة في علوم الحاسوب والبرمجة باستخدام Python › المحاضرة 3: التكرار (Iteration) 5 / 30 السابق التالي

المحاضرة 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) منها.
  • الإدخال (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):

  1. Netflix: ابدأ مشاهدة مسلسل جديد.
  2. هل توجد حلقات أخرى لمشاهدتها؟
    • نعم: شغّل الحلقة التالية، ثم ارجع إلى السؤال نفسه.
    • لا: اقترح 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 حلقات إذا لم تكن منتبهًا.

مخطط التدفق:

  1. توجد 4 حلقات في التسلسل.
  2. إذا بقيت حلقات أخرى في التسلسل: شغّل الحلقة التالية، ثم ارجع لفحص التسلسل.
  3. إذا مررت بجميع الحلقات في التسلسل: يوقف المشاهدة.

الشريحة 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.