1.1المتغيرات والأنواع والمعاملات
الأساسي في 30 ثانية
- المتغير = لافتة على كائن : age = 30 — يستنتج Python النوع (int وfloat وstr وbool)، و= تنسخ اللافتة وليس الكائن دائما.
- تنميط صارم : حوّل صراحة : "3" + 4 مرفوض — مرر عبر int() وfloat() وstr()، وحوّل نص input() قبل أي حساب.
- = تُسند و== تقارن وis تشخّص : / يعطي عشريا، و// حاصل القسمة الصحيح، و% الباقي، و** الأس.
حالة مستمرة — نبيل، محلل بيانات مبتدئ في الجزائر
نبيل، محلل بيانات مبتدئ في الجزائر، يُحضّر تنظيف معطيات استقصاء : يخزّن اسم المجيب وعمره وطوله في متغيرات واضحة، ثم يحسب سنة الميلاد انطلاقا من عمر مدخل. ولاستعجاله، كتب print("J'ai " + age) وجمع النص الذي تردّه input() مع عدد : TypeError ثم مجموع خاطئ. فصحح بسلسلة منسقة (f-string) وبـ int() : فصار العمر عددا حقيقيا، وظهر التقرير صحيحا. وفي الإضافة، اكتشف أن a = b = [] تتشارك قائمة واحدة — فصار لزاما عليه النسخ من الآن بـ list().
تعود هذه الحالة نفسها في الدرس والمخطط والنص الجاهز وتحدي 48 ساعة — وتستمر في 1.2 و1.3 و1.4 و1.5.
1. المتغيرات-اللافتات والأنواع
المتغير (variable) لافتة توضع على قيمة : age = 30 تلصق لافتة « age » على الكائن 30. ويعتمد Python التنميط الديناميكي (typage dynamique) (دون إعلان مسبق) لكن الصارم : "3" + 4 يثير خطأ بدلا من التحويل بصمت. أربعة أنواع أساسية : int (صحيح)، وfloat (عشري)، وstr (نص، غير قابل للتعديل)، وbool (True/False، يقود الشروط). تكشف type() النوع ؛ وسمِّ بصيغة snake_case الصريحة (age_repondant بدلا من x).
يخزّن نبيل nom = "ياسمين" وage = 30 وtaille = 1.70 : لافتات تقول ما تحمله، تُقرأ دون جهد حين يطلب الرئيس التقرير.
2. التحويلات وinput() والمعاملات
نغيّر النوع صراحة : int("30") وfloat("3.5") وstr(30). وحاسم : تردّ input() النص دائما — فحوّل بـ int() أو float() قبل الحساب. المعاملات : / يقسم إلى عشري (7/2 = 3.5)، و// حاصل صحيح (3)، و% باقٍ (7%2 = 1)، و** أس. و= تُسند بينما == تقارن (is تختبر الهوية) : فالخلط بينهما في اختبار هو الخطأ رقم 1.
يستبدل نبيل جمعه الخاطئ بـ f"J'ai {age} ans" ويحوّل المدخل بـ int(input(...)) : فتصير سنة الميلاد صحيحة ويختفي خطأ النوع.
🔎 مثال ملموس — 🔎 مثال ملموس — فخ اللافتتين
لِفهم الإسناد، كما فعل نبيل مع قوائمه.
a = []
b = a # نفس الكائن !
a.append(1)
print(b) # [1] : قائمة واحدة
b = a.copy() # نسخة مستقلة حقيقية
print("3" + str(4)) # "34" : تحويل صريح
print(7 // 2, 7 % 2, 2 ** 10) # 3 1 1024
القراءة : = تنسخ اللافتة وليس الكائن — و.copy() تنشئ قائمة مستقلة ؛ وstr() تجعل الدمج ممكنا.
الدرس : تختبر is الهوية، و== المساواة ؛ ولكل من // و% و** دوره.
مفردات القسم
- المتغير
- اسم يشير إلى قيمة في الذاكرة (لافتة على كائن). الإسناد بـ = : ma_var = valeur.
مثال بسيط: الاسم والعمر اللذان خزّنهما نبيل لاستقصائه.
ما ليس كذلك: صندوق يحوي نسخة عند كل إسناد.
رد فعل: فكّر لافتة، وسمِّ بصيغة snake_case الصريحة.
- int / float
- أعداد صحيحة (int : 30) وعشرية (float : 3.14). تعطي القسمة / عشريا دائما ؛ وتعطي // حاصل القسمة الصحيح.
مثال بسيط: العمر (int) والطول (float) لمجيبي نبيل.
ما ليس كذلك: انتظار 3 من 10 / 3 (فهي 3.333 عشري).
رد فعل: / للحقيقي، و// للحاصل، و% للباقي.
- str (سلسلة)
- نص بين علامتي تنصيص مفردتين أو مزدوجتين : "مرحبا". غير قابل للتعديل ؛ ويُجمع بالسلاسل المنسقة (f-strings).
مثال بسيط: اسم المجيب الذي عرضه نبيل بسلسلة منسقة.
ما ليس كذلك: جمع "3" + 4 دون تحويل.
رد فعل: نص + عدد = حوّل أولا (أو سلسلة منسقة).
- bool
- منطقي : True أو False. نتيجة المقارنات، وأساس شروط الفصل التالي.
مثال بسيط: مajeur = age >= 18 التي حسبها نبيل (بالغ = العمر >= 18).
ما ليس كذلك: الخلط بين = (إسناد) و== (مقارنة).
رد فعل: = تُسند و== تقارن وis تشخّص.
- التحويل (casting)
- تغيير النوع صراحة : int("30") تعطي 30 ؛ وstr(30) تعطي "30". لا غنى عنه لأن input() تردّ النص دائما.
مثال بسيط: العمر المدخل الذي حوّله نبيل بـ int().
ما ليس كذلك: الحساب مباشرة على نص input().
رد فعل: input() = نص : int() أو float() قبل الحساب.
في التطبيق — تطبيقيا — تناول المتغيرات والأنواع والتحويلات
- أنشئ متغيرات من كل نوع : nom = "Ada" وage = 30 وtaille = 1.70 وmajeur = True. اعرض كلا بـ print() ونوعه بـ type(variable).
- جرّب المعاملات : 7 // 2 (قسمة صحيحة)، و7 % 2 (باقٍ/باقي القسمة)، و2 ** 10 (أس). توقع النتيجة قبل التنفيذ.
- أثِر الخطأ الكلاسيكي : print("J'ai " + age) ← TypeError. صحح بسلسلة منسقة : print(f"J'ai {age} ans").
- اطلب العمر بـ input()، وحوّله إلى عدد (int(...)) واحسب سنة الميلاد : لاحظ لماذا التحويل لا غنى عنه.
نص جاهز للنطق — برّر التحويل الصريح (30 ث)
« تردّ input() النص دائما، لذلك أحوّل بـ int() قبل الحساب : وإلا جمعنا نصا وعددا فيتعطل — أو worse يعطي نتيجة خاطئة. فالتحويل الصريح يجعل القصد مرئيا والحساب موثوقا. »
يُقال في مراجعة الشيفرة ؛ واعرض TypeError قبل/بعد.
نموذج نسخ ولصق — متغيرات وسلسلة منسقة وتحويل input()
nom = "نبيل"
age = 30
taille = 1.70
majeur = age >= 18
print(f"{nom} عمره {age} سنة، بالغ : {majeur}")
print(type(taille)) #
age_saisi = int(input("العمر ؟ "))
annee_naissance = 2026 - age_saisi
print(f"سنة الميلاد : {annee_naissance}")
print(7 // 2, 7 % 2, 2 ** 10)
استقصاء في الجزائر
كما فعل نبيل : متغيرات مسماة لكل مجيب، وسلسلة منسقة للتقرير — فيقرأ الرئيس جدولا صافيا دون TypeError.
مدخل يُحوَّل
كل input() تمر عبر int() أو float() قبل الحساب : فسنة الميلاد صحيحة والمجموع صحيح.
معاملات مستهدفة
// للحصص الصحيحة، و% للبواقي، و** للإسقاطات — لكل واحد معامله، دون ترقيع.
شك في اسم مستعار
type(obj) أو اختبار is يحسم : فاللافتة تُتحقق ولا تُخمَّن — وانسخ بـ list() عند الحاجة.
✓ ممارسات جيدة
- فكّر لافتة لا صندوقا — وسمِّ بصيغة snake_case الصريحة.
- حوّل صراحة (int/float/str)، وخصوصا نص input().
- ميّز = (تُسند) و== (تقارن) وis (تشخّص).
✗ أخطاء شائعة
- كتابة a = b = [] ثم المفاجأة بأن الاثنين يتحركان معا.
- جمع "3" + 4 دون تحويل (TypeError).
- استعمال = في if بدلا من ==.
النقاط الأساسية
- المتغير اسم يوضع على قيمة (nom = valeur) ؛ ويستنتج Python النوع (ديناميكي) لكنه لا يمزج الأنواع وحده (صارم).
- أربعة أنواع أساسية : int وfloat وstr وbool — تكشف type() وتحوّل int()/str().
- تردّ input() النص دائما : حوّل بـ int() أو float() للحساب.
- معاملات مفيدة : // (قسمة صحيحة) و% (باقي القسمة) و** (أس) ؛ و= تُسند و== تقارن وis تشخّص.
تحدي 48 ساعة — طبّق غدا
استعد أحد سكربتاتك (النموذج أعلاه) : حوّل كل input() إلى int()/float()، واستبدل كل جمع + بين نص وعدد بسلسلة منسقة، وأعد تسمية متغير غامض بصيغة snake_case. نفّذ وتحقق من العرض. تكفي 20 دقيقة.
- أستطيع شرح اللافتة والتنميط الصارم والتحويل الصريح.
- أحوّل input() إلى عدد قبل أي حساب.
- أختار // و% و** دون تردد، وأميّز = من ==.
أسئلة شائعة
لماذا تعطي 10 / 3 النتيجة 3.333 وليس 3 ؟
في Python 3 يجري المعامل / قسمة « حقيقية » دائما ويردّ عشريا. وللحصول على حاصل القسمة الصحيح (3) استعمل القسمة الصحيحة // ؛ وللباقي باقي القسمة %. وهو خيار مقصود في اللغة : القسمة المضبوطة افتراضيا، والصحيح بطلب صريح.
ما الفرق بين = و== ؟
فـ = واحدة تُسند قيمة إلى متغير (x = 5). و== المزدوجة تقارن قيمتين وتردّ True أو False (x == 5). والخلط بينهما خطأ شائع جدا في البداية — وis تختبر الهوية (الكائن نفسه) وليس المساواة فقط.
ماذا تردّ الدالة input() دائما ؟