1  ماذا نعني بلغة البرمجة؟

يتألف البرنامج المكتوب بلغة البرمجة من قِطَع هي عبارة عن سلسلة من الجُمَل البسيطة والمركبة المكونة من مُفْرَدات للتعبير عن الأوامِر بطريقة يَسْهُلة على المبرمج كتابتها ، وفي نفس الوقت تَتَّبِعُ قَواعِدَ نَحْوِيَّة صارمة حتى لا تشتبه على المترجم عند تحويلها لتعليمات مفصَّلة على لغة المنطق الرقمي لآلة التي تنفذها.

وفي هذا المثال عرضٌ لقطع برمجية في بايثون وشرحٌ لعملها، وليس المطلوب أي شيء منها أو تأمُّلَه ومحاولة فهمه بل هذه نظرة عامَّة لتكوين تصوُّر مُجْمَل عمّا سيأتي إن شاء الله.

1.1 القطعة البرمجية

تُنَفَّذُ القطعة بحسب ترتيب جُمَلِها نزولاً من الأعلى.

pages = 900
speed =  50
finish_time = pages / speed

if finish_time < 14:
    print('الوقت كافٍ')
else:
    print('داهمنا الوقت')
داهمنا الوقت

في هذه القطعة مجموعة جُمل، نشرحها سطرًا سطرًا:

  • السطرين الأولين: جملة تعيين حرفّيْ (900 و 50) لمتغير (pages و speed).
  • السطر الثالث: جملة تعيين ناتج عبارة القسمة. ولاحظ أن اسم المتغير finish_time يستعمل الشرطة السفلية بدلاً من المسافة (وهذا ضروري)
  • جملة شرطية: if (بمعنى إن كان)
    • الجزء الأول (الشرط): finish_time < 14
    • ثم ما بعده مباشرة: جملة معلَّقة بالشرط
    • الجزء الثاني else (بمعنى فإن لم يكن) جملة معلَّقة بانتفاء الشرط

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

جملة بسيطة:

  • التعبير: x + y
  • التعيين: x = y
  • التأكيد: assert condition
  • المرور: pass
  • الحذف: del x
  • الإرجاع: return y
  • الإنتاج: yield y
  • رفع الاستثناء: raise Exception
  • الكسر: break
  • الاستمرار: continue
  • الاستيراد: import module
  • العالمية: global x
  • غير المحلية: nonlocal x
  • النوع: type(x)

جملة مركبة:

  • الشرط: if ...
  • التكرار: while ...
  • الحلقة: for ...
  • المحاولة: try ...
  • السياق: with ...
  • المطابقة: match ...
  • تعريف الفعل: def ...
  • تعريف النوع: class ...
  • الروتينات المتزامنة: async def ...
  • قوائم معلمات النوع: [T1[, T2, ...]]

1.2 الكلمات

أول أنواع الكلمة هو المفردات الأصلية في لغة بايثون التي لها معنىً خاصّ مفهوم لدى بايثون وتستعمل في جُمَل محددة. وهي:

False      await      else       import     pass
None       break      except     in         raise
True       class      finally    is         return
and        continue   for        lambda     try
as         def        from       nonlocal   while
assert     del        global     not        with
async      elif       if         or         yield

ومنها كذلك: match, case, type و _.

وما عدا ذلك

فقد تبني الحروف كلمةً تكونُ متغيِّرًا، نحو: x أو price أو body_weight فكلها أسماء مقبولة للمتغيرات؛ لا كما في الرياضيات التي عادةً ما تستعمل الحرف الواحد.

وقت تبني الحروف كلمة تكون حرفيٍّا، نحو: 44 أو 3.14 أو "كيف حالك؟" ويُسمَّى قيمة.

ومن الحروف علامات الابتداء والوَقف، نحو: ( ) و [ ] و { } والفصل، نحو: , (الفاصلة اللاتينية) و : (النقطتان الرأسِيَّتان) و = (علامة التعيين) ، وتُسمى جميعًا المحددات.

  • فالأقواس () في العبارة: (y + z) * (a + b) لتحديد ترتيب العمليات
  • والأقواس () في العبارة: print(x, y, z) لتحديد عوامل الفعل: أي: المتغيرات التي نمررها له
  • والأقواس () في العبارة: (10, 20, 30) لتحديد صف من الأرقام

ومن الحروف المعاملات، نحو: + و * و / و ** و ==

فمثلاً: معامل الجمع + يفسَّر بحسب السياق: x + y

  • فإن كان x = 5 و y = 10 فهما من نوع الرقم (number) فهي للجمع
  • فإن كان x = "Ahmad" و y = "Belal" فهما من نوع النص (str) فهي للدمج بينهما
  • فإن كان x = 5 و y = "Belal" فهما من نوع الرقم و النص فليسَ بمعرَّف

1.3 الأنواع والأفعال المبنية

ومن الأنواع والأفعال ما هو مبنيُّ في لغة بايثون:

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

  • الرقم: int, float, complex للحساب
  • النص: str للتعامل مع الكلام المكتوب
  • الجمع: list, tuple, range, set, dict لغير المفرد

