Python'da and ve or sıkıntısı

Olmasını istediğiniz şeyin ne olduğunu tam anlayamadım ancak sanıyorum ki Türkçe düşündüğünüz için bir sorun yaşadınız.

if x == y and z:
 ...

Burayı sanırım “x değişkeni, y ve z değikenine eşitse …”
Diye algılıyorsunuz.
Ancak hayır. Böyle olabilmesi için

if x == y and x == z:
...

Şeklinde yazılmalı.


if x:
 ...

Yazarsanız, eğer değişken True bir değer içeriyorsa True döndürür, içermiyorsa False döndürür.
Mesela x değikeninin 0’a eşit olduğunu düşünün.

x = 0
if x: 
 print("if çalıştı")
else:
 print("else çalıştı")

Python’da 0 sayısı False bir değer olduğu için burada if bloğu çalışmaz. Çünkü if bloklarının çalışabilmesi için koşulların True döndürmesi lazım.


x == y and z:
... 

Kodunda da benzer bir durum oluyor.
x, y’ye eşitse ve z True” ise demek oluyor bu.
xin, y ve z’ye eşit olup olmadığının sorgulanması için:

if x == y and a == z:

yazılması lazım.
Çünkü mantıksal bağlaçların olduğu koşullar baştan sona doğru sırasyla şu şekilde okunuyor:

x == y              and              z:
#True döndü   # mantıksal bağlaç   # Barındırdığı değere göre bir boolean değer döndürecek

Mesela siz burayı muhtemelen şöyle düşündünüz.

c değişkeni, "a" ve "1" stringine eşitse..
Ama aslında orası şu demek:
c değişkeni, "a" stringine eşitse ve "1" stringi True döndürüyorsa...

ve bu iki anlam birbirinden o kadar farklı ki …
Hadi bu anlamları karşılaştıralım.
c değişkeninde kullanıcıdan bir veri alıyorsunuz. Kullanıcı veriyi girdikten sonra bir koşul yazıyorsunuz. Bu koşulun çalışması için gereken durumu da, kullanıcının girdiği verinin "a" ve "1" stringi ile eşleşmesi olarak belirliyorsunuz. Pekala. Buraya kadar her şey çok güzel.

Fakat, koşulun çalışması için belirlediğiniz durumu böyle belirttiğiniz zaman amacınızla aynı yönde bir işlev gerçekleşmiyor:

if c == "a" and "1":
 ...

Siz " c değişkeni, "a" ve "b" stringlerine eşitse … " diye düşünüyorken, orada bu oluyor:
" c değişkeni, "a" stringine eşitse ve "1" stringi True ise …"
Şimdi bu iki anlamı işleyişleri bakımından karşılaştıralım:


if c == "a" and "1":
 ...

ifadesine bakalım öncelikle:
Mesela kullanıcıdan a verisini alıyorsunuz. input fonksiyonu string döndürdüğü için c değişkenimiz "a" karakter dizisine eşit oluyor.
Sonrasında c değişkeninin "a" stringine eşit olduğu doğrulanıyor ve mantıksal bağlacımız andin sorguladığı iki ifadeden biri True dönmüş oluyor. Eğer ikinci ifade de True döndürürse artık if bloğumuz çalışabilir. "1" stringi True döndürdüğünden dolayı ikinci ifade de True oluyor ve artık if bloğu çalışmaya hazır.

Şimdi de

if c == "a" and c == "1":
 ...

ifadesine bakalım.
Yine kullanıcıdan a verisi aldık. input fonksiyonu string döndürdüğü için c değişkenimiz "a" stringine eşit oluyor tekrardan.
Sonra tam olarak koşulumuza bakıyoruz. and bağlacının ilk ifadesi olan c == "a" True döndürüyor çünkü zaten c değişkenimiz "a" stringine eşit. Sonrasında and bağlacımızın ikinci ifadesi olan c == "1" False dönüyor çünkü c değişkenimiz "1" stringine eşit değil …


Son olarak karşılaştırmayı özetle şöyle göstereyim: (kullanıcının “a” girdiğini varsayın yine)

if c == "a" and "1":
c == "a"      and             "1"
# True  # Mantıksal Bağlaç  # True (çünkü "1" stringi True'dur ...)


if c == "a" and c == "1":
c == "a"        and                    c == "1"
# True   # Mantıksal Bağlaç       # False
5 Beğeni