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>>>>:> >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>>>>:> >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>>>> 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>>>> []> 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.