ایتریور Python

ایتریور Python

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

ایتریورها اشیاء قابل ایترویتور هستند، یعنی می‌توانید همه مقادیر را جستجو کنید.

技术上، در Python، ایترویتور اشیایی هستند که پروتکل ایترویتور را پیاده‌سازی می‌کنند، که شامل روش‌هایی هستند __iter__() و __next__().

ایتریور VS اشیاء قابل ایترویتور (Iterable)

لیست، تورپ، دیکشنری و مجموعه‌ها اشیاء قابل ایترویتور هستند. آنها جعبه‌های قابل ایترویتور هستند که می‌توانید از آنها ایترویتور (Iterator) دریافت کنید (Iterator).

همه این اشیاء دارای روش‌هایی برای دریافت ایترویتور هستند 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))

اجرای مثال

جستجوی ایترویتور

ما همچنین می‌توانیم از loop for برای جستجوی ایترویتورها استفاده کنیم:

مثال

ایتراسیون مقادیر تورپ

mytuple = ("apple", "banana", "cherry")
برای x در mytuple:
  print(x)

اجرای مثال

مثال

ایتراسیون (گذر از) کاراکترهای رشته:

mystr = "banana"
برای x در mystr:
  print(x)

اجرای مثال

توضیح:برای هر اجرای loop for، یک ایترویتور اشیاء ایجاد می‌شود. next() مетод هستند.

ایجاد ایترویتور

برای اینکه اشیاء/کلاس‌ها به عنوان ایترویتور (Iterator) ایجاد شوند، باید برای اشیاء __iter__() و __next__() مетод هستند.

همانطور که در فصل Python کلاس/اشیاء یاد گرفتید، همه کلاس‌ها دارای روشی به نام __init__() فنction،این که به شما اجازه می‌دهد در هنگام ایجاد اشیاء، برخی از تنظیمات اولیه را انجام دهید.

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

__next__() روش نیز اجازه می‌دهد تا عملیاتی را انجام دهید و باید پروژه بعدی در توالی را بازگرداند.

مثال

یک آنتریتور بازگرداننده اعداد ایجاد کنید که از 1 شروع می‌کند و هر ترتیب یک افزایش دارد (1، 2، 3، 4، 5 و غیره):

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() استفاده کرد، یا در حلقه for، در این صورت مثال بالا به طور مداوم ادامه خواهد داد.

برای جلوگیری از ادامه ابدی تکرار، می‌توان از دستور StopIteration دستور.

در __next__() در روش، اگر تکرار به تعداد مشخص شده برسد، می‌توانیم یک شرط پایان به وجود آوریم تا خطا ایجاد شود:

مثال

در 20 بار تکرار بعد از توقف:

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
  def __next__(self):
    اگر self.a کمتر یا برابر با 20 باشد:
      x = self.a
      self.a += 1
      return x
    else:
      raise StopIteration
myclass = MyNumbers()
myiter = iter(myclass)
برای x در myiter:
  print(x)

اجرای مثال