✔️ ماژول functools یکی از ماژولهای استاندارد پایتون است که ابزارهایی برای کار با توابع (functions) و callableها فراهم میکند. این ماژول بیشتر برای برنامهنویسی تابعی (functional programming) و کَش کردن، مرتبسازی، و ترکیب توابع استفاده میشود.
---
📦 کاربردهای اصلی functools
در ادامه مهمترین ابزارها و دکوراتورهای این ماژول را توضیح میدهم:
---
1. 🔁 @lru_cache و @cache
برای کَش کردن نتایج توابع:
python
from functools import lru_cache
@lru_cache(maxsize=128)
def slow_function(x):
print("Running...")
return x * 2
@lru_cache(maxsize=None) = بدون محدودیت → مشابه @cache (در پایتون 3.9+)
مناسب برای توابعی با محاسبهی سنگین که بارها با ورودیهای تکراری فراخوانی میشوند.
---
2. 🪝 @wraps
برای حفظ متادیتا (مثل name, doc) هنگام نوشتن دکوراتورهای سفارشی:
python
from functools import wraps
def my_decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
print("Before call")
return func(*args, **kwargs)
return wrapper
---
3. 🧩 partial
برای ساختن نسخهای از یک تابع با برخی آرگومانهای پیشفرض پرشده:
python
from functools import partial
def power(base, exponent):
return base ** exponent
square = partial(power, exponent=2)
print(square(4)) # 16
---
4. 🧮 cmp_to_key
برای تبدیل توابع مقایسهای (قدیمی) به کلید قابل استفاده در sorted():
python
from functools import cmp_to_key
def compare(a, b):
return a - b
sorted_list = sorted([5, 2, 9], key=cmp_to_key(compare))
---
5. 🧠 reduce
برای کاهش لیستی از مقادیر به یک مقدار واحد (مثل جمع، ضرب، ...):
python
from functools import reduce
result = reduce(lambda x, y: x + y, [1, 2, 3, 4])
print(result) # 10
> 🔸 در پایتون 3، reduce از ماژول functools آورده میشود (در پایتون 2 در builtin بود).
---
📌 لیست دیگر توابع مفید در functools
تابع یا کلاس توضیح
total_ordering
ساخت مقایسه کامل از فقط چند متد
singledispatch
تعریف تابعی که بر اساس نوع آرگومان رفتار متفاوت دارد
update_wrapper
مثل @wraps برای انتقال متادیتا
cached_property
مثل property ولی با کش کردن نتیجه
---
✅ مثال ترکیبی
python
from functools import lru_cache, partial
@lru_cache(maxsize=None)
def factorial(n):
return 1 if n == 0 else n * factorial(n - 1)
triple = partial(pow, exponent=3)
# خطا! چون pow آرگومان keyword نمیپذیرد
#functools | @LearnPythonIcy
تابع reduce
در پایتون، ماژول functools دسترسی به قابلیتهای تابعی (Functional Programming) زبان را فراهم میکند. یکی از توابع مهم و کاربردی این ماژول، تابع reduce است که با اعمال متوالی یک تابع مشخص روی عناصر یک مجموعه داده، آن مجموعه را به یک مقدار نهایی کاهش میدهد و نتایج میانی را در طول فرآیند حفظ میکند.
بهعنوان مثال، میتوان عملکرد reduce را در ضرب متوالی اعداد مشاهده کرد:
ابتدا عدد 1 در 2 ضرب میشود، سپس حاصل بهدستآمده در 3 ضرب میگردد و این روند به همین شکل ادامه پیدا میکند.
#python #functools