مفهوم الـ Iterator في بايثون
Iterator في Python هو أي شيء يسمح لنا بالتكرار على عناصر مجموعة من البيانات (collection)، وبشكل تتابعي وفي نفس الوقت يمكن استخدامه في حلقة التكرار (loop) للتعامل مع العناصر الموجودة في المجموعة.
بمعنى آخر، Iterator هو عبارة عن كائن يُمثل مجموعة من البيانات، ويمكن استخدامه للحصول على العناصر الفردية في المجموعة بشكل تتابعي. وبإمكانك استخدام Iterator في حلقة التكرار for loop، باستخدام دالة next() للوصول إلى العناصر الفردية في المجموعة.
يمكن إنشاء Iterator في Python باستخدام دالة iter() وعادةً ما يتم تنفيذ Iterator لتناسب مجموعات مختلفة مثل القوائم (lists) والمجموعات (sets).
الفرق بين الـ Iterator و الـ Iterable
في بايثون، الـ Iterator والـ Iterable هما مفاهيم مختلفة.
- - Iterable:
- - Iterator:
بمعنى آخر، فإن Iterable هو الكائن الذي يمكن التكرار عليه، بينما Iterator هو الكائن الذي يتحكم في عملية التكرار بناء على الـ iterable.
لتوضيح الأمر، يمكن استخدام دالة iter() في بايثون للحصول على Iterator من Iterable، مثلاً:
my_list = [1, 2, 3]
my_iter = iter(my_list)
هنا، يتم إنشاء Iterator my_iter من Iterable my_list . يمكن استخدام الـ Iterator للتكرار على قائمة my_list باستخدام دالة next() :
print(next(my_iter)) # output: 1
print(next(my_iter)) # output: 2
print(next(my_iter)) # output: 3
بعد ذلك، سيتم رفع StopIteration عندما يتم الوصول إلى نهاية الـ Iterable ولا يمكن استرجاع مزيد من القيم.
التعامل مع الـ Iterator
Iterator هو عبارة عن كائن في Python يتيح لك الوصول إلى عناصر مجموعة بشكل تسلسلي وفي الوقت المناسب. يمكن استخدامه مع أي نوع من المجموعات مثل القوائم، الأطر، القواميس، والمجموعات.
للاستفادة من Iterator في Python، يجب تنفيذ ثلاث وظائف رئيسية:
- استدعاء الدالة iter() على المجموعة التي تريد التفريغ عناصرها.
- استخدام دالة next() للحصول على القيمة التالية في التسلسل.
- حل أي استثناء StopIteration يحدث عندما تصل إلى نهاية التسلسل.
هذا هو مثال بسيط يوضح كيفية استخدام iterator في Python باستخدام قائمة:
# بدء تعريف القائمة
my_list = [4, 7, 0, 3]
# استدعاء دالة iter() على القائمة
my_iter = iter(my_list)
# الحصول على القيمة التالية في التسلسل
print(next(my_iter)) # 4
print(next(my_iter)) # 7
# الحصول على القيمة التالية في التسلسل
print(next(my_iter)) # 0
print(next(my_iter)) # 3
# حل استثناء StopIteration بعد الانتهاء من جميع العناصر
try:
print(next(my_iter))
except StopIteration:
print("Reached the end of the list.")
هذا هو مثال مبسط على كيفية استخدام Iterator لإظهار كل عنصر في قائمة. يمكن استخدام نفس الأسلوب للاستفادة من Iterator مع أي نوع آخر من المجموعات في Python.
المرور على قيم الـ Iterator بواسطة الحلقة for
يمكن استخدام حلقة الـfor في لغة البرمجة Python للمرور على قيم الـ Iterator بسهولة. يمكن تحديد متغير لاستيعاب كل قيمة في دورة الحلقة، كما يلي:
my_iterable = [1, 2, 3]
for item in my_iterable:
print(item)
في هذا المثال، تم إنشاء قائمة my_iterable بقيم [1، 2، 3] . ثم يتم استخدام حلقة الـ for لتمرير كل قيمة من القائمة my_iterable إلى المتغير item وطباعة هذه القيمة باستخدام الأمر print() . وبالتالي، سيتم طباعة القيم التالية:
1
2
3
يرجى ملاحظة أنه يمكن استخدام الـ Iterator بدلاً من القائمة مباشرة في الحلقة for ، مثل:
my_iterator = iter([1, 2, 3])
for item in my_iterator:
print(item)
وسيؤدي ذلك إلى نفس النتيجة المطلوبة.
امثلة حول إنشاء Iterator
يمكننا إعطاء مثال حول إنشاء Iterator لقائمة بأرقام عشوائية. الهدف هو تمكين استخدام القائمة في حلقة for-in .
في هذا المثال، سنستخدم لغة Python:
import random
class RandomNumbers:
def __init__(self, length):
self.length = length
self.numbers = [random.randint(0, 100) for _ in range(length)]
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index >= self.length:
raise StopIteration()
else:
result = self.numbers[self.index]
self.index += 1
return result
في هذا المثال، قمنا بإنشاء فئة جديدة تسمى RandomNumbers . تأخذ هذه الفئة طولًا كمدخل وتنشئ قائمة من الأرقام العشوائية بالطول المحدد.
تتضمن الفئة دالتين، __iter__() و __next__() ، وهما المطلوبان لإنشاء Iterator . تقوم __iter__() بإرجاع self ، بينما يتم استخدام __next__() لإرجاع العناصر الفردية في القائمة. تتبع متغير فهرس self.index نقطة التشغيل الحالية في القائمة، مع زيادته بمقدار واحد بعد كل عنصر.
يمكن استخدام هذا المثال على النحو التالي:
random_numbers = RandomNumbers(5)
for number in random_numbers:
print(number)
ستعرض هذه الحلقة الأرقام الخمس العشوائية في القائمة التي تم إنشاؤها بواسطة فئة RandomNumbers .