بیاموزید که چگونه این نوع عملکرد جایگزین می تواند به شما در کاهش ردپای حافظه کمک کند.
اگر در حال خواندن خطوطی از یک فایل گزارش هستید یا فهرستی طولانی از موارد را پردازش می کنید، یکی از گزینه ها این است که کل داده ها را در حافظه بارگیری کنید. با این حال، این رویکرد می تواند از حافظه زیادی استفاده کند و مانع عملکرد شود. ژنراتورها راه حل ارزشمندی را ارائه می دهند.
ژنراتورها نیاز به بارگذاری همه داده ها به طور همزمان در حافظه را از بین می برند. آنها هنگام مدیریت مجموعه داده های بزرگ، توالی های بی نهایت، یا هر سناریویی که در آن کارایی حافظه بسیار مهم است، مفید هستند.
ژنراتورها چیست؟
ژنراتور یک تابع ویژه است که به شما امکان می دهد روی یک دنباله از مقادیر تکرار کنید. آنها به جای بازگرداندن مجموعه ای کامل از داده ها، هر بار یک مقدار تولید می کنند یا به دست می آورند. این باعث می شود آنها برای کار با توالی های بزرگ یا نامحدود از داده ها کارآمد باشند.
یک تابع معمولی پایتون معمولاً یک مقدار را محاسبه کرده و آن را برمی گرداند. اما ژنراتورها متفاوت عمل می کنند. آنها می توانند در طول زمان با توقف و از سرگیری اجرا بین هر بازده، مقادیر متعددی را به دست آورند.
تمایز کلیدی بین توابع منظم و مولدها این است که به جای استفاده از کلمه کلیدی بازگشتی برای تولید نتیجه، ژنراتورها از بازده استفاده می کنند.
نحوه ایجاد یک ژنراتور
برای ایجاد یک مولد، به جای دستور بازگشت، از یک عبارت yield در تابع استفاده کنید. کلمه کلیدی yield نه تنها به تابع دستور می دهد تا یک مقدار را برگرداند، بلکه به آن اجازه می دهد وضعیت خود را ذخیره کند و امکان ازسرگیری در آینده را فراهم می کند.
در اینجا مثالی از یک تابع مولد ساده آورده شده است:
def numeric_generator():
yield 1
yield 2
yield 3
gen = numeric_generator()
این تابع مولد مقادیر عددی از 1 تا 3 را به دست می دهد.
عبارت yield وضعیت تابع را ذخیره میکند و متغیرهای محلی را بین تماسها حفظ میکند تا زمانی که مقدار بعدی را درخواست میکنید از سر گرفته شود.
اختصاص یک تابع مولد به یک متغیر یک شی مولد ایجاد می کند که می توانید با آن کار کنید.
کار با ژنراتورها
ژنراتورها کاربردهای متعددی دارند. شما می توانید آنها را در حلقه ها یا در درک لیست و همچنین سایر ساختارهای تکرار شونده استفاده کنید. ژنراتورها همچنین می توانند به عنوان آرگومان برای توابع عمل کنند.
هنگامی که یک ژنراتور ایجاد کردید، می توانید با استفاده از یک حلقه for روی آن تکرار کنید:
for i in numeric_generator():
print(i)
همچنین می توانید از تابع بعدی برای بازیابی مقادیر یک به یک استفاده کنید:
print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3
این به شما کنترل بیشتری بر روی شی مولد می دهد.
ژنراتورها می توانند وضعیت خود را پیگیری کنند. هر دستور عملکرد در یک تابع مانند یک نقطه بازرسی عمل می کند. وقتی تابع next() را روی شی مولد فراخوانی می کنید، اجرا از نقطه تسلیم قبلی شروع می شود.
شما همچنین می توانید مقادیر را با استفاده از send():
def generator_with_send():
# First yield: Receive a value
x = yield
print(f"Received: {x}")
# Second yield: Receive another value
y = yield
print(f"Received: {y}")
# Third yield: Yield the sum
yield x + y
gen = generator_with_send()
# Start generator and reach first yield
next(gen)
# Send 10 into generator, received at first yield
result = gen.send(10)
# Send 5 into generator, received at second yield
result = gen.send(5)
# Print result of third yield
print(result)
متد send() به شما امکان می دهد مقادیر را از ژنراتور بازیابی کنید و مقادیر را به تابع مولد ارسال کنید، به طور موثر آن را متوقف کرده و به شما امکان می دهد اجرای آن را کنترل کنید. روش send() هنگام نوشتن برنامههای مشترک یا استفاده از ژنراتورها برای اهداف پیشرفته مفید است.
استفاده از عبارات ژنراتور
عبارات ژنراتور روشی مختصر برای ایجاد یک مولد ساده و ناشناس ارائه می دهند. آنها شبیه درک لیست هستند اما به جای پرانتز از پرانتز استفاده می کنند.
به عنوان مثال:
gen = (i**2 for i in range(10))
for x in gen:
print(x)
کد یک عبارت مولد ایجاد می کند که مربع های اعداد 0 تا 9 را به دست می دهد. عبارات مولد برای ایجاد تنبلی دنباله ای از مقادیر ایده آل هستند.
استفاده از ژنراتورها برای پردازش داده ها
مولدهای پایتون روشی مناسب برای توصیف جریانهای داده و ساختن تکرارکنندهها بدون حفظ همه چیز در حافظه هستند. شما می توانید با یادگیری استفاده از ژنراتورها، برنامه نویسی خود را به طور قابل توجهی بهبود بخشید و انجام وظایف پردازش داده چالش برانگیز را آسان تر می کند.
دفعه بعد که با مجموعه داده های بزرگ کار می کنید، مولدها را در نظر داشته باشید و کارهای سخت را به آنها محول کنید تا کد شما پاسخگو و کارآمد باقی بماند.