المتغيرات في بايثون (Python Variables)
المتغيرات (Variables) هي أحد أهم المفاهيم الأساسية في البرمجة بشكل عام، وفي بايثون بشكل خاص. يمكنك تشبيه المتغير بصندوق أو حاوية تخزن فيها قيمة معينة (رقم، نص، قائمة، إلخ) وتعطيها اسماً لتتمكن من الوصول إليها واستخدامها لاحقاً في برنامجك. بدون المتغيرات، لن تستطيع حفظ البيانات أو معالجتها أو نقلها بين أجزاء البرنامج المختلفة. في هذا الدرس الشامل والمفصل، سنتعلم كل ما تحتاج معرفته عن المتغيرات في بايثون: كيفية إنشائها، قواعد تسميتها، أنواعها، كيفية تغيير قيمها، والعديد من الأمثلة العملية التي ستجعلك تفهم هذا المفهوم بعمق.
1. ما هو المتغير؟ (تشبيه من الحياة اليومية)
تخيل أن لديك خزانة ملابس في غرفتك. هذه الخزانة لها اسم (مثلاً "خزانة الملابس الشتوية")، وبداخلها محتويات (معاطف، سترات، إلخ). عندما تريد استخدام معطفك، لا تقول "أريد الشيء الموجود في الدرج الثالث من الخزانة الخشبية بجانب النافذة"، بل تقول ببساطة "أريد معطفي من خزانة الملابس الشتوية". الاسم "خزانة الملابس الشتوية" يشير إلى مكان محدد يحتوي على أشياء محددة.
المتغير في البرمجة يعمل بنفس الطريقة تماماً. هو اسم رمزي (مثل age أو name أو total_price) يشير إلى موقع في ذاكرة الحاسوب يحتوي على قيمة معينة. بدلاً من أن تتذكر عنوان الذاكرة المعقد (مثل 0x7fff5fbff8a0)، تستخدم اسماً بسيطاً وواضحاً.
في بايثون، المتغير ليس مجرد صندوق يحتوي على قيمة، بل هو أشبه بـ "ملصق" أو "بطاقة تعريف" تلصقها على قيمة موجودة في الذاكرة. هذا الفرق الدقيق مهم ولكن لا تقلق إذا لم تفهمه الآن، سيصبح واضحاً مع الممارسة.
2. إنشاء المتغيرات في بايثون
في بايثون، إنشاء متغير سهل للغاية. لا تحتاج لإعلان نوع المتغير مسبقاً (كما في لغات مثل C++ أو Java)، ولا تحتاج لكلمات مفتاحية خاصة مثل var أو let. فقط اكتب اسم المتغير، ثم علامة المساواة = (تُسمى عامل التعيين Assignment Operator)، ثم القيمة التي تريد تخزينها.
# إنشاء متغيرات بأنواع مختلفة
name = "أحمد" # متغير يحتوي على نص (String)
age = 25 # متغير يحتوي على رقم صحيح (Integer)
height = 1.75 # متغير يحتوي على رقم عشري (Float)
is_student = True # متغير يحتوي على قيمة منطقية (Boolean)
# استخدام المتغيرات
print("الاسم:", name)
print("العمر:", age)
print("الطول:", height)
print("طالب؟", is_student)
في المثال أعلاه، أنشأنا أربعة متغيرات مختلفة. بايثون ذكية بما يكفي لمعرفة نوع البيانات تلقائياً من القيمة التي أعطيتها للمتغير. هذه الميزة تُسمى "الكتابة الديناميكية" (Dynamic Typing).
تغيير قيمة المتغير
يمكنك تغيير قيمة المتغير في أي وقت ببساطة بإعادة تعيين قيمة جديدة له:
# إنشاء متغير
score = 50
print("النقاط الأولية:", score)
# تغيير قيمة المتغير
score = 75
print("النقاط بعد التحديث:", score)
# يمكنك حتى تغيير نوع البيانات!
score = "ممتاز"
print("التقييم النهائي:", score)
3. قواعد تسمية المتغيرات
ليس كل اسم صالح ليكون اسم متغير في بايثون. هناك قواعد صارمة يجب اتباعها، وإرشادات موصى بها لكتابة أسماء واضحة واحترافية:
القواعد الإلزامية (يجب اتباعها وإلا ستحصل على خطأ)
- يجب أن يبدأ بحرف (a-z, A-Z) أو شرطة سفلية (_): لا يمكن أن يبدأ برقم.
- يمكن أن يحتوي على حروف، أرقام، وشرطات سفلية فقط: لا رموز خاصة مثل @, #, $, %, إلخ.
- حساس لحالة الأحرف (Case-Sensitive):
nameوNameوNAMEثلاثة متغيرات مختلفة. - لا يمكن استخدام الكلمات المحجوزة (Keywords): مثل
if,for,while,class, إلخ.
# ✅ أسماء صحيحة
name = "أحمد"
age = 25
user_name = "ahmed123"
_private = "قيمة خاصة"
firstName = "محمد"
total_price_2024 = 1500
# ❌ أسماء خاطئة (ستسبب أخطاء)
# 2name = "خطأ" # يبدأ برقم
# user-name = "خطأ" # يحتوي على شرطة
# user name = "خطأ" # يحتوي على مسافة
# for = 5 # كلمة محجوزة
# user@email = "خطأ" # يحتوي على رمز خاص
# حساسية حالة الأحرف
name = "أحمد"
Name = "محمد"
NAME = "علي"
print(name, Name, NAME) # ثلاثة متغيرات مختلفة!
الإرشادات الموصى بها (Best Practices)
- استخدم أسماء واضحة ومعبرة:
student_ageأفضل منsaأوx - استخدم snake_case للمتغيرات:
total_priceبدلاً منtotalPriceأوTotalPrice - استخدم أسماء بالإنجليزية: رغم أن بايثون تدعم Unicode، إلا أن الإنجليزية هي المعيار العالمي
- تجنب الأسماء المكونة من حرف واحد: إلا في حالات محددة (مثل
iفي الحلقات) - استخدم الشرطة السفلية للأرقام الكبيرة:
1_000_000أوضح من1000000
# ❌ أسماء سيئة (تعمل لكنها غير واضحة)
a = 25
x = "أحمد"
temp = 1500
# ✅ أسماء جيدة (واضحة ومعبرة)
student_age = 25
student_name = "أحمد"
total_price = 1500
# ✅ استخدام الشرطة السفلية للأرقام الكبيرة
population = 1_500_000 # أسهل في القراءة من 1500000
budget = 10_000_000
print(f"عدد السكان: {population:,}")
print(f"الميزانية: {budget:,}")
4. التعيين المتعدد (Multiple Assignment)
بايثون توفر طرقاً ذكية لتعيين قيم لعدة متغيرات في سطر واحد، مما يجعل الكود أكثر إيجازاً ووضوحاً:
تعيين نفس القيمة لعدة متغيرات
# تعيين نفس القيمة لثلاثة متغيرات
x = y = z = 0
print("x =", x)
print("y =", y)
print("z =", z)
# مفيد عند تهيئة عدة متغيرات بنفس القيمة الابتدائية
score1 = score2 = score3 = 100
print(f"النقاط: {score1}, {score2}, {score3}")
تعيين قيم مختلفة لعدة متغيرات (Unpacking)
# تعيين قيم مختلفة في سطر واحد
name, age, city = "أحمد", 25, "القاهرة"
print("الاسم:", name)
print("العمر:", age)
print("المدينة:", city)
# مفيد جداً لتبديل قيم متغيرين
a = 10
b = 20
print(f"قبل التبديل: a = {a}, b = {b}")
# التبديل في سطر واحد!
a, b = b, a
print(f"بعد التبديل: a = {a}, b = {b}")
# يمكنك فك حزم القوائم
coordinates = [100, 200, 300]
x, y, z = coordinates
print(f"الإحداثيات: x={x}, y={y}, z={z}")
5. الثوابت في بايثون (Constants)
الثابت (Constant) هو متغير قيمته لا يجب أن تتغير أثناء تنفيذ البرنامج. في الحقيقة، بايثون لا تمتلك ثوابت حقيقية (على عكس لغات أخرى)، لكن هناك اتفاقية بين المبرمجين: إذا كتبت اسم المتغير بأحرف كبيرة فقط (UPPERCASE)، فهذا يعني أنه ثابت ولا يجب تغييره.
# تعريف ثوابت (بأحرف كبيرة)
PI = 3.14159
GRAVITY = 9.8
MAX_USERS = 100
TAX_RATE = 0.15
COMPANY_NAME = "شركة التقنية المتقدمة"
# استخدام الثوابت
radius = 5
area = PI * radius ** 2
print(f"مساحة الدائرة: {area:.2f}")
price = 1000
total_with_tax = price + (price * TAX_RATE)
print(f"السعر مع الضريبة: {total_with_tax}")
# تقنياً يمكنك تغيير "الثابت" لكن هذا غير محبذ
# PI = 3.14 # ❌ لا تفعل هذا!
6. نطاق المتغيرات (Variable Scope)
نطاق المتغير (Scope) يحدد أين يمكن الوصول إلى المتغير واستخدامه في البرنامج. هناك نوعان رئيسيان من النطاق:
المتغيرات المحلية (Local Variables)
المتغير المحلي هو متغير يُعرّف داخل دالة، ويمكن الوصول إليه فقط داخل تلك الدالة:
def calculate_area():
# length هو متغير محلي - موجود فقط داخل هذه الدالة
length = 10
width = 5
area = length * width
print(f"المساحة داخل الدالة: {area}")
# استدعاء الدالة
calculate_area()
# ❌ هذا سيسبب خطأ لأن length غير موجود خارج الدالة
# print(length) # NameError: name 'length' is not defined
المتغيرات العامة (Global Variables)
المتغير العام هو متغير يُعرّف خارج جميع الدوال، ويمكن الوصول إليه من أي مكان في البرنامج:
# متغير عام - يمكن الوصول إليه من أي مكان
company_name = "شركة التقنية"
tax_rate = 0.15
def calculate_price(base_price):
# يمكننا قراءة المتغيرات العامة داخل الدالة
tax = base_price * tax_rate
total = base_price + tax
print(f"الشركة: {company_name}")
print(f"السعر الأساسي: {base_price}")
print(f"الضريبة: {tax}")
print(f"الإجمالي: {total}")
calculate_price(1000)
# يمكننا أيضاً الوصول للمتغيرات العامة خارج الدالة
print(f"\nاسم الشركة: {company_name}")
7. مثال شامل: نظام إدارة طالب
لنجمع كل ما تعلمناه في مثال عملي واقعي:
"""
نظام إدارة معلومات الطالب
يوضح استخدام المتغيرات بأنواعها المختلفة
"""
# ثوابت النظام (UPPERCASE)
PASSING_GRADE = 50
MAX_GRADE = 100
UNIVERSITY_NAME = "جامعة التقنية"
# معلومات الطالب (snake_case)
student_id = 12345
student_name = "أحمد محمد"
student_age = 20
is_enrolled = True
gpa = 3.75
# درجات المواد
math_grade = 85
physics_grade = 78
chemistry_grade = 92
programming_grade = 95
# حساب المعدل
total_grades = math_grade + physics_grade + chemistry_grade + programming_grade
average_grade = total_grades / 4
# تحديد حالة النجاح
passed = average_grade >= PASSING_GRADE
# عرض التقرير
print("=" * 60)
print(f"{'تقرير الطالب':^60}")
print("=" * 60)
print()
print(f"الجامعة: {UNIVERSITY_NAME}")
print(f"الرقم الجامعي: {student_id}")
print(f"الاسم: {student_name}")
print(f"العمر: {student_age} سنة")
print(f"مسجل: {'نعم' if is_enrolled else 'لا'}")
print(f"المعدل التراكمي: {gpa}")
print()
print("الدرجات:")
print("-" * 60)
print(f" الرياضيات: {math_grade}/{MAX_GRADE}")
print(f" الفيزياء: {physics_grade}/{MAX_GRADE}")
print(f" الكيمياء: {chemistry_grade}/{MAX_GRADE}")
print(f" البرمجة: {programming_grade}/{MAX_GRADE}")
print("-" * 60)
print(f" المجموع: {total_grades}/{MAX_GRADE * 4}")
print(f" المعدل: {average_grade:.2f}")
print()
# تحديد التقدير
if average_grade >= 90:
grade_letter = "A"
grade_text = "ممتاز"
elif average_grade >= 80:
grade_letter = "B"
grade_text = "جيد جداً"
elif average_grade >= 70:
grade_letter = "C"
grade_text = "جيد"
elif average_grade >= PASSING_GRADE:
grade_letter = "D"
grade_text = "مقبول"
else:
grade_letter = "F"
grade_text = "راسب"
print(f"التقدير: {grade_letter} ({grade_text})")
print(f"الحالة: {'ناجح ✓' if passed else 'راسب ✗'}")
print()
print("=" * 60)
💡 نصائح مهمة للمبتدئين
- اختر أسماء متغيرات واضحة ومعبرة - الكود يُقرأ أكثر مما يُكتب
- استخدم snake_case للمتغيرات العادية و UPPERCASE للثوابت
- لا تخف من استخدام أسماء طويلة إذا كانت أكثر وضوحاً
- تجنب استخدام أسماء مثل l (حرف L صغير) أو O (حرف O كبير) لأنها تشبه الأرقام 1 و 0
- المتغيرات في بايثون ديناميكية - يمكنها تغيير نوعها، لكن هذا قد يسبب ارتباكاً
الخطوة التالية
الآن بعد أن فهمت المتغيرات، حان وقت التعمق في أنواع البيانات المختلفة
الدرس التالي: أنواع البيانات في Python