cb
codebamin
الفصل 6 · القوائم (Lists)

الوصول للعناصر ودالتي range() و len()

الحلقات رائعة، لكنك في كثير من الأحيان تريد الوصول إلى عنصر واحد فقط من القائمة في موضع تعرفه. إليك الطريقة:

__program_indented__

بوجه عام يمكنك الوصول إلى العنصر الموجود في الموضع i باستخدام words[i]. تسمى هذه العملية الفهرسة (Indexing/Subscripting)، ويسمى الموضع نفسه الفهرس (Index).

ربما لاحظت أن الفهرس الأول هو 0 وليس 1. في البرمجة يبدأ العد غالبًا من 0. قد يبدو ذلك غريبًا في البداية، لكنه الأسلوب المستخدم في معظم لغات البرمجة وله مزايا عملية.

وهذا يعني أيضًا أن آخر فهرس في قائمة تحتوي على 4 عناصر هو 3. ماذا يحدث إذا حاولت الوصول إلى فهرس أكبر من ذلك؟

كما رأيت، words[4] وما بعدها غير موجودة في هذه القائمة، ولذلك تؤدي محاولة الوصول إليها إلى خطأ.

كان البرنامج الأول متكررًا قليلًا. لنجعله أفضل باستخدام قائمة وحلقة:

__program_indented__

هذا أفضل قليلًا، لكن كتابة [0, 1, 2, ...] يدويًا ليست عملية، خصوصًا عندما يصبح التسلسل طويلًا. توجد دالة مفيدة اسمها range تنشئ هذا النطاق لك. استبدل [0, 1, 2, 3] بـrange(4)، أي اجعل السطر indices = range(4).

كما ترى، النتيجة هي نفسها. جرّب الآن:

__copyable__ __program_indented__

جرّب الآن indices[4] في الطرفية.

range(4) تشبه [0, 1, 2, 3] إلى حد كبير... لكنها ليست الشيء نفسه تمامًا. جرّب range(4) في الطرفية.

قد تكون النتيجة مفاجئة قليلًا. إذا كنت فضوليًا: العدد 0 يمثل بداية النطاق. والبداية الافتراضية هي 0، لذلك range(4) تكافئ range(0, 4). أما 4 فهو نهاية النطاق، لكن قيمة النهاية لا تُضمَّن، ولذلك آخر قيمة هي 3. إذا بدا ذلك مربكًا الآن فلا تقلق.

هناك سبب جيد لكون range(4) ليست قائمة فعلية؛ فهذا يجعل البرامج أسرع وأكثر كفاءة. لا نحتاج إلى تفاصيل ذلك الآن.

ومع ذلك يمكنك تحويلها بسهولة إلى قائمة. جرّب list(range(4)) في الطرفية.

كان ذلك مجرد عرض لتتمكن من رؤية النطاق في صورة مألوفة، ولن تحتاج عادة إلى تحويل range إلى قائمة بهذه الطريقة.

إذا شعرت أن المعلومات كثيرة، ركّز على القاعدة الأساسية: range(n) تشبه جدًا القائمة:

[0, 1, 2, ..., n - 2, n - 1]

وبالمناسبة، يمكنك معرفة عدد العناصر داخل قائمة، ويسمى عادة الطول (Length)، باستخدام الدالة len. جرّب تشغيل هذا الكود:

__copyable__ __program_indented__

تمرين: لأي قائمة غير فارغة اسمها words، اطبع العنصر الأخير. مثلًا إذا كانت:

__no_auto_translate__ words = ['This', 'is', 'a', 'list']

فيجب أن يطبع برنامجك list.

بوجه عام تكون الفهارس الصالحة لقائمة words هي:

[0, 1, 2, ..., len(words) - 2, len(words) - 1]

يمكننا الآن إصلاح البرنامج السابق بحيث يعمل مع أي قائمة. املأ مكان ...:

__copyable__ __no_auto_translate__ words = ['This', 'is', 'a', 'list']

for index in ...: print(index) print(words[index])

مع قيمة words الموجودة في المثال يجب أن يكون الناتج:

0 This 1 is 2 a 3 list

إذا لم تكن مرتاحًا تمامًا مع range أو len بعد، خصص وقتًا قصيرًا للتجربة. يمكنك تنفيذ هذه التمارين الإضافية بنفسك:

  • اطبع الأعداد من 1 إلى 100 شاملًا.
  • اطبع اسمك 100 مرة.
  • اطبع كل كلمة في قائمة اسمها words ما عدا الكلمة الأخيرة.
  • اطبع كلمات words بترتيب عكسي؛ ابدأ بالكلمة الأخيرة ثم التي قبلها وهكذا.
  • ارجع إلى المسألة الإضافية في نهاية درس مقدمة القوائم، سواء حللتها من قبل أم لا؛ ستجدها الآن أسهل كثيرًا باستخدام range وlen.

وعندما تصبح جاهزًا، انتقل إلى الدرس التالي لتجربة تحدٍ أكبر قليلًا.

solution.py
1
2
3
4
5
6
7
8
9
10
الطرفية (shell)
>>>