فهم البرمجة في بايثون

فهم البرمجة في بايثون

يمكن أن يكون فهم البرمجة أمرًا صعبًا لأن البرمجة موضوع مجرّد. إلا أنه ليس كذلك. يعتمد كل شيء في البرمجة على إجراءات ملموسة تحدث داخل جهاز الكمبيوتر الخاص بك. في الواقع، كل شيء يعود في النهاية إلى العمليات الفيزيائية التي تحدث في الإلكترونيات داخل الكمبيوتر.

كل هذا يبدو جيدًا من الناحية النظرية، لكن هل تحتاج إلى فهم الفيزياء والإلكترونيات لما يحدث في الكمبيوتر لكتابة برامج الكمبيوتر؟ لا لا على الإطلاق. بيت القصيد من لغات البرمجة، وخاصة اللغات عالية المستوى مثل Python، هو أنه يمكنك التواصل مع الكمبيوتر باستخدام لغة مشتركة – لغة تفهمها أنت والكمبيوتر. هذا جيد. ولكنه أيضًا يغيّر البرمجة بشكل أكبر نحو النهاية المجرّدة.

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

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

تشبيه بيئة البرمجة: الغرفة البيضاء

تخيل غرفة متوسطة الحجم فارغة. الجدران بيضاء. الأرضية والسقف أبيضان أيضًا. تمثّل الغرفة البيضاء المكان الذي سيتم فيه تشغيل برنامج الكمبيوتر الخاص بك. ستلتقي ببرنامج الكمبيوتر قريبًا. ستكون أي موارد يحتاجها برنامج الكمبيوتر لأداء المهام موجودة في هذه الغرفة البيضاء.

عند إنشاء ملف Python جديد وفارغ في المحرر الخاص بك، فأنت تقوم بإنشاء غرفة بيضاء جاهزة لاستضافة برنامج الكمبيوتر.

فهم البرمجة في بايثون
فهم البرمجة مع الغرفة البيضاء

تشبيه البرنامج: شخص اسمه مونتي

الغرفة البيضاء هي البيئة التي سيعمل فيها برنامج الكمبيوتر. إنه برنامج الكمبيوتر الذي سيحتاج إلى القيام بالعمل الشاق! دعونا نعطي برنامج الكمبيوتر وجهًا واسمًا حتى تتمكن من تصور ما يحدث في هذا التشبيه بشكل أفضل.

قابل مونتي، برنامج الكمبيوتر. نعم، هذه إشارة إلى المسلسل التلفزيوني الذي استخدمه مبتكر بايثون Guido van Rossum كمصدر إلهام لاسم اللغة. إذا كنت من محبي Monty Python، فيمكنك استخدام Python المفضلة لديك من السلسلة لتصور Monty!

يبدأ Monty في العمل عندما تقوم بتشغيل برنامج Python، ويكون جاهزًا لتنفيذ الإجراءات التي تطلب منه القيام بها من خلال التعليمات البرمجية الخاصة بك.

أرفف على الحائط

عندما تقوم بإنشاء غرفة بيضاء جديدة عن طريق إنشاء ملف بايثون Python جديد، فإن الغرفة البيضاء ليست فارغة تمامًا. على أحد الجدران الأربعة، توجد عدة أرفف يمكن لمونتي أن يخزن عليها الأشياء التي سيحتاجها وهو يشق طريقه خلال المهام التي يحتاج إلى أداؤها.

هناك أيضًا شيء آخر متاح دائمًا في الغرفة البيضاء، حتى قبل أن تكتب سطرًا واحدًا من التعليمات البرمجية. على الرف السفلي، يوجد كتيّب أحمر رفيع بعنوان “مضمّن” أو مدمج. يحتوي هذا الكتيّب على معلومات حول أجزاء من لغة بايثون يمكن لمونتي استخدامها على الفور. وهي تتضمن وظائف مثل print () وinput ()، وقيمًا مثل True وFalse والمزيد.

إذا كان عليك وضع مونتي في غرفة فارغة تمامًا، فلن يكون لديه موارد للبدء بها، ولن يكون قادرًا على إنجاز أي شيء.

دعنا نرى ما يحدث عند إنشاء ملف .py جديد وتشغيل الكود التالي:

print
say_hello

عند تشغيل هذا البرنامج النصي، ينطلق مونتي في العمل. في السطر الأول، تطلب منه البحث عن الاسم print. المكان الوحيد الذي يبحث فيه هو الشيء الوحيد الموجود في الغرفة البيضاء في الوقت الحالي: الكتيّب الصغير على الرف السفلي. يجد مونتي الكلمة مطبوعة هناك ويمنحك إبهامًا لأعلى. أنت لا تطلب منه فعل أي شيء بمجرد أن يجد هذا الاسم، حيث لا توجد أقواس بعد الطباعة في السطر 1.

