অধ্যায় 07

ব্যবহারকারীর কাছ থেকে ইনপুট নেওয়া

input() দিয়ে ব্যবহারকারীর লেখা নেওয়া, সেটি কেন সব সময় str হয়, আর int() ও float() দিয়ে সংখ্যায় বদলানোর সময় কোন ত্রুটিগুলো আসে।

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

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

এখন পর্যন্ত আমাদের প্রতিটি প্রোগ্রামের সংখ্যাগুলো ফাইলের ভেতরেই লেখা ছিল। অন্য কোনো সংখ্যা দিয়ে চালাতে চাইলে ফাইলটা খুলে বদলাতে হত।

সত্যিকারের প্রোগ্রাম এভাবে চলে না। প্রোগ্রাম জিজ্ঞেস করে, আর ব্যবহারকারী উত্তর দেয়।

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

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

  • input() দিয়ে ব্যবহারকারীর লেখা নিতে, সাথে একটা পরিষ্কার প্রশ্ন দেখাতে
  • বলতে কেন ইনপুট সব সময় str
  • int() আর float() দিয়ে সেটাকে সংখ্যায় বদলাতে
  • TypeError আর ValueError-এর পার্থক্য বুঝতে
  • ইনপুট পরিষ্কার করে নিতে, যাতে বাড়তি স্পেসে প্রোগ্রাম না ভাঙে

আগে যা জানা লাগবে: লেখা নিয়ে কাজ — ইনডেক্স, স্লাইস আর f-string।


input() কীভাবে কাজ করে

python
name = input("What is your name? ")
print(f"Hello, {name}!")

চালালে:

text
What is your name? Rafi
Hello, Rafi!

তিনটি জিনিস ঘটেছে। input() বন্ধনীর ভেতরের প্রশ্নটা টার্মিনালে দেখিয়েছে; তারপর থেমে অপেক্ষা করেছে যতক্ষণ ব্যবহারকারী কিছু লিখে এন্টার না চাপে; তারপর যা লেখা হয়েছে সেটা ফেরত দিয়েছে, আর আমরা তা name-এ রেখেছি।

প্রশ্নের শেষে একটা স্পেস দিয়েছি খেয়াল করুন — "What is your name? "। ওই স্পেসটা না দিলে ব্যবহারকারীর লেখা প্রশ্নের গায়ে লেগে যায়, দেখতে খারাপ লাগে।

এই প্রোগ্রামগুলো টার্মিনালেই চালাতে হবে। input() অপেক্ষা করে কেউ কিছু টাইপ করার জন্য, তাই কোনো ওয়েবসাইটে বা সম্পাদকের প্রিভিউতে এটা কাজ করে না। python ask.py লিখে নিজের টার্মিনালে চালান — এই কোর্সে সব সময় এভাবেই চলবে।

যে নিয়মটা সবাইকে একবার আটকায়

python
age = input("Your age: ")
print(type(age))
print("Next year:", age + 1)
text
Your age: 22
<class 'str'>
Traceback (most recent call last):
  File "D:\python-lab\lesson-07\ask.py", line 3, in <module>
    print("Next year:", age + 1)
                        ~~~~^~~
TypeError: can only concatenate str (not "int") to str

ব্যবহারকারী 22 লিখেছেন। স্ক্রিনে সংখ্যাই দেখাচ্ছে। কিন্তু type(age) বলছে str।

কারণটা ভাবলে সোজা: কীবোর্ড থেকে আসে অক্ষর, সংখ্যা নয়। ব্যবহারকারী 22, abc, 12.5 — যা কিছু লিখতে পারেন। input() নিজে থেকে আন্দাজ করতে পারত "এটা তো সংখ্যা, বদলে দিই" — কিন্তু তাহলে একই কোড কখনো str কখনো int ফেরত দিত, আর কী আসবে তা আগে থেকে বলা যেত না। তাই পাইথন একটাই নিয়ম রাখে: সব সময় লেখা। বদলানোর দায়িত্ব আপনার।

int() আর float()

python
age = input("Your age: ")
age = int(age)

print(type(age))
print("Next year:", age + 1)
text
Your age: 22
<class 'int'>
Next year: 23

দুটো ধাপ এক লাইনেও লেখা যায়, আর সাধারণত এভাবেই লেখা হয়:

python
age = int(input("Your age: "))
print("Next year:", age + 1)

ভেতর থেকে বাইরে পড়ুন: input() লেখা এনেছে, int() সেটাকে পূর্ণ সংখ্যায় বদলেছে, তারপর age-এ বসেছে।

দশমিক দরকার হলে float():

python
price = float(input("Price: "))
print("With tax:", round(price * 1.15, 2))
text
Price: 249.50
With tax: 286.92

কোনটা কখন: গুনতে পারা জিনিসে int (বয়স, সংখ্যা, পরিমাণ), মাপা জিনিসে float (দাম, ওজন, গড়)।

দুটো ত্রুটি, দুটো আলাদা কারণ

এই দুটো নাম গুলিয়ে ফেলা সহজ, তাই আলাদা করে দেখে নিন।

TypeError — ধরনটাই ভুল। লেখার সাথে সংখ্যা যোগ করতে চেয়েছেন। রূপান্তরের কথাই ভুলে গেছেন:

python
qty = input("Quantity: ")
print(qty * 2)
text
Quantity: 3
33

লক্ষ্য করুন, এবার ত্রুটিও আসেনি! "3" * 2 মানে লেখাটা দুবার — "33"। প্রোগ্রাম চলল, উত্তর ভুল। নীরব ভুল ত্রুটির চেয়েও খারাপ।

