Ачааллж байна...
Өнөөдрийн хичээл бол энэ бүлгийн зүрх — магадгүй бүхэл Түвшин 2-ын хамгийн их ажилладаг хослолын тухай. Өмнөх хоёр хичээлд бид жагсаалтыг үүсгэж, өсгөж, хасаж, эрэмбэлж сурсан — гэхдээ нэг том асуулт нээлттэй үлдсээр: жагсаалтын гишүүн бүр дээр очиж ажил хийе гэвэл? "Бүх сурагчид мэндчил", "бүх оноон дээр 5 нэм", "бүх үнийг хэвлэ" — цуглуулгатай программын жинхэнэ өдөр тутам яг ийм "бүх..." өгүүлбэрүүдээс бүтдэг. Таны одоогийн мэдлэгээр зам нь индексийн loop: for i in range(len(jagsaalt)): гээд jagsaalt[i]-ээр хандах — string-ийн индексийн хичээлд яг ингэж "хэлхээгээр алхаж" байсан. Ажиллана — гэхдээ Python-д үүнээс шулуун, цэвэрхэн зам бий бөгөөд тэр замыг л өнөөдөр эзэмшинэ: for гишүүн in жагсаалт: — индексгүйгээр, гишүүд дээр шууд алхдаг хэлбэр. Энэ бол string-ийн хичээлд "for usg in ug — дараагийн бүлэгт ёсоор нь үзнэ" гэж амласан тэр хэлбэр, мөн gerchilgee-г гурван мөрөөр дууддаг байсныг "loop-оор хийж болох уу" гэж эргэцүүлүүлсэн тэр мөрөөдлийн биелэл юм.
Нэг сайхан мэдээ: бичиглэлийн хувьд сурах шинэ юм бараг алга — for, in, хоёр цэг, шигдсэн бие: бүгд Бүлэг 7-ын танил эд анги. Шинэ зүйл нь утга нь: range-ийн оронд жагсаалт тавихад loop "тоо тоолохоо" больж "гишүүд дээр алхдаг" болно. Үнэндээ та нэг нууцыг одоо мэдэх эрхтэй: for i in range(5) гэдэг чинь угаасаа "range-ийн үйлдвэрлэсэн цувааны гишүүд дээр алхаж" байсан юм — та in-ийн ард жагсаалт тавьж болдгийг л мэдээгүй явсан хэрэг: өнөөдөр тэр хаалга нээгдэнэ.
Ангийн журналын зүйрлэлээ төгсгөлийн том дүрд нь оруулъя. Хичээлийн эхэнд багш ирц бүртгэнэ: журналаа нээгээд, эхний нэрнээс эхэлж, нэр бүрийг дээрээс доош дараалан дуудаж, нэр бүр дээр ижил ажил хийнэ ("байна уу?" гэж асууж, тэмдэглэнэ) — сүүлчийн нэр дуудагдмагц ирц дуусна. Энэ хөдөлгөөнийг ажигла: багш "нэг дэх мөр, хоёр дахь мөр" гэж дугаар тоолоод байгаа юм биш — түүний анхаарал нэрсэн дээр байгаа: "Бат... Дорж... Сараа..." Дугаар нь журналын бүтцэд бий л дээ — гэхдээ ирцийн ажилд хэрэггүй: ажил нь нэр бүр дээр хийгддэг болохоос дугаар дээр биш. For suragch in suragchid: гэдэг яг энэ хөдөлгөөн: loop тойрог бүрд дараагийн гишүүнийг гартаа авч, биед нь ажлыг хийлгэдэг — дугаарын тоолол Python-ы "далдад" явагдаж, таны нүдэнд зөвхөн гишүүд ирдэг. Индексийн зам (range(len(...))) бол "дугаараар нь дуудаад, дугаараар нь нэрийг нь хайдаг" тойруу зам — ажиллана, гэхдээ ирц бүртгэдэг багш тэгдэггүй шүү дээ.
Ирцээ бүртгэе:
python
suragchid = ["Бат", "Сараа", "Дорж"]
for suragch in suragchid:
print(f"{suragch} байна уу?")
print("Ирц дууслаа")Үр дүн:
Бат байна уу?
Сараа байна уу?
Дорж байна уу?
Ирц дууслааТолгой мөрөө задалъя: for suragch in suragchid: — in-ийн ард range биш жагсаалт зогсож байна; suragch бол давталтын variable — Бүлэг 7-ын i-гийн дүрийн залгамжлагч: тойрог бүрийн эхэнд loop дараагийн гишүүнийг энэ хайрцганд хийдэг. Мөшгье: тойрог 1 — suragch дотор "Бат", бие ажиллаж "Бат байна уу?"; тойрог 2 — suragch дотор "Сараа"...; гишүүд дуусмагц loop хаагдаж, шигдээгүй мөр биеллээ. Бүлэг 7-ын том дүрэм үг үсэг өөрчлөгдөлгүй энд ажиллаж байна: бие нь тогтмол, давталтын variable нь тойрог бүрд солигддог — зөвхөн солигдож буй утга нь range-ийн тоо биш, жагсаалтын гишүүн болжээ. Нэрлэлтийн нэг гоё дадал ил байна: жагсаалтын нэр олон тоон дээр (suragchid), давталтын variable нь ганц тоон дээр (suragch) — "сурагчид дундаас сурагч бүр" гэж мөр өөрөө өгүүлбэр шиг уншигдана: nom in nomnuud, une in unenuud... — энэ хос-нэрлэлт бол list+loop кодын уншигдах чанарын нууц.
Тэгээд амлалт биелүүлье — string дээр ч энэ хэлбэр ажилладаг:
python
ug = "Бат"
for usg in ug:
print(usg)Үр дүн: Б, а, т — гурван мөрөнд. String бол тэмдэгтийн хэлхээ тул for түүгээр ч "алхаж" чадна: индексийн хичээлийн range(len(ug)) + ug[i] хэлбэр "индекс нь өөрөө хэрэгтэй үеийн" хувилбар болж үлдээд, "зүгээр л тэмдэгт бүр дээр" гэсэн энгийн хэрэгцээнд энэ шулуун зам зохино.
Хоёр дахь жишээ: хуримтлуулагчтай хамт — дундаж оноо. List + loop + хуримтлуулагч гурвал бол өгөгдөл боловсруулалтын "ариун гурвал":
python
onoonuud = [88, 95, 76, 91]
niilber = 0
for ono in onoonuud:
niilber = niilber + ono
dundaj = niilber / len(onoonuud)
print(f"Нийлбэр: {niilber}, дундаж: {dundaj}")Үр дүн:
Нийлбэр: 350, дундаж: 87.5Мөшгье — хоёр хайрцгаа зэрэг: тойрог 1: ono = 88, niilber = 88; тойрог 2: ono = 95, niilber = 183; тойрог 3: 259; тойрог 4: 350. Loop-ын дараа нийлбэрээ гишүүний тоонд (len!) хувааж дундаж гаргав — / үйлдлийн float гардуулалт (87.5) энд яг зохистой байрандаа. Бүлэг 7-ын niilber = niilber + i хэв маягтай зэрэгцүүлбэл ялгаа нь ганц үг: i-гийн оронд ono — тоолуурын тоо биш жинхэнэ өгөгдөл хуримтлагдаж байна: энэ л жижиг шилжилт хуримтлуулагчийг "дасгалын" хэрэгслээс "бодит" хэрэгсэл болгодог — дэлгүүрийн нийт дүн, ангийн дундаж, сарын зарлага: бүгд яг энэ гурван мөр.
Гурав дахь жишээ: loop + if — шүүж алхах. Гишүүн бүр дээр очих нь "гишүүн бүрд ижил хандах" гэсэн үг биш — биед if суулгаж ялгаварлаж болно:
python
onoonuud = [88, 95, 76, 91, 59]
tentssen = 0
for ono in onoonuud:
if ono >= 60:
print(f"{ono} — тэнцсэн")
tentssen = tentssen + 1
else:
print(f"{ono} — тэнцээгүй")
print(f"Нийт {len(onoonuud)}-аас {tentssen} нь тэнцэв")Үр дүн:
88 — тэнцсэн
95 — тэнцсэн
76 — тэнцсэн
91 — тэнцсэн
59 — тэнцээгүй
Нийт 5-аас 4 нь тэнцэвГурван давхар бүтэц — for-ын биед if, if-ийн биед мөрүүд: шигдэлтийн хоёр шат (Бүлэг 7-ын break+if бүтцийн танил зураг). Тоолуур (tentssen) энд "нөхцөлт хуримтлуулагч" болж байна: бүх тойрогт биш зөвхөн нөхцөл биелсэн тойрогт л өсдөг — "хэдэн гишүүн нь тийм бэ" гэсэн асуултын стандарт жор. List + loop + if + тоолуур: дөрвөн бүлгийн дөрвөн хэрэгсэл нэг богино программд — ийм "давхарласан энгийн зүйлс" бол жинхэнэ программын жинхэнэ төрх юм.
Дөрөв дэх жишээ: gerchilgee-гийн мөрөөдөл биелэв. Function-ий хичээлийн гурван мөрөн дуудлагыг саная — одоо:
python
def gerchilgee(ner):
print("------------------------------")
print(f"ГЭРЧИЛГЭЭ: {ner} танд олгов")
print("------------------------------")
suragchid = ["Бат", "Сараа", "Дорж", "Оюунаа", "Ану"]
for suragch in suragchid:
gerchilgee(suragch)Таван сурагч — таван бүрэн гэрчилгээ — харин дуудлагын код: хоёрхон мөр. Сурагч хорь, зуу болсон ч энэ хоёр мөр өөрчлөгдөхгүй — жагсаалт л урт болно: "код өгөгдлөөсөө салангид" гэсэн энэ чанар бол list+loop хослолын хамгийн гүн бэлэг. Давталтын variable function-ий argument болж очиж байгааг ажигла: gerchilgee(suragch) — тойрог бүрд өөр нэр дамжина: loop нь "хэн хэнд" гэдгийг, function нь "юу хийхийг" хариуцаж — хоёр хэрэгсэл хоёр ажлаа цэвэрхэн хуваалцав. Өмнөх хичээлийн "бүх гишүүн дээр 5 нэмэх" бодлого ч одоо унших төдий боллоо: for ono in onoonuud: дотроо shine.append(ono + 5) — шинэ саванд цуглуул (яагаад шинэ саванд гэдгийг доорх гурав дахь алдаа тайлбарлана).
Тав дахь жишээ: in-ийн хоёр дүр. Өмнөх хичээлд remove-ын хамгаалагчаар танилцсан in энэ хичээлд хоёр дүрээрээ зэрэгцэж байна — ялгааг нь тодруулъя:
python
jimsnuud = ["алим", "лийр", "чавга"]
for jims in jimsnuud:
print(jims)
if "лийр" in jimsnuud:
print("Лийр байна шүү!")Нэг үг — хоёр өөр ажил. For-ын in бол бичиглэлийн эд анги: "жагсаалт дундуур" гэсэн зааглагч — асуулт биш, хариултгүй. If-ийн in бол асуулт: "лийр саванд бий юу?" — bool гардуулдаг жинлүүрийн шинэ гишүүн (харьцуулах операторуудын нөхөр): True тул салаа биелэв. Хоёулаа "дотор нь" гэсэн нэг санааны үр удам тул нэг үгээр бичигддэг нь Python-ы санаатай гоо зүй — контекстээс нь (for-ын ард уу, нөхцөлийн дунд уу) ялгана. If x in jagsaalt: хэлбэр бол loop бичилгүйгээр "байна уу?" гэж асуудаг товчлол: далдад нь Python өөрөө гишүүд дээр алхаж хайдаг — таны бичих байсан loop-ыг өмнөөс чинь хийдэг гэсэн үг.
Хүсвэл туршаад үзээрэй: өмнөх хичээлийн "дуртай хоолны цуглуулагч" программдаа төгсгөлийн хэсэг нэмээрэй — цугласан жагсаалтаараа loop хийж хоол бүрийг f-string-тэй, дугаартай хэвлэдэг (дугаар хэрэгтэй бол тоолуур хөтлөөрэй: too = too + 1). Сонирхвол нэг loop дотор хоёр жагсаалт "зэрэгцүүлэн" алхаж болох уу гэж бодоод үзээрэй — нэрс ба оноонууд хоёр тусдаа саванд байвал: индексийн зам (range(len(...)) + хоёуланд нь [i]) энд л жинхэнэ хэрэгтэй болдгийг өөрөө нээх байх — "индекс нь өөрөө хэрэгтэй үед" гэсэн хуваарийн нэг том тохиолдол энэ.
Алдаа 1: Давталтын variable-ийг өөрчлөөд жагсаалт өөрчлөгдөнө гэж найдах. Өнөөдрийн хамгийн гүн урхи:
python
onoonuud = [88, 95, 76]
for ono in onoonuud:
ono = ono + 5
print(onoonuud)Үр дүн:
[88, 95, 76]Оноонууд өсөөгүй! Учир нь давталтын variable бол гишүүний хуулбар агуулдаг хайрцаг: тойрог бүрд Python гишүүний утгыг ono-д хуулж өгдөг (Бүлэг 4-ийн "хайрцагнаас хайрцагт хуулах" — хуулбарууд холбоогүй!) — ono = ono + 5 нь тэр хуулбарыг л өсгөөд, тойрог дуусахад хуулбар нь хаягдана: жагсаалт дахь эх утга хөндөгдөөгүй. Ирцийн зүйрлэлээр: багш "Бат" гэж дуудаад өөрийн аманд "Батаа" гэж өөрчилсөн ч журналд Бат хэвээрээ. Тэгвэл жинхэнэ өсгөлт яаж хийх вэ — хоёр зөв зам: индексээр (for i in range(len(onoonuud)): дотроо onoonuud[i] = onoonuud[i] + 5 — саванд нь шууд дарж бичих: индексийн оноолт савыг өөрчилдөг гэдгийг эхний хичээлээс мэднэ) эсвэл шинэ сав (хоосон list + append(ono + 5) цуглуулгач). Дүрэм: давталтын variable уншихад — төгс, жагсаалтыг өөрчлөхөд — хүчингүй.
Алдаа 2: Loop-ын дундуур жагсаалтаасаа хасах. Бүр аюултай хөдөлгөөн — алхаж буй шатаа буулгах:
python
nersuud = ["Бат", "Сараа", "Дорж", "Ану"]
for ner in nersuud:
nersuud.remove(ner)
print(nersuud)Үр дүн:
['Сараа', 'Ану']"Бүгдийг хасна" гэсэн санаа — тал нь үлдчихлээ, тэгээд алдааны мэдэгдэлгүй! Юу болов: loop "одоо хэд дэх байрлал дээр байна" гэсэн дотоод тэмдэглэгээтэй алхдаг — Батыг хасмагц үлдсэн гишүүд дээшилж нягтарсан (өмнөх хичээлийн remove-ын журам) тул Сараа [0] байрлалд шилжсэн... гэтэл loop "би [0]-ыг үзчихсэн" гээд [1] рүү алхаж — Сарааг алгаслаа: хасалт бүр нэг гишүүн "үсэргэдэг". Ирцийн зүйрлэлээр: багш дуудсан нэрээ баллуурдаад дараагийн мөрийн дугаар руу харахад нэрс нь дээшээ гулсчихсан байгаа юм. Дүрэм: алхаж буй жагсаалтаасаа loop дотроо бүү хас (бүү нэм ч) — "шүүж үлдээх" хэрэгцээ бол шинэ сав + append-ийн ажил: for ner in nersuud: дотроо if нөхцөл: shine.append(ner) — эх жагсаалт хөндөгдөхгүй, шүүгдсэн нь шинэ саванд. (Хоосолгох л зорилготой байсан бол loop огт хэрэггүй — түүнд зориулсан тусдаа method бий: nersuud.clear() — сонирхвол туршаарай.)
Алдаа 3: Давталтын variable-д жагсаалтынхаа нэрийг өгөх. Нэрлэлтийн осол:
python
suragchid = ["Бат", "Сараа", "Дорж"]
for suragchid in suragchid:
print(suragchid)
print(len(suragchid))Python (сүүлийн мөрөнд):
TypeError: object of type 'str' has no len()...үгүй ээ — len string дээр ажилладаг тул алдаа ч гарахгүй: 4 гэж хэвлэнэ ("Дорж" дөрвөн үсэгтэй)! Юу болов: for suragchid in suragchid: — давталтын variable-д жагсаалтынхаа нэрийг өгснөөр тойрог бүрд тэр нэрэн дээр гишүүн дарж бичигдэж (Бүлэг 4: шинэ утга хуучныг дардаг), loop дуусахад suragchid дотор жагсаалт биш сүүлчийн гишүүн ("Дорж") үлджээ — жагсаалт маань нэргүй болж "төөрөв". Дараагийн len(suragchid) нь жагсаалтын гурвыг биш стringийн дөрвийг тоолсон нь тэр: алдаагүй, гэхдээ утга нь сүйрсэн — хамгийн зальтай ангиллын гажуудал. (Loop өөрөө яагаад гацалгүй гурван тойргоо гүйцээв гэдэг нь Python-ы дотоод нюанс — loop эхлэхдээ жагсаалтаа "барьчихдаг" тул нэр нь дарагдсан ч алхалт дуусдаг.) Хамгаалалт нь эхний жишээний дадал: олон тоо — ганц тоо хос-нэрлэлт (suragchid — suragch): хоёр нэр угаасаа өөр байхаар зохион байгуулагдана. Loop-ын дараа жагсаалт чинь "string болчихсон" байвал — толгой мөрөндөө нэрсээ шалга.
for гишүүн in жагсаалт: — индексгүйгээр гишүүд дээр шууд алхдаг хэлбэр: бие тогтмол, давталтын variable-д тойрог бүрд дараагийн гишүүн ирнэ; string дээр ч ажиллана (тэмдэгт бүрээр).
Нэрлэлтийн дадал: жагсаалт олон тоон дээр, давталтын variable ганц тоон дээр (suragchid → suragch) — мөр өгүүлбэр шиг уншигдаж, нэр дарагдах ослоос хамгаална.
Гурван их хэв маяг: хуримтлуулагч (нийлбэр/дундаж), loop+if шүүлт ба нөхцөлт тоолуур, loop дотроос function дуудах (өгөгдөл код хоёр салангид).
In хоёр дүртэй: for-ын in — бичиглэлийн зааглагч; нөхцөл дэх in — "дотор нь бий юу?" гэсэн bool асуулт.
Гурван урхи: давталтын variable бол хуулбар — түүнийг өөрчилснөөр жагсаалт өөрчлөгдөхгүй (индексээр эсвэл шинэ саваар засварла); алхаж буй жагсаалтаасаа loop дотор бүү хас — гишүүн "үсэрнэ"; жагсаалтын нэрээ давталтын variable болговол жагсаалт "төөрнө".
Дараагийн хичээлд энэ бүлгийн хоёр дахь том сав гарч ирнэ: dictionary — "дугаараар" биш "нэрээр" хадгалдаг цуглуулга. "Нэг хүний нэр, нас, өндөр нь хамт" гэсэн, list-ийн хичээлд "өөр төрлийн савны ажил" гэж хойшлуулсан тэр хэрэгцээ тэнд эзнээ олно: утга бүр өөрийн "түлхүүртэй" — suragch["nas"] гэж дугаар биш үгээр ханддаг ертөнц.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.