Ачааллж байна...
Энэ бүлгийн эхний хичээлд бид "variable гэдэг үгийн монгол орчуулга нь 'хувьсагч' бөгөөд тэр нэрний учрыг гуравдугаар хичээлд тайлна" гэж амласан. Одоо тэр өдөр ирлээ. Variable гэдэг англи үг нь "хувьсдаг, өөрчлөгддөг зүйл" гэсэн утгатай — тэгэхээр энэ нэр өөрөө variable-ийн хамгийн чухал чанарыг зарлаад байгаа юм: хайрцган доторх утга нэг удаа хийгээд мөнхөрдөг зүйл биш, программын явцад солигдож болдог. Өнөөдрийн хичээлд бид утга хэрхэн солигддогийг, солигдох мөчид хуучин утганд юу тохиолддогийг, тэгээд эцэст нь эхлэгч бүрийг гацаадаг нэг алдартай мөр — score = score + 1 — гэдгийг маш удаанаар задалж үзнэ.
Яагаад утга солих чадвар ийм чухал вэ гэдгийг эхлээд амьдралаас харъя. Тоглоомын оноог бодоорой: тоглоом эхлэхэд 0, мангас ялах бүрд өсдөг. Хэрэв оноог хадгалсан хайрцагны утга солигдож чаддаггүй байсан бол оноо үүрд 0 хэвээр үлдэх байсан — тоглоом утгаа алдана. Утасныхаа цэнэгийг бодоорой: өглөө 100 хувь, орой 30 хувь — нэг л "цэнэг" гэсэн ойлголт, гэхдээ утга нь өдөржин хувьсаж байдаг. Программын ертөнцөд "цаг хугацааны явцад өөрчлөгддөг мэдээлэл" хаа сайгүй байдаг бөгөөд түүнийг барих хэрэгсэл нь яг өнөөдрийн сэдэв юм.
Шошготой хайрцагныхаа зургийг үргэлжлүүлье, гэхдээ нэг чухал тодотголтой. Таны агуулахын хайрцагнууд бол нэг л зүйл багтдаг хайрцагнууд юм. ner гэсэн шошготой хайрцганд "Бат" гэж хийчихсэн байтал та ажилтандаа "ner хайрцганд 'Сараа' гэдгийг хий" гэж шинэ заавар өгвөл юу болох вэ? Ажилтан хайрцгийг онгойлгоод, хуучин "Бат"-ыг гаргаж хаяад, оронд нь "Сараа"-г хийнэ. Хайрцаг нэмэгдээгүй, шошго өөрчлөгдөөгүй — доторх зүйл нь л солигдсон. Хамгийн чухал нь: хуучин утга буцаж ирэхгүйгээр алга болдог. Агуулахад "хуучин юмсын архив" гэж байхгүй — хаясан зүйл хаягдсанаараа л үлддэг. Тиймээс утга солих бол хүчтэй мөртлөө "болгоомжтой" үйлдэл: шинэ утга хийхээсээ өмнө хуучин нь дахиж хэрэггүй гэдэгт итгэлтэй байх хэрэгтэй.
Энэ зүйрлэлээс нэг дүрэм шууд урган гарна: нэг шошго — нэг л утга. Ямар ч мөчид ner хайрцагт ганцхан зүйл байна; "хоёр утга зэрэг хадгалчихъя" гэж болохгүй. Хоёр утга хэрэгтэй бол хоёр хайрцаг (хоёр variable) хэрэглэнэ — үүнийг та өмнөх хичээлүүдэд аль хэдийн хийж үзсэн.
Утга солигдох агшныг кодоор харъя:
python
ner = "Бат"
print(ner)
ner = "Сараа"
print(ner)Үр дүн:
Бат
СарааОдоо энэ дөрвөн мөрийг өмнөх бүлэгт сурсан мөшгих аргаараа, гэхдээ шинэ нэг зуршил нэмж дагая: мөр бүрийн дараа хайрцганд юу байгааг тэмдэглэж явах. Энэ бол программистуудын кодыг ойлгодог жинхэнэ арга бөгөөд өнөөдрөөс таны багаж болно. 1-р мөр: ner хайрцаг үүсч, дотор нь "Бат" орлоо. Байдал: ner → "Бат". 2-р мөр: ner дуудагдаж, доторх "Бат" хэвлэгдлээ. Байдал өөрчлөгдөөгүй: ner → "Бат". 3-р мөр: энд гол үйл явдал болно. ner нэртэй хайрцаг аль хэдийн байгаа тул Python шинэ хайрцаг үүсгэхгүй — байгаа хайрцгийг онгойлгож, "Бат"-ыг хаяж, "Сараа"-г хийнэ. Байдал: ner → "Сараа". "Бат" гэдэг утга энэ мөчөөс хойш программд байхгүй боллоо. 4-р мөр: ner дуудагдахад одоо доторх нь "Сараа" тул тэр хэвлэгдэнэ. Хоёр print бичиглэлийн хувьд яг ижилхэн мөртлөө өөр өөр зүйл хэвлэснийг анзаараарай — ялгаа нь мөрүүдэд биш, тэдгээрийн биелэх мөчид хайрцганд юу байсанд байгаа юм. Өмнөх хичээлийн "дараалал бол цагийн хуваарь" гэдэг ойлголт энд шинэ гүн утгатай болж байна: variable-тай программд мөр бүр "хэзээ" биелэх нь үр дүнг шийддэг.
Хоёр дахь жишээ: тоон утга дараалан солих. Утасны цэнэгийг өдрийн турш мөшгье:
python
tsenegleltiin_huvi = 100
print(tsenegleltiin_huvi)
tsenegleltiin_huvi = 65
print(tsenegleltiin_huvi)
tsenegleltiin_huvi = 30
print(tsenegleltiin_huvi)Үр дүн:
100
65
30Байдлын хөдөлгөөн: эхлээд хайрцагт 100 → дараа нь 65 (100 алга болов) → дараа нь 30 (65 алга болов). Нэг л хайрцаг, гурван өөр "амьдралын үе". Энд нэг зүйлийг тодотгоё: variable-д дахин утга оноохдоо ямар нэг тусгай бичиглэл хэрэггүй — анхны удаад хэрэглэсэн яг тэр л ижил = тэмдэгтэй мөрөө бичнэ. Python өөрөө "ийм нэртэй хайрцаг байна уу?" гэж шалгаад: байхгүй бол шинийг үүсгэдэг, байгаа бол доторхыг нь солидог. Хоёр өөр ажил — нэг ижил бичиглэл.
Гурав дахь жишээ: нэг хайрцагнаас нөгөөд хуулах. Өмнөх хичээлийн алдаануудын хэсэгт бид "нэг хайрцагнаас нөгөө рүү утга хуулж болдог, хожим нөхөрлөнө" гэж амласан — одоо нөхөрлөе:
python
ehnii_ontsgoi_hool = "Бууз"
shine_ontsgoi_hool = ehnii_ontsgoi_hool
print(shine_ontsgoi_hool)Үр дүн:
Бууз2-р мөрийг задалъя, учир нь энд = тэмдгийн хоёр талд хоёулаа нэрс байгаа нь шинэ дүр зураг. Уншлагын журам хэвээрээ — эхлээд баруун тал: ehnii_ontsgoi_hool гэдэг нэр байна, Python хайрцгийг нь олж доторх "Бууз"-ыг гаргаж авна. Дараа нь зүүн тал: shine_ontsgoi_hool нэртэй хайрцаг байхгүй тул шинээр үүсгээд, дотор нь тэр "Бууз"-ыг хийнэ. Үр дүнд хоёр хайрцаг тус тусдаа "Бууз" утгатай боллоо. Чухал нюанс: энэ бол хуулбар — хоёр хайрцаг хоорондоо "утсаар холбогдоогүй". Дараа нь эхний хайрцгийн утгыг сольчихвол хоёр дахь нь өөрчлөгдөхгүй, өөрийн "Бууз"-аа хадгалсаар байна. (Хүсвэл үүнийг туршаад үзээрэй: дээрх кодын дараа ehnii_ontsgoi_hool = "Хуушуур" гээд хоёр хайрцгаа хоёуланг нь хэвлэж харьцуулаарай.)
Дөрөв дэх жишээ: оньсого мөр — score = score + 1. Одоо энэ хичээлийн оргил. Тоглоомын оноо хөтөлж байна гэж бодъё:
python
score = 0
score = score + 1
print(score)Үр дүн:
1Хоёр дахь мөрийг анх харахад олон хүний толгой эргэдэг: "score тэнцүү score нэмэх нэг?? Юм өөрөө өөрөөсөө нэгээр их байна гэж юу гэсэн үг вэ?!" Хэрэв танд ийм бодол төрсөн бол та ганцаараа биш — энэ мөр дэлхийн бүх эхлэгчийг нэг удаа гацаадаг. Гацааны шалтгаан нь ганцхан: = тэмдгийг математикийн "тэнцүү" гэж уншсанд байгаа юм. Математикт x = x + 1 гэдэг үнэхээр утгагүй тэгшитгэл мөн. Гэвч бид эхний хичээлд юу гэж хэлсэн билээ: Python-ы = бол "тэнцүү" биш, "баруун талынхыг бодоод зүүн талын нэрэнд хадгал" гэсэн үйлдэл юм. Тэгэхээр энэ мөр бол тэгшитгэл огт биш — хоёр алхамтай заавар юм.
Алхмуудыг нь кино шиг удаашруулж үзье. Python 2-р мөрөнд ирлээ. Эхний алхам — баруун талыг бодох: score + 1 гэж байна. Энэ мөчид score хайрцагт 0 байгаа (1-р мөрөөс). Python хайрцгийг онгойлгож, 0-ыг аваад, 0 + 1 = 1 гэж бодов. Баруун талын үр дүн: 1. Хоёр дахь алхам — зүүн талд хадгалах: тэр 1-ийг score хайрцганд хийнэ — хуучин 0 хаягдаж, оронд нь 1 орно. Болоо. Оньсого алга болсныг харж байна уу: мөрийн баруун талын score нь "хуучин утга" (уншигдах мөчийнх), зүүн талын score нь "шинэ утгын хадгалагдах газар" — хоёулаа нэг хайрцаг боловч хоёр өөр цаг мөчид оролцож байгаа юм. Энэ мөрийг үгээр уншвал: "score-ын одоогийн утгыг аваад, нэгийг нэмээд, буцааж score-д хий" — өөрөөр хэлбэл "оноог нэгээр өсгө". Ийм мөр тоглоомын оноо, давталтын тоолуур, мөнгөн дүнгийн өөрчлөлт гээд хаа сайгүй хэрэглэгддэг бөгөөд Бүлэг 7-гийн давталтууд дээр таны өдөр тутмын нөхөр болно.
Тав дахь жишээ: бүгдийг нэгтгэсэн мөшгилт. Дөрвөн ойлголтоо (үүсгэх, солих, хуулах, өсгөх) нэг жижиг "тоглоомд" нэгтгэе:
python
# Мангас агнах тоглоомын оноо
score = 0
score = score + 10 # эхний мангас
score = score + 10 # хоёр дахь мангас
score = score + 5 # жижиг мангас
print(score)Ажиллуулахаасаа өмнө өөрөө мөшгөөд таамаглаарай: мөр бүрийн дараа score хэд болох вэ? ... Хариулт: 0 → 10 → 20 → 25, тиймээс хэвлэгдэх нь:
25Таамаг тань таарсан бол та энэ хичээлийн гол чадварыг эзэмшчихсэн байна: variable-тай кодыг байдал хөтөлж уншдаг болсон гэсэн үг. Таараагүй бол харамсах зүйлгүй — мөр бүр дээр "баруунаа бод, зүүндээ хадгал" хоёр алхмаа дахин гүйлгээд үзээрэй, хоёр дахь уншилтад гарцаагүй бууна.
Алдаа 1: Хуучин утгаа "аварчихсан" гэж бодох. Алдааны мэдэгдэлгүй, хамгийн зальтай төөрөгдөл:
python
une = 3000
une = 4500
print("Хуучин үнэ:", une)Үр дүн:
Хуучин үнэ: 4500(print дотор таслалаар хоёр зүйл зэрэг өгч болдгийг энд анх харуулав — string болон variable-ийг таслал зэрэгцүүлэхэд хоёулаа нэг мөрөнд, хооронд нь зайтай хэвлэгддэг; энэ хэрэгтэй чадварыг хожим бүрэн үзнэ.) Программист "хуучин үнэ" гэж хэвлэх санаатай байсан ч 4500 гарчихлаа — учир нь 2-р мөр дээр 3000 буцалтгүй хаягдсан, хайрцганд ганцхан утга л амьдардаг. Хуучин утга хэрэгтэй байсан бол солихоосоо өмнө өөр хайрцганд хуулж хадгалах ёстой байсан: huuchin_une = une гээд дараа нь une = 4500. Дүрэм: хаяхаасаа өмнө хэрэгтэй эсэхээ бод — хэрэгтэй бол эхэлж нүүлгэ.
Алдаа 2: score = score + 1-ийг хайрцаг үүсээгүй байхад хийх. Оньсого мөрөө урьдчилсан хадгалалтгүйгээр эхлүүлбэл:
python
score = score + 1Python:
NameError: name 'score' is not definedТанил NameError, гэхдээ шалтгаан нь одоо танд гүн ойлгогдоно: Python эхлээд баруун талыг боддог гэдгийг саная — score + 1-ийг бодохын тулд score хайрцгийг онгойлгох гэтэл тийм хайрцаг огт үүсээгүй байв. "Утгыг нь өсгөхийн тулд эхлээд утга нь байх ёстой" — тиймээс тоолуур маягийн variable бүр score = 0 гэх мэт эхлэлийн утгатай төрдөг. Энэ эхний мөрийг программистууд "эхлүүлэлт" гэж ярьдаг бөгөөд мартагдсан эхлүүлэлт бол эхлэгчдийн байнгын NameError-ын эх үүсвэр юм.
Алдаа 3: Мөрүүдийн дарааллыг үл тоох. Дараах хоёр программын ялгааг олоорой:
python
mend = "Өглөөний мэнд"
print(mend)
mend = "Оройн мэнд"python
mend = "Өглөөний мэнд"
mend = "Оройн мэнд"
print(mend)Эхнийх нь "Өглөөний мэнд", хоёр дахь нь "Оройн мэнд" гэж хэвлэнэ — мөрүүд нь яг ижил, дараалал нь л өөр. Эхний программын 3-р мөр (сүүлчийн соливолт) хэвлэлтийн дараа биелсэн тул үр дүнд ямар ч нөлөө үзүүлээгүй — солиод хэнд ч үзүүлээгүй хайрцаг гэсэн үг. Ийм "хэвлэлтийн дараах соливолт" нь алдаа өгдөггүй ч ихэвчлэн программистын санаанаас зөрсөн байдаг. print таны хүлээснээс өөр утга үзүүлбэл шалгах журам: тэр print-ээс дээших мөрүүдийг мөшгөөд, хэвлэгдэх мөчид хайрцганд яг юу байсныг тогтоо. Асуудал бараг үргэлж "утга буруу" биш, "цаг нь буруу" байдаг.
Variable гэдэг нэр "хувьсдаг" гэсэн утгатай: хайрцган доторх утгыг = тэмдэгтэй ердийн мөрөөр хэдэн ч удаа сольж болно.
Шинэ утга хийгдэхэд хуучин нь буцалтгүй алга болдог — хэрэгтэй бол солихоосоо өмнө өөр хайрцганд хуулж хадгал.
score = score + 1 бол тэгшитгэл биш, хоёр алхамтай заавар: баруун талыг одоогийн утгаар бодоод, үр дүнг буцааж хадгал — "нэгээр өсгө" гэсэн үг.
Тоолуур маягийн variable эхлэлийн утгатай (score = 0) төрөх ёстой, эс бөгөөс NameError угтана.
Variable-тай кодыг уншихдаа мөр бүрийн дараах "байдлыг" (хайрцаг бүрт юу байгааг) тэмдэглэж мөшгих нь программистын үндсэн арга юм.
Ингээд Variable бүлэг өндөрлөлөө — та мэдээллийг хадгалж, дуудаж, хуулж, сольж чаддаг боллоо. Дараагийн бүлэгт бид хайрцагнуудад юу хийж болдгийг нарийвчилна: тоо, бичвэр, үнэн-худал гэсэн өгөгдлийн төрлүүд хоорондоо юугаараа ялгаатай, "5" ба 5 хоёр яагаад огт өөр зүйл болдгийг тэнд тайлна — өмнөх хичээлүүдэд хоёр удаа "Бүлэг 5-д үзнэ" гэж амласан өрүүдээ бид тэнд барагдуулна.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.