Ачааллж байна...
Энэ хичээл бусдаасаа өөр зориулалттай: уншаад өнгөрдөг хичээл биш — эргэж ирдэг лавлах юм. Өмнөх хичээлд та traceback уншдаг мөрдөгч болсон: доороос нь дээш, сүүлчийн мөр — онош, нэг дээшилбэл — хаяг. Энэ хуудас бол тэр мөрдөгчийн ширээний толь бичиг: таны сургалтын туршид танилцсан зургаан том алдааг нэг дор эмхэтгэж, тус бүрд нь дөрвөн зүйлийг өгнө — жинхэнэ англи мэдэгдэл, монгол утга, хамгийн түгээмэл шалтгаанууд, засварын жор. Ашиглах горим нь: улаан бичиг гарлаа → сүүлчийн мөрөөс алдааны нэрийг уншлаа → энэ хуудаснаас тэр нэрийг ол → шалтгаануудын жагсаалтаас өөрийнхөө байдлыг тань. Одоо нэг удаа бүхэлд нь уншаад (өөрийн "хуучин танилуудтай" нэг дор золгох нь өөрөө үнэтэй), цаашид хэрэгтэй үедээ эргэж ирээрэй — энэ хичээлийг сургалтын жагсаалтаас олоход хялбар байх болно.
Зургаан алдааг хоёр гэр бүл болгож эмхэлье — энэ ангилал өөрөө оношлогооны эхний алхам: Бичиглэлийн давхаргын алдаа (SyntaxError — Python кодыг уншиж чадаагүй: аялал эхлээгүй, өмнө нь юу ч хэвлэгдээгүй байдаг) ба биелэлтийн давхаргын алдаанууд (үлдсэн тав — Python уншсан, аялал эхэлсэн, замын дундаас осолдсон: ослын өмнөх хэвлэлтүүд гарчихсан байдаг). Улаан бичгийн өмнө юм хэвлэгдсэн үү үгүй юу гэдэг нэг харц аль гэр бүлийнх болохыг шууд хэлнэ.
Жинхэнэ мэдэгдлүүд нь:
SyntaxError: invalid syntax
SyntaxError: expected ':'
SyntaxError: '(' was never closed
SyntaxError: unterminated string literal (detected at line 1)Монголоор: "Таны бичсэн зүйл Python хэлний дүрэмд нийцэхгүй тул би уншиж ч чадсангүй." Энэ бол цорын ганц "аялал эхлэхээс өмнөх" алдаа: Python файлыг биелүүлэхээсээ өмнө бүхэлд нь уншиж шалгадаг бөгөөд дүрмийн эвдрэл олдвол ганц ч мөр ажиллуулалгүй зогсдог. Дэд хувилбарууд нь өөрсдөө жор хэлдэг: expected ':' — "хоёр цэг хүлээж байсан", '(' was never closed — "хаалт хэзээ ч хаагдаагүй", unterminated string — "төгсгөлгүй string" (хашилт хаагдаагүй).
Түгээмэл шалтгаанууд: if/for/while/def-ийн мөрийн төгсгөлийн хоёр цэг мартагдсан; хаалт, хашилтын хос дутуу (нээснээ хаагаагүй, эсвэл давхар хашилтаар нээгээд дан хашилтаар хаасан); variable-ийн нэрэнд зай орсон (minii nas); == гэх газар = бичсэн (if дотор — Python өөрөө "Maybe you meant '=='?" гэж санал болгодог); нөөцөлсөн үгийг нэр болгосон.
Засварын жор: Заасан мөрөө хар — гэм зэмгүй харагдвал нэг-хоёр мөр дээшээ хар (хаагдаагүй хаалт, хашилт "доошоо нүүдэг" гэдгийг өмнөх хичээлээс сана). Хоёр цэг, хаалтын хос, хашилтын хосоо тоол. VS Code-ын өнгө туслана: string-ийн будаг хэвийн бусаар сунасан бол хашилт, доогуур улаан долгион бол эвдрэлийн орчим.
Дахин гаргаж үзэх жишээ:
python
if nas >= 13
print("Өсвөр насных")(Хоёр цэг алга — SyntaxError: expected ':')
Жинхэнэ мэдэгдэл нь:
NameError: name 'ner' is not defined
NameError: name 'pint' is not defined. Did you mean: 'print'?Монголоор: "'ner' гэдэг нэрийг би танихгүй байна — тийм нэртэй хайрцаг, function надад бүртгэлгүй." Python нэр бүрийг "бүртгэлээсээ" хайдаг — олдохгүй бол энэ алдаа. Хамгийн тусархуу алдаануудын нэг: орчин үеийн Python ойролцоо нэр байвал "Did you mean...?" гэж өөрөө санал болгодог — санал нь ихэвчлэн оносон байдаг ч таамаг гэдгийг мартуузай.
Түгээмэл шалтгаанууд: Үсгийн алдаа (pint ← print, mongon_dvn ← mongon_dun); том-жижиг үсэг зөрсөн (Ner ≠ ner — Python-д хоёр өөр нэр!); variable-ийг үүсгэхээсээ өмнө дуудсан (хадгалах мөр нь дуудлагаас доор, эсвэл огт байхгүй — тоолуурын эхлүүлэлт мартагдсан score = score + 1); def-ийг дуудлагаас доор бичсэн; string-ээ хашилтгүй бичсэн (print(Сайн) — Python "Сайн"-ыг нэр гэж хайдаг!).
Засварын жор: Мэдэгдэл дэх нэрийг код доторх бичиглэлтэйгээ үсэг үсгээр тулга (Did you mean санал байвал түүнээс эхэл). Таарч байвал — "энэ нэр хаана үүсдэг билээ" гэж хай: үүсгэх мөр нь дуудлагаасаа дээр үү? Нэр огт үүсдэггүй бол — хашилт мартагдсан string эсэхээ шалга.
Дахин гаргаж үзэх жишээ:
python
print(mori)
mori = "Хүлэг"(Хайрцаг доороо үүсэж байна — эхний мөрөнд NameError)
Жинхэнэ мэдэгдлүүд нь:
TypeError: can only concatenate str (not "int") to str
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
TypeError: zahialga() missing 1 required positional argument: 'shirheg'
TypeError: object of type 'int' has no len()
TypeError: 'str' object does not support item assignmentМонголоор: "Үйлдэл нь өөрөө зөв, гэхдээ энэ төрлийн утган дээр хийж болдоггүй үйлдэл байна." Хамгийн олон "дүртэй" алдаа — гэхдээ бүх дүр нь нэг өгүүлбэрт багтдаг: оролцогчдын төрөл үйлдэлдээ таарахгүй байна. Мэдэгдэл нь үргэлж аль төрлүүд "мөргөлдснийг" нэрлэдэг (str... int, NoneType... int) — тэр нэрс оношийн гол түлхүүр.
Түгээмэл шалтгаанууд: int() мартагдсан input — "12" + 1 (str дээр int залгах); мэдэгдэлд NoneType дурдагдвал бараг үргэлж: return-гүй function-ий "хариуг" хадгалсан, эсвэл list-ийн append-ийг дарж хадгалсан (jagsaalt = jagsaalt.append(...)); function-д argument дутуу/илүү өгсөн (missing... / takes 2 but 3 were given — тоолоод, нэрлээд хэлдэг); len-д тоо өгсөн; string-ийн тэмдэгтийг индексээр солих гэсэн (ner[0] = "Б" — string үл өөрчлөгдөнө!).
Засварын жор: Мэдэгдэлд нэрлэгдсэн төрлүүдийг ол — "энэ хоёр яагаад нэг үйлдэлд орчихов" гэж мөшги: NoneType байвал return/append-ээ шалга; str-int хос байвал int()-ээ шалга; эргэлзвэл type()-ээр оролцогчдын төрлийг хэвлэж баримтжуул.
Дахин гаргаж үзэх жишээ:
python
nas = input("Та хэдэн настай вэ? ")
print(nas + 1)(int() мартагдав — TypeError: can only concatenate str...)
Жинхэнэ мэдэгдлүүд нь:
ValueError: invalid literal for int() with base 10: 'арван хоёр'
ValueError: list.remove(x): x not in listМонголоор: "Төрөл нь зөв, гэхдээ утга нь энэ ажилд тохирохгүй байна." TypeError-той ялгааг нь зааглах нь чухал: int()-д list өгвөл TypeError (төрөл нь буруу), int()-д "арван хоёр" гэсэн string өгвөл ValueError — string бол int()-ийн хүлээдэг зөв төрөл, гэхдээ доторх нь тоо болж хувирахгүй утга. "Сав нь зөв, агуулга нь болохгүй" гэсэн үг.
Түгээмэл шалтгаанууд: Хэрэглэгч тоо асуусан газар үсэг, хоосон, "12 нас" маягийн холимог бичсэн — int(input(...))-ын сонгодог осол: энэ бол таны кодын буруу биш — гадны орц найдваргүйн илрэл (хамгаалалт нь дараагийн хичээлийн try/except!); list-ээс байхгүй гишүүн remove хийсэн (x not in list — хамгаалалт нь in-шалгалт).
Засварын жор: Мэдэгдэл гологдсон утгыг хашилтанд үзүүлдэг ('арван хоёр') — түүнийг хараад "энэ утга хаанаас ирэв" гэж мөшги: хэрэглэгчээс бол хамгаалалт (try/except эсвэл урьдчилсан шалгалт), кодоос бол тэр утгыг үүсгэсэн мөрөө зас.
Дахин гаргаж үзэх жишээ:
python
nas = int("арван хоёр")(Төрөл зөв — string; утга нь тоо болохгүй — ValueError)
Жинхэнэ мэдэгдлүүд нь:
IndexError: string index out of range
IndexError: list index out of rangeМонголоор: "Ийм дугаартай байрлал энэ хэлхээнд байхгүй — хүрээнээс хальчихлаа." String, list хоёул 0-ээс тоолдог тул хүчинтэй индексийн дээд хязгаар нь len - 1: гурван гишүүнтэй жагсаалтад [3] гэдэг мөр алга — off-by-one буюу "нэгээр зөрөх" алдааны гэр нутаг.
Түгээмэл шалтгаанууд: Уртаар нь индекслэсэн (jagsaalt[len(jagsaalt)] — зөв нь len - 1 эсвэл [-1]); хэрэглэгчийн "хэд дэх" тооллыг индекс рүү хөрвүүлэхдээ -1 гүүрээ мартсан, эсвэл орцын хүрээг шалгаагүй; хоосон string/list-ийн [0]-д хандсан (хэрэглэгч юу ч бичилгүй Enter дарахад ner[0] — "заримдаа л унадаг" зальтай дүр); loop дотроо жагсаалтаасаа хассан (гишүүд "үсэрч" индекс хөндийрдөг).
Засварын жор: len-ээ хэвлэ, индекстэйгээ тулга — халилт тэндээс олдоно. Хэрэглэгчийн орц индекс болдог бол хүрээний if-шалгалт (if dugaar < 1 or dugaar > len(...)) тавь; [0]-д хүрэхийн өмнө хоосон биш эсэхийг (len == 0) шалга.
Дахин гаргаж үзэх жишээ:
python
tses = ["бууз", "хуушуур", "цуйван"]
print(tses[3])(Индексүүд нь 0-2 — [3] байхгүй)
Жинхэнэ мэдэгдэл нь:
KeyError: 'hot'
KeyError: 0Монголоор: "Хайсан key чинь энэ толинд алга." IndexError-ын dictionary-дүр — гэхдээ нэг давуутай: аль key олдоогүйг нэрээр нь хэлдэг тул онош нь мэдэгдэл дотроо бэлэн байдаг. KeyError: 0 гэсэн "тоон" хувилбар нь тусгай онош: толийг list гэж андуурч индексээр хандсаны бараг гарцаагүй шинж.
Түгээмэл шалтгаанууд: Key-гийн үсгийн алдаа, том-жижиг зөрөө ("Ner" ≠ "ner" — key бол string тул string-ийн бүх дүрэм!); хэрэглэгчийн орцыг шалгалгүй key болгосон (tol[zahialga] — хэрэглэгч байхгүйг бичихэд л унана); толийг list шиг индексээр "уншсан" (KeyError: 0); нэмэхдээ болон хайхдаа өөр бичиглэл хэрэглэсэн (нэмэхдээ strip() хийгээгүй "Бат " — хайхдаа "Бат").
Засварын жор: Мэдэгдэл дэх key-г толиныхоо жинхэнэ key-үүдтэй тулга (эргэлзвэл print(tol) — сав өөрөө key-үүдээ үзүүлнэ). Хэрэглэгчээс ирдэг key-д хандахын өмнө үргэлж if key in tol: шалгалт; орцоо нэмэхдээ ч, хайхдаа ч ижил угаалгаар (.strip() гэх мэт) оруул.
Дахин гаргаж үзэх жишээ:
python
suragch = {"ner": "Бат", "nas": 12}
print(suragch["hot"])(Толинд ner, nas хоёр л бий — 'hot' алга)
Лавлахын лавлах — яаралтай үед энэ зургаан мөр хангалттай:
SyntaxError — "уншиж ч чадсангүй": хоёр цэг, хаалт, хашилтаа тоол; заасан мөр цэвэр бол дээшээ хар.
NameError — "энэ нэрийг танихгүй": үсэг үсгээр тулга; нэр нь дуудлагаасаа дээр үүсдэг үү?
TypeError — "энэ төрөл дээр энэ үйлдэл болохгүй": нэрлэгдсэн төрлүүдийг мөшги; NoneType бол return/append.
ValueError — "төрөл зөв, утга болохгүй": гологдсон утгыг хараад эх үүсвэрийг нь мөшги; ихэвчлэн хэрэглэгчийн орц.
IndexError — "ийм байрлал алга": len-тэй тулга; дээд хязгаар нь len - 1; хоосны [0]-оос болгоомжил.
KeyError — "ийм key алга": нэрлэсэн key-г тулга; хандахын өмнө in; KeyError: 0 бол "list гэж андуурав".
Эцэст нь нэг ажиглалт: энэ зургааг нэг дор харахаар нэг зүйл тод болно — алдаа бүр өөрийн "хаана хайхыг" зааж өгдөг: SyntaxError бичиглэл рүү, NameError нэрс рүү, TypeError/ValueError өгөгдөл рүү, IndexError/KeyError цуглуулга руу чиглүүлдэг. Мөрдөгчийн газрын зураг иж бүрэн боллоо — таны сургалтын үлдсэн хугацаанд, түүнээс цааш ч энэ хуудас ажлаа хийсээр байх болно.
Дараагийн хичээлд бид энэ бүлгийн, магадгүй бүхэл Түвшний хамгийн хүлээгдсэн хэрэгслийг авна: try / except — аюулгүйн тор. Input()-ын хичээлээс хойш "Бүлэг 11-д хамгаална" гэж хэд хэдэн удаа амласан тэр өдөр: программ алдаанаас зугтдаг биш — алдааг барьж авдаг болно.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.