Ачааллж байна...
Өмнөх хичээлд бид list-ийг үүсгэж, уншиж, гишүүнийг нь сольж сурлаа. Гэхдээ бодит жагсаалтын амьдрал соливолтоор дуусдаггүй: журналд шинэ сурагч бүртгэгдэнэ, шилжсэн нь хасагдана, нэрс шалгалтын өмнө эрэмбэлэгдэнэ. Өнөөдөр бид list-ийн авдрыг нээж, тэр гурван ажлын багажийг гаргаж авна: append (нэмэгч), remove (хасагч), sort (эрэмбэлэгч). Авдар гэсэн үг чихэнд танил байгаа биз: string-ийн хичээлд танилцсан цэгэн бичиглэл (method) энд бүрэн хүчинтэй — suragchid.append("Оюунаа") — цэг нь "өөрийнх нь авдраас" гэсэн тэр л тэмдэг: list бол өөр төрөл тул өөр авдартай — string-ийн авдарт upper байдаг бол list-ийнхэд append байдаг гэсэн үг.
Гэхдээ энэ хичээлд нэг гүн ялгаа нээгдэнэ — өмнөх хичээлийн төгсгөлд дохио өгсөн тэр ялгаа. String-ийн method-ууд "гардуулдаг тогооч" нар байсан: эх string-ээ хөндөлгүй шинийг гардуулдаг, тиймээс ner = ner.strip() гэж дарж хадгалдаг байсан. List-ийн эдгээр method-ууд эсрэг зарчмаар ажилладаг: тэд шинийг гардуулдаггүй — савыг өөрийг нь өөрчилдөг. Яагаад ийм хоёр өөр ертөнц вэ гэдэг нь санамсаргүй биш: string үл өөрчлөгддөг тул method нь шинийг гардуулахаас өөр аргагүй; list өөрчлөгддөг тул method нь шууд дотор нь ажиллачихдаг. Өмнөх хичээлийн "ном ба журнал" зүйрлэл энд үргэлжилж байна: номын засвар шинэ хэвлэл төрүүлдэг, журналын засвар журналдаа л хийгддэг. Энэ ялгааг мартах нь өнөөдрийн хамгийн том урхи тул жишээ бүр дээр "савны байдлыг" мөшгиж, алдаануудын хэсэгт нүүр тулж үзнэ.
Ангийн журналаа гартаа авъя — энэ удаад харандаа, баллууртайгаа. Гурван үйлдэл: бүртгэх — шинэ сурагч ирэхэд нэрийг нь жагсаалтын төгсгөлд нэмж бичнэ (дундуур нь шахаж бичдэггүй — дараагийн хоосон мөрөнд); хасах — гарсан сурагчийн нэрийг нэрээр нь олж баллуурдана (мөрийн дугаараар биш — "Сараа гарлаа" гэж хэлдэг болохоос "хоёрдугаар мөрийнх гарлаа" гэдэггүй), тэгээд доорх нэрс дээшилж нягтарна — хоосон нүх үлддэггүй; эрэмбэлэх — хагас жилийн эцэст нэрсийг цагаан толгойн дарааллаар шинээр жагсаана. Гурван үйлдлийн дараа гартаа байгаа зүйл мөн л тэр журнал — шинэ дэвтэр төрөөгүй, хуучин нь өөрчлөгдсөн. Append/remove/sort гурав яг эдгээр хөдөлгөөнүүд: төгсгөлд нэмэх, нэрээр хасах, дотроо эрэмбэлэх — гурвуулаа журналдаа л ажилладаг.
Хоосон журналаас эхэлж, өсөлтийг нь алхам бүрд мөшгье:
python
suragchid = []
print(suragchid)
suragchid.append("Бат")
print(suragchid)
suragchid.append("Сараа")
suragchid.append("Дорж")
print(suragchid)
print(len(suragchid))Үр дүн:
[]
['Бат']
['Бат', 'Сараа', 'Дорж']
3Эхний мөр — хоосон list: [] — тэг гишүүнтэй сав: string-ийн хичээлийн хоосон ""-ийн list-дүр — "хараахан юу ч бүртгэгдээгүй" төлөв: жагсаалт хөтөлдөг бараг бүх программ яг ингэж, хоосон савнаас эхэлдэг (тоолуурын score = 0 эхлүүлэлтийн цуглуулга-хувилбар гэж бодож болно). Дараа нь append ажиллаж эхэллээ: suragchid.append("Бат") — "suragchid савны төгсгөлд "Бат"-ыг нэм." Хэвлэлтүүдийг ажигла: сав алхам бүрд өсөж байна — [] → ['Бат'] → гурван гишүүн. Тэгээд нэг зүйлийг онц анхаараарай: бид нэг ч удаа дарж хадгалаагүй — suragchid = suragchid.append(...) гэж бичээгүй: append савыг өөрийг нь өөрчилдөг тул гардуулалт хүлээх юм байхгүй — дуудаад л болоо. (Дарж хадгалбал юу болох вэ — өнөөдрийн гол урхи: алдаануудын хэсэгт.) Нэмэгдэлт үргэлж төгсгөлд очдгийг гурав дахь хэвлэлт баталж байна: Бат эхэндээ, сүүлд нэмэгдсэн Дорж сүүлд нь — журналын "дараагийн хоосон мөр" зарчим.
Append-ийн жинхэнэ хүч loop-той нийлэхэд нээгддэг — хэрэглэгчээс жагсаалт "цуглуулъя":
python
nersiin_jagsaalt = []
for i in range(3):
ner = input("Нэр оруулна уу: ")
nersiin_jagsaalt.append(ner)
print(nersiin_jagsaalt)Гурван тойрог — гурван асуулт — гурван append: хэрэглэгчийн орцууд саванд нэг нэгээр хуримтлагдав. Энэ бол хуримтлуулагч хэв маягийн (niilber = niilber + i — Бүлэг 7) цуглуулгын хувилбар: тэнд тоо нэмэгддэг байсан бол энд гишүүн нэмэгддэг — "loop-оор цуглуулж, дараа нь ашиглах" энэ бүтэц бол бодит программын хамгийн түгээмэл хөдөлгөөнүүдийн нэг: return-ий хичээлийн "олон утга цуглуулж гардуулах" бодлого ч одоо шийдэгдэх боллоо — function дотроо хоосон list үүсгэж, loop-оор append хийгээд, савыг бүхэлд нь return хий.
Хоёр дахь жишээ: remove — нэрээр хасагч. Сараа шилжлээ:
python
suragchid = ["Бат", "Сараа", "Дорж", "Оюунаа"]
suragchid.remove("Сараа")
print(suragchid)
print(suragchid[1])Үр дүн:
['Бат', 'Дорж', 'Оюунаа']
Доржremove("Сараа") — "энэ утгатай гишүүнийг олж хас": индексээр биш, утгаар нь хайдаг — журналын "нэрээр нь баллуурдах" хөдөлгөөн. Хоёр дахь хэвлэлтэд нэг чухал үр дагавар харагдаж байна: Сарааг хассаны дараа [1] индекст Дорж ирчихлээ — доорх гишүүд дээшилж нягтарсан: журналд хоосон мөр үлддэггүй шиг list-д "нүх" үлддэггүй. Энэ нягтралт нь ашигтай (жагсаалт үргэлж цул) боловч нэг сэрэмж дагуулна: хасалтын дараа хуучин индексүүдэд найдаж болохгүй — "Дорж [2]-т байгаа" гэсэн мэдлэг чинь хасалтаар хуучирчээ. Бас нэг нюанс: жагсаалтад "Сараа" хоёр байсан бол remove зөвхөн эхнийхийг нь хасдаг — "олдсон эхний тохирлоо баллуурдаад зогсоно" гэсэн журамтай.
Гурав дахь жишээ: sort — эрэмбэлэгч. Хагас жилийн эцэс боллоо:
python
onoonuud = [88, 95, 76, 91]
onoonuud.sort()
print(onoonuud)
suragchid = ["Дорж", "Бат", "Сараа"]
suragchid.sort()
print(suragchid)Үр дүн:
[76, 88, 91, 95]
['Бат', 'Дорж', 'Сараа']sort() — "савныхаа гишүүдийг өсөх эрэмбээр шинээр жагсаа": тоонууд багаас их рүү, string-үүд цагаан толгойн дарааллаар (Бүлэг 6-гийн туршилтын амттаныг санаж байна уу — "алим" > "банана" гэж string-үүдийг толь бичгийн жингээр жинлэж болдог гэсэн — тэр жинлүүр яг энд sort-ын дотор ажиллаж байгаа юм). Мөн л дарж хадгалалт алга — сав дотроо эрэмбэлэгдэв: хуучин дараалал үгүй боллоо гэдгийг анзаар — sort бол "эрэмбэлсэн хуулбар харуулах" биш "жагсаалтаа эрэмбэлэх" үйлдэл: хуучин дараалал чинь хэрэгтэй байсан бол sort-оос өмнө хуулж авах ёстой байсан (Бүлэг 4-ийн "хаяхаасаа өмнө нүүлгэ" дүрмийн цуглуулга-дүр). Буурах эрэмбэ хэрэгтэй бол sort-д нэг тусгай "нэртэй" argument өгдөг: onoonuud.sort(reverse=True) — reverse (урвуу) гэдэг нэрийг нь дурдаж True өгөхөөр эрэмбэ их→бага болно: [95, 91, 88, 76]. (Нэрээр нь өгдөг argument гэдэг шинэ бичиглэл байна — position биш нэрээр таардаг тусгай хэлбэр: одоохондоо энэ ганц хэрэглээг нь "жор" болгож аваад явъя.)
Дөрөв дэх жишээ: гурвуулаа нэг амьдралд. Жижиг бүртгэлийн систем — байдлыг алхам бүрд мөшгинө:
python
burtgel = []
burtgel.append("Бат")
burtgel.append("Дорж")
burtgel.append("Сараа")
print(f"Бүртгэл: {burtgel}")
burtgel.remove("Дорж")
print(f"Дорж гарав: {burtgel}")
burtgel.append("Ану")
print(f"Ану ирэв: {burtgel}")
burtgel.sort()
print(f"Эрэмбэлэв: {burtgel}")
print(f"Нийт {len(burtgel)} сурагч, эхнийх нь {burtgel[0]}")Үр дүн:
Бүртгэл: ['Бат', 'Дорж', 'Сараа']
Дорж гарав: ['Бат', 'Сараа']
Ану ирэв: ['Бат', 'Сараа', 'Ану']
Эрэмбэлэв: ['Ану', 'Бат', 'Сараа']
Нийт 3 сурагч, эхнийх нь АнуДөрвөн үйлдэл — дөрвөн байдал: сав нэг л (burtgel), доторх нь амьдарч байна. Гурав дахь хэвлэлтийг ажигла: Ану төгсгөлд нэмэгдсэн (append-ийн журам) — эрэмбэ алдагдсан мэт... тэгээд sort нэг дуудлагаар цэгцлэв: "нэмэлт нь төгсгөлд, эрэмбэ нь хэрэгтэй үедээ" гэсэн энэ хоёр үйлдлийн хуваарь бодит бүртгэлийн программуудын ердийн хэмнэл юм. Мөр бүрийн дараа байдлаа хэвлэж мөшгих энэ дадал бол Бүлэг 4-өөс тогтсон "variable-тай кодыг байдал хөтөлж уншдаг" аргын list-хувилбар: list-тэй код бичихдээ эргэлзсэн газраа print(жагсаалт) — сав чинь өөрөө хариулна.
Хүсвэл туршаад үзээрэй: дуртай хоолнуудынхаа хоосон жагсаалтыг while True + break loop-оор дүүргэдэг программ бичээрэй — "дуусмагц 'боллоо' гэж бичээрэй" гээд, боллоо ирэхэд break, эцэст нь эрэмбэлээд хэвлэ: Бүлэг 7, 9, 10-ын мэдлэг нэг саванд. Сонирхвол remove-ын "зөвхөн эхнийхийг хасдаг" журмыг туршаарай: ["а", "б", "а"] жагсаалтаас "а"-г remove хийгээд юу үлдэхийг таамаглаад Run.
Алдаа 1: append-ийн "гардуулалтыг" дарж хадгалах. Өнөөдрийн гол урхи — string-ийн дадал list-д уршиг болох нь:
python
suragchid = ["Бат", "Сараа"]
suragchid = suragchid.append("Дорж")
print(suragchid)Үр дүн:
NoneЖагсаалт бүхэлдээ алга болов! Задалъя: string-ийн ертөнцөд ner = ner.strip() гэж дарж хадгалдаг байсан дадлаараа suragchid = suragchid.append(...) гэж бичжээ — гэтэл append бол гардуулдаггүй тогооч: ажлаа савандаа хийгээд None "гардуулдаг" (return-гүй function None гардуулдаг — Бүлэг 8-ын дүрэм method-уудад ч хүчинтэй). Тэгэхээр энэ мөр хоёр алхамаар сүйрэл болов: эхлээд append ажиллаж Дорж саванд орж (!) — дараа нь = тэмдэг тэр савыг бүхэлд нь None-оор дарж бичив: Бүлэг 4-ийн "шинэ утга хуучныг устгадаг" дүрэм энд жагсаалтыг залгилаа. Оношлогооны шинж танил: гарц дээр None харагдвал — энэ удаад "return мартагдсан" биш "дарж хадгалах ёсгүйг дарж хадгалсан" гэсэн онош нэмэгдлээ. Дүрэм болгож хоёр ертөнцөө зааглая: string-ийн method — гардуулна, дарж хадгал (ner = ner.strip()); list-ийн эдгээр method — дотроо өөрчилнө, дуудаад л орхи (suragchid.append(...)).
Алдаа 2: Байхгүй гишүүнийг remove хийх. Журналд байхгүй нэрийг баллуурдах гэвэл:
python
suragchid = ["Бат", "Сараа"]
suragchid.remove("Дорж")Python:
ValueError: list.remove(x): x not in listОрчуулбал: "ValueError: remove-д өгсөн x жагсаалтад алга." Танил төрлийн алдаа — int("арван хоёр")-ын хичээлийн ValueError-ын садан: төрөл нь зөв (remove string хүлээж авдаг, string өглөө) — гэхдээ утга нь ажиллах боломжгүй: тийм гишүүн үнэндээ байхгүй. Энэ алдаа бодит амьдралд бараг үргэлж хэрэглэгчийн орцоос ирдэг: "хасах нэрээ бичнэ үү" гэхэд хэрэглэгч үсгийн алдаатай, том үсэгтэй, далд зайтай бичих... — input-ын бүх танил зовлон энд ValueError болж дэлбэрдэг. Хамгаалалт нь Python-ы нэг тансаг, шинэ хэрэгсэл: in — "дотор нь бий юу?" гэсэн асуулт: if "Дорж" in suragchid: гэвэл bool хариу (True/False) өгнө — хасахаасаа өмнө шалгаад, байхгүй бол эелдэг мэдэгдэл хэвлэ. In бол өөрөө бүлээн танилцуулга дутсан том хэрэгсэл — дараагийн хичээлд loop-той хамт бүрэн дүрээрээ гарч ирнэ; өнөөдөртөө "remove-ын хамгаалалтын нөхөр" гэсэн нэг дүрээр нь аваад явъя.
Алдаа 3: sort-ын хольцонд гацах. Холимог жагсаалтын үнэ энд төлөгдөнө:
python
holimog = [3, "Бат", 1]
holimog.sort()Python:
TypeError: '<' not supported between instances of 'str' and 'int'Орчуулбал: "str ба int хооронд < үйлдэл дэмжигдэхгүй." Sort дотроо гишүүдийг хооронд нь жинлэж (< асуултаар) эрэмбэлдэг — гэтэл "Бат" ба 3 хоёрыг жинлүүрт зэрэг тавихаар... аль нь "бага" юм бэ? Утгагүй асуулт — Python ч тэгж хэлээд зогсов. Мэдэгдэлд < тэмдэг дурдагдаж байгааг ажигла: sort-ын "дотоод ажил" илчлэгдэж байна — method-ууд дотроо таны мэддэг л үйлдлүүдийг хийдэг гэсэн жижиг цонх. Энэ алдаа бол өмнөх хичээлийн "жагсаалтаа нэг төрлийн гишүүдтэй байлга" зөвлөмжийн албан ёсны шалтгаан нь: нэг төрлийн саванд sort үргэлж ажиллана, холимогт — эрэмбийн жинлүүр гацна. Онош нь тодорхой учраас засвар нь ч тодорхой: жагсаалтаа хэвлэж хараад "гадны төрлийн" гишүүнийг ол — ихэвчлэн append-ээр орсон "12" (тоо гэж бодсон string — int() мартагдсан input-ын үр!) байдаг.
List-ийн гурван багаж: append(x) — төгсгөлд нэмнэ, remove(x) — утгаар нь олж эхний тохирлыг хасна (доорхи нь нягтарна), sort() — дотроо эрэмбэлнэ (reverse=True — буурах).
Гүн ялгаа: string-ийн method гардуулдаг (дарж хадгал), list-ийн эдгээр method савыг өөрчилдөг (дуудаад орхи) — suragchid = suragchid.append(...) бол жагсаалтаа None-оор дардаг сүйрэл.
Хоосон [] сав + loop доторх append = цуглуулагч хэв маяг: хуримтлуулагчийн цуглуулга-хувилбар, "олон утга гардуулах" бодлогын шийдэл.
Remove-ын өмнө in-ээр шалга (if x in jagsaalt:) — байхгүйг хасвал ValueError: x not in list; хэрэглэгчийн орц бол гол эх үүсвэр.
Sort холимог төрөлд гацдаг (TypeError: '<' not supported...) — жагсаалтаа нэг төрлийн гишүүдтэй байлгах зөвлөмжийн албан ёсны шалтгаан.
Дараагийн хичээл бол энэ бүлгийн зүрх: list ба for loop хамтдаа — "бүх гишүүн дээр очиж ажил хий" гэсэн, бодит программын хамгийн их давтагддаг хөдөлгөөн. Өмнөх хичээлийн "бүх гишүүн дээр 5 нэмэх" бодлого, gerchilgee-г гурван хүнд гурван мөрөөр дууддаг байсан "мөрөөдөл", string-ийн for usg in ug амлалт — бүгд тэнд нэг дор биелнэ: for suragch in suragchid: гэсэн, индексгүй, шууд алхдаг тэр гоё хэлбэр таныг хүлээж байна.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.