PROGRAMLAMA II BÖLÜM 2: Python Akış Kontrolü

⚠️ Bu içerik, Anadolu Üniversitesi AÖF Bilgisayar Programcılığı programındaki ilgili ders için kendi ders çalışma sürecimde hazırladığım, sınav odaklı kişisel ders notlarımdan oluşmaktadır. Sınava hazırlanan öğrencilere ek bir çalışma kaynağı sunmak amacıyla paylaşılmaktadır.

AKIŞ KONTROLÜ

Bir problemin çözümünde kullanılan sıralı ve mantıksal adımların tümüne algoritma adı verilir. Algoritmaların bir programlama dili ile hazırlanma zorunluluğu yoktur; ancak mutlaka bir başlangıcı ve bitişi olmalı, tüm ihtimalleri kapsamalı ve belirli bir adım sonunda sonlanmalıdır (sonsuz döngüde kalmamalıdır).

Algoritmaların dünya çapında standartlaştırılmış geometrik sembollerle görselleştirilmesine akış diyagramı (flowchart) denir. Programlama dillerindeki akış kontrol elemanları mantıksal olarak birbirine benzemekle birlikte dilden dile söz dizimi (syntax) farkları barındırır.

if…else Kontrolü

Program akışında belirli bir koşulun doğruluğuna göre karar vermek için if kontrol ifadesi kullanılır. Koşul doğru (True) ise ilgili blok çalıştırılır; aksi halde varsa else bloğuna geçilir. Çoklu koşul denetimlerinde ise else if yapısının kısaltması olan elif kullanılır.

  • Doğruluk Değerlendirmesi: Python, sıfır olmayan tüm sayısal değerleri True olarak kabul eder. Yalnızca 0 ve None değerleri mantıksal olarak False kabul edilir.
  • Girintileme Kuralı: if, elif ve else gövdeleri parantezlerle değil, doğrudan girinti (indentation) ile belirlenir. Girintisiz (if ile aynı girinti seviyesindeki) ilk satır ile blok sonlanır.
  • Blok Sınırı ve detay:
    • if Kullanımı:
      • Bir karar bloğu mutlaka 1 adet if ile başlamak zorundadır.
      • if olmadan elif veya else kullanılamaz.
      • Aynı girinti seviyesinde ikinci bir if yazılırsa, o artık ilk yapıdan bağımsız yeni bir karar bloğu başlatmış olur.
  • elif Kullanımı:
    • if satırından sonra, sınanmak istenen ek koşul sayısına bağlı olarak istendiği kadar (0 veya daha fazla) elif eklenebilir. Python tarafında teknik bir üst sınır yoktur.
  • else Kullanımı:
    • Karar bloğunun en sonunda yer alır ve kendinden önceki hiçbir koşul sağlanmadığında çalışır.
    • Tek bir yapı içinde en fazla 1 adet else bulunabilir.
    • else kullanımı zorunlu değil, opsiyoneldir; bir if bloğu hiç else yazılmadan da sorunsuz çalışır.

📌 Ek Bilgi: Python’da Mantıksal False (Falsy) Değerler:
Bu özetin hazırlandığı ders kitabında aşağıdaki ifadeler birebir yer almaktadır:

  • “… Ayrıca Python, sıfır olmayan değerleri True olarak yorumlar. None ve 0 değerleri False olarak yorumlanır.”
  • “Python, sıfır olmayan herhangi bir değeri Doğru (True) olarak yorumlar. None ve 0 değerleri ise Yanlış (False) olarak yorumlanır.”

Özetle ders kitabına göre None ve 0 değerleri dışında her değerin True olarak yorumlandığı aktarılmaktadır.
AÖF sınavlarında test soruları doğrudan kitap müfredatına dayandırıldığı için öncelikle e-kampüs üzerinden güncel ders kitabı kontrol edilmelidir. Eğer bilgi yukarıdakiyle aynı şekilde aktarılıyorsa sınavlarda sorulması halinde buna göre yanıt verilmelidir.

