أساسيات البرمجة – تعلم البرمجة بلغة بايثون

كيف تتعلم البرمجة

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

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

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

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

لماذا لغة برمجة بايثون؟

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

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

فوائد تعلم البرمجة في بايثون

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

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

المحتويات

كيفية استخدام هذا الكتاب لتعلم البرمجة

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

أساسيات البرمجة

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

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

ستستمر الفصول من 2 إلى 4 في البناء على أساسيات الترميز، ويركز الفصل الخامس على التعامل مع الأخطاء والثغرات عند البرمجة.

البرمجة الكمية

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

البرمجة الشيئية والمزيد من الوظائف

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

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

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

التدريب على الأمثلة

يتم تقديم جميع مفاهيم البرمجة من خلال الأمثلة. بعضها برامج قصيرة، والبعض الآخر مشاريع أطول قليلاً.

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

كلما زاد عدد الأخطاء التي ترتكبها، كان ذلك أفضل!

تنزيل بايثون Python و IDE

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

تحميل وتثبيت بايثون

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

لديك الآن بايثون Python مثبتًا على جهاز الكمبيوتر الخاص بك. لكن كيف يمكنك استخدامه؟ هذا هو الجزء الذي يمكن أن يكون مربكًا نظرًا لوجود الكثير من الخيارات المتاحة. لا يوجد خيار أفضل هنا. هناك العديد من الخيارات لأنها تعتمد على التفضيل وجزئيًا على ما تريد استخدام الترميز من أجله.

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

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

تحميل وتثبيت PyCharm

إذا كنت قد أجريت البحث بالفعل ولديك برنامج  مفضل، فابدأ واستخدمه. يمكنك اتباع توصيتي إذا لم يكن لديك تفضيل حتى الآن وتفضل قضاء وقتك في تعلم كيفية البرمجة بدلاً من البحث في IDEs: استخدم PyCharm Community Edition. يمكنك تنزيل PyCharm من هنا. اختر إصدار المجتمع المجاني وليس الإصدار الاحترافي. الإصدار الاحترافي ليس مجانيًا، ولن تحتاج إلى أي ميزات إضافية يقدمها في الوقت الحالي. مرة أخرى، الخيار الأسهل هو مواكبة الخيارات الافتراضية أثناء التثبيت.

فتح ملف Python الأول

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

بمجرد دخولك في المشروع، اختر New… من قائمة File ثم اختر Python File من القائمة المنبثقة (وليس الخيار الذي يقول فقط File). قد تتساءل عن سبب تصميم IDE مثل PyCharm للترميز في Python، كما تظهر البادئة Py- في اسمها، تمنحك أيضًا خيارات لأنواع الملفات الأخرى. والسبب في وجود حرف I في الاختصار IDE، والتي تعني Integrated أو متكامل. يسمح لك هؤلاء المحررون بالعمل على جميع الملفات التي ستحتاجها في المشروع. في الوقت الحالي، ستكون هذه كلها ملفات Python، لكنك ستحتاج إلى أنواع ملفات أخرى في مشروعك في المستقبل.

بمجرد إنشاء ملف Python جديد – لاحظ أن ملفات Python سيكون لها الامتداد .py – يجب أن يكون لديك شاشة فارغة أمامك. أنت جاهز للبدء في تعلم البرمجة.

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

الشروع في البرمجة: مشروع البرمجة الأول

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

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

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

ما هي البرمجة ولماذا نحتاجها؟

أنت في المنزل في وقت متأخر من بعد ظهر أحد الأيام وتتصل بك زوجتك:

Dinner will be ready in 20 minutes. Can you get the tomatoes ready, please?

سيكون العشاء جاهزًا في غضون 20 دقيقة. هل يمكنك تجهيز الطماطم من فضلك؟

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

تخيل الآن أن زوجتك قد اتصلت بالعبارة التالية المشابهة جدًا:

Dinner will be ready in 20 minutes. Can you get the children ready, please?

سيكون العشاء جاهزًا في غضون 20 دقيقة. هل يمكنك تجهيز الأطفال من فضلك؟

هنا، من الأفضل عدم شطف الأطفال تحت الحوض أو رشهم بالملح والفلفل. ربما ستتأكد من تنظيفهم وغسل أيديهم، على سبيل المثال.

نحويًا، الجمل أعلاه متطابقة. كل ما فعلناه هو استبدال اسم الجمع “طماطم” مع اسم جمع آخر “الأطفال”. يعتمد البشر على السياق عند التواصل مع البشر الآخرين. تخبرنا خبراتنا أن تحضير الطماطم مهمة مختلفة تمامًا عن تحضير الأطفال. لا تستطيع أجهزة الكمبيوتر القيام بذلك.

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

مثال تطبيقي

دعونا نلقي نظرة على مثال آخر. اقرأ العبارة التالية:

say Happy Birthday

قل عيد ميلاد سعيد

والآن ضع في اعتبارك ما يلي:

my name is Stephen

say my name

  • اسمي ستيفن
  • قل اسمي

هذه العبارات البسيطة يسهل علينا نحن البشر فهمها والاستجابة لها. جانبان مهمان يجعلان هذا ممكنا.

أولاً، نتعرف على كلمة “قل” على أنها الأمر المطلوب منا القيام به. ثانيًا، كما رأيتم أعلاه، نحن نفهم سياق العبارة، وهذا هو سبب تفاعلنا بشكل مختلف مع العبارتين.

في المقطع الأول، قمنا بفصل الكلمات الثلاث في الفعل والمعلومات التي يُطلب منا قولها: عيد ميلاد سعيد.

الدالة المضمنة print

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

فكر في الدالة كمكافئ للفعل. إنه يمثل إجراء يجب القيام به. السياق ليس كافيًا، كما هو الحال بالنسبة لنا نحن البشر، نقول عيد ميلاد سعيد.

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

في Python، يمكنك تمثيل العبارة الأولى أعلاه بسطر الكود:

print("Happy Birthday")

يمكنك كتابة الزوج الثاني من العبارات على النحو التالي:

my_name = "Stephen"
print(my_name)

