If x == True: ifadesi geçerli bir ifade midir?

Arkadaşlar merhaba…
if x == True: ifadesi geçerli bir ifademidir?

sorum şu ki: Python sıfır ve içinde bişey olmayan verileri False döndürüyor diğer verileri True döndürüyor. İçinde boşluk olan bir string i de True döndürüyor.
x = " " # Bir boşluk.
if x == True:
print(“True”)
else:
print(“False”)
“False” Döndürüyor… Bunun nedeni nedir?

Burada şöyle bir durum var. Eğer siz if x == True derseniz şu anlama gelir. “X değişkenin içeriği True mi?”. Elbette x değişkeninin içeriği True değil boşluk olduğu için kodunuz böyle çalışır. Ancak şöyle düzeltirseniz istediğiniz sonucu elde edersiniz

>>> if x:
...     print("True")
... else:
...     print("False")
...
True
>>>

Benim yaptığım gibi yaparsanız şöyle bir anlama gelir. “x değişkeni pozitif bir içeriğe sahip mi?”. Pozitif içerik yani None,False,0 vs olmayan içerik demek.

Teşekkür ederim. Anlam bakımından baktığımızda None, False, ve 0 olmayan zaten True demek değilmidir? While True: diyerek döngü kurabiliyoruz, yada if x: de bana x True ise anlamı veriyor. Ama bu şekildeki tasarım garip geldi. Esasen bug olduğunu düşündüm.
sonuç olarak “if x == True:” geçerli değil gördüğüm. True bu şekilde kullanılmıyor. Ama yazmasak varmış gibi davranıyor. Bu arada x değişkeni ne olursa olsun bu yazım False döndürüyor. Yani pozitif olsada.

Bence herhangi bir hata yok. Diyelim ki programda x değişkeni sürekli farklı tipte değerler alıyor. Yani string, integer, bool farketmeksizin x’in değeri değişiyor ve bir if bloğunda kontrol ediliyor. Bu if bloğunda if x == True ifadesi var. Eğer python string ifadelere True değeri dönderseydi kodda bunun string olduğu için dönen bir True ifadesi mi yoksa boolean tipte bir True mu olduğunu ayrıca kontrol etmek gerekirdi. x == y ifadesi içerikleri karşılaştırır.

None/False/0 olmayan seyler True demek olabilir, ama == demek demek degil.

1 Beğeni

“Kotu tasarim” demek istedin galiba. Bug olamaz, dil gayet acik:

Ki 25+ senedir testleri var bu tur temel tutumlarin.

1 Beğeni

Evet x == y ifadesi içerikleri karşılaştırır. Yani x’in içindeki y’nin içindeki değer ile aynı mı?
Peki x == True nedir? x’in içindeki değer ,bir değermidir? Python buna “False” döndürüyor. Ama Bir if bloğunda “True” yazmasak sanki orada “True” yazılmış gibi davranıyor.

Kötü tasarım diyebilmek benim haddime değil. Eğer böyle tasarlanmış ise bunun nedenini bilmek gerekir. Yani karakter dizileri “” bitemeyeceği de bir tasarım olarak karşımıza çıkıyor.

Python kolay bir baslangic dili olmayi hedefledigi icin haddine bence. (Ki “sadece bilmemkimler icin tasarladik bu dili” demeyen her dil icin benzer elestiri yapilabilir.") Python’in kendisi daha once gorulmemis (ve kimi zaman diger onlarca dilleri bilen insanlarin da sinirini bozan) ilginc tasarim kararlarina sahip. Isini Python uzerine kuran insanlarin “kullanirsaniz kendinizi savunmaya hazirlikli olun” dedigi while...else gibi… ilginclikleri var.

Hatta “bug” daha az “haddine” :). Eskiden “kutuphanede veya dilde bir bug mi acaba” sorusunun cevabini gozu kapali “hata ikisinde de degil, sende” seklinde cevaplayabilirdik. Python ve NodeJS kutuphaneleri bunun yarisini kirdi. Python’in bir takim surprizleri de diger yarisini zorluyor*, ama “by design” diyip geciyoruz.

*: Mesela default parametre olarak verilen listenin modifiye edilmesi debug eden insanlara dakikalarca eglence sagliyor.

Dusunce yapisi dile uymuyorsa dusunce yapisini degistirmek daha kolay :​)

if, bool ile calistigi icin verdigini bool() ile bool’a ceviriyor. ==, turler arasi calistigi icin kimsenin turune dokunmuyor.

Buradaki sorun if’in bool olmayan degerlerle de calismasi ve/veya degerleri otomatik bool’a cevirmesi. Boolean gibi davranan siniflarin uretilebilmesi ve ortaya cikan DSL’lerin basitlestirilmesi icin __bool__'un varligi iyi olmus, ama standart tipler bu fonksiyonu implement etmek zorunda degildi.

if hede gibi bir kod review’a geldiginde “burada ne demek istiyorsun, daha acik ol,” diyorum, “if len(hede) > 0 veya if hede is not None gibi.”

1 Beğeni