Doğrusunu öğrenmek adına Python’da mantıksal olarak False değerlendirilen tüm yapıları bilmekte fayda vardır. Gerçek bir Python ortamında çalışırken yalnızca 0 ve None değil, aşağıdaki yapıların tamamı mantıksal olarak False (falsy) kabul edilir:
– Sayısal Sıfırlar: 0 (int), 0.0 (float), 0j (complex).
– Boş Veri Yapıları: Boş metin (""), boş liste ([]), boş demet (()), boş sözlük ({}) ve boş küme (set()).
– Özel Değerler: False ve None.
Örnek: if []: print("A") kodunda liste boş ([]) olduğu için test ifadesi False sayılır ve ekrana çıktı verilmez.

# Çoklu if...elif...else mantığı
not_degeri = 85
if not_degeri < 50:
    print("Kaldı")
elif not_degeri < 70:
    print("Orta")
elif not_degeri <= 100:
    print("Başarılı")
else:
    print("Geçersiz Not")
    
# Ekran Çıktısı:
# Başarılı

Bir if...elif...else ifadesi başka bir if yapısının içine yerleştirildiğinde iç içe if (nested if) yapısı oluşur. İç içe geçme seviyesi tamamen girintiler vasıtasıyla ayırt edilir.

sayi = 0
if sayi >= 0:
    if sayi == 0:
        print("Sıfır")
    else:
        print("Pozitif")
else:
    print("Negatif")
# Ekran Çıktısı:
# Sıfır

for Döngüsü

Python’da for döngüsü; liste, demet, karakter dizisi gibi sıralı bir koleksiyonun ya da yinelenebilir (iterable) nesnelerin elemanları üzerinde ardışık geçiş yapmak için kullanılır. Bir dizi üzerindeki her bir tekrara geçiş (iterasyon) denir.

Döngü söz dizimi aşağıdaki gibidir;

for deger in liste:
	döngü gövdesi
  • for: Döngüyü başlatan anahtar kelime.
  • deger: Her yinelemede sıradaki elemanı tutan geçici değişken.
  • in: Üzerinde işlem yapılacak koleksiyondaki elemanları ayıran üyelik operatörü.
  • liste: Üzerinde gezinilen yinelenebilir veri kümesi.
  • İki nokta üst üste ":" : altındaki sekme ile belirtilmiş kod bloğunun çalıştırılma talimatını verir.
  • Döngü gövdesi : Tekrar edilerek yapılması istenen işlemlerin yazıldığı kod bloğudur.
# Listedeki tüm sayıların toplamını bulan Python kodu
# sayı listesi
sayılar = [11, 26, 20, 34, 42, 77, 55, 3, 4, 91]

# toplam değeri tutan değişken
toplam = 0

# liste üzerinde for döngüsü
for deger in sayılar:
  toplam += deger
print("Toplam", toplam)

# Ekran Çıktısı:
# Toplam: 363

range() Fonksiyonu

Belirli bir aralıkta sayı dizisi üretmek için yerleşik range() fonksiyonu kullanılır.

Kullanım KalıbıAnlamı / KuralıÜretilen Değer Aralığı
range(bitiş)0’dan başlar, bitiş değerine kadar gider.0 dahil, bitiş hariçtir.
range(başlangıç, bitiş)Belirtilen başlangıçtan bitişe kadar birer artar.başlangıç dahil, bitiş hariçtir.
range(başlangıç, bitiş, adım)Belirtilen adım miktarına göre artarak/azalarak ilerler.adım verilmezse varsayılan değer 1‘dir.

📌 Ek Bilgi: range() fonksiyonu tüm sayıları aynı anda üretip bellekte depolamaz; verimlilik adına yalnızca başlangıç, bitiş ve adım bilgisini saklayarak her adımda sıradaki sayıyı üretir. Üretilen elemanların listesini doğrudan görmek için list(range(...)) şeklinde açık dönüşüm zorlanmalıdır.

print(range(5))
print(list(range(5)))
print(list(range(2, 9, 3)))

# Ekran Çıktısı:
# range(0, 5)
# [0, 1, 2, 3, 4]
# [2, 5, 8]

range fonksiyonu, in, len ve __getitem__ işlemlerini de desteklemektedir.

