İçeriğe geç
academia.sh

Ders 03 / 18

Temel Veri Tipleri

Tip kavramı, tam sayı, gerçel sayı, mantıksal değer, dizgi ve boş değer; statik ve dinamik tipleme.

İçindekiler

Önceki derste bir ada sayı bağlandı, sonra liste bağlandı ve ikisi farklı davrandı. Listenin append işlemi vardı, sayının yoktu. Bu farkın adı tiptir.

Bu ders, tip kavramını tanımlar ve her programlama dilinde karşılığı bulunan temel tipleri tanıtır.

Tip Nedir

Bir tip iki şeyi birlikte belirtir:

  1. Hangi değerlerin geçerli olduğunu — değer kümesi.
  2. Bu değerler üzerinde hangi işlemlerin tanımlı olduğunu.

Tam sayı tipinin değer kümesi belirli bir aralıktaki tam sayılardır; işlemleri toplama, çıkarma, karşılaştırma gibi işlemlerdir. Dizgi tipinin değerleri karakter dizileridir; birleştirme ve arama işlemleri tanımlıdır, çıkarma tanımlı değildir.

Önceki kursun sonucu burada doğrudan işe yarar: bellekte yalnızca bit örüntüleri vardır ve anlam, örüntüye uygulanan yorum kuralından gelir. Tip, tam olarak o yorum kuralıdır. 0x41424344 örüntüsünün tam sayı mı, gerçel sayı mı yoksa metin mi olduğu sorusunun programlama dilindeki yanıtı, o değerin tipidir.

Tam Sayılar

Tam sayı tipi, kesir kısmı olmayan sayıları taşır. Önceki kursta kurulan iki gerçek burada geçerlidir: sabit genişlikli tam sayıların bir aralığı vardır ve aralık aşıldığında taşma oluşur.

Diller bu konuda ayrışır. Kimi diller sabit genişlik kullanır ve taşmayı ya sarma ile ya da hata ile karşılar. Kimi diller — Python bunlardan biridir — tam sayıları gerektiği kadar büyütür; sınır, yalnızca bellektir.

İki bölme işlemi ayırt edilmelidir:

