Ачааллж байна...
Түвшин 2: Барилга материал-д тавтай морил. Энэ Түвшний нэрийг зориуд ингэж сонгосон: Түвшин 1-д та программын "үндсийг" — хадгалах, ярилцах, шийдэх — эзэмшсэн бол одоо жинхэнэ барилгын материалууд ирж эхэлнэ: давталт, function, string-ийн гүн ертөнц, өгөгдлийн цуглуулгууд. Тэдгээрийн хамгийн эхнийх нь, магадгүй хамгийн хүчирхэг нь — давталт буюу loop.
Loop ямар асуудал шийддэгийг мэдрэхийн тулд нэг энгийн даалгавраас эхэлье: "Сайн байна уу" гэж таван удаа хэвлэ. Таны одоогийн мэдлэгээр шийдэл нь ганц л зам:
python
print("Сайн байна уу")
print("Сайн байна уу")
print("Сайн байна уу")
print("Сайн байна уу")
print("Сайн байна уу")Ажиллана — гэхдээ дотор чинь нэг зүйл эсэргүүцэж байгаа биз: бид яг ижил мөрийг таван удаа гараар хуулж бичлээ. Тав байхад тэвчиж болно — тэгвэл зуун удаа бол? Мянган удаа бол? Хуулж буулгах нь зөвхөн залхуутай биш — аюултай: нэг мөрийг нь засах хэрэг гарвал мянган газраа засна, нэгийг нь мартвал "чимээгүй" зөрөө үлдэнэ (нэг мэдээлэл нэг л газар амьдрах ёстой гэсэн Бүлэг 4-ийн зарчим эвдэрч байна). Хамгийн гол нь — компьютер бол яг давтахын машин шүү дээ: Бүлэг 1-д бид "компьютер асар хурдтай, хэзээ ч ядардаггүй гүйцэтгэгч" гэж ярьсан. Давтагдах ажлыг хүн гараараа хуулж бичих нь морьтой байж тэргээ өөрөө чирсэнтэй адил. for loop бол компьютерт "энэ багц мөрийг N удаа давт" гэж нэг л удаа хэлдэг хэрэгсэл юм — тэргээ моринд нь өгье.
Loop гэдэг англи үг "гогцоо, тойрог" гэсэн утгатай — энэ нэр өөрөө хамгийн сайн зураг нь юм. Гүйлтийн замын тойргийг төсөөлөөрэй: дасгалжуулагч тамирчинд "энэ тойргоор гурван удаа гүй" гэж хэлэв. Тамирчин тойргийн эхэнд очоод гүйнэ — тойргоо дуусгаад эхлэл рүүгээ буцаж ирнэ — дахиад гүйнэ — дахиад буцаж ирнэ — гурав дахиа гүйгээд... энэ удаад буцахгүй: тоо гүйцсэн тул замаасаа гарч, үргэлжлүүлээд өөр ажилдаа явна. Энд loop-ын бүх эд анги байна. Дасгалжуулагчийн заавар ("гурван удаа") бол давталтын тоо. Тойргийн зам бол давталтын бие — давтагдах мөрүүд. Тамирчны толгойд явж байгаа тоолол ("энэ хэд дэх тойрог вэ — нэг, хоёр, гурав") бол бидний удахгүй танилцах давталтын variable. Тэгээд хамгийн чухал нь: тойрог өөрөө дуусдаг — заасан тоондоо хүрмэгц тамирчин гарч, амьдрал цааш үргэлжилдэг. Программ дээр ч мөн адил: loop дуусмагц Python үндсэн замаараа, loop-ын доорх мөрүүд рүүгээ үргэлжилнэ — Бүлэг 3-ын "дээрээс доош" урсгал хаана ч алга болоогүй, зөвхөн нэг хэсэгтээ "тойрог эргэдэг" болж байгаа юм.
Таван мэндчилгээгээ loop-оор дахин бичье:
python
for i in range(5):
print("Сайн байна уу")Үр дүн:
Сайн байна уу
Сайн байна уу
Сайн байна уу
Сайн байна уу
Сайн байна ууТаван мөр код хоёр мөр боллоо — үр дүн нь яг ижил. Одоо эхний мөрийг тэмдэгт бүрээр нь задалъя, учир нь тэнд дөрвөн шинэ зүйл нэг дор байна. for — Python-ы нөөцөлсөн үг (if шиг): "давталт эхэлж байна" гэсэн зарлал. i — энэ бол variable, бидний өгсөн нэр (жаахан доор бүтэн хэсгээр тайлбарлана — одоохондоо "нэг хайрцаг байгаа юм байна" гээд өнгөрье). in — мөн нөөцөлсөн үг: "дотор нь, дундуур нь" гэсэн утгатай холбоос — "range(5)-ын доторх тоо бүрээр" гэж уншигдана. range(5) — "0-ээс эхлээд 5 хүрэхгүй тоонуудын цуваа" буюу 0, 1, 2, 3, 4 гэсэн таван тоог үйлдвэрлэдэг багаж. Тэгээд мөрийн төгсгөлд — таны сайн таньдаг хоёр цэг, дараагийн мөрөнд — таны сайн таньдаг догол мөр: if-ийн биетэй яг ижил дүрмээр, шигдсэн мөрүүд нь loop-ын бие болдог. Бүхэлд нь уншвал: "range(5)-ын тоо бүр дээр — биеийн мөрүүдийг биелүүл." Таван тоо — таван биелэлт.
range(5) гэхэд яагаад 1-ээс 5 биш, 0-ээс 4 гардаг юм бэ гэсэн зөв асуулт таны толгойд гарсан байх. Товч хариулт: программчлалын ертөнц тооллоо 0-ээс эхэлдэг уламжлалтай бөгөөд энэ нь хожим (string индекс, list дээр) гүн учиртай болох юм. Бүрэн тайлбар, range-ийн бусад чадварууд (өөр тооноос эхлүүлэх, алхам өөрчлөх) — дараагийн хичээл бүхэлдээ range-д зориулагдсан тул тэнд. Өнөөдрийн хэрэглээнд ганц дүрэм хангалттай: range(N) нь биеийг яг N удаа давтуулна — тоонууд нь 0-ээс эхэлдэг ч, тоо ширхэг нь яг N.
Одоо хойшлуулсан гол зочноо хүлээж авъя. for i in... гэдэг дэх i бол юу вэ? Энэ бол Python-ы тусгай үг биш — жирийн л variable, бидний танил шошготой хайрцаг. Онцлог нь ганцхан: түүний утгыг бид биш, loop өөрөө тавьж өгдөг. Тойрог бүрийн эхэнд loop дараагийн тоогоо range-ээсээ аваад i хайрцганд хийдэг: эхний тойрогт i дотор 0, хоёр дахьд 1, гурав дахьд 2... Тамирчны толгойд явдаг "энэ хэд дэх тойрог вэ" гэсэн тоолол яг энэ хайрцганд амьдардаг юм. Биеийн доторх мөрүүд i-г ердийн variable шигээ уншиж хэрэглэж болно:
python
for i in range(5):
print(i)Үр дүн:
0
1
2
3
4Ижилхэн print(i) мөр таван удаа биелээд таван өөр утга хэвлэлээ — учир нь биелэлт бүрийн мөчид i хайрцганд өөр тоо байсан. Танил дүр зураг биз? Бүлэг 4-ийн "хоёр ижил print өөр зүйл хэвлэсэн" жишээ — "ялгаа нь мөрөнд биш, биелэх мөчид хайрцганд юу байсанд" гэсэн сургамж энд бүрэн хүчээ авч байна: loop гэдэг бол үнэндээ "утга нь тойрог бүрд солигдож байдаг variable + давтагддаг бие" гэсэн хоёрхон эд ангийн нэгдэл юм.
Нэрийн тухайд: i гэдэг нэр бол дэлхийн программистуудын дунд тогтсон уламжлал (index буюу "дугаар" гэсэн үгийн эхний үсэг) — маш богино нь "энэ бол зүгээр л тойргийн тоолуур" гэсэн дохио болдог. Гэхдээ энэ нэр заавал биш: for toirog in range(5): гэж бичсэн ч яг ижил ажиллана — нэрийн хичээлийн бүх дүрэм энд хэвээрээ. Тоолуурын энгийн хэрэглээнд i-г хэрэглэж, утга нь илүү тодорхой үед тодорхой нэр өгч байхыг зөвлөе.
Хоёр дахь жишээ: i-г тооцоололд ашиглах. Тоолуураа зүгээр хэвлэхээс илүү ажилд оруулъя:
python
print("2-ын үржвэрийн хүснэгт:")
for i in range(5):
print(2 * i)Үр дүн:
2-ын үржвэрийн хүснэгт:
0
2
4
6
8Мөшгье — loop-ын мөшгилт гэдэг нь тойрог бүрийн эхэнд "i одоо хэд вэ" гэж тэмдэглээд биеийг нь тэр утгаар нь уншина гэсэн үг: i = 0 үед 2 * 0 = 0; i = 1 үед 2; i = 2 үед 4; i = 3 үед 6; i = 4 үед 8. Тав дахь тойргийн дараа range-ийн тоо дуусаж, loop хаагдана. Эхний мөрийн print шигдээгүй — loop-оос өмнө, үндсэн зам дээр нэг л удаа биелж "гарчиг" болов. Ижил биеэс тойрог бүрд өөр үр дүн гарч байгаагийн нууц нь i: бие нь тогтмол, орц нь (i) хувьсдаг — энэ л loop-ын үйлдвэрлэх хүчний томьёо юм.
Гурав дахь жишээ: loop + хуримтлуулагч — score эргэн ирэв. Бүлэг 4-ийн "оньсого мөр" score = score + 1 хаана жинхэнэ гэрээ олдгийг үзүүлье. 1-ээс 4 хүртэлх тоонуудын нийлбэрийг оноож бодуулъя:
python
niilber = 0
for i in range(5):
niilber = niilber + i
print(niilber)Үр дүн:
10Энэ бол Түвшин 2-ын хамгийн чухал хэв маягуудын нэг тул удаан мөшгье — хоёр хайрцгийн байдлыг зэрэг хөтөлнө. Эхлэхэд: niilber = 0 (тоолуур variable-д эхлэлийн утга заавал хэрэгтэй гэдэг Бүлэг 4-ийн дүрэм). Тойрог 1: i = 0, niilber = 0 + 0 = 0. Тойрог 2: i = 1, niilber = 0 + 1 = 1. Тойрог 3: i = 2, niilber = 1 + 2 = 3. Тойрог 4: i = 3, niilber = 3 + 3 = 6. Тойрог 5: i = 4, niilber = 6 + 4 = 10. Loop дууслаа — сүүлийн мөр (шигдээгүй — тиймээс loop-ын дараа нэг л удаа) 10-ыг хэвлэв. niilber шиг variable-ийг хуримтлуулагч гэдэг: тойрог бүрд өөр дээрээ нэмж явдаг сав. Анзаараарай — print нь loop-ын гадна: бид явцын тоог биш, эцсийн дүнг л харахыг хүссэн. Хэрэв print-ийг биед нь шигдүүлбэл (туршаад үзээрэй!) тойрог бүрийн завсрын дүн 0, 1, 3, 6, 10 гэж цуврах болно — шигдэлтийн нэг шат нь "хэзээ, хэдэн удаа" гэдгийг шийддэг гэсэн үг.
Дөрөв дэх жишээ: тоглоомын дүрд. Kid-friendly нэг хөгжилтэй хэрэглээ — тоглолтын өмнөх тоолол:
python
print("Нуугдаж тоглоё! Би тоолъё:")
for toolol in range(10):
print(toolol + 1)
print("Хайж эхэллээ!")Үр дүн:
Нуугдаж тоглоё! Би тоолъё:
1
2
3
4
5
6
7
8
9
10
Хайж эхэллээ!Хоёр зүйл ажиглаарай. Нэгд: давталтын variable-д i биш toolol гэсэн утга илэрхийлсэн нэр өгөв — дүрэм зөвшөөрдөг, уншигдах чанар сайжирдаг. Хоёрд: range(10) нь 0-9 өгдөг атал бид 1-10 хэвлэмээр байсан — шийдэл нь биед toolol + 1 гэж хэвлэсэн явдал (харьцуулж хараарай: variable-ийн утга нь 0-9 хэвээрээ, зөвхөн хэвлэж буй илэрхийлэл нь +1). Энэ бол 0-ээс эхэлдэг тооллын "хүн рүү харсан" талыг тохируулдаг өдөр тутмын жижиг арга. (range-ээр шууд 1-ээс эхлүүлдэг цэвэрхэн арга бий — дараагийн хичээлийн амттан.)
Хүсвэл туршаад үзээрэй: гурав дахь жишээний print-ийг биед нь оруулж завсрын дүнгүүдийг хараарай — хуримтлуулагчийн "өсөлт" нүдэнд ил болно. Сонирхвол range(5)-ын тоог томруулж туршаарай — range(100), бүр range(1000): компьютер мянган тойргийг нүд ирмэхийн зуур эргэдгийг үзэх нь "давтахын машин" гэдэг үгийг мэдрүүлнэ.
Алдаа 1: Биеэ шигдүүлэхээ мартах. if дээр танилцсан хууль энд ч хүчинтэй:
python
for i in range(5):
print("Сайн байна уу")Python:
IndentationError: expected an indented block after 'for' statement on line 1Танил мэдэгдэл — зөвхөн 'if' гэдэг үг 'for' болж солигдсон: "1-р мөрийн for-ын дараа шигдсэн багц байхыг хүлээж байсан." Хоёр цэгээр төгсдөг бүх мөр (if, elif, else, for — цаашид өөр хэд нэмэгдэнэ) ард нь шигдсэн бие нэхдэг гэсэн нэг ерөнхий дүрэм болж байгааг анзаараарай. Засвар нь мөн танил: биеийн мөрөө дөрвөн зайгаар шигдүүл.
Алдаа 2: Шигдэлтээр юуг давтахаа андуурах. Мэдэгдэлгүй, утгын алдаа — хамгийн зальтай нь:
python
for i in range(3):
print("Оролдлого:")
print("Тоглоом эхэллээ!")Программист "Оролдлого:" гэдгийг гурав давтаад, "Тоглоом эхэллээ!"-г нэг удаа хэвлэх санаатай байжээ. Гэвч хоёр print хоёулаа шигдсэн тул хоёул биед багтаж, хоёул гурав давтагдана: "Оролдлого: / Тоглоом эхэллээ!" гэсэн хос зургаан мөр болж цувна. Засвар: loop-ын дараа нэг л удаа биелэх мөрийн шигдэлтийг буцаа (Backspace) — үндсэн замд гарга. Энэ бол Бүлэг 6-гийн "Программ дууслаа" мөртэй ижил сургамжийн loop хувилбар: шигдэлт бол харьяалал — мөр бүр дээр "энэ тойрог доторх уу, тойргийн дараах уу" гэж өөрөөсөө асуу. Loop бичсэний дараа программ чинь "хэтэрхий олон юм хэвлээд" байвал эхний сэжигтэн бол биед санамсаргүй үлдсэн мөр.
Алдаа 3: range-ийн хаалт, тоог орхигдуулах. Шинэ бичиглэлийн эд ангиуд эхэндээ "гээгддэг":
python
for i in range 5:
print(i)Python:
SyntaxError: invalid syntaxrange бол print, int, type шиг хаалттай дуудагддаг багаж — тоогоо хаалтанд өгнө: range(5). Хаалтгүй бичихэд Python range гэдэг нэр ба 5 гэсэн тоо зэрэгцчихсэнийг ойлгохгүй гацна. Мөн ойрын садан алдаа: for i in range(5) гээд хоёр цэгээ мартвал — таны Бүлэг 6-аас таньдаг SyntaxError: expected ':' угтана; Python юу дутууг өөрөө хэлнэ. Хоёул бичиглэлийн давхаргын, "гарвал шууд, тодоор гардаг" аюулгүй төрлийн алдаанууд — дүрэм: for мөрийн иж бүрдэл нь for + нэр + in + range(N) + хоёр цэг — таван эд анги, нэг нь дутуу бол Python зогсооно.
for loop нь "энэ багц мөрийг N удаа давт" гэсэн заавар: for i in range(N): + шигдсэн бие — хуулж буулгах ажлыг компьютерт өгдөг хэрэгсэл.
range(N) нь 0-ээс N-1 хүртэлх N ширхэг тоо өгдөг; давталтын тоо нь яг N.
i бол жирийн variable — утгыг нь тойрог бүрийн эхэнд loop өөрөө сольж тавьдаг; бие нь тогтмол, i нь хувьсдаг нь loop-ын хүчний эх.
Хуримтлуулагч хэв маяг: loop-оос өмнө эхлэлийн утга (niilber = 0), биед нь niilber = niilber + i, дүнг loop-ын дараа хэвлэ.
Шигдэлт бол харьяалал: биед байгаа мөр давтагдана, гадна нь байгаа мөр нэг л удаа биелнэ — for-ын дараа шигдсэн бие заавал (үгүй бол IndentationError).
Дараагийн хичээл бүхэлдээ range()-д зориулагдана: яагаад 0-ээс эхэлдэг юм бэ гэдгийн бүрэн учир, 1-ээс (эсвэл дурын тооноос) эхлүүлэх арга, алхмаар үсэргэх чадвар — range-ийн нэг, хоёр, гурван "орцтой" хэлбэрүүдийг нэг бүрчлэн задална. Өнөөдрийн toolol + 1 маягийн тохируулгууд тэндээс хойш хэрэггүй болно.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.