logo

Sådan rettes TypeError: 'NoneType'-objekt kan ikke itereres i Python

Python er et populært og alsidigt programmeringssprog, men som ethvert andet sprog kan det give fejl, der kan være frustrerende at fejlfinde. En af de almindelige fejl, som udviklere støder på, er TypeError: 'NoneType'-objekt kan ikke itereres. I denne artikel vil vi undersøge forskellige scenarier, hvor denne fejl kan opstå, og give praktiske løsninger til at hjælpe dig med at tackle det effektivt.

Forståelse af fejlen: NoneType' objekt kan ikke gentages

Fejlmeddelelsen TypeError: 'NoneType'-objekt kan ikke itereres i Python opstår typisk, når du forsøger at iterere over et objekt, der har en værdi på Ingen . Denne fejl er rejst, fordi None ikke kan itereres, hvilket betyder, at du ikke kan gå igennem den, som du kan med lister, tupler eller andre iterable objekter.



syntaks: TypeError: 'NoneType'-objekt kan ikke itereres

Årsager til TypeError: 'NoneType'-objekt kan ikke itereres

  • Manglende returerklæring
  • Ugyldigt API-svar
  • Iteration over en variabel med værdien Ingen
  • Ingen Typefejl i klasser
  • Lambda-funktioner og NoneType-fejl

Manglende returerklæring

Et af de mest almindelige scenarier, der fører til denne fejl, er en manglende retursætning i en funktion. Lad os sige, at vi har en funktion, der skal returnere en liste af numre, men vi glemmer at inkludere en returerklæring:

Python3








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

>

>

Produktion

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 1 line 6 3 # Missing return statement 5 result = generate_numbers() ---->6 for num i resultat: 7 print(num) TypeError: 'NoneType' objekt kan ikke itereres>

I dette tilfælde, ' generere_numre()' returnerer ikke noget, hvilket betyder, at den returnerer Ingen. Når vi forsøger at gentage resultatet, vil vi støde på ' TypeError' fordi vi ikke kan iterere over Ingen.

Løsning: Sørg for korrekt retur

For at rette denne fejl skal du sørge for, at vores funktion returnerer den forventede værdi. I dette eksempel skal vi tilføje en returerklæring til 'generer_numre()':

Python3




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

>

linux kommandoer oprette mappe

>

Produktion

1 2 3 4 5>

Nu, generere_numre() returnerer en liste over tal, og fejlen er løst.

Ugyldigt API-svar

Et andet scenarie, hvor du kan støde på denne fejl, er, når du arbejder med API'er . Lad os sige, at vi laver en API-anmodning for at hente data, men API'en returnerer Ingen i stedet for de forventede data:

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)>

>

>

Produktion

omdøbe mappe linux
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 2 line 11 8 return None 10 data = fetch_data() --->11 for element i data: 12 print(item) TypeError: 'NoneType' objekt kan ikke itereres>

Hvis API anmodning mislykkes eller returneres Ingen, vi får en 'TypeError' når du forsøger at iterere over data.

Løsning: Tjek API-svar

For at håndtere denne situation bør vi tjekke API-svaret, før vi forsøger at gentage det. Her er en forbedret version af koden:

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)>

>

>

Hvis statuskoden ikke er 200, betyder det, at der var et problem med API anmodning. I dette tilfælde returnerer vi en tom liste [] som en pladsholderværdi i stedet for Ingen. At returnere en tom liste giver os mulighed for at undgå 'NoneType' fejl ved forsøg på at gentage svardataene senere i koden.

Iteration over en variabel med værdien Ingen

Dette scenarie er ligetil og almindeligt. Det opstår, når vi forsøger at loope (iterere) over en variabel, der har værdien Ingen:

Python3




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

>

>

Produktion

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 3 line 2 1 my_list = None ---->2 for element i min_liste: 3 print(item) TypeError: 'NoneType' objekt kan ikke itereres>

I dette scenarie er variablen ' min_liste' er indstillet til Ingen. Når for-løkken forsøger at gentage 'min_liste' , støder den på TypeError: 'NoneType'-objekt kan ikke itereres. Denne fejl opstår, fordi None ikke er et iterabelt objekt, og vi ikke kan gå igennem det.

Løsning: Sikring af iterable tilstedeværelse før looping