ValueError — ধরন ঠিক, কিন্তু ভেতরের লেখাটা সংখ্যা নয়:

python
age = int(input("Your age: "))
text
Your age: twenty
Traceback (most recent call last):
  File "D:\python-lab\lesson-07\ask.py", line 1, in <module>
    age = int(input("Your age: "))
          ^^^^^^^^^^^^^^^^^^^^^^^
ValueError: invalid literal for int() with base 10: 'twenty'

int() কাজটা করতে রাজি, কিন্তু 'twenty' দিয়ে করা যায় না। বার্তাটা কারণটাও বলে দিচ্ছে — কোন মানটা মানা যায়নি, সেটা শেষে কোটেশনের ভেতরে লেখা আছে।

একটা সূক্ষ্ম কিন্তু বাস্তব ফাঁদ:

python
count = int(input("Count: "))

12.5 লিখলে এটাও ValueError দেবে — কারণ int() দশমিকযুক্ত লেখা নেয় না। দশমিক আসার সম্ভাবনা থাকলে float() দিয়ে নিন, তারপর দরকার হলে int() করুন।

এখনই এই ত্রুটি ঠেকানোর পুরো উপায় আমাদের হাতে নেই — তার জন্য শর্ত আর লুপ দুটোই লাগবে, আর দুটোই সামনের মিশনে আসছে। আপাতত ত্রুটিটা চিনে রাখুন আর বার্তাটা পড়তে শিখুন।

ইনপুট পরিষ্কার করে নিন

মানুষ টাইপ করার সময় বাড়তি স্পেস দেয়, বড় হাতের অক্ষর মেশায়। আগের মিশনের হাতিয়ারগুলোই এখানে কাজে লাগে:

python
full_name = input("Name: ").strip().title()
answer = input("Continue? (yes/no) ").strip().lower()

print(f"Name is {full_name}")
print(f"Answer is {answer}")
text
Name:    rafi ahmed
Continue? (yes/no)   YES
Name is Rafi Ahmed
Answer is yes

input() থেকে আসা লেখায় .strip() চালানো একটা অভ্যাস করে ফেলুন। ব্যবহারকারীর একটা বাড়তি স্পেসে প্রোগ্রাম ভাঙার কোনো কারণ নেই।


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

bill.py:

python
# Ask for one order and print a small bill
print("--- Order entry ---")

customer = input("Customer name : ").strip().title()
item = input("Item          : ").strip()
quantity = int(input("Quantity      : "))
unit_price = float(input("Unit price    : "))

subtotal = quantity * unit_price
tax = subtotal * 0.05
total = subtotal + tax

print()
print("--- Bill ---")
print(f"Customer : {customer}")
print(f"Item     : {item} x {quantity}")
print(f"Subtotal : {subtotal:.2f}")
print(f"Tax (5%) : {tax:.2f}")
print(f"Total    : {total:.2f}")
text
--- Order entry ---
Customer name :   rafi ahmed
Item          : notebook
Quantity      : 4
Unit price    : 85.50

--- Bill ---
Customer : Rafi Ahmed
Item     : notebook x 4
Subtotal : 342.00
Tax (5%) : 17.10
Total    : 359.10

চারটি ইনপুট, চার রকম আচরণ: নাম পরিষ্কার করে সাজানো হয়েছে, পণ্যের নাম শুধু পরিষ্কার, পরিমাণ পূর্ণ সংখ্যায়, আর দাম দশমিকে। প্রতিটি ইনপুটে আপনাকে ঠিক করতে হয় — কোন ধরন দরকার, আর কীভাবে পরিষ্কার করতে হবে।


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

TypeError: can only concatenate str (not "int") to str রূপান্তর বাদ পড়েছে। int(input(...)) বা float(input(...)) লিখুন।

গুণ করতে চেয়েছিলাম, কিন্তু লেখাটা বারবার ছাপা হচ্ছে "3" * 2 দেয় "33"। মানটা int করা হয়নি। ত্রুটি আসে না বলেই এই বাগটা বিপজ্জনক — সন্দেহ হলে type() ছেপে দেখুন।

ValueError: invalid literal for int() with base 10 ব্যবহারকারী যা লিখেছেন সেটা পূর্ণ সংখ্যা নয় — হয় শব্দ, নয়তো দশমিক, নয়তো কিছুই না (শুধু এন্টার)। দশমিকের সম্ভাবনা থাকলে float() ব্যবহার করুন।

প্রোগ্রাম কিছু না দেখিয়ে দাঁড়িয়ে আছে সে আপনার ইনপুটের অপেক্ষা করছে। input()-এ কোনো প্রশ্ন না দিলে স্ক্রিনে কিছুই আসে না, আর মনে হয় প্রোগ্রাম আটকে গেছে। সব সময় একটা প্রশ্ন দিন।

সম্পাদকের ভেতরে চালালে input() কাজ করছে না কিছু সম্পাদক বা অনলাইন ব্লকে ইনপুট নেওয়া যায় না। টার্মিনাল খুলে python bill.py দিয়ে চালান।

এন্টার চাপার পর একটা বাড়তি নতুন লাইন যাচ্ছে input() আপনার লেখা নেয়, কিন্তু শেষের নতুন লাইনটা রাখে না। যদি বাড়তি ফাঁকা লাইন দেখেন, সেটা সম্ভবত আপনার নিজের print() থেকে।