<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://sonsuzus.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://sonsuzus.github.io/" rel="alternate" type="text/html" /><updated>2026-07-30T10:13:23+00:00</updated><id>https://sonsuzus.github.io/feed.xml</id><title type="html">SonsuzUs</title><subtitle>Programlama ve Yazılım</subtitle><author><name>Sonsuz Us</name></author><entry><title type="html">Blockchain’in Sosyolojik Vaadi: Güvenmeden Güvenmek Mümkün mü?</title><link href="https://sonsuzus.github.io/posts/blockchainin-sosyolojik-vaadi-guvenmeden-guvenmek-mumkun-mu/" rel="alternate" type="text/html" title="Blockchain’in Sosyolojik Vaadi: Güvenmeden Güvenmek Mümkün mü?" /><published>2026-07-30T00:00:00+00:00</published><updated>2026-07-30T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/blockchainin-sosyolojik-vaadi-guvenmeden-guvenmek-mumkun-mu</id><content type="html" xml:base="https://sonsuzus.github.io/posts/blockchainin-sosyolojik-vaadi-guvenmeden-guvenmek-mumkun-mu/"><![CDATA[<p>Blockchain çoğu zaman “güveni ortadan kaldıran teknoloji” diye tanıtılır. Bu ifade etkileyicidir; fakat sosyolojik açıdan biraz fazla iddialıdır. İnsanlar Bitcoin gönderirken bankaya güvenmek zorunda olmayabilir, ancak yazılıma, kriptografiye, ağ katılımcılarına ve protokolün değişmeyeceğine ilişkin beklentilere hâlâ sahiptir. Dolayısıyla asıl soru, güvenin yok olup olmadığı değil, <strong>kimden neye aktarıldığıdır</strong>.</p>

<p>``</p>

<h2 id="toplumsal-güven-ne-işe-yarar">Toplumsal güven ne işe yarar?</h2>

<p>Güven, geleceğin belirsizliğini yönetmemizi sağlar. Her alışverişte satıcının geçmişini araştırmak, her sözleşmede karşı tarafı gözetlemek veya her sabah kullandığımız köprünün mühendislik hesaplarını doğrulamak zorunda kalsaydık toplumsal hayat kilitlenirdi.</p>

<p>Sosyolog Niklas Luhmann’a göre güven, toplumsal karmaşıklığı azaltan bir mekanizmadır. Anthony Giddens ise modern toplumlarda bireylerin yüzünü hiç görmedikleri uzmanlara ve kurumlara dayanan <strong>soyut sistemlerden</strong> söz eder. Banka hesabımızdaki sayı da aslında bu kurumsal güvenin dijital ifadesidir.</p>

<p>Basit bir modelle, bir işlemin beklenen faydasını şöyle gösterebiliriz:</p>

\[E(U) = p \cdot K - (1-p) \cdot Z - D\]

<p>Burada $p$ işlemin dürüst biçimde sonuçlanma olasılığı, $K$ beklenen kazanç, $Z$ olası zarar ve $D$ doğrulama maliyetidir. Geleneksel kurumlar $p$ değerini hukuk ve itibarla yükseltirken blockchain, kriptografik kanıtlarla $D$ ve manipülasyon ihtimalini azaltmaya çalışır.</p>

<h2 id="kurumsal-güven-ve-blockchain-güveni">Kurumsal güven ve blockchain güveni</h2>

<table>
  <thead>
    <tr>
      <th>Boyut</th>
      <th>Merkezi kurum</th>
      <th>Blockchain ağı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Doğrulama</td>
      <td>Yetkili kuruluş yapar</td>
      <td>Düğümler ve protokol yapar</td>
    </tr>
    <tr>
      <td>Kayıt kontrolü</td>
      <td>Tek veya sınırlı otorite</td>
      <td>Dağıtık katılımcılar</td>
    </tr>
    <tr>
      <td>Hata çözümü</td>
      <td>Mahkeme, banka, yönetici</td>
      <td>Kod, yönetişim, topluluk</td>
    </tr>
    <tr>
      <td>Güven kaynağı</td>
      <td>Hukuk ve kurumsal itibar</td>
      <td>Kriptografi ve ekonomik teşvik</td>
    </tr>
    <tr>
      <td>Temel risk</td>
      <td>Yetkinin kötüye kullanılması</td>
      <td>Kod hatası, çoğunluk veya yönetişim krizi</td>
    </tr>
  </tbody>
</table>

<p>Blockchain’in toplumsal güven kuramlarıyla örtüştüğü nokta, davranışları öngörülebilir hâle getirmesidir. Akıllı sözleşme belirli koşullarda aynı sonucu üretir; dağıtık kayıt ise geçmişin tek taraflı değiştirilmesini zorlaştırır. Böylece tanımadığımız kişilerle iş birliği yapabiliriz.</p>

<p>Çelişki ise “güvensiz sistem” söyleminde ortaya çıkar. Toplum yalnızca doğru kayıt üretmekten ibaret değildir. Adalet, niyet, merhamet ve istisna gibi kavramlar algoritmik kesinliğe kolayca sığmaz. Kod, “ödeme gecikti” durumunu görebilir; fakat gecikmenin deprem nedeniyle yaşandığını kendiliğinden anlayamaz.</p>

<h2 id="kod-gerçekten-hakem-olabilir-mi">Kod gerçekten hakem olabilir mi?</h2>

<p>Aşağıdaki basitleştirilmiş Solidity sözleşmesi, tarafların ödeme sırasında birbirine değil kurala güvenmesini sağlar:</p>

<pre><code class="language-solidity">contract Escrow {
    address public buyer;
    address payable public seller;

    constructor(address payable _seller) {
        buyer = msg.sender;
        seller = _seller;
    }

    function approveDelivery() external {
        require(msg.sender == buyer, "Yalnizca alici onaylayabilir");
        seller.transfer(address(this).balance);
    }

    receive() external payable {}
}
</code></pre>

<p>Bu kod parayı emanette tutar ve alıcı teslimatı onayladığında satıcıya aktarır. Aracı banka ortadan kalkmıştır; fakat güven kaybolmamıştır. Kullanıcılar derleyiciye, blokzincir ağına, sözleşmenin hatasız olduğuna ve alıcının dürüst onay vereceğine güvenir. Fiziksel teslimat bilgisini zincire taşıyan bir oracle kullanılırsa bu kez oracle yeni güven merkezi olur.</p>

<h2 id="merkeziyetsizlik-iktidarı-yok-eder-mi">Merkeziyetsizlik iktidarı yok eder mi?</h2>

<p>Merkeziyetsizlik, iktidarı otomatik olarak dağıtmaz. Büyük madencilik havuzları, doğrulayıcılar, token sahipleri ve geliştiriciler karar süreçlerinde diğer kullanıcılardan daha etkili olabilir. “Bir kişi, bir oy” yerine “bir token, bir oy” kullanıldığında ekonomik eşitsizlik doğrudan siyasal güce dönüşebilir.</p>

<p>Bu nedenle blockchain’in gerçek vaadi <strong>güvenmeden güvenmek</strong> değil, güven ilişkilerini görünür, denetlenebilir ve alternatifli hâle getirmektir. Teknoloji belirli aracılara bağımlılığı azaltabilir; ancak ortak normların, hukukun ve topluluk uzlaşmasının yerini tamamen alamaz. Kısacası blockchain güveni silmez: onu kurumdan protokole, yöneticiden topluluğa ve kapalı defterden incelenebilir koda taşır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="blockchain" /><category term="merkeziyetsizlik" /><category term="toplumsal güven" /><summary type="html"><![CDATA[Blockchain çoğu zaman “güveni ortadan kaldıran teknoloji” diye tanıtılır. Bu ifade etkileyicidir; fakat sosyolojik açıdan biraz fazla iddialıdır. İnsanlar Bitcoin gönderirken bankaya güvenmek zorunda olmayabilir, ancak yazılıma, kriptografiye, ağ katılımcılarına ve protokolün değişmeyeceğine ilişkin beklentilere hâlâ sahiptir. Dolayısıyla asıl soru, güvenin yok olup olmadığı değil, kimden neye aktarıldığıdır.]]></summary></entry><entry><title type="html">Değişkenler ve Dinamik Tip Sistemi: Verinin Çalışma Zamanındaki Macerası</title><link href="https://sonsuzus.github.io/posts/degiskenler-ve-dinamik-tip-sistemi-verinin-calisma-zamanindaki-macerasi/" rel="alternate" type="text/html" title="Değişkenler ve Dinamik Tip Sistemi: Verinin Çalışma Zamanındaki Macerası" /><published>2026-07-30T00:00:00+00:00</published><updated>2026-07-30T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/degiskenler-ve-dinamik-tip-sistemi-verinin-calisma-zamanindaki-macerasi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/degiskenler-ve-dinamik-tip-sistemi-verinin-calisma-zamanindaki-macerasi/"><![CDATA[<p>Dinamik tip sistemine sahip bir dilde değişken oluşturmak, boş bir kutunun üzerine etiket yapıştırmaya benzer. Kutunun içine önce sayı, ardından metin koyabiliriz; dil, içeriğin türünü çalışma zamanında kendisi belirler. Bu rahatlığın arkasında ise tip etiketleri, nesne başlıkları, referanslar ve çöp toplama gibi oldukça hareketli bir bellek düzeni bulunur.
``</p>
<h2 id="değişken-değer-ve-tip-birbirinden-farklıdır">Değişken, değer ve tip birbirinden farklıdır</h2>

<p>Python, JavaScript ve Ruby gibi dinamik tipli dillerde değişkenin kendisi çoğunlukla belirli bir veri türüne sahip değildir. Değişken, bellekte bulunan bir <strong>değere referans</strong> taşır; veri türü ise o değerle ilişkilendirilir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">veri</span> <span class="o">=</span> <span class="mi">42</span>          <span class="c1"># veri, bir tam sayı nesnesine bağlanır
</span><span class="n">veri</span> <span class="o">=</span> <span class="sh">"</span><span class="s">Merhaba</span><span class="sh">"</span>  <span class="c1"># artık bir metin nesnesine bağlanır
</span></code></pre></div></div>

<p>İkinci atama sırasında aynı bellek bölgesinin sihirli biçimde metne dönüştürülmesi gerekmez. Çalışma zamanı yeni bir metin nesnesi oluşturur ve <code class="language-plaintext highlighter-rouge">veri</code> adının referansını bu nesneye yönlendirir. Eski <code class="language-plaintext highlighter-rouge">42</code> nesnesine başka bir referans yoksa nesne daha sonra bellekten temizlenebilir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Statik tip sistemi</th>
      <th>Dinamik tip sistemi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tip kontrolü</td>
      <td>Genellikle derleme sırasında</td>
      <td>Çalışma sırasında</td>
    </tr>
    <tr>
      <td>Değişken bildirimi</td>
      <td>Tip çoğunlukla açıkça belirtilir</td>
      <td>Tip yazmak genellikle gerekmez</td>
    </tr>
    <tr>
      <td>Tip değiştirme</td>
      <td>Sınırlı veya açık dönüşüm ister</td>
      <td>Aynı ad farklı türlere bağlanabilir</td>
    </tr>
    <tr>
      <td>Hata zamanı</td>
      <td>Daha erken yakalanabilir</td>
      <td>İlgili satır çalışınca görülebilir</td>
    </tr>
    <tr>
      <td>Esneklik</td>
      <td>Daha kontrollü</td>
      <td>Hızlı ve esnek</td>
    </tr>
  </tbody>
</table>

<h2 id="bellekte-gerçekte-ne-saklanır">Bellekte gerçekte ne saklanır?</h2>

<p>Basitleştirilmiş bir dinamik dil nesnesini şu şekilde düşünebiliriz:</p>

\[Nesne = TipEtiketi + Deger + YonetimBilgisi\]

<p>Tip etiketi, çalışma zamanına verinin sayı mı, metin mi veya başka bir nesne mi olduğunu söyler. Yönetim bilgisi; nesnenin boyutu, referans sayısı ya da çöp toplayıcının kullandığı işaretler olabilir. Bu nedenle yalnızca <code class="language-plaintext highlighter-rouge">5</code> değerini saklayan dinamik bir nesne, ham makine tamsayısından daha fazla bellek tüketebilir.</p>

<p>Bir değişkenin nesneye bağlanmasını ise kavramsal olarak şöyle gösterebiliriz:</p>

