Closures در پایتون چیست؟ — به زبان ساده

عکس شاخص Closures در پایتون چیست؟

در این مقاله از سری مقاله‌های مجله پی استور به جزئیات کامل Closures در پایتون به زبان ساده می‌پردازیم. Closure یا بستار در پایتون «Python»، مفهومی قدرتمند است که به یک تابع «Function» اجازه می‌دهد متغیرهای موجود در دامنه خود را به خاطر بسپارد و به آن‌ها دسترسی «Access» داشته باشد، حتی زمانی که تابع خارج از آن دامنه اجرا شود. بستارها ارتباط نزدیکی با توابع تودرتو «Nested functions» دارند و معمولاً در برنامه‌نویسی تابعی «Functional Programming» ، مدیریت رویدادها «Event Management» و استفاده از توابع بازگشتی «Callbacks» کاربرد دارند.

مقدمه

یک بستار زمانی ایجاد می‌شود که یک تابع داخلی «Internal function» درون تابع دیگری به نام تابع بیرونی «External function» تعریف شود و تابع داخلی به متغیرهای تابع بیرونی ارجاع دهد. این پدیده در پایتون به عنوان Closure شناخته می‌شود. در واقع، Closure‌ها زمانی مفید هستند که بخواهید تابعی داشته باشید که وضعیت خود را در طول چندین فراخوانی حفظ کند، بدون اینکه نیاز به استفاده از متغیرهای سراسری یا Global Variables باشد.

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

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

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

حال یک مثال ساده از بستارها Closures در پایتون را بررسی کنیم تا بفهمیم که Closureها چگونه کار می‌کنند:

def fun1(x):
  
    # This is the outer function that takes an argument 'x'
    def fun2(y):
      
        # This is the inner function that takes an argument 'y'
        return x + y  # 'x' is captured from the outer function
    
    return fun2  # Returning the inner function as a closure

# Create a closure by calling outer_function
closure = fun1(10)

# Now, we can use the closure, which "remembers" the value of 'x' as 10
print(closure(5))

خروجی:

15

عملکرد Closures در پایتون

  1. تابع بیرونی: یک آرگومان «Argument» به نام x می‌گیرد و تابعی به نام  fun2 را تعریف می‌کند. تابع fun2 از x و یک آرگومان دیگر به نام y استفاده می‌کند تا یک محاسبه را انجام دهد.
  2. تابع داخلی: این تابع توسط fun1 بازگردانده می‌شود و در نتیجه یک بستار closure است. این تابع مقدار x را به خاطر می‌سپارد حتی پس از این که fun1 اجرای خود را به پایان رسانده باشد.
  3. ایجاد و استفاده از بستار: زمانی که fun1(10) را فراخوانی می‌کنید، این تابع fun2 را با مقدار x برابر ۱۰ بازمی‌گرداند. این تابع بازگردانده‌شده (fun2) در متغیر closure ذخیره می‌شود. هنگامی که closure(5) را فراخوانی می‌کنید، از مقدار به خاطر سپرده‌شده x(۱۰) و آرگومان ارسال‌شده y(۵) استفاده می‌کند و حاصل جمع ۱۰ + ۵ = ۱۵ را محاسبه می‌کند.

مثال برای Closures در پایتون:

def fun(a):
    # Outer function that remembers the value of 'a'
    def adder(b):
        # Inner function that adds 'b' to 'a'
        return a + b
    return adder  # Returns the closure

# Create a closure that adds 10 to any number
val = fun(10)

# Use the closure
print(val(5))  
print(val(20))

خروجی:

15
30

در این مثال: fun(10) یک بستار «Closure» ایجاد می‌کند که مقدار ۱۰ را به خاطر می‌سپارد و آن را به هر عددی که به این بسته ارسال شود، اضافه می‌کند.

Closures در پایتون

نحوه کار کردن Closures در پایتون

زمانی که یک بستار ایجاد می‌شود، پایتون «python» به طور داخلی مرجعی به محیط (متغیرهای موجود در دامنه بیرونی) که بستار در آن تعریف شده است، ذخیره می‌کند. این به تابع داخلی اجازه می‌دهد که به این متغیرها دسترسی داشته باشد حتی پس از اینکه تابع بیرونی «outer function» تمام شده باشد. یک بستار مقادیر موجود در دامنه اطراف خود را «ضبط» کرده و آن‌ها را برای استفاده‌های بعدی نگه می‌دارد. این همان چیزی است که به بسته‌ها اجازه می‌دهد تا مقادیر محیط خود را به یاد بسپارند.

