2.3. If-Else Koşullu Yapısı

Kayıt Tarihi:

Son Güncelleme:

Özet:

Bu derste programlarımızın farklı senaryolara göre farklı şekilde çalışmasına olanak sağlayan dallanma (branching) konusunda değineceğiz. Bir çok programlama dilinde olduğu gibi bunu Python'da da if-else blokları ile yaparız.

Anahtar Kelimeler: dallanma · elif · else · Heaviside fonksiyonu · if · if-else

Bilgisayar programlamada sıklıkla programnın dallanması gerekir. Yani bir koşul sağlanırsa bir iş, başka bir koşul sağlanırsa başka bir iş yapılır. Matematiksel olarak Heaviside fonksiyonu olarak adlandırılan ve aşağıdaki gibi tanımlanam fonksiyonu bu duruma örnek gösterebiliriz.

$$ H(x)= \left\{ \begin{array}{ll} 0, & \quad x < 0\\ 1, & \quad x\geq 0 \end{array} \right. $$

Basit Dallanmalar

Python programlarında dallanmalar if-else blokları yardımıyla kodlanır. Aşağıdaki programda basit bir if-else yapısının kullanımı örnekleniyor.


x = 1E-15

if x < 0:
    H = 0
else:
    H = 1

print "x = %g\tH(x)=%g" % (x, H)

Şimdi yukarıdaki programda kullandığımız kodları açıklayalım. Programda dallanma 5-7 numaralı satırlarda oluşmaktadır. Bir if-else yapısı if kelimesini takip eden bir bool nesnesinden oluşan bir satırla başlar. Bunun altında bulunan ve daha sağdan hizalanmış satırlarda bulunan kodlar, eğer belirtilen bool nesnesi True değerine sahip ise çalıştırılır. Eğer bool nesnesi False ise bu blokta aynı hizada bulunan kodlar çalıştırılmaz. Bu bloktan sonra if kısmı ile aynı şekilde hizalanmış ilk satırda else: ifadesi ile karşılaşılırsa, belirtilen bool nesnesi değeri False olması durumunda bu satırın altındaki farklı hizalı satırlardaki kodlar çalıştırılır. else kısmı zorunlu değildir, eğer bu kısım yoksa bool nesnesi True ise if kısmında belirtilen kodlar çalıştırılır fakat bool nesnesi değeri False ise hiç bir şey yapılmaz. Örneğin aşağıdaki program da yukarıdaki ile aynı çıktıyı üretir.


x = 1E-15
H = 1

if x < 0:
    H = 0

print "x = %g\tH(x)=%g" % (x, H)

Yukarıdaki programda print ifadesinde kullandığımız \t komutu Python'da özel bir karakterdir ve bir tab uzunluğunda boşluk vermek için kullanılır. Bu tür karakterlere kaçış (escape) karakterleri denir, diğer bir sık kullanılan kaçış karakteri \n'dir ve yeni bir satıra atlamayı sağlar. Yukarıdaki programlar aşağıdaki gibi bir sonuç üretir.


Terminal > python ifelse1.py
x = 1e-15       f(x)=1

Bu fonksiyonun değerlerini farklı $x$ değerleri için yazdıran bir program yazalım, bunu bir for döngüsü ile yapabiliriz.


xlist = [-1 + k*0.2 for k in range(10)]

for x in xlist:
    if x < 0:
        H = 0
    else:
        H = 1

    print "x = %4.1f\tH(x)=%g" % (x, H)

Bu programın çıktısı aşağıdaki gibi olacaktır. Burada print ifadesinin bulunduğu satırı for döngüsü içinde yazdık, bundan dolayı her bir tekrarda yazdırma işlemi yapılıyor.


Terminal > ifelse3.py
x = -1.0        H(x)=0 
x = -0.8        H(x)=0
x = -0.6        H(x)=0
x = -0.4        H(x)=0
x = -0.2        H(x)=0
x =  0.0        H(x)=1
x =  0.2        H(x)=1
x =  0.4        H(x)=1
x =  0.6        H(x)=1
x =  0.8        H(x)=1

Yukarıda ele aldığımız Heaviside fonksiyonu matematikte yaygın olarak kullanılmasına rağmen bazı dezavantajları vardır, örneğin bu fonksiyon $x=0$ noktasında süreksizdir. Bazı uygulamalarda bu fonksiyon yerine $$ H_\epsilon(x)= \left\{ \begin{array}{ll} 0, & \quad x<-\epsilon\\ \frac{1}{2}+\frac{x}{2\epsilon}+\frac{1}{2\pi}\sin\left( \frac{\pi x}{\epsilon} \right), & \quad -\epsilon\leq x\leq\epsilon\\ 1, & \quad x>\epsilon \end{array} \right. $$ olarak tanımlanan $H_\epsilon$ fonksiyonu kullanılabilir. Bu fonksiyon yeterince küçük $\epsilon$ değerleri için Heaviside fonksiyonuna yakın davranır hem kendisi hem de türevi tüm reel eksende süreklidir. Böyle bir dallanmayı Python'da yapmak için iki koşullu yapı kullanabiliriz.


from math import sin, pi

x = 0.5
epsilon = 1E-12

if x < -epsilon:
    H = 0
else:
    if x <= epsilon:
        H = 0.5 + x/(2*epsilon) + 1.0/(2*pi)*sin(pi*x/epsilon)
    else:
        H = 1

print "x = %4.1f\tH(x)=%g" % (x, H)

Aşağıda Heaviside fonksiyonunun farklı epsilon değerleri için grafiklerini görebilirsiniz.

Çoklu Dallanmalar

Böyle çoklu dallanmalarla sık karşılaşıldığı için Pythpn'da bunlar için kısa bir yol vardır, bu da elif (else if) yapısıdır. Kullanımını aşağıdaki örnek üzerinde gözlemleyelim, bu örnek ile yukarıdaki program aynı şekilde çalışır.


from math import sin, pi

x = 0.5
epsilon = 1E-12

if x < -epsilon:
    H = 0
elif -epsilon <= x <= epsilon:
        H = 0.5 + x/(2*epsilon) + 1.0/(2*pi)*sin(pi*x/epsilon)
else:
    H = 1

print "x = %4.1f\tH(x)=%g" % (x, H)


Yukarıdaki program için de bir döngü kullanarak bir tablo yazdıarbiliriz, bunu aşağıdaki kodlarla sağlarız.


from math import sin, pi

epsilon = 1E-12
xlist = [-.1 + k*0.02 for k in range(10)]

for x in xlist:
    if x < -epsilon:
        H = 0
    elif -epsilon <= x <= epsilon:
        H = 0.5 + x/(2*epsilon) + 1.0/(2*pi)*sin(pi*x/epsilon)
    else:
        H = 1
    print "x = %4.1f\tH(x)=%g" % (x, H)

Bu kodlar aşağıdaki çıktıyı üretecektir. Görüleceği gibi $H_\epsilon$ fonksiyonu bire bir $H$ ile aynı değerler vermiyor, ama oldukça yakın bir davranıştadır.


Terminal > heaviside_eps3.py
x = -0.1        H(x)=0
x = -0.1        H(x)=0
x = -0.1        H(x)=0
x = -0.0        H(x)=0
x = -0.0        H(x)=0
x =  0.0        H(x)=0.5
x =  0.0        H(x)=1
x =  0.0        H(x)=1
x =  0.1        H(x)=1
x =  0.1        H(x)=1

Başka bir örnek olarak $$ N(x)= \left\{ \begin{array}{ll} 0, & \quad x<0\\ x^2\sin(x), & \quad 0\leq x<1\\ 3-x, & \quad 1\leq x<2\\ 0, & \quad x\geq 2 \end{array} \right. $$ fonksiyonu işlemini aşağıdaki dallanma örneği ile elde edebiliriz.


from math import sin, pi

x = pi/2

if x < 0:
    N = 0
elif 0 <= x < 1:
    N = x**2*sin(x)
elif 1 <= x <2:
    N = 3 - x
else:
    N = 0

print "x = %4.3f\tH(x)=%g" % (x, N)

Burada $(0,2]$ aralığı dışında fonksiyonun 0 değer aldığını kullanarak bu kodları biraz kısaltabiliriz.


from math import sin, pi

x = pi/2
N = 0

if 0 <= x < 1:
    N = x**2*sin(x)
elif 1 <= x <2:
    N = 3 - x

print "x = %4.3f\tH(x)=%g" % (x, N)

Bu iki programın da çıktısı aşağıdaki gibi olacaktır.


Terminal > python ifelse5.py
x = 1.571       H(x)=1.4292

Satır İçi Dallanma

Programlarda if-else bloklarını çok sık kullandığımıdan Python'da bunun tek satırlık bir kısa yolu vardır. H = (0 if x < 0 else 1) komutu H değişkenine Heaviside fonksiyonunun sonucu olan sayıyı atar.

xlist = [-1 + k*0.2 for k in range(10)]
for x in xlist:
    H = (0 if x < 0 else 1)
    print "x = %4.1f\tH(x)=%g" % (x, H)
Önceki Ders Notu:
2.2. For Döngüleri
Dersin Ana Sayfası:
Python ve Bilimsel Hesaplama
Sonraki Ders Notu:
3.1. Python Fonksiyonları