Ачааллж байна...
Өнгөрсөн хоёр хичээлд бид салаа зам нээж (if), самбарт нь бичих асуултуудаа (харьцуулах операторууд) сурлаа. Гэхдээ өмнөх хичээлийн жишээнүүдэд нэг эвгүй зүйл нүдэнд өртсөн байх: "өсвөр насанд хүрсэн үү, үгүй юу" гэсэн хоёр талт шийдвэрийг бид хоёр тусдаа if-ээр, нөхцөлүүдийг нь гараар "нөхөж" (nas >= 13 ба nas < 13) бичсэн. Гурван талт шийдвэр дээр гурван if, нөхцөл бүрийг гараар тааруулж... Энэ арга ажилладаг ч гурван дутагдалтай: нөхцөлүүдээ өөрөө нөхөж тааруулах хариуцлага бүхэлдээ бидэнд ноогддог (нэг тэмдэг алдвал "дундаа завсартай" эсвэл "давхацсан" салаанууд гарна), Python асуулт бүрийг бүгдийг нь шалгадаг (эхнийх нь True гарсан ч үлдсэнийг нь дэмий асуусаар байдаг), мөн кодыг уншихад "эдгээр if-үүд нэг шийдвэрийн хэсгүүд юм" гэдэг нь харагддаггүй. Өнөөдөр бид энэ гурван дутагдлыг нэг дор арилгадаг хоёр шинэ үгтэй танилцана: elif ба else. Тэд if-тэй нийлээд Python-ы жинхэнэ, бүрэн хэмжээний шийдвэрийн бүтцийг бүрдүүлдэг: "хэрэв энэ бол — ингэ; эс бөгөөс хэрэв тэр бол — тэг; аль нь ч биш бол — ингэ."
Хоёр үгийн нэрийг эхэлж тайлъя. else нь англиар "эс бөгөөс, бусад тохиолдолд" гэсэн үг. elif нь else if гэсэн хоёр үгийн нийлмэл товчлол — "эс бөгөөс хэрэв" гэсэн утгатай. Python товчилсон нь санамсаргүй биш: энэ үг маш их бичигддэг тул богино байх нь өдөр тутамд ашигтай гэж үзжээ.
Өмнөх хичээлүүдийн замын салааг өргөтгөе. Хоёр if гэдэг нь хоёр тусдаа уулзвар юм: та эхний уулзварт ирж асуултад хариулаад (салаа руу орсон ч, ороогүй ч) үндсэн замаараа дараагийн уулзварт заавал очиж дахин асуултад хариулдаг. Харин if/elif/else бол огт өөр зохион байгуулалт: нэг уулзвар, олон салаатай. Төсөөлөөрэй — таны өмнө нэг том уулзвар, түүнээс таван зам салж байна, уулзварын голд нэг жижүүр зогсож байна. Жижүүр таны бичиг баримтыг аваад салааны самбаруудыг дээрээс нь дарааллаар шалгана: эхний самбарын нөхцөл таарвал таныг тэр зам руу явуулаад — ажлаа тэнд дуусгана: үлдсэн самбаруудыг огт харахгүй, та ч бусад замуудын хажуугаар өнгөрөхгүй. Эхнийх нь таараагүй бол хоёр дахийг шалгана, гэх мэт. Хамгийн сүүлд "бусад бүх хүн" гэсэн самбартай зам байдаг — өмнөх бүх самбарт таараагүй хэн ч тэр замаар л явна, түүнд нөхцөл гэж байхгүй.
Энэ зургаас бүтцийн гурван том чанар урган гарна — гурвууланг нь цээжээр биш, жижүүрийн ажлын зарчмаас "гаргаж" сураарай. Нэг: аль ч аялагч яг ганцхан замаар явна — олон салааны нөхцөл нь "үнэндээ" таарч байсан ч жижүүр эхний таарсан дээр нь ажлаа зогсоодог тул хоёр зам дайрах боломжгүй. Хоёр: шалгалт дээрээс доош дараалалтай — тиймээс самбаруудын дараалал бол утга тээдэг шийдвэр: буруу дараалал буруу зан гаргадаг (үүнийг доор жишээгээр нүдэн дээр тавина). Гурав: сүүлийн "бусад бүх хүн" зам (else) нь нөхцөлгүй — түүний утга нь "өмнөх бүгд таараагүй" гэдэгт л оршдог.
Өмнөх хичээлийн хоёр if-тэй жишээгээ шинэ бүтцээр дахин бичье:
python
nas = int(input("Та хэдэн настай вэ? "))
if nas >= 13:
print("Та өсвөр насанд хүрсэн байна")
else:
print("Та хараахан өсвөр насанд хүрээгүй байна")
print("Баярлалаа")15 гэж хариулбал:
Та хэдэн настай вэ? 15
Та өсвөр насанд хүрсэн байна
Баярлалаа10 гэж хариулбал:
Та хэдэн настай вэ? 10
Та хараахан өсвөр насанд хүрээгүй байна
БаярлалааБүтцийг задалъя. if-ийн хэсэг бүрэн танил: нөхцөл, хоёр цэг, шигдсэн бие. Шинэ зочин нь else: мөр — гурван зүйлийг ажигла. Нэгд: else нь if-тэйгээ нэг түвшинд (шигдээгүй) бичигддэг — учир нь тэр if-ийн биеийн мөр биш, if-тэй эн тэнцүү хамтрагч нь: нэг уулзварын хоёр зам. Хоёрд: else-ийн ард нөхцөл байхгүй, шууд хоёр цэг — жижүүрийн зургаар бол "бусад бүх хүн" самбарт асуулт байдаггүйтэй адил; else-д нөхцөл бичвэл ямар алдаа гардагийг доор үзнэ. Гуравт: else ч мөн өөрийн шигдсэн биетэй. Ажиллагаа нь: nas >= 13 асуулт True бол if-ийн бие биелээд else бүхэлдээ алгасагдана; False бол if-ийн бие алгасагдаад else-ийн бие биелнэ. Ямар ч тохиолдолд яг нэг бие биелж, дараа нь хоёул "Баярлалаа" гэсэн үндсэн замд нийлнэ. Өмнөх хичээлд бид nas < 13 гэсэн хоёр дахь нөхцөлийг гараар нөхөж бичсэнийг санаж байна уу — одоо тэр ажлыг else үүрч авлаа: "нөгөө бүх тохиолдол" гэдгийг тэр тодорхойлолтоороо хамардаг тул завсар үлдэх, давхцах эрсдэл зарчмын хувьд байхгүй боллоо.
Хоёр дахь жишээ: elif ордог нь — гурван зам. Хоёроос олон салаа хэрэгтэй үед elif дундуур нь ордог:
python
minii_ono = 87
niiziin_ono = 92
if minii_ono > niiziin_ono:
print("Би түрүүллээ")
elif minii_ono < niiziin_ono:
print("Найз минь түрүүллээ")
else:
print("Тэнцлээ")Үр дүн:
Найз минь түрүүллээӨмнөх хичээлийн гурван тусдаа if-тэй жишээ шинэ дүрээрээ. Жижүүрийн ажлыг мөшгье: эхний самбар — 87 > 92 — False, цааш. Хоёр дахь самбар — 87 < 92 — True: энэ замаар явуулаад ажил дууслаа — else-ийг харах ч үгүй. Гурван тусдаа if байсан хуучин хувилбарт Python гурван асуултыг гурвууланг нь шалгадаг байсан бол одоо хоёр дахь дээр зогслоо; мөн "тэнцлээ" гэсэн гурав дахь нөхцөлийг (==) бид бичих шаардлагагүй боллоо — их ч биш, бага ч биш бол тэнцүү гэдгийг else өөрөө "мэднэ". Бүтцийн дүрэм: if нэг л удаа, эхэнд; elif хэдэн ч удаа, дундуур; else нэг л удаа буюу огт үгүй, төгсгөлд. (else заавал биш: "бусад тохиолдолд юу ч хийхгүй" байж болно — тэгвэл else-ээ зүгээр л бичихгүй орхино.)
Гурав дахь жишээ: олон elif — үнэлгээний шат. Оноог үсгэн үнэлгээ болгох сонгодог бодлого:
python
ono = int(input("Оноогоо оруулна уу: "))
if ono >= 90:
print("Үнэлгээ: A")
elif ono >= 80:
print("Үнэлгээ: B")
elif ono >= 70:
print("Үнэлгээ: C")
else:
print("Үнэлгээ: D")85 гэж оруулбал мөшгье: 85 >= 90 — False. 85 >= 80 — True: "Үнэлгээ: B", ажил дууслаа. Одоо нэг нүд онгойлгом ажиглалт: хоёр дахь самбарын нөхцөл ердөө ono >= 80 гэж бичигдсэн — гэтэл 95 оноотой хүн бас 80-аас дээш байтал яагаад B авчихдаггүй юм бэ? Учир нь 95-тай хүн хоёр дахь самбарт хэзээ ч хүрдэггүй: эхний самбар (>= 90) түүнийг аль хэдийн авч явчихсан. Өөрөөр хэлбэл elif-ийн нөхцөл нь ганцаараа биш, "өмнөхүүд нь таараагүй" гэсэн далд нөхцөлтэй хамт уншигддаг: хоёр дахь самбарын жинхэнэ утга нь "90-д хүрээгүй, гэхдээ 80-д хүрсэн" юм. Энэ л далд хамтрагчийн ачаар бид ono >= 80 and ono < 90 гэсэн урт нөхцөл бичихээс чөлөөлөгдөж байгаа — дарааллын хүчийг ашиглаж нөхцөлөө товчилдог энэ хэв маяг нь if/elif-ийн хамгийн үнэ цэнэтэй увдис юм.
Дөрөв дэх жишээ: дараалал буруу бол — эвдэрсэн шат. Тэр хүчний нөгөө тал: дарааллаа алдвал утга сүйрдэг. Дээрх програмаа урвуу дарааллаар бичээд үзье:
python
ono = int(input("Оноогоо оруулна уу: "))
if ono >= 70:
print("Үнэлгээ: C")
elif ono >= 80:
print("Үнэлгээ: B")
elif ono >= 90:
print("Үнэлгээ: A")
else:
print("Үнэлгээ: D")95 гэж оруулбал: эхний самбар — 95 >= 70 — True: "Үнэлгээ: C", ажил дууслаа. Төгс оноотой сурагч C авлаа! Алдааны мэдэгдэл байхгүй, бичиглэл бүрэн зөв, программ "ажиллаж" байгаа — гэхдээ утга нь буруу: >= 70 гэсэн өргөн нөхцөл эхэнд зогсоод 70-аас дээших бүх хүнийг өөр дээрээ авчихаж байна; >= 80, >= 90 самбаруудад хэн ч хүрэхгүй "үхмэл салаанууд" болжээ. Энэ хоёр жишээг зэрэгцүүлснээс гарах дүрэм: >= маягийн "давхардсан" нөхцөлүүдтэй үед нарийн (хатуу) нөхцөлөө эхэнд, өргөнөө сүүлд нь тавь — шатыг дээрээс нь доош барь. Ерөнхий сургамж нь бүр чухал: if/elif бүтэцтэй программ буруу ажиллаж байвал нөхцөлүүдээ нэг бүрчлэн биш, дарааллыг нь эхэлж сэжиглэ — "энэ утга аль самбарт түрүүлж баригдах вэ" гэж мөшгих нь оношийг олдог.
Хүсвэл туршаад үзээрэй: өдрийн цагаар мэндчилгээ сонгодог программ бичээрэй — цагийг асуугаад 12-оос өмнө "Өглөөний мэнд", 18-аас өмнө "Өдрийн мэнд", бусад үед "Оройн мэнд". Дарааллаа зориуд эвдээд 9 цагт "Өдрийн мэнд" гарч байгааг ажиглавал дөрөв дэх жишээний сургамж гарт чинь бууна. Сонирхвол else-гүй хувилбар бичээд аль ч нөхцөлд таараагүй орцод программ юу ч хэлэлгүй өнгөрдгийг үзээрэй.
Алдаа 1: else-д нөхцөл бичих. "Бусад тохиолдолд" гэдгийг тодруулах гэсэн зөн совингоор:
python
if nas >= 13:
print("Өсвөр насных")
else nas < 13:
print("Бага насных")Python:
SyntaxError: expected ':'Танил "хоёр цэг хүлээж байсан" мэдэгдэл — гэхдээ учир нь энэ удаад өөр: Python else гэдэг үгийн ард шууд хоёр цэг хүлээдэг бөгөөд дундах nas < 13 гэсэн "нэмэлт" нь түүний хувьд ойлгомжгүй завсарлага юм. Мөн чанарын дүрэм: else бол асуулт биш — түүний утга "өмнөх бүгд False гарсан" гэдэгт бүрэн агуулагддаг тул нөхцөл бичих газар нь байдаггүй. Хэрэв танд "бусад тохиолдол дотроос бас нэг нөхцөл шалгамаар" санагдаж байвал — таны хайж байгаа үг чинь elif: elif nas < 13: гэвэл бүрэн зөв бичиглэл болно.
Алдаа 2: elif-ийг өмнөх if-гүйгээр эхлүүлэх. Салаагаа шинэ if-ээр "таслаад" elif залгах гээд:
python
nas = 15
elif nas >= 13:
print("Өсвөр насных")Python:
SyntaxError: invalid syntaxelif бол if-ийн үргэлжлэл — жижүүрийн хоёр дахь самбар бөгөөд эхний самбаргүйгээр (if-гүйгээр) оршин тогтнох боломжгүй. Python elif гэдэг үгийг хараад дээр нь холбогдох if хайгаад олоогүй тул гацна. Энэ алдаа бодит амьдрал дээр ихэвчлэн мөр устгахаас үүсдэг: урт if/elif бүтцийнхээ эхний if-тэй хэсгийг засварлангаа устгачихвал ард нь "өнчирсөн" elif-үүд үлддэг. Дүрэм: elif/else-тэй бүтцээс мөр устгахдаа бүтцийнхээ толгойг (if-ийн мөрөө) бүрэн бүтэн үлдээсэн эсэхээ шалга.
Алдаа 3: Шигдэлтийн түвшин зөрөх. else-ээ if-тэйгээ биш, биеийнх нь түвшинд бичвэл:
python
if nas >= 13:
print("Өсвөр насных")
else:
print("Бага насных")Python:
SyntaxError: invalid syntaxelse нь if-ийн биеийн дотор шигдчихсэн байна — гэтэл else бол биеийн мөр биш, if-тэй эн тэнцүү хамтрагч гэдгийг анхны жишээн дээр бид тодотгосон. Python шигдсэн else-ийг "биеийн үргэлжлэл" гэж уншаад, биеийн дунд else гэдэг үг утгагүй тул бичиглэлийн алдаа өгчээ. Засах дүрэм нь харааны шинжтэй: if, elif, else гурав нэг босоо шугаманд эхэлж байх ёстой — багана нь зөрсөн л бол бүтэц эвдэрсэн гэсэн үг. VS Code энд нүдээр тусалдаг: зөв түвшинд бичигдсэн if/elif/else гурвуулаа нэг өнгөөр, нэг баганад цувдаг тул "багана шалгах" нь секундын ажил юм.
if/elif/else бол нэг уулзварын олон салаа: Python нөхцөлүүдийг дээрээс доош шалгаж, эхний True дээр биеийг нь биелүүлээд бүтцээс гардаг — яг нэг л салаа биелдэг.
else нь нөхцөлгүй "бусад бүх тохиолдол": if-тэйгээ нэг түвшинд, ард нь шууд хоёр цэгтэй; нөхцөл бичвэл SyntaxError.
elif-ийн нөхцөл "өмнөхүүд таараагүй" гэсэн далд хамтрагчтайгаа уншигддаг тул нөхцөлүүдийг товч бичих боломж олгодог.
Дараалал бол утга: давхардсан нөхцөлүүдэд нарийнаа эхэнд, өргөнөө сүүлд — эс бөгөөс өргөн нөхцөл бүгдийг "залгиад" доод салаанууд үхмэл болно.
if/elif/else гурав нэг босоо шугамд эхэлнэ; elif ганцаараа оршдоггүй — толгой if нь заавал байна.
Дараагийн хичээлд бид самбарын асуултуудаа хослуулж сурна: and, or, not — "13-аас дээш бөгөөд 20-оос доош", "бямба эсвэл ням" гэх мэт нийлмэл нөхцөлүүд. Гурав дахь жишээн дээр "ono >= 80 and ono < 90 гэсэн урт нөхцөл бичихээс чөлөөлөгдөв" гэж өнгөрсөн шүү дээ — тэр and гэдэг үг өөрөө юу болохыг тэнд бүрэн тайлна.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.