কম্পিউটার

Python TypeError:'NoneType' বস্তুটি পুনরাবৃত্তিযোগ্য সমাধান নয়

পাইথনের সাথে, আপনি শুধুমাত্র একটি বস্তুর উপর পুনরাবৃত্তি করতে পারেন যদি সেই বস্তুর একটি মান থাকে। এটি কারণ পুনরাবৃত্তিযোগ্য বস্তুর শুধুমাত্র একটি পরবর্তী আইটেম আছে যা অ্যাক্সেস করা যেতে পারে যদি তাদের মান কোনটির সমান না হয়। আপনি যদি কোনটি নয় বস্তুর উপর পুনরাবৃত্তি করার চেষ্টা করেন তবে আপনি TypeError: ‘NoneType’ object is not iterable ত্রুটি.

এই নির্দেশিকায়, আমরা এই ত্রুটির অর্থ কী এবং কেন আপনি এটির সম্মুখীন হতে পারেন সে সম্পর্কে কথা বলি৷ এই সাধারণ পাইথন ত্রুটিটি কীভাবে সমাধান করা যায় তা সমাধান করার জন্য আমরা একটি উদাহরণ দিয়ে চলেছি।

TypeError:'NoneType' বস্তুটি পুনরাবৃত্তিযোগ্য নয়

একটি বস্তু পুনরাবৃত্তিযোগ্য হওয়ার জন্য, এটিতে একটি মান থাকতে হবে। A None মান পুনরাবৃত্তিযোগ্য নয় কারণ এতে কোনো বস্তু নেই। কোনোটিই শূন্য মান উপস্থাপন করে না।

একটি নয় বস্তু এবং একটি খালি পুনরাবৃত্তিযোগ্য মধ্যে একটি পার্থক্য আছে। আপনার কোনো খালি তালিকা বা একটি স্ট্রিং থাকলে এই ত্রুটিটি উত্থাপিত হয় না।

এটি কারণ তালিকা এবং স্ট্রিংগুলির একটি পুনরাবৃত্তিযোগ্য ডেটা টাইপ রয়েছে। যখন পাইথন ইন্টারপ্রেটার একটি খালি তালিকার মুখোমুখি হয়, তখন এটির উপর পুনরাবৃত্তি করে না কারণ কোন মান নেই। Python একটি None মানের উপর পুনরাবৃত্তি করতে পারে না তাই দোভাষী একটি ত্রুটি ফেরত দেয়।

যখন আপনি একটি ফাংশন ঘোষণা করেন এবং একটি মান ফেরত দিতে ভুলে যান তখন এই ত্রুটিটি সাধারণ।

একটি উদাহরণ দৃশ্য

আসুন একটি প্রোগ্রাম লিখি যা শিক্ষার্থীদের নামের একটি তালিকা নেয় এবং "E" দিয়ে শুরু হওয়াগুলিকে ফিল্টার করে। আমরা সেই মানগুলি কনসোলে প্রিন্ট করব।

একটি ফাংশন সংজ্ঞায়িত করে শুরু করুন যা ছাত্রদের নাম ফিল্টার করে:

81% অংশগ্রহণকারী বলেছেন যে তারা বুটক্যাম্পে যোগ দেওয়ার পরে তাদের প্রযুক্তিগত কাজের সম্ভাবনা সম্পর্কে আরও আত্মবিশ্বাসী বোধ করেছেন। আজই একটি বুটক্যাম্পের সাথে মিলিত হন৷

গড় বুটক্যাম্প গ্র্যাড একটি বুটক্যাম্প শুরু করা থেকে শুরু করে তাদের প্রথম চাকরি খোঁজা পর্যন্ত ক্যারিয়ারের পরিবর্তনে ছয় মাসেরও কম সময় ব্যয় করেছে।

def filter_students(class_names):
	new_class_names = []
	for c in class_names:
		if c.startswith("E"):
			new_class_names.append(c)

এই ফাংশন একটি লুপ ব্যবহার করে "class_names" তালিকার প্রতিটি আইটেমের মধ্যে লুপ করে। প্রতিটি আইটেমের জন্য, আমাদের লুপ পরীক্ষা করে যে আইটেমটি "E" অক্ষর দিয়ে শুরু হয় কিনা। যদি এটি হয়, সেই নামটি "নতুন_শ্রেণির_নাম" তালিকায় যোগ করা হবে।

এর পরে, একটি ফাংশন লিখুন যা আমাদের নতুন তালিকার মধ্য দিয়ে যায় এবং কনসোলে প্রতিটি মান প্রিন্ট করে:

def show_students(class_names):
	for c in class_names:
		print(c)

এখানে, আমরা শিক্ষার্থীদের একটি তালিকা ঘোষণা করি যার মাধ্যমে আমাদের প্রোগ্রাম অনুসন্ধান করা উচিত। আমরা আমাদের filter_students ফাংশনের মাধ্যমে শিক্ষার্থীদের এই তালিকাটি পাস করি:

students = ["Elena", "Peter", "Chad", "Sam"]
students_e_name = filter_students(students)

