Programlamanın temel taşlarından biri, belirli koşullara göre farklı kod bloklarını çalıştırabilme yeteneğidir. Python'da bu işlem if, elif (else if'in kısaltması) ve else anahtar kelimeleriyle yapılır. Bu yapılar, programınızın karar vermesini ve dinamik olarak farklı yollar izlemesini sağlar. Örneğin, bir kullanıcının yaşını kontrol ederek belirli bir içeriğe erişip erişemeyeceğine karar verebilirsiniz.
En temel koşullu ifade if'dir. Bir if bloğu, yanındaki koşul doğru (True) olduğunda çalışır. Koşul, genellikle karşılaştırma operatörleri (==, !=, <, >, <=, >=) kullanılarak oluşturulur. Eğer if koşulu doğru değilse, program bir sonraki elif veya else bloğunu kontrol eder.
elif, ilk if koşulu yanlış olduğunda kontrol edilecek yeni bir koşul sunar. İstediğiniz kadar elif bloğu kullanabilirsiniz. Program, doğru olan ilk if veya elif bloğunu çalıştırır ve geri kalanını atlar. Eğer hiçbir if veya elif koşulu doğru değilse, en sonda bulunan isteğe bağlı else bloğu çalışır. else, kendisinden önceki tüm koşulların yanlış olması durumunda devreye giren bir "varsayılan" durumdur.
Koşulları birleştirerek daha karmaşık mantıklar da oluşturabilirsiniz. Bunun için and (ve) ve or (veya) mantıksal operatörleri kullanılır. and ile bağlanan iki koşulun da doğru olması gerekirken, or ile bağlanan koşullardan en az birinin doğru olması yeterlidir. Bu yapılar sayesinde programlarınız çok daha akıllı ve esnek hale gelir.
# Not Değerlendirme Sistemi
puan = 85
if puan >= 90:
print("Notunuz: A")
elif puan >= 80:
print("Notunuz: B")
elif puan >= 70:
print("Notunuz: C")
elif puan >= 60:
print("Notunuz: D")
else:
print("Notunuz: F (Kaldınız)")
Soru: Bir öğrencinin puanı 75 ise yukarıdaki kodun çıktısı ne olur?
Programlamada sıkça aynı veya benzer işlemleri tekrar tekrar yapmamız gerekir. Bu tür tekrarlı görevleri manuel olarak yazmak yerine, döngüleri kullanırız. Python'da iki temel döngü türü vardır: for ve while. Döngüler, kodumuzu daha kısa, okunaklı ve verimli hale getirir.
for döngüsü, bir dizi (liste, demet, string vb.) veya bir aralıktaki her bir eleman için belirli bir kod bloğunu çalıştırır. Kaç kez tekrar edeceğini genellikle baştan biliriz. Örneğin, bir listedeki tüm isimleri ekrana yazdırmak veya 1'den 100'e kadar olan sayıları toplamak için for döngüsü idealdir. Sıkça range() fonksiyonu ile birlikte kullanılır; range(5), 0'dan 4'e kadar olan sayıları üreten bir yapı oluşturur.
while döngüsü ise, belirli bir koşul doğru (True) olduğu sürece çalışmaya devam eder. Tekrar sayısı baştan belli değilse ve döngünün ne zaman duracağı bir koşula bağlıysa while kullanılır. Örneğin, kullanıcı doğru şifreyi girene kadar şifre sormaya devam eden bir programda while döngüsü mantıklıdır. Ancak dikkatli olunmalıdır; döngü koşulu bir noktada yanlış (False) olmazsa, program "sonsuz döngü"ye girer ve kilitlenir.
Bazen bir döngünün normal akışını kontrol etmek isteyebiliriz. Bunun için break ve continue ifadeleri kullanılır. break, içinde bulunduğu döngüyü anında sonlandırır ve program döngüden sonraki koddan devam eder. continue ise döngünün mevcut adımını atlar ve bir sonraki adıma geçer. Bu iki ifade, döngülerimize daha fazla esneklik katar.
# 'for' döngüsü ile listedeki meyveleri yazdırma
meyveler = ["elma", "muz", "çilek"]
print("Meyveler:")
for meyve in meyveler:
print(f"- {meyve}")
# 'while' döngüsü ile 1'den 5'e kadar sayma
sayac = 1
print("\nSayılar:")
while sayac <= 5:
print(sayac)
sayac += 1 # sayacı artırmazsak sonsuz döngü olur!
Soru: Belirli bir koşul doğru olduğu sürece çalışan ve tekrar sayısı önceden bilinmeyen durumlar için en uygun döngü hangisidir?
Büyük programlar yazarken, aynı kod parçalarını birden çok yerde kullanma ihtiyacı duyarız. Bu kodları her seferinde kopyalayıp yapıştırmak yerine, onları bir "fonksiyon" içine paketleyebiliriz. Fonksiyonlar, belirli bir görevi yerine getiren, yeniden kullanılabilir kod bloklarıdır. Kod tekrarını önler, programı daha modüler ve okunabilir hale getirirler ve hata ayıklamayı kolaylaştırırlar.
Python'da bir fonksiyon tanımlamak için def anahtar kelimesi kullanılır. Ardından fonksiyona bir isim verilir ve parantez `()` açılıp kapatılır. Fonksiyonun yapacağı işlemler, bu satırın altındaki girintili blokta yer alır. Örneğin, kullanıcıyı selamlayan basit bir fonksiyon yazabiliriz. Bu fonksiyonu daha sonra programın istediğimiz yerinde adını yazarak "çağırabiliriz".
Fonksiyonlar dışarıdan bilgi alabilirler. Bu bilgilere "parametre" denir ve fonksiyon tanımındaki parantezlerin içine yazılırlar. Fonksiyonu çağırırken bu parametrelere karşılık gelen değerlere ise "argüman" denir. Bu sayede fonksiyonlar daha dinamik ve esnek hale gelir. Örneğin, iki sayıyı toplayan bir fonksiyon, hangi sayıları toplayacağını parametre olarak alabilir.
Fonksiyonlar sadece işlem yapmakla kalmaz, aynı zamanda bir sonuç da üretebilirler. Bir fonksiyondan bir değer "döndürmek" için return ifadesi kullanılır. return, fonksiyonun çalışmasını sonlandırır ve belirttiğimiz değeri, fonksiyonun çağrıldığı yere geri gönderir. Bu dönen değer, bir değişkene atanabilir veya başka bir işlemde kullanılabilir. Bu, fonksiyonların programın geri kalanıyla etkileşime girmesini sağlar.
# İki sayıyı toplayan bir fonksiyon tanımlama
def topla(sayi1, sayi2):
"""Bu fonksiyon, verilen iki sayıyı toplar ve sonucu döndürür."""
sonuc = sayi1 + sayi2
return sonuc
# Fonksiyonu çağırma ve sonucunu bir değişkene atama
toplam = topla(15, 27)
print(f"15 ve 27'nin toplamı: {toplam}")
# Fonksiyonu farklı argümanlarla tekrar çağırma
print(f"100 ve 50'nin toplamı: {topla(100, 50)}")
Soru: Python'da bir fonksiyon tanımlamak için kullanılan anahtar kelime hangisidir?
Programlarımızda genellikle tek bir değer yerine, birbiriyle ilişkili birden çok değeri bir arada tutmamız gerekir. İşte bu noktada veri yapıları devreye girer. Python'ın en temel ve en çok kullanılan veri yapılarından ikisi listeler (lists) ve demetlerdir (tuples). Her ikisi de sıralı bir veri koleksiyonu saklamak için kullanılır, ancak aralarında önemli bir fark vardır.
Listeler, köşeli parantez [] ile oluşturulur ve içindeki elemanlar virgülle ayrılır. Listelerin en önemli özelliği "değiştirilebilir" (mutable) olmalarıdır. Bu, liste oluşturulduktan sonra elemanlarını ekleyebileceğimiz, silebileceğimiz veya değiştirebileceğimiz anlamına gelir. Eleman eklemek için .append(), belirli bir indeksteki elemanı silmek için del veya .pop(), elemanın değerine göre silmek için .remove() gibi metotları kullanırız.
Demetler (tuples) ise normal parantez () ile oluşturulur. Listelerin aksine demetler "değiştirilemez" (immutable) yapıdadır. Yani bir demet oluşturulduktan sonra içeriği hiçbir şekilde değiştirilemez; ne yeni eleman eklenebilir ne de mevcut elemanlar silinebilir veya güncellenebilir. Bu özellikleri, program içinde yanlışlıkla değiştirilmemesi gereken sabit veri koleksiyonları (örneğin, haftanın günleri veya koordinat bilgileri) için demetleri ideal kılar.
Hem listeler hem de demetler sıralı olduğu için, elemanlarına indeks numaralarıyla (0'dan başlayarak) erişebiliriz. Örneğin, benim_listem[0] ilk elemanı verir. Ayrıca "dilimleme" (slicing) adı verilen bir teknikle listenin veya demetin belirli bir aralığını alabiliriz. Örneğin, benim_listem[1:4], 1. indeksten 4. indekse kadar olan (4. indeks dahil değil) elemanları yeni bir liste olarak verir.
# Liste Örneği (Değiştirilebilir)
alisveris_listesi = ["Süt", "Ekmek", "Yumurta"]
print(f"İlk liste: {alisveris_listesi}")
# Listeye eleman ekleme
alisveris_listesi.append("Peynir")
print(f"Eleman eklendi: {alisveris_listesi}")
# Listeden eleman çıkarma
alisveris_listesi.remove("Ekmek")
print(f"Eleman çıkarıldı: {alisveris_listesi}")
# Demet Örneği (Değiştirilemez)
kordinatlar = (41.0082, 28.9784) # İstanbul koordinatları
print(f"\nKoordinatlar: {kordinatlar}")
print(f"Enlem: {kordinatlar[0]}")
# kordinatlar.append(1) # Bu satır TypeError hatası verir!
Soru: Oluşturulduktan sonra içeriği değiştirilemeyen, sıralı veri yapısı hangisidir?
Listeler ve demetler verileri sayısal bir sırayla (indeksle) saklarken, bazen verileri daha anlamlı bir etiketle saklamak isteriz. İşte bu noktada "sözlükler" (dictionaries) devreye girer. Sözlükler, Python'da "anahtar-değer" (key-value) çiftlerinden oluşan, sırasız bir veri yapısıdır. Her bir değere, sayısal bir indeks yerine, o değerle ilişkili benzersiz bir anahtar aracılığıyla erişilir.
Sözlükler süslü parantez {} ile oluşturulur. Her eleman bir anahtar: değer çiftidir ve bu çiftler virgülle ayrılır. Anahtarlar genellikle string veya sayı gibi değiştirilemez (immutable) veri tiplerinden oluşur ve her anahtar sözlük içinde benzersiz olmalıdır. Değerler ise herhangi bir veri tipi olabilir: string, sayı, liste, hatta başka bir sözlük.
Bir sözlükteki değere erişmek için, köşeli parantez içinde o değerin anahtarını yazarız: sozluk['anahtar']. Bu yapı, verileri organize etmede büyük esneklik sağlar. Örneğin, bir kullanıcı hakkındaki bilgileri (isim, yaş, şehir vb.) bir sözlükte saklamak, bu bilgilere kullanici['isim'] gibi sezgisel bir şekilde erişmemizi sağlar. Bu, indekslerin ne anlama geldiğini hatırlamak zorunda kaldığımız listelere göre çok daha okunaklıdır.
Sözlükler de listeler gibi değiştirilebilir (mutable) veri yapılarıdır. Var olan bir anahtarın değerini güncelleyebilir, yeni anahtar-değer çiftleri ekleyebilir veya del ifadesiyle mevcut bir çifti silebiliriz. Sözlükler, verileri anlamlı bir şekilde etiketleyerek yapılandırmak istediğimiz her türlü senaryoda, JSON verilerini işlemekten program ayarlarını yönetmeye kadar çok geniş bir kullanım alanına sahiptir.
# Bir öğrencinin bilgilerini tutan sözlük
ogrenci = {
"ad": "Ahmet",
"soyad": "Yılmaz",
"yas": 21,
"bolum": "Bilgisayar Mühendisliği",
"dersler": ["Veri Yapıları", "Algoritmalar", "Web Programlama"]
}
# Sözlükteki bilgilere erişim
print(f"Öğrencinin Adı: {ogrenci['ad']}")
print(f"Aldığı 3. ders: {ogrenci['dersler'][2]}")
# Yeni bir bilgi ekleme
ogrenci['ortalama'] = 3.25
print(f"\nEklenen bilgi (Ortalama): {ogrenci['ortalama']}")
# Bir bilgiyi güncelleme
ogrenci['yas'] = 22
print(f"Güncellenen Yaş: {ogrenci['yas']}")
Soru: Python sözlüklerinde bir değere erişmek için ne kullanılır?