سلام! امروز میخواهیم دربارهی مفهوم 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 و چاپ مقادیر