এই কোডটি ফিল্টার_স্টুডেন্টস ফাংশন চালায় যা সমস্ত ছাত্রদের খুঁজে বের করে যাদের নাম “E” দিয়ে শুরু হয়। যে ছাত্রদের নাম “E” দিয়ে শুরু হয় তাদের তালিকা ছাত্রদের_e_name বলা হয়। এরপরে, শিক্ষার্থীদের নতুন তালিকা দেখানোর জন্য আমরা আমাদের show_students ফাংশনকে কল করি:

show_students(students_e_name)

আসুন আমাদের কোড চালাই এবং দেখুন কি হয়:

Traceback (most recent call last):
  File "main.py", line 14, in <module>
	show_students(students_e_name)
  File "main.py", line 8, in show_students
	for c in class_names:
TypeError: 'NoneType' object is not iterable

আমাদের কোড একটি ত্রুটি বার্তা প্রদান করে৷

সমাধান

যখন আমরা শো_স্টুডেন্টস ফাংশনে ভেরিয়েবল ক্লাস_নামগুলির উপর পুনরাবৃত্তি করার চেষ্টা করি, তখন আমাদের কোড একটি নেই মান সনাক্ত করে এবং একটি ত্রুটি উত্থাপন করে। এর কারণ হল যে মানটি আমরা "class_names" হিসাবে পাস করেছি তা নেই।

আমাদের filter_students ফাংশন একটি মান ফেরত না দেওয়ার কারণে এই ত্রুটিটি হয়েছে৷ যখন আমরা filter_students ফাংশনের ফলাফল ভেরিয়েবল student_e_name কে বরাদ্দ করি, তখন মানটি None সেট করা হয়।

এই ত্রুটিটি সমাধান করতে, আমাদের ফিল্টার_স্টুডেন্টস ফাংশনে একটি মান ফেরত দিতে হবে:

def filter_students(class_names):
	new_class_names = []
	for c in class_names:
		if c.startswith("E"):
			new_class_names.append(c)
      # We have added a return statement here
	return new_class_names
        
def show_students(class_names):
	for c in class_names:
		print(c)
    
students = ["Elena", "Peter", "Chad", "Sam"]
students_e_name = filter_students(students)

show_students(students_e_name)

এই কোডটি new_class_names এর মান মূল প্রোগ্রামে ফিরিয়ে দেয়।

এটি কাজ করে কিনা তা দেখতে আমাদের কোড চালাই:

Elena

আমাদের কোড এখন সফলভাবে ছাত্রদের নাম প্রিন্ট করে যাদের নাম “E” দিয়ে শুরু হয়।

NoneType ব্যতিক্রম এড়ানো

টেকনিক্যালি, আপনি সেই মানের উপর পুনরাবৃত্তি করার আগে একটি মান None-এর সমান কিনা তা পরীক্ষা করে NoneType ব্যতিক্রম এড়াতে পারেন। নিম্নলিখিত কোড বিবেচনা করুন:

def filter_students(class_names):
	new_class_names = []
	for c in class_names:
		if c.startswith("E"):
			new_class_names.append(c)
	return new_class_names

def show_students(class_names):
	if class_names is not None:
		for c in class_names:
			print(c)
            
students = ["Elena", "Peter", "Chad", "Sam"]
students_e_name = filter_students(students)

show_students(students_e_name)

"show_students()" ফাংশনটি সফলভাবে সঞ্চালিত হয় কারণ আমরা এটির উপর পুনরাবৃত্তি করার চেষ্টা করার আগে class_names একটি None মান কিনা তা পরীক্ষা করে দেখি। বেশিরভাগ ক্ষেত্রে এটি একটি সর্বোত্তম অনুশীলন নয় কারণ একটি NoneType ত্রুটির কারণ আপনার কোডের অন্য কোথাও সমস্যা হতে পারে।

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



উপসংহার

TypeError: ‘NoneType’ object is not iterable ত্রুটি উত্থাপিত হয় যখন আপনি একটি বস্তুর উপর পুনরাবৃত্তি করার চেষ্টা করেন যার মান কোনটির সমান নয়।

এই ত্রুটিটি সমাধান করতে, নিশ্চিত করুন যে আপনি যে মানগুলি পুনরাবৃত্তি করার চেষ্টা করছেন সেগুলিকে একটি পুনরাবৃত্তিযোগ্য বস্তু বরাদ্দ করা হয়েছে, যেমন একটি স্ট্রিং বা একটি তালিকা। আমাদের উদাহরণে, আমরা একটি ফাংশনে একটি "রিটার্ন" বিবৃতি যোগ করতে ভুলে গেছি। এটি একটি তালিকার পরিবর্তে ফাংশনটি None প্রদান করেছে।

এখন আপনি আপনার নিজের কোডে এই সাধারণ পাইথন ত্রুটিটি সমাধান করতে প্রস্তুত৷


  1. TypeError:'undefined' জাভাস্ক্রিপ্টে কোনো বস্তু নয়

  2. পাইথন পুনরাবৃত্তিযোগ্য এবং পুনরাবৃত্তিকারীর মধ্যে পার্থক্য

  3. পাইথনে 'নট ইন' অপারেটর কী করে?

  4. কিভাবে আমরা পাইথনে একই সাথে বেশ কয়েকটি ভেরিয়েবলের মান নির্ধারণ করব?