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

في الدرس السابق، جعلنا بايثون تُخرج سطر "Hello, World!". لكن إذا كان كل ما يمكننا فعله هو إخراج نص ثابت، لكانت البرمجة مملة. هذا الدرس يقدم المتغيرات — المفهوم الأساسي في البرمجة. فكر فيها كصناديق مُسمّاة للبيانات، تتيح لك تخزين القيم وتعديلها في أي وقت.


1. ما هو المتغير

المتغير هو اسم لقطعة من البيانات. تخيله كصندوق مُسمّى: الملصق له اسم (اسم المتغير)، والصندوق يحتوي على البيانات (القيمة).

PYTHON
# عرّف متغيراً باسم age، يخزن الرقم 18
age = 18

عندما تكتب age = 18، تقوم بايثون بأمرين:

  1. تخصص مساحة في الذاكرة وتخزن الرقم 18.
  2. تعلق الملصق age على تلك المساحة.

منذ ذلك الحين، age يمثل الرقم 18 — يمكنك استخدامه في العمليات الحسابية، الإخراج، أو تعديله:

PYTHON
print(age)       # يُخرج 18
print(age + 5)   # يُخرج 23
age = 20         # غيّر القيمة — محتوى الصندوق يتغير
print(age)       # يُخرج 20
💡 نصيحة: تُسمى "متغيرات" لأن قيمها يمكن أن تتغير. أولاً تضع age = 18، لاحقاً تغيره إلى age = 20. نفس الاسم يمكن أن يشير إلى قيم مختلفة — هذا أمر حاسم في البرمجة.


2. قواعد تسمية المتغيرات

لدى بايثون قواعد صارمة واصطلاحات مجتمعية لأسماء المتغيرات:

يجب اتباعها (وإلا سيحدث خطأ)

القاعدة أمثلة صحيحة أمثلة خاطئة
فقط حروف وأرقام وشرطة سفلية my_name, age2 my-name (الواصلة غير مسموحة)
لا يمكن أن يبدأ برقم name1 1name
لا يمكن أن يكون كلمة مفتاحية my_if if (if كلمة مفتاحية)
حساس لحالة الأحرف name و Name مختلفان

لدى بايثون 35 كلمة مفتاحية (تسمى أيضاً كلمات محجوزة)، مثل if, for, while, import, class, def, return. هذه جزء من بناء جملة بايثون ولا يمكن استخدامها كأسماء متغيرات.

الاصطلاحات الموصى بها (PEP 8)

PEP 8 هو دليل أسلوب بايثون الرسمي، متبع على نطاق واسع في الصناعة:

PYTHON
# أسماء جيدة (واضحة للوهلة الأولى)
total_price = 99.9
student_count = 35

# أسماء سيئة (الغرض غير واضح)
a = 99.9
b = 35
💡 نصيحة: القاعدة الأولى للكود الجيد هي "يمكن للآخرين فهم قصدك بدون تعليقات." تسمية المتغيرات هي الخطوة الأولى. قضاء 5 ثوانٍ على اسم جيد يوفر 5 دقائق لك في المستقبل عند قراءة الكود.


3. أنواع البيانات الأساسية

لدى بايثون 5 أنواع بيانات أساسية شائعة الاستخدام:

اسم النوع اسم بايثون مثال وصف
عدد صحيح int 42, -1, 1000 أعداد كاملة بدون كسور عشرية
عدد عشري float 3.14, -0.5, 2.0 أعداد بكسور عشرية
سلسلة نصية str "Hello", 'Python' نص، محاط بعلامات اقتباس
منطقي bool True, False يمثل صواب/خطأ، بحرف كبير
لا شيء NoneType None يمثل "لا شيء"، بحرف كبير
PYTHON
# عرّف متغيراً لكل نوع
age = 25              # int
price = 19.99         # float
name = "Xiao Ming"    # str
is_student = True     # bool
result = None         # NoneType

print(age)            # يُخرج 25
print(price)          # يُخرج 19.99
print(name)           # يُخرج Xiao Ming
print(is_student)     # يُخرج True
print(result)         # يُخرج None

التحقق من النوع باستخدام type()

