codingcogs' logo

Generator

هر function که یک value باز می‌گرداند، تمام محاسبات را در خود انجام می‌دهد و به جایی که call شده است باز می‌گرداند، البته function هایی که تا به حال در این دوره دیدیم این‌گونه عمل می‌کنند! function می‌تواند value را نگه‌دارد ( yield کند)؛ در این صورت هنوز هم کنترل در دست call کننده است اما state (وضعیت) مربوط به function باقی می‌ماند و می‌تواند یک value دیگر را yield کند و وقتی value ای برای yield کردن نداشت اعلام پایان کند. به function ای که yield کند، generator می‌گوییم.

کاربرد generatorها در این است که به برنامه اجازه می‌دهند که محاسبات را تا زمانی که نیاز دارد به تعویق بیاندازد ( defer یا postpone کند). مثلا فرض کنید می‌خواهیم دیتای مارکت یک جفت ارز (در اصطلاح معاملاتی pair) را به صورت واحد زمانی(time stamp مثلا 4h برای دیتای تجمیعی (aggregated) هر کندل (candle)) مشخص دریافت کنیم. در اینجا معمولا از generator استفاده می‌شود که از بازه‌ی مشخصی به عنوان شروع زمان، تا زمان دلخواه ما عملیات دریافت دیتا و بازگرداندن آن را با هربار اجرا نمایش می‌دهد؛ ارسال تمام دیتا از سمت یک سرور و حتی پردازش آن در سمت کلاینت به صورت یکجا می‌تواند پرهزینه باشد. با generatorها اما زمانی عملیات سنگین را انجام می‌دهیم که به آن نیاز داشته باشیم.

در پایتون هر generator function به یک object تبدیل می‌شود که از iterator protocol استفاده می‌کند و دانشی که از iteratorها کسب کرده‌ایم حالا به کار ما می‌آید. چیزی نیست که بتوانیم با یک generator بنویسیم که نتوان با iterator نوشت اما هرکدام کاربرد خود را دارند و بهتر است در جای مناسب و به منظور مناسب از هرکدام استفاده کنیم که کد خود را پایتونیک بنویسیم.

بهتر است ابتدا یک مثال ببینیم و سپس به توضیح بیشتر بپردازم.