درآمدی بر مباحث Iterator و Generator در زبان برنامه‌نویسی پایتون

درآمدی بر مباحث Iterator و Generator در زبان برنامه‌نویسی پایتون

در این آموزش قصد داریم تا به تفصیل دربارۀ فرایند پیمایش دیتا تایپ‌‌هایی مانند لیست، دیکشنری و غیره از یکسو و همچنین مباحث مرتبط با آن‌ها مثل Iterator و Generator از سوی دیگر نکاتی را برای دولوپرهای تازه‌کار بیان کنیم که قصد دارند دانش خود را در حوزهٔ یادگیری زبان پایتون عمیق‌تر سازند.

هر خط کدی که در فرایند توسعهٔ نرم‌افزار نوشته می‌‌شود، از دو حالت زیر خارج نیست؛ یا به منظور ایجاد و یا لود نوعی دیتا نوشته‌ می‌شود و یا عملیات خاصی بر روی دیتا است که با این تفاسیر باید این نکته را همواره مد نظر داشته باشیم دیتایی که تعریف می‌‌کنیم، خود انواع مختلفی دارد که به آن Data Type گفته می‌‌شود و بخش عمده‌‌ای از آن‌ها در همۀ زبان‌‌های برنامه‌نویسی یکسان می‌‌باشند و از جمله دیتا تایپ‌‌های معروف می‌‌توان به اعداد (که خود شامل انواع مختلفی از جمله اعداد صحیح، اعداد اعشاری، اعداد مختلط و ... است)، کاراکترها (یا همان حروف)، بولین (یا همان داده‌‌های منطقی) و ... اشاره کرد.

اما آنچه در این پست قصد داریم مورد بررسی قرار دهیم، دیتا تایپ‌‌هایی است که از اِجماع چند دیتا تایپ یکسان و یا غیریکسان تشکیل می‌‌شوند که در زبان‌های برنامه‌نویسی عمدتاً Array (آرایه) نامیده می‌شوند ولی در زبان برنامه‌نویسی پایتون به آن‌ها List می‌‌گوییم (از دیگر دیتا تایپ‌‌های معروف که شبیه لیست هستند می‌توان به dictionary ،tuple ،set و forzenset اشاره کرد اما در عین حال هر آبجکت دیگری که حتی خودتان تعریف کرده باشید و شامل مجموعه‌ای از عناصر به هم پیوسته باشد را می‌‌توان در این قالب قرار داد.)

این بخش از محتوا مخصوص کاربرانی است که ثبت‌نام کرده‌اند.
جهت مشاهدهٔ این بخش از محتوا لاگین نمایید.

جمع‌بندی
شاید از خودتان بپرسید که پرداختن به این مبحث اساساً قرار است چه دردی را از یک دولوپر پایتون دوا کند و در واقع ایتریتورها و جنریتورها را کجا می‌‌توان به صورت کاربردی مورد استفاده قرار داد؟ در پاسخ به سؤالاتی از این دست، می‌توان گفت که تفاوت عمده‌‌ای که یک Iterator با یک متغیر Iterable همانند لیست دارد در میزان مصرف مِموری است. شما برای بررسی یک لیست، به طور معمول باید ابتدا آن را کاملاً در مِموری لود کرده سپس شروع به پیمایش آن کنید ولی هنگامی که از یک Iterator استفاده می‌کنید، دیگر نگران منابعی مانند مِموری نخواهید بود و این تفاوت در اِسکیل‌‌های بزرگ کاملاً محسوس است.

مثلاً فرض کنید قرار است هر بار دیتاهایی که نمی‌‌دانید بزرگی آن‌ها چقدر است را از دیتابیس بخوانید و ممکن است تعداد آن‌ها در برخی موارد خیلی زیاد باشد که در چنین شرایطی اصلاً معقول نیست که هر بار نتیجه را ابتدا در یک متغیر Iterable همانند یک لیست یا تاپل در مِموری لود کرده و از آن استفاده کنید بلکه در اینجا بهتر است که از یک Iterator استفاده کنید و پیمایش را از طریق آن انجام دهید. به عبارتی، مواقعی که اندازۀ دیتا را نمی‌‌دانیم و یا مطمئن‌ هستیم دیتا خیلی بزرگ است، استفاده از Iterator را می‌‌توان به عنوان راه‌حل بهینه قلمداد کرد.