شرح الموضوع
تعرّف كيف يُمكن التعامل مع القوائم وسلاسل الحروف في برمجية بايثون (Python)، واستخدامها في تخزين مجموعات البيانات المُترابطة وإدارتها وتنفيذ عمليات فيها.
نتاجـات التعلُّم :
- أعرّف مفهوم المُتغيّر (قائمة)، وأُبيّن استخداماته في البرمجة.
- أُنشئ قوائم على اختلاف أنواعها (مُتسلسلة، ومُتغيّرة)، وأستخدمها في تخزين مجموعة مُتنوّعة من القِيَم.
- أُحدّد كيف يُمكن تجميع مجموعة القِيَم في قائمة واحدة.
- أُوضّح أنواع القوائم (المُتسلسلة، والمُتغيّرة)، وأُنَفِّذ عمليات مختلفة فيها، مثل: الإضافة، والحذف.
- أستخدم الدوال البرمجية الجاهزة في لغة البرمجة بايثون (Python) لمعالجة القوائم وإجراء بعض العمليات الأساسية فيها.
الفكرة الرئيسة والمفاهيم والمصطلحات
مُنتَجات التعلُّم
القوائم: قيم كثيرة تحت اسم واحد
تُعَدُّ القوائم إحدى المزايا المُهمَّة للغات البرمجة؛ إذ تُسهم في إدارة تنظيم البيانات، وتتيح للمُستخدم التعامل معها واسترجاعها بسهولة.
أفترض أنني أريد إنشاء برنامج يتولّى قراءة علامات (100) طالب في أحد الامتحانات، ثمَّ يعرض هذه العلامات مُرتَّبة بصورة تصاعدية. هل يجب عليَّ تخزين علامات هؤلاء الطلبة أم يمكنني كتابة هذا البرنامج دون الحاجة لتخزين العلامات؟
إذا تعيَّن عليَّ تخزين علامات هؤلاء الطلبة، فإلى كم متغير أحتاج؟ وما التحدّيات التي سأواجهها عند محاولتي تخزين العلامات؟
كيف يُمكنني طباعة العلامات وترتيبها تصاعدياً؟ وهل ما تعلَّمته عن لغة البرمجة بايثون (Python) سيساعدني على ذلك؟
القوائم (Lists)
- فمثلاً، يُمكن للمُستخدم تخزين أسماء الشوارع داخل إحدى المدن في قائمة، وكذلك تخزين أسعار البضائع التي اشتراها أحد العملاء، أو تخزين علامات الطلبة في الصف الحادي عشر.
- يتطلَّب استخدام القوائم في لغة البرمجة بايثون (Python) تعريف القائمة أوَّلاً، ثمَّ تخزين العناصر داخلها.
- يُمكن تعريف إحدى القوائم باستخدام الأقواس المُربَّعة []، والفصل بين عناصر القائمة بفواصل
mylist = ['value1', 'value2', 'value3', 'value4']
- المقطع البرمجي التالي يعرّف قائمة باسم mylist تحتوي على أربعة عناصر
مثال:
- يُبيّن المقطع البرمجي الآتي تعريفاً لقائمة تُسمَّى (names)، وتتضمَّن (5) أسماء، وتعريفاً لقائمة أخرى تُسمَّى (ages)، وتتضمَّن (4) أعمار لأشخاص وتعريفاً لقائمة فارغة
names = ['Ali', 'Salam', 'Joud', 'Omar', 'Jana']
ages = [10, 48, 33, 17]
a = []

- لا يُشتَرَط في القائمة التي يراد إنشاؤها أن تحوي جميعها عناصر من النوع نفسه؛ إذ يُمكن للمُستخدم تخزين أرقام صحيحة، وأرقام عشرية، وسلاسل نصية، وقوائم أخرى في القائمة نفسها
مثال:
mix = [1, 1.5, 'Yes', 24, 5, [1, 2, 3]]

- أُلاحظ من المثال السابق أنَّ طول القائمة هو (6) عناصر، بالرغم من أنَّ بعض هذه العناصر مُركَّبة من عناصر أخرى.
طول القائمة: كم عنصراً فيها؟
- يُمكن للمُستخدم معرفة طول أيَّ قائمة باستخدام الدالة ()len
length_of_names = len(names)
length_of_ages = len(ages)
length_of_mix = len(mix)
لطباعة الأطوال استخدام الدالة ()print
- عند تشغيل البرنامج، ستظهر النتيجة الآتية على شاشة الحاسوب:
``python print("Length of names list:", length_of_names) print("Length of ages list:", length_of_ages) print("Length of mix list:", length_of_mix) ``

