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. Dizinin bütün yazılarına erişmek için Python Programlamaya Giriş kategorimize bakabilirsiniz. Bu dizideki yazılar ayrıca Jupyter defterleri halinde GitHub depomuzda da mevcut.
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.
if komutu
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.
hedef = "42"
tahmin = input("Tahmininiz: ")
if tahmin == hedef:
print("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.
1 == 1
1 == 2
1 = 1
Ş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.
if-else komutu
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.
hedef = "42"
x = input("Tahmininiz: ")
if x == hedef:
print("Doğru!")
else:
print("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-elif-else komutu
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")
Aynı programı elif
kullanmadan ancak şöyle yazabiliriz:
x = int(input("Kaç tane? "))
if x>2000:
print("Binlerce")
else:
if x>200:
print("Yüzlerce")
else:
if x>10:
print("Çok")
else:
if x>0:
print("Birkaç")
else:
print("Yok")
Görüldüğü gibi elif
kullanmak programı sadeleştiriyor.
Karşılaştırmalar
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.
2 > 3, 2 >= 3, 2 < 3, 2 <= 3, 2 != 3
Sayı olmayan veri yapıları da karşılaştırmalarda kullanılabilirler. O durumda, eşitsizliklerin değerlendirilmesinde alfabetik sıra kullanılır.
"hello" == "Hello", "hello" > "Hello", "hello" < "jello"
[1,2,3] < [1,20,3], [1,2,3] < [11,2,3]
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.
L = [12,3,4,[5,6]]
3 in L, [3,4] in L, [5,6] in L, [5,6] not in L
s = "merhaba"
"a" in s, "erh" in s
Sözlüklerde in
kelimesi sadece referanslar içinde yoklama yapar.
d = {"abc": 54, (1,2): -45.1}
"abc" in d, 54 in d, (1,2) in d
Doğru ve yanlış sabitleri
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.
L=[]
if L:
print("Liste dolu")
else:
print("Liste boş.")
s = "abc"
if s:
print(s)
else:
print("Boş")
Mantıksal işlemler
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
: HemX
hemY
doğruysa doğru;X
veY
‘den en az biri yanlışsa yanlış.X or Y
:X
veY
‘den en az biri doğruysa doğru; hemX
hemY
yanlışsa yanlış.not X
:X
‘in doğruluk değerinin tersi.
1 < 2 and 3==3
1 < 2 and 3==4
1 < 2 or 3==4
1 > 2 or 3==4
not 1>2
not 3==3
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.
1 == 2 or 3 > 4 or 5 < 8
1 != 2 and not 3 > 4 and 5 < 8
1 != 2 and 3 <= 4 or 5 > 10 and 7 > 8
“Kısa devre” işlemler
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.
"abc" or print("mrb")
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.
False or print("mrb")
0 or 3
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.
2 and 3
3 and print("mrb")
0 and 2
[] and False
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
Üçlü if-else ifadesi
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.
x = float(input("Bir sayı girin: "))
m = x if x>0 else -x
print(m)
En baştaki örneği de şöyle yazabiliriz.
hedef = "42"
x = input("Tahmininiz: ")
print("Doğru!" if x == hedef else "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.
Bilgileri derli toplu ve cok acik anlatmissiniz.
Kaleminize saglik.
Merhaba çok güzel bir anlatım elinize sağlık bu seriyi bitireceğim. Yalnız bir şey sormak istiyorum bu seriyi bitirdiğimde hangi seviyede olacağım ?
İlginiz için teşekkürler. Niyetim nesneye yönelik programlama konusunu da işleyerek seriyi bitirmek. Serinin sonunda ileri seviyeye çıkmış, Python dilinin %85-%90’ını öğrenmiş olursunuz.
Buraya kadar anlayarak geldim umarım bundan sonra da böyle gider 🙂
Teşekkürler. Anlatımız çok güzel.
Teşekkürler…..
Merhabalar ,Kaan bey öğrenirken yazınızdan kopyala yapıp kendimde uyguluyorum.Yazılarınızı burdan aldığımı belirterek kullanabilirmiyim?Teşekkürler…
Elbette.
Merhaba
Kendi adıma verdiğiniz emekler için teşekkür ederim. Şunu öğrenmek istiyorum phyton dili için alıştırma ve pratik yapmaya yönelik bir site vs. var mıdır. Onlar sorsa biz cevaplasak :):). Kendi kendimize hep aynı tür alıştırmalar üretebiliyoruz. Bu da bir müddet sonra gelişimi tek düzeye indirgiyor gibi. Farklı bir yöntemle aynı soru nasıl cevaplanır? Tüm derdim farlı yiğitlerin nasıl yoğurt yediğini anlayabilmek.:):)
Tekrar Teşekkürler.
Data Camp vb eğitim siteleri var, ama özellikle dediğiniz amaca yönelik tavsiye edebileceğim bir siteye rastgelmedim. Matematiksel problemleri seviyorsanız https://projecteuler.net/ sitesinde istemediğiniz kadar programlama problemi mevcut. Bunların haricinde “Python exercises” kelimeleriyle arayarak birçok kaynak bulabilirsiniz. Mesela https://www.practicepython.org/ iyi görünüyor.
Benim yeni bir dil öğrenirken uyguladığım yöntemlerden biri gördüğüm örnekleri değiştirmek ve farklı amaçlara uyarlamak, ikincisi de kendi kendime bir problem uydurup sıfırdan onu çözecek bir program yazmak. Herkesin ilgi alanları farklı olduğu için, bazen heves verici bir problemi insan sadece kendisi bulabiliyor.