فصل سوم: جنراتورها و ایتریتورها

پروتکل Iterable و Iterator

چه چیزی یک شیء را قابل پیمایش می‌کند؟

وقتی از for item in my_list استفاده می‌کنید، در پشت صحنه پایتون از یک پروتکل استاندارد استفاده می‌کند. هر شیئی که متد __iter__ را پیاده‌سازی کند، iterable نام دارد و هر شیئی که متد __next__ را داشته باشد، iterator است.

class CountUp:
    def __init__(self, limit):
        self.limit = limit
        self.current = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.current >= self.limit:
            raise StopIteration
        self.current += 1
        return self.current

for number in CountUp(5):
    print(number)   # 1 2 3 4 5

حلقه‌ی for ابتدا __iter__ شیء را فراخوانی می‌کند تا یک iterator بگیرد، سپس به‌طور مکرر __next__ را صدا می‌زند تا وقتی که StopIteration صادر شود. توابع داخلی iter() و next() نیز دقیقاً همین دو متد را فراخوانی می‌کنند.

پیاده‌سازی دستی این پروتکل کمی طولانی است؛ به همین دلیل پایتون راهی بسیار ساده‌تر به نام جنراتور ارائه می‌دهد که در درس بعد با آن آشنا می‌شویم.

برای ذخیره‌ی پیشرفت و شرکت در آزمون، وارد شوید — رایگان است.