আসসালামু আলাইকুম ওয়া রাহমাতুল্লাহি ওয়া বারাকাতুহু 🙌

প্রিয় শিক্ষার্থী, আপনার শিক্ষার যাত্রা যেন আল্লাহ তা'আলার রহমতে উপকৃত হয় — এই দোয়া করছি।

📖 জ্ঞান অর্জনের উৎসাহ — কুরআন থেকে:

يُؤۡتِيۡ الۡحِكۡمَةَ مَنۡ يَّشَآءُۚ وَمَنۡ يُؤۡتَ الۡحِكۡمَةَ فَقَدۡ أُوتِيَ خَيۡرً۬ا كَثِيرً۬اۖ

বাংলা: "তিনি যাকে চান হিকমত (প্রজ্ঞা) দান করেন। এবং যাকে হিকমত দান করা হয়, তাকে অনেক ভালো জিনিস দেওয়া হয়।" — সূরা আল-বাকারাহ (২:২৬৯)

English: "He grants wisdom to whom He wills, and whoever is granted wisdom has been given abundant good." — Surah Al-Baqarah (2:269)

وَمَنۡ يَّتَّقِ يُۡجۡعَلۡ لَّهُۥ مَخۡرَجً۬ا

বাংলা: "এবং যে আল্লাহকে ভয় করে, আল্লাহ তার জন্য উপায় বের করে দেন।" — সূরা আত-তালাক (৬৫:২)

English: "And whoever fears Allah - He will make for him a way out." — Surah At-Talaq (65:2)

🔗 প্র্যাকটিসের জন্য রেফারেন্স রিপোজিটরি:

এই বইয়ের কোডগুলো প্র্যাকটিস করার জন্য আপনি এই GitHub রিপোজিটরি ব্যবহার করতে পারেন:

https://github.com/PavelGoblin/Monster-Python

📝 সৌজন্য নোট: এই বইটি মূলত বিভিন্ন উৎস থেকে সংকলিত ও অনুপ্রাণিত। কোড ও কনটেন্ট অন্যের হতে পারে। এই বই থেকে শিখতে পারেন, কিন্তু সরাসরি কপি-পেস্ট করে প্রকাশ করা থেকে বিরত থাকুন। জ্ঞান অর্জন করুন, নিজের মেধা তৈরি করুন। 📚

অধ্যায় ১ Python পরিচিতি

🐍 Python কী?

পাইথন একটি উচ্চ-স্তরের, ইন্টারপ্রেটেড, অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং ভাষা। এটি ১৯৯১ সালে গুইডো ভ্যান রসাম তৈরি করেন। পাইথনের সবচেয়ে বড় বৈশিষ্ট্য হলো এর সরল ও পড়তে সহজ সিনট্যাক্স।

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

🎯 কেন পাইথন শিখবেন?

  • সহজ ও পড়তে সুবিধাজনক — ইংরেজির মতো পড়া যায়
  • মুক্ত ও ওপেন সোর্স — বিনামূল্যে ব্যবহার করা যায়
  • ক্রস-প্ল্যাটফর্ম — Windows, Mac, Linux সব জায়গায় চলে
  • বিশাল কমিউনিটি — প্রচুর লাইব্রেরি ও রিসোর্স আছে
  • ক্যারিয়ারের ভালো সুযোগ — চাকরির বাজার দারুণ

⚙️ Python ইনস্টলেশন (বাংলায় ধাপে ধাপে)

Windows-এ Python সেটআপ:

  1. python.org ওয়েবসাইটে যান
  2. "Downloads" এ ক্লিক করে সর্বশেষ Python ডাউনলোড করুন
  3. ইনস্টলার রান করুন এবং নিচের "Add Python to PATH" অপশনটি টিক দিন
  4. "Install Now" এ ক্লিক করুন
  5. cmd বা PowerShell খুলে python --version লিখে চেক করুন

VS Code সেটআপ:

  1. code.visualstudio.com থেকে VS Code ডাউনলোড ও ইনস্টল করুন
  2. Python এক্সটেনশন (Microsoft) ইনস্টল করুন
  3. একটি .py ফাইল তৈরি করে কোড লেখা শুরু করুন

প্রথম প্রোগ্রাম: Hello World

📝 ১.১ — Hello World
print("Hello, World!")
print("স্বাগতম পাইথন জগতে!")
আউটপুট:
Hello, World!
স্বাগতম পাইথন জগতে!

Comment (মন্তব্য)

Comment কোডের এমন অংশ যা Python interpreter উপেক্ষা করে। এটি কোড বোঝার জন্য নোট হিসেবে ব্যবহৃত হয়।

📝 ১.২ — Comments
# এইটা single-line comment
print("Hello")  # লাইনের শেষেও comment দেওয়া যায়

"""
এইটা multi-line comment
একাধিক লাইন লেখা যায়
"""
print("Multi-line comment কাজ করে")
আউটপুট:
Hello
Multi-line comment কাজ করে

Indentation (ইন্ডেন্টেশন)

পাইথনে indentation খুবই গুরুত্বপূর্ণ। এটি কোড ব্লক নির্ধারণ করে। সাধারণত ৪টি স্পেস বা ১টি ট্যাব ব্যবহার করা হয়।

📝 ১.৩ — Indentation
x = 10
if x > 5:
    print("x 5 এর বড়")  # ৪ স্পেস ইন্ডেন্ট
    print("এইটাও if ব্লকের ভিতর")
print("এইটা if ব্লকের বাইরে")
আউটপুট:
x 5 এর বড়
এইটাও if ব্লকের ভিতর
এইটা if ব্লকের বাইরে
📝 ১.৪ — Print() ফাংশনের ব্যবহার
print("বাংলায় পাইথন শিখছি!")
print(42)
print(3.1416)
print(True)
print([1, 2, 3])
আউটপুট:
বাংলায় পাইথন শিখছি!
42
3.1416
True
[1, 2, 3]
📝 ১.৫ — একাধিক আর্গুমেন্ট
name = "রহিম"
age = 25
print("আমার নাম", name, "এবং বয়স", age)
আউটপুট:
আমার নাম রহিম এবং বয়স 25
📝 ১.৬ — Python কী-ওয়ার্ড
import keyword
print("Python কী-ওয়ার্ড সমূহ:")
print(keyword.kwlist)
print("মোট কী-ওয়ার্ড:", len(keyword.kwlist))
আউটপুট:
Python কী-ওয়ার্ড সমূহ:
['False', 'None', 'True', ...]
মোট কী-ওয়ার্ড: 35
📝 ১.৭ — Escape Sequence
print("Hello\nWorld")      # newline
print("Hello\tWorld")      # tab
print("She\'s nice")       # single quote
print('He said "Hi"')      # double quote
print("Backslash: \\")     # backslash
আউটপুট:
Hello
World
Hello    World
She's nice
He said "Hi"
Backslash: \
📝 ১.৮ — sep এবং end প্যারামিটার
print("Python", "বাংলা", "শিখি", sep=" - ")
print("Hello", end=" ")
print("World")
আউটপুট:
Python - বাংলা - শিখি
Hello World
📝 ১.৯ — type() ফাংশন
print(type(10))
print(type(3.14))
print(type("Hello"))
print(type(True))
print(type([1,2,3]))
আউটপুট:
<class 'int'>
<class 'float'>
<class 'str'>
<class 'bool'>
<class 'list'>
📝 ১.১০ — Multi-line String
print("""
এটা একটা
multi-line
string
""")
আউটপুট:

এটা একটা
multi-line
string

📌 মূল কথা

পাইথন একটি সহজ, শক্তিশালী এবং বহুল ব্যবহৃত প্রোগ্রামিং ভাষা। ইন্ডেন্টেশন এবং কমেন্ট ব্যবহার করে আমরা কোড আরও পড়তে সুবিধাজনক করতে পারি। print() ফাংশন দিয়ে আমরা বিভিন্ন ধরনের ডেটা আউটপুট করতে পারি।

অধ্যায় ২ Variables ও Data Types

📦 Variable (পরিবর্তনশীল)

Variable হলো একটি নাম যা আমরা ডেটা সংরক্ষণের জন্য ব্যবহার করি। পাইথনে variable ঘোষণার সময় টাইপ উল্লেখ করতে হয় না — এটি ডায়নামিক টাইপিং ভাষা।

📝 ২.১ — Variable তৈরি
name = "আলিফ"
age = 20
height = 5.8
is_student = True
print(name)
print(age)
print(height)
print(is_student)
আউটপুট:
আলিফ
20
5.8
True
📝 ২.২ — type() এবং id()
x = 10
print("Value:", x)
print("Type:", type(x))
print("ID:", id(x))
y = 10
print("y-এর ID:", id(y))
print("Same?", id(x) == id(y))
আউটপুট:
Value: 10
Type: <class 'int'>
ID: 14073...
y-এর ID: 14073...
Same? True
📝 ২.৩ — Dynamic Typing
x = 10
print(x, type(x))
x = "হ্যালো"
print(x, type(x))
x = 3.14
print(x, type(x))
x = True
print(x, type(x))
আউটপুট:
10 <class 'int'>
হ্যালো <class 'str'>
3.14 <class 'float'>
True <class 'bool'>
📝 ২.৪ — Type Conversion
x = "123"
print(int(x) + 10)
y = 456
print(str(y) + " ABC")
z = "3.14"
print(float(z) * 2)
print(bool(0), bool(1))
আউটপুট:
133
456 ABC
6.28
False True
📝 ২.৫ — None Type
x = None
print(x)
print(type(x))
if x is None:
    print("x-এর কোনো মান নেই")
আউটপুট:
None
<class 'NoneType'>
x-এর কোনো মান নেই
📝 ২.৬ — Multiple Assignment
a, b, c = 1, 2, 3
print(a, b, c)

x = y = z = 0
print(x, y, z)
আউটপুট:
1 2 3
0 0 0
📝 ২.৭ — Swap Variables
a, b = 5, 10
print("আগে: a =", a, "b =", b)
a, b = b, a
print("পরে: a =", a, "b =", b)
আউটপুট:
আগে: a = 5 b = 10
পরে: a = 10 b = 5
📝 ২.৮ — Variable Naming
my_name = "Rahim"
myName = "Karim"
_name = "Secret"
name2 = "Sadia"
MY_CONST = 100
print(my_name, myName, _name, name2, MY_CONST)
আউটপুট:
Rahim Karim Secret Sadia 100
📝 ২.৯ — Data Types Overview
a = 10; b = 3.14; c = 2+3j
d = "Hello"; e = [1,2,3]; f = (1,2,3); g = range(5)
h = {"name":"Rahim"}; i = {1,2,3}; j = True
print(type(a), type(b), type(c))
print(type(d), type(e), type(f), type(g))
print(type(h), type(i), type(j))
আউটপুট:
<class 'int'> <class 'float'> <class 'complex'>
<class 'str'> <class 'list'> <class 'tuple'> <class 'range'>
<class 'dict'> <class 'set'> <class 'bool'>
📝 ২.১০ — Type Error
x = "10"
y = 5
print(int(x) + y)
আউটপুট:
15

📌 মূল কথা

পাইথনে variable ডায়নামিক টাইপিং সাপোর্ট করে। type(), id() দিয়ে ডেটা সম্পর্কে জানা যায়। টাইপ কনভার্সন ফাংশন (int(), str(), float(), bool()) ব্যবহার করে এক টাইপ থেকে অন্য টাইপে রূপান্তর করা যায়।

অধ্যায় ৩ Operators

🔧 Operator (অপারেটর)

Operator হলো প্রতীক যা নির্দিষ্ট গাণিতিক বা লজিক্যাল কাজ সম্পাদন করে। পাইথনে বিভিন্ন ধরনের operator আছে — arithmetic, comparison, logical, bitwise, assignment, identity, membership.

Arithmetic Operators

📝 ৩.১ — Arithmetic Operators
a, b = 15, 4
print(f"যোগ: {a+b}")
print(f"বিয়োগ: {a-b}")
print(f"গুণ: {a*b}")
print(f"ভাগ: {a/b}")
print(f"পূর্ণ ভাগ: {a//b}")
print(f"ভাগশেষ: {a%b}")
print(f"ঘাত: {a**b}")
আউটপুট:
যোগ: 19
বিয়োগ: 11
গুণ: 60
ভাগ: 3.75
পূর্ণ ভাগ: 3
ভাগশেষ: 3
ঘাত: 50625

Comparison Operators

📝 ৩.২ — Comparison
a, b = 10, 20
print(f"{a} == {b}: {a==b}")
print(f"{a} != {b}: {a!=b}")
print(f"{a} > {b}: {a>b}")
print(f"{a} < {b}: {a= {b}: {a>=b}")
print(f"{a} <= {b}: {a<=b}")
আউটপুট:
10 == 20: False
10 != 20: True
10 > 20: False
10 < 20: True
10 >= 20: False
10 <= 20: True

Logical Operators

📝 ৩.৩ — Logical Operators
x, y = True, False
print(f"{x} and {y}: {x and y}")
print(f"{x} or {y}: {x or y}")
print(f"not {x}: {not x}")
age, has_id = 22, True
if age >= 18 and has_id:
    print("ভোট দিতে পারবেন")
আউটপুট:
True and False: False
True or False: True
not True: False
ভোট দিতে পারবেন

Assignment Operators

📝 ৩.৪ — Assignment
x = 10
print(f"x = {x}")
x += 5; print(f"x += 5: {x}")
x -= 3; print(f"x -= 3: {x}")
x *= 2; print(f"x *= 2: {x}")
x /= 4; print(f"x /= 4: {x}")
x //= 2; print(f"x //= 2: {x}")
x %= 3; print(f"x %= 3: {x}")
x **= 2; print(f"x **= 2: {x}")
আউটপুট:
x = 10
x += 5: 15
x -= 3: 12
x *= 2: 24
x /= 4: 6.0
x //= 2: 3.0
x %= 3: 0.0
x **= 2: 0.0

Bitwise Operators

📝 ৩.৫ — Bitwise Operators
a, b = 12, 10
print(f"a & b: {a & b}")
print(f"a | b: {a | b}")
print(f"a ^ b: {a ^ b}")
print(f"~a: {~a}")
print(f"a << 2: {a << 2}")
print(f"a >> 2: {a >> 2}")
আউটপুট:
a & b: 8
a | b: 14
a ^ b: 6
~a: -13
a << 2: 48
a >> 2: 3

Identity & Membership

📝 ৩.৬ — Identity (is)
a = [1,2,3]
b = [1,2,3]
c = a
print(f"a is c: {a is c}")
print(f"a is b: {a is b}")
print(f"a == b: {a == b}")
আউটপুট:
a is c: True
a is b: False
a == b: True
📝 ৩.৭ — Membership
fruits = ["আপেল", "কলা", "কমলা"]
print("আপেল in fruits:", "আপেল" in fruits)
print("আঙুর not in fruits:", "আঙুর" not in fruits)
print("Python in name:", "Python" in "Python Programming")
আউটপুট:
True
True
True

Operator Precedence

📝 ৩.৮ — Precedence
r1 = 10 + 5 * 2
print(f"10 + 5 * 2 = {r1}")
r2 = (10 + 5) * 2
print(f"(10+5) * 2 = {r2}")
r3 = 2**3 + 4
print(f"2**3 + 4 = {r3}")
r4 = 10 > 5 and 3 < 8 or not False
print(f"10>5 and 3<8 or not False = {r4}")
আউটপুট:
10 + 5 * 2 = 20
(10+5) * 2 = 30
2**3 + 4 = 12
True

📌 মূল কথা

পাইথনে সব ধরনের operator আছে — গাণিতিক, তুলনামূলক, লজিক্যাল, বিটওয়াইজ, অ্যাসাইনমেন্ট, আইডেন্টিটি ও মেম্বারশিপ। অপারেটর প্রিসিডেন্স বুঝে সঠিক এক্সপ্রেশন লিখতে হবে।

অধ্যায় ৪ String (স্ট্রিং)

📝 String কী?

String এক বা একাধিক ক্যারেক্টারের সমষ্টি। পাইথনে string ' ', " ", বা """ """ দিয়ে তৈরি করা যায়। String immutable — অর্থাৎ তৈরি করার পর পরিবর্তন করা যায় না।