أُجرِّب وأستكشف:
أعمل - بالتعاون مع أفراد مجموعتي - على استخدام لغة البرمجة بايثون (Python)، لإنشاء قائمة تضمُّ أسماء طلبة المجموعة، وقائمة أُخرى تُبيّن هواياتهم المُفضَّلة. بعد ذلك أكتب الأوامر البرمجية، وأتحقَّق من صحتها عبر طباعة طول كل من القوائم وطباعة أسماء الطلاب مع هواياتهم المفضلة.
الوصول للعناصر في القائمة
الفهرس: كل عنصر له رقم موقع يبدأ من الصفر
- يُمكن للمُستخدم الوصول إلى أيَّ عنصر من عناصر القائمة باستخدام الأقواس المُربَّعة ورقم يُمثِّل موقع العنصر (index) في القائمة
```python mix = [1, 1.5, 'Yes', 24, 5, [1, 2, 3]]
print(mix[0]) print(mix[2]) print(mix[5]) ```

- أُلاحظ أنَّ ترقيم مواقع العناصر قد بدأ بالرقم (0)، لا بالرقم (1).
- وهذا يعني أنَّ قائمة من ستة عناصر (مثل mix) سيكون آخر عنصر فيها في الموقع (5) لا في الموقع (6).
- وإذا حاول المُستخدم استعمال رقم أعلى من (5)، فإنَّ ذلك سيؤدّي إلى توقُّف البرنامج عن العمل، أنظر الشكل (5-2).

- كذلك تتيح لغة البرمجة بايثون (Python) للمُستخدم استعمال أرقام سالبة للوصول إلى العناصر، حيث يرمز الرقم (1-) إلى العنصر الأخير، ويرمز الرقم (2-) إلى العنصر قبل الأخير وهكذا

أُجرِّب وأستكشف:
أكتب المقطع البرمجي اللازم لتعريف قائمة (months)، ثمَّ أضيف العناصر إليها. أستخدم موقع العنصر للوصول إلى العنصر ('May'). أستخدم الأعداد السالبة للوصول إلى العنصر ('Jun').
السؤال الثاني: أعلل: يُفضل استخدام الأرقام السالبة بدلاً من الموجبة في الوصول إلى عناصر القائمة بشكل عكسي..
إضاءة
المرور على القوائم
المرور على القائمة عنصراً عنصراً
- قد يلزم في بعض البرامج المرور على جميع العناصر في القائمة لأداء وظيفة ما
``python items = ["jacket", "T-shirt", "Skirt", "Trousers"] for e in items: print(e) ``
- كذلك يُمكن كتابة البرنامج السابق باستخدام نوع آخر من حلقات التكرار، هو حلقة (while)
``python length = len(items) i = 0 while i < length: print(items[i]) i += 1 ``
- استعمال المُتغيّر (i) للمرور على جميع مواقع العناصر في القائمة
- إذ بدأت قيمة هذا المُتغيّر عند الرقم (0)، وهو موقع العنصر الأوَّل، وانتهت قيمته عند موقع آخر عنصر في القائمة.
- الحاجة لمعرفة عدد المواقع التي سنقوم بالمرور عليها
- استخدام شرط حلقة التكرار للتأكد من عدم وصول قيمة المتغير i لطول القائمة
- لو كان طول القائمة 10 على سبيل المثال فإن آخر عنصر في القائمة موجود في الموقع 9 وليس في الموقع 10.
أُحلِّل وأستنتج: استناداً إلى المثال الوارد في الشكل (5-6):
ما سبب استخدام جملة التحكُّم (break) في السطر (5)؟ وما تأثير حذفها في ناتج تنفيذ البرنامج؟
ما دلالة استخدام الجملة range(len(readings) - 1)؟ وما تأثير تعديلها إلى range(len(readings)) في ناتج تنفيذ البرنامج؟
كيف يُمكن المرور على عناصر قائمة بالعكس؟
إضاءة
- يوجد نمط برمجي يستخدم متغير يلعب دور الراية (flag)
- البدء بافتراض نتيجة بحث.
- المرور على القائمة للتحقُّق من صحة الفرضية.
- طباعة النتيجة بعد الانتهاء من المرور على القائمة.
- وهذا النمط في كتابة البرامج مفيد في عملية البحث، وله استخدامات كثيرة.
العمليات في القوائم
العمليات: الجمع والتكرار والمقارنة والبحث
- توجد عمليَّات عِدَّة يُمكن تنفيذها في القوائم، مثل: الوصول إلى العناصر في قائمة ما، وإضافة عناصر جديدة إليها، وحذف عناصر منها، وترتيب العناصر فيها.
أُجرِّب وأُناقش: أُجرِّب تنفيذ كل جملة من الجمل الآتية:
- عند استخدام عامل الجمع (+) بين قائمتين، تنتج قائمة جديدة تحوي عناصر القائمتين معاً.
- ومن ثمَّ يُمكن استعمال العامل (=+) لتعديل قائمة، بإضافة عناصر قائمة أخرى إلى نهايتها

