Python Iterators - تکرار کننده های پایتون




Python Iterators - تکرار کننده های پایتون


یک iterator در واقع شیء ای است که حاوی تعداد قابل شمارشی از مقادیر است.

یک تکرار(iterator) یک شی است که می توان آن را تکرار کرد، به این معنی که شما می توانید از طریق آن از تمام مقادیر عبور کنید.

از لحاظ فنی، در پایتون، تکرار کننده یک شیء ای است که پروتکل تکرار را اجرا می کند، که شامل روش __iter __ () و next() می باشد.



تکرار کننده در مقابل قابل تکرار (Iterator vs Iterable)

Lists، tuples، dictionariesو set ها همه اشیاء قابل تکرار هستند. آنها همگی قابل تکرار(Iterable ) هستند که از طریق یک تکرار کننده (Iterator) می توانیم آنها را دریافت کنیم.

تمام این اشیاء دارای یک متد iter() هستند که توسط تکرار کننده (iterator) استفاده می شود.

مثال

یک تکرار کننده روی یک tuple پیاده می کنیم و محتوای آن را چاپ می کنیم

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 نیز می توان ساختارهای قابل تکرار را بررسی نمود

مثال

تکرار مقدارهای درون tuple

mytuple = ("apple", "banana", "cherry")

for x in mytuple:
  print(x)

مثال

تکرار کاراکترهای درون یک رشته

mystr = "banana"

for x in mystr:
  print(x)

حلقه for مانند iterator عمل کرده و با هر بار اجرا تابع next را فراخوانی می کند.


نوشتن یک تکرار کننده iterator


برای پیاده سازی کلاس/شیء تکرار کننده شما می بایستی دو متد __iter__() و __next__() درون شیء خود پیاده سازی کنید

همانگونه که در فصل پایتون کلاسها / اشیاء آموخته اید، تمام کلاس ها دارای یک تابع به نام __init __ () می باشند که اجازه می دهد تا هنگام ایجاد شیء،آن را مقداردهی اولیه کنید

متد __iter__() کاری مشابه آن انجام می دهد. شما می توانید عملیات (initializing و غیره) انجام دهید، اما همیشه باید خود شیء تکرار را بازگردانید.

متد __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))

توقف یک تکرار کننده

مثال بالا برای همیشه ادامه خواهد داشت اگر تعداد دستورات next از کافی وجود داشته باشد، یا اگراز یک حلقه استفاده کنید

برای جلوگیری از حلقه های بی نهایت، ما می توانیم از دستورات توقف تکرار استفاده کنیم

متد ()__next__ ، ما می توانیم تعداد تکرار را مشخص کنیم و بر مبنای آن تکرار را متوقف کنیم

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)

مرکز تحقیقات فناوری اطلاعات و ارتباطات صدر
میدان 13 آبان ، خیابان برادران افراسیابی ، کوچه غفارزاده پلاک 34
مرکز تحقیقات صدر
شماره تماس: (021) 35238809