البيانات ببساطة: المتغير والقائمة والجدول
درس 2 من 4
2البيانات ببساطة: المتغير والقائمة والجدول
الصورة الكبيرةالبرنامج يعمل على بيانات. لو رتّبتها بشكل يناسب السؤال صار الحل سطرين، ولو رتّبتها عشوائيًا صار الحل صفحة.
ماذا تشاهد في الرسم: خمسة أشكال تكفي لأغلب البرامج التي ستكتبها في سنتك الأولى. كل واحد يجاوب سؤالًا مختلفًا بسرعة.
خارطة هذا الجزء
المفاهيم بالترتيب، اضغط أيًّا منها للقفز إليه:
طريقان إلى نفس الفكرة
المتغير مثل علبة في المطبخ مكتوب عليها «سكر». القائمة مثل رف عليه علب مرقّمة من 0. القاموس مثل دفتر الهاتف: تبحث بالاسم فتجد الرقم. الطابور مثل طابور المخبز، والمكدّس مثل كومة الصحون: آخر صحن وضعته هو أول ما تأخذه.
في الذاكرة، المتغير اسم يشير إلى قيمة. القائمة (مصفوفة ديناميكية) تعطيك العنصر برقمه في زمن ثابت O(1) لكن البحث عن قيمة فيها O(n). القاموس (جدول تجزئة) يعطيك القيمة بالمفتاح في متوسط O(1). الطابور FIFO والمكدّس LIFO قيدان على قائمة يضمنان ترتيب الخروج.
قبل أن تبدأ
🧩الخوارزمية بلا كود
تعرف التسلسل والقرار والتكرار من الدرس السابق.
الفكرة الجوهرية
1المتغير: صندوق باسم
تكتب price = 25 فيحجز البرنامج مكانًا اسمه price فيه 25. تستطيع أن تقرأه وتغيّره: price = price + 5. الاسم الجيد يشرح نفسه: price أفضل من x.
2القائمة: صف مرقّم يبدأ من صفر
القائمة تحفظ أشياء بترتيب. أول عنصر رقمه 0 لا 1، وهذا يربك كل مبتدئ مرة واحدة ثم يصير عادة.
groceries = ["milk", "bread", "dates"]
print(groceries[0]) # first item
groceries.append("tea") # add at the end
print(len(groceries), groceries)3القاموس: ابحث بالاسم لا بالرقم
حين تسأل «ما سعر الحليب؟» لا تريد أن تمرّ على كل الرف. القاموس يربط مفتاحًا بـقيمة، فتصل للقيمة مباشرة.
prices = {"milk": 6, "bread": 3, "dates": 25}
print(prices["dates"])
prices["tea"] = 12
total = 0
for item in ["milk", "dates"]:
total += prices[item]
print("total:", total)4الطابور والمكدّس: من يخرج أولًا؟
الطابور (FIFO): أول من دخل أول من يخرج، مثل طلبات خدمة العملاء. المكدّس (LIFO): آخر من دخل أول من يخرج، مثل زر «تراجع» في المحرّر الذي يلغي آخر تعديل أولًا.
from collections import deque
line = deque(["Ali", "Sara"])
line.append("Noura") # joins the back
print("served:", line.popleft()) # the first one leaves
undo = ["typed A", "typed B", "deleted line"]
print("undo:", undo.pop()) # the last action goes firstمثال محلول
المسألة: متجر يريد عدد مرات بيع كل منتج من سجل المبيعات. الحل: قائمة للسجل (لأنه مرتّب زمنيًا)، وقاموس للعدّ (لأننا نبحث بالاسم).
sales = ["tea", "milk", "tea", "dates", "tea", "milk"]
counts = {}
for item in sales:
counts[item] = counts.get(item, 0) + 1
print(counts)خرافة مقابل حقيقة
| الخرافة | الحقيقة |
|---|---|
| القائمة تبدأ من 1 مثل العدّ العادي. | في أغلب اللغات تبدأ من 0، لأن الرقم يعني «كم خطوة من البداية». |
| كل البيانات تُحفظ في قوائم. | القائمة للترتيب، والقاموس للبحث، والطابور للعدل في الدور. الاختيار الخاطئ يبطّئ البرنامج. |
اختبر فهمك
تريد معرفة رقم جوال موظف من اسمه بأسرع طريقة. ماذا تستخدم؟
القاموس يصل للقيمة بالمفتاح مباشرة، والقائمة تحتاج المرور على العناصر.
fruits = ["apple", "fig", "date"] ما قيمة fruits[1]؟
الترقيم من 0، فالعنصر 1 هو الثاني.
زر «تراجع» في المحرّر يلغي آخر تعديل أولًا. أي شكل يناسبه؟
آخر ما دخل أول ما يخرج: هذا تعريف المكدّس.
بطاقات مراجعة سريعة
تحقق من فهمك
لماذا عدّ المبيعات بقاموس أفضل من قائمتين متوازيتين؟
لأن القاموس يجد عدّاد المنتج مباشرة باسمه، والقائمتان تحتاجان البحث عن مكان الاسم في كل مرة ومزامنتهما يدويًا.
أعطِ مثالًا لطابور في نظام حقيقي.
طابور الطباعة، أو طلبات الدعم الفني، أو رسائل تنتظر الإرسال: كلها تُخدم بترتيب الوصول.
ما خطورة الفهرس 3 في قائمة من 3 عناصر؟
آخر فهرس صالح هو 2، فالفهرس 3 خارج الحدود ويعطي خطأ. هذا أشهر خطأ «بواحد».
مصادر هذا الدرس
مرتّبة بالنوع. ابدأ بالتوثيق الرسمي إذا تبي المرجع الدقيق، وبالمقال أو الفيديو إذا تبي الشرح أولًا.
توثيق رسمي1
خلّصت الدرس؟
سجّل الدخول ليُحفظ تقدّمك.