- كذلك يُمكن استخدام هذا العامل في إنشاء قائمة خطوة بخطوة كما في الشكل (5-7)؛ حيث يقوم البرنامج الموضح في المثال بقراءة أرقام وإضافتها إلى قائمة ويتوقف عند إدخال أي رقم سالب.
``python numbers = [] n = int(input("Enter a positive number: ")) while n >= 0: numbers += [n] n = int(input("Enter a positive number: ")) print(numbers) ``
- أُلاحظ على هذا البرنامج أنَّه بدأ بقائمة فارغة، ثمَّ أُضيفت العناصر تباعاً باستخدام العامل (=+).
- أُلاحظ أيضاً أنَّ الرقم (n) أُحيطت به الأقواس المُربَّعة [n]؛ لأنَّ العامل (=+) يؤدّي وظيفته بين قائمتين
- العامل (*) يعمل على تكرار قائمة ما عدداً من المَرَّات.
- كما أنَّه يُمكن المقارنة بين القوائم باستخدام عوامل المقارنة المنطقية (== و != و < و > و <= و >=)، التي تعمل على مقارنة كل عنصر في القائمة الأولى بالعنصر الذي يُقابله في القائمة الثانية.
``python print [1, 2, 3] + [98, 99, 100] print [1, 2, 3] + 5 print [1, 2, 3] + [5] print [1, 2, 3] * 4 print [1, 2, 3] * [1, 2, 3] ``
أيُّ الجمل يُمكن تنفيذها؟ أيُّ الجمل لا يُمكن تنفيذها؟
أعرِّف قائمتين فارغتين ثم أضيف خمسة أعداد إلى كل منهما. أستخدم عوامل المقارنة لطباعة عناصر القائمة الأصغر.
مثال:
- كذلك يُمثِّل التحقُّق من وجود عنصر ما في القائمة واحدةً من العمليات المُهمَّة في القوائم. وأسهل طريقة لعمل ذلك هي استخدام العامل (in)
- يُمكن أيضاً استخدام العامل (not in) في التحقُّق من عدم وجود عنصر ما في القائمة

