পাইথন প্রোগ্রামিং এ ফাংশন

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

একটা ফাংশন নিচের মত করে লেখা হয়ঃ

def function_name(Parameters):
    statements
    return

এখানে
def দিয়ে ফাংশন শুরু করা হয়।

  • ফাংশনের তো একটা নাম থাকতে হবে তাই না? যে নাম দিয়ে ফাংশনটিকে ডাকতে হবে। function_name হচ্ছে ফাংশনের নাম।
  • প্যারামিটার (Parameters) হচ্ছে ফাংশন দিয়ে কি কি ডেটা পাস করবে। এখানে এক বা একাদিক প্যারামিটার পাস করা যেতে পারে। কোন কোন ফাংশনে কোন প্যারামিটার নাও থাকতে পারে। এটা নির্ভর করে কি ধরনের ফাংশন লিখা হচ্ছে তার উপর। একের অধিক প্যারামিটার থাকলে তাদেরকে কমা (,) দিয়ে লিখতে হয়।
  • কাজ শেষে ফাংশনটি কি রিটার্ন করবে তাই return দিয়ে পাস করা হয়। ফাংশন যদি কোন কিছু রিটার্ন না করে, তাহলে return 0 বা না লিখলেও হবে।

যেমন আমরা greet নামে একটা ফাংশন লিখব, যেটাকে কল করলে প্রিন্ট করবে Welcome to Python programming।

def greet():
    print('Welcome to Python programming!')

উপরের ফাংশনে কোন প্যারামিটার নেই, এবং ফাংশনটি কোন কিছু রিটার্ণ ও করবে না। একে কল করলে শুধু Welcome to Python programming! প্রিন্ট করবে। ফাংশন লেখার পর তা ব্যবহার করার জন্য কল করতে হয়। greet() কল করলে ফাংশনটি এক্সিকিউট হবে। সম্পুর্ণ প্রোগ্রামঃ

def greet():
    print('Welcome to Python programming!')
greet()

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

def greet():
    print('Welcome to Python programming!')

greet()
greet()
greet()

প্রোগ্রামটি রান করলে তিনবার Welcome to Python programming! প্রিন্ট করবে।

ফাংশনের প্যারামিটার

আমাদের এমন ফাংশন লিখতে হতে পারে, যেখানে ফাংশনে কিছু ডেটা পাঠালে ঐ ডেটা আমাদের প্রসেস করে দিবে। আর এই ডেটা আমরা পাঠাবো প্যারামিটার হিসেবে।

উপরের প্রোগ্রামটিই একটু মডিফাই করে লিখিঃ

