آموزش تکرارگر یا iterator در پایتون

شی تکرارگر و شی قابل‌تکرار در پایتون

تکرارگر یک شی است که دارای تعداد قابل شمارشی از مقادیر می‌باشد.

می توان بر روی یک تکرارگر حلقه زد و تمام مقادیر آن را به دست آورد.

در پایتون، یک شی زمانی تکرارگر محسوب می‌شود که پروتکل مخصوص آن، شامل متدهای __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)
منتشر شده در رسانیکا، پلتفرم اشتراک‌گذاری محتوا