البرمجة

تعلم بايثون للمبتدئين

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

  • الدرس 4 من 14
  • مبتدئ
  • مجاني، دون تسجيل

من التثبيت إلى أول برنامج ينفع

خمس خطوات، ولا واحدة منها تحتاج أكثر من دقائق.

  1. ثبّته من python.org

    على ماك ومعظم لينكس موجود مسبقا وهذه الخطوة غير لازمة.

    1
  2. أكّده بأمر واحد

    يجب أن يطبع python3 --version رقما. وعلى ويندوز py --version.

    2
  3. أنشئ ملف py

    سمّه hello.py وتأكد أن اللاحقة py فعلا لا py.txt.

    3
  4. خذ إدخالا وأعط إخراجا

    input يعطي سلسلة دائما؛ وللحساب عليك تحويلها.

    4
  5. اكتب برنامجا مفيدا فعلا

    شيء تحتاجه أنت، لا تمرين كتاب. هذا هو ما يبقيك مستمرا.

    5

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

آخر مراجعة: تُراجع الحقائق وأسماء الأدوات في هذا الدرس مقابل مصادرها في هذا التاريخ.

من أين نأخذ بايثون وكيف نعرف أنه ثُبّت؟

من صفحة التنزيل في python.org ولا من مكان آخر. على ماك ومعظم أنظمة لينكس يكون بايثون موجودا مسبقا ولا تحتاج إلى تثبيت شيء؛ أما على ويندوز فتثبته.

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

python3 --version

فإن طُبع رقم نسخة فقد انتهيت. وعلى الخادم نفسه الذي يُكتب عليه هذا الدرس، جواب هذا الأمر هو Python 3.12.3.

والآن الفخ الذي لا يذكره أي شرح: على أنظمة كثيرة لا يوجد أمر اسمه python أصلا. فعلى هذا الخادم يجيب python بـ«command not found» بينما يعمل python3. فإن رأيت في شرح ما python file.py ولم يحدث شيء، فالخطأ ليس منك؛ أضف الرقم ٣.

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

py --version

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

أول سكربت: من ملف فارغ إلى مخرج في الطرفية

أنشئ ملفا نصيا وسمّه hello.py. أي محرر نصوص يفي بالغرض، واليوم ليس يوم التسوق للأدوات. اكتب فيه سطرا واحدا:

print("Hello")

ثم افتح الطرفية في المجلد نفسه وشغّله:

python3 hello.py

تُطبع كلمة Hello. هذا كل شيء. وإن لم يُطبع شيء فافحص ثلاثة أمور بهذا الترتيب: أنك في المجلد الذي فيه الملف، وأن اسم الملف ينتهي فعلا بـpy لا بـpy.txt، وأن الأمر الذي كتبته هو الذي أجاب في القسم السابق.

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

if 5 > 3:
    print("bigger")

تلك المسافات الأربع قبل print ليست زينة بل قواعد. احذفها يرفع بايثون IndentationError. ونصيحتنا أن تضبط محررك ليضع أربع مسافات مكان tab، ثم لا تفكر في الأمر ثانية.

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

تكاد كل أسئلة «لماذا لا يعمل» في اليوم الأول تكون في العمود الآخر.

ورقة فحص اليوم الأولخمس دقائق

إن صحت هذه، فسيعمل

  • أمر النسخة يطبع رقما
  • الملف محفوظ فعلا بلاحقة py
  • الطرفية في المجلد الذي فيه الملف
  • الإزاحات كلها مسافات وغير مخلوطة بـtab

إن وُجدت هذه، فلن يحدث شيء

  • كتبت python وهو غير موجود أصلا على هذا النظام
  • المحرر حفظ الملف باسم hello.py.txt
  • الملف في مجلد والطرفية في مجلد آخر
  • نسخت الشفرة من صفحة ويب وجاءت معها مسافات غير مرئية

هذه القائمة تضمن التشغيل فقط لا صحة البرنامج. فالشفرة التي تعمل قد تعطي جوابا خاطئا.

الإدخال والإخراج: برنامج يحادث المستخدم

