logo

Jak opravit TypeError: Objekt „NoneType“ nelze v Pythonu iterovat

Krajta je populární a všestranný programovací jazyk, ale jako každý jiný jazyk může způsobit chyby, které mohou být frustrující při ladění. Jednou z běžných chyb, se kterou se vývojáři setkávají, je TypeError: Objekt „NoneType“ nelze iterovat. V tomto článku prozkoumáme různé scénáře, kde k této chybě může dojít, a poskytneme praktická řešení, která vám pomohou ji efektivně řešit.

Pochopení chyby: Objekt NoneType není iterovatelný

Chybová zpráva TypeError: Objekt „NoneType“ nelze iterovat v Krajta obvykle nastane, když se pokusíte iterovat přes objekt, který má hodnotu Žádný . Tato chyba je vyvolána, protože None není iterovatelný, což znamená, že jej nemůžete opakovat jako u seznamů, n-tic nebo jiných iterovatelných objektů.



syntaxe: TypeError: Objekt „NoneType“ nelze iterovat

Příčiny TypeError: Objekt „NoneType“ nelze iterovat

  • Chybí prohlášení o vrácení
  • Neplatná odpověď API
  • Iterace přes proměnnou s hodnotou None
  • Žádná Chyba typu ve třídách
  • Chyba funkcí Lambda a NoneType

Chybí prohlášení o vrácení

Jedním z nejběžnějších scénářů vedoucích k této chybě je chybějící příkaz return ve funkci. Řekněme, že máme funkci, která má vracet a seznam čísel, ale zapomněli jsme zahrnout příkaz return:

Python3








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

>

>

Výstup

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 1 line 6 3 # Missing return statement 5 result = generate_numbers() ---->6 for num in result: 7 print(num) TypeError: 'NoneType' objekt nelze iterovat>

V tomto případě, ' generovat_čísla()' nevrací nic, což znamená, že vrací Žádné. Když se pokusíme opakovat výsledek, narazíme na „ TypeError' protože nemůžeme iterovat přes None.

Řešení: Zajistěte řádné vrácení

Chcete-li tuto chybu opravit, ujistěte se, že naše funkce vrací očekávanou hodnotu. V tomto příkladu bychom měli přidat příkaz return do ‘generate_numbers()’:

Python3




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

>

>

Výstup

1 2 3 4 5>

Nyní, generovat_čísla() vrátí seznam čísel a chyba je vyřešena.

konečné klíčové slovo v jazyce Java

Neplatná odpověď API

Další scénář, kdy se můžete setkat s touto chybou, je při práci s API . Řekněme, že zadáváme požadavek API na načtení dat, ale API vrací Žádné místo očekávaných dat:

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

>

>

Výstup

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 2 line 11 8 return None 10 data = fetch_data() --->11 pro položku v datech: 12 print(item) TypeError: 'NoneType' objekt nelze iterovat>

Pokud API požadavek selže nebo se vrátí Žádný, dostaneme a 'Chyba typu' při pokusu o iteraci přes data.

Řešení: Zkontrolujte odezvu API

Abychom tuto situaci zvládli, měli bychom před pokusem o iteraci zkontrolovat odpověď API. Zde je vylepšená verze kódu:

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

>

>

Pokud stavový kód není 200, znamená to, že došlo k problému s API žádost. V tomto případě vrátíme prázdný seznam [] jako zástupnou hodnotu namísto None. Vrácení prázdného seznamu nám umožňuje vyhnout se „NoneType“ chyba při pokusu o iteraci dat odpovědi později v kódu.

Iterace přes proměnnou s hodnotou None

Tento scénář je jednoduchý a běžný. Dochází k tomu, když se pokoušíme opakovat (iterovat) proměnnou, která má hodnotu Žádná:

Python3




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

>

>

Výstup

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 3 line 2 1 my_list = None ---->2 pro položku v mém_seznamu: 3 print(item) TypeError: 'NoneType' objekt nelze iterovat>

V tomto scénáři proměnná „ můj seznam' je nastaveno na Žádný. Když se smyčka for pokusí iterovat 'můj seznam' , naráží na TypeError: Objekt „NoneType“ nelze iterovat. K této chybě dochází, protože None není iterovatelný objekt a nemůžeme procházet smyčkou.

Řešení: Zajištění opakovatelné přítomnosti před opakováním

