Python দ্রুত ঝালাই

Variable, type, condition, loop, f-string, match

রোডম্যাপের মাস ১পড়তে প্রায় ১৮ মিনিট

তুমি Python এর basic জানো, আর Dart এ দুই বছর কাজ করেছো। তাই এই অধ্যায়ে একদম শুরু থেকে শেখাবো না। বরং দ্রুত সব ঝালিয়ে নেবো, Dart এর সাথে তুলনা করে দেখাবো কোথায় মিল আর কোথায় অমিল, আর সেই জায়গাগুলোয় বেশি সময় দেবো যেখানে Dart থেকে আসা মানুষ সাধারণত ভুল করে।

প্রতিটা উদাহরণ নিজে type করে চালাবে। শুধু পড়লে হবে না।

#Dart আর Python: এক নজরে পার্থক্য

বিষয় Dart Python
Block { } দিয়ে Indentation (৪ space) দিয়ে
লাইনের শেষ ; লাগে কিছু লাগে না
Variable var, final, int x = 5 শুধু x = 5
Type Compile এর সময় check চালানোর সময়, তবে type hint দিয়ে আগে check করা যায়
null null None
true/false true, false True, False (বড় হাতের)
এবং/অথবা/না &&, ||, ! and, or, not
String জোড়া 'Hi $name' f"Hi {name}"
List List<int> list[int]
Map Map<String, int> dict[str, int]
Function int add(int a, int b) {...} def add(a: int, b: int) -> int:
Comment // #

#Variable আর type

Python এ variable হলো একটা নাম, যেটা কোনো value কে নির্দেশ করে। Type লিখতে হয় না, value দেখেই Python বুঝে নেয়।

Python
name = "Rahim"          # str
age = 26                # int
height = 5.7            # float
is_developer = True     # bool
salary = None           # None, মানে "কিছু নেই"

print(type(age))        # <class 'int'>

পরে আমরা type hint ব্যবহার করবো, যা Dart এর মতো নিরাপত্তা দেয়:

Python
name: str = "Rahim"
age: int = 26

Type hint Python নিজে চালানোর সময় check করে না, কিন্তু VS Code (Pylance) আর type checker ভুল ধরিয়ে দেয়। Type Hint অধ্যায়ে বিস্তারিত আছে।

#সংখ্যা নিয়ে কিছু বিশেষ কথা

