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. input() operatori bilan.
| walrus.py | |
|---|---|
Yuqoridagi misolda input() operatori ikki marta yozildi ya'ni kodimizda takrorlanish bor. Quyida takrorlanishsiz walrus
operatori bilan yozamiz.
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.
Bu misolda num**2 darajaga oshirish ikki marta takror hisoblanyapdi. Endi walrus bilan quyidagi ko'rinishda qayta yozib ko'ramiz.
| walrus.py | |
|---|---|
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:
Bu yerda hammasi to'g'ri ishlaydi. Keling, endi shu kodni walrus operatori yordamida ixchamroq ko'rinishda yozib ko'ramiz:
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.
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.
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 | |
|---|---|
Natija:
Walrus operatori bilan quyidagicha yoziladi:
| walrus.py | |
|---|---|
Natija:
Yuqoridagi misolda qavslar ortiqchadek tuyulishi mumkin. Keling, qavslarni olib tashlasak nima sodir bo'lishini ko'ramiz:
| walrus.py | |
|---|---|
Natija:
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.