المتغيرات وأنواع البيانات الأساسية
في الدرس السابق، جعلنا بايثون تُخرج سطر "Hello, World!". لكن إذا كان كل ما يمكننا فعله هو إخراج نص ثابت، لكانت البرمجة مملة. هذا الدرس يقدم المتغيرات — المفهوم الأساسي في البرمجة. فكر فيها كصناديق مُسمّاة للبيانات، تتيح لك تخزين القيم وتعديلها في أي وقت.
1. ما هو المتغير
المتغير هو اسم لقطعة من البيانات. تخيله كصندوق مُسمّى: الملصق له اسم (اسم المتغير)، والصندوق يحتوي على البيانات (القيمة).
# عرّف متغيراً باسم age، يخزن الرقم 18
age = 18
عندما تكتب age = 18، تقوم بايثون بأمرين:
- تخصص مساحة في الذاكرة وتخزن الرقم
18. - تعلق الملصق
ageعلى تلك المساحة.
منذ ذلك الحين، age يمثل الرقم 18 — يمكنك استخدامه في العمليات الحسابية، الإخراج، أو تعديله:
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 هو دليل أسلوب بايثون الرسمي، متبع على نطاق واسع في الصناعة:
- استخدم أحرفاً صغيرة مع شرطات سفلية لأسماء المتغيرات (snake_case):
student_name,total_score، وليسstudentName(camelCase). - استخدم أحرفاً كبيرة للثوابت:
PI = 3.14159,MAX_SIZE = 100(بايثون ليس لديها ثوابت حقيقية؛ الأحرف الكبيرة اصطلاح يعني "من فضلك لا تعدّلني"). - استخدم أسماء ذات معنى:
ageأفضل منa،total_studentsأفضل منts. الكود يُقرأ — الأسماء الجيدة توفر نصف التعليقات.
# أسماء جيدة (واضحة للوهلة الأولى)
total_price = 99.9
student_count = 35
# أسماء سيئة (الغرض غير واضح)
a = 99.9
b = 35
3. أنواع البيانات الأساسية
لدى بايثون 5 أنواع بيانات أساسية شائعة الاستخدام:
| اسم النوع | اسم بايثون | مثال | وصف |
|---|---|---|---|
| عدد صحيح | int |
42, -1, 1000 |
أعداد كاملة بدون كسور عشرية |
| عدد عشري | float |
3.14, -0.5, 2.0 |
أعداد بكسور عشرية |
| سلسلة نصية | str |
"Hello", 'Python' |
نص، محاط بعلامات اقتباس |
| منطقي | bool |
True, False |
يمثل صواب/خطأ، بحرف كبير |
| لا شيء | NoneType |
None |
يمثل "لا شيء"، بحرف كبير |
# عرّف متغيراً لكل نوع
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():
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'>
الكتابة الديناميكية
بايثون هي مكتوبة ديناميكياً — نفس المتغير يمكن أن يحمل أنواعاً مختلفة في أوقات مختلفة:
x = 10 # x عدد صحيح
print(x) # يُخرج 10
x = "Hello" # نفس المتغير، الآن سلسلة نصية
print(x) # يُخرج Hello
x = True # الآن قيمة منطقية
print(x) # يُخرج True
هذا غير مسموح به في اللغات المكتوبة بشكل ثابت مثل C++ أو Java — بمجرد التصريح، النوع ثابت. الكتابة الديناميكية توفر مرونة وكوداً موجزاً، لكن تغيير نوع متغير عن طريق الخطأ يمكن أن يسبب أخطاء وقت التشغيل (سنرى أمثلة لاحقاً).
4. المزيد من ميزات print()
رأينا print() في الدرس 01. إليك حيلتان إضافيتان مفيدتان:
إخراج قيم متعددة بفواصل
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:
print("2026", "06", "19", sep="-")
# يُخرج: 2026-06-19
استخدام end للتحكم في نهايات الأسطر
افتراضياً، print() تضيف سطراً جديداً بعد الإخراج. استخدم end لتغيير هذا:
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، ضع المتغيرات داخل {}، وتستبدلها بايثون بقيمها.
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.
يمكنك وضع ليس فقط أسماء المتغيرات، بل التعبيرات داخل الأقواس المتعرجة:
a = 10
b = 3
print(f"{a} + {b} = {a + b}") # يُخرج: 10 + 3 = 13
print(f"{a} × {b} = {a * b}") # يُخرج: 10 × 3 = 30
يمكنك أيضاً التحكم في تنسيق الأرقام:
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: تخزين معلومات شخصية باستخدام المتغيرات (الصعوبة ⭐)
هذا يوضح كيفية تخزين المعلومات الشخصية والإشارة إليها في الإخراج.
# خزّن المعلومات الشخصية في متغيرات
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")
المخرجات:
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: عمليات بين المتغيرات (الصعوبة ⭐⭐)
الأنواع المختلفة تدعم عمليات مختلفة. كن على دراية بالقواعد.
# عمليات رقمية
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 ← أزل التعليق للتجربة
المخرجات:
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: الإسناد المتعدد والتبديل (الصعوبة ⭐⭐⭐)
لدى بايثون بناء جملة موجز لكود أنيق:
# أسند عدة متغيرات في سطر واحد
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
المخرجات:
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 تعمل لأن بايثون تُقيّم جميع التعبيرات على الجانب الأيمن أولاً، ثم تُسندها كلها مرة واحدة.
حالات الاستخدام الشائعة
- إحصائيات لاعب اللعبة: الصحة، النقاط، المستوى — كلها مخزنة في متغيرات، تُحدّث مع تقدم اللعبة.
- حساب أسعار التجارة الإلكترونية: سعر الوحدة، الكمية، الخصم، الشحن — كلها متغيرات. البرنامج يحسب السعر النهائي.
- إدارة التهيئة: عناوين قواعد البيانات، مفاتيح API، أسماء المواقع مخزنة في متغيرات — غير مكاناً واحد ويتأثر البرنامج بأكمله.
❓ أسئلة شائعة
= تعني "يساوي"؟ لماذا ليست مثل الرياضيات?= هو عامل الإسناد — يعني "خزّن القيمة على اليمين في المتغير على اليسار." إنه تعليم، وليس إعلان مساواة. للتحقق مما إذا كانت قيمتان متساويتين، استخدم == (علامتا يساوي). واحدة من أكثر أخطاء المبتدئين شيوعاً هي استخدام = بدلاً من == في الشروط.
⚠️ س:هل يمكنني استخدام الحروف الصينية كأسماء متغيرات؟ بايثون 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}"لتضمين المتغيرات والتعبيرات في السلاسل النصية
📝 تمارين
-
أساسي (الصعوبة ⭐): عرّف متغيرات
city,temperature,is_sunnyلاسم مدينتك، درجة حرارة اليوم (float)، وما إذا كان الجو مشمساً (bool). استخدمprint()لإخراج جملة كاملة. -
متوسط (الصعوبة ⭐⭐): عرّف متغيرين صحيحين
minutesوhours. حوّلhoursإلى دقائق، أضفminutes، وأخرج المجموع. مثال:hours=2, minutes=15يجب أن يُخرج135دقيقة. تلميح: 1 ساعة = 60 دقيقة. -
تحدي (الصعوبة ⭐⭐⭐): بدون استخدام متغير مؤقت، بدّل ثلاثة متغيرات في إزاحة دائرية:
a → b → c → a(a تأخذ القيمة الأصلية لـ b، b تأخذ قيمة c، c تأخذ قيمة a). تلميح: الفكرة الأساسية هيa, b, c = b, c, a.



