Menu

Python and, or, not: Mantıksal Operatörler, Kısa Devre ve Truthy Değerler

Python'da and, or ve not operatörleri nasıl çalışır: doğruluk tabloları, truthy ve falsy değerler, kısa devre değerlendirme, and/or'un neden işlenenlerinden birini döndürdüğü, öncelik ve and/or ile & ve | arasındaki fark.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

Semboller Yerine Üç Kelime

Python'un mantıksal operatörleri İngilizce and, or ve not kelimeleridir. Başka diller bunları &&, || ve ! olarak yazar. Python'da && ve || bir SyntaxError'dır; ! ise yalnızca != ("eşit değil") içinde geçer.

True ve False ile kurallar beklediğin gibidir:

aba and ba or bnot a
TrueTrueTrueTrueFalse
TrueFalseFalseTrueFalse
FalseTrueFalseTrueTrue
FalseFalseFalseFalseTrue

and için iki tarafın da doğru olması gerekir. or için en az birinin. not tek bir değer alır ve onu tersine çevirir.

Gerçek kodda taraflar genellikle karşılaştırmalardır ve sonuç bir if ya da while'a gider:

Çıktı:

eligible
standard ticket

Çoğu koşul için bu kadarı yeterli. Sayfanın geri kalanı, operatörlerin True ya da False olmayan değerlerle ne yaptığını ve bir ifadenin hangi tarafının çalışacağını belirleyen kuralları anlatıyor.

Truthy ve Falsy Değerler

and, or ve not yalnızca boolean değil, her değeri kabul eder. Python bir değerin doğru sayılıp sayılmadığına onun truthy olup olmamasına bakarak karar verir. Şu değerler falsy'dir:

  • False ve None
  • her sayı türünün sıfırı: 0, 0.0
  • boş kaplar ve string'ler: "", [], (), {}, set(), range(0)

Geri kalan her şey truthy'dir; "0", "False", [0] ve -1 de dahil. Python'un bir değeri nasıl sınıflandırdığını bool() ile görebilirsin:

Çıktı:

0 False
1 True
-1 True
'' False
'0' True
[] False
[0] True
None False
0.0 False

"0" string'i boş olmayan bir string olduğu için truthy'dir. Bu, girdiden sayı okuyup dönüştürmeden önce test edenleri yakalar. bool'un int ile ilişkisini sayılar ve boolean'lar sayfası anlatıyor.

and ve or Bir İşlenen Döndürür

Python'un çoğu dilden ayrıldığı yer burası. and ve or yeni bir True ya da False üretmez. Onlara verdiğin iki değerden birini döndürürler:

  • x or y, x truthy ise x'i, değilse y'yi döndürür.
  • x and y, x falsy ise x'i, değilse y'yi döndürür.

İki işlenen de boolean olduğunda "bir işlenen döndürmek" ile "bir boolean döndürmek" aynı şeydir; fark bu yüzden başka türler karışana kadar fark edilmez.

İstisna not'tur: her zaman True ya da False döndürür.

Bir and/or ifadesinden gerçek bir boolean gerekiyorsa, örneğin onu saklamak ya da bool döndürmeyi vaat eden bir fonksiyondan döndürmek için, ifadeyi bool() içine al:

Kısa Devre Değerlendirme

Python and ve or'u soldan sağa değerlendirir ve cevap belli olur olmaz durur:

  • and ilk falsy değerde durur, çünkü ondan sonra gelen hiçbir şey ifadenin tamamını doğru yapamaz.
  • or ilk truthy değerde durur, çünkü ondan sonra gelen hiçbir şey ifadenin tamamını yanlış yapamaz.

Atlanan taraf hiç çalıştırılmaz. Bunu, çağrıldığında ekrana yazan fonksiyonlarla izleyebilirsin:

Çıktı:

and:
  checking A
False
or:
  checking A
True

İki durumda da B hiç kontrol edilmez. Koruma koşullarını güvenli yapan şey kısa devredir. Aşağıdaki her koşulun ikinci yarısı tek başına çökerdi, ama ancak ilk yarı kötü durumu eledikten sonra çalışır:

Ucuz ya da koruyucu testi başa koy. Sırayı tersine çevirirsen, yani user.startswith("admin") and user is not None yazarsan, user None olduğunda AttributeError alırsın.

or ve and Üzerine Kurulu Kalıplar

or ilk truthy işleneni döndürdüğü için tek satırlık bir varsayılan değer verir:

Çıktı:

Hello, Ada!
Hello, guest!
Hello, guest!

Buradaki tuzak şu: or yalnızca None'ı değil, her falsy değeri değiştirir. 0, "" ya da [] geçerli bir girdiyse or onu atar:

Sıfır ya da boş değer geçerliyse x if x is not None else default kullan. Bu koşullu ifadeyi if/else sayfası anlatıyor.

and'in de karşılık gelen bir kalıbı var: "bu değeri yalnızca ilki ayarlanmışsa kullan". Daha az yaygındır ve çoğu zaman bir if olarak daha anlaşılırdır, o yüzden seyrek kullan:

Öncelik: Önce not, Sonra and, Sonra or

