Ачааллж байна...
Энэ хичээлээр Бүлэг 2 дуусна. Бид энэ бүлгийн турш нэг л зорилготой явсан: та мэддэг зүйлээ илүү тод, илүү цэвэрхэн илэрхийлэх арга сурах. Comprehension нь loop-ийг цэвэрлэсэн, enumerate ба zip нь тоолуур болон range(len(...))-ийг арилгасан, slicing нь хэсэг авах ажлыг хялбарчилсан. Одоо сүүлийн хоёр хэрэгсэл.
Эхнийх нь unpacking буюу задлах. Та үүнийг үнэндээ аль хэдийн ашиглаж байгаа — for ner, o in zip(...) гэж бичихдээ, for i, baraa in enumerate(...) гэж бичихдээ яг unpacking хийж байсан юм. Тэр үед би тайлбарлалгүй өнгөрсөн, учир нь эхлээд ашиглах нь ойлгоход тусална. Одоо түүнийг нэрээр нь дуудаж, бүрэн ойлгуулъя.
Хоёр дахь нь ternary expression буюу гурвалсан илэрхийлэл (мөн conditional expression гэж ч нэрлэдэг). Тэр нь if/else-ийг нэг мөрөнд багтаах бичлэг юм. Хоёулаа богино сэдэв, хоёулаа мэргэжлийн кодод байнга тааралддаг тул нэг хичээлд багтаалаа.
Курс 1-д бид хувьсагчийг шошготой хайрцаг гэж зүйрлэж байсан: хайрцаг дотор утга байна, гадуур нь нэр бичсэн шошго байна. Тэр зүйрлэл хэвээрээ.
Одоо танд нэг том хайрцаг ирлээ гэж төсөөлье, дотор нь гурван зүйл савласан байна. Та хоёр сонголттой. Нэгдүгээрт, том хайрцгийг бүхэлд нь тавиур дээр тавьж, хэрэгтэй үедээ дотроос нь ганц ганцаар нь гаргаж авч болно — энэ бол jagsaalt[0], jagsaalt[1] гэж index-ээр хандах арга. Хоёрдугаарт, хайрцгийг нэг дор задалж, дотор байсан гурван зүйлийг тус тусад нь гурван жижиг хайрцагт хийж, тус бүрд нь өөрийн шошго наах — энэ бол unpacking.
Хоёр дахь арга нь ихэнхдээ илүү тод. Учир нь hun[0], hun[1], hun[2] гэсэн код нь уншигчид "тэгс дэх нь юу байсан билээ" гэж бодуулдаг бол ner, nas, hot гэсэн нэрс нь өөрсдөө тайлбарладаг.
python
hun = ["Болд", 25, "Улаанбаатар"]
ner = hun[0]
nas = hun[1]
hot = hun[2]
print(ner, nas, hot)Энэ код ажиллана, гэхдээ гурван мөр бүхэлдээ механик ажил хийж байна. Одоо unpacking-оор:
python
hun = ["Болд", 25, "Улаанбаатар"]
ner, nas, hot = hun
print(ner, nas, hot)Үр дүн хоёуланд нь ижил:
Болд 25 УлаанбаатарГурав дахь мөрийг задалъя. Тэнцүү тэмдгийн ЗҮҮН талд гурван нэр, таслалаар тусгаарлагдсан байна. Баруун талд нэг жагсаалт байна. Python түүнийг хараад: "зүүн талд гурван нэр байна, баруун талд гурван элемент байна — тэгвэл нэг нэгээр нь хуваарилъя" гэж шийднэ. Эхний нэр эхний элементийг, хоёр дахь нэр хоёр дахь элементийг, гурав дахь нэр гурав дахь элементийг авна.
Дүрэм маш хатуу: зүүн талын нэрсийн тоо баруун талын элементийн тоотой ЯГ таарах ёстой. Хэрэв таарахгүй бол Python алдаа гаргана — түүнийг доор үзнэ.
Энэ бичлэг нь tuple дээр ч ажиллана (tuple-ийг Бүлэг 5-д бүрэн үзнэ, одоохондоо "дугуй хаалттай, өөрчлөгдөшгүй жагсаалт" гэж ойлгоод өнгөрөөрэй):
python
tsegleg = (10, 20)
x, y = tsegleg
print(x, y)10 20Мөн string дээр ч ажиллана, учир нь string ч бас дараалал юм:
python
a, b, c = "abc"
print(a, b, c)a b cОдоо өмнөх хичээлүүд рүү эргэж хараарай.
python
for ner, o in zip(neres, onoo):
print(ner, o)zip нь loop эргэх бүрд ХОС өгдөг гэж бид хэлсэн — тэр хос нь үнэндээ tuple юм. Тэгэхээр for ner, o in ... гэсэн мөр нь loop эргэх бүрд тэр tuple-ийг задалж, хоёр нэрэнд хуваарилж байгаа хэрэг. Яг unpacking.
Ижил зүйл enumerate дээр:
python
for i, baraa in enumerate(baraanuud):
print(i, baraa)Enumerate нь (0, "ном"), (1, "утас") гэсэн tuple-үүд өгдөг. i, baraa нь тэднийг задалж байна.
Мөн dictionary-ийн items() дээр:
python
for tulkhuur, utga in unes.items():
print(tulkhuur, utga)items() нь ("ном", 15000) гэсэн tuple-үүд өгдөг. Дахин unpacking.
Тэгэхээр та энэ чадварыг өмнөх гурван хичээлийн турш ашиглаж байсан бөгөөд одоо түүнийг нэрээр нь мэдэж авлаа. Энэ бол Python-ы тууштай байдлын сайхан жишээ: нэг л дүрэм олон газарт давтагдан ажиллаж байна.
Одоо unpacking-ийн хамгийн алдартай хэрэглээ. Танд хоёр хувьсагч байна, тэдний утгыг солихыг хүсэж байна.
Ихэнх программчлалын хэлэнд үүний тулд гурав дахь түр хувьсагч хэрэгтэй болдог:
python
a = 10
b = 20
tur = a
a = b
b = tur
print(a, b)20 10Энэ код ажиллана. Логик нь: a-гийн утгыг түр хайрцагт хадгална, дараа нь a-д b-гийн утгыг хийнэ, эцэст нь b-д түр хайрцаг доторх (хуучин a-гийн) утгыг хийнэ. Хэрэв tur хувьсагчгүйгээр a = b гэж шууд бичвэл a-гийн хуучин утга үүрд алдагдана.
Python-д үүнийг НЭГ мөрөөр хийж болно:
python
a = 10
b = 20
a, b = b, a
print(a, b)20 10Энэ мөрийг ойлгохын тулд Python юу хийж байгааг мэдэх хэрэгтэй. Python эхлээд БАРУУН талыг бүрэн тооцоолж, (20, 10) гэсэн tuple үүсгэдэг. Тэр tuple дотор ХУУЧИН утгууд орсон байна. Дараа нь тэр tuple-ийг зүүн талын хоёр нэрэнд задалж хуваарилдаг. Тэгэхээр хуучин утгууд аль хэдийн аюулгүй хадгалагдсан тул дарж бичих эрсдэлгүй.
Энэ бол Python код дотор маш түгээмэл тааралддаг бичлэг тул та түүнийг харах бүрдээ "аан, солиж байна" гэж шууд таних ёстой.
Курс 1-д функц нэг утга буцаадаг гэж үзсэн байх. Үнэндээ Python-д функц олон утга буцаах шиг харагддаг — тэр нь unpacking-ийн ачаар боломжтой.
python
def statistik(tootsuud):
hamgiin_bag = min(tootsuud)
hamgiin_ikh = max(tootsuud)
niilber = sum(tootsuud)
return hamgiin_bag, hamgiin_ikh, niilber
onoo = [85, 92, 78, 65, 90]
bag, ikh, niilber = statistik(onoo)
print(f"Хамгийн бага: {bag}")
print(f"Хамгийн их: {ikh}")
print(f"Нийлбэр: {niilber}")Үр дүн:
Хамгийн бага: 65
Хамгийн их: 92
Нийлбэр: 410return hamgiin_bag, hamgiin_ikh, niilber гэсэн мөрийг анхааралтай хараарай. Энд гурван утгыг таслалаар тусгаарлаж буцааж байна. Үнэндээ Python эдгээрийг нэг tuple болгож савлаад буцаадаг — функц ЯМАГТ нэг л зүйл буцаадаг гэсэн дүрэм эвдрээгүй, зүгээр л тэр нэг зүйл нь гурван зүйлийг агуулсан tuple болсон.
Дараа нь bag, ikh, niilber = statistik(onoo) гэсэн мөрөнд бид тэр tuple-ийг гурван нэрэнд задалж байна. Ингэснээр функц "гурван утга буцаасан" мэт харагдаж байгаа юм.
Энэ хэв маягийг Бүлэг 3-ын guided build-д, мөн Бүлэг 12-ын олон файлтай төсөлд байнга ашиглана. Функц нь холбоотой хэдэн утгыг зэрэг буцаах хэрэгтэй болдог нь маш түгээмэл.
Заримдаа та эхний хэдэн элементийг тусад нь авч, үлдсэнийг нь бөөнөөр нь авахыг хүсдэг. Тэр үед од тэмдэг (*) ашиглана.
python
tootsuud = [10, 20, 30, 40, 50]
negdugeer, hoyordugaar, *uldsen = tootsuud
print(negdugeer)
print(hoyordugaar)
print(uldsen)Үр дүн:
10
20
[30, 40, 50]*uldsen гэсэн нэрийн өмнөх од нь "үлдсэн бүхнийг энд хий" гэсэн утгатай. Одтой нэр нь ҮРГЭЛЖ жагсаалт болно, ганц элемент үлдсэн ч гэсэн жагсаалт байна.
Одыг дунд эсвэл эхэнд ч тавьж болно:
python
tootsuud = [10, 20, 30, 40, 50]
negdugeer, *dund, suulchiin = tootsuud
print(negdugeer)
print(dund)
print(suulchiin)10
[20, 30, 40]
50Ганц дүрэм: нэг илэрхийлэлд ганцхан од байж болно. Хоёр од бичвэл Python аль нь хэдийг авахыг мэдэхгүй болно.
Практикт star unpacking нь заримдаа хэрэгтэй ч, хэт олон ашиглавал код нууцлаг болдог. Хамгийн түгээмэл, ойлгомжтой хэрэглээ нь "эхнийхийг ав, үлдсэнийг нь хойш тавь" гэсэн хэлбэр юм. (Дашрамд: * тэмдэг Бүлэг 3-ын *args хичээлд эргэж ирнэ — тэнд ижил санаа функцийн параметр дээр ажиллана.)
Одоо хичээлийн хоёр дахь сэдэв рүү орно.
Курс 1-д та if/else-ийг ингэж бичдэг байсан:
python
nas = 20
if nas >= 18:
angilal = "насанд хүрсэн"
else:
angilal = "хүүхэд"
print(angilal)насанд хүрсэнЭнэ дөрвөн мөрийг сайн ажиглаарай. Тэдгээр нь бүгд НЭГ л зүйл хийж байна: angilal хувьсагчид утга олгож байна. Зөвхөн ЯМАР утга олгохыг нөхцөлөөс хамааруулж байна. Тэгэхээр энд жинхэнэ агуулга нь "angilal нь хоёр утгын нэг байна" гэсэн санаа, харин if, else, догол мөр нь бүгд түүнийг илэрхийлэх бүтэц юм.
Python-д үүнийг нэг мөрөнд бичих бичлэг байдаг:
python
nas = 20
angilal = "насанд хүрсэн" if nas >= 18 else "хүүхэд"
print(angilal)Яг ижил үр дүн.
Гурав дахь мөрийг задалъя. Бүтэц нь: утга_A if нөхцөл else утга_B.
Уншихдаа дунд талаас нь эхлээрэй: if nas >= 18 — энэ бол нөхцөл. Хэрэв тэр нөхцөл ҮНЭН бол зүүн талын утга ("насанд хүрсэн") сонгогдоно. Хэрэв ХУДАЛ бол else-ийн ард байгаа утга ("хүүхэд") сонгогдоно. Сонгогдсон утга нь angilal-д олгогдоно.
Англи хэл дээр энэ нь бараг өгүүлбэр шиг уншигдана: "adult if age is 18 or more, else child." Монголоор шууд орчуулбал дараалал нь эвгүй санагдаж болох ч, хэдэн удаа уншсаны дараа хэвшинэ.
Хамгийн чухал зүйл: ternary бол илэрхийлэл (expression), өөрөөр хэлбэл тэр нь УТГА БУЦААДАГ. Тиймээс түүнийг утга байж болох ямар ч газарт бичиж болно — хувьсагчид олгох, функцэд дамжуулах, list дотор хийх, comprehension дотор ашиглах. Ердийн if бол мэдэгдэл (statement), тэр нь утга буцаадаггүй тул ийм газруудад бичиж болдоггүй. Энэ бол хоёрын хоорондох үндсэн ялгаа.
Функц дуудалт дотор:
python
too = 5
print("тэгш" if too % 2 == 0 else "сондгой")сондгойЭнд ternary нь print() дотор шууд бичигдсэн. Ердийн if/else-ээр үүнийг хийхийн тулд эхлээд хувьсагч үүсгэх хэрэгтэй болно.
Comprehension дотор:
Энэ бол хамгийн хүчирхэг хослол. Өмнөх хичээлүүдээс comprehension-ыг санаж байгаа байх.
python
tootsuud = [1, 2, 3, 4, 5, 6]
angilal = ["тэгш" if too % 2 == 0 else "сондгой" for too in tootsuud]
print(angilal)['сондгой', 'тэгш', 'сондгой', 'тэгш', 'сондгой', 'тэгш']Одоо энд ЧУХАЛ ялгааг тодотгоё, учир нь Хичээл 2.1-д би энэ талаар амласан байсан.
Comprehension-д if хоёр өөр газар, хоёр өөр утгатай орж болно:
python
# 1. ШҮҮХ if — for-ын АРД, else БАЙХГҮЙ
tegsh = [too for too in tootsuud if too % 2 == 0]
# → [2, 4, 6] (сондгой тоонууд АЛГА болно)
# 2. TERNARY — for-ын ӨМНӨ, else ЗААВАЛ байна
angilal = ["тэгш" if too % 2 == 0 else "сондгой" for too in tootsuud]
# → 6 элемент (юу ч алга болохгүй, зөвхөн ХУВИРНА)Ялгаа нь маш тодорхой: for-ын АРД байгаа if нь элементийг ХАЯДАГ. for-ын ӨМНӨ байгаа if...else нь элементийг ХУВИРГАДАГ. Эхний тохиолдолд гарах жагсаалт богино болно, хоёр дахь тохиолдолд яг ижил урттай хэвээрээ.
Санах хялбар арга: else байгаа эсэхийг хараарай. else байвал тэр нь ternary, тиймээс for-ын өмнө. else байхгүй бол тэр нь шүүлт, тиймээс for-ын ард.
Хоёуланг нь нэг comprehension-д ашиглаж ч болно:
python
tootsuud = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
ur_dun = ["их" if too > 5 else "бага" for too in tootsuud if too % 2 == 0]
print(ur_dun)['бага', 'бага', 'их', 'их', 'их']Эхлээд if too % 2 == 0 нь зөвхөн тэгш тоог (2, 4, 6, 8, 10) сонгож үлдээнэ. Дараа нь ternary нь тэдгээрийн тус бүрийг "их" эсвэл "бага" болгож хувиргана. Гэхдээ би энэ жишээг зөвхөн ялгааг харуулах зорилгоор бичсэн — практикт хоёуланг нь нэг мөрөнд хийх нь уншихад хүндрэл үүсгэдэг тул болгоомжтой хандаарай.
Ternary нь өмнөх хичээлүүдийн comprehension-той ижил зарчимтай: богино, энгийн үед тод; урт, нарийн үед аймшигтай.
Ternary тохиромжтой газар:
python
mesej = "Тийм" if hariult else "Үгүй"
un = suuri_un if not khyamdral else suuri_un * 0.9
holbogch = ", " if oldson else ""Эдгээр нь бүгд нэг харцаар ойлгогдоно. Нөхцөл богино, утгууд богино, зорилго тодорхой.
Ternary тохиромжгүй газар:
python
duen = "маш сайн" if onoo >= 90 else "сайн" if onoo >= 75 else "дунд" if onoo >= 60 else "муу"Энэ ажиллана. Гэхдээ түүнийг уншихын тулд та зүүнээс баруун тийш нүдээ гүйлгэж, дотроо else-үүдийг тоолж, толгойгоо гашилгах хэрэгтэй болно. Ижил кодыг ердийн if/elif/else-ээр бичвэл:
python
if onoo >= 90:
duen = "маш сайн"
elif onoo >= 75:
duen = "сайн"
elif onoo >= 60:
duen = "дунд"
else:
duen = "муу"Дөрвөн мөр урт болсон ч ямар ч эргэлзээгүй уншигдана. Энэ бол зөв сонголт.
Практик дүрмүүд:
Нэг нөхцөл, хоёр богино утга — ternary ашигла.
Хоёроос дээш нөхцөл (үүрлэсэн ternary) — if/elif/else бич. Үл хамаарах зүйл байхгүй.
Салбар бүрд нэгээс олон үйлдэл хийх шаардлагатай — ternary БИШ, ердийн if. Ternary нь зөвхөн УТГА сонгодог, үйлдэл гүйцэтгэдэггүй.
Мөр нь дэлгэцээс хальж эхэлбэл — ердийн if бич.
Энэ бол Бүлэг 2-ын турш давтагдсан сургамжийн дахин нэг илрэл: мэргэжлийн код бол хамгийн богино код биш, харин хамгийн ойлгомжтой код юм. Comprehension, ternary, star unpacking — эдгээр бүгд хүчирхэг хэрэгслүүд, гэхдээ тэдгээрийн зорилго нь тодорхой байдлыг нэмэгдүүлэх явдал. Хэрэв тэд түүнийг бууруулж эхэлбэл, ашиглахаа боль.
Хэрэв сонирхвол: a = 1, b = 2, c = 3 гэсэн гурван хувьсагч үүсгээд, a, b, c = c, a, b гэж бичээд юу болохыг таамаглаад, дараа нь ажиллуулж шалгаарай. Гурван хувьсагчийг зэрэг эргүүлж болдгийг харах болно.
Мөн хүсвэл: Курс 1-ийн тоо таах тоглоомоо нээгээд, if/else-ээр хувьсагчид утга олгож байгаа хэсэг байвал түүнийг ternary болгож хувиргаад үзээрэй. Хувиргасны дараа код нь илүү тод болсон уу, эсвэл ойлгомжгүй болсон уу гэдгийг өөрөө шүүж үзээрэй — тэр шүүлт нь энэ хичээлийн хамгийн үнэ цэнэтэй дасгал юм.
1. Нэрсийн тоо таарахгүй байх (дутуу)
python
hun = ["Болд", 25, "Улаанбаатар"]
ner, nas = hunTraceback (most recent call last):
File "main.py", line 2, in <module>
ner, nas = hun
ValueError: too many values to unpack (expected 2)ValueError: too many values to unpack (expected 2) гэдэг нь "хоёр утга авахыг хүлээж байсан ч илүү олон утга ирлээ" гэсэн үг. Жагсаалтад гурван элемент байхад та зөвхөн хоёр нэр бичсэн. Python үлдсэн элементийг хаана хийхээ мэдэхгүй байна. Засвар: гурав дахь нэр нэм (ner, nas, hot = hun), эсвэл од ашигла (ner, nas, *uldsen = hun).
2. Нэрсийн тоо таарахгүй байх (илүү)
python
tsegleg = (10, 20)
x, y, z = tseglegTraceback (most recent call last):
File "main.py", line 2, in <module>
x, y, z = tsegleg
ValueError: not enough values to unpack (expected 3, got 2)not enough values to unpack (expected 3, got 2) гэдэг нь "гурван утга хүлээж байсан ч зөвхөн хоёр ирлээ" гэсэн үг. Одоо эсрэг тал нь: нэр илүү, утга дутуу. z -д юу олгохоо Python мэдэхгүй. Засвар: нэрсийн тоог утгын тоотой таарууллах.
3. Ternary-д else мартах
python
angilal = "тэгш" if too % 2 == 0 File "main.py", line 1
angilal = "тэгш" if too % 2 == 0
^
SyntaxError: invalid syntaxSyntaxError: invalid syntax — бичлэг буруу байна. Ternary-д else нь заавал байх ёстой. Логик нь тодорхой: ternary бол утга буцаах ёстой, гэтэл нөхцөл худал болбол ямар утга буцаах вэ? Хариулт байхгүй бол Python юу ч хийж чадахгүй. Хэрэв танд "нөхцөл үнэн бол л ямар нэг зүйл хий" гэсэн санаа хэрэгтэй бол ternary биш, ердийн if бич.
4. Ternary-г comprehension-ы буруу талд тавих
python
angilal = [for too in tootsuud "тэгш" if too % 2 == 0 else "сондгой"] File "main.py", line 1
angilal = [for too in tootsuud "тэгш" if too % 2 == 0 else "сондгой"]
^^^
SyntaxError: invalid syntaxTernary нь comprehension-ы ЗҮҮН талд, for-оос ӨМНӨ орно. Зөв бичлэг: ["тэгш" if too % 2 == 0 else "сондгой" for too in tootsuud].
5. Ternary дотор үйлдэл хийх гэж оролдох
python
ur_dun = print("тэгш") if too % 2 == 0 else print("сондгой")Энэ ажиллана — гэхдээ буруу хэрэглээ. print нь юу ч буцаадаггүй тул ur_dun нь None болно. Та ternary-г үйлдэл гүйцэтгэхэд ашиглаж, буцаасан утгыг нь хогийн саванд хаяж байна. Ийм үед ердийн if/else бичих нь зөв:
python
if too % 2 == 0:
print("тэгш")
else:
print("сондгой")Unpacking нь дараалалыг задалж, элемент бүрийг тусдаа нэрэнд олгодог: ner, nas, hot = hun.
Зүүн талын нэрсийн тоо баруун талын элементийн тоотой ЯГ таарах ёстой, эс тэгвээс ValueError.
Та үүнийг аль хэдийн ашиглаж байсан: zip, enumerate, items() дээрх хоёр нэр бүгд unpacking.
Swap: a, b = b, a — түр хувьсагч хэрэггүй.
Функц олон утга буцаах шиг харагдаж чадна (үнэндээ tuple буцаадаг), дараа нь unpacking-оор задална.
* нь "үлдсэн бүхэн" гэсэн утгатай: negdugeer, *uldsen = tootsuud. Нэг илэрхийлэлд ганц од.
Ternary: утга_A if нөхцөл else утга_B — нэг мөрөнд утга сонгох. else заавал байна.
Comprehension-д: for-ын АРД байгаа if нь ШҮҮНЭ (элемент хаяна), for-ын ӨМНӨ байгаа if...else нь ХУВИРГАНА (элемент хэвээр).
Хоёулаа богино, энгийн үед л ашиглах ёстой. Урт, үүрлэсэн үед ердийн бичлэг үргэлж дээр.
Бүлэг 2 дууслаа. Та одоо мэргэжлийн Python код уншихад хамгийн олон тааралддаг бичлэгүүдийг эзэмшлээ: comprehension, enumerate, zip, slicing, unpacking, ternary. Эдгээр нь шинэ хүч биш, харин шинэ хэл — та мэддэг зүйлээ илүү тод хэлж сурлаа.
Бүлэг 3-т бид function руу гүнзгий орно. Курс 1-д та function бичиж сурсан, гэхдээ маш энгийн хэлбэрээр нь л. Одоо та тэднийг уян хатан болгож сурна: параметрт анхдагч утга өгөх, нэрээр нь дуудах, дурын тооны аргумент хүлээж авах, scope гэж юу болохыг ойлгох, эцэст нь хамгийн чухал нь — function-ыг өөрийг нь УТГА болгож дамжуулах. Тэр сүүлчийн санаа бол Бүлэг 10-ын decorator руу хөтлөх хаалга юм.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.