Ачааллж байна...
Өнгөрсөн гурван хичээлд бид давталтын хоёр төрлийг эзэмшлээ — гэхдээ хоёулаа нэг нийтлэг зантай байсныг ажиглаарай: тэдний "хувь заяа" толгойн мөрөндөө бүрэн шийдэгддэг. For нь range-даа заасан тоогоо гүйцээтэл, while нь нөхцөлөө False болтол эргэдэг — тойргийн дундаас юу ч тэдний замыг өөрчилж чаддаггүй. Гэтэл бодит ажилд "дундаас нь" шийдэх хэрэгцээ байнга гардаг. Түлхүүрээ хайж байгаа хүнийг бодоорой: тэр арван халаасаа бүгдийг нь үзэх төлөвлөгөөтэй — гэхдээ гурав дахь халааснаас түлхүүр олдвол үлдсэн долоог үзэлгүй шууд зогсоно: олдсон хойно цааш ухах утгагүй. Эсвэл жимс ялгаж буй хүн: сагсны жимс бүрийг үзнэ — гэхдээ ялзарсан нэгэн таарвал түүнийг хажуу тийш тавиад дараагийнхаа жимс рүү оръё: нэгийг алгасах нь ажлаа зогсооно гэсэн үг биш. Энэ хоёр хөдөлгөөнийг Python-д хоёр үг гүйцэтгэдэг: break — давталтаас нэн даруй бүрмөсөн гарах ("хайлт дууслаа"); continue — энэ тойргийн үлдсэн хэсгийг алгасаад дараагийн тойрог руу үсрэх ("энийг өнгөрөөгөөд цааш").
Хоёулаа Python-ы нөөцөлсөн үгс бөгөөд хоёулаа зөвхөн давталтын биеийн дотор л амьдардаг. Мөн хоёулаа бараг үргэлж if-тэй хоршиж явдаг — учир нь "ямар ч болзолгүйгээр гар" гэсэн break утгагүй (эхний тойрогтоо л гараад дуусна), харин "хэрэв олдвол гар" гэсэн if + break бол утга төгөлдөр хэрэгсэл юм. Өнөөдрийн хичээл танд хоёр шинэ түлхүүр өгөхөөс гадна нэг шинэ төрлийн яриа өрнүүлнэ: хичээлийн төгсгөлд бид "хэрэглэж болох" ба "хэрэглэх нь зөв" хоёрын ялгааг ярина — break/continue бол код тодруулдаг ч, буруу гартаа будилуулдаг хоёр талтай багажууд юм.
Гүйлтийн тойргийн зүйрлэлээ сүүлчийн удаа өргөтгөе. Тойрог замын хажууд хоёр байгууламж нэмэгдлээ. Нэг нь — замын гарах хаалга (break): тамирчин тойргийнхоо дундуур гүйж явтал дасгалжуулагч "боллоо, гараад ир!" гэвэл тэр тойргоо гүйцээлгүй, үлдсэн тойргуудаа ч эргэлгүй, хаалгаар шууд гарч замын гадна гардаг — тэндээс амьдрал (loop-ын дараах мөрүүд) үргэлжилнэ. Нөгөө нь — тойргийн дундах алгасах гүүр (continue): тамирчин гүүрэн дээгүүр гармагц энэ тойргийнхоо үлдсэн хэсгийг алгасаад шууд эхлэлийн цэг дээр очдог — гэхдээ анзаараарай: тэр замаасаа гараагүй — эхлэл дээр очоод ердийн журмаараа (for бол дараагийн тасалбараа авч, while бол нөхцөлөө шалгаж) дараагийн тойргоо үргэлжлүүлнэ. Хоёрын ялгааг нэг өгүүлбэрт: break — замаас гарна, continue — тойргоо товчилно. Хоёулангийнх нь "үйлчлэх хүрээ" нь зөвхөн энэ нэг зам: break хийсэн тамирчин зөвхөн энэ тойрог замаас л гарна — биеийн тамирын заалнаас гараад явчихна гэсэн үг биш (программ зогсохгүй, зөвхөн loop дуусна).
Түлхүүр хайлтаа кодоор бичье — хайж буй тоогоо олмогц зогсдог хайлт:
python
for i in range(1, 11):
print("Шалгаж байна:", i)
if i == 4:
print("Оллоо!")
break
print("Хайлт дууслаа")Үр дүн:
Шалгаж байна: 1
Шалгаж байна: 2
Шалгаж байна: 3
Шалгаж байна: 4
Оллоо!
Хайлт дууслааRange нь 1-ээс 10 хүртэл арван тойрог амласан байтал дөрөв дээр зогслоо. Мөшгье: эхний гурван тойрогт if-ийн нөхцөл (i == 4) False тул break-д хүрэлгүй ердийн эргэлт; дөрөв дэх тойрогт нөхцөл True болж, "Оллоо!" хэвлэгдээд — break: Python яг энэ мөчид loop-ыг бүхэлд нь хаяад, шигдээгүй "Хайлт дууслаа" мөр рүү үсрэв. Шигдэлтийн давхаргуудыг ажиглаарай — энд хоёр шат байна: if-ийн мөр loop-ын биед (нэг шат), break нь if-ийн биед (хоёр шат) — өөрөөр хэлбэл break нь "тойрог бүрд" биш, "нөхцөл биелсэн тойрогт л" ажиллана. Бас нэг зүйл: break-ээс хойшхи тойргууд (5-10) огт эхлээгүйгээс гадна, хэрэв break-ийн доор биеийн мөр байсан бол тэр тойргийн үлдсэн мөрүүд ч биелэхгүй байсан — break бол "нэн даруй" гэсэн үг: үг дуусахаас өмнө хаалга хаагддаг.
Break-ийн хамгийн үнэ цэнтэй хоршил бол өмнөх хичээлд амласан мөнхийн while + break хэв маяг:
python
while True:
hariult = input("Гарах уу? (тийм/үгүй) ")
if hariult == "тийм":
break
print("Баяртай!")while True гэдэг нь "нөхцөл нь үргэлж True — өөрөөр хэлбэл зориудын төгсгөлгүй давталт": толгой нь хэзээ ч зогсоохгүй тул гарах ганц зам нь дотоод хаалга — break. Энэ хэв маяг эхлээд "аюултай юм зориуд хийгээд яах вэ" гэж сонсогдож болох ч давуу тал нь тодорхой: зогсолтын шийдвэр биеийн яг тохирох цэг дээр, if-ийн тодорхой нөхцөлтэйгөөр бичигддэг. Өмнөх хичээлийн "зөв хариулт хүлээх" жишээг санаж байна уу — тэнд бид hariult = "" гэсэн "хиймэл" эхлүүлэлт хийж байсан: зөвхөн эхний шалгалтыг давуулахын тулд. While True + break хувилбарт тийм хиймэл мөр хэрэггүй болдог. Тоглоомын гол эргэлт, цэс харуулах программ — "хэрэглэгч гарья гэтэл ажилладаг" бүх зүйл яг энэ хэв маяг дээр тогтдог бөгөөд дараагийн хичээлийн тоглоомын сайжруулалтад энэ маань гол дүрд тоглоно.
Хоёр дахь жишээ: continue — ялзарсан жимсийг алгасах. Хоёр дахь түлхүүрээ ажиллуулъя — 1-ээс 10 хүртэлх тооноос 4-т хуваагддагийг нь "хаяж", үлдсэнийг нь хэвлэе:
python
for i in range(1, 11):
if i % 4 == 0:
continue
print(i)
print("Дууслаа")Үр дүн:
1
2
3
5
6
7
9
10
Дууслаа4 ба 8 алга — тэдний тойрогт юу болсныг мөшгье. i = 4 үед: i % 4 == 0 True (тоон үйлдлүүдийн хичээлийн "яг хуваагддаг уу" шалгуур ажилдаа орлоо) — continue: тойргийн үлдсэн хэсэг (print мөр) алгасагдаж, Python шууд эхлэл рүү очиж дараагийн тасалбараа (5) авав. Бусад тойрогт нөхцөл False тул continue-д хүрэлгүй print ердийнхөөрөө биелэв. Break-тэй нэг мөрөнд тулгаж харвал: break байсан бол 1, 2, 3 хэвлээд бүрмөсөн зогсох байсан — continue нь 4-ийг л "өнгөрөөгөөд" аравтын тойргоо гүйцээв. Continue-ийн ажил бол шүүлт: урсгалаас тодорхой шинжтэйг нь гээж, үлдсэнд нь биеийн "жинхэнэ ажлыг" хийлгэх. Тиймээс түүний байнгын байрлал нь биеийн эхэнд: "энэ тойргийн орц тэнцэхгүй бол цаг үрэлгүй дараагийх руу" — шүүлтээ эхэнд нь тавьчихаар биеийн үлдсэн хэсэг "цэвэр" орцтой ажиллана гэсэн итгэлтэй болдог.
Гурав дахь жишээ: хоёулаа нэг дор — бодит хэв маяг. Нэвтрэлтийн гурван оролдлого өгдөг, хоосон орцыг тоолдоггүй систем барья:
python
oroldlogo = 0
while oroldlogo < 3:
nuuts = input("Нууц үгээ оруулна уу: ")
if nuuts == "":
print("Хоосон байна — энэ оролдлогод тооцохгүй")
continue
oroldlogo = oroldlogo + 1
if nuuts == "naran":
print("Нэвтэрлээ!")
break
print("Буруу байна")
print("Программ дууслаа")Хэрэглэгч эхлээд хоосон Enter, дараа нь sar, дараа нь naran гэж оруулбал:
Нууц үгээ оруулна уу:
Хоосон байна — энэ оролдлогод тооцохгүй
Нууц үгээ оруулна уу: sar
Буруу байна
Нууц үгээ оруулна уу: naran
Нэвтэрлээ!
Программ дууслааХоёр түлхүүр хоёр өөр ажил хийж байгааг мөшгье. Хоосон орцод: continue — тоолуур өсөхөөс өмнө тойрог товчлогдсон тул хоосон Enter "оролдлого" гэж тоологдсонгүй (continue-ийн байрлал oroldlogo = oroldlogo + 1 мөрөөс дээр байгаа нь санаатай: дараалал бол утга — Бүлэг 3-ын дуулиа энд амьдаараа). Зөв нууц үгэнд: break — амжилттай нэвтэрсэн хойно үлдсэн оролдлогуудыг үргэлжлүүлэх утгагүй. Хэрэв гурван удаа буруу оруулбал oroldlogo 3-т хүрч, while-ын толгой өөрөө зогсооно — нэг loop гурван гарцтай боллоо: ердийн дуусал (оролдлого дуусах), break (амжилт), continue (тойргийн товчлол — гарц биш ч урсгалын салаа). Ийм олон гарцтай loop бол бодит программын өдөр тутмын төрх юм.
Дөрөв дэх жишээ: болох ба зөвийн ялгаа. Одоо амласан яриагаа хийе. Дараах хоёр программ яг ижил ажиллана:
python
# Хувилбар А — break-тэй
for i in range(1, 11):
if i == 4:
break
print(i)python
# Хувилбар Б — break-гүй
for i in range(1, 4):
print(i)Хоёул 1, 2, 3 хэвлэнэ. Гэхдээ Б хувилбар илт дээр: "1-ээс 3 хүртэл хэвлэ" гэсэн санааг range нь толгой мөртөө шууд хэлчихэж байхад А хувилбар "10 хүртэл явна аа... гэхдээ үнэндээ 4 дээр гарчихна" гэсэн худал амлалттай толгойтой — уншигч биеийг нь уншиж байж жинхэнэ хилийг олно. Эндээс энэ хичээлийн ёс зүйн дүрэм: давталтын хилийг толгой мөр нь (range эсвэл нөхцөл) илэрхийлж чадаж байвал — тэнд нь бич; break/continue-г зөвхөн толгойд багтахгүй, тойргийн дундаас л мэдэгддэг шийдвэрт хэрэглэ. Түлхүүр олдох эсэх, хэрэглэгч юу бичих — эдгээр нь урьдчилан мэдэгдэхгүй тул break зохистой; харин тоогоор хэлчих боломжтой хилийг break-ээр "далдлах" нь кодоо оньсого болгож байгаа хэрэг. Мөн тоо хэмжээний зөвлөгөө: нэг loop дотор break/continue олшрох тусам урсгалыг нь дагахад хэцүү болдог — гурав, дөрөв дэх салаа гарч ирвэл "энэ loop-ыг өөрөөр зохион байгуулж болох уу" гэж өөрөөсөө асуу.
Хүсвэл туршаад үзээрэй: 1-ээс 20 хүртэл тоолоод, 13 дээр "аюултай тоо!" гээд зогсдог (break), гэхдээ тэгш тоонуудыг чимээгүй алгасдаг (continue) loop бичээрэй — хоёр түлхүүрээ нэг биед зохицуулж үзэх нь гурав дахь жишээний дадлага болно. Сонирхвол дөрөв дэх жишээний А, Б хувилбарыг өөрөө өөр бодлого дээр (жишээ нь "7 хүртэл хэвлэ") хоёуланг нь бичээд аль нь уншихад тод байгааг өөрийн нүдээр дүгнээрэй.
Алдаа 1: Loop-ын гадна хэрэглэх. Хоёр үг зөвхөн давталтын биед амьдардаг гэдгийг зөрчвөл:
python
ono = 100
if ono == 100:
breakPython:
SyntaxError: 'break' outside loopОрчуулбал: "'break' давталтын гадна байна." Энд if байгаа биз дээ гэж эргэлзэж болох ч — if бол давталт биш: break-ийн "гэр" нь for/while-ын бие бөгөөд if нь зөвхөн тэр гэрийн доторх нөхцөл болж өгдөг. Дээрх кодод for ч, while ч алга тул Python "гарах давталт чинь хаана байна?" гэж бичиглэлийн түвшинд зогсооно. continue outside loop гэсэн ижил мөрийн алдаа continue-д бий. Энэ алдаа бодит амьдралд ихэвчлэн шигдэлт алдагдахаас үүсдэг: break нь loop-ын биеэс "унаад" гадна гарчихсан байх — мөрөө loop-ын биед буцааж шигдүүлэхэд л засагдана.
Алдаа 2: while + continue-ээр төгсгөлгүй давталт "барих". Continue-ийн хамгийн зальтай урхи — гурав дахь жишээний бүтцийг өчүүхэн эвдээд харья:
python
toolur = 0
while toolur < 5:
if toolur == 2:
continue
print(toolur)
toolur = toolur + 10, 1 хэвлэгдээд — программ гацна: төгсгөлгүй давталт. Мөшгье: toolur 2 болмогц if-ийн нөхцөл True — continue — тойрог товчлогдож толгой руу буцав... гэхдээ урагшлуулагч мөр (toolur = toolur + 1) continue-ийн ДООР байсан тул алгасагдчихлаа: toolur 2 хэвээрээ — дахин нөхцөл True — дахин continue — мөнхөд. Өмнөх хичээлийн "урагшлуулагчаа мартах" ослын нарийн хувилбар нь энэ: урагшлуулагч бий — гэхдээ continue түүнийг "үсэрч давчихдаг" байрлалд орчихсон. For дээр энэ урхи байдаггүй (тасалбарыг loop өөрөө урагшлуулдаг) — зөвхөн while + continue хослолын өвчин. Дүрэм: while дотор continue хэрэглэхдээ урагшлуулагч мөр чинь continue-ээс ӨМНӨ биелчихсэн байхаар байрлуул — гурав дахь жишээн дээр oroldlogo-гийн өсөлт хоосон-орцын шалгалтын дараа, гэхдээ үндсэн ажлын өмнө зогсож байсныг эргэж хараарай: тэр байрлал санамсаргүй биш байсан юм. Гацвал — Ctrl+C, таны танил гарц.
Алдаа 3: break давхар loop-оос "бүгдийг" гаргана гэж бодох. Урьдчилсан сануулга — давхар давталтыг бид хараахан үзээгүй ч (loop-ын биед өөр loop байж болдог — Бүлэг 10-ын нутаг), тэнд хүрэхээр хүн бүрийн таардаг төөрөгдлийг одоо тарьчихъя: break нь зөвхөн өөрийн шууд харьяалагдаж буй нэг loop-оос гаргадаг — гадна талын loop үргэлжилсээр байдаг. Гүйлтийн замын зүйрлэлээр: дотор талын жижиг тойргоос гарсан тамирчин гадна талын том замынхаа тойрогт хэвээрээ. Одоо тогтоох зүйл ганцхан өгүүлбэр: "break = нэг давхарга" — давхар loop-т хүрээд энэ өгүүлбэр санаанд чинь буувал энэ хэсэг ажлаа хийсэн гэсэн үг.
break — давталтаас нэн даруй, бүрмөсөн гарна ("замаас гарах хаалга"); continue — энэ тойргийн үлдсэнийг алгасаад дараагийн тойрог руу ("алгасах гүүр"); хоёул бараг үргэлж if-тэй хоршдог.
while True + break бол зориудын төгсгөлгүй давталтын стандарт хэв маяг: зогсолтын шийдвэр биеийн тохирох цэг дээр тодорхой бичигддэг.
Continue-ийн байнгын үүрэг бол шүүлт — биеийн эхэнд "тэнцэхгүй орцыг" гээж, үлдсэн ажлыг цэвэр орцод хийлгэдэг.
Ёс зүйн дүрэм: хил нь толгой мөрөнд багтаж байвал тэнд бич — break/continue-г зөвхөн тойргийн дундаас мэдэгддэг шийдвэрт; олширвол loop-оо дахин зохион байгуул.
Хоёр урхи: loop-ын гадна бичвэл SyntaxError ('break' outside loop); while дотор continue урагшлуулагчийг "үсэрч давбал" төгсгөлгүй давталт — урагшлуулагчаа continue-ээс өмнө байрлуул.
Дараагийн хичээл бол Бүлэг 7-гийн оргил бөгөөд нэг онцгой баяр: бид Бүлэг 6-д барьсан Тоо таах тоглоомдоо эргэж очно. Тэнд "нэг л оролдлого" гэсэн хязгаартай үлдээснийг санаж байна уу — одоо while, break хоёр гартаа байгаа болохоор тоглогчийг онотол нь таалгаж, оролдлогыг нь тоолдог жинхэнэ тоглоом болгоно. Өөрийн барьсан зүйлээ шинэ мэдлэгээрээ сайжруулах — программистын амьдралын хамгийн амттай мөчүүдийн нэг таныг тэнд хүлээж байна.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.