پیمایشگرهای پایتون
Iterator که معادل فارسی آن پیمایشگر ترجمه میشود، یک شیء است که دارای تعداد قابل شمارشی از مقادیر است.
شمارشگر یک شیء است که می توان بر روی مقادیر آن پیمایش کرد، به این معنی که شما می توانید از تمام مقادیر عبور کرده و به صورت جداگانه آن ها را فراخوانی کنید.
از نظر فنی در پایتون یک پیمایشگر، یک شیء است که پروتکل شمارشگر را پیادهسازی میکند که متشکل از متدهای __iter__()
و __next__()
است.
پیمایشگر و گروه داده
فهرستها، تاپلها، دیکشنریها و مجموعهها همگی اشیائی قابل پیمایش هستند. آنها گروههای داده ای هستند که می توانید یک پیمایشگر از آنها تهیه کنید.
همه این اشیاء دارای یک متد 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))
حلقه زدن از طریق یک پیمایشگر
مثال
mytuple = ("apple", "banana", "cherry")
for x in mytuple:
print(x)
next()
را برای هر حلقه اجرا می کند. ساخت یک پیمایشگر
برای ایجاد یک شیء/کلاس به عنوان پیمایشگر، باید متدهای __iter__()
و __next__()
را در شیء خود پیاده سازی کنید.
همانطور که در فصل کلاسها و اشیاء پایتون آموختید، همه کلاسها تابعی به نام __init__()
دارند که به شما اجازه میدهد هنگام ایجاد شیء، مقداردهی اولیه را انجام دهید.
متد __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))
توقف پیمایش
next()
داشته باشید، یا اگر از حلقه for استفاده شده باشد، مثال بالا برای همیشه ادامه خواهد داشت .
برای جلوگیری از ادامه تکرار برای همیشه، می توانیم از دستور StopIteration
استفاده کنیم.
در متد __next__()
میتوانیم یک شرط پایاندهنده ایجاد کنیم تا اگر پیمایش به تعداد مشخص شده انجام شده باشد ادامه پیمایش متوقف شود. مثال
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)