تُخبر علامات التنصيص “” الكمبيوتر أن كل ما بداخلها هو مجرد سلسلة من الأحرف ليس لها معنى للكمبيوتر ولكن سيتمكن الإنسان من فهمها. نسمي هذا النوع من المعلومات في البرمجة باسم السلسلة String، وهي اختصار لسلسلة من الأحرف.

في المثال الثاني، تطلب أولاً من بايثون Python إنشاء شيء أسمته my_name وتخزين السلسلة “Stephen” بداخلها. بعد ذلك، تطلب من الكمبيوتر طباعة كل ما يتم تخزينه في my_name. صندوق التخزين هذا الذي سميته my_name هو ما يشار إليه بالمتغير في بايثون Python. ستجد المزيد حول تخصيص البيانات لأسماء المتغيرات في الأقسام التالية.

سيستجيب بايثون Python بطريقة مختلفة لطباعة (my_name) مقارنة بطباعة (“my_name”).

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

تشغيل برنامج بايثون Python الأول الخاص بك

هناك العديد من الطرق لتشغيل برنامج بايثون. إذا كنت قد قمت بالفعل بتشغيل برامج Python من قبل، فيمكنك الانتقال مباشرة إلى القسم التالي.

في البداية، قمت بتنزيل وتثبيت PyCharm Community Edition ، وهو بيئة التطوير IDE الذي أوصي به، ما لم يكن لديك بالفعل برنامج آخر مفضل.

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

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

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

مشروعك الأول: The Angry Goblin Hunt

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

حان الوقت لبدء العمل على برنامج بايثون Python الأول المناسب لك: لعبة Angry Goblin Hunt. في هذا المشروع، ستتعرف على بعض المفاهيم والأدوات الأساسية في البرمجة وكيفية تجميع الأشياء معًا لإنشاء برنامج يعمل بكامل طاقته. يهدف هذا المشروع الأول إلى تقديم العديد من الموضوعات الرئيسية، وسنتخذ بعض الطرق الالتفافية على طول الطريق لمناقشة هذه الموضوعات الجديدة أثناء كتابة هذا البرنامج معًا.

اللعبة بسيطة. ومع ذلك، فإن البرمجة اللازمة لكتابة اللعبة ستحدد المشهد لكل برنامج ستكتبه في المستقبل.

أفضل طريقة لتقديم اللعبة هي إظهار إخراج البرنامج:

Welcome to the Angry Goblin Hunt
An award-winning game full of adventure and excitement (!)

Type in your name: Stephen

Stephen, do you think you can find the goblin hiding in the kitchen cupboards?
|_||_||_||_||_|

Which cupboard do you think the goblin is in [type in number]: 2
Sorry! The goblin is still lurking somewhere else.

Which cupboard do you think the goblin is in [type in number]: 4
Sorry! The goblin is still lurking somewhere else.

Which cupboard do you think the goblin is in [type in number]: 3
Sorry! The goblin is still lurking somewhere else.

Which cupboard do you think the goblin is in [type in number]: 1
Well done!! You have found the goblin. He was so scared he ran away
  • مرحبًا بكم في لعبة Angry Goblin Hunt
  • لعبة حائزة على جوائز مليئة بالمغامرة والإثارة (!)
  • اكتب اسمك: ستيفن
  • ستيفن، هل تعتقد أنه يمكنك العثور على عفريت مختبئ في خزائن المطبخ؟
  • | _ || _ || _ || _ || _ |
  • في أي خزانة تعتقد أن العفريت بها [اكتب الرقم]: 2
  • آسف! لا يزال العفريت مختبئًا في مكان آخر.
  • في أي خزانة تعتقد أن العفريت موجود [اكتب الرقم]: 4
  • آسف! لا يزال العفريت مختبئًا في مكان آخر.
  • في أي خزانة تعتقد أن العفريت بها [اكتب الرقم]: 3
  • آسف! لا يزال العفريت مختبئًا في مكان آخر.
  • في أي خزانة تعتقد أن العفريت موجود [اكتب الرقم]: 1
  • أحسنت!! لقد وجدت عفريت. كان خائفًا جدًا لدرجة أنه هرب بعيدًا.

وهذا هو ملخص البرنامج:

  • اعرض رسالة ترحيب.
  • اسأل اللاعب عن اسمه، وبمجرد كتابة اسمه، قدم الجزء التالي من رسالة الترحيب.
  • اعرض تمثيلاً “رسوميًا” لخزائن المطبخ (نعم، نبقيها بسيطة للغاية هنا!)
  • اطلب من اللاعب أن يخمن أين يختبئ العفريت عن طريق كتابة رقم الخزانة.
  • إذا كان التخمين غير صحيح، اعرض رسالة واسأل مرة أخرى.
  • إذا كان التخمين صحيحًا، اعرض رسالة تفيد بالفوز وقم بإنهاء اللعبة.

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

المدخلات والمخرجات الأساسية في البرمجة

اثنان من أكثر الدوال أو الوظائف الأساسية في بايثون Python هما دالة الطباعة print () ودالة الإدخال ()input. إنها ليست أكثر الدوال إثارة، لكنها مفيدة جدًا.

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

تتطلب وظيفة الإدخال ()input مناقشة موسعة بشكل طفيف. دعنا نلقي نظرة على الدالات بمزيد من التفصيل لشرح ما يحدث مع دالة الإدخال ()input.

الدوال Functions

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

يمكن للدوال أيضًا إرجاع بعض البيانات إلى البرنامج. تقوم دالة الإدخال ()input بهذا فقط. يطلب من مستخدم البرنامج كتابة شيء ما وإرجاع هذه المعلومات كسلسلة. لهذا السبب، إذا أردنا استخدام المعلومات التي كتبها المستخدم لاحقًا في البرنامج، فنحن بحاجة إلى تخزينها باستخدام اسم name:

name_of_pet = input("What is the name of your pet? ")

لقد أنشأت متغيرًا أطلقت عليه اسم name_of_pet وقمت بتخزين كل ما يأتي من دالة الإدخال input () باستخدام هذا الاسم. تشبيه مفيد يمكنك التفكير فيه لفهم ما تفعله علامة = هو ما يلي:

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

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

الفرق بين دالة print ودالة input

