Python / Задлан авах (Unpacking)

Задлан авах (Unpacking)

Unpacking бол tuple, list, эсвэл бусад цуглуулгын утгуудыг нэг дор хэд хэдэн хувьсагчид хуваан оноох техник юм. Энэ нь кодыг богино, цэвэр болгодог Python-ны маш хэрэгтэй онцлог.

Та аль хэдийн for нэр, оноо in жагсаалт.items(): гэж бичиж байсан бол та unpacking-г аль хэдийн ашиглаж байсан хэрэг!

Үндсэн Unpacking

Tuple Unpacking

python
цэг = (10, 20)
x, y = цэг

print(x)   # 10
print(y)   # 20

Баруун талд байгаа элементүүдийн тоо зүүн талын хувьсагчдын тоотой яг таарах ёстой — тийм биш бол ValueError гарна.

List Unpacking

List-г мөн адил задалж болно:

python
гурав = [1, 2, 3]
нэг, хоёр, гурав_тоо = гурав

print(нэг)       # 1
print(хоёр)      # 2
print(гурав_тоо) # 3

Хоёр хувьсагчийн утгыг солих

Unpacking ашиглан хоёр хувьсагчийн утгыг гуравдагч хувьсагчгүйгээр солих боломжтой — энэ бол Python-ны сайхан онцлогуудын нэг:

python
а = 5
б = 10

а, б = б, а

print(а)   # 10
print(б)   # 5

* (Star) Unpacking

Зарим элементийг нэг хувьсагчид, үлдсэнийг нөгөөд авахад * ашигладаг:

python
тоонууд = [1, 2, 3, 4, 5]

эхний, *дунд, сүүлийн = тоонууд

print(эхний)    # 1
print(дунд)     # [2, 3, 4]
print(сүүлийн) # 5

* ашигласан хувьсагч нь үргэлж list хэлбэрт байна — тэр ч байтугай хоосон байж болно:

python
эхний, хоёрдогч, *үлдсэн = [10, 20]

print(эхний)    # 10
print(хоёрдогч) # 20
print(үлдсэн)  # []

Dictionary Unpacking — **

Dictionary-н key-value хосуудыг функцийн keyword argument-д дамжуулахад ** ашигладаг:

python
def мэндлэх(нэр, нас, хот):
    print(f"Сайн уу, {нэр}! Та {нас} настай, {хот}-аас ирсэн.")

хэрэглэгч = {"нэр": "Болд", "нас": 25, "хот": "Улаанбаатар"}

мэндлэх(**хэрэглэгч)
# Сайн уу, Болд! Та 25 настай, Улаанбаатар-аас ирсэн.

Хоёр Dictionary-г нэгтгэхэд ч ** ашиглана:

python
үндсэн = {"нэр": "Сарнай", "нас": 22}
нэмэлт = {"хот": "Дархан", "мэргэжил": "хөгжүүлэгч"}

бүтэн = {**үндсэн, **нэмэлт}
print(бүтэн)
# {'нэр': 'Сарнай', 'нас': 22, 'хот': 'Дархан', 'мэргэжил': 'хөгжүүлэгч'}

Функцийн *args ба **kwargs

Функц хэдэн ч argument хүлээн авах боломжтой болгоход *args ба **kwargs ашигладаг.

*args — байрлалын argument-ууд

python
def нэмэх(*тоонууд):
    print(тоонууд)        # tuple хэлбэрт ирнэ
    return sum(тоонууд)

print(нэмэх(1, 2, 3))          # 6
print(нэмэх(10, 20, 30, 40))   # 100

**kwargs — keyword argument-ууд

python
def мэдээлэл(**утгууд):
    for түлхүүр, утга in утгууд.items():
        print(f"{түлхүүр}: {утга}")

мэдээлэл(нэр="Төгс", нас=30, хот="Эрдэнэт")
# нэр: Төгс
# нас: 30
# хот: Эрдэнэт

Хоёуланг хамт ашиглах

python
def жишээ_функц(*args, **kwargs):
    print("args:", args)
    print("kwargs:", kwargs)

жишээ_функц(1, 2, 3, нэр="Болд", хот="УБ")
# args: (1, 2, 3)
# kwargs: {'нэр': 'Болд', 'хот': 'УБ'}

Давталтад Unpacking

for давталтад tuple-ийн жагсаалтыг задлан авах нь маш түгээмэл хэлбэр:

python
сурагчид = [("Болд", 85), ("Сарнай", 92), ("Төгс", 78)]

for нэр, оноо in сурагчид:
    print(f"{нэр}: {оноо} оноо")

# Болд: 85 оноо
# Сарнай: 92 оноо
# Төгс: 78 оноо

enumerate() ба zip() функцуудтай хамт ашигласан ч мөн адил:

python
хотууд = ["Улаанбаатар", "Дархан", "Эрдэнэт"]

for дугаар, хот in enumerate(хотууд, start=1):
    print(f"{дугаар}. {хот}")

# 1. Улаанбаатар
# 2. Дархан
# 3. Эрдэнэт

Дараагийн хичээлд:

Алдаа зохицуулах (try/except) механизмыг судална — программ ажиллах явцад гарах алдаануудыг хэрхэн барьж авах, хэрэглэгчид утга бүхий мэдэгдэл харуулах, программ гэнэт унахаас хамгаалах аргуудыг үзнэ.