ব্যবহারকারীর কাছ থেকে ইনপুট নেওয়া
input() দিয়ে ব্যবহারকারীর লেখা নেওয়া, সেটি কেন সব সময় str হয়, আর int() ও float() দিয়ে সংখ্যায় বদলানোর সময় কোন ত্রুটিগুলো আসে।
- 1সমস্যা
- 2বোঝা
- 3উদাহরণ
- 4অনুমান
- 5নিজে করা
- 6কঠিন করা
যে সমস্যাটা আমরা সমাধান করছি
এখন পর্যন্ত আমাদের প্রতিটি প্রোগ্রামের সংখ্যাগুলো ফাইলের ভেতরেই লেখা ছিল। অন্য কোনো সংখ্যা দিয়ে চালাতে চাইলে ফাইলটা খুলে বদলাতে হত।
সত্যিকারের প্রোগ্রাম এভাবে চলে না। প্রোগ্রাম জিজ্ঞেস করে, আর ব্যবহারকারী উত্তর দেয়।
পাইথনে জিজ্ঞেস করার কাজটা 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।
কারণটা ভাবলে সোজা: কীবোর্ড থেকে আসে অক্ষর, সংখ্যা নয়। ব্যবহারকারী 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
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 'str'>
- B<class 'int'>
- C<class 'float'>
- D<class 'input'>
ব্যবহারকারী 3 লিখেছেন, আর প্রোগ্রাম ছেপেছে Doubled: 33। কোনো ত্রুটি আসেনি। কেন এমন হলো, আর সমাধান কী?
qty = input("Quantity: ")
print("Doubled:", qty * 2)- A`qty` একটি `str`, আর লেখাকে সংখ্যা দিয়ে গুণ করলে সেটি পুনরাবৃত্তি হয় — `int(qty) * 2` লিখতে হবে
- B`print`-এ কমার বদলে `+` ব্যবহার করতে হবে
- C`qty * 2`-এর বদলে `qty + qty` লিখলে ঠিক হবে
- D`input()` সংখ্যা নিতে পারে না, তাই এর বদলে অন্য ফাংশন লাগবে
ব্যবহারকারী 12.5 লিখলে কী ঘটবে?
count = int(input("Count: "))
print(count + 1)- A`ValueError` — `int()` দশমিকযুক্ত লেখা নেয় না; দরকার হলে `float()` দিয়ে নিতে হবে
- B`count` হবে `12`, কারণ `int()` দশমিকের পরের অংশ কেটে দেয়
- C`count` হবে `13`, কারণ `int()` নিকটতম সংখ্যায় গোল করে
- D`TypeError` — কারণ ইনপুট আর ভেরিয়েবলের ধরন মেলেনি
উত্তর দিতে অ্যাকাউন্ট লাগবে
উত্তর মিলিয়ে দেখতে সাইন ইন করুন
প্রশ্নগুলো উপরে আছে, আর মাথায় মাথায় উত্তর ভেবে নেওয়াই আসল কাজ। সঠিক উত্তর, ব্যাখ্যা আর তিন ধাপের ইঙ্গিত দেখতে সাইন ইন করুন।
নিজে করুন
travel.py নামে একটা ফাইল লিখুন, যেটি চারটি প্রশ্ন করে আর একটা ছোট হিসাব দেখায়:
- যাত্রীর নাম (পরিষ্কার করে, প্রথম অক্ষর বড় হাতের)
- কতজন যাত্রী (পূর্ণ সংখ্যা)
- জনপ্রতি ভাড়া (দশমিক)
- ছাড়ের হার শতাংশে (দশমিক)
তারপর ছাপবে — মোট ভাড়া, ছাড়ের পরিমাণ, আর শেষ দেয় অঙ্ক, তিনটিই দশমিকের পর দুই ঘর পর্যন্ত।
কাজ শেষে তিনবার ইচ্ছে করে ভাঙার চেষ্টা করুন:
- যাত্রীসংখ্যায়
twoলিখুন — কোন ত্রুটি আসে, আর বার্তাটা কী বলছে? - যাত্রীসংখ্যায়
2.5লিখুন — কী হয়, আর কেন? - নামের আগে-পরে কয়েকটা স্পেস দিন — আউটপুট কি ঠিক থাকে?
শেষ প্রশ্নটার উত্তর যদি "হ্যাঁ" হয়, আপনি ইতিমধ্যেই একজন সাধারণ শিক্ষানবিশের চেয়ে ভালো কোড লিখছেন। বাকি দুটোর সমাধান আসবে শর্ত আর লুপ শেখার পর।
এই মিশনে আরও কিছু আছে
উপরে যা পড়েছেন সেটাই সম্পূর্ণ মিশন — কিছু কেটে রাখা হয়নি। প্রো এর সাথে যোগ করে:
- ভেতরে আসলে কী ঘটে — পাইথন কীভাবে এটা চালায়
- অনুশীলনীর সম্পূর্ণ সমাধান, ধাপে ধাপে ব্যাখ্যাসহ
- কঠিন অতিরিক্ত অনুশীলনী
- এই বিষয়ে ইন্টারভিউতে যা জিজ্ঞেস করা হয়, আর তার আদর্শ উত্তর
ধাপ ৬ / ৬
কঠিন করা — অধ্যায়ের কুইজ
সহজ থেকে কঠিন — দশটি প্রশ্ন, শেষেরগুলো ইচ্ছে করেই কঠিন।
সাইন ইন করে কুইজ দিন