ম্যাপ ও ফিল্টার

এই চ্যাপ্টারটি সর্বশেষ হালনাগাদ হয়েছেঃ Thu Oct 12 2017 04:48:41 GMT+0000 (UTC) সময়ে

লিস্ট এবং সমগোত্রীয় অবজেক্ট যাদেরকে পাইথনে iterable বলা হয়, তাদের উপর বিভিন্ন অপারেশনের জন্য ম্যাপ ও ফিল্টার খুবই উপকারী। এরা বিল্টইন ফাংশন।

ম্যাপ

map ফাংশনটি এর আর্গুমেন্ট হিসেবে একটি ফাংশন এবং একটি iterable নেয়। পাঠানো ফাংশনটি বস্তুত সেই iterable এর প্রত্যেকটি এলিমেন্টের উপর প্রয়োগ হয়। শেষে পরিবর্তিত iterable টিকে রিটার্ন করে। যেমন -

>>> def make_double(x):
...     return x * 2
...
>>> my_marks = [10, 12, 20, 30]
>>> result = map(make_double, my_marks)
>>> print(list(result))
[20, 24, 40, 60]

উপরের উদাহরণে প্রথমে একটি সাধারণ ফাংশন ডিফাইন করেছি যেটার কাজ হচ্ছে এর কাছে আসা যেকোনো নাম্বারকে দিগুণ করে রিটার্ন করে। তারপর আমরা আরেকটি লিস্ট ডিফাইন করেছি যার মধ্যে কিছু নাম্বার আছে। এরপর আমরা ম্যাপ ফাংশন কল করেছি এবং এর প্রথম আর্গুমেন্ট হিসেবে সেই make_double ফাংশনকে এবং দ্বিতীয় আর্গুমেন্ট হিসেবে my_marks লিস্ট (iterable) কে পাঠিয়েছি। ম্যাপ ফাংশন আরেকটি iterable কে রিটার্ন করে result ভ্যারিয়েবলের মধ্যে যেটা আসলে আগের লিস্টের মান গুলোর দিগুণ পরিমাণ নিয়ে গঠিত। শেষে, প্রিন্ট করার আগে সেই iterable কে list হিসেবে কনভার্ট করে প্রিন্ট করেছি।

ফিল্টার

filter ফাংশনের নাম শুনেই বোঝা যাচ্ছে এটা কোন কিছু ফিল্টার করে আলাদা করে। এই ফাংশন তার কাছে দেয়া কোন iterable থেকে কিছু এলিমেন্ট রিমুভ করে একটা প্রেডিকেট এর উপর ভিত্তি করে (প্রেডিকেট হচ্ছে ফাংশন যেটা বুলিয়ান ভ্যালু রিটার্ন করে)। ম্যাপের মত, ফিল্টারও দুটো আর্গুমেন্ট নেয় - একটা ফাংশন এবং একটা iterable (লিস্ট)।

ফিল্টার সেই সমস্থ এলিমেন্ট কেই রিমুভ করে যার জন্য এর কাছে পাঠানো ফাংশনের রিটার্ন তথা প্রেডিকেট মিথ্যা হয়। নিচের উদাহরণ দেখলে পরিষ্কার হয়ে যাবে -

>>> def is_even(x):
...     return x % 2 == 0
...
>>> my_numbers = [1,2,3,4,5,6]
>>> result = filter(is_even, my_numbers)
>>> print(list(result))
[2, 4, 6]

is_even ফাংশনটি এর কাছে আসা ভ্যালু জোড় হলে True এবং নাহলে False রিটার্ন করে। আর আমরা ফিল্টারের প্রথম আর্গুমেন্ট হিসেবে এই ফাংশনকেই পাঠিয়েছি। অন্যদিকে iterable হিসেবে my_numbers কে পাঠিয়েছি। এখন filter ফাংশন আমাদের লিস্টের প্রত্যেকটা এলিমেন্টের উপর সেই ফাংশনকে প্রয়োগ করে এবং যখন যখন এর রিটার্ন False হয় তখনকার এলিমেন্টটিকে রিমুভ করে শেষ নাগাদ নতুন একটা অবজেক্ট রিটার্ন করে।

ল্যাম্বডা রিভিউ

আগের চ্যাপ্টারে আমরা দেখেছি সহজ ও সিম্পল ফাংশন এবং যেটা ষ্টোর করার প্রয়োজন নেই সেগুলোকে কিভাবে lambda হিসেবে ডিফাইন করা ভালো প্র্যাকটিস। উপরের দুটি ক্ষেত্রেই আমরা দেখতে পাচ্ছি যে ম্যাপ বা ফিল্টারের কাছে পাঠানো প্রথম আর্গুমেন্ট যা কিনা একটা ফাংশন, সেটাকে কোথাও ডিফাইন/স্টোর করার প্রয়োজন পরছে না। তো, এই ফাংশনকে আমরা ল্যাম্বডা দিয়েই তৈরি ও ব্যবহার করতে পারি।

ফিল্টারের প্রোগ্রামটা আবার করছি একটা ল্যম্বডা পাঠিয়ে -

>>> nums = [11, 22, 33, 44, 55]
>>> res = list(filter(lambda x: x % 2 == 0, nums))
>>> print(res)
[22, 44]

সংকলন - নুহিল মেহেদী