Ачааллж байна...
Энэ бол Бүлэг 3-ын хамгийн чухал хичээл, бас магадгүй энэ курсийн эргэлтийн цэгүүдийн нэг. Учир нь энд бид нэг санааг тайлна, тэр санаа нь Бүлэг 10-ын decorator, Бүлэг 15-ын FastAPI, мөн орчин үеийн Python-ы маш олон хэсгийн ард нуугдаж байдаг.
Санаа нь энгийн боловч эхэндээ хачирхалтай сонсогдоно: функц бол өөрөө утга юм.
Курс 1-ээс эхлээд та функцийг "үйлдэл" гэж бодож ирсэн. Функц бол хийдэг зүйл, ажиллуулдаг зүйл. Харин тоо, string, list бол "юмс" — хадгалдаг, дамжуулдаг, хайрцагт хийдэг зүйлс. Энэ хоёр ангилал тусдаа мэт санагддаг.
Python-д тийм биш. Python-д функц нь тоо, string, list-тэй яг ижил статустай. Түүнийг хувьсагчид олгож болно. Жагсаалтад хийж болно. Dictionary-ийн утга болгож болно. Өөр функцэд аргумент болгож дамжуулж болно. Функцээс буцааж болно. Функц бол зүгээр л нэг төрлийн утга — зөвхөн ажиллуулж болдог утга.
Энэ хичээл дуусахад та sorted(neres, key=len) гэсэн код яагаад ажилладгийг ойлгоно, lambda гэсэн үгийг харах бүрдээ айхаа болино, мөн Бүлэг 10-ын decorator руу орох хаалганы өмнө зогсож байх болно.
Курс 1-ээс функцийн зүйрлэл нь жор байсан. Тэр зүйрлэлийг одоо гүнзгийрүүлье.
Танд жортой цаас байна — "өндөгтэй будаа хийх заавар." Одоо хоёр өөр зүйлийг ялгаж үзье.
Нэгдүгээрт, та тэр жорыг дагаж ХООЛ хийж болно. Гарт тань бэлэн хоол үлдэнэ. Энэ бол функцийг ДУУДАХ явдал — hool_hiikh().
Хоёрдугаарт, та тэр жортой ЦААСЫГ өөрийг нь найздаа өгч болно. Гарт тань хоол биш, цаас байна. Найз тань түүнийг халаасандаа хийж, гэртээ аваачиж, хүссэн үедээ ашиглаж болно. Эсвэл огт ашиглахгүй ч байж болно. Энэ бол функцийг ДАМЖУУЛАХ явдал — hool_hiikh (хаалтгүй).
Хаалт байгаа эсэх нь бүх ялгааг үүсгэдэг. hool_hiikh() гэвэл жор ажиллаж, хоол гарна. hool_hiikh гэвэл жор өөрөө, цаас өөрөө гарт орно.
Энэ ялгааг эхнээс нь тод ойлгосон нь дээр, учир нь энэ хичээлийн бүх зүйл түүн дээр тулгуурлана.
python
def mendchilekh():
print("Сайн байна уу")
mendchilekh()Сайн байна ууЭнэ бол танил зүйл. Одоо хаалтгүйгээр:
python
def mendchilekh():
print("Сайн байна уу")
print(mendchilekh)<function mendchilekh at 0x000001A2B3C4D5E0>Гэнэтийн зүйл: "Сайн байна уу" хэвлэгдээгүй. Оронд нь Python нь "энэ бол mendchilekh нэртэй функц бөгөөд ийм хаяг дээр байрлаж байна" гэж мэдээлж байна. Тэр хачин тоо (0x000001A2...) нь функцийн санах ойн хаяг — та түүнийг ойшоох шаардлагагүй, зөвхөн функц бол ЖИНХЭНЭ ЮМ гэдгийн нотолгоо гэж хараарай. Тэр нь хаа нэгтээ оршин байгаа, хаягтай, жинхэнэ объект юм.
Тэгвэл функц бол объект юм бол — түүнийг хувьсагчид олгож болох уу?
python
def mendchilekh():
print("Сайн байна уу")
shine_ner = mendchilekh
shine_ner()Сайн байна ууАжиллалаа. shine_ner = mendchilekh гэсэн мөр нь функцийг ХУВЬСАГЧИД ОЛГОСОН. Одоо shine_ner ба mendchilekh хоёулаа ЯГ ИЖИЛ функц руу заана. Аль ч нэрээр дуудахад ижил зүйл болно.
Бүлэг 2-ын slicing хичээлээс huulbar = anhnii гэсэн жишээг санаж байна уу? Тэнд бид нэг жагсаалтад хоёр дахь нэр өгсөн. Энд яг тэр л зүйл болж байна, зөвхөн жагсаалтын оронд функц байна. Хуулбар үүсээгүй — зөвхөн хоёр дахь шошго наагдсан.
Хаалт байхгүй байгааг дахин анзаараарай. shine_ner = mendchilekh() гэж бичсэн бол огт өөр зүйл болох байсан — функц ажиллаж, түүний БУЦААСАН УТГА (энэ тохиолдолд None) shine_ner-т очих байсан.
Функц бол утга бол — жагсаалтад хийж болох уу?
python
def nemekh(a, b):
return a + b
def khasakh(a, b):
return a - b
def urjuulekh(a, b):
return a * b
uildluud = [nemekh, khasakh, urjuulekh]
for uildel in uildluud:
ur_dun = uildel(10, 3)
print(f"{uildel.__name__}: {ur_dun}")Үр дүн:
nemekh: 13
khasakh: 7
urjuulekh: 30Энэ кодыг сайн ажиглаарай, учир нь энд шинэ ертөнц нээгдэж байна.
uildluud = [nemekh, khasakh, urjuulekh] гэсэн мөрөнд бид ГУРВАН ФУНКЦИЙГ жагсаалтад хийсэн. Хаалт байхгүй — тиймээс тэдгээр нь ажиллаагүй, зөвхөн жагсаалтад орсон. Жагсаалт дотор одоо гурван "жорын цаас" байна.
Дараа нь loop дотор uildel хувьсагч нь ээлж дараалан функц бүрийг авч байна. uildel(10, 3) гэж хаалттай бичихэд ТЭР функц ажиллана. Loop эргэх бүрд өөр функц ажиллаж байна.
uildel.__name__ нь өмнөх хичээлээс танил — функцийн нэрийг string болгож өгдөг.
Ижил зүйлийг dictionary-д хийж болно, тэр нь бүр илүү хэрэгтэй:
python
def nemekh(a, b):
return a + b
def khasakh(a, b):
return a - b
uildluud = {
"+": nemekh,
"-": khasakh,
}
temdeg = "+"
ur_dun = uildluud[temdeg](10, 3)
print(ur_dun)13uildluud[temdeg] нь dictionary-аас функцийг гаргаж авч байна. Дараа нь (10, 3) нь түүнийг шууд дуудаж байна. Хоёр үйлдэл нэг мөрөнд.
Энэ хэв маягийг та бодит кодод байнга харна — тэр нь урт if/elif/elif/else гинжийг орлодог. Курс 1-д та тооны машины программ бичсэн бол магадгүй ийм код бичсэн байх:
python
if temdeg == "+":
ur_dun = a + b
elif temdeg == "-":
ur_dun = a - b
elif temdeg == "*":
ur_dun = a * bDictionary дахь функцууд нь тэр гинжийг бүхэлд нь орлож чадна. Шинэ үйлдэл нэмэхэд elif бичих шаардлагагүй — зөвхөн dictionary-д нэг мөр нэмнэ.
Одоо хамгийн чухал хэрэглээ рүү орно. Функцийг ӨӨР ФУНКЦЭД аргумент болгож дамжуулж болно.
python
def hoyor_udaa_duudakh(func):
func()
func()
def mendchilekh():
print("Сайн байна уу")
def bayartai():
print("Баяртай")
hoyor_udaa_duudakh(mendchilekh)
hoyor_udaa_duudakh(bayartai)Үр дүн:
Сайн байна уу
Сайн байна уу
Баяртай
Баяртайhoyor_udaa_duudakh нь func гэсэн параметр авч байна. Тэр параметр нь тоо ч биш, string ч биш — ФУНКЦ. Дотроо func() гэж хаалттай дуудаж, түүнийг ажиллуулж байна.
Дуудалт дээр hoyor_udaa_duudakh(mendchilekh) гэж бичсэнийг анзаараарай — mendchilekh() ГЭЖ БИЧЭЭГҮЙ. Хэрэв хаалт тавьсан бол mendchilekh эхлээд ажиллаж, түүний буцаасан утга (None) дамжигдах байсан. Дараа нь hoyor_udaa_duudakh дотор None() гэж дуудахыг оролдоод алдаа гарах байсан.
Функц хүлээж авдаг функцийг higher-order function гэж нэрлэдэг (өндөр эрэмбийн функц). Та энэ нэр томьёог мэдэх шаардлагагүй ч, ойлголтыг нь мэдэх шаардлагатай — учир нь дараагийн жишээ бол Python-д хамгийн олон ашиглагддаг higher-order function юм.
Одоо бодит, өдөр тутам ашиглагддаг жишээ рүү орно. Курс 1-ээс sorted функцийг санаж байгаа байх — тэр нь жагсаалтыг эрэмбэлдэг.
python
neres = ["төмөр", "болд", "цэцэгмаа", "ай"]
print(sorted(neres))['ай', 'болд', 'töмөр', 'цэцэгмаа']Анхдагчаар sorted нь цагаан толгойн дарааллаар эрэмбэлдэг. Гэхдээ хэрэв та нэрсийг ЦАГААН ТОЛГОЙГООР биш, УРТААР нь эрэмблэхийг хүсвэл яах вэ?
python
neres = ["төмөр", "болд", "цэцэгмаа", "ай"]
print(sorted(neres, key=len))['ай', 'болд', 'төмөр', 'цэцэгмаа']Одоо богиноос урт руу эрэмблэгдлээ.
key=len гэсэн хэсгийг анхааралтай хараарай. Энэ бол өмнөх хичээлээс танил keyword argument, гэхдээ түүний УТГА нь ямар нэг тоо, string биш — ФУНКЦ. len бол Python-ы built-in функц бөгөөд бид түүнийг ХААЛТГҮЙ дамжуулсан.
Юу болж байна вэ? sorted нь ингэж ажилладаг: жагсаалтын элемент бүрийг авч, key -д өгсөн функцээр ДАМЖУУЛЖ, гарсан үр дүнгээр нь эрэмбэлдэг. Тэгэхээр:
"төмөр" → len("төмөр") → 5
"болд" → len("болд") → 4
"цэцэгмаа" → len("цэцэгмаа") → 8
"ай" → len("ай") → 2
Дараа нь sorted нь эдгээр тоонуудаар (2, 4, 5, 8) эрэмблэж, харгалзах string-үүдийг тэр дарааллаар нь буцаана.
Хамгийн чухал зүйл: sorted нь len доторх кодыг мэддэггүй. Тэр зөвхөн "надад функц өгсөн, би түүнийг элемент бүр дээр дуудна" гэж мэддэг. Энэ л уян хатан байдлыг өгч байгаа юм — та ЯМАР Ч функц өгч чадна.
Өөрийн функц бичээд өгье:
python
def suulchiin_useg(ug):
return ug[-1]
neres = ["төмөр", "болд", "цэцэгмаа", "ай"]
print(sorted(neres, key=suulchiin_useg))['цэцэгмаа', 'болд', 'ай', 'төмөр']Одоо нэрс нь СҮҮЛЧИЙН ҮСГЭЭР нь эрэмблэгдлээ (а, д, й, р). sorted нь миний бичсэн функцийг элемент бүр дээр дуудсан.
Илүү бодит жишээ — dictionary-уудын жагсаалтыг талбараар нь эрэмблэх:
python
def onoogoor(suragch):
return suragch["onoo"]
suragchid = [
{"ner": "Болд", "onoo": 85},
{"ner": "Сараа", "onoo": 92},
{"ner": "Төмөр", "onoo": 78},
]
erembelsen = sorted(suragchid, key=onoogoor, reverse=True)
for suragch in erembelsen:
print(f"{suragch['ner']}: {suragch['onoo']}")Үр дүн:
Сараа: 92
Болд: 85
Төмөр: 78reverse=True нь өмнөх хичээлээс танил keyword argument — буурах дарааллаар эрэмблэнэ.
Энэ бол Бүлэг 6-ийн guided build (зарлагын бүртгэл), Бүлэг 12-ийн цаг агаарын программд шууд ашиглагдах хэв маяг юм. Бодит өгөгдөл нь бараг үргэлж dictionary-уудын жагсаалт хэлбэртэй байдаг тул тэднийг талбараар нь эрэмблэх хэрэгцээ байнга гардаг.
Одоо нэг эвгүй байдлыг анзаараарай. Дээрх onoogoor функц нь бүхэлдээ ГАНЦ мөр:
python
def onoogoor(suragch):
return suragch["onoo"]Тэр нь зөвхөн sorted-д дамжуулах гэж л оршин байна. Түүнийг өөр хаана ч ашиглахгүй. Тэгэхээр түүнд нэр өгч, гурван мөр зарцуулах нь хэт их мэт санагдаж байна.
Python-д яг ийм тохиолдолд зориулсан богино бичлэг байдаг: lambda.
python
suragchid = [
{"ner": "Болд", "onoo": 85},
{"ner": "Сараа", "onoo": 92},
{"ner": "Төмөр", "onoo": 78},
]
erembelsen = sorted(suragchid, key=lambda s: s["onoo"], reverse=True)
for suragch in erembelsen:
print(f"{suragch['ner']}: {suragch['onoo']}")Яг ижил үр дүн:
Сараа: 92
Болд: 85
Төмөр: 78lambda s: s["onoo"] гэсэн хэсгийг задалъя.
lambda бол түлхүүр үг — "энд жижиг функц эхэлж байна" гэж хэлж байна. Түүний ард параметрүүд орно: энд s (ганц параметр). Дараа нь цэгтэй таслал. Түүний ард буцаах илэрхийлэл: s["onoo"].
Тэгэхээр lambda s: s["onoo"] нь яг дараах функцтэй ижил утгатай:
python
def нэргүй(s):
return s["onoo"]Ялгаа нь зөвхөн хоёр зүйлд байна. Нэгдүгээрт, lambda нь НЭРГҮЙ — тиймээс түүнийг заримдаа "anonymous function" гэж нэрлэдэг. Хоёрдугаарт, lambda-д return бичдэггүй — цэгтэй таслалын ард байгаа илэрхийлэл нь автоматаар буцаагдана.
Хэдэн жишээ харьцуулъя:
python
# Ердийн функц
def hoyor_dakhin(x):
return x * 2
# Ижил lambda
hoyor_dakhin = lambda x: x * 2python
# Ердийн функц
def niilber(a, b):
return a + b
# Ижил lambda
niilber = lambda a, b: a + bpython
# Ердийн функц
def tegsh_uu(too):
return too % 2 == 0
# Ижил lambda
tegsh_uu = lambda too: too % 2 == 0Гэхдээ энд ЧУХАЛ зөвлөгөө: дээрх гурван lambda-г ингэж бичих ЁСГҮЙ. Хэрэв та lambda-д НЭР ӨГЧ байгаа бол (hoyor_dakhin = lambda x: ...), тэгвэл та зүгээр л def ашиглах ёстой байсан. Мэргэжлийн Python стандарт (PEP 8) үүнийг тодорхой зөвлөдөг: нэртэй функц хэрэгтэй бол def бич.
Lambda-гийн ЖИНХЭНЭ зорилго нь: тэр даруй, нэг л газарт, дахин ашиглагдахгүйгээр хэрэглэгдэх жижиг функц. Ихэнхдээ энэ нь sorted(key=...), max(key=...), min(key=...) гэх мэт higher-order функцийн аргумент болж ирдэг.
Хэдэн бодит жишээ:
python
neres = ["төмөр", "болд", "цэцэгмаа", "ай"]
print(sorted(neres, key=lambda n: len(n)))
print(max(neres, key=lambda n: len(n)))
print(min(neres, key=lambda n: len(n)))['ай', 'болд', 'төмөр', 'цэцэгмаа']
цэцэгмаа
айpython
baraanuud = [
{"ner": "Ном", "une": 15000},
{"ner": "Утас", "une": 800000},
{"ner": "Харандаа", "une": 500},
]
print(sorted(baraanuud, key=lambda b: b["une"]))
print(max(baraanuud, key=lambda b: b["une"])["ner"])[{'ner': 'Харандаа', 'une': 500}, {'ner': 'Ном', 'une': 15000}, {'ner': 'Утас', 'une': 800000}]
УтасХамгийн сүүлийн мөр нь "хамгийн үнэтэй барааны нэрийг өг" гэсэн санааг нэг мөрөнд илэрхийлж байна.
Lambda нь маш хязгаарлагдмал. Дотор нь зөвхөн НЭГ ИЛЭРХИЙЛЭЛ байж болно. Тэнд if/else мэдэгдэл бичиж болохгүй (ternary бол болно, учир нь тэр илэрхийлэл), loop бичиж болохгүй, олон мөр бичиж болохгүй, print дуудвал утгагүй болно.
python
# Болно (ternary бол илэрхийлэл)
angilal = lambda too: "тэгш" if too % 2 == 0 else "сондгой"
# Болохгүй
lambda x:
if x > 0:
return "эерэг" File "main.py", line 2
if x > 0:
^^
SyntaxError: invalid syntaxЭнэ хязгаарлалт нь санамсаргүй биш — тэр нь зориудынх. Python-ы зохиогч lambda-г ЗӨВХӨН жижиг зүйлд ашиглуулах гэж ингэж хийсэн. Хэрэв танд илүү их зүйл хэрэгтэй бол def бич.
Практик дүрмүүд:
Lambda нь sorted, max, min гэх мэт функцийн key= аргумент болох үед тохиромжтой — нэг мөр, нэг удаа, тэр дор нь.
Lambda-д НЭР ӨГЧ БАЙВАЛ — тэр бол def бичих ёстой байсны шинж. Үл хамаарах зүйл байхгүй.
Lambda нь нэг мөрөнд багтахгүй, эсвэл уншихад толгой эргэм болж эхэлбэл — def бич.
Lambda-д нэр байхгүй тул алдаа гарахад stack trace-д "lambda" гэж л бичигдэнэ — алдаа хайхад хэцүү. Нарийн логик бол def бич.
Энэ бол Бүлэг 2-оос давтагдаж ирж байгаа ижил сургамж: хамгийн богино код биш, хамгийн ойлгомжтой код зөв.
Одоо би танд шууд хэлье: энэ хичээлд сурсан зүйл бол Бүлэг 10-ын decorator-ын БҮХ СУУРЬ юм.
Decorator гэдэг нь юу гэж бодож байна вэ? Тэр бол зүгээр л функц хүлээж авдаг, функц буцаадаг функц. Өөр юу ч биш. @ тэмдэг нь зөвхөн богино бичлэг — тэр нь ямар ч илбэ агуулаагүй.
Та энэ хичээлд аль хэдийн хагасыг нь харлаа: функцийг аргумент болгож дамжуулж болно (sorted(key=...), hoyor_udaa_duudakh(mendchilekh)). Үлдсэн хагас — функцийг БУЦААХ — бол Бүлэг 10-ын эхний хичээлийн сэдэв.
Тэр үед та ийм код харна:
python
def hemjikh(func):
def dotood(*args, **kwargs):
# эхлэхийн өмнө ямар нэг зүйл хий
ur_dun = func(*args, **kwargs)
# дууссаны дараа ямар нэг зүйл хий
return ur_dun
return dotoodОдоо энэ код танд бүрэн ойлгомжгүй байх — тэр зүгээр л. Гэхдээ дараах зүйлсийг та АЛЬ ХЭДИЙН мэдэж байгаа гэдгийг анзаараарай: func бол функц-параметр (энэ хичээл). *args, **kwargs нь бүх аргументыг дамжуулж байна (Хичээл 3.3). func(*args, **kwargs) нь тэднийг задалж дуудаж байна (Хичээл 3.3). Танд үлдсэн шинэ зүйл нь ганцхан: функц дотор функц тодорхойлж, түүнийг БУЦААЖ байгаа хэсэг.
Тэгэхээр Бүлэг 10 бол цоо шинэ ертөнц биш — тэр бол энэ хичээл дээр НЭГ давхарга нэмэх явдал. Та түүнд бэлэн байна.
Хэрэв сонирхвол: дараах кодыг ажиллуулаад юу болохыг хараарай.
python
def mendchilekh():
return "Сайн байна уу"
a = mendchilekh
b = mendchilekh()
print(type(a))
print(type(b))Хоёр төрөл нь тэс өөр байх болно. Энэ бол хаалт байгаа эсэхийн ялгааг хамгийн тод харуулах туршилт юм.
Мөн хүсвэл: өөрийн Курс 1-д бичсэн ямар нэг жагсаалтыг sorted(..., key=lambda ...) ашиглан өөр өөр байдлаар эрэмблэж үзээрэй.
1. Дамжуулахдаа хаалт тавих
python
def hoyor_udaa_duudakh(func):
func()
func()
def mendchilekh():
print("Сайн байна уу")
hoyor_udaa_duudakh(mendchilekh())Сайн байна уу
Traceback (most recent call last):
File "main.py", line 10, in <module>
hoyor_udaa_duudakh(mendchilekh())
File "main.py", line 2, in hoyor_udaa_duudakh
func()
TypeError: 'NoneType' object is not callableTypeError: 'NoneType' object is not callable гэдэг нь "None объектыг функц шиг дуудаж болохгүй" гэсэн үг. Анзаараарай, "Сайн байна уу" НЭГ УДАА хэвлэгдсэн — учир нь mendchilekh() нь дуудалтын үед ажилласан. Дараа нь түүний буцаасан None нь func -т очиж, func() гэж дуудахад алдаа гарсан.
Засвар: хаалтыг ав. hoyor_udaa_duudakh(mendchilekh).
Энэ бол энэ хичээлийн ХАМГИЙН түгээмэл алдаа. Санамж: дамжуулахад хаалтгүй, дуудахад хаалттай.
2. sorted-ын key-д хаалт тавих
python
print(sorted(neres, key=len()))Traceback (most recent call last):
File "main.py", line 3, in <module>
print(sorted(neres, key=len()))
TypeError: len() takes exactly one argument (0 given)Ижил алдааны өөр хувилбар. key= нь ФУНКЦ хүлээж байгаа тул len гэж хаалтгүй бич.
3. Lambda-д return бичих
python
f = lambda x: return x * 2 File "main.py", line 1
f = lambda x: return x * 2
^^^^^^
SyntaxError: invalid syntaxLambda-д return бичихгүй. Цэгтэй таслалын ард байгаа илэрхийлэл нь автоматаар буцаагдана. Зөв: f = lambda x: x * 2.
4. Lambda-д нэр өгөх
python
hoyor_dakhin = lambda x: x * 2Алдаа гарахгүй, ажиллана. Гэхдээ мэргэжлийн стандартын эсрэг. Хэрэв нэр өгч байгаа бол def бич:
python
def hoyor_dakhin(x):
return x * 25. key функц нь ХОЁР аргумент хүлээх
python
print(sorted(suragchid, key=lambda a, b: a["onoo"]))Traceback (most recent call last):
File "main.py", line 3, in <module>
print(sorted(suragchid, key=lambda a, b: a["onoo"]))
TypeError: <lambda>() missing 1 required positional argument: 'b'sorted нь key функцийг элемент бүр дээр НЭГ аргументтай дуудна. Тиймээс key функц нь яг НЭГ параметртэй байх ёстой. Засвар: key=lambda s: s["onoo"].
Функц бол утга. Түүнийг хувьсагчид олгож, жагсаалтад хийж, dictionary-д хадгалж, аргумент болгож дамжуулж болно.
Хаалт бүх ялгааг үүсгэдэг: func нь функц ӨӨРӨӨ (жорын цаас), func() нь функцийн ДУУДАЛТ (бэлэн хоол).
Функц хүлээж авдаг функцийг higher-order function гэнэ. Хамгийн түгээмэл жишээ: sorted(жагсаалт, key=функц).
sorted нь элемент бүрийг key функцээр дамжуулж, гарсан үр дүнгээр эрэмбэлдэг. sorted нь тэр функцийн дотор юу байгааг мэддэггүй.
Lambda нь нэргүй, нэг илэрхийлэлтэй жижиг функц: lambda s: s["onoo"]. return бичдэггүй.
Lambda нь ЗӨВХӨН тэр дор нь, нэг удаа хэрэглэгдэх жижиг функцэд зориулагдсан. Нэр өгөх хэрэгтэй болбол def бич.
Dictionary дахь функцууд нь урт if/elif гинжийг орлож чадна.
Энэ бол decorator руу орох хаалга. Decorator гэдэг нь зөвхөн "функц авч, функц буцаадаг функц" юм. Та одоо түүний хагасыг мэдэж авлаа.
Дараагийн хичээлээр Түвшин 1 дуусна. Бид хамтдаа жинхэнэ программ бичнэ: текст файл уншиж, түүний статистикийг гаргадаг хэрэгсэл. Тэнд Бүлэг 1-3-ын бүх мэдлэг нэг дор ажиллана — comprehension, enumerate, zip, slicing, default параметр, keyword argument, sorted ба key=lambda. Гэрийн даалгавар биш, шалгалт биш — бид түүнийг мөр мөрөөр нь хамтдаа барина.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.