# İndis kullanarak bir liste üzerinde işlem yapan kod örneği
ortamlar = [ "TamWeblik", "E-Kampüs", "Ders Kitapları" ]

# liste üzerinde indis kullanarak ilerleme
for i in range( len( ortamlar ) ):
  print( "Sınavlarıma", ortamlar[i], "ile hazırlanıyorum." )
  
# Ekran Çıktısı:
# Sınavlarıma TamWeblik ile hazırlanıyorum.
# Sınavlarıma E-Kampüs ile hazırlanıyorum.
# Sınavlarıma Ders Kitapları ile hazırlanıyorum.

for…else Döngüsü

Python’a özgü yapılardan biri olan for...else bloğunda, else kısmı döngüdeki tüm elemanlar tükenip döngü doğal yoldan tamamlandığında tam bir kez çalıştırılır.

# Doğal tamamlanan döngüde else çalışır
for i in range(1, 3):
    print(i)
else:
    print("Döngü bitti.")
    
# Ekran Çıktısı:
# 1
# 2
# Döngü bitti.

Eğer döngü gövdesinden break anahtar kelimesiyle zorla çıkılırsa, else bloğu atlanır ve kesinlikle çalıştırılmaz.

# break ile kesilen döngüde else ÇALIŞMAZ
for i in range(1, 3):
    if i == 2:
        break
    print(i)
else:
    print("Döngü tamamlandı.")
    
# Ekran Çıktısı:
# 1

while Döngüsü

while döngüsü, test ifadesi mantıksal olarak True olduğu müddetçe gövdesindeki kod bloğunu yineleyen akış elemanıdır. Genellikle işlem tekrar sayısının önceden kesin olarak bilinmediği durumlarda tercih edilir.

sayac = 1
while sayac <= 3:
    print("Adım:", sayac)
    sayac += 1
# Ekran Çıktısı:
# Adım: 1
# Adım: 2
# Adım: 3

⚠️ Dikkat: while gövdesindeki sayaç veya kontrol değişkeni artırılmaz/güncellenmezse test koşulu sürekli True kalır ve kod sonsuz döngüye (infinite loop) girer.

while…else Döngüsü

Tıpkı for döngüsünde olduğu gibi, while döngüsünün test ifadesi False değerini alıp döngü olağan şekilde bittiğinde isteğe bağlı eklenen else bloğu yürütülür. Döngü bir break deyimi ile kırılırsa else kısmı atlanır.

sayi = 0
while sayi < 2:
    print(sayi)
    sayi += 1
else:
    print("while bitti")
# Ekran Çıktısı:
# 0
# 1
# while bitti

break ve continue Deyimleri

Normal döngü akışını koşula bağlı olarak değiştirmek için iki özel atlama deyimi kullanılır:

  1. break Deyimi: İçinde bulunduğu (bağlı olduğu) döngüyü anında sonlandırır. Programın kontrolü, döngü bloğunun bittiği yere (döngüyle aynı girinti seviyesinde olan ilk satıra) geçer. İç içe döngü yapılarında break, tüm yapıyı değil, yalnızca yazıldığı (ait olduğu) döngüyü kırar; dış sarmaldaki döngüler çalışmaya devam eder.
  2. continue Deyimi: Döngüyü tamamen kırmaz. Kendisinden sonra gelen satırları çalıştırmadan es geçer ve döngünün başına dönerek bir sonraki iterasyonla (sıradaki elemanla) devam eder.
# break örneği
for harf in "AÖF":
    if harf == "Ö":
        break
    print(harf)
print("Son")
# Ekran Çıktısı:
# A
# Son
# continue örneği
for sayi in range(7):
    if sayi % 2 == 0:
        continue
    print(sayi)
# Ekran Çıktısı:
# 1
# 3
# 5

pass Deyimi

Türkçe karşılığı “geçmek, sırasını atlatmak” anlamına gelen pass, kod bloklarında hiçbir işlem yapmayan (yer tutucu / placeholder) bir deyimdir.

  • Yorum Satırından Farkı: Python yorumlayıcısı # ile yazılan yorumları tamamen yok sayarken; pass deyimini bir ifade olarak işleme alır ancak hiçbir eylem gerçekleştirmez.
  • Kullanım Amacı: Fonksiyon, sınıf veya döngü gövdeleri boş bırakıldığında Python söz dizimi hatası (IndentationError) verir. Henüz içi doldurulmamış yapıların hata vermesini engellemek için pass eklenir.
