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.