Pytonorm är ett populärt och mångsidigt programmeringsspråk, men som alla andra språk kan det skapa fel som kan vara frustrerande att felsöka. Ett av de vanligaste felen som utvecklare stöter på är TypeError: 'NoneType'-objektet kan inte itereras. I den här artikeln kommer vi att utforska olika scenarier där detta fel kan uppstå och tillhandahålla praktiska lösningar som hjälper dig att hantera det effektivt.
Förstå felet: NoneTypes objekt är inte Iterable
Felmeddelandet TypeError: 'NoneType'-objektet kan inte itereras i Pytonorm uppstår vanligtvis när du försöker iterera över ett objekt som har ett värde på Ingen . Det här felet uppstår eftersom None inte är iterabel, vilket betyder att du inte kan gå igenom det som du kan med listor, tupler eller andra itererbara objekt.
syntax: TypeError: 'NoneType'-objektet är inte iterbart
Orsaker till TypeError: 'NoneType'-objekt kan inte itereras
- Returdeklaration saknas
- Ogiltigt API-svar
- Itererar över en variabel med värdet None
- Inget Typfel i klasser
- Lambda-funktioner och NoneType-fel
Returdeklaration saknas
Ett av de vanligaste scenarierna som leder till det här felet är en retursats som saknas i en funktion. Låt oss säga att vi har en funktion som ska returnera a lista av siffror, men vi glömmer att inkludera ett returmeddelande:
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 för num i resultat: 7 print(num) TypeError: 'NoneType' objekt kan inte itereras>
I detta fall, ' generera_nummer()' returnerar inget, vilket betyder att det returnerar Ingen. När vi försöker iterera över resultatet kommer vi att stöta på Skrivfel' eftersom vi inte kan iterera över Ingen.
Lösning: Säkerställ korrekt retur
För att åtgärda detta fel, se till att vår funktion returnerar det förväntade värdet. I det här exemplet bör vi lägga till en retursats 'generera_nummer()':
Python3
def> generate_numbers():> >numbers>=> [>1>,>2>,>3>,>4>,>5>]> >return> numbers> result>=> generate_numbers()> for> num>in> result:> >print>(num)> |
>
>
insättningssort i java
Produktion
1 2 3 4 5>
Nu, generera_nummer() returnerar en lista med nummer och felet åtgärdas.
Ogiltigt API-svar
Ett annat scenario där du kan stöta på det här felet är när du arbetar med API:er . Låt oss säga att vi gör en API-begäran för att hämta data, men API:et returnerar Ingen istället för förväntad 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
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 2 line 11 8 return None 10 data = fetch_data() --->11 för objekt i data: 12 print(item) TypeError: 'NoneType' objekt kan inte itereras>
Om API begäran misslyckas eller returneras Ingen, vi får en 'Skrivfel' när du försöker iterera över data.
Lösning: Kontrollera API-svar
För att hantera denna situation bör vi kontrollera API-svaret innan vi försöker iterera över det. Här är en förbättrad version 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)> |
>
>
Om statuskoden inte är 200 betyder det att det var ett problem med API begäran. I det här fallet returnerar vi en tom lista [] som ett platshållarvärde istället för Ingen. Att returnera en tom lista tillåter oss att undvika 'NoneType' fel när du försöker iterera över svarsdata senare i koden.
Itererar över en variabel med värdet None
Detta scenario är enkelt och vanligt. Det inträffar när vi försöker loopa (iteratera) över en variabel som har värdet None:
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 för objekt i min_lista: 3 print(item) TypeError: 'NoneType' objekt kan inte itereras>
I detta scenario, variabeln ' min lista' är inställd på Ingen. När for-slingan försöker iterera över 'min lista' , möter den TypeError: 'NoneType'-objektet kan inte itereras. Det här felet uppstår eftersom None inte är ett iterbart objekt och vi kan inte gå igenom det.
Lösning: Säkerställa iterabel närvaro innan looping
För att åtgärda det här felet måste vi säkerställa det 'min lista' innehåller ett itererbart objekt (som en lista, tuppel, etc.) innan du försöker iterera över det. Lägger till en check som om min_lista inte är Ingen före slingan säkerställer att koden inuti slingan endast körs om min lista är inte Ingen, vilket förhindrar 'NoneType' fel.
Python3
my_list>=> None> if> my_list>is> not> None>:> >for> item>in> my_list:> >print>(item)> |
latex teckensnitt
>
>
Inget Typfel i klasser
Klasser i Pytonorm kan också stöta på 'NoneType' fel, speciellt när man arbetar med metoder som returnerar Ingen. Tänk på en klass med en metod som inte returnerar något värde.
Låt oss anta att vi har en klass som heter 'Studerande'. I den här klassen vill vi lagra en elevs namn och deras betyg. Klassen har en metod som heter 'get_grades()' vilket logiskt sett borde ge studentens betyg. I denna situation, en elev som heter ' Alisha' skapas med en lista över betyg. Avsikten är att kontrollera om någon av Alishas betyg är över eller lika med 90 och skriva ut dem
Här är den första koden:
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 för betyg i student.get_grades(): 14 om betyg>=90: 15 print(grade) TypeError: 'NoneType' objekt kan inte itereras> Frågan ligger i 'get_grades()' metod. Även om den skriver ut betygen, returnerar den dem inte. När vi försöker gå igenom 'student.get_grades()' , den skriver ut betygen men ger dig inga värden att arbeta med i slingan.
Så, när vi försöker iterera över resultatet av 'student.get_grades()', det återkommer implicit 'Ingen' eftersom det inte finns något uttryckligt returmeddelande i 'get_grades()' metod. Pytonorm anser detta Inget, vilket inte är iterabelt. Som ett resultat möter vi en TypeError: 'NoneType'-objekt kan inte itereras fel.
Lösning: Returnera lämpliga värden från klassmetoder
För att lösa det här problemet måste vi ändra 'get_grades()' metod. Istället för att bara skriva ut betygen borde den lämna tillbaka dem. Att returnera betygen innebär att tillhandahålla en iterabel (i det här fallet listan över betyg) till den som anropar metoden. Genom att returnera betygen blir metoden iterabel, och slingan kan fungera som avsett.
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)> |
>
>
syraegenskaper i dbms
Så i denna korrigerade kod, den 'get_grades()' metod returnerar 'self.grade', som är betygslistan. När vi itererar över 'student.get_grades()' , vi upprepar listan med betyg, och det kommer inte att finnas några 'NoneType' fel eftersom vi itererar över ett giltigt itererbart objekt.
Produktion
90 92>
Lambda-funktioner och NoneType-fel
Felet TypeError: 'NoneType'-objektet kan inte itereras kan förekomma i lambdafunktioner när lambdafunktionen returnerar Ingen i vissa situationer. Detta händer vanligtvis när vi villkorligt returnerar Ingen för specifika ingångsvärden. När vi försöker iterera över resultatet av en lambdafunktion som returnerar None, stöter vi på detta fel.
Exempel: I detta exempel, om ingången x är inte större än 0 (x>0) , den lambdafunktion returnerar Ingen. När vi försöker iterera över resultatet, försöker vi iterera över Inget, vilket orsakar TypeError: 'NoneType'-objektet kan inte itereras fel.
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 annat Inget 2 resultat = min_lambda(-1) ----> 3 för objekt i resultat: 4 print(item) TypeError: 'NoneType' objekt kan inte itereras>
Lösning: Säkerställer iterable resultat
För att åtgärda detta fel bör vi hantera fallet där lambda-funktionen returnerar None. Ett sätt att hantera det är att tillhandahålla en standard iterabel (som en tom lista) i fallet med Ingen. Här är den korrigerade koden:
Python3
my_lambda>=> lambda> x: [x>*> 2>]>if> x>>0> else> []> result>=> my_lambda(>->1>)> for> item>in> result:> >print>(item)> |
>
>
Produktion: I denna fasta kod är lambdafunktion returnerar en lista som innehåller x * 2 om 'x' är större än 0. Om 'x' inte är större än 0 (som i fallet med -1), returnerar den en tom lista. Nu kan vi iterera över resultatet utan att stöta på 'NoneType' fel.