পাইথনে ফাংশনকে হাইয়ার-অর্ডার বলা হয়। এর মানে এটি অন্য ফাংশনের আর্গুমেন্ট হিসেবে পাস করা যায় এবং/অথবা অন্য ফাংশন রিটার্ন করতে পারে। functools মডিউল এমন হাইয়ার-অর্ডার ফাংশন 위한 গুরুত্বপূর্ণ ইউটিলিটি প্রদান করে।
partial() ফাংশন
এই ফাংশন একটি কলেবল 'partial' অবজেক্ট রিটার্ন করে। অবজেক্টটি নিজে একটি ফাংশনের মতো আচরণ করে। partial() ফাংশন অন্য একটি ফাংশন আর্গুমেন্ট হিসেবে গ্রহণ করে এবং একটি ফাংশনের আর্গুমেন্টের কিছু অংশ ফ্রিজ করে দেয় ফলে একটি সরলীকৃত সিগনেচার সম্পন্ন একটি নতুন অবজেক্ট তৈরি হয়।
বিল্ট-ইন int() ফাংশন একটি নম্বরকে ডেসিমেল ইন্টিজারে কনভার্ট করে। int()-এর ডিফল্ট সিগনেচার হলো:
int(x, base=10)
partial() ফাংশন ব্যবহার করে একটি কলেবল তৈরি করা যায় যা int() ফাংশনের মত আচরণ করে যেখানে base আর্গুমেন্ট ডিফল্টভাবে two থাকে।
>>> import functools
>>> binint = functools.partial(int, base=2)
>>> binint('1001')
9
নিচের উদাহরণে, একটি ইউজার ডিফাইনড ফাংশন myfunction() partial ফাংশনের আর্গুমেন্ট হিসেবে ব্যবহার করা হয়েছে যেটি মূল ফাংশনের আর্গুমেন্টের একটি ডিফল্ট ভ্যালু সেট করে।
>>> def myfunction(a, b):
return a * b
>>> partfunction = functools.partial(myfunction, b=10)
>>> partfunction(10)
100
partialmethod()
এই ফাংশন একটি নতুন partialmethod ডেসক্রিপ্টর রিটার্ন করে যা partial-এর মত আচরণ করে সिवায় এটি মেথড ডেফিনিশন হিসেবে ব্যবহারের জন্য ডিজাইন করা, সরাসরি কলেবল হওয়ার বদলে।
cmp_to_key() ফাংশন
পাইথন ২.x-এ দুটি অবজেক্ট কমপেয়ার করার জন্য cmp() ফাংশন ছিল। পাইথন ৩ এটি ডিপ্রিকেট করেছে। functools মডিউল cmp_to_key() ফাংশন প্রদান করে যেন ইউজার ডিফাইনড ক্লাসের অবজেক্ট কমপেয়ার করা যায়।
from functools import cmp_to_key
class test:
def __init__(self, x):
self.x = x
def __str__(self):
return str(self.x)
def cmpr(a, b):
if a.x >= b.x:
return True
if a.x < b.x:
return False
mykey = cmp_to_key(cmpr)
reduce() ফাংশন
reduce() ফাংশন দুটি আর্গুমেন্ট গ্রহণ করে, একটি ফাংশন এবং একটি ইটেরেবল। তবে এটি একটি সিঙ্গেল ভ্যালু রিটার্ন করে। আর্গুমেন্ট ফাংশনটি লিস্টের দুই আর্গুমেন্টের ওপর কিউমুলেটিভলি বাম থেকে ডানে প্রয়োগ করা হয়। ফাংশনের ফলাফল প্রথম কলেই প্রথম আর্গুমেন্ট बन जाता है এবং লিস্টের তৃতীয় আইটেম দ্বিতীয় আর্গুমেন্ট বने। লিস্ট শেষ না হওয়া পর্যন্ত এটি পুনরাবৃত্তি হয়।
নিচের উদাহরণে, mult() ফাংশন দুটি সংখ্যার প্রোডাক্ট রিটার্ন করার জন্য ডিফাইন করা হয়েছে। এই ফাংশনটি reduce() ফাংশনে ১ থেকে ১০ পর্যন্ত নম্বর রেঞ্জের সাথে ব্যবহার করা হয়েছে। আউটপুট হলো ১০-এর ফ্যাক্টোরিয়াল ভ্যালু।
import functools
def mult(x, y):
return x * y
num = functools.reduce(mult, range(1, 11))
print('factorial of 10: ', num)
আউটপুট
factorial of 10: 3628800