logo

Cum se remediază TypeError: obiectul „NoneType” nu este iterabil în Python

Piton este un limbaj de programare popular și versatil, dar, ca orice alt limbaj, poate genera erori care pot fi frustrant de depanat. Una dintre erorile frecvente pe care le întâlnesc dezvoltatorii este TypeError: obiectul „NoneType” nu este iterabil. În acest articol, vom explora diferite scenarii în care poate apărea această eroare și vom oferi soluții practice care să vă ajute să o abordați eficient.

Înțelegerea erorii: obiectul NoneType nu este iterabil

Mesajul de eroare TypeError: obiectul „NoneType” nu este iterabil în Piton apare de obicei atunci când încercați să repetați peste un obiect care are o valoare de Nici unul . Această eroare apare deoarece Niciunul nu este iterabil, ceea ce înseamnă că nu puteți trece prin ea așa cum puteți face cu liste, tupluri sau alte obiecte iterabile.



sintaxă: TypeError: obiectul „NoneType” nu este iterabil

Cauzele TypeError: obiectul „NoneType” nu este iterabil

  • Lipsă declarație de returnare
  • Răspuns API nevalid
  • Iterarea peste o variabilă cu valoarea None
  • Nici unul Eroare de tip în clase
  • Funcții Lambda și eroare NoneType

Lipsă declarație de returnare

Unul dintre cele mai frecvente scenarii care duc la această eroare este lipsa unei instrucțiuni return într-o funcție. Să presupunem că avem o funcție care ar trebui să returneze a listă de numere, dar uităm să includem o declarație de returnare:

Python3








def> generate_numbers():> >numbers>=> [>1>,>2>,>3>,>4>,>5>]> ># Missing return statement> result>=> generate_numbers()> for> num>in> result:> >print>(num)>

>

>

Ieșire

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 1 line 6 3 # Missing return statement 5 result = generate_numbers() ---->6 pentru num în rezultat: 7 print(num) TypeError: obiectul 'NoneType' nu este iterabil>

În acest caz, ' generate_numbers()’ nu returnează nimic, ceea ce înseamnă că nu returnează nimic. Când încercăm să repetăm ​​peste rezultat, vom întâlni „ Eroare de scris' pentru că nu putem repeta peste Nimic.

Soluție: Asigurați-vă returnarea corectă

Pentru a remedia această eroare, asigurați-vă că funcția noastră returnează valoarea așteptată. În acest exemplu, ar trebui să adăugăm o instrucțiune return la „generate_numbers()”:

Python3




def> generate_numbers():> >numbers>=> [>1>,>2>,>3>,>4>,>5>]> >return> numbers> result>=> generate_numbers()> for> num>in> result:> >print>(num)>

>

>

Ieșire

1 2 3 4 5>

Acum, generate_numbers() returnează o listă de numere și eroarea este rezolvată.

Răspuns API nevalid

Un alt scenariu în care ați putea întâlni această eroare este atunci când lucrați cu API-uri . Să presupunem că facem o solicitare API pentru a prelua date, dar API-ul returnează Niciunul în loc de datele așteptate:

Python3




import> requests> def> fetch_data():> >response>=> requests.get(>' https://api.openweathermap.org/data '>)> >if> response.status_code>=>=> 200>:> >return> response.json()> >else>:> >return> None> data>=> fetch_data()> for> item>in> data:> >print>(item)>

>

>

Ieșire

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 2 line 11 8 return None 10 data = fetch_data() --->11 pentru elementul din date: 12 print(item) TypeError: obiectul 'NoneType' nu este iterabil>

Dacă API cererea eșuează sau returnează Niciuna, vom primi un 'Eroare de scris' când încercați să repetați datele.

Soluție: Verificați răspunsul API

Pentru a gestiona această situație, ar trebui să verificăm răspunsul API înainte de a încerca să iteram peste el. Iată o versiune îmbunătățită a codului:

Python3




import> requests> def> fetch_data():> >response>=> requests.get(>' https://api.openweathermap.org/data '>)> >if> response.status_code>=>=> 200>:> >return> response.json()> >else>:> >return> [ ]> data>=> fetch_data()> for> item>in> data:> >print>(item)>

>

>

Dacă codul de stare nu este 200, înseamnă că a apărut o problemă cu API cerere. În acest caz, returnăm o listă goală [] ca valoare de substituent în loc de None. Returnarea unei liste goale ne permite să evităm „Niciun tip” eroare atunci când încercați să repetați datele de răspuns mai târziu în cod.

Iterarea peste o variabilă cu valoarea None

Acest scenariu este simplu și comun. Apare atunci când încercăm să buclă (iterăm) peste o variabilă care are valoarea None:

Python3


siruri de sortare java



my_list>=> None> for> item>in> my_list:> >print>(item)>

>

>

Ieșire

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 3 line 2 1 my_list = None ---->2 pentru articolul din lista_my: 3 print(element) TypeError: obiectul 'NoneType' nu este iterabil>

În acest scenariu, variabila „ lista mea' este setat la Niciunul. Când bucla for încearcă să repete 'lista mea' , se întâlnește cu TypeError: obiectul „NoneType” nu este iterabil. Această eroare apare deoarece None nu este un obiect iterabil și nu putem trece prin el.

Soluție: Asigurarea prezenței iterabile înainte de buclă

