Skip to content

Python da walrus(:=) operatori

Python 3.8 versiyasidan boshlab qo'shilgan walrus operatori := ko'rinishida yoziladi. Walrus nomi berilishiga sabab ingliz tilida morj (suv hayvoni) "walrus" deb ataladi. Pythondagi ushbu operator belgisi ham shu hayvonning yuziga o'xshagani uchun shunday nomlangan. Rasmiy nomi esa assignment expression.

Walrus
Walrus (morj)

Bu operator ixcham va o'qilishi oson kod yozishga yordam beradi. Walrus operatori bitta qatorda ham qiymat berish (assign), ham uni ishlatish (evaluate) imkonini beradi. Oddiy holatda avval qiymatni hisoblab olasiz, uni o'zgaruvchiga saqlaysiz keyin ishlatasiz. Walrus operator esa bu bosqichlarni birlashtiradi. Buni foydalanuvchidan biror malumotni qabul qilish va uni ekranga chiqarish misolida ko'rib chiqamiz.

1-misol. input() operatori bilan.


walrus.py
1
2
3
4
data = input("Kiriting: ")
while data != "chiqish":
    print(data)
    data = input("Kiriting: ")

Yuqoridagi misolda input() operatori ikki marta yozildi ya'ni kodimizda takrorlanish bor. Quyida takrorlanishsiz walrus operatori bilan yozamiz.

walrus.py
while (data := input("Kiriting: ")) != "chiqish":
    print(data)

Bu yerda data := input() qiymatni saqlaydi va shu vaqtda shartda tekshiriladi.

2-misol. list comprehension bilan.


Agar bizdan 1 dan 10 gacha sonlarni darajaga oshirib 10 dan kattlarini ro'yxat(list)ga saqlash vazifasi so'ralsa quyidagi tartibda yozish mumkin.

result = [num**2 for num in range(10) if num**2 > 10]

Bu misolda num**2 darajaga oshirish ikki marta takror hisoblanyapdi. Endi walrus bilan quyidagi ko'rinishda qayta yozib ko'ramiz.

walrus.py
result = [square for num in range(10) if (square := num**2) > 10]

Bu yerda esa num**2 darajaga oshirish bir marta hisoblanadi.

3-misol. Fayldan o'qish.


Agar bizdan fayldan ma'lumot o'qib, har bir qatori ustida biror amal bajarish so'ralsa, odatda quyidagicha kod yozamiz:

walrus.py
1
2
3
4
line = file.readline()
while line:
    print(line)
    line = file.readline()

Bu yerda hammasi to'g'ri ishlaydi. Keling, endi shu kodni walrus operatori yordamida ixchamroq ko'rinishda yozib ko'ramiz:

walrus.py
while (line := file.readline()):
    print(line)

Bu yerda har bir sikl aylanishida ma'lumot o'qiladi va line o'zgaruvchisiga qiymat beriladi, shu bilan birga while siklining sharti ham tekshiriladi. Natijada, kodimiz yanada qisqa va o'qilishi osonroq bo'ldi.

4-misol. Funksiyada foydalanish.


Tasavvur qiling, bizda shunday funksiya bor u tashqaridan kelgan ma'lumotni ni qabul qiladi, uni boshqa bir funksiya orqali qayta ishlaydi va natijani qaytaradi.

walrus.py
1
2
3
4
def my_function(data):
    result = data_generator(data)
    if result:
        return result

Info

Pythonda agar return bo'lmasa, avtomatik None qaytadi. Shuning uchun else return None kerak emas. Lekin None emas boshqa 0, False yoki bo'sh matn qaytarish kerak bo'lsa unda return vazaiyatga qarab qo'shiladi.

Bu yerda data_generator(data) chaqiriladi natija result ga saqlanadi, agar result mavjud bo'lsa qaytariladi aks holda None qaytariladi. Bu to'g'ri ishlaydi, lekin buni walrus bilan qisqaroq qilishimiz mumkin.

walrus.py
1
2
3
def my_function(data):
    if (result := data_generator(data)):
        return result

Bu yerda esa result := data_generator(data) qiymatni saqlaydi va shu zahoti if shart ichida tekshiradi.

Noto'g'ri foydalanish


Walrus operatoridan foydalanishda qavslardan to'g'ri foydalanish kerak, aks holda noto'g'ri natija olish mumkin.

Misol uchun, bizda biror hisob-kitobni bajaradigan my_calc_function nomli funksiya bor. Bu funksiya ikki sonni qo'shib, natijani qaytaradi. Natijani esa result o'zgaruvchisi qabul qiladi va agar funksiya qaytargan yig'indi 10 dan kichik bo'lsa, ekranga chiqariladi.

An'anaviy usulda kod quyidagicha yoziladi:

walrus.py
1
2
3
4
5
6
7
def my_calc_function(a, b):
    return a + b

result = my_calc_function(2, 5)

if result < 10:
    print(result)

Natija:

7

Walrus operatori bilan quyidagicha yoziladi:

walrus.py
1
2
3
4
5
def my_calc_function(a, b):
    return a + b

if (result := my_calc_function(2, 5)) < 10:
    print(result)

Natija:

7

Yuqoridagi misolda qavslar ortiqchadek tuyulishi mumkin. Keling, qavslarni olib tashlasak nima sodir bo'lishini ko'ramiz:

walrus.py
1
2
3
4
5
def my_calc_function(a, b):
    return a + b

if result := my_calc_function(2, 5) < 10:
    print(result)

Natija:

True

Bu noto'g'ri ishladi. Sababi my_calc_function(2, 5) < 10 ifodasi avval bajariladi va bu mantiqiy amal True yoki False qiymat qaytaradi.

Natijada aynan shu mantiqiy(bool) qiymat result o'zgaruvchisiga yozildi.

Info

Walrus operatori oddiy = operatori o'rniga ishlatib bo'lmaydi. U asosan ifoda (expression) ichida qiymat berish va undan usha vaqtning o'zida foydalanish uchun qo'llash to'g'ri bo'ladi.

Xulosa


Walrus operatoridan foydalanilganda tezlik oshadimi degan savol ko'pchilikda tug'ilishi mumkin. Bunga javoban har doim ham emas degan javob to'g'ri keladi deb o'ylayman.

Walrus operatoridan foydalanish asosan kodni soddalashtirishga yordam beradi. Ba'zida esa ortiqcha qayta hisob-kitoblarni kamaytiradi.

Shuning uchun uni har doim ham qo'llash shart emas. Faqat kod murakkablashib ketayotgan yoki bir xil hisob-kitoblar qayta-qayta bajarilayotgan holatlarda ishlatish maqsadga muvofiq. Agar walrus operatori kodni chalkashtirsa tushunishni qiyinlashtirsa ishlatmagan ma'qul bo'ladi.