لاحظ أن دالة الإدخال input () تؤدي أيضًا نفس العملية مثل print () وتعرض كل ما هو بين الأقواس للمستخدم، بالإضافة إلى إعادة الإدخال الذي كتبه المستخدم. يمكنك التفكير في دالة print () كشكل من أشكال الاتصال أحادي الاتجاه، من برنامج إلى مستخدم. يمكنك تحقيق اتصال ثنائي الاتجاه باستخدام دالة الإدخال input () الذي يتواصل فيه البرنامج مع المستخدم، ويمكن للمستخدم أيضًا التواصل مرة أخرى مع البرنامج عن طريق الكتابة ثم الضغط على مفتاح الإدخال / العودة Enter.

ماذا سيحدث إذا كنت قد كتبت فقط السطر التالي من التعليمات البرمجية؟

input("What is the name of your pet? ")

لا تزال دالة الإدخال input () قيد التشغيل نظرًا لأنها متبوعة بـ (). ومع ذلك، فإن البيانات التي ترجعها الدالة ليس لها مكان تذهب إليه. لم تطلب من برنامج الكمبيوتر إحضار صندوق تخزين، وتسمية الصندوق، وتخزين المعلومات التي يتم إرجاعها من خلال دالة الإدخال input () في المربع. في هذه الحالة، ستفقد المعلومات التي يكتبها المستخدم، حيث لا توجد طريقة لاسترجاعها واستخدامها لاحقًا في البرنامج.

ملاحظة

الدوال أو الوظائف يجب أن يتبعها أقواس () حتى يقوم البرنامج بتنفيذها. يحتاج الكمبيوتر إلى معرفة ما إذا كنا نشير فقط إلى اسم الدالة أو ما إذا كنا نريد تنفيذها.

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

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

عادةً ما تُكتب أسماء الدوال بأحرف صغيرة دائمًا، وإذا كان اسم الدالة يتكون من أكثر من كلمة واحدة، فعادة ما يتم ربطها باستخدام حرف _ الشرطة السفلية، كما هو الحال في do_something_now ().

بدء برمجة لعبة Angry Goblin

يمكنك الآن بدء العمل على لعبة Angry Goblin. إذا لم تكن قد قمت بذلك بالفعل، فيمكنك فتح ملف بايثون Python File جديد وتجربة الكود بنفسك أثناء متابعة الأقسام التالية. لا تتردد في التجربة.

الخطوة الأولى

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

print("Welcome to the Angry Goblin Hunt")
print("An award-winning game full of adventure and excitement (!)")
 
player_name = input("What is your name? ")
print(player_name + ", can you find the goblin?")

print("|_||_||_||_||_|")

لا يوجد الكثير من المفاجآت في أول سطرين. أنت تطلب من الكمبيوتر عرض سلاسل الأحرف داخل علامات التنصيص “”. يمكنك كتابة أي شيء تريده داخل علامات التنصيص. المصطلحات المستخدمة غالبًا هي أنك تمرر سلسلة كوسيطة للدالة print ().

السطر التالي هو السطر الذي رأيته بالفعل ويستخدم دالة الإدخال input (). أنت تمرر سلسلة أحرف توضح المطالبة التي تريد أن يقرأها المستخدم. البرنامج سينتظر المستخدم بعد ذلك كتابة شيء ما والضغط على مفتاح Enter / Return. كل ما يكتبه المستخدم سيتم تخزينه كسلسلة في المتغير player_name.

أسماء المتغيرات

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

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

آخر سطرين في الكود أعلاه هما استخدامان إضافيان لدالة print (). آخرها مشابه لكيفية استخدامنا print () سابقًا. يعرض هذا السطر دواليب المطبخ بطريقة مبسطة للغاية: | _ || _ || _ || _ || _ |.

هذا يظهر السطر الذي يقول:

print(player_name + ", can you find the goblin?")

الوسيطة التي تقوم بتمريرها إلى دالة print () تتكون من جزأين، متصلين بعلامة +. يشير المتغير player_name إلى سلسلة باسم اللاعب. تضاف هذه السلسلة إلى السلسلة التي تعرض بقية الجملة. نسمي هذه السلسلة باسم “تسلسل” Concatenation. هناك طرق أخرى يمكننا من خلالها ربط السلاسل وتنسيقها والتي ستتعرف عليها في فصول لاحقة. هذه هي أبسط طريقة لاستخدامها في هذه الحالة.

الخطوة الثانية

الخطوة التالية في اللعبة هي أن تطلب من اللاعب تخمين مكان العفريت. ولكن هناك خطوة مهمة أخرى مخفية عن المستخدم. كيف يعرف برنامج الكمبيوتر الخاص بك مكان العفريت؟

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

goblin_position = 3

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

بعد ذلك، يحتاج برنامج الكمبيوتر إلى مطالبة اللاعب بتخمين مكان العفريت. تحتاج إلى اتصال ثنائي الاتجاه للقيام بذلك حيث يعرض البرنامج مطالبة للمستخدم، ويمكن للمستخدم كتابة تخمينه. حاول القيام بما يلي:

input("Can you guess where the goblin is hiding? ")

هل يمكنك اكتشاف مشكلة في هذا السطر من التعليمات البرمجية؟

الكود صالح تمامًا لبايثون. ومع ذلك، فإن المعلومات التي يتم إرجاعها بواسطة دالة الإدخال input () لا يتم تخزينها في أي مكان. البيانات التي تم إرجاعها قصيرة العمر. في اللحظة التي ينتقل فيها البرنامج إلى السطر التالي، سوف يتجاهل المعلومات التي عادت من دالة الإدخال input ().

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

guessed_position = input("Can you guess where the goblin is hiding? ")

يمكنك الآن استرداد مدخلات المستخدم في أي وقت في البرنامج باستخدام اسم المتغير guessed_position.

تحديد ما يجب القيام به بعد ذلك

ماذا بعد؟ حسنا، هذا يعتمد؟ ما يحدث بعد ذلك يعتمد على ما إذا كان اللاعب قد خمّن موقع العفريت بشكل صحيح أم لا.

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

دعونا نلقي نظرة على عبارة if Statement في بايثون Python قبل أن تتمكن من المضي قدمًا في لعبة Angry Goblin.

العبارة الشرطية if Statement

اقرأ الجملة التالية:

