Ачааллж байна...
List-ийн хичээлүүдэд нэг хэрэгцээг бид хоёр удаа "өөр савны ажил" гэж хойшлуулсан: нэг юмны олон талын мэдээллийг хамт хадгалах — нэг хүний нэр, нас, хот нь нэг дор. List-ээр оролдоод үзье: suragch = ["Бат", 12, "Улаанбаатар"] — болж байгаа юм шиг... гэтэл гурван долоо хоногийн дараа кодоо нээгээд suragch[1] гэсэн мөр харвал — [1] гэж юу билээ? Нас уу? Ангийн дугаар уу? Жагсаалтын индекс "байрлал" л хэлдэг болохоос "утга учир" хэлдэггүй: ["Бат", 12, "Улаанбаатар"] доторх 12-ын юу болохыг зөвхөн таны ой санамж л мэднэ — код өөрөө хэлэхгүй. Асуудлын гол нь: энэ өгөгдөлд дараалал огт хамаагүй — Батын нас "хоёр дахь" учраас нас биш, нас учраас нас: бидэнд байрлалаар биш нэрээр ханддаг сав хэрэгтэй байна. Тэр сав бол dictionary (толь бичиг) — Python-ы хоёр дахь том цуглуулга, өнөөдрийн баатар: suragch["nas"] гэж үгээр асуудаг ертөнц.
Нэг тайвшрал: dictionary-гийн бүтэц шинэ боловч түүнтэй ажиллах хөдөлгөөнүүд бараг бүгд танил байх болно — дөрвөлжин хаалтын хандалт, len, in, оноолтоор нэмэх-солих: list дээр сурсан бүхэн чинь "байрлалын дугаар" гэдгээ "нэр" болгож солиод л энд ажиллана. Шинээр танилцах гол зүйл нь key (түлхүүр) гэдэг ойлголт, тэгээд түүний дагалдах шинэ алдаа — KeyError.
Dictionary гэдэг нэр өөрөө хамгийн сайн зүйрлэл нь: англи-монгол толь бичгийг гартаа авъя. Толь бичиг юуг юугаар хайдаг вэ — "154 дүгээр хуудасны 7 дахь үг" гэж хэн ч хайдаггүй: үгээр нь хайдаг — "apple" гэдэг үгийг олоод, хажууд нь "алим" гэсэн тайлбарыг нь уншдаг. Толь бичгийн мөр бүр хос юм: хайдаг тал нь (apple) ба олддог тал нь (алим). Python-ы dictionary яг энэ бүтэц: хайдаг талыг нь key (түлхүүр), олддог талыг нь value (утга) гэдэг — сав бүхэлдээ key-value хосуудын цуглуулга. Гурван чанарыг зүйрлэлээс шууд авъя. Нэг: толь бичгээс үгийг нэрээр нь хайдаг — индексээр биш: dictionary-д [0], [1] гэсэн байрлалын хандалт байхгүй (оролдвол юу болохыг алдаануудад үзнэ). Хоёр: нэг үг толь бичигт нэг л удаа ордог — "apple" гэсэн хоёр мөр байдаггүй: key давхардахгүй (давхар бичвэл сүүлчийнх нь дарна). Гурав: үг бүрийн тайлбар нь өөрийнх нь дэргэд — apple-ийн хажууд алим: key нь value-даа "хаяг" болдог. Ганц зөрүү: жинхэнэ толь цагаан толгойгоор эрэмбэлэгдсэн байдаг бол Python-ы dictionary-гийн "эрэмбэ" таны бичсэн дараалал төдий — хайлт нь эрэмбээс хамаардаггүй тул энэ нь ажилд саад болохгүй.
Батын мэдээллийг "толь бичиг" болгоё:
python
suragch = {"ner": "Бат", "nas": 12, "hot": "Улаанбаатар"}
print(suragch)
print(suragch["ner"])
print(suragch["nas"])Үр дүн:
{'ner': 'Бат', 'nas': 12, 'hot': 'Улаанбаатар'}
Бат
12Үүсгэлтийн бичиглэлийг задалъя: буржгар хаалт нээж (f-string-ийн нүхнээс таньдаг тэр хос — шинэ, гурав дахь ажилдаа орлоо), дотор нь хосуудаа таслалаар зааглан бичнэ; хос бүр нь key: value хэлбэртэй — хоёр цэгөөр холбогдсон ("ner" гэдэг key-д "Бат" гэдэг value): толь бичгийн "үг: тайлбар" мөр. Key-үүд маань string тул хашилттай — value нь дурын төрөл (string, int — юу ч). Хандалт нь танил дөрвөлжин хаалт — гэхдээ дотор нь индекс биш key: suragch["ner"] — "suragch толиос ner гэдэг үгийг хайж, тайлбарыг нь өг" — "Бат". Хичээлийн эхний зовлон эдгэрснийг ажигла: suragch["nas"] гэсэн мөр өөрөө өөрийгөө тайлбарлаж байна — [1] шиг оньсого биш: гурван долоо хоногийн дараах та энэ мөрийг тайлбаргүй ойлгоно. Энэ бол dictionary-гийн list-ээс давуу гол тал: өгөгдөл нь нэртэйгээ хамт амьдардаг.
Хэзээ аль савыг вэ гэдэг хуваарь эндээс тодорно: ижил төрлийн олон юм, дараалал нь утгатай — list (сурагчдын нэрс, оноонууд: "гурав дахь нь", "эрэмбэл" гэж ярьдаг өгөгдөл); нэг юмны олон талын мэдээлэл, тал бүр нэртэй — dictionary (нэг сурагчийн нэр-нас-хот: "хэд дэх" гэж хэзээ ч асуудаггүй өгөгдөл). Хоёр сав өрсөлдөгчид биш — хамтрагчид: бодит программд "сурагч бүр нь dictionary, бүх сурагчид нь тэдгээрийн list" гэсэн давхар бүтэц хамгийн түгээмэл (энэ хослолын амтыг дараагийн хичээлийн төсөлд үзнэ).
Хоёр дахь жишээ: нэмэх ба солих — нэг л хөдөлгөөн. Толь маань list шиг өөрчлөгддөг сав — тэгээд нэмэлт нь append-ээс ч энгийн:
python
suragch = {"ner": "Бат", "nas": 12}
print(suragch)
suragch["hot"] = "Дархан"
print(suragch)
suragch["nas"] = 13
print(suragch)Үр дүн:
{'ner': 'Бат', 'nas': 12}
{'ner': 'Бат', 'nas': 12, 'hot': 'Дархан'}
{'ner': 'Бат', 'nas': 13, 'hot': 'Дархан'}Хоёр үйлдэл — нэг бичиглэл: suragch[key] = value. Хоёр дахь мөрөнд "hot" гэдэг key толинд байгаагүй тул Python шинэ хос нэмэв (толинд шинэ үг бүртгэв); дөрөв дэх мөрөнд "nas" байсан тул хуучин value-г нь дарж сольв (үгийн тайлбарыг шинэчлэв — Бүлэг 4-ийн "шинэ утга хуучныг дардаг" дүрэм key-гийн түвшинд). "Байхгүй бол үүсгэ, байгаа бол соль" гэсэн энэ давхар зан танил байх учиртай: variable-ийн = яг ингэж ажилладаг байсан — dictionary бол нэг ёсондоо "нэрлэсэн хайрцагнуудын сав" юм: key бүр нь жижигхэн variable шиг. (List-тэй зэрэгцүүлбэл ялгаа нь тод: jagsaalt[5] = ... гэж байхгүй индекст оноох нь IndexError байсан бол толинд байхгүй key-д оноох нь нэмэлт — учир нь индекс "байрлал" тул дур мэдэн үүсгэж болдоггүй, key "нэр" тул болдог.)
Гурав дахь жишээ: dictionary + loop + f-string — бодит хэрэглээ. Дэлгүүрийн үнийн толь:
python
unenuud = {"бууз": 800, "хуушуур": 1500, "цуйван": 6000}
zahialga = input("Юу авах вэ? ")
if zahialga in unenuud:
shirheg = int(input("Хэдэн ширхэг? "))
print(f"{zahialga} {shirheg} ширхэг: {unenuud[zahialga] * shirheg} төгрөг")
else:
print(f"Уучлаарай, {zahialga} манайд алга")хуушуур, 4 гэж хариулбал:
Юу авах вэ? хуушуур
Хэдэн ширхэг? 4
хуушуур 4 ширхэг: 6000 төгрөгГурван танил хэрэгсэл шинэ саван дээр гар нийлж байна. In — өмнөх хичээлийн "дотор нь бий юу?" асуулт dictionary дээр key-үүдийг шалгадаг: "хуушуур гэдэг үг толинд бий юу?" — хандахаасаа өмнө шалгах энэ хамгаалалт нь list-ийн remove-ын өмнөх in-тэй яг ижил зан үйл (KeyError-оос хамгаалж байгаа юм — тэр алдаа доор хүлээж байгаа). Хандалт нүхэн дотор: {unenuud[zahialga] * shirheg} — f-string-ийн нүхэнд dictionary-хандалт, үржүүлэлттэйгээ хамт: нүх бол кодын цонх гэдэг дүрмийн шинэ нотолгоо. Тэгээд хамгийн гүнзгий нь — key нь variable-аас ирж байна: unenuud[zahialga] — хатуу бичсэн "хуушуур" биш, хэрэглэгчийн орц key болов: толь бичгээ хэрэглэгчээр "эргүүлүүлдэг" энэ хөдөлгөөн бол dictionary-программын зүрхний цохилт юм.
Дөрөв дэх жишээ: толиор алхах. For loop dictionary дээр ч ажиллана — key-үүдээр нь:
python
unenuud = {"бууз": 800, "хуушуур": 1500, "цуйван": 6000}
print("--- ҮНИЙН САМБАР ---")
for hool in unenuud:
print(f"{hool}: {unenuud[hool]} төгрөг")Үр дүн:
--- ҮНИЙН САМБАР ---
бууз: 800 төгрөг
хуушуур: 1500 төгрөг
цуйван: 6000 төгрөгfor hool in unenuud: — давталтын variable-д тойрог бүрд дараагийн key ирнэ ("бууз", "хуушуур", "цуйван"): value нь хэрэгтэй бол биед нь unenuud[hool] гэж key-ээрээ "тайлбарыг нь" авна — key гартаа байвал value үргэлж нэг хандалтын цаана. Өмнөх хичээлийн ирцийн зүйрлэл энд "толь бичгийн үг бүрээр" болж өргөжив: list-ийн loop гишүүдээр, dictionary-гийн loop key-үүдээр — хоёулаа "цуглуулгын юмс дээр нэг бүрчлэн" гэсэн нэг л том санаа. (Value-гээр нь, эсвэл хос хосоор нь алхдаг тусгай method-ууд ч толины авдарт бий — .values(), .items() — сонирхвол туршиж болно, гэхдээ key-ээр алхаад хандах энэ үндсэн хэлбэр таны бүх хэрэгцээг одоохондоо бүрэн хангана.)
Хүсвэл туршаад үзээрэй: өөрийн гэр бүлийн гишүүдийн нас бүхий толь үүсгээд (key нь нэр, value нь нас), самбар шиг хэвлээд, нэг хүний насыг +1-ээр шинэчилж үзээрэй. Сонирхвол len(unenuud) юу тоолохыг таамаглаад Run — гишүүн нь юу вэ: key юү, хос уу? (Хариулт: хосыг — гурав; len цуглуулга бүрийг "юмсаар" нь тоолдог бөгөөд толины "юм" нь хос юм.)
Алдаа 1: KeyError — байхгүй үгийг хайх. Өнөөдрийн шинэ танил, толины IndexError:
python
suragch = {"ner": "Бат", "nas": 12}
print(suragch["hot"])Python:
KeyError: 'hot'Орчуулбал: "KeyError (түлхүүрийн алдаа): 'hot'" — хайсан үг чинь толинд алга. Мэдэгдэл нь товчхон боловч хамгийн үнэтэй мэдээллээ агуулж байна: аль key олдоогүйг нэрээр нь хэлж байна — IndexError "out of range" гэж хүрээ л дурддаг байсан бол KeyError "юуг" хайснаа шууд заана: оношлогоо тэндээс эхэлнэ. Хамгийн олон гардаг гурван шалтгаан: key-гийн үсгийн алдаа (suragch["nass"]), том-жижиг үсэг ("Ner" ≠ "ner" — string учраас string-ийн бүх дүрэм!), тэгээд хэрэглэгчийн орц — гурав дахь жишээний in-хамгаалалтгүй хувилбар: unenuud[zahialga]-д хэрэглэгч "пицца" гэвэл KeyError: 'пицца'. Хамгаалалт нь мөнөөх in: хандахаасаа өмнө if key in tol: гэж шалга — ялангуяа key нь variable-аас (хэрэглэгчээс!) ирж байвал заавал. Дүрэм болгож list-тэй зэрэгцүүлье: list-д хандахын өмнө индексээ len-тэй тулгадаг байсан — dictionary-д key-гээ in-ээр тулга.
Алдаа 2: Индексээр хандах гэж оролдох. List-ийн дадал толинд уршиг болох нь:
python
suragch = {"ner": "Бат", "nas": 12}
print(suragch[0])Python:
KeyError: 0Гарсан нь мөн л KeyError — гэхдээ учир нь өөр: Python таны 0-ыг "индекс" гэж ойлгоогүй — толинд индекс гэж байдаггүй тул 0-ыг key гэж үзээд хайгаад (тийм ээ, key нь int ч байж болдог — {1: "нэг", 2: "хоёр"} гэсэн толь хууль ёсны!) олоогүй хэрэг. Энэ бол хоёр савны хамгийн гүн заагийн алдаан-дүр: list байрлалаар, dictionary нэрээр — "эхний хосыг нь авъя" гэсэн хэрэгцээ толинд угаасаа утга багатай (толь бичгийн "эхний үг" гэж хайдаггүйтэй адил): тийм хэрэгцээ байнга гарч байвал өгөгдөл чинь үнэндээ list байх ёстой байсны дохио. Оношлогооны шинж: KeyError: 0 (эсвэл ямар нэг тоо) харагдвал — "энэ савыг list гэж андуурчээ" гэсэн онош бараг үргэлж зөв.
Алдаа 3: Хоёр цэг ба таслалын будлиан. Үүсгэлтийн бичиглэлийн эд ангиуд холилдвол:
python
suragch = {"ner": "Бат", "nas", 12}Python:
TypeError: unhashable type...үгүй — энэ орцод Python өөр зүйл хэлнэ: {"ner": "Бат", "nas", 12} гэхэд "nas" ба 12 хоёр хоёр цэггүй, зүгээр таслалаар зэрэгцсэн тул Python "энэ хос уу, дан юм уу" гэж будилж — үнэндээ ийм хольцод SyntaxError биш, өөр нэг сонин алдаа (set гэдэг, энэ сургалтад үзэхгүй дөрөв дэх савтай андуурсан тухай мэдэгдэл) ч гарч болно: мэдэгдлийн яг үг нь чухал биш — дүрэм нь чухал: толины хос бүр хоёр цэгтэй (key: value), хосууд хоорондоо таслалтай. Хоёр тэмдгийн ажлын хуваарь: хоёр цэг — хосын доторх холбоос, таслал — хосуудын хоорондох зааг. Мөн урвуу будлиан бий: key-value-гийн хооронд = тавих ({"ner" = "Бат"}) — SyntaxError: толин дотор оноолт биш хоёр цэг. Гурван "холбогч тэмдгийн" (= , :) гурван нутгийг зааглая: = — variable-ийн оноолт, хоёр цэг — толины хос (ба if/for/def-ийн төгсгөл), таслал — гишүүдийн зааг — VS Code-ын өнгөнүүд энд бас тусална: зөв бичигдсэн толины key-үүд нэг өнгөөр цувдаг.
Dictionary бол key: value хосуудын сав: {"ner": "Бат", "nas": 12} — буржгар хаалт, хос бүр хоёр цэгтэй, хосууд таслалтай; байрлалаар биш нэрээр ханддаг толь бичиг.
Хандалт suragch["ner"], нэмэх ба солих нэг бичиглэл suragch[key] = value: байхгүй key — нэмэгдэнэ, байгаа key — дарагдана (нэрлэсэн хайрцагнуудын сав).
Хуваарь: дараалалтай ижил юмс — list; нэг юмны нэртэй талууд — dictionary; бодит программд хоёул хамтрагчид (толиудын жагсаалт).
For loop толины key-үүдээр алхана; in нь key-г шалгана — key нь variable-аас (хэрэглэгчээс) ирж байвал хандахын өмнө if key in tol: заавал.
Байхгүй key — KeyError: 'нэр нь' (үсгийн алдаа, том-жижиг, шалгаагүй орц); KeyError: 0 бол "list гэж андуурсны" дохио; хосын дотор хоёр цэг, хооронд нь таслал.
Дараагийн хичээл бол Түвшин 2-ын оргил — хоёр дахь хамтдаа бүтээх төсөл: "Харилцагчийн дэвтэр" — нэр нэмдэг, хайдаг, бүгдийг харуулдаг, цэстэй жинхэнэ жижиг программ. Function, dictionary, while True цэс, if/elif, in-шалгалт — Түвшин 2-ын бүх материал нэг барилгад: таны өдийг хүртэл барих гэж бэлдсэн хамгийн том байшин тэнд таныг хүлээж байна.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.