في لغة بايثون، تُعتبر خاصية Iterators (المُكرِّرات) أدوات قوية تُمكنك من التكرار على عناصر مجموعة بيانات (مثل القوائم، الصفوف، القواميس، والمجموعات) بشكل مُتسلسل، عنصرًا تلو الآخر، دون الحاجة إلى معرفة تفاصيل بنية البيانات الداخلية.
ما هي الـ Iterator؟
الـ Iterator هو كائن يُمكنك من الوصول إلى عناصر مجموعة بيانات بشكل مُتسلسل باستخدام الدالة next()
. يحتفظ الـ Iterator بحالة التكرار الحالية، أي أنه يتذكر العنصر الذي تم جلبه في المرة السابقة.
كيف تعمل الـ Iterators؟
-
الـ Iterable: هو الكائن الذي يُمكن تحويله إلى Iterator، مثل القوائم، الصفوف، السلاسل النصية، وغيرها. يحتوي الـ Iterable على الدالة
__iter__()
التي تُعيد كائن Iterator. -
الدالة
iter()
: تُستخدم لتحويل الـ Iterable إلى Iterator. -
الدالة
next()
: تُستخدم لجلب العنصر التالي في التسلسل من الـ Iterator. عندما لا يتبقى عناصر، تُطلق هذه الدالة الاستثناءStopIteration
.
مثال:
my_list = [1, 2, 3, 4, 5]
# تحويل القائمة إلى Iteratormy_iterator = iter(my_list)
# جلب العناصر باستخدام next()print(next(my_iterator)) # Output: 1print(next(my_iterator)) # Output: 2print(next(my_iterator)) # Output: 3print(next(my_iterator)) # Output: 4print(next(my_iterator)) # Output: 5
# محاولة جلب عنصر بعد انتهاء العناصر تُسبب إطلاق StopIteration# print(next(my_iterator)) # تُطلق StopIteration
استخدام الـ Iterators في حلقات for
:
حلقات for
في بايثون تستخدم الـ Iterators بشكل ضمني. عند استخدام حلقة for
للتكرار على كائن، فإن بايثون تُحوّل الكائن أولاً إلى Iterator ثم تستخدم الدالة next()
لجلب العناصر حتى يتم إطلاق الاستثناء StopIteration
.
my_list = [10, 20, 30]
for item in my_list: print(item)
# Output:# 10# 20# 30
إنشاء Iterator خاص:
يُمكنك إنشاء Iterator خاص بك عن طريق تعريف كلاس يحتوي على الدوال __iter__()
و __next__()
.
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 للتكرار على الـ Iteratorfor num in numbers: print(num)
# Output:# 1# 2# 4# 8
فوائد استخدام الـ Iterators:
- كفاءة الذاكرة: لا يتم تحميل جميع عناصر المجموعة في الذاكرة مرة واحدة، بل يتم جلبها عند الحاجة، مما يُوفر الذاكرة خاصةً عند التعامل مع مجموعات بيانات ضخمة.
- المرونة: تُمكنك من التكرار على أنواع مختلفة من البيانات بشكل مُتسلسل.
- قابلية التخصيص: يُمكنك إنشاء Iterators خاصة بك لتلبية احتياجاتك.