print(7 / 2)        # 3.5   — gerçel bölme
print(7 // 2)       # 3     — tam bölme (aşağı yuvarlar)
print(7 % 2)        # 1     — kalan
print(-7 // 2)      # -4    — aşağı yuvarlama negatif tarafta da geçerli

Tam bölmenin yuvarlama yönü diller arasında farklılık gösterir: kimi diller sıfıra doğru, kimi diller aşağı yuvarlar. Negatif sayılarla çalışan kodda bu ayrıntı sonucu değiştirir.

Gerçel Sayılar

Gerçel sayı tipi, kesirli değerleri kayan noktalı gösterimle taşır. Önceki kursun uyarısı burada da geçerlidir: değerler yaklaşıktır ve eşitlikle karşılaştırılmaz.

print(0.1 + 0.2 == 0.3)                    # False
print(abs((0.1 + 0.2) - 0.3) < 1e-9)       # True  — tolerans ile karşılaştırma

Pratik kural: para gibi kesinlik gerektiren büyüklükler kayan noktalı tiplerle tutulmaz; onluk tabanlı tipler veya en küçük birimi taşıyan tam sayılar kullanılır.

Mantıksal Değerler

Mantıksal tipin yalnızca iki değeri vardır: doğru ve yanlış. Bu değerler genellikle doğrudan yazılmaz; karşılaştırmalardan üretilir.

olcum = 12
print(olcum > 10)          # True
print(olcum == 10)         # False

Mantıksal değerler, bir sonraki konudaki koşullu dallanmanın girdisidir. Bir koşulun “doğru olması” ifadesi, bu tipte bir değer üretmesi demektir.

Birçok dil, mantıksal olmayan değerleri de koşulda kullanılabilir sayar: sıfır, boş dizgi ve boş koleksiyon yanlış; diğerleri doğru kabul edilir. Bu kolaylık, okunabilirliği düşürebilir; koşulun neyi sınadığı açık yazıldığında kod daha az yanlış anlaşılır.

Dizgiler

Dizgi tipi, karakter dizilerini taşır. Önceki kursun karakter kodlamaları dersi bu tipin altındaki ayrıntıyı vermişti: dizgi, kod noktalarının dizisidir ve bellekte bir kodlamaya göre baytlanır.

ad = "ölçüm"
print(len(ad))             # 5    — kod noktası sayısı
print(ad[0])               # ö    — dizin sıfırdan başlar
print(ad.upper())          # ÖLÇÜM
print("ölçüm" + " " + "1") # ölçüm 1

Dizin numaralandırmasının sıfırdan başlaması, çoğu dilde ortak bir sözleşmedir ve adres aritmetiğinden gelir: dizin, başlangıçtan itibaren kaç eleman ilerlendiğini söyler.

Birçok dilde dizgiler değiştirilemezdir: bir dizginin içeriği değiştirilemez, yalnızca yeni bir dizgi üretilir. Bu, dizgi birleştirmenin döngü içinde pahalı olmasının nedenidir; her birleştirme yeni bir nesne yaratır.

Koleksiyonlar

Tek bir değer yerine değer dizisi tutan tipler, kursun ortak probleminin girdisini oluşturur:

olcumler = [12, 18, 7, 25, 14]     # liste: sıralı, değiştirilebilir
print(len(olcumler))               # 5
print(olcumler[0], olcumler[-1])   # 12 14
print(sum(olcumler) / len(olcumler))   # 15.2
print(max(olcumler))               # 25

Bu ders koleksiyonları yalnızca kullanacak kadar tanıtır; iç yapıları, maliyetleri ve seçim ölçütleri Veri Yapıları kursunun konusudur.

Değiştirilemez ve Değiştirilebilir Tipler

Tipler, değerlerinin sonradan değiştirilip değiştirilemediğine göre de ayrılır.

Değiştirilemez (immutable) bir değerin içeriği yaratıldıktan sonra değiştirilemez. Sayılar ve çoğu dilde dizgiler bu sınıftadır. Değişiklik gibi görünen her işlem, aslında yeni bir değer üretir.

Değiştirilebilir (mutable) bir değerin içeriği yerinde güncellenebilir. Listeler bu sınıftadır.

metin = "ölçüm"
yeni = metin.upper()
print(metin, yeni)          # ölçüm ÖLÇÜM  — özgün dizgi değişmedi

olcumler = [12, 18]
olcumler.append(7)
print(olcumler)             # [12, 18, 7]  — liste yerinde değişti

Ayrım, önceki dersteki paylaşım kuralıyla birleştiğinde önem kazanır. Aynı nesneye iki ad bağlıysa ve nesne değiştirilebilir bir tipteyse, biri üzerinden yapılan değişiklik diğerinden de görülür. Nesne değiştirilemezse böyle bir sürpriz olmaz: değişiklik yeni bir nesne ürettiği için diğer ad eski değere bağlı kalır.

Bu nedenle paylaşılan veri, değiştirilebilir tiplerle çalışırken dikkat gerektirir; değiştirilemez tipler ise paylaşıma güvenlidir. Aynı gözlem, fonksiyonlara argüman aktarımı dersinde tekrar edilecektir.

Boş Değer

Çoğu dilde, “değer yok” durumunu belirten özel bir değer bulunur. Bu değer, henüz hesaplanmamış veya bulunamamış bir sonucu ifade eder.

Kolaylığın bedeli, bu değerin beklenmedik yerlerde ortaya çıkabilmesidir: boş değer üzerinde işlem yapmaya çalışan kod, çalışma zamanı hatası verir. Bazı diller bu riski tip düzeyinde ele alır ve boş olabilecek değerleri ayrı bir tiple işaretler; böylece denetimin yapılıp yapılmadığı derleme sırasında sınanabilir.

Tip Ne Zaman Denetlenir

Diller, tip uyumunu iki farklı zamanda sınar.

Statik tipleme: Tipler derleme sırasında bilinir ve denetlenir. Uyumsuz bir işlem, program hiç çalışmadan yakalanır. Karşılığında, tiplerin bildirilmesi veya çıkarsanması gerekir.

Dinamik tipleme: Tip bilgisi değerlerin üzerinde taşınır ve denetim çalışma anında yapılır. Yazım daha kısadır; buna karşılık aynı hata, ilgili satır yürütülene kadar görünmez.

sayi = 5
metin = "5"
print(sayi + sayi)         # 10
print(metin + metin)       # 55   — dizgi birleştirme
# print(sayi + metin)      # çalışma zamanı hatası: tipler uyumsuz

Üçüncü satırdaki hata, dinamik tiplemede ancak o satır çalıştığında ortaya çıkar. Statik tiplemede aynı ifade, çalıştırmadan önce reddedilirdi. Önceki kursun derleme aşamaları dersinde kurulan ilke burada da geçerlidir: soru, hatanın ne zaman görüldüğüdür.

Özet

  • Tip, geçerli değerler kümesini ve o değerler üzerinde tanımlı işlemleri birlikte belirtir; bit örüntüsüne uygulanan yorum kuralının programlama dilindeki adıdır.
  • Tam sayılarda bölme iki türlüdür ve yuvarlama yönü diller arasında değişir.
  • Gerçel sayılar yaklaşıktır; eşitlik yerine tolerans ile karşılaştırılır.
  • Mantıksal değerler karşılaştırmalardan üretilir; boş değer ise yokluğu belirtir ve denetlenmediğinde çalışma zamanı hatası kaynağıdır.
  • Dizgiler kod noktası dizileridir; değiştirilemez tiplerde her değişiklik yeni bir değer üretir, değiştirilebilir tiplerde içerik yerinde güncellenir.
  • Statik tipleme hataları çalıştırmadan önce, dinamik tipleme çalışırken yakalar.

Sonraki Adım

Tipler tanımlandı; şimdi bu değerlerden ifade kurma sırası geldi. Sonraki ders, aritmetik, karşılaştırma ve mantıksal işleçleri ve — önceki derste bir mantık hatasının kaynağı olan — işlem önceliği kurallarını ele alacak.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat