
پیمایشگرها در پایتون
در این بخش به بررسی پیمایشگرها در پایتون می پردازیم، iterators یا همان پیمایشگرها در واقع به تمام اشیائی گفته می شود که قابل پیمایش هستند.
پیمایشگر (Iterator) یک الگوی طراحی است که برای صرفهجویی در حافظه و بهبود عملکرد در تکرار و پیمایش دادهها مورد استفاده قرار میگیرد. یک پیمایشگر نیز به مفهوم کلی یک شیء است که مجموعهای از مقادیر را دارد و قابلیت تکرار و پیمایش این مقادیر را فراهم میکند.
در زبان برنامهنویسی پایتون، یک ایتریتور (Iterator) یک شیء خاص است که از پروتکل ایتریتور پیروی میکند. ایتریتور در پایتون باید دو متد اصلی را پیادهسازی کند:
- متد
__iter__()
: این متد بازگشت خود را به عنوان یک ایتریتور انجام میدهد و در صورتی که از این متد استفاده شود، خود ایتریتور را برمیگرداند. - متد
__next__()
: این متد مقدار بعدی در توالی را برمیگرداند و در صورتی که دیگر مقداری وجود نداشته باشد، استثنایStopIteration
را پرتاب میکند.
ایتریتورها در پایتون به شکل گستردهای استفاده میشوند و میتوانند بر روی ساختارهای دادهای مختلفی مانند لیستها، رشتهها، دیکشنریها و سایر نوعهای دادهای پیمایش و تکرار انجام دهند. با استفاده از ایتریتورها، میتوان به راحتی از دادههای موجود در یک ساختار دادهای به صورت یکی یکی دسترسی پیدا کرده و آنها را پیمایش کرد.
Iterator و Iterable
لیست ها، تاپل ها، دیکشنری ها و مجموعه ها همه اشیاء قابل پیمایش یا همان iterable هستند.
همهٔ این شیءها دارای یک متد iter()
هستند که برای دریافت یک پیمایشگر (Iterator) استفاده میشود.
پیمایشگر (Iterator) در پایتون مشخص میکند که چگونه باید یک شیء را تکرار و پیمایش کنیم. با فراخوانی متد iter()
بر روی یک شیء، یک iterator از آن شیء برگردانده میشود. این پیمایشگر قادر به بازگشت مقادیر متعدد در یک توالی تکرارپذیر است.
بنابراین، با استفاده از متد iter()
بر روی شیء، میتوانیم یک ایتریتور را دریافت کنیم که قادر است برای تکرار و پیمایش از مقادیر موجود در آن شیء استفاده کنیم. این مقادیر میتوانند از یک ساختار دادهای مثل لیست، رشته، دیکشنری و غیره باشند. استفاده از پیمایشگرها به ما امکان میدهد به صورت بهینه و مدیریت شده از مقادیر یک شیء در طول تکرار استفاده کنیم.
۱. مثال
در این مثال یک پیمایشگر (Iterator) را از یک تاپل برگردانده و هر مقدار را چاپ می کنیم:
خروجی:
apple
banana
cherry
نکته: حتی رشتهها نیز اشیاء قابل تکرار هستند و میتوانند یک iterator را برگردانند.
۲. مثال
رشته ها نیز اشیای تکرار شونده هستند که دارای دنباله ای از کاراکترها هستند:
خروجی:
b
a
n
a
n
a
ایجاد حلقه از طریق یک Iterator
همچنین می توانیم از طریق یک شیء پیمایش شونده (iterator) حلقه بزنیم و به داده های آن دسترسی داشته باشیم.
۱. مثال
در این مثال با استفاده از حلقه for
مقادیر یک tuple
را چاپ می کنیم:
خروجی:
apple
banana
cherry
۲. مثال
در این مثال با استفاده از حلقه for
تمام کاراکتر های یک رشته را چاپ می کنیم:
خروجی:
b
a
n
a
n
a
حلقه for
در واقع یک شیء iterator ایجاد می کند و متد next()
را برای هربار حلقه ای که می زند اجرا می کند.
یک Iterator بسازید
برای ایجاد یک شی/کلاس به عنوان پیمایشگر، باید متدهای __iter__()
و __next__()
را در شی خود پیاده سازی کنید.
۱. مثال
خروجی:
1
2
3
4
5
در این مثال یک کلاس به نام MyNumbers
را تعریف می کنیم که از متدهای ویژه __iter__()
و __next__()
برای ایجاد یک پیمایشگر (Iterator) برای اعداد صحیح استفاده میکند.
در کلاس MyNumbers
، متد __iter__()
ایجاد میشود که یک متغیر a
را با مقدار ۱ مقداردهی اولیه میکند و خود را برمیگرداند.
سپس، متد __next__()
تعریف میشود که مقدار فعلی a
را در متغیر x
ذخیره کرده و سپس مقدار a
را یک واحد افزایش میدهد. در نهایت، مقدار x
را برمیگرداند.
سپس، یک شیء از کلاس MyNumbers
به نام myclass
ایجاد میشود و تابع iter()
بر روی myclass
صدا زده میشود تا یک پیمایشگر برگردانده شود. این پیمایشگر در myiter
ذخیره میشود.
در نهایت، تابع next()
بر روی myiter
فراخوانی میشود و مقدار بعدی در توالی اعداد صحیح را با استفاده از پیمایشگر دریافت میکند و آن را چاپ میکند. این عملیات تا پنج بار تکرار میشود و در هر بار مقدار بعدی از توالی اعداد صحیح چاپ میشود.
متوقف کردن Iterator یا همان Stopiteration
اگر دقت کرده باشید مثال قبلی برای همیشه به صورت نامحدود ادامه خواهد داشت و هر تعداد که بخواهید می توانید از تابع next()
برای چاپ اعداد بعدی استفاده کنید یا اینکه می توانیم برای جلوگیری از تکرار بیش از حد دستور print(next(myiter))
از حلقه for استفاده کنیم.
برای جلوگیری از ادامه تکرار برای همیشه (تکرار نامحدود)، می توانیم از دستور Stopiteration استفاده کنیم.
۱. مثال
در این مثال بعد از ۲۰ بار تکرار iterator ما متوقف می شود.
خروجی این برنامه چاپ اعداد از ۱ تا ۲۰ خواهد بود.
آیا این مطلب برای شما مفید بود ؟
اركان ايمان
(از ايمان پرسيدند) و درود خدا بر او، فرمود: ايمان، بر شناخت با قلب، اقرار با زبان، و عمل با اعضاء و جوارح استوار است.
حکمت 227 نهج البلاغه