Python operatorlarining ustuvorligi
Qiymatlar, o'zgaruvchilar, operatorlar va funksiya chaqiruvlarining birikmasi ifoda (expression) deb ataladi. Python interpretatori to'g'ri ifodani baholay oladi.
Masalan:
>>> 5 - 7
-2
Bu yerda 5 - 7 — ifoda. Ifodada bir nechta operator bo'lishi mumkin.
Bunday turdagi ifodalarni baholash uchun Pythonda ustuvorlik (precedence) qoidasi bor. U bu amallar bajariladigan tartibni belgilaydi.
Masalan, ko'paytirish ayirishdan yuqori ustuvorlikka ega.
# Ko'paytirish
# ayirishdan yuqori ustuvorlikka ega
>>> 10 - 4 * 2
2
Lekin biz bu tartibni qavslar () yordamida o'zgartirishimiz mumkin, chunki ular ko'paytirishdan yuqori ustuvorlikka ega.
# Qavslar () yuqori ustuvorlikka ega
>>> (10 - 4) * 2
12
Pythondagi operatorlar ustuvorligi quyidagi jadvalda keltirilgan. U kamayish tartibida (yuqori guruh pastdagilardan yuqori ustuvorlikka ega).
| Operatorlar | Ma'nosi |
|---|---|
() | Qavslar |
** | Daraja |
+x, -x, ~x | Unar plyus, Unar minus, Bitli NOT |
*, /, //, % | Ko'paytirish, Bo'lish, Floor division, Modul |
+, - | Qo'shish, Ayirish |
<<, >> | Bitli siljitish operatorlari |
& | Bitli AND |
^ | Bitli XOR |
| | Bitli OR |
==, !=, >, >=, <, <=, is, is not, in, not in | Taqqoslash, Identity, A'zolik operatorlari |
not | Mantiqiy NOT |
and | Mantiqiy AND |
or | Mantiqiy OR |
Keling, bir nechta misolga qaraymiz:
Aytaylik, biz agar tushlik meva yoki sendvich bo'lsa va faqat pul 2 dan katta yoki teng bo'lsagina ishga tushadigan if...else blokini quryapmiz.
# or va and ustuvorligi
meal = "fruit"
money = 0
if meal == "fruit" or meal == "sandwich" and money >= 2:
print("Lunch being delivered")
else:
print("Can't deliver lunch")
Natija
Lunch being delivered
Bu dastur money 0 bo'lganda ham if blokini ishga tushiradi. U bizga kerakli natijani bermaydi, chunki andning ustuvorligi ordan yuqori.
Biz kerakli natijaga quyidagi tarzda qavslar ()dan foydalanib erishishimiz mumkin:
# or va and ustuvorligi
meal = "fruit"
money = 0
if (meal == "fruit" or meal == "sandwich") and money >= 2:
print("Lunch being delivered")
else:
print("Can't deliver lunch")
Natija
Can't deliver lunch
Yuqoridagi jadvalda bir nechta operator bir xil guruhda mavjudligini ko'rishimiz mumkin. Bu operatorlar bir xil ustuvorlikka ega.
Ikkita operator bir xil ustuvorlikka ega bo'lganda, assotsiativlik amallar tartibini aniqlashga yordam beradi.
Assotsiativlik — bir xil ustuvorlikka ega bir nechta operatorga ega ifoda qanday tartibda baholanishi. Deyarli barcha operatorlar chapdan o'ngga assotsiativlikka ega.
Masalan, ko'paytirish va floor division bir xil ustuvorlikka ega. Shuning uchun, agar ikkalasi ham ifodada mavjud bo'lsa, chapdagisi birinchi baholanadi.
# Chapdan o'ngga assotsiativlik
# Natija: 3
print(5 * 2 // 3)
# Chapdan o'ngga assotsiativlikni ko'rsatadi
# Natija: 0
print(5 * (2 // 3))
Natija
3
0
Eslatma: Daraja operatori ** Pythonda o'ngdan chapga assotsiativlikka ega.
# ** ning o'ngdan chapga assotsiativligini ko'rsatadi
# Natija: 512, chunki 2**(3**2) = 2**9
print(2 ** 3 ** 2)
# Agar avval 2 darajaga ko'tarilishi kerak bo'lsa, () ishlatish kerak
# Natija: 64
print((2 ** 3) ** 2)
Ko'rishimiz mumkinki, 2 ** 3 ** 2 2 ** (3 ** 2)ga teng.
Tenglashtirish operatorlari va taqqoslash operatorlari kabi ba'zi operatorlar Pythonda assotsiativlikka ega emas. Bunday turdagi operatorlar ketma-ketligi uchun alohida qoidalar bor va ularni assotsiativlik sifatida ifodalab bo'lmaydi.
Masalan, x < y < z na (x < y) < zni, na x < (y < z)ni anglatadi. x < y < z x < y and y < zga teng va chapdan o'ngga baholanadi.
Bundan tashqari, x = y = z = 1 kabi tenglashtirishlarni zanjirlash mutlaqo to'g'ri bo'lsa-da, x = y = z+= 2 xatolikka olib keladi.
# x, y, z ni ishga tushirish
x = y = z = 1
# Ifoda yaroqsiz
# (Assotsiativ bo'lmagan operatorlar)
# SyntaxError: invalid syntax
x = y = z+= 2
Natija
File "<string>", line 8
x = y = z+= 2
^
SyntaxError: invalid syntax