পাইথনে, map এবং filter মেথডগুলো লিস্ট জাতীয় অবজেক্ট এর উপরে প্রতিটা আইটেম-এ iterate করে লিস্ট রিটার্ণ করে। কিন্তু, মাঝে মাঝে এমন হয়তো দরকার পরতে পারে, যখন পুরো লিস্ট এর উপরে কাজ করে, একটা ভ্যালু দরকার। যেমনঃ পুরো লিস্ট এর যোগফল বা গুণফল। এই কাজের জন্যে আমরা রিডিউস মেথড ব্যবহার করতে পারি।
reduce
একটি বিল্ট-ইন ফাংশন। তবে, এই ফাংশন ব্যবহারের জন্যে আপনাকে functools
মড্যুলটি ইম্পোর্ট করে নিতে হবে।
এর সিনট্যাক্স হলঃ reduce(function, iterable, initializer=None)
। মেথডের ভিতরে প্রথমে ফাংশন পাস করাতে হয়, পরে ইটারেবল অবজেক্ট, পরে প্রাথমিক ভ্যালু(অপশনাল)। আবার, ফাংশন এর ক্ষেত্রে সিনট্যাক্স হলঃ function(count, item)
।
নিচে একটি উদাহরণ দেখা যাক-
>>> from functools import reduce
>>> def get_sum(count, item):
... return count + item
...
>>> my_marks = [10, 12, 20, 30]
>>> result = reduce(get_sum, my_marks) # 3rd parameter omitted here
>>> print(result)
72
উপরের উদাহরণে প্রথমে reduce
মেথডটি functools
মড্যুল থেকে ইমপোর্ট করা হয়েছে। পরে, একটি মেথড ডিক্লেয়ার করা হয়েছে, যেখানে count
এবং item
নামের দুইটি প্যারামিটার রয়েছে। এবং, এই মেথডের কাজ হল, এতে আসা আর্গুমেন্ট গুলোর যোগফল রিটার্ণ করা। এখন আমরা reduce
মেথডের ভিতরে প্রথমে মেথডের নাম, এর পরে ইটারেবল পাস করায়, রিডিউস আমাদের পুরো লিস্ট-এর যোগফল দিয়েছে যা result
নামক ভেরিয়েবলের ভিতরে স্টোর করা হয়েছে,পরে তা প্রিন্ট করা হয়েছে।
রিডিউস আসলে কিভাবে কাজ করে?
রিডিউস, তার প্রতিটি ইটারেবল আইটেমের জন্যে, পাস করা মেথডকে একবার করে কল করে। এবং, প্রতিবার সে আর্গুমেন্ট হিসেবে তার পূর্বের আইটেম গুলার যোগফল (count
হিসেবে) এবং বর্তমান আইটেম (item
হিসেবে) পাস করে। যদিও প্রথমবার, সে যোগফল হিসেবে শুন্য পাস করায়।
যেহেতু, আমরা ৩য় প্যারামিটার এর ডাটা হিসেবে কোনো ডাটা পাঠাইনি। যদি পাঠানো হয় তাহলে, প্রথমবার
count
এর ভ্যালু পাস করা ৩য় আর্গুমেন্ট ভ্যালু হবে। পরের প্রতিবার, সে মেথড থেকে রিটার্ণ করা ভ্যালুcount
এর ভ্যালু হিসেবে পাঠায়।
>>> from functools import reduce
>>> def get_sum(count, item):
... return count + item
...
>>> my_marks = [10, 12, 20, 30]
>>> result = reduce(get_sum, my_marks, 11) # 11 is passed as the initial count value
>>> print(result)
83