অধ্যায় 10

while লুপ — শর্ত সত্য থাকা পর্যন্ত চলা

একই কাজ বারবার চালানো, অসীম লুপ কীভাবে হয় ও থামানো যায়, break আর continue, আর সঠিক ইনপুট না পাওয়া পর্যন্ত জিজ্ঞেস করতে থাকা।

35 মিনিটPython 3.12
  1. 1সমস্যা
  2. 2বোঝা
  3. 3উদাহরণ
  4. 4অনুমান
  5. 5নিজে করা
  6. 6কঠিন করা

যে সমস্যাটা আমরা সমাধান করছি

আগের মিশনে আমরা ব্যবহারকারীর ভুল ইনপুট ধরতে শিখেছি — কেউ twenty লিখলে প্রোগ্রাম বলতে পারে "এটা সংখ্যা নয়"।

কিন্তু বলার পর সে কী করে? থেমে যায়। ব্যবহারকারীকে আবার পুরো প্রোগ্রাম চালাতে হয়। কোনো সত্যিকারের সফটওয়্যার এভাবে চলে না — সে আবার জিজ্ঞেস করে, আর সঠিক উত্তর পাওয়া পর্যন্ত জিজ্ঞেস করতেই থাকে।

এটাই লুপের কাজ: একই কাজ বারবার করা, যতক্ষণ দরকার। আজ আমরা while শিখব — যেটা চলে যতক্ষণ একটা শর্ত সত্য থাকে।

সাথে একটা নতুন অভিজ্ঞতাও আজ হবে: প্রোগ্রাম আর থামছে না, টার্মিনালে লেখা ছুটতেই থাকছে। ভয় পাওয়ার কিছু নেই, থামানোর উপায়টাও আজই শিখে নেবেন।

এই মিশন শেষে আপনি পারবেন

  • while লুপ লিখতে, আর বলতে সেটা কখন থামবে
  • অসীম লুপ কেন হয় তা চিনতে, আর Ctrl + C দিয়ে থামাতে
  • একটা লুপে যোগফল বা গণনা জমাতে
  • break আর continue ঠিক জায়গায় ব্যবহার করতে
  • সঠিক ইনপুট না পাওয়া পর্যন্ত জিজ্ঞেস করে যেতে

আগে যা জানা লাগবে: সিদ্ধান্ত নেওয়া — if, elif, else।


সবচেয়ে সহজ লুপ

python
count = 3

while count > 0:
    print(count)
    count = count - 1

print("Go")
text
3
2
1
Go

গঠনটা if-এর মতোই দেখতে — শর্ত, কোলন, ইনডেন্ট করা ব্লক। পার্থক্য একটাই, আর সেটাই সব: if শর্তটা একবার দেখে, while প্রতিবার ব্লক শেষ হওয়ার পর আবার দেখে।

উপরের প্রোগ্রামটা যা করেছে:

  1. count হলো 3। শর্ত 3 > 0 সত্য → ব্লক চলল, 3 ছাপল, count হলো 2
  2. আবার শর্ত: 2 > 0 সত্য → 2 ছাপল, count হলো 1
  3. আবার শর্ত: 1 > 0 সত্য → 1 ছাপল, count হলো 0
  4. আবার শর্ত: 0 > 0 মিথ্যা → লুপ শেষ, নিচের লাইনে গেল

প্রতিটি কাজের while লুপে তিনটি জিনিস থাকে, আর তিনটিই দরকার:

  • শুরুর মান — লুপের আগে (count = 3)
  • শর্ত — কখন চলবে (count > 0)
  • পরিবর্তন — ভেতরে এমন কিছু, যা শর্তটাকে একদিন মিথ্যা করবে (count = count - 1)

অসীম লুপ

তিন নম্বরটা বাদ পড়লে কী হয়, একবার দেখে নেওয়া দরকার:

python
count = 3

while count > 0:
    print(count)

এটি 3 ছাপতেই থাকবে, চিরকাল। count কখনো বদলায় না, তাই count > 0 কখনো মিথ্যা হয় না।

থামানোর উপায়: টার্মিনালে Ctrl + C চাপুন। সাথে সাথে থেমে যাবে আর এরকম একটা বার্তা দেখাবে:

text
Traceback (most recent call last):
  File "D:\python-lab\lesson-10\loop.py", line 4, in <module>
    print(count)
