Iterator ها
Iterator یک شیء است که دارای تعداد قابل شمارشی مقدار است.[۱]
Iterator شیءی است که میتوان در آن پیمایش کرد، یعنی میتوانید در بین همهٔ مقدارهای آن پیمایش کنید.
به لحاظ فنی، در پایتون، یک iterator شیءی است که پروتکل iterator را اجرا میکند که دارای متدهای __iter__()
و __next__()
است.
Iterator در مقابل Iterable
لیستها، تاپلها، دیکشنریها و مجموعهها همگی اشیاء iterable هستند. آنها ظرف های iterable هستند که میتوانید یک iterator از آنها بگیرید.
همهٔ اشیاء یک متد iter()
دارند که برای گرفتن یک iterator استفاده میشود:
مثال
یک iterator از یک تاپل را برمیگرداند و هر مقدار را چاپ میکند:
1 mytuple = ("apple", "banana", "cherry")
2 myit = iter(mytuple)
3
4 print(next(myit))
5 print(next(myit))
6 print(next(myit))
حتی رشتهها هم اشیاء iterable هستند و میتوانند یک iterator برگردانند:
مثال
همچنین رشتهها اشیاء iterable هستند و شامل دنباله ای از کاراکترها میشوند:
1 mystr = "banana"
2 myit = iter(mystr)
3
4 print(next(myit))
5 print(next(myit))
6 print(next(myit))
7 print(next(myit))
8 print(next(myit))
9 print(next(myit))
پیمایش در یک Iterator
میتوان از یک حلقه for
برای پیمایش در یک شیء iterable استفاده کرد:
مثال
مقدارهای یک تاپل را پیمایش میکند:
1 mytuple = ("apple", "banana", "cherry")
2
3 for x in mytuple:
4 print(x)
مثال
کاراکترهای رشته را پیمایش میکند:
1 mystr = "banana"
2
3 for x in mystr:
4 print(x)
در واقع حلقه for
یک شیء iterator ایجاد میکند و متد next() را برای هر حلقه اجرا میکند.
ایجاد یک Iterator
برای ایجاد یک کلاس/ شیء بعنوان یک iterator باید متدهای __iter__()
و __next__()
را در شیء خود پیادهسازی کنید.
همانطور که در بخش کلاسها / اشیاء پایتون آموختید، همه کلاسها تابعی به نام __init__()
دارند که هنگام ایجاد شیء امکان مقداردهی اولیه را فراهم میکند.
متد __iter__()
بطور مشابه عمل میکند، میتوانید عملیات (initializing و غیره) انجام دهید، اما باید همیشه خود شیء iterator را برگرداند.
متد __next__()
هم امکان انجام عملیات را فراهم میکند، و باید آیتم بعدی در دنباله را برگرداند.
مثال
یک iterator ایجاد میکند که اعداد را برمیگرداند، از ۱ شروع میشود و هر دنباله یکی اضافه میشود (۱، ۲، ۳، ۴، ۵ و غیره را برمیگرداند):
کلاس MyNumbers:
1 class MyNumbers:
2 def __iter__(self):
3 self.a = 1
4 return self
5
6 def __next__(self):
7 x = self.a
8 self.a += 1
9 return x
10
11 myclass = MyNumbers()
12 myiter = iter(myclass)
13
14 print(next(myiter))
15 print(next(myiter))
16 print(next(myiter))
17 print(next(myiter))
18 print(next(myiter))
StopIteration
مثال بالا برای همیشه ادامه پیدا میکند اگر عبارتهای next() کافی داشته باشید یا اگر در یک حلقه for
استفاده میشد.
برای جلوگیری از ادامه پیدا کردن iteration تا ابد، میتوانیم از عبارت StopIteration
استفاده کنیم.
در متد __next__()
، میتوانیم یک شرط خاتمه تعریف کنیم تا در صورتیکه iteration از تعداد دفعات خاصی بیشتر شد، خطا بدهد:
مثال
1 class MyNumbers:
2 def __iter__(self):
3 self.a = 1
4 return self
5
6 def __next__(self):
7 if self.a <= 20:
8 x = self.a
9 self.a += 1
10 return x
11 else:
12 raise StopIteration
13
14 myclass = MyNumbers()
15 myiter = iter(myclass)
16
17 for x in myiter:
18 print(x)
منابع آموزشی