بايثون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().
الدالة next() مصممة لإرجاع القيمة التالية في الـ Iterator في كل مرة تستدعى فيها.
في حال وصلت إلى آخر قيمة موجودة فيه ثم قمنا باستدعائها من جديد فإنها سترجع الخطأ StopIteration.
إذاً، الفرق المهم بين الـ Iterable و الـ Iterator هو أن هذا الأخير لا يمكنه الوصول بشكل مباشر لقيمة محددة فيه.
التعامل مع الـ Iterator
للحصول على نسخة من كائن نوعه Iterable ككائن نوعه Iterator، نستخدم دالة جاهزة في بايثون إسمها iter().
في المثال التالي قمنا بإنشاء list وضعنا فيه 3 قيم.
بعدها قمنا بإنشاء iterator منه، و من ثم عرضنا القيم الموجودة فيه الواحدة تلو الأخرى.
مثال
النتيجة
Orange
Apple
المرور على قيم الـ Iterator بواسطة الحلقة for
في المثال التالي قمنا بإنشاء list وضعنا فيه 3 قيم.
بعدها قمنا باستخدام الحلقة for لعرض القيم الموجودة فيه الواحدة تلو الأخرى.
المثال الأول
النتيجة
Orange
Apple
الذي عليك معرفته هنا هو أن مفسر لغة بايثون يقوم بتحويل الحلقة for إلى كائن iterator و على هذا الأساس فإن الحلقة ترجع لك القيمة التالية في كل دورة.
إذاً، الحلقة for التي نستخدمها للمرور على قيم أي Iterable كما يلي.
فعلياً مفسر لغة بايثون يقوم داخلياً بالتعامل مع الحلقة على النحو التالي.
لست مضطر أن تفهم طريقة عمل الحلقة for بشكل دقيق جداُ في هذه المرحلة و لكن يفضل أن تعرف ذلك لتفهم كيف تعمل لغة بايثون و تزيد خبرتك في التعامل معها. كما أنك ستفهم الكود الذي كتبناه الآن بسهولة في دروس لاحقة حين تتعلم كيف تعالج الأخطاء البرمجية باستخدام الكلمتين try و except.
في المثال التالي قمنا بالمرور على جميع أحرف النص و عرضهم واحداً تلو الآخر باستخدام الحلقة for.
المثال الثاني
النتيجة
y
t
h
o
n
بما أن الحلقة for ترجع الحرف التالي الموجود في النص في كل دورة، فهذا يعني أن النوع str أيضاً يعتبر Iterable.
أمثلة حول إنشاء Iterator
في المثال التالي قمنا ببناء كلاس يعطينا Iterator يعطينا عدد لا نهائي من القيم ( Infinite Iterator ).
المثال الأول
النتيجة
2
3
4
5
في المثال التالي قمنا ببناء كلاس يعطينا Iterator يعطينا القيم المضاعفة للعدد 2 مع جعل المستخدم قادر على تحديد عدد القيم الأقصى الذي سيتم إرجاعه.
المثال الثاني
النتيجة
4
8
16
32