Dediğinize katılıyorum. Python enteresan işler yapıyor. Ben buna benzer bir ifadeyi bir modül içerisine bakarken görmüştüm. Orada “if değişken == Null” gibi bişey vardı. Ben bunu ilk kez görüyorum. Yani C#, Java, Kotlin vb. dillerde “değişken == True” diye bir yazım yok. Buna izin vermiyor. Python bu yazıma izin veriyor ama kullanımı enteresan. Bug dememin sebebi bu ifadeyi ilk yazdığımda değişken içindeki değer sadece “1” olduğunda True döndürmesi diğer her şeyde False vermesiydi. Yani ifade çalışıyor ama sadece değişken “1” olduğunda. Sonra bunun tersini yani “değişken == False” olarak yazdığımda bu sefer herşeyi True döndürmesi ve sadece “0” False döndürmesi. Yani bu ifade değişken değeri sadece 1 ve 0 olduğunda çalışıyor. değişken değeri herhangi bir değerle değiştiğinde tam tersi bir bool değer döndürmesi. Bunu anlayamıyorum.

Python’da bir değeri True ile karşılaştırırken is operatörünü kullanmak daha iyidir. Çünkü True sadece tek bir adreste bulunur ve her seferinde tekrar oluşturulmaz. Hatta True sadece bir sayıdır ve değeri "1"dir. Örnek:

if a == True:   # Bunu kullanmayın
if a is True:   # Bunu kullanın

Bu sayede karşılaştırmayı değer üzerinden değil de adres üzerinden yapıyor olursunuz ve sanırım bu daha hızlı çalışır. Tabii Python belli sayıda sayıyı da belirli adreslerde sabit tuttuğu için her durumda adrese bağlı bir karşılaştırma yapılıyor da olabilir ama yine de önerdiğim yol daha iyi görünüyor sanki. Bu yolu True, False ve None için rahatlıkla kullanabilirsiniz. Hatta adrese göre eşleştirme yapılan sizin oluşturduğunuz sınıflar ve bu sınıfların nesneleri arasında da kullanabilirsiniz.

1 Beğeni

Nacizane bir tavsiye: Yeni baslayanlarin ornek almaya calistigi/aldigi biri olarak boyle ifadeler kullanmayin. Sonra calisma hizinin en ufak bir fark yaratabilecegini zannediyorlar. Burada da birkac tane oyle tartismaya denk geldim.

“Optimize kod” yazmaya calisanlari genel olarak yazilim gelistirme maliyet dagilimlarina, algoritmik kompleksiteye ve profiling tool’larina yonlendiriyorum.

Gecen ay DEBUG degerine gore hashtable’i int veya string’le indexleyen arkadasa “niye production’da int kullanip yavaslatiyosun ki, hep string kullan” dedim :​)

Tavsiyeniz için teşekkür ederim. “Hızlı çalıştığı için değil de iyi göründüğü için kullanın.” diyeyim o zaman. :slight_smile:

Emin olmak için denedim ve is kullanıldığında %30’a yakın bir hız artışı olduğunu gördüm:

PS C:\Users\ismail.arilik> py -3 -m timeit "if True == True: pass"
10000000 loops, best of 5: 32.8 nsec per loop
PS C:\Users\ismail.arilik> py -3 -m timeit "if True is True: pass"
10000000 loops, best of 5: 23.9 nsec per loop

Tüm uygulamada kullanılırsa önemli bir performans artışı sağlayabilir bence, özellikle sık kullanılıyorsa bu tip bir karşılaştırma. Tabii şunu da unutmamak gerek. Python’da şu makbuldür:

if a:   # if a == True yerine
    ...
1 Beğeni
if bool(x) == True:
    print('True')
else:
    print('False')

Bu şekilde yazman gerekirdi. Çünkü sen yazdığında x-in bool değerini değil, tanımladığı ifadeni sorguluyorsun. Sorguladığın ifadeyse bir string, bool değeri değil.

Hic kullanmamak daha da hizli:

11:51:26 0 aib@vivaldi:/tmp% python3 -m timeit "if True == True: pass"
10000000 loops, best of 3: 0.0235 usec per loop
11:51:28 0 aib@vivaldi:/tmp% python3 -m timeit "if True is True: pass"
100000000 loops, best of 3: 0.0175 usec per loop
11:51:42 0 aib@vivaldi:/tmp% python3 -m timeit "pass"                 
100000000 loops, best of 3: 0.00779 usec per loop
1 Beğeni

Bu ifade de “a” değişkenine bir değer verelim ve ne döndürüyor bir bakalım.:slight_smile:

Tam olarak ne demek istediğinizi anlamadım. Ama ben anlatmak istediğimi farklı bir şekilde bir daha anlatayım.

Python’da == operatörünü kullandığınız zaman verilen iki değişkenin içeriği kontrol edilir. Ve eğer eşit ise geriye bir boolean değer döndürür. True veya False.

Sizin verdiğiniz örneğe gelirsek, x içeriğine " " yani bir boşluk yerleştirmişsiniz. Boşluk da olsa bir değer taşır. Ve alt satırda if x == True yazınca iki tarafın da içeriğini kontrol ediyor. x değişkeni boşluk, diğer taraf da farklı bir tip olduğu için eşit olmadığına karar veriyor ve if ifadesinde kullanılmak üzere bir False değeri üretiyor.

İşte if ifadesi bu karşılaştırma sonucunun yanlış olduğunu görünce de else bloğuna geçiş yapıyor.

Bir diğer kullanım şekli olan if x: ifadesini şu şekilde de ifade edebiliriz.

x = " "

# eğer x değişkeni False,None ve boş karakter değilse
if(x != None and x != False and x != ""):
    print("True")

Edemeyiz. Python’da mesela boş listenin doğruluk değeri de yanlıştır. Bu bir yana, if x:'i şöyle ifade etmemiz gerekir:

if bool(x):
    ...

Boş liste aklıma gelmedi o da eklenebilir. Anlatmak istediğim şeyi göstermek istedim sadece. Sizin dediginiz de doğru.