البرنامج الذي يطبع فقط مجرد ملاحظة. وinput يحوله إلى شيء يتلقى جوابا:

name = input("Your name: ")
print("Hello,", name)

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

والآن أهم نقطة في هذا القسم، وإن جهلتها صارت أول خطأ حقيقي في حياتك البرمجية: input يعيد سلسلة نصية دائما. وثائق بايثون نفسها تقول هذا؛ فحتى حين يكتب المستخدم ١٧، فالذي يصلك هو النص «17» لا العدد ١٧.

age = input("Age: ")
print(type(age))

ومخرج هذين السطرين هو <class 'str'>. أي أنك إن أردت أن تضيف واحدا إليه رفع بايثون خطأ، وعليك تحويله أولا:

age = input("Age: ")
print(int(age) + 1)

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

أول برنامج حقيقي: عُدّ طول النص

والآن نكتب شيئا نستعمله نحن فعلا. وصف الميتا لكل صفحة في هذا الموقع يجب أن يكون بين ١٤٠ و١٦٠ حرفا؛ وهذه قاعدتنا الداخلية ومكتوبة في دليل محتوى هذا الموقع. وعدّها بالعين عمل شاق، وستة أسطر بايثون تجعلها عمل عشر ثوان.

text = input("Meta description: ")
n = len(text)

if n < 140:
    print(f"{n} characters. Too short, {140 - n} to go.")
elif n > 160:
    print(f"{n} characters. Too long by {n - 160}.")
else:
    print(f"{n} characters. Good.")

شغّلنا هذه الشفرة ثلاث مرات قبل نشر هذا الدرس وكان مخرجها الحقيقي: لنص من ٩٠ حرفا، 90 characters. Too short, 50 to go.؛ ولـ١٥٠ حرفا، 150 characters. Good.؛ ولـ٢٠٠ حرف، 200 characters. Too long by 40.

وفي هذه الأسطر الستة أربعة أشياء جديدة. len يعطي طول السلسلة. وif وelif وelse تبني تفرعا ثلاثيا ولا ينفذ منها إلا واحد. وحرف f قبل علامة الاقتباس يعني أنك تستطيع وضع أقواس معقوفة داخل النص وبايثون يحسب ما فيها؛ واسمها f-string وهي أسهل طريقة لبناء نص. والحساب يعمل داخل تلك الأقواس أيضا، كما في {140 - n}.

وتمرين يستحق أن تفعله الآن: غيّر الشرط ليعدّ الكلمات بدل الحروف. تلميح: len(text.split()). فإن غيّرته بنفسك وعمل، فلم تعد من «حضر شرحا» بل صرت من «كتب برنامجا».

وقع خطأ؟ اقرأ التتبع من أسفله

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

أنشئ هذا الملف وسمّه shop.py وشغّله:

def price(n):
    return n * 1.09

print(price("100"))

وهذا بالضبط ما يُطبع. التشغيل الحقيقي، لا ما ينبغي أن يُطبع:

Traceback (most recent call last):
  File "shop.py", line 4, in <module>
    print(price("100"))
          ^^^^^^^^^^^^
  File "shop.py", line 2, in price
    return n * 1.09
           ~~^~~~~~
TypeError: can't multiply sequence by non-int of type 'float'

والقاعدة الآن: اقرأه من أسفله. فالسطر الأخير يقول ماذا حدث؛ وهنا كان نوع البيانات خطأ. والسطر الذي فوقه يقول أين حدث: السطر ٢، داخل الدالة price. وفوقه من استدعى ذلك المكان: السطر ٤. أي أن الخطأ ظهر في السطر ٢ لكن سببه في السطر ٤، حيث أرسلنا سلسلة بدل عدد.

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

وأول ثلاثة أخطاء في حياة أي أحد هي: SyntaxError ويعني أنك كتبت الجملة خطأ وغالبا ينقص قوس أو نقطتان؛ وNameError ويعني أنك ناديت اسما غير موجود وأكثره خطأ طباعي؛ وTypeError وهو الذي فوق، أي أن نوع البيانات لا يوافق ما تفعله بها.