KeyboardInterrupt

KeyboardInterrupt মানে আপনি নিজে থামিয়েছেন। এটা আপনার কোডের বাগ নয়, এটা আপনার সিদ্ধান্ত।

অসীম লুপ শেখার একটা অংশ। প্রতিটি প্রোগ্রামারই এটা করেছে, আজও করে। ভয় পাওয়ার কিছু নেই — Ctrl + C জানা থাকলে এটা শুধু একটা ছোট বিরক্তি। লুপ লেখার সময় শুধু নিজেকে একবার জিজ্ঞেস করুন: "শর্তটা মিথ্যা হবে কীভাবে?" উত্তর দিতে না পারলে লুপটা থামবে না।

জমা করা

লুপের সবচেয়ে সাধারণ কাজ হলো কিছু জমানো — যোগফল, গণনা, সবচেয়ে বড় মান:

python
total = 0
number = 1

while number <= 5:
    total = total + number
    number = number + 1

print("Sum of 1 to 5:", total)
text
Sum of 1 to 5: 15

total-কে বলা হয় অ্যাকিউমুলেটর — জমানোর পাত্র। খেয়াল করুন, সেটা লুপের বাইরে শুরু করা হয়েছে, 0 দিয়ে। ভেতরে শুরু করলে প্রতিবার শূন্য হয়ে যেত আর শেষে শুধু শেষ সংখ্যাটাই থাকত।

break — এখনই বেরিয়ে যাও

break লুপটা সাথে সাথে ভেঙে দেয়, শর্ত যাই বলুক:

python
number = 1

while number <= 100:
    if number % 7 == 0:
        print("First multiple of 7:", number)
        break
    number = number + 1
text
First multiple of 7: 7

শর্ত বলছিল ১০০ পর্যন্ত চলতে, কিন্তু ৭ পাওয়ার সাথে সাথেই কাজ শেষ — তাই আর ৯৩ বার ঘোরার কোনো মানে নেই।

break থাকায় একটা নকশা সম্ভব হয়, যেটা খুব কাজে লাগে — শর্তের জায়গায় সোজা True লিখে দেওয়া, আর ভেতরে ঠিক জায়গায় বেরিয়ে আসা:

python
while True:
    answer = input("Type 'quit' to exit: ").strip().lower()
    if answer == "quit":
        print("Goodbye")
        break
    print(f"You typed: {answer}")
text
Type 'quit' to exit: hello
You typed: hello
Type 'quit' to exit: QUIT
Goodbye

while True মানে "সব সময় চলবে", তাই ভেতরে একটা break অবশ্যই থাকতে হবে — নাহলে ওটা অসীম লুপ।

continue — এই চক্করটা বাদ দাও

continue লুপ ভাঙে না, শুধু ভেতরের বাকি লাইনগুলো এড়িয়ে সোজা পরের চক্করে চলে যায়:

python
number = 0

while number < 10:
    number = number + 1
    if number % 2 == 0:
        continue
    print(number)
text
1
3
5
7
9

জোড় সংখ্যাগুলোতে continue চলেছে, তাই print এড়িয়ে গেছে।

continue লেখার সময় একটা ফাঁদ আছে। যে লাইনটা শর্তকে এগিয়ে দেয় (number = number + 1), সেটা যদি continue-এর পরে থাকে, তাহলে continue চলার সময় ওটা এড়িয়ে যাবে — আর লুপ ওখানেই আটকে থাকবে চিরকাল। উপরের কোডে তাই বাড়ানোর লাইনটা সবার আগে রাখা হয়েছে। continue ব্যবহার করলে এই ক্রমটা প্রতিবার মিলিয়ে দেখুন।

অবশেষে: ঠিক ইনপুট পাওয়া পর্যন্ত জিজ্ঞেস করা

এই জিনিসটার জন্যই দুই মিশন ধরে অপেক্ষা:

python
while True:
    raw = input("Your age: ").strip()
    if raw.isdigit():
        age = int(raw)
        break
    print("Please type a whole number, digits only.")

print(f"Thank you. Age recorded as {age}.")
text
Your age: twenty
Please type a whole number, digits only.
Your age: 22.5
Please type a whole number, digits only.
Your age: 22
Thank you. Age recorded as 22.

