= "42"
hedef = input("Tahmininiz: ")
tahmin if tahmin == hedef:
print("Doğru!")
Tahmininiz: 42
Doğru!
Kaan Öztürk
December 16, 2017
Yeni başlayanlar için Python programlama temellerini işlediğimiz yazı dizimizin bu bölümünde karar verme yapısından bahsedeceğiz.
En basit programlarda bile sık sık “şu şart doğruysa şöyle yap, yoksa yapma”, veya “doğruysa şöyle yap, yanlışsa öbür türlü yap” şeklinde düzenlemelere ihtiyaç duyarız. Sözgelişi, “cevap doğruysa puanı bir arttır”, veya “yanlış sayısı dördün katıysa puanı bir azalt” gibi. Birçok dil gibi Python’da da seçim yapısı if-else
komutlarıyla kurulur.
Karar yapılarının en basit hali, bir şartın doğruluğunu yoklamak ve doğruysa belli işlemler yapmaktır. Sözgelişi aşağıdaki programa bakalım. Hücreyi Shift-Enter ile çalıştırdığımızda tahminimizi soran bir kutu ortaya çıkacak. Kutuya bir cevap yazıp Enter’e basın.
Tahmininiz: 42
Doğru!
Sayı hedef
değerine ("42"
) eşitse ekrana "Doğru!"
yazısını basacak, değilse birşey yapmayacak. Şarttan sonra iki nokta üstüste (:
) koymayı da unutmayın.
(Bu hücredeki kodu kendi başına çalışan bir betik haline getirmek için, kodu kopyalayıp bir metin editörüne yapıştırın ve tahmin.py isimli bir dosya olarak kaydedin. Böylece komut satırında çalıştırabilirsiniz:
$ python3 tahmin.py
Tahmininiz: 42
Doğru!
şeklinde bir çıktınız olmalı)
if
’den sonra tahmin
’in hedef
’e eşit olup olmadığını yoklayan bir mantık ifadesi var. Bunun değeri ya doğru (True
) ya da yanlış (False
) olacak. Eşitlik şartı için ==
(iki tane eşit işareti) kullanıldığına dikkat edin.
Şarttan sonraki satırlara, şart doğruysa çalıştırılacak kod parçası (if bloku) gelir. Burada Python’un kendine özgü bir kuralını görüyoruz: Bloktaki her ifade, if
başlığına göre belli bir miktar sağa kaydırılmalıdır. Yorumlayıcı hangi komutların if
blokuna ait olduğunu bu kaydırma sayesinde ayırt eder.
Meselâ şu iki ayrı programa bakalım:
hedef = "42"
tahmin = input("Tahmininiz: ")
if tahmin == hedef:
print("Doğru!")
print("Bravo")
ve:
hedef = "42"
tahmin = input("Tahmininiz: ")
if tahmin == hedef:
print("Doğru!")
print("Bravo")
İkinci programdaki
print "Bravo"
komutu if
blokunun dışında olduğu için, tahmin doğru olsa da olmasa da çalıştırılır. Deneyin.
if
içindeki blokun kaç boşluk sağa kaydırılacağı önemli değildir; bir tek boşluk bile yeterlidir. Çoğu IDE otomatik olarak dört boşluk genişlikte bir sıçrama yapar; Python programcılık camiasında tavsiye edilen de budur. Sonraki satırlar da aynı kaydırma seviyesinde başlar. Bu yüzden, bloku bitirmek için yeni satıra geçtikten sonra geriye silme (Backspace) tuşuna basmalısınız.
Yukarıdaki program bize sadece tahminimiz doğruysa bir cevap veriyor. Tahminimizin yanlış olduğunu da söylemesini istersek if-else
yapısını kullanırız.
Tahmininiz: 43
Yanlış
else
ifadesinden sonra herhangi bir şart gelmez, çünkü else
bloku zaten sadece if
şartı yanlışsa çalıştırılır. else
kelimesinin, bağlı olduğu if
ile aynı kaydırma seviyesinde olduğuna dikkat edin.
Her else
bir if
’e bağlı olmalıdır, ama tersi doğru değildir. Her if
’e bir else
gerekmez.
if
kullanımının en genel hali budur. elif
kelimesi else if
’in kısaltmasıdır.
x = int(input("Kaç tane? "))
if x>2000:
print("Binlerce")
elif x>200:
print("Yüzlerce")
elif x>10:
print("Çok")
elif x>0:
print("Birkaç")
else:
print("Yok")
Kaç tane? 87
Çok
Aynı programı elif
kullanmadan ancak şöyle yazabiliriz:
Görüldüğü gibi elif
kullanmak programı sadeleştiriyor.
if
’den sonra, mantıksal olarak doğru veya yanlış sayılacak ifadeler gelmelidir. Eşitlikten yukarıda bahsettik. Ayrıca >
(büyük), <
(küçük), >=
(büyük veya eşit), <=
(küçük veya eşit) ve !=
(eşit değil) işlemleri kullanılabilir.
Sayı olmayan veri yapıları da karşılaştırmalarda kullanılabilirler. O durumda, eşitsizliklerin değerlendirilmesinde alfabetik sıra kullanılır.
Daha fazla bilgi için Python dili referansına bakabilirsiniz.
Bir veri yapısı içinde belli bir eleman veya alt grubun bulunup bulunmadığını in
kelimesiyle test edebilirsiniz. Şartı ters çevirmek için not in
kullanılır.
Sözlüklerde in
kelimesi sadece referanslar içinde yoklama yapar.
True
ve False
, aslında 1 ve 0 sayılarına verilen yeni isimlerdir. Ayrıca,
[], {}, "", None, 0, 0.0, False
ifadelerinin her biri mantıksal yanlış anlamı taşır. Tersine olarak da, sıfırdan farklı her sayı veya boş olmayan herhangi bir liste/çokuz/dize/sözlük if
yapılarında mantıksal doğru olarak yorumlanırlar.
Birden fazla şartı Boole işlemleri (and
, or
, not
) ile biraraya getirerek, daha karmaşık şartlar oluşturmak mümkün olur.
X and Y
: Hem X
hem Y
doğruysa doğru; X
ve Y
’den en az biri yanlışsa yanlış.X or Y
: X
ve Y
’den en az biri doğruysa doğru; hem X
hem Y
yanlışsa yanlış.not X
: X
’in doğruluk değerinin tersi.Boole ifadelerinde ikiden fazla bileşen de kullanılabilir. Önce not
işlemi, sonra and
işlemi, sonra da or
işlemi yapılır. Aynı işlem yapılıyorsa, bileşenler soldan sağa çifter çifter alınır.
Mantıksal işlemlerin yan etkileri vardır: Mantıksal or
(veya) işleminde, işlenen değerlerden sadece birisinin doğru olması işlem sonucunun doğru olması için yeterlidir. Bu yüzden, Python X or Y
işlemini yaparken X
’in doğru olduğunu görürse Y
’ye hiç bakmaz, onu değerlemez, ve işlem sonucu olarak X
’in değerini geri verir. Buna kısa devre hesaplama adı verilir. Eğer X
doğru değilse, Y
ne olursa olsun, Y
’yi verir.
Kısa devre özelliği hesaplama verimliliği de sağlar. Bazen bu işlemlerin bileşenleri karmaşık işlemlerle elde ediliyor olabilir. Sözgelişi Y
yerine, bir fonksiyon çağrısı koyuyor olabiliriz, ve bu fonksiyon ağır işlemler yapıyor olabilir. Böyle durumlarda kısa devre işlemler hesaplamada verimlilik sağlarlar, Y
’yi boş yere hesaplamazlar.
Aşağıdaki örnekte, "abc"
doğru sayıldığı için, print
işlemi hiç yapılmadan "abc"
geri verilir.
Aşağıdaki örnekte, or
işleminin değerini anlamak için print
komutu işlenir. Bunun yan etkisi olarak "mrb"
yazılır. Ama print
çağrısı None
verir, o yüzden or
işlemi de None
sonucu verir.
Benzer bir durum X and Y
işlemi için de geçerlidir. Eğer X
mantıksal olarak yanlışsa, Y
ne olursa olsun bütün ifade yanlış olur, böylece X
değeri geri verilir. Ama X
doğruysa, işlemin doğruluk değeri Y
’ye bağlıdır, ve Y
değeri geri verilir.
Bu özellik çeşitli “hack”ler için kullanılabilir. Sözgelişi
X = A or B or C or None
ifadesi, X
’in, A
, B
, C
arasında boş olmayan ilk nesneye atanmasını, veya None
olmasını sağlar. Aynı şeyi if-elif-else
kullanarak yapmak daha uzun bir kod gerektirir.
if A:
X = A
elif B:
X = B
elif C:
X = C
else:
X = None
Birçok durumda, bir değişkene, bir şartın doğru veya yanlış olmasına göre farklı değerler atarız. Sözgelişi, x
mantık ifadesinin doğru olması halinde a
’ya y
değeri verelim, aksi takdirde z
verelim.
if x:
a = y
else:
a = z
Üçlü if-else
ifadesiyle aynısını daha kısa olarak şöyle yazabiliriz:
a = y if x else z
Örnek olarak, m
’ye x
’in mutlak değerini atayalım.
En baştaki örneği de şöyle yazabiliriz.
Tahmininiz: 43
Yanlış
Bir if-elif-else
blokunu üçlü if-else
ifadesi olarak yazabiliriz. Sözgelişi
if rating > 100:
sinif = "A"
elif rating > 50:
sinif = "B"
else:
sinif = "C"
yerine
sinif = "A" if rating > 100 else "B" if rating > 50 else "C"
yazılabilir. Ama aşırıya kaçırırsanız programın okunması zorlaşır.