কম্পিউটার টিউটোরিয়াল

পাইথন typeerror: not all arguments converted during string formatting

পাইথন নিয়ম মেনে চলতে খুব কঠোর। পাইথন ভাষার একটি প্রধান বৈশিষ্ট্য আপনাকে চেক করে রাখে যাতে আপনার প্রোগ্রামগুলি আপনার ইচ্ছামতো কাজ করে। আপনি স্ট্রিং নিয়ে কাজ করার সময় "not all arguments converted during string formatting" এররটি এনকাউন্টার করতে পারেন।

এই গাইডে, আমরা এই এরর এবং কেন এটি পপ আপ হয় সেটি আলোচনা করব। আমরা এই এরর উঠার দুটি সাধারণ সিনেরিওর মাধ্যমে যাব যাতে আপনি আপনার কোডে এটি সমাধান করতে পারেন।

আর দেরি না করে, চলুন শুরু করি!

সমস্যাটি: typeerror: not all arguments converted during string formatting

একটি TypeError হল একটি টাইপের এরর যা বলে দেয় আমরা একটি এমন টাস্ক পারফর্ম করছি যা একটি নির্দিষ্ট টাইপের ভ্যালুতে এক্সিকিউট করা যায় না। এই কেসে, আমাদের টাইপ এরর একটি স্ট্রিং ভ্যালু से রিলেটেড।

পাইথন স্ট্রিং ফরম্যাট করার অনেক উপায় অফার করে। এটি আপনাকে স্ট্রিং-এ ভ্যালু ইনসার্ট করতে বা একটি স্ট্রিং-এর শেষে ভ্যালু কনক্যাটেনেট করতে দেয়।

স্ট্রিং ফরম্যাট করার দুটি সবচেয়ে সাধারণ উপায় হল:

  • % অপারেটর ব্যবহার করা (পুরনো-স্টাইল)
  • .format() ফাংশনের সাথে {} অপারেটর ব্যবহার করা

যখন আপনি এই দুটি সিনট্যাক্স একসাথে ব্যবহার করার চেষ্টা করেন, একটি এরর উঠে।

উদাহরণ: স্ট্রিং ফরম্যাটিং রুল মিক্স করা

চলুন একটি প্রোগ্রাম লিখি যা একটি বেকেরিতে বিক্রি হওয়া একটি প্রোডাক্টের ৫% প্রাইস ইনক্রিজ ক্যালকুলেট করে।

আমরা ইউজার থেকে দুটি তথ্য কালেক্ট করে শুরু করি: প্রোডাক্টের নাম এবং প্রোডাক্টের প্রাইস। আমরা এটি input() স্টেটমেন্ট ব্যবহার করে করি:

name = input("Enter the name of the product: ")
price = input("Enter the price of the product: ")

পরবর্তীতে, আমরা প্রোডাক্টের নতুন প্রাইস ক্যালকুলেট করি "price" এর মানকে ১.০৫ দিয়ে গুণ করে। এতে ৫% প্রাইস ইনক্রিজ রিপ্রেজেন্ট করে:

increase = round(float(price) * 1.05, 2)

আমরা "increase" এর মানকে দুই দশমিক স্থান পর্যন্ত রাউন্ড করি round() স্টেটমেন্ট ব্যবহার করে। অবশেষে, স্ট্রিং ফরম্যাটিং ব্যবহার করে প্রোডাক্টের নতুন প্রাইস কনসোলে প্রিন্ট আউট করি:

print("The new price of {} is ${}. " % name, str(increase))

এই কোডটি "name" এবং "increase" এর মানগুলো আমাদের স্ট্রিং-এ অ্যাড করে। আমরা "increase" কে একটি স্ট্রিং-এ কনভার্ট করি যাতে এটি আমাদের স্ট্রিং-এ মার্জ হয়। কনভার্ট করার আগে, "increase" একটি ফ্লোটিং-পয়েন্ট নম্বর। আমাদের কোড রান করি এবং দেখি কী হয়:

Traceback (most recent call last):
File "main.py", line 6, in 
print("The new price of {} is {}" % name, str(discount))
TypeError: not all arguments converted during string formatting

লগত আমাদের কোডের লাস্ট লাইনে একটি এরর আছে।

সমস্যাটি হল আমরা আমাদের স্ট্রিং ফরম্যাটিং সিনট্যাক্স মিক্স আপ করেছি। আমরা {} এবং % অপারেটর উভয়ই ব্যবহার করেছি। এগুলো দুটি ভিন্ন টাইপের স্ট্রিং ফরম্যাটিংয়ের জন্য ব্যবহার করা হয়।

এই সমস্যাটি সমাধান করতে, আমরা আমাদের প্রোগ্রামের লাস্ট লাইনের নিচের দুটি লাইনের যেকোনো একটি দিয়ে রিপ্লেস করি:

print("The new price of {} is ${}.".format(name, str(increase)))
print("The new price of %s is $%s." % (name, str(increase)))

