BİL203U-PROGRAMLAMA II
Ünite 2: Akış Kontrolü
Giriş
Bir problemin çözümünde kullanılan sıralı ve mantıksal adımların tümüne algoritma adı verilmektedir. Algoritmaların görselleştirilmesinde akış diyagramları kullanılmaktadır. Algoritma adımları arasındaki tüm mantıksal ilişkiler gösterilmektedir. Böylece problemin çözümü çeşitli akış kontrol öğeleri vasıtasıyla herkesin anlayabileceği şekilde oluşturulmaktadır. Algoritmalarda kullanılan akış kontrol elemanları, her programlama dilinde birbirine benzer şekildedir. Aralarında sadece sözdizimi/syntax olarak küçük farklar olabilmektedir. Akış diyagramlarındaki ilişkilere göre, dile özgü kontrol elemanları ile program kodları hazırlanır.
Akış Kontrolü
Algoritmanın tüm dünya tarafından kabul edilmiş çeşitli semboller ile gösterilmesine Akış Diyagramı adı verilmektedir. Akış diyagramları hazırlanırken kullanılması gereken kontrol elemanları vardır.
if…else Kontrolü
“if” ifadesi bir koşulu kontrol ederek karar vermek için kullanılır. Eğer koşul doğruysa, bir ifade bloğu çalıştırılır (if bloğu denir), aksi takdirde başka bir ifade bloğunu işleriz (else bloğu olarak adlandırılır). Kontrol kodunun diğer kontrol ifadeleri olan “elif” ve “else” ise isteğe bağlı olarak akışa uygun şekilde kullanılabilir.
“if” kontrolünde, program test ifadesini değerlendirir ve yalnızca test ifadesi True (doğru) ise ifadeyi/ifadeleri yürütür. Test ifadesi False (yanlış) ise, ifade(ler) yürütülmez. Ayrıca Python, sıfır olmayan değerleri True olarak yorumlar. None ve 0 değerleri False olarak yorumlanır. Python’da diğer çoğu dildeki gibi parantez kullanılmadığı için, if ifadesinin gövdesi girinti ile belirtilir. Kontrol bloğunun gövdesi bir girinti ile başlar ve girintisiz ilk satır bu bloğun sonlandığını gösterir.
if..else ifadesi, test ifadesini değerlendirir ve yalnızca test koşulu True (doğru) olduğunda if bloğu yürütür. Koşul False (yanlış) ise, else bloğu yürütülür. Aynı şekilde if ve else ifadelerinden sonra yapılan girintiler, kod bloklarını ayırmak için kullanılır.
Elif, else if’nin kısaltmasıdır. Birden fazla ifadenin kontrol edilmesini sağlar. if koşulu yanlış ise, bir sonraki elif bloğunun durumunu kontrol etmektedir. Tüm koşullar False (yanlış) ise, else öğesinin gövdesi yürütülür. Birkaç if...elif...else bloğundan sadece biri koşula göre yürütülür. if bloğunda yalnızca bir else bloğu olabilir. Ancak birden fazla elif bloğuna sahip olabilir.
İç İçe if İfadeleri
Başka bir if...elif...else ifadesinin içinde bir if...elif...else ifadesine sahip olabiliriz. Bu ifadeler herhangi bir sayıda birbirinin içine yerleştirilebilir. Girinti, iç içe geçme düzeyini anlamanın tek yoludur. Kafa karıştırıcı olabilirler, bu nedenle gerekmedikçe kullanılmamalıdır.
for Döngüsü
Döngüler, içerdikleri kod bloklarının birden fazla sayıda çalışmasını sağlayan yapılardır. Python’daki for döngüsü, bir dizi (list, tuple, string) veya diğer yinelenebilir/tekrarlanabilir nesneler üzerinde yineleme yapmak için kullanılır. Bir dizi üzerindeki her tekrara geçiş (iterasyon) denir.
range() Fonksiyonu
range() fonksiyonu bir sayı dizisi oluşturmak için kullanılmaktadır. range(10), 0’dan 9’a (10 sayı) kadar sayı oluşturmak için kullanılmaktadır. Bu fonksiyona parametre olarak verilen değer dahil edilmez, bu değer durma noktası olarak kabul edilir. Başlangıç, bitiş ve adım değerleri de range (başlangıç, bitiş, adım) olarak tanımlanmaktadır. Adım değeri verilmezse varsayılan olarak 1 alınmaktadır. Range fonksiyonu ile bir nesne oluşturduğumuzda “içerdiği” her sayıyı üretmez. Yani bu fonksiyon, verimsiz olacağı için tüm değerleri bellekte saklamaz. Böylece başlangıç, bitiş, adım boyutunu hatırlar ve işlem yaparken bir sonraki sayıyı üretir. Bu fonksiyondaki tüm öğelerin çıktısını almaya zorlamak için list() işlevini kullanabiliriz. Ayrıca range fonksiyonu, in, len ve __getitem__ işlemlerini de desteklemektedir.
for…else Döngüsü
Bir for döngüsüne, isteğe bağlı olarak bir else bloğu eklenebilir. if karşılaştırma deyiminden farklı olarak, for döngüsündeki else bloğu, for döngüsünde kullanılan dizideki elemanlar bittiğinde çalıştırılır. Herhangi bir şekilde for döngüsünde kesinti olmazsa else bloğu çalıştırılır. Bir for döngüsünü durdurmak, döngüden çıkmak için break anahtar kelimesi kullanılabilir. Bu durumda else bloğu göz ardı edilerek çalıştırılmaz.
while Döngüsü
Python’daki while döngüsü, test ifadesi (koşul) doğru olduğu sürece bir kod bloğu içindeki işlemleri tekrar etmek için kullanılır. Döngü gövdesini çalıştırmadan önce koşulu test eder. Bu döngü genellikle önceden kaç kez işlem tekrarı yapılacağı bilinmeyen durumlarda kullanılır.
while kod bloğunda yapılan işlemler, test ifadesinden yanlış değeri alınana kadar tekrar eder. Diğer operatörlerde olduğu gibi, while döngüsünün gövdesi girinti ile belirlenir. Gövde girinti ile başlar ve girintisiz ilk satır bitişi gösterir.
while…else Döngüsü
for döngüsünde olduğu gibi, while döngüsünde de isteğe bağlı bir else bloğu kullanılabilir. while döngüsündeki koşul Yanlış (False) olarak değerlendirilirse, else kısmı yürütülür. Ayrıca while döngüsü bir break deyimi ile sonlandırılabilir. Bu gibi durumlarda, else kısmı göz ardı edilir. Bu nedenle, bir while döngüsünün else kısmı, while bloğundaki kodda herhangi bir kesinti olmazsa ve while test koşulu yanlış (False) ise, yani while döngüsü doğal şekilde tamamlandıysa çalışacaktır.
break ve continue Deyimleri
Python’da break ve continue ifadeleri normal bir döngünün akışını değiştirmek için kullanılmaktadır. Döngüler, test ifadesi yanlış olana kadar bir kod bloğunu tekrar tekrar çalıştırır. Ancak, bazen mevcut yinelemeyi veya tüm döngüyü test ifadesini kontrol etmeden sonlandırmak zorunda olduğumuz durumlar olabilir. Böyle durumlarda break ve continue ifadeleri kullanılır.
break Deyimi
break ifadesi, onu içeren döngüyü sonlandırmak için kullanılır. Programın çalışma sırası, döngünün gövdesinden hemen sonraki ifadeye geçer. break ifadesi iç içe bir döngü içinde ise (döngü başka bir döngü içinde ise), break ifadesi en içteki döngüyü sonlandıracaktır.
continue Deyimi
Türkçe karşılığı devam anlamına gelen continue deyimi, bir döngü içindeyken kendisinden sonraki kodları çalıştırmadan, döngünün başına gelerek işleme bir sonraki eleman ile devam edilmesini sağlar. Yani break deyimindeki gibi döngü sonlandırılmaz, ancak bir sonraki döngü elemanı ile devam eder.
pass Deyimi
Türkçe karşılığı geçmek, sırasını atlatmak anlamına gelen pass deyimi, kodlamada da anlamına uygun şekilde kullanılmaktadır. Kod içinde kullanıldığında görmezden gel, hiçbir şey yapma gibi bir görev üstlenir. Python’da bir yorum ve pass deyimi arasındaki farkı, yorumlayıcının bir yorumu tamamen yok sayarken, pass deyimini yok saymamasıdır diyebiliriz. Pass deyimi genellikle bir işlevi olmaması gereken fakat sözdizimi olarak bir ifade eklenmesi gereken durumlarda kullanılır.
switch-case Deyimi
Eğer kod içerisinde bir ifade için yapılması gereken kontrol işlemleri sayıca fazla ise, if..else blokları yerine, C#, Java ve JavaScript gibi programlama dillerindeki switch deyimi kullanılabilir. Fakat diğer dillerin aksine, Python dilinde switch-case ifadesi bulunmamaktadır. Bu durumu aşmak için sözlük eşleşmesi (dictionary mapping) kullanılmaktadır.
Ad ve Ad Alanı (Namespace)
Ad/İsim
Python’da her şey bir nesnedir. Ad (tanımlayıcı olarak da adlandırılır) nesnelere verilen bir isimdir. Ad, temel alınan nesneye erişmenin bir yoludur. Örneğin, sayi = 10 atamasını yaptığımızda, 10 bellekte depolanan bir nesnedir ve “sayi”, onu ilişkilendirdiğimiz isimdir. Python’un hazır fonksiyonlarından id() aracılığıyla bazı nesnelerin RAM’deki adresini alabiliriz.
Ad Alanı (Namespace)
Ad alanı, aynı amaç için oluşturulmuş sınıflar, fonksiyonlar ve özellikleri bir çatı altında toplayan yapıya verilen isimdir. Namespace içerisine birbiri ile alakalı sınıf ve fonksiyonların konulmasına dikkat edilmesi gerekir.
Böylece aynı namespace içinde toplanan fonksiyonlar, ihtiyaç duyulan noktada koda eklenerek daha kolay yönetilebilir kod yazmada yardımcı olmaktadır.
Farklı ad alanları belirli bir zamanda bir arada bulunabilir ancak birbirinden tamamen yalıtılmış şekildedirler. Yani ad çakışmalarının olmaması sağlanmaktadır. Python yorumlayıcısını başlattığımızda tüm yerleşik, yani Python içerisinde ön tanımlı olarak gelen adları içeren bir ad alanı oluşturulur ve yorumlayıcı çalıştığı sürece varlığını devam ettirir. Böylece id(), print() vb. gibi yerleşik işlevler programın herhangi bir bölümünden her zaman kullanılabilir şekilde bulunmaktadır. Her modül kendi global ve yalıtılmış ad alanını oluşturmaktadır. Böylece farklı modüllerde bulunabilecek aynı isim çakışmasının önüne geçilmektedir. Modüllerin çeşitli işlevleri ve sınıfları olabilir. Bir işlev çağrıldığında, içinde tanımlanan tüm adlara sahip yerel bir ad alanı oluşturulur. Sınıflarda da benzer bir durum vardır.
Python Değişken Kapsamı (Scope)
Program içinde tanımlanmış bir değişkenin erişilebilir olduğu alan için kullanılan bir kavramdır. Tanımlanmış çeşitli ad alanları olmasına rağmen, programın her bölümünden hepsine erişilemeyebilir. Bu durumda kapsam (scope) kavramı devreye girmektedir. Kapsam, bir programın herhangi bir önek olmadan bir ad alanına doğrudan erişilebildiği kısımdır. Herhangi bir anda, en az üç iç içe kapsam vardır.
1. Yerel adlara sahip mevcut fonksiyonun kapsamı 2. Global isimlere sahip modülün kapsamı 3. Yerleşik/Öntanımlı adlara sahip en dıştaki kapsam
Bir fonksiyon içinde bir değişkene başvuru yapıldığında, ilk önce yerel ad alanında, ardından global ad alanında ve son olarak yerleşik ad alanında aranır. Başka bir fonksiyonun içinde bir fonksiyon varsa, yerel kapsamın içine yeni bir kapsam yerleştirilir.