১২) Functions

আমরা এর আগে ম্যাথমেটিকায় বিভিন্ন ফাংশন (যেমন: List, Table, Print etc) ইউজ করে এসেছি। ইনফ্যাক্ট, আমরা বেসিক কিছু ক্যালকুলেশন ছাড়া বাকিসময় শুধু ফাংশনই ইউজ করেছি । এমনকি কিছু ক্যালকুলেশন যেমন রুট লগ এগুলার জন্যও আমরা ফাংশন ইউজ করেছি।

আমরা একাডেমিক পড়াশুনাতেও ফাংশন দেখেছি। সেখানে আমরা ইনপুট হিসেবে একটা সংখ্যা দিই, তারপর ফাংশন টার মধ্যে যেসব ম্যাথমেটিক্যাল অপারেশন ডিফাইন করা থাকে, ফাংশনটা সেই ইনপুটে উপর সেসব অপারেশন করে একটা রেজাল্ট আমাদেরকে আউটপুট হিসেবে দেয়।

ম্যাথমেটিকার ফাংশনগুলোও অনেকটা এরকম। আমরা এর মধ্যে কিছু ইনপুট দিব, সে এসব ইনপুট নিয়ে কিছু কাজ করবে এবং একটা আউটপুট দিবে।

ম্যাথমেটিকার একটি বিল্ট-ইন ফাংশন

আমরা জানি ম্যাথমেটিকাতে অসংখ্যা বিল্ট-ইন ফাংশন আছে। আমরা চাইলে আমাদের সুবিধামতো কাস্টম ফাংশনও বানাতে পারি। এই কাস্টম ফাংশন কীভাবে ডিফাইন করতে হয়? প্রথমত আমাদের একটা নাম ঠিক করতে হয় ফাংশন এর জন্য। নামটা এমন হওয়া উচিৎ যেন এটা দেখেই ফাংশনের কাজ সমন্ধে আইডিয়া পাওয়া যায়। ভ্যারিয়েবলের নাম কীরকম দিতে হয়arrow-up-right সেগুলা আমরা এর আগে দেখেছি। আমরা ফাংশনের নাম দেওয়ার ক্ষেত্রেও একই নিয়ম ফলো করবো। নাম ঠিক হওয়ার পর আমরা থার্ড ব্রাকেট এর মধ্যে প্রয়োজন মতো কিছু ভ্যারিয়েবল এর নাম দিব - মূলত, এই ভ্যারিয়েবল(গুলো) দিয়েই ফাংশনের মধ্যের কাজ গুলো করা হয়ে থাকে এবং আমরা যখন ফাংশনে ইনপুট দিব তখন এই ভ্যারিয়েবল গুলোই সেই ইনপুট গ্রহণ করবে। থার্ড ব্রাকেট এর মধ্যের এই ভ্যারিয়েবল গুলোকে প্যারামিটার বলে।

আমরা এখন নিজেদের একটা ফাংশন ডিফাইন করবো এবং ইউজ করবো। ধরি ফাংশন টার নাম func1 এটা একটা সংখ্যা ইনপুট নেয়, এবং তার সাথে তার বর্গকে যোগ করে দেখাবে। এখানে আমাদের প্যারামিটার ১টা। প্যারামিটারকেও ভ্যারিয়েবল আর ফাংশনের মতো নাম দিতে হয় সেই সাথে নামের শেষে একটা আন্ডারস্কোর/ড্যাশ _ দিতে হয় (এটা কেন দিতে হয় পরে দেখতেছি)। ধরি এক্ষেত্রে আমাদের প্যারামিটারের নাম param1_ । আমরা ম্যাথমেটিকাল ফাংশনের ক্ষেত্রে দেখেছি নামের পরে একটা সমান চিহ্ন দিতে হয়। কিন্তু ম্যাথম্যাটিকাতে সমান চিহ্ন দিতে হয় মান এ্যাসাইন করার জন্য। আবার দুইটা সমান চিহ্ন ব্যবহৃত হয় কম্পেয়ার করার জন্য। তাই আমাদের এখানে অন্য কোনো চিহ্ন দিতে হবে। এখানে প্রথমে আমরা একটা কোলন দিব, তারপর একটা সমান চিহ্ন দিব := ব্যাস হয়ে গেল। এরপরে ফাংশনের মধ্যে কী কী কাজ করতে হবে সেগুলা লিখে দিতে হবে। এক্ষেত্রে আমরা ইনপুট নেওয়া সংখ্যার সাথে সেই সংখ্যাটার বর্গকে যোগ করতে চেয়েছি। যেহেতু আমরা ইনপুট নেওয়া সংখ্যাটাকে param1_ এ রেখেছি (প্যারামিটারের কাজ হলো ইনপুট টা কে ক্যারি করা), তাই এটার সাথে এটারই বর্গকে যোগ করতে হবে,অর্থাৎ param1^2 + param । তবে এক্ষেত্রে আমরা আন্ডারস্কোর টা দিব না, ওটা শুধু থার্ড ব্রাকেট এর মধ্যে দিতে হয়। আমাদের ফাংশন ডিফাইন করা শেষ, এখন আমরা ফাংশন টা চালায়ে দেখবো।