ثم ينتقل مونتي لقراءة السطر الثاني من التعليمات البرمجية. تريده أن يجد الاسم say_hello. ينظر في الكتيب، لكنه لا يرى هذا الاسم. ينظر في جميع أنحاء الغرفة، لكن لا يوجد شيء آخر. يخبرك مونتي بما يلي:

Traceback (most recent call last):
  File "<path>/<filename>.py", line 2, in <module>
    say_hello
NameError: name 'say_hello' is not defined

لا يمكن لمونتي العثور على اسم say_hello في أي مكان في الغرفة البيضاء. إنه لا يعرف ماذا يفعل فيشكو لك أنه لا يستطيع الاستمرار في العمل!

كتب من المكتبة

لا توجد صفحات كثيرة في الكتيب الصغير الموجود في كل غرفة بيضاء. ومع ذلك، فإن لغة بايثون غنية جدًا. في مكان آخر، خارج الغرفة البيضاء، توجد مكتبة شاسعة. أحب أن أتخيل إحدى قاعات المكتبات الكبيرة جدًا ذات الأسقف العالية والكتب التي تغطي جميع الجدران من الأرض إلى السقف. كل كتاب عبارة عن وحدة نمطية Module تحتوي على معلومات حول موضوع معين تستخدمه بايثون من أجله.

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

import random

print(random.randint(1, 5))

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

يمكن لمونتي الآن الانتقال إلى السطر التالي من التعليمات البرمجية. سيبحث عن print التي سيجدها في الكتيّب المدمج. أنت تطلب منه الآن أن يفعل أي شيء من المفترض أن تقوم به print، والذي يمكنه قراءته في الكتيب.

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

تشير النقطة . بعد كلمة random إلى مونتي لفتح الكتاب والبحث عن اسم randint داخل الكتاب random. عندما يجد مونتي هذا الاسم، سيعرف ماذا يفعل!

صناديق لتخزين الأشياء

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

say_hello = "Hello. Hope you're doing well today!"

print(say_hello)

تطلب المهمة في السطر 1 من مونتي إحضار صندوق فارغ ولصق ملصق على الجزء الخارجي من الصندوق يحمل الاسم say_hello. سيقوم بعد ذلك بإنشاء سلسلة string بالأحرف الموضحة وتخزين هذه البيانات في الصندوق. سيضع مونتي بعد ذلك الصندوق المسمى say_hello على أحد الأرفف في الغرفة البيضاء.

عندما يقرأ مونتي الاسم say_hello في السطر 3، سينظر حول الغرفة ويجد صندوقًا يسمى say_hello. سينظر داخل الصندوق ويخرج محتوياته، وهي في هذه الحالة السلسلة string.

دعونا نلقي نظرة على نسخة معدّلة من الشفرة:

say_hello = "Hello. Hope you're doing well today!"

print(say_hello)

say_hello = 42

في السطر الأخير، طلبت من مونتي مرة أخرى إحضار صندوق ووضع علامة عليه say_hello، ولكن لا يمكنك استخدام نفس الاسم مرتين في أي مكان في الغرفة البيضاء. سيتخلص مونتي أولاً من محتويات الصندوق المسمى say_hello ثم يضع العدد الصحيح 42 في الصندوق. اختفت السلسلة الأصلية حيث لم تعد مخزّنة في أي مكان. صندوق القمامة في الغرفة البيضاء هو صندوق خاص يتم إفراغه بسرعة كبيرة، لذلك تختفي المعلومات إلى الأبد من الغرفة البيضاء!

دعونا نضيف بضعة سطور أخرى:

say_hello = "Hello. Hope you're doing well today!"
say_hello = 42

meaning_of_life = say_hello

print(meaning_of_life)
print(say_hello)

لدى مونتي الآن سطر يطلب منه تسمية صندوق يحمل الاسم meaning_of_life. أنا “أمزج الاستعارات” هنا بينما أنتقل من Monty Python إلى The Hitchhiker’s Guide to the Galaxy، لكنك ستغفر لي على هذا! يجب أن يتم وضع هذه التسمية على الشيء المسمى say_hello، وهو في حد ذاته صندوق تخزين. لذا وضع مونتي تسمية ثانية على الصندوق، وهذا الصندوق يحتوي الآن على تسميتين.

