logo

Hoe TypeError te repareren: het object ‘NoneType’ is niet itereerbaar in Python

Python is een populaire en veelzijdige programmeertaal, maar net als elke andere taal kan deze fouten veroorzaken die frustrerend kunnen zijn om te debuggen. Een van de meest voorkomende fouten die ontwikkelaars tegenkomen is het TypeError: ‘NoneType’-object is niet itereerbaar. In dit artikel onderzoeken we verschillende scenario's waarin deze fout kan optreden en bieden we praktische oplossingen om u te helpen deze effectief aan te pakken.

De fout begrijpen: het object NoneType is niet itereerbaar

De foutmelding TypeError: ‘NoneType’-object is niet itereerbaar in Python treedt meestal op wanneer u probeert een object te herhalen dat de waarde heeft van Geen . Deze fout treedt op omdat Geen niet itereerbaar is, wat betekent dat je er niet doorheen kunt lopen zoals je kunt met lijsten, tupels of andere itereerbare objecten.



syntaxis: TypeError: ‘NoneType’ object is niet itereerbaar

Oorzaken van TypeError: ‘NoneType’-object is niet itereerbaar

  • Ontbrekende retourverklaring
  • Ongeldige API-reactie
  • Itereren over een variabele met de waarde Geen
  • Geen Typefout in klassen
  • Lambda-functies en GeenType-fout

Ontbrekende retourverklaring

Een van de meest voorkomende scenario's die tot deze fout leiden, is een ontbrekende return-instructie in een functie. Laten we zeggen dat we een functie hebben die a moet retourneren lijst van cijfers, maar we vergeten een retourverklaring op te nemen:

Python3








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

>

>

Uitvoer

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 1 line 6 3 # Missing return statement 5 result = generate_numbers() ---->6 voor num in resultaat: 7 print(num) TypeError: 'NoneType' object is niet itereerbaar>

In dit geval, ' genereer_getallen()’ retourneert niets, wat betekent dat het Geen retourneert. Wanneer we het resultaat proberen te herhalen, komen we de ‘ TypeError’ omdat we niet over Geen kunnen herhalen.

Oplossing: Zorg voor een correcte retourzending

Om deze fout op te lossen, moet u ervoor zorgen dat onze functie de verwachte waarde retourneert. In dit voorbeeld moeten we een return-instructie toevoegen aan ‘genereer_getallen()’:

Python3




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

>

>

Uitvoer

1 2 3 4 5>

Nu, genereer_getallen() retourneert een lijst met getallen en de fout is opgelost.

Ongeldige API-reactie

Een ander scenario waarin u deze fout kunt tegenkomen, is wanneer u werkt met API's . Stel dat we een API-verzoek indienen om gegevens op te halen, maar de API retourneert Geen in plaats van de verwachte gegevens:

Python3

modificatietoetsen




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

>

>

Uitvoer

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 2 line 11 8 return None 10 data = fetch_data() --->11 voor item in data: 12 print(item) TypeError: 'NoneType' object is niet itereerbaar>

Als de API verzoek mislukt of retourneert Geen, we krijgen een ‘TypeError’ wanneer u gegevens probeert te herhalen.

Oplossing: controleer de API-reactie

Om deze situatie aan te pakken, moeten we de API-reactie controleren voordat we proberen deze te herhalen. Hier is een verbeterde versie van de code:

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

>

>

Als de statuscode niet 200 is, betekent dit dat er een probleem is met de API verzoek. In dit geval retourneren we een lege lijst [] als tijdelijke aanduiding-waarde in plaats van Geen. Door een lege lijst terug te sturen, kunnen we voorkomen dat de ‘GeenType’ fout bij een poging om de antwoordgegevens later in de code te herhalen.

Itereren over een variabele met de waarde Geen

Dit scenario is eenvoudig en gebruikelijk. Het komt voor wanneer we proberen een variabele te herhalen (itereren) die de waarde Geen heeft:

Python3




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

>

>

Uitvoer

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 3 line 2 1 my_list = None ---->2 voor item in mijn_lijst: 3 print(item) TypeError: 'NoneType' object is niet itereerbaar>

In dit scenario is de variabele ‘ mijn lijst' is ingesteld op Geen. Wanneer de for-lus probeert te herhalen 'mijn lijst' , het ontmoet de TypeError: ‘NoneType’-object is niet itereerbaar. Deze fout treedt op omdat Geen geen itereerbaar object is en we er niet doorheen kunnen lopen.

Oplossing: zorgen voor een iterabele aanwezigheid vóór het herhalen

