Kaip ištaisyti TypeError: „NoneType“ objektas nėra kartojamas Python
Python yra populiari ir universali programavimo kalba, tačiau, kaip ir bet kuri kita kalba, ji gali sukelti klaidų, kurių derinimas gali būti varginantis. Viena iš dažniausiai pasitaikančių klaidų, su kuriomis susiduria kūrėjai, yra Tipo klaida: „NoneType“ objekto negalima kartoti. Šiame straipsnyje išnagrinėsime įvairius scenarijus, kai gali atsirasti ši klaida, ir pateiksime praktinius sprendimus, padėsiančius efektyviai ją išspręsti.
Klaidos supratimas: „NoneType“ objektas nėra kartojamas
Klaidos pranešimas Tipo klaida: „NoneType“ objekto negalima kartoti in Python paprastai įvyksta, kai bandote kartoti objektą, kurio vertė yra Nė vienas . Ši klaida iškyla, nes „Nė vienas“ nėra kartojamas, o tai reiškia, kad jūs negalite jos pereiti taip, kaip galite su sąrašais, eilėmis ar kitais iteruojamais objektais.
sintaksė: TypeError: „NoneType“ objekto negalima kartoti
„TypeError“ priežastys: „NoneType“ objektas negali būti kartojamas
- Trūksta grąžinimo pareiškimo
- Neteisingas API atsakymas
- Kartojimas per kintamąjį su reikšme None
- Nėra Įveskite klaidą klasėse
- Lambda funkcijos ir NoneType klaida
Trūksta grąžinimo pareiškimo
Vienas iš dažniausiai pasitaikančių scenarijų, dėl kurių atsiranda ši klaida, yra trūkstamas grąžinimo sakinys funkcijoje. Tarkime, kad turime funkciją, kuri turėtų grąžinti a sąrašą skaičių, bet pamirštame įtraukti grąžinimo teiginį:
Python3
def> generate_numbers():> > numbers> => [> 1> ,> 2> ,> 3> ,> 4> ,> 5> ]> > # Missing return statement> result> => generate_numbers()> for> num> in> result:> > print> (num)> |
Išvestis
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 1 line 6 3 # Missing return statement 5 result = generate_numbers() ---->6 rezultato skaičiui: 7 print(skaičius) Tipo klaida: 'NoneType' objekto negalima kartoti>>Tokiu atveju, ' gener_numbers()' nieko negrąžina, vadinasi, grąžina Nėra. Kai bandysime pakartoti rezultatą, susidursime su „ Type Error' nes negalime kartoti nė vieno.
Sprendimas: Užtikrinkite tinkamą grąžinimą
Norėdami ištaisyti šią klaidą, įsitikinkite, kad funkcija grąžina tikėtiną reikšmę. Šiame pavyzdyje turėtume pridėti grąžinimo teiginį 'generate_numbers()':
Python3
def> generate_numbers():> > numbers> => [> 1> ,> 2> ,> 3> ,> 4> ,> 5> ]> > return> numbers> result> => generate_numbers()> for> num> in> result:> > print> (num)> |
Išvestis
1 2 3 4 5
Dabar generuoti_skaičius() grąžina skaičių sąrašą ir klaida išspręsta.
Neteisingas API atsakymas
Kitas scenarijus, kai galite susidurti su šia klaida, yra dirbant su API . Tarkime, kad pateikiame API užklausą gauti duomenis, bet API pateikia „Nėra“, o ne tikėtinus duomenis:
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)> |
Išvestis
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 2 line 11 8 return None 10 data = fetch_data() --->11 elementui duomenyse: 12 spausdinti(prekė) Tipo klaida: 'NoneType' objekto negalima kartoti>>
Jei API užklausa nepavyksta arba grąžinama Nėra, gausime a „Tipo klaida“ kai bandoma kartoti duomenis.
Sprendimas: patikrinkite API atsakymą
Norėdami išspręsti šią situaciją, turėtume patikrinti API atsakymą prieš bandydami jį pakartoti. Štai patobulinta kodo versija:
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)> |
Jei būsenos kodas nėra 200, tai reiškia, kad kilo problema API prašymas. Šiuo atveju kaip rezervuotos vietos reikšmę grąžiname tuščią sąrašą [], o ne None. Tuščio sąrašo grąžinimas leidžia išvengti „NoneType“ klaida bandant pakartoti atsakymo duomenis vėliau kode.
Kartojimas per kintamąjį su reikšme None
Šis scenarijus yra paprastas ir įprastas. Tai atsitinka, kai bandome kartoti (kartoti) per kintamąjį, kurio reikšmė None:
Python3
my_list> => None> for> item> in> my_list:> > print> (item)> |
Išvestis
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 3 line 2 1 my_list = None ---->2 elementui mano_sąraše: 3 spausdinti(elementas) Tipo klaida: 'NoneType' objekto negalima kartoti>>
Pagal šį scenarijų kintamasis „ mano_sąrašas' nustatyta kaip Nėra. Kai for ciklas bando kartoti „mano_sąrašas“ , jis susiduria su Tipo klaida: „NoneType“ objekto negalima kartoti. Ši klaida įvyksta, nes None nėra kartojamas objektas ir negalime jo pereiti.
Sprendimas: pakartojamo buvimo užtikrinimas prieš pradedant kilpą
Norėdami ištaisyti šią klaidą, turime tai užtikrinti „mano_sąrašas“ yra kartojamas objektas (pvz., sąrašas, eilutė ir kt.), prieš bandant jį kartoti. Pridedamas čekis patinka jei mano_sąrašas nėra Nėra prieš kilpą užtikrina, kad ciklo viduje esantis kodas bus paleistas tik jei mano_sąrašas nėra Nėra, užkertant kelią „NoneType“ klaida.
Python3
my_list> => None> if> my_list> is> not> None> :> > for> item> in> my_list:> > print> (item)> |
Nėra Įveskite klaidą klasėse
Klasės in Python taip pat gali susidurti „NoneType“ klaidų, ypač dirbant su metodais, kurie grąžina Nėra. Apsvarstykite klasę su metodu, kuris negrąžina jokios reikšmės.
Tarkime, kad turime klasę pavadinimu 'Studentas'. Šioje klasėje norime išsaugoti mokinio vardą ir jo pažymius. Klasė turi metodą, vadinamą „get_grades()“ kuris logiškai turėtų grąžinti mokinio pažymius. Šioje situacijoje studentas, vardu „ Alisha' sukurtas su pažymių sąrašu. Tikslas yra patikrinti, ar kuris nors iš Alisha pažymių yra didesnis arba lygus 90, ir juos atspausdinti
Štai pradinis kodas:
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>>> |