এটাই সেই নকশা যা আপনি সারা জীবন ব্যবহার করবেন: অসীম লুপ, ভেতরে যাচাই, ঠিক হলে break, ভুল হলে বার্তা দিয়ে আবার। প্রোগ্রাম আর ভুল ইনপুটে ভেঙে পড়ে না, আর ব্যবহারকারীকেও আবার সবকিছু শুরু করতে হয় না।


একটা সম্পূর্ণ উদাহরণ

shopping.py:

python
# Keep taking item prices until the user is done, then summarise
total = 0.0
item_count = 0

print("Enter item prices. Type 'done' to finish.")

while True:
    entry = input("Price: ").strip().lower()

    if entry == "done":
        break

    if entry == "":
        print("  Nothing typed — try again.")
        continue

    # Accept only digits and at most one decimal point
    if entry.replace(".", "", 1).isdigit():
        price = float(entry)
        total = total + price
        item_count = item_count + 1
        print(f"  Added {price:.2f}. Running total {total:.2f}")
    else:
        print(f"  '{entry}' is not a price. Try again.")

print()
if item_count == 0:
    print("No items were entered.")
else:
    average = total / item_count
    print(f"Items   : {item_count}")
    print(f"Total   : {total:.2f}")
    print(f"Average : {average:.2f}")
text
Enter item prices. Type 'done' to finish.
Price: 120
  Added 120.00. Running total 120.00
Price: abc
  'abc' is not a price. Try again.
Price: 85.5
  Added 85.50. Running total 205.50
Price: done

Items   : 2
Total   : 205.50
Average : 102.75

এই প্রোগ্রামে তিনটি জিনিস একসাথে কাজ করছে, আর তিনটিই আজকের শেখা:

  • break — ব্যবহারকারী done লিখলে লুপ থেকে বেরিয়ে আসা
  • continue — ফাঁকা লাইন পেলে বাকিটা এড়িয়ে সোজা আবার জিজ্ঞেস করা
  • অ্যাকিউমুলেটর — total আর item_count দুটোই লুপের বাইরে শুরু, ভেতরে বাড়ছে

শেষ if item_count == 0 শর্তটা কেন দরকার, সেটা একবার ভেবে দেখুন। ব্যবহারকারী কিছু না লিখেই সোজা done লিখলে item_count থাকবে 0, আর total / item_count তখন ZeroDivisionError দিয়ে প্রোগ্রাম ভেঙে দিত। লুপের পরে জমা মান ব্যবহার করার আগে "একবারও কিছু জমেছে কি" — এই প্রশ্নটা প্রতিবার করতে হয়।


কিছু ভাঙা অবস্থা ও তার সমাধান

প্রোগ্রাম থামছে না, লেখা ছুটছে Ctrl + C চাপুন। তারপর দেখুন লুপের ভেতরে শর্তটাকে এগিয়ে দেওয়ার লাইনটা আছে কি না, আর সেটা continue-এর আগে আছে কি না।

লুপ একবারও চলল না শর্তটা শুরুতেই মিথ্যা ছিল। শুরুর মান আর শর্তটা মিলিয়ে দেখুন — while count > 0 লিখে count = 0 দিয়ে শুরু করলে ভেতরে কখনো ঢোকা হবে না।

একবার বেশি বা একবার কম চলছে < আর <= গুলিয়ে গেছে। while n < 5 চলে চারবার (১, ২, ৩, ৪), আর while n <= 5 চলে পাঁচবার।

`IndentationError: expected an indented block after 'while' statement while-এর পরের লাইনটা ভেতরে ঠেলা হয়নি।

NameError — লুপের পরে ভেরিয়েবলটা চেনা যাচ্ছে না ভেরিয়েবলটা শুধু লুপের ভেতরে তৈরি হয়েছে, আর লুপ একবারও না চললে সেটা কখনো তৈরিই হয়নি। যেসব ভেরিয়েবল লুপের পরে দরকার, সেগুলো লুপের আগেই একটা শুরুর মান দিয়ে রাখুন।

লুপ শেষে যোগফল ভুল আসছে অ্যাকিউমুলেটরটা লুপের ভেতরে শুরু করা হয়েছে কি না দেখুন। total = 0 লাইনটা লুপের বাইরে থাকতে হবে।