📝 ৪.১ — String তৈরি
s1 = 'Hello'
s2 = "World"
s3 = '''Multi-line
string'''
s4 = """Another multi-line
string"""
print(s1, s2)
print(s3)
print(s4)
আউটপুট:
Hello World
Multi-line
string
Another multi-line
string
📝 ৪.২ — String Indexing
text = "Python"
print(f"শব্দ: {text}")
print(f"0: {text[0]}")
print(f"1: {text[1]}")
print(f"-1: {text[-1]}")
print(f"-2: {text[-2]}")
আউটপুট:
শব্দ: Python
0: P
1: y
-1: n
-2: o
📝 ৪.৩ — String Slicing
text = "Python Programming"
print(text[0:6])
print(text[7:])
print(text[:6])
print(text[::2])
print(text[::-1])
print(text[-11:])
আউটপুট:
Python
Programming
Python
Pto rgamn
gnimmargorP nohtyP
Programming
📝 ৪.৪ — String Methods
text = "  Hello World  "
print(f"upper: {text.upper()}")
print(f"lower: {text.lower()}")
print(f"strip: '{text.strip()}'")
print(f"title: {text.strip().title()}")
আউটপুট:
upper: HELLO WORLD
lower: hello world
strip: 'Hello World'
title: Hello World
📝 ৪.৫ — split() ও join()
text = "আপেল, কলা, কমলা, আঙুর"
fruits = text.split(", ")
print(f"split: {fruits}")
joined = " | ".join(fruits)
print(f"join: {joined}")
আউটপুট:
split: ['আপেল', 'কলা', 'কমলা', 'আঙুর']
join: আপেল | কলা | কমলা | আঙুর
📝 ৪.৬ — find(), replace(), count()
text = "Python is great. Python is fun."
print(f"find: {text.find('Python')}")
print(f"rfind: {text.rfind('Python')}")
print(f"replace: {text.replace('Python', 'Java')}")
print(f"count is: {text.count('is')}")
আউটপুট:
find: 0
rfind: 21
replace: Java is great. Java is fun.
count is: 2
📝 ৪.৭ — f-strings
name = "সাদিয়া"
age = 22
score = 92.5
print(f"নাম: {name}")
print(f"বয়স: {age}")
print(f"স্কোর: {score:.2f}")
print(f"{name} {age} বছর, স্কোর {score:.1f}%")
আউটপুট:
নাম: সাদিয়া
বয়স: 22
স্কোর: 92.50
সাদিয়া 22 বছর, স্কোর 92.5%
📝 ৪.৮ — String Immutability
text = "Hello"
text = "J" + text[1:]
print(text)
s = "Python"
print(id(s))
s = s + " Rocks"
print(id(s))
আউটপুট:
Jello
14073...
14074...
📝 ৪.৯ — Repetition & Concatenation
print("Ha" * 5)
print("Py" + "thon")
line = "-" * 30
print(line)
print("Centered".center(30, "*"))
আউটপুট:
HaHaHaHaHa
Python
------------------------------
**********Centered***********
📝 ৪.১০ — Raw & enumerate
print(r"Hello\nWorld")
for i, ch in enumerate("Python"):
    print(f"{i}: {ch}")
আউটপুট:
Hello\nWorld
0: P
1: y
2: t
3: h
4: o
5: n
📝 ৪.১১ — Check Methods
print("hello123".isalnum())
print("hello".isalpha())
print("123".isdigit())
print("hello".islower())
print("HELLO".isupper())
print("Hello World".istitle())
print("   ".isspace())
print("Hello".startswith("He"))
print("Hello".endswith("lo"))
আউটপুট:
True
True
True
True
True
True
True
True
True
📝 ৪.১২ — Format (old style)
name, age = "রহিম", 25
print("নাম: %s, বয়স: %d" % (name, age))
print("স্কোর: %.2f" % 87.4567)
print("নাম: {}, বয়স: {}".format(name, age))
print("{0} {1} বছর".format(name, age))
print("{n} {a} বছর".format(n=name, a=age))
আউটপুট:
নাম: রহিম, বয়স: 25
স্কোর: 87.46
নাম: রহিম, বয়স: 25
রহিম 25 বছর
রহিম 25 বছর

📌 মূল কথা

String পাইথনের গুরুত্বপূর্ণ ডেটা টাইপ। ইন্ডেক্সিং, স্লাইসিং, মেথড এবং ফরম্যাটিংয়ের মাধ্যমে string নিয়ে নানাভাবে কাজ করা যায়। f-string সবচেয়ে আধুনিক ও সহজ ফরম্যাটিং পদ্ধতি।

অধ্যায় ৫ Input/Output

📥📤 ইনপুট ও আউটপুট

পাইথনে input() ফাংশন ব্যবহার করে ব্যবহারকারীর কাছ থেকে ইনপুট নেওয়া হয় এবং print() ফাংশন ব্যবহার করে আউটপুট দেখানো হয়।

📝 ৫.১ — input()
name = input("আপনার নাম কী? ")
print(f"স্বাগতম, {name}!")
📝 ৫.২ — Numeric Input
age = int(input("আপনার বয়স কত? "))
print(f"আপনার বয়স {age} বছর")
print(f"আগামী বছর আপনার বয়স হবে {age + 1} বছর")
📝 ৫.৩ — sep ও end
print("Python", "Java", "C++", sep=", ")
print("One", end=" -> ")
print("Two", end=" -> ")
print("Three")
for i in range(5):
    print(i, end=" ")
📝 ৫.৪ — File Write
with open("output.txt", "w", encoding="utf-8") as f:
    f.write("Hello, World!\n")
    f.write("এটা বাংলা লেখা\n")
print("ফাইলে লেখা হয়েছে!")
📝 ৫.৫ — File Read
with open("output.txt", "r", encoding="utf-8") as f:
    content = f.read()
    print("ফাইলের বিষয়বস্তু:")
    print(content)
📝 ৫.৬ — File Append
with open("output.txt", "a", encoding="utf-8") as f:
    f.write("নতুন লাইন যোগ করা হলো\n")
print("যোগ করা হয়েছে!")
with open("output.txt", "r", encoding="utf-8") as f:
    print(f.read())
📝 ৫.৭ — readline/readlines
with open("output.txt", "r", encoding="utf-8") as f:
    print("--- readline ---")
    print(repr(f.readline()))
    f.seek(0)
    print("--- readlines ---")
    print(f.readlines())

📌 মূল কথা

input() ব্যবহার করে ইউজার থেকে ডেটা নেওয়া হয় (সবসময় string হিসেবে)। print() দিয়ে আউটপুট দেখানো হয়। sep, end প্যারামিটার দিয়ে আউটপুট নিয়ন্ত্রণ করা যায়। ফাইল I/O-র জন্য with স্টেটমেন্ট সবচেয়ে নিরাপদ।

অধ্যায় ৬ Conditionals (শর্ত)

⚖️ Conditionals

Conditional ব্যবহার করে আমরা প্রোগ্রামে সিদ্ধান্ত নিতে পারি। পাইথনে if, elif, else এবং match-case (Python 3.10+) আছে।

📝 ৬.১ — if-else
age = 18
if age >= 18:
    print("আপনি ভোট দিতে পারবেন")
else:
    print("আপনি ভোট দিতে পারবেন না")
📝 ৬.২ — if-elif-else (Grade)
marks = 85
if marks >= 80:
    print("গ্রেড: A+ (প্রথম স্থান)")
elif marks >= 70:
    print("গ্রেড: A")
elif marks >= 60:
    print("গ্রেড: A-")
elif marks >= 50:
    print("গ্রেড: B")
elif marks >= 40:
    print("গ্রেড: C")
else:
    print("গ্রেড: F (ফেল)")
📝 ৬.৩ — Nested if
age, has_ticket, has_id = 25, True, True
if age >= 18:
    print("বয়স ১৮+ ✓")
    if has_ticket:
        print("টিকেট আছে ✓")
        if has_id:
            print("আইডি আছে ✓")
            print("ভিতরে যেতে পারেন!")
        else:
            print("আইডি লাগবে")
    else:
        print("টিকেট কিনুন")
else:
    print("বয়স ১৮ এর নিচে")
📝 ৬.৪ — Ternary Operator
age = 20
status = "প্রাপ্তবয়স্ক" if age >= 18 else "নাবালক"
print(f"আপনি {status}")
x, y = 10, 20
max_val = x if x > y else y
print(f"বড় মান: {max_val}")
📝 ৬.৫ — match-case (3.10+)
day = 3
match day:
    case 1: print("সোমবার")
    case 2: print("মঙ্গলবার")
    case 3: print("বুধবার")
    case 4: print("বৃহস্পতিবার")
    case 5: print("শুক্রবার")
    case 6: print("শনিবার")
    case 7: print("রবিবার")
    case _: print("ভুল দিন")
📝 ৬.৬ — Multiple Conditions
year = 2024
if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):
    print(f"{year} একটি অধিবর্ষ (Leap Year)")
else:
    print(f"{year} অধিবর্ষ নয়")
📝 ৬.৭ — Even/Odd Check
num = 7
if num % 2 == 0:
    print(f"{num} জোড় সংখ্যা")
else:
    print(f"{num} বিজোড় সংখ্যা")

📌 মূল কথা

if-elif-else দিয়ে বিভিন্ন শর্তে সিদ্ধান্ত নেওয়া যায়। Python 3.10-এ match-case যোগ হয়েছে। টারনারি অপারেটর ছোট শর্তের জন্য দ্রুত সমাধান দেয়।

অধ্যায় ৭ Loops (লুপ)

🔄 Loop কী?

Loop ব্যবহার করে একই কাজ বারবার করা যায়। পাইথনে দুটি লুপ আছে: for এবং while।

📝 ৭.১ — for loop
fruits = ["আপেল", "কলা", "কমলা"]
for fruit in fruits:
    print(f"ফল: {fruit}")
📝 ৭.২ — range()
print("range(5):")
for i in range(5): print(i, end=" ")
print("\n\nrange(2, 8):")
for i in range(2, 8): print(i, end=" ")
print("\n\nrange(1, 10, 2):")
for i in range(1, 10, 2): print(i, end=" ")
📝 ৭.৩ — while loop
i = 1
while i <= 5:
    print(f"গণনা: {i}")
    i += 1
📝 ৭.৪ — break
for i in range(1, 10):
    if i == 5:
        print(f"ব্রেক! {i} এ থামলাম")
        break
    print(f"সংখ্যা: {i}")
📝 ৭.৫ — continue
for i in range(1, 8):
    if i == 3 or i == 5:
        continue
    print(f"সংখ্যা: {i}")
📝 ৭.৬ — else with loop
for i in range(1, 4):
    print(i)
else:
    print("লুপ শেষ!")
    
print("---")
for i in range(1, 4):
    if i == 2: break
    print(i)
else:
    print("এটা দেখা যাবে না")
📝 ৭.৭ — Nested Loop: Triangle
n = 5
for i in range(1, n+1):
    print("*" * i)
📝 ৭.৮ — Nested Loop: Pyramid
n = 5
for i in range(1, n+1):
    spaces = " " * (n - i)
    stars = "*" * (2 * i - 1)
    print(spaces + stars)
📝 ৭.৯ — Diamond Pattern
n = 5
for i in range(1, n+1):
    print(" " * (n-i) + "*" * (2*i-1))
for i in range(n-1, 0, -1):
    print(" " * (n-i) + "*" * (2*i-1))
📝 ৭.১০ — enumerate
fruits = ["আপেল", "কলা", "কমলা", "আঙুর"]
for idx, fruit in enumerate(fruits, start=1):
    print(f"{idx}. {fruit}")
📝 ৭.১১ — zip
names = ["রহিম", "করিম", "সাদিয়া"]
ages = [25, 30, 22]
cities = ["ঢাকা", "চট্টগ্রাম", "রাজশাহী"]
for name, age, city in zip(names, ages, cities):
    print(f"{name}, {age} বছর, {city}")
📝 ৭.১২ — pass statement
for i in range(5):
    if i == 2:
        pass  # পরে লিখব
    print(f"সংখ্যা: {i}")

📌 মূল কথা

for এবং while লুপ দিয়ে বারবার কাজ করা যায়। break, continue, pass লুপ নিয়ন্ত্রণ করে। range(), enumerate(), zip() লুপের সাথে ব্যবহারের জন্য দারুণ ফাংশন।

অধ্যায় ৮ Functions (ফাংশন)

⚙️ Function কী?

Function হলো কোডের ব্লক যা নির্দিষ্ট কাজ করে। def কীওয়ার্ড দিয়ে ফাংশন তৈরি করা হয়। ফাংশন কোড পুনরায় ব্যবহারের সুবিধা দেয়।

📝 ৮.১ — Basic Function
def greet():
    print("স্বাগতম!")   
    print("পাইথনে আপনাকে স্বাগত!")
greet()
greet()
📝 ৮.২ — Function with Parameters
def add(a, b):
    result = a + b
    return result
sum_val = add(10, 5)
print(f"যোগফল: {sum_val}")
print(f"আরেকটি: {add(100, 200)}")
📝 ৮.৩ — Default Parameters
def greet(name, msg="স্বাগতম"):
    print(f"{msg}, {name}!")
greet("রহিম")
greet("সাদিয়া", "কেমন আছো")
📝 ৮.৪ — Keyword Arguments
def student_info(name, age, city):
    print(f"নাম: {name}, বয়স: {age}, শহর: {city}")
student_info(age=22, name="করিম", city="খুলনা")
student_info("সাদিয়া", city="ঢাকা", age=25)
📝 ৮.৫ — *args (Variable Arguments)
def sum_all(*numbers):
    total = 0
    for n in numbers:
        total += n
    return total
print(sum_all(1, 2, 3))
print(sum_all(10, 20, 30, 40, 50))
print(sum_all())
📝 ৮.৬ — **kwargs (Keyword Args)
def print_info(**info):
    for key, value in info.items():
        print(f"{key}: {value}")
print_info(name="রহিম", age=25, city="ঢাকা")
print_info(product="ল্যাপটপ", price=65000, brand="Dell")
📝 ৮.৭ — Local vs Global
x = 50  # global
def func():
    x = 10  # local
    print(f"Local x: {x}")
func()
print(f"Global x: {x}")
📝 ৮.৮ — global keyword
count = 0
def increment():
    global count
    count += 1
    print(f"গণনা: {count}")
increment()
increment()
increment()
📝 ৮.৯ — Lambda Function
square = lambda x: x * x
double = lambda x: x * 2
add = lambda a, b: a + b
print(f"Square: {square(5)}")
print(f"Double: {double(10)}")
print(f"Add: {add(3, 7)}")
📝 ৮.১০ — Recursion: Factorial
def factorial(n):
    if n <= 1:
        return 1
    return n * factorial(n - 1)
for i in range(1, 8):
    print(f"{i}! = {factorial(i)}")
📝 ৮.১১ — Recursion: Fibonacci
def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n-1) + fibonacci(n-2)
for i in range(10):
    print(f"F({i}) = {fibonacci(i)}")
📝 ৮.১২ — map()
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers))
print(f"মূল: {numbers}")
print(f"বর্গ: {squared}")
📝 ৮.১৩ — filter()
numbers = [1, 2, 3, 4, 5, 6, 7, 8]
even = list(filter(lambda x: x % 2 == 0, numbers))
odd = list(filter(lambda x: x % 2 != 0, numbers))
print(f"জোড়: {even}")
print(f"বিজোড়: {odd}")
📝 ৮.১৪ — reduce()
from functools import reduce
numbers = [1, 2, 3, 4, 5]
product = reduce(lambda x, y: x * y, numbers)
sum_all = reduce(lambda x, y: x + y, numbers)
print(f"গুণফল: {product}")
print(f"যোগফল: {sum_all}")
📝 ৮.১৫ — Simple Decorator
def timer(func):
    import time
    def wrapper():
        start = time.time()
        func()
        end = time.time()
        print(f"সময়: {end-start:.4f} সেকেন্ড")
    return wrapper

@timer
def slow_func():
    total = sum(range(1000000))
    print(f"সমষ্টি: {total}")

slow_func()

📌 মূল কথা