ماذا بعد؟ خطة لا تضيّع وقتك

أهم ما تحتاجه بعد هذا الدرس ليس شرحا آخر؛ بل برنامجا صغيرا تحتاجه أنت فعلا. لكن هناك أربعة أشياء ترتيبها مهم، والشكل أدناه يبين ذلك الترتيب.

أولا المكتبة القياسية. فبايثون يُثبَّت ومعه مخزن من الشفرات الجاهزة، وأكثر الأعمال اليومية لها دالة جاهزة. وقبل أن تكتب أي حلقة، ابحث مرة في الشرح الرسمي لبايثون لترى هل العمل منجز أصلا.

ثم تثبيت المكتبات الخارجية بـpip، ومعه البيئة الافتراضية. هذان السطران يبقيان مشروعك منفصلا عن بقية النظام:

python3 -m venv .venv
source .venv/bin/activate

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

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

خمس درجات بعد أول برنامج، بهذا الترتيب

الترتيب هنا أهم من السرعة؛ فالدرجة الرابعة قبل الثالثة لا تصنع إلا حيرة.

  1. 1

    ابحث في المكتبة القياسية

    قبل كتابة أي حلقة، انظر هل العمل جاهز أصلا.

  2. 2

    برنامج تحتاجه أنت

    تمرين الكتاب يُهجَر، أما ما يحل ألما لك فلا.

  3. 3

    pip والبيئة الافتراضية

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

  4. 4

    كتابة الدوال

    حين تنسخ القطعة نفسها للمرة الثالثة، فقد حان وقتها.

  5. 5

    الأصناف، فقط حين يكون لديك ألم

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

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

المسار السريع مع الذكاء الاصطناعي

المسار السريع للمبتدئ ليس «خذ الشفرة». فأي نموذج يكتب سكربتا من ستة أسطر، وهذا بالضبط ما يُبقي المرء في مكانه. السرعة الحقيقية في مكان آخر: في الحلقة التي تلي الكتابة. فما يفعله المحترف أن يسلّم النموذج شفرته ليهاجمها، ويجد المدخلات التي تُسقط البرنامج، ويجربها قبل أن يجربها مستخدم. ويكفي هنا نموذج سريع ورخيص؛ واختيارنا الحالي في <a class="text-link" href="/ar/ai/">قسم الذكاء الاصطناعي</a>.

  1. اكتب أولا أصغر نسخة بنفسك وشغّلها، ولو كانت قبيحة. فالشفرة التي شُغّلت مرة واقعة، والتي قُرئت فقط تخمين.
  2. سلّم شفرتك الحقيقية مع مدخل ومخرج حقيقيين واطلب أقصر قائمة إصلاحات، لا إعادة كتابة. فإعادة الكتابة تستبدل شفرتك بشفرة النموذج وتتركك حيث كنت.
  3. اطلب خمسة مدخلات تُسقط البرنامج، ثم شغّل تلك الخمسة بنفسك. هنا يحدث التعلم، لا وأنت تقرأ جوابا صحيحا.
  4. وأخيرا اسأل أي دالة من المكتبة القياسية تحل محل الجزء الذي كتبته يدويا، وتحقق من اسم تلك الدالة في الوثائق الرسمية لا في جواب النموذج.

وصفة جاهزة للنسخ

هذه شفرتي بلغة بايثون. كتبتها بنفسي وهي تعمل:

{شفرتك الكاملة}

بهذا المدخل: {مدخل حقيقي واحد}
طبعت هذا: {المخرج الحقيقي لذلك التشغيل}

افعل أربعة أشياء ولا تُعد الكتابة:

١. أقصر قائمة إصلاحات على هذه الشفرة. لكل بند: أي سطر، وأي تغيير، ولماذا.
   وأبقِ بنيتي وأسمائي.
٢. خمسة مدخلات تُسقط هذا البرنامج أو تجعله يجيب خطأ، مع جملة لكل واحد تقول
   ماذا يحدث. وضع في حسبانك القيمة الفارغة والعدد السالب والنص الطويل جدا
   والحروف غير الإنجليزية.