Python
print(7 / 2)     # 3.5   → সবসময় float দেয়
print(7 // 2)    # 3     → পূর্ণসংখ্যার ভাগ (Dart এর ~/)
print(7 % 2)     # 1     → ভাগশেষ
print(2 ** 10)   # 1024  → ঘাত (power)

big = 10 ** 30   # Python এর int যত বড় দরকার তত বড় হতে পারে
print(big)

print(0.1 + 0.2)         # 0.30000000000000004 😮

#String

Python
name = "Karim"
city = 'Dhaka'                      # ' আর " একই
bio = """একাধিক লাইনের
লেখা এভাবে লেখা যায়"""

# f-string: Dart এর '$name' এর মতো
print(f"{name} থাকে {city} তে")
print(f"২ + ৩ = {2 + 3}")
price = 1234567.891
print(f"দাম: {price:,.2f} টাকা")    # দাম: 1,234,567.89 টাকা

# দরকারি method
email = "  Karim@Example.COM  "
print(email.strip().lower())        # karim@example.com
print("a,b,c".split(","))           # ['a', 'b', 'c']
print("-".join(["2026", "10", "29"]))  # 2026-10-29
print("hello".replace("l", "L"))    # heLLo
print("python".startswith("py"))    # True
print("FastAPI" in "I love FastAPI")  # True

#Slicing: Python এর শক্তিশালী একটা জিনিস

Python
text = "Bangladesh"
#       0123456789

print(text[0])      # B
print(text[-1])     # h  → শেষ থেকে গোনা
print(text[0:6])    # Bangla  → ০ থেকে ৬ এর আগ পর্যন্ত
print(text[6:])     # desh
print(text[:3])     # Ban
print(text[::-1])   # hsedalgnaB  → উল্টো

Slicing list এও একইভাবে কাজ করে। মনে রাখো: [start:end] এ end অন্তর্ভুক্ত না।

String immutable, মানে বদলানো যায় না। text.upper() নতুন string দেয়, পুরনোটা বদলায় না।

#True/False এর হিসাব (truthiness)

Python এ শুধু True/False না, যেকোনো value কে condition হিসেবে ব্যবহার করা যায়। এই value গুলো False ধরা হয়:

Python
False, None, 0, 0.0, "", [], {}, set()

বাকি সব True। তাই Python এ এভাবে লেখা স্বাভাবিক:

Python
items = []
if not items:
    print("Cart খালি")

name = ""
display = name or "Guest"     # name খালি হলে "Guest"
print(display)                # Guest

#== বনাম is

Python
a = [1, 2, 3]
b = [1, 2, 3]
print(a == b)   # True  → value সমান
print(a is b)   # False → একই object না

x = None
print(x is None)  # None এর সাথে তুলনায় সবসময় is ব্যবহার করো

নিয়ম: value তুলনায় ==, আর None, True, False এর সাথে তুলনায় is।

#Condition

Python
score = 78

if score >= 80:
    grade = "A+"
elif score >= 70:
    grade = "A"
elif score >= 60:
    grade = "A-"
else:
    grade = "F"

# এক লাইনে (Dart এর ternary condition ? a : b এর মতো)
status = "পাস" if score >= 33 else "ফেল"

# কয়েকটা condition একসাথে
age = 25
if 18 <= age < 60:          # Python এ এভাবে chain করা যায়
    print("কাজের বয়স")

#Loop

Python
# range দিয়ে
for i in range(5):            # 0, 1, 2, 3, 4
    print(i)

for i in range(2, 10, 2):     # 2, 4, 6, 8
    print(i)

# list এর উপর
fruits = ["আম", "জাম", "কাঁঠাল"]
for fruit in fruits:
    print(fruit)

# index সহ দরকার হলে enumerate (range(len(...)) লিখবে না)
for i, fruit in enumerate(fruits, start=1):
    print(f"{i}. {fruit}")

# দুইটা list একসাথে
names = ["Rahim", "Karim"]
scores = [85, 92]
for name, score in zip(names, scores):
    print(f"{name}: {score}")

# while
balance = 1000
while balance > 0:
    balance -= 300
    print(f"বাকি: {balance}")

break loop থামায়, continue পরের ঘুরে চলে যায়। Dart এর মতোই।

#for ... else: Python এর একটা অদ্ভুত কিন্তু কাজের জিনিস

Python
users = ["ali", "sara", "rafi"]
target = "nila"

for u in users:
    if u == target:
        print("পাওয়া গেছে")
        break
else:
    # loop break ছাড়া শেষ হলে এটা চলে
    print("পাওয়া যায়নি")

#match: Dart এর switch এর চেয়েও শক্তিশালী

Python
def handle(status_code: int) -> str:
    match status_code:
        case 200 | 201:
            return "সফল"
        case 401:
            return "আবার login করো"
        case 404:
            return "পাওয়া যায়নি"
        case code if code >= 500:
            return "Server এ সমস্যা"
        case _:
            return "অজানা"

print(handle(503))   # Server এ সমস্যা

match data এর গঠন (structure) দেখেও মেলাতে পারে:

Python
event = {"type": "order", "id": 42, "amount": 550}

match event:
    case {"type": "order", "id": order_id}:
        print(f"নতুন order #{order_id}")
    case {"type": "refund", "id": order_id}:
        print(f"Refund #{order_id}")

#User থেকে input আর type বদল

Python
raw = input("তোমার বয়স? ")     # input সবসময় str দেয়
age = int(raw)                  # str → int
print(f"১০ বছর পর বয়স হবে {age + 10}")

print(int("42"), float("3.5"), str(100), bool(""))  # 42 3.5 100 False

int("abc") দিলে ValueError হবে। এটা কীভাবে সামলাতে হয় সেটা Error Handling অধ্যায়ে দেখবো।

#Indentation: সবচেয়ে বড় পার্থক্য

Python এ { } নেই। কোন লাইন কোন block এর ভেতরে, সেটা বোঝায় indentation। নিয়ম হলো ৪টা space।

Python
for i in range(3):
    print("loop এর ভেতরে")
    if i == 1:
        print("if এর ভেতরে")
print("loop এর বাইরে")

VS Code এ Ruff format চালু থাকলে এটা নিয়ে চিন্তা করতে হবে না।

#অনুশীলন

#নিজেকে যাচাই করো

`7 / 2` আর `7 // 2` এর output কী?

7 / 2 দেয় 3.5 (সবসময় float)। 7 // 2 দেয় 3 (পূর্ণসংখ্যার ভাগ)।

নিচের code কী print করবে? `count = 0` তারপর `print("আছে" if count else "নেই")`

"নেই"। কারণ 0 falsy। যদি বোঝাতে চাও count এর value দেওয়া আছে কিনা, তাহলে count is not None লিখতে হবে।

`text = "Python"` হলে `text[1:4]` আর `text[-2:]` কী দেবে?

text[1:4] দেবে "yth" (index 1, 2, 3)। text[-2:] দেবে "on" (শেষের দুইটা)।

Loop এ index দরকার হলে `range(len(items))` এর বদলে কী ব্যবহার করবে?

enumerate(items)। এটা (index, value) জোড়া দেয়, code পড়তে সহজ হয় আর ভুলের সুযোগ কমে।

টাকার হিসাবে float কেন বিপজ্জনক, আর বিকল্প কী?

Float binary তে আনুমানিকভাবে রাখা হয়, তাই 0.1 + 0.2 ঠিক 0.3 হয় না। অনেক লেনদেনে এই ছোট ভুল জমে বড় হয়। বিকল্প: পয়সায় integer হিসেবে রাখা, অথবা decimal.Decimal ব্যবহার করা।

চিহ্ন দিলে sidebar আর রোডম্যাপে এই অধ্যায়ের station ভরে যাবে।