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:

python
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 FF

Language 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:

python
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ı: CC

Aralı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:

python
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 yetkisi

Henü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

Karşılaştırma operatörleri ve zincirleme: ==, !=, , >=, in, not in, is, is not

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.

python
yas = 15
print(0 <= yas < 18)
print(1 < 3 > 2)
x = 5
print(1 < x < 10 == 10)
# çıktı: True
# çıktı: True
# çıktı: True

Zincir, 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örAnlamıÖrnek
==, !=Değer eşitliği ve eşitsizliğipuan == 100
<, <=, >, >=Sıralama karşılaştırması0 <= yas < 18
in, not inÜyelik ya da alt metinrol in ("admin", "editor")
is, is notAynı nesne misonuc is None
andİkisi de doğru mu (kısa devre)liste and liste[0] > 0
orEn az biri doğru mu (kısa devre)isim or "Misafir"
notMantıksal tersinot 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:

bash
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:

python
x = float("nan")
print(x == x, x != x, x > 0, x <= 0)
# çıktı: False True False False

Doğ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).

python
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ı: ' ' True

Sondaki üç 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:

python
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ışır

and, or, not ve kısa devre

and, 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:

python
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:

python
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ı: True

Kı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:

python
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:

python
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 renk

Doğ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:

python
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:

python
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 2

Birden ç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:

python
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:

bash
  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:

bash
  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:

python
x = 7
if x is 7:
    print("eşit")
# ornek.py:2: SyntaxWarning: "is" with 'int' literal. Did you mean "=="?
# çıktı: eşit

Kod 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

Sık yapılan hatalar: Koşul sırasını ters yazmak, x == "a" or "b" yazmak, Metni sayıyla karşılaştırmak, None için == kullanmak
  • 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 önce int() ile dönüştürün.
  • None için == kullanmak: is None ve is not None yazın.
  • if x == True yazmak: Doğruluk değeri zaten sınandığı için if x: yeterlidir; yalnızca tam olarak True nesnesini arıyorsanız is True kullanın.
  • Gereksiz iç içe if: İki koşul birlikte gerekiyorsa iç içe blok yerine and kullanmak 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ı