Bir ifade üçünü karıştırdığında Python önce not'u, sonra and'i, sonra or'u uygular. ==, < ve in gibi karşılaştırmalar hepsinden önce uygulanır.

a or b and c ile (a or b) and c aynı değerlerden farklı cevaplar üretir. Bu yüzden karışık bir koşul, varsayılan sıra doğru olsa bile parantez taşımalıdır. Parantezlerin bir maliyeti yoktur ve bir sonraki okuyucunun aklındaki soruyu ortadan kaldırır.

and/or ile &/| Karşılaştırması

& ve |, and ve or'a benzer görünür ve bazen aynı cevabı verir, ama farklı operatörlerdir.

  • and / or truthy değerlendirmesi yapar, kısa devre uygular ve işlenenlerden birini döndürür.
  • & / | bit düzeyinde operatörlerdir. Tam sayılarda iki sayının bitlerini birleştirirler. Set'lerde kesişim ve birleşim anlamına gelirler. True ve False üzerinde bir boolean döndürürler. Asla kısa devre uygulamazlar: iki taraf da her zaman değerlendirilir.

Bit düzeyindeki operatörlerin önceliği karşılaştırmalardan da yüksektir; bu da & ile yazılmış bir koşulu bambaşka bir şeye çevirir:

1 & y, 1 & 5'tir, bu da 1 eder. Böylece ortadaki satır 5 > 1 > 1 zincirine dönüşür ve 1 > 1 yanlıştır. Düz Python kodunda koşullar için and, or ve not kullan.

&, | ve ~'nin koşullar için doğru olduğu tek yer NumPy ve pandas'tır. Bir dizi birçok değer tutar, dolayısıyla tek bir doğruluk değeri yoktur ve and şu hatayı verir: ValueError: The truth value of an array ... is ambiguous. Bu kütüphaneler & ve |'yu eleman eleman çalışacak şekilde aşırı yükler. pandas filtrelerinin df[(df.age > 18) & (df.country == "CA")] gibi görünmesinin ve her karşılaştırmanın yukarıdaki öncelik nedeniyle parantez içinde olmasının sebebi budur.

any() ve all(): Bir Liste Üzerinde and ve or

Bir koşul dizisinin tamamını birleştirmek için yerleşik all() (her öğe üzerinde bir and) ve any() (her öğe üzerinde bir or) fonksiyonlarını kullan. İkisi de aynı şekilde kısa devre uygular:

and ve or'un aksine any() ve all() her zaman bir boolean döndürür.

Sık Yapılan Hatalar

Bir değişkeni or ile birkaç değerle karşılaştırmak. Bu koşul her zaman doğrudur:

Python ilk koşulu (color == "red") or "blue" olarak okur. Karşılaştırma False olduğu için or, boş olmayan bir string olan "blue"'yu döndürür ve bu truthy'dir. Karşılaştırmayı iki tarafta da tekrarla ya da daha iyisi, üyeliği in ile test et.

&& ya da || yazmak. İkisi de SyntaxError verir. and ve or kullan.

and/or'dan boolean beklemek. x = a or b, a ya da b'nin kendisini saklar. Çoğu zaman istediğin de budur, ama bir fonksiyonun True ya da False döndürmesi gerekiyorsa bool() ile dönüştür.

Karışık koşullarda önceliğe güvenmek. a or b and c geçerli ve iyi tanımlıdır, ama kimse kuralı hatırlamak zorunda kalmasın diye parantez ekle.

Sıkça Sorulan Sorular

Python'da and operatörü ne yapar?

a and b yalnızca iki taraf da doğru olduğunda doğrudur. Python önce a'yı değerlendirir; a falsy ise b'ye bakmadan a'yı döndürür, değilse b'yi döndürür. Düz boolean değerlerle bu bilinen sonucu verir: True and False, False'tur.

0 or 5 neden True yerine 5 döndürür?

or ve and yeni bir boolean üretmez, işlenenlerinden birini döndürür. x or y, x truthy ise x'i, değilse y'yi döndürür. 0 falsy olduğu için 0 or 5 sonucu 5'tir. Gerçek bir True ya da False gerekiyorsa ifadeyi bool() içine al.

Python'da and ile & arasındaki fark nedir?

and mantıksal bir operatördür: truthy değerlendirmesi yapar ve kısa devre uygular. & ise bit düzeyinde bir operatördür: tam sayılarda bitleri birleştirir (6 & 3, 2'dir), set'lerde kesişimi alır ve her zaman iki tarafı da değerlendirir. if koşullarında and kullan. İstisna NumPy ve pandas'tır; orada & eleman bazında "ve" işlemidir.

Python'da önce hangisi çalışır, and mi or mu?

En sıkı bağlanan not'tur, sonra and, sonra or gelir. Yani a or b and c, a or (b and c) demektir; not a or b ise (not a) or b demektir. == ve < gibi karşılaştırmalar üçünden de daha sıkı bağlanır.

Python'da && ve || kullanabilir miyim?

Hayır. && ve || Python'da SyntaxError verir. Mantıksal operatörler and, or ve not kelimeleridir. Tek bir & ya da | geçerlidir ama başka bir anlama gelir (bit düzeyinde ve/veya).

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA