المتغيّر: اسم يشير إلى قيمة
name = "براء"
age = 25
height = 1.75
is_student = True
print(name, age, height, is_student)
= هنا ليست "يساوي" الرياضية، بل إسناد: "اجعل الاسم age يشير إلى القيمة 25". لا كلمة خاصة للتعريف ولا نوع تكتبه: بايثون تعرف أن 25 عدد صحيح وأن "براء" نص من القيمة نفسها.
والاسم يستطيع لاحقًا أن يشير لقيمة أخرى، حتى من نوع مختلف:
score = 90
score = score + 5 # 95: احسب الطرف الأيمن أولًا، ثم أعد الإسناد
score = "ممتاز" # مسموح: الاسم صار يشير إلى نص
print(score)
هذا ما يُسمّى الكتابة الديناميكية (Dynamic Typing): النوع للقيمة لا للاسم. مريح، لكن مسؤوليتك ألّا تجعل المتغيّر نفسه رقمًا مرة ونصًّا مرة في برنامج حقيقي؛ هكذا تنشأ أخطاء يصعب تتبّعها.
إسناد عدّة متغيّرات
x, y = 10, 20 # كل اسم يأخذ القيمة المقابلة
a = b = 0 # اسمان لنفس القيمة
x, y = y, x # تبديل بلا متغيّر مؤقّت
print(x, y, a, b) # 20 10 0 0
التفكيك (Unpacking) أداة تستخدمها كثيرًا؛ تفاصيلها في درس enumerate وzip والتفكيك.
قواعد الأسماء
- حروف وأرقام و
_فقط، ولا يبدأ برقم:total_2صحيح،2totalخطأ. - حسّاس لحالة الأحرف:
Ageوageمتغيّران مختلفان. - لا كلمات محجوزة مثل
ifوforوclassوTrue. - العُرف في بايثون snake_case:
user_nameوtotal_price، لاuserName. - الثوابت بأحرف كبيرة:
MAX_USERS = 100. بايثون لا تمنع تغييرها، لكن الاسم يقول للقارئ "لا تلمسني".
لا تستخدم أسماء الدوال الجاهزة
list = [1, 2, 3] # ⚠️ غطّيت الدالة list الأصلية
# list("abc") ← TypeError: 'list' object is not callable
del list # أعد الاسم الأصلي
print(list("abc")) # ['a', 'b', 'c']
list وstr وsum وmax وinput وid ليست محجوزة، فتقبل بايثون استخدامها كأسماء، ثم يتعطّل كل كود يستخدم الدالة الأصلية بعدها بخطأ غامض. اختر numbers أو names أو total.
أنواع البيانات الأساسية
| النوع | المعنى | أمثلة |
|---|---|---|
int | عدد صحيح، بلا حدّ للحجم | 25، -3، 1_000_000 |
float | عدد عشري | 1.75، 0.5، 2e3 (= 2000.0) |
str | نص | "مرحبًا"، 'Python' |
bool | منطقي | True، False |
None | "لا قيمة" | None |
وأنواع تجمع عدّة قيم، لكل منها درسه: القوائم list، والصفوف tuple، والمجموعات set، والقواميس dict.
اعرف النوع
print(type(25)) # <class 'int'>
print(type(3.14)) # <class 'float'>
print(type("مرحبا")) # <class 'str'>
print(type(True)) # <class 'bool'>
print(type(None)) # <class 'NoneType'>
age = 25
print(isinstance(age, int)) # True: الطريقة المفضّلة للفحص داخل الكود
الأعداد
big = 2 ** 100
print(big) # 1267650600228229401496703205376
print(10 / 2) # 5.0: القسمة / تعيد float دائمًا
print(10 // 3) # 3: قسمة صحيحة
print(0.1 + 0.2) # 0.30000000000000004
intفي بايثون لا يطفح: يكبر بقدر ما تحتاج، على عكس لغات كثيرة.floatتقريبي، لأن الكسور تُخزَّن بالنظام الثنائي. لا تقارن0.1 + 0.2 == 0.3(تعطيFalse)، واستخدمroundأوmath.isclose. وللمال، الوحدةdecimal.
العمليات الحسابية كلها في درس العوامل.
القيم المنطقية والصواب الضمني
True وFalse بحرف كبير في أولهما. وكل قيمة في بايثون لها "صواب ضمني" حين توضع في if:
for value in [0, 0.0, "", [], {}, None, False, 1, "0", [0], " "]:
print(repr(value), "→", bool(value))
القيم الخاطئة محدودة: الصفر، والنص الفارغ، والمجموعات الفارغة، وNone، وFalse. كل ما عداها صحيح، بما فيه النص "0" والنص " " (فيه مسافة). لهذا تكتب if name: بدل if name != "":.
None: غياب القيمة
result = None # لا نتيجة بعد
if result is None:
print("لم يُحسب شيء")
تُستخدم لتقول "لا يوجد" (مستخدم غير مسجّل، بحث بلا نتيجة)، وهي ما تعيده أي دالة لا تكتب return (درس الدوال). افحصها بـ is None لا == None.
التحويل بين الأنواع (Casting)
x = "100"
y = int(x) # نص → عدد صحيح
print(y + 5) # 105
price = float("19.99") # نص → عشري
age_text = str(25) # عدد → نص
print(price, age_text + " سنة")
print(int(3.99)) # 3: يقطع الكسر لا يقرّب
print(int(" 42 ")) # 42: المسافات الطرفية مقبولة
print(round(3.7)) # 4
كل ما يكتبه المستخدم بـ input() يصلك نصًّا حتى لو كان أرقامًا (درس الإدخال والإخراج)، فالتحويل خطوة ستكتبها كثيرًا.
مفاجآت التحويل
print(round(2.5), round(3.5)) # 2 4: التقريب لأقرب زوجي!
print(int(float("3.5"))) # 3: int("3.5") مباشرة ترمي ValueError
print(bool("False")) # True: نص غير فارغ
roundيقرّب الأنصاف إلى أقرب عدد زوجي (تقريب المصرفيين)، فيقلّل الانحياز في المجاميع الكبيرة. إن أردت التقريب التقليدي، فالوحدةdecimal.int("3.5")ترميValueError؛ حوّل إلىfloatأولًا.bool("False")تعطيTrue، لأن أي نص غير فارغ صحيح. لتحويل نص "نعم/لا" إلى منطقي، قارن صراحة:answer.lower() == "true".
والنص الذي لا يمثّل رقمًا (int("abc")) يرمي ValueError، وتتعامل معه بـ try/except (درس معالجة الأخطاء).
جرّب بنفسك
📥 المدخلات (input) — قيمة في كل سطر
أخطاء شائعة
- جمع نص ورقم:
"عمري " + 25يرميTypeError. استخدمstr(25)أو f-string:f"عمري {age}". - حساب على قيمة
input()مباشرة:"5" * 2تعطي"55". حوّل بـint()أولًا. trueوfalseوnoneبأحرف صغيرة:NameError. الصحيحTrueوFalseوNone.- تغطية دالة جاهزة بمتغيّر اسمه
listأوstrأوsum. - مقارنة أعداد عشرية بـ
==: استخدمmath.isclose. if x == None: يعمل غالبًا، لكنis Noneهي الصحيحة.
🎯 التالي: العوامل (Operators): الحساب والمقارنة والمنطق.