آموزش تکرارگر یا iterator در پایتون
منبع: https://rasanika.com
تکرارگر یک شی است که دارای تعداد قابل شمارشی از مقادیر میباشد.
می توان بر روی یک تکرارگر حلقه زد و تمام مقادیر آن را به دست آورد.
در پایتون، یک شی زمانی تکرارگر محسوب میشود که پروتکل مخصوص آن، شامل متدهای __iter__()
و __next__()
را پیاده سازی کند.
تفاوت تکرارگر (Iterator) و قابلتکرار (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))
print(next(myit))
print(next(myit))
print(next(myit))
حلقه زدن روی یک تکرارگر
ما همچنین می توانیم از یک حلقه for
روی یک تکرارگر استفاده کنیم:
مثال
mytuple = ("apple", "banana", "cherry")
for x in mytuple:
print(x)
مثال
کاراکترهای یک رشته:
mystr = "banana"
for x in mystr:
print(x)
حلقه for
در واقع یک تکرارگر ایجاد می کند و متد ()next را برای هر آیتم حلقه فرا میخواند.
یک تکرارگر بسازید
برای ایجاد یک شی/کلاس به عنوان تکرارگر، باید متدهای __iter__()
و __next__()
را در این کلاس پیاده سازی کنید.
در متد __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))
print(next(myiter))
print(next(myiter))
print(next(myiter))
توقف تکرار
در مثال بالا اگر از یک حلقه استفاده کنید، تا بینهایت ادامه خواهد داشت.
برای جلوگیری از ادامه تکرار، می توانیم از خطای StopIteration
استفاده کنیم.
در داخل متد __next__()
، میتوانیم یک شرط پایاندهنده اضافه کنیم و درصورت برقرار شدن این شرط، خطای StopIteration
را ایجاد کنیم.
مثال
توقف پس از 20 تکرار:
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()
myiter = iter(myclass)
for x in myiter:
print(x)