إذا كنت غير متأكد من نوع متغير، استخدم type():

PYTHON
print(type(42))        # <class 'int'>
print(type(3.14))      # <class 'float'>
print(type("Hello"))   # <class 'str'>
print(type(True))      # <class 'bool'>
print(type(None))      # <class 'NoneType'>

الكتابة الديناميكية

بايثون هي مكتوبة ديناميكياً — نفس المتغير يمكن أن يحمل أنواعاً مختلفة في أوقات مختلفة:

PYTHON
x = 10         # x عدد صحيح
print(x)       # يُخرج 10
x = "Hello"    # نفس المتغير، الآن سلسلة نصية
print(x)       # يُخرج Hello
x = True       # الآن قيمة منطقية
print(x)       # يُخرج True

هذا غير مسموح به في اللغات المكتوبة بشكل ثابت مثل C++ أو Java — بمجرد التصريح، النوع ثابت. الكتابة الديناميكية توفر مرونة وكوداً موجزاً، لكن تغيير نوع متغير عن طريق الخطأ يمكن أن يسبب أخطاء وقت التشغيل (سنرى أمثلة لاحقاً).

⚠️ ملاحظة: الكتابة الديناميكية مرنة، لكن لا تسيء استخدامها. في المشاريع الحقيقية، احتفظ بمتغير واحد لنوع واحد لتجنب الارتباك.


4. المزيد من ميزات print()

رأينا print() في الدرس 01. إليك حيلتان إضافيتان مفيدتان:

إخراج قيم متعددة بفواصل

PYTHON
name = "Xiao Hong"
age = 22
print("My name is", name, "and I'm", age, "years old")
# يُخرج: My name is Xiao Hong and I'm 22 years old

print() تضيف تلقائياً مسافة بين الوسائط. لتغيير هذا، استخدم المعامل sep:

PYTHON
print("2026", "06", "19", sep="-")
# يُخرج: 2026-06-19

استخدام end للتحكم في نهايات الأسطر

افتراضياً، print() تضيف سطراً جديداً بعد الإخراج. استخدم end لتغيير هذا:

PYTHON
print("First line", end=" → ")
print("Second line", end=" → ")
print("Third line")
# يُخرج: First line → Second line → Third line

5. f-strings: تضمين المتغيرات في السلاسل النصية

لقد رأيت بالفعل f"Hello, {name}" في الأمثلة السابقة. هذا يُسمى f-string (سلسلة مهيأة)، وهي الطريقة الأكثر شيوعاً لتهيئة السلاسل النصية في بايثون. ببساطة: أسبق السلسلة بـ f، ضع المتغيرات داخل {}، وتستبدلها بايثون بقيمها.

PYTHON
name = "Xiao Hong"
age = 22
print(f"My name is {name}, I'm {age} years old.")
# يُخرج: My name is Xiao Hong, I'm 22 years old.

يمكنك وضع ليس فقط أسماء المتغيرات، بل التعبيرات داخل الأقواس المتعرجة:

PYTHON
a = 10
b = 3
print(f"{a} + {b} = {a + b}")   # يُخرج: 10 + 3 = 13
print(f"{a} × {b} = {a * b}")   # يُخرج: 10 × 3 = 30

يمكنك أيضاً التحكم في تنسيق الأرقام:

PYTHON
pi = 3.14159265
print(f"π = {pi}")              # يُخرج: π = 3.14159265
print(f"π ≈ {pi:.2f}")          # يُخرج: π ≈ 3.14 (منزلتان عشريتان)
print(f"π ≈ {pi:.4f}")          # يُخرج: π ≈ 3.1416 (4 منازل عشرية)

# أضف فاصلة الآلاف
big = 1234567
print(f"{big:,}")               # يُخرج: 1,234,567
💡 نصيحة: في :.2f، النقطتان تبدأان محدد التنسيق — . تعني عشري، 2 هو عدد الأرقام، f تعني float. :, تضيف فاصلة الآلاف. لا تقلق بشأن الحفظ — ستكتسبها مع الممارسة.


6. أمثلة

مثال 1: تخزين معلومات شخصية باستخدام المتغيرات (الصعوبة ⭐)

