Ачааллж байна...
Өнөөдрийн барилга жижигхэн — гэхдээ таны программчлалын аялалд нэг түүхэн хил давна. Өдий хүртэлх бүх бүтээл чинь — тоо таах тоглоом, харилцагчийн дэвтэр — Run дарахад төрж, хаагдахад үхдэг байсан: гүйлт бүр цоо шинэ, өмнөхөө огт санадаггүй амьдрал. Өнөөдөр бид тэр хилийг давна: Тэмдэглэлийн дэвтэр — та тэмдэглэл бичнэ, тэр файлд хадгалагдана; программыг хаана; маргааш дахин нээхэд — хуучин тэмдэглэлүүд чинь угтаж байх болно. Программ чинь анх удаа "өчигдрөө санадаг" болно гэсэн үг. Энэ бол жижиг ялгаа биш: "хаагдахад мартдаг" ба "мартдаггүй" хоёрын хооронд тоглоом ба хэрэгсэл хоёрын зааг оршдог — өнөөдрийн дараа таны программыг өдөр тутамдаа жинхэнээсээ хэрэглэж болно.
Барилгын материалаа тоолъё: цэс-мөчлөг (харилцагчийн дэвтрийн араг яс — бэлэн!), function-ууд, тэгээд өмнөх хичээлийн гурван шинэ түлхүүр: "a" горим (залгагч — тэмдэглэл нэмэгддэг учраас), "r" горим + FileNotFoundError-ын тор (анхны гүйлтэд файл байхгүй!), \n-тэй write. Ажлын горим танил: тайлбарлана — дагаж бичнэ — шалгалтын цэгүүдэд Run. Файлын нэр: devter.py-тэй андуурахгүйн тулд temdeglel_devter.py гэж нэрлэе.
Асуулт нэг: өгөгдөл хаана, ямар хэлбэрээр амьдрах вэ? Харилцагчийн дэвтэрт өгөгдөл dictionary-д (ширээн дээр) амьдардаг байсан — энд өгөгдлийн гэр нь файл өөрөө байна: temdeglel.txt — мөр бүр нь нэг тэмдэглэл. "Мөр бүр нэг зүйл" гэдэг нь энгийн бөгөөд хүчтэй хэлбэр: бичихэд — string + \n залгаад "a"-гаар нэм; уншихад — read() + split("\n") гэвэл мөрүүд list болон задарна (өмнөх хичээлийн туршилтын амттан — өнөөдөр гол хоол болно). Асуулт хоёр: ямар ажлуудтай вэ? Гурав: тэмдэглэл нэмэх, бүгдийг харах, гарах — харилцагчийн дэвтрээс нэгээр цөөн цэс: гурван сонголт, хоёр function. Төлөвлөгөө бэлэн.
Танил барилгаас эхэлье — энэ хэсэг таны хувьд бараг "гараар бичдэг хэв маяг" болсон байх:
python
# Тэмдэглэлийн дэвтэр — мартдаггүй программ
FILE_NER = "temdeglel.txt"
while True:
print("\n--- ТЭМДЭГЛЭЛИЙН ДЭВТЭР ---")
print("1 - Тэмдэглэл нэмэх")
print("2 - Бүгдийг харах")
print("3 - Гарах")
songolt = input("Сонголт: ")
if songolt == "3":
print("Баяртай!")
break
else:
print("1-3 хооронд сонгоно уу")Нэг шинэ жижиг дадал: FILE_NER = "temdeglel.txt" — файлын нэрийг нэг variable-д, файлын дээд хэсэгт хадгалав. Яагаад: нэр нь хоёр function-д (бичигчид ч, уншигчид ч) хэрэглэгдэнэ — хоёр газар "temdeglel.txt" гэж гараар бичвэл нэг газраа үсэг алдахад бичдэг нэг файл, уншдаг өөр файл болж "тэмдэглэлүүд минь алга болоод байна" гэсэн зальтай гажуудал төрнө: DRY зарчим файлын нэрэнд ч үйлчилнэ. Нэрийг нь бүгдийг том үсгээр бичсэн нь Python-ы нэг тогтсон дадал: "энэ variable-ийн утга программын турш өөрчлөгдөхгүй — тогтмол шүү" гэсэн, хүнд зориулсан дохио (Python өөрөө хориглодоггүй — зөвхөн уншигчдын хэлэлцээр).
Ажиллуулж шалгая: цэс эргэлдэж, 3-аар гарч байвал — суурь бэлэн.
Файлын дээд хэсэгт (FILE_NER-ийн доор, while-ийн дээр):
python
def nemeh():
temdeglel = input("Тэмдэглэлээ бичээрэй: ").strip()
if len(temdeglel) == 0:
print("Хоосон тэмдэглэл хадгалахгүй")
return
with open(FILE_NER, "a") as f:
f.write(temdeglel + "\n")
print("Хадгалагдлаа!")Мөр бүр өөрийн түүхтэй. Input + strip() — угаалгын зан үйл. Хоосон орцын шалгалт — len == 0 бол мэдэгдэл хэвлээд return: энэ бол Бүлэг 8-ын "эрт буцах" хэв маяг ажил дээрээ — return-ий ард юу ч байхгүй (юу ч гардуулахгүй, зүгээр л гарна): хоосон Enter дарсан хэрэглэгчийн "тэмдэглэл" файлд хог мөр болж орохоос сэргийлэв — indeksийн хичээлийн "хоосны [0]" сургамжийн үеэл халамж. Тэгээд гол мөр: "a" горим — залгагч: тэмдэглэл бүр хуучных нь ард нэмэгдэнэ, өмнөх юу ч арчигдахгүй ("w" тавьсан бол тэмдэглэл бүр өмнөхөө арчина — нэг үсэг, тэс өөр программ: горимоо дуут тулгах гурван секундын дадлаа энд хэрэглээрэй!). f.write(temdeglel + "\n") — string-залгалтаар \n-ээ нааж бичив: "мөр бүр нэг тэмдэглэл" хэлбэрийн баталгаа.
Цэсэнд залгах: if songolt == "1": nemeh() гэсэн салааг break-ийн салаанаас дээр нэмээрэй (elif-ээр).
Ажиллуулж шалгая: 1 → "Өнөөдөр Python сурлаа" → "Хадгалагдлаа!" → дахиад 1 → өөр тэмдэглэл → 3-аар гар. Зүүн самбарт temdeglel.txt мэндэлсэн байх ёстой — нээгээд хоёр мөрөө нүдээрээ үз.
Одоо уншигч — тэгээд түүнд өмнөх хичээлийн амласан тор:
python
def bugdiig_harah():
try:
with open(FILE_NER, "r") as f:
aguulga = f.read()
except FileNotFoundError:
print("Дэвтэр хоосон байна — анхны тэмдэглэлээ нэмээрэй")
return
murnuud = aguulga.split("\n")
print(f"\n--- Таны тэмдэглэлүүд ---")
dugaar = 1
for mur in murnuud:
if len(mur) > 0:
print(f"{dugaar}. {mur}")
dugaar = dugaar + 1Задалъя — энд Түвшин 3-ын бүх мэдлэг нэг дор ажиллаж байна. Тор: уншилт try-д — учир нь анхны гүйлтэд temdeglel.txt угаасаа байхгүй: тэмдэглэл нэмэхээсээ өмнө 2-ыг дарсан хэрэглэгчид FileNotFoundError дэлбэрэх байсан — тор түүнийг "Дэвтэр хоосон байна" гэсэн эелдэг үг болгов: Бүлэг 11-ийн шалгуураар яг "засаж чадахгүй, гадаад ертөнцийн" алдаа — тор татах нь зөв газраа. Торны биед return — эрт буцалт: файлгүй бол цааших ажил утгагүй. Try-ийн бие богино байгааг ажигла — зөвхөн унших хоёр мөр: "тор гимнастикчийн доор, танхим даяар биш." Задаргаа: split("\n") — агуулга мөрүүдийн list болов. Дугаартай хэвлэлт: тоолуур (dugaar) + loop — гэхдээ дунд нь нэг шүүлт: if len(mur) > 0 — учир нь мөр бүрийн ард \n залгаж бичсэн маань файлын хамгийн сүүлд ганц "хоосон мөр" үлдээдэг: split түүнийг хоосон string болгож list-д оруулдаг тул шүүхгүй бол жагсаалтын төгсгөлд эзэнгүй дугаар гарна — "цуглуулгын захын хоосон гишүүн" гэдэг энэ жижиг үзэгдэл файлтай ажиллагсдын өдөр тутмын танил: шүүлт нь стандарт эм нь.
Цэсэнд elif songolt == "2": bugdiig_harah() залгаарай.
Ажиллуулж шалгая — ёслолын шалгалт: 2 дарахад хоёр тэмдэглэл чинь дугаартайгаа жагсана. Одоо гол мөч: 3-аар гарч, программаа бүрэн хааж (VS Code-оо ч хааж болно), эргэж ирээд Run дараад 2-ыг дар:
--- Таны тэмдэглэлүүд ---
1. Өнөөдөр Python сурлаа
2. Маргааш давтанаТэд эргэж ирлээ. Энэ хоёр мөрийг нэг хором ширтээрэй: программ чинь үхээд — амилахдаа өчигдрийн ой санамжтайгаа амиллаа: таны бүтээлүүдийн түүхэнд анхны "мартдаггүй" нь энэ. Ширээ цэвэрлэгдсэн, шүүгээ санаж байсан — таны код хоёр ертөнцийн гүүр нь боллоо.
python
# Тэмдэглэлийн дэвтэр — мартдаггүй программ
FILE_NER = "temdeglel.txt"
def nemeh():
temdeglel = input("Тэмдэглэлээ бичээрэй: ").strip()
if len(temdeglel) == 0:
print("Хоосон тэмдэглэл хадгалахгүй")
return
with open(FILE_NER, "a") as f:
f.write(temdeglel + "\n")
print("Хадгалагдлаа!")
def bugdiig_harah():
try:
with open(FILE_NER, "r") as f:
aguulga = f.read()
except FileNotFoundError:
print("Дэвтэр хоосон байна — анхны тэмдэглэлээ нэмээрэй")
return
murnuud = aguulga.split("\n")
print(f"\n--- Таны тэмдэглэлүүд ---")
dugaar = 1
for mur in murnuud:
if len(mur) > 0:
print(f"{dugaar}. {mur}")
dugaar = dugaar + 1
while True:
print("\n--- ТЭМДЭГЛЭЛИЙН ДЭВТЭР ---")
print("1 - Тэмдэглэл нэмэх")
print("2 - Бүгдийг харах")
print("3 - Гарах")
songolt = input("Сонголт: ")
if songolt == "1":
nemeh()
elif songolt == "2":
bugdiig_harah()
elif songolt == "3":
print("Баяртай!")
break
else:
print("1-3 хооронд сонгоно уу")Дөчин мөр — доторх "он цагийн" зурвасыг хараарай: Түвшин 1-ийн if/elif, Түвшин 2-ын function, loop, list, string-авдар, f-string, Түвшин 3-ын try/except ба файл — гурван Түвшний мэдлэг нэг цул, өдөр тутам хэрэглэж болох хэрэгсэлд. Тийм ээ — хэрэглээрэй жинхэнээсээ: сурсан зүйлсийн тэмдэглэл, хийх ажлын санамж — таны бичсэн программ таны амьдралд үйлчилж эхлэх мөч бол энэ аяллын хамгийн том шагналуудын нэг. Харилцагчийн дэвтрийн өр хэсэгчлэн барагдаж эхэллээ — түүнийг бүрэн "мартдаггүй" болгох ажил Түвшингийн төгсгөлийн төсөлд (Бүлэг 13-ын хийх ажлын жагсаалт) гүйцэлдэнэ.
Нэг: Огноотой тэмдэглэл. Тэмдэглэл бүрийн урд бичигдсэн огноо нь автоматаар наалддаг болгомоор байна уу? Яг түүнд хэрэгтэй багаж дараагийн бүлэгт (datetime) хүлээж байгаа — энэ өргөтгөлийг "маргаашийн өр" болгож тэмдэглээд үлдээе: Бүлэг 13-ын дараа эргэж ирээд нэг мөр нэмэхэд л болно.
Хоёр: Тэмдэглэлийн тоог мэндчилгээнд. Программ нээгдмэгц "Танд 5 тэмдэглэл байна" гэж угтдаг болгож үзээрэй: while-ийн өмнө тортой уншилт + split + хоосон-шүүлттэй тоололт — bugdiig_harah-ийн эхний хагасын хуулбар... хуулбар уу? DRY! — "мөрүүдийг уншиж list гардуулдаг" туслах function бичвэл хоёр газар хоёулан нь дуудаад давталтгүй болно: function-оор давталт устгах жинхэнэ дасгал.
Гурав: Хайлт. Дөрөв дэх цэс "Тэмдэглэлээс хайх": хайх үг асуугаад, мөрүүдээр loop хийж if haih_ug in mur: гэж шүүж таарсныг нь хэвлэ — in-ийн "string доторх хайлт" дүр (string дотор string байгаа эсэхийг in шалгаж чаддаг — list дээрх in-ийн үеэл чадвар) энд өөрөө нээгдэнэ.
Та "мартдаггүй" анхны программаа барилаа: өгөгдлийн гэр нь файл — мөр бүр нэг тэмдэглэл: бичихдээ "a" + \n залгалт, уншихдаа "r" + split("\n").
Анхны гүйлтийн FileNotFoundError бол гадаад ертөнцийн алдаа — тортой уншилт + эрт буцалт нь стандарт угтлага.
Файлын нэрийг нэг тогтмолд (FILE_NER — бүгд том үсгээр: "өөрчлөгдөхгүй" гэсэн хэлэлцээр) — бичигч, уншигч хоёр нэг файл руу харах баталгаа.
Split-ийн үлдээдэг захын хоосон мөрийг len > 0 шүүлтээр цэвэрлэ; хоосон орцыг эрт буцалтаар хаа.
Ёслолын мөч болов: программ хаагдаад — дахин нээгдэхэд өгөгдөл эргэж ирэв: тоглоомоос хэрэгсэл рүү давсан хил.
Дараагийн бүлэг Түвшин 3-ын сүүлчийн шинэ мэдлэгийг авчирна: модуль — Python-ы "зээлж авдаг багажны хайрцагнууд": import гэдэг ганц үгээр математикийн, санамсаргүй тооны, огноо цагийн бэлэн хэрэгслүүд гарт чинь орно. Тэгээд тэнд таны хамгийн эртний өр эзнээ олно: random — тоо таах тоглоомын "кодыг нь харсан хүн хариуг мэдчихдэг" сүүлчийн сул тал арилж, тоглоом чинь гурав дахь, эцсийн хувилбартаа хүрнэ.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.