داغ ترین ویدیو بابلز لرن : هک کلاس های مجازی توسط متین برونسی

ویژگی تصویر

آموزش Iterators در Python

  /  پایتون   /  پیمایشگرها در پایتون
بنر تبلیغاتی الف

در این بخش به بررسی پیمایشگرها در پایتون می پردازیم،‌ iterators یا همان پیمایشگرها در واقع به تمام اشیائی گفته می شود که قابل پیمایش هستند.

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

در زبان برنامه‌نویسی پایتون، یک ایتریتور (Iterator) یک شیء خاص است که از پروتکل ایتریتور پیروی می‌کند. ایتریتور در پایتون باید دو متد اصلی را پیاده‌سازی کند:

  1. متد __iter__(): این متد بازگشت خود را به عنوان یک ایتریتور انجام می‌دهد و در صورتی که از این متد استفاده شود، خود ایتریتور را برمی‌گرداند.
  2. متد __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 ما متوقف می شود.

تماشا در حالت تمام صفحه

خروجی این برنامه چاپ اعداد از ۱ تا ۲۰ خواهد بود.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
بنر تبلیغاتی ج