Python'da koşullu çalıştırma if, elif ve else ile yapılır: Python koşulları yukarıdan aşağıya tek tek değerlendirir, doğru çıkan ilk koşulun bloğunu çalıştırır ve geri kalanına hiç bakmaz; hiçbiri doğru değilse varsa else bloğu çalışır. Bloklar süslü parantezle değil, iki nokta üst üste ve girintiyle belirlenir. Koşullar ==, <, in, is gibi karşılaştırmalarla ve and, or, not mantıksal operatörleriyle kurulur; tek satırlık seçimler için x if kosul else y biçimindeki koşullu ifade kullanılır.
Bu yazı Tutorial'ın kontrol akışı bölümüne ve Language Reference'ın ifadeler bölümüne dayanarak koşulların inceliklerini anlatıyor: 0 <= x < 10 gibi karşılaştırma zincirleri, and ile or operatörlerinin neden True/False yerine işlenenlerden birini döndürdüğü, hangi değerlerin yanlış sayıldığı, walrus operatörü ve yeni başlayanların en sık düştüğü x == "a" or "b" tuzağı. Serinin tamamı Python öğrenme rehberi sayfasında.
if, elif ve else
Bir if ifadesi sıfır ya da daha fazla elif ve isteğe bağlı bir else içerebilir. elif, "else if" ifadesinin kısaltmasıdır ve iç içe girintiyi önler. Tutorial, if ... elif ... elif dizisinin başka dillerdeki switch ya da case ifadelerinin yerini tuttuğunu belirtir. Aşağıdaki fonksiyon bir puanı harf notuna çeviriyor:
def harf_notu(puan):
if puan >= 85:
return "AA"
elif puan >= 70:
return "BA"
elif puan >= 50:
return "CC"
else:
return "FF"
for p in (92, 70, 49):
print(p, harf_notu(p))
# çıktı: 92 AA
# çıktı: 70 BA
# çıktı: 49 FFLanguage Reference bu davranışı kesin biçimde tanımlar: ifadeler doğru olan bulunana kadar sırayla değerlendirilir, o blok çalışır ve if ifadesinin geri kalan hiçbir parçası ne çalıştırılır ne de değerlendirilir. Bu yüzden koşulların sırası önemlidir. Aynı koşulları ters sırayla yazarsanız 92 puan bile ilk koşula takılır:
def harf_notu_hatali(puan):
if puan >= 50:
return "CC"
elif puan >= 70:
return "BA"
elif puan >= 85:
return "AA"
return "FF"
print(harf_notu_hatali(92))
# çıktı: CCAralık kontrollerinde koşulları en dar olandan en genişe doğru sıralayın ya da her koşulda aralığın iki ucunu da yazın. Gerçek dünyadan bir örnek olarak, birden fazla alanı sırayla sınayan bir yetki kontrolü de aynı yapıyı kullanır:
kullanici = {"ad": "Ece", "rol": "editor", "aktif": True}
if not kullanici["aktif"]:
print("hesap kapalı")
elif kullanici["rol"] == "admin":
print("tam yetki")
elif kullanici["rol"] in ("editor", "yazar"):
print("içerik yetkisi")
else:
print("okuma yetkisi")
# çıktı: içerik yetkisiHenüz içini yazmadığınız bir blok için pass ifadesini kullanabilirsiniz; hiçbir şey yapmaz ama bloğun boş kalmasını, dolayısıyla söz dizimi hatasını önler. Aynı değeri birçok sabitle karşılaştırıyorsanız ya da yapısal kontroller yapıyorsanız match/case ifadesi daha okunaklı olabilir.
Karşılaştırma operatörleri ve zincirleme

