آموزش پایتون

مدیریت فایل

پیمایشگرهای پایتون

پیمایشگرهای پایتون

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))
				
			

حلقه زدن از طریق یک پیمایشگر

همچنین می توانیم از یک حلقه for برای پیمایش در یک شیء قابل پیمایش استفاده کنیم:

مثال

پیمایش در مقادیر یک تاپل:
				
					mytuple = ("apple", "banana", "cherry")

for x in mytuple:
  print(x)
				
			

مثال

پیمایش کارکتر های یک رشته:
				
					mystr = "banana"

for x in mystr:
  print(x)
				
			
حلقه for در واقع یک شی پیمایشگر ایجاد می کند و متد next() را برای هر حلقه اجرا می کند.

ساخت یک پیمایشگر

برای ایجاد یک شیء/کلاس به عنوان پیمایشگر، باید متدهای __iter__() و __next__() را در شیء خود پیاده سازی کنید.

همانطور که در فصل کلاس‌ها و اشیاء پایتون آموختید، همه کلاس‌ها تابعی به نام __init__() دارند که به شما اجازه می‌دهد هنگام ایجاد شیء، مقداردهی اولیه را انجام دهید.

متد __iter__()
مشابه عمل می‌کند، شما می‌توانید عملیات (مقداردهی اولیه و غیره) را انجام دهید، اما همیشه باید خود شیء پیمایشگر را برگرداند.

متد __next__() همچنین به شما امکان انجام عملیات را می دهد و باید مورد بعدی را در دنباله برگرداند.

مثال

یک پیمایشگر ایجاد کنید که اعداد را با 1 شروع می کند و هر دنباله یک عدد افزایش می یابد (با برگرداندن 1،2،3،4،5 و غیره)
				
					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__() می‌توانیم یک شرط پایان‌دهنده ایجاد کنیم تا اگر پیمایش به تعداد مشخص شده انجام شده باشد ادامه پیمایش متوقف شود.

مثال

توقف پس از 20 تکرار:
				
					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)
				
			

آموزش پایتون

مدیریت فایل