دوره‌ها / آموزش پایتون (Python) / تکرارگرها (Python Iterators)

تکرارگرها (Python Iterators)

15 دقیقه Article

تکرارگرها: پشت‌پرده حلقه‌ها (Iterators) 🔄⚙️

تکرارگر (Iterator) شیئی است که حاوی تعداد قابل شماری از مقادیر است. تکرارگر شیئی است که می‌توان روی آن پیمایش کرد (Iterate)، به این معنی که می‌توانید از تمام مقادیر آن یکی پس از دیگری عبور کنید.

۱. تفاوت Iterable و Iterator

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

۲. متد‌های __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)

۳. توقف تکرار (StopIteration)

در مثال‌های بالا، تکرار برای همیشه ادامه می‌یابد مگر اینکه راهی برای توقف تعریف کنیم. در متد __next__، اگر به پایان داده‌ها رسیدید، باید استثنای StopIteration را صادر کنید.

حلقه For چطور کار می‌کند؟ در واقع وقتی از حلقه for استفاده می‌کنید، پایتون در پشت صحنه یک تکرارگر از شیء می‌سازد و پشت سر هم متد __next__ را فراخوانی می‌کند تا زمانی که با خطای StopIteration مواجه شود.
کاربرد خاص: ساخت تکرارگر سفارشی زمانی مفید است که می‌خواهید دنباله‌ای از اعداد یا داده‌ها را تولید کنید که قانون خاصی دارند و نمی‌خواهید همه آن‌ها را یکجا در حافظه (Memory) ذخیره کنید.

تمرین‌های عملی

برای تثبیت یادگیری این درس تمرین‌های زیر را حل کنید

استفاده از تکرارگر Easy
سوال تمرین

یک لیست به نام mytuple = ('apple', 'banana', 'cherry') دارید. با استفاده از تابع iter() یک تکرارگر از آن بسازید و نام آن را myit بگذارید. سپس اولین آیتم را با استفاده از تابع next() چاپ کنید.

پاسخ تمرین
PYTHON
mytuple = ('apple', 'banana', 'cherry')
myit = iter(mytuple)
print(next(myit))

آماده رفتن به درس بعدی هستید؟

این درس را به پایان رساندید و می‌توانید به درس بعدی بروید.