بغض النظر عن الملصق الذي تستخدمه لاحقًا في البرنامج، سيحضر مونتي الصندوق نفسه ويخرج محتوياته. سيعرض كلا السطرين باستخدام دالة print () العدد 42.

بعد ذلك، دعنا نوسّع هذا القياس ليشمل تعريف الدوال.

غرفة الدالة

الدالة Function هي وحدة من التعليمات البرمجية قائمة بذاتها تقوم بإجراء معين. في الواقع، الدالة عبارة عن برنامج صغير، لا يختلف كثيرًا عن البرنامج الكامل. لهذا السبب، يمكنك التفكير في الدالة كغرفة أخرى، على غرار الغرفة البيضاء. سأسمي هذه غرفة الدالة Function Room.

دعنا نرى ما يحدث عندما تقوم بتعريف (إنشاء) دالة:

def do_clever_things():
    stuff = 10
    print(stuff)

print(stuff)

عندما تُنشء، فإنك تنشئ غرفة دالة جديدة مجاورة للغرفة البيضاء. هناك باب يؤدي إلى غرفة الدالة، والملصق على الباب يقول do_clever_stuff. هذا هو اسم الدالة.

كل ما يحدث داخل تعريف الدالة يحدث في غرفة الدالة وليس في الغرفة البيضاء. يتم وضع الصندوق المسمى stuff مع العدد الصحيح 10 المخزن بداخله على الرفوف في غرفة الدالة. عندما يتم استدعاء دالة print () داخل غرفة الدالة، فلا توجد مشاكل حيث سيجد مونتي صندوقًا باسم stuff.

المتغيرات داخل الدالة

ومع ذلك، عند استخدام الاسم stuff في الغرفة البيضاء، التي تمثل البرنامج الرئيسي، لا يمكن لمونتي العثور على أي إشارة إلى هذا الاسم في أي مكان في الغرفة البيضاء. وماذا يفعل مونتي عندما لا يجد اسمًا؟ يشكو:

Traceback (most recent call last):
  File "<path>/<filename>.py", line 5, in <module>
    print(stuff)
NameError: name 'stuff' is not defined

يشير هذا الخطأ إلى السطر 5، السطر الأخير في دالة print () في البرنامج الرئيسي. الصندوق المسمى stuff موجود في غرفة الدالة ولكن ليس في الغرفة البيضاء. بعد ذلك، يمكنك استدعاء الدالة من البرنامج الرئيسي:

def do_clever_things():
    stuff = 10
    print(stuff)

do_clever_things()
    stuff = 10
    print(stuff)
 

في السطر الأخير، يقرأ مونتي الاسم do_clever_things. عندما ينظر في الغرفة البيضاء، سيجد هذا الاسم كعلامة على باب يؤدي إلى غرفة أخرى. يعرّف مونتي هذا على أنه اسم الدالة. عندما يقرأ مونتي الأقواس بعد الاسم، فإنه يعرف أن يشق طريقه عبر الباب المسمى do_clever_things ويدخل غرفة الدالة لأداء الإجراءات المطلوبة في تلك الغرفة. عندما ينتهي من جميع خطوات الدالة، سيعود مونتي إلى الغرفة البيضاء، وسيغلق الباب المؤدي إلى غرفة الدالة خلفه.

دعنا نذهب إلى أبعد من ذلك مع هذا القياس:

def do_clever_things():
    stuff = 10
    stuff = stuff * 2

    return stuff

do_clever_things()
print(stuff)

لقد جعلت الدالة تؤدي بعض العمليات الحسابية شديدة التعقيد (!) ثم استخدمت تعليمة الإرجاع return في الدالة. عندما يجد مونتي return في إحدى الدوال، سيأخذ بعض المعلومات معه عندما يعود إلى الغرفة البيضاء.

ومع ذلك، لا يأخذ مونتي الصندوق المسمى stuff من غرفة الدالة إلى الغرفة البيضاء. بدلاً من ذلك، يأخذ محتويات الصندوق معه فقط. هذا فرق دقيق ولكنه مهم. دعونا نرى لماذا.

عند تشغيل الشفرة أعلاه، ستتلقى شكوى مونتي المألوفة الآن:

Traceback (most recent call last):
  File "<path>/<filename>.py", line 8, in <module>
    print(stuff)
NameError: name 'stuff' is not defined

تعريف المتغيرات في الغرفة البيضاء

ما زال مونتي غير قادر على العثور على أي شيء يحمل الاسم stuff في الغرفة البيضاء. عندما عاد مونتي من غرفة الدالة do_clever_things، أحضر معه العدد الصحيح 20، وهو القيمة المخزنة في الصندوق المسمى stuff في غرفة الدالة. ومع ذلك، لم يكن مونتي يعرف ماذا يفعل بالعدد 20 عندما عاد إلى الغرفة البيضاء. لذلك، ألقى به في سلة المهملات لتحرير يديه للمهمة التالية. دعونا نصلح هذا:

