if Deyimi

10819

Genel biçimi

if <ifade>: <suite>
[else: <suite>]

biçimindedir.

Burada iki adet suite vardır. Biri doğruysa biri de yanlışsa kısmı içindir. else kısmı hiç olmayabilir. Aşağıdaki yazım geçerlidir:

if ifade:
  ifade1
  ifade2
else:
  ifade3
  ifade4

Aşağıdaki da geçerlidir:

#geçerli

if ifade: ifade1; ifade2
else:
  ifade3
  ifade4

###

#geçerli

if ifade:
  ifade1; ifade2
else
  ifade3
  ifade4

###

#geçerli, suitler farklı seviyede olabilir

if ifade:
    ifade1
    ifade2
else:
  ifade3
  ifade4

En son verdiğimiz örnek elbette geçerlidir ama okunabilir değildir.


: atomu bileşik deyimlerde kontrol kısmının sonunda olmaktadır genel olarak. Bu atom, ifadeye yapışık olmak zorunda değildir fakat aynı satırda olmalıdır.

#geçerli

if ifade           :
        ifade1; ifade2
else                 : ifade3; ifade4

Bu da geçerlidir ama iyi değildir, : atomunun boşluk bırakılmadan yapışık yazılması tavsiye edilir.


Suite tanımına tekrar bir bakalım. Aynı satır üzerine yazmış olduğumuz birden fazla basit deyim ya da farklı satırlara yazılmış olan aynı girinti düzeyine sahip birden fazla deyim bir suite oluşturuyordu. Bu açıdan bakınca

# geçersiz

if ifade: ifade1
  ifade2
else: ifade3; ifade4

geçersizdir. Çünkü ifade1 ayrı bir suite, ifade2 ayrı bir suite gibi oluyor.

# geçersiz

if ifade:
  ifade1
    ifade2
else: ifade3

Burada da ifade1 ve ifade2 ayrı girinti seviyelerinde olduğu için tek bir suite oluşturmaz.

# geçerli

if ifade: ifade1; ifade2
else: ifade3; ifade4
ifade5

Burada bir sıkıntı yoktur. ifade5 ise if deyimine ait değildir.

# geçersiz

if ifade:
  ifade1
  ifade2
else:
  ifade3
  ifade4
 ifade5

Burada ifade5 ise if dışında değildir. ifade5in dışarıda olması için if ile aynı hizada olması gerekir. Hizası da yanlış olduğu için suite kuralına aykırıdır.

# geçersiz

if ifade: ifade1 else: ifade2

Bu da geçersizdir. Çünkü else ile if aynı girinti seviyesinde olmalıdır.

if nasıl çalışır

Yorumlayıcı önce if anahtar sözcüğünün yanındaki ifadenin türüne bakar. Eğer bool türünden değilse onu bool türüne dönüştürür. Bu dönüşümden sonra True elde edilirse if deyiminin doğru kısmındaki suite çalıştırılır. False ise else kısmındaki suite çalıştırılır. Burada if deyiminin çalışması biter.

x = 10
if x > 0:
  print('ankara')
  print('izmir')
else:
  print('adana')
print('eskişehir')

Burada x > 0 zaten bool türündendir.


Not

Boş bir listenin, demetin ya da string’in bool türüne False olarak doluların ise True olarak dönüştürüldüğünü hatırlayalım.

Sıfırdan farklı int ve float değerleri de bool türüne True; 0 değeri ise False olarak dönüştürülür.


if, tek bir deyimdir.

if ifade:
  ifade1
  ifade2
ifade3

Burada if bir deyimdir ve ifade3 de basit bir deyim oluşturur. Burada else yoktur.


Dikkat edersen C, C++, Java ve C# gibi dillerde if() formu vardır. Ama Python’da () parantezler yoktur. C’de olmasaydı eğer if a > 10 b = 20; yazdığımızda neresi koşul neresi başka yer derleyici ayıramayacaktır. () kullanımı C’de bunu sağlamaktadır. Python’da ise : atomu zorunlu olduğu için if a > b: b = 20 görüldüğü zaman yorumlayıcı bunu ayrıştırabilir.

Swift, Kotlin gibi dillerde ise {} kullanımı zorunlu olduğu için () kullanımı gerekmemektedir. C’de ise {} da zorunlu değildir.

# Swift ve Kotlin

if a > 10 {
  b = 20;
}

İstersek Python’da da () kullanabiliriz, her ifade de olduğu gibi.

# Geçerli

if (a > 10):
  b = 20

Geçerlidir ama () gerekli değildir.

Nested if ve Dangling else

if deyimi içerisinde başka bir if deyimi olabilir.

ifade1
if ifade2:
  ifade3
  if ifade4:
    ifade5
    ifade6
  else:
    ifade7
  ifade8
else:
  ifade9
ifade10

En dıştan baktığımızda 3 adet deyim vardır: ifade1, if deyimi ve ifade10

if deyiminin içinde de başka if deyimleri vardır.


Bir de dangling else konusuna bir bakalım.

C, C++, Java, C# gibi dillerde hizalama anlamsız olduğu için dangling else denilen bir durum oluşabilmektedir. Bu durum, iki if için tek bir else bulunması durumudur. Python’da ise girinti düzeyleri sayesinde böyle bir kararsızlık oluşmaz.

if ifade1:
  if ifade2:
     ifade3
     ifade4
else:
  ifade5

Burada ifade5, en dıştaki ifin else kısmındadır.

if ifade1:
  if ifade2:
     ifade3
     ifade4
  else:
    ifade5

Burada ise içerdeki if in else kısmındadır.

Ayrık Koşullar - Discerete Conditions

11144

Biri doğru iken diğerlerinin doğru olma olasılığı yoksa bu koşullara ayrık koşullar denmektedir. Mesela a > 0 ve a < 0 gibi.

Programlamada bunların ayrı if ile kontrol edilmesi kötü bir tekniktir.

if a > 0:
  ifade
if a < 0:
  ifade
if a == 0:
  ifade

Örneğin a pozitif bir değerse gereksiz yere iki karşılaştırma daha yapılacaktır. Bunlar önemsiz de olsa gereksiz zaman harcamasına yer açar. Daha doğru olan else-if kullanımıdır.

if a > 0:
  ifade
else:
  if a < 0:
    ifade
  else:
    if a == 0:
      ifade

elif

Görüldüğü gibi else-if merdiveni kullandığımızda görüntü bozulmaktadır. Bunun için Python’da if deyiminin elif kısmı da olabilir, else ifin kısaltılmış halidir. if ile aynı girinti düzeyinde olmak zorundadır. elif sonrası else de kullanılabilir.

if a == 1:
  print('bir')
elif a == 2:
  print('iki')
elif a == 3:
  print('üç')
else:
  print('hiçbiri')

11262