الفصل الثالث: أساسيات البرمجة بلغة بايثون
مقدمة الفصل
في هذا الفصل، سندخل إلى قلب اللغة نفسها ونضع حجر الأساس الذي ستبني عليه كل معرفتك القادمة. سنتعلم القواعد الأساسية لكتابة الأكواد، وكيفية التعامل مع البيانات، وتنفيذ العمليات الأساسية.
ما هي “البنية” (أو Syntax) في البرمجة؟
في أي لغة، هناك قواعد نحوية تحدد كيف نركب الكلمات لنكون جمل صحيحة و مفهومة. تسمى هذه القواعد بالبنية (Syntax) و هي في البرمجة مجموعة القواعد التي تحدد كيف يجب كتابة الأكواد بشكل صحيح. إذا خالفت هذه القواعد، فلن يفهم الحاسوب ما تريد، و لن يشتغل برنامجك وسيظهر لك خطأ بنائي (Syntax Error).
1. التعليقات: ملاحظات داخل الكود
التعليق هو ملاحظة تكتبها لنفسك أو للمبرمجين الآخرين داخل الكود لتوضيح ما يفعله جزء معين أو فقط للتذكير. مترجم بايثون يتجاهل التعليقات تمامًا ولا يقوم بتنفيذها كما لو أنها ليست موجودة. تبدأ التعليقات في بايثون برمز المربع (#
). مثلا:
# هذا تعليق. سيتم تجاهله بالكامل.
# أستخدم التعليقات لتذكير نفسي بوظيفة الكود.
إذا قمت بتنفيذ هذا الكود سوف ترى أن لا شيء يحدث!
عادة برمجية جيدة: عود نفسك على كتابة تعليقات واضحة. هذا شيء اختياري وراجع لك لكنه مهم أكثر مما تعتقد في المشاريع الكبيرة لذلك يجب عليك الإعتياد من البداية.
2. أول أمر تكتبه: الطباعة على الشاشة (بواسطة دالة print
)
أبسط مهمة يمكنك أن تقوم بها في البرمجة هي عرض نص على الشاشة. نستخدم لهذا الغرض دالة بايثون المدمجة print()
أو بالإنجليزية built-in function . الدالة هي أمر جاهز يؤدي مهمة محددة. ولكي نستخدمها، يجب أن نستدعيها (Call) بذكر اسمها متبوعًا بقوسين. مثلا:
# استدعاء دالة print لطباعة نص على الشاشة
print("أهلاً بك في عالم البرمجة!")
إذا قمت بتشغيل هذا الكود سوف يطبع لك: أهلا بك في عالم البرمجة! على الطرفية أو Terminal
ما نضعه بين القوسين يسمى معامل (Argument). في هذا المثال، قمنا بتمرير نص كمعامل للدالة print
. أو ما يسمى بالإنجليزية ب Passing Arguments
🎯 مشروعنا المصغر: حاسبة تكلفة الرحلة لكي نستوعب المفاهيم جيدا سنقوم ببناء برنامج صغير على مدار هذا الفصل و سنبدأ بالخطوة الأولى وهي طباعة أو عرض رسالة ترحيب للمستعمل:
# الخطوة الأولى في مشروعنا: طباعة رسالة ترحيب
print("--- مرحباً بك في حاسبة تكلفة الرحلة ---")
3. جوهر البرامج: القيم والمتغيرات
كل البرامج، سواء كانت بسيطة أو معقدة، تتعامل مع البيانات. هذه البيانات تسمى القيم (أو Values).
ما هي القيم (Values)؟
القيم هي البيانات أو المواد الخام التي يعمل عليها برنامجك. هذه أمثلة لبعض القيم و أنواعها:
"أحمد"
# هذه قيمة من نوع نص أو String
25 # هذه قيمة من نوع عدد صحيح (Integer)
3.14 # هذه قيمة من نوع عدد عشري (Float)
True # هذه قيمة من نوع منطقي (Boolean)
💡 فكر في القيمة كقطعة خشب أو قطعة حديد في مصنع — لا يمكن بناء أي شيء بدونها!
ما هو المتغير (Variable)؟
أي قيمة يحتاجها برنامجك يجب أن يتم تخزينها مؤقتا في ذاكرة الحاسوب عندما يتم تشغيل البرنامج. لكل مكان في الذاكرة عنوان وبالتالي يمكن الوصول للقيمة المخزنة هناك عن طريق هذا العنوان لكنه صعب التذكر والتعامل معه لأنه عبارة عن عدد كبير، لذلك تم إبتكار مفهوم المتغير في البرمجة و هو ببساطة إسم نعطيه للعنوان بحيث يمكننا تذكره بسهولة (هذا ليس شيئا معقدا لأن بايثون تتكفل بذلك وليس أنت مباشرة).
المتغير ليس هو القيمة نفسها، بل هو اسم تختاره ليمثل مكانًا في ذاكرة الحاسوب حيث يتم تخزين القيمة. أنت تختار الاسم فقط و تعطيه القيمة التي يجب تخزينها و بايثون تتكفل بذلك.
الصيغة الأساسية لإنشاء متغير بسيطة جدا و هي:
اسم_المتغير = القيمة
، مثلا:
# age هو المتغير، و 27 هي القيمة
age = 27
# message هو المتغير، و "انطلق" هي القيمة
message = "انطلق"
في البرمجة هذه العملية تسمى تعريف المتغير أو Variable Definition و عندما نعطيه قيمة معينة نقوم بعملية إسناد القيمة للمتغير أو Variable Assignment.
كما تلاحظ في بايثون نقوم بهاتين العمليتان في نفس الوقت و بسطر واحد.
⚠️ انتبه: في البرمجة، الرمز
=
يسمى عامل الإسناد (Assignment Operator) ويُستخدم لوضع قيمة داخل متغير. أما إذا أردنا المقارنة كما في الرياضيات (مثلا: هل x يساوي 10؟)، فنستخدم الرمز==
. سنتطرق لهذا لاحقًا.
… | القيمة (Value) | المتغير (Variable) |
---|---|---|
ما هو؟ | بيانات فعلية (مثل رقم، نص، إلخ) | اسم للإشارة إلى قيمة مخزنة |
هل يتغير؟ | القيمة نفسها ثابتة (الرقم 5 هو دائمًا 5) | نعم، يمكن تغيير المتغير ليشير إلى قيمة أخرى |
مثال | "سلام" أو 1 |
welcome_message |
الوظيفة | هي البيانات الخام نفسها | تخزين وتسهيل الوصول إلى البيانات |
4. التفاعل مع المستخدم ( عن طريق دالة input
)
في الكثير من البرامج نحتاج إلى التفاعل مع المستخدم. نستخدم لهذا دالة input()
، وهي دالة أخرى توفرها بايثون و تسمح للمستخدم بإدخال بيانات من لوحة المفاتيح.
ملاحظة هامة: دالة input()
تعيد دائمًا القيمة التي أدخلها المستخدم على شكل نص (string)، حتى لو أدخل المستخدم أرقامًا.
🎯 تحديث المشروع: لنسأل المستخدم عن اسمه ووجهته ونخزن الإجابات في متغيرات.
# سؤال المستخدم عن المعلومات وتخزينها
traveler_name = input("ما هو اسمك؟ ")
destination = input("إلى أين وجهتك؟ ")
5. معالجة البيانات
لدينا الآن بيانات، حان الوقت لمعالجتها. معالجة البيانات او data processing تعني ببساطة تطبيق عمليات عليها.
أ. العمليات الحسابية الأساسية
يمكنك إجراء العمليات الحسابية في بايثون بسهولة كما في الآلة الحاسبة.
العملية | الرمز | مثال | الناتج |
---|---|---|---|
الجمع | + |
10 + 3 |
13 |
الطرح | - |
10 - 3 |
7 |
الضرب | * |
10 * 3 |
30 |
القسمة | / |
10 / 3 |
3.333... |
الأس | ** |
10 ** 3 |
1000 |
باقي القسمة | % |
10 % 3 |
1 |
ب. أهمية تحويل الأنواع (Type Casting)
في كثير من الأحيان نحتاج التحويل بين أنواع المتغيرات أو البيانات المختلفة.
من بين الأمثلة الشائعة: دالة input()
تعيد دائما نصًا حتى لو ادخل المستعمل عددا فالدالة تعيده كنص مثلا لو ادخل المستعمل العدد 10 فسيتم إعادته على شكل النص “10”. كيف يمكننا إذن إجراء عملية حسابية على هذا الرقم؟
الحل: يجب أن نحول (أو Cast) النص إلى نوع رقمي باستخدام int()
(لعدد صحيح) أو float()
(لعدد عشري).
🎯 تحديث المشروع: لنسأل عن التكاليف، نحولها إلى أرقام، ثم نحسب المجموع.
# أخذ المدخلات الرقمية (تكون كنصوص في البداية)
ticket_cost_str = input("كم تكلفة تذكرة الطيران؟ ")
hotel_cost_str = input("كم تكلفة الفندق؟ ")
# تحويل النصوص إلى أرقام عشرية (float)
ticket_cost = float(ticket_cost_str)
hotel_cost = float(hotel_cost_str)
# إجراء عملية الجمع
total_cost = ticket_cost + hotel_cost
6. تنسيق النصوص ( Formatting Text)
بعد أن جمعنا البيانات وعالجناها، نحتاج إلى عرض ملخص منظم للمستخدم.
تنسيق المخرجات: طباعة المتغيرات مع النصوص
المشكلة: كيف ندمج قيم متغيراتنا داخل جملة نصية؟
الحل: الطريقة الأفضل والأحدث هي f-string. فقط ضع حرف f
قبل علامة التنصيص: ““، ثم ضع اسم المتغير بين معقوفتين: {}
. مثلا:
# رسالة ترحيب بإسمه:
print(f"{traveler_name} أهلا بك يا")
آذا كان المتغير traveler_name
يحمل القيمة “أحمد” مثلا، فسيتم طباعة أهلا بك يا أحمد على الشاشة.
🎯 المشروع النهائي: حاسبة تكلفة الرحلة لنجمع كل الأجزاء معًا ونطبع الملخص النهائي.
# --- البرنامج الكامل ---
# 1. الترحيب وجمع البيانات:
print("--- مرحباً بك في حاسبة تكلفة الرحلة ---")
traveler_name = input("ما هو اسمك؟ ")
destination = input("إلى أين وجهتك؟ ")
# 2. رسالة ترحيب مخصصة:
print(f"{traveler_name} أهلاً بك يا")
print(f"!لنحسب تكلفة رحلتك")
print("-" * 40) # طباعة خط فاصل للترتيب
# 3. جمع التكاليف وتحويل بين الأنواع:
ticket_cost_str = input("كم تكلفة تذكرة الطيران؟ ")
hotel_cost_str = input("كم تكلفة الفندق؟ ")
ticket_cost = float(ticket_cost_str)
hotel_cost = float(hotel_cost_str)
# 4. إجراء الحسابات:
total_cost = ticket_cost + hotel_cost
# 5. عرض الملخص النهائي باستخدام f-string
print("\n--- ملخص رحلتك ---")
print(f"الوجهة: {destination}")
print(f"التكلفة الإجمالية للرحلة: ${total_cost:.2f}") # .2f تعني عرض رقمين فقط بعد الفاصلة
طرق أخرى لتنسيق النصوص (للمعرفة)
قد تصادف هذه الطرق في الأكواد القديمة، ومن الجيد معرفتها:
- دمج المتغيرات في النصوص باستخدام
+
، مثلا:
print( traveler_name + "مرحباً يا ")
هذه الطريقة تعمل فقط مع النصوص.
- استخدام دالة
.format()
، مثلا:
print("مرحباً يا {}, وجهتك هي {}".format(traveler_name, destination))
- الطباعة باستخدام الفاصلة
,
:
print("مرحباً يا", traveler_name)`
# (بايثون تضيف مسافة تلقائياً).
7. خيارات متقدمة لدالة print()
-
تغيير الفاصل الافتراضي (
sep
):print("أحمد", "علي", "سالم", sep=" - ")
الناتج:أحمد - علي - سالم
-
تغيير نهاية السطر (
end
):print("الجزء الأول...", end=" ")
print("الجزء الثاني.")
الناتج:الجزء الأول... الجزء الثاني.
تمارين تطبيقية
التمرين 1: طباعة منسقة
المطلوب: اكتب كودًا يستخدم دالة print()
مرة واحدة فقط لطباعة السطر التالي تمامًا كما هو، باستخدام المعامل sep
.
الناتج المطلوب:
Python-is-fun
الحل:
# نستخدم المعامل sep لتحديد "-" كفاصل بين القيم
print("Python", "is", "fun", sep="-")
التمرين 2: محول الدقائق
المطلوب: اكتب برنامجًا يسأل المستخدم عن عدد إجمالي من الدقائق، ثم يقوم البرنامج بتحويلها إلى ساعات ودقائق متبقية. على سبيل المثال، إذا أدخل المستخدم 140
، يجب أن يكون الناتج “140 دقيقة تساوي 2 ساعة و 20 دقيقة”.
الحل:
# سؤال المستخدم عن عدد الدقائق
minutes_str = input("أدخل العدد الإجمالي للدقائق: ")
# تحويل المدخل إلى عدد صحيح
total_minutes = int(minutes_str)
# حساب الساعات (باستخدام القسمة الصحيحة //)
hours = total_minutes // 60
# حساب الدقائق المتبقية (باستخدام باقي القسمة %)
remaining_minutes = total_minutes % 60
# طباعة الناتج باستخدام f-string
print(f"{total_minutes} دقيقة تساوي {hours} ساعة و {remaining_minutes} دقيقة.")
التمرين 3: حاسبة مساحة المربع
المطلوب: اكتب برنامجًا يسأل المستخدم عن طول ضلع مربع. ثم يقوم البرنامج بحساب مساحة المربع (الضلع²
) باستخدام عامل الأس (**
) ويطبع الناتج.
الحل:
# سؤال المستخدم عن طول الضلع
side_length_str = input("أدخل طول ضلع المربع: ")
# تحويل القيمة إلى عدد عشري
side_length = float(side_length_str)
# حساب المساحة باستخدام عامل الأس **
area = side_length ** 2
# طباعة الناتج
print(f"مساحة المربع الذي طول ضلعه {side_length} هي {area}.")
التمرين 4: مولد رمز المنتج
المطلوب: اكتب برنامجًا يسأل المستخدم عن اسم منتج (نص) ورقمه التعريفي (رقم). قم بإنشاء رمز للمنتج عن طريق دمج الاسم مع الرقم وبينهما شرطة، باستخدام عملية الدمج +
فقط. (مثال: “Screen” و 101
يصبح “Screen-101”).
الحل:
# أخذ المدخلات من المستخدم
product_name = input("أدخل اسم المنتج: ")
product_id_str = input("أدخل الرقم التعريفي للمنتج: ")
# تحويل الرقم التعريفي إلى نص لاستخدام عملية الدمج
product_id_as_str = str(product_id_str)
# دمج النصوص باستخدام +
product_code = product_name + "-" + product_id_as_str
print(f"رمز المنتج هو: {product_code}")
التمرين 5: استخدام .format()
مع الفهرسة
المطلوب: اكتب برنامجًا يسأل المستخدم عن اسمه الأول واسم عائلته. باستخدام دالة .format()
والفهرسة ({0}
و {1}
)، اطبع الجملة التالية: “عائلتك هي [اسم العائلة] واسمك الأول هو [الاسم الأول]”.
الحل:
# سؤال المستخدم
first_name = input("أدخل اسمك الأول: ")
last_name = input("أدخل اسم عائلتك: ")
# استخدام .format() مع تحديد ترتيب المتغيرات بالفهرس
output_sentence = "عائلتك هي {1} واسمك الأول هو {0}.".format(first_name, last_name)
print(output_sentence)
التمرين 6: حاسبة فاتورة المطعم
المطلوب: اكتب برنامجًا يسأل المستخدم عن إجمالي الفاتورة. قم بحساب قيمة الإكرامية (بقشيش) بنسبة 18% من قيمة الفاتورة. ثم اطبع قيمة الفاتورة، وقيمة الإكرامية، والإجمالي النهائي، مع تنسيق جميع الأرقام لتظهر برقمين فقط بعد الفاصلة العشرية.
الحل:
# سؤال المستخدم عن إجمالي الفاتورة
bill_total_str = input("أدخل إجمالي قيمة الفاتورة: ")
# تحويل القيمة إلى عدد عشري
bill_total = float(bill_total_str)
# حساب الإكرامية (18%)
tip_amount = bill_total * 0.18
# حساب الإجمالي النهائي
final_total = bill_total + tip_amount
# طباعة النتائج منسقة
print("\n--- تفاصيل الفاتورة ---")
print(f"المبلغ الأساسي: ${bill_total:.2f}")
print(f"قيمة الإكرامية (18%): ${tip_amount:.2f}")
print(f"الإجمالي للدفع: ${final_total:.2f}")
التمرين 7: توزيع المهام
المطلوب: اكتب برنامجًا لتوزيع عدد من المهام بالتساوي على فريق من الموظفين. اسأل المستخدم عن عدد المهام الكلي وعدد الموظفين. اطبع عدد المهام التي سيحصل عليها كل موظف، وعدد المهام المتبقية التي لا يمكن توزيعها بالتساوي.
الحل:
# أخذ المدخلات
total_tasks_str = input("أدخل العدد الكلي للمهام: ")
num_employees_str = input("أدخل عدد الموظفين: ")
# تحويل المدخلات إلى أرقام صحيحة
total_tasks = int(total_tasks_str)
num_employees = int(num_employees_str)
# حساب المهام لكل موظف (قسمة صحيحة)
tasks_per_employee = total_tasks // num_employees
# حساب المهام المتبقية (باقي القسمة)
remaining_tasks = total_tasks % num_employees
# طباعة النتائج
print(f"سيحصل كل موظف على {tasks_per_employee} مهمة.")
print(f"عدد المهام المتبقية هو {remaining_tasks} مهمة.")
التمرين 8: طباعة بدون سطر جديد
المطلوب: اكتب برنامجًا يطبع الأرقام من 1 إلى 3 على نفس السطر، مفصولة بفاصلة ومسافة، باستخدام ثلاث جمل print()
منفصلة والمعامل end
.
الناتج المطلوب:
1, 2, 3
الحل:
print("1", end=", ")
print("2", end=", ")
print("3")
التمرين 9: حاسبة الطاقة
المطلوب: اكتب برنامجًا يحسب الطاقة (E) بناءً على معادلة أينشتاين الشهيرة $E=mc^2$. اسأل المستخدم عن الكتلة (m) بالكيلوجرام. استخدم قيمة ثابتة لسرعة الضوء (c) وهي 299792458
متر/ثانية. اطبع الناتج.
الحل:
# تعريف ثابت سرعة الضوء
SPEED_OF_LIGHT = 299792458 # c
# سؤال المستخدم عن الكتلة
mass_str = input("أدخل قيمة الكتلة (m) بالكيلوجرام: ")
# تحويل الكتلة إلى عدد عشري
mass = float(mass_str)
# حساب الطاقة باستخدام المعادلة وعامل الأس **
energy = mass * (SPEED_OF_LIGHT ** 2) # E = mc^2
# طباعة الناتج النهائي
print(f"كمية الطاقة (E) الناتجة هي: {energy} جول.")
التمرين 10: مولد شعار الشركة
المطلوب: اكتب برنامجًا يسأل المستخدم عن اسم شركته وسنة تأسيسها. قم بإنشاء شعار (Slogan) للشركة بالصيغة التالية: “[اسم الشركة] - نخدمكم منذ عام [سنة التأسيس]”. اطبع هذا الشعار.
الحل:
# سؤال المستخدم عن اسم الشركة وسنة التأسيس
company_name = input("ما هو اسم شركتك؟ ")
foundation_year = input("في أي عام تأسست الشركة؟ ")
# إنشاء الشعار باستخدام f-string
slogan = f"{company_name} - نخدمكم منذ عام {foundation_year}."
# طباعة الشعار
print("\n--- شعار شركتكم المقترح ---")
print(slogan)
خلاصة الفصل
في هذا الفصل، تعلمت القواعد الأساسية التي لا غنى عنها لأي مبرمج:
- بنية الكود (Syntax): القواعد التي يجب اتباعها لكتابة كود صحيح.
- التعليقات (
#
): أهمية توثيق الكود لمساعدتك ومساعدة الآخرين. - القيم والمتغيرات: كيفية تخزين البيانات في متغيرات للإشارة إلى قيم.
- المدخلات والمخرجات: كيفية التفاعل مع المستخدم باستخدام
input()
وprint()
. - العمليات الأساسية: إجراء العمليات الحسابية وتحويل أنواع البيانات.
- تنسيق النصوص: عرض المخرجات بطريقة منظمة باستخدام
f-string
.