graph RL
    A[الأنواع المبنية] --> B[الرقم <br> number]
    A --> C[النص <br> str]
    B --> E[صحيح <br> int]
    B --> F[عشري <br> float]
    B --> G[مركب <br> complex]
    A --> D[الجمع <br> collection]
    D --> H[قائمة <br> list]
    D --> I[صف <br> tuple]
    D --> J[نطاق <br> range]
    D --> K[مجموعة <br> set]
    D --> L[قاموس <br> dict]

وسيأتي تفصيلها في أبوابها إن شاء الله.

الأفعال المبنية مثل: print, sum, max, min, len

الفعل Function
الطباعة print
الجمع sum
الأكبر max
الأصغر min
الطول len
إدخال input
نوع type
أي any
كل all
التالي next
تطبيق map
تجميع zip
تقريب round

وغيرها كثير لا يفيد حصره هنا. ولا تزال اللغة تتطوَّر ويُزادُ فيها من هذه الأنواع والأفعال.

1.4 نمو اللغة

ومن خواص لغة البرمجة: إنشاء مركبات لغوية جديدة، وذلك بشيئين:

  1. تعريف أنواع جديدة؛ بجملة class
  2. تعريف أفعال جديدة؛ بجملة def

فأضاف مطوروا بايثون أنفسهم إلى اللغة ما يسمى بالمكتبة الأساسية، ومن أقسامها:

  • وحدة math التي تضم مجموعة أفعال تعنى بالعمليات الرياضية على الأعداد
  • وحدة statistics التي تضم مجموعة أفعال تعنى بالإحصاء
  • وحدة datetime التي تضم مجموعة أنواع وأفعال تعنى بالوقت والتاريخ

المكتبة الأساسية

في هذا المثال نعرف نقطتين ثم نحسب المسافة بينهما. والمسافة الإقليدية بين نقطتين \((x_1, y_1)\) و \((x_2, y_2)\) تتبع معادلة فيثاغورس:

\[ \text{distance} = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2} \]

القطعة:

import math

x1, y1 = 0, 0
x2, y2 = 3, 4
distance = math.sqrt((x2 - x1)**2 + (y2 - y1)**2)
print(distance)
5.0

تفصيل هذه القطعة كالتالي:

  • جملة استيراد المكتبة الرياضية: import math
  • تعيين النقطتين: x1, y1 = 0, 0 و x2, y2 = 3, 4
  • حساب المسافة: distance = math.sqrt((x2 - x1)**2 + (y2 - y1)**2) وفيه:
    • x2 - x1 هو الفرق بين الإحداثيات السينية
    • y2 - y1 هو الفرق بين الإحداثيات الصادية
    • ** هي عملية تربيع العدد
    • math.sqrt هي فعل حساب الجذر التربيعي
  • طباعة النتيجة: print(distance) وفيه:

المكتبات المساهمة

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

على سبيل المثال، تختص حزمة pandas المتخصصة في تفكيك وتركيب الجداول والتحليلات الإحصائية عليها؛ فهي أقوى من أي نسخة من إكسل (Excel) أو غيره.

لتثبيتها نستعمل pip هكذا في سطر الأوامر (النافذة السوداء):

pip install pandas

ثم نستعملها بعد جملة الاستيراد، لنجرب عملية الضربالنقطي بين مصفوفتين:

import pandas as pd

df = pd.read_csv('../../datasets/students.csv')
df
Name Age Grade Gender
0 Mohammed 19 88 M
1 Abdullah 20 95 M
2 Ahmed 21 87 M
3 Khalid 19 92 M
4 Sara 20 94 F
5 Fatima 22 89 F
6 Omar 21 91 M
7 Norah 20 93 F
8 Turki 19 86 M
9 Reem 21 90 F

ثم لعرض ملخصات إحصائية:

df.describe(include=['number'])
Age Grade
count 10.000000 10.00000
mean 20.200000 90.50000
std 1.032796 3.02765
min 19.000000 86.00000
25% 19.250000 88.25000
50% 20.000000 90.50000
75% 21.000000 92.75000
max 22.000000 95.00000

أو تصوير البيانات:

df['Gender'].value_counts().plot(kind='barh', color='skyblue', figsize=(4, 3))

هكذا بكل بساطة.

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

ومن مكامن القوة في لغة بايثون: أنها متوافقة مع لغتي C/C++ إذْ يُمكن كتابة برمجيات عالية الأداء والكفاءة بهما مستفيدين من الحزم الموجودة فيهما، ثم توفيق ذلك ليكون كمكتبة في لغة بايثون.

فالمجتمعات البرمجية في بايثون كثيرة ومتعددة في اهتماماتها. منها على سبيل المثال:

  • تطوير مواقع الشبكة:
    • Django - لبناء مواقع متصلة بقواعد بيانات
    • FastAPI - حديث وسريع لبناء واجهات برمجية على الشبكة
  • الذكاء الاصطناعي وتعلم الآلة:
    • statsmodels - للنماذج الإحصائية
    • scikit-learn - لاكتشاف الأنماط والتنبؤ (تعلم الآلة)
    • PyTorch - لبناء نماذج التعلم العميق
  • تصوير البيانات:
    • seaborn - تصور البيانات الإحصائية على أساس Matplotlib.
    • matplotlib - مكتبة شاملة لإنشاء تصورات ثابتة ومتحركة وتفاعلية.
  • التحليل الرياضي والهندسة:
    • sympy - للرياضيات الرمزية.
    • PySR - الانحدار الرمزي.
    • SciPy - للرياضيات والعلوم والهندسة.