Python er et populært og allsidig programmeringsspråk, men som alle andre språk kan det gi feil som kan være frustrerende å feilsøke. En av de vanlige feilene som utviklere møter er TypeError: 'NoneType'-objektet kan ikke itereres. I denne artikkelen vil vi utforske ulike scenarier der denne feilen kan oppstå og gi praktiske løsninger for å hjelpe deg med å takle den effektivt.
Forstå feilen: NoneType-objektet er ikke Iterable
Feilmeldingen TypeError: 'NoneType'-objektet kan ikke itereres i Python oppstår vanligvis når du prøver å iterere over et objekt som har en verdi på Ingen . Denne feilen oppstår fordi None ikke kan itereres, noe som betyr at du ikke kan gå gjennom den som du kan med lister, tuples eller andre iterable objekter.
syntaks: TypeError: 'NoneType'-objektet kan ikke itereres
Årsaker til TypeError: «NoneType»-objektet kan ikke itereres
- Manglende returerklæring
- Ugyldig API-svar
- Iterering over en variabel med verdien Ingen
- Ingen Skrivefeil i klasser
- Lambda-funksjoner og NoneType-feil
Manglende returerklæring
Et av de vanligste scenariene som fører til denne feilen er en manglende retursetning i en funksjon. La oss si at vi har en funksjon som skal returnere en liste av tall, men vi glemmer å 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)> |
>
>
Produksjon
--------------------------------------------------------------------------- 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 tilfellet, ' generere_tall()' returnerer ikke noe, noe som betyr at den returnerer ingen. Når vi prøver å iterere over resultatet, vil vi møte ' TypeError' fordi vi ikke kan iterere over Ingen.
Løsning: Sørg for riktig retur
For å fikse denne feilen, sørg for at funksjonen vår returnerer den forventede verdien. I dette eksemplet bør vi legge til 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)> |
>
bash lengden på strengen
>
Produksjon
1 2 3 4 5>
Nå, generere_tall() returnerer en liste med tall, og feilen er løst.
Ugyldig API-svar
Et annet scenario der du kan støte på denne feilen er når du arbeider med APIer . La oss si at vi sender en API-forespørsel for å hente data, men API-en returnerer Ingen i stedet for de forventede dataene:
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)> |
>
>
Produksjon
js settimeout
--------------------------------------------------------------------------- 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 forespørsel mislykkes eller returnerer Ingen, vi får en 'TypeError' når du prøver å iterere over data.
Løsning: Sjekk API-svar
For å håndtere denne situasjonen, bør vi sjekke API-svaret før vi prøver å iterere over det. Her er en forbedret versjon av 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, betyr det at det var et problem med API be om. I dette tilfellet returnerer vi en tom liste [] som en plassholderverdi i stedet for Ingen. Å returnere en tom liste lar oss unngå 'NoneType' feil ved forsøk på å iterere over svardataene senere i koden.
Iterering over en variabel med verdien Ingen
Dette scenariet er enkelt og vanlig. Det oppstår når vi prøver å løkke (iterere) over en variabel som har verdien Ingen:
Python3
my_list>=> None> for> item>in> my_list:> >print>(item)> |
>
>
Produksjon
--------------------------------------------------------------------------- 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 scenariet vil variabelen ' min liste' er satt til Ingen. Når for-løkken forsøker å iterere over 'min liste' , møter den TypeError: 'NoneType'-objektet kan ikke itereres. Denne feilen oppstår fordi None ikke er et iterbart objekt, og vi kan ikke gå gjennom det.
Løsning: Sikre gjentakelig tilstedeværelse før looping
For å fikse denne feilen, må vi sørge for det 'min liste' inneholder et gjentakbart objekt (som en liste, tuppel osv.) før du forsøker å iterere over det. Legger til en sjekk som hvis min_liste ikke er Ingen før løkken sørger for at koden inne i løkken bare kjører hvis min liste er ikke Ingen, hindrer 'NoneType' feil.
Python3
spørringsvelger
my_list>=> None> if> my_list>is> not> None>:> >for> item>in> my_list:> >print>(item)> |
>
>
Ingen Skrivefeil i klasser
Klasser i Python kan også møte 'NoneType' feil, spesielt når du arbeider med metoder som returnerer Ingen. Vurder en klasse med en metode som ikke returnerer noen verdi.
La oss anta at vi har en klasse som heter 'Student'. I denne klassen ønsker vi å lagre en elevs navn og karakterer. Klassen har en metode som heter 'get_grades()' som logisk sett skal gi studentens karakterer. I denne situasjonen, en student ved navn ' Alisha' er opprettet med en liste over karakterer. Hensikten er å sjekke om noen av Alishas karakterer er over eller lik 90 og skrive dem ut
Her er startkoden:
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)> |
>
>
Produksjon
--------------------------------------------------------------------------- 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(grade) TypeError: 'NoneType' objekt kan ikke itereres> Problemet ligger i 'get_grades()' metode. Selv om den skriver ut karakterene, returnerer den dem ikke. Når vi prøver å gå gjennom 'student.get_grades()' , den skriver ut karakterene, men gir deg ingen verdier å jobbe med i loopen.
Så, når vi prøver å iterere over resultatet av 'student.get_grades()', den returnerer implisitt 'Ingen' fordi det ikke er noen eksplisitt returerklæring i 'get_grades()' metode. Python anser dette som Ingen, som ikke kan itereres. Som et resultat møter vi en TypeError: 'NoneType'-objektet kan ikke itereres feil.
Løsning: Returner passende verdier fra klassemetoder
For å løse dette problemet må vi endre 'get_grades()' metode. I stedet for bare å skrive ut karakterene, bør den returnere dem. Å returnere karakterene betyr å gi en iterabel (i dette tilfellet listen over karakterer) til den som ringer metoden. Ved å returnere karakterene blir metoden itererbar, og loopen kan fungere etter hensikten.
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 korrigerte koden 'get_grades()' metoden returnerer 'self.grade', som er listen over karakterer. Når vi itererer over 'student.get_grades()' , vil vi iterere over listen over karakterer, og det vil ikke være noen 'NoneType' feil fordi vi itererer over et gyldig gjentakbart objekt.
Last ned autocad 2019 engelsk mediafire
Produksjon
90 92>
Lambda-funksjoner og NoneType-feil
Feilen TypeError: 'NoneType'-objektet kan ikke itereres kan oppstå i lambda funksjoner når lambda-funksjonen returnerer Ingen i visse situasjoner. Dette skjer vanligvis når vi betinget returnerer Ingen for spesifikke inngangsverdier. Når vi prøver å iterere over resultatet av en lambda-funksjon som returnerer Ingen, støter vi på denne feilen.
Eksempel: I dette eksemplet, hvis inngangen x er ikke større enn 0 (x>0) , den lambda funksjon returnerer ingen. Når vi prøver å iterere over resultatet, prøver vi å iterere over Ingen, noe som forårsaker TypeError: 'NoneType'-objektet kan ikke itereres feil.
Python3
my_lambda>=> lambda> x: x>*> 2> if> x>>0> else> None> result>=> my_lambda(>->1>)> for> item>in> result:> >print>(item)> |
>
>
Produksjon
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 5 line 3 1 my_lambda = lambda x: x * 2 if x>0 annet Ingen 2 resultat = min_lambda(-1) ----> 3 for element i resultat: 4 print(item) TypeFeil: 'NoneType' objekt kan ikke itereres>
Løsning: Sikre iterable resultater
For å fikse denne feilen bør vi håndtere tilfellet der lambda-funksjonen returnerer Ingen. En måte å håndtere det på er å gi en standard iterbar (som en tom liste) i tilfelle Ingen. Her er den korrigerte koden:
Python3
my_lambda>=> lambda> x: [x>*> 2>]>if> x>>0> else> []> result>=> my_lambda(>->1>)> for> item>in> result:> >print>(item)> |
>
>
Produksjon: I denne faste koden er lambda funksjon returnerer en liste som inneholder x * 2 hvis 'x' er større enn 0. Hvis 'x' ikke er større enn 0 (som i tilfellet med -1), returnerer den en tom liste. Nå kan vi iterere over resultatet uten å møte 'NoneType' feil.