٣. إن كان جزء من هذه الشفرة موجودا أصلا في المكتبة القياسية لبايثون، فأعطني
   اسم الدالة والوحدة بالضبط. الاسم فقط بلا شفرة.
٤. تمرين صغير يدفع هذا البرنامج خطوة إلى الأمام، ولا تكتب جوابه.

واسألني إن كان شيء في شفرتي غامضا.

قبل أن تثق بالناتج: النموذج بلا طرفية. فهو لا يرى نسخة بايثون عندك ولا نظام تشغيلك ولا أين ملفاتك، فكل جملة عن «هذا يفترض أن يعمل» عليك أنت أن تشغّلها. والنقطة الثانية أهم: فهو أحيانا يذكر بثقة تامة اسم مكتبة أو دالة لا وجود لها. والقاعدة بسيطة، ابحث عن أي <code>import</code> يُقترح عليك في وثائق بايثون الرسمية قبل التثبيت؛ فإن لم يكن هناك فهو غير موجود.

الذكاء الاصطناعي في هذا العمل

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

أدوات تساعد فعلا

  • Claude له وضع تعلم يسأل كالمعلم بدل أن يجيب، وهو مبني تحديدا لنمط «اشرح ثم امتحنّي». وإيران ليست في قائمة الدول المدعومة لدى أنثروبيك، وقد قرأنا ذلك في صفحة أنثروبيك نفسها.
  • Gemini ووضع التعلم الموجَّه فيه يسأل أيضا بدل أن يجيب، ويحوّل مصدرك إلى دليل مذاكرة وبطاقات وأسئلة. ويفهم الفارسية جيدا. وصفحة غوغل نفسها تقول إن تطبيق جيميناي على الويب يعمل في أكثر من ٢٣٠ دولة وإقليما، وإيران ليست في تلك القائمة.
  • ChatGPT الخيار الأشيع ومقبول لأسئلة بايثون الأساسية. وليست لدينا بعد صفحة له في قسم الذكاء الاصطناعي، فلا ندعي هنا شيئا عن وصوله أو سعره.

اين ينقلب ضدك

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

المصادر: Python docs: built-in functions, input Anthropic: supported countries Google: where Gemini Apps are available

حدود هذه النصيحة

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

من عملنا نحن

بايثون هو حارس الباب في عملنا نحن، وهذا الدرس نفسه مرّ من تحت يده. سكربتان بايثون، أحدهما ٢٨١ سطرا والآخر ٨٩، يقطّعان كل ملف درس إلى لغاته الأربع ويبحثان في كل قطعة عن الحروف الممنوعة. واليوم رفض هذان السكربتان حرفا واحدا في الدرس الشقيق لهذه الجلسة: همزة داخل كلمة تبدو سليمة تماما للعين. لم يرها إنسان ورآها ستة أسطر بايثون في أقل من ثانية. والنسخة التي فعلت ذلك هي 3.12.3 ويمكن التحقق منها على هذا الخادم بـpython3 --version؛ وعلى الخادم نفسه لا وجود لأمر python أصلا، وهو فخ القسم الأول من هذا الدرس.

اسئلة متابعة حقيقية

أنتعلم بايثون ٢ أم ٣؟

النسخة ٣ بلا تردد. فبايثون ٢ خارج الدعم منذ سنوات وصفحة التنزيل في python.org لا تعطي غير ٣. وإن صادفت شرحا فيه print "hello" بلا قوسين، فذلك النص كُتب للنسخة ٢ وبقيته على الأرجح قديمة أيضا.

أي محرر نحتاج للبدء؟

الذي على جهازك الآن. فأي محرر نصوص بسيط يحفظ ملف py، ويكفي ذلك في اليوم الأول، فقط انتبه ألا يحوّل اللاحقة إلى txt. ويصير اختيار المحرر مهما حين يصبح مشروعك عدة ملفات؛ وفي ذلك اليوم ستعرف بنفسك ما تريد.

أيمكن تعلم بايثون بلا إنجليزية؟

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