for x in:
    pass # İleride kod yazılacak, hata vermeyi önler

def hesapla():
    pass

class Ornek:
    pass

switch-case Deyimi

C#, Java ve C++ gibi dillerde çoklu dallanmalar için kullanılan switch-case yapısı, ders kitabında anlatılan Python sürümünde bir deyim olarak yer almamaktadır. Python’da bu kontrol mekanizması sözlük eşleşmesi (dictionary mapping) ve sözlüklerin .get() metodu kullanılarak çözümlenir.

def gun_sec(secim):
    gunler = {
        1: "Pazartesi",
        2: "Salı",
        3: "Çarşamba"
    }
    return gunler.get(secim, "Geçersiz Gün")

print(gun_sec(2))
print(gun_sec(9))
# Ekran Çıktısı:
# Salı
# Geçersiz Gün

📌 Ek Bilgi: Güncel Python’da match-case Yeniliği
Yazılımcılar arasında yıllarca süren “Python’da neden switch-case yok” isyanlarından sonra, Ekim 2021’de çıkan Python 3.10 sürümü ile birlikte dile match...case adında “Yapısal Desen Eşleştirme” özelliği eklenmiştir. Bu özellik, C#’ta bulunan switch...case yapısının aynısı, hatta veri tiplerini ve listeleri bile eşleştirebilme yeteneği ile daha da güçlüsüdür.


🎯 Sınavlık Hap Bilgiler:

  • Algoritma sonlu adımlardan oluşmalıdır; sonsuz döngü içeren bir yapı algoritma sayılamaz.
  • Algoritmaların evrensel sembollerle şematik olarak gösterimine akış diyagramı denir.
  • Python’da programlama dilinin yazım kuralları söz dizimi (syntax) olarak ifade edilir.
  • Python’da 0 ve None dışındaki tüm negatif ve pozitif sayılar mantıksal olarak True kabul edilir.
  • Bir if yapısında yalnızca bir tane else bulunabilir; elif sayısı ise sınırsızdır.
  • range(başlangıç, bitiş, adım) fonksiyonunda bitiş değeri aralığa asla dahil edilmez.
  • for...else ve while...else yapılarında döngü gövdesi break ile kesilirse else bloğu kesinlikle çalışmaz.
  • break döngüyü tamamen sonlandırırken; continue altındaki satırları atlayıp bir sonraki döngü adımına geçer.
  • Python’da C# ve Java tarzı doğrudan bir switch-case deyimi yoktur; yerine sözlük eşleştirmesi (dictionary mapping) kullanılır.
  • Boş bırakılan fonksiyon, sınıf veya döngülerin hata vermesini önleyen yer tutucu deyim pass deyimidir.

AD VE AD ALANI (NAMESPACE)

Ad/İsim

Python’da her şey bir nesnedir (object). Ad (veya tanımlayıcı), bellekte saklanan bu nesnelere erişmek için kullanılan bir etikettir. Örneğin sayi = 10 ifadesinde 10 bellekte depolanan tamsayı nesnesidir; sayi ise o nesneye işaret eden addır.

Nesnelerin RAM belleğindeki benzersiz fiziksel adresine erişmek için id() fonksiyonu kullanılır.

  • Bir nesneye yeni bir değişken bağlandığında (örneğin b = 20 ve a = 20), Python bellekte ikinci bir 20 nesnesi oluşturmaz; her iki adı da aynı bellek adresine yönlendirir.
  • Bir değişkenin değeri değiştirildiğinde (örneğin a = a + 10), eski nesne güncellenmez; bellekte 30 değeriyle yeni bir nesne oluşturulur ve a adı bu yeni adrese bağlanır.
  • Fonksiyonlar da birer nesne olduğu için başka bir değişken adına bağlanabilir ve bu ad üzerinden çağrılabilir.
