؛

التنقل في المنتدى
تحتاج لتسجيل الدخول لإنشاء مشاركات أو مواضيع.

بايثون3 مِن مدارس w3-27Python Iterators

تنويه:
لِأن التاب لا تظهر على الصفحة, و هي شيء مهم جدا في الإزاحة في كود بايثون
لذلك فإننا سنستبدل التاب بالكلمة 'tab' على هذه الصفحة
و مِن الأفضل إذا شئت أن تنسخ أي كود, أن تأخذه مِن الملف النصي, أو الملفات المُرفقة.
ال Iterators في بايثون

ال Iterators في بايثون
ال iterator هو كائن يحتوي على عدد قابل للعد من القيم.
الiterator هو كائن يمكن التكرار خلاله ، مما يعني أنه يمكنك اجتياز جميع القيم فيه.
من الناحية الفنية ، في Python ، الiterator هو كائن يقوم بتنفيذ بروتوكول iterator ، والذي يتكون من الوظيفتين __iter__ () و__next _ _ ().

Iterator مقابل Iterable
القوائم ، المجموعات ، القواميس والمجموعات كلها كائنات قابلة للتكرار خلالها يعني هي iterable.
و قابلة للتكرار خلالها, يعني أننا يمكن أن نمر على عناصرها بالحلقة for.
و لذلك فإنها حاويات متكررة يمكنك الحصول على iterator منها.
كل هذه الكائنات لها وظيفة iter() التي تستخدم للحصول على iterator منها:
مثال
إرجاع مكرر أو iterator من المصفوفة (tuple) ، وطباعة كل قيمة:
mytuple = ("apple", "banana", "cherry")
myit = iter(mytuple)

print(next(myit))
print(next(myit))
print(next(myit))

ستكون النتيجة:
apple
banana
cherry
جربها بنفسك مِن ملف iterator.py

حتى السلاسل النصيِّة عبارة عن كائنات قابلة للتكرار (iterable)، ويمكنها إرجاع مكرر أو iterator:
مثال
السلاسل النصيِّة هي أيضًا كائنات قابلة للتكرار أي iterable، وتحتوي على سلسلة من الأحرف:
mystr = "banana"
myit = iter(mystr)

print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))

ستكون النتيجة:
b
a
n
a
n
a
جربها بنفسك مِن ملف iterator2.py

حلقات من خلال مكرر(iterator)
يمكننا أيضًا استخدام الحلقة for للتكرار خلال كائن قابل للتكرار يعني iterable:
مثال
عمل حلقة أو التكرار خلال قيم tuple:
mytuple = ("apple", "banana", "cherry")

for x in mytuple:
tab print(x)

ستكون النتيجة:
apple
banana
cherry
جربها بنفسك مِن ملف iterator_loop.py

مثال
عمل حلقة و التكرار خلال أحرفْ سلسلة نصيَّة:
mystr = "banana"

for x in mystr:
tab print(x)

ستكون النتيجة:
b
a
n
a
n
a
جربها بنفسك مِن ملف iterator_loop2.py
الحلقة for بالواقع تقوم بإنشاء كائن مكرر أو iterator وتنفيذ الوظيفة next() لكل دورة.

إنشاء مكرر أو iterator
لإنشاء كائن / فئة ليكون iterator عليك بتنفيذ الوظائف _ _ iter__ () و __next__ () إلى الكائن الخاص بك.
كما تعلمت في فصل Python Classes / Objects ، تحتوي جميع الفئات على وظيفة تسمى _ _ init__ () ، والتي تسمح لك بإجراء بعض التهيئة عند إنشاء الكائن.
تعمل وظيفة _ _ iter__ () بشكل مشابه ، يمكنك القيام بعمليات (تهيئة إلخ.) ، ولكن يجب دائما إرجاع الكائن المكرر نفسه.
تسمح لك وظيفة __ next _ _ () أيضا بإجراء العمليات ، ويجب إرجاع العنصر التالي في التسلسل.

مثال
سنقوم بإنشاء مكرر أو iterator يقوم بإرجاع الأرقام ، بدءا من 1 ، وسيزيد كل تسلسل بمقدار واحد (إرجاع 1 ، 2 ، 3 ، 4 ، 5 إلخ.):
class MyNumbers:
tab def __iter__(self):
tab tab self.a = 1
tab tab return self

tab def __next__(self):
tab tab x = self.a
tab tab self.a += 1
tab tab return x

myclass = MyNumbers()
myiter = iter(myclass)

print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))

ستكون النتيجة:
1
2
3
4
5
جربها بنفسك مِن ملف iterator_create.py

إيقاف التكرار (Iteration)
سيستمر المثال أعلاه إلى الأبد إذا كان لديك ما يكفي من العبارات next() ، أو إذا تم استخدامه في الحلقة for.
لمنع التكرار من الاستمرار إلى الأبد ، يمكننا استخدام العبارة StopIteration.
في الوظيفة __next__() ، يمكننا إضافة شرط إنْهاء لإثارة خطأ إذا تم التكرار لعدد محدد من المرات:
مثال
إيقاف بعد 20 تكرار:
class MyNumbers:
tab def __iter__(self):
tab tab self.a = 1
tab tab return self

tab def __next__(self):
tab tab if self.a <= 20:
tab tab tab x = self.a
tab tab tab self.a += 1
tab tab tab return x
tab tab else:
tab tab tab raise StopIteration

myclass = MyNumbers()
myiter = iter(myclass)

for x in myiter:
tab print(x)

ستكون النتيجة:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
جربها بنفسك مِن ملف iterator_create2.py

الدرس مع الملفات المُرفقة:
https://www.dropbox.com/s/jr4ntg420hha5nb/27Python%20Iterators.zip?dl=1

Skip to content