If it’s raining, take an umbrella, and don’t forget your wallet.

إذا كانت السماء تمطر، خذ مظلة ولا تنس محفظتك.

ماذا ستفعل إذا كان اليوم مشمسًا؟ هل ستترك محفظتك في المنزل؟ على الأغلب لا. السياق في الجملة أعلاه واضح بما يكفي لكي يفهمه معظم البشر. سيكون الوضع مختلفًا إذا كانت الجملة:

If it’s raining, take an umbrella, and don’t forget your raincoat.

إذا كانت السماء تمطر، خذ مظلة ولا تنسي معطفك الواقي من المطر.

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

If it’s raining, take an umbrella and a raincoat, and don’t forget your wallet.

إذا هطل المطر، خذ مظلة ومعطف واق من المطر ولا تنس محفظتك.

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

استخدام الجملة الشرطية

في بايثون، كما هو الحال في اللغة الإنجليزية أو أي لغة أخرى، يمكننا استخدام الكلمة “إذا” if عند الحاجة إلى تحديد كيفية المضي قدمًا. لنكون أكثر تحديدًا، نستخدم الكلمة “إذا” if عندما نكون بحاجة إلى أن يتخذ برنامج الكمبيوتر القرار نيابة عنا. وهذا ما يسمى الجملة الشرطية conditional statement.

يمكنك بدء ملف Python جديد إذا كنت ترغب في استكشاف الكود في هذا القسم قبل العودة إلى لعبة Angry Goblin. في PyCharm، تذكر أن تختار New… من قائمة File ثم اختر ملف بايثون Python Fıle (وليس الخيار الذي يشير فقط إلى ملف File). عندما تفتح ملفًا جديدًا، ستحتاج إلى تحديد الملف الجديد من قائمة Run… في المرة الأولى التي تريد فيها تشغيله. بعد التشغيل الأول، يمكنك استخدام زر التشغيل الأخضر أو ​​استخدام اختصار لوحة المفاتيح.

is_monday = True

if is_monday:
  print("Have a great week")

الصواب True  والخطأ False   كلمات رئيسية مهمة في بايثون. إذا كان يجب أن يتبعه شيء إما صحيح أو خطأ (أو بشكل أكثر دقة، شيء يمكن أن تفسره بايثون على أنه صحيح أو خطأ، ولكن لا تقلق بشأن هذا التمييز الدقيق في الوقت الحالي). هذه هي الطريقة التي يقرر بها برنامج الكمبيوتر ما إذا كنت تريد طباعة النص “أتمنى لك أسبوعًا رائعًا”. سنناقش سبب بدء السطر الأخير بعلامة تبويب Tab قريبًا.

استخدام المتغيرات في الجملة الشرطية

دعنا نعيد كتابة الكود أعلاه بتنسيق مختلف قليلاً:

day = "Monday"

if day == "Monday":
  print("Have a great week")

لقد أنشأت متغيرًا باسم day، وقمت بتعيين السلسلة “Monday” إليه. في السطر الذي يبدأ بكلمة if، هناك عبارة قد تعتقد أن بها خطأ مطبعي. ومع ذلك، فإن علامة التساوي المزدوجة == هي عامل تشغيل صالح في Python له دور مختلف تمامًا عن عامل التشغيل علامة التساوي الفردية =.

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

ومع ذلك، فإن علامة == تطرح سؤالاً على برنامج الكمبيوتر الخاص بك: هل قطعتا المعلومات على جانبي علامة == متشابهة؟ في هذه الحالة، تطلب من الكمبيوتر أن يخبرك ما إذا كانت البيانات المخزنة في المتغير day هي نفس السلسلة “Monday”. ستكون الإجابة على هذا السؤال إما صواب أو خطأ، كما هو مطلوب في عبارة if. لذلك يمكن للبرنامج اتخاذ قرار بناءً على إجابة السؤال ==.

في هذه الحالة، day  و “Monday” متطابقان. لذلك سيقوم البرنامج بتنفيذ وظيفة print (). ستتعرف على علامات الترقيم الأخرى في هذا الرمز وعلامة التبويب أو المسافة البادئة Tab الإضافية قريبًا جدًا.

يمكنك الآن تمديد الكود أعلاه على النحو التالي:

day = "Monday"

if day == "Monday":
  print("Have a great week")
else:
  print("It's almost the weekend")

يمكن تشغيل دالة واحدة فقط من دالتي print (). أنت تطلب من برنامج الكمبيوتر اتخاذ قرار ثم السير في أحد المسارين المحتملين، اعتمادًا على ما قرره. في هذه الحالة، نظرًا لأن اليوم هو “الاثنين” Monday، ستكون مخرجات البرنامج هي طباعة “أتمنى لك أسبوعًا رائعًا” Have a great week ولن يتم تشغيل السطر التالي لكلمة else. حاول تغيير قيمة اليوم للتأكد من أن البرنامج يتخذ القرار الصحيح في كل مرة.

استخدام الكلمة elifفي الجملة الشرطية

day = "Monday"

if day == "Monday":
  print("Have a great week")
elif day == "Tuesday":
  print("Hang on in there!")
elif day == "Wednesday":
  print("You're half way through the week")
else:
  print("It's almost the weekend!")

الكلمة الأساسية elif تعني else if، وتسمح لك بإنشاء شروط إضافية سيتم أخذها في الاعتبار إذا كانت الشروط السابقة خطأ. يوجد الآن أربع نتائج محتملة لهذه الكتلة من التعليمات البرمجية. يمكن تقسيم الكود إلى أربعة مسارات، وسيقرر برنامج الكمبيوتر المسار الذي يجب اتخاذه وفقًا للظروف. يتم تقييم الشروط بالترتيب الذي تم كتابتها به، بدءًا من الشرط الذي يتلو الكلمة if، ثم تلك التي تلي الكلمات الأساسية elif. عند استيفاء أول شرط للقيمة True، يتم تنفيذ هذا المسار ويتم تجاهل باقي كتل elif و else.

بناء الجملة Syntax