a = 20
b = 20
print(id(a) == id(b)) # İkisi de aynı 20 nesnesine bakar
a = a + 10
print(id(a) == id(b)) # a artık 30 nesnesine bakar, adres değişti
# Ekran Çıktısı:
# True
# False
# Fonksiyonların ad ile bağlanması
def selam():
    print("Merhaba")

yeni_ad = selam # selam fonksiyonu yeni_ad değişkenine atandı
yeni_ad()
# Ekran Çıktısı:
# Merhaba

Ad Alanı (Namespace)

Ad alanı (namespace); adların nesnelerle eşleştirildiği, aynı amaç doğrultusunda oluşturulmuş sınıf, fonksiyon ve değişkenleri bir çatı altında toplayan yapıdır.

  • Yalıtım: Farklı ad alanları tamamen birbirinden yalıtılmıştır. Bu sayede farklı modül veya fonksiyonlarda aynı isimli değişkenlerin çakışması engellenir.
  • Ad Alanı Türleri:
    1. Öntanımlı / Yerleşik (Built-in) Ad Alanı: Python yorumlayıcısı açıldığında otomatik yüklenir (print(), id(), len() gibi yerleşik fonksiyonları barındırır) ve oturum açık kaldığı sürece yaşar.
    2. Global (Genel) Ad Alanı: Her modülün veya ana dosyanın kendine ait bağımsız alanıdır.
    3. Yerel (Local) Ad Alanı: Bir fonksiyon ya da metot çağrıldığında o fonksiyona özel olarak dinamik oluşturulur; fonksiyonun çalışması tamamlandığında bellekten temizlenir.

Python Değişken Kapsamı (Scope)

Kapsam (Scope), program içinde tanımlanmış bir değişkenin herhangi bir önek (prefix) kullanılmadan doğrudan erişilebilir olduğu kod bölgesidir.

Programın herhangi bir anında iç içe çalışan en az üç kapsam düzeyi bulunur:

  1. Mevcut fonksiyonun yerel (local) kapsamı.
  2. Modüle ait global (genel) kapsam.
  3. En dışta yerleşik fonksiyonları kapsayan öntanımlı (built-in) kapsam.

İsim Arama Sırası ve Atama Kuralı

Bir fonksiyon içerisinde değişkene başvurulduğunda Python arama işlemini şu hiyerarşik sırayla yürütür: Yerel (Local) ➔ Global (Genel) ➔ Öntanımlı (Built-in)

  • Okuma vs. Değer Atama: Bir iç fonksiyondan dıştaki (global veya çevreleyen) değişkenlerin değerleri serbestçe okunabilir. Ancak dıştaki bir değişkene açık bildirim olmaksızın yeni bir değer atanmaya çalışılırsa, dış değişken değişmez; fonksiyona ait aynı isimde yeni bir yerel değişken oluşturulur.
  • global Anahtar Kelimesi: Fonksiyon içerisinden modül düzeyindeki global bir değişkenin değerini güncellemek veya yeniden bağlamak için değişken başına global ifadesi eklenmelidir.
# Yerel vs Global Ayrımı (global kullanılmadığında)
a = 10
def test():
    a = 20 # Yeni yerel değişken oluşturulur, dıştaki a değişmez
    print("İç a:", a)

test()
print("Dış a:", a)
# Ekran Çıktısı:
# İç a: 20
# Dış a: 10
# global anahtar sözcüğü ile modül değişkenini değiştirme
a = 10
def guncelle():
    global a
    a = 30 # Global a değişkeni kalıcı olarak güncellenir

guncelle()
print("Yeni a:", a)
# Ekran Çıktısı:
# Yeni a: 30