هذا يوضح كيفية تخزين المعلومات الشخصية والإشارة إليها في الإخراج.

PYTHON
# خزّن المعلومات الشخصية في متغيرات
name = "Zhang San"           # سلسلة نصية — نص محاط بعلامات اقتباس
age = 28                     # عدد صحيح — رقم كامل
height = 1.75                # عدد عشري — رقم بكسور عشرية
is_programmer = True         # منطقي — إما True أو False

# استخدم f-strings لتضمين قيم المتغيرات في الإخراج
print(f"Name: {name}")
print(f"Age: {age}")
print(f"Height: {height} m")
print(f"Learning programming: {is_programmer}")

# حقيقة ممتعة — نسبة الطول إلى العمر
print(f"{name}'s height is {height / age:.3f} times their age")
▶ جرّب الكود

المخرجات:

TEXT
Name: Zhang San
Age: 28
Height: 1.75 m
Learning programming: True
Zhang San's height is 0.062 times their age

:.3f في {height / age:.3f} تعني "احتفظ بثلاث منازل عشرية."

مثال 2: عمليات بين المتغيرات (الصعوبة ⭐⭐)

الأنواع المختلفة تدعم عمليات مختلفة. كن على دراية بالقواعد.

PYTHON
# عمليات رقمية
a = 10
b = 3
print(f"{a} + {b} = {a + b}")    # جمع: 13
print(f"{a} - {b} = {a - b}")    # طرح: 7
print(f"{a} * {b} = {a * b}")    # ضرب: 30
print(f"{a} / {b} = {a / b}")    # قسمة: 3.333... (نتيجة float)
print(f"{a} // {b} = {a // b}")  # قسمة أرضية: 3 (الجزء الصحيح فقط)
print(f"{a} % {b} = {a % b}")    # باقي القسمة: 1
print(f"{a}  {b} = {a  b}")  # أس: 10³ = 1000

# دمج السلاسل النصية
first_name = "Zhang"
last_name = "San"
full_name = first_name + last_name   # + يدمج السلاسل النصية
print(f"Full name: {full_name}")

# لا يمكن خلط الأنواع المختلفة
# هذا سيسبب خطأ: لا يمكن إضافة سلسلة ورقم
# result = "Age: " + 25    ← أزل التعليق للتجربة
▶ جرّب الكود

المخرجات:

TEXT
10 + 3 = 13
10 - 3 = 7
10 * 3 = 30
10 / 3 = 3.3333333333333335
10 // 3 = 3
10 % 3 = 1
10 ** 3 = 1000
Full name: Zhang San
⚠️ ملاحظة: + بين الأرقام هو جمع؛ بين السلاسل النصية هو دمج. لكن لا يمكنك استخدام + بين سلسلة نصية ورقم. إذا كنت بحاجة لذلك، حوّل يدوياً: "Age: " + str(25). الدالة str() تحول الأنواع الأخرى إلى سلاسل نصية.

مثال 3: الإسناد المتعدد والتبديل (الصعوبة ⭐⭐⭐)

لدى بايثون بناء جملة موجز لكود أنيق:

PYTHON
# أسند عدة متغيرات في سطر واحد
x, y, z = 10, 20, 30
print(f"x={x}, y={y}, z={z}")   # x=10, y=20, z=30

# بدّل متغيرين — اللغات الأخرى تحتاج متغيراً مؤقتاً
# بايثون تفعلها في سطر واحد
a, b = 5, 10
print(f"Before swap: a={a}, b={b}")

a, b = b, a
print(f"After swap: a={a}, b={b}")

# أسند نفس القيمة لمتغيرات متعددة
p = q = r = 0
print(f"p={p}, q={q}, r={r}")   # p=0, q=0, r=0
▶ جرّب الكود

المخرجات:

TEXT
x=10, y=20, z=30
Before swap: a=5, b=10
After swap: a=10, b=5
p=0, q=0, r=0

a, b = b, a تعمل لأن بايثون تُقيّم جميع التعبيرات على الجانب الأيمن أولاً، ثم تُسندها كلها مرة واحدة.

