Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Python

पायथन लेखन त्रुटि:'कोई नहीं' वस्तु पुनरावर्तनीय समाधान नहीं है

पायथन के साथ, आप किसी वस्तु पर केवल तभी पुनरावृति कर सकते हैं जब उस वस्तु का कोई मूल्य हो। ऐसा इसलिए है क्योंकि चलने योग्य वस्तुओं में केवल एक अगला आइटम होता है जिसे एक्सेस किया जा सकता है यदि उनका मान किसी के बराबर नहीं है। यदि आप किसी ऑब्जेक्ट पर पुनरावृति करने का प्रयास करते हैं, तो आपको TypeError: ‘NoneType’ object is not iterable का सामना करना पड़ता है। त्रुटि।

इस गाइड में, हम इस बारे में बात करते हैं कि इस त्रुटि का क्या अर्थ है और आपको इसका सामना क्यों करना पड़ सकता है। इस सामान्य पायथन त्रुटि को हल करने के तरीके को हल करने में आपकी सहायता के लिए हम एक उदाहरण के माध्यम से चलते हैं।

TypeError:'NoneType' ऑब्जेक्ट चलने योग्य नहीं है

किसी वस्तु के चलने योग्य होने के लिए, उसमें एक मान होना चाहिए। कोई नहीं मान चलने योग्य नहीं है क्योंकि इसमें कोई ऑब्जेक्ट नहीं है। कोई भी शून्य मान का प्रतिनिधित्व नहीं करता है।

कोई नहीं वस्तु और एक खाली चलने योग्य के बीच अंतर है। यदि आपके पास कोई खाली सूची या स्ट्रिंग है तो यह त्रुटि नहीं उठाई जाती है।

ऐसा इसलिए है क्योंकि सूचियों और स्ट्रिंग्स में एक पुनरावृत्त डेटा प्रकार होता है। जब पायथन दुभाषिया एक खाली सूची का सामना करता है, तो यह उस पर पुनरावृति नहीं करता है क्योंकि कोई मूल्य नहीं हैं। पायथन किसी भी मूल्य पर पुनरावृति नहीं कर सकता है, इसलिए दुभाषिया एक त्रुटि देता है।

जब आप कोई फ़ंक्शन घोषित करते हैं और कोई मान वापस करना भूल जाते हैं तो यह त्रुटि आम है।

एक उदाहरण परिदृश्य

आइए एक प्रोग्राम लिखें जो छात्रों के नामों की एक सूची लेता है और "ई" से शुरू होने वाले नामों को फ़िल्टर करता है। हम उन मानों को कंसोल पर प्रिंट करेंगे।

छात्रों के नामों को फ़िल्टर करने वाले फ़ंक्शन को परिभाषित करके प्रारंभ करें:

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" सूची में प्रत्येक आइटम के माध्यम से लूप करता है। प्रत्येक आइटम के लिए, हमारा लूप जांचता है कि आइटम "ई" अक्षर से शुरू होता है या नहीं। यदि ऐसा होता है, तो वह नाम "new_class_names" सूची में जोड़ दिया जाता है।

इसके बाद, एक फ़ंक्शन लिखें जो हमारी नई सूची के माध्यम से जाता है और प्रत्येक मान को कंसोल पर प्रिंट करता है:

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)

यह कोड filter_students फ़ंक्शन निष्पादित करता है जो उन सभी छात्रों को ढूंढता है जिनके नाम "ई" से शुरू होते हैं। जिन छात्रों के नाम "ई" से शुरू होते हैं, उनकी सूची को student_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

हमारा कोड एक त्रुटि संदेश देता है।

समाधान

जब हम show_students फ़ंक्शन में वेरिएबल class_names पर पुनरावृति करने का प्रयास करते हैं, तो हमारा कोड कोई नहीं मान का पता लगाता है और एक त्रुटि उत्पन्न करता है। ऐसा इसलिए है क्योंकि हमने जो मान "class_names" के रूप में पारित किया है वह कोई नहीं है।

यह त्रुटि इसलिए होती है क्योंकि हमारा filter_students फ़ंक्शन कोई मान नहीं लौटाता है। जब हम filter_students फ़ंक्शन के परिणाम को वेरिएबल Students_e_name पर असाइन करते हैं, तो कोई भी मान सेट नहीं होता है।

