ایتریتورها (Iterators)
«ایتریتور پایتون» یعنی شیئی که مقدارها را یکی یکی می دهد. «پیمایش (Iterate)» یعنی از اول تا آخر حرکت کنیم. طبق «پروتکل (Protocol)» ایتریتور باید متدهای __iter__() و __next__() را داشته باشد.
ایتریتور (Iterator) چیست؟
هر چیزی که می تواند پشت سرهم مقدار بدهد ایتریتور است. لیست، تاپل، دیکشنری و مجموعه «ایتریبل (Iterable)» هستند؛ از آن ها با تابع iter() ایتریتور می گیریم.
mytuple = ("apple", "banana", "cherry")
myit = iter(mytuple)
print(next(myit))
print(next(myit))
print(next(myit))
رشته ها هم ایتریبل هستند و کاراکترها را یکی یکی می دهند.
mystr = "banana"
myit = iter(mystr)
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
کار با ایتریتور پایتون در حلقه for
حلقه for خودش ایتریتور می سازد و هر بار next() را صدا می زند.
mytuple = ("apple", "banana", "cherry")
for x in mytuple:
print(x)
mystr = "banana"
for x in mystr:
print(x)
ساخت یک ایتریتور سفارشی
برای ساخت ایتریتور، در کلاس ات __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)
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
مدیریت پایان با StopIteration
برای تمام کردنِ امن، در __next__() وقتی کار تمام شد StopIteration بینداز.
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
if self.a <= 20:
x = self.a
self.a += 1
return x
else:
raise StopIteration
myclass = MyNumbers()
myiter = iter(myclass)
for x in myiter:
print(x)
گام های عملی
- از یک تاپل ایتریتور بگیر و با
next()چاپ کن. - روی رشته با
forپیمایش کن. - کلاس ساده شمارنده بساز و
StopIterationاضافه کن.
جمع بندی سریع
- ایتریبل منبع است؛ ایتریتور خروجی مرحله به مرحله می دهد.
iter()می سازد؛next()مقدار بعدی می دهد.- حلقه
forپشت صحنه ازnext()استفاده می کند. - برای توقف،
StopIterationرا پرتاب کن.
نکته: برای لیست های شبیه آرایه به آرایه ها سر بزن. همچنین فصل جنریتور ها را برای تولید تنبلِ داده ببین.