Python'da sekiz karşılaştırma operatörü vardır: <, <=, >, >=, ==, !=, is ve is not; bunlara üyelik sınayan in ve not in eklenir. Hepsi aynı önceliğe sahiptir ve aritmetik operatörlerden düşük, mantıksal operatörlerden yüksek önceliklidir. C'den farklı olarak karşılaştırmalar matematikteki gibi zincirlenebilir: x < y <= z ifadesi x < y and y <= z ile aynıdır, tek farkı y'nin yalnızca bir kez değerlendirilmesidir.
yas = 15
print(0 <= yas < 18)
print(1 < 3 > 2)
x = 5
print(1 < x < 10 == 10)
# çıktı: True
# çıktı: True
# çıktı: TrueZincir, yalnızca komşu işlenenleri karşılaştırır. Belgelerin vurguladığı gibi a op1 b op2 c ifadesi a ile c arasında bir karşılaştırma yapmaz; bu yüzden 1 < 3 > 2 geçerlidir. Okunabilirlik açısından zincirleri aynı yöndeki operatörlerle (a < b < c gibi) sınırlamak iyi bir alışkanlıktır.
| Operatör | Anlamı | Örnek |
|---|---|---|
| ==, != | Değer eşitliği ve eşitsizliği | puan == 100 |
| <, <=, >, >= | Sıralama karşılaştırması | 0 <= yas < 18 |
| in, not in | Üyelik ya da alt metin | rol in ("admin", "editor") |
| is, is not | Aynı nesne mi | sonuc is None |
| and | İkisi de doğru mu (kısa devre) | liste and liste[0] > 0 |
| or | En az biri doğru mu (kısa devre) | isim or "Misafir" |
| not | Mantıksal tersi | not aktif |
Farklı tipleri karşılaştırmak
Eşitlik farklı tipler arasında her zaman tanımlıdır ama sıralama karşılaştırması tanımlı değilse TypeError oluşur. En yaygın örnek, input() ile okunan bir metni sayıyla karşılaştırmaktır. yas = input("Yaşınız: ") satırından sonra if yas >= 18: yazarsanız Python 3.15.2 şu hatayı verir:
TypeError: '>=' not supported between instances of 'str' and 'int'
Çözüm değeri önce dönüştürmektir: yas = int(input("Yaşınız: ")). Farklı tipteki sayılar ise kesin değerleri üzerinden karşılaştırılır, yani 1 == 1.0 doğrudur (bkz. sayılar). Kayan nokta özel değeri nan ise kendisi dahil hiçbir şeye eşit değildir ve bütün sıralama karşılaştırmaları yanlış döner:
x = float("nan")
print(x == x, x != x, x > 0, x <= 0)
# çıktı: False True False FalseDoğruluk değeri: hangi değerler yanlış sayılır?
if ve while koşullarında yalnızca True ve False değil, her nesne kullanılabilir. Belgelere göre şu değerler yanlış sayılır: None ve False; her sayı tipinin sıfırı (0, 0.0, 0j, Decimal(0), Fraction(0, 1)); boş diziler ve koleksiyonlar ('', (), [], {}, set(), range(0)). Geri kalan her şey doğrudur. Kendi sınıflarınızda bu davranışı __bool__() ya da __len__() metoduyla belirleyebilirsiniz (bkz. dunder metotlar).
for deger in (0, 0.0, "", [], {}, None, "0", [0], " "):
print(repr(deger), bool(deger))
# çıktı: 0 False
# çıktı: 0.0 False
# çıktı: '' False
# çıktı: [] False
# çıktı: {} False
# çıktı: None False
# çıktı: '0' True
# çıktı: [0] True
# çıktı: ' ' TrueSondaki üç satıra dikkat edin: "0" metni, içinde sıfır olan bir liste ve tek boşluktan oluşan metin doğru sayılır, çünkü boş değillerdir. Bu kurallar sayesinde if liste: "liste boş değilse" anlamına gelir ve if len(liste) > 0: yazmaya gerek kalmaz.
None kontrolü: is None mı, not x mi?
if not sonuc: ifadesi None için doğru çalışır ama 0, boş metin ve boş liste için de çalışır. "Değer hiç verilmedi" ile "değer sıfır" arasında fark varsa is None kullanın:
sonuc = None
if sonuc is None:
print("henüz sonuç yok")
if not sonuc:
print("bu da çalışır ama 0 ve boş metin için de çalışır")
# çıktı: henüz sonuç yok
# çıktı: bu da çalışır ama 0 ve boş metin için de çalışırand, or, not ve kısa devre