ফাংশন কোড পুনর্ব্যবহারযোগ্য করে। *args ও **kwargs দিয়ে নমনীয় প্যারামিটার। Lambda ছোট ফাংশনের জন্য। Recursion জটিল সমস্যার মোহনীয় সমাধান দেয়। map, filter, reduce ফাংশনাল প্রোগ্রামিং এর ভিত্তি।

অধ্যায় ৯ List (তালিকা)

📋 List কী?

List হলো পাইথনের একটি ডেটা টাইপ যা একাধিক মান সংরক্ষণ করতে পারে। এটি mutable (পরিবর্তনযোগ্য)। List তৈরি করতে [ ] ব্যবহার করা হয়।

📝 ৯.১ — List তৈরি ও Access
fruits = ["আপেল", "কলা", "কমলা"]
numbers = [1, 2, 3, 4, 5]
mixed = [1, "Hello", 3.14, True, None]
print(fruits[0], fruits[-1])
print(numbers[1:4])
print(mixed)
📝 ৯.২ — List Methods
nums = [3, 1, 4, 1, 5, 9]
nums.append(2)
print(f"append: {nums}")
nums.insert(2, 10)
print(f"insert: {nums}")
nums.remove(1)
print(f"remove: {nums}")
popped = nums.pop()
print(f"pop: {popped}, now: {nums}")
nums.sort()
print(f"sort: {nums}")
nums.reverse()
print(f"reverse: {nums}")
📝 ৯.৩ — List Comprehension
squares = [x**2 for x in range(10)]
print(f"বর্গ: {squares}")
evens = [x for x in range(20) if x % 2 == 0]
print(f"জোড়: {evens}")
fruits = ["আপেল", "কলা", "কমলা", "আঙুর"]
long = [f for f in fruits if len(f) > 4]
print(f"বড় নাম: {long}")
📝 ৯.৪ — 2D List (Matrix)
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
print(f"ম্যাট্রিক্স:")
for row in matrix:
    print(row)
print(f"\n[1][1]: {matrix[1][1]}")
print(f"সারি 0: {matrix[0]}")
col = [row[0] for row in matrix]
print(f"কলাম 0: {col}")
📝 ৯.৫ — copy vs deepcopy
import copy
original = [[1,2,3],[4,5,6]]
shallow = copy.copy(original)
deep = copy.deepcopy(original)
original[0][0] = 99
print(f"Original: {original}")
print(f"Shallow: {shallow}")  # affected
print(f"Deep: {deep}")  # unchanged
📝 ৯.৬ — List Slicing
nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(f"প্রথম ৫: {nums[:5]}")
print(f"শেষ ৩: {nums[-3:]}")
print(f"২-৭: {nums[2:7]}")
print(f"প্রতি ২য়: {nums[::2]}")
print(f"উল্টো: {nums[::-1]}")
nums[2:5] = [20, 30, 40]
print(f"পরিবর্তন: {nums}")
📝 ৯.৭ — List Operations
a = [1, 2, 3]
b = [4, 5, 6]
print(f"a + b: {a + b}")
print(f"a * 3: {a * 3}")
print(f"2 in a: {2 in a}")
print(f"len: {len(a)}")
print(f"min: {min(a)}, max: {max(a)}")
print(f"sum: {sum(a)}")
print(f"index of 3: {a.index(3)}")
print(f"count of 1: {a.count(1)}")
📝 ৯.৮ — List with enumerate
fruits = ["আপেল", "কলা", "কমলা"]
for i, fruit in enumerate(fruits):
    print(f"{i}: {fruit}")
    
cities = ["ঢাকা", "চট্টগ্রাম", "খুলনা", "রাজশাহী"]
for i, city in enumerate(cities, 1):
    print(f"{i}. {city}")
📝 ৯.৯ — List Filtering
numbers = [12, 5, 8, 20, 3, 15, 7, 18]
greater_than_10 = [n for n in numbers if n > 10]
print(f"১০ এর বড়: {greater_than_10}")
even = [n for n in numbers if n % 2 == 0]
print(f"জোড়: {even}")
divisible_by_3_5 = [n for n in numbers if n % 3 == 0 or n % 5 == 0]
print(f"৩/৫ দিয়ে বিভাজ্য: {divisible_by_3_5}")
📝 ৯.১০ — Matrix Transpose
matrix = [
    [1, 2, 3],
    [4, 5, 6]
]
transpose = [[row[i] for row in matrix] for i in range(3)]
print(f"মূল:")
for r in matrix: print(r)
print(f"ট্রান্সপোজ:")
for r in transpose: print(r)

📌 মূল কথা

List পাইথনের সবচেয়ে শক্তিশালী ডেটা টাইপ। List comprehension দিয়ে সংক্ষেপে list তৈরি করা যায়। copy vs deepcopy বুঝে mutable ডেটা কপি করতে হবে।

অধ্যায় ১০ Tuple, Set, Dictionary

📦 Tuple, Set, Dictionary

Tuple (immutable list), Set (uniqued collection), Dictionary (key-value pairs) — পাইথনের গুরুত্বপূর্ণ ডেটা টাইপ।

Tuple

📝 ১০.১ — Tuple তৈরি
t1 = (1, 2, 3)
t2 = 4, 5, 6
t3 = (7,)  # single element
print(f"t1: {t1}, type: {type(t1)}")
print(f"t2: {t2}")
print(f"t3: {t3}")
print(f"t1[0]: {t1[0]}, t1[1:3]: {t1[1:3]}")
# t1[0] = 10  # Error! Tuple immutable
📝 ১০.২ — Tuple Packing/Unpacking
# Packing
person = "রহিম", 25, "ঢাকা"
print(f"Packed: {person}")
# Unpacking
name, age, city = person
print(f"নাম: {name}, বয়স: {age}, শহর: {city}")
# Swap using tuple
a, b = 10, 20
a, b = b, a
print(f"Swap: a={a}, b={b}")

Set

📝 ১০.৩ — Set তৈরি ও Operations
a = {1, 2, 3, 4, 5}
b = {4, 5, 6, 7, 8}
print(f"A: {a}")
print(f"B: {b}")
print(f"Union: {a | b}")
print(f"Intersection: {a & b}")
print(f"Difference A-B: {a - b}")
print(f"Difference B-A: {b - a}")
print(f"Symmetric Diff: {a ^ b}")
a.add(9)
print(f"After add: {a}")
📝 ১০.৪ — Set Features
numbers = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
unique = set(numbers)
print(f"Original: {numbers}")
print(f"Unique: {unique}")
print(f"Count: {len(unique)}")
print(f"1 in set: {1 in unique}")
print(f"10 in set: {10 in unique}")

Dictionary

📝 ১০.৫ — Dictionary তৈরি
student = {
    "name": "সাদিয়া",
    "age": 22,
    "city": "ঢাকা",
    "subjects": ["Python", "Math", "English"]
}
print(f"নাম: {student['name']}")
print(f"বয়স: {student['age']}")
print(f"বিষয়: {student['subjects']}")
student["grade"] = "A+"
print(f"Updated: {student}")
📝 ১০.৬ — Dict Methods
d = {"a": 1, "b": 2, "c": 3}
print(f"keys: {d.keys()}")
print(f"values: {d.values()}")
print(f"items: {d.items()}")
print(f"get a: {d.get('a')}")
print(f"get z: {d.get('z', 'নেই')}")
print(f"pop b: {d.pop('b')}, now: {d}")
d.setdefault("d", 4)
print(f"setdefault: {d}")
d.update({"e": 5, "f": 6})
print(f"update: {d}")
📝 ১০.৭ — Dict Comprehension
squares = {x: x**2 for x in range(1, 6)}
print(f"বর্গ: {squares}")
even_squares = {x: x**2 for x in range(1, 11) if x % 2 == 0}
print(f"জোড় বর্গ: {even_squares}")
words = ["apple", "banana", "cherry"]
word_length = {w: len(w) for w in words}
print(f"শব্দের দৈর্ঘ্য: {word_length}")
📝 ১০.৮ — Nested Dictionary
students = {
    "101": {"name": "রহিম", "age": 20, "grade": "A"},
    "102": {"name": "করিম", "age": 22, "grade": "B"},
    "103": {"name": "সাদিয়া", "age": 21, "grade": "A+"}
}
for sid, info in students.items():
    print(f"{sid}: {info['name']}, বয়স {info['age']}, গ্রেড {info['grade']}")
print(f"\nরহিমের তথ্য: {students['101']}")
print(f"সাদিয়ার গ্রেড: {students['103']['grade']}")
📝 ১০.৯ — Dictionary Looping
marks = {
    "গণিত": 85,
    "বাংলা": 78,
    "ইংরেজি": 92,
    "বিজ্ঞান": 88
}
total = sum(marks.values())
avg = total / len(marks)
print("বিষয়ভিত্তিক নম্বর:")
for subject, mark in marks.items():
    status = "⭐" if mark >= 80 else "✅"
    print(f"  {status} {subject}: {mark}")
print(f"\nমোট: {total}, গড়: {avg:.1f}")
📝 ১০.১০ — Set Comprehension
squares_set = {x**2 for x in range(10)}
print(f"বর্গ set: {squares_set}")
even_set = {x for x in range(20) if x % 2 == 0}
print(f"জোড় set: {even_set}")
text = "python programming"
unique_chars = {c for c in text if c != ' '}
print(f"অনন্য ক্যারেক্টার: {sorted(unique_chars)}")

📌 মূল কথা

Tuple immutable, Set unique values, Dictionary key-value pairs. Comprehension দিয়ে এগুলো সংক্ষেপে তৈরি করা যায়। Nested dict জটিল ডেটা সংরক্ষণে দারুণ।

অধ্যায় ১১ OOP — Object Oriented Programming

🧩 OOP কী?

OOP বা Object Oriented Programming হলো প্রোগ্রামিং-এর একটি পদ্ধতি যেখানে ডেটা এবং এর সাথে সম্পর্কিত ফাংশনকে একসাথে Class-এ বাঁধা হয়। বাস্তব জগতের জিনিসকে (যেমন: বই, গাড়ি, মানুষ) কোডের মাধ্যমে মডেল করাই OOP-র মূল উদ্দেশ্য।

📝 ১১.১ — Class ও Object
class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def introduce(self):
        print(f"আমার নাম {self.name}, বয়স {self.age}")

s1 = Student("রহিম", 20)
s2 = Student("সাদিয়া", 22)
s1.introduce()
s2.introduce()
📝 ১১.২ — Instance vs Class Variables
class Employee:
    company = "Tech Corp"  # class variable
    def __init__(self, name, salary):
        self.name = name    # instance variable
        self.salary = salary
e1 = Employee("রহিম", 50000)
e2 = Employee("করিম", 60000)
print(f"{e1.name}: {e1.salary}, কোম্পানি: {e1.company}")
print(f"{e2.name}: {e2.salary}, কোম্পানি: {Employee.company}")
📝 ১১.৩ — Class & Static Methods
class Calculator:
    @classmethod
    def description(cls):
        return f"{cls.__name__} - একটি ক্যালকুলেটর ক্লাস"
    @staticmethod
    def add(a, b):
        return a + b
    @staticmethod
    def multiply(a, b):
        return a * b
print(Calculator.description())
print(f"যোগ: {Calculator.add(10, 20)}")
print(f"গুণ: {Calculator.multiply(5, 6)}")
📝 ১১.৪ — Single Inheritance
class Animal:
    def __init__(self, name):
        self.name = name
    def speak(self):
        print(f"{self.name} শব্দ করছে")
class Dog(Animal):
    def speak(self):
        print(f"{self.name}: ঘেউ ঘেউ!")
d = Dog("ববি")
d.speak()
📝 ১১.৫ — Multiple Inheritance
class Father:
    def height(self):
        print("লম্বা")
    def nature(self):
        print("ধৈর্যশীল")
class Mother:
    def beauty(self):
        print("সুন্দর")
    def nature(self):
        print("স্নেহময়ী")
class Child(Father, Mother):
    pass
c = Child()
c.height()
c.beauty()
c.nature()  # Father's method (first parent)
📝 ১১.৬ — Multilevel Inheritance
class Vehicle:
    def start(self):
        print("গাড়ি স্টার্ট হয়েছে")
class Car(Vehicle):
    def drive(self):
        print("গাড়ি চালানো হচ্ছে")
class ElectricCar(Car):
    def charge(self):
        print("ব্যাটারি চার্জ হচ্ছে")
tesla = ElectricCar()
tesla.start()
tesla.drive()
tesla.charge()
📝 ১১.৭ — super()
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def info(self):
        return f"{self.name}, {self.age} বছর"
class Student(Person):
    def __init__(self, name, age, student_id):
        super().__init__(name, age)
        self.student_id = student_id
    def info(self):
        return f"{super().info()}, ID: {self.student_id}"
s = Student("রহিম", 20, "S123")
print(s.info())
📝 ১১.৮ — Encapsulation
class BankAccount:
    def __init__(self, owner, balance):
        self.owner = owner
        self.__balance = balance  # private
    def deposit(self, amount):
        if amount > 0:
            self.__balance += amount
    def withdraw(self, amount):
        if 0 < amount <= self.__balance:
            self.__balance -= amount
    def get_balance(self):
        return self.__balance
acc = BankAccount("রহিম", 10000)
acc.deposit(5000)
acc.withdraw(2000)
print(f"ব্যালেন্স: {acc.get_balance()}")
# print(acc.__balance)  # Error!
📝 ১১.৯ — Polymorphism
class Bird:
    def sound(self): return "কুহু কুহু"
class Cat:
    def sound(self): return "মিউ মিউ"
class Dog:
    def sound(self): return "ঘেউ ঘেউ"
def make_sound(animal):
    print(animal.sound())
make_sound(Bird())
make_sound(Cat())
make_sound(Dog())
📝 ১১.১০ — Magic Methods
class Book:
    def __init__(self, title, author, pages):
        self.title = title
        self.author = author
        self.pages = pages
    def __str__(self):
        return f"'{self.title}' - {self.author}"
    def __repr__(self):
        return f"Book('{self.title}', '{self.author}', {self.pages})"
    def __len__(self):
        return self.pages
b = Book("পাইথন শিখি", "রহিম", 250)
print(str(b))
print(repr(b))
print(f"পৃষ্ঠা সংখ্যা: {len(b)}")
📝 ১১.১১ — Property Decorator
class Temperature:
    def __init__(self, celsius):
        self._celsius = celsius
    @property
    def celsius(self):
        return self._celsius
    @celsius.setter
    def celsius(self, value):
        if value < -273.15:
            raise ValueError("-273.15 এর নিচে সম্ভব নয়")
        self._celsius = value
    @property
    def fahrenheit(self):
        return (self._celsius * 9/5) + 32
t = Temperature(25)
print(f"সেলসিয়াস: {t.celsius}°C")
print(f"ফারেনহাইট: {t.fahrenheit}°F")
t.celsius = 30
print(f"পরিবর্তনের পর: {t.celsius}°C, {t.fahrenheit}°F")

📌 মূল কথা

OOP বাস্তব জগতের সমস্যা সমাধানে দারুণ। Class, Inheritance, Encapsulation, Polymorphism — এগুলো OOP-র চার মূল স্তম্ভ। super(), @property, magic methods পাইথনের বিশেষ বৈশিষ্ট্য।

অধ্যায় ১২ Exception Handling

⚠️ Exception কী?

Exception হলো প্রোগ্রাম চলাকালীন সময়ে ঘটে যাওয়া ত্রুটি। পাইথনে try-except ব্যবহার করে এই ত্রুটিগুলো হ্যান্ডেল করা যায়।

📝 ১২.১ — try-except
try:
    num = int(input("একটি সংখ্যা দিন: "))
    result = 10 / num
    print(f"ফলাফল: {result}")
except ValueError:
    print("ভুল ইনপুট! সংখ্যা দিন")
except ZeroDivisionError:
    print("০ দিয়ে ভাগ করা যাবে না")
📝 ১২.২ — try-except-else-finally
try:
    x = int(input("সংখ্যা: "))
except ValueError:
    print("ভুল ইনপুট!")
else:
    print(f"বর্গ: {x**2}")
finally:
    print("এটা সবসময় চলবে")
