Generator در پایتون :
Generator در پایتون یک نوع خاص از توابع است که میتوانند دادههای متناهی یا بینهایت را تولید کنند. این توابع به جای استفاده از دستورات return برای بازگشت مقدار، از دستورات yield استفاده میکنند. هر بار که دستور yield درون یک generator اجرا میشود، مقدار مورد نظر تولید میشود و اجرای تابع متوقف میشود. در اجرای بعدی، تابع از جایی که متوقف شده بود ادامه مییابد و این بازگشت و ادامهی اجرای تابع تا زمانی که دادههای لازم تولید شوند ادامه پیدا میکند.
استفاده از generator ها در پایتون به دلیل عملکردی که دارند، میتواند بهینهتر و کارآمدتر از استفاده از لیستها باشد. به طور معمول، اگر بخواهیم یک لیست از مقادیر را تولید کنیم و در حافظه ذخیره کنیم، باید همهی آن مقادیر را در یک لحظه تولید کنیم. اما در استفاده از generator ها، میتوانیم مقادیر را تک به تک و در لحظهای که نیاز است تولید کنیم. این ویژگی باعث میشود که حافظهی مصرف شده توسط generator ها به طور قابل توجهای کاهش پیدا کند.
یک دلیل دیگر استفاده از generator ها در پایتون، عملکرد lazy evaluation آنها است. وقتی که یک generator تولید میشود، هیچ دادهای تولید نمیشود تا زمانی که خروجی generator درخواست شود. این باعث میشود که محاسبات موجود در generator به صورت تاخیری انجام شود و تا زمانی که به نتیجهی نهایی نیاز نباشد، محاسبات زمانبر را انجام ندهد. این ویژگی میتواند بسیار مفید باشد زیرا در برخی مواقع ممکن است به تعداد بینهایتی داده نیاز داشته باشیم که با استفاده از لیستها نمیتوان آنها را در حافظه ذخیره کرد.
برای تعریف یک generator در پایتون، کافیست از دستور yield استفاده کنیم. به عنوان مثال، فرض کنید بخواهیم یک generator تعریف کنیم که اعداد طبیعی را تولید کند:
“`
def natural_numbers():
n = 1
while True:
yield n
n += 1
“`
در این مثال، تابع natural_numbers یک generator است که به ترتیب اعداد طبیعی را تولید میکند. با هر بار فراخوانی تابع yield، یک عدد طبیعی تولید میشود و اجرای تابع تا زمان تولید عدد بعدی متوقف میشود. از این تابع میتوان به صورت زیر استفاده کرد:
“`
numbers = natural_numbers()
print(next(numbers)) # 1
print(next(numbers)) # 2
print(next(numbers)) # 3
“`
با استفاده از تابع next، میتوانیم به ترتیب عددهای تولید شده توسط generator را دریافت کنیم. همچنین میتوان از یک generator در حلقهی for نیز استفاده کرد:
“`
for number in natural_numbers():
print(number)
if number == 10:
break
“`
در این حالت، تا زمانی که عدد تولید شده توسط generator برابر با 10 نشود، حلقه ادامه پیدا میکند و عددهای تولید شده را چاپ میکند.
در نتیجه، استفاده از generator ها در پایتون میتواند بهینهتر و کارآمدتر از استفاده از لیستها باشد. این ویژگیها میتوانند بسیار مفید واقع شوند، به خصوص در مواردی که به تعداد بینهایتی داده نیاز داریم یا برای بهینهسازی مصرف حافظه در برنامهها.