Ачааллж байна...
Салааны самбарт бичих асуултууд маань өдийг хүртэл дан асуултууд байлаа: нэг жинлүүр, нэг харьцуулалт, нэг хариу. Гэтэл амьдралын шийдвэрүүд ихэвчлэн нэгээс олон нөхцөлтэй байдаг. "Кино үзэж болно — гэрийн даалгавраа дуусгасан бөгөөд цаг 21:00 болоогүй бол." "Амралтын өдөр — өнөөдөр бямба эсвэл ням бол." "Орж болно — насанд хүрээгүй биш бол." Эдгээр өгүүлбэрт нөхцөлүүд ганцаараа биш — "бөгөөд", "эсвэл", "биш" гэсэн холбоосуудаар хэлхэгдэж байна. Python-д яг эдгээр холбоосууд байдаг: and (бөгөөд), or (эсвэл), not (биш, үгүйсгэл). Тэднийг логик операторууд гэдэг — харьцуулах операторууд жинлүүр байсан бол логик операторууд нь жинлүүрүүдийн хариуг хооронд нь холбогч юм: тэд bool утгуудыг авч, нэг эцсийн bool гаргадаг.
Энэ хичээлийг бид зориуд кодоос биш, монгол өгүүлбэрээс эхэлнэ. Учир нь and, or, not гурвын ажиллах зарчим танд аль хэдийн байгаа — та тэдгээрийг өдөр бүр ярианыхаа дотор хэрэглэдэг. Шинээр сурах зүйл нь зарчим биш, харин нэг л нарийн зүйл: ярианы хэл заримдаа тодорхойгүй байдаг бол Python-ы холбоосууд туйлын нарийн тодорхойлолттой — тэгээд яг тэр зөрүүн дээр (ялангуяа "эсвэл" гэдэг үгийн орчимд) эхлэгчдийн андуурал амьдардаг юм. Тиймээс бид холбоос бүрийн "хатуу" утгыг эхэлж өгүүлбэрээр тогтоогоод, дараа нь кодоор бататгана.
Гурван холбоосыг гэрээний хэл гэж төсөөлөөрэй — учир нь гэрээ бол тодорхойгүйг тэвчдэггүй бичиг. and бол "хоёр нөхцөл хоёул биелсэн байх ёстой" гэсэн гэрээ: "байр түрээслүүлнэ — урьдчилгаа төлсөн and гэрээнд гарын үсэг зурсан бол." Аль нэг нь дутуу бол гэрээ хүчингүй — хоёулаа True үед л True. or бол "хоёрын ядаж нэг нь биелсэн байхад хангалттай" гэсэн гэрээ: "хөнгөлөлт эдэлнэ — оюутан or ахмад настан бол." Аль нэг нь True бол хангалттай; хоёулаа True бол мөн хангалттай (энэ бол чухал — доор эргэж ирнэ); хоёулаа False үед л гэрээ бүтэхгүй. not бол "эсрэгээр нь эргүүлэгч": ямар ч нөхцөлийн өмнө зогсоод хариуг нь урвуулна — True-г False, False-ийг True болгоно. "Нэвтэрч болно — хориглогдсон биш бол."
Одоо амласан нарийн зүйлээ хөндье: ярианы "эсвэл" хоёр утгатай байдаг. "Цай эсвэл кофе уух уу?" гэхэд бид ихэвчлэн аль нэгийг нь л санал болгодог — хоёуланг нь биш. Гэтэл "оюутан эсвэл ахмад настан хөнгөлөлт эдэлнэ" гэхэд ахмад настай оюутан (хоёулаа таарсан хүн) хөнгөлөлтөө мэдээж авна. Python-ы or бол үргэлж хоёр дахь утгаараа: "ядаж нэг нь — хоёулаа байсан ч болно." Энэ тодорхойлолтыг одоо тогтоочихвол or-ын бүх зан танд гайхшрал төрүүлэхгүй.
Гурван холбоосоо "нүцгэнээр" нь — bool утгууд дээр шууд ажиллуулж харъя:
python
print(True and True)
print(True and False)
print(True or False)
print(False or False)
print(not True)Үр дүн:
True
False
True
False
FalseМөр бүрийг гэрээний хэлээр уншъя. True and True: хоёул биелсэн — гэрээ хүчинтэй, True. True and False: нэг нь дутуу — and-ийн гэрээ нуран, False. True or False: ядаж нэг нь биелсэн — or-д хангалттай, True. False or False: хоёулаа унасан — or ч аврахгүй, False. not True: эргүүлэгч ажиллаад False. Эдгээр таван мөр бол гурван холбоосын бүх "зан араншин" юм — цээжлэх шаардлагагүй: and-ийг "хатуу шаардлагатан" (бүгдийг нэхдэг), or-ыг "уян хатан" (нэгээр л сэтгэл ханадаг), not-ыг "эргүүлэгч" гэж санавал мөр бүрийн хариу зарчмаасаа урган гарна.
Хоёр дахь жишээ: and — жинхэнэ хэрэглээ. Кино үзэх зөвшөөрлийн программ:
python
daalgavar_duussan = input("Даалгавраа дуусгасан уу? (тийм/үгүй) ")
tsag = int(input("Одоо хэдэн цаг болж байна? "))
if daalgavar_duussan == "тийм" and tsag < 21:
print("Кино үзэж болно!")
else:
print("Одоохондоо болохгүй")тийм ба 19 гэж хариулбал: эхний жинлүүр — daalgavar_duussan == "тийм" — True; хоёр дахь жинлүүр — 19 < 21 — True; and хоёр True-г холбоод True — "Кино үзэж болно!". тийм ба 22 гэвэл: True and False — False — else руу. Ажиллагааны дарааллыг анзаараарай: Python эхлээд хоёр харьцуулалтыг тус тусад нь бодож хоёр bool гаргаад, дараа нь and тэдгээрийг нэгтгэдэг — жинлүүрүүд түрүүлж, холбогч дараа нь. Ийнхүү нэг if-ийн дотор хэдэн ч жинлүүр багтах боломж нээгдлээ: өмнө нь хоёр асуултын шийдвэрт хоёр давхар (үүрлэсэн) if бичих л арга байсан бол одоо нэг мөр хангалттай.
Гурав дахь жишээ: or — уян хатан хаалга. Амралтын өдрийг таньдаг программ:
python
udur = input("Өнөөдөр ямар гараг вэ? ")
if udur == "бямба" or udur == "ням":
print("Амралтын өдөр!")
else:
print("Ажлын өдөр")бямба гэвэл: эхний жинлүүр True — or-д нэг True хангалттай тул хоёр дахийг харах ч шаардлагагүй, хариу True. лхагва гэвэл: False or False — False — "Ажлын өдөр". Энд эхлэгчдийн хамгийн түгээмэл бичиглэлийн урхи амьдардаг тул онцолъё: ярианы хэлээр "бямба эсвэл ням бол" гэдгийг шууд буулгаад udur "бямба" or "ням" гэж бичих гар ой маш хүчтэй байдаг. Ингэж бичвэл алдааны мэдэгдэл гарахгүй — гэхдээ программ ямар ч гарагт "Амралтын өдөр!" гэж хэлдэг болчихно (шалтгааныг нь алдаануудын хэсэгт задална). Зөв дүрэм: or/and-ийн хоёр тал тус бүрдээ бүрэн, бие даасан асуулт байх ёстой — udur "бямба" or udur == "ням": udur гэдэг үг хоёр талд хоёуланд нь давтагдана. "Давтахад нүд эрээлжилж байна" гэж бүү болгоомжил — энэ давталт бол Python-ы дүрмийн шаардлага юм.
Дөрөв дэх жишээ: not ба хосолсон бүтэц. Гурав дахь холбоосоо ажилд оруулаад, зэрэг хоёр холбоос хэрэглэж үзье:
python
boroo = input("Бороо орж байна уу? (тийм/үгүй) ")
temperatur = int(input("Гадаа хэдэн хэм байна? "))
boroo_baigaa = boroo == "тийм"
if not boroo_baigaa and temperatur >= 15:
print("Зугаалахад тохиромжтой өдөр")
else:
print("Гэртээ байсан нь дээр байх")үгүй ба 20 гэж хариулбал мөшгье. Гурав дахь мөр шинэ хэв маяг үзүүлж байна: харьцуулалтын хариу bool тул түүнийг шууд variable-д хадгалж болно — boroo_baigaa хайрцганд False орлоо (учир нь "үгүй" == "тийм" нь False). Bool хичээлийн "нэрийг асуулт шиг уншигдахаар өг" гэсэн дадал энд гялалзана: нөхцөл маань not boroo_baigaa and temperatur >= 15 буюу бараг л өгүүлбэр шиг — "бороо байгаа биш бөгөөд хэм 15-аас дээш". not False нь True, 20 >= 15 нь True, True and True — "Зугаалахад тохиромжтой өдөр". Нэг нарийн ширийн: not нь and/or хоёроос түрүүлж ажилладаг (тооны * нь +-аас түрүүлдэг шиг) тул энд хаалт хэрэггүй байсан — гэхдээ тооны хичээлийн зөвлөгөө энд ч хүчинтэй: эргэлзээ төрмөгц хаалт тавь. (not boroo_baigaa) and (temperatur >= 15) гэж бичихэд утга яг ижил, уншихад бүр ч тод.
Тав дахь жишээ: and ба or-ын ялгаа нэг дор. Хоёр холбоосын зан хэрхэн зөрдгийг нэг орц дээр тулгаж үзье:
python
nas = 25
if nas >= 13 and nas <= 19:
print("and хэлэхдээ: өсвөр насны хүн")
if nas >= 13 or nas <= 19:
print("or хэлэхдээ: энэ мөр хэвлэгдэнэ")Үр дүн:
or хэлэхдээ: энэ мөр хэвлэгдэнэ25 нас дээр хоёр жинлүүр: 25 >= 13 нь True, 25 <= 19 нь False. and: True and False — False, эхний салаа алгасагдана — зөв: 25 бол өсвөр нас биш. or: True or False — True — хоёр дахь нь биелэв. Энд нэг ерөнхий ажиглалт нуугдаж байна: x >= 13 or x <= 19 гэсэн нөхцөл үнэндээ ямар ч тоонд True гардаг (13-аас доош бүх тоо хоёр дахь шалгуурыг, 13-аас дээш бүх тоо эхнийхийг хангадаг — гадуур нь үлдэх тоо алга). "Хэзээд True нөхцөл" бол бараг үргэлж санамсаргүй алдаа — программист "хоёр хилийн хооронд" гэж бодож байгаад and-ийн оронд or тавьчихсан шинж юм. Толгойдоо хадгалах дүрэм: мужийн дотор (хооронд) — and; мужийн гадна эсвэл хоёр тусдаа боломж — or. "13-19 хооронд" = >= 13 and <= 19; "бямба юмуу ням" = or.
Хүсвэл туршаад үзээрэй: өөрийн "төгс өдрийн" нөхцөлийг гурван шалгуураар бичээрэй — жишээ нь амралтын өдөр бөгөөд бороогүй бөгөөд даалгавар дууссан (гурван нөхцөлийг хоёр and-аар холбож болно: a and b and c). Сонирхвол таван жишээний or-ын мөрөнд nas-ийн ямар ч утга тавиад True хэвээр байгааг батлаад үзээрэй — "хэзээд True" нөхцөлийг нүдээрээ таньж сурах нь ирээдүйн өөрийнхөө алдааг таних дадлага юм.
Алдаа 1: udur == "бямба" or "ням" — хагас дутуу харьцуулалт. Гурав дахь жишээн дээр амласан задлан шинжилгээ:
python
udur = "лхагва"
if udur == "бямба" or "ням":
print("Амралтын өдөр!")Үр дүн:
Амралтын өдөр!Лхагва гарагт амралт зарлачихлаа — алдааны мэдэгдэлгүйгээр. Юу болов? Python энэ нөхцөлийг бидний санаснаар "udur нь бямба эсвэл ням үү" гэж уншдаггүй — тэр or-ын хоёр талыг тус тусад нь үнэлдэг: зүүн тал udur == "бямба" нь False; баруун тал нь... зүгээр л "ням" гэсэн string. Тэгээд string нь True/False биш байтал or яаж ажиллаа гэж? Энд Python-ы нэг гүн дүрэм илэрч байна: нөхцөл шаардсан газарт Python ямар ч утгыг bool болгож "тайлбарлаж" чаддаг бөгөөд хоосон биш string бүр True-д тоологддог юм. Тиймээс нөхцөл маань False or True болж — үргэлж True. Энэ "юу ч True болдог" дүрмийн гүнд одоо шумбах шаардлагагүй — авч үлдэх зүйл нь оношлогооны шинж тэмдэг: or/and-тай нөхцөл чинь "хэзээд биелээд" байвал хоёр талаа тус бүрд нь бүрэн асуулт мөн эсэхийг шалга — аль нэг тал нь ганцаардсан утга (жинлүүргүй, харьцуулалтгүй) зогсож байвал тэр нь буруу юм.
Алдаа 2: Хоёр хилийг and-гүй "математик маягаар" залгах гэх. Сургуулийн математикт 13 ≤ x ≤ 19 гэж бичдэг дадлаар:
python
if 13 <= nas and <= 19:
print("Өсвөр насных")Python:
SyntaxError: invalid syntaxand-ийн баруун тал <= 19 гэсэн "толгойгүй" харьцуулалт болчихож — юуг 19-тэй жинлэхийг Python мэдэхгүй. Зөв нь хоёр талд хоёуланд нь nas-аа бичих: 13 <= nas and nas <= 19. (Сонирхолтой нь: Python үнэндээ математикийн 13 <= nas <= 19 гэсэн "гинжин" бичиглэлийг шууд ойлгодог цөөн хэлний нэг — энэ бичиглэл бүрэн зөв ажиллана. Гэхдээ энэ сургалт and-тай задаргаатай хэлбэрийг үндсэн болгож заана: учир нь and-ийн задаргаа нь ямар ч төрлийн нөхцөлд өргөжих цогц арга бол гинжин хэлбэр нь зөвхөн харьцуулалтын хэлхээнд ажилладаг тусгай тохиолдол юм. Хоёуланг нь таньдаг байгаад, бичихдээ задаргаатайг сонго.)
Алдаа 3: not-ын үйлчлэх хүрээг андуурах. Үгүйсгэлийг бүтэн нөхцөлд хамааруулах санаатай байж ганц гишүүнд нь тавьчих:
python
boroo = "үгүй"
salhi = "тийм"
if not boroo == "тийм" and salhi == "тийм":
print("Бороогүй ч салхитай")Энэ жишээ ажиллана, үр дүн нь ч энэ орцод "зөв" — гэхдээ азаар: not boroo "тийм" гэдгийг Python not (boroo "тийм") гэж уншсан нь бичигчийн санаатай энэ удаад таарчээ. Харин бичигч "not (бүтэн нөхцөл)" буюу "(бороотой бөгөөд салхитай) биш" гэсэн санаатай байсан бол үр дүн нь өөр гарах орцууд бий — not хаалтгүй үедээ зөвхөн шууд ард байгаа нэг асуултад л үйлчилдэг болохоос and-аар холбогдсон бүх хэлхээнд үйлчилдэггүй юм. Ийм "заримдаа таардаг" алдаа бол мэдэгдэлтэй алдаанаас аюултай: туршилтын цөөн орцод зөв ажиллаад итгэл төрүүлчихдэг. Хамгаалалт нь ганц дадал: not-ыг ямар нэг нийлмэл зүйлд хамааруулах бүрдээ хаалтаар хүрээгээ ил зарла — not (boroo "тийм" and salhi "тийм") гэж санаагаа тэмдэгтээр батал. Хаалт бол энд гоёл биш — санааны хил юм.
and — "хоёул True бол True" (хатуу шаардлагатан), or — "ядаж нэг нь True бол True, хоёулаа байсан ч болно" (уян хатан), not — хариуг урвуулагч.
or/and-ийн хоёр тал тус бүрдээ бүрэн асуулт: udur "бямба" or udur "ням" — давталт нь дүрэм; хагас дутуу тал нь "хэзээд True" урхи үүсгэдэг.
Мужийн дотор — and (13 <= nas and nas <= 19), тусдаа боломжууд — or; "хэзээд True/хэзээд False" нөхцөл бол бараг үргэлж and/or солигдсоны шинж.
Харьцуулалтын хариуг variable-д хадгалж (boroo_baigaa = boroo == "тийм") нөхцөлөө өгүүлбэр шиг уншигдахаар бичиж болно.
not-ын хүрээ — шууд ард нь байгаа нэг асуулт; нийлмэл зүйлийг үгүйсгэхдээ хаалтаар хилээ ил тавь.
Дараагийн хичээл бол Түвшин 1-ийн оргил — бидний анхны хамтдаа бүтээх төсөл: Тоо таах тоглоом. Variable, input, int(), if/elif/else, харьцуулах операторууд — таны цуглуулсан бүх эд анги нэг жижиг, гэхдээ жинхэнэ тоглоом болж угсрагдахыг мөр мөрөөр нь хамт барьж үзнэ. Энэ бол уншээд дагадаг хичээл — даалгавар биш гэдгийг сануулъя: бид хамтдаа барина.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.