📝 ১২.৩ — Multiple Exceptions
def divide_numbers(a, b):
    try:
        result = a / b
    except TypeError:
        return "টাইপ ভুল!"
    except ZeroDivisionError:
        return "০ দিয়ে ভাগ নয়!"
    except Exception as e:
        return f"অজানা ত্রুটি: {e}"
    else:
        return f"ফলাফল: {result}"
print(divide_numbers(10, 2))
print(divide_numbers(10, 0))
print(divide_numbers(10, "a"))
📝 ১২.৪ — raise Exception
def validate_age(age):
    if age < 0:
        raise ValueError("বয়স ঋণাত্মক হতে পারে না!")
    if age > 150:
        raise ValueError("এত বেশি বয়স সম্ভব নয়!")
    print(f"বয়স {age} বৈধ")
try:
    validate_age(-5)
except ValueError as e:
    print(f"ত্রুটি: {e}")
try:
    validate_age(25)
except ValueError as e:
    print(f"ত্রুটি: {e}")
📝 ১২.৫ — Custom Exception
class InsufficientBalanceError(Exception):
    pass
class BankAccount:
    def __init__(self, balance):
        self.balance = balance
    def withdraw(self, amount):
        if amount > self.balance:
            raise InsufficientBalanceError(
                f"অপর্যাপ্ত ব্যালেন্স! প্রয়োজন: {amount}, আছে: {self.balance}")
        self.balance -= amount
        print(f"{amount} উত্তোলন করা হয়েছে")
try:
    acc = BankAccount(5000)
    acc.withdraw(7000)
except InsufficientBalanceError as e:
    print(f"ত্রুটি: {e}")
📝 ১২.৬ — Common Exceptions
# IndexError
try:
    lst = [1, 2, 3]
    print(lst[5])
except IndexError:
    print("IndexError: তালিকার বাইরে!")

# KeyError
try:
    d = {"a": 1}
    print(d["z"])
except KeyError:
    print("KeyError: চাবি নেই!")

# TypeError
try:
    print("Hello" + 5)
except TypeError:
    print("TypeError: টাইপ মিলছে না!")

📌 মূল কথা

Exception handling প্রোগ্রামকে ক্র্যাশ হওয়া থেকে বাঁচায়। try-except-else-finally চারটি ব্লক মিলে ত্রুটি হ্যান্ডেল করে। নিজস্ব Exception ক্লাস তৈরি করে নির্দিষ্ট ত্রুটির জন্য কাস্টম বার্তা দেওয়া যায়।

অধ্যায় ১৩ Modules & Packages

📦 Module কী?

Module হলো Python ফাইল যাতে ফাংশন, ক্লাস, ভেরিয়েবল থাকে। import দিয়ে অন্য ফাইল থেকে কোড ব্যবহার করা যায়। Package হলো module-এর সংগ্রহ।

📝 ১৩.১ — import
import math
print(f"pi: {math.pi}")
print(f"sqrt(25): {math.sqrt(25)}")
print(f"ceil(4.3): {math.ceil(4.3)}")
print(f"floor(4.7): {math.floor(4.7)}")
print(f"sin(90°): {math.sin(math.radians(90)):.2f}")
📝 ১৩.২ — from...import
from math import pi, sqrt, pow
from random import randint, choice, shuffle
print(f"pi: {pi}")
print(f"sqrt(144): {sqrt(144)}")
print(f"pow(2, 10): {pow(2, 10)}")
print(f"1-10 র্যান্ডম: {randint(1, 10)}")
fruits = ["আপেল", "কলা", "কমলা"]
print(f"র্যান্ডম ফল: {choice(fruits)}")
shuffle(fruits)
print(f"শাফল: {fruits}")
📝 ১৩.৩ — datetime Module
from datetime import datetime, date, timedelta
now = datetime.now()
print(f"এখন: {now}")
print(f"তারিখ: {now.strftime('%d %B, %Y')}")
print(f"সময়: {now.strftime('%I:%M %p')}")
today = date.today()
future = today + timedelta(days=7)
print(f"আজ: {today}")
print(f"৭ দিন পর: {future}")
print(f"পার্থক্য: {(future - today).days} দিন")
📝 ১৩.৪ — os Module
import os
print(f"বর্তমান ডিরেক্টরি: {os.getcwd()}")
files = os.listdir('.')
print(f"ফাইল সমূহ: {files[:5]}...")
print(f"OS: {os.name}")
# os.mkdir("test_dir")  # ডিরেক্টরি তৈরি
📝 ১৩.৫ — sys Module
import sys
print(f"Python সংস্করণ: {sys.version}")
print(f"প্ল্যাটফর্ম: {sys.platform}")
print(f"PATH:")
for p in sys.path:
    print(f"  {p}")
📝 ১৩.৬ — time Module
import time
print("গণনা শুরু...")
for i in range(1, 4):
    print(i)
    time.sleep(0.5)
print("শেষ!")
start = time.time()
total = sum(range(1000000))
end = time.time()
print(f"সমষ্টি: {total}")
print(f"সময়: {(end-start)*1000:.2f} ms")
📝 ১৩.৭ — Creating Own Module
# my_math.py (module)
def add(a, b): return a + b
def subtract(a, b): return a - b
def multiply(a, b): return a * b
def divide(a, b):
    if b == 0: return "ভুল!"
    return a / b

# using the module
print(f"5 + 3 = {add(5, 3)}")
print(f"10 - 4 = {subtract(10, 4)}")
print(f"6 * 7 = {multiply(6, 7)}")
print(f"20 / 4 = {divide(20, 4)}")
📝 ১৩.৮ — as alias
import math as m
from datetime import datetime as dt
print(f"pi = {m.pi}")
print(f"এখন: {dt.now()}")
import random as r
print(f"1-100: {r.randint(1, 100)}")

📌 মূল কথা

Standard library তে অনেক দরকারি module আছে — math, random, datetime, os, sys, time। import, from...import, as — দিয়ে module ব্যবহার করা হয়। pip দিয়ে থার্ড-পার্টি package ইনস্টল করা যায়।

অধ্যায় ১৪ File Handling

📁 File Handling

Python দিয়ে ফাইল থেকে ডেটা পড়া, ফাইলে ডেটা লেখা, CSV ও JSON ফাইল নিয়ে কাজ করা যায়।

📝 ১৪.১ — Text File Write
with open("note.txt", "w", encoding="utf-8") as f:
    f.write("পাইথন শেখা শুরু!\n")
    f.write("এটা দ্বিতীয় লাইন\n")
print("ফাইল তৈরি হয়েছে!")
# পড়ে দেখি
with open("note.txt", "r", encoding="utf-8") as f:
    print(f.read())
📝 ১৪.২ — File Append
with open("note.txt", "a", encoding="utf-8") as f:
    f.write("আরেকটি লাইন যোগ করলাম\n")
    f.write("শেষ লাইন!\n")
