Python'dagi not operatori: logical negation bo'yicha to'liq qo'llanma
Python'ning not operatorini mukammal o'rganing. Bu logical negation keyword'i True/False, truthiness va murakkab shartlar bilan qanday ishlashini bilib oling.
Muallif: Kimberly Fessel
Python'ning logical operator'lari mutlaqo zerikarli... not!
90-yillarning o'sha bema'ni hazilini aytib, ko'nglimni bo'shatib olganimdan so'ng, keling, Python'da logical expression'larni inkor qilish uchun ishlatiladigan kuchli operator — not haqida gaplashamiz. not operatori dunyoni sizga teskari ko'rsatadi: True False'ga, False esa True'ga aylanadi va u bilan birga sevimli operator'laringiz (is, in va hokazo) xuddi "Teskari kun" kelgandek o'zini tutadi. not'ni Python kodining hamma joyida uchratasiz, shuning uchun unga e'tibor qaratishga arziydi.
Ushbu maqola Python'dagi not operatoriga bag'ishlangan. Siz uning nima ekanini, uni conditional statement'larga qanday qo'shishni va u != hamda ~ kabi o'xshash konstruksiyalar bilan qanday taqqoslanishini bilib olasiz. Bu ko'plab nozik jihatlarga ega bo'lgan asosiy tushuncha, shuning uchun boshlaylik.
not keyword'i Boolean operator sifatida
not keyword'i Python'dagi logical operator. U teskari Boolean qiymatni beradi: True False'ga, False esa True'ga aylanadi:
print(not True)
# Expected result:
# False
not operatori har doim Boolean qiymat qaytaradi. U ko'pincha mantiqni soddalashtirishga yordam beradi, shunda conditional statement'lar va loop'lar uchun tozaroq kod yoza olasiz. Masalan, quyidagi if statement'i foydalanuvchida ruxsat bo'lmasa, kirish rad etilgani haqidagi xabarni chiqaradi:
if not user_has_permission:
print("Access denied.")
user_has_permission o'zgaruvchisi yo True, yo False bo'ladi, not esa shu Boolean o'zgaruvchini inkor qiladi.
Python'dagi not operatori: truthiness
not operatori ko'pincha Boolean expression'lar bilan birga uchrasa-da, Python'da truthiness'ni baholashda ham paydo bo'lishi mumkin. Python True va False tushunchasini an'anaviy Boolean'lardan tashqariga kengaytirish uchun qiymatlarni "truthy" yoki "falsy" deb tasniflaydi. "Falsy" qiymatlarning keng tarqalgan misollari:
-
False
-
None
-
0, 0.0 yoki 0j
-
[], {}, () yoki set()
-
"" (bo'sh string)
-
range(0)
Qolgan deyarli hamma narsa truthy. Truthiness, shuningdek, filter()'ga shart funksiyasi sifatida None berilganda uning ishlashini ham ta'minlaydi.
Bo'sh list'lar yoki string'larni, nolga teng integer yoki float'larni, null'larni (None) yoki boshqa falsy qiymatlarni aniqlash uchun not operatoridan foydalaning. Mana bir misol:
if not list_of_values:
raise ValueError("The list cannot be empty.")
E'tibor bering, list_of_values bo'sh bo'lganda Python if not list_of_values'ni True deb baholaydi, chunki bo'sh list'lar falsy. O'qilishi oson va ko'proq Pythonic bo'lgani uchun bu sintaksis odatda list uzunligini tekshirishdan (if len(list_of_values) == 0) afzal ko'riladi.
Statement'larda not operatoridan foydalanish
Conditional statement'larda not ishlatilishiga oid bir nechta misollarni allaqachon ko'rdingiz. Bu not logical operatoridan foydalaniladigan asosiy joy, shuning uchun keling, yanada chuqurroq kirib, not'ni while loop'lari bilan ham ko'rib chiqamiz.
Conditional statement'lar (if statement'lari)
Conditional statement'lar ma'lum bir statement True deb baholangandagina kodning bir qismini bajarish orqali dastur oqimini boshqaradi. An'anaga ko'ra Python mantiqiy oqimni qurish uchun if, elif, else keyword'laridan foydalanadi, lekin Python'ning yangiroq versiyalari (3.10+) endi pattern'ga asoslangan tarmoqlanish uchun match'ni ham qo'llab-quvvatlaydi. Statement'larni inkor qilish uchun not operatorini shu oqimlarga qo'shing.
Quyidagi Python snippet'ida if sharti user_input o'zgaruvchisining truthiness'ini tekshiradi, elif sharti esa kiritilgan qiymat raqamli ekanini aniqlaydi. Kod kiritilgan qiymat to'g'ri ekanini tasdiqlagach, uni xavfsiz tarzda integer'ga o'giradi va kiritilgan miqdorni joriy jami summaga qo'shadi.
if not user_input:
print("No input provided.")
elif not user_input.isdigit():
print("Input must be numeric.")
else:
number = int(user_input)
total = total + number
match statement'i belgilangan tartibda bir nechta pattern'lar bilan taqqoslash imkonini beradi. SQL'dagi CASE statement'i singari match har bir case'ni ketma-ket baholaydi va birinchi mos kelgan tarmoqni bajaradi. Odatda not operatorini case pattern'larining o'zida ishlatmaysiz; buning o'rniga bo'sh yoki noto'g'ri qiymatlar kabi edge case'larni match bloki boshlanishidan oldin guard clause'lar yordamida hal qilasiz:
text = ""
if not text:
print("No command provided.")
elif not text.isalpha():
print("Invalid command format.")
else:
match text.lower():
case "start":
print("Process starting.")
case "stop":
print("Process stopping.")
case "pause":
print("Process pausing.")
case _:
print("Unknown command.")
# Expected result:
# No command provided.
while loop'lari
Python'da while loop'lari shart false bo'lgunicha kodni uzluksiz bajaradi. Bu yerda truthiness ayniqsa qo'l keladi va odatda flag'lar, collection'lar va qidiruv shartlarini tekshirish uchun loop shartlariga not qo'shasiz. not operatori loop sintaksisini "while not finished" (tugamaguncha) yoki "while not empty" (bo'sh bo'lmaguncha) kabi tabiiy tilga yaqinroq o'qilishiga yordam beradi va u ko'pincha real hayotdagi masalalarda biror narsa paydo bo'lguncha kutish uchun ishlatiladi.
Quyidagi koddagi queue bo'sh list sifatida boshlanadi, not queue True deb baholanadi, shuning uchun loop ishga tushadi. Loop ichida task_1 queue'ga qo'shiladi va list bo'sh bo'lmay qoladi (truthy). not queue False'ga aylanadi va loop to'xtaydi.
queue = []
while not queue:
print("Waiting for tasks…")
queue.append("task_1")
# Expected result:
# Waiting for tasks…
not'ni boshqa logical operator'lar va murakkab shartlar bilan birlashtirish
Python kodingizga not qo'shib borar ekansiz, oxir-oqibat murakkabroq statement'lar tuzish uchun uni and, or, is yoki in kabi boshqa operator'lar bilan birga ishlatishni xohlaysiz. not operatori Python'ning bu boshqa konstruksiyalari bilan yaxshi ishlaydi, lekin yodda tutish kerak bo'lgan bir nechta muhim nozik jihatlar bor.
Logical operator'lar: and, or
and va or logical operator'lari bir nechta shartlarni birlashtirish imkonini beradi. and ikkala shartning ham True bo'lishini talab qiladi, or esa kamida bitta shartning True bo'lishini talab qiladi. Quyida Boolean qiymatlar bilan and va or'ga misol keltirilgan:
print(True and False)
print(True or False)
# Expected result:
# False
# True
Conditional'larda ko'rganingizdek, not operatori expression'ning haqiqiylik qiymatini inkor qiladi. Undan alohida expression'larni yoki guruhlangan shartlarni inkor qilish uchun foydalanishingiz mumkin:
print((not True) and False)
print(not (True and False))
# Expected result:
# False
# True
Operator precedence
Operator precedence Python expression'dagi operator'larni qaysi tartibda hisoblashini belgilaydi. Arifmetik expression'lar uchun PEMDAS haqida eshitgan bo'lishingiz mumkin. Bu ham xuddi shu g'oya, faqat Python'dagi barcha operator'larga kengaytirilgan.
Logical operator'lar uchun:
-
not'ning precedence'iand'nikidan yuqori -
and'ning precedence'ior'nikidan yuqori
Python'da quyidagini kutishingiz mumkin:
print(not True and False)
print(not True or False)
print(True and False or True)
print(True or False and False)
# Expected result:
# False
# False
# True
# True
Comparison operator'larning (==, !=, <, > va hokazo) precedence'i logical operator'larnikidan yuqori. Python ularni not, and yoki or'dan oldin hisoblaydi. Bu shuni anglatadiki, Python not x > 4 kabi expression'larni not (x > 4) deb talqin qiladi, ya'ni avval taqqoslash bajariladi.
x = 8
print(not x > 4) #not (x > 4) → not True → False
# Expected result:
# False
Bu koddagi chalkashlikdan x ≤ 4'ga o'tish orqali qochishingiz mumkin. Boshqa hollarda qavslar qo'shing. Qavslar har qanday sukut bo'yicha precedence'ni bekor qiladi. Ular har doim ichkaridan tashqariga qarab hisoblanadi va niyatni aniq ko'rsatish hamda o'qilishni yaxshilash uchun ishlatilishi kerak.
Murakkab shakllar: not in va is not
not operatori ikki o'zaro bog'liq operator bilan tabiiy ravishda birikib, not in va is not'ni hosil qiladi. Bular Python kodini tushunishni osonlashtiradigan compound operator'lar bo'lib, odatda in yoki is ishtirok etgan statement'larni inkor qilishdan (masalan, not (x in y) yoki not (x is y)) afzal ko'riladi.
not in membership operatori element collection'da (string, list, dictionary, set va hokazo) yo'qligini toza tarzda tekshirish imkonini beradi. U in operatorining teskarisi, mana bir misol:
dogs_in_park = ["Buddy", "Charlie", "Lola", "Tucker"]
dog = "Sandy"
if dog not in dogs_in_park:
print(f"{dog} is not at the dog park.")
# Expected result:
# Sandy is not at the dog park.
Python'da is not — identity operatori. U ikki o'zgaruvchi xotirada bir xil obyekt emasligini aniqlaydi va siz undan ko'pincha None bilan tekshirish uchun foydalanasiz.
if x is not None:
processed_value = str(x).upper()
else:
raise ValueError("x cannot be None")
!= tengsizlik operatorini is not identity operatori bilan adashtirmang. Qiymatlarni taqqoslash uchun !='dan foydalaning, is not'ni esa identity'ni tekshirish uchun qoldiring. Masalan:
a = [1, 2, 3]
b = [1, 2, 3]
print(a != b)
print(a is not b)
# Expected result:
# False
# True
a va b list'larining tarkibi bir xil, shuning uchun a != b False beradi; biroq a va b xotiraning turli joylarida saqlangan, shuning uchun a is not b True qaytaradi.
not va o'xshash operator'larni taqqoslash jadvali
| Operator | Operator turi | Nima qiladi | Nimaga qo'llaniladi | Keng tarqalgan qo'llanish holati | Misol |
|---|---|---|---|---|---|
not |
Logical | Expression'ning truthiness'ini teskarisiga o'zgartiradi | Har qanday expression (truthy/falsy qiymatlar) | Bo'shlikni tekshirish yoki shartlarni inkor qilish | if not items: |
not in |
Membership | Qiymat collection'da mavjud emasligini tekshiradi | String'lar, list'lar, set'lar, dict'lar | Qiymatlarni chiqarib tashlash | "g" not in "cat" |
is not |
Identity | Ikki obyekt bir xil obyekt emasligini tekshiradi | Obyektlar, None | None tekshiruvlari, identity taqqoslashlari | x is not None |
!= |
Comparison | Ikki obyekt teng emasligini tekshiradi | Sonlar, string'lar, taqqoslanadigan obyektlar | Qiymatlar tengsizligini tekshirish | x != 10 |
~ |
Bitwise | Integer'ning barcha bit'larini teskarisiga o'zgartiradi; pandas/NumPy'da Boolean qiymatlarni element bo'yicha teskarisiga o'zgartiradi | Integer'lar; Boolean massivlar (pandas/NumPy) | Past darajadagi bit manipulyatsiyasi; pandas/NumPy'da mask'larni inkor qilish | ~5 yoki ~df["col"].isna() |
Best practice'lar va keng tarqalgan xatolar
Ushbu maqolada bir nechta nozik tuzoqlarni allaqachon ko'rdingiz (operator precedence'ni noto'g'ri tushunish, !='ni is not bilan adashtirish), mana yana bir nechtasi. not operatoridan foydalanganda bu xatolarga yo'l qo'ymang.
Boolean mantiqda ikki karra inkor hosil qilish
not operatori conditional'lar va loop'larni yozishning kuchli yangi usulini beradi, lekin undan haddan tashqari ko'p foydalanmang. Shartlarni iloji boricha soddalashtirishga harakat qiling. Ingliz tilidagi kabi, bu ikki karra inkordan qochishni anglatadi.
Quyidagi ikkala conditional statement ham mantiqan ekvivalent, lekin ikkinchisi afzal, chunki uni tushunish ancha oson:
x = 2
if not x != 1:
print("x is equal to 1")
if x == 1:
print("x is equal to 1")
not (logical operator) va ~ (bitwise operator)'ni adashtirish
Agar not'ni ~ bilan adashtirayotgan bo'lsangiz, ehtimol pandas yoki NumPy kutubxonasidan foydalanayotgandirsiz. Bu kutubxonalarda ~ series, dataframe va massivlar ustida element bo'yicha ishlaydi va ko'pincha Boolean mask'ning har bir elementini teskarisiga o'zgartirish uchun ishlatiladi. Quyidagi snippet har bir department qiymati yo'qligini aniqlaydi, so'ng o'sha Boolean'larni ~ yordamida teskarisiga o'zgartiradi:
~df["department"].isna()
Aytaylik, buning o'rniga mask bilan not operatoridan foydalanishga urindingiz:
not df["department"].isna()
not pandas Series ustida ishlay olmaydi, chunki Series bitta Boolean qiymatga keltirilmaydi. Masalan, df[].isna() True va False qiymatlardan iborat Series qaytaradi, u esa not bilan ishlatilganda ValueError chiqaradi:
ValueError: The truth of a Series is ambiguous.
Biroq bitta qiymatli Boolean'lar bilan yoki bitta qiymatning truthiness'ini tekshirishda not operatoridan foydalanishda davom eting:
if not df.empty:
print("The dataframe contains rows")
Xulosa
Python'da not — Boolean'larni teskarisiga o'zgartirish va truthiness'ni inkor qilishga yordam beradigan logical operator. Uni conditional statement'larda, boshqa logical operator'lar (and, or) bilan birga va compound operator'larda (not in, is not) uchratasiz. Uni boshqa inkor operator'laridan farqlash uchun not bitta Boolean qiymat yoki bitta expression uchun mantiqiy ishlashini yodda tuting.
AI Tutor bilan ishlash orqali not haqidagi bilimingizni keyingi bosqichga olib chiqing. Boshlash uchun mana bir prompt: