تکرارشونده چیست؟

 تکرارشونده یک شئ است که میتواند بر روی مقادیری از یک دنباله مانند لیست ها یا تاپل ها عملی انجام دهد. این تکرار شونده ها معمولا در حلقه ها استفاده میشود.

تکرار شونده ها از دو متد  __iter__  و __next__ استفاده میکنند.

متد ()__iter__

همه ی داده ها مانند تاپل و لیست و دیکشنری و... تابعی بنام ()__iter__ دارند که از طریق تابع iter() فراخوانی میشوند و یک تکرارشونده در اختیار شما قرار میدهند.

mytuple = ("alireza", "ali", "reza")
item= iter(mytuple)

print(next(item))
print(next(item))
print(next(item))

نکته: تابع next() میتواند مقادیری که پیمایش کردید را برگرداند. 

 در نمونه کد بالا تابع بالا یک ورودی دریافت کرد که آن ورودی یک تاپل است. سپس آنرا از طریق iter() دریافت کرد و در ادامه آنهارا پرینت کرد. 

نکته: در صورتی که دیگر عنصری برای برگرداندن وجود نداشته باشد در استفاده از تابع next() خطای StopIteration را دریافت میکنید.

 

رشته ها قابل تکرارند؟

رشته ها هم عناصری قابل تکرارند همانطور که در بخش حلقه ها دیدید میتوانید کاراکترهای یک رشته را برگردانید و پرینت بگیرید.

میتوانید مانند مثال زیر عمل کنید.

mystr = "alireza"
item = iter(mystr)

print(next(item))
print(next(item))
print(next(item))
print(next(item))
print(next(item))
print(next(item))

در رشته ها این متد همان کاراکتر هارا برمیگرداند در نتیجه باید به اندازه تعداد کارکترها پرینت کنیم.

تکرارشونده ها در حلقه

همانطور که در درس های قبل دیدیم میتوانیم از طریق حلقه ها عمل تکرار را سریعتر انجام دهیم و به جای اینکه تک تک هرکدام را پرینت کنیم میتوانیم همدیگر را باهم پرینت کنیم.

mytuple = ("alireza", "ali", "reza")

for x in mytuple:
  print(x)

ایجاد یک کلاس تکرارشونده

برای اینکه یک کلاس تکرارشونده ایجاد کنید و در ادامه از آن استفاده کنید میتوانید مانند نمونه کد زیر عمل کنید.

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))

این کلاس اعداد یک تا بینهایت را به انتخاب ما پرینت کند.

انتهای یک تکرار

برای اینکه در یک حلقه ابتدا و انتهایی ایجاد کنیم تا در یک زمان خاص پایان بیابد مانند نمونه کد زیر عمل میکنیم.

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self

  def __next__(self):
    if self.a <= 10:
      x = self.a
      self.a += 1
      return x
    else:
      raise StopIteration

myclass = MyNumbers()
myiter = iter(myclass)

for x in myiter:
  print(x)

در این نمونه کد دیگر تا بینهایت ادامه ندارد و تا عدد 10 ادامه دارد و تمام میشود. 

توسعه دهندگان
علیرضا چمنی