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
mysql sukurti vartotoją
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)> |
kaip sugeneruoti atsitiktinį skaičių java
>
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>>>:> >print>(grade)> |
>
>
Išvestis
--------------------------------------------------------------------------- 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 pažymiui student.get_grades(): 14 if grade>=90: 15 print(grade) TypeError: 'NoneType' objektas nekartojamas>>Problema slypi tame „get_grades()“ metodas. Nors pažymius spausdina, jų negrąžina. Kai bandome pereiti „student.get_grades()“ , jis spausdina pažymius, bet nesuteikia jokių verčių, su kuriomis galėtumėte dirbti cikle.
Taigi, kai bandome pakartoti rezultatą „student.get_grades()“, tai netiesiogiai grįžta 'Nė vienas' nes nėra aiškaus grąžinimo teiginio „get_grades()“ metodas. Python mano, kad tai nėra, o tai nėra kartojama. Dėl to susiduriame su a Tipo klaida: „NoneType“ objekto negalima kartoti klaida.
Sprendimas: tinkamų verčių grąžinimas iš klasės metodų
Norėdami išspręsti šią problemą, turime pakeisti „get_grades()“ metodas. Užuot tiesiog spausdinęs pažymius, jis turėtų juos grąžinti. Pažymių grąžinimas reiškia kartojimo (šiuo atveju pažymių sąrašo) pateikimą metodo skambintojui. Grąžinus pažymius, metodas tampa kartojamas, o ciklas gali veikti taip, kaip numatyta.
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>>>:> >print>(grade)> |
>
Taigi šiame pataisytame kode „get_grades()“ metodas grįžta „self.grade“, kuris yra pažymių sąrašas. Kai kartojame „student.get_grades()“ , pakartosime pažymių sąrašą ir jo nebus „NoneType“ klaida, nes kartojame per tinkamą iteruojamą objektą.
Išvestis
java yra nulis
90 92>
Lambda funkcijų ir NoneType klaida
Klaida Tipo klaida: „NoneType“ objekto negalima kartoti gali atsirasti lambda funkcijos kai lambda funkcija tam tikrose situacijose grąžina Nėra. Paprastai tai atsitinka, kai sąlyginai pateikiame „Nėra“ konkrečioms įvesties reikšmėms. Kai bandome pakartoti lambda funkcijos, kuri grąžina Nėra, rezultatą, susiduriame su šia klaida.
Pavyzdys: Šiame pavyzdyje, jei įvestis x yra ne didesnis nei 0 (x>0) , lambda funkcija grąžina Nėra. Kai bandome pakartoti rezultatą, bandome kartoti per Nėra, todėl atsiranda Tipo klaida: „NoneType“ objekto negalima kartoti klaida.
Python3
my_lambda>=> lambda> x: x>*> 2> if> x>>> None> result>=> my_lambda(>->1>)> for> item>in> result:> >print>(item)> |
>
>
Išvestis
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 5 line 3 1 my_lambda = lambda x: x * 2 if x>0 dar Nėra 2 rezultatas = mano_lambda(-1) ----> 3 elementui rezultate: 4 print(item) Tipo klaida: 'NoneType' objektas nepakartojamas>
Sprendimas: Pakartojamų rezultatų užtikrinimas
Norėdami ištaisyti šią klaidą, turėtume tvarkyti atvejį, kai lambda funkcija grąžina Nėra. Vienas iš būdų tai tvarkyti yra pateikti numatytąjį kartojimą (pvz., tuščią sąrašą), jei Nė vienas. Štai ištaisytas kodas:
Python3
my_lambda>=> lambda> x: [x>*> 2>]>if> x>>> []> result>=> my_lambda(>->1>)> for> item>in> result:> >print>(item)> |
>
>
Išvestis: Šiame fiksuotame kode lambda funkcija grąžina sąrašą, kuriame yra x * 2 jeigu 'x' yra didesnis nei 0. Jei 'x' yra ne didesnis nei 0 (kaip ir -1 atveju), jis pateikia tuščią sąrašą. Dabar galime kartoti rezultatą, nesusidūrę su „NoneType“ klaida.