def do_clever_things():
    stuff = 10
    stuff = stuff * 2

    return stuff

stuff = do_clever_things()
print(stuff)

عندما يعود مونتي إلى الغرفة البيضاء بعد إكمال جميع المهام في غرفة الدالة، يُطلب منه الآن القيام بما يلي:

  • احصل على صندوق فارغ جديد
  • قم بتسميته باستخدام اسم stuff
  • قم بتخزين أي معلومات أحضرتها معك من غرفة الدالة في الصندوق

يضع مونتي الآن هذا الصندوق الجديد الذي يحمل اسم stuff على أرفف الغرفة البيضاء. لذلك، هناك صندوقان باسم stuff، لكنهما في غرف مختلفة. في الواقع، الصندوق الذي تم إنشاؤه في الغرفة البيضاء لجمع كل ما يعود من الدالة يمكن أن يحمل أي اسم:

def do_clever_things():
    stuff = 10
    stuff = stuff * 2

    return stuff

some_number = do_clever_things()
print(some_number)

مهمتك الأخيرة هي إضافة معلمات في تعريفات الدوال، وسترى ما يفعله مونتي بالمعلمات والوسيطات في استدعاء الدالة:

def do_clever_things(first_thing, second_thing):
    final_thing = first_thing + second_thing - 0.1  # Some clever arithmetic!

    return final_thing

some_number = do_clever_things(3.5, 5.2)
print(some_number)

كما هو من قبل، أنت تنشئ غرفة دالة مع باب يؤدي من الغرفة البيضاء إلى غرفة الدالة المسمى do_clever_things. ومع ذلك، يوجد داخل باب غرفة الدالة صندوقان فارغان مكتوب عليهما “الشيء الأول” first_thing والشيء الثاني second_thing. هذه الصناديق جاهزة ليستخدمها مونتي عندما يدخل غرفة الدالة.

في استدعاء الدالة، عندما يقرأ مونتي العبارة: do_clever_things(3.5, 5.2)، سيشق طريقه إلى غرفة الدالة، وسيحمل معه عددين، 3.5 و5.2. وبمجرد دخول مونتي إلى غرفة الدالة، سيجد الصندوقين الفارغين. سيضع مونتي بعد ذلك العدد الأول الذي لديه في الصندوق الأول المسمى first_thing. سيضع بعد ذلك العدد الثاني في الصندوق الثاني بالاسم second_thing. أخيرًا، سيأخذ مونتي هذه الصناديق على أرفف غرفة الدالة، ويمكنه البدء في فعل كل ما هو مطلوب في الدالة.

مدينة بايثون

يمكنك التوقف هنا إذا كنت تريد. الهدف الرئيسي من تشبيه الغرفة البيضاء هو فهم ما تمت مناقشته أعلاه. ولكن إذا كنت لا تريد أن يتوقف التشبيه هنا وترغب في الحصول على بعض المواد الإضافية، فتابع القراءة.

لقد رأيت بالفعل أنه يمكنك إنشاء الغرفة البيضاء White Room عند فتح ملف بايثون Python جديد وأن هذه الغرفة قد تحتوي على واحدة أو أكثر من غرف الدوال المجاورة. ومع ذلك، فقد رأيت بالفعل أن هناك المزيد في الخارج. عندما استخدمت بيان الاستيراد import، غادر مونتي الغرفة البيضاء وذهب في نزهة للعثور على المكتبة. تقع المكتبة في وسط مدينة بايثون Python City.

استيراد الوحدات النمطية

لقد نظرت إلى مثال استيراد الوحدة النمطية random واستخدام دالة randint (). عندما يقرأ مونتي السطر random.randint(1, 5)، سيجد الكتاب المسمى random على الرف ، وسيفتح الكتاب للبحث عن الاسم randint.

الآن، randint هي دالة. لقد رأيت كيف يتم تمثيل ذلك من خلال غرفة الدوال في التشبيه لدينا. ومع ذلك، فهذه ليست دالة قمت بتعريفها بنفسك، لذا فهي ليست مجاورة للغرفة البيضاء. ما يجده مونتي في الكتاب random بجوار إدخال randint هو الاتجاهات الخاصة بغرفة دالة randint في مكان آخر في مدينة بايثون. لذلك سيأخذ مونتي العددين الصحيحين 1 و5 بين يديه، وسيغادر الغرفة البيضاء للذهاب في نزهة في مدينة بايثون.