🎯 Sınavlık Hap Bilgiler:

  • Python’da değişkenler doğrudan değer tutmaz; değerlerin bellekteki adreslerine işaret eden birer etikettir / addır.
  • Ad, isim diye bahsedilen kavramlar, değişkenler için kullanılan kavramlardır. Değişkenlere kurallar çerçevesinde istenilen isim verilebilir. Bu isimler, hafızada tutulan verinin adresini işaret eder.
  • Nesnelerin RAM adresini veren fonksiyon id() fonksiyonudur ve sayısal tamsayı değer döndürür.
  • İsim arama önceliği sırasıyla: Yerel (Local) (\rightarrow) Global (\rightarrow) Öntanımlı (Built-in) şeklindedir.
  • Bir fonksiyon içinde dıştaki değişken okunabilir; ancak global ifadesi yazılmadan değer atanırsa yeni bir yerel değişken oluşur, dış değişken etkilenmez.
  • Global bir değişkene fonksiyon içinden değer atayıp kalıcı olarak değiştirmek için global anahtar kelimesi zorunludur.
  • İşlev, metot ve fonksiyon aynı kavramı ifade etmek için kullanılan farklı isimlerdir.

🎯 Sınavlarda Sorulma Olasılığı Yüksek Hap Bilgiler❗ (Genel Ünite Tekrarı)

  • Sıfır Dışı Değerlerin Boolean Karşılığı: Mantıksal testlerde yalnızca 0 ve None değerleri False üretir; eksi veya artı diğer tüm sayılar (-5, 3.14 vb.) True olarak işlenir.
  • range() Bitiş Sınırı Hariçtir: range(x, y) fonksiyonu x değerinden başlar fakat y değerine ulaşmadan (y - 1 değerinde) durur; üretilen nesne bellekte tüm elemanları peşin saklamaz.
  • Döngü-else Yapısının Kırılması: Hem for...else hem de while...else bloklarında döngü gövdesi break deyimi ile kesilirse else bloğu çalıştırılmaz.
  • Atlama Deyimleri: break döngüyü tamamen bitirip döngü dışına çıkarken; continue döngüyü bitirmez, o adımdaki kalan satırları atlayıp bir sonraki yinelemeye geçer.
  • Boş Blok Yer Tutucusu: Fonksiyon, sınıf veya döngü bloklarında söz dizimi hatasını engelleyen ve hiçbir işlem yapmayan anahtar kelime pass sözcüğüdür.
  • Python’da switch-case Yokluğu: Python dilinde yerleşik bir switch-case deyimi yer almaz; bunun yerine sözlük eşleştirmesi (dictionary mapping) ve .get() metodu kullanılır.
  • Bellek Adresi Tespiti: Bir nesnenin RAM adresini temsil eden benzersiz tamsayı kimliği id() fonksiyonu ile alınır.
  • Kapsam Arama Hiyerarşisi: Tanımlayıcılar sırasıyla önce Yerel (Local), bulunamazsa Global, en son Yerleşik (Built-in) ad alanında taranır.
  • Dış Kapsama Yazma Yetkisi: Fonksiyon içerisinden modül seviyesindeki bir değişkene yeni değer atayabilmek için değişkenin global anahtar sözcüğü ile bildirilmesi zorunludur.

📚 Kaynakça ve Kaynak Güncelliği: Bu ders notu, Anadolu Üniversitesi Açıköğretim Fakültesi Yayınları’na ait Programlama II ders kitabının Mayıs 2022 Baskısı, (AÖF Yayın No: 3049, E-ISBN: 978-975-06-4315-6) temel alınarak kendi ifadelerimle hazırlanmıştır. Konu bütünlüğünü korumak amacıyla temel kavram ve tanımların anlamı ana kaynağa bağlı kalınarak aktarılmış olup, içerik sınav odaklı kişisel ders notları biçiminde düzenlenmiştir. Bu notlar belirtilen baskıyı esas almakta olup kitabın daha sonraki baskılarını, Anadolum e-Kampüs üzerinden yapılan güncellemeleri veya müfredat değişikliklerini yansıtmayabilir. Sınava hazırlanırken Anadolu Üniversitesi tarafından sunulan güncel ders materyalini kontrol etmeniz önerilir. Kitabın basılı sürümüne Anadolu Üniversitesi Kitap Satış Sistemi, güncel dijital ders materyallerine ise Anadolum e-Kampüs üzerinden ulaşabilirsiniz. Ayrıca bu içerik, Anadolu Üniversitesi tarafından hazırlanmış veya onaylanmış resmî bir ders materyali değildir; kişisel çalışma notları niteliğindedir.


Paylaşmak güzeldir...