এখানে একটা বিষয়। ফাংশন ডিফাইন করার সময় আমরা যে ভ্যারিয়েবল দিয়েছিলাম (param1_) থার্ড ব্রাকেট এর মধ্যে, সেটার নাম ছিল প্যারামিটার। আর আমরা যখন ফাংশন ইউজ করলাম তখন ঐ ভ্যারিয়েবল এর বদলে যেসব মান দিয়েছি অর্থাৎ এই যে 2 10 70 এগুলো হলো আর্গুমেন্ট। আমরা এর আগে অনেকবার আর্গুমেন্ট শব্দ টা ইউজ করেছিলাম, আশা করি এই ব্যাখ্যার পর ব্যাপারটা ক্লিয়ার হয়েছে। এর আগে প্যারামিটার কি সেটা যেহেতু আমরা জানতাম না তাই আর্গুমেন্ট কি সেটা বলিনি।

আমরা একবার ফাংশন ডিফাইন করে ফেললে সেটাকে বিভিন্ন কাজে ব্যবহার করতে পারবো। যেমন এখানে আমরা আমাদের ফাংশনটার গ্রাফ ড্র করতেছি:

আমরা একাধিক প্যারামিটারও ইউজ করতে পারি। যেমন: আমাদের যদি বল F , সরণ x ও এদের মধ্যবর্তী কোণ theta দেওয়া থাকে তাহলে আমরা একটা ফাংশন বানাতে পারি যা এগুলোকে ইনপুট হিসেবে নিয়ে কাজের মান আউটপটু হিসেবে দিবে।

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

ভয় পাওয়ার কিছু নেই, আমরা স্টেপ বাই স্টেপ বুঝবো কী হচ্ছে এখানে।

  1. প্রথমে আমরা SquareSum নামের একটি ফাংশন ডিফাইন করতেছি, যার কাজ হবে একটি লিস্ট ইনপুট নিয়ে তার ভেতরের সব উপাদানের বর্গ করে তাদের যোগফল আউটপুট হিসেবে দেখাবে।

  2. list_ হলো এখানে প্যারামিটারটা, যার মধ্যে ইনপুটের লিস্ট টা পাস হবে এবং আমরা সেটাকে নিয়ে ফাংশনের মধ্যে কাজ করতে পারবো।

  3. ফাংশনের শুরুতেই ans = 0; আছে, আমরা আমাদের ফাংশনের আউটপুট এই ভ্যারিয়েবলে রাখবো। এর মধ্যে আমরা লিস্টের প্রতিটি উপাদানের বর্গ একটি একটি করে যোগ করবো বিধায় ans এর initial value zero দেওয়া হয়েছে।

  4. আমরা একটি লুপ নিচ্ছি কারণ আমাদের লিস্টের প্রতিটি উপাদানকে iterate করতে হবে। প্রতিটি ইটারেশনে আমরা একটা কাজই করবো, সেটা হলো ans এর বর্তমান ভ্যালুর সাথে লিস্টের পরবর্তী উপাদানের বর্গকে যোগ করে আবার সেই ans এর ভেতরেই রাখবো। সেই কাজটিই আমরা করেছি ans = ans + list[[i]]^2 এর মাধ্যমে। এখানে i হলো লুপ কন্ট্রোল ভ্যারিয়েবল, যা দিয়ে আমরা লিস্টের প্রতিটা এলিমেন্টকে এক্সেস করেছি। i এর শুরুর মান হবে 1 এবং শেষ মান হবে লিস্টে কতগুলো এলিমেন্ট আছে সেটা(যা আমরা Length[List] দিয়ে বের করতে পারি)।

  5. সবশেষে আমরা ans টা কে শো করতেছি আউটপুট হিসেবে। আগের ফাংশন গুলোর ভেতরে একটাই কাজ করা হয়েছিল জন্য লাইনও একটাই লাগছে। কিন্তু এই ফাংশনে একাধিক কাজ করতে হয়েছে জন্য একাধিক লাইন লেগেছে, সেসব লাইনকে আমরা সেমিকোলন দিয়ে যুক্ত করে একজোড়া first bracket এর মধ্যে আবদ্ধ রেখে ফাংশনটাকে ডিফাইন করেছি।

  6. এরপর আমরা list1 নামের ভ্যারিয়েবলে ১ থেকে ৪ পর্যন্ত পূর্ণসংখ্যাগুলোর লিস্ট নিয়েছি।

  7. list1 কে SquareSum[] এ পাস করলে আমরা 1^2 + 2^2 + 3^2 + 4^2 এর মান(30) আউটপুটে দেখতে পারবো।

প্রোগ্রামিং করতে গেলে অনেকসময় দেখা যায় একই রকমের কিছু কাজ বা ইন্সট্রাকশন প্রোগ্রামের বিভিন্ন জায়গায় ইউজ করতে হচ্ছে। আমরা যদি প্রতিবার সেগুলো ইন্সট্রাকশন আলাদা আলাদা করে কোড করি তাহলে আমাদের পুরা প্রোগ্রামের কোড অহেতুক অনেক বড় হয়ে যাবে। আবার, এই একই রকম ইন্সট্রাকশন গুলোর কোনো একটা যদি একটু পরিবর্তন করা লাগে, তাহলে যেসব জায়গায় এই ইন্সট্রাকশন গুলো ইউজ করা হয়েছিল, প্রতিটা জায়গাতেই চেঞ্জ করতে হবে। তাই আমরা আমাদের কমন কাজ গুলো একটা ফাংশনে রেখে দিতে পারি এবং পরে যখন যখন এই ইন্সট্রাকশন গুলো লাগবে আমাদের, আমরা শুধু ফাংশন টা কল করবো তাহলেই হয়ে যাবে। বাড়তি করে আবার কোড লিখতে হবে না।

Last updated