توابع Partial در پایتون

  • مدرس : علی بیگدلی
  • تاریخ انتشار: 1404/05/12
  • تعداد بازدید: 23

توابع Partial در پایتون با functools.partial

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

تعریف و عملکرد functools.partial

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

مثال ساده

from functools import partial

def multiply(x, y):
    return x * y

# ساخت تابع جدید که y برابر 2 دارد
double = partial(multiply, y=2)

print(double(5))  # خروجی: 10

در این مثال:

  • تابع اصلی multiply دو عدد را ضرب می‌کند.
  • با partial یک تابع جدید double ساختیم که همیشه مقدار y برابر 2 دارد.
  • وقتی double(5) فراخوانی می‌شود، در واقع multiply(5, 2) اجرا می‌شود.

 

چرا partial کاربردی است؟

 

  • اگر یک تابع بزرگ و پیچیده داشته باشیم و در شرایط خاص بخواهیم یک نسخه سفارشی با پارامترهای ثابت بسازیم.
  • در برنامه‌نویسی تابعی (functional programming)، برای ساده‌سازی کدها و بازاستفاده بیشتر.
  • در کتابخانه‌هایی که به عنوان callback یا handler استفاده می‌شوند و نیاز به پارامترهای از پیش تعیین شده دارند.

 

مثال کاربردی‌تر

def greet(name, greeting="Hello"):
    return f"{greeting}, {name}!"

say_hello = partial(greet, greeting="Hello")
say_hi = partial(greet, greeting="Hi")

print(say_hello("Ali"))  # خروجی: Hello, Ali!
print(say_hi("Sara"))    # خروجی: Hi, Sara!

در این مثال:

  • با استفاده از partial دو تابع جدید ساختیم که پیش‌فرض greeting آن‌ها متفاوت است.
  • نیازی نیست هر بار greeting را وارد کنیم، فقط نام را می‌دهیم.

 

نکات مهم

  • آرگومان‌هایی که در partial تعیین می‌شوند، هم می‌توانند به صورت موقعیتی (positional) و هم کلیدی (keyword) باشند.
  • پارامترهایی که در هنگام فراخوانی نسخه partial داده نشوند، باید در آرگومان‌های جدید مشخص شوند.
  • partial خودش یک callable است و می‌تواند به عنوان ورودی به توابع دیگر داده شود.
  • اگر پارامترهای اصلی تابع تغییر کنند، نسخه partial بر اساس تعریف اصلی است و باید مراقب تغییرات بود.

 

ثبت دیدگاه


نکته: آدرس ایمیل شما منتشر نخواهد شد

دیدگاه کاربران (0)


هیچ دیدگاهی ثبت نشده است. می‌توانید اولین نفر باشید.