x or y önce x'i değerlendirir; x doğruysa x'in kendisini döndürür, değilse y'yi değerlendirip onu döndürür. x and y ise x yanlışsa x'i, değilse y'yi döndürür. Yani bu iki operatör sonucu True/False ile sınırlamaz, son değerlendirdiği işleneni verir. not ise her zaman bir bool döndürür. Bu özellik varsayılan değer atamak için sık kullanılır:
print(0 or "varsayılan")
print("" or None or "son")
print(3 and 5)
print(0 and 5)
print(not "abc")
isim = ""
gorunen = isim or "Misafir"
print(gorunen)
# çıktı: varsayılan
# çıktı: son
# çıktı: 5
# çıktı: 0
# çıktı: False
# çıktı: Misafirİkisi de kısa devre operatörüdür: sonuç ilk işlenenden belli oluyorsa ikinci işlenen hiç değerlendirilmez. Bunu bir fonksiyon çağrısıyla görebilirsiniz; kontrol() yalnızca son satırda çağrılıyor:
def kontrol():
print("kontrol çağrıldı")
return True
print(False and kontrol())
print(True or kontrol())
print(True and kontrol())
# çıktı: False
# çıktı: True
# çıktı: kontrol çağrıldı
# çıktı: TrueKısa devre, hataya yol açabilecek bir işlemi korumak için de kullanılır. Aşağıda liste boş olduğu için liste[0] hiç değerlendirilmez ve IndexError oluşmaz:
liste = []
if liste and liste[0] > 10:
print("ilk eleman büyük")
else:
print("liste boş ya da ilk eleman küçük")
# çıktı: liste boş ya da ilk eleman küçükÖncelik sırası not, and, or şeklindedir ve not, karşılaştırma operatörlerinden daha düşük önceliklidir. Bu yüzden not 1 == 2 ifadesi not (1 == 2) olarak okunur ve True verir; a == not b ise söz dizimi hatasıdır. Karışık ifadelerde parantez kullanmak hem hatayı önler hem okunabilirliği artırır.
En sık tuzak: x == "a" or "b"
"Renk kırmızı ya da mavi ise" cümlesini doğrudan Python'a çevirmek yanlış sonuç verir. renk == "kırmızı" or "mavi" ifadesi (renk == "kırmızı") or "mavi" olarak okunur; ilk kısım yanlışsa or ikinci işleneni, yani boş olmayan ve her zaman doğru sayılan "mavi" metnini döndürür:
renk = "yeşil"
if renk == "kırmızı" or "mavi":
print("Bu satır her zaman çalışır")
print(renk == "kırmızı" or "mavi")
if renk in ("kırmızı", "mavi"):
print("kırmızı ya da mavi")
else:
print("başka bir renk")
# çıktı: Bu satır her zaman çalışır
# çıktı: mavi
# çıktı: başka bir renkDoğru yazım ya her karşılaştırmayı açıkça yazmak (renk == "kırmızı" or renk == "mavi") ya da in operatörüyle bir tuple içinde aramaktır. İkinci biçim daha kısa ve okunaklıdır.
Koşullu ifade (tek satırlık if)
Koşullu ifade, bazı dillerdeki üçlü operatörün (?:) karşılığıdır: x if C else y. Belgelere göre önce C değerlendirilir; doğruysa x, değilse y değerlendirilip döndürülür. Bir ifade olduğu için atamaların, fonksiyon argümanlarının ve f-string'lerin içinde kullanılabilir:
stok = 0
durum = "var" if stok > 0 else "tükendi"
print(durum)
print(f"{stok} adet ({'çift' if stok % 2 == 0 else 'tek'})")
# çıktı: tükendi
# çıktı: 0 adet (çift)Koşullu ifadeyi iç içe yazmak mümkündür ama okunması hızla zorlaşır. İkiden fazla dal varsa normal if/elif/else bloğu tercih edin.
Walrus operatörü (:=)
Python 3.8 ile gelen atama ifadesi :=, bir değeri hem bir isme atar hem de ifadenin sonucu olarak döndürür. if ve while koşullarında parantez gerekmez ama karşılaştırmanın parçası olduğunda öncelik nedeniyle parantez kullanmanız gerekir:
veriler = [3, 8, 1]
if (n := len(veriler)) > 2:
print(f"{n} eleman var, sınır 2")
# çıktı: 3 eleman var, sınır 2Birden çok koşul: any(), all() ve satır bölme
Bir listedeki öğelerden en az birinin ya da hepsinin bir koşulu sağlayıp sağlamadığını sınamak için uzun or/and zincirleri yerine yerleşik any() ve all() fonksiyonlarını kullanabilirsiniz. any() öğelerden biri doğruysa, all() hepsi doğruysa True döndürür. Belgelere göre boş bir yinelenebilir için any() yanlış, all() doğru sonuç verir. Uzun koşulları ise parantez içine alarak birden çok satıra bölebilirsiniz; parantez içindeki satır sonları Python için ifadeyi bitirmez:
puanlar = [72, 88, 45]
if any(p < 50 for p in puanlar):
print("en az bir başarısız not var")
if all(p >= 40 for p in puanlar):
print("tüm notlar 40 ve üstü")
print(any([]), all([]))
yas, uye = 20, True
if (yas >= 18
and uye
and len(puanlar) > 2):
print("koşullar sağlandı")
# çıktı: en az bir başarısız not var
# çıktı: tüm notlar 40 ve üstü
# çıktı: False True
# çıktı: koşullar sağlandıParantez içindeki p < 50 for p in puanlar bir generator ifadesidir ve ilk doğru (ya da all() için ilk yanlış) öğe bulunduğunda değerlendirme durur; ayrıntılar list comprehension yazısında.
Söz dizimi hataları ve uyarılar
Koşul yazarken en sık görülen hataları ve Python 3.15.2'nin verdiği mesajları bilmek, düzeltmeyi hızlandırır (dosya yolları ornek.py olarak kısaltıldı). Koşulun sonundaki iki noktayı unutmak:
File "ornek.py", line 2
if x > 3
^
SyntaxError: expected ':'
Karşılaştırma yerine atama operatörü yazmak; Python burada hangi operatörü kastetmiş olabileceğinizi de önerir:
File "ornek.py", line 2
if x = 5:
^^^^^
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?Başka dillerden alışkanlıkla else if yazmak SyntaxError: expected ':' verir; Python'da doğru anahtar kelime elif'tir. Bir sayı sabitini is ile karşılaştırmak ise hata değil uyarı üretir, çünkü is kimliği sınar ve küçük tamsayıların aynı nesne olması bir CPython ayrıntısıdır:
x = 7
if x is 7:
print("eşit")
# ornek.py:2: SyntaxWarning: "is" with 'int' literal. Did you mean "=="?
# çıktı: eşitKod bu örnekte çalıştı, ama sonucuna güvenemezsiniz. Değer karşılaştırması için her zaman == kullanın. Girinti hataları ve diğer mesajlar için sık hata mesajları yazısına bakın.
Sık yapılan hatalar

