Ачааллж байна...
Шинэ бүлэгт тавтай морил. Өмнөх бүлэгт бид хайрцаг (variable) хийж сурсан — энэ бүлэгт бид хайрцганд юу хийж болдгийг нарийвчлан судална. Та өмнөх хичээлүүдэд хоёр төрлийн зүйл хадгалж үзсэн: бичвэр ("Бат") болон тоо (12). Тэр хоёрыг бид хааяа "хашилттай, хашилтгүй" гэж л ялгаж ирсэн — гэвч энэ ялгааны цаана Python-ы нэг том, суурь ойлголт нуугдаж байгаа юм: өгөгдлийн төрөл (data type). Python хайрцган доторх утга бүрийг ямар нэг "төрөлд" харьяалуулж үздэг бөгөөд утгын төрлөөс нь хамаараад түүнтэй юу хийж болох нь шийдэгддэг. Тоотой тооцоолол хийж болно, бичвэртэй болохгүй; бичвэрийг том үсгээр болгож болно, тоог болохгүй. Энэ бүлэг таныг Python-ы үндсэн төрлүүдтэй нэг бүрчлэн танилцуулах бөгөөд өнөөдөр бид хамгийн эхнийхээс — тооноос — эхэлнэ.
Гэтэл эхний гайхшрал энд хүлээж байна: Python-д "тоо" гэдэг нэг төрөл байдаггүй, хоёр байдаг. Бүхэл тоог int гэдэг (англи integer буюу "бүхэл тоо" гэсэн үгийн товчлол), бутархай тоог float гэдэг (англиар "хөвөгч" гэсэн утгатай — нэрний учрыг жаахан доор тайлбарлана). 5 бол int, 5.5 бол float. "Хоёулаа л тоо биз дээ, ялгаад яах юм бэ" гэж бодож болох ч энэ ялгааг мэдэхгүй хүн энэ хичээлийн төгсгөлд үзэх нэг "хачирхалтай" үзэгдлийг тайлбарлаж чадахгүй: 10-ыг 2-т хуваахад Python 5 биш, 5.0 гэж хариулдаг юм. Хичээлээ дуустал уншсан хүнд энэ нь хачирхалтай биш, зүй ёсны харагдах болно.
Int ба float хоёрын ялгааг амьдрал дээрээ та аль хэдийн мэддэг — зөвхөн нэрлэж сураагүй байгаа. Дэлхийн бүх "хэмжигдэхүүнийг" хоёр том ангилалд хувааж болно. Нэг талд ширхэгээр тоологддог зүйлс: айлын хүүхдийн тоо, хайрцган доторх өндөг, ангийн сурагчид. Эдгээр нь үргэлж бүхэл байдаг — "гурван хагас хүүхэд", "хоёр аравны долоон сурагч" гэж байдаггүй. Нөгөө талд хэмжигддэг зүйлс: хүний өндөр (1.62 метр), агаарын хэм (23.5 хэм), гүйлтийн хугацаа (12.8 секунд). Эдгээр нь дурын нарийвчлалтай, "дундах" утгуудтай байж болдог. Int бол ширхэгийн ертөнц, float бол хэмжээсийн ертөнц юм. Ямар мэдээлэл хадгалахаа бодохдоо "энэ ширхэгээр тоологдох уу, хэмжигдэх үү" гэж асуувал аль төрөл хэрэгтэй нь ихэвчлэн өөрөө хэлээд өгнө: сурагчдын тоо — int, сурагчдын дундаж өндөр — float.
Бичиглэлийн ялгаа нь ганцхан тэмдэгт: цэг. Тоон дотор цэг байвал float, байхгүй бол int. Энд нэг зүйлийг Монгол уншигчид тусгайлан хэлэх ёстой: бид бутархайг таслалаар бичиж сурсан (5,5) бол Python болон бүх программчлалын ертөнц цэгээр бичдэг (5.5). Таслал Python-д огт өөр үүрэгтэй (өмнөх хичээлд print дотор хоёр зүйл тусгаарлахад хэрэглэснийг санаж байгаа байх) тул бутархайд таслал хэрэглэвэл гэнэтийн, ойлгомжгүй үр дүн гарна — доор алдаануудын хэсэгт бид үүнийг нүдээрээ үзнэ.
Хоёр төрлөө хайрцагнуудад хийж, харьцуулж үзье:
python
suragchdiin_too = 25
dundaj_undur = 1.58
print(suragchdiin_too)
print(dundaj_undur)Үр дүн:
25
1.58Мөр бүрээр нь: 1-р мөрөнд 25 гэсэн цэггүй тоо хадгалагдлаа — Python үүнийг int гэж таньдаг. 2-р мөрөнд 1.58 гэсэн цэгтэй тоо хадгалагдлаа — Python үүнийг float гэж таньдаг. Бид Python-д "энэ int шүү, энэ float шүү" гэж хэлээгүй гэдгийг анзаараарай: Python бичиглэлийг нь хараад төрлийг нь өөрөө тогтоосон. Энэ бол Python-ы ерөнхий зан: хайрцганд юу хийхэд төрлийг нь асуулгүй, утгаас нь өөрөө "үнэрлэж" мэддэг. 3, 4-р мөрүүд хоёр утгыг хэвлэв — хэвлэгдэхдээ int нь int-ээрээ (25), float нь float-аараа (1.58) гарч байгаа.
Хоёр төрөл тооцоололд чөлөөтэй ордог бөгөөд өмнөх бүлгүүдээс та нэмэх (+), хасах (-) хоёрыг мэднэ. Одоо албан ёсоор дөрвөө гүйцээе: үржүүлэх нь * (одтой тэмдэг — гар дээр Shift + 8), хуваах нь / (налуу зураас). Бид яагаад × ба ÷ гэсэн танил тэмдгүүдийг хэрэглэдэггүй вэ гэвэл: компьютерын гар дээр тэдгээр тэмдэг байдаггүй учраас программчлалын анхны өдрүүдэд гар дээр байсан хамгийн ойролцоо тэмдгүүдийг сонгосон нь өдий хүрчээ.
Хоёр дахь жишээ: дөрвөн үйлдэл ажил дээрээ. Дэлгүүрийн жижиг тооцоо хийе:
python
huushuurnii_une = 1500
shirheg = 4
print(huushuurnii_une * shirheg)
print(huushuurnii_une - 200)Үр дүн:
6000
1300Мөшгье: 3-р мөрөнд Python хоёр хайрцгийг онгойлгож 1500 * 4 = 6000 гэж бодоод хэвлэв — дөрвөн хуушуурын үнэ. 4-р мөрөнд 1500 - 200 = 1300 — хямдралтай үнэ. Хоёр үйлдлийн орц бүгд int байсан тул үр дүн нь ч int гарлаа: бүхэл тоонуудыг нэмэх, хасах, үржүүлэхэд бутархай "үүсэх" газар байхгүй гэдэг нь ойлгомжтой.
Гурав дахь жишээ: int ба float холилдвол. Хоёр өөр ертөнцийн тоонууд нэг тооцоололд орвол юу болох вэ:
python
nom_une = 12000
hyamdral_huvi = 0.5
print(nom_une * hyamdral_huvi)Үр дүн:
6000.012000 (int)-ыг 0.5 (float)-аар үржүүлэхэд 6000.0 гэсэн float гарлаа — утгын хувьд бүхэл боловч төгсгөлийн .0 нь "би float байна" гэсэн тамга юм. Энд Python-ы нэг тогтмол дүрэм ажиллаж байна: тооцоололд ганц ч float оролцвол үр дүн нь float болдог. Үүнийг санахад хялбар зүйрлэл: цэвэр ус (int) дээр нэг дусал будаг (float) дусаахад бүх ус будагтай болдог — "floatын дусал" тооцооллыг бүхэлд нь float болгож "буддаг" юм. Яагаад ийм дүрэмтэй вэ гэвэл: float оролцсон тооцооллын хариу бутархай гарч магадгүй тул Python найдвартай талд нь гарч, хариугаа бутархай багтаах чадвартай саванд (float-д) хийдэг хэрэг.
Дөрөв дэх жишээ: хуваалт ба алдарт 5.0. Одоо хичээлийн эхэнд амласан оньсогоо тайлъя:
python
print(10 / 2)Үр дүн:
5.0Хоёр орц хоёулаа int, хариу нь ч бүхэл (5) гарахаар байтал Python 5.0 буюу float буцаалаа. Яагаад? Учир нь хуваах үйлдэл ямар ч орцтой байсан үр дүнгээ бутархай гаргах "эрсдэлтэй" үйлдэл юм: 10 / 2 нь азаар бүхэл боловч 10 / 3 бол гарцаагүй бутархай (3.3333...). Python үйлдэл бүрд "энэ удаад бүхэл гарах болов уу" гэж таамаглаж суудаггүй — оронд нь энгийн, өөрчлөгдөшгүй журам баримталдаг: / үйлдлийн хариу үргэлж float. Хариу нь бүхэл таарсан ч float саванд хийгээд (5.0), бутархай гарсан ч мөн адил (3.3333...). Ингэснээр хуваалтын үр дүнгийн төрөл хэзээ ч "гэнэтийн бэлэг" байдаггүй — үргэлж урьдчилан мэдэгдэж байдаг. Тиймээс 5.0-ыг хараад "алдаа гаргачихлаа" гэж бүү сандраарай: энэ бол Python зөв ажиллаж байгаагийн тэмдэг. (Бүхэл хариу өгдөг тусгай хуваалт Python-д бас байдаг — түүнтэй бид энэ бүлгийн "Тоон үйлдлүүд" хичээлд уулзана.)
Тав дахь жишээ: float-ын нэг "хачин зан". Дараагийн үзэгдлийг та эрт орой хэзээ нэгэн цагт өөрөө олж харах тул одоо, бэлтгэлтэй үедээ танилцуулъя:
python
print(0.1 + 0.2)Үр дүн:
0.30000000000000004Хүлээлт 0.3 байтал ард нь урт "сүүлтэй" тоо гарчихлаа. Энэ бол Python-ы алдаа ч биш, таны алдаа ч биш — бүх программчлалын хэлэнд, бүх компьютерт байдаг float-ын төрөлхийн онцлог юм. Учир нь товчхондоо: компьютер тоог дотроо аравтын биш, өөр (хоёртын) системд хадгалдаг бөгөөд 0.1, 0.2 мэт зарим "бидний нүдэнд дугуй" тоонууд тэр системд төгсгөлгүй бутархай болдог — яг л 1-ийг 3-т хуваахад аравтын системд 0.3333... төгсгөлгүй үргэлжилдэг шиг. Компьютер төгсгөлгүйг хадгалж чадахгүй тул маш нарийн боловч төгс биш ойролцоо утга хадгалдаг, тэр өчүүхэн зөрүү заримдаа ийнхүү нүдэнд ил гардаг. (Float гэдэг нэр ч эндээс: "floating point" буюу "хөвөгч цэг" гэсэн, тоог ойролцоолон хадгалдаг тэр аргын нэр юм.) Танд одоо хэрэгтэй дүгнэлт хоёрхон: нэгд — ийм сүүлтэй тоо харвал эвдрэл биш, хэвийн үзэгдэл; хоёрт — float бол "маш нарийн ойролцоо" төрөл тул мөнгө тоолох мэт төгс нарийвчлал шаардсан газарт программистууд аль болох int хэрэглэхийг хичээдэг (төгрөгийг 1500.0 гэхийн оронд 1500 гэж бүхлээр нь хадгалдаг нь үүнтэй холбоотой).
Хүсвэл туршаад үзээрэй: өөрийн насаа int-ээр, өндрөө float-аар хадгалаад хоёуланг нь хэвлэх; дараа нь насаа 2-т хувааж үр дүнгийн төгсгөлд .0 ирснийг нүдээрээ хараарай. Сонирхвол 10 / 3-ыг хэвлээд урт бутархайтай нүүр тулж, дараа нь 1 / 3 + 1 / 3 + 1 / 3 гэж бичээд юу гарахыг таамаглаад туршаарай — float-ын "төгс биш" зан хаана илэрч, хаана илрэхгүйг ажиглах нь сонин байх болно.
Алдаа 1: Бутархайг таслалаар бичих. Монгол бичгийн дадлаараа бутархайг таслалтай бичвэл:
python
undur = 1,58
print(undur + 1)Python:
TypeError: can only concatenate tuple (not "int") to tupleОрчуулбал: "TypeError (төрлийн алдаа): tuple дээр зөвхөн tuple залгаж болно, int болохгүй." Мэдэгдэл дотор tuple гэсэн огт танихгүй үг гарч ирлээ — энэ бол хожмын бүлгүүдийн эзэн, өнөөдөр танилцах шаардлагагүй. Танд хэрэгтэй нь болсон явдлын мөн чанар: Python 1,58 гэдгийг "нэг цэг тавин найм" гэж уншаагүй — таслалыг тусгаарлагч гэж үзээд "1 гэсэн зүйл, 58 гэсэн зүйл — хоёр зүйлийн багц юм байна" гэж ойлгосон (тэр "багцыг" нь tuple гэдэг юм). Тэгээд тэр багц дээр 1 нэмэх гэхээр төрөл нь таарахгүй гацлаа. Сургамж: алдааны мэдэгдэлд огт хүлээгээгүй, хачин үг гарч ирвэл "би юуг буруу бичсэнээс Python намайг өөрөөр ойлгочихов" гэж эргэж хараарай — энэ тохиолдолд буруу нь ганц таслал. Засвар: undur = 1.58.
Алдаа 2: Тоогоо хашилтад хийчих. Хашилт, тооны харилцааг андуурвал:
python
nas = "12"
print(nas + 1)Python:
TypeError: can only concatenate str (not "int") to strОрчуулбал: "str дээр зөвхөн str залгаж болно, int болохгүй." Танил дүрмээ саная: хашилтанд хийсэн бүхэн string — "12" бол тоо биш, "1 гэсэн тэмдэгт, ард нь 2 гэсэн тэмдэгт" бүхий бичвэр юм. Бидний нүдэнд "12" ба 12 адилхан харагдавч Python-ы хувьд нэг нь бичвэрийн ертөнцийн, нөгөө нь тооны ертөнцийн иргэд — тиймээс "бичвэр дээр тоо нэмэх" гэдэг түүнд утгагүй захиалга болсон хэрэг. Энэ хоёр ертөнцийн ялгаа маш чухал тул дараагийн хичээл (string) бүхэлдээ энэ сэдвийг гүнзгийрүүлэх болно — одоохондоо дүрэм нь: тооцоолол хийх тоо хашилтгүй амьдарна. Засвар: nas = 12.
Алдаа 3: Тэгд хуваах. Comment хичээлд бид нэг мөрийг "зориуд унтраасан" байсныг санаж байна уу — одоо түүнийг "асаая":
python
print(100 / 0)Python:
ZeroDivisionError: division by zeroОрчуулбал: "ZeroDivisionError (тэгд хуваах алдаа): тэгд хуваалт хийгдлээ." Математикт тэгд хуваах нь тодорхойгүй байдаг шиг Python ч энэ үйлдлийг хийж чаддаггүй — гэхдээ анзаараарай: энэ бол SyntaxError биш. Бичиглэл чинь бүрэн зөв, Python мөрийг уншиж ойлгосон — биелүүлэх гэж оролдох мөчид нь л ажил бүтэхгүй зогссон юм. "Уншиж чадаагүй" (SyntaxError) ба "уншсан ч биелүүлж чадаагүй" (ZeroDivisionError гэх мэт) хоёр өөр давхаргын алдаа гэдгийг энд анх зааглаж байна — энэ ялгаа Бүлэг 11-д том сэдэв болно. Тэгд хуваалт бодит программд ихэвчлэн шууд 0 бичсэнээс биш, утга нь 0 болчихсон variable-аар хуваахад гардаг (дундаж бодох гэтэл тоологч нь 0 гэх мэт) — тиймээс энэ алдаа гарвал хуваарь дээрх variable-ийнхаа утгыг мөшгиж шалгаарай.
Python-д тоо хоёр төрөлтэй: int (бүхэл — ширхэгээр тоологддог зүйлс) ба float (бутархай — хэмжигддэг зүйлс); ялгагч нь цэг.
Бутархайг үргэлж цэгээр бичнэ (1.58) — таслал Python-д өөр үүрэгтэй тул гэнэтийн TypeError үүсгэдэг.
Дөрвөн үйлдэл: + - * / ; тооцоололд ганц ч float орвол үр дүн float болдог.
/ үйлдлийн хариу үргэлж float — тиймээс 10 / 2 нь 5.0; энэ нь алдаа биш, журам.
Float бол маш нарийн боловч төгс биш ойролцоо төрөл (0.1 + 0.2 -> 0.30000000000000004) — сүүлтэй тоо харвал эвдрэл гэж бүү ойлго.
Дараагийн хичээлд бид өнөөдрийн 2-р алдаанд гарсан том асуултын мөрөөр string-ийн ертөнц рүү орно: хашилт яагаад хоёр янз байдаг, "5" + "3" гэвэл юу гардаг, бичвэр ба тооны хил дээр ямар сонирхолтой (мөн ямар урхитай) зүйлс болдгийг бүрэн үзнэ.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.