الآن، كنت قد لاحظت أن البرمجة تتطلب منك أن تكون دقيقًا في بناء الجملة Syntax، وهي القواعد وعلامات الترقيم. كل سطر يبدأ بـ if أو elif أو else به نقطتان : في نهاية السطر. الأسطر التالية لها مسافة بادئة Tab. إذا تم استيفاء شرط (مما يعني أن عبارة صحيحة True تأتي بعد الكلمات الأساسية if أو elif)، فسيتم تنفيذ الأسطر الموجودة بعد الشرط مباشرة.

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

day = "Tuesday"

if day == "Monday":
  print("Have a great week")
  print("Get back to work now")

والبديل الثاني هو ما يلي:

day = "Tuesday"

if day == "Monday":
  print("Have a great week")
print("Get back to work now")

هل لاحظت الاختلاف؟ في المثال الأول، تعد كلا دالتي الطباعة print () جزءًا من الكتلة الشرطية. سيقوم البرنامج بتنفيذ كلاهما إذا كان الشرط صحيحًا True، ولن ينفذ أي منهما إذا كان الشرط خطأ False.

في المثال الثاني، يوجد اختلاف بسيط مقارنة بالمثال الأول. لا يحتوي السطر الأخير على مسافة بادئة مثل السطر الذي يسبقه. هذا يعني أنه ليس جزءًا من الكتلة الشرطية. السطر الذي يطبع الجملة “أتمنى لك أسبوعًا رائعًا” Have a great week فقط مشروط بما إذا كان اليوم day  هو “الإثنين” Monday. سيتم عرض عبارة “عد إلى العمل الآن” Get back to work now دائمًا في هذه الحالة، مهما كان يوم الأسبوع.

إذا أردت تكرار العبارات الموجودة في بداية هذا القسم في كود Python، فيمكنك كتابة:

is_raining = True

if is_raining:
  print("Don't forget the umbrella")
  print("And don't forget the raincoat")
print("Don't forget your wallet")

أي بمعنى:

إذا كانت تمطر:

  • لا تنس المظلة
  • ولا تنس معطف المطر

وفي كل الأحوال، لا تنس محفظتك

أنت الآن جاهز للعودة إلى لعبة Angry Goblin.

برمجة عملية الفوز في اللعبة

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

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

print("Welcome to the Angry Goblin Hunt")
print("An award-winning game full of adventure and excitement (!)")
 
player_name = input("What is your name? ")
print(player_name + ", can you find the goblin?")

print("|_||_||_||_||_|")

goblin_position = 3

guessed_position = input("Can you guess where the goblin is hiding? ")

if guessed_position == goblin_position:
  print("Well done. You've found the goblin.")
else:
  print("No, sorry. The goblin is still hiding somewhere.")

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

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

جربه قبل القراءة.

هل نجح؟

لا؟ لا تقلق، فأنت لم ترتكب أي خطأ. لدينا خطأ bug  في برنامجنا. الخلل هو نتيجة غير متوقعة. يعطي برنامج الكمبيوتر ناتجًا، لكنه ليس الناتج الذي توقعته.

ستقرأ المزيد عن الأخطاء والمشكلات في فصل لاحق. في هذا المشروع التمهيدي، سنستخدم هذا الخطأ لمناقشة موضوع مهم آخر في البرمجة وهو: أنواع البيانات data types.

البرمجة في Python Console

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

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

في هذه الحالات، يمكنك استخدام وحدة تحكم بايثون Python Console. في بعض الأحيان، يمكن أيضًا الإشارة إلى وحدة التحكم باسم shell. إذا كنت تستخدم PyCharm باعتباره بيئة التطوير المتكاملة IDE الخاص بك، فسترى علامة تبويب في أسفل الشاشة تشير إلى Python Console، أو يمكنك التصفح من خلال قائمة View / Tool Windows. سيؤدي ذلك إلى فتح نافذة أسفل الشاشة. أنت تعلم أنك في وحدة تحكم بايثون Python Console حيث يبدأ كل سطر بموجّه الشارة الثلاثي >>> (ما لم تقم بتمكين IPython في التفضيلات، لكنني سأفترض أنك لم تغير أيًا من الإعدادات في PyCharm).

يتمثل الاختلاف الرئيسي بين وحدة التحكم Console وتشغيل البرنامج النصي في أنه في كل مرة تضغط فيها على مفتاح Enter / Return في وحدة التحكم، سيتم تنفيذ الكود الموجود في هذا السطر. الفرق الآخر هو أنه إذا كان لهذا السطر من التعليمات البرمجية بعض الإخراج Output لعرضه، فسيتم عرض ذلك تلقائيًا. لا تحتاج إلى استخدام وظيفة print () لإظهار الإخراج.

فمثلاً:

>>> a_number = 12
>>> a_number
12

لقد قمت بتعيين الرقم 12 إلى المتغير a_number. عندما كتبت a_number في سطر منفصل، عرضت وحدة التحكم محتويات صندوق التخزين a_number. إذا كنت تستخدم برنامجًا نصيًا، فستحتاج إلى طباعة قيمة المتغير صراحةً باستخدام print (a_number).

في بقية هذا الكتاب، كلما رأيت موجه الشيفرون الثلاثي >>> في كتلة التعليمات البرمجية، يمكنك افتراض أن هذا يعمل في وحدة تحكم بايثون Python Console. خلاف ذلك، يمكنك افتراض أن كل التعليمات البرمجية موجودة في نص Script.

أنواع البيانات

اسمحوا لي أن أبدأ بتوضيح سبب أهمية أنواع البيانات data types قبل مناقشة ماهيتها.

حاول تشغيل الكود التالي في Python Console. علامة النجمة * تعني الضرب في بايثون:

>>> a_number = input("What's your favourite number: ")
What's your favourite number?  >?  12
>>> a_number * 2
'1212'

ليس تماما ما كنت تتوقعه؟ من كان يظن أن بايثون لا يمكنها حتى ضرب رقم في 2؟

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

>>> my_name = "Stephen"
>>> some_number = 12

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

>>> type(my_name)
<class 'str'>

>>> type(some_number)
<class 'int'>

تشير Python إلى السلاسل strings  باسم str، ويتم تمثيل الأعداد الصحيحة integers  بالمصطلح int. هذه هي أنواع البيانات.

حاول ضرب البيانات في كلا المتغيرين في 2 وانظر ما سيحدث:

