- Function কী এবং কেন দরকার?
- def দিয়ে Function তৈরি করা
- Parameters ও Arguments
- return Statement — ফলাফল ফেরত দেওয়া
- Default Arguments
- Keyword Arguments
- *args ও **kwargs
- Variable Scope — Local vs Global
- Lambda Function — এক লাইনের Function
- Docstring — Function-এর ডকুমেন্টেশন
- প্র্যাকটিক্যাল প্রজেক্ট — Bank Account System
- সারাংশ ও অনুশীলন
এতদিন আমরা কোড লিখেছি উপর থেকে নিচে — একের পর এক। কিন্তু বড় প্রোগ্রামে একই কাজ বারবার করতে হয়। সেই কাজটাকে একটি নামে সংরক্ষণ করে রাখলে যতবার দরকার ততবার ডাকা যায় — এই সুবিধার নামই Function।
Function হলো কিছু কোড-এর একটি নামযুক্ত Block যা একটি নির্দিষ্ট কাজ করে। একবার লিখলে যতবার দরকার ততবার ব্যবহার করা যায়।
Function ছাড়া একই কোড বারবার লিখতে হয়:
# ❌ একই কোড তিনবার লিখতে হচ্ছে — DRY নীতি লঙ্ঘন marks1 = 85 if marks1 >= 80: print("A+") elif marks1 >= 70: print("A") else: print("B") marks2 = 72 if marks2 >= 80: print("A+") elif marks2 >= 70: print("A") else: print("B") # ১০০ জনের জন্য করতে হলে? 😱
Function ব্যবহার করলে একবারই লিখতে হয়:
# ✅ একবার লিখে যতবার খুশি ব্যবহার করো def get_grade(marks): if marks >= 80: return "A+" elif marks >= 70: return "A" else: return "B" print(get_grade(85)) # A+ print(get_grade(72)) # A print(get_grade(55)) # B
A+ A B
DRY নীতি: Don't Repeat Yourself। একই কোড বারবার না লিখে Function ব্যবহার করো — এটি প্রোগ্রামিং-এর সবচেয়ে গুরুত্বপূর্ণ নীতিগুলোর একটি।
| সুবিধা | বিবরণ |
|---|---|
| Reusability | একবার লিখে অনেকবার ব্যবহার করা যায় |
| Readability | কোড পড়তে সহজ ও সুসংগঠিত হয় |
| Maintainability | এক জায়গায় পরিবর্তন করলে সব জায়গায় আপডেট হয় |
| Testing | আলাদাভাবে প্রতিটি Function পরীক্ষা করা যায় |
Python-এ Function তৈরি করতে def কীওয়ার্ড ব্যবহার হয়।
"""Docstring — বর্ণনা (ঐচ্ছিক)"""
কাজের কোড
return ফলাফল # ঐচ্ছিক
# Function define করা def show_welcome(): print("╔══════════════════════╗") print("║ esbangla.com-তে স্বাগতম ║") print("╚══════════════════════╝") # Function call করা — যতবার খুশি show_welcome() show_welcome()
╔══════════════════════╗ ║ esbangla.com-তে স্বাগতম ║ ╚══════════════════════╝ ╔══════════════════════╗ ║ esbangla.com-তে স্বাগতম ║ ╚══════════════════════╝
Function-কে ব্যবহার করার আগে অবশ্যই define করতে হবে। def লেখার আগে Function call করলে NameError আসবে।
Parameter হলো Function definition-এ ব্যবহৃত ভেরিয়েবল নাম। Argument হলো call করার সময় পাঠানো আসল মান।
ক্রম অনুযায়ী মান পাঠানো হয়।
Argument না দিলে নির্ধারিত মান।
নাম দিয়ে পাঠানো হয়।
যেকোনো সংখ্যক Positional।
যেকোনো সংখ্যক Keyword।
def introduce(naam, boyos, shahor): print(f"নাম: {naam}, বয়স: {boyos}, শহর: {shahor}") introduce("রাহিম", 25, "ঢাকা") introduce("সালমা", 22, "চট্টগ্রাম") def add(a, b): return a + b print(add(10, 20)) # 30 print(add(100, 200)) # 300
নাম: রাহিম, বয়স: 25, শহর: ঢাকা নাম: সালমা, বয়স: 22, শহর: চট্টগ্রাম 30 300
return দিয়ে Function-এর ভেতর থেকে বাইরে মান পাঠানো যায়। return ছাড়া Function শুধু কাজ করে, মান ফেরত দিতে পারে না।
# print করে — মান ফেরত দেয় না def add_print(a, b): print(a + b) # return করে — মান ফেরত দেয় def add_return(a, b): return a + b r1 = add_print(5, 3) # প্রিন্ট করে কিন্তু r1 = None r2 = add_return(5, 3) # r2 = 8, পরে ব্যবহার করা যাবে print(f"r1 = {r1}") # None print(f"r2 = {r2}") # 8 print(f"দ্বিগুণ: {r2 * 2}") # 16
8 r1 = None r2 = 8 দ্বিগুণ: 16
def calculate_stats(numbers): total = sum(numbers) average = total / len(numbers) minimum = min(numbers) maximum = max(numbers) return total, average, minimum, maximum # ৪টি মান data = [45, 78, 92, 33, 67, 88] t, avg, mn, mx = calculate_stats(data) print(f"মোট: {t}, গড়: {avg:.2f}, কম: {mn}, বেশি: {mx}")
মোট: 403, গড়: 67.17, কম: 33, বেশি: 92
Function call করার সময় কোনো Argument না দিলে কী মান ব্যবহার হবে তা আগে থেকে নির্ধারণ করে দেওয়া যায়।
def greet(naam, language="বাংলা"): if language == "বাংলা": print(f"হ্যালো, {naam}!") else: print(f"Hello, {naam}!") greet("রাহিম") # default: বাংলা greet("Rahim", "English") # override # সুদ হিসাব — default rate=10%, time=1 def interest(principal, rate=10, time=1): return (principal * rate * time) / 100 print(interest(50000)) # 5000.0 print(interest(50000, 8)) # 4000.0 print(interest(50000, 8, 3)) # 12000.0
হ্যালো, রাহিম! Hello, Rahim! 5000.0 4000.0 12000.0
নিয়ম: Default Argument সবসময় Non-default Argument-এর পরে রাখতে হবে। def f(a=1, b) Error দেবে। সঠিক: def f(b, a=1)।
Function call করার সময় Parameter-এর নাম উল্লেখ করে Argument পাঠানো যায়। এতে ক্রম যাই হোক সঠিক Parameter-এ মান যাবে।
def create_profile(naam, boyos, pesa, shahor): print(f"নাম: {naam} | বয়স: {boyos} | পেশা: {pesa} | শহর: {shahor}") # নাম দিয়ে পাঠাও — ক্রম গুরুত্বপূর্ণ নয় create_profile(naam="রাহিম", boyos=28, pesa="ডেভেলপার", shahor="ঢাকা") # ক্রম উল্টো দিলেও ঠিকঠাক কাজ করবে create_profile(shahor="সিলেট", naam="করিম", pesa="শিক্ষক", boyos=35)
নাম: রাহিম | বয়স: 28 | পেশা: ডেভেলপার | শহর: ঢাকা নাম: করিম | বয়স: 35 | পেশা: শিক্ষক | শহর: সিলেট
কতগুলো Argument আসবে আগে থেকে জানা না থাকলে *args এবং **kwargs ব্যবহার করা হয়।
def total(*numbers): print(f"সংখ্যাগুলো: {numbers}") return sum(numbers) print(total(10, 20)) # 30 print(total(5, 10, 15, 20)) # 50 # রেস্টুরেন্টের অর্ডার def order(table_no, *items): print(f"টেবিল {table_no}:") for i, item in enumerate(items, 1): print(f" {i}. {item}") order(5, "বিরিয়ানি", "কোক") order(3, "ভাত", "মাছ", "ডাল", "সালাদ")
সংখ্যাগুলো: (10, 20) 30 সংখ্যাগুলো: (5, 10, 15, 20) 50 টেবিল 5: 1. বিরিয়ানি 2. কোক টেবিল 3: 1. ভাত 2. মাছ 3. ডাল 4. সালাদ
def show_info(**details): print("তথ্য:") for key, value in details.items(): print(f" {key}: {value}") show_info(naam="রাহিম", boyos=25) print() show_info(naam="সালমা", boyos=22, shahor="ঢাকা", pesa="ডাক্তার")
তথ্য: naam: রাহিম boyos: 25 তথ্য: naam: সালমা boyos: 22 shahor: ঢাকা pesa: ডাক্তার
Scope মানে হলো কোন Variable কোথায় দেখা যাবে।
x = 100 # Global variable def my_func(): x = 50 # Local variable (আলাদা) print(f"ভেতরে x = {x}") my_func() print(f"বাইরে x = {x}") # 100 (অপরিবর্তিত) # global keyword দিয়ে Global পরিবর্তন score = 0 def add_score(points): global score score += points add_score(10) add_score(25) print(f"চূড়ান্ত স্কোর: {score}") # 35
ভেতরে x = 50 বাইরে x = 100 চূড়ান্ত স্কোর: 35
Lambda হলো নামহীন ছোট Function। সহজ কাজে পুরো def না লিখে Lambda ব্যবহার করা যায়।
# সাধারণ Function vs Lambda def square(x): return x ** 2 sq = lambda x: x ** 2 print(square(5)) # 25 print(sq(5)) # 25 multiply = lambda a, b: a * b print(multiply(4, 5)) # 20 # sorted()-এ Lambda — নম্বর অনুযায়ী সাজানো students = [ {"naam": "করিম", "marks": 85}, {"naam": "রাহিম", "marks": 72}, {"naam": "সালমা", "marks": 91}, ] ranked = sorted(students, key=lambda s: s["marks"], reverse=True) for s in ranked: print(f"{s['naam']}: {s['marks']}")
25 25 20 সালমা: 91 করিম: 85 রাহিম: 72
Function-এর শুরুতে Triple Quote দিয়ে বর্ণনা লেখাকে Docstring বলে। এটি Function কী করে তা বলে।
def calculate_bmi(weight, height): """ BMI হিসাব করে। Parameters: weight: ওজন কেজিতে height: উচ্চতা মিটারে Returns: float: BMI-এর মান """ return round(weight / height ** 2, 2) print(calculate_bmi.__doc__) print(calculate_bmi(70, 1.75))
BMI হিসাব করে।
Parameters:
weight: ওজন কেজিতে
height: উচ্চতা মিটারে
Returns:
float: BMI-এর মান
22.86
এই পর্বের সব Function ধারণা ব্যবহার করে একটি সম্পূর্ণ Bank Account System তৈরি করি। প্রতিটি কাজ আলাদা Function-এ ভাগ করা হয়েছে।
জমা, উত্তোলন, ব্যালেন্স দেখা এবং লেনদেনের ইতিহাস — প্রতিটি কাজ আলাদা Function-এ।
balance = 0 history = [] def deposit(amount): """টাকা জমা করে।""" global balance if amount <= 0: return "❌ পরিমাণ শূন্যের বেশি হতে হবে।" balance += amount history.append(f"জমা: +{amount:,} টাকা → ব্যালেন্স: {balance:,}") return f"✅ {amount:,} টাকা জমা হয়েছে।" def withdraw(amount): """টাকা উত্তোলন করে।""" global balance if amount <= 0: return "❌ পরিমাণ শূন্যের বেশি হতে হবে।" if amount > balance: return f"❌ ব্যালেন্স কম! বর্তমান: {balance:,} টাকা।" balance -= amount history.append(f"উত্তোলন: -{amount:,} টাকা → ব্যালেন্স: {balance:,}") return f"✅ {amount:,} টাকা উত্তোলন হয়েছে।" def check_balance(): """বর্তমান ব্যালেন্স দেখায়।""" return f"💰 বর্তমান ব্যালেন্স: {balance:,} টাকা" def show_history(last_n=None): """লেনদেনের ইতিহাস দেখায়।""" if not history: print("কোনো লেনদেন নেই।") return records = history[-last_n:] if last_n else history print("📋 লেনদেনের ইতিহাস:") for i, rec in enumerate(records, 1): print(f" {i}. {rec}") # ── ব্যবহার ── print(deposit(10000)) print(deposit(5000)) print(withdraw(3000)) print(withdraw(20000)) # ব্যর্থ হবে print(check_balance()) show_history()
✅ 10,000 টাকা জমা হয়েছে। ✅ 5,000 টাকা জমা হয়েছে। ✅ 3,000 টাকা উত্তোলন হয়েছে। ❌ ব্যালেন্স কম! বর্তমান: 12,000 টাকা। 💰 বর্তমান ব্যালেন্স: 12,000 টাকা 📋 লেনদেনের ইতিহাস: 1. জমা: +10,000 টাকা → ব্যালেন্স: 10,000 2. জমা: +5,000 টাকা → ব্যালেন্স: 15,000 3. উত্তোলন: -3,000 টাকা → ব্যালেন্স: 12,000
- Function কী এবং DRY নীতি
- def দিয়ে Function তৈরি ও call করা
- Positional Arguments — ক্রম অনুযায়ী
- return — মান ও একাধিক মান ফেরত দেওয়া
- Default Arguments — Argument না দিলে default মান
- Keyword Arguments — নাম দিয়ে Argument পাঠানো
- *args — যেকোনো সংখ্যক Positional Argument
- **kwargs — যেকোনো সংখ্যক Keyword Argument
- Local vs Global Scope ও global keyword
- Lambda Function — এক লাইনের Function
- Docstring — Function-এর ডকুমেন্টেশন
- Bank Account System প্রজেক্ট
- Calculator: add, subtract, multiply, divide — চারটি আলাদা Function বানাও, user choice অনুযায়ী call করো
- Temperature Converter: celsius_to_fahrenheit() ও fahrenheit_to_celsius() দুটি Function বানাও
- Student Report: *args দিয়ে যেকোনো সংখ্যক নম্বর নিয়ে মোট, গড় ও গ্রেড return করো
- Password Validator: পাসওয়ার্ড যাচাই Function — কমপক্ষে ৮ অক্ষর ও একটি সংখ্যা থাকতে হবে
- Shopping Cart: add_item(), remove_item(), show_total() Function বানাও
- List তৈরি, access, update ও delete
- গুরুত্বপূর্ণ Methods: append, insert, remove, sort
- List Slicing — অংশ নিয়ে কাজ
- Tuple — অপরিবর্তনীয় List এবং কখন ব্যবহার করবে

0 Comments