آشنایی با مبحث Iterator در پایتون

python iterators introduction
20 آبان 1403

سلام! امروز می‌خواهیم درباره‌ی مفهوم Iterator در زبان برنامه‌نویسی پایتون صحبت کنیم. این مبحث به شما اجازه می‌دهد که به طور کارآمدتری با مجموعه داده‌ها مانند لیست‌ها، دیکشنری‌ها و موارد مشابه کار کنید. ولی قبل از اینکه به جزئیات بپردازیم، بهتره قبل از هر چیز بدانیم که Iterator چیست و چه کاربردی دارد.

در پایتون، Iterator شیء ای است که به شما امکان می‌دهد تا به ترتیب از میان تمام آیتم‌های موجود در یک مجموعه داده عبور کنید، بدون اینکه کل مجموعه را همزمان در حافظه نگه دارید. این موضوع به خصوص وقتی با داده‌های بزرگ کار می‌کنید می‌تواند بسیار مفید باشد. برای مثال، اگر بخواهیم یک الگوریتم را روی لیست بزرگی از داده‌ها اعمال کنیم، استفاده از یک Iterator می‌تواند به مدیریت موثرتر حافظه کمک کند.

در واقع زمانی که از یک حلقه مانند for یا while استفاده می‌کنید که نیاز به عبور از یک دنباله دارد، در پشت صحنه از Iterator استفاده می‌شود. بنابراین، اگر چه ممکن است شما مستقیماً با آن کار نکرده باشید، اما احتمالاً از خود ناآگاه بوده‌اید که چگونه کار می‌کند.

واقعاً چه چیزی یک Iterator را متمایز می‌کند؟ هر شی که دارای متد __iter__() باشد و یک روش __next__() که مورد استفاده قرار می‌گیرد تا آیتم بعدی در دنباله را دریافت کند، به عنوان یک Iterator شناخته می‌شود. زمانی که به آخر دنباله می‌رسیم و دیگر آیتمی برای اعمال وجود ندارد، یک استثنا با نام StopIteration را تولید می‌کند.

در ادامه می‌خواهیم نمونه کدی ببینیم که به شما چگونگی استفاده از Iterator در پایتون را نشان دهد. لطفاً نگاهی به کد زیر بیندازید، سپس خط به خط آن را توضیح خواهم داد.

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

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

myclass = MyNumbers()
myiter = iter(myclass)

for x in myiter:
print(x)

توضیح کد

class MyNumbers:
تعریف یک کلاس به نام MyNumbers
def __iter__(self):
تعریف متد __iter__() که اغلب برای آماده‌سازی متغیرهای اولیه استفاده می‌شود. self.a = 1 مقدار اولیه را برای a تنظیم می‌کند و return self شیء Iterator را برمی‌گرداند.
def __next__(self):
متد __next__() مقدار جاری a را برمی‌گرداند و سپس مقدار a را یک واحد افزایش می‌دهد. اگر a بزرگ‌تر از ۵ باشد، یک استثناء StopIteration رخ می‌دهد.
myclass = MyNumbers()
ایجاد یک نمونه از کلاس MyNumbers
myiter = iter(myclass)
دریافت Iterator از شیء کلاس با فراخوانی متد iter()
for x in myiter:
استفاده از حلقه for برای عبور از هر آیتم Iterator و چاپ مقادیر

سوالات متداول

؟

Iterator چه کاربردی در پایتون دارد؟

؟

چگونه می‌توانم یک Iterator بسازم؟

؟

آیا Iterator می‌تواند بی‌نهایت باشد؟