بايثونIterators
- مفهوم الـ Iterator
- الفرق بين الـ Iterator و الـ Iterable
- التعامل مع الـ Iterator
- المرور على قيم الـ Iterator بواسطة الحلقة for
- أمثلة حول إنشاء Iterator
مفهوم الـ Iterator
الـ Iterator عبارة عن كائن يحتوي على عدد محدد من القيم التي يتم تخزينها بالترتيب وراء بعضها البعض حيث أنك عندما تريد الوصول إلى القيم التي فيه فإنك تستطيع الوصول إلى قيمه الواحدة تلو الأخرى بنفس الترتيب الذي تم تخزينهم فيه.
فعلياً, كلما وصلت إلى قيمة فيه تصبح قادر على الوصول إلى القيمة التالية الموضوعة بعدها مباشرةً.
معلومة تقنية
الـ Iterator في بايثون عبارة عن كائن يطبق بروتوكول يقال له Iterator Protocol.
هذا البروتوكول يتم تطبيقه من خلال إستدعاء الدالتين المجهزتين لذلك: __iter__() و __next__().
و بالتالي تستطيع إنشاء Iterator بنفسك إذا فعلت Override لهاتين الدالتين بشكل صحيح في حال أردت ذلك.
الفرق بين الـ Iterator و الـ Iterable
عند إنشاء كائن list, tuple, set, أو dict فإنك بذلك تنشئ كائن نوعه Iterable حيث أنك تستطيع الوصول لقيمة أي عنصر فيهم بشكل مباشر من خلال ذكر رقم الـ Index أو الـ Key الخاص بالعنصر.
كائن الـ Iterator لا يمكن الوصول لقيم محددة فيه, لأنه كما سبق و قلنا يمكنك الوصول لقيمه بنفس الترتيب الذي تم تخزينهم فيه.
في كل مرة تريد فيها الحصول على القيمة التالية فيه سيكون عليك إستدعاء دالة إسمها next().
هذه الدالة مصممة لإعطاءك القيمة التالية في الـ Iterator في كل مرة تستدعيها فيها.
في حال وصلت إلى نهاية الـ Iterator - أي إلى آخر قيمة فيه - و قمت باستدعاءها, سترجع لك الخطأ StopIteration.
الفرق المهم بين الـ Iterable و الـ Iterator هو أن هذا الأخير لا يمكن الوصول بشكل مباشر لقيمة محددة فيه.
التعامل مع الـ Iterator
في البداية, للحصول على نسخة من كائن نوعه Iterable ككائن نوعه Iterator, نستخدم دالة جاهزة في بايثون إسمها iter().
في المثال التالي قمنا بإنشاء list وضعنا فيه 3 قيم.
بعدها قمنا بإنشاء iterator منه, و من ثم عرضنا القيم الموجودة فيه الواحدة تلو الأخرى.
مثال
سنحصل على النتيجة التالية عند تشغيل الملف Test
.
Orange
Apple
المرور على قيم الـ Iterator بواسطة الحلقة for
في المثال التالي قمنا بإنشاء list وضعنا فيه 3 قيم.
بعدها قمنا باستخدام الحلقة for لعرض القيم الموجودة فيه الواحدة تلو الأخرى.
المثال الأول
سنحصل على النتيجة التالية عند تشغيل الملف Test
.
Orange
Apple
معلومة تقنية
الذي عليك معرفته هنا هو أن مفسر لغة بايثون يقوم بتحويل الحلقة for إلى كائن iterator و على هذا الأساس فإن الحلقة ترجع لك القيمة التالية في كل دورة.
إذاً الحلقة for التي تستخدمها للمرور على قيم أي Iterable كالتالي.
فعلياً مفسر لغة بايثون يقوم داخلياً بالتعامل مع الحلقة for كالتالي.
لست مضطر لفهم طريقة عمل الحلقة for بشكل دقيق جداُ في هذه المرحلة, لكن يفضل أن تعرف ذلك لتفهم كيف تعمل لغة بايثون و تزيد خبرتك في التعامل معها.
كما أنك ستفهم الكود الذي كتبناه الآن بكل سهولة في دروس لاحقة حين تتعلم كيف تعالج الأخطاء البرمجية باستخدام الكلمتين try و except.
في المثال التالي قمنا بالمرور على جميع أحرف النص و عرضهم واحداً تلو الآخر باستخدام الحلقة for.
المثال الثاني
سنحصل على النتيجة التالية عند تشغيل الملف Test
.
y
t
h
o
n
بما أن الحلقة for ترجع الحرف التالي الموجود في النص في كل دورة, فهذا يعني أن النوع str أيضاً يعتبر Iterable.
أمثلة حول إنشاء Iterator
في المثال التالي قمنا ببناء كلاس يعطينا Iterator لا نهاية له. أي قمنا ببناء Infinite Iterator.
المثال الأول
سنحصل على النتيجة التالية عند تشغيل الملف Test
.
2
3
4
5
في المثال التالي قمنا ببناء كلاس يعطينا Iterator يعطينا القيم المضاعفة للعدد 2 مع جعل المستخدم قادر على تحديد عدد القيم الأقصى الذي سيتم إرجاعه.
المثال الثاني
سنحصل على النتيجة التالية عند تشغيل الملف Test
.
4
8
16
32