Ачааллж байна...
Өмнөх хичээлийн төгсгөлд нэг асуулт нээлттэй үлдсэн: function бол өөрийн хаалттай ажлын өрөөтэй — parameter-ээр нь мэдээлэл оруулж болдог юм байна, тэгвэл дотроос нь мэдээлэл гаргаж авах зам нь юу вэ? Өнөөдрийн хичээл бүхэлдээ тэр асуултын хариулт: return — function-ий "хариу гардуулах" механизм. Эхлээд асуудлаа нүдээр харцгаая. Та хоёр тооны нийлбэрийг боддог function бичлээ гэж бодъё — тэр нийлбэрийг зүгээр хэвлэчихвэл болохгүй юу? Болно — хэрэв таны цорын ганц зорилго дэлгэцэд харуулах байсан бол. Гэвч бодит программд тооцооллын үр дүн ихэвчлэн дараагийн ажлын орц болдог: нийлбэрийг хөнгөлөлттэй үнэ бодоход хэрэглэх, өөр тоотой харьцуулах, хайрцганд хадгалах... Дэлгэцэд хэвлэгдсэн зүйл бол хүний нүдэнд очсон — программын гарт байхгүй: print бол зурагт руу яриад л өнгөрдөг хүн шиг — сонссон нь хүн, программ биш. Return бол эсрэгээрээ: үр дүнг дуудагчийн гарт буцааж гардуулдаг — тэгээд дуудагч түүнийг хадгална, тооцоолно, харьцуулна — юу ч хийж болно.
Нэг зүйлийг шууд, нүүр тулан хэлье: print ба return-ий ялгаа бол энэ бүхэл сургалтын хамгийн олон эхлэгчийг будилуулдаг сэдэв. Хэрэв энэ хичээлийг уншиж дуусаад "бүрэн ойлгосон" мэдрэмж төрөхгүй бол — та юугаараа ч дутуу биш: энэ ялгаа ихэнх хүнд хэд хэдэн уулзалтын дараа л "суудаг". Тиймээс бид өнөөдөр яарахгүй: нэг санааг олон талаас нь, олон жишээгээр эргүүлж тойруулж үзнэ — тэгээд энэ сэдэв рүү дараагийн бүлгүүдэд ч эргэж ирсээр байх болно.
Жорын зүйрлэлээ гүнзгийрүүлье. Танд хоёр тогооч байна — хоёул "шөл хий" гэсэн захиалга авч, хоёул гал тогооны өрөөндөө орж, хоёул төгс шөл хийдэг. Ялгаа нь захиалга дуусах мөчид илэрдэг. Эхний тогооч шөлөө хийчихээд гал тогооныхоо цонхоор толгойгоо цухуйлгаад "Шөл бэлэн боллоо шүү!" гэж хашгирдаг — тэгээд... шөлөө гал тогоондоо орхиод гараад явчихдаг. Та юу сонссоноо мэднэ, гэхдээ гарт тань юу ч ирээгүй: шөлийг аяганд хийж чадахгүй, амталж чадахгүй, зочиндоо өгч чадахгүй. Хоёр дахь тогооч юу ч хашгирдаггүй — оронд нь шөлтэй тогоогоо барьсаар гарч ирээд таны гарт гардуулдаг. Одоо шөл таных: аягалж болно, өөр хоолны орц болгож болно, хөргөгчинд хадгалж болно. Эхний тогооч бол print хийдэг function, хоёр дахь нь return хийдэг function. "Хэлэх" ба "гардуулах" — хоёул "үр дүнтэй" харагддаг, гэхдээ зөвхөн гардуулалт л үр дүнг цааш амьдруулдаг.
Энэ зургийг та нэг газраас таньж байгаа байх ёстой: та хоёр дахь тогоочийн үйлчилгээг аль эрт хэрэглэж ирсэн. int(input(...)) гэж бичихдээ та int()-ээс юу авдаг байсан бэ? Хариу — гардуулагдсан тоо: nas = int("12") гэдэг нь "int-ээр ажил хийлгээд, гардуулсныг нь nas хайрцганд хий" гэсэн үг. Int() хэзээ ч юм хэвлэдэггүй — чимээгүй ажиллаад хариугаа л өгдөг. Type() бас: print(type(12)) гэж бичдэг байсны учир нь type() хариугаа гардуулдаг болохоос хэвлэдэггүйд байсан — гардуулсныг нь харах гэж бид print-ийн гарт тавьдаг байсан шүү дээ (type()-ийн хичээлийн "ганцаардсан асуулт агаарт замхардаг" гэсэн ажиглалт — одоо бүрэн тайлагдлаа: замхардаг нь гардуулсан хариуг хэн ч аваагүй явдал байжээ). Өнөөдөр та өөрөө "гардуулдаг тогооч" бэлтгэж сурна.
Хоёр тогоочоо кодоор зэрэгцүүлье — нэг ажил, хоёр хэлбэр:
python
def niilber_heldeg(a, b):
print(a + b)
def niilber_gardag(a, b):
return a + bЭхлээд бичиглэлээ задалъя. return бол Python-ы нөөцөлсөн үг бөгөөд function-ий биед л амьдардаг; ард нь гардуулах утга (энд a + b гэсэн илэрхийлэл — эхлээд бодогдоод, үр дүн нь гардуулагдана) бичигдэнэ. Print шиг хаалт шаарддаггүйг ажигла: return бол function биш — if, for шиг үг юм. Одоо хоёр тогоочоо ажилд оруулъя:
python
niilber_heldeg(3, 4)
hariu = niilber_gardag(3, 4)
print(hariu)Үр дүн:
7
7Хоёул 7 — "ялгаагүй юм биш үү?!" Тийм харагдаж байгаа нь энэ сэдвийн бүх будилааны эх: гадна талаасаа хоёулаа "7 гаргаад" байгаа юм шиг. Ялгааг харахын тулд хоёр дахь мөрийг удаашруулж мөшгье: niilber_gardag(3, 4) дуудагдаж → биед нь 3 + 4 бодогдож → return 7 — энэ мөчид function ажлаа дуусгаад, 7-г дуудсан цэг рүү буцаан гардуулна. Гардуулна гэдэг нь юу гэсэн үг вэ: дуудлагын бичиглэл өөрөө тэр утга болдог — hariu = niilber_gardag(3, 4) гэсэн мөр Python-ы нүдээр hariu = 7 болж хувирдаг гэсэн үг. Тэгээд бид тэр 7-гоо хайрцагт хадгалаад, гурав дахь мөрөнд өөрсдөө хэвлэсэн. Харин эхний мөрөнд юу болсон бэ: niilber_heldeg өөрөө хэвлэсэн — бидний гарт юу ч ирээгүй. Ялгаа нь "7 гарсан эсэхэд" биш — 7 хаана очсонд: нэг нь дэлгэц рүү (зам нь тэндээ дуусна), нөгөө нь дуудагчийн гарт (зам нь үргэлжилнэ).
"Зам нь үргэлжилнэ" гэдгийг нүдээр батлая — гардуулсан хариу цааш ажиллана:
python
niit = niilber_gardag(3, 4) + niilber_gardag(10, 20)
print(niit)Үр дүн: 37. Хоёр гардуулалт (7 ба 30) нэмэгдэж чадлаа. Одоо niilber_heldeg-ээр үүнийг хийх гэж оролдоод үзье гэвэл... болохгүй: хэлдэг тогоочийн "шөл" гал тогоондоо үлдсэн — нэмэх юм алга. (Яг юу болохыг нь алдаануудын хэсэгт нүдээр үзнэ — тэнд None гэдэг сонин зочин хүлээж байгаа.)
Хоёр дахь жишээ: return бол гарц мөн. Return-ий хоёр дахь, анхаарууштай чанар: return хийгдмэгц function тэр дор нь дуусдаг — break давталтаа таслан гардаг шиг return function-ээ таслан гардаг:
python
def shalgalt(ono):
if ono >= 60:
return "Тэнцсэн"
return "Тэнцээгүй"
print(shalgalt(85))
print(shalgalt(40))Үр дүн:
Тэнцсэн
Тэнцээгүй85-ын замыг мөшгье: нөхцөл True → return "Тэнцсэн" — function энд дууслаа: доорх return "Тэнцээгүй" мөрөнд огт хүрээгүй. 40-ийн зам: нөхцөл False → if-ийн бие алгасагдаж → дараагийн мөр return "Тэнцээгүй" биеллээ. Хоёр дахь return-ий өмнө else байхгүйг ажигла — хэрэггүй: эхний return биелсэн бол тэнд хүрэхгүй, биелээгүй бол л хүрнэ — "return = гарц" чанар өөрөө else-ийн ажлыг хийчихэж байна. Энэ хэв маягийг программистууд их хэрэглэдэг бөгөөд нэрийг нь "эрт буцах" (early return) гэдэг: онцгой тохиолдлуудаа эхэнд нь шүүгээд буцаачихвал function-ий үлдсэн бие "цэвэр" нөхцөлд ажилладаг — өмнөх хичээлийн continue-ийн "шүүлт эхэндээ" дадлын function-хувилбар.
Гурав дахь жишээ: гардуулалт дамжлагад орох нь. Return-тэй function-ууд бие биедээ "дамжуулж" ажиллаж чаддаг — жинхэнэ хүч нь энд:
python
def talbai(urt, urgun):
return urt * urgun
def budgiin_zardal(urt, urgun):
neg_metr_kvadratiin_une = 5000
return talbai(urt, urgun) * neg_metr_kvadratiin_une
print(budgiin_zardal(4, 3))Үр дүн:
60000Мөшгье: budgiin_zardal(4, 3) дуудагдаж → биед нь talbai(4, 3) дуудагдаж → тэр 12-ыг гардуулж → 12 * 5000 = 60000 бодогдож → тэр нь budgiin_zardal-аас гардуулагдаж → print хэвлэв. Нэг function нөгөөгийнхөө гардуулалт дээр ажиллав — тогооч тогоочоос тогоо дамжуулж авч буй мэт. Хэрэв talbai нь print хийдэг байсан бол энэ дамжлага боломжгүй байх байсан: budgiin_zardal-ийн гарт үржүүлэх юм ирэхгүй. Эндээс энэ хичээлийн ерөнхий зөвлөмж урган гарна: function бичихдээ return-ийг сонго — үр дүнг нь дэлгэцэд харуулах уу, тооцоонд хэрэглэх үү гэдгийг дуудагч шийдэг эрхтэй байг: return хийдэг function-ий хариуг хэвлэж болно (print(talbai(4, 3))), харин print хийдэг function-ий хариуг тооцоолж болдоггүй — return нь хоёр замыг хоёуланг нь нээж, print нь нэгийг нь хаадаг юм. Print function дотор огт байж болохгүй гэсэн үг биш — явцын мэдээлэл харуулах гэх мэт "хэлэх нь өөрөө ажил" болсон газарт print зөв; харин үр дүн гаргадаг function бол үр дүнгээ гардуулах ёстой.
Дөрөв дэх жишээ: гардуулалтыг хадгалж, харьцуулж, шүүж хэрэглэх. Return-тэй function таны бүх танил хэрэгсэлтэй хоршино:
python
def unelgee(ono):
if ono >= 90:
return "A"
elif ono >= 80:
return "B"
return "C"
minii = unelgee(92)
niiziin = unelgee(85)
print("Миний үнэлгээ:", minii)
print("Найзын үнэлгээ:", niiziin)
if minii == "A":
print("Маш сайн байна!")Elif-ийн хичээлийн үнэлгээний шат маань function болж "жорждоо" орлоо — одоо түүнийг хоёр хүнд дуудаж, гардуулалтуудыг нь хайрцагнуудад хадгалж, бүр if-ийн нөхцөлд шүүж хэрэглэж байна. Гардуулагдсан утга бол жирийн утга: string бол string-ийнхээ бүх эрхтэй, тоо бол тооныхоо — хаанаас ирснээ "санадаггүй". Энэ жишээн дээр function-гүй хувилбараа төсөөлөөд үзээрэй: үнэлгээний if/elif шатыг хоёр хүнд хоёр удаа хуулж бичих байсан — DRY зарчим, parameter, return гурав нийлээд тэр давталтыг устгаж байна.
Хүсвэл туршаад үзээрэй: хоёр тооны ихийг нь гардуулдаг ih_too(a, b) function бичээрэй (эрт буцах хэв маягаар: if a > b: return a гээд дараа нь return b) — тэгээд гурван тооны ихийг ih_too(ih_too(x, y), z) гэсэн дамжлагаар олж үзээрэй. Сонирхвол өмнөх хичээлийн zahialga function-оо нийт үнийг хэвлэдэг биш гардуулдаг болгож өөрчлөөд, хоёр захиалгын нийт дүнг нэмж бодуулаарай — "print-ээс return руу шилжүүлэх" энэ дасгал бол өнөөдрийн сэдвийг гарт буулгах хамгийн шууд зам.
Алдаа 1: Print хийдэг function-ий "хариуг" хадгалах — None-той анхны уулзалт. Амласан сонин зочин:
python
def niilber_heldeg(a, b):
print(a + b)
hariu = niilber_heldeg(3, 4)
print(hariu)Үр дүн:
7
NoneЭхний 7 бол function өөрийнх нь хэвлэсэн — хоёр дахь мөр л бидний асуултын хариу: None. Энэ бол Python-ы тусгай утга — "юу ч байхгүй, хоосон" гэсэн ойлголтыг илэрхийлдэг өөрийн гэсэн иргэн (True, False шиг том үсгээр эхэлдэг, хашилтгүй). Дүрэм нь: return хийгээгүй function автоматаар None гардуулдаг — хашгирдаг тогоочоос тогоо нэхэхэд гарт чинь хоосон таваг л ирдэг гэсэн үг. None өөрөө "алдаа" биш — гэхдээ таны хүлээгээгүй газар гарч ирвэл оношийн үнэтэй шинж тэмдэг: программын гарц дээр None харагдвал — хаа нэгтээ return мартагдсан (эсвэл print-ийг return-ий оронд хэрэглэсэн) function бий. Бүр аюултай хувилбар нь None цааш тооцоонд орох үе: hariu + 10 гэвэл TypeError: unsupported operand type(s) for +: 'NoneType' and 'int' — "NoneType дээр int нэмж болохгүй": энэ мэдэгдэлд NoneType гэдэг үг харагдвал мөшгих чиглэл чинь мөн л "аль function маань хоосон гардуулав" гэсэн асуулт.
Алдаа 2: Return-ий дараах мөрөнд найдах. "Гарц" чанарыг мартвал:
python
def ajil(a, b):
return a + b
print("Тооцоолол хийгдлээ!")
print(ajil(3, 4))Үр дүн:
7"Тооцоолол хийгдлээ!" хаана байна? Хэзээ ч хэвлэгдэхгүй: return биелмэгц function дуусдаг тул түүний доорх мөрүүд — хэчнээн зөв бичигдсэн ч — хүрэгдэшгүй нутаг болдог. Алдааны мэдэгдэл гарахгүй (Python "чи энд хэзээ ч хүрэхгүй мөр бичжээ" гэж зогсоодоггүй) тул энэ бол чимээгүй ангиллын гажуудал. Азаар VS Code энд тусалдаг: return-ий доорх мөрүүдийг эдитор бүдэгрүүлж харуулдаг — код чинь гэнэт "цайвар" харагдвал тэр нь "энэ мөрүүд амьгүй" гэсэн дохио. Хэвлэлт нь хэрэгтэй байсан бол return-ээс дээр нь тавь: эхлээд хэл, дараа нь гардуул.
Алдаа 3: Loop доторх return — "эрт гарчихдаг" тоолуур. Return-ий гарц чанар давталттай мөргөлдөхөөр гардаг сонгодог алдаа:
python
def buh_too(n):
for i in range(1, n + 1):
return i
print(buh_too(5))Бичигч "1-ээс n хүртэлх тоог гардуулна" гэсэн санаатай байсан ч үр дүн: 1. Мөшгье: эхний тойрогт i = 1 → return 1 — function дууслаа: loop нэг л тойрог эргэж амжив. Return бол break-ээс ч хатуу: break зөвхөн давталтаас гардаг бол return бүх function-оос — дотор нь хэдэн давхар loop байсан ч нэвт гарна. "Олон утга цуглуулж гардуулах" хэрэгцээ бол үнэндээ маш зөв хэрэгцээ — гэхдээ түүний хэрэгсэл нь return биш, цуглуулга юм: олон утгыг нэг саванд хийж нэг дор гардуулдаг тэр сав бол Бүлэг 10-ын list — энэ бодлогод бид тэнд эргэж ирнэ. Өнөөдрийн дүрэм: loop-ын биед return тавьж байгаа бол "эхний тойрог дээрээ гарна гэдгийг би зориуд хүсэж байна уу" гэж өөрөөсөө асуу — "олсон даруйдаа гардуул" гэсэн хайлтын бодлогод (эрт буцахын loop-хувилбар) тийм return зөв; "бүгдийг нь" гэсэн бодлогод буруу.
Print бол "хэлэх" — үр дүн дэлгэц рүү очиж зам нь дуусдаг; return бол "гардуулах" — үр дүн дуудагчийн гарт очиж цааш амьдардаг: дуудлагын бичиглэл өөрөө гардуулсан утга болдог.
Гардуулсан утгыг хадгалж (x = f(...)), тооцоолж (f(...) + f(...)), нөхцөлд шүүж, өөр function-д дамжуулж болно — return хоёр замыг хоёуланг нь нээдэг тул үр дүн гаргадаг function үргэлж return-ийг сонго.
Return бол гарц: биелмэгц function тэр дор нь дуусна — доорх мөрүүд хүрэгдэшгүй, loop дотор бол эхний тойрог дээрээ тасална.
Return-гүй function None гардуулдаг: гарц дээр None харагдах, мэдэгдэлд NoneType дурдагдах нь "return мартагдсан" гэсэн оношийн шинж.
Та энэ хэв маягийг аль эрт хэрэглэж байсан: int(), type(), input() бүгд гардуулдаг тогооч нар — өнөөдрөөс өөрийн function-ууд чинь тэдний эгнээнд орлоо.
Дараагийн хичээл бол энэ бүлгийн баяртай төгсгөл: "Танил function-ууд" — шинэ үгсийн сангаа (function, parameter, argument, return) гартаа барьчихсан хүний нүдээр print, input, int, type, range тавыг эргэж харах хичээл. Тэнд нэг шинэ танил ч нэмэгдэнэ: len() — string-ийн уртыг хэмждэг, Бүлэг 9-ийн үүдийг нээх жижигхэн түлхүүр.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.