هذه المرة لم يتجه إلى المكتبة ولكن إلى غرفة الدالة التي تسمى randint. توجد منطقة في مدينة بايثون بها العديد من غرف الدوال المستقلة القريبة من بعضها البعض والتي تنتمي جميعها إلى random. سيجد مونتي غرفة الدالة randint. سيدخل الغرفة ويأخذ الأعداد التي يحملها معه.

سيفعل مونتي شيئًا ما في غرفة الدالة تلك. لست بحاجة إلى معرفة تفاصيل ما يفعله هناك! ما تحتاج إلى معرفته هو أنه عندما يعود مونتي من غرفة دالة randint، سيحمل معه عددًا آخر في يده. سيكون هذا عددًا عشوائيًا بين 1 و5.

سيعود مونتي بعد ذلك إلى الغرفة البيضاء، وسيأخذ هذا العدد معه.

يوجد في مدينة بايثون Python City الكثير من المناطق، كل منها يحتوي على غرف دالة تنتمي إلى وحدات نمطية معيّنة. كما يمكنك التخمين، فإن مدينة بايثون Python City واسعة النطاق وتتزايد باستمرار!

خلاصة فهم البرمجة

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

لننتهي بملخص سريع لتشبيه الغرفة البيضاء:

  • الغرفة البيضاء هي البيئة التي سيتم فيها تشغيل البرنامج. مونتي هو الاسم الذي أعطيه لبرنامج الكمبيوتر.
  • عندما تنشئ ملف بايثون Python جديدًا، فإنك تنشئ غرفة بيضاء جديدة فارغة.
  • تحتوي الغرفة البيضاء على عدة أرفف، وهي ليست فارغة تمامًا في البداية. يحتوي كتيب صغير يسمى “الكتيّب المدمج” على جميع الكلمات التي يمكنك استخدامها في لغة بايثون خارج الصندوق.
  • عند استخدام الاستيراد import، فإنك ترسل مونتي إلى المكتبة لجلب الكتاب بهذا الاسم. يعيد الكتاب إلى الغرفة البيضاء ويضعه على الرف.
  • عندما تقوم بإنشاء متغير، كما هو الحال مع استخدام علامة =، يجلب مونتي صندوقًا فارغًا، ويسميه باستخدام اسم المتغير، ويخزن المعلومات داخل الصندوق.
  • الدالة عبارة عن برنامج صغير ويتم تمثيله بغرفته الخاصة، غرفة الدالة. عندما تعرّف دالة، فإنك تنشئ غرفة دالة مجاورة للغرفة البيضاء. الملصق الموجود على باب غرفة الدالة هو اسم الدالة.
  • عندما تستدعي إحدى الدوال، يذهب مونتي إلى غرفة الدالة، ويؤدي المهام التي تحتاجها الدالة، ثم يعود إلى الغرفة البيضاء.
  • إذا كانت هناك وسيطات إدخال عند استدعاء الدالة، فسيأخذ مونتي هذه المعلومات معه إلى غرفة الدالة. سيخزّن البيانات في الصناديق الفارغة عند مدخل غرفة الدالة. يتم تسمية هذه الصناديق بأسماء معلّمات الدالة.
  • إذا كان هناك بيان إرجاع return في الدالة، فسيأخذ مونتي تلك البيانات مرة أخرى إلى الغرفة البيضاء عندما ينهي جميع المهام المطلوبة في الدالة. إذا لم يكن هناك بيان إرجاع، فلن يرد مونتي شيئًا، أو لا شيء None.
  • الغرفة البيضاء هي جزء من مدينة بايثون التي تحتوي على نظام بايثون البيئي بأكمله.

أثناء كتابتك لبرنامج بايثون Python التالي، يمكنك التفكير في الغرفة البيضاء التي تنشئها والكتب والصناديق وغرف الدوال ومونتي، الذي ينشغل بالعمل الجاد، وينتقل من غرفة إلى أخرى. أنت الآن قريب من فهم وتعلم البرمجة.

المصدر

  • كتاب البرمجة بلغة بايثون، تأليف: ستيفن جروبيتا. لندن، المملكة المتحدة. دكتوراه في الفيزياء من جامعة إمبريال كوليدج بلندن. بكالوريوس (مع مرتبة الشرف) من الدرجة الأولى في الفيزياء والرياضيات من جامعة مالطا.
  • موسوعة أساسيات البرمجة بلغة بايثون، ترجمة: د.م. مصطفى عبيد، مركز البحوث والدراسات متعدد التخصصات.