>>> some_number * 2
24

تمت استعادة ثقتك ببايثون. يمكن أن يقوم بعملية الضرب بشكل صحيح!

>>> my_name * 2
'StephenStephen'

تم استخدام نفس عامل الضرب *، لكنه يعمل بشكل مختلف في المثالين الموضحين أعلاه. يتعرف Python على my_name باعتباره سلسلة str، لذلك يستخدم قاعدة مختلفة للضرب.

نوع البيانات الافتراضي في بايثون

قد يحتاج البرنامج إلى مطالبة المستخدم بكلمة أو جملة. في مناسبات أخرى، سيحتاج المستخدم إلى إدخال رقم. دالة الإدخال input() التي استخدمتها سابقًا ليس لها طريقة لمعرفة ما يطلبه المبرمج من المستخدم. لهذا السبب، يُرجع الإدخال input() دائمًا نتيجة من نوع سلسلة str. عندما قمت بكتابة العدد 12 عند مطالبتك من دالة الإدخال input()، لم يتم تخزين هذه المعلومات كعدد 12 ولكن كحرفين “1” و”2″ بجوار بعضهما البعض. هذا هو السبب في أننا عندما ضربنا في 2، أعاد بايثون لنا النتيجة وهي السلسلة “1212”.

في هذه الحالات، يمكنك استخدام دوال Python المضمنة للتحويل بين أنواع البيانات:

>>> a_number = input("What's your favourite number? ")
What's your favourite number?  >?  12
>>> a_number = int(a_number)
>>> a_number * 2
24

دعونا نلقي نظرة على بعض أنواع البيانات الأساسية الأخرى في بايثون:

>>> another_number = 2.5
>>> type(another_number)
<class 'float'>

>>> is_sunny = False
>>> type(is_sunny)
<class 'bool'>

أمثلة أنواع البيانات

العدد العشري float  هو عدد غير صحيح. تحتاج Python إلى ذاكرة أكبر لتخزين عدد عشري من الذي تحتاجه لتخزين عدد صحيح int. لذلك، عندما تكون هناك حاجة إلى عدد صحيح فقط، فإن تخزينه على أنه عدد صحيح يحفظ الذاكرة. لاحظ أن بايثون سوف تخزن العدد 3.0 على هيئة عدد عشري والعدد 3 على هيئة عدد صحيح. لا داعي للقلق بشأن الفرق بين int وfloat في الوقت الحالي. يمكنك ببساطة التفكير في نوعي البيانات كنوع من الأعداد في الوقت الحالي.

البيانات من النوع المنطقي bool  هو نوع البيانات المنطقية Booleans . يمكن أن تأخذ القيم المنطقية واحدة فقط من قيمتين، إما صواب True  أو خطأ False. ستحتاج غالبًا إلى تخزين هذا النوع من المعلومات في برنامج.

السمة الديناميكية

قد تسمع بأن وصف لغة Python على أنها لغة مكتوبة ديناميكيًا. هذا يعني أنه عند تعيين البيانات إلى متغير باستخدام علامة =، ستنظر Python في المعلومات الموجودة على الجانب الأيمن من = وستقرر نوع البيانات الذي يبدو عليه هذا. إذا كان عددًا بدون فاصلة عشرية، فإن بايثون ستخزن العدد على هيئة عدد صحيح. إذا كان العدد يحتوي على علامة عشرية، فسيتم تخزينه على أنه عدد عشري. يتم تفسير النص الموجود بين علامات الاقتباس على أنه من نوع سلسلة str. في بايثون Python، يمكنك استخدام علامات اقتباس مفردة أو مزدوجة لتمثيل السلاسل:

>>> word_1 = "hello"
>>> word_2 = 'hello'

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

البيانات المنطقية

يطرح عدد من المشغلين في بايثون سؤالاً له إجابة صواب True أو خطأ False. لقد واجهت بالفعل واحدًا مما يلي:

>>> a_number = 5
>>> another_number = 10

>>> a_number == another_number
False

>>> a_number == 5
True

السطر a_number = 5 هو تخصيص. أنت تطلب من Python تخصيص العدد الصحيح int 5 للمتغير a_number. السطر a_number == 5 عبارة عن جملة مقارنة. إنها تسأل عما إذا كانت البيانات في a_number هي نفس الرقم 5.

فيما يلي بعض العوامل الأخرى:

>>> 2 > 20
False

هل 2 أكبر من 20؟ تستجيب بايثون بـ False.

>>> another_number != 10
False

هل other_number لا يساوي 10؟ الرد: خطأ

>>> 5 >= 5
True

هل 5 أكبر من أو تساوي 5؟ الرد نعم.

>>> "e" in "Stephen"
True

>>> "x" in "Stephen"
False

هل يمكن العثور على الحرف e في الكلمة “Stephen”؟ ماذا عن الحرف “x”؟

زيادة صعوبة برنامج اللعبة

يمكنك الآن إصلاح الخلل في لعبة Angry Goblin. إليك الكود حتى الآن مع إضافة صغيرة قبل عبارة if لتغيير البيانات في guessed_position من نوع سلسلة str إلى نوع عدد صحيح int. سيتم عرض الأسطر الجديدة والمعدلة كما هو موضح في كتل التعليمات البرمجية، عند الحاجة:

print("Welcome to the Angry Goblin Hunt")
print("An award-winning game full of adventure and excitement (!)")

player_name = input("What is your name? ")
print(player_name + ", can you find the goblin?")

print("|_||_||_||_||_|")

goblin_position = 3

guessed_position = input("Can you guess where the goblin is hiding? ")
guessed_position = int(guessed_position)

if guessed_position == goblin_position:
  print("Well done. You've found the goblin.")
else:
  print("No, sorry. The goblin is still hiding somewhere.")

حاول تشغيل البرنامج الآن للتأكد من حصولك على نتيجة مختلفة إذا أدخلت 3 أو أي رقم آخر عند تشغيل اللعبة.

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

بايثون، مثل العديد من اللغات الأخرى، لديها الكثير من الوظائف المضمنة built-in. ومع ذلك، لا تتوفر كل هذه الوظائف على الفور عند كتابة برنامج كمبيوتر. ستحتاج إلى إدخالهم أولاً في البرنامج قبل أن تتمكن من استخدامها.

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

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