- Koşul sırasını ters yazmak: Geniş koşul önce gelirse dar koşullar hiç çalışmaz.
- x == "a" or "b" yazmak:
x in ("a", "b")kullanın. - Metni sayıyla karşılaştırmak:
input()sonucunu önceint()ile dönüştürün. - None için == kullanmak:
is Noneveis not Noneyazın. - if x == True yazmak: Doğruluk değeri zaten sınandığı için
if x:yeterlidir; yalnızca tam olarakTruenesnesini arıyorsanızis Truekullanın. - Gereksiz iç içe if: İki koşul birlikte gerekiyorsa iç içe blok yerine
andkullanmak girintiyi azaltır.
Sık Sorulan Sorular
Python'da switch-case var mı?
Klasik anlamda switch yoktur; Tutorial if/elif dizisini bunun karşılığı olarak gösterir. Python 3.10 ile gelen match ifadesi ise değerleri ve veri yapılarını desenlere göre eşleştirebilir; ayrıntılar match/case yazısında.
and ile & arasındaki fark nedir?
and mantıksal operatördür, kısa devre yapar ve işlenenlerden birini döndürür. & ise tamsayılarda bit düzeyinde VE işlemi, kümelerde kesişim işlemidir ve kısa devre yapmaz. Koşullarda and kullanın.
Bir değerin belirli bir aralıkta olup olmadığını nasıl sınarım?
Karşılaştırma zinciriyle: if 0 <= puan <= 100:. Tamsayı aralıkları için puan in range(0, 101) da çalışır ama bitiş değerinin hariç olduğunu unutmayın (bkz. for ve range).
Boş bir if bloğu yazabilir miyim?
Bloğun en az bir ifade içermesi gerekir; boş bırakırsanız IndentationError alırsınız. Geçici olarak pass yazın.
Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.
İlgili içerikler: Python öğrenme rehberi · for ve while döngüleri · match/case · Değişkenler ve veri tipleri · Sık hata mesajları