इस त्रुटि को हल करने के लिए, हमें अपने filter_students फ़ंक्शन में एक मान वापस करना होगा:

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

हमारा कोड अब उन छात्रों के नाम सफलतापूर्वक प्रिंट करता है जिनके नाम "ई" से शुरू होते हैं।

कोई नहीं टाइप अपवाद से बचना

तकनीकी रूप से, आप उस मान पर पुनरावृति करने से पहले यह जाँच कर कि कोई मान किसी के बराबर नहीं है, आप किसी भी प्रकार के अपवाद से बच सकते हैं। निम्नलिखित कोड पर विचार करें:

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 कोई मूल्य नहीं है। ज्यादातर मामलों में यह सबसे अच्छा अभ्यास नहीं है क्योंकि किसी भी प्रकार की त्रुटि का कारण आपके कोड में कहीं और समस्या हो सकती है।

यदि हम अपने पूरे कार्यक्रम में "कोई नहीं है" चेक जोड़ते हैं, तो हम नहीं जानते कि हम किसी अन्य फ़ंक्शन में रिटर्न स्टेटमेंट से चूक गए हैं। इसलिए यदि आपको यह त्रुटि दिखाई देती है, तो "कोई नहीं है" चेक का उपयोग करके इसे संभालने के बजाय अपवाद को स्वीकार करना सबसे अच्छा है।



निष्कर्ष

TypeError: ‘NoneType’ object is not iterable त्रुटि तब होती है जब आप किसी ऑब्जेक्ट पर पुनरावृति करने का प्रयास करते हैं जिसका मान किसी के बराबर नहीं है।

इस त्रुटि को हल करने के लिए, सुनिश्चित करें कि आपके द्वारा पुनरावृति करने का प्रयास करने वाले किसी भी मान को एक स्ट्रिंग या सूची की तरह एक पुनरावृत्त ऑब्जेक्ट असाइन किया गया है। हमारे उदाहरण में, हम किसी फ़ंक्शन में "रिटर्न" स्टेटमेंट जोड़ना भूल गए। इसने फ़ंक्शन को सूची के बजाय कोई नहीं लौटाया।

अब आप इस सामान्य पायथन त्रुटि को अपने कोड में हल करने के लिए तैयार हैं।


  1. लेखन त्रुटि:'अपरिभाषित' जावास्क्रिप्ट में एक वस्तु नहीं है

    लेखन त्रुटि:अपरिभाषित एक वस्तु नहीं है त्रुटि तब होती है जब किसी संपत्ति का उपयोग किया जाता है या किसी अपरिभाषित वस्तु पर एक विधि को कॉल किया जाता है। यह त्रुटि केवल सफारी ब्राउज़र पर दिखाई जाती है। TypeError के लिए कोड निम्नलिखित है - अपरिभाषित जावास्क्रिप्ट में ऑब्जेक्ट त्रुटि नहीं है - उदाहरण दस

  1. पायथन में 'नॉट इन' ऑपरेटर क्या करता है?

    पायथन में, इन और नॉट इन ऑपरेटर्स को मेंबरशिप ऑपरेटर कहा जाता है। उनका उद्देश्य यह जांचना है कि क्या कोई वस्तु किसी निश्चित अनुक्रम वस्तु जैसे स्ट्रिंग, सूची या टपल का सदस्य है। यदि ऑब्जेक्ट क्रम में मौजूद है, तो नॉट इन ऑपरेटर असत्य लौटाता है, यदि नहीं मिला तो सही है >>> 'p' not in &

  1. हम पायथन में एक साथ कई चरों के लिए एक मान कैसे निर्दिष्ट करते हैं?

    पायथन में, वेरिएबल वास्तव में एक लेबल या पहचानकर्ता है जो स्मृति में संग्रहीत वस्तु को दिया जाता है। इसलिए, एक ही वस्तु को एक से अधिक चरों द्वारा पहचाना जा सकता है। >>> a=b=c=5 >>> a 5 >>> b 5 >>> c 5 ए, बी और सी तीन चर हैं जो सभी एक ही वस्तु का जिक्र करते हैं। इ