يمكنك القيام بذلك في Python باستخدام الكلمة الأساسية import  المخصصة للاستيراد. في لعبة Angry Goblin، ستحتاج إلى كتاب random يسمى عشوائي. يحتوي هذا الكتاب على وظائف تتعامل مع العشوائية. تسمى الكتب التي أشير إليها في هذا التشبيه بالمكتبة باسم الوحدات النمطية modules.

دعونا نجرب بإيجاز كيفية استخدام هذه الوحدة في جلسة وحدة التحكم قبل أن تتمكن من إجراء تغييرات على لعبة Angry Goblin:

>>> import random
>>> random.randint(1, 10)
7

تقوم جملة الاستيراد import  بإحضار الكتاب random  (العشوائية) من المكتبة إلى برنامجك. في هذه الحالة، تقوم باستيراد الوحدة إلى جلسة وحدة التحكم. كلما احتجت إلى استخدام أي من الوظائف ضمن هذه الوحدة، ستحتاج إلى الرجوع إلى اسم الوحدة متبوعًا بنقطة (.) ثم اسم الوظيفة أو الدالة التي تحتاجها. سترى كثيرًا من استخدام هذه النقاط (.) في بايثون.

أنت تستخدم وظيفة تسمى randint ()، والتي تعني عددًا صحيحًا عشوائيًا أو رقمًا صحيحًا عشوائيًا. كما رأيت مع الدوال سابقًا، فإن اسم الدالة متبوع بأقواس. ومع ذلك، تحتاج هذه الدالة إلى قطعتين من المعلومات بين الأقواس. تحتاج دالة randint () إلى بداية ونهاية النطاق الذي ستختار منه رقمًا عشوائيًا. في المثال أعلاه، أعادت الدالة الرقم 7. في كل مرة يتم فيها تشغيل الدالة، ستعيد رقمًا عشوائيًا من النطاق بين 1-10.

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

import random

print("Welcome to the Angry Goblin Hunt")
print("An award-winning game full of adventure and excitement (!)")

player_name = input("What is your name? ")
print(player_name + ", can you find the goblin?")

print("|_||_||_||_||_|")

goblin_position = random.randint(1, 5)

guessed_position = input("Can you guess where the goblin is hiding? ")
guessed_position = int(guessed_position)

if guessed_position == goblin_position:
  print("Well done. You've found the goblin.")
else:
  print("No, sorry. The goblin is still hiding somewhere.")import random

عندما تقوم بتشغيل البرنامج الآن، فأنت لا تعرف أين يختبئ العفريت بعد الآن لأن برنامج الكمبيوتر الذي اختار مكان إخفاء العفريت بطريقة عشوائية.

الاستمرار حتى تنتهي اللعبة

عند تشغيل البرنامج للعب اللعبة، ستحصل على محاولة واحدة فقط لتخمين المكان الذي يختبئ فيه العفريت. ستحتاج الآن إلى تغيير البرنامج بحيث يُعطى اللاعب المزيد من المحاولات للتخمين، وستنتهي اللعبة عندما يخمن اللاعب موقع العفريت.

القرار الأول الذي يتعين عليك اتخاذه هو تحديد الأسطر التي يجب تكرارها:

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

بمجرد تحديد الأسطر التي تحتاج إلى تكرار، ستحتاج إلى مطالبة برنامج الكمبيوتر بتكرار repeat  هذه الأسطر. عندما يتم تكرار كتلة من التعليمات البرمجية عدة مرات، فإننا نسميها حلقة loop.

جملة التكرار: while Loop

هناك أكثر من طريقة لإنشاء الحلقات في Python، ولكن بالنسبة لهذه المهمة، ستنظر إلى حلقة while loop.

لنبدأ بإجراء تغييرات على البرنامج:

import random

print("Welcome to the Angry Goblin Hunt")
print("An award-winning game full of adventure and excitement (!)")

player_name = input("What is your name? ")
print(player_name + ", can you find the goblin?")

print("|_||_||_||_||_|")

goblin_position = random.randint(1, 5)

while True:
  guessed_position = input("Can you guess where the goblin is hiding? ")
  guessed_position = int(guessed_position)

  if guessed_position == goblin_position:
    print("Well done. You've found the goblin.")
  else:
    print("No, sorry. The goblin is still hiding somewhere.")

هناك نوعان من التغييرات التي أدخلتها على هذا الرمز:

  • لقد أضفت سطر while True: قبل كتلة الشفرة التي تحتاج إلى تكرارها.
  • لقد أضفت مسافة بادئة في بداية كل سطر في مجموعة التعليمات البرمجية التي تحتاج إلى التكرار. لاحظ أن هذا يعني أن بعض الأسطر تحتوي الآن على مسافة بادئة مزدوجة، يوضح أحدهما أنها جزء من حلقة while ويظهر الآخر أنها جزء من الكتلة الشرطية التي تتبع if أو else.

النصيحة الأولى: في معظم بيئات البرمجة مثل PyCharm، إذا حددت كتلة من التعليمات البرمجية وضغطت على مفتاح Tab، فستتم إضافة مسافة بادئة إلى كل سطر في كتلة التعليمات البرمجية، وبالتالي مسافة بادئة للكتلة بأكملها مرة واحدة. Shift-Tab سيزيل المسافة البادئة.

يجب أن تتبع الكلمة الأساسية while بيانًا يمكن للبرنامج تفسيره على أنه إما صحيح أو خطأ. عندما يتبع عبارة while الكلمة True ، سيتم تنفيذ كتلة التعليمات البرمجية التي تلي while. في نهاية هذه الكتلة من التعليمات البرمجية، يعود البرنامج إلى العبارة while ويتحقق مما إذا كان لا يزال يتبعها عبارة True.

في هذه الحالة، أدخلت القيمة المنطقية True مباشرةً بعد الكلمة الأساسية while. هذا يعني أنه كلما عادت الشفرة إلى جملة while، فستجدها دائمًا على أنها صحيحة. هذه حلقة لا نهائية. ستغير هذا لاحقًا للتأكد من أنه لن يستمر إلى الأبد.

استخدام العوامل المنطقية مع while

