المتغيرات والتسمية
خزِّن القيم تحت أسماء، وافهم الإسناد، واتبع اصطلاحات تسمية بايثون.
- إسناد القيم إلى المتغيرات وإعادة إسنادها
- شرح سبب كون المتغيرات تسميات وليست صناديق
- استخدام عوامل الإسناد المتزايد (+=, -=, *=, /=)
- اتباع اصطلاحات تسمية snake_case
لماذا تحتاج القيمة إلى اسم؟
اكتب برنامجًا يحسب متوسط ثلاث درجات اختبار:
وافترض الآن أن الدرجات تغيّرت ، يريد المعلم متوسط . دون أسماء، يظهر تعبير المتوسط في عدة مواضع ويجب أن تبحث عن كل واحدٍ وتعدّله بيدك. تلك وصفة لأن يَسقط أحدها.
يحلّ الرياضي هذه المشكلة بتسمية الكميات: اكتب مرة واحدة ثم أحل إلى أيٍّ منها متى شئت. للبرنامج الحاجة نفسها: تظهر القيم مرارًا وتكرارًا، ويجب على الآلة أن تجد القيمة الحالية في كل مرة. جواب بايثون هو المتغير ، اسمٌ يشير إلى قيمة. بمجرد أن يسمّي score1 القيمة ، يمكنك كتابة score1 أيّ عددٍ من المرات، وتبحث بايثون عن قيمته الحالية في كل مرة.
= يربط اسمًا بقيمة
في الرياضيات، «ليكن » يثبّت الرمز على العدد . تفعل بايثون الشيء نفسه وبنفس الرمز تمامًا:
score1 = 7.5
score2 = 8.5
score3 = 9.0
average = (score1 + score2 + score3) / 3
print(f"{average:.2f}") # 8.33يُقيَّم الطرف الأيمن أولًا، وبعده فقط يبدأ الاسم في الطرف الأيسر بالإشارة إلى النتيجة. إذا غيّرتَ الدرجات وأعدتَ تشغيل الملف، سيستخدم الحساب نفسه القيم الجديدة ، إذ تعطي الأسماء للآلة موضعًا تبحث فيه عن «القيمة الحالية لـ ».
الأسماء قابلة لإعادة التوجيه
هنا لا يُشبه المتغيرُ الرمزَ الرياضي. في الرياضيات، جملة بلا حل. أما في بايثون فهي تعليمة عادية تمامًا، تُقرأ من اليمين إلى اليسار:
تعني «القيمة التالية لـ هي قيمته الحالية زائد واحد». بمجرد أن ترى هذا في بايثون، فأنت تعدّ:
count = 0
count = count + 1 # قُرئت القيمة القديمة 0، حُسب 1، والاسم يشير الآن إلى 1
count = count + 1 # الآن count يسمّي 2إعادة الإسناد هي إعادة توجيه تسمية، لا ملء صندوق. القيمة القديمة لا «تتغيّر» ولا «تُستبدل» ، الاسم ببساطة ينظر إلى قيمةٍ أخرى الآن.
القراءة-التحديث-التخزين حركةٌ واحدة: +=
النمط السابق ، اقرأ count، أضف 1، وجّه count نحو النتيجة ، شائعٌ لدرجة أن بايثون اختصرته. قل إن خطوةَ الانتقال وأنت تتنقل في متتابعة عامة:
على الورق، تكون التحديث x = x + h. تدمج بايثون القراءة والتخزين في عامل واحد:
x = 5
x += 1 # مثل x = x + 1 تمامًا -> 6
x -= 2 # مثل x = x - 2 تمامًا -> 4
x *= 3 # مثل x = x * 3 تمامًا -> 12
x /= 4 # مثل x = x / 4 تمامًا -> 3.0اقرأ x += h بصوتٍ عالٍ بمعنى «قدّم x بمقدار h» ، حركة واحدة، كما تفعل المتتابعة.
اسمٌ يمكنك التلفظ به
أي كلمة تقريبًا تصلح اسمًا، لكن الصحة ليست الجودة. أيّهما أوضح عند قراءة برنامج نتيجتك؟
x = 87.5 # يسمّي عددًا، لا شيء أكثر
quiz_score = 87.5 # يسمّي الكميةقواعد قليلة وعادة واحدة:
- يبدأ الاسم بحرفٍ أو شرطة سفلية، ولا يجوز أن يحوي بعدها إلا الحروف والأرقام والشرطات السفلية ،
second_score✓،2nd_score✗. - اصطلاح بايثون هو snake_case: كلماتٌ صغيرة الحروف تُوصل بشرطة سفلية، مثل
student_nameلاstudentName. وهو يطابق طريقة النطق:quiz_scoreهي درجة الاختبار. - مجموعة صغيرة من الكلمات محجوزة ،
if,for,class,True,False، ولا يصح استعمالها أسماءً.
ستعيد قراءة كودك أكثر مما تكتبه؛ الاسم الذي تختاره حين تكتب هو ما يعيد المعنى إليك عند القراءة لاحقًا.
مثالٌ محلول: المجموعُ المتصاعد
ينفعُ إعادةُ التوجيهِ حين تُبنى كمّيةٌ خطوةً خطوةً ، المتتاليةُ والمجموعُ الجاري هو :
total = 0
total += 8.5 # يصير total = 8.5
total += 9.0 # ثم 17.5
total += 10.0 # ثم 27.5
average = total / 3
print(f"{average:.2f}") # 9.17كلُّ += يتقدم خطوةً: يقرأ القيمةَ الحاليةَ، فيجمعَ، ثم يعيدَ توجيهَ الاسمِ نحو النتيجة. يُبقي الاسمانِ total وaverage الكميتينِ منفصلتينِ، فيُقرأ الدليلُ كما يصفُ.
أخطاء شائعة
- استخدام كلمة محجوزة اسمًا.
class = "Math"يرفع خطأSyntaxError،classمحجوزة. - البدء برقم.
2nd_place = "B"غير صالح؛second_place = "B"صحيح. - الخلط بين
=و==.=يوجّه اسمًا نحو قيمة؛ أما==فيسأل هل القيمتان متساويتان. زلة حرفٍ واحد تحوّل جملةً خبرية إلى سؤال. - يكتب
+=على اسمٍ يجب أن يكون موجودًا بالفعل. يرفعtotal += 1على اسمٍ لم يُسنَد قطُّ خطأَNameError. فالإيماءةُ تقرأ القيمةَ الحاليةَ أولًا؛ والاسمُ بلا قيمةٍ لا شيءَ ليقرأه.
🧩 تحديات
🧩 تحدٍّ ، فكّر أولًا ثم أظهر
إذا كان x = 5 ثم y = x وبعدها x = 10، فما قيمة y؟ اشرح السبب بمنطق «الأسماء تشير إلى القيم» لا «الصناديق تحتوي القيم».
💡 الجواب: تبقى y مساويةً 5. عند تنفيذ y = x كان الاسمان يشيران إلى 5. إعادة توجيه x نحو 10 تحرّك تسمية x؛ لا يزال y يشير إلى 5. التسميات تشير؛ ولا شيء يُنسخ «داخل صندوق».
🧩 تحدٍّ ، فكّر أولًا ثم أظهر
اكتب برنامجًا يتبادل متغيرَين: a = 7 وb = 3. بعد التبادل يجب أن تكون a = 3 وb = 7. افعل ذلك دون متغير مؤقت (لديها بايثون حيلة أنيقة).
💡 الجواب: a, b = b, a ، تُقيّم بايثون الطرف الأيمن أولًا (القيمتان القديمتان)، ثم توجّه اسما الطرف الأيسر إليهما. لا حاجة لمتغير مؤقت.
🧩 تحدٍّ ، فكّر أولًا ثم أظهر
أيًّا من أسماء المتغيرات التالية صالح ولماذا تفشل غير الصالحة: _count, 2nd, my-name, total, class؟
💡 الجواب: _count ✓ (البدء بشرطة سفلية جائز)، 2nd ✗ (يبدأ برقم)، my-name ✗ (الشرطة هي عامل الطرح، غير جائزة في الاسم)، total ✓، class ✗ (كلمة محجوزة).
🤔 أسئلة سقراطية
- لماذا تختار بايثون
snake_caseبدلًا منcamelCase؟ ماذا توحي شرطة السفلية بصريًا عن طريقة قراءة أسماء المتغيرات؟ x += 1وx = x + 1ينتجان النتيجة نفسها للأعداد. هل ترى سببًا يجعل لغةً ما تعرض الصيغتين معًا؟- إذا كانت المتغيرات تسميات لا صناديق، فماذا يحدث عند كتابة
a = [1, 2, 3]ثمb = aثمb.append(4)؟ هل يرىaالعدد4؟ (جرّب ، هذه لمحة عن الكائنات القابلة للتغيير، تُشرح لاحقًا.)
✅ فحص سريع
١. ما قيمة y بعد: x = 10; y = x; x = 20؟
٢. أيٌّ ممّا يلي اسم متغير صالح في بايثون؟
٣. ما قيمة x بعد: x = 5; x += 3; x -= 1؟