def greet(name):
    print(‘Good morning, ' + name)

greet('Rashid')

এখানে আমরা greet ফাংশনে এখন প্যারামিটার হিসেবে name একটা ভ্যারিয়েবল নিয়েছি। আর যখন কল করেছি, তখন একটা নাম পাস করেছি। এবং রান করলে যা আউটপুট দিচ্ছেঃ Good morning, Rashid।
যখন এই greet ফাংশনটি কল করব, তখন এ ফাংশনটি আশা করবে এর মধ্যে একটা নাম আমরা প্যারামিটার হিসেবে দিব। যদি না দেই, তখন ভুল দেখাবে।
আরেকটা ফাংশন লিখি add নামে। যেটা প্যারামিটার হিসেবে দুইটা নাম্বার নিবে এবং রিটার্ন করবে নাম্বার দুটির যোগফলঃ

def add(a, b):
    return a + b
print(add(4, 7))

এখানে add ফাংশনে আমরা দুইটা সংখ্যা প্যারামিটার হিসেবে দিচ্ছি। ফাংশনটি আমাদের ফেরত দিচ্ছে সংখ্যা দুইটির যোগফল।

যখন আমরা ফাংশনটি কল করেছি, তখন সংখ্যা দুটি পাস করে দিয়েছি। যে সংখ্যা দুইটির যোগ ফল আমরা পেতে চাই তা পাস করেছি add(4, 7) দিয়ে। ফাংশনটি আমাদের ঐ সংখ্যা দুটি নিয়ে তা যোগ করে তা ফেরত দিয়েছে, return a + b দিয়ে। পরে তা প্রিন্ট করেছি।

এখন আমরা যতবার ইচ্ছে ততবার add ফাংশনটি কল করতে পারি। যাতে দুইটি সংখ্যা প্যারামিটার হিসেবে দিলে তা যোগ করে আমাদের পাঠিয়ে দিবে। যেন আমরা তা প্রিন্ট করতে পারি। আলাদা করে যোগ করতে হচ্ছে না।

def add(a, b):
    return a + b

print (add(4, 7))
print (add(89, 732))
print (add(55, 999))

যা আমাদের আউটপুট দিবেঃ

11
821
1054

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

def add(a, b):
    return a + b


num_1 = int(input('Enter 1st number: '))
num_2 = int(input('Enter end number: '))

print(add(num_1, num_2))

প্রোগ্রামটি রান করলে আমাদের থেকে দুইটা নাম্বার ইনপুট নিবে। এরপর যোগ করে তা আউটপুট দিবে।

এবার আমরা আরেকটা ফাংশন লিখব। যেটা একটি নাম্বার জোড় না বিজোড় তা বলে দিবে। ব্যবহারকারী থেকে একটা নাম্বার ইনপুট নিব। তারপর তা ফাংশনে পাস করব। ফাংশন আমাদের বলে দিবে নাম্বারটি জোড় না বিজোড়ঃ

def check_number(num):
    if num % 2 == 0:
        print('It is an even number')
    else:
        print('It is an odd number')


number = int(input("Enter  a  number to check: "))
check_number(number)

ডিফল্ট প্যারামিটার
কোন ফাংশন লেখার সময় আমরা তার ডিফল্ট প্যারামিটার সেট করে দিতে পারি। ডিফল্ট প্যারামিটার সেট করে দেওয়া হলে যদি ফাংশন কল করার সময় ঐ প্যারামিটারের আইটেমের জন্য কোন ভ্যালু সেট করে দেওয়া না হয়, তাহলে ফাংশন ডিফল্ট ভ্যালুটি ব্যবহার করবে।
নিচের প্রোগ্রামটি দেখিঃ

def home(country='Bangladesh'):
    print('Hi, I am from ' + country)

home()
home(‘Nepal')

আউটপুট হচ্ছেঃ

Hi, I am from Bangladesh
Hi, I am from Nepal

এখানে ফাংশনটি লেখার সময় একটা ডিফল্ট প্যারামিটার সেট করে দিয়েছি। ফাংশনটি কল করার সময় কোন প্যারামিটার পাস না করায় ডিফল্ট প্যারামিটারটা ব্যবহার হয়েছে। অন্য সময় যে প্যারামিটার পাস করেছি, তাই ব্যবহার হয়েছে।

আরেকটা প্রোগ্রাম দেখি। দুইটা সংখ্যার মধ্যে ছোট বড় নির্ণয়ের প্রোগ্রামঃ

def find_max(a, b=0):
    if a > b:
        return format(a) + " is greater than " + format(b)
    elif a < b:
        return format(a) + " is less than " + format(b)
    elif a == b:
        return format(a) + " and " + format(b) + " both are same"


print(find_max(6, 7))
print(find_max(9))
print(find_max(5, 5))

যা আউটপুট দিবেঃ

6 is less than 7
9 is greater than 0
5 and 5 both are same

এখানে যখন ফাংশনে দ্বিতীয় প্যারামিটার হিসেবে কোন ভ্যালু পাঠাই নি, তখন ডিফল্ট ভ্যালু 0 ব্যবহার করেছে।

ফাংশন থেকে একাধিক ভ্যালু রিটার্ন
এর আগের প্রোগ্রামে দেখেছি ফাংশন থেকে কিভাবে একটা ভ্যালু রিটার্ন করা যায়। পাইথনে ফাংশন থেকে একাধিক ভ্যালু রিটার্ন করা যায়। নিচের প্রোগ্রামটি দেখিঃ

def binary(a, b):
    return bin(a), bin(b)


print(binary(12, 14))

যা আউটপুট দিবেঃ
('0b1100', '0b1110')

এখানে একটি ফাংশন লিখেছি, যেখানে দুইটা সংখ্যা পাঠালে ঐ সংখ্যা দুইটির বাইনারি ভ্যালু রিটার্ন করবে। যদিও দুইটা একসাথে টাপল আকারে প্রিন্ট করেছে। আমরা চাইলে প্রতিটা রিটার্ন ভ্যালু আলাদা আলাদা এক্সেস করতে পারিঃ
[python]
def binary(a, b):
    return bin(a), bin(b)


x, y = (binary(12, 14))
print(x)
print(y)

যা আউটপুট দিবেঃ

0b1100
0b1110

এখানে রিটার্ণ ভ্যালু গুলো x এবং y তে আলাদা আলাদা ভাবে এসাইন হয়েছে। এরপর ভ্যালু ভ্যালু দুইতই আলাদা আলাদা প্রিন্ট করেছি।

ফাংশনে প্যারামিটার হিসেবে লিস্ট পাস করা
আমরা চাইলে একটা ফাংশনে প্যারামিটার হিসেবে একটা লিস্ট পাস করতে পারি। যেমনঃ

def print_square(numbers):
    for item in numbers:
        print(item * item)
number_list = [2, 4, 43, 67, 38]
print_square(number_list)

এখানে get_square নামে একটা ফাংশন লিখেছি। যাকে কল করার সময় একটা লিস্ট পাস করেছি। ফাংশনটি ঐ লিস্টের নাম্বার গুলোর বর্গ প্রিন্ট করে দিয়েছে।

ফাংশন থেকে লিস্ট রিটার্ন করা
আমরা যেমন ফাংশনে প্যারামিটার হিসেবে একটা লিস্ট পাস করতে পারি, ঠিক একই ভাবে ফাংশন থেকে একটা লিস্ট রিটার্ণও করতে পারি। নিচের প্রোগ্রামটি দেখিঃ

def get_square():
    square_list = []
    for item in range(100):
        square_list.append(item * item)
    return square_list
print(get_square())

এটি রান করলে ১-৯৯ পর্যন্ত সংখ্যা গুলোর বর্গ প্রিন্ট করে দিবে। ফাংশনটি কল করলে এই বর্গের লিস্টটা ফাংশনটি রিটার্ণ ভ্যালু হিসেবে পাঠিয়েছে।

Leave a Reply