تکرارکننده ها (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) ادامه دهید.