\[degisken \rightarrow referans \rightarrow nesne\]

<p>Aynı nesneye birden fazla değişken işaret edebilir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">a</span> <span class="o">=</span> <span class="p">[</span><span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">]</span>
<span class="n">b</span> <span class="o">=</span> <span class="n">a</span>
<span class="n">b</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="mi">30</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>  <span class="c1"># [10, 20, 30]
</span></code></pre></div></div>

<p>Burada liste kopyalanmamıştır. <code class="language-plaintext highlighter-rouge">a</code> ve <code class="language-plaintext highlighter-rouge">b</code>, aynı liste nesnesine referans verir. Bu davranış performans kazandırırken beklenmedik değişikliklere de yol açabilir. Gerçek bir kopya gerekiyorsa dilin kopyalama araçları kullanılmalıdır.</p>

<h2 id="sayısal-veriler-nasıl-işlenir">Sayısal veriler nasıl işlenir?</h2>

<p>Bir ifade çalıştırıldığında çalışma zamanı operandların tiplerini inceler ve uygun işlemi seçer:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">sonuc</span> <span class="o">=</span> <span class="mi">8</span> <span class="o">+</span> <span class="mi">4</span>       <span class="c1"># sayısal toplama: 12
</span><span class="n">metin</span> <span class="o">=</span> <span class="sh">"</span><span class="s">8</span><span class="sh">"</span> <span class="o">+</span> <span class="sh">"</span><span class="s">4</span><span class="sh">"</span>  <span class="c1"># metin birleştirme: "84"
</span></code></pre></div></div>

<p>İşlem sembolü aynı olsa da uygulanan davranış farklıdır. Bu yaklaşıma operatör aşırı yükleme veya tipe göre gönderim denebilir. Farklı türlerin karıştırılması ise dilin kurallarına bağlıdır. Python, <code class="language-plaintext highlighter-rouge">8 + "4"</code> ifadesinde hata verirken JavaScript bazı durumlarda otomatik dönüşüm gerçekleştirir.</p>

<table>
  <thead>
    <tr>
      <th>İfade</th>
      <th>Olası yorum</th>
      <th>Sonuç</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">8 + 4</code></td>
      <td>Sayısal toplama</td>
      <td><code class="language-plaintext highlighter-rouge">12</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">"8" + "4"</code></td>
      <td>Metin birleştirme</td>
      <td><code class="language-plaintext highlighter-rouge">"84"</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">int("8") + 4</code></td>
      <td>Açık tip dönüşümü</td>
      <td><code class="language-plaintext highlighter-rouge">12</code></td>
    </tr>
  </tbody>
</table>

<p>Açık dönüşüm, niyeti görünür kıldığı için sürprizleri azaltır.</p>

<h2 id="metinler-ve-değişmezlik">Metinler ve değişmezlik</h2>

<p>Metinler birçok dilde <strong>değişmez</strong> nesnelerdir. Bir metni güncellediğimizi düşündüğümüzde çoğunlukla yeni bir nesne üretilir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">mesaj</span> <span class="o">=</span> <span class="sh">"</span><span class="s">Merhaba</span><span class="sh">"</span>
<span class="n">mesaj</span> <span class="o">=</span> <span class="n">mesaj</span> <span class="o">+</span> <span class="sh">"</span><span class="s"> dünya</span><span class="sh">"</span>
</code></pre></div></div>

<p>İkinci satır yeni bir metin oluşturur ve <code class="language-plaintext highlighter-rouge">mesaj</code> referansını ona bağlar. Çok sayıda metni döngü içinde <code class="language-plaintext highlighter-rouge">+</code> ile birleştirmek bu nedenle maliyetli olabilir. Parçaları listede toplayıp <code class="language-plaintext highlighter-rouge">join</code> kullanmak genellikle daha verimlidir.</p>

<h2 id="esnekliğin-bedeli">Esnekliğin bedeli</h2>

<p>Dinamik tipleme hızlı prototipleme, kısa kod ve esnek veri işleme sağlar. Buna karşılık tip hataları çalışma zamanına kalabilir ve her işlemde tip kontrolü ek maliyet oluşturabilir. Modern yorumlayıcılar; önbellekleme, çalışma zamanı uzmanlaştırması ve JIT derleme sayesinde bu maliyeti azaltır.</p>

