Ачааллж байна...
Өнөөдөр таны программуудын амьдралд нэг том зүйл өөрчлөгдөнө. Өдийг хүртэл бичсэн бүх программ чинь нэг чухал утгаараа "битүү" байсан: бүх мэдээлэл нь кодонд урьдчилан бичигдсэн, ажиллуулах бүрд яг ижил үр дүн гардаг, гүйцэтгэлийн явцад гаднаас юу ч ордоггүй. Ийм программыг хэн ажиллуулсан ч — та ч бай, найз чинь ч бай — ялгаагүй: программ хэрэглэгчээ "хардаггүй". Өнөөдрийн хичээлийн дараа энэ хана нурна: input() гэдэг багаж таны программд асуулт асууж, хариултыг нь хүлээж авах чадвар олгоно. Программ чинь ажиллаж байх дундаа зогсоод, хэрэглэгчээс нэр, нас, дурын юуг ч асууж, хариултаар нь цааш ажилладаг болно. Энэ бол print()-ийн эсрэг чиглэл: print() программын гарц (программаас хүн рүү) байсан бол input() нь орц (хүнээс программ руу) юм. Хоёул гартаа орсноор таны программ анх удаа жинхэнэ харилцан яриа өрнүүлж чадна — энэ мөчийг тэмдэглэж аваарай, учир нь эндээс хойш таны бичих бараг бүх сонирхолтой программ (тоглоом, тооцоолуур, асуулга) яг энэ харилцаан дээр тогтоно.
Гэхдээ энэ хичээл зөвхөн шинэ багажийн танилцуулга биш. Энэ бүлгийн туршид бид хэд хэдэн "өр" үлдээсэн: string хичээлд "дугтуйг онгойлгуулж болдог тусгай хэрэгсэл бий — input()-ийн хичээлд танилцана" гэж амласан; мөн "болгоомжгүй программ 8-ын оронд 53 гаргаж чимээгүйхэн худлаа ярьдаг урхи"-ны тухай сануулсан. Өнөөдөр бүх өрөө барагдуулна — тэгээд та энэ бүлгийн төрлийн мэдлэг яагаад "онол" биш, өдөр тутмын амин хэрэгцээ болохыг нүдээрээ үзнэ.
input()-ийг ингэж төсөөлөөрэй: программ чинь хэрэглэгч рүү хоосон хуудас сарвайлгаж байна. Хуудасны дээд талд асуулт бичээстэй ("Таны нэр хэн бэ?"), доор нь бичих зай бий. Хуудсыг сарвайлгасан мөчид программ бүрэн зогсоно — түүний хувьд цаг урсахаа болино, хэрэглэгч нэг цагийн дараа хариулсан ч тэвчээртэй хүлээсээр л байна. Хэрэглэгч хариултаа бичээд хуудсаа буцааж өгмөгц (Enter товч дармагц) программ сэрж, тэр хуудсыг гартаа авч, ажлаа үргэлжлүүлнэ. Хамгийн чухал нь — энд бүх зүйлийн түлхүүр бий — буцаж ирсэн хуудас бол үргэлж бичвэр юм. Хэрэглэгч хуудсан дээр "Бат" гэж бичсэн ч, "12" гэж бичсэн ч — программын гарт очих зүйл бол цаасан дээрх зурлагууд: string хичээлийн хэлээр бол битүүмжилсэн дугтуй. Хэрэглэгч 12 гэж бичихдээ "тоо" гэж бодсон нь хамаагүй — гар дээр дарагдсан товчнуудын тэмдэгтүүд л ирдэг. Энэ баримтыг том үсгээр бичье: input() ямар ч нөхцөлд string буцаадаг. Энэ ганц өгүүлбэр өнөөдрийн хичээлийн тэн хагас, мөн эхлэгчдийн хамгийн олон цагийг "идсэн" урхины бүрэн тайлбар юм.
Анхны ярилцлагаа хийе:
python
ner = input("Таны нэр хэн бэ? ")
print("Сайн байна уу, " + ner)Ажиллуулахад terminal-д эхлээд ганц л зүйл гарна:
Таны нэр хэн бэ?...тэгээд программ зогсоно — таны хариултыг хүлээж. Terminal дотор товшоод Сараа гэж бичээд Enter дарвал:
Таны нэр хэн бэ? Сараа
Сайн байна уу, СарааЭхний мөрийг задалъя — энд гурван үйл явдал нэг мөрөнд багцлагдсан байна. Нэгд: input("Таны нэр хэн бэ? ") гэдэг нь "энэ асуултыг дэлгэцэнд үзүүлээд, хариулт хүлээ" гэсэн заавар. Хаалтан доторх string нь асуултын бичиг — print шиг дэлгэцэнд гардаг, гэхдээ ард нь шинэ мөр рүү шилжилгүй, хариултыг яг асуултынхаа ард хүлээдэг (асуултын төгсгөлд зай тавьсныг анзаараарай: "...бэ? " — энэ жижиг зай нь хэрэглэгчийн бичих зүйлийг асуултаас нааш нь наалдуулахгүй, уншихад эвтэйхэн болгодог нарийн ширийн сайхан дадал юм). Хоёрт: хэрэглэгч бичиж Enter дармагц бичсэн зүйл нь string болж "буцаж ирнэ" — type()-ийн хичээлд үзсэн шиг, хариугаа гартаа барьчихаад өгөх хүнээ хүлээдэг ажилтан. Гуравт: тэр хариуг бид ner хайрцганд хадгаллаа — Бүлэг 4-ийн энгийн = үйлдэл. Хоёр дахь мөр нь танил залгалт: "Сайн байна уу, " string дээр ner доторх string залгагдаж хэвлэгдэв. Хоёр string залгаж байгаа тул + маань энд асуудалгүй ажиллалаа — асуудал хэзээ эхлэхийг одоо харцгаая.
Хоёр дахь жишээ: урхи ажиллаж байгаа нь. Хэрэглэгчээс нас асуугаад, ирэх жилийн насыг нь хэлдэг "сайхан санаатай" программ бичье:
python
nas = input("Та хэдэн настай вэ? ")
print(nas + 1)Хэрэглэгч 12 гэж хариулав. Python:
TypeError: can only concatenate str (not "int") to strТанил мэдэгдэл — "str дээр зөвхөн str залгаж болно" — гэхдээ энэ удаад та тоо авсан гэдэгтээ итгэлтэй байсан нь урхины гол зальтай тал юм. Хэрэглэгч үнэхээр 12 гэж, цифрээр бичсэн. Гэвч нөгөө том дүрмээ саная: input() ямар ч нөхцөлд string буцаадаг — nas хайрцганд очсон зүйл бол 12 гэсэн тоо биш, "12" гэсэн хоёр тэмдэгттэй дугтуй байлаа. Тэгээд "12" + 1 нь string дээр int нэмэх гэсэн хориотой холимог болж унав. Энэ бол эхлэгч бүрийн, үг үсэггүй бүрийн гишгэдэг урхи — та одоо түүнийг бэлтгэлтэй угтаж байгаа нь давуу тал.
Гурав дахь жишээ: дугтуй онгойлгогч — int(). Амласан хэрэгслээ гаргая. int() гэдэг багаж string-дугтуйг "онгойлгож", доторх зурлагуудыг жинхэнэ тоо болгож хувиргадаг:
python
nas = input("Та хэдэн настай вэ? ")
nas_too = int(nas)
print(nas_too + 1)Хэрэглэгч 12 гэж хариулбал:
Та хэдэн настай вэ? 12
13Гол мөр нь хоёр дахь нь: int(nas) гэдэг нь "nas доторх string-ийг аваад, тоо болгож хувиргаад, үр дүнг нь өг" гэсэн заавар — "12" дугтуй орж, 12 гэсэн жинхэнэ int гарч ирнэ. Түүнийг nas_too хайрцганд хадгалснаар гурав дахь мөрийн нэмэлт ямар ч саадгүй боллоо: 12 + 1 = 13. Анзаарах зүйл: int() нь nas-ийн доторхыг өөрчилдөггүй — type() шиг ажиглагч биш ч, хувиргалтаа "хуулбар дээр" хийж шинэ утга гаргадаг: nas дотор "12" string хэвээрээ, харин nas_too дотор 12 int амьдарч байна. Практик дээр программистууд энэ хоёр мөрийг ихэвчлэн нэгтгэж бичдэг — багаж угсрах танил хэв маягаар:
python
nas = int(input("Та хэдэн настай вэ? "))
print(nas + 1)Дотроос гадагш уншина: эхлээд input() асуугаад string авчирна, тэр нь шууд int()-ийн гарт очиж тоо болно, тоо нь nas-д хадгалагдана. Энэ int(input(...)) гэсэн давхар бүтэц нь Python эхлэгчийн замын хамгийн олон бичигддэг мөрүүдийн нэг тул гараа сайн дасгаарай. Мөн гэр бүлийнх нь бусад гишүүдийг дурдъя: float() нь string-ийг бутархай тоо болгодог ("1.58" -> 1.58 — хэрэглэгчээс өндөр асуухад хэрэгтэй), str() нь урвуу зүгт — тоог string болгодог (string хичээлийн алдааны хэсэгт "тоогоо string болгох хэрэгсэл бий" гэж амласан нь энэ: str(13) нь "13" болно, залгалтад орох боломжтой).
Дөрөв дэх жишээ: бүрэн харилцаатай жижиг программ. Бүлгийн бүх мэдлэгээ нэг дор ажиллуулъя — хуушуурын захиалгын тооцоолуур:
python
# Хуушуурын захиалгын тооцоолуур
ner = input("Таны нэр хэн бэ? ")
shirheg = int(input("Хэдэн хуушуур авах вэ? "))
niit = shirheg * 1500
print(ner + " танд " + str(niit) + " төгрөг болно")Хэрэглэгч Бат, 4 гэж хариулбал:
Таны нэр хэн бэ? Бат
Хэдэн хуушуур авах вэ? 4
Бат танд 6000 төгрөг болноМөшгье. 2-р мөр: нэр асууж, string-ээр нь ner-д хадгалав — нэр бол бичвэрийн ертөнцийн иргэн тул хувиргалт хэрэггүй. 3-р мөр: ширхэг асууж, int()-ээр онгойлгож тоо болгов — учир нь дараагийн мөрөнд үржүүлнэ. 4-р мөр: 4 * 1500 = 6000, int ертөнцийн энгийн тооцоо. 5-р мөр — хамгийн сургамжтай нь: хэвлэх өгүүлбэрээ залгалтаар угсарч байгаа тул бүх гишүүн string байх ёстой — ner аль хэдийн string, харин niit нь int тул str(niit) гэж дугтуйлж байж залгалтад оруулав. Нэг программ дотор хоёр чиглэлийн хувиргалт зэрэг ажиллаж байгааг хараарай: орох үедээ string -> int (тооцоолохын тулд), гарах үедээ int -> str (үзүүлэхийн тулд). Хэрэглэгчтэй харилцдаг программын ердийн амьдрал ийм байдаг: гадаа талдаа бүх зүйл string, дотор нь тооцоолол int/float, хилийн дээр нь хувиргагчид ажилладаг.
Хүсвэл туршаад үзээрэй: дуртай хоолнийхоо нэр, үнэ, ширхгийг асуудаг өөрийн гэсэн тооцоолуур бичээрэй. Сонирхвол print-ийн таслал хэрэглэдэг хэлбэрийг эргэж саная (Бүлэг 4-т нэг гарч байсан): print(ner, "танд", niit, "төгрөг болно") гэж бичвэл str() дугтуйлалт хэрэггүй болдог — таслал нь төрөл холихыг зөвшөөрч, хооронд нь зай тавьж өгдөг. Аль хэлбэр нь танд эвтэй санагдана, түүгээрээ.
Алдаа 1: int() хийхээ мартах. Дээр бүрэн задалсан тул товч тогтооё — input-ын хариу дээр тооцоолол хийхээр TypeError: can only concatenate str (not "int") to str (нэмэлт дээр), эсвэл ижил гэр бүлийн өөр TypeError (бусад үйлдэл дээр) гарна. Оношлогооны дүрэм: input-тай программд TypeError гарвал хамгийн эхний сэжигтэн бол мартагдсан int() — input-ын мөрөө хараад хувиргалтаа шалга.
Алдаа 2: Хэрэглэгч тоо биш зүйл бичих. Одоо шинэ, гүн асуудал. Программ чинь төгс байлаа гэхэд — хэрэглэгч "яахав" гэдгийг хэн баталгаажуулах вэ:
python
nas = int(input("Та хэдэн настай вэ? "))Хэрэглэгч арван хоёр гэж үгээр бичив. Python:
ValueError: invalid literal for int() with base 10: 'арван хоёр'Шинэ төрлийн алдаа — ValueError (утгын алдаа). Орчуулбал: "int() хийхэд тохирохгүй бичиглэл: 'арван хоёр'". TypeError-оос ялгааг нь ажигла: тэнд үйлдэл төрлүүдийн таарамжгүйгээс унадаг байсан бол энд төрөл нь зөв (int() нь string л хүлээж авдаг, string нь ирсэн) — гэхдээ тэр string-ийн доторх утга нь тоо болж хувирах боломжгүй байв. int() бол ид шидтэн биш: "12"-ыг 12 болгож чадна, харин "арван хоёр"-ыг, "12 нас"-ыг, бүр хоосон ""-ыг ч тоо болгож чадахгүй — дугтуйг онгойлгоод дотроос нь цифр биш юм гарвал ValueError хашгирдаг. Энд нэг чухал сэтгэлгээний шилжилт бий: энэ алдаа таны кодын буруу биш — гадны ертөнцөөс ирж буй мэдээлэл найдваргүй байдгийн илрэл юм. Хэрэглэгч андуурч, тоглож, санамсаргүй хоосон Enter дарж болно — жинхэнэ программ тэр бүхнийг тэсвэрлэдэг байх ёстой. Тэгвэл яаж хамгаалах вэ? Өнөөдөр — хараахан аргагүй: хамгаалалт нь Бүлэг 11-ийн try/except буюу "аюулгүйн тор" юм. Тэр хичээл дээр бид яг энэ мөрийг торондоо оруулж хамгаална гэдгийг амлаад, одоохондоо: өөрөө туршихдаа тоо л бичиж байгаарай, харин энэ алдаа гарвал "программ минь эвдрээгүй, хэрэглэгчийн орц л тоо биш байна" гэж зөв оношлоорой.
Алдаа 3: Хариултыг хадгалахаа мартах. Мэдэгдэлгүй, "чимээгүй" төөрөгдөл:
python
input("Таны нэр хэн бэ? ")
print("Сайн байна уу, " + ner)Эхний мөр асуултаа асууж, хариултыг авсан — гэхдээ хаана ч хадгалаагүй: = тэмдэг алга. Хэрэглэгчийн бичсэн зүйл type()-ийн ганцаардсан хариу шиг "агаарт төрөөд замхарлаа". Хоёр дахь мөр ner-ийг дуудахад тийм хайрцаг огт үүсээгүй тул танил NameError: name 'ner' is not defined угтана. Засвар: асуулт бүрийн урд хайрцгаа тавь — ner = input(...). Дүрэм болгож хэлбэл: input() ганцаараа зогсож байвал бараг үргэлж алдаа — хариултыг нь хэн нэгэн хадгалж авах ёстой.
input("асуулт") нь асуултаа дэлгэцэнд гаргаад, хэрэглэгчийн хариултыг хүлээж, бичсэнийг нь буцаадаг — программ чинь эндээс хойш харилцан яриатай боллоо.
Хамгийн чухал дүрэм: input() ямар ч нөхцөлд string буцаадаг — хэрэглэгч цифр бичсэн ч "12" дугтуйгаар ирнэ.
Тооцоололд хэрэглэхийн өмнө int() (бүхэл) эсвэл float() (бутархай)-аар хувиргана; урвуу зүгт str() тоог бичвэр болгоно; int(input(...)) бол өдөр тутмын угсралт.
Хувиргалт мартвал TypeError; хэрэглэгч тоо биш зүйл бичвэл ValueError — сүүлийнх нь таны кодын буруу биш, хамгаалалтыг нь Бүлэг 11-д хийнэ.
Хариултыг үргэлж variable-д хадгал — эзэнгүй input() бол замхардаг мэдээлэл.
Ингээд "Өгөгдлийн төрлүүд" бүлэг өндөрлөлөө — таны программ мэдээлэл хадгалдаг, төрлүүдийг ялгадаг, хэрэглэгчтэй ярилцдаг боллоо. Дараагийн бүлэг бол энэ сургалтын хамгийн хүлээгдсэн эргэлтүүдийн нэг: шийдвэр гаргах. Bool хичээл дээр "асуулт -> True/False" гэсэн түлхүүр өгснийг санаж байна уу — Бүлэг 6-д бид тэр түлхүүрээр if гэдэг хаалгыг онгойлгож, программаа нөхцөл байдлаас хамаарч өөр өөрөөр ажилладаг болгоно. Хэрэглэгчийн хариултаас хамаараад өөр зам сонгодог программ — жинхэнэ "ухаалаг" харагдах эхлэл тэнд бий.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.