Ачааллж байна...
Тоо таах тоглоомоо барьж байснаас хойш дөрвөн бүлэг өнгөрчээ — тэр хугацаанд таны багажны хайрцаг хэрхэн өссөнийг тоолж үзье: давталтын хоёр төрөл, break/continue, function-parameter-return, string-ийн авдар, f-string, индекс, list, dictionary. Өнөөдөр бид тэр бүх багажийг нэг барилгад угсарна: Харилцагчийн дэвтэр — утасныхаа "Contacts" апп-ын бяцхан хувилбар: харилцагч нэмдэг, нэрээр нь дугаар хайдаг, бүх бүртгэлээ харуулдаг, тэгээд энэ бүхнийг цэсээр удирддаг жинхэнэ программ. "Жинхэнэ" гэдэг үгийг зориуд хэрэглэлээ: өнөөдрийн барилга бол дасгал биш — бодит хэрэглээний программуудын жинхэнэ араг яс юм: цэс харуулах → сонголт авах → тохирох ажлыг хийх → буцаад цэс рүү — банкны апп ч, дэлгүүрийн касс ч, тоглоомын үндсэн цонх ч яг энэ мөчлөгөөр амьдардаг. Өнөөдөр та тэр мөчлөгийг өөрийн гараар барина.
Ажлын горим танил: би тайлбарлаж бичнэ, та дагаж бичээд шалгалтын цэгүүдэд Run дарна — даалгавар биш, хамтын барилга. Гэхдээ энэ удаад нэг шинэ зүйл нэмэгдэнэ: барилгын төлөвлөлт — том программыг мөрөөс нь биш бүтцээс нь эхэлж боддог инженерийн сэтгэлгээг хамт хийж үзнэ.
Кодоо бичихээсээ өмнө хоёр асуултад хариулъя. Асуулт нэг: өгөгдлөө юунд хадгалах вэ? Харилцагч гэдэг маань "нэр → дугаар" гэсэн хосууд: Бат гэдэг нэрээр хайхад дугаар нь олддог байх ёстой — "хэд дэх харилцагч" гэж хэн ч асуудаггүй. Нэрээр хайдаг, хосоор хадгалдаг... — өмнөх хичээлийн хуваарь шууд хариулна: dictionary — key нь нэр, value нь дугаар. (Дугаар нь string байхыг бүү мартаарай — "цифртэй боловч тооцоололд ордоггүй зүйлс string" гэсэн Бүлэг 5-ын дүрэм: утасны дугаар нэмж хасдаггүй!) Асуулт хоёр: ажлуудаа яаж зохион байгуулах вэ? Гурван ажил бий: нэмэх, хайх, бүгдийг харуулах — гурвуулаа "нэг нэр өгмөөр багц" — Бүлэг 8 хариулна: гурван function. Тэгээд бүгдийг эргэлдүүлэх while True цэс (Бүлэг 7). Төлөвлөгөө бэлэн: нэг толь, гурван function, нэг цэс — таван "тоосго". VS Code дээрээ devter.py гэсэн шинэ файл үүсгээрэй.
Том программыг барихдаа "гүйдэг араг яснаас" эхэлдэг — дотор нь юу ч хийдэггүй ч эргэлддэг мөчлөг:
python
# Харилцагчийн дэвтэр
harilzagchid = {}
while True:
print("\n--- ХАРИЛЦАГЧИЙН ДЭВТЭР ---")
print("1 - Харилцагч нэмэх")
print("2 - Дугаар хайх")
print("3 - Бүгдийг харуулах")
print("4 - Гарах")
songolt = input("Сонголтоо оруулна уу: ")
if songolt == "4":
print("Баяртай!")
break
else:
print("Ийм сонголт алга — 1-4 хооронд сонгоно уу")Мөр бүрээр: harilzagchid = {} — хоосон толь: хоосон list [] байдаг шил хоосон dictionary {} байдаг — "хараахан нэг ч харилцагчгүй" төлөв, цуглуулгын эхлүүлэлтийн танил зан үйл. While True — зориудын төгсгөлгүй цэсний мөчлөг: гарах ганц хаалга нь "4"-ийн break (Бүлэг 7-ын хэв маяг яг зориулалтаараа). Нэг шинэ жижиг зочин: print("\n--- ...") доторх \n — string дотор бичигддэг "шинэ мөр" гэсэн тусгай тэмдэгт: хэвлэхэд тэр газраа мөр таслагдана — цэс бүрийн өмнө нэг хоосон мөр гарч, гүйлт бүр нүдэнд салангид харагдах болно (string-ийн дотоод "далд тэмдэгтүүдийн" ертөнцөөс танд одоо хэрэгтэй ганц нь энэ). Songolt-ыг int() хийгээгүйг ажигла — санаатай: сонголтоор тооцоолол хийхгүй, зөвхөн тулгана — тэгвэл string хэвээр нь "4" == songolt гэж тулгах нь int()-ийн ValueError эрсдэлээс (хэрэглэгч үсэг дарвал!) ангид, амар зам: цифртэй-боловч-тоо-биш дүрмийн бас нэг жишээ.
Ажиллуулж шалгая. Run дараад: 7 гэж бичихэд "Ийм сонголт алга..." гараад цэс дахин ирнэ; 4 гэхэд "Баяртай!" гараад зогсоно. Араг яс амьд — гүйж, эргэж, гарч байна: одоо дотор нь эрхтнүүдээ суулгана.
Эхний ажилтан — файлын дээд хэсэгт (харилцагчид-ийн доор, while-ийн дээр: "жорын дэвтэр дээрээ, захиалга доороо" — Бүлэг 8-ын зохион байгуулалт) бичье:
python
def nemeh():
ner = input("Нэр: ").strip()
dugaar = input("Дугаар: ").strip()
harilzagchid[ner] = dugaar
print(f"{ner} бүртгэгдлээ!")Дөрөвхөн мөр — гэхдээ дөрвөн бүлгийн мэдлэг: input + .strip() угаалга (Бүлэг 9-ийн зан үйл — нэрэн дэх далд зай хожим хайлтыг унагана!), толинд нэмэх нэг-мөр оноолт harilzagchid[ner] = dugaar (өмнөх хичээлийн "байхгүй бол үүсгэ" зан — шинэ нэр шинэ хос болно), f-string баталгаажуулалт. Нэг төлөвлөлтийн нюанс тайлбарлууштай: function маань толио parameter-ээр аваагүй — шууд "гаднах" harilzagchid-д хандаж байна. Бүлэг 8-д "function өөрийн өрөөтэй" гэж үзсэн — тэр дүрэм нарийндаа нэг талдаа: өрөөний дотор үүссэн нэрс гадагшаа харагддаггүй, харин гаднах нэрс дотогшоо уншигддаг (тэгээгүй бол function дотроос print-ийг ч дуудаж чадахгүй байх байсан биз!). Жижиг программд "нэг нийтийн сав + түүн дээр ажилладаг function-ууд" гэсэн энэ хэлбэр энгийн бөгөөд түгээмэл — томрохоор parameter-аар дамжуулдаг сахилга ирдэг, гэхдээ тэр яриа өнөөдрийн хэрээс хальсан ирээдүй.
Одоо цэсэндээ залгая — while доторх if-ийг өргөжүүлье:
python
if songolt == "1":
nemeh()
elif songolt == "4":
print("Баяртай!")
break
else:
print("Ийм сонголт алга — 1-4 хооронд сонгоно уу")Ажиллуулж шалгая. 1 → Бат, 99112233 → "Бат бүртгэгдлээ!" → цэс эргэж ирнэ → дахиад 1 → өөр хүн нэм → 4-өөр гар. Бүртгэлүүд маань толинд орж байгаа... гэхдээ бид тэднийг харж чадахгүй байна — дараагийн эрхтэн яг үүнд.
Хоёр function-оо нэг дор — nemeh-ийн доор:
python
def haih():
ner = input("Хэний дугаарыг хайх вэ? ").strip()
if ner in harilzagchid:
print(f"{ner}: {harilzagchid[ner]}")
else:
print(f"{ner} гэдэг харилцагч бүртгэлгүй байна")
def bugdiig_haruulah():
if len(harilzagchid) == 0:
print("Дэвтэр хоосон байна")
else:
print(f"Нийт {len(harilzagchid)} харилцагч:")
for ner in harilzagchid:
print(f" {ner}: {harilzagchid[ner]}")haih — өмнөх хичээлийн "хандахын өмнө in-ээр шалга" дүрэм ажил дээрээ: шалгалтгүй harilzagchid[ner] бол хэрэглэгчийн үсгийн алдаа бүрд KeyError дэлбэрэх байсан — in + else нь түүнийг эелдэг мэдэгдэл болгож "тэсвэржүүлэв": гадны орцод итгэдэггүй программын зан. bugdiig_haruulah — толиор алхагч loop (өмнөх хичээлийн үнийн самбар) — гэхдээ нэг мэргэжлийн нюанстай: хоосон дэвтрийг эхэлж шалгаж байна: len == 0 үед loop алдаагүй боловч "чимээгүй тэг тойрог" эргээд (range-ийн хичээлийн танил зан — цуглуулгад ч мөн!) хэрэглэгчид юу ч харагдахгүй — "программ эвдэрчихэв үү" гэсэн эргэлзээ төрүүлнэ: "хоосон бол хоосон гэж хэл" гэсэн энэ жижиг халамж нь сайн программыг дунджаас ялгадаг зүйлсийн нэг. (Хэвлэлтийн эхний хоёр зай " {ner}..." — жагсаалтыг гарчгаас нь дотогш шигдүүлж харуулах жижиг гоёл — Python-ы догол биш, зүгээр л string доторх зай гэдгийг анзаараарай.)
Цэсэндээ хоёр шинэ салаа залгая:
python
if songolt == "1":
nemeh()
elif songolt == "2":
haih()
elif songolt == "3":
bugdiig_haruulah()
elif songolt == "4":
print("Баяртай!")
break
else:
print("Ийм сонголт алга — 1-4 хооронд сонгоно уу")Ажиллуулж шалгая — бүрэн тойрог: 3 (хоосон гэж хэлэх ёстой) → 1-ээр хоёр хүн нэм → 3 (хоёулаа жагсах ёстой) → 2-оор нэгийг нь хай (олдох ёстой) → 2-оор байхгүй нэр хай (эелдэг татгалзах ёстой) → 4. Таван зам бүгд зөв бол — байшин баригдлаа.
python
# Харилцагчийн дэвтэр — Түвшин 2-ын төсөл
harilzagchid = {}
def nemeh():
ner = input("Нэр: ").strip()
dugaar = input("Дугаар: ").strip()
harilzagchid[ner] = dugaar
print(f"{ner} бүртгэгдлээ!")
def haih():
ner = input("Хэний дугаарыг хайх вэ? ").strip()
if ner in harilzagchid:
print(f"{ner}: {harilzagchid[ner]}")
else:
print(f"{ner} гэдэг харилцагч бүртгэлгүй байна")
def bugdiig_haruulah():
if len(harilzagchid) == 0:
print("Дэвтэр хоосон байна")
else:
print(f"Нийт {len(harilzagchid)} харилцагч:")
for ner in harilzagchid:
print(f" {ner}: {harilzagchid[ner]}")
while True:
print("\n--- ХАРИЛЦАГЧИЙН ДЭВТЭР ---")
print("1 - Харилцагч нэмэх")
print("2 - Дугаар хайх")
print("3 - Бүгдийг харуулах")
print("4 - Гарах")
songolt = input("Сонголтоо оруулна уу: ")
if songolt == "1":
nemeh()
elif songolt == "2":
haih()
elif songolt == "3":
bugdiig_haruulah()
elif songolt == "4":
print("Баяртай!")
break
else:
print("Ийм сонголт алга — 1-4 хооронд сонгоно уу")Дөчин мөр — таны өдийг хүртэлх хамгийн том программ, тэгээд бүтцийг нь хараарай: дээрээ өгөгдөл (нэг толь), дундаа гурван цэвэрхэн function, доороо цэсний мөчлөг — уншигдана: мөр бүр нь биш хэсэг бүр нь нэртэй. Цэсний if/elif нь function-уудын зөвхөн нэрийг дууддаг тул цэс өөрөө "гарчгийн хуудас" шиг: программ юу чадахыг таван мөрөөс уншина. Энэ л зохион байгуулалт бол Түвшин 2-ын жинхэнэ дипломын ажил: та код бичдэг байснаа программ зохион байгуулдаг боллоо. Нэг үнэнч тэмдэглэл: программ хаагдахад бүртгэлүүд алга болно — бид санах ойд л хадгалж байгаа: "файлд хадгалж, дараа нь эргэж уншдаг" чадвар бол Бүлэг 12-ын том бэлэг — энэ дэвтэр тэнд жинхэнэ дэвтэр болно: файлаа хадгалж үлдээгээрэй, бид эргэж ирнэ.
Нэг: Устгах. Тав дахь цэс "Харилцагч устгах": del harilzagchid[ner] гэсэн шинэ бичиглэл толиноос хос устгадаг (del бол Python-ы үг — list-ийн remove-ын толь-хамаатан) — гэхдээ haih-ийн in-шалгалтаа бүү мартаарай: байхгүйг устгавал KeyError.
Хоёр: Дарж бичихээс хамгаалах. Одоогийн nemeh дээр байгаа нэрийг дахин нэмбэл дугаар нь чимээгүй дарагдана (толины зан!) — nemeh дотроо if ner in harilzagchid: гэж шалгаад "Бүртгэлтэй байна — дарж бичих үү? (тийм/үгүй)" гэж асуудаг болгож үзээрэй: strip().lower() угаалгатай баталгаажуулалт — Бүлэг 9-ийн дадлын дасгал.
Гурав: Нэг хүнд олон мэдээлэл. Value-г нь string биш толь болговол (harilzagchid[ner] = {"dugaar": ..., "hot": ...}) харилцагч бүр олон талын мэдээлэлтэй болно — "толин доторх толь" гэсэн давхар бүтэц: өмнөх хичээлийн "сурагч бүр dictionary, бүгд нь нэг саванд" санааны амталгаа. Хандалт нь давхар хаалт: harilzagchid["Бат"]["hot"] — толгой эргэвэл хэвийн: энэ бол Түвшин 3-ын түвшний сунгалт.
Та Түвшин 2-ын дипломын ажлаа хамгааллаа: цэс-мөчлөгтэй, гурван үйлдэлтэй, тэсвэртэй жинхэнэ программ — бодит апп-уудын араг яс.
Төлөвлөлт кодоос түрүүлдэг: "нэрээр хайдаг хосууд" → dictionary; "нэр өгмөөр гурван багц" → гурван function; "эргэлддэг цэс" → while True + break.
Гадны орцод итгэхгүй байх гурван халамж: strip() угаалга, in-шалгалттай хайлт, "хоосон бол хоосон гэж хэлдэг" харуулалт.
Бүтэц: өгөгдөл дээрээ, function-ууд дундаа, цэс доороо — цэсний if/elif нь зөвхөн нэрс дууддаг "гарчгийн хуудас".
Энэ программ Бүлэг 12-т (файл) эргэж ирж "мартдаггүй" болно — файлаа хадгал.
Ингээд Түвшин 2: Барилга материал бүрэн өндөрлөлөө — баяр хүргэе! Дараагийн Түвшин "Итгэлтэй болох нь" гэсэн нэртэй бөгөөд эхний бүлэг нь энэ сургалтын хамгийн онцлог бүлгүүдийн нэг: Алдаатай найзлах — traceback уншиж сурах, түгээмэл error-уудын монгол "толь бичиг", тэгээд try/except буюу аюулгүйн тор. Input()-ын хичээлээс хойш "Бүлэг 11-д хамгаална" гэж амласан бүх өр тэнд барагдана: алдааг айдаг байснаа ашигладаг болох Түвшин эхэлж байна.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.