<p>Sonuç olarak dinamik tip sistemi “tipsiz” değildir; tip bilgisini değişkenden değere ve derleme anından çalışma zamanına taşır. Bu ayrımı anlamak, hem bellek davranışlarını çözmeyi hem de daha güvenli, hızlı ve şaşırtmayan programlar yazmayı kolaylaştırır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="değişkenler" /><category term="dinamik tipleme" /><category term="bellek yönetimi" /><summary type="html"><![CDATA[Dinamik tip sistemine sahip bir dilde değişken oluşturmak, boş bir kutunun üzerine etiket yapıştırmaya benzer. Kutunun içine önce sayı, ardından metin koyabiliriz; dil, içeriğin türünü çalışma zamanında kendisi belirler. Bu rahatlığın arkasında ise tip etiketleri, nesne başlıkları, referanslar ve çöp toplama gibi oldukça hareketli bir bellek düzeni bulunur.]]></summary></entry><entry><title type="html">Döngüsel Yapılar ve İterasyon: while ve for ile Kodun Ritmini Yakalamak</title><link href="https://sonsuzus.github.io/posts/dongusel-yapilar-ve-iterasyon-while-ve-for-ile-kodun-ritmini-yakalamak/" rel="alternate" type="text/html" title="Döngüsel Yapılar ve İterasyon: while ve for ile Kodun Ritmini Yakalamak" /><published>2026-07-30T00:00:00+00:00</published><updated>2026-07-30T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/dongusel-yapilar-ve-iterasyon-while-ve-for-ile-kodun-ritmini-yakalamak</id><content type="html" xml:base="https://sonsuzus.github.io/posts/dongusel-yapilar-ve-iterasyon-while-ve-for-ile-kodun-ritmini-yakalamak/"><![CDATA[<p>Programlamada aynı işlemi defalarca elle yazmak, yüz tabaklı bir sofrada her tabağı ayrı tarifle yıkamaya benzer. Döngüler bu zahmeti ortadan kaldırır: Bir koşul geçerli olduğu sürece veya bir koleksiyondaki bütün elemanlar işlenene kadar aynı kod bloğunu tekrar çalıştırırlar. Böylece daha kısa, okunabilir ve ölçeklenebilir programlar oluşturabiliriz.
``</p>
<h2 id="i̇terasyon-nedir">İterasyon Nedir?</h2>

<p><strong>İterasyon</strong>, bir işlemin adım adım tekrarlanmasıdır. Her tekrar bir iterasyon olarak adlandırılır. Örneğin 1’den 5’e kadar sayıları ekrana yazdıran bir döngü beş iterasyon gerçekleştirir.</p>

<p>Bir döngü genellikle üç temel parçaya sahiptir:</p>

<ol>
  <li><strong>Başlangıç durumu:</strong> Sayaç veya başlangıç değeri belirlenir.</li>
  <li><strong>Devam koşulu:</strong> Döngünün çalışmayı sürdürüp sürdürmeyeceği kontrol edilir.</li>
  <li><strong>Güncelleme:</strong> Her turdan sonra durum değiştirilir.</li>
</ol>

<p>Bir sayaç $i$ başlangıçta $0$ ise ve her adımda $1$ artıyorsa güncelleme şöyle ifade edilir:</p>

\[i_{yeni} = i_{eski} + 1\]

<p>Döngü $n$ defa çalışıyorsa ve her tur sabit süre alıyorsa yaklaşık zaman karmaşıklığı $O(n)$ olur. İç içe iki döngü ise çoğunlukla $O(n^2)$ maliyet üretir.</p>

<h2 id="while-döngüsü-koşul-doğru-oldukça-devam">while Döngüsü: Koşul Doğru Oldukça Devam</h2>

<p><code class="language-plaintext highlighter-rouge">while</code>, tekrar sayısının önceden kesin olarak bilinmediği durumlarda kullanışlıdır. Önce koşulu denetler, sonuç doğruysa gövdeyi çalıştırır.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">sayac</span> <span class="o">=</span> <span class="mi">1</span>

<span class="k">while</span> <span class="n">sayac</span> <span class="o">&lt;=</span> <span class="mi">5</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">sayac</span><span class="p">)</span>
    <span class="n">sayac</span> <span class="o">+=</span> <span class="mi">1</span>
</code></pre></div></div>

<p>Bu örnekte sayaç 1’den başlar. Koşul her turdan önce kontrol edilir ve sayaç 5’i geçtiğinde döngü sona erer. <code class="language-plaintext highlighter-rouge">sayac += 1</code> satırını unutursak koşul sürekli doğru kalabilir. Bunun sonucu, programcıların meşhur canavarı olan <strong>sonsuz döngüdür</strong>.</p>

<p><code class="language-plaintext highlighter-rouge">while</code> özellikle kullanıcı doğru veri girene kadar beklemek, bir oyunu oyuncunun canı bitene kadar sürdürmek veya bir arama işlemini sonuç bulunana kadar çalıştırmak için uygundur.</p>

<h2 id="for-döngüsü-koleksiyonların-düzenli-gezgini">for Döngüsü: Koleksiyonların Düzenli Gezgini</h2>

<p><code class="language-plaintext highlighter-rouge">for</code>, bir liste, metin, demet veya belirli bir sayı aralığı üzerinde ilerlemek için tercih edilir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">meyveler</span> <span class="o">=</span> <span class="p">[</span><span class="sh">'</span><span class="s">elma</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">armut</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">muz</span><span class="sh">'</span><span class="p">]</span>

<span class="k">for</span> <span class="n">meyve</span> <span class="ow">in</span> <span class="n">meyveler</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">meyve</span><span class="p">.</span><span class="nf">upper</span><span class="p">())</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">meyve</code> değişkeni, her iterasyonda listenin sıradaki elemanını temsil eder. Kod, listedeki meyveleri büyük harflerle yazdırır. Eleman sayısını veya indeks yönetimini elle takip etmemiz gerekmez.</p>

<p>Sayısal tekrarlar için <code class="language-plaintext highlighter-rouge">range()</code> kullanılabilir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for</span> <span class="n">sayi</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">6</span><span class="p">):</span>
    <span class="n">kare</span> <span class="o">=</span> <span class="n">sayi</span> <span class="o">**</span> <span class="mi">2</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">sayi</span><span class="p">,</span> <span class="n">kare</span><span class="p">)</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">range(1, 6)</code>, 1’den başlayıp 6 hariç olacak şekilde değer üretir. Her sayının karesi $x^2$ formülüyle hesaplanır.</p>

<h2 id="while-ve-for-karşılaştırması">while ve for Karşılaştırması</h2>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th><code class="language-plaintext highlighter-rouge">while</code></th>
      <th><code class="language-plaintext highlighter-rouge">for</code></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Temel yaklaşım</td>
      <td>Koşula bağlı tekrar</td>
      <td>Koleksiyon üzerinde gezinme</td>
    </tr>
    <tr>
      <td>Tekrar sayısı</td>
      <td>Genellikle belirsiz</td>
      <td>Genellikle belirli</td>
    </tr>
    <tr>
      <td>Sayaç yönetimi</td>
      <td>Çoğu zaman elle yapılır</td>
      <td>Otomatik yapılabilir</td>
    </tr>
    <tr>
      <td>Sonsuz döngü riski</td>
      <td>Daha yüksek</td>
      <td>Daha düşük</td>
    </tr>
    <tr>
      <td>Tipik kullanım</td>
      <td>Girdi bekleme, oyun döngüsü</td>
      <td>Liste işleme, sayısal aralıklar</td>
    </tr>
  </tbody>
</table>

<h2 id="döngü-akışını-yönetmek">Döngü Akışını Yönetmek</h2>

<p><code class="language-plaintext highlighter-rouge">break</code>, döngüyü tamamen sonlandırır; <code class="language-plaintext highlighter-rouge">continue</code> ise yalnızca mevcut iterasyonu atlayarak sonraki tura geçer.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for</span> <span class="n">sayi</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">11</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">sayi</span> <span class="o">==</span> <span class="mi">8</span><span class="p">:</span>
        <span class="k">break</span>
    <span class="k">if</span> <span class="n">sayi</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
        <span class="k">continue</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">sayi</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu kod tek sayıları atlar, çift sayıları yazdırır ve 8’e ulaştığında döngüyü bitirir. <code class="language-plaintext highlighter-rouge">%</code> operatörü kalanı verdiği için $sayi \bmod 2 = 0$ koşulu çift sayıları belirler.</p>

<p>Döngü seçerken temel soru şudur: “Bir koşul gerçekleşene kadar mı bekliyorum, yoksa elimdeki elemanları mı geziyorum?” İlk durumda <code class="language-plaintext highlighter-rouge">while</code>, ikinci durumda <code class="language-plaintext highlighter-rouge">for</code> çoğunlukla daha doğal seçimdir. Doğru döngü; kodu yalnızca kısaltmaz, niyetini de okuyucuya açıkça anlatır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="döngüler" /><category term="iterasyon" /><category term="programlama temelleri" /><summary type="html"><![CDATA[Programlamada aynı işlemi defalarca elle yazmak, yüz tabaklı bir sofrada her tabağı ayrı tarifle yıkamaya benzer. Döngüler bu zahmeti ortadan kaldırır: Bir koşul geçerli olduğu sürece veya bir koleksiyondaki bütün elemanlar işlenene kadar aynı kod bloğunu tekrar çalıştırırlar. Böylece daha kısa, okunabilir ve ölçeklenebilir programlar oluşturabiliriz.]]></summary></entry><entry><title type="html">Dosya İşlemleri ve Veri Kalıcılığı: Baytları Kalıcı Bilgiye Dönüştürmek</title><link href="https://sonsuzus.github.io/posts/dosya-islemleri-ve-veri-kaliciligi-baytlari-kalici-bilgiye-donusturmek/" rel="alternate" type="text/html" title="Dosya İşlemleri ve Veri Kalıcılığı: Baytları Kalıcı Bilgiye Dönüştürmek" /><published>2026-07-30T00:00:00+00:00</published><updated>2026-07-30T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/dosya-islemleri-ve-veri-kaliciligi-baytlari-kalici-bilgiye-donusturmek</id><content type="html" xml:base="https://sonsuzus.github.io/posts/dosya-islemleri-ve-veri-kaliciligi-baytlari-kalici-bilgiye-donusturmek/"><![CDATA[<p>Bir program çalışırken üretilen değişkenler çoğunlukla RAM üzerinde yaşar; program kapanınca da küçük bir vedalaşma töreni bile yapmadan kaybolur. Dosya işlemleri, dışarıdaki ham veriyi belleğe almayı ve işlenmiş sonuçları kalıcı depolamaya yazmayı sağlar. Böylece uygulamamız yalnızca “anı yaşayan” bir süreç olmaktan çıkar, geçmişini hatırlayan bir sisteme dönüşür.
``</p>
<h2 id="bellek-ve-kalıcı-depolama-arasındaki-fark">Bellek ve kalıcı depolama arasındaki fark</h2>

<p>Bellek hızlı fakat geçicidir. SSD, sabit disk veya ağ üzerindeki depolama ise daha yavaş olmasına rağmen veriyi program sona erdikten sonra da korur. Dosya I/O, yani <strong>Input/Output</strong>, bu iki dünya arasındaki köprüdür.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>RAM</th>
      <th>Dosya sistemi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Hız</td>
      <td>Çok yüksek</td>
      <td>Görece düşük</td>
    </tr>
    <tr>
      <td>Kalıcılık</td>
      <td>Program kapanınca veri kaybolur</td>
      <td>Veri açıkça silinene kadar korunur</td>
    </tr>
    <tr>
      <td>Kullanım amacı</td>
      <td>Aktif hesaplamalar</td>
      <td>Kayıtlar, raporlar ve yapılandırmalar</td>
    </tr>
    <tr>
      <td>Erişim biçimi</td>
      <td>Değişkenler ve adresler</td>
      <td>Dosya yolları ve akışlar</td>
    </tr>
  </tbody>
</table>

<p>Bir metin dosyasını okumak kavramsal olarak üç adımdan oluşur: dosyayı açmak, içeriği almak ve kaynağı kapatmak. Modern dillerde kaynak yönetimi yapıları, kapatma işlemini otomatikleştirir. Bu önemlidir; çünkü açık bırakılan dosyalar işletim sistemi kaynaklarını tüketebilir veya verinin diske tam yazılmasını engelleyebilir.</p>

<h2 id="metni-belleğe-okumak">Metni belleğe okumak</h2>

<p>Python’da <code class="language-plaintext highlighter-rouge">with</code> bloğu, işlem başarıyla tamamlansa da hata oluşsa da dosyanın kapatılmasını sağlar:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">pathlib</span> <span class="kn">import</span> <span class="n">Path</span>

<span class="n">kaynak</span> <span class="o">=</span> <span class="nc">Path</span><span class="p">(</span><span class="sh">"</span><span class="s">ham_veri.txt</span><span class="sh">"</span><span class="p">)</span>

<span class="k">with</span> <span class="n">kaynak</span><span class="p">.</span><span class="nf">open</span><span class="p">(</span><span class="sh">"</span><span class="s">r</span><span class="sh">"</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="sh">"</span><span class="s">utf-8</span><span class="sh">"</span><span class="p">)</span> <span class="k">as</span> <span class="n">dosya</span><span class="p">:</span>
    <span class="n">metin</span> <span class="o">=</span> <span class="n">dosya</span><span class="p">.</span><span class="nf">read</span><span class="p">()</span>

<span class="n">satirlar</span> <span class="o">=</span> <span class="p">[</span><span class="n">satir</span><span class="p">.</span><span class="nf">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">satir</span> <span class="ow">in</span> <span class="n">metin</span><span class="p">.</span><span class="nf">splitlines</span><span class="p">()</span> <span class="k">if</span> <span class="n">satir</span><span class="p">.</span><span class="nf">strip</span><span class="p">()]</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">İşlenecek </span><span class="si">{</span><span class="nf">len</span><span class="p">(</span><span class="n">satirlar</span><span class="p">)</span><span class="si">}</span><span class="s"> satır bulundu.</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">read()</code> içeriğin tamamını belleğe yükler. Küçük ve orta büyüklükteki belgelerde kullanışlıdır; ancak devasa bir günlük dosyasında RAM’i zorlayabilir. Yaklaşık bellek gereksinimini $M ≈ N + O$ şeklinde düşünebiliriz. Burada $N$ dosyanın boyutu, $O$ ise karakter nesneleri ve veri yapılarının ek yüküdür.</p>

<p>Büyük dosyalarda satır satır okuma daha güvenlidir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">with</span> <span class="nf">open</span><span class="p">(</span><span class="sh">"</span><span class="s">ham_veri.txt</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">r</span><span class="sh">"</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="sh">"</span><span class="s">utf-8</span><span class="sh">"</span><span class="p">)</span> <span class="k">as</span> <span class="n">dosya</span><span class="p">:</span>
    <span class="k">for</span> <span class="n">satir_no</span><span class="p">,</span> <span class="n">satir</span> <span class="ow">in</span> <span class="nf">enumerate</span><span class="p">(</span><span class="n">dosya</span><span class="p">,</span> <span class="n">start</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
        <span class="n">temiz</span> <span class="o">=</span> <span class="n">satir</span><span class="p">.</span><span class="nf">strip</span><span class="p">()</span>
        <span class="k">if</span> <span class="n">temiz</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="n">satir_no</span><span class="p">,</span> <span class="n">temiz</span><span class="p">.</span><span class="nf">lower</span><span class="p">())</span>
</code></pre></div></div>

<p>Bu yaklaşımda bellek tüketimi yaklaşık olarak $M ≈ L$ olur; $L$, aynı anda işlenen satırın boyutudur. Dosya yüzlerce megabayt olsa bile program bütün içeriği tek seferde taşımak zorunda kalmaz.</p>

<h2 id="i̇şlenmiş-veriyi-kalıcılaştırmak">İşlenmiş veriyi kalıcılaştırmak</h2>

<p>Okunan metin temizlenebilir, dönüştürülebilir veya analiz edilebilir. Sonuç yalnızca ekrana yazdırılırsa program kapandığında pratik değerini kaybedebilir. Çıktıyı belgeye yazmak için <code class="language-plaintext highlighter-rouge">w</code> ve <code class="language-plaintext highlighter-rouge">a</code> kipleri kullanılabilir.</p>

<table>
  <thead>
    <tr>
      <th>Kip</th>
      <th>Davranış</th>
      <th>Uygun kullanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">r</code></td>
      <td>Dosyayı okur</td>
      <td>Ham veriyi almak</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">w</code></td>
      <td>İçeriği sıfırlayıp yeniden yazar</td>
      <td>Güncel rapor üretmek</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">a</code></td>
      <td>Dosyanın sonuna ekler</td>
      <td>Günlük ve işlem geçmişi tutmak</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">x</code></td>
      <td>Yalnızca yeni dosya oluşturur</td>
      <td>Yanlışlıkla ezmeyi önlemek</td>
    </tr>
  </tbody>
</table>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">sonuclar</span> <span class="o">=</span> <span class="p">[</span><span class="n">satir</span><span class="p">.</span><span class="nf">upper</span><span class="p">()</span> <span class="k">for</span> <span class="n">satir</span> <span class="ow">in</span> <span class="n">satirlar</span><span class="p">]</span>

<span class="k">with</span> <span class="nf">open</span><span class="p">(</span><span class="sh">"</span><span class="s">rapor.txt</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">w</span><span class="sh">"</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="sh">"</span><span class="s">utf-8</span><span class="sh">"</span><span class="p">)</span> <span class="k">as</span> <span class="n">dosya</span><span class="p">:</span>
    <span class="n">dosya</span><span class="p">.</span><span class="nf">write</span><span class="p">(</span><span class="sh">"</span><span class="s">İŞLENMİŞ VERİLER</span><span class="se">\n</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">dosya</span><span class="p">.</span><span class="nf">write</span><span class="p">(</span><span class="sh">"</span><span class="s">-</span><span class="sh">"</span> <span class="o">*</span> <span class="mi">20</span> <span class="o">+</span> <span class="sh">"</span><span class="se">\n</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">dosya</span><span class="p">.</span><span class="nf">writelines</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">deger</span><span class="si">}</span><span class="se">\n</span><span class="sh">"</span> <span class="k">for</span> <span class="n">deger</span> <span class="ow">in</span> <span class="n">sonuclar</span><span class="p">)</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">w</code> kipi mevcut içeriği siler. Bu nedenle değerli bir dosyanın üzerine yazmadan önce hedef yol doğrulanmalı veya yedek oluşturulmalıdır. Ayrıca <code class="language-plaintext highlighter-rouge">encoding="utf-8"</code> belirtmek, Türkçe karakterlerin farklı sistemlerde anlamsız sembollere dönüşmesini önler.</p>

<h2 id="güvenli-ve-dayanıklı-io">Güvenli ve dayanıklı I/O</h2>

<p>Dosya bulunamayabilir, erişim izni reddedilebilir ya da disk dolabilir. Sağlam bir program bu durumları yakalamalıdır:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">try</span><span class="p">:</span>
    <span class="k">with</span> <span class="nf">open</span><span class="p">(</span><span class="sh">"</span><span class="s">rapor.txt</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">a</span><span class="sh">"</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="sh">"</span><span class="s">utf-8</span><span class="sh">"</span><span class="p">)</span> <span class="k">as</span> <span class="n">dosya</span><span class="p">:</span>
        <span class="n">dosya</span><span class="p">.</span><span class="nf">write</span><span class="p">(</span><span class="sh">"</span><span class="s">İşlem başarıyla tamamlandı.</span><span class="se">\n</span><span class="sh">"</span><span class="p">)</span>
<span class="k">except</span> <span class="nb">OSError</span> <span class="k">as</span> <span class="n">hata</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Dosya işlemi başarısız: </span><span class="si">{</span><span class="n">hata</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>Daha kritik uygulamalarda sonuç önce geçici bir dosyaya yazılır, ardından hedef dosyanın yerine atomik olarak taşınır. Böylece işlem yarıda kesilirse eski sağlam belge korunur. Kısacası iyi dosya yönetimi; doğru kip, uygun kodlama, kontrollü bellek kullanımı ve hata yönetiminin birleşimidir. Veri kalıcılığı tesadüf değil, bilinçli bir tasarım kararıdır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="dosya işlemleri" /><category term="veri kalıcılığı" /><category term="python" /><summary type="html"><![CDATA[Bir program çalışırken üretilen değişkenler çoğunlukla RAM üzerinde yaşar; program kapanınca da küçük bir vedalaşma töreni bile yapmadan kaybolur. Dosya işlemleri, dışarıdaki ham veriyi belleğe almayı ve işlenmiş sonuçları kalıcı depolamaya yazmayı sağlar. Böylece uygulamamız yalnızca “anı yaşayan” bir süreç olmaktan çıkar, geçmişini hatırlayan bir sisteme dönüşür.]]></summary></entry><entry><title type="html">Fonksiyonlar ve Modüler Kodlama: Kod Tekrarından Düzenli Tasarıma</title><link href="https://sonsuzus.github.io/posts/fonksiyonlar-ve-moduler-kodlama-kod-tekrarindan-duzenli-tasarima/" rel="alternate" type="text/html" title="Fonksiyonlar ve Modüler Kodlama: Kod Tekrarından Düzenli Tasarıma" /><published>2026-07-30T00:00:00+00:00</published><updated>2026-07-30T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/fonksiyonlar-ve-moduler-kodlama-kod-tekrarindan-duzenli-tasarima</id><content type="html" xml:base="https://sonsuzus.github.io/posts/fonksiyonlar-ve-moduler-kodlama-kod-tekrarindan-duzenli-tasarima/"><![CDATA[<p>Bir program büyüdükçe aynı işlemleri yapan kod satırları farklı yerlerde tekrar belirmeye başlar. Başlangıçta masum görünen bu kopyalar, değişiklik zamanı geldiğinde küçük birer baş ağrısı fabrikasına dönüşür. Fonksiyonlar, belirli bir görevi yerine getiren kod bloklarını isimlendirip ihtiyaç duyduğumuzda çağırmamızı sağlar. Böylece program, devasa bir komut yığını yerine anlaşılır ve yeniden kullanılabilir parçalardan oluşur.</p>

<p>``</p>

<h2 id="fonksiyon-nedir">Fonksiyon Nedir?</h2>

<p>Fonksiyon; girdi alabilen, bir işlem gerçekleştiren ve gerektiğinde çıktı üreten alt programdır. Matematikteki fonksiyon kavramıyla benzer şekilde düşünülebilir:</p>

\[f(x) = 2x + 3\]

<p>Burada $x$ fonksiyonun girdisi, $2x+3$ işlemi fonksiyonun davranışı, elde edilen değer ise çıktıdır. Programlamada aynı fikir şu biçimde ifade edilebilir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">hesapla</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
    <span class="k">return</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">x</span> <span class="o">+</span> <span class="mi">3</span>

<span class="n">sonuc</span> <span class="o">=</span> <span class="nf">hesapla</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">sonuc</span><span class="p">)</span>  <span class="c1"># 13
</span></code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">hesapla</code> fonksiyonu işlemin nasıl yapıldığını tek bir yerde tanımlar. Programın diğer bölümleri ayrıntılarla uğraşmadan yalnızca fonksiyonun adını kullanır. Bu yaklaşım <strong>soyutlama</strong> olarak adlandırılır.</p>

<h2 id="parametre-ve-argüman-arasındaki-fark">Parametre ve Argüman Arasındaki Fark</h2>

<p>Bu iki kavram sıklıkla birbirinin yerine kullanılsa da teknik olarak farklıdır:</p>

<table>
  <thead>
    <tr>
      <th>Kavram</th>
      <th>Nerede bulunur?</th>
      <th>Örnek</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Parametre</td>
      <td>Fonksiyon tanımında</td>
      <td><code class="language-plaintext highlighter-rouge">def topla(a, b)</code> içindeki <code class="language-plaintext highlighter-rouge">a</code> ve <code class="language-plaintext highlighter-rouge">b</code></td>
    </tr>
    <tr>
      <td>Argüman</td>
      <td>Fonksiyon çağrısında</td>
      <td><code class="language-plaintext highlighter-rouge">topla(4, 7)</code> içindeki <code class="language-plaintext highlighter-rouge">4</code> ve <code class="language-plaintext highlighter-rouge">7</code></td>
    </tr>
    <tr>
      <td>Dönüş değeri</td>
      <td>Fonksiyonun ürettiği sonuçta</td>
      <td><code class="language-plaintext highlighter-rouge">return a + b</code></td>
    </tr>
  </tbody>
</table>

<p>Parametreler birer boş kutu, argümanlar ise çağrı sırasında bu kutulara yerleştirilen değerler gibi düşünülebilir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">indirimli_fiyat</span><span class="p">(</span><span class="n">fiyat</span><span class="p">,</span> <span class="n">indirim_orani</span><span class="o">=</span><span class="mi">10</span><span class="p">):</span>
    <span class="n">indirim</span> <span class="o">=</span> <span class="n">fiyat</span> <span class="o">*</span> <span class="n">indirim_orani</span> <span class="o">/</span> <span class="mi">100</span>
    <span class="k">return</span> <span class="n">fiyat</span> <span class="o">-</span> <span class="n">indirim</span>

<span class="n">standart</span> <span class="o">=</span> <span class="nf">indirimli_fiyat</span><span class="p">(</span><span class="mi">500</span><span class="p">)</span>
<span class="n">ozel</span> <span class="o">=</span> <span class="nf">indirimli_fiyat</span><span class="p">(</span><span class="mi">500</span><span class="p">,</span> <span class="mi">25</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu örnekte <code class="language-plaintext highlighter-rouge">indirim_orani</code> varsayılan bir parametredir. İlk çağrı yüzde 10, ikinci çağrı yüzde 25 indirim uygular. Tek fonksiyon, farklı argümanlarla farklı durumlara uyarlanmıştır.</p>

<h2 id="modülerlik-neden-önemlidir">Modülerlik Neden Önemlidir?</h2>

<p>Modüler kodlama, büyük bir problemi küçük ve bağımsız görevlere ayırma yaklaşımıdır. Bir e-ticaret uygulamasında fiyat hesaplama, vergi ekleme, stok kontrolü ve bildirim gönderme ayrı fonksiyonlar olabilir.</p>

<table>
  <thead>
    <tr>
      <th>Tekrarlı yaklaşım</th>
      <th>Modüler yaklaşım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Aynı kod birçok yerde kopyalanır</td>
      <td>İşlem bir kez tanımlanır</td>
    </tr>
    <tr>
      <td>Değişiklikler risklidir</td>
      <td>Güncelleme tek noktadan yapılır</td>
    </tr>
    <tr>
      <td>Test etmek zordur</td>
      <td>Her parça ayrı test edilir</td>
    </tr>
    <tr>
      <td>Okunabilirlik düşüktür</td>
      <td>Fonksiyon adları amacı açıklar</td>
    </tr>
  </tbody>
</table>

<p>Örneğin toplam tutar matematiksel olarak</p>

\[T = \sum_{i=1}^{n} f_i \times a_i\]

<p>şeklinde ifade edilebilir. Burada $f_i$ ürün fiyatını, $a_i$ ise ürün adedini temsil eder:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">sepet_toplami</span><span class="p">(</span><span class="n">urunler</span><span class="p">):</span>
    <span class="sh">"""</span><span class="s">Fiyat ve adet bilgilerini kullanarak toplam tutarı hesaplar.</span><span class="sh">"""</span>
    <span class="n">toplam</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="k">for</span> <span class="n">urun</span> <span class="ow">in</span> <span class="n">urunler</span><span class="p">:</span>
        <span class="n">toplam</span> <span class="o">+=</span> <span class="n">urun</span><span class="p">[</span><span class="sh">"</span><span class="s">fiyat</span><span class="sh">"</span><span class="p">]</span> <span class="o">*</span> <span class="n">urun</span><span class="p">[</span><span class="sh">"</span><span class="s">adet</span><span class="sh">"</span><span class="p">]</span>
    <span class="k">return</span> <span class="n">toplam</span>

<span class="n">sepet</span> <span class="o">=</span> <span class="p">[</span>
    <span class="p">{</span><span class="sh">"</span><span class="s">fiyat</span><span class="sh">"</span><span class="p">:</span> <span class="mi">120</span><span class="p">,</span> <span class="sh">"</span><span class="s">adet</span><span class="sh">"</span><span class="p">:</span> <span class="mi">2</span><span class="p">},</span>
    <span class="p">{</span><span class="sh">"</span><span class="s">fiyat</span><span class="sh">"</span><span class="p">:</span> <span class="mi">75</span><span class="p">,</span> <span class="sh">"</span><span class="s">adet</span><span class="sh">"</span><span class="p">:</span> <span class="mi">3</span><span class="p">}</span>
<span class="p">]</span>

<span class="nf">print</span><span class="p">(</span><span class="nf">sepet_toplami</span><span class="p">(</span><span class="n">sepet</span><span class="p">))</span>  <span class="c1"># 465
</span></code></pre></div></div>

<p>Fonksiyon yalnızca toplam hesaplama sorumluluğunu üstlenir. Ekrana yazdırma, veritabanına kaydetme veya ödeme alma gibi işler başka modüllere bırakılmalıdır. Bu ilkeye <strong>tek sorumluluk ilkesi</strong> denir.</p>

<h2 id="daha-sağlam-fonksiyonlar-yazmak">Daha Sağlam Fonksiyonlar Yazmak</h2>

<p>İyi bir fonksiyon kısa, anlamlı isimli ve tahmin edilebilir olmalıdır. <code class="language-plaintext highlighter-rouge">islem()</code> yerine <code class="language-plaintext highlighter-rouge">vergi_hesapla()</code> gibi niyeti açıklayan adlar seçilmelidir. Fonksiyon mümkünse dışarıdaki değişkenleri değiştirmemeli; girdiden çıktı üretmelidir. Böyle fonksiyonlara saf fonksiyon denir ve test edilmeleri çok daha kolaydır.</p>

<p>Kısacası fonksiyonlar yalnızca satır sayısını azaltmaz; kodun düşünce yapısını düzenler. Tekrar eden bir blok gördüğünüzde kendinize şu soruyu sorun: “Bu davranışın bir adı olsaydı ne olurdu?” Cevap büyük ihtimalle yeni fonksiyonunuzun adıdır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="fonksiyonlar" /><category term="modüler programlama" /><category term="temiz kod" /><summary type="html"><![CDATA[Bir program büyüdükçe aynı işlemleri yapan kod satırları farklı yerlerde tekrar belirmeye başlar. Başlangıçta masum görünen bu kopyalar, değişiklik zamanı geldiğinde küçük birer baş ağrısı fabrikasına dönüşür. Fonksiyonlar, belirli bir görevi yerine getiren kod bloklarını isimlendirip ihtiyaç duyduğumuzda çağırmamızı sağlar. Böylece program, devasa bir komut yığını yerine anlaşılır ve yeniden kullanılabilir parçalardan oluşur.]]></summary></entry><entry><title type="html">Hata Ayıklamanın Zen’i: Bir Bug’ı Bulmak Aslında Kendini Bulmaktır</title><link href="https://sonsuzus.github.io/posts/hata-ayiklamanin-zeni-bir-bugi-bulmak-aslinda-kendini-bulmaktir/" rel="alternate" type="text/html" title="Hata Ayıklamanın Zen’i: Bir Bug’ı Bulmak Aslında Kendini Bulmaktır" /><published>2026-07-30T00:00:00+00:00</published><updated>2026-07-30T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/hata-ayiklamanin-zeni-bir-bugi-bulmak-aslinda-kendini-bulmaktir</id><content type="html" xml:base="https://sonsuzus.github.io/posts/hata-ayiklamanin-zeni-bir-bugi-bulmak-aslinda-kendini-bulmaktir/"><![CDATA[<p>Kod çalışmadığında ilk şüphelimiz çoğu zaman bilgisayardır. Oysa bilgisayar, talimatlarımızı rahatsız edici bir sadakatle uygulamıştır. Bug; beklentimiz, varsayımımız ve gerçek davranış arasındaki çatlakta yaşar. Bu nedenle hata ayıklamak yalnızca bozuk satırı bulmak değil, düşünme biçimimizi gözlemlemektir: Neyi bildiğimizi sandık, neyi kontrol etmedik ve hangi sonuca gereğinden hızlı âşık olduk?</p>

<p>``</p>

<h2 id="bug-beklenti-ile-gerçeklik-arasındaki-farktır">Bug, beklenti ile gerçeklik arasındaki farktır</h2>

<p>Bir programın beklenen çıktısını $E$, gözlenen çıktısını $O$ ile gösterelim. İncelediğimiz sapma kabaca şöyle düşünülebilir:</p>

\[D = |E - O|\]

<p>Buradaki asıl mesele $D$ değerini sıfırlamak değil, farkın hangi koşulda doğduğunu açıklayabilmektir. Açıklayamadığımız ama geçici olarak susturduğumuz hata, genellikle daha dramatik bir kostümle geri döner.</p>

<p>İyi bir hata ayıklama süreci bilimsel yönteme benzer:</p>

<ol>
  <li>Belirtiyi gözlemle.</li>
  <li>Hatayı güvenilir biçimde yeniden üret.</li>
  <li>Bir hipotez kur.</li>
  <li>Tek bir değişkeni değiştirerek hipotezi test et.</li>
  <li>Sonucu kaydet ve kapsamı daralt.</li>
</ol>

<p>Bu yaklaşımın içe dönük tarafı şudur: Her hipotez, kod kadar zihnimiz hakkında da bilgi verir. “Veritabanı bozuktur” demeden önce, neden ilk olarak dış dünyayı suçlamaya eğilimli olduğumuzu fark ederiz.</p>

<h2 id="tepki-vermek-ile-araştırmak">Tepki vermek ile araştırmak</h2>

<table>
  <thead>
    <tr>
      <th>İçgüdüsel yaklaşım</th>
      <th>Sistematik yaklaşım</th>
      <th>Zihinsel karşılığı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Rastgele satır değiştirmek</td>
      <td>Minimum örnek oluşturmak</td>
      <td>Sabırsızlık yerine merak</td>
    </tr>
    <tr>
      <td>Hata mesajını görmezden gelmek</td>
      <td>Mesajı ve yığını okumak</td>
      <td>Rahatsızlıktan kaçmamak</td>
    </tr>
    <tr>
      <td>Aynı anda beş şeyi düzeltmek</td>
      <td>Tek değişkeni test etmek</td>
      <td>Kontrol yanılsamasını bırakmak</td>
    </tr>
    <tr>
      <td>“Bende çalışıyor” demek</td>
      <td>Ortam farklarını karşılaştırmak</td>
      <td>Kendi bakış açısını mutlak saymamak</td>
    </tr>
    <tr>
      <td>Belirtiyi bastırmak</td>
      <td>Kök nedeni bulmak</td>
      <td>Kısa rahatlama yerine kalıcı anlayış</td>
    </tr>
  </tbody>
</table>

<h2 id="önce-hatayı-görünür-kıl">Önce hatayı görünür kıl</h2>

<p>Aşağıdaki Python fonksiyonu, indirimli fiyat hesaplıyor. Ancak <code class="language-plaintext highlighter-rouge">oran</code> değerinin yüzde mi, ondalık mı olduğu belirsiz:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">indirimli_fiyat</span><span class="p">(</span><span class="n">fiyat</span><span class="p">,</span> <span class="n">oran</span><span class="p">):</span>
    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">DEBUG fiyat=</span><span class="si">{</span><span class="n">fiyat</span><span class="si">}</span><span class="s">, oran=</span><span class="si">{</span><span class="n">oran</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
    <span class="k">assert</span> <span class="n">fiyat</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">,</span> <span class="sh">"</span><span class="s">Fiyat negatif olamaz</span><span class="sh">"</span>
    <span class="k">assert</span> <span class="mi">0</span> <span class="o">&lt;=</span> <span class="n">oran</span> <span class="o">&lt;=</span> <span class="mi">1</span><span class="p">,</span> <span class="sh">"</span><span class="s">Oran 0 ile 1 arasında olmalı</span><span class="sh">"</span>
    <span class="k">return</span> <span class="n">fiyat</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">oran</span><span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="nf">indirimli_fiyat</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mf">0.20</span><span class="p">))</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">print</code>, programın o andaki durumunu görünür yapar; <code class="language-plaintext highlighter-rouge">assert</code> ise sessiz bir varsayımı çalıştırılabilir kurala dönüştürür. Formülümüz $P_{son} = P(1-r)$ olduğuna göre <code class="language-plaintext highlighter-rouge">20</code> değil, <code class="language-plaintext highlighter-rouge">0.20</code> beklenir. Böylece sorun yalnızca yanlış değer olmaktan çıkar, açıkça tanımlanmış bir sözleşme ihlaline dönüşür.</p>

<p>Gerçek projelerde günlük kayıtları, debugger durak noktaları ve otomatik testler aynı amaca hizmet eder: Zihnimizde kurduğumuz hikâyeyi ölçülebilir kanıtlarla karşılaştırmak.</p>

<h2 id="i̇kiye-böl-sakinleş-tekrar-et">İkiye böl, sakinleş, tekrar et</h2>

<p>Hatanın yüz satırlık bir alanda bulunduğunu düşünelim. Her adımda alanı ikiye bölersek gereken yaklaşık inceleme sayısı:</p>

\[k = \lceil \log_2 n \rceil\]

<p>$n=100$ için yalnızca $k=7$ adım yeterlidir. <code class="language-plaintext highlighter-rouge">git bisect</code>, modülleri devre dışı bırakma ve girdiyi küçültme teknikleri bu mantığı kullanır. Panik bütün sistemi aynı anda görmeye çalışır; yöntem ise soruyu küçültür.</p>

<h2 id="debug-günlüğü-tut">Debug günlüğü tut</h2>

<p>Kısa bir kayıt, dairesel düşünmeyi engeller:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Belirti: Sepet toplamı bazı siparişlerde negatif.
Tekrar: İki kupon aynı anda uygulanınca oluşuyor.
Hipotez: İndirimler sırayla değil, toplam olarak düşülüyor.
Deney: İkinci kuponu kapat.
Sonuç: Negatif değer kayboldu.
</code></pre></div></div>

<p>Bu günlük gelecekteki ekip arkadaşına yardım ederken geçmişteki hâlinizle de dürüst bir konuşma kurar.</p>

<p>Sonunda iyi debugger, hiç hata yapmayan kişi değildir. Yanıldığını hızlı, sakin ve kanıta dayanarak fark edebilen kişidir. Bug düzeldiğinde yalnızca program değişmez; varsayımlarını sınamayı öğrenen geliştirici de küçük bir sürüm yükseltmesi yaşar.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="debugging" /><category term="problem çözme" /><category term="yazılım geliştirme" /><summary type="html"><![CDATA[Kod çalışmadığında ilk şüphelimiz çoğu zaman bilgisayardır. Oysa bilgisayar, talimatlarımızı rahatsız edici bir sadakatle uygulamıştır. Bug; beklentimiz, varsayımımız ve gerçek davranış arasındaki çatlakta yaşar. Bu nedenle hata ayıklamak yalnızca bozuk satırı bulmak değil, düşünme biçimimizi gözlemlemektir: Neyi bildiğimizi sandık, neyi kontrol etmedik ve hangi sonuca gereğinden hızlı âşık olduk?]]></summary></entry><entry><title type="html">Kalıtım ve Çok Biçimlilik: Nesne Yönelimli Dünyanın Aile Albümü</title><link href="https://sonsuzus.github.io/posts/kalitim-ve-cok-bicimlilik-nesne-yonelimli-dunyanin-aile-albumu/" rel="alternate" type="text/html" title="Kalıtım ve Çok Biçimlilik: Nesne Yönelimli Dünyanın Aile Albümü" /><published>2026-07-30T00:00:00+00:00</published><updated>2026-07-30T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/kalitim-ve-cok-bicimlilik-nesne-yonelimli-dunyanin-aile-albumu</id><content type="html" xml:base="https://sonsuzus.github.io/posts/kalitim-ve-cok-bicimlilik-nesne-yonelimli-dunyanin-aile-albumu/"><![CDATA[<p>Nesne yönelimli programlamada bazı sınıflar birbirine şaşırtıcı derecede benzer. Örneğin kedi de köpek de bir hayvandır; ikisinin de adı, yaşı ve ses çıkarma davranışı vardır. Ancak çıkardıkları sesler aynı değildir. Kalıtım ortak özellikleri tek bir temel sınıfta toplamamızı, çok biçimlilik ise ortak görünen davranışların nesneye göre farklı sonuç üretmesini sağlar. Böylece kodumuz hem tekrar etmekten kurtulur hem de yeni türlere daha kolay uyum sağlar.
``</p>

<h2 id="kalıtımın-temel-mantığı">Kalıtımın Temel Mantığı</h2>

<p>Kalıtım, bir <strong>alt sınıfın</strong> başka bir sınıfta tanımlanan özellik ve metotları devralmasıdır. Özellikleri aktaran sınıfa temel sınıf, üst sınıf veya ebeveyn sınıf denir. Bunları alan sınıf ise alt sınıf ya da çocuk sınıftır.</p>

<p>Örneğin <code class="language-plaintext highlighter-rouge">Hayvan</code> sınıfında <code class="language-plaintext highlighter-rouge">ad</code> özelliğini ve <code class="language-plaintext highlighter-rouge">bilgi_ver()</code> metodunu tanımlayabiliriz. <code class="language-plaintext highlighter-rouge">Kedi</code> ve <code class="language-plaintext highlighter-rouge">Kopek</code> sınıfları bu ortak üyeleri yeniden yazmadan kullanabilir. Bu ilişki genellikle “bir türüdür” testiyle anlaşılır: Kedi bir hayvan türüdür, dolayısıyla kalıtım burada mantıklıdır.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Hayvan</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">ad</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">ad</span> <span class="o">=</span> <span class="n">ad</span>

    <span class="k">def</span> <span class="nf">bilgi_ver</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="sa">f</span><span class="sh">"</span><span class="s">Benim adım </span><span class="si">{</span><span class="n">self</span><span class="p">.</span><span class="n">ad</span><span class="si">}</span><span class="s">.</span><span class="sh">"</span>


<span class="k">class</span> <span class="nc">Kedi</span><span class="p">(</span><span class="n">Hayvan</span><span class="p">):</span>
    <span class="k">pass</span>


<span class="n">tekir</span> <span class="o">=</span> <span class="nc">Kedi</span><span class="p">(</span><span class="sh">"</span><span class="s">Tekir</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">tekir</span><span class="p">.</span><span class="nf">bilgi_ver</span><span class="p">())</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">Kedi</code> sınıfının gövdesinde <code class="language-plaintext highlighter-rouge">bilgi_ver()</code> bulunmamasına rağmen <code class="language-plaintext highlighter-rouge">tekir</code> nesnesi bu metodu kullanabilir. Python metodu önce alt sınıfta arar, bulamazsa kalıtım zincirinde yukarı doğru ilerler.</p>

<p>Kalıtım sayesinde elde edilen basit kod kazancını yaklaşık olarak şöyle düşünebiliriz:</p>

\[Kazanım = Tekrarlanan\ Kod - Ek\ Soyutlama\ Maliyeti\]

<p>Kalıtım gereksiz yere kullanılırsa soyutlama maliyeti artar. Bu nedenle yalnızca kod tekrarını azaltmak için değil, sınıflar arasında gerçek bir tür ilişkisi bulunduğunda tercih edilmelidir.</p>

<table>
  <thead>
    <tr>
      <th>Kavram</th>
      <th>Görevi</th>
      <th>Günlük yaşam benzetmesi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Temel sınıf</td>
      <td>Ortak yapıyı tanımlar</td>
      <td>Aileden gelen ortak özellikler</td>
    </tr>
    <tr>
      <td>Alt sınıf</td>
      <td>Yapıyı devralır ve genişletir</td>
      <td>Bireyin kendine özgü özellikleri</td>
    </tr>
    <tr>
      <td>Metot ezme</td>
      <td>Davranışı yeniden tanımlar</td>
      <td>Aynı soruya farklı cevap vermek</td>
    </tr>
    <tr>
      <td>Çok biçimlilik</td>
      <td>Ortak arayüzle farklı sonuç üretir</td>
      <td>Her müzisyenin aynı notayı farklı çalması</td>
    </tr>
  </tbody>
</table>

<h2 id="metot-ezme-ve-çok-biçimlilik">Metot Ezme ve Çok Biçimlilik</h2>

<p>Alt sınıf, temel sınıftan gelen bir metodu aynı isimle yeniden tanımlayabilir. Buna <strong>metot ezme</strong> (<code class="language-plaintext highlighter-rouge">override</code>) denir. Çok biçimliliğin sihri de burada ortaya çıkar: Program aynı <code class="language-plaintext highlighter-rouge">ses_cikar()</code> çağrısını yapar, fakat çalıştırılan kod nesnenin gerçek türüne göre seçilir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Hayvan</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">ad</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">ad</span> <span class="o">=</span> <span class="n">ad</span>

    <span class="k">def</span> <span class="nf">ses_cikar</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="sh">"</span><span class="s">Bilinmeyen bir ses</span><span class="sh">"</span>


<span class="k">class</span> <span class="nc">Kedi</span><span class="p">(</span><span class="n">Hayvan</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">ses_cikar</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="sh">"</span><span class="s">Miyav!</span><span class="sh">"</span>


<span class="k">class</span> <span class="nc">Kopek</span><span class="p">(</span><span class="n">Hayvan</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">ses_cikar</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="sh">"</span><span class="s">Hav hav!</span><span class="sh">"</span>


<span class="n">hayvanlar</span> <span class="o">=</span> <span class="p">[</span><span class="nc">Kedi</span><span class="p">(</span><span class="sh">"</span><span class="s">Tekir</span><span class="sh">"</span><span class="p">),</span> <span class="nc">Kopek</span><span class="p">(</span><span class="sh">"</span><span class="s">Karabaş</span><span class="sh">"</span><span class="p">)]</span>

<span class="k">for</span> <span class="n">hayvan</span> <span class="ow">in</span> <span class="n">hayvanlar</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">hayvan</span><span class="p">.</span><span class="n">ad</span><span class="p">,</span> <span class="n">hayvan</span><span class="p">.</span><span class="nf">ses_cikar</span><span class="p">())</span>
</code></pre></div></div>

<p>Döngü, listedeki nesnelerin türünü denetleyen uzun <code class="language-plaintext highlighter-rouge">if</code> blokları içermez. Her nesne nasıl ses çıkaracağını kendisi bilir. Bu yaklaşım, programa yeni bir <code class="language-plaintext highlighter-rouge">Kus</code> sınıfı eklendiğinde mevcut döngünün değiştirilmesine gerek bırakmaz.</p>

<h2 id="super-ile-temel-davranışı-korumak"><code class="language-plaintext highlighter-rouge">super()</code> ile Temel Davranışı Korumak</h2>

<p>Bazen üst sınıftaki davranışı tamamen silmek yerine genişletmek isteriz. <code class="language-plaintext highlighter-rouge">super()</code>, temel sınıfın metoduna kontrollü biçimde ulaşmamızı sağlar.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Kus</span><span class="p">(</span><span class="n">Hayvan</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">ad</span><span class="p">,</span> <span class="n">kanat_acikligi</span><span class="p">):</span>
        <span class="nf">super</span><span class="p">().</span><span class="nf">__init__</span><span class="p">(</span><span class="n">ad</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">kanat_acikligi</span> <span class="o">=</span> <span class="n">kanat_acikligi</span>

    <span class="k">def</span> <span class="nf">bilgi_ver</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="n">temel_bilgi</span> <span class="o">=</span> <span class="nf">super</span><span class="p">().</span><span class="nf">bilgi_ver</span><span class="p">()</span>
        <span class="k">return</span> <span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">temel_bilgi</span><span class="si">}</span><span class="s"> Kanat açıklığım </span><span class="si">{</span><span class="n">self</span><span class="p">.</span><span class="n">kanat_acikligi</span><span class="si">}</span><span class="s"> cm.</span><span class="sh">"</span>
</code></pre></div></div>

<p>Burada temel sınıfın kurucusu <code class="language-plaintext highlighter-rouge">ad</code> değerini hazırlar; alt sınıf yalnızca kendine özgü <code class="language-plaintext highlighter-rouge">kanat_acikligi</code> alanını ekler. Böylece ortak kurulum kodu kopyalanmaz.</p>

<h2 id="ne-zaman-kullanılmalı">Ne Zaman Kullanılmalı?</h2>

<p>Kalıtım güçlüdür ancak her ilişki kalıtım değildir. “Araba bir motordur” ifadesi yanlış olduğu için <code class="language-plaintext highlighter-rouge">Araba</code>, <code class="language-plaintext highlighter-rouge">Motor</code> sınıfından türetilmemelidir; araba bir motora <strong>sahiptir</strong>. Bu durumda bileşim daha uygundur.</p>

<p>Çok biçimlilik ise ödeme yöntemleri, dosya biçimleri, bildirim kanalları ve oyun karakterleri gibi ortak bir işlemin farklı uygulanabildiği sistemlerde parıldar. Kısacası kalıtım sınıfların ortak geçmişini, çok biçimlilik ise kendilerine özgü karakterlerini temsil eder. İyi tasarlandıklarında kod ailesinde herkes akrabadır, fakat kimse aynı şakaya aynı tepkiyi vermek zorunda değildir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="OOP" /><category term="Kalıtım" /><category term="Çok Biçimlilik" /><summary type="html"><![CDATA[Nesne yönelimli programlamada bazı sınıflar birbirine şaşırtıcı derecede benzer. Örneğin kedi de köpek de bir hayvandır; ikisinin de adı, yaşı ve ses çıkarma davranışı vardır. Ancak çıkardıkları sesler aynı değildir. Kalıtım ortak özellikleri tek bir temel sınıfta toplamamızı, çok biçimlilik ise ortak görünen davranışların nesneye göre farklı sonuç üretmesini sağlar. Böylece kodumuz hem tekrar etmekten kurtulur hem de yeni türlere daha kolay uyum sağlar.]]></summary></entry><entry><title type="html">Kapsam ve İsim Alanları: Değişkenler Nerede Yaşar?</title><link href="https://sonsuzus.github.io/posts/kapsam-ve-isim-alanlari-degiskenler-nerede-yasar/" rel="alternate" type="text/html" title="Kapsam ve İsim Alanları: Değişkenler Nerede Yaşar?" /><published>2026-07-30T00:00:00+00:00</published><updated>2026-07-30T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/kapsam-ve-isim-alanlari-degiskenler-nerede-yasar</id><content type="html" xml:base="https://sonsuzus.github.io/posts/kapsam-ve-isim-alanlari-degiskenler-nerede-yasar/"><![CDATA[<p>Bir değişkeni tanımlamak, ona yalnızca bir değer vermek değildir; aynı zamanda bu ismin programın hangi bölümlerinde görülebileceğini de belirlemektir. Kapsam (scope), bir isme erişilebilen kod bölgesini; isim alanı (namespace) ise isimlerle nesneler arasındaki eşleşmelerin tutulduğu yapıyı ifade eder. Özellikle Python gibi girintinin blok yapısını belirlediği dillerde bu iki kavramı anlamak, beklenmedik hataları önlemenin anahtarıdır.
``</p>
<h2 id="kapsam-ve-isim-alanı-aynı-şey-mi">Kapsam ve isim alanı aynı şey mi?</h2>

<p>Bu kavramlar yakın akraba olsalar da aynı değildir. İsim alanını bir sözlük, kapsamı ise o sözlüğe hangi noktadan erişilebildiğini belirleyen kurallar bütünü gibi düşünebiliriz.</p>

<p>Matematiksel olarak bir isim alanını şu eşleme ile gösterebiliriz:</p>

\[N: \text{İsimler} \rightarrow \text{Nesneler}\]

<p>Örneğin <code class="language-plaintext highlighter-rouge">x = 42</code> ifadesi, ilgili isim alanında $N(x)=42$ eşleşmesini oluşturur. Program <code class="language-plaintext highlighter-rouge">x</code> ismini kullandığında yorumlayıcı, geçerli kapsamları belirli bir sırayla araştırır.</p>

<table>
  <thead>
    <tr>
      <th>Kavram</th>
      <th>Temel soru</th>
      <th>Örnek</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>İsim alanı</td>
      <td>İsim hangi nesneye bağlı?</td>
      <td><code class="language-plaintext highlighter-rouge">x</code> ismi <code class="language-plaintext highlighter-rouge">42</code> nesnesine bağlıdır</td>
    </tr>
    <tr>
      <td>Kapsam</td>
      <td>Bu isme nereden erişilebilir?</td>
      <td><code class="language-plaintext highlighter-rouge">x</code>, yalnızca fonksiyon içinde görülebilir</td>
    </tr>
    <tr>
      <td>Yaşam süresi</td>
      <td>Nesne veya bağ ne kadar yaşar?</td>
      <td>Fonksiyon çağrısı tamamlanana kadar</td>
    </tr>
  </tbody>
</table>

<h2 id="pythonda-legb-arama-sırası">Python’da LEGB arama sırası</h2>

<p>Python, bir ismi çözümlerken <strong>LEGB</strong> kuralını kullanır:</p>

<ol>
  <li><strong>Local:</strong> Çalışan fonksiyonun yerel isim alanı.</li>
  <li><strong>Enclosing:</strong> İç içe fonksiyonlarda dış fonksiyonların alanları.</li>
  <li><strong>Global:</strong> Modül seviyesinde tanımlanan isimler.</li>
  <li><strong>Built-in:</strong> <code class="language-plaintext highlighter-rouge">len</code>, <code class="language-plaintext highlighter-rouge">print</code> ve <code class="language-plaintext highlighter-rouge">range</code> gibi hazır isimler.</li>
</ol>

<p>Bu arama sırasını $L \rightarrow E \rightarrow G \rightarrow B$ biçiminde özetleyebiliriz. İlk eşleşme bulunduğunda arama durur. Dolayısıyla yerel bir <code class="language-plaintext highlighter-rouge">print</code> değişkeni tanımlarsanız yerleşik <code class="language-plaintext highlighter-rouge">print()</code> fonksiyonunu gölgeleyebilirsiniz. Program çalışır gibi görünürken bir anda “<code class="language-plaintext highlighter-rouge">str</code> nesnesi çağrılamaz” hatası vermesi, Python’ın küçük bir şakası değildir; isim gölgelemenin sonucudur.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">message</span> <span class="o">=</span> <span class="sh">"</span><span class="s">Global mesaj</span><span class="sh">"</span>

<span class="k">def</span> <span class="nf">show_message</span><span class="p">():</span>
    <span class="n">message</span> <span class="o">=</span> <span class="sh">"</span><span class="s">Lokal mesaj</span><span class="sh">"</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>

<span class="nf">show_message</span><span class="p">()</span>  <span class="c1"># Lokal mesaj
</span><span class="nf">print</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>  <span class="c1"># Global mesaj
</span></code></pre></div></div>

<p>Fonksiyon içindeki atama yeni bir lokal isim üretir. Dışarıdaki <code class="language-plaintext highlighter-rouge">message</code> değişkeni değişmez; iki isim farklı isim alanlarında bulunur.</p>

<h2 id="girinti-her-zaman-yeni-kapsam-oluşturmaz">Girinti her zaman yeni kapsam oluşturmaz</h2>

<p>Python’da fonksiyonlar, sınıflar ve modüller isim alanı oluşturur. Ancak <code class="language-plaintext highlighter-rouge">if</code>, <code class="language-plaintext highlighter-rouge">for</code> ve <code class="language-plaintext highlighter-rouge">while</code> blokları girintili olmalarına rağmen ayrı bir lokal kapsam meydana getirmez.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span> <span class="bp">True</span><span class="p">:</span>
    <span class="n">result</span> <span class="o">=</span> <span class="mi">25</span>

<span class="nf">print</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>  <span class="c1"># 25
</span>
<span class="k">for</span> <span class="n">number</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">3</span><span class="p">):</span>
    <span class="n">squared</span> <span class="o">=</span> <span class="n">number</span> <span class="o">**</span> <span class="mi">2</span>

<span class="nf">print</span><span class="p">(</span><span class="n">squared</span><span class="p">)</span>  <span class="c1"># 4
</span></code></pre></div></div>

<p>Bu davranış JavaScript’teki <code class="language-plaintext highlighter-rouge">let</code> veya C ailesindeki blok kapsamından farklıdır.</p>

<table>
  <thead>
    <tr>
      <th>Yapı</th>
      <th style="text-align: right">Python’da yeni kapsam?</th>
      <th>Not</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Fonksiyon</td>
      <td style="text-align: right">Evet</td>
      <td>Parametreler de lokaldir</td>
    </tr>
    <tr>
      <td>Sınıf</td>
      <td style="text-align: right">Evet</td>
      <td>Sınıf isim alanı oluşturur</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">if</code> bloğu</td>
      <td style="text-align: right">Hayır</td>
      <td>Tanımlanan isim dışarıdan görülebilir</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">for</code> döngüsü</td>
      <td style="text-align: right">Hayır</td>
      <td>Döngü değişkeni bloktan sonra kalır</td>
    </tr>
    <tr>
      <td>Liste üreteci</td>
      <td style="text-align: right">Evet</td>
      <td>Döngü değişkeni dışarı sızmaz</td>
    </tr>
  </tbody>
</table>

<h2 id="global-ve-nonlocal-anahtar-sözcükleri"><code class="language-plaintext highlighter-rouge">global</code> ve <code class="language-plaintext highlighter-rouge">nonlocal</code> anahtar sözcükleri</h2>

<p>Bir fonksiyon içinde global değişkeni yeniden bağlamak için <code class="language-plaintext highlighter-rouge">global</code> gerekir. İç içe fonksiyonlarda dış fonksiyonun değişkenini değiştirmek içinse <code class="language-plaintext highlighter-rouge">nonlocal</code> kullanılır.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">counter</span> <span class="o">=</span> <span class="mi">0</span>

<span class="k">def</span> <span class="nf">create_incrementer</span><span class="p">():</span>
    <span class="n">step</span> <span class="o">=</span> <span class="mi">1</span>

    <span class="k">def</span> <span class="nf">increment</span><span class="p">():</span>
        <span class="k">global</span> <span class="n">counter</span>
        <span class="k">nonlocal</span> <span class="n">step</span>
        <span class="n">counter</span> <span class="o">+=</span> <span class="n">step</span>
        <span class="n">step</span> <span class="o">+=</span> <span class="mi">1</span>
        <span class="k">return</span> <span class="n">counter</span>

    <span class="k">return</span> <span class="n">increment</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">counter</code> modül alanında, <code class="language-plaintext highlighter-rouge">step</code> ise çevreleyen fonksiyon alanındadır. Her çağrıda artış miktarının korunması, closure adı verilen yapının sonucudur.</p>

<h2 id="sağlam-tasarım-için-öneriler">Sağlam tasarım için öneriler</h2>

<p>Global değişkenler kolay erişim sağlar fakat fonksiyonların gizli bağımlılıklar taşımasına yol açar. Bu nedenle değerleri parametre olarak geçirmek ve sonucu <code class="language-plaintext highlighter-rouge">return</code> ile döndürmek genellikle daha test edilebilir bir tasarım üretir. Ayrıca yerleşik fonksiyon adlarını değişken olarak kullanmamak, kısa ama belirsiz isimlerden kaçınmak ve kapsamı mümkün olduğunca dar tutmak önemlidir.</p>

<p>Özetle kapsam, bir değişkenin “nereden görüldüğünü”; isim alanı ise “hangi nesneyi temsil ettiğini” açıklar. LEGB sırasını ve girintili her bloğun yeni kapsam oluşturmadığını bilmek, değişkenlerin program içinde saklambaç oynamasını büyük ölçüde engeller.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="scope" /><category term="isim alanları" /><category term="python" /><summary type="html"><![CDATA[Bir değişkeni tanımlamak, ona yalnızca bir değer vermek değildir; aynı zamanda bu ismin programın hangi bölümlerinde görülebileceğini de belirlemektir. Kapsam (scope), bir isme erişilebilen kod bölgesini; isim alanı (namespace) ise isimlerle nesneler arasındaki eşleşmelerin tutulduğu yapıyı ifade eder. Özellikle Python gibi girintinin blok yapısını belirlediği dillerde bu iki kavramı anlamak, beklenmedik hataları önlemenin anahtarıdır.]]></summary></entry><entry><title type="html">List Comprehensions ile Pythonik ve Okunaklı Veri Üretimi</title><link href="https://sonsuzus.github.io/posts/list-comprehensions-ile-pythonik-ve-okunakli-veri-uretimi/" rel="alternate" type="text/html" title="List Comprehensions ile Pythonik ve Okunaklı Veri Üretimi" /><published>2026-07-30T00:00:00+00:00</published><updated>2026-07-30T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/list-comprehensions-ile-pythonik-ve-okunakli-veri-uretimi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/list-comprehensions-ile-pythonik-ve-okunakli-veri-uretimi/"><![CDATA[<p>Python’da bir listedeki verileri dönüştürmek veya belirli koşullara göre süzmek için uzun döngüler yazmak zorunda değilsiniz. <strong>List comprehension</strong>, klasik <code class="language-plaintext highlighter-rouge">for</code> döngülerini daha kısa, çoğu zaman daha okunaklı ve verimli bir ifadeye dönüştürür. Fakat mesele yalnızca satır sayısını azaltmak değildir; asıl amaç, yeni listenin nasıl üretildiğini doğrudan anlatan Pythonik bir sözdizimi kullanmaktır.
``</p>
<h2 id="list-comprehension-nedir">List Comprehension Nedir?</h2>

<p>List comprehension, yinelenebilir bir kaynaktan yeni bir liste oluşturan sözdizimsel bir yapıdır. Temel biçimi şöyledir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">[</span><span class="n">yeni_deger</span> <span class="k">for</span> <span class="n">eleman</span> <span class="ow">in</span> <span class="n">kaynak</span><span class="p">]</span>
</code></pre></div></div>

<p>Matematiksel olarak bunu bir küme dönüşümüne benzetebiliriz. Bir $A$ veri kümesindeki her $x$ elemanına $f$ fonksiyonu uygulanıyorsa sonuç şöyle gösterilebilir:</p>

\[B = \{f(x) \mid x \in A\}\]

<p>Örneğin sayıların karelerini üretelim:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">sayilar</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">]</span>
<span class="n">kareler</span> <span class="o">=</span> <span class="p">[</span><span class="n">sayi</span> <span class="o">**</span> <span class="mi">2</span> <span class="k">for</span> <span class="n">sayi</span> <span class="ow">in</span> <span class="n">sayilar</span><span class="p">]</span>

<span class="nf">print</span><span class="p">(</span><span class="n">kareler</span><span class="p">)</span>  <span class="c1"># [1, 4, 9, 16, 25]
</span></code></pre></div></div>

<p>Buradaki ifade soldan sağa okunabilir: “<code class="language-plaintext highlighter-rouge">sayilar</code> içindeki her <code class="language-plaintext highlighter-rouge">sayi</code> için <code class="language-plaintext highlighter-rouge">sayi ** 2</code> değerini listeye ekle.” Aynı işlemin klasik döngüyle karşılığı daha uzundur:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">kareler</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">sayi</span> <span class="ow">in</span> <span class="n">sayilar</span><span class="p">:</span>
    <span class="n">kareler</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">sayi</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)</span>
</code></pre></div></div>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Klasik döngü</th>
      <th>List comprehension</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Satır sayısı</td>
      <td>Genellikle daha fazla</td>
      <td>Genellikle tek satır</td>
    </tr>
    <tr>
      <td>Listeye ekleme</td>
      <td><code class="language-plaintext highlighter-rouge">append()</code> açıkça çağrılır</td>
      <td>Otomatik gerçekleştirilir</td>
    </tr>
    <tr>
      <td>Okunabilirlik</td>
      <td>Karmaşık işlemlerde avantajlı</td>
      <td>Basit dönüşümlerde avantajlı</td>
    </tr>
    <tr>
      <td>Performans</td>
      <td>Ek metot çağrıları içerebilir</td>
      <td>Çoğunlukla biraz daha hızlıdır</td>
    </tr>
  </tbody>
</table>

<h2 id="koşulla-veri-süzme">Koşulla Veri Süzme</h2>

<p>İfadenin sonuna <code class="language-plaintext highlighter-rouge">if</code> ekleyerek yalnızca belirli elemanları seçebiliriz. Örneğin çift sayıların karelerini üretelim:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">sayilar</span> <span class="o">=</span> <span class="nf">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">11</span><span class="p">)</span>
<span class="n">cift_kareler</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span> <span class="o">**</span> <span class="mi">2</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">sayilar</span> <span class="k">if</span> <span class="n">x</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">]</span>

<span class="nf">print</span><span class="p">(</span><span class="n">cift_kareler</span><span class="p">)</span>  <span class="c1"># [4, 16, 36, 64, 100]
</span></code></pre></div></div>

<p>Koşulun matematiksel karşılığı şu şekilde düşünülebilir:</p>

\[B = \{x^2 \mid x \in A,\ x \bmod 2 = 0\}\]

<p>Burada önce <code class="language-plaintext highlighter-rouge">x % 2 == 0</code> filtresi uygulanır, ardından koşulu geçen sayıların karesi hesaplanır. Böylece filtreleme ve dönüştürme tek bir ifadede birleşir.</p>

<h2 id="if-else-kullanımında-sıra-değişir"><code class="language-plaintext highlighter-rouge">if-else</code> Kullanımında Sıra Değişir</h2>

<p>Her elemanı listeye almak, ancak koşula göre farklı bir değer üretmek istiyorsak <code class="language-plaintext highlighter-rouge">if-else</code> bölümü <code class="language-plaintext highlighter-rouge">for</code> ifadesinden önce yazılır:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">etiketler</span> <span class="o">=</span> <span class="p">[</span><span class="sh">"</span><span class="s">çift</span><span class="sh">"</span> <span class="k">if</span> <span class="n">x</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span> <span class="k">else</span> <span class="sh">"</span><span class="s">tek</span><span class="sh">"</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">6</span><span class="p">)]</span>
<span class="nf">print</span><span class="p">(</span><span class="n">etiketler</span><span class="p">)</span>  <span class="c1"># ['tek', 'çift', 'tek', 'çift', 'tek']
</span></code></pre></div></div>

<table>
  <thead>
    <tr>
      <th>Amaç</th>
      <th>Sözdizimi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Elemanları filtrelemek</td>
      <td><code class="language-plaintext highlighter-rouge">[x for x in liste if kosul]</code></td>
    </tr>
    <tr>
      <td>Koşula göre dönüştürmek</td>
      <td><code class="language-plaintext highlighter-rouge">[a if kosul else b for x in liste]</code></td>
    </tr>
    <tr>
      <td>Tüm elemanları dönüştürmek</td>
      <td><code class="language-plaintext highlighter-rouge">[f(x) for x in liste]</code></td>
    </tr>
  </tbody>
</table>

<p>Bu ayrım başlangıçta küçük bir Python bilmecesi gibi görünse de mantığı basittir: Sondaki <code class="language-plaintext highlighter-rouge">if</code>, elemanın listeye girip girmeyeceğine; baştaki <code class="language-plaintext highlighter-rouge">if-else</code> ise hangi değerin üretileceğine karar verir.</p>

<h2 id="i̇ç-i̇çe-döngüler">İç İçe Döngüler</h2>

<p>List comprehension birden fazla döngü de içerebilir. Aşağıdaki kod iki listenin tüm sayı çiftlerini üretir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">harfler</span> <span class="o">=</span> <span class="p">[</span><span class="sh">"</span><span class="s">A</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">B</span><span class="sh">"</span><span class="p">]</span>
<span class="n">sayilar</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>

<span class="n">eslesmeler</span> <span class="o">=</span> <span class="p">[(</span><span class="n">harf</span><span class="p">,</span> <span class="n">sayi</span><span class="p">)</span> <span class="k">for</span> <span class="n">harf</span> <span class="ow">in</span> <span class="n">harfler</span> <span class="k">for</span> <span class="n">sayi</span> <span class="ow">in</span> <span class="n">sayilar</span><span class="p">]</span>
<span class="nf">print</span><span class="p">(</span><span class="n">eslesmeler</span><span class="p">)</span>
</code></pre></div></div>

<p>Döngüler, klasik iç içe döngülerdeki sırayla yazılır. Yine de üç veya daha fazla döngü ve çok sayıda koşul eklemek okunabilirliği hızla düşürür. Tek satır yazabilmek, her zaman tek satır yazmanız gerektiği anlamına gelmez.</p>

<h2 id="performans-ve-pythonik-denge">Performans ve Pythonik Denge</h2>

<p>List comprehensions, <code class="language-plaintext highlighter-rouge">append()</code> çağrısını Python seviyesinde tekrar tekrar çalıştırmadığı için klasik döngülerden çoğunlukla daha hızlıdır. Ancak bütün sonuçları bellekte tutar. Çok büyük veri akışlarında köşeli parantez yerine parantez kullanan <strong>generator expression</strong> tercih edilebilir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">toplam</span> <span class="o">=</span> <span class="nf">sum</span><span class="p">(</span><span class="n">x</span> <span class="o">**</span> <span class="mi">2</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">1_000_000</span><span class="p">))</span>
</code></pre></div></div>

<p>Generator, değerleri ihtiyaç oldukça üretir; yaklaşık bellek yaklaşımı liste için $O(n)$, generator için ise çoğu senaryoda $O(1)$ düzeyindedir.</p>

<p>Sonuç olarak list comprehension; kısa dönüşüm, filtreleme ve eşleştirme işlemlerinde güçlü bir araçtır. Altın kural şudur: İfade ilk bakışta anlaşılabiliyorsa Pythoniktir; çözmek için dedektif şapkası gerekiyorsa klasik döngü daha iyi seçimdir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="Python" /><category term="List Comprehension" /><category term="Pythonik Kod" /><summary type="html"><![CDATA[Python’da bir listedeki verileri dönüştürmek veya belirli koşullara göre süzmek için uzun döngüler yazmak zorunda değilsiniz. List comprehension, klasik for döngülerini daha kısa, çoğu zaman daha okunaklı ve verimli bir ifadeye dönüştürür. Fakat mesele yalnızca satır sayısını azaltmak değildir; asıl amaç, yeni listenin nasıl üretildiğini doğrudan anlatan Pythonik bir sözdizimi kullanmaktır.]]></summary></entry><entry><title type="html">Nesne Yönelimli Programlama Temelleri: Gerçek Dünyadan Sınıflara</title><link href="https://sonsuzus.github.io/posts/nesne-yonelimli-programlama-temelleri-gercek-dunyadan-siniflara/" rel="alternate" type="text/html" title="Nesne Yönelimli Programlama Temelleri: Gerçek Dünyadan Sınıflara" /><published>2026-07-30T00:00:00+00:00</published><updated>2026-07-30T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/nesne-yonelimli-programlama-temelleri-gercek-dunyadan-siniflara</id><content type="html" xml:base="https://sonsuzus.github.io/posts/nesne-yonelimli-programlama-temelleri-gercek-dunyadan-siniflara/"><![CDATA[<p>Bir otomobili yazılımla temsil etmek istediğimizi düşünelim. Otomobilin rengi, hızı ve yakıt miktarı gibi verileri; hızlanma veya fren yapma gibi davranışları vardır. Nesne Yönelimli Programlama (Object-Oriented Programming — OOP), birbiriyle ilişkili bu verileri ve davranışları tek bir yapı içinde toplamamızı sağlar. Böylece kodumuz, gerçek dünyadaki kavramlara benzeyen, anlaşılır ve yeniden kullanılabilir parçalardan oluşur.</p>

<p>``</p>

<h2 id="sınıf-ve-nesne-arasındaki-fark">Sınıf ve nesne arasındaki fark</h2>

<p>OOP’nin merkezinde <strong>sınıf</strong> ve <strong>nesne</strong> bulunur. Sınıf, nesnelerin hangi özelliklere ve metotlara sahip olacağını belirleyen bir şablondur. Nesne ise bu şablondan üretilmiş somut bir örnektir.</p>

<p>Bunu kurabiye kalıbına benzetebiliriz: Kalıp sınıf, kalıpla hazırlanan her kurabiye ise ayrı bir nesnedir. Kurabiyelerin şekli aynı olsa da renkleri veya süslemeleri farklı olabilir.</p>

<table>
  <thead>
    <tr>
      <th>Kavram</th>
      <th>Görevi</th>
      <th>Otomobil örneği</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Sınıf</td>
      <td>Genel şablonu tanımlar</td>
      <td><code class="language-plaintext highlighter-rouge">Otomobil</code></td>
    </tr>
    <tr>
      <td>Nesne</td>
      <td>Sınıftan üretilen örnektir</td>
      <td>Kırmızı otomobil</td>
    </tr>
    <tr>
      <td>Özellik</td>
      <td>Nesnenin durumunu saklar</td>
      <td>Renk, hız, yakıt</td>
    </tr>
    <tr>
      <td>Metot</td>
      <td>Nesnenin davranışını tanımlar</td>
      <td>Hızlan, fren yap</td>
    </tr>
  </tbody>
</table>

<p>Bir nesnenin durumunu matematiksel olarak özellikler kümesiyle gösterebiliriz:</p>

\[Nesne = Durum + Davranış\]

<p>Örneğin bir otomobilin durumu $D = {renk, hız, yakıt}$, davranışları ise $B = {hızlan, fren}$ biçiminde düşünülebilir.</p>

<h2 id="i̇lk-sınıfımızı-oluşturalım">İlk sınıfımızı oluşturalım</h2>

<p>Aşağıdaki Python sınıfı, otomobilin verilerini saklar ve hızını kontrollü biçimde değiştiren metotlar sunar:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Otomobil</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">marka</span><span class="p">,</span> <span class="n">renk</span><span class="p">,</span> <span class="n">yakit</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">marka</span> <span class="o">=</span> <span class="n">marka</span>
        <span class="n">self</span><span class="p">.</span><span class="n">renk</span> <span class="o">=</span> <span class="n">renk</span>
        <span class="n">self</span><span class="p">.</span><span class="n">yakit</span> <span class="o">=</span> <span class="n">yakit</span>
        <span class="n">self</span><span class="p">.</span><span class="n">hiz</span> <span class="o">=</span> <span class="mi">0</span>

    <span class="k">def</span> <span class="nf">hizlan</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">miktar</span><span class="p">):</span>
        <span class="n">gereken_yakit</span> <span class="o">=</span> <span class="n">miktar</span> <span class="o">*</span> <span class="mf">0.05</span>

        <span class="k">if</span> <span class="n">gereken_yakit</span> <span class="o">&lt;=</span> <span class="n">self</span><span class="p">.</span><span class="n">yakit</span><span class="p">:</span>
            <span class="n">self</span><span class="p">.</span><span class="n">hiz</span> <span class="o">+=</span> <span class="n">miktar</span>
            <span class="n">self</span><span class="p">.</span><span class="n">yakit</span> <span class="o">-=</span> <span class="n">gereken_yakit</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Yeterli yakıt yok!</span><span class="sh">"</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">fren_yap</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">miktar</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">hiz</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">hiz</span> <span class="o">-</span> <span class="n">miktar</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">bilgileri_goster</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">self</span><span class="p">.</span><span class="n">marka</span><span class="si">}</span><span class="s">: </span><span class="si">{</span><span class="n">self</span><span class="p">.</span><span class="n">hiz</span><span class="si">}</span><span class="s"> km/sa, </span><span class="si">{</span><span class="n">self</span><span class="p">.</span><span class="n">yakit</span><span class="si">:</span><span class="p">.</span><span class="mi">1</span><span class="n">f</span><span class="si">}</span><span class="s"> litre</span><span class="sh">"</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">__init__</code>, nesne oluşturulurken otomatik çalışan <strong>kurucu metottur</strong>. <code class="language-plaintext highlighter-rouge">self</code>, işlem yapılan mevcut nesneyi temsil eder. <code class="language-plaintext highlighter-rouge">hizlan</code> metodu hem hızı hem de yakıtı değiştirirken <code class="language-plaintext highlighter-rouge">fren_yap</code>, hızın sıfırın altına düşmesini engeller.</p>

<p>Şimdi aynı sınıftan bağımsız iki nesne üretelim:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">araba_1</span> <span class="o">=</span> <span class="nc">Otomobil</span><span class="p">(</span><span class="sh">"</span><span class="s">Volvo</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">Mavi</span><span class="sh">"</span><span class="p">,</span> <span class="mi">40</span><span class="p">)</span>
<span class="n">araba_2</span> <span class="o">=</span> <span class="nc">Otomobil</span><span class="p">(</span><span class="sh">"</span><span class="s">Toyota</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">Beyaz</span><span class="sh">"</span><span class="p">,</span> <span class="mi">25</span><span class="p">)</span>

<span class="n">araba_1</span><span class="p">.</span><span class="nf">hizlan</span><span class="p">(</span><span class="mi">50</span><span class="p">)</span>
<span class="n">araba_2</span><span class="p">.</span><span class="nf">hizlan</span><span class="p">(</span><span class="mi">30</span><span class="p">)</span>
<span class="n">araba_2</span><span class="p">.</span><span class="nf">fren_yap</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="n">araba_1</span><span class="p">.</span><span class="nf">bilgileri_goster</span><span class="p">())</span>
<span class="nf">print</span><span class="p">(</span><span class="n">araba_2</span><span class="p">.</span><span class="nf">bilgileri_goster</span><span class="p">())</span>
</code></pre></div></div>

<p>Her nesne kendi <code class="language-plaintext highlighter-rouge">hiz</code> ve <code class="language-plaintext highlighter-rouge">yakit</code> değerlerini saklar. <code class="language-plaintext highlighter-rouge">araba_1</code> üzerinde gerçekleştirilen işlem, <code class="language-plaintext highlighter-rouge">araba_2</code> nesnesini etkilemez. Bu ayrım, büyük uygulamalarda veri karmaşasını önleyen önemli bir avantajdır.</p>

<h2 id="oopnin-dört-temel-ilkesi">OOP’nin dört temel ilkesi</h2>

<p>OOP yalnızca sınıf yazmaktan ibaret değildir. Sağlam tasarımlar genellikle dört temel ilkeye dayanır:</p>

<table>
  <thead>
    <tr>
      <th>İlke</th>
      <th>Temel amaç</th>
      <th>Kısa örnek</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Kapsülleme</td>
      <td>Veriyi kontrol altında tutmak</td>
      <td>Hızın metotla değiştirilmesi</td>
    </tr>
    <tr>
      <td>Kalıtım</td>
      <td>Ortak davranışları devralmak</td>
      <td><code class="language-plaintext highlighter-rouge">ElektrikliOtomobil</code>, <code class="language-plaintext highlighter-rouge">Otomobil</code> sınıfını genişletir</td>
    </tr>
    <tr>
      <td>Çok biçimlilik</td>
      <td>Aynı çağrıya farklı tepki vermek</td>
      <td>Her aracın farklı <code class="language-plaintext highlighter-rouge">hareket_et</code> metodu</td>
    </tr>
    <tr>
      <td>Soyutlama</td>
      <td>Gereksiz ayrıntıları gizlemek</td>
      <td>Sürücünün motor hesabını bilmemesi</td>
    </tr>
  </tbody>
</table>

<p><strong>Kapsülleme</strong>, nesnenin iç durumuna rastgele müdahale edilmesini sınırlar. <strong>Kalıtım</strong>, mevcut sınıfların özelliklerini yeni sınıflarda kullanmayı sağlar. <strong>Çok biçimlilik</strong>, aynı metot adının nesne türüne göre farklı çalışabilmesidir. <strong>Soyutlama</strong> ise kullanıcıya yalnızca ihtiyaç duyduğu arayüzü gösterir.</p>

<h2 id="neden-oop-kullanalım">Neden OOP kullanalım?</h2>

<p>OOP; banka hesapları, kullanıcılar, oyun karakterleri veya siparişler gibi belirgin varlıklara sahip sistemlerde oldukça etkilidir. İlgili veri ve davranışlar aynı yerde tutulduğu için kodun okunması, test edilmesi ve genişletilmesi kolaylaşır. Ancak her küçük problem için onlarca sınıf oluşturmak da gereksiz karmaşıklık yaratabilir.</p>

<p>Özetle sınıf bir plan, nesne bu planın çalışan örneğidir. İyi tasarlanmış bir nesne neyi bildiğini özellikleriyle, neler yapabildiğini ise metotlarıyla anlatır. Kod konuşabilseydi muhtemelen şöyle derdi: “Verimi bana bırak, davranışımı metotlarımdan iste!”</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="OOP" /><category term="Nesne Yönelimli Programlama" /><category term="Sınıflar" /><summary type="html"><![CDATA[Bir otomobili yazılımla temsil etmek istediğimizi düşünelim. Otomobilin rengi, hızı ve yakıt miktarı gibi verileri; hızlanma veya fren yapma gibi davranışları vardır. Nesne Yönelimli Programlama (Object-Oriented Programming — OOP), birbiriyle ilişkili bu verileri ve davranışları tek bir yapı içinde toplamamızı sağlar. Böylece kodumuz, gerçek dünyadaki kavramlara benzeyen, anlaşılır ve yeniden kullanılabilir parçalardan oluşur.]]></summary></entry></feed>