Abychom tuto chybu napravili, musíme to zajistit 'můj seznam' obsahuje iterovatelný objekt (jako je seznam, n-tice atd.), než se nad ním pokusí iterovat. Přidání šeku jako pokud můj_seznam není Žádný před smyčkou zajišťuje, že kód uvnitř smyčky běží pouze v případě můj seznam není Žádná, brání „NoneType“ chyba.

Python3




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

mysql aktualizace připojit

>

>

Žádná Chyba typu ve třídách

Třídy v Krajta může také narazit „NoneType“ chyby, zejména při práci s metodami, které vracejí Žádné. Zvažte třídu s metodou, která nevrací žádnou hodnotu.

Předpokládejme, že máme třídu pojmenovanou 'Student'. V tomto kurzu chceme uložit jméno studenta a jeho hodnocení. Třída má metodu tzv ‘get_grades()’ což by logicky mělo vrátit studentovi známky. V této situaci student jménem „ Alisha' je vytvořen se seznamem známek. Záměrem je zkontrolovat, zda je některý z Alishiných známek vyšší nebo rovný 90, a vytisknout je

Zde je počáteční kód:

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

>

>

Výstup

--------------------------------------------------------------------------- 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 pro známku v student.get_grades(): 14 if grade>=90: 15 print(grade) TypeError: 'NoneType' objekt nelze iterovat>

Problém spočívá v ‘get_grades()’ metoda. Známky sice tiskne, ale nevrací je. Když se pokusíme projít ‘student.get_grades()’ , vytiskne známky, ale neposkytne vám žádné hodnoty, se kterými byste mohli ve smyčce pracovat.

Takže, když se pokusíme opakovat výsledek ‘student.get_grades()’, implicitně se vrací 'Žádný' protože v souboru není žádný explicitní příkaz return ‘get_grades()’ metoda. Krajta považuje to za Žádné, což nelze opakovat. V důsledku toho se setkáváme s a TypeError: Objekt „NoneType“ nelze iterovat chyba.

Řešení: Vrácení příslušných hodnot z metod třídy

Abychom tento problém vyřešili, musíme upravit ‘get_grades()’ metoda. Místo pouhého tisku známek by je měl vrátit. Vrácení stupňů znamená poskytnutí iterovatelného (v tomto případě seznamu stupňů) volajícímu metody. Vrácením hodnocení se metoda stává iterovatelnou a smyčka může fungovat tak, jak bylo zamýšleno.

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

>

>

Takže v tomto opraveném kódu je ‘get_grades()’ metoda vrací ‘vlastní stupeň’, což je seznam známek. Když to opakujeme ‘student.get_grades()’ , budeme opakovat seznam známek a žádné nebudou „NoneType“ chyba, protože iterujeme přes platný iterovatelný objekt.

transformovat řetězec na int

Výstup

90 92>

Chyba funkcí Lambda a NoneType

Chyba TypeError: Objekt „NoneType“ nelze iterovat může nastat v funkce lambda když funkce lambda v určitých situacích vrátí Žádné. To se obvykle stane, když podmíněně vrátíme None pro konkrétní vstupní hodnoty. Když se pokusíme iterovat výsledek funkce lambda, která vrací Žádné, narazíme na tuto chybu.

Příklad: V tomto příkladu, pokud vstup X není větší než 0 (x>0) , funkce lambda vrátí Žádné. Když se snažíme iterovat přes výsledek, snažíme se iterovat přes None, což způsobuje TypeError: Objekt „NoneType“ nelze iterovat chyba.

Python3




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

>

>

Výstup

--------------------------------------------------------------------------- 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 for item in result: 4 print(item) TypeError: 'NoneType' object is not iterable>

Řešení: Zajištění opakovatelných výsledků

Abychom tuto chybu opravili, měli bychom zpracovat případ, kdy funkce lambda vrací Žádné. Jedním ze způsobů, jak to zvládnout, je poskytnout výchozí iterovatelný (jako je prázdný seznam) v případě Žádný. Zde je opravený kód:

Python3




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

>

>

Výstup: V tomto pevném kódu je funkce lambda vrátí seznam obsahující x * 2 -li 'X' je větší než 0. Jestliže 'X' není větší než 0 (jako v případě -1), vrátí prázdný seznam. Nyní můžeme opakovat výsledek, aniž bychom narazili na „NoneType“ chyba.