في لغة بايثون، تُعتبر خاصية Iterators (المُكرِّرات) أدوات قوية تُمكنك من التكرار على عناصر مجموعة بيانات (مثل القوائم، الصفوف، القواميس، والمجموعات) بشكل مُتسلسل، عنصرًا تلو الآخر، دون الحاجة إلى معرفة تفاصيل بنية البيانات الداخلية.

ما هي الـ Iterator؟

الـ Iterator هو كائن يُمكنك من الوصول إلى عناصر مجموعة بيانات بشكل مُتسلسل باستخدام الدالة next(). يحتفظ الـ Iterator بحالة التكرار الحالية، أي أنه يتذكر العنصر الذي تم جلبه في المرة السابقة.

كيف تعمل الـ Iterators؟

  1. الـ Iterable: هو الكائن الذي يُمكن تحويله إلى Iterator، مثل القوائم، الصفوف، السلاسل النصية، وغيرها. يحتوي الـ Iterable على الدالة __iter__() التي تُعيد كائن Iterator.

  2. الدالة iter(): تُستخدم لتحويل الـ Iterable إلى Iterator.

  3. الدالة next(): تُستخدم لجلب العنصر التالي في التسلسل من الـ Iterator. عندما لا يتبقى عناصر، تُطلق هذه الدالة الاستثناء StopIteration.

مثال:

Python
my_list = [1, 2, 3, 4, 5]

# تحويل القائمة إلى Iterator
my_iterator = iter(my_list)

# جلب العناصر باستخدام next()
print(next(my_iterator)) # Output: 1
print(next(my_iterator)) # Output: 2
print(next(my_iterator)) # Output: 3
print(next(my_iterator)) # Output: 4
print(next(my_iterator)) # Output: 5

# محاولة جلب عنصر بعد انتهاء العناصر تُسبب إطلاق StopIteration
# print(next(my_iterator)) # تُطلق StopIteration

استخدام الـ Iterators في حلقات for:

حلقات for في بايثون تستخدم الـ Iterators بشكل ضمني. عند استخدام حلقة for للتكرار على كائن، فإن بايثون تُحوّل الكائن أولاً إلى Iterator ثم تستخدم الدالة next() لجلب العناصر حتى يتم إطلاق الاستثناء StopIteration.

Python
my_list = [10, 20, 30]

for item in my_list:
print(item)

# Output:
# 10
# 20
# 30

إنشاء Iterator خاص:

يُمكنك إنشاء Iterator خاص بك عن طريق تعريف كلاس يحتوي على الدوال __iter__() و __next__().

Python
class PowTwo:
"""Class to implement an iterator
of powers of two"""

def __init__(self, max=0):
self.max = max
self.n = 0

def __iter__(self):
return self

def __next__(self):
if self.n <= self.max:
result = 2 ** self.n
self.n += 1
return result
else:
raise StopIteration

# إنشاء كائن من الكلاس
numbers = PowTwo(3)

# استخدام حلقة for للتكرار على الـ Iterator
for num in numbers:
print(num)

# Output:
# 1
# 2
# 4
# 8

فوائد استخدام الـ Iterators:

  • كفاءة الذاكرة: لا يتم تحميل جميع عناصر المجموعة في الذاكرة مرة واحدة، بل يتم جلبها عند الحاجة، مما يُوفر الذاكرة خاصةً عند التعامل مع مجموعات بيانات ضخمة.
  • المرونة: تُمكنك من التكرار على أنواع مختلفة من البيانات بشكل مُتسلسل.
  • قابلية التخصيص: يُمكنك إنشاء Iterators خاصة بك لتلبية احتياجاتك.