تکرارکننده ها (Iterators)
تکرارکننده یا Iterator شیئی است که مجموعه ای شمارش پذیر از مقادیر را در خود دارد و می توان روی آن پیمایش انجام داد. در پایتون، یک تکرارکننده شیئی است که پروتکل تکرار را پیاده سازی می کند، یعنی شامل متدهای __iter__() و __next__() باشد.
تفاوت Iterator و Iterable
ساختارهایی مانند لیست، تاپل، دیکشنری و مجموعه ها همگی Iterable هستند و می توان از آن ها تکرارکننده گرفت. برای این کار از تابع iter() استفاده می کنیم:
mytuple = ("apple", "banana", "cherry")
myit = iter(mytuple)
print(next(myit))
print(next(myit))
print(next(myit))حتی رشته ها نیز قابل پیمایش هستند:
mystr = "banana"
myit = iter(mystr)
print(next(myit))
print(next(myit))
print(next(myit))حلقه روی تکرارکننده
برای پیمایش مقادیر یک شیء قابل تکرار می توان از حلقه for استفاده کرد. در واقع حلقه for پشت صحنه یک تکرارکننده می سازد و متد next() را صدا می زند:
mytuple = ("apple", "banana", "cherry")
for x in mytuple:
print(x)ایجاد تکرارکننده
برای ساخت یک تکرارکننده سفارشی، باید متدهای __iter__() و __next__() را در کلاس پیاده سازی کنید:
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
x = self.a
self.a += 1
return x
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))مدیریت StopIteration
اگر شرط توقف مشخص نکنید، تکرارکننده بی نهایت ادامه خواهد داشت. برای جلوگیری از این حالت، می توان در متد __next__() خطای StopIteration را پرتاب کرد:
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
if self.a <= 20:
x = self.a
self.a += 1
return x
else:
raise StopIteration
myclass = MyNumbers()
for x in myclass:
print(x)ادامه یادگیری
برای مطالعه بیشتر درباره وراثت در پایتون یا آشنایی با چندریختی (Polymorphism) ادامه دهید.