logo

Ako opraviť TypeError: Objekt „NoneType“ nie je iterovateľný v Pythone

Python je populárny a všestranný programovací jazyk, ale ako každý iný jazyk môže spôsobiť chyby, ktoré môžu byť frustrujúce pri ladení. Jednou z bežných chýb, s ktorými sa vývojári stretávajú, je TypeError: Objekt „NoneType“ nie je iterovateľný. V tomto článku preskúmame rôzne scenáre, v ktorých sa táto chyba môže vyskytnúť, a poskytneme praktické riešenia, ktoré vám pomôžu efektívne ju riešiť.

Pochopenie chyby: Objekt NoneType nie je iterovateľný

Chybové hlásenie TypeError: Objekt „NoneType“ nie je iterovateľný v Python sa zvyčajne vyskytuje, keď sa pokúsite iterovať cez objekt, ktorý má hodnotu žiadne . Táto chyba je vyvolaná, pretože None nie je iterovateľné, čo znamená, že cez ňu nemôžete prechádzať ako v prípade zoznamov, n-tic alebo iných iterovateľných objektov.



syntax: TypeError: Objekt „NoneType“ nie je iterovateľný

Príčiny TypeError: Objekt „NoneType“ nie je iterovateľný

  • Chýba vyhlásenie o vrátení
  • Neplatná odpoveď API
  • Iterácia nad premennou s hodnotou None
  • Žiadne Chyba typu v triedach
  • Chyba funkcií Lambda a NoneType

Chýba vyhlásenie o vrátení

Jedným z najbežnejších scenárov vedúcich k tejto chybe je chýbajúci príkaz return vo funkcii. Povedzme, že máme funkciu, ktorá má vrátiť a zoznam čísel, ale zabudli sme uviesť návratový príkaz:

Python3








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

>

>

Výkon

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 1 line 6 3 # Missing return statement 5 result = generate_numbers() ---->6 pre num vo výsledku: 7 print(num) TypeError: 'NoneType' objekt nie je iterovateľný>

V tomto prípade, ' generovať_čísla()“ nevracia nič, čo znamená, že vracia Žiadne. Keď sa pokúsime opakovať výsledok, narazíme na „ TypeError' pretože nemôžeme opakovať žiadne.

Riešenie: Zabezpečte správny návrat

Ak chcete túto chybu opraviť, uistite sa, že naša funkcia vracia očakávanú hodnotu. V tomto príklade by sme mali pridať príkaz return do ‘generate_numbers()’:

Python3




aplet

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

>

>

Výkon

1 2 3 4 5>

teraz generovať_čísla() vráti zoznam čísel a chyba je vyriešená.

Neplatná odpoveď API

Ďalší scenár, kde sa môžete stretnúť s touto chybou, je pri práci s API . Povedzme, že robíme požiadavku API na načítanie údajov, ale API vracia Žiadne namiesto očakávaných údajov:

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ýkon

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 2 line 11 8 return None 10 data = fetch_data() --->11 pre položku v údajoch: 12 print(item) TypeError: 'NoneType' objekt nie je iterovateľný>

Ak API žiadosť zlyhá alebo sa vráti Žiadne, dostaneme a 'TypeError' pri pokuse o iteráciu údajov.

Riešenie: Skontrolujte odpoveď API

Aby sme túto situáciu zvládli, mali by sme skontrolovať odpoveď API predtým, ako sa ju pokúsime opakovať. Tu je vylepšená verzia 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)>

>

>

Ak stavový kód nie je 200, znamená to, že sa vyskytol problém s API žiadosť. V tomto prípade namiesto hodnoty Žiadne vrátime prázdny zoznam [] ako zástupnú hodnotu. Vrátenie prázdneho zoznamu nám umožňuje vyhnúť sa „NoneType“ chyba pri pokuse o iteráciu údajov odpovede neskôr v kóde.

Iterácia nad premennou s hodnotou None

Tento scenár je jednoduchý a bežný. Vyskytuje sa, keď sa pokúšame opakovať (iterovať) premennú, ktorá má hodnotu None:

Python3




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

>

>

Výkon

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 3 line 2 1 my_list = None ---->2 pre položku v mojom_zozname: 3 print(item) TypeError: 'NoneType' objekt nie je iterovateľný>

V tomto scenári premenná „ my_list' je nastavené na Žiadne. Keď sa cyklus for pokúsi opakovať „môj_zoznam“ , naráža na TypeError: Objekt „NoneType“ nie je iterovateľný. K tejto chybe dochádza, pretože None nie je iterovateľný objekt a nemôžeme ním prechádzať.

Riešenie: Zabezpečenie opakovateľnej prítomnosti pred zacyklením

Aby sme túto chybu opravili, musíme to zabezpečiť „môj_zoznam“ obsahuje iterovateľný objekt (ako je zoznam, n-tica atď.) pred pokusom o iteráciu. Pridanie šeku páči sa mi ak môj_zoznam nie je Žiadny pred slučkou zaisťuje, že kód vo vnútri slučky beží iba vtedy, ak môj_zoznam nie je Žiadne, bráni tomu „NoneType“ chyba.

Python3




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

groovy jazyk

>

>

Žiadne Chyba typu v triedach

triedy v Python môže tiež stretnúť „NoneType“ chyby, najmä pri práci s metódami, ktoré vracajú Žiadne. Zvážte triedu s metódou, ktorá nevracia žiadnu hodnotu.

Predpokladajme, že máme triedu s názvom „Študent“. V tejto triede chceme uložiť meno študenta a jeho známky. Trieda má metódu tzv ‘get_grades()’ čo by logicky malo vrátiť študentovi známky. V tejto situácii študent s názvom „ Alisha' je vytvorený so zoznamom známok. Zámerom je skontrolovať, či je niektorý z Alishiných známok vyšší alebo rovný 90 a vytlačiť ich

Tu je počiatoč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ýkon

--------------------------------------------------------------------------- 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 pre známku v študent.get_grades(): 14, ak známka>=90: 15 print(známka) TypeError: objekt 'NoneType' nie je iterovateľný>

Problém spočíva v ‘get_grades()’ metóda. Hoci známky tlačí, nevracia ich. Keď sa pokúsime prejsť ‘student.get_grades()’ , vytlačí známky, ale neposkytne vám žiadne hodnoty, s ktorými by ste mohli v slučke pracovať.

Takže, keď sa pokúsime opakovať výsledok ‘student.get_grades()’, implicitne sa vracia „žiadny“ pretože v súbore nie je žiadny explicitný príkaz návratu ‘get_grades()’ metóda. Python považuje to za Žiadne, čo nie je opakovateľné. V dôsledku toho sa stretávame s a TypeError: Objekt „NoneType“ nie je iterovateľný chyba.

Riešenie: Vrátenie vhodných hodnôt z metód triedy

Aby sme tento problém vyriešili, musíme upraviť ‘get_grades()’ metóda. Namiesto toho, aby len tlačil známky, mal by ich vrátiť. Vrátenie známok znamená poskytnutie iterovateľného (v tomto prípade zoznamu známok) volajúcemu metódy. Vrátením známok sa metóda stáva iterovateľnou a slučka môže fungovať podľa plánu.

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 opravenom kóde je ‘get_grades()’ metóda sa vracia „vlastný stupeň“, čo je zoznam známok. Keď to zopakujeme ‘student.get_grades()’ , budeme opakovať zoznam známok a nebudú tam žiadne „NoneType“ chyba, pretože iterujeme cez platný iterovateľný objekt.

Výkon

90 92>

Chyba funkcií Lambda a NoneType

Chyba TypeError: Objekt „NoneType“ nie je iterovateľný sa môže vyskytnúť v lambda funkcie keď sa funkcia lambda vráti v určitých situáciách Žiadne. Zvyčajne sa to stane, keď podmienečne vrátime žiadne pre konkrétne vstupné hodnoty. Keď sa pokúšame opakovať výsledok funkcie lambda, ktorá vracia Žiadne, narazíme na túto chybu.

Príklad: V tomto príklade, ak je vstup X nie je väčšie ako 0 (x>0) , lambda funkcia vráti Žiadne. Keď sa pokúšame opakovať výsledok, snažíme sa opakovať žiadne, čo spôsobuje TypeError: Objekt „NoneType“ nie je iterovateľný chyba.

Python3




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

>

>

Výkon

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

Riešenie: Zabezpečenie opakovateľných výsledkov

Aby sme túto chybu opravili, mali by sme riešiť prípad, keď funkcia lambda vráti Žiadne. Jedným zo spôsobov, ako to zvládnuť, je poskytnúť predvolenú iterovateľnosť (napríklad prázdny zoznam) v prípade žiadne. Tu 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ýkon: V tomto pevnom kóde je lambda funkcia vráti zoznam obsahujúci x * 2 ak 'X' je väčší ako 0. Ak 'X' nie je väčšie ako 0 (ako v prípade -1), vráti prázdny zoznam. Teraz môžeme opakovať výsledok bez toho, aby sme narazili na „NoneType“ chyba.