Ачааллж байна...
Түвшин 1 дуусч байна. Та Бүлэг 1-д мэргэжлийн орчин барих зуршил (venv, pip, requirements.txt), Бүлэг 2-т цэвэр бичлэг (comprehension, enumerate, zip, slicing, unpacking, ternary), Бүлэг 3-т function-ы гүнзгий чадварууд (default утга, keyword argument, *args, scope, функц бол утга) эзэмшлээ. Одоо тэдгээрийг НЭГ ДОР, бодит программ дээр ажиллуулах цаг болжээ.
Бид хамтдаа текст статистикийн хэрэгсэл бичнэ. Энэ программ нь текст файл уншиж, дараах зүйлсийг тайлагнана: нийт үгийн тоо, өвөрмөц үгийн тоо, хамгийн олон давтагдсан үгс, хамгийн урт үг, мөрийн тоо. Ийм хэрэгсэл нь жинхэнэ хэрэгтэй — зохиолч өөрийн бичвэрийн урт, давтагдлыг шалгах, судлаач текст задлах, эсвэл та зүгээр л өөрийн бичсэн зүйлийг ойлгохын тулд ашиглаж болно.
Энэ бол гэрийн даалгавар БИШ. Бид түүнийг хамтдаа, мөр мөрөөр нь барина. Алхам бүрийн дараа "одоо ажиллуулж үзээрэй, ийм зүйл харагдана" гэсэн шалгах цэг байна. Хэрэв та зөвхөн уншаад өнгөрөх юм бол ч гэсэн зүгээр — гэхдээ өөрийн гараар бичих нь энэ хичээлийн бүх үнэ цэнийг олгоно.
Алхам 1. Шинэ хавтас үүсгэнэ үү, жишээ нь python-advanced дотор text-stats гэж нэрлээрэй.
Алхам 2. Тэр хавтсанд PowerShell нээгээд (File Explorer-ийн хаягийн мөрөнд powershell гэж бичээд Enter), virtual environment үүсгээд идэвхжүүлнэ:
powershell
python -m venv venv
.\venv\Scripts\Activate.ps1(venv) бичиг гарч ирснийг баталгаажуулна уу.
Энэ программд гадны сан хэрэггүй (бүх зүйл Python-той хамт ирдэг), тиймээс pip install хийх шаардлагагүй. Тэгсэн ч гэсэн venv үүсгэж байгаа нь Бүлэг 1-ийн зуршлыг бататгаж байна — мэргэжлийн хүн төсөл бүрд үүнийг хийдэг, тэр төсөл нь сан ашиглаж байгаа эсэхээс үл хамааран.
Алхам 3. Одоо туршилтын текст файл хэрэгтэй. VS Code (эсвэл ямар ч текст засварлагч) нээгээд, tekst.txt нэртэй файл үүсгэж, дараах агуулгыг хийнэ үү (эсвэл өөрийн хүссэн текстээ бичээрэй):
Монгол улс бол Төв Азид оршдог улс юм
Монгол улсын нийслэл нь Улаанбаатар хот юм
Улаанбаатар хот нь Монгол улсын хамгийн том хот
Монгол хэл бол монгол улсын албан ёсны хэлФайлыг UTF-8 кодчлолтойгоор хадгална уу — VS Code анхдагчаар тэгж хадгалдаг тул ямар нэг зүйл хийх шаардлагагүй. (Хэрэв дараа нь кирилл үсэг хачин харагдвал энэ л шалтгаан байх болно.)
Алхам 4. Ижил хавтсанд main.py нэртэй хоосон файл үүсгэнэ үү.
Хавтасны бүтэц одоо ийм байна:
text-stats/
├── venv/
├── tekst.txt
└── main.pyКурс 1-д та файл уншиж сурсан. Түүнийг сэргээе.
python
# main.py
def fail_unshikh(zam):
with open(zam, "r", encoding="utf-8") as f:
aguulga = f.read()
return aguulga
tekst = fail_unshikh("tekst.txt")
print(tekst)Ажиллуулна уу:
powershell
python main.pyТаны файлын агуулга бүхэлдээ хэвлэгдэнэ.
Кодыг задалъя. with open(...) as f: бол Курс 1-ээс танил бичлэг — файлыг нээж, ажил дуусахад автоматаар хаадаг. (Тэр with яг юу хийдгийг Бүлэг 13-т нэрээр нь тайлбарлана; одоохондоо танил хэрэгсэл гэж ашиглаад өнгөрөөрэй.)
"r" нь "read" буюу зөвхөн унших горим. encoding="utf-8" нь маш чухал — энэ бол keyword argument (Хичээл 3.2), Windows дээр кирилл үсэгтэй файл уншихад ЗААВАЛ хэрэгтэй. Хэрэв түүнийг орхивол Windows нь өөрийн анхдагч кодчлолыг ашиглаж, кирилл үсэг эвдэрч, ойлгомжгүй тэмдэгтүүд гарч ирнэ.
f.read() нь файлын БҮХ агуулгыг нэг том string болгож уншина.
Функц нь zam гэсэн параметр авч байгааг анзаараарай — файлын нэрийг дотор нь хатуу бичээгүй. Ингэснээр функц дахин ашиглагдах боломжтой болно.
Одоо тэр том string-ийг үгс болгож хуваах хэрэгтэй. Курс 1-ээс split() method-ыг санаж байгаа байх.
python
# main.py
def fail_unshikh(zam):
with open(zam, "r", encoding="utf-8") as f:
aguulga = f.read()
return aguulga
def ugend_salgakh(tekst):
return tekst.split()
tekst = fail_unshikh("tekst.txt")
ugs = ugend_salgakh(tekst)
print(ugs)
print(f"Нийт үг: {len(ugs)}")Ажиллуулна уу. Ойролцоогоор ийм зүйл харагдана:
['Монгол', 'улс', 'бол', 'Төв', 'Азид', 'оршдог', 'улс', 'юм', 'Монгол', ...]
Нийт үг: 32tekst.split() нь аргументгүй дуудагдсан. Тэр үед Python нь ЯМАР Ч цагаан зайгаар (зай, tab, шинэ мөр) хуваадаг бөгөөд хоосон элементүүдийг автоматаар хаядаг. Энэ нь split(" ") гэж зай зааж өгснөөс илүү ухаалаг — учир нь бидний файл олон мөртэй бөгөөд мөрийн төгсгөлүүдийг ч зөв боловсруулна.
Одоо нэг асуудал байна. Дээрх үр дүнд "Монгол" ба "монгол" гэсэн хоёр өөр үг байна — гэхдээ тэдгээр нь үнэндээ НЭГ үг, зөвхөн эхний үсэг нь өөр. Хэрэв бид тэднийг тусад нь тоолвол статистик буруу гарна.
Мөн бодит текстэд цэг, таслал байдаг: "улс." ба "улс" нь ялгаатай string боловч нэг үг.
Тиймээс цэвэрлэх функц бичье.
python
def ug_tseverlekh(ug):
ug = ug.lower()
temdegtuud = ".,!?:;()\"'—-"
for temdegt in temdegtuud:
ug = ug.replace(temdegt, "")
return ugЭнэ функцийг мөр мөрөөр нь уншъя. ug.lower() нь string-ийг бүхэлд нь жижиг үсэг рүү хөрвүүлж, ШИНЭ string буцаадаг (Курс 1-ээс танил). temdegtuud нь устгах ёстой тэмдэгтүүдийн жагсаалт — үнэндээ энэ бол string боловч Python нь string дээр loop хийхэд үсэг үсгээр нь өгдөг тул жагсаалт мэт ажиллана. Loop дотор replace(temdegt, "") нь тухайн тэмдэгтийг ХООСОН string-ээр солино — өөрөөр хэлбэл устгана.
Одоо түүнийг бүх үгэнд хэрэглэе. Энд Бүлэг 2-ын comprehension орж ирнэ:
python
# main.py
def fail_unshikh(zam):
with open(zam, "r", encoding="utf-8") as f:
aguulga = f.read()
return aguulga
def ug_tseverlekh(ug):
ug = ug.lower()
temdegtuud = ".,!?:;()\"'—-"
for temdegt in temdegtuud:
ug = ug.replace(temdegt, "")
return ug
def ugend_salgakh(tekst):
tureg_ugs = tekst.split()
return [ug_tseverlekh(ug) for ug in tureg_ugs if ug_tseverlekh(ug)]
tekst = fail_unshikh("tekst.txt")
ugs = ugend_salgakh(tekst)
print(ugs)
print(f"Нийт үг: {len(ugs)}")Ажиллуулна уу:
['монгол', 'улс', 'бол', 'төв', 'азид', 'оршдог', 'улс', 'юм', 'монгол', ...]
Нийт үг: 32Одоо бүх үг жижиг үсэгтэй боллоо.
[ug_tseverlekh(ug) for ug in tureg_ugs if ug_tseverlekh(ug)] гэсэн мөрийг задалъя. Зүүн талд ug_tseverlekh(ug) — цэвэрлэсэн үгийг гарга. Дунд нь for ug in tureg_ugs — түүхий үг бүрийг ав. Төгсгөлд if ug_tseverlekh(ug) — цэвэрлэсний дараа ХООСОН болсон үгсийг шүү. Яагаад тэр шүүлт хэрэгтэй вэ? Учир нь хэрэв текстэд ганцаараа зогсох зураас (—) байвал цэвэрлэсний дараа хоосон string үлдэнэ, тэр нь үг биш.
Хоосон string нь Python-д False гэж тооцогддог тул if ug_tseverlekh(ug) гэсэн шалгалт нь "хоосон биш бол ав" гэсэн утгатай.
Гэхдээ энэ кодод нэг сул тал байна: ug_tseverlekh(ug) нь ХОЁР удаа дуудагдаж байна — нэг нь зүүн талд, нэг нь if дотор. Тэр нь хоёр дахин их ажил хийж байна гэсэн үг. Богино текст дээр мэдэгдэхгүй ч, том файл дээр удаашрал үүсгэнэ.
Цэвэр шийдэл нь энгийн loop бичих:
python
def ugend_salgakh(tekst):
tureg_ugs = tekst.split()
ugs = []
for ug in tureg_ugs:
tseverkhen = ug_tseverlekh(ug)
if tseverkhen:
ugs.append(tseverkhen)
return ugsЭнэ нь урт боловч ЦЭВЭРЛЭХ ажлыг нэг л удаа хийж байна. Бүлэг 2-ын сургамжийг санаж байна уу — "comprehension үргэлж илүү сайн байдаггүй"? Энэ бол яг тэр тохиолдол. Comprehension нь нэг л илэрхийллийг хоёр газарт давтуулах шаардлагатай болвол, энгийн loop нь илүү зөв сонголт.
Би энэ хувилбарыг ашиглана. (Дашрамд, Python-д := гэсэн бичлэг байдаг бөгөөд түүгээр comprehension дотор ч давхардлыг арилгаж болно — гэхдээ тэр нь энэ курсийн хамрах хүрээнээс гадуур, тэгээд ч энгийн loop нь эндээс илүү ойлгомжтой.)
Одоо "хэдэн ӨВӨРМӨЦ үг байна вэ" гэсэн асуултад хариулъя. Бүлэг 2-ын Хичээл 2-т set гэдэг бүтцийг товч дурдсаныг санаж байгаа байх: set нь давхардлыг автоматаар устгадаг.
python
def uvurmuts_toolokh(ugs):
return len(set(ugs))set(ugs) нь жагсаалтыг set болгож хувиргана. Хувиргах явцад давхардсан үгс автоматаар устана. Дараа нь len() нь үлдсэн өвөрмөц үгсийн тоог өгнө. Гурван үг ганц мөрөнд.
Set-ийг Бүлэг 5-д бүрэн үзнэ, гэхдээ энэ хэрэглээ нь маш энгийн тул одоо ашиглаад ойлгомжтой байна.
Одоо хамгийн сонирхолтой хэсэг: аль үг хэдэн удаа давтагдсаныг тоолох.
python
def davtamj_toolokh(ugs):
toolch = {}
for ug in ugs:
if ug in toolch:
toolch[ug] = toolch[ug] + 1
else:
toolch[ug] = 1
return toolchЭнэ бол Курс 1-ийн харилцагчийн дэвтрийн хэв маягийн шууд үргэлжлэл. Хоосон dictionary үүсгэж, үг бүрийг үзэж, dictionary-д байвал тоог нь нэмэгдүүлж, байхгүй бол 1 гэж эхлүүлж байна.
Python-д үүнийг илүү богиноор бичих арга бий — dict.get() method:
python
def davtamj_toolokh(ugs):
toolch = {}
for ug in ugs:
toolch[ug] = toolch.get(ug, 0) + 1
return toolchtoolch.get(ug, 0) гэдэг нь "ug гэсэн key байвал түүний утгыг өг, байхгүй бол 0 -г өг" гэсэн утгатай. Тэр 0 нь default утга — Хичээл 3.1-ийн санаа dictionary-ийн method дээр ажиллаж байна. if/else бүхэлдээ алга боллоо.
Аль хувилбарыг ч ашиглаж болно; би хоёр дахийг сонгоно, гэхдээ эхнийх нь илүү тод санагдвал түүнийг ашиглаарай — хоёулаа зөв.
Одоо давтамжийн dictionary-г эрэмбэлэх хэрэгтэй. Энд Хичээл 3.5-ын sorted ба key=lambda орж ирнэ.
python
def khamgiin_olon(toolch, hemjee=5):
hosud = list(toolch.items())
erembelsen = sorted(hosud, key=lambda hos: hos[1], reverse=True)
return erembelsen[:hemjee]Мөр мөрөөр нь уншъя.
toolch.items() нь key-value хосуудыг өгнө (Бүлэг 2-оос танил). list(...) нь тэднийг жинхэнэ жагсаалт болгоно — учир нь sorted нь жагсаалт хүлээж байна. Одоо hosud нь ийм харагдана: [("монгол", 4), ("улс", 5), ("хот", 3), ...]. Хос бүр нь tuple — Бүлэг 5-д бүрэн үзнэ, одоохондоо "index-ээр хандаж болдог өөрчлөгдөшгүй хос" гэж ойлгоод өнгөрөөрэй.
key=lambda hos: hos[1] — энэ бол хичээлийн гол мөр. Lambda нь хос бүрийг авч, түүний index 1 буюу ХОЁР ДАХЬ элементийг (давтамжийн тоог) буцааж байна. sorted нь тэр тоогоор эрэмбэлнэ. Хэрэв бид hos[0] гэж бичсэн бол үгээр нь (цагаан толгойгоор) эрэмбэлэх байсан.
reverse=True нь буурах дарааллаар — хамгийн олон давтагдсаныг эхэнд.
erembelsen[:hemjee] — энэ бол Бүлэг 2-ын slicing. Эхний hemjee ширхэгийг л авна. Санаж байна уу, slicing нь IndexError гаргадаггүй — тиймээс хэрэв нийт өвөрмөц үг таваас цөөн байсан ч энэ код зөв ажиллаж, байгаа хэрийг нь өгнө. Тусад нь шалгах шаардлагагүй.
hemjee=5 нь default параметр (Хичээл 3.1) — ихэнхдээ таван үг хангалттай, гэхдээ дуудагч хүн өөрчилж болно.
python
def khamgiin_urt(ugs):
return max(ugs, key=len)Ганц мөр. max нь sorted-той яг ижил зарчмаар ажилладаг: key функцийг элемент бүр дээр дуудаж, гарсан үр дүнгээр нь харьцуулж, хамгийн ихийг нь буцаана. key=len нь "уртаар нь харьцуул" гэж хэлж байна.
Хэрэв ижил урттай хэд хэдэн үг байвал max нь эхнийхийг нь буцаана. Хэрэв бүх урт үгсийг авахыг хүсвэл өөр код бичих хэрэгтэй болно — тэр нь энэ хичээлийн сонголтот өргөтгөлүүдийн нэг байх болно.
python
def mur_toolokh(tekst):
murууd = tekst.split("\n")
return len([mur for mur in murууd if mur.strip()])tekst.split("\n") нь шинэ мөрийн тэмдэгтээр (\n) хуваана — өөрөөр хэлбэл мөр бүрийг тусад нь өгнө. Дараа нь comprehension нь ХООСОН мөрүүдийг шүүж хаяж байна. mur.strip() нь мөрийн эхлэл, төгсгөлийн зайг арилгадаг — хэрэв мөр зөвхөн зайнаас бүрдэж байсан бол strip() -ийн дараа хоосон string болж, False гэж тооцогдоно.
Энэ бол comprehension-ы ЗӨВ хэрэглээ: нэг илэрхийлэл, нэг шүүлт, давхардал байхгүй.
Одоо бүх хэсгийг нийлүүлж, тайлан хэвлэх функц нэмье.
python
# main.py
# Текст статистикийн хэрэгсэл — Түвшин 1 guided build
def fail_unshikh(zam):
with open(zam, "r", encoding="utf-8") as f:
return f.read()
def ug_tseverlekh(ug):
ug = ug.lower()
temdegtuud = ".,!?:;()\"'—-"
for temdegt in temdegtuud:
ug = ug.replace(temdegt, "")
return ug
def ugend_salgakh(tekst):
tureg_ugs = tekst.split()
ugs = []
for ug in tureg_ugs:
tseverkhen = ug_tseverlekh(ug)
if tseverkhen:
ugs.append(tseverkhen)
return ugs
def davtamj_toolokh(ugs):
toolch = {}
for ug in ugs:
toolch[ug] = toolch.get(ug, 0) + 1
return toolch
def khamgiin_olon(toolch, hemjee=5):
hosud = list(toolch.items())
erembelsen = sorted(hosud, key=lambda hos: hos[1], reverse=True)
return erembelsen[:hemjee]
def khamgiin_urt(ugs):
return max(ugs, key=len)
def mur_toolokh(tekst):
murууd = tekst.split("\n")
return len([mur for mur in murууd if mur.strip()])
def tailan_khevlekh(zam, davtamjiin_too=5):
tekst = fail_unshikh(zam)
ugs = ugend_salgakh(tekst)
if not ugs:
print("Файл хоосон байна.")
return
toolch = davtamj_toolokh(ugs)
olon = khamgiin_olon(toolch, hemjee=davtamjiin_too)
print("=" * 40)
print(f"ФАЙЛ: {zam}")
print("=" * 40)
print(f"Мөрийн тоо: {mur_toolokh(tekst)}")
print(f"Нийт үг: {len(ugs)}")
print(f"Өвөрмөц үг: {len(set(ugs))}")
print(f"Хамгийн урт үг: {khamgiin_urt(ugs)}")
print()
print(f"Хамгийн олон давтагдсан {davtamjiin_too} үг:")
for baiirlal, (ug, too) in enumerate(olon, start=1):
print(f" {baiirlal}. {ug} — {too} удаа")
print("=" * 40)
tailan_khevlekh("tekst.txt")Ажиллуулна уу:
powershell
python main.pyОйролцоогоор ийм үр дүн гарна:
========================================
ФАЙЛ: tekst.txt
========================================
Мөрийн тоо: 4
Нийт үг: 32
Өвөрмөц үг: 18
Хамгийн урт үг: улаанбаатар
========================================
Хамгийн олон давтагдсан 5 үг:
1. монгол — 4 удаа
2. улс — 3 удаа
3. хот — 3 удаа
4. улсын — 3 удаа
5. юм — 2 удаа
========================================Одоо tailan_khevlekh функцийг анхааралтай хараарай, учир нь тэнд Түвшин 1-ийн бүх мэдлэг нэг дор ажиллаж байна.
def tailan_khevlekh(zam, davtamjiin_too=5): — эхний параметр заавал, хоёр дахь нь default утгатай (Хичээл 3.1). Дүрэм: default-гүй нь эхэнд.
if not ugs: ... return — хоосон файлаас хамгаалж байна. max() нь хоосон жагсаалт дээр алдаа гаргадаг тул энэ шалгалт зайлшгүй. Энэ бол сайн зуршил: функц гэнэтийн орцтой тулгарахад эвлэгээр зогсох ёстой.
olon = khamgiin_olon(toolch, hemjee=davtamjiin_too) — keyword argument (Хичээл 3.2). hemjee= гэж нэрээр нь дамжуулснаар код өөрөө тайлбарлаж байна.
len(set(ugs)) — set-ийн давхардал устгах шинж чанар.
"=" * 40 — string-ийг тоогоор үржүүлбэл давтагдана. Курс 1-ээс танил жижиг заль.
for baiirlal, (ug, too) in enumerate(olon, start=1): — энэ бол хамгийн нягт мөр. Задалъя:
olon нь tuple-үүдийн жагсаалт: [("монгол", 4), ("улс", 3), ...]
enumerate(olon, start=1) нь тэдгээрт дугаар нэмнэ (Хичээл 2.3), нэгээс эхэлж
Тэгэхээр loop эргэх бүрд ирж байгаа зүйл: дугаар, дараа нь tuple
baiirlal, (ug, too) нь тэднийг задалж байна — гадна талын unpacking нь дугаар ба tuple-ийг салгаж, дотор талын хаалт нь tuple-ийг үг ба тоо болгож задалж байна (Хичээл 2.5)
Энэ ганц мөрөнд Бүлэг 2-ын хоёр хичээл нэгдэж байна. Хэрэв эхэндээ ойлгомжгүй санагдвал буцаж хараарай — тэр мөрийг ойлгох нь энэ бүхэл түвшний мэдлэгийг батламжилна.
Дараах гурван зүйл нь бүрэн сонголттой. Хэрэв та зөвхөн уншаад цааш явбал ямар ч асуудалгүй — дараагийн хичээлүүд эдгээрийг хийсэн гэж таамаглахгүй.
Өргөтгөл 1: түгээмэл үгсийг хасах. "бол", "юм", "нь" гэх мэт үгс маш олон давтагддаг ч утга багатай. Тэднийг хасах шүүлт нэмж болно:
python
TUGEEMEL = {"бол", "юм", "нь", "ба", "энэ", "тэр"}
def ugend_salgakh(tekst, tugeemel_khasakh=False):
tureg_ugs = tekst.split()
ugs = []
for ug in tureg_ugs:
tseverkhen = ug_tseverlekh(ug)
if not tseverkhen:
continue
if tugeemel_khasakh and tseverkhen in TUGEEMEL:
continue
ugs.append(tseverkhen)
return ugsАнзаараарай, TUGEEMEL нь set — учир нь in шалгалт нь set дээр жагсаалтаас хамаагүй хурдан ажилладаг (Бүлэг 5-д тайлбарлана). Мөн tugeemel_khasakh=False нь default параметр: анхдагчаар хуучин зан төлөв хэвээрээ, хүсвэл асааж болно.
Өргөтгөл 2: файлын нэрийг гаднаас авах.
python
zam = input("Файлын нэр: ")
tailan_khevlekh(zam)Өргөтгөл 3: бүх хамгийн урт үгсийг олох (нэг биш, ижил урттай бүгдийг):
python
def bukh_khamgiin_urt(ugs):
max_urt = max(len(ug) for ug in ugs)
return [ug for ug in ugs if len(ug) == max_urt]Эхний мөрөнд max(len(ug) for ug in ugs) гэсэн бичлэг байна — тэр нь comprehension-той төстэй боловч дөрвөлжин хаалтгүй. Түүнийг generator expression гэж нэрлэдэг бөгөөд Бүлэг 13-д бүрэн үзнэ. Одоохондоо "жагсаалт үүсгэлгүйгээр шууд урсгадаг comprehension" гэж ойлгоод өнгөрөөрэй.
1. encoding мартах
python
with open(zam, "r") as f:Traceback (most recent call last):
File "main.py", line 5, in fail_unshikh
return f.read()
UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 12: character maps to <undefined>UnicodeDecodeError гэдэг нь "энэ файлын байтуудыг тэмдэгт болгож хөрвүүлж чадсангүй" гэсэн үг. Windows дээр анхдагч кодчлол нь UTF-8 биш тул кирилл үсэг эвдэрч байна. Засвар: encoding="utf-8" -ыг ЗААВАЛ бич. Энэ бол Windows дээр ажилладаг Python программистын хамгийн түгээмэл алдаа.
2. Файл олдохгүй
Traceback (most recent call last):
File "main.py", line 4, in fail_unshikh
with open(zam, "r", encoding="utf-8") as f:
FileNotFoundError: [Errno 2] No such file or directory: 'tekst.txt'FileNotFoundError: No such file or directory гэдэг нь "ийм файл олдсонгүй" гэсэн үг. Ихэвчлэн шалтгаан нь: терминал тань main.py ба tekst.txt байрлаж байгаа хавтсанд БАЙХГҮЙ байна. pwd бичээд байршлаа шалгаж, dir бичээд файлууд харагдаж байгаа эсэхийг шалгаарай.
3. Хоосон жагсаалт дээр max дуудах
python
print(max([], key=len))Traceback (most recent call last):
File "main.py", line 1, in <module>
print(max([], key=len))
ValueError: max() iterable argument is emptymax() iterable argument is empty гэдэг нь "max нь хоосон цуглуулга дээр ажиллаж чадахгүй" гэсэн үг. Логиктой: хоосон зүйлээс хамгийн ихийг нь олох боломжгүй. Яг тиймээс бид программдаа if not ugs: return гэсэн хамгаалалт тавьсан.
4. sorted-ын key-д буруу index
python
erembelsen = sorted(hosud, key=lambda hos: hos[0], reverse=True)Алдаа гарахгүй, гэхдээ үр дүн буруу — үгс нь ЦАГААН ТОЛГОЙН урвуу дарааллаар эрэмблэгдэнэ, давтамжаар нь биш. Санамж: hos[0] нь key (үг), hos[1] нь value (тоо).
Түвшин 1-ийн бүх мэдлэг нэг программд нийллээ: venv (Бүлэг 1), comprehension, enumerate, slicing, unpacking (Бүлэг 2), default параметр, keyword argument, sorted ба lambda (Бүлэг 3).
Файл унших: with open(zam, "r", encoding="utf-8") — Windows дээр encoding заавал.
Давтамж тоолох: toolch[ug] = toolch.get(ug, 0) + 1 — dictionary-ийн default утгын гоё хэрэглээ.
Хосуудыг утгаар нь эрэмблэх: sorted(hosud, key=lambda hos: hos[1], reverse=True).
Slicing нь IndexError гаргадаггүй тул [:5] нь "хамгийн ихдээ таван ширхэг" гэсэн аюулгүй утгатай.
Comprehension нь нэг илэрхийллийг хоёр удаа тооцоолох шаардлагатай болвол — энгийн loop бич. Тодорхой байдал ба үр ашиг хоёулаа дээрдэнэ.
Функц гэнэтийн орцтой (хоосон файл) тулгарахад эвлэгээр зогсох ёстой.
Түвшин 1 дууслаа. Та одоо мэргэжлийн Python төслийн орчин барьж, цэвэр код бичиж, уян хатан функц зохиож чадна. Бүлэг 1-3 бол таны суурь — үлдсэн бүх зүйл түүн дээр барих болно.
Түвшин 2-т бид ӨГӨГДӨЛ рүү орно. Эхлээд type hint — орчин үеийн Python-ы хамгийн танигдсан шинж, мөн FastAPI гэх мэт framework-ийн ЯГ ТЭР суурь. Дараа нь tuple, set, үүрлэсэн бүтэц, эцэст нь JSON ба CSV. Түвшний төгсгөлд бид зарлагын бүртгэлийн программ бичнэ — JSON файлд хадгалдаг, бүрэн type hint-тэй, жинхэнэ мэргэжлийн харагдацтай.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.