القوائم في بايثون: احفظ أشياء كثيرة في متغيّر واحد
تعلّم إنشاء القوائم في بايثون، وإضافة العناصر بـ append، والوصول إليها بالفهرس، والمرور عليها بحلقة for، وتجنّب خطأ IndexError.
عندك خمسة أصدقاء تريد أن تكتب أسماءهم في برنامجك. هل تصنع خمسة متغيّرات: friend1 و friend2 و friend3…؟ وماذا لو صاروا عشرين؟ في هذا الدرس ستتعلّم طريقة أذكى بكثير: متغيّر واحد يحمل كل الأسماء.
🎯 ماذا ستتعلم؟
بنهاية هذا الدرس ستكون قادرًا على:
- إنشاء قائمة فارغة أو قائمة فيها عناصر جاهزة.
- إضافة عناصر جديدة إلى القائمة.
- الوصول إلى عنصر معيّن برقم مكانه.
- المرور على كل عناصر القائمة بحلقة بسيطة.
- فهم خطأ
IndexErrorوتجنّبه.
🧰 ماذا تحتاج قبل أن تبدأ؟
يجب أن تعرف ما هو المتغيّر وكيف تطبع قيمته. إن لم تكن متأكدًا، اقرأ أولًا المتغيّرات وأنواع البيانات في بايثون. كل الأمثلة تعمل في مترجم بايثون في المتصفح بدون تثبيت.
الفكرة ببساطة
عندما تذهب إلى البقالة، لا تكتب كل غرض على ورقة منفصلة. تكتب ورقة واحدة اسمها “قائمة التسوّق”، وفيها الأغراض واحدًا تحت الآخر: حليب، خبز، بيض.
هذا بالضبط ما تفعله القائمة (list) في بايثون. هي متغيّر واحد يحمل مجموعة من القيم مرتّبة بالتسلسل. يمكنك إضافة أغراض إليها، وقراءة أي غرض برقم مكانه، والمرور عليها كلها.
وكما تكتب في ورقة التسوّق أشياء مختلفة، تستطيع القائمة أن تحمل أرقامًا ونصوصًا وأي نوع آخر، وبأي عدد تريده.
الخطوة 1: إنشاء قائمة
تكتب القائمة بين قوسين مربّعين [ ]، وتفصل بين عناصرها بفاصلة. هنا قائمة بأسماء ثلاثة لاعبين في فريق:
players = ["سالم", "نورة", "خالد"]
print(players)
['سالم', 'نورة', 'خالد']
لاحظ أن بايثون تطبع القائمة كاملة بأقواسها. ويمكنك أيضًا إنشاء قائمة فارغة لتملأها لاحقًا:
scores = []
print(scores)
[]
الخطوة 2: إضافة عناصر بـ append()
القائمة الفارغة لا تنفع وحدها. لإضافة عنصر إلى نهايتها، استخدم append() واكتب داخل القوسين ما تريد إضافته. الكلمة append تعني “ألحِق بالنهاية”.
scores = []
scores.append(10)
scores.append(25)
scores.append(40)
print(scores)
[10, 25, 40]
كل نداء لـ append() يضيف عنصرًا واحدًا في آخر القائمة. القائمة تكبر كلما أضفت، ولا يوجد حد لعدد العناصر.
وتعمل append() مع القوائم غير الفارغة أيضًا. هنا انضم لاعب رابع إلى الفريق:
players = ["سالم", "نورة", "خالد"]
players.append("ليلى")
print(players)
['سالم', 'نورة', 'خالد', 'ليلى']
الخطوة 3: الوصول إلى عنصر بالفهرس
لكل عنصر في القائمة رقم مكان يسمّى الفهرس (index). لقراءة عنصر، اكتب اسم القائمة ثم الفهرس بين قوسين مربّعين.
هنا المفاجأة التي يقع فيها كل المبتدئين: العدّ يبدأ من صفر، لا من واحد. العنصر الأول فهرسه 0، والثاني 1، والثالث 2.
players = ["سالم", "نورة", "خالد", "ليلى"]
print(players[0])
print(players[1])
print(players[3])
سالم
نورة
ليلى
فكّر في الفهرس كأنه “كم خطوة تمشي من البداية”. العنصر الأول لا يحتاج أي خطوة، لذلك فهرسه 0.
ويمكنك تخزين العنصر في متغيّر جديد واستخدامه كما تشاء:
players = ["سالم", "نورة", "خالد", "ليلى"]
captain = players[0]
print("قائد الفريق هو", captain)
قائد الفريق هو سالم
🚀 للمتقدمين: الفهرس السالب يعدّ من النهاية.
players[-1]يعطيك آخر عنصر، وplayers[-2]الذي قبله. جرّب أيضًاplayers[1:3]لتحصل على قائمة صغيرة من العنصرين رقم 1 و 2. هذا يسمّى التقطيع (slicing).
الخطوة 4: كم عنصرًا في القائمة؟
الدالة len() تعطيك عدد العناصر. الاسم اختصار لكلمة length أي “الطول”.
players = ["سالم", "نورة", "خالد", "ليلى"]
print(len(players))
4
تذكّر: القائمة فيها 4 عناصر، لكن أكبر فهرس هو 3. عدد العناصر دائمًا أكبر من آخر فهرس بواحد. ستحتاج هذه المعلومة في الخطوة 6.
الخطوة 5: المرور على كل العناصر
ماذا لو أردت طباعة كل لاعب في سطر منفصل؟ يمكنك كتابة print() أربع مرات، لكن هناك طريقة أجمل: الحلقة (loop).
الحلقة for تأخذ العناصر واحدًا واحدًا، وتضع كل عنصر في متغيّر مؤقت، ثم تنفّذ الأسطر التي تحته. لاحظ المسافة البادئة قبل print، فهي تخبر بايثون أن هذا السطر داخل الحلقة.
players = ["سالم", "نورة", "خالد", "ليلى"]
for player in players:
print("مرحبًا", player)
مرحبًا سالم
مرحبًا نورة
مرحبًا خالد
مرحبًا ليلى
اقرأ السطر الثاني هكذا: “لكل player في players، افعل ما يلي”. في الدورة الأولى يكون player هو “سالم”، وفي الثانية “نورة”، وهكذا حتى تنتهي القائمة.
والحلقة تعمل مع الأرقام أيضًا. هنا نجمع نقاط كل الجولات:
scores = [10, 25, 40]
total = 0
for score in scores:
total = total + score
print("المجموع:", total)
المجموع: 75
الخطوة 6: الخطأ الشهير IndexError
ماذا يحدث لو طلبت فهرسًا غير موجود؟ القائمة التالية فيها 3 عناصر، وفهارسها 0 و 1 و 2 فقط. طلب الفهرس 10 يوقف البرنامج بخطأ:
❌ هذا الكود يتوقف بخطأ
scores = [10, 25, 40]
print(scores[10])
IndexError: list index out of range
الرسالة تعني: “فهرس القائمة خارج المدى”. الحل أن تطلب فهرسًا موجودًا، أو تتحقق من الطول أولًا بـ len():
# ✅ نطلب فهرسًا موجودًا فقط
scores = [10, 25, 40]
print(len(scores))
print(scores[2])
3
40
🚀 للمتقدمين: إذا أردت آخر عنصر دائمًا مهما كان طول القائمة، لا تحسب الفهرس بنفسك. استخدم
scores[-1]أوscores[len(scores) - 1]. الطريقتان تعطيان النتيجة نفسها.
⚠️ أخطاء شائعة
الأخطاء طبيعية جدًا في البداية، وكل مبرمج مرّ بها. إليك ثلاثة تقابلها كثيرًا مع القوائم:
1. الظن أن العنصر الأول فهرسه 1
❌
days = ["السبت", "الأحد", "الاثنين"]
print(days[1])
الأحد
الكود لا يتوقف، لكنه يطبع اليوم الثاني بدل الأول. تذكّر أن العدّ يبدأ من صفر:
# ✅
days = ["السبت", "الأحد", "الاثنين"]
print(days[0])
السبت
2. استخدام append() بأكثر من عنصر
❌
fruits = []
fruits.append("تفاح", "موز")
TypeError: list.append() takes exactly one argument (2 given)
الدالة append() تقبل عنصرًا واحدًا في كل مرة. أضف كل عنصر في سطر مستقل:
# ✅
fruits = []
fruits.append("تفاح")
fruits.append("موز")
print(fruits)
['تفاح', 'موز']
3. نسيان المسافة البادئة داخل الحلقة
❌
for player in players:
print(player)
IndentationError: expected an indented block after 'for' statement on line 1
بايثون تعرف ما بداخل الحلقة من المسافة البادئة. اضغط Tab أو أربع مسافات قبل كل سطر تريده داخل الحلقة:
# ✅
players = ["سالم", "نورة"]
for player in players:
print(player)
سالم
نورة
🧪 جرّب بنفسك
التحدي 1: قائمة التسوّق
أنشئ قائمة فارغة اسمها shopping، وأضف إليها ثلاثة أغراض بـ append()، ثم اطبع القائمة وعدد عناصرها.
# أنشئ القائمة وأضف ثلاثة أغراض
shopping = []
print(shopping)
[]
💡 اضغط لرؤية الحل
shopping = []
shopping.append("حليب")
shopping.append("خبز")
shopping.append("بيض")
print(shopping)
print(len(shopping))
['حليب', 'خبز', 'بيض']
3
التحدي 2: الأول والأخير
عندك قائمة بترتيب المتسابقين في سباق الجري. اطبع اسم الفائز الأول والأخير في جملة، بدون أن تكتب الأسماء بنفسك في print().
runners = ["عمر", "هند", "يوسف", "مريم", "فهد"]
# اطبع: الأول: عمر والأخير: فهد
print(runners)
['عمر', 'هند', 'يوسف', 'مريم', 'فهد']
💡 اضغط لرؤية الحل
runners = ["عمر", "هند", "يوسف", "مريم", "فهد"]
first = runners[0]
last = runners[4]
print("الأول:", first, "والأخير:", last)
# أو بالفهرس السالب من صندوق المتقدمين
print("الأول:", runners[0], "والأخير:", runners[-1])
الأول: عمر والأخير: فهد
الأول: عمر والأخير: فهد
التحدي 3: درجات الحرارة
عندك درجات الحرارة لأسبوع كامل. استخدم حلقة for لطباعة كل درجة في سطر، ثم احسب متوسط الأسبوع واطبعه. تذكّر أن المتوسط هو المجموع مقسومًا على عدد العناصر.
temps = [31, 33, 35, 34, 30, 29, 32]
# اطبع كل درجة، ثم احسب المتوسط
print(len(temps))
7
💡 اضغط لرؤية الحل
temps = [31, 33, 35, 34, 30, 29, 32]
total = 0
for temp in temps:
print(temp)
total = total + temp
average = total / len(temps)
print("المتوسط:", average)
31
33
35
34
30
29
32
المتوسط: 32.0
✅ اختبر نفسك
-
ماذا يطبع
print(["أ", "ب", "ج"][1])؟- أ) أ
- ب) ب
- ج) ج
-
قائمة فيها 5 عناصر. ما أكبر فهرس يمكنك طلبه بدون خطأ؟
- أ) 5
- ب) 4
- ج) 6
-
صح أم خطأ:
append()تضيف العنصر في بداية القائمة.
💡 اضغط لرؤية الإجابات
- ب) ب، لأن الفهرس 1 هو العنصر الثاني.
- ب) 4، لأن الفهارس تبدأ من 0 وتنتهي عند عدد العناصر ناقص واحد.
- خطأ.
append()تضيف العنصر دائمًا في نهاية القائمة.
📝 الخلاصة
- القائمة متغيّر واحد يحمل عناصر كثيرة مرتّبة، وتُكتب بين
[ ]. append()تضيف عنصرًا واحدًا إلى نهاية القائمة.- الوصول إلى عنصر يكون بالفهرس، والعدّ يبدأ من 0.
len()تعطيك عدد العناصر، وأكبر فهرس هو العدد ناقص واحد.- حلقة
forتمرّ على العناصر واحدًا واحدًا، وطلب فهرس غير موجود يسبّبIndexError.
⏭️ الخطوة التالية
صار عندك الآن قائمة تكبر وتصغر كما تشاء. جرّب أن تبني قائمة بأسماء أصدقائك، وأخرى بنقاطك في لعبتك المفضّلة، ثم اجمع النقاط بحلقة. وفي الدرس القادم ستتعرّف أكثر على الحلقات وكيف تكرّر أي شيء تريده. إلى ذلك الحين، افتح مترجم بايثون وجرّب كل الأمثلة بقيم من عندك.
📚 المصدر: Lists - learnpython.org