Bool Operasyonlari Kafam Karıştı!

Merhaba değerli forum sakinleri takip ettigim web sitesinde (İşleçler — Python 3 için Türkçe Kılavuz) şöyle bir ifade geçiyordu.

“Bununla ilgili genel kuralımız şu: 0 değeri ve boş veri tipleri False’tur. Bunlar dışında kalan her şey ise True’dur.”

Bende test ederken böyle bıseyle karşılaştim. Konu ile ilgili fikirlerinizi alabilir miyim?

1 Beğeni

Aramıza hoşgeldiniz.
Zaten açıklamayı kendiniz yapmışsınız anlamadığınız kısım nedir ?

Boş string bool fonksiyonuna girince False cevabi donuyor. False == False 'in cevabı True iken
“” == False nasil False oluyor onu anlamadim. Yani yaptigimim sağlamaya göre cevabın True olmasi gerektiğini düşünüyorum.

Orda karşılaştırmayı bool ifadesi yerine aynı olup olmadığına göre yapıyor.
Mesela "" == False değeri False döndürüken,bool("") == bool(False) ifadesi True döndürüyor.

Yani kısaca tip karşılaştırması değil,aynı olup olmadığına bakıyor.

Kendiniz söylüyorsunuz, bool fonksiyonuna girince False sonucunu veriyor. Kendisi False değil, uzunluğu sıfır olan bir str. Bir str’yi bir bool ile eşitlik bakımından karşılaştırırsanız cevap her zaman False olur çünkü karşılaştırdığınız verilerin türleri farklı.

Yaptığınız sağlamanın son adımında bir hata var:

False == False # doğru
bool("") == False # doğru
"" == False # yanlış, bool'u sildiğiniz için sonucun değişmesi önünde hiçbir engel yok

Bu kafa karıştırıcı bir cümle olmuş, teknik olarak da yanlış. O kısmın düzeltilmesi lazım diye düşünüyorum.

İşte kafa karıştıran 0 'ın da bool fonksiyonundan False alması ve 0 == False 'in True olmasi

Ama bilgisayarin dogasi gereği 0 'ın False olmasi gerekir değil mi? Sonucta bit olsada 0 olmasa da. Demek ki hata yok
if kontrollerinden de değeri
0,None,False ve Boş string olanlar geçemiyor

1 Beğeni

Kafanızı karıştırması normal çünkü takip ettiğiniz kaynak her ne kadar konuyu basitleştirip özetlemeye çalışsa da karşılaştırma işlemlerinin ürettikleri sonuçların takip ettiği belli bir kural yok. Aynı şey bir değerin bool fonksiyonuna verilince üreteceği değer için de geçerli, belli bir kuralı yok. Her tür üretilecek sonucu kendi belirliyor.

Buradaki durumda ise bool, int türünün bir alt türü. False'da 0'ın sahip olduğu bütün özelliklere sahip:

>>> False * False
0
>>> False + False
0
>>> False - 1
-1
>>> False == 0
True
>>> 

Benzer şekilde de True da 1'in sahip olduğu bütün özelliklere sahip:

>>> True + True
2
>>> True - True
0
>>> True * True
1
>>> True == 1
True
>>> 

Hatta indeksleme işlemlerinde de True ve False'ı kullanabiliriz:

>>> ("ilk", "son")[0]
'ilk'
>>> ("ilk", "son")[False]
'ilk'
>>> ("ilk", "son")[1]
'son'
>>> ("ilk", "son")[True]
'son'
>>> 

Yani 1'in True'ya, 0'ın da False eşit olması bir kural ve bool ile hiçbir alakası yok.

1 ile True ve 0 ile False gömülü fonksiyonlardan sadece str fonksiyonuna verildiklerinde farklı davranıp aynı olmayan sonuçlar üretiyor.

1 Beğeni

Ilk defa boyle biseyle karsilasiyorum Bu degerli bilgiyi verdiginiz icin teşekkür ederim.

1 Beğeni

Hayhay:

Bu ifade yanlis yonlendirici.

0 ve benzeri “bos” veri degerleri *bool’a cevrildiklerinde False’a donusurler. Bunlar disinda kalan degerler ise bool’a cevrildiklerinde True’ya donusurler."

Daha dogru. Devami da soyle olabilir:

Bu cevrimi bool() fonksiyonunu kullanarak veya dogrudan kontrol edilmek istenen ifade kullanilarak (x == "" veya i != 0 gibi) yapmak dogrudur, fakat if hede: gibi bool bekleyen bazi yerlerde bu cevrim (if bool(hede):) otomatik olur.

1 Beğeni