Pentru a remedia această eroare, trebuie să ne asigurăm că 'lista mea' conține un obiect iterabil (cum ar fi o listă, un tuplu etc.) înainte de a încerca să itereze peste el. Adăugarea unui cec like dacă lista_mea nu este Niciunul înainte ca bucla se asigură că codul din interiorul buclei rulează numai dacă lista mea nu este Nimic, împiedicând „Niciun tip” eroare.

Python3




my_list>=> None> if> my_list>is> not> None>:> >for> item>in> my_list:> >print>(item)>

listează metode java

>

>

Nici unul Eroare de tip în clase

Clase în Piton poate întâlni, de asemenea „Niciun tip” erori, mai ales atunci când lucrați cu metode care returnează None. Luați în considerare o clasă cu o metodă care nu returnează nicio valoare.

Să presupunem că avem o clasă numită 'Student'. În această clasă, dorim să stocăm numele unui elev și notele acestuia. Clasa are o metodă numită „obține_note()” care, în mod logic, ar trebui să returneze notele elevului. În această situație, un student pe nume „ Alisha’ este creat cu o listă de note. Intenția este de a verifica dacă vreuna dintre notele lui Alisha este mai mare sau egală cu 90 și de a le tipări

Iată codul inițial:

Python3




class> Student:> >def> __init__(>self>, name,grade):> >self>.name>=> name> >self>.grade>=> grade> > >def> get_grades(>self>):> > >print>(>self>.grade)> > > student>=> Student(>'Alisha'>,[>90>,>85>,>88>,>92>])> for> grade>in> student.get_grades():> >if> grade>>>>90>:> >print>(grade)>

>

>

Ieșire

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 4 line 13 8 print(self.grade) 11 student = Student('Alisha',[90,85,88,92]) --->13 pentru nota în student.get_grades(): 14 dacă nota>=90: 15 print(notă) TypeError: obiectul 'NoneType' nu este iterabil>>> 

Problema constă în „obține_note()” metodă. Deși imprimă notele, nu le returnează. Când încercăm să trecem prin buclă „student.get_grades()” , imprimă notele, dar nu vă oferă nicio valoare cu care să lucrați în buclă.

Deci, când încercăm să repetăm ​​rezultatul „student.get_grades()”, implicit revine 'Nici unul' deoarece nu există o declarație de returnare explicită în „obține_note()” metodă. Piton consideră acest Nimic, care nu este iterabil. Ca urmare, întâlnim un TypeError: obiectul „NoneType” nu este iterabil eroare.

Soluție: returnarea valorilor corespunzătoare din metodele de clasă

Pentru a rezolva această problemă, trebuie să modificăm „obține_note()” metodă. În loc să imprime doar notele, ar trebui să le returneze. Returnarea notelor înseamnă furnizarea unui iterabil (în acest caz, lista de note) apelantului metodei. Prin returnarea notelor, metoda devine iterabilă, iar bucla poate funcționa conform intenției.

Python3




class> Student:> >def> __init__(>self>, name,grade):> >self>.name>=> name> >self>.grade>=> grade> > >def> get_grades(>self>):> > >return> self>.grade> > > student>=> Student(>'Alisha'>,[>90>,>85>,>88>,>92>])> for> grade>in> student.get_grades():> >if> grade>>>>90>:> >print>(grade)>

>

Deci, în acest cod corectat, „obține_note()” metoda returnează „self.grade”, care este lista de note. Când repetăm „student.get_grades()” , vom repeta lista de note și nu va fi niciuna „NiciunTip” eroare deoarece iterăm peste un obiect iterabil valid.

Ieșire

90 92>

Funcții Lambda și eroare NoneType

Eroarea TypeError: obiectul „NoneType” nu este iterabil poate apărea în funcții lambda când funcția lambda revine Niciunul în anumite situații. Acest lucru se întâmplă de obicei atunci când returnăm în mod condiționat None pentru anumite valori de intrare. Când încercăm să repetăm ​​rezultatul unei funcții lambda care returnează None, întâlnim această eroare.

Exemplu: În acest exemplu, dacă intrarea X nu este mai mare de 0 (x>0) , cel functie lambda returnează Niciunul. Când încercăm să repetăm ​​peste rezultat, încercăm să iterăm peste Niciunul, provocând TypeError: obiectul „NoneType” nu este iterabil eroare.

Python3




my_lambda>=> lambda> x: x>*> 2> if> x>>>>else> None> result>=> my_lambda(>->1>)> for> item>in> result:> >print>(item)>

>

>

Ieșire

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 5 line 3 1 my_lambda = lambda x: x * 2 if x>0 else Nici unul 2 rezultat = my_lambda(-1) ----> 3 pentru elementul din rezultat: 4 print(item) TypeError: obiectul 'NoneType' nu este iterabil>

Soluție: Asigurarea rezultatelor iterabile

Pentru a remedia această eroare, ar trebui să ne ocupăm de cazul în care funcția lambda returnează Nimic. O modalitate de a o gestiona este de a oferi un iterabil implicit (cum ar fi o listă goală) în cazul Nici unul. Iată codul corectat:

Python3




my_lambda>=> lambda> x: [x>*> 2>]>if> x>>>>else> []> result>=> my_lambda(>->1>)> for> item>in> result:> >print>(item)>

>

>

Ieșire: În acest cod fix, functie lambda returnează o listă care conține x * 2 dacă 'X' este mai mare decât 0. Dacă 'X' nu este mai mare de 0 (ca în cazul lui -1), returnează o listă goală. Acum, putem repeta peste rezultat fără a întâlni „Niciun tip” eroare.