generator چیست؟
generator نوعی تابع میباشد که اجازه میدهند در طول زمان یک دنباله تولید نمود. برای استفاده از syntax ،generator متفاوتی در نظر گرفته شده است، به این صورت که از دستور yield استفاده میشود. مزیت اصلی آن استفاده کمتر از حافظه و سرعت بیشتر است. عملکرد generator مانند range میباشد و برای به دست آوردن مقادیر باید از list(range(l)) استفاده کنیم.
نحوه ایجاد generator
برای ایجاد دنبالهایی از اعداد میتوان از دو روش استفاده کرد. روش اول به این صورت میباشد که یک تابع ایجاد میکنیم، سپس دنبالهایی از اعداد را به وسیله دستور for ایجاد میکنیم و این اعداد و یا تغییر یافته این اعداد را با متد append به یک لسیت خالی اضافه میکنیم. سپس لیست مدنظر را با ذستور return بازمیگردانیم. در این صورت هرگاه تابع create_cube را فراخوانی کنیم، لیست مورد نظر چاپ میشود. همچنین اگر تابع create_cube را درون یک for لوپ قرار دهیم. میتوان به آیتمهای لیست موردنظر دسترسی پیدا کرد.
در روش دوم برای ایجاد دنبالهایی از اعداد از generator استفاده میکنیم. به این صورت که یک تابع ایجاد میکنیم، سپس دنبالهایی از اعداد را به وسیله دستور for ایجاد میکنیم و این اعداد و یا تغییر یافته این اعداد را با دستور yield اجرا میکنیم. در کد زیر هنگام فراخوانی تابع مقادیر مورد نظر چاپ نمیشود. بنابراین برای به دست آوردن مقادیر باید از list استفاده کنیم.
نحوه ایجاد دنباله فیبوناچی به وسیله generator
دنباله فیبوناچی را میتوان به وسیله generator اجرا کرد. دنباله فیبوناچی به این صورت میباشد که عدد اول و دوم یک میباشد و پس از آن هر عدد از مجموع همان عدد با عدد قبلی خود به دست میآید. در کد زیر ایتدا دو عدد اول را برابر دبا یک قرار دادهایم. سپس به وسیله یک لوپ و دستور yield یک generator ایجاد کردهایم.
نحوه استفاده از دستور next در generator
در توابع generator میتوان در هنگام فراخوانی از دستور next استفاده کرد. در این حالت خروجی تابع با هربار print گرفتن از دستور next به صورت یکی یکی ایجاد میشود. در کد زیر به دلیل استفاده از range(3)، تا عدد ۳ باید print شود. بنابراین اگر از دستور next بیشتر از ۳ بار استفاده کنیم با خطای StopIteration روبرو میشویم.
اگر برروی string دستور next را اجرا کنیم، میبینیم که با خطا مواجه میشویم زیرا stringها iterator نیستند. در این صورت اگر از دستور iter استفاده کنیم و پس از آن دوباره دستور next را اجرا کنیم، میبینیم که اجزای string نمایش داده میشود.
نحوه استفاده از generator
در کد زیر با استفاده از generator توان دو اعداد را تا مقدار دلخواه ایجاد میکنیم. برای نمایش اعداد مورد نظر، تابع فراخوانی شده را درون یک for لوپ قرار می دهیم. عدد ورودی تابع gen_squares، تعداد دفعاتی که می خواهیم این لوپ ادامه داشته باشد را مشخص میکند.
در کد زیر یک generator میسازیم که به تعداد دلخواه عدد صحیح به صورت رندوم بین دو عدد ایجاد نماید. برای ایجاد یک عدد صحیح رندوم، از کتابخانه random تابع randint را استفاده میکنیم. این تابع یک عدد صحیح بین دو عدد low و high به صورت رندم انتخاب میکند. همچنین اعداد low و high در داخل بازه انتخابی هستند.
برای آشنایی بیشتر با مبحث generator و نحوه کار با آنها میتوانید به دوره جامع آموزش زبان برنامهنویسی پایتون آکادمی رسا مراجعه کنید.