কোডের প্রথম লাইন .format() সিনট্যাক্স ব্যবহার করে। এটি {} এর মানগুলাকে .format() স্টেটমেন্টে স্পেসিফাই করা মানগুলোর সাথে রিপ্লেস করে ক্রম অনুযায়ী।

কোডের দ্বিতীয় লাইন পুরনো-স্টাইল % স্ট্রিং ফরম্যাটিং টেকনিক ব্যবহার করে। "%s" মানগুলো প্যারেনথেসিসে এনক্লোজ করা % অপারেটরের পরের মানগুলোর সাথে রিপ্লেস হয়।

আবার আমাদের কোড রান করি এবং দেখি কী হয়:

Enter the name of the product: Babka
Enter the price of the product: 2.50
The new price of Babka is $2.62.

আমাদের কোড সফলভাবে আমাদের আর্গুমেন্টগুলো আমাদের স্ট্রিং-এ অ্যাড করল।

উদাহরণ: মডুলো অপারেটর কনফিউজ করা

পাইথন পার্সেন্টেজ সাইন (%) ব্যবহার করে মডুলো নম্বর ক্যালকুলেট করে এবং স্ট্রিং ফরম্যাটিং। মডুলো নম্বর হল একটি ডিভিশন সমের পর বাকি থাকা রিমেইন্ডার।

যদি আপনি একটি স্ট্রিং-এ পার্সেন্টেজ সাইন ব্যবহার করেন, সেটি ফরম্যাটিংয়ের জন্য ব্যবহার হয়; যদি আপনি একটি নম্বরে পার্সেন্টেজ সাইন ব্যবহার করেন, সেটি মডুলো ক্যালকুলেট করার জন্য ব্যবহার হয়। অতএব, যদি একটি ভ্যালু স্ট্রিং হিসেবে ফরম্যাট করা থাকে যেন আপনি সেটিতে মডুলো ক্যালকুলেশন পারফর্ম করতে চান, একটি এরর উঠে।

একটি প্রোগ্রাম দেখুন যা ক্যালকুলেট করে একটি নম্বর অড্ড বা ইভেন কিনা:

number = input("Please enter a number: ")
mod_calc = number % 2
if mod_calc == 0:
    print("This number is even.")
else:
    print("This number is odd.")

প্রথমে, আমরা ইউজারকে একটি নম্বর ইনপুট দিতে বলি। তারপর আমরা মডুলো অপারেটর ব্যবহার করে রিমেইন্ডার ক্যালকুলেট করি যা রিটার্ন হয় যখন "number" ২ দিয়ে ভাগ করা হয়।

যদি মডুলো অপারেটর দ্বারা রিটার্ন করা ভ্যালু ০-এর সমান হয়, আমাদের if স্টেটমেন্টের কন্টেন্ট এক্সিকিউট হয়। অন্যথায়, else স্টেটমেন্টটি রান করে।

চলুন আমাদের কোড রান করি:

Please enter a number: 7
Traceback (most recent call last):
File "main.py", line 2, in 
mod_calc = number % 2
TypeError: not all arguments converted during string formatting

আরেকটি TypeError। এই এররটি উঠেছে কারণ "number" একটি স্ট্রিং। input() মেথড একটি স্ট্রিং রিটার্ন করে। আমাদের "number" কে একটি ফ্লোটিং-পয়েন্ট বা ইন্টিজারে কনভার্ট করতে হবে যদি আমরা মডুলো ক্যালকুলেশন পারফর্ম করতে চাই।

আমরা float() ফাংশন ব্যবহার করে "number" কে একটি ফ্লোট-এ কনভার্ট করতে পারি:

mod_calc = float(number) % 2

আবার আমাদের কোড ট্রাই করি:

Please enter a number: 7
This number is odd.

আমাদের কোড কাজ করল!

উপসংহার

"not all arguments converted during string formatting" এররটি উঠে যখন পাইথন একটি স্ট্রিং ফরম্যাট অপারেশনে সব আর্গুমেন্ট অ্যাড করে না। এটি হয় যদি আপনি আপনার স্ট্রিং ফরম্যাটিং সিনট্যাক্স মিক্স আপ করেন অথবা আপনি একটি স্ট্রিং-এ মডুলো অপারেশন পারফর্ম করার চেষ্টা করেন।

এখন আপনি এই সাধারণ পাইথন এররটি প্রফেশনাল সফটওয়্যার ইঞ্জিনিয়ারের মতো সমাধান করার জন্য রেডি!

  1. দেওয়া স্ট্রিংটি পাইথন কিওয়ার্ড কিনা চেক করার প্রোগ্রাম

  2. দেওয়া স্ট্রিংয়ের সকল পারমিউটেশন প্রিন্ট করার পাইথন প্রোগ্রাম

  3. পাইথনে প্যালিনড্রোম স্ট্রিং চেক করা

  4. পাইথনে বাক্য প্যাংগ্রাম (pangram) কিনা যাচাই করার প্রোগ্রাম