الدوال الجاهزة لمعالجة القوائم
دوال جاهزة: أكبر، أصغر، ترتيب، عدّ
- العديد من الدوال المُشابهة تُوفِّرها اللغة للتعامل مع القوائم
- [1, 3, 5, 3, 2, 4] = numbers
| الشرح | المثال |
|---|---|
| تعمل (...)max على إيجاد أكبر عنصر في القائمة بافتراض أنَّ جميع العناصر هي من النوع نفسه. | >>> max(numbers) • 5 |
| تعمل (...)min على إيجاد أصغر عنصر في القائمة بافتراض أنَّ جميع العناصر هي من النوع نفسه. | >>> min(numbers) • 1 |
| تعمل (...)sorted على إعادة نسخة مُرتَّبة من القائمة (القائمة الأصلية تظلُّ من دون تعديل). | >>> result = sorted(numbers) • >>> print(result) • [1, 2, 3, 3, 4, 5] • >>> print(numbers) • [1, 3, 5, 3, 2, 4] |
| تعمل (...)count على عَدِّ عدد مَرَّات تكرار عنصر ما في القائمة. | >>> numbers.count(3) • 2 • >>> numbers.count(7) • 0 |
| تعمل (...)index على إيجاد موقع أوَّل ظهور لعنصر ما في القائمة. | >>> print(numbers) • [1, 3, 5, 3, 2, 4] • >>> numbers.index(5) • 2 • >>> numbers.index(3) • 1 |
- الطريقة الأولى تُستخدم في (min)، و(max)، و(sorted)، و(len)، و(print)، وتتمثَّل في إرسال القائمة إلى الدالة.
- الطريقة الثانية تُستخدم في (count)، و(index)، وتتمثَّل في استدعاء الوظيفة عن طريق ذكر اسم القائمة متبوعاً بنقطة، ثمَّ ذكر اسم الدالة.
- يُذكر أنَّ الدوال في كلتا الطريقتين لا تقوم بإجراء أيَّ تعديل على القائمة
| الشرح | المثال |
|---|---|
| تعمل ()sort على ترتيب عناصر القائمة (تُعدِّل القائمة نفسها بدلاً من إرجاع نسخة مُرتَّبة كما في (...)sorted). | >>> numbers = [1, 3, 5, 3, 2, 4] • >>> numbers.sort() • >>> print(numbers) • [1, 2, 3, 3, 4, 5] |
| تعمل ()reverse على عكس ترتيب العناصر في القائمة. | >>> numbers = [1, 3, 5, 3, 2, 4] • >>> numbers.reverse() • >>> print(numbers) • [4, 2, 3, 5, 3, 1] |
| تعمل (...)append على إضافة عنصر في آخر القائمة. | >>> numbers = [1, 3, 5, 3, 2, 4] • >>> numbers.append(99) • >>> print(numbers) • [1, 3, 5, 3, 2, 4, 99] |
| تعمل (...)remove على حذف أوَّل ظهور لعنصر ما في القائمة. | >>> numbers = [1, 3, 5, 3, 2, 4] • >>> numbers.remove(3) • >>> print(numbers) • [1, 5, 3, 2, 4] |
إضاءة
أُجرِّب وأستكشف:
أستخدم الدوال الجاهزة في طباعة أكبر عنصر وأصغر عنصر في القائمتين اللتين أنشأتهما في النشاط السابق. أستخدم الدوال الجاهزة في طباعة عناصر القائمة الأولى بشكل عكسي.
المواطنة الرقمية:
أقيّم تعلّمي: أسئلة المعرفة والمهارات
أُقيِّم تعلُّمي
السؤال الأوَّل: أعرف قائمة بالمدن التي أرغب بزيارتها.
السؤال الثالث: أذكر طريقتين مختلفتين (أو أكثر) لتنفيذ كل مهمة من المهام الآتية، ثمَّ أحدِّد أيُّ هذه الطرائق أسهل أو أفضل: طباعة العنصر الأوَّل في قائمة تتألَّف من (10) عناصر. طباعة العنصر الأخير في قائمة تتألَّف من (10) عناصر. ترتيب عناصر قائمة ما (باستخدام الدوال الجاهزة). إيجاد العنصر الأكبر في قائمة ما.
حذف جميع عناصر قائمة ما.
السؤال الأوَّل: أتتبَّع البرنامج الآتي من دون تشغيله (أتتبَّع كل جزء من البرنامج بصورة مُنفصلة)، ثمَّ أذكر ناتج تشغيله. ```python a = [1, 3, 5, 2, 0, 4]
1
for i in range(len(a)): print(max(a[i:]))
2
for i in range(1, len(a)): print(max(a[:i]))
3
for e in a[::-1]: a += [e] print(a) ```
السؤال الثاني: أُحدِّد الهدف الرئيس لكل برنامج من البرامج المُبيَّنة في الجدول الآتي ```python result = [] for e in a: if e < 0: result = [e] + result else: result += [e]
print(result) `` `python for row in a: temp = row[0] row[0] = row[-1] row[-1] = temp ` `python j = len(a) - 1 i = 0 for row in a: temp = row[i] row[i] = row[j] row[j] = temp i += 1 j -= 1 ``
المهمة الأولى: بناء قائمة من أرقام يدخلها المستخدم ثم طباعة عدد الأرقام الزوجية الموجودة في القائمة. المهمة الثانية: بناء قائمتين من أرقام يدخلها المستخدم ثم التحقق من وجود أي عنصر من عناصر القائمة الأولى في القائمة الثانية.