Closure در پایتون چیست؟
ﺯﻣﺎﻥ ﻣﻄﺎﻟﻌﻪ: 3 دقیقه

Closure در پایتون چیست؟

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

در ابتدا بیایید نگاهی به قطعه کد زیر بیاندازیم:

def main():
  message = "Hello World"

  def inner_main():
    print(message)
  inner_main()

main()
  • در خط اول از این قطعه کد ما تابعی تحت عنوان main را ایجاد کردیم
  • در خط دوم متغیری با نام message تعریف کرده‌ایم که متغیر محلی تابع main محسوب می‌شود
  • در خط چهارم ما یک تابع با نام inner_main در داخل تابع main ایجاد کرده‌ایم. تابع inner_main به متغیر message دسترسی دارد اما این متغیر به صورت غیر محلی برای تابع مورد استفاده قرار می‌گیرد چرا که در خارج از scope تابع inner_main تعریف شده است.
  • در خط هفتم ما تابع inner_main را در داخل تابع main فراخوانی کرده‌ایم.
  • در خط نهم تابع main را فراخوانی کرده‌ایم که در نهایت با اجرای این قطعه کد پیام Hello World چاپ خواهد شد.
  • این قطعه کد اثبات می‌کند که یک تابع داخلی می‌تواند به متغیرهای تابع مادر (متغیر غیر محلی) دسترسی داشته باشد.

آشنایی با کلوژر‌ها

حال که با کارکرد توابع درونی آشنا شدیم وقت آن است که با مفهوم closureها نیز آشنایی پیدا کنیم. بگذارید با یک مثال شروع کنیم. در خط هفتم قطعه کد قبلی اگر ما بجای فراخوانی تابع inner_main مقدار آن را return کنیم و در خط نهم تابع main را در یک متغیر closure قرار دهیم و آن را فراخوانی کنیم چه اتفاقی خواهد افتاد؟

def main():
  message = "Hello World"

  def inner_main():
    print(message)
  return inner_main

closure = main()
closure()
  • قطعه کد ما تا خط ششم هیچ تغییری نکرده و همان مثال قبلی است.
  • در خط هفتم ما بجای فراخوانی تابع، مقدار آن را return کرده‌ایم
  • در خط نهم ما فرخوانی تابع main را به یک متغیر به نام closure نسبت داده‌ایم و اصطلاحا آن را Bound کرده‌ایم.
  • از آنجایی که main یک تابع را برمی‌گرداند حال می‌توانیم خود متغیر closure را برگردانیم.

اگر به خروجی نگاه کنیم می‌توانیم متوجه شویم که در نهایت خروجی همان حالت قبلی را دارد. اما در این حالت ما دیگر به تابع main در زمان اجرا نیاز نداشته و می‌توانیم آن را با استفاده از دستور del حذف کنیم. این کار فضایی زیاد (به نسبت بدنه تابع) از حافظه اصلی را آزاد می‌کند.

def main():
  message = "Hello World"

  def inner_main():
    print(message)
  return inner_main

closure = main()
del main
closure()

اگر به خط دهم نگاه کنید متوجه خواهید شد که ما مقدار main را حذف کرده و در هر صورت closure مقدار نهایی تابع را برای ما بر خواهد گرداند. این دقیقا ساختار یک کلوژر است.

اما چه زمانی باید از کلوژر استفاده کنیم؟

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

  • قصد مخفی کردن یکسری از داده‌ها را داشته باشید
  • قصد استفاده کمتر از متغیرهای global را داشته باشید
  • بخواهید توابع و خصوصیات کمتری داشته و در فرایند فراخوانی کردن آن‌ها تمیزتر پیش بروید.

به صورت کلی بسیار مهم است که شما درک درستی از کلوژرها داشته و سپس از آن‌ها استفاده کنید. در غیر اینصورت ممکن است به مشکلاتی برخورد کنید.

چه امتیازی برای این مقاله میدهید؟

خیلی بد
بد
متوسط
خوب
عالی
5 از 1 رای

/@arastoo
ارسطو عباسی
کارشناس تولید و بهینه‌سازی محتوا

کارشناس ارشد تولید و بهینه‌سازی محتوا و تکنیکال رایتینگ - https://arastoo.net

دیدگاه و پرسش

برای ارسال دیدگاه لازم است وارد شده یا ثبت‌نام کنید ورود یا ثبت‌نام

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

در حال دریافت نظرات از سرور، لطفا منتظر بمانید