Hot Post

6/recent/ticker-posts

Header Ads Widget

Python শেখার সিরিজ — পর্ব ৬ / ২০ (Functions)

🐍 Python শেখার সিরিজ — পর্ব ৬ / ২০
python learning

Functions
কোড পুনরায় ব্যবহারের সেরা উপায় — def, parameters, return, *args, **kwargs, scope এবং lambda সহ বাস্তব প্রজেক্ট
⏱ পড়তে সময় ~১৮ মিনিট 🎯 Beginner Friendly 🐍 Python 3.x

এতদিন আমরা কোড লিখেছি উপর থেকে নিচে — একের পর এক। কিন্তু বড় প্রোগ্রামে একই কাজ বারবার করতে হয়। সেই কাজটাকে একটি নামে সংরক্ষণ করে রাখলে যতবার দরকার ততবার ডাকা যায় — এই সুবিধার নামই Function

📦 Function কী এবং কেন দরকার?

Function হলো কিছু কোড-এর একটি নামযুক্ত Block যা একটি নির্দিষ্ট কাজ করে। একবার লিখলে যতবার দরকার ততবার ব্যবহার করা যায়।

Function ছাড়া একই কোড বারবার লিখতে হয়:

Python — 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 ব্যবহার করলে একবারই লিখতে হয়:

Python — 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 পরীক্ষা করা যায়
🔧 def দিয়ে Function তৈরি করা

Python-এ Function তৈরি করতে def কীওয়ার্ড ব্যবহার হয়।

def function_name(parameters):
    """Docstring — বর্ণনা (ঐচ্ছিক)"""
    কাজের কোড
    return ফলাফল   # ঐচ্ছিক
def greet(name, age): print(f"হ্যালো {name}, তোমার বয়স {age}!")
↑ def keyword ↑ Function নাম ↑ Parameters ↑ কোলন (অবশ্যই) ↑ Indented body
Python — প্রথম Function
# 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 আসবে।

📨 Parameters ও Arguments

Parameter হলো Function definition-এ ব্যবহৃত ভেরিয়েবল নাম। Argument হলো call করার সময় পাঠানো আসল মান।

Positional

ক্রম অনুযায়ী মান পাঠানো হয়।

Default

Argument না দিলে নির্ধারিত মান।

Keyword

নাম দিয়ে পাঠানো হয়।

*args

যেকোনো সংখ্যক Positional।

**kwargs

যেকোনো সংখ্যক Keyword।

Python — Positional Arguments
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 Statement — ফলাফল ফেরত দেওয়া

return দিয়ে Function-এর ভেতর থেকে বাইরে মান পাঠানো যায়। return ছাড়া Function শুধু কাজ করে, মান ফেরত দিতে পারে না।

Python — return Statement
# 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
একাধিক মান return করা
Python — Multiple Return Values
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
🎯 Default Arguments

Function call করার সময় কোনো Argument না দিলে কী মান ব্যবহার হবে তা আগে থেকে নির্ধারণ করে দেওয়া যায়।

Python — Default Arguments
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)

🔑 Keyword Arguments

Function call করার সময় Parameter-এর নাম উল্লেখ করে Argument পাঠানো যায়। এতে ক্রম যাই হোক সঠিক Parameter-এ মান যাবে।

Python — Keyword Arguments
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 | পেশা: শিক্ষক | শহর: সিলেট
✨ *args ও **kwargs

কতগুলো Argument আসবে আগে থেকে জানা না থাকলে *args এবং **kwargs ব্যবহার করা হয়।

*args — যেকোনো সংখ্যক Positional Argument
Python — *args
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. সালাদ
**kwargs — যেকোনো সংখ্যক Keyword Argument
Python — **kwargs
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: ডাক্তার
🔭 Variable Scope — Local vs Global

Scope মানে হলো কোন Variable কোথায় দেখা যাবে।

🌍 Global Scope — সব জায়গায় দেখা যায়
country = "বাংলাদেশ" PI = 3.14 MAX = 100
📦 Local Scope — শুধু Function-এর ভেতরে
naam = "রাহিম" result = 0 temp = None
Python — Scope উদাহরণ
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 — এক লাইনের Function

Lambda হলো নামহীন ছোট Function। সহজ কাজে পুরো def না লিখে Lambda ব্যবহার করা যায়।

lambda parameters : expression
Python — Lambda Function
# সাধারণ 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
📖 Docstring — Function-এর ডকুমেন্টেশন

Function-এর শুরুতে Triple Quote দিয়ে বর্ণনা লেখাকে Docstring বলে। এটি Function কী করে তা বলে।

Python — Docstring
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
🏦 প্র্যাকটিক্যাল প্রজেক্ট — Bank Account System

এই পর্বের সব Function ধারণা ব্যবহার করে একটি সম্পূর্ণ Bank Account System তৈরি করি। প্রতিটি কাজ আলাদা Function-এ ভাগ করা হয়েছে।

💻 প্রজেক্ট: Bank Account System

জমা, উত্তোলন, ব্যালেন্স দেখা এবং লেনদেনের ইতিহাস — প্রতিটি কাজ আলাদা Function-এ।

Python — bank_account.py
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 প্রজেক্ট
🏋️ নিজে চেষ্টা করো
  1. Calculator: add, subtract, multiply, divide — চারটি আলাদা Function বানাও, user choice অনুযায়ী call করো
  2. Temperature Converter: celsius_to_fahrenheit() ও fahrenheit_to_celsius() দুটি Function বানাও
  3. Student Report: *args দিয়ে যেকোনো সংখ্যক নম্বর নিয়ে মোট, গড় ও গ্রেড return করো
  4. Password Validator: পাসওয়ার্ড যাচাই Function — কমপক্ষে ৮ অক্ষর ও একটি সংখ্যা থাকতে হবে
  5. Shopping Cart: add_item(), remove_item(), show_total() Function বানাও
⏭️ পরের পর্বে কী থাকছে? — পর্ব ৭: Lists ও Tuples
  • List তৈরি, access, update ও delete
  • গুরুত্বপূর্ণ Methods: append, insert, remove, sort
  • List Slicing — অংশ নিয়ে কাজ
  • Tuple — অপরিবর্তনীয় List এবং কখন ব্যবহার করবে

Post a Comment

0 Comments