Ачааллж байна...
Түвшин 2-ын сүүлчийн, хамгийн том бүлэгт тавтай морил. Эхлээд нэг асуудлыг нүдээр харцгаая — таны одоогийн мэдлэгийн нэг "тааз"-ыг. Ангийн гурван сурагчийн нэрийг хадгалъя гэвэл та юу хийх вэ? Гурван variable: suragch_1 = "Бат", suragch_2 = "Сараа", suragch_3 = "Дорж". Болж байна... гэтэл сурагч гуч байвал? Гучин variable. Тэгээд "бүх сурагчид мэндчил" гэвэл — гучин print. Шинэ сурагч элсвэл — код руугаа орж шинэ variable нэмнэ. Энэ зам явахгүй нь илт: бидэнд "гучин тусдаа хайрцаг" биш — нэг дор олон утга тээдэг нэг сав хэрэгтэй байна. Тэр сав бол list (жагсаалт) — Python-ы хамгийн их хэрэглэгддэг цуглуулгын төрөл бөгөөд өнөөдрийн баатар.
List таны хувьд шинэ танил биш гэдгийг хэлье — та түүнтэй гурван удаа зөрөглөсөн: range-ийн хичээлд print(list(range(...))) гэж "тасалбаруудыг жагсааж үзэх" аргад; return-ий хичээлд "олон утгыг нэг дор гардуулдаг сав" гэсэн амлалтад; split()-ийн гардуулалтад — ['алим', 'лийр', 'чавга'] гэсэн дөрвөлжин хаалттай тэр бүтэц. Өнөөдөр ёслол нь болно: list-ийг үүсгэж, доторхыг нь индексээр уншиж, len-ээр хэмжиж сурна. Тэгээд нэг сайхан мэдээ: өмнөх хичээлийн индексийн бүх мэдлэг — 0-тоолол, сөрөг индекс, len - 1, IndexError — энд шууд, өөрчлөлтгүй ажиллана: list бол мөн л "хэлхээ" — зөвхөн сувд нь үсэг биш, дурын утга байдаг хэлхээ юм.
List-ийг та бичиг баримтын ертөнцөөс төгс мэднэ: ангийн журнал дахь нэрсийн жагсаалт. Нэг хуудсан дээр, нэг гарчгийн дор, мөр бүр дугаартай: 1. Бат, 2. Сараа, 3. Дорж... Энэ жагсаалтын гурван чанар нь list-ийн гурван тулгуур юм. Нэг: нэг нэрийн дор олон зүйл — журнал бүхэлдээ "10а ангийн сурагчид" гэсэн ганц нэртэй: гучин тусдаа цаас биш, нэг жагсаалт. Хоёр: дугаартай, дараалалтай — "5 дугаарын сурагч" гэхэд хэн болох нь шууд тодорхой; дараалал нь санамсаргүй биш, утга тээдэг (журналд цагаан толгойгоор, оноогоор — ямар нэг журмаар эрэмбэлэгдсэн байдаг шиг). Гурав: нэг мөр нь бүхэл жагсаалтаа "төлөөлдөггүй" — жагсаалттай бүхэлд нь ч ажиллаж болно (хэдэн сурагчтай вэ гэж тоолох), нэг мөртэй нь ч ажиллаж болно (5 дугаарынхыг дуудах). Ганц зөрүү нь таны аль хэдийн мэддэг зүйл: журналын дугаарлалт 1-ээс, Python-ы индекс 0-ээс — "эхлэлээс хэр зайтай" гэсэн байшингийн зарчим энд хэвээрээ.
Гучин variable-ийн зовлонгоо нэг мөрөөр шийдье:
python
suragchid = ["Бат", "Сараа", "Дорж"]
print(suragchid)
print(suragchid[0])
print(suragchid[2])Үр дүн:
['Бат', 'Сараа', 'Дорж']
Бат
ДоржЭхний мөр — list үүсгэх бичиглэл: дөрвөлжин хаалт нээж, гишүүдээ таслалаар зааглан бичээд, хаалтаа хаана — тэгээд бүхэл савыг нэг variable-д (suragchid) хадгална. Дөрвөлжин хаалт энд хоёр дахь ажилтайгаа танилцуулж байна: индексээр хандахад (өмнөх хичээл) ашиглагддаг байсан тэр хаалт list үүсгэхэд ч ашиглагддаг — байрлалаар ялгана: нэрийн ард naaldsan бол хандалт (suragchid[0]), бие даан зогсож байвал үүсгэлт (["Бат", ...]). Хоёр дахь print бүхэл савыг хэвлэв — Python list-ийг яг үүсгэсэн дүрсээр нь (дөрвөлжин хаалт, таслал, string-үүд нь дан хашилттайгаар) харуулдаг: split-ийн гардуулалтыг харахад "сонин дүрстэй" санагдаж байсан бол одоо тэр дүрс уншигддаг боллоо. Гурав, дөрөв дэх мөрүүд — индексийн хандалт: suragchid[0] нь "Бат" (эхлэл дээрх), suragchid[2] нь "Дорж" (хоёр алхам цаанах) — string-ийн ner[0]-той яг ижил бичиглэл, яг ижил 0-тоолол: шинээр сурах юм алга, зөвхөн сувд нь үсэг биш бүтэн string болжээ.
Len() ч мөн хуучин ажлаа шинэ саван дээр хийнэ:
python
print(len(suragchid))Үр дүн: 3 — гишүүний тоо (тэмдэгтийн биш: "Бат" зургаан... гурван үсэгтэй нь хамаагүй — list-ийн хувьд тэр бол нэг гишүүн). Өмнөх бүлгийн "len string-ээс өөр юуг хэмжиж чаддаг вэ" гэсэн асуултын хариулт албан ёсоор: цуглуулгын гишүүдийг тоолдог — string-д тэмдэгт, list-д гишүүн. Тэгээд танил тулгалт: сүүлчийн индекс = len - 1: гурван гишүүнтэй жагсаалтын сүүлчийнх нь [2].
Хоёр дахь жишээ: юу ч тээж чадна. List-ийн гишүүд string байх албагүй — дурын төрөл, бүр холимог байж болно:
python
onoonuud = [95, 88, 91, 76]
holimog = ["Бат", 12, 1.58, True]
print(onoonuud[1])
print(onoonuud[0] + onoonuud[3])
print(holimog[-1])Үр дүн:
88
171
TrueОнооны жагсаалтын гишүүд int тул тэдэнтэй тоо шигээ ажиллана: onoonuud[0] + onoonuud[3] нь 95 + 76 = 171 — индексийн хандалт утгыг "задалж" өгдөг тул гарсан зүйл нь жирийн int: бүх тооны эрхтэй. Сөрөг индекс ч хуучнаараа: holimog[-1] — сүүлчийн гишүүн True. Холимог list болдог гэдгийг үзүүллээ — гэхдээ нэг зөвлөмж дагалдъя: бодит ажилд list-ээ нэг төрлийн гишүүдтэй байлгах нь дадал сайтай: "оноонуудын жагсаалт", "нэрсийн жагсаалт" — жагсаалт бүр нэг "юмны" цуглуулга байвал код уншигч (гурван долоо хоногийн дараах та!) гишүүн бүрээс юу хүлээхээ мэддэг. Холимог хэрэгцээ ("нэг хүний нэр, нас, өндөр нь хамт") бол үнэндээ өөр төрлийн савны ажил — dictionary: энэ бүлгийн сүүлийн хичээлүүдэд хүлээж байгаа.
Гурав дахь жишээ: гишүүн солих — string-ээс ялгарах их зааг. Өмнөх хичээлийн төгсгөлд тарьсан үрийг хураая. String дээр ner[0] = "Б" нь TypeError өгдөг байсан — list дээр:
python
suragchid = ["Бат", "Сараа", "Дорж"]
suragchid[1] = "Оюунаа"
print(suragchid)Үр дүн:
['Бат', 'Оюунаа', 'Дорж']Ажиллалаа! List бол өөрчлөгддөг (mutable) цуглуулга: [1] байрлалын "мөрөнд" шинэ нэр дарж бичихэд жагсаалт дуулгавартай өөрчлөгдөв — Сараа гарч Оюунаа орлоо. Бичиглэлийг ажигла: suragchid[1] = "Оюунаа" — зүүн талд индексийн хандалт, = тэмдэг, баруун талд шинэ утга: Бүлэг 4-ийн "хайрцганд шинэ юм хийхэд хуучин нь алга болдог" дүрэм жагсаалтын нэг мөрөнд үйлчилж байна: бусад гишүүд байрандаа. Энэ бол string ба list хоёрын хамгийн гүн зааг: string — уншигдана, өөрчлөгдөхгүй; list — уншигдана, өөрчлөгдөнө. Журналын зүйрлэлээр: хэвлэгдсэн ном (string) дээр засвар хийхгүй — шинээр хэвлэнэ; харандаагаар хөтөлдөг журнал (list) дээр баллуурдаж дарж бичнэ. "Яагаад хоёр өөр зантай юм бэ" гэсэн гүн асуултын хариу Бүлэг 14-ийн нутагт — өнөөдөртөө баримт нь хангалттай: жагсаалтын гишүүнийг индексээр нь сольж болно.
Дөрөв дэх жишээ: list программ дотор амьдрах нь. Бүх эд ангиа нэг жижиг бодит хэрэглээнд угсаръя — долоо хоногийн хоолны цэс:
python
tses = ["бууз", "хуушуур", "цуйван", "шөл", "пицца"]
print(f"Энэ долоо хоногт {len(tses)} өдрийн цэс бэлэн байна")
print(f"Даваа гарагт: {tses[0]}")
print(f"Сүүлчийн өдөр: {tses[-1]}")
udur = int(input("Хэд дэх өдрийн цэсийг харах вэ? (1-5) "))
print(f"{udur} дэх өдөр: {tses[udur - 1]}")3 гэж хариулбал:
Энэ долоо хоногт 5 өдрийн цэс бэлэн байна
Даваа гарагт: бууз
Сүүлчийн өдөр: пицца
Хэд дэх өдрийн цэсийг харах вэ? (1-5) 3
3 дэх өдөр: цуйванСүүлийн хоёр мөрөнд нэг чухал хөдөлгөөн байна: хэрэглэгч "хэд дэх" гэсэн хүний тооллоор (1-5) ярьдаг, Python "хэр зайтай" гэсэн индексээр (0-4) — хоёр ертөнцийн хооронд tses[udur - 1] гэсэн нэгийн гүүр тавигдав. Энэ "хүний тоо хасах нэг" тохируулга бол хэрэглэгчтэй харилцдаг list-программын байнгын хэв маяг: for loop-ын хичээлд toolol + 1 гэж гаралт дээр тохируулж байсан бол одоо оролт дээр урвуугаар нь. Гүүрээ мартвал юу болох вэ — хэрэглэгч 3 гэхэд tses[3] буюу дөрөв дэх өдрийн хоол гарна: алдааны мэдэгдэлгүй, чимээгүй нэгээр зөрсөн хариулт — off-by-one-ы хамгийн амьдралын дүр. (Тэгээд 5 гэвэл tses[5]... — тэр түүх алдаануудын хэсэгт.)
Хүсвэл туршаад үзээрэй: өөрийн дуртай таван киноны жагсаалт үүсгээд, эхний, сүүлчийн, дундахыг нь f-string-ээр хэвлээрэй. Сонирхвол len-ийг индекс дотор ажиллуулж үзээрэй: tses[len(tses) - 1] — "сүүлчийн гишүүн"-ий урт зам: [-1]-тэй ижил гардаг эсэхийг тулгах нь сөрөг индексийн "товчлол" гэдгийг list дээр дахин батална.
Алдаа 1: IndexError — хуучин танил шинэ нутагтаа. Цэсний жишээний "тэр түүх":
python
tses = ["бууз", "хуушуур", "цуйван", "шөл", "пицца"]
print(tses[5])Python:
IndexError: list index out of rangeОрчуулбал: "list-ийн индекс хүрээнээс халив" — string index байсан үг list index болж солигдсоноос өөр юу ч шинэгүй: таван гишүүнтэй жагсаалтын индексүүд 0-4, [5] гэдэг мөр журналд алга. Оношлогоо ч хуучнаараа: len-ээ хэвлэж индекстэйгээ тулга. Хамгийн олон гардаг хоёр дүр нь ч хуучин: tses[len(tses)] (уртаар нь индекслэх) ба хэрэглэгчийн орцоос ирсэн "шалгаагүй дугаар" — цэсний жишээний udur-д хэрэглэгч 9 гэж бичвэл tses[8] рүү халина: хамгаалалт нь Бүлэг 6-гийн хэрэгсэл — if udur < 1 or udur > len(tses): гэж хүрээг нь эхэлж шүү (тоо таах тоглоомын "хүрээний шалгалт" өргөтгөлийн ах дүү — тэнд or мужийн гадна ажиллаж байсныг сана).
Алдаа 2: Таслалаа мартах — гишүүд "наалдах". Үүсгэлтийн бичиглэлийн бүдрэлт:
python
suragchid = ["Бат" "Сараа", "Дорж"]
print(len(suragchid))
print(suragchid[0])Үр дүн:
2
БатСарааАлдааны мэдэгдэлгүй — гэхдээ гурван сурагч хоёр болчихлоо, эхнийх нь "БатСараа" гэдэг үлэмж нэртэй! Учир нь "Бат" "Сараа" хоёрын хооронд таслал мартагджээ — тэгэхэд Python хоёр зэрэгцсэн string-ийг автоматаар залгадаг ховор дүрэмтэй (+-гүй залгалт — урт бичвэрийг олон мөрөнд хувааж бичихэд зориулагдсан, эхлэгчид бараг хэрэглэдэггүй чадвар) — тиймээс алдаа биш "хоёр гишүүнтэй жагсаалт" гэж чимээгүй ойлгов. Оношлогооны шинж: len таны тоолсноос бага, аль нэг гишүүн "наалдмал" харагдвал — таслалаа тоол. Урт жагсаалт бичихдээ гишүүн бүрийг шинэ мөрөнд бичих (Python дөрвөлжин хаалт дотор мөр таслахыг зөвшөөрдөг) нь ийм алдааг нүдэнд ил болгодог сайн дадал.
Алдаа 3: List-ийг бүхэлд нь тоо шиг үзэх. Сав ба доторхын ялгааг андуурвал:
python
onoonuud = [95, 88, 91]
print(onoonuud + 5)Python:
TypeError: can only concatenate list (not "int") to listОрчуулбал: "list дээр зөвхөн list залгаж болно, int болохгүй" — таны Бүлэг 5-аас таньдаг мэдэгдлийн (str... to str) list-хувилбар: + тэмдэг list дээр мөн "залгалт" утгатай ([1, 2] + [3, 4] нь [1, 2, 3, 4] — хоёр жагсаалт нийлүүлэх хууль ёсны үйлдэл) тул "жагсаалт дээр тоо залгах" утгагүй захиалга болжээ. Бичигчийн жинхэнэ санаа юу байсныг таамаглавал хоёр хувилбар: "нэг гишүүн дээр нь 5 нэмэх" бол индексээ зааж onoonuud[0] + 5; "бүх гишүүн дээр 5 нэмэх" бол... нэг мөрөөр болохгүй — гишүүн бүр дээр очиж ажиллах хэрэгтэй: тэр ажлын хэрэгсэл нь list + for loop хослол — энэ бүлгийн гуравдугаар хичээлийн гол сэдэв. Дүрэм: сав ба доторх хоёр өөр түвшин — үйлдлээ аль түвшинд хийхээ эхэлж шийд: бүхэлд нь (len, хэвлэх, залгах) юу, гишүүнд нь (индексээр) юу.
List бол олон утгыг нэг дор, дараалалтай тээдэг сав: ["Бат", "Сараа", "Дорж"] — дөрвөлжин хаалт, таслал; гучин variable-ийн зовлонг нэг нэрээр шийддэг.
Индексийн бүх мэдлэг шууд ажиллана: [0] — эхнийх, [-1] — сүүлчийнх, сүүлчийн индекс = len - 1; len нь гишүүнийг тоолно.
List өөрчлөгддөг: suragchid[1] = "Оюунаа" — string-ийн TypeError-оос ялгаатай нь энд хууль ёсны: string уншигдана-өөрчлөгдөхгүй, list уншигдана-өөрчлөгдөнө.
Хэрэглэгчийн "хэд дэх" (1-ээс) ба индексийн "хэр зайтай" (0-ээс) хооронд [udur - 1] гүүр тавь — мартвал чимээгүй нэгээр зөрнө.
Гурван урхи: [len] буюу шалгаагүй орц — IndexError: list index out of range; таслал мартвал string-үүд чимээгүй наалдана; сав ба гишүүн хоёр түвшин — "бүх гишүүнд үйлдэл" бол loop-ын ажил.
Дараагийн хичээлд жагсаалт маань амьдардаг болно: append — гишүүн нэмэх, remove — хасах, sort — эрэмбэлэх: журналд шинэ сурагч бүртгэж, гарсныг нь хасаж, нэрсийг цагаан толгойгоор жагсаадаг бүрэн эрх таны гарт ирнэ. List-ийн авдар string-ийнхээс нэг гүн ялгаатай ажилладгийг тэнд бас нээнэ: эдгээр method-ууд шинийг гардуулдаггүй — савыг өөрийг нь өөрчилдөг юм.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.