Python mantıksal işleçler sorusu

a=""
if not a:
   print(a)

yukarıdaki kod da not a True değerini mi döndürür ?

1 Beğeni

Neden 7<9 and "m" ifadesinin degeri "m"
:smile:

1 Beğeni

a="" #Değeri bize false döndürür

if not a:
    print(a)

kısmına gelince if eğer doğru ise yani true ise çalışır not değili demektir matematik mantığı gibi false’ın değili true olduğu için print komutu çalışır ancak a boş olduğu için ekrana sadece alt satır basılır değer basılmaz.

e=7<9 and "m"
print(e)

kısmına gelince biz 7 küçük müdür 9 dan diyoruz o da bize true diyor yani doğru biz bu true değerimizi e değişkenine atıyoruz ve true and “m” diyoruz aslında orada true and true diyoruz çünkü “m” boş bir karakter dizisi değil dolu çünkü içinde m var sonuç ise true oluyor
eğer neden True değil karakter dizisi döndürüyor diyorsan yerlerini değiştir bu sefer True döner “m” and True konumu ile alakalı bu ikinci true ekrana basıyor diye biliyorum karakter dizisi olduğu için yanlışım olabilir bu konuda ama mesele bu.

a fonksiyon olmadigi icin deger donduremez. a degere sahip bir degisken.


“Kotu bir programciyim” demek istedik. if gibi kontrollere giren / not gibi operatorlere operand olan ifadelerin bool turunde olmasi lazim, yoksa bool(ifade) denmis gibi cevriliyorlar.

Programcinin hata yapmasini engellemek isteyen diller bu tur str -> bool gibi cevrimlerin implicit (otomatik) olmasina izin vermiyor cunku cevrim kurallari dili tasarlayan insanlarin kafasina gore oluyor ve mantiga veya dili kullananlarin beklentilerine her zaman uymuyor. bool("False") Python’da True mesela.

Bu kadar soru soran bir insan olarak artik ifadelerini duzeltmis olman gerekiyor:

"Neden 7<9 and "m" ifadesinin degeri "m""

Cevap dil kurallarinda bir yerde gizli.

Hayir, bu ifade e = (7<9 and "m") gibi parse ediliyor ve e degiskenine atama and ifadesi degerlendirilmeden olmuyor.

Bu “x = x or default_value” gibi ifadeleri mumkun kilmak icin tasarlanmis bir ilginclik ve kullanimi code review’da azar yeme sebebi.

1 Beğeni

Değer döndürüyor kısmı yanlış oldu evet bool değeri false demeliydim diğer kısımları da düzeltmişsiniz teşekkürler.

evet bu bölümü de gayet yanlış anlatmışım :slight_smile:

burada mantık dışı olan ne ?, bool fonksiyonuna str (eğer boş değil ise) gönderildiğinde True olarak döndürmesi normal acaba ben mi sizi yanlış anladım? :thinking:

Mantıklı mı bilmem ama tutarlı, dediğiniz gibi basit bir kural ile çalışıyor. Birkaç defa bu özelliği unutmamdan dolayı programdaki hatayı bulamamıştım. @aib in de dediği gibi dili kullananın isteği hep bu olmuyor.

1 Beğeni

O kodda None yok ki

boş string ifadelerinin bool değeri None olmaz mı ?
eğer değilse None ne için kullanılıyor

Boş string içeren bir değişken '' dir

None sınıfının tek örneği olan bir nesne. Bir değişken global alanda bulunmadığı halde değer atanmadan fonksiyon içinde global hale getirilirse None olur. Fonksiyon bir değer döndürmezse None dönmüş olur …

1 Beğeni

Anladım belkide böyle saçma sorular sormamalıydım :smile:

anladığım kadarıyla şu ifadede hep en sağdaki değer dönücek(eğer ikisininde bool ifadesi True ise) a= "e" and "m" dediğimizde a değişkeni m değerini alacak

Nasil normal? bool("True") True ise bool("False") da False olmali, bundan daha dogal ne var?

Derleyici/yorumlayici tarafindan islendigi icin her halukarda tutarli olacak zaten :slight_smile: Ama evet, “mantikli” subjektif bir sey.

None bool degil.

Burada @Emerald_Gamer’in söylemeye çalıştığı şey şu:

bool("True") == bool("False") == bool("hede")

bool sınıfından örnek oluştururken, argümanın True veya False olup olmadığı önemli. Karakter dizisinin uzunluğunun 0 dan büyük olduğu her durumda True değeri geri döner.

Biliyorum, ve bu mantiksiz. Burada "mantiksiz"i “cok sacma, dogal degil ve dogru olmadigini dusunuyorum” manasinda kullaniyorum, “kendi icinde tutarli kurallar cercevesinde var olamayacak” manasinda degil. (Yoksa dedigim gibi, bilgisayar tarafindan calistirilabilen her kural mantikli.)

C’de mesela karakter dizilerinin tamami true, karakter dizisi olamayacak tek deger false gibi calisiyor.

Aslında mantıksız olan bir şey yok.

bool("True")  

ve

bool("False")  

değeri boolean sınıfında bir karakter dizisini ifade ediyor. Boolean sınıfında string bir ifade var ise True değeri döndürüyor.

bool(False) 

değeri ile

bool("False")  

aynı değeri döndürmüyor. 3. kodda Boolean sınıfından False değeri alıyoruz, 4. de ise Boolean sınıfından string değeri “False” olan bir değişken oluşturuyoruz.
Başka bir örnek göstermek gerekirse ;

a = [ ]
b = [0]
c = 0.0
bool(a)
bool(b)
bool(c)

Yukarıdaki boş a listesinin bool değeri False,
1 elemana sahip olan b listesinin bool değeri True,
c’nin bool değeri ise False oluyor.

Burada kafa karışıklığına sebep olan sanırım parantez içinin string değer olması.
bool(False) ile bool("False") aynı değil. bool("False") = bool(True) = bool("True") = bool(1)

a = None bool sınıfında bool(a) False değerini verir. Yani boş string ifadesi None değeri döndürdüğü için bool değeri False oluyor.

Evet None bool değil ama bool(None) False. Boolean iki değer döndürür True ve False. bool(None) = bool(False)

Bu bahsettiğinin doğal sonucu şöyle olurdu:
bool("True") True ise ve
bool("False") False ise
bool("Hede") doğal olarak Hede dir.

1 Beğeni

“Boolean sinifinda bir karakter dizisi” mantiksiz. Boolean sinifinda 2 deger var, bunlarin ikisi de karakter dizisi degil.

Yanlis yazmissin (uzunlugu 0’dan buyuk olan string bir ifade varsa True) ama bu da mantiksiz.

Bu da mantiksiz.

Bu mantikli. Hede diye bir deger olsaydi daha da mantikli olurdu.

Kafa karisikligi yok; dilin nasil davrandigindan bahsetmiyorum, nasil davranmasi gerektiginden bahsediyorum.

Evet, ve bu cok sacma.

Burada bir kafa karisikligi var sanirim. Bos string ifadesi bos string degerine sahip. bool fonksiyonu burada oyle yazdigi icin False donduruyor; bos string ile None'in herhangi bir alakasi oldugundan degil. bool("") -> bool(None) -> False gibi bir donusum yok yani.

Olamaz da:

a) (Bildigim kadariyla) hic bir ifadeyi NoneType'a ceviren bir degisim yok.
b) Parametreler tursuz (unityped) oldugu icin argumanlar otomatik tur degisimine ugramiyorlar.