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.
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.
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.
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.
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:
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:
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.
def my_function(data):
result = data_generator(data)
if result:
return resultPythonda agar
returnbo'lmasa, avtomatikNoneqaytadi. Shuning uchun elsereturn Nonekerak emas. LekinNoneemas boshqa0,Falseyokibo'sh matnqaytarish kerak bo'lsa undareturnvazaiyatga 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.
def my_function(data):
if (result := data_generator(data)):
return resultBu 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.
Get Farrux Elomonov’s stories in your inbox
Join Medium for free to get updates from this writer.
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:
def my_calc_function(a, b):
return a + bresult = my_calc_function(2, 5)if result < 10:
print(result)
Natija:
7Walrus operatori bilan quyidagicha yoziladi:
def my_calc_function(a, b):
return a + bif (result := my_calc_function(2, 5)) < 10:
print(result)Natija:
7Yuqoridagi misolda qavslar ortiqchadek tuyulishi mumkin. Keling, qavslarni olib tashlasak nima sodir bo’lishini ko’ramiz:
def my_calc_function(a, b):
return a + bif result := my_calc_function(2, 5) < 10:
print(result)Natija:
TrueBu 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.
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.
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.





