Ачааллж байна...
Өмнөх хичээлийн төгсгөлд бид нэг шийдэгдээгүй асуудал үлдээсэн. Бидэнд дөрвөн параметртэй функц байсан бөгөөд зөвхөн ХАМГИЙН СҮҮЛИЙНХИЙГ нь өөрчлөхийн тулд эхний гурвыг нь бүгдийг бичих хэрэгтэй болсон:
python
barааnii_medeelel("Ном", 0, 1, "USD")Тэр 0 ба 1 нь default утгуудтай яг ижилхэн — өөрөөр хэлбэл бид тэднийг зөвхөн "цаад талд нь хүрэхийн тулд" бичиж байгаа юм. Энэ нь ядаргаатай, алдаанд хүргэдэг, уншихад ойлгомжгүй. Одоо бид түүнийг шийднэ.
Шийдэл нь маш энгийн санаа дээр тулгуурладаг: аргументыг ДАРААЛЛААР нь биш, НЭРЭЭР нь дамжуулах. Түүнийг keyword argument гэж нэрлэдэг (мөн богиноор kwarg гэж бичдэг). Курс 1-д та аргументыг зөвхөн дарааллаар нь дамжуулж байсан бөгөөд тэр аргыг positional argument гэж нэрлэдэг — "байрлалаар нь" гэсэн утгатай. Энэ хичээлээр та хоёр дахь аргыг сурч, хэзээ алийг нь ашиглахаа мэдэх болно.
Мөн энэ хичээлд нэг чухал ажиглалт байна: орчин үеийн framework-ийн код нь keyword argument-аар БҮРЭН дүүрэн байдаг. FastAPI, requests, эсвэл ямар ч мэргэжлийн сангийн жишээ код харвал name=value гэсэн бичлэг хаа сайгүй харагдана. Тиймээс энэ хичээл бол зөвхөн тав тухын тухай биш — тэдгээр кодыг унших чадварын тухай юм.
Ресторанд буцъя. Та зөөгчид "нэг капучино, том, сүүгүй, элсэн чихэргүй" гэж захиалж болно. Зөөгч танд итгэж, тэр дарааллаар нь ойлгоно.
Гэхдээ хэрэв та зөвхөн НЭГ зүйлийг өөрчлөхийг хүсвэл яах вэ? "Нэг капучино, ердийн бүхэн, гэхдээ сүүгүй." Энд та "ердийн бүхэн" гэсэн утгагүй үг хэлэх шаардлагагүй — та зөвхөн өөрчилж байгаа зүйлээ НЭРЛЭЖ хэлнэ: "сүү: үгүй."
Positional argument бол дарааллын захиалга — та бүх зүйлийг байрлалаар нь тоочно. Keyword argument бол нэрлэсэн захиалга — та зөвхөн хэлэх шаардлагатай зүйлээ, "энэ бол ийм зүйл" гэж шошготой нь хэлнэ. Зөөгч аль хэлбэрийг ч ойлгоно, гэхдээ хоёр дахь нь тодорхой бөгөөд алдаанаас хамгаална.
python
def mendchilekh(ner, mendchilgee="Сайн байна уу"):
print(f"{mendchilgee}, {ner}!")
mendchilekh("Болд", "Өглөөний мэнд")
mendchilekh(ner="Болд", mendchilgee="Өглөөний мэнд")Хоёр дуудалт ЯГ ИЖИЛ үр дүн өгнө:
Өглөөний мэнд, Болд!
Өглөөний мэнд, Болд!Эхний дуудалт нь positional — та зөвхөн утгуудыг бичиж, Python тэднийг байрлалаар нь параметрүүдэд хуваарилна. Эхний утга эхний параметрт, хоёр дахь утга хоёр дахь параметрт.
Хоёр дахь дуудалт нь keyword — та утга бүрийг параметрийн НЭРТЭЙ нь хамт бичиж байна: ner="Болд". Одоо Python дарааллыг тоох шаардлагагүй, учир нь та юу хаана орохыг шууд хэлж өгсөн.
Хоёр дахь бичлэг илүү урт харагдаж байна. Тэгвэл юуны төлөө вэ?
Одоо өмнөх хичээлийн асуудалд буцъя.
python
def barааnii_medeelel(ner, une=0, too=1, valuta="MNT"):
niit = une * too
print(f"{ner}: {too} ширхэг x {une} = {niit} {valuta}")
barааnii_medeelel("Ном", valuta="USD")Үр дүн:
Ном: 1 ширхэг x 0 = 0 USDАсуудал шийдэгдлээ. Бид une ба too -г огт бичээгүй тул тэдгээр нь default утгаа авсан. Зөвхөн valuta -г нэрээр нь дуудаж өөрчилсөн.
Энэ бол keyword argument-ийн хамгийн шууд ашиг тус: дунд байгаа параметрүүдийг алгасаж, зөвхөн хэрэгтэйгээ өөрчилж чадна. Хэдэн параметр байгаа нь хамаагүй, хэдэн дугаартай нь хамаагүй — та нэрийг нь мэдэж байвал хүрч чадна.
Хэдэн жишээ нэмье:
python
barааnii_medeelel("Утас", une=800000)
barааnii_medeelel("Харандаа", too=10)
barааnii_medeelel("Дэвтэр", une=3000, too=5)Үр дүн:
Утас: 1 ширхэг x 800000 = 800000 MNT
Харандаа: 10 ширхэг x 0 = 0 MNT
Дэвтэр: 5 ширхэг x 3000 = 15000 MNTДуудалт бүр өөр өөр параметрийн хослолыг өөрчилж байна. Positional-аар үүнийг хийхийн тулд та default утгуудыг гараар давтаж бичих хэрэгтэй болох байсан.
Одоо илүү нарийн, гэхдээ илүү чухал давуу талыг үзье. Дараах дуудалтыг хараарай:
python
huudas_uusgekh("Тайлан", True, False, True, 30)Энэ код юу хийж байна вэ? Та мэдэхгүй. Тэр True, False, True гэсэн гурван утга ЮУГ илэрхийлж байна вэ? 30 нь юу вэ — секунд үү, хуудасны тоо юу, өргөн үү? Мэдэхийн тулд та функцийн тодорхойлолт руу очиж, параметрүүдийн нэрсийг харах хэрэгтэй болно. Тэр нь код унших урсгалыг тасалдаг.
Одоо ижил дуудалтыг keyword-оор:
python
huudas_uusgekh(
garchig="Тайлан",
niitlekh=True,
zurag_oruulakh=False,
khevlekh=True,
khugatsaa=30,
)Одоо код нь ӨӨРӨӨ тайлбарлаж байна. Функцийн тодорхойлолт руу очих шаардлагагүй. Тэр True нь юу гэсэн үг болохыг та шууд харж байна.
Энэ бол keyword argument-ийн жинхэнэ үнэ цэнэ бөгөөд түүнийг ойлгосон программистууд түүнийг тав тухаас илүү ЧАНАРЫН хэрэгсэл гэж үздэг. Код нь бичигдэхээсээ хамаагүй олон удаа УНШИГДДАГ. Гурван нэмэлт үг бичиж, дараа нь зуун удаа тодорхой уншигдах нь маш сайн наймаа юм.
Практик дүрэм: булийн утга (True/False) дамжуулж байвал бараг үргэлж keyword ашигла. Учир нь True гэсэн үг өөрөө юуг ч тайлбарладаггүй. niitlekh=True гэвэл бүх зүйл тодорхой болно.
Та positional ба keyword-ыг НЭГ дуудалтад хамт ашиглаж болно. Гэхдээ хатуу дүрэмтэй.
python
def barааnii_medeelel(ner, une=0, too=1, valuta="MNT"):
niit = une * too
print(f"{ner}: {too} ширхэг x {une} = {niit} {valuta}")
barааnii_medeelel("Ном", 15000, valuta="USD")Үр дүн:
Ном: 1 ширхэг x 15000 = 15000 USDЭнд "Ном" ба 15000 нь positional (дарааллаар), valuta="USD" нь keyword (нэрээр) байна. Ажиллаж байна.
Хатуу дүрэм: positional аргументууд ҮРГЭЛЖ keyword-уудын ӨМНӨ байх ёстой.
Хэрэв зөрчвөл:
python
barааnii_medeelel(ner="Ном", 15000) File "main.py", line 6
barааnii_medeelel(ner="Ном", 15000)
^
SyntaxError: positional argument follows keyword argumentSyntaxError: positional argument follows keyword argument гэдэг нь "positional аргумент нь keyword аргументийн ард орсон байна" гэсэн үг. Python үүнийг зөвшөөрөхгүй.
Яагаад? Логик нь өмнөх хичээлийн дүрэмтэй ижил. Хэрэв keyword-ын дараа positional орж ирвэл Python түүнийг ХААНА хуваарилахаа мэдэхгүй болно. 15000 нь хоёр дахь параметрт орох ёстой юу? Гэхдээ эхнийх нь аль хэдийн нэрээр нь дуудагдсан — тэгэхээр "хоёр дахь байрлал" гэдэг нь одоо утгаа алдсан. Тодорхойгүй байдал үүсэхээс сэргийлж Python үүнийг шууд хориглосон.
Санах хялбар арга: байрлалтай зүйлс эхэнд, нэртэй зүйлс араас. Энэ нь өмнөх хичээлийн "заавал байх зүйлс эхэнд, сонголттой зүйлс араас" гэсэн дүрэмтэй нэг л зарчмаас урган гарч байна: Python тодорхойгүй байдлыг үзэн яддаг.
Keyword ашиглаж байгаа үед ДАРААЛАЛ нь ямар ч ач холбогдолгүй болно.
python
def barааnii_medeelel(ner, une=0, too=1, valuta="MNT"):
niit = une * too
print(f"{ner}: {too} ширхэг x {une} = {niit} {valuta}")
barааnii_medeelel(valuta="EUR", too=2, ner="Ном", une=20000)Үр дүн:
Ном: 2 ширхэг x 20000 = 40000 EURПараметрүүд функцийн тодорхойлолтоос огт өөр дараалалтай бичигдсэн ч зөв ажиллаж байна. Учир нь нэр бүр өөрөө хаана очихоо хэлж байгаа тул байрлал хэрэггүй болсон.
Гэхдээ энэ эрх чөлөөг хэтрүүлж болохгүй. Функцийн тодорхойлолттой ижил дараалалд бичих нь уншигчид илүү тохиромжтой байдаг тул би түүнийг зөвлөж байна. Энэ бол дүрэм биш, зөвхөн эелдэг байдал.
Одоо энэ хичээлийн хамгийн чухал ажиглалт руу орно.
Орчин үеийн Python сан, framework-ийн жишээ кодыг харвал keyword argument хаа сайгүй байдаг. Жишээ нь requests сангийн (Бүлэг 11-д үзнэ) ердийн дуудалт:
python
requests.get("https://api.example.com/data", timeout=5, params={"hot": "Улаанбаатар"})Эсвэл FastAPI-гийн (Бүлэг 15-д үзнэ) программын эхлэл:
python
app = FastAPI(title="Миний API", version="1.0", description="Жижиг туршилтын API")Эдгээр код одоохондоо танд бүрэн ойлгомжгүй байх — тэр зүгээр л. Гол зүйл нь БҮТЭЦ юм: name=value, name=value, name=value. Та түүнийг харах бүрдээ "аан, эдгээр бол keyword argument, тэдгээр нь сонголттой тохиргоо" гэж шууд ойлгох ёстой.
Яагаад санг бичсэн хүмүүс ингэж хийсэн бэ? Хоёр шалтгаантай.
Нэгдүгээрт, ийм функцууд нь МАШ олон сонголттой байдаг. requests.get нь арваад параметртэй: timeout, headers, params, auth, cookies, verify, allow_redirects болон бусад. Хэрэв тэднийг positional-аар дамжуулах шаардлагатай байсан бол хэрэглэгч бүр арван утга бичих байсан. Тэдгээр нь бүгд default утгатай, keyword-оор дуудагддаг тул хэрэглэгч зөвхөн хэрэгтэйгээ л бичдэг.
Хоёрдугаарт, ойлгомжтой байдал. requests.get(url, 5) гэсэн код юу гэсэн үг вэ? Тав нь юу вэ? requests.get(url, timeout=5) гэсэн код нь өөрөө хариулж байна.
Тэгэхээр энэ хичээлийг та зөвхөн "өөрийн функцээ хэрхэн дуудах" гэж бус, "бусдын сангийн documentation-ыг хэрхэн унших" гэж ойлгоорой. Documentation дээр def get(url, params=None, timeout=None, headers=None, ...) гэж бичсэн байвал одоо та түүнийг уншиж, "url нь заавал, үлдсэн нь бүгд сонголттой, keyword-оор дуудагдана" гэж шууд ойлгоно.
Хэрэв сонирхвол: Курс 1-ээс танил print функцийг keyword-оор дуудаж үзээрэй.
python
print("а", "б", "в", sep=" | ")
print("Төгсгөлгүй", end="")
print(" — үргэлжилсэн")Гарах үр дүнг эхлээд таамаглаад, дараа нь ажиллуулж шалгаарай. sep ба end нь print-ийн keyword параметрүүд бөгөөд тэдгээр нь default утгатай (sep=" ", end="\n"). Та Курс 1-ийн турш тэднийг мэдэлгүй ашиглаж байсан юм.
Мөн хүсвэл: sorted функцийг reverse=True гэсэн keyword-той дуудаж үзээрэй: sorted([3, 1, 2], reverse=True). Энэ нь дараагийн хичээлүүдэд эргэж ирнэ.
1. Байхгүй параметрийн нэр бичих
python
def mendchilekh(ner, mendchilgee="Сайн байна уу"):
print(f"{mendchilgee}, {ner}!")
mendchilekh(ner="Болд", mend="Өглөөний мэнд")Traceback (most recent call last):
File "main.py", line 5, in <module>
mendchilekh(ner="Болд", mend="Өглөөний мэнд")
TypeError: mendchilekh() got an unexpected keyword argument 'mend'TypeError: got an unexpected keyword argument 'mend' гэдэг нь "mend гэсэн нэртэй параметр энэ функцэд байхгүй байна" гэсэн үг. Ихэвчлэн шалтгаан нь энгийн үсгийн алдаа — энд mendchilgee гэж бичих ёстой байсан. Заримдаа documentation-ыг буруу уншсанаас ч болдог. Засвар: функцийн тодорхойлолтоос параметрийн нэрийг яг хуулж бич.
Энэ алдаа нь үнэндээ САЙН зүйл гэдгийг анзаараарай. Python нь таны үсгийн алдааг ШУУД илрүүлж, чанга дуугарч байна. Хэрэв positional-аар дамжуулж байсан бол ийм алдаа огт илрэхгүй, зүгээр л буруу утга буруу газар очих байсан. Keyword нь илүү аюулгүй.
2. Нэг параметрт хоёр удаа утга өгөх
python
mendchilekh("Болд", ner="Сараа")Traceback (most recent call last):
File "main.py", line 5, in <module>
mendchilekh("Болд", ner="Сараа")
TypeError: mendchilekh() got multiple values for argument 'ner'got multiple values for argument 'ner' гэдэг нь "ner параметрт хоёр өөр утга ирлээ" гэсэн үг. Positional "Болд" нь эхний параметр буюу ner -т очсон. Дараа нь ner="Сараа" гэж дахин ner -т утга өгсөн. Python аль нь зөв болохыг мэдэхгүй тул алдаа гаргалаа. Засвар: аль нэгийг нь л ашигла.
3. Positional-ыг keyword-ын ард тавих
SyntaxError: positional argument follows keyword argumentДээр дэлгэрэнгүй үзсэн. Positional-ууд ҮРГЭЛЖ эхэнд.
4. Keyword-д тэнцүү тэмдгийн орчим зай тавих
python
mendchilekh(ner = "Болд")Энэ АЖИЛЛАНА, алдаа гарахгүй. Гэхдээ мэргэжлийн Python стандарт (PEP 8) нь keyword argument-ын тэнцүү тэмдгийн орчим ЗАЙ ТАВЬДАГГҮЙ: ner="Болд". Харин ердийн хувьсагчид утга олгохдоо зай ТАВЬДАГ: ner = "Болд". Энэ ялгаа нь санамсаргүй биш — тэр нь уншигчид "энэ бол дуудалт доторх аргумент, энгийн олголт биш" гэдгийг нүдээр нь ялгуулах зорилготой. Алдаа биш, гэхдээ мэргэжлийн зуршил учраас дагах нь зүйтэй.
Positional argument нь утгыг ДАРААЛЛААР нь дамжуулна: f("Болд", "Сайн уу").
Keyword argument нь утгыг НЭРЭЭР нь дамжуулна: f(ner="Болд", mendchilgee="Сайн уу").
Keyword нь дунд байгаа параметрүүдийг алгасах боломж өгдөг: f("Ном", valuta="USD").
Keyword нь кодыг ӨӨРӨӨ ТАЙЛБАРЛАДАГ болгодог — ялангуяа True/False эсвэл утга нь ойлгомжгүй тоо дамжуулж байхад.
Хатуу дүрэм: positional аргументууд ҮРГЭЛЖ keyword-уудын өмнө. Эс тэгвээс SyntaxError.
Keyword ашиглаж байхад дараалал ач холбогдолгүй.
Байхгүй нэр бичвэл Python ШУУД алдаа гаргана — энэ нь positional-оос илүү аюулгүй болгодог.
Орчин үеийн framework, library-гийн код keyword-оор дүүрэн байдаг. name=value бичлэг харагдвал тэр нь бараг үргэлж сонголттой тохиргоо гэсэн үг.
Дараагийн хичээлд бид үүнийг эсрэг талаас нь харна. Одоо та функцийг ДУУДАХ талаас keyword-ыг мэдэж авлаа. Тэгвэл функцийг БИЧИХ талаас — дурын тооны аргумент хүлээж авдаг функц хэрхэн бичдэг вэ? Тэр асуултын хариулт нь *args ба **kwargs бөгөөд тэдгээр нь Курс 1-ээс тавигдсан нэг эртний асуултыг эцэст нь тайлна: print() яагаад хэдэн ч утга хүлээж авч чаддаг юм бэ?
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.