Lesson ৮ মিনিট পড়া

ফাংশন (Functions)

একবার লিখুন, সারাজীবন ব্যবহার করুন — কোড রিসাইকেল করার চাবিকাঠি

ফাংশন কী? (What Are Functions?)

একটি ফাংশন হলো একটি রেসিপি কার্ডের মতো। আপনি রেসিপির নির্দেশাবলী একবার লিখে রাখেন, এর একটি নাম দিন, এবং যখনই আপনার সেই খাবারটি বানানোর প্রয়োজন হয়, আপনি কেবল নাম ধরে সেই রেসিপিটিকে ডাকেন। আপনি চাইলে এতে নিজের মতো পরিবর্তনও আনতে পারেন — "এই রেসিপিটি বানাও তবে সাথে কিছু অতিরিক্ত চিজ দিও" (যেটা হলো একটি প্যারামিটার!)।

ফাংশন যা যা করতে সাহায্য করে:

  • পুনরাবৃত্তি (Repetition) এড়ানো — কোড একবার লিখুন, অসংখ্যবার কল করুন।
  • গুছিয়ে রাখা (Organize) — জটিল ও বড় প্রোগ্রামগুলোকে ছোট ছোট সামলানোর মতো অংশে ভাগ করুন।
  • টেস্ট করা (Test) — একটি বিশাল স্ক্রিপ্ট টেস্ট করার চেয়ে একটি ছোট ফাংশন টেস্ট করা অনেক সহজ।

ফাংশন সংজ্ঞায়িত এবং কল করা (Defining & Calling Functions)

# Define a function with 'def'
def greet(name):
"""Say hello to someone."""
print(f"Hello, {name}! Welcome aboard.")
# Call the function
greet("Anika")
greet("Rafi")
# Function with a return value
def calculate_tip(bill, tip_percent=18):
"""Calculate tip amount. Default is 18%."""
tip = bill * (tip_percent / 100)
return round(tip, 2)
result = calculate_tip(50) # Uses default 18%
print(f"Tip on $50: ${result}")
result = calculate_tip(50, 20) # Custom 20%
print(f"Generous tip: ${result}")
Output
Hello, Anika! Welcome aboard.
Hello, Rafi! Welcome aboard.
Tip on $50: $9.0
Generous tip: $10.0

প্যারামিটারের গভীরতা (Parameters Deep Dive)

পাইথনে ফাংশনের ভেতরে ডেটা পাস করার জন্য অনেক নমনীয় উপায় রয়েছে:

  • পজিশনাল আর্গুমেন্টস (Positional args) — অবস্থান দিয়ে মেলানো হয়: greet("Anika", 25)
  • কীওয়ার্ড আর্গুমেন্টস (Keyword args) — নাম দিয়ে মেলানো হয়: greet(name="Anika", age=25)
  • ডিফল্ট ভ্যালু (Default values) — ফলব্যাক-সহ ঐচ্ছিক প্যারামিটার: def greet(name, greeting="Hello")
  • *args — অতিরিক্ত পজিশনাল আর্গুমেন্টগুলোকে একটি ট্যুপলে (tuple) সংগ্রহ করে
  • **kwargs — অতিরিক্ত কীওয়ার্ড আর্গুমেন্টগুলোকে একটি ডিকশনারিতে (dictionary) সংগ্রহ করে

*args এবং **kwargs (*args and **kwargs)

# *args — accept any number of positional arguments
def total(*prices):
"""Sum up any number of prices."""
print(f"Items: {prices}") # It's a tuple!
return sum(prices)
print(f"Total: ${total(5.99, 3.49, 12.00)}")
print()
# **kwargs — accept any number of keyword arguments
def build_profile(**info):
"""Build a user profile from keyword arguments."""
print(f"Profile: {info}") # It's a dict!
for key, value in info.items():
print(f" {key}: {value}")
build_profile(name="Laboni", age=12, hobby="coding")
print()
# Combining all parameter types
def order(main, *sides, drink="water", **extras):
print(f"Main: {main}")
print(f"Sides: {sides}")
print(f"Drink: {drink}")
print(f"Extras: {extras}")
order("burger", "fries", "salad", drink="soda", ketchup=True)
Output
Items: (5.99, 3.49, 12.0)
Total: $21.48

Profile: {'name': 'Laboni', 'age': 12, 'hobby': 'coding'}
  name: Laboni
  age: 12
  hobby: coding

Main: burger
Sides: ('fries', 'salad')
Drink: soda
Extras: {'ketchup': True}