استفاده از Closures در پایتون

بستارها زمانی مفید و ضروری هستند که نیاز به حفظ وضعیت «State» بین چندین فراخوانی تابع «function call» داشته باشیم، بدون اینکه از متغیرهای سراسری استفاده کنیم. در موارد زیر بستارها کاربرد دارند:

  • مخفی‌سازی (Encapsulation): بستارها به مخفی‌سازی عملکرد کمک می‌کنند. تابع داخلی می‌تواند به متغیرهای تابع بیرونی دسترسی داشته باشد، اما این متغیرها از دنیای بیرون مخفی می‌مانند.
  • حفظ وضعیت (State Retention): بستارها می‌توانند وضعیت را در طول چندین فراخوانی تابع حفظ کنند. این ویژگی در موقعیت‌هایی مانند شمارنده‌ها، تجمع‌کننده‌ها یا زمانی که بخواهید یک کارخانه تابع ایجاد کنید که توابع با رفتارهای مختلف تولید کند، مفید است.
  • برنامه‌نویسی تابعی (Functional Programming): بستارها ویژگی اصلی برنامه‌نویسی تابعی هستند. آن‌ها به شما اجازه می‌دهند تا کد انعطاف‌پذیرتر و مدولارتر بنویسید و رفتار جدیدی را به صورت پویا ایجاد کنید.

نتیجه‌گیری

بستارها در پایتون ابزاری قدرتمند هستند که به توابع داخلی اجازه می‌دهند به متغیرهای تابع بیرونی «outer function» دسترسی داشته باشند و آن‌ها را به یاد بسپارند، حتی پس از اتمام اجرای تابع بیرونی. این ویژگی باعث می‌شود بستارها در مدیریت وضعیت، مخفی‌سازی اطلاعات و ایجاد کدهای منعطف و مدولار بسیار مفید باشند. بستارها در برنامه‌نویسی تابعی و موقعیت‌هایی مانند ایجاد توابع با رفتارهای متفاوت یا حفظ وضعیت بین فراخوانی‌ها کاربرد فراوانی دارند. در نهایت، بستارها به توسعه‌دهندگان «Developers» این امکان را می‌دهند که کدهای پیچیده‌تری با قابلیت‌های بیشتر و وابستگی کمتر به متغیرهای سراسری بنویسند.


سوالات متداول


بستارها چه تفاوتی با توابع معمولی دارند؟

در حالی که توابع معمولی تنها به پارامترهای خود دسترسی دارند، بستارها علاوه بر دسترسی به پارامترهای خود، می‌توانند به متغیرهای تعریف شده در تابع بیرونی نیز دسترسی داشته باشند، حتی پس از اتمام اجرای تابع بیرونی.

آیا بستارها حافظه را مصرف می‌کنند؟

بله، بستارها حافظه بیشتری مصرف می‌کنند زیرا باید به متغیرهای بیرونی که به آن‌ها دسترسی دارند، اشاره کنند. این می‌تواند منجر به مصرف بیشتر حافظه در برنامه شود.

آیا می‌توان از بستارها برای ایجاد توابع بازگشتی استفاده کرد؟

بله، می‌توان از بستارها برای ایجاد توابع بازگشتی استفاده کرد، به خصوص زمانی که بخواهیم اطلاعاتی مانند شمارنده یا وضعیت داخلی را در طول اجرای توابع بازگشتی حفظ کنیم.

آیا بستارها می‌توانند با متغیرهای سراسری تداخل کنند؟

بستارها معمولاً از متغیرهای بیرونی استفاده می‌کنند، اما این به معنای تداخل با متغیرهای سراسری نیست. بستارها فقط به متغیرهایی دسترسی دارند که در محیط تابع بیرونی تعریف شده‌اند.

میزان رضایتمندی
لطفاً میزان رضایت خودتان را از این مطلب با دادن امتیاز اعلام کنید.
[ امتیاز میانگین 0 از 0 نفر ]
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع و مراجع:
geeksforgeeks مجله پی استور programiz

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *



برچسب‌ها:
پایتون


پیمایش به بالا