6: If/Eğer

Şu ana kadar, tüm programlarda verdiğimiz tüm yönergeler sırayla ve satır atlanmaksızın uygulanacak nitelikteydi. Klavyenizde geri ve ileri ok tuşlarına veya kod üzerinde geri veya ileri düğmelerine basarak şu örneğe bakalım:

Bu derste kazanacağımız yeni beceri "eğer" ifadelerini (if statement) kullanmak olacak, böylece şarta bağlı olarak gerçekleşecek programlar yazabileceğiz; eğer şart karşılanmış olursa bir sonuç, karşılanmamış olursa diğer sonucu verebilen programlar. Mesela yukarıdaki örneği biraz değiştirip yaşa bağlı olarak bir mesaj verecek bir program yazalım. İki satır ekleyeceğiz: if yaş > 65: (yani, "eğer yaş  65'ten büyükse") ve   print('Emekliliğiniz hayırlı olsun!'). Şimdi adım adım programı yeniden görelim:

Dikkat ettiyseniz yeni print fonksiyonunu atladı (skipped), çünkü yaş sadece 31 idi! Eğer aynı programda doğumYılı değişkenine 1928 değerini verirsek ne olur?

Farkı görüyorsunuz değil mi? Alttaki örnek (yaş 85 olan) 2 satır çıktı verdi ve son satırı atlamadı. Bu, tam olarak "eğer" ifadeleri (if statement) ile yapmayı amaçladığımız şeydir:  önce bir veriyi kontrol etsin ( yaş 65'ten büyük mü?), eğer bu veri doğru ise -şartı karşılıyorsa- belirtilen işlemi yapsın (Emekliliğiniz hayırlı olsun! yazmak).

Sonucu belirleyici olan kısım şart (condition), şartı karşılayıp karşılamadığına baktığımız ifadeler ise gövde (body) olarak adlandırılır. Gövde cümleleri paragraf girintisi ile yazılmalıdır (bkz. yukarıdaki örnek). Gövde birden fazla ifade içerebilir, böyle bir durumda satırlar paragraf girintisi ile yazılmalıdır.

  • Bu kodu konsol veya görüntüleyicide 1982 değerini girerek çalıştırın. Girintili satırların ikisini de atlayacak.

Bu alıştırmada sizden boolean karşılaştırma bağlaçları ile bir program yazmanızı isteyeceğiz. Yukarıda  "if x > y:" ifadesinin "eğer xy'den büyükse" anlamına geldiğini görmüştük. Ayrıca kullanabileceğiniz diğer işlemler şunlar olabilir:

  • if x < y: ifadesi "eğer x, y'den küçük ise" demektir
  • if x >= y: ifadesi "eğer x, y'den büyük veya y'ye eşit ise" demektir
  • if x <= y: ifadesi "eğer x, y'den küçük veya y'ye eşit ise" demektir

Coding Exercise: IHOPython
Bir program yazın, verisi integer tipinde olacak şekilde  krep = int(input())  inputu ile kullanıcıdan veri girmesini isteyin.  Program, girilen inputa göre eğer krep sayısı 3'ten fazla ise Nefis! ama eğer krep 3'ten az ise  Hâlâ açım! yazdırsın. İpucu
You may enter input for the program in the box below.

Bir "eğer ifadesi"nin yapısı

  • İlk satır,
    if «şart»:
    üç parçası vardır: if kelimesi,  doğru veya yanlış (True/False) sonucuna varılmasını belirleyecek olan «şart» (aşağıda açıklayacağız) ve iki nokta üstüste  :
  • Ve gövde pargraf girintisi ile yazılmış satırlar. Girinti miktarı (boşluk miktarı) önemli olmasa da tutarlı olması çok önemlidir, eğer aynı sayıda boşluk yoksa bu hataya yol açar çünkü Python girintilere bakarak gövdenin nerede başlayıp nerede bittiğini görmek zorundadır.

Eğer ifadesinin gövde böümü bir program bloğudur. Bloklar pek çok başka yerde de kullanılır, mesela kendi fonksiyonlarınızı yazarken veya "için" döngüsü (for loop) kurarken. (Diğer bazı programlama dillerinde bloklar küme parantezleri ile belirlenir {}.)

Şimdiki alıştırma aslında 4 alıştırmadan oluşuyor. Birkaç farklı sonuç almak için satırları düzenlemeniz gerekecek. Bölümleri açmak için yatay çubuklara tılklayın; istediğiniz sırayla seçebilirsiniz. Daha önce gördüğümüz gibi kod satırlarını sürükleyip bırakarak yerlerini değiştirebilirsiniz.


Bölüm 1: Beklenmeyen girinti
Scramble Exercise: Beklenmeyen girinti
Şu hatayla karşılaşabiliriz:

IndentationError: unexpected indent
  • if 1000 < 10:
  • print("message 1")
  • print("message 2")
  • if 2 > 1:
  • print("message 3")
Bölüm 2: Beklenmedik çıkıntı
Scramble Exercise: Beklenmedik çıkıntı
Şu hatayla karşılaşabiliriz:

IndentationError: unindent does not match any outer indentation level
  • if 1000 < 10:
  • print("message 2")
  • if 2 > 1:
  • print("message 3")
  • print("message 1")
Bölüm 3: Beklenen girinti bulunamadı
Scramble Exercise: Beklenen girinti
Şu hatayla karşılaşabiliriz:

IndentationError: expected an indented block
  • if 1000 < 10:
  • print("message 1")
  • print("message 2")
  • if 2 > 1:
  • print("message 3")
Bölüm 4: Düzgün hizalama
Scramble Exercise: Düzgün hizalama
Hatayla karşılaşmadık!
  • if 1000 < 10:
  • print("message 1")
  • print("message 2")
  • if 2 > 1:
  • print("message 3")

Doğru, Yanlış ve bool

Şimdiye kadar, bir ifadenin «şart» («condition») kısmında  x > y gibi bir sayısal karşılaştırma  yapıldığında,   x sayısal olarak y sayısından büyük olduğu durumlarda ifadenin doğru; x sayısal olarak y sayısına eşit veya ondan küçük olduğu durumlarda ise yanlış olduğunu gördük. Daha genel bir anlatımla doğru/yanlış (true/false) değerleri Boolean olarak anılır(bkz. George Boole). Python'da, bool tipi Boolean değerlerini göstermekte kullanılır; sadece iki değer vardır, True (Doğru) ve False (Yanlış).

Example
Boolean expressions

Note that in Python'da, bir programda doğrudan True ve False bool değerlerini kullanacaksanız büyük harfle yazmalısınız, yoksa örneğinde olduğu gibi hata alırsınız.

Boolean karşılaştırmaları

>, <, <=, ve >=  işaretleri iki sayının karşılaştırılmasında kullanılır ve bize bool değeri verir. Bunlardan başka iki karşılaştırma yolu daha vardır:

  • x == y eşittir işareti (equality operator), x ve y eşit olduğunda sonuç: True
  • x != y is the eşit değil işareti (not-equal operator), x ve y eşit olmadığında sonuç: True
  • == ve !=  stringlerle ve diğer tipten verilerle de kullanılır

(İki tane eşittir işareti koyuyoruz == çünkü tek eşittir işaretini başka bir işlevle kullanıyoruz,  x = «ifade» kullanımında eşittir işareti ile x değişkenine bir «ifade» değeri belirliyoruz. Bu iki işareti = ve == işaretleri çok sık birbirine karıştırılır. bunlar hataya yol açar.)

Bu yeni öğrendiğimiz karşılaştırma işaretleri ile bir alıştırma yapalım.

Coding Exercise: Senin işaretin ne?
Inputtan bir integer değeri okuyacak bir program yazın, ve bu program çıktı olarak sayının özelliğini gösterecek şekilde büyük harfle Pozitif, Negatif veya Sıfır yazsın.
You may enter input for the program in the box below.

Burada blok (aynı girintili hizada bulunan alt alta satırlar) kullanımını görüyoruz.  Bir blokun içinde başka bloklar da kullanılabilir:

if password=='açılSusam':
  print('Kullanıcı giriş yaptı.')
  if saat>17:
    print('İyi akşamlar!')
  print('Bir komut girin:')
Burada dış blokta 4, iç blokta 1 satır bulunuyor: 
if password=='openSesame':  
print('User logged on.')
if hour>17:
print('Good evening!')
print('Enter a command:')

Multiple Choice Exercise: İç içe yuvalanmış if ifadeleri
Aşağıdaki çıktılardan hangisi bu program için ihtimal haricindedir?
Doğru! Eğer bir mesaj gösterilirse, dış blok işleme kondu demektir; yani diğer bir deyişle şifre doğruymuş. Bu durumda if saat>17 yanlış bile olsa (ve iç blok atlanır), dış bloktaki print('Bir komut girin:') satırı yine de işleme konacaktır.

Şimdi, içiçe yuvalanmış bloklar kullanarak biraz daha karışık bir yaş hesaplayıcı yazalım.

Coding Exercise: Yaş kontrolü
Bir program yazın, kullanıcının gireceği inputa yaşını gireceği için girdiyi integer olarak okusun. Yaş, 18 ve üzeri ise Oy verebilirsin; 0 ve 17 arasında ise Oy vermek için fazla gençsin ;  yaş 0'dan küçükse Sen bir zaman yolcususun yazdırın.
You may enter input for the program in the box below.

Daha sonra, 9. derste, birden çok boolean kontrol işlemlerini else (değilse) ve elif (else if, veya eğer) komutlarıyla; "and", "or" ve "not" Boolean işlemcileri ile daha pratik yapmayı öğreneceğiz. Şimdilik biz bir sonraki dersimize devam edelim.