خبر و ترفند روز

خبر و ترفند های روز را اینجا بخوانید!

کار با ژنراتورها در پایتون

بیاموزید که چگونه این نوع عملکرد جایگزین می تواند به شما در کاهش ردپای حافظه کمک کند.

اگر در حال خواندن خطوطی از یک فایل گزارش هستید یا فهرستی طولانی از موارد را پردازش می کنید، یکی از گزینه ها این است که کل داده ها را در حافظه بارگیری کنید. با این حال، این رویکرد می تواند از حافظه زیادی استفاده کند و مانع عملکرد شود. ژنراتورها راه حل ارزشمندی را ارائه می دهند.

ژنراتورها نیاز به بارگذاری همه داده ها به طور همزمان در حافظه را از بین می برند. آنها هنگام مدیریت مجموعه داده های بزرگ، توالی های بی نهایت، یا هر سناریویی که در آن کارایی حافظه بسیار مهم است، مفید هستند.

ژنراتورها چیست؟

مولد انرژی باد

ژنراتور یک تابع ویژه است که به شما امکان می دهد روی یک دنباله از مقادیر تکرار کنید. آنها به جای بازگرداندن مجموعه ای کامل از داده ها، هر بار یک مقدار تولید می کنند یا به دست می آورند. این باعث می شود آنها برای کار با توالی های بزرگ یا نامحدود از داده ها کارآمد باشند.

یک تابع معمولی پایتون معمولاً یک مقدار را محاسبه کرده و آن را برمی گرداند. اما ژنراتورها متفاوت عمل می کنند. آنها می توانند در طول زمان با توقف و از سرگیری اجرا بین هر بازده، مقادیر متعددی را به دست آورند.

تمایز کلیدی بین توابع منظم و مولدها این است که به جای استفاده از کلمه کلیدی بازگشتی برای تولید نتیجه، ژنراتورها از بازده استفاده می کنند.

نحوه ایجاد یک ژنراتور

برای ایجاد یک مولد، به جای دستور بازگشت، از یک عبارت yield در تابع استفاده کنید. کلمه کلیدی yield نه تنها به تابع دستور می دهد تا یک مقدار را برگرداند، بلکه به آن اجازه می دهد وضعیت خود را ذخیره کند و امکان ازسرگیری در آینده را فراهم می کند.

مطلب مرتبط:   چگونه CSS Gap فضا را برای بهبود طرح‌بندی وب اضافه می‌کند

در اینجا مثالی از یک تابع مولد ساده آورده شده است:

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 را به دست می دهد. عبارات مولد برای ایجاد تنبلی دنباله ای از مقادیر ایده آل هستند.

عبارات مولد

استفاده از ژنراتورها برای پردازش داده ها

مولدهای پایتون روشی مناسب برای توصیف جریان‌های داده و ساختن تکرارکننده‌ها بدون حفظ همه چیز در حافظه هستند. شما می توانید با یادگیری استفاده از ژنراتورها، برنامه نویسی خود را به طور قابل توجهی بهبود بخشید و انجام وظایف پردازش داده چالش برانگیز را آسان تر می کند.

دفعه بعد که با مجموعه داده های بزرگ کار می کنید، مولدها را در نظر داشته باشید و کارهای سخت را به آنها محول کنید تا کد شما پاسخگو و کارآمد باقی بماند.