تخطَّ إلى المحتوى

🐍 شرح Python

المتغيرات وأنواع البيانات

الدرس 3 من 29· ⏱ 5 دقائق قراءة· 🗓 آخر تحديث: ١٨ أكتوبر ٢٠٢٦

المتغيّر: اسم يشير إلى قيمة

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): الحساب والمقارنة والمنطق.

شرح المتغيرات وأنواع البيانات — Python بالعربي
المتغيرات وأنواع البيانات — Python بالعربي · The Code Fix

📚 لمزيد من التعمّق في Python، راجِع التوثيق الرسمي لـ Python.

هل كان هذا الدرس مفيدًا؟