Ачааллж байна...
Өнгөрсөн хоёр хичээлд бид for loop-ыг эзэмшлээ — гэхдээ түүнд нэг далд хязгаар байгааг та анзаарсан уу? For loop эхлэхээсээ өмнө хэдэн удаа давтахаа мэддэг: range(5) — таван тойрог, range(1, 11) — арван тойрог. Тэгвэл давталтын тоо нь урьдчилан мэдэгддэггүй ажлуудыг яах вэ? "Тоглогч онотлоо таалга" — хэдэн оролдлого хэрэгтэйг хэн мэдэх вэ: азтай нь эхнийхдээ онож, азгүй нь аравтаа ч онохгүй байж болно. "Хэрэглэгч зөв нууц үг оруултал асуу", "мөнгө дуустал худалдан авалт хий" — эдгээрт "N удаа" гэсэн N байхгүй: давталт тоогоор биш, нөхцөлөөр дуусдаг. Яг ийм ажилд зориулагдсан хоёр дахь давталт бол while loop: "нөхцөл биелж байх зуур давтсаар бай" гэсэн хэлбэр. While гэдэг англи үг нь "байх зуур, хооронд" гэсэн утгатай — нэр нь ажлаа шууд хэлдэг.
Нэг сайхан мэдээ хэлье: энэ хичээлд сурах шинэ "эд анги" бараг байхгүй. While-ын нөхцөл нь Бүлэг 6-гийн яг тэр нөхцөлүүд (харьцуулах операторууд, and/or), бүтэц нь танил хоёр цэг + шигдсэн бие, дотор нь ажилладаг гол хөдөлгүүр нь Бүлэг 4-ийн score = score + 1 хэв маяг. Шинэ зүйл нь эд анги биш — угсралт нь юм. Харин угсралтын нэг онцгой хариуцлагыг энэ хичээл дагуулдаг: while бол таны анхны "өөрөө зогсоохгүй бол зогсдоггүй" хэрэгсэл бөгөөд буруу угсарвал программ чинь мөнхөд эргэлддэг болдог. Тэр алдартай ослыг бид зориуд, аюулгүй орчинд, зогсоох товчийг нь гартаа барьчихсан байж үйлдэж үзнэ — программист бүрийн амьдралдаа заавал нэг хийдэг энэ алдааг та бэлтгэлтэй, айдасгүй угтах болно.
Өмнөх хичээлүүдийн гүйлтийн замын зүйрлэлээ хажууд нь тавьж хоёр давталтаа зэрэгцүүлье. For бол дасгалжуулагчийн "гурван тойрог гүй" гэсэн заавар: тойргийн тоо эхнээсээ тогтсон, тамирчин тоолж гүйгээд, тоо гүйцмэгц гарна. While бол огт өөр зохион байгуулалт — усанд орох ванн дүүргэж буй хүн шиг: "ванн дүүртэл ус нэм." Тэр хүн хэдэн хувин ус хэрэгтэйг урьдчилан мэддэггүй, мэдэх ч шаардлагагүй — түүний ажлын горим нь: хувин цутгахынхаа өмнө бүрд ваннаа шалга — дүүрээгүй л байвал дахин нэг хувин, дүүрсэн бол болъё. Энд while-ын бүх механик байна: тойрог бүрийн өмнө нөхцөл шалгагдана (ванн дүүрэн үү?); нөхцөл True бол бие нэг биелнэ (нэг хувин нэмнэ); дараа нь дахин шалгана — True бол дахин бие, False болмогц loop хаагдаж, амьдрал үргэлжилнэ. Тэгээд нэг амин чухал ажиглалт: энэ схем зөвхөн нэг тохиолдолд л зогсдог — биеийн үйлдэл нөхцөлийг аажмаар False рүү ойртуулж байвал. Хувин бүр ваннын түвшинг өсгөдөг учраас "дүүртэл" гэдэг өдөр ирдэг; хэрэв хувинтай ус нь хажуугийн зайлуур руу асгардаг байсан бол... тэр хүн мөнхөд зөөх байсан. Энэ бол доор үзэх "төгсгөлгүй давталтын" урьдчилсан зураг.
Тоолуураа while-аар барья — for-ын хамгийн энгийн ажлыг while-аар хийж, хоёрын ялгааг ил гаргая:
python
toolur = 1
while toolur <= 5:
print(toolur)
toolur = toolur + 1
print("Дууслаа")Үр дүн:
1
2
3
4
5
ДууслааМөр бүрийг задалъя — энд while-тай программын гурван заавал эд анги ил байгаа. Нэг: эхлүүлэлт (toolur = 1) — loop эхлэхээс өмнө нөхцөлд оролцох variable маань төрсөн байх ёстой (Бүлэг 4-ийн "хайрцаг эхэлж төрдөг" дүрэм: нөхцөл эхний шалгалтаа хийхэд toolur байхгүй бол NameError). Хоёр: нөхцөл (toolur <= 5) — Бүлэг 6-гийн жинлүүр, хоёр цэгээр төгсөнө, ард нь шигдсэн бие. Гурав — хамгийн чухал нь: урагшлуулагч мөр (toolur = toolur + 1) — биеийн дотор нөхцөлийг False рүү ойртуулдаг мөр заавал байх ёстой: манай "хувин" энэ. Ажиллагааг нь мөшгье: шалгалт — 1 <= 5 True — бие: 1 хэвлэв, toolur 2 боллоо; шалгалт — 2 <= 5 True — бие: 2 хэвлэв, toolur 3; ...; шалгалт — 5 <= 5 True — бие: 5 хэвлэв, toolur 6; шалгалт — 6 <= 5 False — loop хаагдаж "Дууслаа" гарав. Шалгалт тойрог бүрийн өмнө хийгддэгийг, тэгээд toolur 6 болсныг ("зогссон утга нь хилээс нэг алхам цаана үлддэг") ажиглаарай. For-той харьцуулбал: for i in range(1, 6) хоёрхон мөрөнд багтдаг ажлыг while дөрвөн мөрөөр хийж, эхлүүлэлт-шалгалт-урагшлалт гурваа гараар бичүүлж байна. Тиймээс дүрэм: давталтын тоо мэдэгдэж байвал for — богино, алдах газар цөөн; нөхцөлөөр дуусах бол while — өөр сонголтгүй. While-аар for-ын ажлыг хийж болдог ч (сая хийлээ), урвуугаар нь болдоггүй нь while-ыг "илүү ерөнхий, гэхдээ илүү хариуцлагатай" багаж болгодог.
Хоёр дахь жишээ: жинхэнэ хэрэглээ — зөв хариултыг хүлээх. While-ын төрөлх нутаг:
python
hariult = ""
while hariult != "Улаанбаатар":
hariult = input("Монголын нийслэл хаана вэ? ")
print("Зөв!")Хэрэглэгч Дархан, дараа нь Эрдэнэт, эцэст нь Улаанбаатар гэж хариулбал:
Монголын нийслэл хаана вэ? Дархан
Монголын нийслэл хаана вэ? Эрдэнэт
Монголын нийслэл хаана вэ? Улаанбаатар
Зөв!Хэдэн оролдлого хэрэгтэйг хэн ч урьдчилан мэдэхгүй байсан — while-д хамаагүй: нөхцөл л шүүнэ. Гурван эд ангиа шалгая: эхлүүлэлт — hariult = "" (string хичээлийн хоосон string энд жинхэнэ ажлаа оллоо: "хараахан хариулаагүй" төлөв — хоосон нь "Улаанбаатар"-тай тэнцэхгүй тул эхний шалгалт гарцаагүй True гарч, loop-д орно); нөхцөл — "зөв хариулт ирээгүй л байвал"; урагшлуулагч — input мөр өөрөө: тойрог бүрд hariult-д шинэ утга орж байгаа тул нөхцөл өөрчлөгдөх боломжтой. Урагшлуулагч заавал тоолуур байх албагүй гэдгийг энэ жишээ харуулж байна — нөхцөлийн variable-ийг өөрчилдөг л мөр бол урагшлуулагч мөн.
Гурав дахь жишээ: тоолуур + нөхцөл хосолсон — мөнгө дуустал. Хуримтлуулагчийн урвуу хувилбар — "шавхагч":
python
mungu = 10000
while mungu >= 1500:
print("Нэг хуушуур авлаа")
mungu = mungu - 1500
print("Үлдэгдэл:", mungu)Үр дүн:
Нэг хуушуур авлаа
Нэг хуушуур авлаа
Нэг хуушуур авлаа
Нэг хуушуур авлаа
Нэг хуушуур авлаа
Нэг хуушуур авлаа
Үлдэгдэл: 1000Мөшгье — mungu-ийн замнал: 10000 → 8500 → 7000 → 5500 → 4000 → 2500 → 1000. Зургаан хуушуур авахад 1000 үлдэж, 1000 >= 1500 False болмогц зогсов. Нөхцөлөө >= 1500 гэж тавьсныг ажигла — "мөнгө байгаа зуур" (> 0) биш: үнэ хүрэхгүй мөнгөтэй үлдмэгц зогсох ёстой тул хил нь үнэ өөрөө. Хилийн цэгийн энэ нягтлал (Бүлэг 6-гийн "яг 18 настай хүн" сургамж) while-ын нөхцөлд бүр ч чухал: нэг тэмдгийн зөрөө энд "нэг илүү тойрог" болж, mungu хасах утгад орох мэт утгын алдаа төрүүлдэг. Энэ жишээг та for-оор бичиж чадах уу гэвэл — чадна (10000 // 1500 = 6 гэж урьдчилан бодоод range(6)) — гэхдээ тэр тооцоог программист гараараа хийж байгаа нь мэдрэгдэж байна уу? While тэр тооцоог программдаа өөрт нь үлдээдэг: нөхцөлөөр сэтгэх нь ихэвчлэн санааг шууд буулгадаг зам байдаг.
Дөрөв дэх жишээ: төгсгөлгүй давталт — аюулгүй ослын дадлага. Одоо амласан осол. Эхний жишээнээсээ урагшлуулагч мөрийг нь зориуд авч хаяя:
python
toolur = 1
while toolur <= 5:
print(toolur)Ажиллуулахаасаа өмнө юу болохыг урьдчилан бодъё: шалгалт — 1 <= 5 True — бие: 1 хэвлэв... toolur өөрчлөгдсөнгүй. Шалгалт — 1 <= 5 мөн л True — дахин 1... Нөхцөлийг False рүү ойртуулах мөр алга тул энэ тойрог хэзээ ч дуусахгүй: terminal чинь 1-ийн төгсгөлгүй цуваагаар нүд ирмэхийн зуур дүүрч, программ "гацсан" мэт эргэлдсээр байх болно. Үүнийг infinite loop (төгсгөлгүй давталт) гэдэг. Одоо зогсоох товчоо мэдээд авъя: terminal дотроо товшоод Ctrl товчийг дараастай C үсэг дарна — энэ бол "ажиллаж буй программаа таслан зогсоо" гэсэн бүх нийтийн тушаал: программ KeyboardInterrupt гэсэн мэдэгдэлтэйгээр зогсоно ("гараас тасаллаа" гэсэн утгатай — энэ бол алдаа гэхээсээ таны өгсөн зогсоолын тамга). Товчоо мэдсэн бол — одоо зориуд ажиллуулаад, зориуд зогсоогоорой: аюулгүй орчинд ослоо үйлдэж, ослоос гарах хаалгаа гараараа нээж үзсэн хүн жинхэнэ нөхцөлд сандардаггүй. Компьютерт чинь ямар ч хор хөнөөл байхгүй — CPU хэдэн секунд шаргуу ажиллаад л өнгөрнө. Тайвшрал нэмье: төгсгөлгүй давталт бол "тэнэг алдаа" биш — зориудын төгсгөлгүй давталт бол бодит программуудын үндэс суурь юм: тоглоомын гол эргэлт, вэб серверийн "хүсэлт хүлээх" горим — бүгд санаатай мөнхийн while (дотроо гарах тусгай хаалгатай — тэр хаалга нь дараагийн хичээлийн break). Таны сурсан зүйл бол давталтыг төгсгөлгүй болгохгүй байх биш — хэзээ төгсгөлтэй, хэзээ төгсгөлгүй байхыг нь та шийддэг байх явдал юм.
Хүсвэл туршаад үзээрэй: хоёр дахь жишээг өөрийн нууц асуулттайгаар дахин бичээрэй. Сонирхвол гурав дахь жишээнд хуушуурын тоог тоолдог тоолуур нэмээрэй (huushuur = 0 гэж эхлүүлээд биед нь нэгээр өсгөж, төгсгөлд нь хэвлэх) — нэг while дотор хоёр variable зэрэг "амьдрахыг" барьж үзэх нь дараагийн хичээлүүдийн бэлтгэл болно.
Алдаа 1: Урагшлуулагчаа мартах. Дөрөв дэх жишээн дээр бүрэн үзсэн тул дүрмээ л тогтооё: while бичих бүрдээ гурван эд ангийн шалгалт хий — эхлүүлэлт байна уу, нөхцөл байна уу, биеийн дотор нөхцөлийг өөрчилдөг мөр байна уу. Гурав дахь нь дутуу бол төгсгөлгүй давталт; гарц нь Ctrl+C. Мөн зальтай хувилбарыг нь мэдэж ав: урагшлуулагч мөр бий боловч шигдэлт нь алдагдсанаас биеэс гарчихсан байх — нүдээр бүрэн зөв харагдах мөртлөө loop дотроо тоолуургүй эргэлддэг. Шигдэлт бол харьяалал гэдэг Бүлэг 6, 7-гийн дуулиа энд гурав дахиа эргэж ирлээ.
Алдаа 2: Нөхцөлөө урвуулах. Loop огт ажиллахгүй байх нь эсрэг туйлын зовлон:
python
hariult = ""
while hariult == "Улаанбаатар":
hariult = input("Монголын нийслэл хаана вэ? ")
print("Зөв!")Үр дүн: асуулт нэг ч удаа асуугдалгүй шууд "Зөв!" гарна. Учир нь while-ын нөхцөл бол "үргэлжлэх нөхцөл" — "зогсох нөхцөл" биш: эхний шалгалтад "" "Улаанбаатар" False тул бие тэг удаа биелэв (range-ийн "чимээгүй тэг тойрог"-ийн while хувилбар). Бичигч "Улаанбаатар гэтэл нь асуу" гэсэн зогсоолын сэтгэлгээгээр тавьжээ — while-д "Улаанбаатар биш л байвал асуу" гэсэн үргэлжлэлийн хэлбэрт (!=) буулгах ёстой байв. Дадал: while-ын нөхцөлөө бичээд "энэ True байх зуур эргэлдэнэ гэсэн үг — тийм байх нь зөв үү?" гэж нэг уншиж шалга. Loop чинь огт орохгүй байвал — нөхцөл чинь эхнээсээ False байна: урвуулагдсан нөхцөл бол эхний сэжигтэн.
Алдаа 3: Input-ын хариуг int-гүй харьцуулах — төгсгөлгүй давталтын далд хэлбэр. Хуучин танил урхи while дээр шинэ хор нэмдэг:
python
too = input("5 гэж бичээрэй: ")
while too != 5:
too = input("Дахиад оролдоорой. 5 гэж бичээрэй: ")
print("Баярлалаа!")Хэрэглэгч 5 гэж хичнээн бичсэн ч loop хэзээ ч дуусахгүй: input-ын хариу "5" string, нөхцөл нь int 5-тай тулгаж байгаа — "5" != 5 нь үргэлж True (Бүлэг 6-гийн "string ба int хэзээ ч тэнцэхгүй" урхи). If дотор энэ алдаа "салаа хэзээ ч биелэхгүй" төдийхнөөр өнгөрдөг байсан бол while дотор төгсгөлгүй давталт болж хувирлаа — хэрэглэгч зөв зүйл хийсээр байтал программ "болсонгүй" гэж мөнхөд нэхэх нь бүр ч гутрангуй осол. Засвар нь танил: too = int(input(...)) — хоёр input-д хоёуланд нь. Оношлогооны шинэчилсэн дүрэм: "зөв орц өгсөөр байтал while зогсохгүй бол" хоёр талын төрлийг шалга — type() багаж чинь халаасанд чинь бий.
while нь "нөхцөл True байх зуур давт": тойрог бүрийн өмнө нөхцөл шалгагдаж, False болмогц loop хаагдана.
Гурван заавал эд анги: эхлүүлэлт (loop-оос өмнө), нөхцөл (үргэлжлэх нөхцөл — зогсоолынх биш), урагшлуулагч (биеийн дотор нөхцөлийг өөрчилдөг мөр).
Сонголтын дүрэм: давталтын тоо урьдчилан мэдэгдэж байвал for, нөхцөлөөр дуусах бол while.
Урагшлуулагч дутвал (эсвэл биеэс шигдэлтээр "унавал") төгсгөлгүй давталт — Ctrl+C-ээр зогсооно; зориудын төгсгөлгүй давталт бол бодит программын хэвийн хэрэгсэл.
Input + while хослолд int() мартагдвал "хэзээ ч биелэхгүй нөхцөл" төгсгөлгүй давталт болдог — хоёр талын төрлөө шалга.
Дараагийн хичээлд давталтын дотоод хаалгануудтай танилцана: break — тойргоос нэн даруй гарах, continue — энэ тойргоо алгасаад дараагийх руу үсрэх. "Мөнхийн while дотроо гарах хаалгатай" гэж өнөөдөр хэлсэн шүү дээ — тэр хаалганы түлхүүр, мөн хаана хэрэглэвэл код тодорч, хаана будилуулдаг тухай яриа тэнд бий.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.