&
ve |
“bitwise and” ve “bitwise or” diye geçiyor. Eğer elinizde tam sayılar varsa ve bunların bit’lerine inip işlem yapmak istiyorsanız bunları kullanabilirsiniz. Şurada bir sürü örneği var https://graphics.stanford.edu/~seander/bithacks.html (haddinden fazla belki de). Örneğin bir tam sayının çift mi tek olduğunu anlamak için genelde sayi % 2 == 1
felan yaparız (tekse doğrudur bu). Ama aynı zamanda şöyle de yapabiliriz sayi & 1
. Neden bunu yapabildiğimizi çözersiniz. (&
ve |
operatörlerinin yanında bir de ^
yani “bitwise xor” var; belki <<
ve >>
“shifting” operatörlerini de burada sayabiliriz. Ayrıntılı bilgi için buraya bakabilirsiniz (Mesela bazı özel metodların sınıflarda yazılmasıyla bu operatörlerin tam sayıların dışında da kullanılabileceği de yazıyor. Bunun bir örneği NumPy kütüphanesinde iki array arasında “element-wise” &
alabilmenin mümkün olmasıdır).
and
ve or
ise “logical and” ve “logical or” diye geçiyor. İşin içine doğruluk değerleri, yani boolean tipinde veriler girdiğinde mantıktaki karşılıklarını sağlamak için bunları kullanabiliriz. Örneğin "sayı 100’den küçük ve 7’nin katı değil"in karşılığı sayi < 100 and sayi % 7 != 0
şeklinde and
ile yazılabilir. Benzer şekilde, "sayı 4 veya 5 olsun"u da sayi == 4 or sayi == 5
diye yazabiliriz (sayi == 4 or 5
diye değil; nedeni için bakınız https://forum.yazbel.com/t/pythonda-and-ve-or-sikintisi/11554/5).
Velhasıl, o meşhur 0 ve 1’lerle işlem yapmak (daha doğrusu yaptığınızı hissetmek) istiyorsanız &
ve |
(ve ^
, <<
, >>
) operatörlerini kullanabilirsiniz. Bunları çok yaygın görmüyoruz etrafta kullanım alanlarından dolayı. Öbür yandan mantıktaki (ve günlük konuşmadaki) “ve”, “veya”, “değili” gibi ifadelerin yerini and
, or
, not
tutuyor.
Sizdeki şu satırda tam olarak ne demek istediğinizi anlayamadım ama “hem zar_a
hem de zar_b
1 veya 2 değerlerinden birini alsın” diyorsunuz galiba.
if zar_a == 1 | 2 & zar_b == 2 or 1:
O zaman
if (zar_a == 1 or zar_a == 2) and (zar_b == 1 or zar_b == 2):
şeklinde yazabiliriz: &
ve |
'lar buraya uygun değil yukarıda bahsedilenlerden dolayı; onları and
ve or
ile değiştiriyoruz (öbür türlü de çalışıyor olabilir ama niyet çok belli olmazdı zira amaç bitwise işlemler değil). Veya yukarıdaki yanıttaki in
operatörünü kullanarak “zar_a
’nın değeri (1, 2)
demetinin içerisinde mi?” diye de yazabiliriz:
Ama &
kullanımından kaçınılmalıdır burada, zaten operatör önceliğinden dolayı hata veriyor… and
olmalı aradaki:
if zar_a in (1, 2) and zar_b in (1, 2):
Son olarak niye zar_a == 1 or 2
çalışmazın sebebi de yukarıdaki linkte Python'da and ve or sıkıntısı - DrShahinstein tarafından #5.