Python on suosittu ja monipuolinen ohjelmointikieli, mutta kuten mikä tahansa muu kieli, se voi aiheuttaa virheitä, jotka voivat olla turhauttavia virheenkorjauksessa. Yksi yleisimmistä kehittäjien kohtaamista virheistä on TypeError: NoneType-objekti ei ole iteroitavissa. Tässä artikkelissa tutkimme erilaisia skenaarioita, joissa tämä virhe voi ilmetä, ja tarjoamme käytännön ratkaisuja, joiden avulla voit ratkaista sen tehokkaasti.
Virheen ymmärtäminen: NoneType' -objekti ei ole iteroitavissa
Virheilmoitus TypeError: NoneType-objekti ei ole iteroitavissa sisään Python tapahtuu tyypillisesti, kun yrität iteroida objektia, jonka arvo on Ei mitään . Tämä virhe ilmenee, koska None ei ole iteroitavissa, mikä tarkoittaa, että et voi kiertää sitä samalla tavalla kuin listojen, monikoiden tai muiden iteroitavien objektien kanssa.
syntaksi: TypeError: NoneType-objekti ei ole iteroitavissa
Tuo skanneri java
TypeErrorin syyt: NoneType-objekti ei ole iteroitavissa
- Palautusilmoitus puuttuu
- Virheellinen API-vastaus
- Iteroidaan muuttujan yli, jonka arvo on Ei mitään
- Ei mitään Kirjoita virhe luokissa
- Lambda-funktiot ja NoneType-virhe
Palautusilmoitus puuttuu
Yksi yleisimmistä tähän virheeseen johtavista skenaarioista on puuttuva return-lause funktiosta. Oletetaan, että meillä on funktio, jonka oletetaan palauttavan a lista numeroista, mutta unohdamme sisällyttää palautuslausekkeen:
Python 3
def> generate_numbers():> >numbers>=> [>1>,>2>,>3>,>4>,>5>]> ># Missing return statement> result>=> generate_numbers()> for> num>in> result:> >print>(num)> |
>
>
Lähtö
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 1 line 6 3 # Missing return statement 5 result = generate_numbers() ---->6 tulosten lukumäärälle: 7 print(num) TypeError: 'NoneType' -objekti ei ole iteroitavissa>
Tässä tapauksessa, ' gener_numbers()' ei palauta mitään, mikä tarkoittaa, että se palauttaa Ei mitään. Kun yritämme toistaa tulosta, kohtaamme ' Tyyppivirhe' koska emme voi toistaa Ei mitään.
Ratkaisu: Varmista oikea palautus
Korjaa tämä virhe varmistamalla, että funktiomme palauttaa odotetun arvon. Tässä esimerkissä meidän pitäisi lisätä return-lause 'generate_numbers()':
Python 3
def> generate_numbers():> >numbers>=> [>1>,>2>,>3>,>4>,>5>]> >return> numbers> result>=> generate_numbers()> for> num>in> result:> >print>(num)> |
>
>
Lähtö
1 2 3 4 5>
Nyt, genero_numerot() palauttaa numeroluettelon, ja virhe on korjattu.
Virheellinen API-vastaus
Toinen skenaario, jossa saatat kohdata tämän virheen, on työskentely API:t . Oletetaan, että teemme API-pyynnön tietojen hakemiseksi, mutta API palauttaa Ei mitään odotettujen tietojen sijaan:
Python 3
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)> |
>
>
Lähtö
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 2 line 11 8 return None 10 data = fetch_data() --->11 kohteelle tiedoissa: 12 print(item) TypeError: 'NoneType' objekti ei ole iteroitavissa>>Jos API pyyntö epäonnistuu tai palauta Ei mitään, saamme a 'Tyyppivirhe' kun yrität iteroida dataa.
Ratkaisu: Tarkista API-vastaus
Tämän tilanteen ratkaisemiseksi meidän tulee tarkistaa API-vastaus ennen kuin yritämme toistaa sitä. Tässä on parannettu versio koodista:
Python 3
Neena Gupta
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)> |
>
Jos tilakoodi ei ole 200, se tarkoittaa, että sovelluksessa on ongelma API pyyntö. Tässä tapauksessa palautamme tyhjän luettelon [] paikkamerkkiarvona Ei mitään. Tyhjän luettelon palauttaminen antaa meille mahdollisuuden välttää 'NoneType' virhe yritettäessä toistaa vastausdataa myöhemmin koodissa.
Iteroidaan muuttujan yli, jonka arvo on Ei mitään
Tämä skenaario on suoraviivainen ja yleinen. Se tapahtuu, kun yritämme toistaa (iteroida) muuttujan, jonka arvo on Ei mitään:
kuinka saada nykyinen päivämäärä javassa
Python 3
my_list>=> None> for> item>in> my_list:> >print>(item)> |
>
>
Lähtö
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 3 line 2 1 my_list = None ---->2 kohteelle my_list: 3 print(item) TypeError: 'NoneType' objekti ei ole iteroitavissa>
Tässä skenaariossa muuttuja ' Minun listani' on asetettu arvoon Ei mitään. Kun for-silmukka yrittää iteroida uudelleen 'Minun listani' , se kohtaa TypeError: NoneType-objekti ei ole iteroitavissa. Tämä virhe ilmenee, koska None ei ole iteroitavissa oleva objekti, emmekä voi kiertää sitä.
Ratkaisu: Iterable läsnäolon varmistaminen ennen silmukoita
Korjataksemme tämän virheen, meidän on varmistettava se 'Minun listani' sisältää iteroitavan objektin (kuten luettelon, tuplen jne.) ennen kuin yrität iteroida sen yli. Lisää sekin tykkää jos listani ei ole Ei mitään ennen silmukkaa varmistaa, että silmukan sisällä oleva koodi suoritetaan vain jos Minun listani ei ole Ei mitään, mikä estää 'NoneType' virhe.
Python 3
my_list>=> None> if> my_list>is> not> None>:> >for> item>in> my_list:> >print>(item)> |
>
>
Ei mitään Kirjoita virhe luokissa
Luokat sisään Python voi myös kohdata 'NoneType' virheitä, varsinkin käytettäessä menetelmiä, jotka palauttavat Ei mitään. Harkitse luokkaa, jonka menetelmä ei palauta arvoa.
Oletetaan, että meillä on luokka nimeltä 'Opiskelija'. Tällä luokalla haluamme tallentaa oppilaan nimen ja arvosanat. Luokassa on menetelmä nimeltä 'get_grades()' jonka loogisesti pitäisi palauttaa opiskelijan arvosanat. Tässä tilanteessa opiskelija nimeltä ' Alisha' luodaan arvosanaluettelolla. Tarkoituksena on tarkistaa, onko jokin Alishan arvosanoista suurempi tai yhtä suuri kuin 90, ja tulostaa ne
Tässä alkuperäinen koodi:
Python 3
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>>>:> >print>(grade)> |
mylivericket
>
>
Lähtö
--------------------------------------------------------------------------- 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 arvosanalle opiskelija.get_grades(): 14 if grade>=90: 15 print(grade) TypeError: 'NoneType' -objekti ei ole iteroitavissa> Ongelma piilee siinä 'get_grades()' menetelmä. Vaikka se tulostaa arvosanat, se ei palauta niitä. Kun yritämme käydä läpi 'student.get_grades()' , se tulostaa arvosanat, mutta ei anna sinulle arvoja, joiden kanssa voit työskennellä silmukassa.
Joten, kun yritämme toistaa tuloksen 'student.get_grades()', se implisiittisesti palaa 'Ei mitään' koska siinä ei ole nimenomaista paluulausetta 'get_grades()' menetelmä. Python pitää tätä Ei mitään, mikä ei ole toistettavissa. Tämän seurauksena kohtaamme a TypeError: NoneType-objekti ei ole iteroitavissa virhe.
Ratkaisu: Asianmukaisten arvojen palauttaminen luokkamenetelmistä
Tämän ongelman ratkaisemiseksi meidän on muutettava 'get_grades()' menetelmä. Sen sijaan, että vain tulostaisi arvosanat, sen pitäisi palauttaa ne. Arvosanojen palauttaminen tarkoittaa iteroitavan (tässä tapauksessa arvosanaluettelon) antamista menetelmän kutsujalle. Palauttamalla arvosanat menetelmästä tulee iteroitava ja silmukka voi toimia tarkoitetulla tavalla.
Python 3
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>>>:> >print>(grade)> |
>
>
Joten tässä korjatussa koodissa 'get_grades()' menetelmä palauttaa 'self.grade', joka on arvosanaluettelo. Kun iteroidaan loppuun 'student.get_grades()' , toistamme arvosanaluettelon, eikä niitä tule olemaan 'NoneType' virhe, koska iteroimme kelvollisen iteroitavan objektin yli.
Lähtö
90 92>
Lambda-funktiot ja NoneType-virhe
Virhe TypeError: NoneType-objekti ei ole iteroitavissa voi esiintyä sisään lambda toiminnot kun lambda-funktio palauttaa Ei mitään tietyissä tilanteissa. Tämä tapahtuu yleensä, kun palautamme ehdollisesti Ei mitään tietyille syöttöarvoille. Kun yritämme toistaa lambda-funktion tulosta, joka palauttaa Ei mitään, kohtaamme tämän virheen.
merkki merkkijonoon javassa
Esimerkki: Tässä esimerkissä, jos tulo x ei ole suurempi kuin 0 (x>0) , lambda-toiminto palauttaa Ei mitään. Kun yritämme iteroida tuloksen yli, yritämme iteroida Ei mitään, mikä aiheuttaa TypeError: NoneType-objekti ei ole iteroitavissa virhe.
Python 3
my_lambda>=> lambda> x: x>*> 2> if> x>>> None> result>=> my_lambda(>->1>)> for> item>in> result:> >print>(item)> |
>
>
Lähtö
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 5 line 3 1 my_lambda = lambda x: x * 2 if x>0 muu Ei mitään 2 tulos = my_lambda(-1) ----> 3 kohteelle tuloksessa: 4 print(item) TypeError: 'NoneType' objekti ei ole iteroitavissa>
Ratkaisu: Iteroitavien tulosten varmistaminen
Tämän virheen korjaamiseksi meidän tulisi käsitellä tapausta, jossa lambda-funktio palauttaa Ei mitään. Yksi tapa käsitellä sitä on tarjota oletusiterable (kuten tyhjä lista) tapauksessa Ei mitään. Tässä korjattu koodi:
Python 3
my_lambda>=> lambda> x: [x>*> 2>]>if> x>>> []> result>=> my_lambda(>->1>)> for> item>in> result:> >print>(item)> |
>
>
Lähtö: Tässä kiinteässä koodissa lambda-toiminto palauttaa luettelon, joka sisältää x * 2 jos 'x' on suurempi kuin 0. Jos 'x' ei ole suurempi kuin 0 (kuten -1), se palauttaa tyhjän luettelon. Nyt voimme toistaa tulosta ilman, että kohtaamme 'NoneType' virhe.