Python ist eine beliebte und vielseitige Programmiersprache, aber wie jede andere Sprache kann sie Fehler verursachen, deren Fehlerbehebung frustrierend sein kann. Einer der häufigsten Fehler, auf die Entwickler stoßen, ist der TypeError: Das Objekt „NoneType“ ist nicht iterierbar. In diesem Artikel werden wir verschiedene Szenarien untersuchen, in denen dieser Fehler auftreten kann, und praktische Lösungen anbieten, die Ihnen dabei helfen, ihn effektiv zu beheben.
Den Fehler verstehen: Das NoneType-Objekt ist nicht iterierbar
Die Fehlermeldung TypeError: Das Objekt „NoneType“ ist nicht iterierbar In Python Tritt normalerweise auf, wenn Sie versuchen, über ein Objekt zu iterieren, das den Wert hat Keiner . Dieser Fehler wird ausgelöst, weil None nicht iterierbar ist, was bedeutet, dass Sie es nicht wie bei Listen, Tupeln oder anderen iterierbaren Objekten durchlaufen können.
Syntax: TypeError: Das Objekt „NoneType“ ist nicht iterierbar
Ursachen für TypeError: Das Objekt „NoneType“ ist nicht iterierbar
- Fehlende Return-Anweisung
- Ungültige API-Antwort
- Iterieren über eine Variable mit dem Wert None
- Keiner. Typfehler in den Klassen
- Lambda-Funktionen und NoneType-Fehler
Fehlende Return-Anweisung
Eines der häufigsten Szenarios, die zu diesem Fehler führen, ist eine fehlende Return-Anweisung in einer Funktion. Nehmen wir an, wir haben eine Funktion, die a zurückgeben soll Liste von Zahlen, aber wir vergessen, eine Return-Anweisung einzufügen:
Python3
def> generate_numbers():> >numbers>=> [>1>,>2>,>3>,>4>,>5>]> ># Missing return statement> result>=> generate_numbers()> for> num>in> result:> >print>(num)> |
retten von
>
>
Ausgabe
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 1 line 6 3 # Missing return statement 5 result = generate_numbers() ---->6 für Anzahl im Ergebnis: 7 print(num) TypeError: 'NoneType'-Objekt ist nicht iterierbar>
In diesem Fall, ' „generate_numbers()“ gibt nichts zurück, was bedeutet, dass es None zurückgibt. Wenn wir versuchen, über das Ergebnis zu iterieren, stoßen wir auf das „ TypeError' weil wir nicht über None iterieren können.
Lösung: Sorgen Sie für eine ordnungsgemäße Rückgabe
Um diesen Fehler zu beheben, stellen Sie sicher, dass unsere Funktion den erwarteten Wert zurückgibt. In diesem Beispiel sollten wir eine Return-Anweisung hinzufügen „generate_numbers()“:
Python3
def> generate_numbers():> >numbers>=> [>1>,>2>,>3>,>4>,>5>]> >return> numbers> result>=> generate_numbers()> for> num>in> result:> >print>(num)> |
>
>
Ausgabe
1 2 3 4 5>
Jetzt, generate_numbers() gibt eine Liste mit Zahlen zurück und der Fehler wird behoben.
Ungültige API-Antwort
Ein weiteres Szenario, in dem dieser Fehler auftreten kann, ist die Arbeit mit APIs . Nehmen wir an, wir stellen eine API-Anfrage zum Abrufen von Daten, aber die API gibt None anstelle der erwarteten Daten zurück:
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)> |
>
>
Ausgabe
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 2 line 11 8 return None 10 data = fetch_data() --->11 für Element in Daten: 12 print(item) TypeError: 'NoneType' Objekt ist nicht iterierbar>
Wenn die API Die Anfrage schlägt fehl oder gibt „Keine“ zurück. Wir erhalten eine 'TypeError' beim Versuch, über Daten zu iterieren.
Lösung: Überprüfen Sie die API-Antwort
Um mit dieser Situation umzugehen, sollten wir die API-Antwort überprüfen, bevor wir versuchen, darüber zu iterieren. Hier ist eine verbesserte Version des Codes:
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)> |
>
>
Wenn der Statuscode nicht 200 ist, liegt ein Problem mit vor API Anfrage. In diesem Fall geben wir eine leere Liste [] als Platzhalterwert anstelle von None zurück. Durch die Rückgabe einer leeren Liste können wir Folgendes vermeiden „NoneType“ Fehler beim Versuch, die Antwortdaten später im Code zu durchlaufen.
Iterieren über eine Variable mit dem Wert None
Dieses Szenario ist unkompliziert und häufig. Es tritt auf, wenn wir versuchen, eine Schleife (Iteration) über eine Variable durchzuführen, die den Wert None hat:
Python3
my_list>=> None> for> item>in> my_list:> >print>(item)> |
>
>
Ausgabe
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 3 line 2 1 my_list = None ---->2 für Element in my_list: 3 print(item) TypeError: 'NoneType' Objekt ist nicht iterierbar>
In diesem Szenario ist die Variable „ meine Liste' ist auf „Keine“ festgelegt. Wenn die for-Schleife versucht, zu iterieren 'meine Liste' , es trifft auf die TypeError: Das Objekt „NoneType“ ist nicht iterierbar. Dieser Fehler tritt auf, weil None kein iterierbares Objekt ist und wir es nicht durchlaufen können.
Lösung: Sicherstellen der iterierbaren Präsenz vor der Schleife
Um diesen Fehler zu beheben, müssen wir dies sicherstellen 'meine Liste' enthält ein iterierbares Objekt (z. B. eine Liste, ein Tupel usw.), bevor versucht wird, darüber zu iterieren. Hinzufügen eines Schecks wie wenn my_list nicht None ist vor der Schleife stellt sicher, dass der Code innerhalb der Schleife nur ausgeführt wird, wenn meine Liste ist nicht None, verhindert das „NoneType“ Fehler.
Python3
my_list>=> None> if> my_list>is> not> None>:> >for> item>in> my_list:> >print>(item)> |
>
>
Keiner. Typfehler in den Klassen
Klassen In Python kann auch begegnen „NoneType“ Fehler auftreten, insbesondere wenn mit Methoden gearbeitet wird, die None zurückgeben. Stellen Sie sich eine Klasse mit einer Methode vor, die keinen Wert zurückgibt.
Nehmen wir an, wir haben eine Klasse mit dem Namen 'Student'. In dieser Klasse möchten wir den Namen und die Noten eines Schülers speichern. Die Klasse hat eine Methode namens 'Noten bekommen()' was logischerweise die Noten des Schülers zurückgeben sollte. In dieser Situation war ein Student namens „ Alisha‘ wird mit einer Notenliste erstellt. Ziel ist es, zu prüfen, ob eine von Alishas Noten über oder gleich 90 ist, und diese auszudrucken
Hier ist der ursprüngliche 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)> |
>
>
Ausgabe
--------------------------------------------------------------------------- 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 Note in student.get_grades(): 14 if grade>=90: 15 print(note) TypeError: 'NoneType' object is not iterable> Das Problem liegt in der 'Noten bekommen()' Methode. Die Noten werden zwar gedruckt, aber nicht zurückgegeben. Wenn wir versuchen, eine Schleife durchzuführen „student.get_grades()“ , druckt es die Noten, gibt Ihnen aber keine Werte, mit denen Sie in der Schleife arbeiten können.
Wenn wir also versuchen, das Ergebnis von zu wiederholen „student.get_grades()“, es kehrt implizit zurück 'Keiner' weil es keine explizite return-Anweisung in der gibt 'Noten bekommen()' Methode. Python betrachtet dies als None, was nicht iterierbar ist. Als Ergebnis stoßen wir auf a TypeError: Das Objekt „NoneType“ ist nicht iterierbar Fehler.
Lösung: Geeignete Werte von Klassenmethoden zurückgeben
Um dieses Problem zu beheben, müssen wir die ändern 'Noten bekommen()' Methode. Anstatt die Noten nur auszudrucken, sollten sie zurückgegeben werden. Die Rückgabe der Noten bedeutet, dass dem Aufrufer der Methode eine Iterable (in diesem Fall die Liste der Noten) bereitgestellt wird. Durch die Rückgabe der Noten wird die Methode iterierbar und die Schleife kann wie vorgesehen funktionieren.
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)> |
>
>
In diesem korrigierten Code ist also die 'Noten bekommen()' Methode gibt zurück „self.grade“, Das ist die Liste der Noten. Wenn wir iterieren „student.get_grades()“ , wir werden die Liste der Noten durchlaufen, aber es wird keine geben „NoneType“ Fehler, weil wir über ein gültiges iterierbares Objekt iterieren.
Ausgabe
90 92>
Lambda-Funktionen und NoneType-Fehler
Der Fehler TypeError: Das Objekt „NoneType“ ist nicht iterierbar kann auftreten in Lambda-Funktionen wenn die Lambda-Funktion in bestimmten Situationen None zurückgibt. Dies geschieht normalerweise, wenn wir für bestimmte Eingabewerte bedingt None zurückgeben. Wenn wir versuchen, das Ergebnis einer Lambda-Funktion zu durchlaufen, die None zurückgibt, tritt dieser Fehler auf.
Beispiel: In diesem Beispiel, wenn die Eingabe X ist nicht größer als 0 (x>0) , Die Lambda-Funktion gibt None zurück. Wenn wir versuchen, über das Ergebnis zu iterieren, versuchen wir, über None zu iterieren, was dazu führt, dass TypeError: Das Objekt „NoneType“ ist nicht iterierbar Fehler.
Python3
my_lambda>=> lambda> x: x>*> 2> if> x>>0> else> None> result>=> my_lambda(>->1>)> for> item>in> result:> >print>(item)> |
>
>
Ausgabe
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 5 line 3 1 my_lambda = lambda x: x * 2 if x>0 else None 2 result = my_lambda(-1) ----> 3 für item in result: 4 print(item) TypeError: 'NoneType' object is not iterable>
Lösung: Sicherstellung iterierbarer Ergebnisse
Um diesen Fehler zu beheben, sollten wir den Fall behandeln, in dem die Lambda-Funktion None zurückgibt. Eine Möglichkeit, damit umzugehen, besteht darin, im Fall von eine Standarditerable (z. B. eine leere Liste) bereitzustellen Keiner. Hier ist der korrigierte Code:
Python3
my_lambda>=> lambda> x: [x>*> 2>]>if> x>>0> else> []> result>=> my_lambda(>->1>)> for> item>in> result:> >print>(item)> |
>
>
Ausgabe: In diesem festen Code ist die Lambda-Funktion gibt eine Liste mit zurück x * 2 Wenn 'X' ist größer als 0. Wenn 'X' nicht größer als 0 ist (wie im Fall von -1), wird eine leere Liste zurückgegeben. Jetzt können wir über das Ergebnis iterieren, ohne auf das zu stoßen „NoneType“ Fehler.