Python-এ লুপ ও শর্ত: for, while, range, enumerate, break, if/elif ও match/case
Python-এ লুপ কাজ পুনরাবৃত্তি করে: for কালেকশন বা range()-এর প্রতিটি উপাদানের উপর দিয়ে যায়, আর while শর্ত সত্য থাকা পর্যন্ত চলে। break দিয়ে লুপ থামানো যায়, continue দিয়ে একটি ধাপ বাদ দেওয়া যায়, enumerate() দেয় উপাদানের ক্রমিক নম্বর। সিদ্ধান্ত নেয় if/elif/else, আর কাঠামো অনুযায়ী ডেটা মেলাতে ব্যবহার হয় match/case (Python 3.10 থেকে)।
Python-এ লুপ একই কাজ বারবার করতে দেয়: কেনাকাটার তালিকার প্রতিটি আইটেমে যাওয়া, ফাইলের প্রতিটি লাইন প্রক্রিয়া করা, অথবা সঠিক সংখ্যা না আসা পর্যন্ত ব্যবহারকারীকে জিজ্ঞেস করা। ভাষায় দুটি লুপ আছে — for ও while — আর এদের ভেতরে সিদ্ধান্ত নিতে সাহায্য করে if/elif/else শর্ত ও match/case। প্রতিটি টুল কাজের উদাহরণে দেখা যাক।
শর্ত: if, elif, else
শর্তসূচক বিবৃতি কোডের একটি ব্লক তখনই চালায়, যখন এক্সপ্রেশনটি সত্য হয়। ব্লকটি চিহ্নিত হয় ৪ স্পেসের ইন্ডেন্টেশনে — Python-এ কারলি ব্র্যাকেট নেই, এবং ভুল ইন্ডেন্টেশন সঙ্গে সঙ্গে IndentationError দেয়।
spent = 4200
limit = 5000
if spent > limit:
print("সীমা পেরিয়ে গেছে")
elif spent > limit * 0.8:
print("বাজেটের ২০%-এরও কম বাকি আছে")
else:
print("সব ঠিক আছে")
elif শাখাগুলো উপর থেকে নিচে যাচাই হয়, এবং প্রথম মিলে যাওয়া শাখাটিই চলে। তাই কঠোর শর্ত উপরে রাখুন: যদি spent > limit * 0.8 যাচাইটি প্রথমে থাকত, তাহলে সীমা পেরোনোর বার্তাটি কখনোই দেখা যেত না।
কী সত্য বলে গণ্য হয়
শর্তে তুলনা লেখা বাধ্যতামূলক নয়। মিথ্যা বলে গণ্য হয় False, None, শূন্য (0, 0.0) এবং খালি কালেকশন: "", [], {}। বাকি সব সত্য। তাই «তালিকা খালি নয়» যাচাই সংক্ষেপে লেখা হয়:
expenses = []
if not expenses:
print("এখনো কোনো খরচ নেই")
শর্ত যুক্ত করা যায় and, or, not দিয়ে, আর একটি পরিসর যাচাই করা সুবিধাজনক তুলনার শৃঙ্খলে: if 0 < amount <= 100_000:। ছোট সিদ্ধান্তের জন্য আছে শর্তযুক্ত এক্সপ্রেশন: status = "বেশি" if spent > limit else "স্বাভাবিক"।
Python-এর for লুপ: সিনট্যাক্স ও উদাহরণ
Python-এর for লুপ C-এর মতো কাউন্টার নয়, এটি উপাদানের উপর দিয়ে যাওয়ার একটি ব্যবস্থা। এটি একের পর এক প্রতিটি উপাদান নেয় — তালিকা, স্ট্রিং, dictionary, ফাইল বা range। অন্য ভাষার foreach-এর কাজ এখানে সাধারণ for-ই করে।
expenses = [350, 1200, 89, 4500]
total = 0
for amount in expenses:
total += amount
print(total) # 6139
for লুপের সিনট্যাক্স: for ভেরিয়েবল in কালেকশন:, তারপর ইন্ডেন্ট করা ব্লক। লুপের পরে ভেরিয়েবলটি শেষ মানটি ধরে রাখে — এটি কখনো কাজে লাগে, তবে বড় প্রোগ্রামে এর ওপর নির্ভর না করাই ভালো।
স্ট্রিং, তালিকা ও dictionary-র উপর লুপ
স্ট্রিং অক্ষর ধরে ধরে যায়, তালিকা উপাদান ধরে। Dictionary-র উপর লুপ ডিফল্টভাবে key ধরে চলে; key ও value একসঙ্গে পেতে .items() ব্যবহার করুন:
by_category = {"food": 3200, "transport": 900, "cinema": 600}
for category, amount in by_category.items():
print(f"{category}: {amount} ৳")
শুধু value-র জন্য আছে .values()। লুপ চলার সময় dictionary-র আকার বদলানো যায় না — পাবেন RuntimeError: dictionary changed size during iteration। উপাদান মুছতে হলে অনুলিপির উপর লুপ চালান: for key in list(d):।
range ফাংশন: সংখ্যার উপর লুপ
সংখ্যার উপর লুপ চালাতে range() কাজে লাগে। এটি মেমোরিতে তালিকা বানায় না, একটি একটি করে সংখ্যা দেয়, তাই range(10**9) মুহূর্তেই কাজ করে।
| কল | সংখ্যা |
|---|---|
range(5) | 0, 1, 2, 3, 4 |
range(2, 6) | 2, 3, 4, 5 |
range(0, 10, 3) | 0, 3, 6, 9 |
range(5, 0, -1) | 5, 4, 3, 2, 1 |
মূল নিয়ম: ডান সীমা পরিসরে অন্তর্ভুক্ত নয়। range(1, 10) শেষ হবে 9-এ — এটি «এক কম» ভুলের একটি সাধারণ কারণ। ধাপ ঋণাত্মক হতে পারে, তবে শূন্য হতে পারে না।
for i in range(1, 4):
print(f"দিন {i}")
# দিন 1
# দিন 2
# দিন 3
enumerate: লুপে কাউন্টার
নতুনেরা প্রায়ই উপাদানের নম্বর জানতে for i in range(len(items)) লেখে। এতে কাজ হয়, কিন্তু পড়া কঠিন। enumerate() দেয় «নম্বর, উপাদান» জোড়া, আর start প্যারামিটার ঠিক করে কোন সংখ্যা থেকে গোনা শুরু হবে:
items = ["coffee", "taxi", "lunch"]
for n, item in enumerate(items, start=1):
print(n, item)
# 1 coffee
# 2 taxi
# 3 lunch
দুটি তালিকা একসঙ্গে ঘোরাতে আছে zip(): for name, price in zip(names, prices):। এটি সবচেয়ে ছোট তালিকায় থামে; Python 3.10 থেকে strict=True দিলে দৈর্ঘ্যের গরমিল হলে ত্রুটি দেখায়।
Python-এর while লুপ
while লুপ ব্লকটি বারবার চালায়, যতক্ষণ শর্ত সত্য থাকে। পুনরাবৃত্তির সংখ্যা আগে থেকে না জানা থাকলে এটি বেছে নেওয়া হয়: সঠিক ইনপুটের জন্য অপেক্ষা, ফাইল শেষ পর্যন্ত পড়া, সফল না হওয়া পর্যন্ত অনুরোধ পুনরাবৃত্তি।
balance = 10_000
month = 0
while balance > 0:
balance -= 2_700
month += 1
print(f"টাকা চলবে {month} মাস") # 4
প্রধান বিপদ — শর্তে থাকা ভেরিয়েবলটি বদলাতে ভুলে যাওয়া। তখন লুপ কখনো শেষ হয় না। প্রোগ্রাম ঝুলে গেলে Ctrl+C চাপুন: Python KeyboardInterrupt দিয়ে চালানো থামিয়ে দেবে।
অসীম লুপ ও do while
কখনো অসীম লুপ ইচ্ছাকৃতভাবে লেখা হয়: while True:, যার বের হওয়ার পথ break। একই উপায়ে লেখা হয় পরীক্ষা-শেষে লুপ — Python-এ do while নেই, এই কৌশলটিই তার জায়গা নেয়: ব্লক অন্তত একবার চলে, আর যাচাই হয় শেষে।
while True:
raw = input("পরিমাণ: ")
if raw.isdigit():
amount = int(raw)
break
print("একটি পূর্ণ সংখ্যা লিখুন")
for লুপ অসীম হওয়া বিরল — শুধু তখনই, যখন itertools.count()-এর মতো অসীম iterator ঘোরানো হয়।
break ও continue: লুপ থেকে বের হওয়া ও ধাপ বাদ দেওয়া
break লুপ তৎক্ষণাৎ থামায়, এবং চলা এগোয় লুপের পরের কোডে। continue বর্তমান ধাপের বাকি অংশ এড়িয়ে পরের ধাপে যায়।
expenses = [350, -10, 1200, 0, 99_999, 89]
for amount in expenses:
if amount <= 0:
continue # এই ধাপ বাদ দাও
if amount > 50_000:
print("সন্দেহজনক পরিমাণ, থামছি")
break # লুপ থেকে বের হও
print(amount)
ছাপা হবে 350 ও 1200, তারপর বার্তা — 89 পর্যন্ত লুপ পৌঁছায় না। দুটি বিবৃতিই শুধু নিকটতম লুপের ওপর কাজ করে।
লুপের else
for ও while-এর একটি অস্বাভাবিক else শাখা আছে: এটি চলে, যদি লুপ নিজে থেকে শেষ হয়, break ছাড়া। অনুসন্ধানের জন্য এটি সুবিধাজনক:
for amount in expenses:
if amount > 50_000:
print("বড় একটি খরচ পাওয়া গেছে")
break
else:
print("কোনো বড় খরচ নেই")
নেস্টেড লুপ
লুপের ভেতরে লুপ: বাইরের প্রতিটি ধাপে ভেতরের লুপটি সম্পূর্ণ চলে। টেবিল, ম্যাট্রিক্স ঘোরানো বা জোড়া তৈরির জন্য এটি ব্যবহার হয়।
for row in range(1, 4):
for col in range(1, 4):
print(row * col, end="\t")
print()
দুটি বিষয় মনে রাখুন। প্রথমত, জটিলতা দ্রুত বাড়ে: ১০,০০০ উপাদানের দুটি নেস্টেড লুপ মানে ১০ কোটি অপারেশন। দ্বিতীয়ত, break শুধু ভেতরের লুপ থেকে বের করে। দুটোই থামাতে লুপগুলো একটি ফাংশনে রেখে return ব্যবহার করুন — পতাকা (flag) বসানোর চেয়ে এটি পরিষ্কার।
match/case বিবৃতি
Python 3.10 থেকে দীর্ঘ if cmd == ... elif ... শৃঙ্খলের বদলে লেখা যায় match (PEP 634)। এটি শুধু switch নয়: এটি মান ডেটার কাঠামো অনুযায়ী প্যাটার্নের সঙ্গে মেলায় এবং অংশগুলো সরাসরি ভেরিয়েবলে ভাগ করে দেয়।
def parse(text):
match text.split():
case ["add", item, amount]:
return f"যোগ করো {item}: {amount}"
case ["list"] | ["ls"]:
return "খরচের তালিকা দেখাও"
case ["quit"]:
return "বের হও"
case _:
return "অজানা কমান্ড"
print(parse("add Coffee 250")) # যোগ করো Coffee: 250
print(parse("add Coffee")) # অজানা কমান্ড
তালিকার প্যাটার্ন ["add", item, amount] মিলবে শুধু ঠিক তিনটি উপাদানের তালিকার সঙ্গে, যার প্রথমটি "add"। তাই পরিমাণ ছাড়া কমান্ড চলে যায় _ শাখায়, যা বাকি সব ধরে। | চিহ্ন বিকল্পগুলো যুক্ত করে।
Dictionary, ধরন ও গার্ড শর্ত
Dictionary প্যাটার্ন শুধু লেখা key-গুলো যাচাই করে, বাকিগুলো উপেক্ষা করে। int(a) লেখা ধরনটি যাচাই করে এবং মানটি ধরে, আর প্যাটার্নের পরের if অতিরিক্ত শর্ত যোগ করে (guard):
match event:
case {"type": "expense", "amount": int(a)} if a > 10_000:
print("বড় খরচ", a)
case {"type": "expense", "amount": int(a)}:
print("খরচ", a)
match-এর প্রধান ফাঁদ
case-এর ভেতরে খালি নাম একটি ক্যাপচার, তুলনা নয়। case limit: যেকোনো মানের সঙ্গে মিলবে এবং সেটি limit-এ লিখবে। ধ্রুবকের সঙ্গে তুলনার জন্য ডট-সহ নাম লিখুন, যেমন case Color.RED:, অথবা সরাসরি লিটারাল।
Python 3.10 থেকে match-এর সিনট্যাক্স প্রায় বদলায়নি। Python 3.15-এ একটি ছোট অসামঞ্জস্য দূর হয়েছে: আগে লিটারাল প্যাটার্নে সংখ্যার আগে শুধু ঋণাত্মক চিহ্ন অনুমোদিত ছিল, এখন case +1:-ও লেখা যায়। পুরনো সংস্করণে এমন কোড সিনট্যাক্স ত্রুটি দেবে।
লুপের সাধারণ ভুল
- লুপ চলার সময় তালিকা বদলানো।
for-এর ভেতরে উপাদান মুছলে পাশের উপাদান বাদ পড়ে। বরং নতুন তালিকা বানান:clean = [x for x in items if x > 0]। - range-এর সীমা।
range(1, n)n-কে অন্তর্ভুক্ত করে না। - while-এর শর্তের ভেরিয়েবল বদলাতে ভুলে যাওয়া — অসীম লুপ।
- += দিয়ে লুপে স্ট্রিং জোড়া দেওয়া বড় ডেটায়
"".join(parts)-এর চেয়ে ধীর। - তুলনার বদলে বসানো:
if x = 5সিনট্যাক্স ত্রুটি; তুলনা লেখা হয়==দিয়ে।
লুপের অনুশীলন
- খরচের তালিকার যোগফল ও গড় বের করুন, ঋণাত্মক মান বাদ দিয়ে।
- নেস্টেড লুপ দিয়ে ১ থেকে ৯-এর গুণের সারণি ছাপান।
- ব্যবহারকারী খালি লাইন না দেওয়া পর্যন্ত সংখ্যা জিজ্ঞেস করুন, তারপর সর্বোচ্চ মান ছাপান।
- তালিকায় প্রথম 1000-এর বেশি সংখ্যাটি খুঁজুন; না থাকলে জানান (
for ... elseদিয়ে)। matchদিয়েadd,del,listকমান্ড বিশ্লেষণ করুন।
সারসংক্ষেপ
Python-এর লুপ দুটি কাঠামোয় সীমিত: for কালেকশন বা range()-এর উপাদান ঘোরায়, while শর্ত সত্য থাকা পর্যন্ত চলে। break ও continue লুপের গতি নিয়ন্ত্রণ করে, enumerate() ও zip() হাতে-লেখা কাউন্টার থেকে বাঁচায়, আর if/elif/else ও match/case সিদ্ধান্ত নেয়। খরচের ট্র্যাকারের উদাহরণে এই সব টুল কোর্সের একটি লেকচারে বাস্তবে দেখানো হয়েছে।
সাধারণ প্রশ্ন
for ও while-এর পার্থক্য কী Python-এ?
for তৈরি একটি ক্রম ধরে যায় এবং নিজেই জানে কখন থামতে হবে; while শর্ত সত্য থাকা পর্যন্ত পুনরাবৃত্তি করে। পুনরাবৃত্তির সংখ্যা জানা থাকলে বা কালেকশন থাকলে for নিন, কোনো ঘটনার অপেক্ষায় থাকলে while।
লুপ উল্টো দিকে চালানো যায় কীভাবে?
কালেকশনের জন্য reversed(items), সংখ্যার জন্য range(n - 1, -1, -1) ব্যবহার করুন। reversed তালিকার অনুলিপি বানায় না, শেষ থেকে ঘুরে দেখে।
Python-এ কি switch আছে?
আলাদা switch নেই; তার কাজ করে if/elif শৃঙ্খল এবং Python 3.10-এ আসা match/case। match আরও বেশি করে: তালিকা ও dictionary কাঠামো অনুযায়ী বিশ্লেষণ করে এবং মান ধরে রাখে।
লুপ নাকি list comprehension, কোনটি দ্রুত?
[x * 2 for x in items]-এর মতো comprehension সাধারণত append সহ সমতুল্য লুপের চেয়ে একটু দ্রুত এবং ছোট। জটিল লজিক বা একাধিক শর্তে সাধারণ লুপ পড়তে সহজ হয়।
দুটি নেস্টেড লুপ একসঙ্গে কীভাবে থামাবেন?
break শুধু ভেতরের লুপ থামায়। সবচেয়ে সহজ উপায় হলো লুপগুলো একটি ফাংশনে রাখা এবং return দিয়ে বের হওয়া।
“Python 3.15: от новичка до профи” কোর্সে বিষয়টি অনুশীলনসহ বিস্তারিত শেখানো হয়েছে।
কোর্সে যান