💡 نصيحة: هذا الأسلوب "البايثوني" يبدو رائعاً، لكن الإفراط في استخدامه يمكن أن يربك المبتدئين. استخدمه باعتدال في مشاريع الفريق.


حالات الاستخدام الشائعة


❓ أسئلة شائعة

س هل = تعني "يساوي"؟ لماذا ليست مثل الرياضيات?
ج في بايثون، = هو عامل الإسناد — يعني "خزّن القيمة على اليمين في المتغير على اليسار." إنه تعليم، وليس إعلان مساواة. للتحقق مما إذا كانت قيمتان متساويتين، استخدم == (علامتا يساوي). واحدة من أكثر أخطاء المبتدئين شيوعاً هي استخدام = بدلاً من == في الشروط. ⚠️ س:هل يمكنني استخدام الحروف الصينية كأسماء متغيرات؟ بايثون 3 تدعمها، أليس كذلك? ج:تقنياً، بايثون 3 تدعم أسماء المتغيرات بالصينية (مثل 姓名 = "Zhang San")، لكنه أمر غير موصى به بشدة. معظم أدوات البرمجة والمكتبات تستخدم أسماء إنجليزية. خلط اللغات يبدو غريباً ويخلق حواجز تواصل في الفرق الدولية. التزم بأسماء المتغيرات الإنجليزية. س:لماذا float غير دقيق؟ لماذا 0.1 + 0.2 يساوي 0.30000000000000004؟ ج:هذا ليس خطأ بايثون — إنه قيد أساسي لكيفية تخزين الحواسيب للأعداد العشرية في النظام الثنائي. تماماً كما لا يمكن للعدد العشري تمثيل 1/3 = 0.333... بدقة، لا يمكن للنظام الثنائي تمثيل 0.1 و 0.2 بدقة. للحسابات الدقيقة (مثل العملات)، استخدم وحدة decimal بدلاً من float. س:ما الفرق بين None و 0 والسلسلة الفارغة ""؟ ج:None تعني "لا شيء" أو "لا توجد قيمة." إنها مختلفة عن 0 و "" و False. 0 هو رقم، "" سلسلة فارغة، False قيمة منطقية خاطئة — كلها "موجودة" لكنها تمثل الفراغ. None تعني أنه لا يوجد وعاء على الإطلاق. فكر في "" كوعاء فارغ، بينما None يعني أنه لا يوجد وعاء.

📖 ملخص

  • المتغيرات هي أسماء للبيانات، تُسند بـ =، ويمكن للقيم أن تتغير في أي وقت
  • أسماء المتغيرات يمكن أن تحتوي فقط على حروف وأرقام وشرطات سفلية؛ لا يمكن أن تبدأ بأرقام أو تكون كلمات مفتاحية
  • أنواع بايثون الأساسية الخمسة: int, float, str, bool, NoneType
  • بايثون مكتوبة ديناميكياً — نفس المتغير يمكن أن يحمل أنواعاً مختلفة، لكن الاتساق موصى به
  • type() تتحقق من نوع بيانات المتغير
  • f-strings تستخدم f"xxx{variable}" لتضمين المتغيرات والتعبيرات في السلاسل النصية

📝 تمارين

  1. أساسي (الصعوبة ⭐): عرّف متغيرات city, temperature, is_sunny لاسم مدينتك، درجة حرارة اليوم (float)، وما إذا كان الجو مشمساً (bool). استخدم print() لإخراج جملة كاملة.

  2. متوسط (الصعوبة ⭐⭐): عرّف متغيرين صحيحين minutes و hours. حوّل hours إلى دقائق، أضف minutes، وأخرج المجموع. مثال: hours=2, minutes=15 يجب أن يُخرج 135 دقيقة. تلميح: 1 ساعة = 60 دقيقة.

  3. تحدي (الصعوبة ⭐⭐⭐): بدون استخدام متغير مؤقت، بدّل ثلاثة متغيرات في إزاحة دائرية: a → b → c → a (a تأخذ القيمة الأصلية لـ b، b تأخذ قيمة c، c تأخذ قيمة a). تلميح: الفكرة الأساسية هي a, b, c = b, c, a.

100%