पायथन के साथ, आप केवल एक ऑब्जेक्ट पर इटरेट कर सकते हैं यदि उस ऑब्जेक्ट का कोई मान है। ऐसा इसलिए है क्योंकि इटरेबल ऑब्जेक्ट्स में केवल एक अगला आइटम होता है जिसे एक्सेस किया जा सकता है यदि उनका मान None के बराबर नहीं है। यदि आप किसी None ऑब्जेक्ट पर इटरेट करने का प्रयास करते हैं, तो आपको TypeError: 'NoneType' object is not iterable त्रुटि का सामना करना पड़ता है।
इस गाइड में, हम बात करते हैं कि इस त्रुटि का क्या अर्थ है और आप इसका सामना क्यों कर सकते हैं। हम आपको अपने कोड में इस सामान्य पायथन त्रुटि को हल करने में मदद करने के लिए एक उदाहरण देखते हैं।
TypeError: 'NoneType' object is not iterable
एक ऑब्जेक्ट के इटरेबल होने के लिए, उसमें एक मान होना चाहिए। एक None मान इटरेबल नहीं है क्योंकि इसमें कोई ऑब्जेक्ट नहीं होता है। None एक नल मान दर्शाता है।
एक None ऑब्जेक्ट और एक खाली इटरेबल में अंतर है। यदि आपके पास कोई खाली सूची या स्ट्रिंग है तो यह त्रुटि नहीं उठाई जाती है।
ऐसा इसलिए है क्योंकि सूचियों और स्ट्रिंग्स का एक इटरेबल डेटा प्रकार होता है। जब पायथन इंटरप्रेटर एक खाली सूची का सामना करता है, तो यह उस पर इटरेट नहीं करता क्योंकि कोई मान नहीं हैं। पायथन None मान पर इटरेट नहीं कर सकता इसलिए इंटरप्रेटर एक त्रुटि लौटाता है।
यह त्रुटि आम है जब आप एक फ़ंक्शन घोषित करते हैं और मान लौटाना भूल जाते हैं।
एक उदाहरण परिदृश्य
आइए एक प्रोग्राम लिखते हैं जो छात्र नामों की एक सूची लेता है और उनको फ़िल्टर करता है जो "E" से शुरू होते हैं। हम उन मानों को कंसोल पर प्रिंट करेंगे।
छात्र नामों को फ़िल्टर करने वाला एक फ़ंक्शन परिभाषित करके शुरू करें:
def filter_students(class_names):
new_class_names = []
for c in class_names:
if c.startswith("E"):
new_class_names.append(c)
यह फ़ंक्शन for लूप का उपयोग करके "class_names" सूची में प्रत्येक आइटम के माध्यम से लूप करता है। प्रत्येक आइटम के लिए, हमारा लूप जांचता है कि क्या आइटम अक्षर "E" से शुरू होता है। यदि हां, तो उस नाम को "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 फ़ंक्शन को निष्पादित करता है जो उन सभी छात्रों को ढूंढता है जिनके नाम "E" से शुरू होते हैं। जिन छात्रों के नाम "E" से शुरू होते हैं उनकी सूची को students_e_name कहा जाता है। अगला, हम अपनी नई छात्र सूची दिखाने के लिए अपने show_students फ़ंक्शन को कॉल करते हैं:
show_students(students_e_name)
आइए अपना कोड चलाते हैं और देखते हैं क्या होता है:
Traceback (most recent call last): File "main.py", line 14, inshow_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 वेरिएबल पर इटरेट करने का प्रयास करते हैं, तो हमारा कोड एक None मान का पता लगाता है और एक त्रुटि उठाता है। ऐसा इसलिए है क्योंकि हमने "class_names" के रूप में पास किया गया मान None है।
यह त्रुटि इसलिए होती है क्योंकि हमारा filter_students फ़ंक्शन मान नहीं लौटाता। जब हम filter_students फ़ंक्शन के परिणाम को students_e_name वेरिएबल को असाइन करते हैं, तो मान None सेट हो जाता है।
इस त्रुटि को हल करने के लिए, हमें अपने filter_students फ़ंक्शन में एक मान लौटाना होगा:
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):
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 अपवाद से बचना
तकनीकी रूप से, आप उस मान की जांच करके NoneType अपवाद से बच सकते हैं जिसे आप इटरेट करने से पहले None के बराबर है या नहीं। निम्न कोड पर विचार करें:
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 त्रुटि का कारण आपके कोड में कहीं और एक समस्या हो सकती है।
यदि हम अपने पूरे प्रोग्राम में "is not None" चेक जोड़ते हैं, तो हमें पता नहीं चलता कि हम किसी अन्य फ़ंक्शन में रिटर्न स्टेटमेंट भूल गए। इसलिए यदि आप यह त्रुटि देखते हैं, तो आप अपवाद को स्वीकार करने के बजाय इसे "is not None" चेक का उपयोग करके संभालने के लिए बेहतर हैं।
निष्कर्ष
TypeError: 'NoneType' object is not iterable त्रुटि तब उठाई जाती है जब आप किसी ऐसे ऑब्जेक्ट पर इटरेट करने का प्रयास करते हैं जिसका मान None के बराबर है।
इस त्रुटि को हल करने के लिए, सुनिश्चित करें कि जिन मानों पर आप इटरेट करने का प्रयास करते हैं उन्हें एक इटरेबल ऑब्जेक्ट असाइन किया गया है, जैसे स्ट्रिंग या सूची। हमारे उदाहरण में, हम एक फ़ंक्शन में "रिटर्न" स्टेटमेंट जोड़ना भूल गए। इसने फ़ंक्शन को सूची के बजाय None लौटाया।
अब आप इस सामान्य पायथन त्रुटि को अपने कोड में हल करने के लिए तैयार हैं।