الوصول للعناصر ودالتي range() و len()
الحلقات رائعة، لكنك في كثير من الأحيان تريد الوصول إلى عنصر واحد فقط من القائمة في موضع تعرفه. إليك الطريقة:
words = ['This', 'is', 'a', 'list']
print(words[0])
print(words[1])
print(words[2])
print(words[3])
بوجه عام يمكنك الوصول إلى العنصر الموجود في الموضع i باستخدام words[i]. تسمى هذه العملية الفهرسة (Indexing/Subscripting)، ويسمى الموضع نفسه الفهرس (Index).
ربما لاحظت أن الفهرس الأول هو 0 وليس 1. في البرمجة يبدأ العد غالبًا من 0. قد يبدو ذلك غريبًا في البداية، لكنه الأسلوب المستخدم في معظم لغات البرمجة وله مزايا عملية.
وهذا يعني أيضًا أن آخر فهرس في قائمة تحتوي على 4 عناصر هو 3. ماذا يحدث إذا حاولت الوصول إلى فهرس أكبر من ذلك؟
كما رأيت، words[4] وما بعدها غير موجودة في هذه القائمة، ولذلك تؤدي محاولة الوصول إليها إلى خطأ.
كان البرنامج الأول متكررًا قليلًا. لنجعله أفضل باستخدام قائمة وحلقة:
words = ['This', 'is', 'a', 'list']
indices = [0, 1, 2, 3]
for index in indices:
print(index)
print(words[index])
هذا أفضل قليلًا، لكن كتابة [0, 1, 2, ...] يدويًا ليست عملية، خصوصًا عندما يصبح التسلسل طويلًا. توجد دالة مفيدة اسمها range تنشئ هذا النطاق لك. استبدل [0, 1, 2, 3] بـrange(4)، أي اجعل السطر indices = range(4).
كما ترى، النتيجة هي نفسها. جرّب الآن:
indices = range(4)
print(indices[0])
print(indices[1])
print(indices[2])
print(indices[3])
جرّب الآن 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. جرّب تشغيل هذا الكود:
words = ['This', 'is', 'a', 'list']
print(len(words))
تمرين: لأي قائمة غير فارغة اسمها words، اطبع العنصر الأخير. مثلًا إذا كانت:
words = ['This', 'is', 'a', 'list']
فيجب أن يطبع برنامجك list.
To access the last element of the list, you'll need the index of the last position.
If the list has 2 elements, the first element is at index 0, so the last element is at index 1.
Likewise, if the list had 3 elements, the last element would be at index 2.
Do you see a pattern between those numbers? How can you express it?
Can you come up with a general solution that works for any length?
بوجه عام تكون الفهارس الصالحة لقائمة words هي:
[0, 1, 2, ..., len(words) - 2, len(words) - 1]
يمكننا الآن إصلاح البرنامج السابق بحيث يعمل مع أي قائمة. املأ مكان ...:
words = ['This', 'is', 'a', 'list']
for index in ...:
print(index)
print(words[index])
مع قيمة words الموجودة في المثال يجب أن يكون الناتج:
0 This 1 is 2 a 3 list
تذكر أن earlier we used
range(4).This time, it should work for any list. What if the list has 5 elements, or 10?
Combine the two functions you learned!
إذا لم تكن مرتاحًا تمامًا مع range أو len بعد، خصص وقتًا قصيرًا للتجربة. يمكنك تنفيذ هذه التمارين الإضافية بنفسك:
- اطبع الأعداد من
1إلى100شاملًا. - اطبع اسمك 100 مرة.
- اطبع كل كلمة في قائمة اسمها
wordsما عدا الكلمة الأخيرة. - اطبع كلمات
wordsبترتيب عكسي؛ ابدأ بالكلمة الأخيرة ثم التي قبلها وهكذا. - ارجع إلى المسألة الإضافية في نهاية درس مقدمة القوائم، سواء حللتها من قبل أم لا؛ ستجدها الآن أسهل كثيرًا باستخدام
rangeوlen.
وعندما تصبح جاهزًا، انتقل إلى الدرس التالي لتجربة تحدٍ أكبر قليلًا.