Dersler

View on GitHub

EEM-241 İleri Düzey Programlama

2024-2025 Güz Dönemi

Ders 9 - Dosya İşlemleri ve Nesne Yönelimli Programlamaya Giriş

1. Dosya yolları ve dosya kipleri

Temel kipler:

Bağıl yollar, programın çalıştığı klasöre göre yorumlanır. .. bir üst klasörü ifade eder.

2. Dosya okuma

Dosyanın işlem sonunda kapanmasını garanti etmek için with kullanılır.

with open("dosyalar/a.txt", "r", encoding="utf-8") as dosya:
    icerik = dosya.read()

print(icerik)

Satır satır okuma, büyük dosyalarda tüm içeriği belleğe almamayı sağlar:

with open("dosyalar/a.txt", "r", encoding="utf-8") as dosya:
    for satir_no, satir in enumerate(dosya, start=1):
        print(satir_no, satir.rstrip())

3. Dosyaya yazma ve ekleme

metin = "123,234,abc\n"

with open("dosyalar/sonuc.txt", "w", encoding="utf-8") as dosya:
    dosya.write(metin)
with open("dosyalar/sonuc.txt", "a", encoding="utf-8") as dosya:
    dosya.write("456,567,def\n")

Uygulama: Ölçümleri dosyaya kaydetme

olcumler = [12.4, 13.1, 11.9, 12.8]

with open("dosyalar/olcumler.txt", "w", encoding="utf-8") as dosya:
    for olcum in olcumler:
        dosya.write(f"{olcum}\n")
okunan_olcumler = []

with open("dosyalar/olcumler.txt", "r", encoding="utf-8") as dosya:
    for satir in dosya:
        okunan_olcumler.append(float(satir.strip()))

print(sum(okunan_olcumler) / len(okunan_olcumler))

4. Hataları kontrollü ele alma

dosya_adi = input("Okunacak dosya: ")

try:
    with open(dosya_adi, "r", encoding="utf-8") as dosya:
        print(dosya.read())
except FileNotFoundError:
    print("Dosya bulunamadı.")

Yalnızca beklenen hata türü yakalanmalıdır; genel except gerçek programlama hatalarını gizleyebilir.

5. Sınıf ve nesne

Sınıf bir şablon, nesne ise bu şablondan oluşturulan örnektir.

class Kisi:
    def __init__(self, isim, yas):
        self.isim = isim
        self.yas = yas

    def bilgi(self):
        return f"{self.isim} isimli kişinin yaşı: {self.yas}"


ogrenci = Kisi("Ali", 22)
print(ogrenci.isim)
print(ogrenci.bilgi())

6. Veriyi ve davranışı aynı sınıfta toplama

class Direnc:
    def __init__(self, ohm):
        if ohm <= 0:
            raise ValueError("Direnç pozitif olmalıdır.")
        self.ohm = ohm

    def akim(self, gerilim):
        return gerilim / self.ohm

    def guc(self, gerilim):
        return gerilim ** 2 / self.ohm

    def __str__(self):
        return f"{self.ohm} Ω direnç"


r1 = Direnc(100)
print(r1)
print(r1.akim(12))
print(r1.guc(12))

7. Kalıtım

class Ogrenci(Kisi):
    def __init__(self, isim, yas, sinif):
        super().__init__(isim, yas)
        self.sinif = sinif

    def sinif_bilgisi(self):
        return f"{self.isim}, {self.sinif}. sınıfta"


ogrenci = Ogrenci("Ayşe", 21, 3)
print(ogrenci.bilgi())
print(ogrenci.sinif_bilgisi())

super() üst sınıfın davranışını yeniden kullanır.

8. Metot ezme ve çok biçimlilik

import math

class Sekil:
    def alan(self):
        raise NotImplementedError


class Dikdortgen(Sekil):
    def __init__(self, uzunluk, genislik):
        self.uzunluk = uzunluk
        self.genislik = genislik

    def alan(self):
        return self.uzunluk * self.genislik

    def __str__(self):
        return f"{self.genislik} × {self.uzunluk} dikdörtgen"


class Daire(Sekil):
    def __init__(self, yaricap):
        self.yaricap = yaricap

    def alan(self):
        return math.pi * self.yaricap ** 2

    def __str__(self):
        return f"Yarıçapı {self.yaricap} olan daire"

Farklı sınıflar aynı metot adıyla kullanılabilir:

sekiller = [Dikdortgen(10, 20), Daire(5)]

for sekil in sekiller:
    print(sekil, "alan:", sekil.alan())

9. Özel metotlar ve operatörler

__str__ kullanıcıya yönelik metni, __repr__ geliştiriciye yönelik gösterimi belirler. Karşılaştırma için __lt__ tanımlanabilir.

class Dikdortgen:
    def __init__(self, uzunluk, genislik):
        self.uzunluk = uzunluk
        self.genislik = genislik

    def alan(self):
        return self.uzunluk * self.genislik

    def __repr__(self):
        return f"Dikdortgen({self.uzunluk}, {self.genislik})"

    def __lt__(self, diger):
        return self.alan() < diger.alan()


sekiller = [Dikdortgen(3, 8), Dikdortgen(5, 5), Dikdortgen(2, 4)]
print(sorted(sekiller))

10. Bütünleştirici örnek: Öğrenci kayıtları

class OgrenciKaydi:
    def __init__(self, numara, isim, notlar=None):
        self.numara = numara
        self.isim = isim
        self.notlar = [] if notlar is None else notlar.copy()

    def not_ekle(self, not_degeri):
        if 0 <= not_degeri <= 100:
            self.notlar.append(not_degeri)
        else:
            raise ValueError("Not 0-100 arasında olmalıdır.")

    def ortalama(self):
        if not self.notlar:
            return None
        return sum(self.notlar) / len(self.notlar)

    def dosya_satiri(self):
        not_metni = ",".join(str(not_) for not_ in self.notlar)
        return f"{self.numara};{self.isim};{not_metni}\n"


ogrenciler = [
    OgrenciKaydi(101, "Ali", [70, 80]),
    OgrenciKaydi(102, "Ayşe", [90, 95])
]

with open("dosyalar/ogrenciler.txt", "w", encoding="utf-8") as dosya:
    for ogrenci in ogrenciler:
        dosya.write(ogrenci.dosya_satiri())

Bu örnek; sınıf, liste, fonksiyon, doğrulama, döngü ve dosya yazmayı aynı problemde birleştirir.

Alıştırmalar

  1. Dosyadaki sayıları okuyup en küçük, en büyük ve ortalama değeri yazdırın.
  2. BankaHesabi sınıfını; para yatırma, para çekme ve bakiye gösterme metotlarıyla oluşturun.
  3. Sekil sınıfından türeyen Ucgen sınıfını ekleyin.
  4. Direnc nesnelerini direnç değerine göre sıralamak için __lt__ tanımlayın.
  5. Bir sensör sınıfı oluşturun; ölçüm ekleyin, ortalamayı hesaplayın ve ölçümleri dosyaya kaydedin.

Çalışma projesi önerisi

Bir ölçüm takip programı yazın. Program;