with open("note.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()
    for i, line in enumerate(lines, 1):
        print(f"{i}: {line.strip()}")
📝 ১৪.৩ — with Statement
# proper way - with automatically closes file
with open("note.txt", "r", encoding="utf-8") as f:
    content = f.read()
    print(f"বাইট সাইজ: {len(content)}")
    print(f"লাইন সংখ্যা: {content.count(chr(10)) + 1}")
📝 ১৪.৪ — CSV File
import csv
data = [
    ["নাম", "বয়স", "শহর"],
    ["রহিম", 25, "ঢাকা"],
    ["করিম", 30, "চট্টগ্রাম"],
    ["সাদিয়া", 22, "রাজশাহী"]
]
with open("students.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerows(data)
print("CSV তৈরি!")
with open("students.csv", "r", encoding="utf-8") as f:
    reader = csv.reader(f)
    for row in reader:
        print(" | ".join(row))
📝 ১৪.৫ — JSON File
import json
student = {
    "name": "সাদিয়া",
    "age": 22,
    "subjects": ["Python", "Math"],
    "address": {"city": "ঢাকা", "zip": 1200}
}
with open("student.json", "w", encoding="utf-8") as f:
    json.dump(student, f, indent=2, ensure_ascii=False)
print("JSON তৈরি!")
with open("student.json", "r", encoding="utf-8") as f:
    data = json.load(f)
    print(f"নাম: {data['name']}")
    print(f"বয়স: {data['age']}")
    print(f"শহর: {data['address']['city']}")
📝 ১৪.৬ — File Modes
modes = [
    ("r", "পড়ার জন্য (ডিফল্ট)"),
    ("w", "লেখার জন্য (পুরনো মুছে দেয়)"),
    ("a", "যোগ করার জন্য"),
    ("r+", "পড়া ও লেখা"),
    ("w+", "পড়া ও লেখা (মুছে দিয়ে)"),
    ("a+", "পড়া ও যোগ করা"),
    ("rb", "বাইনারি পড়া"),
    ("wb", "বাইনারি লেখা")
]
for mode, desc in modes:
    print(f"  {mode:3s} - {desc}")
📝 ১৪.৭ — File Copy
with open("note.txt", "r", encoding="utf-8") as src:
    content = src.read()
with open("note_copy.txt", "w", encoding="utf-8") as dst:
    dst.write(content)
print("কপি সম্পন্ন!")
with open("note_copy.txt", "r", encoding="utf-8") as f:
    print(f.read())

📌 মূল কথা

with স্টেটমেন্ট ফাইল অটোমেটিক বন্ধ করে। CSV ও JSON ফাইল নিয়ে কাজ করতে csv ও json module ব্যবহার করা হয়। ফাইল মোড বুঝে সঠিক মোড নির্বাচন করতে হবে।

অধ্যায় ১৫ Advanced Topics

🚀 Advanced Python

এই অধ্যায়ে আমরা উন্নত Python কনসেপ্ট নিয়ে আলোচনা করব — comprehensions, generators, iterators, context managers, regular expressions, এবং ফাংশনাল প্রোগ্রামিং।

📝 ১৫.১ — Advanced Comprehensions
# Nested comprehension
matrix = [[i*j for j in range(1, 4)] for i in range(1, 4)]
print(f"Matrix: {matrix}")

# Dict comprehension with condition
scores = {"রহিম": 85, "করিম": 72, "সাদিয়া": 95, "ফারজানা": 60}
passed = {k: v for k, v in scores.items() if v >= 80}
print(f"পাস: {passed}")

# Set comprehension
nums = [1, 2, 2, 3, 3, 3]
unique_squares = {x**2 for x in nums}
print(f"Unique squares: {unique_squares}")
📝 ১৫.২ — Generator (yield)
def countdown(n):
    while n > 0:
        yield n
        n -= 1
def fibonacci_gen(limit):
    a, b = 0, 1
    while a < limit:
        yield a
        a, b = b, a + b
print("Countdown:")
for c in countdown(5):
    print(c, end=" ")
print("\n\nFibonacci:")
for f in fibonacci_gen(100):
    print(f, end=" ")  # 0 1 1 2 3 5 8 13 21 34 55 89
📝 ১৫.৩ — Generator Expression
# Generator expression (uses less memory)
squares_gen = (x**2 for x in range(10))
print(f"Generator: {squares_gen}")
print(f"Values: {list(squares_gen)}")

# More efficient than list for large data
sum_squares = sum(x**2 for x in range(1000))
print(f"Sum of squares: {sum_squares}")
📝 ১৫.৪ — Iterator Protocol
class WeekDays:
    def __init__(self):
        self.days = ["সোম", "মঙ্গল", "বুধ", "বৃহস্পতি", "শুক্র", "শনি", "রবি"]
    def __iter__(self):
        self.n = 0
        return self
    def __next__(self):
        if self.n >= len(self.days):
            raise StopIteration
        result = self.days[self.n]
        self.n += 1
        return result
for day in WeekDays():
    print(day)
📝 ১৫.৫ — Context Manager
class FileManager:
    def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode
    def __enter__(self):
        self.file = open(self.filename, self.mode, encoding="utf-8")
        return self.file
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.file.close()
# ব্যবহার
with FileManager("note.txt", "r") as f:
    print(f.read())
📝 ১৫.৬ — Regular Expressions
import re
text = "আমার ইমেইল: rahim@gmail.com এবং karim@yahoo.com"
emails = re.findall(r'\b[\w.]+@\w+\.\w+\b', text)
print(f"ইমেইল: {emails}")

phone = "ফোন: +8801712345678, +880-2-9876543"
phones = re.findall(r'\+?\d[\d\-\s]{8,}\d', phone)
print(f"ফোন: {phones}")

# Search & replace
clean = re.sub(r'\d', '#', "Password123")
print(f"Cleaned: {clean}")
📝 ১৫.৭ — Regex Validation
import re
def validate_email(email):
    pattern = r'^[\w\.-]+@[\w\.-]+\.\w{2,}$'
    return bool(re.match(pattern, email))
def validate_bd_phone(phone):
    pattern = r'^(\+8801|01)[3-9]\d{8}$'
    return bool(re.match(pattern, phone))
tests = ["rahim@gmail.com", "invalid@", "test@.com"]
for t in tests:
    print(f"{t}: {'✅' if validate_email(t) else '❌'}")
phones = ["+8801712345678", "01234567890", "01912345678"]
for p in phones:
    print(f"{p}: {'✅' if validate_bd_phone(p) else '❌'}")
📝 ১৫.৮ — args/kwargs Deep Dive
def flexible_func(*args, **kwargs):
    print("Positional args:", args)
    print("Keyword args:", kwargs)
    if args:
        print(f"প্রথম positional: {args[0]}")
    if "name" in kwargs:
        print(f"name = {kwargs['name']}")
flexible_func(1, 2, 3, name="রহিম", age=25)
print("---")
flexible_func("hello", x=10)

# Unpacking
def add(a, b, c):
    return a + b + c
nums = [1, 2, 3]
print(f"Unpack list: {add(*nums)}")
data = {"a": 10, "b": 20, "c": 30}
print(f"Unpack dict: {add(**data)}")
📝 ১৫.৯ — Functional Programming
from functools import reduce
# Map - transform each element
nums = [1, 2, 3, 4, 5]
doubled = list(map(lambda x: x*2, nums))
print(f"Doubled: {doubled}")
# Filter - keep elements that match
even = list(filter(lambda x: x % 2 == 0, nums))
print(f"Even: {even}")
# Reduce - accumulate values
sum_all = reduce(lambda a, b: a + b, nums)
product = reduce(lambda a, b: a * b, nums)
print(f"Sum: {sum_all}, Product: {product}")

# any/all
print(f"Any > 3: {any(x > 3 for x in nums)}")
print(f"All > 0: {all(x > 0 for x in nums)}")
📝 ১৫.১০ — zip & enumerate Advanced
names = ["রহিম", "করিম", "সাদিয়া", "ফারজানা"]
ages = [25, 30, 22]
cities = ["ঢাকা", "চট্টগ্রাম"]
# zip stops at shortest
for n, a, c in zip(names, ages, cities):
    print(f"{n}, {a} বছর, {c}")
print("---")
# enumerate with start
for i, name in enumerate(names, 1):
    print(f"{i}. {name}")
print("---")
# Advanced: zip to dict
keys = ["name", "age", "city"]
values = ["রহিম", 25, "ঢাকা"]
person = dict(zip(keys, values))
print(person)

📌 মূল কথা

Generator মেমোরি সাশ্রয় করে বড় ডেটার জন্য। Context Manager রিসোর্স ম্যানেজ করে। Regex প্যাটার্ন ম্যাচিং-এর জন্য শক্তিশালী টুল। Functional programming এর tools কোডকে সংক্ষিপ্ত ও প্রকাশময় করে।

অধ্যায় ১৬ Mini Projects

🎯 Mini Projects

এই অধ্যায়ে আমরা হাতেকলমে ৫টি মিনি প্রকল্প তৈরি করব। প্রতিটি প্রকল্প বাস্তব জীবনের সমস্যা সমাধানের জন্য তৈরি।

📱 প্রকল্প ১: ক্যালকুলেটর

একটি সম্পূর্ণ ক্যালকুলেটর যা যোগ, বিয়োগ, গুণ, ভাগ, ঘাত, বর্গমূল ইত্যাদি করে।

📝 ১৬.১ — ক্যালকুলেটর
import math
def calculator():
    print("=== পাইথন ক্যালকুলেটর ===")
    print("1. যোগ  2. বিয়োগ  3. গুণ  4. ভাগ")
    print("5. ঘাত  6. বর্গমূল  7. %  8. প্রস্থান")
    while True:
        choice = input("\nঅপশন নির্বাচন করুন (1-8): ")
        if choice == "8":
            print("ধন্যবাদ!")
            break
        if choice == "6":
            n = float(input("সংখ্যা: "))
            print(f"√{n} = {math.sqrt(n):.2f}")
            continue
        a = float(input("প্রথম সংখ্যা: "))
        b = float(input("দ্বিতীয় সংখ্যা: "))
        ops = {"1": a+b, "2": a-b, "3": a*b, "4": a/b if b else "ভুল!", "5": a**b, "7": a%b}
        result = ops.get(choice, "ভুল অপশন!")
        print(f"ফলাফল: {result}")
calculator()

🎓 প্রকল্প ২: Student Grade Management

📝 ১৬.২ — গ্রেড ম্যানেজমেন্ট
class StudentGrade:
    def __init__(self):
        self.students = {}
    def add_student(self, name, marks):
        total = sum(marks.values())
        avg = total / len(marks)
        grade = "A+" if avg>=80 else "A" if avg>=70 else "B" if avg>=60 else "C" if avg>=40 else "F"
        self.students[name] = {"marks": marks, "total": total, "avg": avg, "grade": grade}
    def show_all(self):
        for name, info in self.students.items():
            print(f"{name}: Total={info['total']}, Avg={info['avg']:.1f}, Grade={info['grade']}")
sg = StudentGrade()
sg.add_student("রহিম", {"গণিত":85, "বাংলা":78, "ইংরেজি":92})
sg.add_student("সাদিয়া", {"গণিত":90, "বাংলা":88, "ইংরেজি":95})
sg.add_student("করিম", {"গণিত":55, "বাংলা":60, "ইংরেজি":58})
sg.show_all()

📝 প্রকল্প ৩: To-Do List (File Persistence)

📝 ১৬.৩ — To-Do List
import json
import os
class TodoList:
    def __init__(self, filename="todo.json"):
        self.filename = filename
        self.tasks = self.load()
    def load(self):
        if os.path.exists(self.filename):
            with open(self.filename, "r", encoding="utf-8") as f:
                return json.load(f)
        return []
    def save(self):
        with open(self.filename, "w", encoding="utf-8") as f:
            json.dump(self.tasks, f, indent=2, ensure_ascii=False)
    def add(self, task):
        self.tasks.append({"task": task, "done": False})
        self.save()
    def complete(self, idx):
        if 0 <= idx < len(self.tasks):
            self.tasks[idx]["done"] = True
            self.save()
    def show(self):
        for i, t in enumerate(self.tasks):
            status = "✅" if t["done"] else "⬜"
            print(f"{i+1}. {status} {t['task']}")
    def delete(self, idx):
        if 0 <= idx < len(self.tasks):
            del self.tasks[idx]
            self.save()
todo = TodoList()
todo.add("পাইথন শেখা")
todo.add("প্রজেক্ট তৈরি")
todo.add("বই পড়া")
todo.complete(0)
todo.show()

🎲 প্রকল্প ৪: Number Guessing Game

📝 ১৬.৪ — সংখ্যা অনুমান খেলা
import random
def guess_game():
    print("=== সংখ্যা অনুমান খেলা ===")
    print("১-১০০ এর মধ্যে একটি সংখ্যা অনুমান করুন!")
    secret = random.randint(1, 100)
    attempts = 0
    while True:
        try:
            guess = int(input("আপনার অনুমান: "))
            attempts += 1
            if guess < secret:
                print("ছোট! আরও বড় দিন ↑")
            elif guess > secret:
                print("বড়! আরও ছোট দিন ↓")
            else:
                print(f"🎉 অভিনন্দন! {attempts} চেষ্টায় সঠিক উত্তর!")
                print(f"গোপন সংখ্যা ছিল: {secret}")
                break
        except ValueError:
            print("দয়া করে একটি সংখ্যা দিন!")
guess_game()

📇 প্রকল্প ৫: Contact Book

📝 ১৬.৫ — Contact Book
class ContactBook:
    def __init__(self):
        self.contacts = {}
    def add(self, name, phone, email=""):
        self.contacts[name] = {"phone": phone, "email": email}
    def remove(self, name):
        self.contacts.pop(name, None)
    def search(self, keyword):
        return {k:v for k,v in self.contacts.items() if keyword.lower() in k.lower()}
    def show_all(self):
        if not self.contacts:
            print("কোনো কন্টাক্ট নেই!")
            return
        for name, info in sorted(self.contacts.items()):
            print(f"{name}: 📞 {info['phone']}", end="")
            if info['email']: print(f", 📧 {info['email']}", end="")
            print()
cb = ContactBook()
cb.add("রহিম", "01712345678", "rahim@email.com")
cb.add("সাদিয়া", "01987654321", "sadia@email.com")
cb.add("করিম", "01611223344")
print("সব কন্টাক্ট:")
cb.show_all()
print("\nসার্চ 'রহিম':")
results = cb.search("রহিম")
for name, info in results.items():
    print(f"  {name}: {info['phone']}")

📌 শেষ কথা

অভিনন্দন! 🎉 আপনি পুরো পাইথন কোর্সটি সম্পূর্ণ করেছেন! এই ১৬টি অধ্যায়ের মাধ্যমে আপনি পাইথনের বেসিক থেকে অ্যাডভান্সড কনসেপ্ট পর্যন্ত সবকিছু শিখেছেন। এখন আপনার নিজের প্রজেক্ট তৈরি করার সময়। মনে রাখবেন, প্রোগ্রামিং শেখার সবচেয়ে ভালো উপায় হলো বেশি বেশি প্র্যাকটিস করা। শুভকামনা! 🚀

অধ্যায় ১৭ NCTB পাঠ্যসূচি — ৯ম ও ১০ম শ্রেণি

📖 NCTB ICT পাঠ্যপুস্তক — পাইথন প্রোগ্রামিং

জাতীয় শিক্ষাক্রম ও পাঠ্যপুস্তক বোর্ড (NCTB)-এর ৯ম ও ১০ম শ্রেণির ICT পাঠ্যপুস্তকে পাইথন প্রোগ্রামিং অন্তর্ভুক্ত রয়েছে। এই অধ্যায়ে আমরা সেই পাঠ্যসূচি অনুসারে প্রচুর উদাহরণ সহ প্র্যাকটিস করব।

📌 ভেরিয়েবল ও ডেটা টাইপ — গুরুত্বপূর্ণ উদাহরণ

NCTB পাঠ্যসূচি অনুযায়ী ভেরিয়েবল ও ডেটা টাইপের বিভিন্ন উদাহরণ:

📝 NCTB ১ — বিভিন্ন ধরনের ভেরিয়েবল
# NCTB Class 9-10: Variable Examples
roll = 101
name = "রহিম"
marks = 85.5
grade = 'A'
passed = True
print("রোল:", roll)
print("নাম:", name)
print("নম্বর:", marks)
print("গ্রেড:", grade)
print("পাস:", passed)
📝 NCTB ২ — একাধিক ভেরিয়েবল
a = 10
b = 20
c = a + b
print("a =", a)
print("b =", b)
print("a + b =", c)
c = a * b
print("a * b =", c)
📝 NCTB ৩ — টাইপ কনভার্সন
num_str = "100"
num_int = int(num_str)
num_float = float(num_str)
print("string:", num_str)
print("integer:", num_int)
print("float:", num_float)
print("যোগ:", num_int + 50)
print("ভাগ:", num_float / 3)
📝 NCTB ৪ — ইনপুট নেওয়া
name = input("তোমার নাম কী? ")
age = int(input("তোমার বয়স কত? "))
cls = input("কোন শ্রেণিতে পড়? ")
print(f"তোমার নাম {name}")
print(f"তোমার বয়স {age} বছর")
print(f"তুমি {cls} শ্রেণিতে পড়")
print(f"আগামী বছর তোমার বয়স {age+1} হবে")
📝 NCTB ৫ — যোগফল নির্ণয়
a = int(input("প্রথম সংখ্যা: "))
b = int(input("দ্বিতীয় সংখ্যা: "))
sum = a + b
diff = a - b
product = a * b
quotient = a / b
print("যোগফল =", sum)
print("বিয়োগফল =", diff)
print("গুণফল =", product)
print("ভাগফল =", quotient)
📝 NCTB ৬ — সুদ নির্ণয়
P = float(input("আসল: "))
r = float(input("সুদের হার: "))
n = float(input("সময় (বছর): "))
I = (P * r * n) / 100
A = P + I
print("সরল সুদ =", I)
print("সুদাসল =", A)
📝 NCTB ৭ — ক্ষেত্রফল নির্ণয়
length = float(input("দৈর্ঘ্য: "))
width = float(input("প্রস্থ: "))
area = length * width
perimeter = 2 * (length + width)
print("ক্ষেত্রফল =", area)
print("পরিসীমা =", perimeter)
📝 NCTB ৮ — সোয়াপ
x = 5
y = 10
print("আগে: x =", x, ", y =", y)
temp = x
x = y
y = temp
print("পরে: x =", x, ", y =", y)

⚖️ Conditional Statements (if-elif-else) — NCTB উদাহরণ

NCTB পাঠ্যসূচি অনুযায়ী শর্তাধীন বিবরণীর বিভিন্ন প্রয়োগ:

📝 NCTB ৯ — জোড়-বিজোড়
num = int(input("একটি সংখ্যা দিন: "))
if num % 2 == 0:
    print(num, "একটি জোড় সংখ্যা")
else:
    print(num, "একটি বিজোড় সংখ্যা")
📝 NCTB ১০ — ধনাত্মক-ঋণাত্মক
num = float(input("একটি সংখ্যা দিন: "))
if num > 0:
    print(num, "ধনাত্মক")
elif num < 0:
    print(num, "ঋণাত্মক")
else:
    print("শূন্য")
📝 NCTB ১১ — বড় সংখ্যা নির্ণয়
a = int(input("প্রথম সংখ্যা: "))
b = int(input("দ্বিতীয় সংখ্যা: "))
if a > b:
    print(a, "বড়")
elif b > a:
    print(b, "বড়")
else:
    print("সমান")
📝 NCTB ১২ — তিনটি সংখ্যার বড়
a = int(input("প্রথম সংখ্যা: "))
b = int(input("দ্বিতীয় সংখ্যা: "))
c = int(input("তৃতীয় সংখ্যা: "))
if a >= b and a >= c:
    print(a, "সবচেয়ে বড়")
elif b >= a and b >= c:
    print(b, "সবচেয়ে বড়")
else:
    print(c, "সবচেয়ে বড়")
📝 NCTB ১৩ — গ্রেড নির্ণয়
marks = float(input("প্রাপ্ত নম্বর: "))
if marks >= 80:
    print("গ্রেড: A+ (গোল্ডেন)")
elif marks >= 70:
    print("গ্রেড: A")
elif marks >= 60:
    print("গ্রেড: A-")
elif marks >= 50:
    print("গ্রেড: B")
elif marks >= 40:
    print("গ্রেড: C")
elif marks >= 33:
    print("গ্রেড: D")
else:
    print("গ্রেড: F (ফেল)")
📝 NCTB ১৪ — লিপ ইয়ার
year = int(input("সাল দিন: "))
if (year % 400 == 0) or (year % 4 == 0 and year % 100 != 0):
    print(year, "একটি লিপ ইয়ার")
else:
    print(year, "লিপ ইয়ার নয়")
📝 NCTB ১৫ — ভোট দেওয়ার যোগ্যতা
age = int(input("বয়স: "))
if age >= 18:
    print("ভোট দিতে পারবেন")
    if age >= 60:
        print("আপনি বয়স্ক ভোটার")
else:
    remaining = 18 - age
    print(f"ভোট দিতে {remaining} বছর অপেক্ষা")
📝 NCTB ১৬ — ক্যালকুলেটর (if-elif)
a = float(input("প্রথম সংখ্যা: "))
b = float(input("দ্বিতীয় সংখ্যা: "))
op = input("অপারেটর (+, -, *, /): ")
if op == '+':
    print("ফল:", a + b)
elif op == '-':
    print("ফল:", a - b)
elif op == '*':
    print("ফল:", a * b)
elif op == '/':
    if b != 0:
        print("ফল:", a / b)
    else:
        print("ভুল! ০ দিয়ে ভাগ করা যাবে না")
else:
    print("ভুল অপারেটর")
📝 NCTB ১৭ — ত্রিভুজের ধরন
a = float(input("প্রথম বাহু: "))
b = float(input("দ্বিতীয় বাহু: "))
c = float(input("তৃতীয় বাহু: "))
if a == b == c:
    print("সমবাহু ত্রিভুজ")
elif a == b or b == c or a == c:
    print("সমদ্বিবাহু ত্রিভুজ")
elif a*a + b*b == c*c or b*b + c*c == a*a or a*a + c*c == b*b:
    print("সমকোণী ত্রিভুজ")
else:
    print("বিষমবাহু ত্রিভুজ")
📝 NCTB ১৮ — পরীক্ষার ফল
bangla = float(input("বাংলা: "))
english = float(input("ইংরেজি: "))
math = float(input("গণিত: "))
science = float(input("বিজ্ঞান: "))
total = bangla + english + math + science
avg = total / 4
print("মোট নম্বর:", total)
print("গড়:", avg)
if avg >= 80: print("রেজাল্ট: A+")
elif avg >= 70: print("রেজাল্ট: A")
elif avg >= 60: print("রেজাল্ট: A-")
elif avg >= 50: print("রেজাল্ট: B")
elif avg >= 40: print("রেজাল্ট: C")
elif avg >= 33: print("রেজাল্ট: D")
else: print("রেজাল্ট: F (ফেল)")
📝 NCTB ১৯ — বয়স গ্রুপ
age = int(input("বয়স: "))
if age <= 5:
    print("শিশু")
elif age <= 12:
    print("বালক/বালিকা")
elif age <= 17:
    print("কিশোর/কিশোরী")
elif age <= 30:
    print("যুবক/যুবতী")
elif age <= 60:
    print("প্রাপ্তবয়স্ক")
else:
    print("বৃদ্ধ")
📝 NCTB ২০ — ছোট বড় সমান
x = int(input("x = "))
y = int(input("y = "))
z = int(input("z = "))
if x < y and x < z:
    print(f"{x} সবচেয়ে ছোট")
elif y < x and y < z:
    print(f"{y} সবচেয়ে ছোট")
else:
    print(f"{z} সবচেয়ে ছোট")

🔄 Loop (for, while) — NCTB উদাহরণ

NCTB পাঠ্যসূচি অনুযায়ী লুপের বিভিন্ন প্রয়োগ:

📝 NCTB ২১ — ১ থেকে ১০ প্রিন্ট (for)
print("১ থেকে ১০ পর্যন্ত সংখ্যা:")
for i in range(1, 11):
    print(i, end=" ")
print()
print("\nলুপ শেষ!")
📝 NCTB ২২ — ১ থেকে ১০ (while)
i = 1
while i <= 10:
    print(i, end=" ")
    i = i + 1
print("\nলুপ শেষ")
📝 NCTB ২৩ — জোড় সংখ্যা
print("১-২০ পর্যন্ত জোড় সংখ্যা:")
for i in range(2, 21, 2):
    print(i, end=" ")
print("\n\nবিজোড় সংখ্যা:")
for i in range(1, 21, 2):
    print(i, end=" ")
📝 NCTB ২৪ — নামতা (Multiplication Table)
n = int(input("যে সংখ্যার নামতা চান: "))
print(f"{n} এর নামতা:")
for i in range(1, 11):
    print(f"{n} x {i} = {n*i}")
📝 NCTB ২৫ — ১ থেকে N পর্যন্ত যোগ
n = int(input("N-এর মান: "))
sum = 0
for i in range(1, n+1):
    sum = sum + i
print(f"১ থেকে {n} পর্যন্ত যোগফল = {sum}")
📝 NCTB ২৬ — গড় নির্ণয়
n = int(input("কয়টি সংখ্যা? "))
sum = 0
for i in range(n):
    num = float(input(f"সংখ্যা {i+1}: "))
    sum = sum + num
avg = sum / n
print("মোট:", sum)
print("গড়:", avg)
📝 NCTB ২৭ — ফ্যাক্টোরিয়াল
n = int(input("একটি সংখ্যা দিন: "))
fact = 1
for i in range(1, n+1):
    fact = fact * i
print(f"{n}! = {fact}")
📝 NCTB ২৮ — পিরামিড প্যাটার্ন
n = 5
print("পিরামিড:")
for i in range(1, n+1):
    print(" " * (n-i) + "*" * (2*i-1))

print("\nউল্টো পিরামিড:")
for i in range(n, 0, -1):
    print(" " * (n-i) + "*" * (2*i-1))
📝 NCTB ২৯ — সংখ্যা উল্টানো
n = int(input("একটি সংখ্যা: "))  
rev = 0
temp = n
while temp > 0:
    digit = temp % 10
    rev = rev * 10 + digit
    temp = temp // 10
print(f"উল্টানো সংখ্যা: {rev}")
📝 NCTB ৩০ — প্যালিনড্রোম
n = int(input("একটি সংখ্যা: "))
temp = n
rev = 0
while temp > 0:
    rev = rev * 10 + (temp % 10)
    temp = temp // 10
if n == rev:
    print(f"{n} একটি প্যালিনড্রোম সংখ্যা")
else:
    print(f"{n} প্যালিনড্রোম নয়")
📝 NCTB ৩১ — আর্মস্ট্রং সংখ্যা
n = int(input("একটি সংখ্যা: "))
temp = n
sum = 0
order = len(str(n))
while temp > 0:
    digit = temp % 10
    sum = sum + (digit ** order)
    temp = temp // 10
if n == sum:
    print(f"{n} একটি আর্মস্ট্রং সংখ্যা")
else:
    print(f"{n} আর্মস্ট্রং নয়")
📝 NCTB ৩২ — মৌলিক সংখ্যা
n = int(input("একটি সংখ্যা: "))
if n <= 1:
    print(f"{n} মৌলিক নয়")
else:
    is_prime = True
    for i in range(2, int(n**0.5) + 1):
        if n % i == 0:
            is_prime = False
            break
    if is_prime:
        print(f"{n} একটি মৌলিক সংখ্যা")
    else:
        print(f"{n} মৌলিক নয়")
📝 NCTB ৩৩ — গসাগু (GCD)
a = int(input("প্রথম সংখ্যা: "))
b = int(input("দ্বিতীয় সংখ্যা: "))
x, y = a, b
while y != 0:
    temp = y
    y = x % y
    x = temp
print(f"{a} এবং {b} এর গসাগু = {x}")

lcm = (a * b) // x
print(f"{a} এবং {b} এর লসাগু = {lcm}")
📝 NCTB ৩৪ — ফিবোনাচ্চি সিরিজ
n = int(input("কতটি পদ? "))
a, b = 0, 1
print("ফিবোনাচ্চি সিরিজ:")
for i in range(n):
    print(a, end=" ")
    a, b = b, a + b
📝 NCTB ৩৫ — ধারা (Series) 1+2+...+N
n = int(input("N = "))
sum_1 = n * (n + 1) // 2
print(f"1+2+...+{n} = {sum_1}")

sum_sq = n * (n + 1) * (2*n + 1) // 6
print(f"1²+2²+...+{n}² = {sum_sq}")

sum_cu = (n * (n + 1) // 2) ** 2
print(f"1³+2³+...+{n}³ = {sum_cu}")

⏸️ Break ও Continue — NCTB উদাহরণ

NCTB পাঠ্যসূচি অনুযায়ী break ও continue-এর ব্যবহার:

📝 NCTB ৩৬ — Break উদাহরণ
print("৫ এ গিয়ে থামবে:")
for i in range(1, 11):
    if i == 5:
        print(f"\nব্রেক! {i} এ থামলাম")
        break
    print(i, end=" ")
print("লুপ শেষ")
📝 NCTB ৩৭ — Continue উদাহরণ
print("৩ ও ৭ বাদ দিয়ে:")
for i in range(1, 11):
    if i == 3 or i == 7:
        continue
    print(i, end=" ")
print("\n\nশুধু জোড় সংখ্যা:")
for i in range(1, 11):
    if i % 2 != 0:
        continue
    print(i, end=" ")
📝 NCTB ৩৮ — Break with while
num = 1
while True:
    print(num, end=" ")
    if num >= 8:
        print(f"\n{num} এ ব্রেক!")
        break
    num += 1
print("লুপ শেষ")
📝 NCTB ৩৯ — Continue with while
num = 0
print("৫ এর গুণিতক বাদে:")
while num < 20:
    num += 1
    if num % 5 == 0:
        continue
    print(num, end=" ")
📝 NCTB ৪০ — Prime finder with break
print("১-৫০ এর মধ্যে মৌলিক সংখ্যা:")
for num in range(2, 51):
    is_prime = True
    for i in range(2, int(num**0.5) + 1):
        if num % i == 0:
            is_prime = False
            break
    if is_prime:
        print(num, end=" ")
📝 NCTB ৪১ — List-এ break
fruits = ["আপেল", "কলা", "কমলা", "আঙুর", "পেয়ারা"]
search = "কমলা"
for fruit in fruits:
    if fruit == search:
        print(f"পাওয়া গেছে: {fruit}")
        break
    print(f"খুঁজছি... {fruit} নয়")
else:
    print("পাওয়া যায়নি")
📝 NCTB ৪২ — Nested loop with break
for i in range(1, 6):
    for j in range(1, 6):
        if i * j > 15:
            break
        print(f"{i}x{j}={i*j}", end=" ")
    print()

📝 NCTB — অনুশীলনী (Practice Problems)

NCTB পাঠ্যপুস্তক থেকে অনুশীলনীর কিছু গুরুত্বপূর্ণ সমস্যা ও সমাধান:

📝 NCTB ৪৩ — বর্গ নির্ণয়
n = int(input("একটি সংখ্যা: "))
print(f"{n} এর বর্গ = {n*n}")
print(f"{n} এর বর্গমূল = {n**0.5:.2f}")
print(f"{n} এর ঘন = {n**3}")
print(f"{n} এর ঘনমূল = {n**(1/3):.2f}")
📝 NCTB ৪৪ — সেলসিয়াস-ফারেনহাইট
choice = input("কনভার্ট করুন (C to F বা F to C): ")
if choice.upper() == "C TO F":
    c = float(input("সেলসিয়াস: "))
    f = (c * 9/5) + 32
    print(f"{c}°C = {f}°F")
elif choice.upper() == "F TO C":
    f = float(input("ফারেনহাইট: "))
    c = (f - 32) * 5/9
    print(f"{f}°F = {c:.2f}°C")
else:
    print("ভুল choice")
📝 NCTB ৪৫ — গড় ও শতকরা
subjects = 5
total_marks = 500
print("৫টি বিষয়ের নম্বর দিন:")
sum_marks = 0
for i in range(subjects):
    m = float(input(f"বিষয় {i+1}: "))
    sum_marks += m
avg = sum_marks / subjects
percentage = (sum_marks / total_marks) * 100
print(f"মোট: {sum_marks} / {total_marks}")
print(f"গড়: {avg:.2f}")
print(f"শতকরা: {percentage:.2f}%")
if percentage >= 80: print("গ্রেড: A+")
elif percentage >= 70: print("গ্রেড: A")
elif percentage >= 60: print("গ্রেড: A-")
elif percentage >= 50: print("গ্রেড: B")
elif percentage >= 40: print("গ্রেড: C")
elif percentage >= 33: print("গ্রেড: D")
else: print("ফেল")
📝 NCTB ৪৬ — সংখ্যা গণনা
n = int(input("কতটি সংখ্যা? "))
positive = negative = zero = 0
for i in range(n):
    num = float(input(f"সংখ্যা {i+1}: "))
    if num > 0:
        positive += 1
    elif num < 0:
        negative += 1
    else:
        zero += 1
print(f"ধনাত্মক: {positive}")
print(f"ঋণাত্মক: {negative}")
print(f"শূন্য: {zero}")
📝 NCTB ৪৭ — ন্যাচারাল সংখ্যা যোগ
n = int(input("N = "))
i = 1
sum_n = 0
while i <= n:
    sum_n += i
    i += 1
print(f"১+২+৩+...+{n} = {sum_n}")

i = 1
sum_odd = 0
while i <= n:
    sum_odd += i
    i += 2
print(f"১+৩+৫+... = {sum_odd}")

i = 2
sum_even = 0
while i <= n:
    sum_even += i
    i += 2
print(f"২+৪+৬+... = {sum_even}")
📝 NCTB ৪৮ — List Operations
numbers = []
n = int(input("কতটি সংখ্যা? "))
for i in range(n):
    num = int(input(f"সংখ্যা {i+1}: "))
    numbers.append(num)
print("লিস্ট:", numbers)
print("সর্বোচ্চ:", max(numbers))
print("সর্বনিম্ন:", min(numbers))
print("মোট:", sum(numbers))
print("গড়:", sum(numbers)/len(numbers))
numbers.sort()
print("সাজানো:", numbers)
numbers.reverse()
print("উল্টো:", numbers)
📝 NCTB ৪৯ — Matrix (2D List)
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
print("ম্যাট্রিক্স:")
for row in matrix:
    for val in row:
        print(val, end=" ")
    print()
print("\nকর্ণের যোগফল:")
sum_diag = 0
for i in range(3):
    sum_diag += matrix[i][i]
print(f"প্রধান কর্ণ = {sum_diag}")
📝 NCTB ৫০ — String প্যালিনড্রোম
text = input("একটি শব্দ দিন: ")
if text == text[::-1]:
    print(f"{text} একটি প্যালিনড্রোম")
else:
    print(f"{text} প্যালিনড্রোম নয়")
    
# আরেকটি উদাহরণ
sentence = input("একটি বাক্য দিন: ")
words = sentence.split()
print(f"শব্দ সংখ্যা: {len(words)}")
print(f"অক্ষর সংখ্যা: {len(sentence.replace(' ',''))}")
📝 NCTB ৫১ — Function (ফাংশন)
def add(x, y):
    return x + y
def subtract(x, y):
    return x - y
def multiply(x, y):
    return x * y
def divide(x, y):
    if y != 0:
        return x / y
    return "ভুল!"
a = float(input("প্রথম সংখ্যা: "))
b = float(input("দ্বিতীয় সংখ্যা: "))
print(f"{a} + {b} = {add(a,b)}")
print(f"{a} - {b} = {subtract(a,b)}")
print(f"{a} * {b} = {multiply(a,b)}")
print(f"{a} / {b} = {divide(a,b)}")
📝 NCTB ৫২ — Even/Odd Function
def is_even(n):
    return n % 2 == 0
def is_prime(n):
    if n <= 1: return False
    for i in range(2, int(n**0.5)+1):
        if n % i == 0: return False
    return True
num = int(input("সংখ্যা: "))
if is_even(num):
    print(f"{num} জোড়")
else:
    print(f"{num} বিজোড়")
if is_prime(num):
    print(f"{num} মৌলিক")
else:
    print(f"{num} মৌলিক নয়")
📝 NCTB ৫৩ — Factorial Function (recursive)
def factorial(n):
    if n <= 1:
        return 1
    return n * factorial(n-1)
def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n-1) + fibonacci(n-2)
num = int(input("একটি সংখ্যা: "))
print(f"{num}! = {factorial(num)}")
print(f"Fibonacci({num}) = {fibonacci(num)}")
print(f"\nFibonacci সিরিজ ({num}টি):")
for i in range(num):
    print(fibonacci(i), end=" ")
📝 NCTB ৫৪ — Linear Search
def linear_search(arr, target):
    for i, val in enumerate(arr):
        if val == target:
            return i
    return -1
numbers = [10, 25, 8, 42, 17, 35, 5]
print("লিস্ট:", numbers)
target = int(input("কোন সংখ্যা খুঁজবেন? "))
pos = linear_search(numbers, target)
if pos != -1:
    print(f"{target} পাওয়া গেছে {pos} নম্বর পজিশনে")
else:
    print(f"{target} পাওয়া যায়নি")
📝 NCTB ৫৫ — Bubble Sort
def bubble_sort(arr):
    n = len(arr)
    for i in range(n):
        for j in range(n-i-1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
    return arr
numbers = [64, 34, 25, 12, 22, 11, 90]
print("আগে:", numbers)
sorted_nums = bubble_sort(numbers.copy())
print("পরে:", sorted_nums)
📝 NCTB ৫৬ — Dictionary (অভিধান)
student = {
    "roll": 101,
    "name": "রহিম",
    "bangla": 85,
    "english": 78,
    "math": 92
}
print("Student Info:")
for key, value in student.items():
    print(f"{key}: {value}")
total = student["bangla"] + student["english"] + student["math"]
print(f"মোট: {total}")
print(f"গড়: {total/3:.2f}")
📝 NCTB ৫৭ — Set (সেট)
A = {2, 3, 5, 7, 11}
B = {3, 5, 7, 9, 13}
print("A =", A)
print("B =", B)
print("A∪B =", A | B)
print("A∩B =", A & B)
print("A-B =", A - B)
print("B-A =", B - A)
print("A△B =", A ^ B)
numbers = [2, 3, 2, 5, 3, 7, 5, 11, 7]
print(f"\nDuplicate remove: {list(set(numbers))}")
📝 NCTB ৫৮ — File Write & Read
with open("nctb_output.txt", "w", encoding="utf-8") as f:
    f.write("NCTB Class 9-10 Python\n")
    f.write("প্রোগ্রামিং শিখছি\n")
    for i in range(1, 6):
        f.write(f"লাইন {i}: Hello Python!\n")
print("ফাইলে লেখা হয়েছে!")
with open("nctb_output.txt", "r", encoding="utf-8") as f:
    content = f.read()
    print("ফাইলের বিষয়বস্তু:")
    print(content)
📝 NCTB ৫৯ — File Statistics
filename = "nctb_output.txt"
with open(filename, "r", encoding="utf-8") as f:
    lines = f.readlines()
    words = 0
    chars = 0
    for line in lines:
        words += len(line.split())
        chars += len(line)
print(f"ফাইল: {filename}")
print(f"লাইন সংখ্যা: {len(lines)}")
print(f"শব্দ সংখ্যা: {words}")
print(f"অক্ষর সংখ্যা: {chars}")
📝 NCTB ৬০ — Error Handling
try:
    num1 = int(input("প্রথম সংখ্যা: "))
    num2 = int(input("দ্বিতীয় সংখ্যা: "))
    result = num1 / num2
    print(f"{num1} / {num2} = {result}")
except ValueError:
    print("ত্রুটি: দয়া করে সঠিক সংখ্যা দিন!")
except ZeroDivisionError:
    print("ত্রুটি: ০ দিয়ে ভাগ করা যাবে না!")
except Exception as e:
    print(f"অজানা ত্রুটি: {e}")
else:
    print("কোনো ত্রুটি হয়নি, সফল!")
finally:
    print("প্রোগ্রাম শেষ")
📝 NCTB ৬১ — Nested Loop Star
n = 5
print("আয়তক্ষেত্র:")
for i in range(n):
    for j in range(n):
        print("*", end=" ")
    print()

print("\nডানকোণী ত্রিভুজ:")
for i in range(1, n+1):
    for j in range(i):
        print("*", end=" ")
    print()

print("\nউল্টা ত্রিভুজ:")
for i in range(n, 0, -1):
    for j in range(i):
        print("*", end=" ")
    print()
📝 NCTB ৬২ — Number Pattern
n = 5
print("সংখ্যা প্যাটার্ন ১:")
for i in range(1, n+1):
    for j in range(1, i+1):
        print(j, end=" ")
    print()

print("\nসংখ্যা প্যাটার্ন ২:")
for i in range(1, n+1):
    for j in range(1, i+1):
        print(i, end=" ")
    print()

print("\nসংখ্যা প্যাটার্ন ৩:")
for i in range(1, n+1):
    print(" " * (n-i), end="")
    for j in range(1, i+1):
        print(j, end="")
    print()
📝 NCTB ৬৩ — Sum of Digits
n = int(input("একটি সংখ্যা: "))
temp = n
sum_digits = 0
count_digits = 0
while temp > 0:
    sum_digits += temp % 10
    count_digits += 1
    temp //= 10
print(f"অঙ্কের সংখ্যা: {count_digits}")
print(f"অঙ্কগুলোর যোগফল: {sum_digits}")
print(f"গড়: {sum_digits/count_digits:.2f}")
📝 NCTB ৬৪ — Multiplication Table 1-10
print("পূর্ণ নামতা (১-১০):")
for i in range(1, 11):
    print(f"\n--- {i} এর নামতা ---")
    for j in range(1, 11):
        print(f"{i} x {j} = {i*j}")
📝 NCTB ৬৫ — Vowel Counter
text = input("একটি বাক্য দিন: ").lower()
vowels = "aeiou"
vowel_count = 0
consonant_count = 0
for ch in text:
    if ch.isalpha():
        if ch in vowels:
            vowel_count += 1
        else:
            consonant_count += 1
print(f"স্বরবর্ণ: {vowel_count}")
print(f"ব্যঞ্জনবর্ণ: {consonant_count}")
print(f"মোট অক্ষর: {vowel_count + consonant_count}")

📌 NCTB পাঠ্যসূচি — মূল পয়েন্ট

NCTB ৯ম-১০ম শ্রেণির ICT বইয়ে পাইথনের মৌলিক বিষয়গুলো খুব সুন্দরভাবে সাজানো আছে। ভেরিয়েবল, কন্ডিশন, লুপ, ব্রেক-কন্টিনিউ — এই চারটি বিষয় ভালোভাবে রপ্ত করলেই পাইথনের বেসিক হয়ে যাবে। প্রতিটি টপিকের ১০-১৫টি করে উদাহরণ প্র্যাকটিস করলে যেকোনো পরীক্ষার প্রশ্নের উত্তর দেওয়া যাবে।

অধ্যায় ১৮ ৫০টি শিক্ষানবিশ প্রোগ্রাম — লাইন বাই লাইন ব্যাখ্যা

📖 পরিচিতি

এই অধ্যায়ে ৫০টি সহজ প্রোগ্রাম দেওয়া হয়েছে যা শিক্ষানবিশদের জন্য খুবই উপযোগী। প্রতিটি প্রোগ্রামের প্রতিটি লাইনের পাশে বাংলা ব্যাখ্যা (কমেন্ট) দেওয়া আছে। আপনি প্রতিটি প্রোগ্রাম রান করে দেখুন, নিজে হাতে কলমে লিখুন, এবং আউটপুট বুঝুন।

🎯 কিভাবে ব্যবহার করবেন

  • ▶ Try It — IDE-তে কোড লোড করে রান করুন
  • ✏️ Edit — ইনলাইন এডিটর খুলে কোড পরিবর্তন করে দেখুন
  • 📋 — কোড কপি করুন
  • প্রথমে প্রোগ্রামটি পড়ুন, তারপর নিজে না দেখে লেখার চেষ্টা করুন
📝 প্রোগ্রাম ১: Hello World — প্রথম প্রোগ্রাম
# প্রোগ্রাম: Hello World
# print() ফাংশন স্ক্রিনে আউটপুট দেখায়
print("Hello World!")  # () এর ভিতরে যা লিখব সেটাই স্ক্রিনে দেখাবে
print("স্বাগতম পাইথন জগতে!")  # বাংলাও প্রিন্ট করা যায়
📝 প্রোগ্রাম ২: দুটি সংখ্যা যোগ
# প্রোগ্রাম: দুটি সংখ্যা যোগ করা
a = 10  # a নামে একটি ভেরিয়েবলে 10 রাখা হয়েছে
b = 20  # b নামে একটি ভেরিয়েবলে 20 রাখা হয়েছে
sum = a + b  # a আর b এর যোগফল sum ভেরিয়েবলে রাখা হয়েছে
print("যোগফল:", sum)  # যোগফল স্ক্রিনে দেখানো হচ্ছে
📝 প্রোগ্রাম ৩: ব্যবহারকারীর কাছ থেকে ইনপুট নেওয়া
# প্রোগ্রাম: ব্যবহারকারীর ইনপুট
# input() ফাংশন ব্যবহারকারীর কাছ থেকে কিছু লেখা নেয়
name = input("তোমার নাম কী? ")  # ইউজার যা লিখবে সেটা name-এ রাখা হবে
print("স্বাগতম,", name)  # ইউজারের নামসহ স্বাগতম বার্তা
📝 প্রোগ্রাম ৪: ব্যবহারকারীর বয়স নির্ণয়
# প্রোগ্রাম: বয়স নির্ণয়
# int() দিয়ে ইনপুটকে পূর্ণসংখ্যায় রূপান্তর করা হয়
birth_year = int(input("তোমার জন্মসাল কী? "))  # ইউজারের জন্মসাল নেওয়া
age = 2026 - birth_year  # বর্তমান বছর থেকে জন্মসাল বাদ দিয়ে বয়স
print("তোমার বয়স:", age, "বছর")  # বয়স প্রিন্ট
📝 প্রোগ্রাম ৫: জোড় না বিজোড়?
# প্রোগ্রাম: জোড় না বিজোড়
num = int(input("একটি সংখ্যা দাও: "))  # ইউজারের কাছ থেকে সংখ্যা নেওয়া
# % অপারেটর ২ দিয়ে ভাগশেষ বের করে
if num % 2 == 0:  # যদি ভাগশেষ ০ হয় তাহলে জোড়
    print(num, "একটি জোড় সংখ্যা")
else:  # না হলে বিজোড়
    print(num, "একটি বিজোড় সংখ্যা")
📝 প্রোগ্রাম ৬: বড় সংখ্যা নির্ণয়
# প্রোগ্রাম: বড় সংখ্যা নির্ণয়
# if-elif-else দিয়ে শর্ত পরীক্ষা
a = int(input("প্রথম সংখ্যা: "))  # প্রথম সংখ্যা ইনপুট
b = int(input("দ্বিতীয় সংখ্যা: "))  # দ্বিতীয় সংখ্যা ইনপুট
if a > b:  # যদি a বড় হয়
    print(a, "বড়")
elif b > a:  # যদি b বড় হয়
    print(b, "বড়")
else:  # সমান হলে
    print("দুটি সংখ্যা সমান")
📝 প্রোগ্রাম ৭: লুপ দিয়ে ১ থেকে ১০ প্রিন্ট
# প্রোগ্রাম: ১ থেকে ১০ পর্যন্ত সংখ্যা প্রিন্ট
# for লুপ বারবার কাজ করে
for i in range(1, 11):  # range(1,11) = 1,2,3,...,10
    print(i, end=" ")  # end=" " একই লাইনে প্রিন্ট করে
print()  # নতুন লাইনে যাওয়ার জন্য
📝 প্রোগ্রাম ৮: নাম বারবার প্রিন্ট
# প্রোগ্রাম: নাম ৫ বার প্রিন্ট
name = input("তোমার নাম কী? ")  # ইউজারের নাম নেওয়া
for i in range(5):  # লুপ ৫ বার চলবে
    print(i+1, ". ", name, sep="")  # নাম বারবার প্রিন্ট
📝 প্রোগ্রাম ৯: ১-১০০ এর মধ্যে জোড় সংখ্যা
# প্রোগ্রাম: ১ থেকে ১০০ পর্যন্ত জোড় সংখ্যা
print("জোড় সংখ্যা সমূহ:")
for i in range(2, 101, 2):  # 2 থেকে শুরু, 2 করে বাড়িয়ে 100 পর্যন্ত
    print(i, end=" ")  # একই লাইনে প্রিন্ট
print()
📝 প্রোগ্রাম ১০: ১-১০০ এর মধ্যে বিজোড় সংখ্যা
# প্রোগ্রাম: ১ থেকে ১০০ পর্যন্ত বিজোড় সংখ্যা
print("বিজোড় সংখ্যা সমূহ:")
for i in range(1, 101, 2):  # 1 থেকে শুরু, 2 করে বাড়িয়ে 100 পর্যন্ত
    print(i, end=" ")
print()
📝 প্রোগ্রাম ১১: গুণন সারণি
# প্রোগ্রাম: গুণন সারণি
num = int(input("কোন সংখ্যার সারণি চাও? "))  # ইউজার যার সারণি চায়
for i in range(1, 11):  # 1 থেকে 10 পর্যন্ত
    print(num, "x", i, "=", num * i)  # num x i = num*i
📝 প্রোগ্রাম ১২: ফ্যাক্টোরিয়াল
# প্রোগ্রাম: ফ্যাক্টোরিয়াল
# 5! = 5*4*3*2*1 = 120
n = int(input("একটি সংখ্যা দাও: "))
fact = 1  # ফ্যাক্টোরিয়ালের শুরু 1
for i in range(1, n+1):  # 1 থেকে n পর্যন্ত লুপ
    fact = fact * i  # প্রতিবার গুণ করা হচ্ছে
print(n, "এর ফ্যাক্টোরিয়াল =", fact)
📝 প্রোগ্রাম ১৩: ফিবোনাচ্চি সিরিজ
# প্রোগ্রাম: ফিবোনাচ্চি সিরিজ
# 0, 1, 1, 2, 3, 5, 8, 13, ...
n = int(input("কতটি সংখ্যা চাও? "))  # কতটি সংখ্যা দেখাবে
a, b = 0, 1  # প্রথম দুটি সংখ্যা
print("ফিবোনাচ্চি সিরিজ:")
for i in range(n):  # n বার লুপ
    print(a, end=" ")  # বর্তমান সংখ্যা প্রিন্ট
    a, b = b, a + b  # পরবর্তী সংখ্যা বের করা
print()
📝 প্রোগ্রাম ১৪: মৌলিক সংখ্যা নির্ণয়
# প্রোগ্রাম: সংখ্যাটি মৌলিক কিনা
n = int(input("একটি সংখ্যা দাও: "))
count = 0  # কতটি ভাগ যায় তার count
for i in range(1, n+1):  # 1 থেকে n পর্যন্ত
    if n % i == 0:  # যদি i দিয়ে n বিভাজ্য হয়
        count += 1  # count বাড়াও
if count == 2:  # মৌলিক সংখ্যার ২টি ভাজক: 1 ও নিজে
    print(n, "একটি মৌলিক সংখ্যা")
else:
    print(n, "একটি মৌলিক সংখ্যা নয়")
📝 প্রোগ্রাম ১৫: লিস্ট তৈরি ও অ্যাক্সেস
# প্রোগ্রাম: লিস্ট তৈরি ও অ্যাক্সেস
fruits = ["আপেল", "কলা", "আম", "লিচু"]  # স্ট্রিং এর লিস্ট
print("প্রথম ফল:", fruits[0])  # 0 ইনডেক্স = প্রথম উপাদান
print("শেষ ফল:", fruits[-1])  # -1 ইনডেক্স = শেষ উপাদান
print("দ্বিতীয় ফল:", fruits[1])  # 1 ইনডেক্স = দ্বিতীয় উপাদান
📝 প্রোগ্রাম ১৬: লিস্টের যোগফল
# প্রোগ্রাম: লিস্টের যোগফল বের করা
numbers = [10, 20, 30, 40, 50]  # সংখ্যার লিস্ট
total = 0  # যোগফল শুরুতে 0
for num in numbers:  # লিস্টের প্রতিটি সংখ্যার জন্য
    total = total + num  # প্রতিবার যোগ করা
print("লিস্ট:", numbers)
print("যোগফল:", total)
📝 প্রোগ্রাম ১৭: লিস্ট থেকে বড় সংখ্যা
# প্রোগ্রাম: লিস্ট থেকে সবচেয়ে বড় সংখ্যা
numbers = [45, 12, 89, 33, 71, 56]  # সংখ্যার লিস্ট
largest = numbers[0]  # প্রথম সংখ্যাকে সবচেয়ে বড় ধরে নেওয়া
for num in numbers:  # প্রতিটি সংখ্যার জন্য
    if num > largest:  # যদি কোনো সংখ্যা বড় হয়
        largest = num  # সেটাকে largest এ রাখা
print("লিস্ট:", numbers)
print("সবচেয়ে বড় সংখ্যা:", largest)
📝 প্রোগ্রাম ১৮: লিস্ট সর্টিং
# প্রোগ্রাম: লিস্ট সাজানো
numbers = [45, 12, 89, 33, 71, 56]  # অগোছালো লিস্ট
print("আগে:", numbers)
numbers.sort()  # sort() ছোট থেকে বড় সাজায়
print("ছোট থেকে বড়:", numbers)
numbers.sort(reverse=True)  # reverse=True বড় থেকে ছোট
print("বড় থেকে ছোট:", numbers)
📝 প্রোগ্রাম ১৯: স্ট্রিং রিভার্স
# প্রোগ্রাম: স্ট্রিং উল্টানো
text = input("একটি লেখা দাও: ")  # ইউজারের কাছ থেকে লেখা
reversed_text = text[::-1]  # [::-1] দিয়ে পুরো স্ট্রিং উল্টানো
print("উল্টানো:", reversed_text)
📝 প্রোগ্রাম ২০: প্যালিনড্রোম চেক
# প্রোগ্রাম: প্যালিনড্রোম চেক
# প্যালিনড্রোম = উল্টো করেও একই থাকে (যেমন: madam, 121)
text = input("একটি শব্দ দাও: ")
if text == text[::-1]:  # মূল ও উল্টানো একই কিনা
    print(text, "একটি প্যালিনড্রোম")
else:
    print(text, "প্যালিনড্রোম নয়")
📝 প্রোগ্রাম ২১: স্বরবর্ণ গণনা
# প্রোগ্রাম: একটি বাক্যে স্বরবর্ণ গণনা
sentence = input("একটি বাক্য দাও: ")  # ইউজারের বাক্য
vowels = "aeiouAEIOU"  # সব স্বরবর্ণ (ছোট ও বড় হাতের)
count = 0  # শুরুতে স্বরবর্ণের সংখ্যা 0
for ch in sentence:  # বাক্যের প্রতিটি অক্ষরের জন্য
    if ch in vowels:  # অক্ষরটি স্বরবর্ণ কিনা
        count += 1  # স্বরবর্ণ পেলে count বাড়াও
print("স্বরবর্ণের সংখ্যা:", count)
📝 প্রোগ্রাম ২২: ফাংশন দিয়ে যোগ
# প্রোগ্রাম: ফাংশন দিয়ে দুটি সংখ্যা যোগ
def add(a, b):  # add() ফাংশন ডিফাইন, a ও b প্যারামিটার
    '''দুটি সংখ্যা যোগ করে'''
    return a + b  # return যোগফল ফেরত দেয়

# ফাংশন কল করা
result = add(15, 25)  # 15 ও 25 যোগ করতে add() কল
print("১৫ + ২৫ =", result)
📝 প্রোগ্রাম ২৩: ফাংশন দিয়ে বর্গ
# প্রোগ্রাম: ফাংশন দিয়ে বর্গ নির্ণয়
def square(n):  # square() ফাংশন, n প্যারামিটার
    '''একটি সংখ্যার বর্গ নির্ণয়'''
    return n * n  # n * n = n²

num = int(input("একটি সংখ্যা দাও: "))
print(num, "এর বর্গ =", square(num))
📝 প্রোগ্রাম ২৪: ফাংশন দিয়ে জোড়-বিজোড়
# প্রোগ্রাম: ফাংশন দিয়ে জোড়-বিজোড় নির্ণয়
def is_even(n):  # is_even() ফাংশন
    '''সংখ্যাটি জোড় হলে True ফেরত দেয়'''
    return n % 2 == 0  # ২ দিয়ে ভাগশেষ ০ হলে True

num = int(input("একটি সংখ্যা দাও: "))
if is_even(num):  # is_even() কল করে চেক
    print(num, "জোড়")
else:
    print(num, "বিজোড়")
📝 প্রোগ্রাম ২৫: এলোমেলো সংখ্যা (random)
# প্রোগ্রাম: random মডিউল দিয়ে এলোমেলো সংখ্যা
import random  # random মডিউল ইম্পোর্ট

print("১-১০০ এর মধ্যে এলোমেলো সংখ্যা:")
for i in range(5):  # ৫টি এলোমেলো সংখ্যা
    print(random.randint(1, 100), end=" ")  # 1-100 এর মধ্যে
print()
📝 প্রোগ্রাম ২৬: Dice Roll
# প্রোগ্রাম: Dice Roll সিমুলেশন
import random  # random মডিউল

dice1 = random.randint(1, 6)  # প্রথম ডাইস 1-6
dice2 = random.randint(1, 6)  # দ্বিতীয় ডাইস 1-6
print("প্রথম ডাইস:", dice1)
print("দ্বিতীয় ডাইস:", dice2)
print("মোট:", dice1 + dice2)
📝 প্রোগ্রাম ২৭: গেস দ্যা নাম্বার গেম
# প্রোগ্রাম: সংখ্যা অনুমান করার খেলা
import random

secret = random.randint(1, 50)  # গোপন সংখ্যা 1-50
guess = None  # ইউজারের guess শুরুতে কিছু না
attempts = 0  # attempt count

while guess != secret:  # যতক্ষণ না মিলবে
    guess = int(input("একটি সংখ্যা অনুমান করো (1-50): "))
    attempts += 1
    if guess < secret:
        print("ছোট! বড় সংখ্যা চেষ্টা করো")
    elif guess > secret:
        print("বড়! ছোট সংখ্যা চেষ্টা করো")
    else:
        print("সঠিক! 🎉", attempts, "চেষ্টায় পেয়েছো")
📝 প্রোগ্রাম ২৮: BMI ক্যালকুলেটর
# প্রোগ্রাম: BMI (বডি মাস ইনডেক্স) ক্যালকুলেটর
weight = float(input("ওজন কত?(kg): "))  # কেজিতে ওজন
height = float(input("উচ্চতা কত?(m): "))  # মিটারে উচ্চতা
bmi = weight / (height ** 2)  # BMI = ওজন / (উচ্চতা)^২
print("তোমার BMI:", round(bmi, 2))  # দশমিকের পর ২ ঘর
if bmi < 18.5:
    print("ওজন কম")
elif bmi < 25:
    print("স্বাভাবিক")
elif bmi < 30:
    print("অতিরিক্ত ওজন")
else:
    print("মোটা")
📝 প্রোগ্রাম ২৯: ক্যালকুলেটর (যোগ, বিয়োগ, গুণ, ভাগ)
# প্রোগ্রাম: সাধারণ ক্যালকুলেটর
a = float(input("প্রথম সংখ্যা: "))
op = input("অপারেটর (+, -, *, /): ")  # অপারেটর ইনপুট
b = float(input("দ্বিতীয় সংখ্যা: "))

if op == "+":
    print("ফলাফল:", a + b)
elif op == "-":
    print("ফলাফল:", a - b)
elif op == "*":
    print("ফলাফল:", a * b)
elif op == "/":
    if b != 0:  # 0 দিয়ে ভাগ করা যাবে না
        print("ফলাফল:", a / b)
    else:
        print("ত্রুটি: 0 দিয়ে ভাগ করা যাবে না")
else:
    print("অজানা অপারেটর")
📝 প্রোগ্রাম ৩০: সেলসিয়াস থেকে ফারেনহাইট কনভার্টার
# প্রোগ্রাম: সেলসিয়াস → ফারেনহাইট
c = float(input("সেলসিয়াস তাপমাত্রা: "))  # সেলসিয়াস ইনপুট
f = (c * 9/5) + 32  # ফারেনহাইটের সূত্র
print(c, "°C =", round(f, 2), "°F")  # দশমিকের পর ২ ঘর
📝 প্রোগ্রাম ৩১: ২D লিস্ট (ম্যাট্রিক্স)
# প্রোগ্রাম: ২D লিস্ট বা ম্যাট্রিক্স
matrix = [  # ৩x৩ ম্যাট্রিক্স
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
print("ম্যাট্রিক্স:")
for row in matrix:  # প্রতিটি সারির জন্য
    for val in row:  # প্রতিটি মানের জন্য
        print(val, end=" ")
    print()  # নতুন সারিতে
📝 প্রোগ্রাম ৩২: ডিকশনারি বেসিক
# প্রোগ্রাম: ডিকশনারি তৈরি ও ব্যবহার
student = {  # ডিকশনারি = কী:ভ্যালু জোড়া
    "name": "রহিম",
    "roll": 101,
    "grade": "A",
    "subjects": ["বাংলা", "ইংরেজি", "গণিত"]
}
print("ছাত্রের নাম:", student["name"])
print("রোল:", student["roll"])
print("গ্রেড:", student["grade"])
print("বিষয়:", student["subjects"])
📝 প্রোগ্রাম ৩৩: ছাত্রের গ্রেড নির্ণয়
# প্রোগ্রাম: নম্বর অনুযায়ী গ্রেড
marks = float(input("তোমার নম্বর কত? (0-100): "))

if marks >= 80:
    grade = "A+"
elif marks >= 70:
    grade = "A"
elif marks >= 60:
    grade = "A-"
elif marks >= 50:
    grade = "B"
elif marks >= 40:
    grade = "C"
elif marks >= 33:
    grade = "D"
else:
    grade = "F"

print("তোমার গ্রেড:", grade)
📝 প্রোগ্রাম ৩৪: স্টুডেন্ট ম্যানেজমেন্ট সিস্টেম
# প্রোগ্রাম: ছাত্রদের তথ্য সংরক্ষণ
students = []  # খালি লিস্ট

while True:
    name = input("ছাত্রের নাম (বা শেষ করতে 'q'): ")
    if name == 'q':
        break
    roll = input("রোল নাম্বার: ")
    students.append({"name": name, "roll": roll})  # ডিকশনারি যোগ

print("\nছাত্রদের তালিকা:")
for s in students:  # প্রতিটি ছাত্রের জন্য
    print(f"রোল: {s['roll']}, নাম: {s['name']}")
📝 প্রোগ্রাম ৩৫: ফাইলে লেখা
# প্রোগ্রাম: ফাইলে কিছু লেখা
# 'w' মোড = write (ফাইল তৈরি বা ওভাররাইট)
with open("note.txt", "w", encoding="utf-8") as f:
    f.write("পাইথন প্রোগ্রামিং শিখছি!\n")  # ফাইলে লেখা
    f.write("এটা আমার প্রথম ফাইল।\n")
print("ফাইল সফলভাবে তৈরি হয়েছে!")
📝 প্রোগ্রাম ৩৬: ফাইল থেকে পড়া
# প্রোগ্রাম: ফাইল থেকে পড়া
try:  # ফাইল না থাকলে ত্রুটি এড়াতে try
    with open("note.txt", "r", encoding="utf-8") as f:
        content = f.read()  # পুরো ফাইল পড়া
    print("ফাইলের বিষয়বস্তু:")
    print(content)
except FileNotFoundError:
    print("ফাইলটি পাওয়া যায়নি। আগে ফাইল তৈরি করুন।")
📝 প্রোগ্রাম ৩৭: Exception Handling (try-except)
# প্রোগ্রাম: ত্রুটি হ্যান্ডলিং
try:
    num = int(input("একটি সংখ্যা দাও: "))  # ভুল ইনপুট দিলে
    result = 100 / num  # 0 দিলে ভাগের ত্রুটি
    print("ফলাফল:", result)
except ValueError:  # সংখ্যা না দিলে
    print("ত্রুটি: দয়া করে একটি সংখ্যা দিন")
except ZeroDivisionError:  # 0 দিলে
    print("ত্রুটি: 0 দিয়ে ভাগ করা যাবে না")
finally:  # সবসময় চলবে
    print("প্রোগ্রাম শেষ")
📝 প্রোগ্রাম ৩৮: বর্তমান সময় ও তারিখ
# প্রোগ্রাম: বর্তমান সময় ও তারিখ
from datetime import datetime  # datetime মডিউল থেকে datetime ইম্পোর্ট

now = datetime.now()  # বর্তমান সময়
print("আজকের তারিখ:", now.strftime("%Y-%m-%d"))  # বছর-মাস-দিন
print("বর্তমান সময়:", now.strftime("%H:%M:%S"))  # ঘণ্টা:মিনিট:সেকেন্ড
print("পূর্ণ তথ্য:", now.strftime("%A, %d %B %Y"))  # ইংরেজিতে পূর্ণ
📝 প্রোগ্রাম ৩৯: এলোমেলো পাসওয়ার্ড জেনারেটর
# প্রোগ্রাম: এলোমেলো পাসওয়ার্ড তৈরি
import random
import string

length = int(input("পাসওয়ার্ডের দৈর্ঘ্য কত? "))
# সব ধরনের অক্ষর: বড় হাতের, ছোট হাতের, ডিজিট, চিহ্ন
chars = string.ascii_letters + string.digits + "!@#$%^&*"
password = ""  # শুরুতে খালি
for i in range(length):
    password = password + random.choice(chars)  # এলোমেলো অক্ষর
print("তোমার পাসওয়ার্ড:", password)
📝 প্রোগ্রাম ৪০: শব্দ গণনা
# প্রোগ্রাম: একটি বাক্যে মোট শব্দ সংখ্যা
sentence = input("একটি বাক্য দাও: ")
words = sentence.split()  # split() স্পেস দিয়ে আলাদা করে
print("মোট শব্দ:", len(words))  # len() দিয়ে words-এর দৈর্ঘ্য
📝 প্রোগ্রাম ৪১: সরল সুদ নির্ণয়
# প্রোগ্রাম: সরল সুদ নির্ণয়
P = float(input("আসলের পরিমাণ (P): "))  # মূলধন
R = float(input("সুদের হার (R%): "))  # সুদের হার
T = float(input("সময় (T বছর): "))  # সময়

SI = (P * R * T) / 100  # সরল সুদের সূত্র
total = P + SI  # মোট টাকা = আসল + সুদ
print("সরল সুদ (SI):", round(SI, 2))
print("মোট টাকা:", round(total, 2))
📝 প্রোগ্রাম ৪২: গড় নির্ণয়
# প্রোগ্রাম: কিছু সংখ্যার গড়
numbers = []  # খালি লিস্ট
n = int(input("কতটি সংখ্যা? "))  # কতগুলি সংখ্যা

for i in range(n):
    num = float(input(f"সংখ্যা {i+1}: "))  # প্রতিটি সংখ্যা
    numbers.append(num)  # লিস্টে যোগ

avg = sum(numbers) / n  # যোগফল / সংখ্যা = গড়
print("সংখ্যা:", numbers)
print("গড়:", round(avg, 2))
📝 প্রোগ্রাম ৪৩: সর্বোচ্চ ও সর্বনিম্ন
# প্রোগ্রাম: সর্বোচ্চ ও সর্বনিম্ন সংখ্যা
numbers = []  # খালি লিস্ট
n = int(input("কতটি সংখ্যা? "))

for i in range(n):
    num = float(input(f"সংখ্যা {i+1}: "))
    numbers.append(num)

print("সংখ্যা:", numbers)
print("সর্বোচ্চ:", max(numbers))  # max() বড়টি দেয়
print("সর্বনিম্ন:", min(numbers))  # min() ছোটটি দেয়
📝 প্রোগ্রাম ৪৪: সংখ্যা উল্টানো
# প্রোগ্রাম: সংখ্যা উল্টানো (যেমন: 123 → 321)
n = int(input("একটি সংখ্যা দাও: "))
rev = 0  # উল্টানো সংখ্যা
temp = n  # মূল সংখ্যা temp-এ রাখা
while temp > 0:
    digit = temp % 10  # শেষ ডিজিট বের করা
    rev = rev * 10 + digit  # rev-এ যোগ করা
    temp = temp // 10  # শেষ ডিজিট বাদ দেওয়া
print(n, "উল্টালে =", rev)
📝 প্রোগ্রাম ৪৫: অ্যানাগ্রাম চেক
# প্রোগ্রাম: দুটি শব্দ অ্যানাগ্রাম কিনা
# অ্যানাগ্রাম = একই অক্ষর ভিন্ন বিন্যাস (যেমন: eat, tea)
w1 = input("প্রথম শব্দ: ").lower()  # ছোট হাতের করে নেওয়া
w2 = input("দ্বিতীয় শব্দ: ").lower()

if sorted(w1) == sorted(w2):  # sorted() অক্ষর সাজায়
    print("শব্দ দুটি অ্যানাগ্রাম")
else:
    print("শব্দ দুটি অ্যানাগ্রাম নয়")
📝 প্রোগ্রাম ৪৬: দুটি লিস্ট একত্রিত করা
# প্রোগ্রাম: দুটি লিস্ট একত্রিত করা
list1 = [1, 2, 3, 4]  # প্রথম লিস্ট
list2 = [5, 6, 7, 8]  # দ্বিতীয় লিস্ট
merged = list1 + list2  # + দিয়ে লিস্ট জোড়া
print("প্রথম লিস্ট:", list1)
print("দ্বিতীয় লিস্ট:", list2)
print("একত্রিত:", merged)
📝 প্রোগ্রাম ৪৭: ডুপ্লিকেট রিমুভ
# প্রোগ্রাম: লিস্ট থেকে ডুপ্লিকেট সরানো
numbers = [1, 2, 2, 3, 4, 4, 5, 6, 6, 7]
print("আগে:", numbers)
unique = list(set(numbers))  # set() ডুপ্লিকেট সরায়
print("ডুপ্লিকেট ছাড়া:", unique)
📝 প্রোগ্রাম ৪৮: ক্লাস ও অবজেক্ট (OOP)
# প্রোগ্রাম: ক্লাস ও অবজেক্ট
class Student:  # Student নামে ক্লাস
    def __init__(self, name, roll):  # কনস্ট্রাক্টর
        self.name = name  # অ্যাট্রিবিউট
        self.roll = roll

    def show(self):  # মেথড
        print(f"নাম: {self.name}, রোল: {self.roll}")

s1 = Student("রহিম", 101)  # অবজেক্ট তৈরি
s2 = Student("সাদিয়া", 102)
s1.show()  # মেথড কল
s2.show()
📝 প্রোগ্রাম ৪৯: ইনহেরিটেন্স (OOP)
# প্রোগ্রাম: ইনহেরিটেন্স
class Animal:  # প্যারেন্ট ক্লাস
    def __init__(self, name):
        self.name = name
    def speak(self):
        print(f"{self.name} কিছু বলছে")

class Dog(Animal):  # চাইল্ড ক্লাস (Animal থেকে নেওয়া)
    def speak(self):
        print(f"{self.name} বলছে: Ghew Ghew!")

class Cat(Animal):  # আরেকটি চাইল্ড ক্লাস
    def speak(self):
        print(f"{self.name} বলছে: Meow Meow!")

a = Dog("ববি")  # Dog-এর অবজেক্ট
b = Cat("পুসি")  # Cat-এর অবজেক্ট
a.speak()
b.speak()
📝 প্রোগ্রাম ৫০: Tkinter GUI — একটি সাধারণ উইন্ডো
# প্রোগ্রাম: Tkinter GUI বেসিক
# import tkinter as tk  # অনলাইন IDE-তে কাজ নাও করতে পারে

# Tkinter দিয়ে একটি সাধারণ উইন্ডো তৈরি
print("Tkinter GUI তৈরি করতে নিচের কোড লোকাল Python এ চালান:")
print('''import tkinter as tk
root = tk.Tk()
root.title("আমার প্রথম GUI")
root.geometry("300x200")
label = tk.Label(root, text="স্বাগতম পাইথন GUI!")
label.pack()
btn = tk.Button(root, text="ক্লিক করুন")
btn.pack()
root.mainloop()''')

📌 শিক্ষানবিশের জন্য টিপস

এই ৫০টি প্রোগ্রাম বারবার প্র্যাকটিস করুন। প্রথমে প্রতিটি প্রোগ্রাম কপি করে রান করুন। তারপর নিজে নিজে লিখুন। কোনো প্রোগ্রাম বুঝতে সমস্যা হলে কমেন্টগুলো পড়ুন। সবগুলো আয়ত্ত করতে পারলে আপনি পাইথনের বেসিক প্রোগ্রামিংয়ে দক্ষ হয়ে যাবেন। 🚀