ব্যবহারকারীর কাছ থেকে ইনপুট নেওয়া
input() দিয়ে ইউজারের লেখা নেওয়া, সেটা কেন সব সময় str হয়, আর int() ও float() দিয়ে সংখ্যায় বদলানোর সময় কোন এররগুলো আসে।
কীভাবে শিখতে চান?
যে সমস্যাটা আমরা সমাধান করছি
এখন পর্যন্ত আমাদের প্রতিটা প্রোগ্রামের সংখ্যাগুলো ফাইলের ভেতরেই লেখা ছিল। অন্য কোনো সংখ্যা দিয়ে চালাতে চাইলে ফাইলটা খুলে বদলাতে হতো।
সত্যিকারের প্রোগ্রাম এভাবে চলে না। প্রোগ্রাম জিজ্ঞেস করে, আর ইউজার উত্তর দেন।
পাইথনে জিজ্ঞেস করার কাজটা input()-এর। শিখতে এক মিনিট লাগে। কিন্তু সাথে একটা নিয়ম আসে, যেটা প্রত্যেক নতুন প্রোগ্রামারকে অন্তত একবার আটকায়: input() যা ফেরত দেয় তা সব সময় স্ট্রিং — এমনকি ইউজার পরিষ্কার সংখ্যা লিখলেও। এই এক নিয়ম না জানলে প্রথম হিসাবের প্রোগ্রামটাই ভেঙে পড়ে।
এই অধ্যায় শেষে আপনি পারবেন
input()দিয়ে ইউজারের লেখা নিতে, সাথে একটা পরিষ্কার প্রশ্ন দেখাতে- বলতে কেন ইনপুট সব সময়
str int()আরfloat()দিয়ে সেটাকে সংখ্যায় বদলাতেTypeError,ValueErrorআর এরর ছাড়াই ভুল উত্তর — এই তিনটার পার্থক্য বুঝতে- ইনপুট পরিষ্কার করে নিতে, যাতে বাড়তি স্পেসে প্রোগ্রাম না ভাঙে
আগে যা জানা লাগবে: স্ট্রিং নিয়ে কাজ — ইনডেক্স, স্লাইস আর f-string।
input() কীভাবে কাজ করে
name = input("What is your name? ")
print(f"Hello, {name}!")চালালে:
What is your name? Rafi
Hello, Rafi!তিনটা জিনিস ঘটেছে। input() ব্র্যাকেটের ভেতরের প্রশ্নটা টার্মিনালে দেখিয়েছে; তারপর থেমে অপেক্ষা করেছে, যতক্ষণ না ইউজার কিছু লিখে এন্টার চাপেন; তারপর যা লেখা হয়েছে সেটা ফেরত দিয়েছে, আর আমরা তা name-এ রেখেছি।
খেয়াল করুন, প্রশ্নের শেষে একটা স্পেস দিয়েছি — "What is your name? "। ওই স্পেসটা না দিলে ইউজারের লেখা প্রশ্নের গায়ে লেগে যায়, দেখতে খারাপ লাগে।
এই প্রোগ্রামগুলো টার্মিনালেই চালাতে হবে।input()অপেক্ষা করে কেউ কিছু টাইপ করবে বলে, তাই কোনো ওয়েবসাইটে বা এডিটরের প্রিভিউতে এটা কাজ করে না। নিজের টার্মিনালেpython ask.pyলিখে চালান — এই কোর্সে সব সময় এভাবেই চলবে।
যে নিয়মটা সবাইকে একবার আটকায়
age = input("Your age: ")
print(type(age))
print("Next year:", age + 1)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। (File লাইনে আপনার ফাইলের পুরো ঠিকানা থাকে, তাই আপনার কম্পিউটারে সেটা আলাদা দেখাবে।)
কারণটা ভাবলে সোজা: কীবোর্ড থেকে আসে অক্ষর, সংখ্যা নয়। ইউজার 22, abc, 12.5 — যা খুশি লিখতে পারেন। input() নিজে থেকে আন্দাজ করতে পারত "এটা তো সংখ্যা, বদলে দিই" — কিন্তু তাহলে একই কোড কখনো str কখনো int ফেরত দিত, আর কী আসবে তা আগে থেকে বলা যেত না। তাই পাইথন একটাই নিয়ম রাখে: সব সময় স্ট্রিং। বদলানোর দায়িত্ব আপনার।
int() আর float()
age = input("Your age: ")
age = int(age)
print(type(age))
print("Next year:", age + 1)Your age: 22
<class 'int'>
Next year: 23দুটো ধাপ এক লাইনেও লেখা যায়, আর সাধারণত এভাবেই লেখা হয়:
age = int(input("Your age: "))
print("Next year:", age + 1)ভেতর থেকে বাইরে পড়ুন: input() স্ট্রিং এনেছে, int() সেটাকে পূর্ণসংখ্যায় বদলেছে, তারপর সেটা age-এ বসেছে।
দশমিক দরকার হলে float():
price = float(input("Price: "))
print("With tax:", round(price * 1.15, 2))Price: 249.50
With tax: 286.92কোনটা কখন: গোনা যায় এমন জিনিসে int (বয়স, সংখ্যা, পরিমাণ), মাপা যায় এমন জিনিসে float (দাম, ওজন, গড়)।
দুটো এরর, আর একটা ভুল যেটা এরর দেয় না
রূপান্তর ভুলে গেলে বা ভুল ইনপুট এলে তিন রকম ঘটনা ঘটতে পারে। নামগুলো গুলিয়ে ফেলা সহজ, তাই আলাদা করে দেখে নিন।
TypeError — টাইপটাই ভুল। রূপান্তরের কথা ভুলে গিয়ে স্ট্রিংয়ের সাথে সংখ্যা যোগ করতে চেয়েছেন:
qty = input("Quantity: ")
print(qty + 2)Quantity: 3
Traceback (most recent call last):
File "D:\python-lab\lesson-07\ask.py", line 2, in <module>
print(qty + 2)
~~~~^~~
TypeError: can only concatenate str (not "int") to strqty-তে আছে স্ট্রিং "3", আর স্ট্রিংয়ের সাথে + দিয়ে শুধু আরেকটা স্ট্রিং জোড়া যায়, সংখ্যা নয়। পাইথন আন্দাজ করে না আপনি যোগ চেয়েছিলেন না জোড়া — তাই থেমে যায়।
কোনো এরর নেই — শুধু ভুল উত্তর। এবার +-এর বদলে * লিখুন, রূপান্তর এখনো নেই:
qty = input("Quantity: ")
print(qty * 2)Quantity: 3
33এবার কোনো এররই আসেনি। "3" * 2 মানে স্ট্রিংটা দুবার — "33"। প্রোগ্রাম চলল, উত্তর ভুল। নীরব ভুল এররের চেয়েও খারাপ, কারণ কেউ আপনাকে থামিয়ে জানায় না।
ValueError — টাইপ ঠিক, কিন্তু ভেতরের স্ট্রিংটা সংখ্যা নয়:
age = int(input("Your age: "))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' দিয়ে করা যায় না। মেসেজটা কারণটাও বলে দিচ্ছে — কোন ভ্যালুটা মানা যায়নি, সেটা শেষে কোটেশনের ভেতরে লেখা আছে।
একটা সূক্ষ্ম কিন্তু বাস্তব ফাঁদ:
count = int(input("Count: "))12.5 লিখলে এটাও ValueError দেবে — কারণ int() দশমিকওয়ালা স্ট্রিং নেয় না। দশমিক আসার সম্ভাবনা থাকলে float() দিয়ে নিন, তারপর দরকার হলে int() করুন।
এই এররগুলো ঠেকানোর পুরো উপায় এখনো আমাদের হাতে নেই — তার জন্য শর্ত আর লুপ দুটোই লাগবে, আর দুটোই সামনের অধ্যায়গুলোতে আসছে। আপাতত এররটা চিনে রাখুন আর মেসেজটা পড়তে শিখুন।
ইনপুট পরিষ্কার করে নিন
মানুষ টাইপ করার সময় বাড়তি স্পেস দেয়, বড় হাতের অক্ষর মেশায়। আগের অধ্যায়ের মেথডগুলোই এখানে কাজে লাগে:
full_name = input("Name: ").strip().title()
answer = input("Continue? (yes/no) ").strip().lower()
print(f"Name is {full_name}")
print(f"Answer is {answer}")Name: rafi ahmed
Continue? (yes/no) YES
Name is Rafi Ahmed
Answer is yesinput() থেকে আসা স্ট্রিংয়ে .strip() চালানোটা অভ্যাস করে ফেলুন। ইউজারের একটা বাড়তি স্পেসে প্রোগ্রাম ভাঙার কোনো কারণ নেই।
একটা সম্পূর্ণ উদাহরণ
bill.py:
# 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}")--- 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() থেকে আসছে।
ধাপ ৪ / ৬ — অনুমান
যাচাই করুন
ইউজার 42 লিখে এন্টার চাপলেন। দ্বিতীয় লাইনটা কী প্রিন্ট করবে?
value = input("Number: ")
print(type(value))- A<class 'input'>
- B<class 'int'>
- C<class 'float'>
- D<class 'str'>
ইউজার 3 লিখেছেন, আর প্রোগ্রাম প্রিন্ট করেছে Doubled: 33। কোনো এরর আসেনি। কেন এমন হলো, আর সমাধান কী?
qty = input("Quantity: ")
print("Doubled:", qty * 2)- A`qty * 2`-এর বদলে `qty + qty` লিখলে ঠিক হবে
- B`print`-এ কমার বদলে `+` ব্যবহার করতে হবে
- C`input()` সংখ্যা নিতে পারে না, তাই এর বদলে অন্য ফাংশন লাগবে
- D`qty` একটা `str`, আর স্ট্রিংকে সংখ্যা দিয়ে গুণ করলে সেটা বারবার বসে — `int(qty) * 2` লিখতে হবে
ইউজার 12.5 লিখলে কী ঘটবে?
count = int(input("Count: "))
print(count + 1)- A`ValueError` — `int()` দশমিকওয়ালা স্ট্রিং নেয় না; দরকার হলে `float()` দিয়ে নিতে হবে
- B`count` হবে `12`, কারণ `int()` দশমিকের পরের অংশ কেটে দেয়
- C`TypeError` — কারণ ইনপুট আর ভেরিয়েবলের টাইপ মেলেনি
- D`count` হবে `13`, কারণ `int()` কাছের পূর্ণসংখ্যায় রাউন্ড করে
উত্তর দিতে অ্যাকাউন্ট লাগবে
উত্তর মিলিয়ে দেখতে সাইন ইন করুন
প্রশ্নগুলো উপরে আছে, আর মাথায় মাথায় উত্তর ভেবে নেওয়াই আসল কাজ। সঠিক উত্তর, ব্যাখ্যা আর তিন ধাপের ইঙ্গিত দেখতে সাইন ইন করুন।
নিজে করুন
travel.py নামে একটা ফাইল লিখুন, যেটা চারটা প্রশ্ন করে আর একটা ছোট হিসাব দেখায়:
- যাত্রীর নাম (পরিষ্কার করে, প্রথম অক্ষর বড় হাতের)
- কতজন যাত্রী (পূর্ণসংখ্যা)
- জনপ্রতি ভাড়া (দশমিক)
- ছাড়ের হার শতাংশে (দশমিক)
তারপর প্রিন্ট করবে — মোট ভাড়া, ছাড়ের পরিমাণ, আর শেষে কত দিতে হবে, তিনটাই দশমিকের পর দুই ঘর পর্যন্ত।
কাজ শেষে তিনবার ইচ্ছে করে ভাঙার চেষ্টা করুন:
- যাত্রীসংখ্যায়
twoলিখুন — কোন এরর আসে, আর মেসেজটা কী বলছে? - যাত্রীসংখ্যায়
2.5লিখুন — কী হয়, আর কেন? - নামের আগে-পরে কয়েকটা স্পেস দিন — আউটপুট কি ঠিক থাকে?
শেষ প্রশ্নটার উত্তর যদি "হ্যাঁ" হয়, আপনি এখনই একজন সাধারণ শিক্ষানবিশের চেয়ে ভালো কোড লিখছেন। বাকি দুটোর সমাধান আসবে শর্ত আর লুপ শেখার পর।
এই মিশনে আরও কিছু আছে
উপরে যা পড়েছেন সেটাই সম্পূর্ণ মিশন — কিছু কেটে রাখা হয়নি। প্রো এর সাথে যোগ করে:
- ভেতরে আসলে কী ঘটে — পাইথন কীভাবে এটা চালায়
- অনুশীলনীর সম্পূর্ণ সমাধান, ধাপে ধাপে ব্যাখ্যাসহ
- কঠিন অতিরিক্ত অনুশীলনী
- এই বিষয়ে ইন্টারভিউতে যা জিজ্ঞেস করা হয়, আর তার আদর্শ উত্তর
ধাপ ৬ / ৬
কঠিন করা — অধ্যায়ের কুইজ
সহজ থেকে কঠিন — দশটি প্রশ্ন, শেষেরগুলো ইচ্ছে করেই কঠিন।
সাইন ইন করে কুইজ দিন