توابع مرتبه بالا (Higher-Order Functions)
توابع مرتبه بالا توابعی هستند که یا یکی از ورودیهایشان تابع است یا خودشان یک تابع را برمیگردانند. این قابلیت باعث میشود برنامهنویسی تابعی بسیار منعطفتر و قدرتمندتر شود.
مثال ساده از تابع مرتبه بالا
def apply_twice(func, value):
return func(func(value))
def add_three(x):
return x + 3
result = apply_twice(add_three, 7) # ابتدا 7 + 3 = 10، سپس 10 + 3 = 13
print(result) # خروجی: 13
در این مثال، تابع apply_twice
یک تابع و یک مقدار میگیرد، سپس تابع را دو بار روی مقدار اعمال میکند.
ترکیب توابع مرتبه بالا با دکوریتورها
دکوریتورها خودشان توابع مرتبه بالا هستند؛ زیرا یک تابع را میگیرند و نسخهی جدیدی از آن را برمیگردانند که رفتار آن را تغییر میدهد.
def decorator(func):
def wrapper():
print("Before function call")
func()
print("After function call")
return wrapper
@decorator
def say_hello():
print("Hello!")
say_hello()
در اینجا، decorator
تابعی است که یک تابع دیگر را میگیرد و یک تابع جدید با عملکرد اضافه برمیگرداند.
ترکیب با functools.partial
تابع partial
از ماژول functools
به ما اجازه میدهد که یک تابع جدید بسازیم که بخشی از آرگومانهایش از پیش تعیین شدهاند. این هم یک مثال از توابع مرتبه بالا است.
from functools import partial
def power(base, exponent):
return base ** exponent
square = partial(power, exponent=2)
cube = partial(power, exponent=3)
print(square(5)) # خروجی: 25
print(cube(4)) # خروجی: 64
کاربرد currying با توابع مرتبه بالا
Currying تکنیکی است که در آن یک تابع چند آرگومانی به چند تابع تک آرگومانی تبدیل میشود. میتوان با توابع مرتبه بالا این کار را پیاده کرد:
def curry(func):
def curried_func(x):
def inner(y):
return func(x, y)
return inner
return curried_func
@curry
def multiply(x, y):
return x * y
double = multiply(2)
print(double(5)) # خروجی: 10
در این مثال، تابع multiply
با currying تبدیل به تابعی شد که ابتدا یک ورودی میگیرد و سپس تابعی جدید میدهد که ورودی دوم را میپذیرد.
جمعبندی
توابع مرتبه بالا ابزار اصلی برنامهنویسی تابعی در پایتون هستند. با ترکیب آنها با دکوریتورها، partial
و currying میتوانید کدهای بسیار انعطافپذیر و خوانا بنویسید.