Om deze fout te herstellen, moeten we ervoor zorgen dat 'mijn lijst' bevat een itereerbaar object (zoals een lijst, tuple, enz.) voordat wordt geprobeerd eroverheen te itereren. Een cheque toevoegen zoals als mijn_lijst niet Geen is before the loop zorgt ervoor dat de code binnen de lus alleen wordt uitgevoerd als mijn lijst is niet Geen, waardoor de ‘GeenType’ fout.

Python3




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

maak de tekst vet in css

>

>

Geen Typefout in klassen

Klassen in Python ook tegen kunnen komen ‘GeenType’ fouten, vooral bij het werken met methoden die Geen retourneren. Beschouw een klasse met een methode die geen enkele waarde retourneert.

Laten we aannemen dat we een klasse hebben met de naam 'Student'. In deze klas willen we de naam van een leerling en zijn cijfers opslaan. De klasse heeft een methode genaamd ‘get_grades()’ wat logischerwijs de cijfers van de student zou moeten opleveren. In deze situatie heeft een student genaamd ‘ Alisha’ is gemaakt met een lijst met cijfers. Het is de bedoeling om te controleren of Alisha’s cijfers hoger of gelijk zijn aan 90 en deze af te drukken

Hier is de initiële code:

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

>

>

Uitvoer

--------------------------------------------------------------------------- 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 voor cijfer in student.get_grades(): 14 if grade>=90: 15 print(grade) TypeError: 'NoneType' object is niet itereerbaar>

Het probleem ligt in de ‘get_grades()’ methode. Hoewel de cijfers wel worden afgedrukt, worden deze niet geretourneerd. Wanneer we proberen door te lussen ‘student.get_grades()’ , het drukt de cijfers af, maar geeft je geen waarden waarmee je in de lus kunt werken.

Dus wanneer we proberen het resultaat van te herhalen ‘student.get_grades()’, het komt impliciet terug 'Geen' omdat er geen expliciete return-instructie in de ‘get_grades()’ methode. Python beschouwt dit als Geen, wat niet itereerbaar is. Als gevolg hiervan komen we tegen een TypeError: ‘NoneType’-object is niet itereerbaar fout.

Oplossing: de juiste waarden retourneren uit klassenmethoden

Om dit probleem op te lossen, moeten we de ‘get_grades()’ methode. In plaats van alleen de cijfers af te drukken, zou het deze moeten retourneren. Het retourneren van de cijfers betekent dat er een iterabele (in dit geval de lijst met cijfers) wordt verstrekt aan de aanroeper van de methode. Door de cijfers terug te geven, wordt de methode itereerbaar en kan de lus werken zoals bedoeld.

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

>

>

Dus in deze gecorrigeerde code wordt de ‘get_grades()’ methode retourneert ‘zelf.graad’, dat is de lijst met cijfers. Wanneer we herhalen ‘student.get_grades()’ , herhalen we de lijst met cijfers, en die zal er niet zijn ‘GeenType’ fout omdat we een geldig itereerbaar object herhalen.

Uitvoer

90 92>

Lambda-functies en GeenType-fout

De fout TypeError: ‘NoneType’-object is niet itereerbaar kan voorkomen bij lambda-functies wanneer de lambda-functie in bepaalde situaties Geen retourneert. Dit gebeurt meestal wanneer we voorwaardelijk Geen retourneren voor specifieke invoerwaarden. Wanneer we proberen het resultaat te herhalen van een lambda-functie die Geen retourneert, komen we deze fout tegen.

Voorbeeld: In dit voorbeeld, als de input X is niet groter dan 0 (x>0) , de lambda-functie retourneert Geen. Wanneer we het resultaat proberen te herhalen, proberen we het resultaat Geen te herhalen, waardoor de TypeError: object ‘NoneType’ is niet itereerbaar fout.

Python3




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

>

>

Uitvoer

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 5 line 3 1 my_lambda = lambda x: x * 2 if x>0 anders Geen 2 resultaat = my_lambda(-1) ----> 3 voor item in resultaat: 4 print(item) TypeError: 'NoneType' object is niet itereerbaar>

Oplossing: Itereerbare resultaten garanderen

Om deze fout op te lossen, moeten we het geval behandelen waarin de lambda-functie Geen retourneert. Eén manier om hiermee om te gaan is door een standaard iterabele te bieden (zoals een lege lijst) in het geval van Geen. Hier is de gecorrigeerde code:

Python3




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

zweven in css
>

>

Uitgang: In deze vaste code wordt de lambda-functie geeft een lijst terug met daarin x * 2 als 'X' is groter dan 0. Als 'X' niet groter is dan 0 (zoals in het geval van -1), retourneert het een lege lijst. Nu kunnen we het resultaat herhalen zonder de ‘GeenType’ fout.