عندما علمت بعبارة if في وقت سابق، اكتشفت تعابير في Python تعطي إجابة بصواب أو خطأ. == و> أمثلة على مثل هذه العوامل. يمكن استخدام هذه العوامل لتأتي بعد الكلمة الأساسية while.

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

import random

print("Welcome to the Angry Goblin Hunt")
print("An award-winning game full of adventure and excitement (!)")

player_name = input("What is your name? ")
print(player_name + ", can you find the goblin?")

print("|_||_||_||_||_|")

goblin_position = random.randint(1, 5)

keep_trying = True

while keep_trying:
  guessed_position = input("Can you guess where the goblin is hiding? ")
  guessed_position = int(guessed_position)

  if guessed_position == goblin_position:
    print("Well done. You've found the goblin.")
    keep_trying = False
  else:
    print("No, sorry. The goblin is still hiding somewhere.")

print("Thank you for playing. Now get back to work!")

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

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

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

اللمسات الأخيرة

أنت على وشك الانتهاء. هناك بضعة تغييرات صغيرة ولكنها مهمة تحتاج إلى إجراؤها على برنامجك لإنهائها.

دعونا نلقي نظرة على السطر التالي الذي استخدمته لعرض الرسومات عالية التقنية التي تعرض أبواب الخزانة:

print("|_||_||_||_||_|")

أحد الأشياء التي لا يحبها المبرمجون هو تكرار أنفسهم. كان عليك تكرار نفس الأحرف خمس مرات داخل علامات التنصيص. لقد رأيت بالفعل طريقة لتكرار سلسلة عدة مرات:

print("|_|" * 5)

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

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

import random

number_of_doors = 5

print("Welcome to the Angry Goblin Hunt")
print("An award-winning game full of adventure and excitement (!)")

player_name = input("What is your name? ")
print(player_name + ", can you find the goblin?")

print("|_|" * number_of_doors)

goblin_position = random.randint(1, number_of_doors)

keep_trying = True

while keep_trying:
  guessed_position = input("Can you guess where the goblin is hiding? ")
  guessed_position = int(guessed_position)

  if guessed_position == goblin_position:
    print("Well done. You've found the goblin.")
    keep_trying = False
  else:
    print("No, sorry. The goblin is still hiding somewhere.")

print("Thank you for playing. Now get back to work!")

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

التعليقات وكتابة الشيفرة القابلة للقراءة

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

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

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

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

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

# This is a comment. When you run the program,
# these lines will be ignored.
# You can write anything you want in a comment.

import random

number = random.randint(1, 5)  # Chooses a random number between 1 and 5
# number = random.randint(-5, 5)

استخدامات التعليقات في البرمجة

يمكنك استخدام التعليقات من أجل:

  • كتابة وصفًا لبرنامجك أو لقسم من برنامجك
  • تسمية أقسام من التعليمات البرمجية الخاصة بك
  • إضافة شرحًا لسطر برمجي معقد
  • إزالة سطر واحد أو أكثر من التعليمات البرمجية مؤقتًا من البرنامج ولكن دون حذف الكود

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

import random

number_of_doors = 5

# Display welcome messages
print("Welcome to the Angry Goblin Hunt")
print("An award-winning game full of adventure and excitement (!)")

# Get player name
player_name = input("What is your name? ")
print(player_name + ", can you find the goblin?")

print("|_|" * number_of_doors)

goblin_position = random.randint(1, number_of_doors)

keep_trying = True

# Main game loop
while keep_trying:
  guessed_position = input("Can you guess where the goblin is hiding? ")
  guessed_position = int(guessed_position)

  if guessed_position == goblin_position:  # If player guesses correctly
    print("Well done. You've found the goblin.")
    keep_trying = False
  else:  # If player's guess is incorrect
    print("No, sorry. The goblin is still hiding somewhere.")
    
print("Thank you for playing. Now get back to work!")

ممارسات أخرى لتسهيل قراءة البرنامج

ومع ذلك، هناك ممارسات أخرى يمكنك ويجب عليك استخدامها لجعل شفرتك قابلة للقراءة. من الأفضل أن تجعل شفرة بايثون Python الفعلية الخاصة بك أكثر قابلية للقراءة بدلاً من طلب تعليق كلما أمكن ذلك. لنلقِ نظرة على مثال من البرنامج الذي أكملته للتو:

gp = random.randint(1, 5)  # This variable represents the goblin's position

اسم المتغير المختار في هذا السطر هو gp. عند كتابة الرمز، كنت على علم بأنك اخترت هذه الأحرف لتقف على مكان العفريت goblin’s position. ومع ذلك، ليس من الواضح أن هذا هو ما ترمز إليه هذه الأحرف. لذلك كتبت تعليقًا في السطر لتشرح لأي شخص يقرأ الكود ماهية هذا المتغير.

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

goblin_position = random.randint(1, 5)

باختيار اسم أطول يصف المعلومات المخزنة في المتغير بشكل كامل، تكون قد جعلت التعليق غير ضروري. اسم المتغير واضح. منذ عقود، كان من الشائع أن تكون أسماء المتغيرات قصيرة لتسريع الكتابة. في البرمجة الحديثة، تمتلك IDEs مثل PyCharm وظيفة الإكمال التلقائي، لذلك لا توجد عقوبة لكتابة أسماء أطول. يعتبر اختيار الأسماء الوصفية من أفضل الممارسات في البرمجة الحديثة.

الخلاصة

تهانينا! لقد أكملت مشروعك الأول. لقد غطيت في هذا الفصل:

  • كيفية تشغيل برنامج بايثون
  • كيفية تخزين البيانات في المتغيرات
  • كيفية استخدام الوظائف ، بما في ذلك print () والإدخال ()
  • كيفية التعرف على أنواع البيانات المختلفة ، بما في ذلك int و float و str و bool
  • كيفية استخدام عبارة if لجعل البرنامج يتخذ قرارًا بشأن كيفية المتابعة
  • كيفية استيراد وحدات مثل عشوائي ، واستخدام الوظائف داخل تلك الوحدات ، مثل randint ()
  • كيفية تكرار كتلة من التعليمات البرمجية باستخدام حلقة while

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

المصدر

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