স্কোপ বা পরিধি — ভ্যারিয়েবলগুলো যেখানে থাকে (Scope — Where Variables Live)

ফাংশনের ভেতরে তৈরি করা ভ্যারিয়েবলগুলো হলো লোকাল (local) — এগুলো কেবল ফাংশনটি চলাকালীন সময় থাকে, এরপর হারিয়ে যায়। ফাংশনের বাইরে তৈরি করা ভ্যারিয়েবলগুলো হলো গ্লোবাল (global) — এগুলো পুরো প্রোগ্রামের সময়কালের জন্যই থাকে।

এভাবে চিন্তা করুন: লোকাল ভ্যারিয়েবলগুলো কোনো মিটিং রুমের হোয়াইটবোর্ডে লেখা হয়। মিটিং শেষ হলে হোয়াইটবোর্ড মুছে ফেলা হয়। আর গ্লোবাল ভ্যারিয়েবলগুলো অফিসের দেয়ালে লেখা থাকে — সবাই এটি দেখতে পায়, তবে মিটিং রুমের ভেতর থেকে এটি পরিবর্তন করতে বিশেষ অনুমতির (global কীওয়ার্ডের) প্রয়োজন হয়।

স্কোপ এবং একাধিক ভ্যালু রিটার্ন করা (Scope & Returning Multiple Values)

# Scope demo
name = "Global Anika" # global variable
def change_name():
name = "Local Rafi" # this is a DIFFERENT variable!
print(f"Inside function: {name}")
change_name()
print(f"Outside function: {name}") # unchanged!
print()
# Returning multiple values (actually a tuple)
def min_max(numbers):
"""Return both the minimum and maximum."""
return min(numbers), max(numbers)
lowest, highest = min_max([42, 17, 93, 5, 68])
print(f"Min: {lowest}, Max: {highest}")
# Returning a dictionary for named results
def analyze_text(text):
words = text.split()
return {
"word_count": len(words),
"char_count": len(text),
"avg_word_length": round(sum(len(w) for w in words) / len(words), 1)
}
stats = analyze_text("The quick brown fox jumps")
print(stats)
Output
Inside function: Local Rafi
Outside function: Global Anika

Min: 5, Max: 93
{'word_count': 5, 'char_count': 25, 'avg_word_length': 4.2}

ডকস্ট্রিং — আপনার ফাংশনগুলোকে ডকুমেন্ট করুন (Docstrings — Document Your Functions)

একটি ডকস্ট্রিং (docstring) হলো def লাইনের ঠিক নিচেই তিনটি কোটেশন বা ট্রিপল কোট দিয়ে ঘেরা একটি স্ট্রিং। এটি বর্ণনা করে যে ফাংশনটি কী কাজ করে, এটি কী আর্গুমেন্ট গ্রহণ করে এবং কী ভ্যালু রিটার্ন করে। এটি নেহাতই একটি কমেন্ট বা মন্তব্য নয় — পাইথন আসলেই এটিকে সংরক্ষণ করে রাখে এবং আপনি help() ব্যবহার করে এটি পড়তে পারেন!

ডকস্ট্রিং এবং বেস্ট প্র্যাক্টিসেস (Docstrings & Best Practices)

def bmi(weight_kg, height_m):
"""
Calculate Body Mass Index.
Args:
weight_kg: Weight in kilograms
height_m: Height in meters
Returns:
BMI as a float, rounded to 1 decimal place
"""
return round(weight_kg / (height_m ** 2), 1)
# Access the docstring
print(bmi.__doc__)
# Use the function
print(f"BMI: {bmi(70, 1.75)}")
Output

    Calculate Body Mass Index.

    Args:
        weight_kg: Weight in kilograms
        height_m: Height in meters

    Returns:
        BMI as a float, rounded to 1 decimal place
    
BMI: 22.9
Note: একটি ভালো ফাংশন খুব ভালোভাবে যেকোনো একটা কাজই করে। ফাংশনের নাম দিতে গিয়ে যদি আপনাকে ঝামেলায় পড়তে হয়, তবে সম্ভবত সেটি অনেক বেশি ধরনের কাজ করছে। "calculate_and_print_and_save_results" নাম না দিয়ে এটিকে সম্ভবত তিনটি আলাদা ফাংশনে ভাগ করা উচিত!
চ্যালেঞ্জ

ছোট কুইজ

যদি কোনো ফাংশনে return স্টেটমেন্ট না থাকে, তবে সেটি কী রিটার্ন করে?
Dictionaries & SetsComprehensions