Python Iterators

در پایتون، Iterator (تکرارگر) یک شیء است که می‌تواند یک دنباله از داده‌ها را یکی‌یکی برگرداند.
مکانیزم اصلی پیمایش لیست‌ها، تاپل‌ها، رشته‌ها و … بر پایهٔ Iterator کار می‌کند.

🔹 مفاهیم کلیدی

  • Iterable: هر شیء که می‌تواند یک Iterator تولید کند (مثل list، tuple، str، dict، set).

  • Iterator: شیئی که متدهای ()__iter__ و ()__next__ را پیاده‌سازی کرده باشد.

    • ()__iter__ خودش را برمی‌گرداند.

    • ()__next__ هر بار عنصر بعدی را می‌دهد و در پایان StopIteration برمی‌گرداند.

🔹 مثال با ساختارهای آماده

هر ساختار قابل تکرار (list, tuple, …) را می‌توان به Iterator تبدیل کرد:

nums = [1, 2, 3] it = iter(nums) # ساخت iterator با تابع iter() print(next(it)) # 1 print(next(it)) # 2 print(next(it)) # 3 # print(next(it)) # خطای StopIteration

حلقهٔ for دقیقاً همین کار را پشت صحنه انجام می‌دهد.

🔹 ایجاد Iterator سفارشی

می‌توان کلاس سفارشی ساخت که ()__iter__ و ()__next__ داشته باشد:

class Counter: def __init__(self, start, end): self.current = start self.end = end def __iter__(self): return self def __next__(self): if self.current <= self.end: num = self.current self.current += 1 return num else: raise StopIteration counter = Counter(1, 5) for x in counter: print(x)

📌 خروجی:

1 2 3 4 5

🔹 تفاوت Iterable و Iterator

numbers = [1, 2, 3] print(hasattr(numbers, '__iter__')) # True → iterable print(hasattr(numbers, '__next__')) # False → هنوز iterator نیست it = iter(numbers) print(hasattr(it, '__next__')) # True → iterator

🔹 Generators (ژنراتور)

ژنراتور نوع خاصی از Iterator است که با کلمهٔ کلیدی yield تعریف می‌شود:

def my_gen(): yield 1 yield 2 yield 3 for val in my_gen(): print(val)

هر بار yield فراخوانی می‌شود، وضعیت تابع حفظ شده و مقدار بعدی در فراخوانی بعدی تولید می‌شود.

🔹 کاربردهای رایج

  • خواندن فایل‌های بزرگ خط‌به‌خط بدون مصرف زیاد حافظه.

  • تولید دنباله‌های بی‌پایان یا بزرگ (مثل اعداد فیبوناچی).

  • پردازش lazy (تنبل) که مقادیر را هنگام نیاز می‌سازد.

💡 تمرین‌های پیشنهادی

  1. یک Iterator بساز که اعداد زوج بین 0 تا 20 را برگرداند.

  2. ژنراتوری بنویس که دنباله فیبوناچی تا عدد 100 را تولید کند.

  3. برنامه‌ای بنویس که یک فایل متنی را خط به خط با Iterator سفارشی بخواند.

✅ خلاصه

  • Iterable شیئی است که می‌تواند Iterator برگرداند.

  • Iterator متدهای ()__iter__ و ()__next__ دارد.

  • حلقهٔ for در پایتون از این پروتکل استفاده می‌کند.

  • Generators راه سریع و راحت برای ساخت Iteratorها هستند.