For at rette denne fejl skal vi sikre det 'min_liste' indeholder et iterbart objekt (såsom en liste, tuple osv.), før du forsøger at iterere over det. Tilføjelse af en check like hvis min_liste ikke er Ingen før løkken sikrer, at koden inde i løkken kun kører, hvis min_liste er ikke Ingen, hvilket forhindrer 'NoneType' fejl.

Python3


e-r model diagram



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

>

>

Ingen Typefejl i klasser

Klasser i Python også kan støde på 'NoneType' fejl, især når man arbejder med metoder, der returnerer Ingen. Overvej en klasse med en metode, der ikke returnerer nogen værdi.

Lad os antage, at vi har en klasse ved navn 'Studerende'. I denne klasse ønsker vi at gemme en elevs navn og deres karakterer. Klassen har en metode kaldet 'get_karakterer()' som logisk set burde returnere elevens karakterer. I denne situation vil en elev ved navn ' Alisha' oprettes med en liste over karakterer. Hensigten er at tjekke, om nogen af ​​Alishas karakterer er over eller lig med 90 og udskrive dem

Her er den indledende kode:

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)>

>

>

Produktion

--------------------------------------------------------------------------- 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 for karakter i student.get_grades(): 14 hvis karakter>=90: 15 print(karakter) TypeError: 'NoneType' objekt kan ikke itereres>

Spørgsmålet ligger i 'get_karakterer()' metode. Selvom det udskriver karaktererne, returnerer det dem ikke. Når vi prøver at gå igennem 'student.get_grades()' , det udskriver karaktererne, men giver dig ikke nogen værdier at arbejde med i løkken.

Så, når vi forsøger at gentage resultatet af 'student.get_grades()', det vender implicit tilbage 'Ingen' fordi der ikke er nogen eksplicit returerklæring i 'get_karakterer()' metode. Python anser dette for Ingen, som ikke kan gentages. Som et resultat støder vi på en TypeError: 'NoneType'-objekt kan ikke itereres fejl.

Løsning: Returnering af passende værdier fra klassemetoder

For at løse dette problem skal vi ændre 'get_karakterer()' metode. I stedet for blot at udskrive karaktererne, bør den returnere dem. At returnere karaktererne betyder at give en iterabel (i dette tilfælde listen over karakterer) til den, der ringer til metoden. Ved at returnere karaktererne bliver metoden iterabel, og løkken kan fungere efter hensigten.

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)>

>

>

Så i denne korrigerede kode er 'get_karakterer()' metode vender tilbage 'self.grade', som er listen over karakterer. Når vi itererer over 'student.get_grades()' , vil vi iterere over listen over karakterer, og der vil ikke være nogen 'NoneType' fejl, fordi vi itererer over et gyldigt iterbart objekt.

vindue.åbn

Produktion

90 92>

Lambda-funktioner og NoneType-fejl

Fejlen TypeError: 'NoneType'-objekt kan ikke itereres kan forekomme i lambda funktioner når lambda-funktionen returnerer Ingen i visse situationer. Dette sker typisk, når vi betinget returnerer Ingen for specifikke inputværdier. Når vi forsøger at iterere over resultatet af en lambda-funktion, der returnerer Ingen, støder vi på denne fejl.

Eksempel: I dette eksempel, hvis input x er ikke større end 0 (x>0) , det lambda funktion returnerer Ingen. Når vi forsøger at iterere over resultatet, forsøger vi at iterere over Ingen, hvilket forårsager TypeError: 'NoneType'-objekt kan ikke itereres fejl.

Python3




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

>

>

Produktion

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 5 line 3 1 my_lambda = lambda x: x * 2 if x>0 andet Ingen 2 resultat = min_lambda(-1) ----> 3 for element i resultat: 4 print(emne) TypeError: 'NoneType' objekt kan ikke itereres>

Løsning: Sikring af iterable resultater

For at rette denne fejl bør vi håndtere det tilfælde, hvor lambda-funktionen returnerer Ingen. En måde at håndtere det på er at give en standard iterable (såsom en tom liste) i tilfælde af Ingen. Her er den rettede kode:

Python3




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

>

>

Produktion: I denne faste kode er lambda funktion returnerer en liste med x * 2 hvis 'x' er større end 0. Hvis 'x' ikke er større end 0 (som i tilfældet med -1), returnerer den en tom liste. Nu kan vi gentage resultatet uden at støde på 'NoneType' fejl.