<?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-30T07:13:24+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">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">Operatörler ve İfadeler: Kodun Matematik Kutusu</title><link href="https://sonsuzus.github.io/posts/operatorler-ve-ifadeler-kodun-matematik-kutusu/" rel="alternate" type="text/html" title="Operatörler ve İfadeler: Kodun Matematik Kutusu" /><published>2026-07-30T00:00:00+00:00</published><updated>2026-07-30T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/operatorler-ve-ifadeler-kodun-matematik-kutusu</id><content type="html" xml:base="https://sonsuzus.github.io/posts/operatorler-ve-ifadeler-kodun-matematik-kutusu/"><![CDATA[<p>Bir programın karar vermesi, hesaplama yapması ve veriyi dönüştürmesi çoğunlukla operatörler sayesinde gerçekleşir. Fiyat hesaplayan bir e-ticaret uygulamasından oyuncunun canını kontrol eden bir oyuna kadar her yerde ifadelerle karşılaşırız. Operatörleri, veriler üzerinde çalışan küçük araçlar; ifadeleri ise bu araçlarla kurulan anlamlı cümleler gibi düşünebiliriz.
``</p>

<h2 id="operatör-ve-ifade-nedir">Operatör ve ifade nedir?</h2>

<p>Operatör, bir veya daha fazla değer üzerinde işlem yapan sembol ya da anahtar kelimedir. <code class="language-plaintext highlighter-rouge">+</code>, <code class="language-plaintext highlighter-rouge">&gt;</code>, <code class="language-plaintext highlighter-rouge">==</code> ve <code class="language-plaintext highlighter-rouge">and</code> birer operatördür. Operatörün işlediği değerlere <strong>operand</strong> denir. Örneğin <code class="language-plaintext highlighter-rouge">8 + 2</code> ifadesinde <code class="language-plaintext highlighter-rouge">8</code> ve <code class="language-plaintext highlighter-rouge">2</code> operand, <code class="language-plaintext highlighter-rouge">+</code> ise operatördür.</p>

<p>Bir <strong>ifade</strong>, çalıştırıldığında sonuç üreten kod parçasıdır. Matematiksel olarak bunu şöyle gösterebiliriz:</p>

\[sonuç = operand_1 \; operatör \; operand_2\]

<p><code class="language-plaintext highlighter-rouge">5 * 4</code> ifadesinin sonucu <code class="language-plaintext highlighter-rouge">20</code>, <code class="language-plaintext highlighter-rouge">10 &gt; 3</code> ifadesinin sonucu ise <code class="language-plaintext highlighter-rouge">True</code> değeridir. Sonucun her zaman sayı olması gerekmez; mantıksal bir değer, metin veya başka bir veri türü de üretilebilir.</p>

<h2 id="aritmetik-operatörler">Aritmetik operatörler</h2>

<p>Aritmetik operatörler temel matematiksel hesaplamaları gerçekleştirir.</p>

<table>
  <thead>
    <tr>
      <th>Operatör</th>
      <th>İşlem</th>
      <th>Örnek</th>
      <th>Sonuç</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">+</code></td>
      <td>Toplama</td>
      <td><code class="language-plaintext highlighter-rouge">7 + 3</code></td>
      <td><code class="language-plaintext highlighter-rouge">10</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">-</code></td>
      <td>Çıkarma</td>
      <td><code class="language-plaintext highlighter-rouge">7 - 3</code></td>
      <td><code class="language-plaintext highlighter-rouge">4</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">*</code></td>
      <td>Çarpma</td>
      <td><code class="language-plaintext highlighter-rouge">7 * 3</code></td>
      <td><code class="language-plaintext highlighter-rouge">21</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">/</code></td>
      <td>Bölme</td>
      <td><code class="language-plaintext highlighter-rouge">7 / 2</code></td>
      <td><code class="language-plaintext highlighter-rouge">3.5</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">%</code></td>
      <td>Kalan bulma</td>
      <td><code class="language-plaintext highlighter-rouge">7 % 2</code></td>
      <td><code class="language-plaintext highlighter-rouge">1</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">**</code></td>
      <td>Üs alma</td>
      <td><code class="language-plaintext highlighter-rouge">2 ** 3</code></td>
      <td><code class="language-plaintext highlighter-rouge">8</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">//</code></td>
      <td>Tam bölme</td>
      <td><code class="language-plaintext highlighter-rouge">7 // 2</code></td>
      <td><code class="language-plaintext highlighter-rouge">3</code></td>
    </tr>
  </tbody>
</table>

<p>Örneğin indirimli fiyatın formülü $P_{son}=P-(P\times i)$ biçimindedir. Python ile bunu doğrudan ifade edebiliriz:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">fiyat</span> <span class="o">=</span> <span class="mi">800</span>
<span class="n">indirim_orani</span> <span class="o">=</span> <span class="mf">0.15</span>
<span class="n">indirimli_fiyat</span> <span class="o">=</span> <span class="n">fiyat</span> <span class="o">-</span> <span class="p">(</span><span class="n">fiyat</span> <span class="o">*</span> <span class="n">indirim_orani</span><span class="p">)</span>

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

<p>Parantezler yalnızca okunabilirliği artırmaz, işlem sırasını da belirler. <code class="language-plaintext highlighter-rouge">2 + 3 * 4</code> işlemi <code class="language-plaintext highlighter-rouge">14</code> üretirken <code class="language-plaintext highlighter-rouge">(2 + 3) * 4</code> işlemi <code class="language-plaintext highlighter-rouge">20</code> üretir. Genel öncelik sırası parantez, üs alma, çarpma-bölme ve toplama-çıkarma şeklindedir.</p>

<h2 id="karşılaştırma-operatörleri">Karşılaştırma operatörleri</h2>

<p>Karşılaştırmalar iki değerin ilişkisini inceler ve <code class="language-plaintext highlighter-rouge">True</code> ya da <code class="language-plaintext highlighter-rouge">False</code> üretir.</p>

<table>
  <thead>
    <tr>
      <th>Operatör</th>
      <th>Anlamı</th>
      <th>Örnek</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">==</code></td>
      <td>Eşittir</td>
      <td><code class="language-plaintext highlighter-rouge">puan == 100</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">!=</code></td>
      <td>Eşit değildir</td>
      <td><code class="language-plaintext highlighter-rouge">durum != "pasif"</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">&gt;</code></td>
      <td>Büyüktür</td>
      <td><code class="language-plaintext highlighter-rouge">yas &gt; 18</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">&lt;</code></td>
      <td>Küçüktür</td>
      <td><code class="language-plaintext highlighter-rouge">stok &lt; 5</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">&gt;=</code></td>
      <td>Büyük veya eşittir</td>
      <td><code class="language-plaintext highlighter-rouge">not &gt;= 50</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">&lt;=</code></td>
      <td>Küçük veya eşittir</td>
      <td><code class="language-plaintext highlighter-rouge">sicaklik &lt;= 0</code></td>
    </tr>
  </tbody>
</table>

<p>Burada <code class="language-plaintext highlighter-rouge">=</code> ile <code class="language-plaintext highlighter-rouge">==</code> karıştırılmamalıdır. <code class="language-plaintext highlighter-rouge">=</code> değişkene değer atar; <code class="language-plaintext highlighter-rouge">==</code> iki değerin eşitliğini sorgular. Bu küçük fark, büyük hataların klasik kaynağıdır.</p>

<h2 id="mantıksal-operatörler">Mantıksal operatörler</h2>

<p>Mantıksal operatörler birden fazla koşulu birleştirir. <code class="language-plaintext highlighter-rouge">and</code>, bütün koşullar doğruysa; <code class="language-plaintext highlighter-rouge">or</code>, koşullardan en az biri doğruysa <code class="language-plaintext highlighter-rouge">True</code> üretir. <code class="language-plaintext highlighter-rouge">not</code> ise sonucu tersine çevirir.</p>

<table>
  <thead>
    <tr>
      <th>Operatör</th>
      <th>Gerekli durum</th>
      <th>Günlük dilde karşılığı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">and</code></td>
      <td>Her iki koşul doğru</td>
      <td>“Bu da, şu da”</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">or</code></td>
      <td>En az bir koşul doğru</td>
      <td>“Bu veya şu”</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">not</code></td>
      <td>Koşulun tersi</td>
      <td>“Böyle değilse”</td>
    </tr>
  </tbody>
</table>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">yas</span> <span class="o">=</span> <span class="mi">22</span>
<span class="n">uyelik_aktif</span> <span class="o">=</span> <span class="bp">True</span>
<span class="n">kupon_var</span> <span class="o">=</span> <span class="bp">False</span>

<span class="n">alisveris_izni</span> <span class="o">=</span> <span class="n">yas</span> <span class="o">&gt;=</span> <span class="mi">18</span> <span class="ow">and</span> <span class="n">uyelik_aktif</span>
<span class="n">avantaj_var</span> <span class="o">=</span> <span class="n">uyelik_aktif</span> <span class="ow">and</span> <span class="p">(</span><span class="n">kupon_var</span> <span class="ow">or</span> <span class="n">yas</span> <span class="o">&lt;</span> <span class="mi">25</span><span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="n">alisveris_izni</span><span class="p">)</span>  <span class="c1"># True
</span><span class="nf">print</span><span class="p">(</span><span class="n">avantaj_var</span><span class="p">)</span>     <span class="c1"># True
</span></code></pre></div></div>

<p>İlk ifade, kullanıcının hem yetişkin hem aktif üye olmasını ister. İkinci ifade ise aktif üyeliğe ek olarak kupon veya genç kullanıcı avantajından birini yeterli görür.</p>

<h2 id="kısa-devre-değerlendirmesi">Kısa devre değerlendirmesi</h2>

<p>Mantıksal ifadeler çoğu dilde soldan sağa değerlendirilir. <code class="language-plaintext highlighter-rouge">False and işlem()</code> ifadesinde sonuç zaten yanlış olduğundan <code class="language-plaintext highlighter-rouge">işlem()</code> çağrılmayabilir. Benzer biçimde <code class="language-plaintext highlighter-rouge">True or işlem()</code> için ikinci bölüm gereksizdir. Buna <strong>kısa devre değerlendirmesi</strong> denir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">kullanici</span> <span class="o">=</span> <span class="bp">None</span>

<span class="k">if</span> <span class="n">kullanici</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">kullanici</span><span class="p">[</span><span class="sh">"</span><span class="s">aktif</span><span class="sh">"</span><span class="p">]:</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Hoş geldin!</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>İlk koşul yanlışsa ikinci koşul çalıştırılmaz; böylece <code class="language-plaintext highlighter-rouge">None</code> değeri üzerinde veri okumaya çalışmaktan doğacak hata önlenir.</p>

<p>Operatörleri öğrenirken ezberden çok ifadeyi parçalara ayırmak faydalıdır: Önce operandları, sonra işlem önceliğini, en sonunda oluşacak veri türünü belirleyin. Kodun matematik kutusu doğru kullanıldığında hesaplamalar netleşir, koşullar okunabilir olur ve veri manipülasyonu şaşırtıcı ölçüde kolaylaşır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="operatörler" /><category term="programlama temelleri" /><category term="ifadeler" /><summary type="html"><![CDATA[Bir programın karar vermesi, hesaplama yapması ve veriyi dönüştürmesi çoğunlukla operatörler sayesinde gerçekleşir. Fiyat hesaplayan bir e-ticaret uygulamasından oyuncunun canını kontrol eden bir oyuna kadar her yerde ifadelerle karşılaşırız. Operatörleri, veriler üzerinde çalışan küçük araçlar; ifadeleri ise bu araçlarla kurulan anlamlı cümleler gibi düşünebiliriz.]]></summary></entry><entry><title type="html">Python Felsefesi ve Temel Sözdizimi: Girintilerle Gelen Düzen</title><link href="https://sonsuzus.github.io/posts/python-felsefesi-ve-temel-sozdizimi-girintilerle-gelen-duzen/" rel="alternate" type="text/html" title="Python Felsefesi ve Temel Sözdizimi: Girintilerle Gelen Düzen" /><published>2026-07-30T00:00:00+00:00</published><updated>2026-07-30T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/python-felsefesi-ve-temel-sozdizimi-girintilerle-gelen-duzen</id><content type="html" xml:base="https://sonsuzus.github.io/posts/python-felsefesi-ve-temel-sozdizimi-girintilerle-gelen-duzen/"><![CDATA[<p>Python öğrenmeye başladığınızda ilk şaşkınlık genellikle şudur: “Süslü parantezler nerede?” Cevap basit ama önemlidir: Python, kod bloklarını <code class="language-plaintext highlighter-rouge">{}</code> karakterleriyle değil, girintiyle tanımlar. Bu tercih yalnızca farklı bir sözdizimi oluşturmaz; programcıyı düzenli, sade ve okunabilir kod yazmaya yönlendiren bilinçli bir tasarım felsefesini temsil eder.</p>

<p>``</p>

<h2 id="python-felsefesi-kod-insanlar-içindir">Python felsefesi: Kod insanlar içindir</h2>

<p>Python’ın yaklaşımı, Tim Peters tarafından yazılan <strong>The Zen of Python</strong> ilkelerinde özetlenir. Bu ilkeleri görmek için Python yorumlayıcısında aşağıdaki komut çalıştırılabilir:</p>

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

<p>Karşımıza çıkan metindeki en ünlü ifadelerden biri şudur: <strong>“Readability counts.”</strong>, yani “Okunabilirlik önemlidir.” Python’a göre kod yalnızca bilgisayarın çalıştıracağı komutlardan ibaret değildir. Aynı zamanda başka geliştiricilerin ve gelecekteki hâlimizin okuyacağı teknik bir anlatıdır.</p>

<p>Bu düşünceyi basitçe şöyle modelleyebiliriz:</p>

\[Kod\ Kalitesi = Doğruluk + Okunabilirlik + Sürdürülebilirlik\]

<p>Program doğru sonuç üretse bile anlaşılması çok zorsa bakım maliyeti yükselir. Python, görsel düzeni sözdiziminin bir parçası yaparak bu sorunu azaltmaya çalışır.</p>

<h2 id="girinti-nasıl-blok-oluşturur">Girinti nasıl blok oluşturur?</h2>

<p>C, Java ve JavaScript gibi dillerde bir bloğun başlangıcı ve sonu süslü parantezlerle belirtilir. Python’da ise aynı hizadaki satırlar aynı bloğa aittir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Süslü parantezli diller</th>
      <th>Python</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Blok başlangıcı</td>
      <td><code class="language-plaintext highlighter-rouge">{</code> karakteri</td>
      <td>Girinti artışı</td>
    </tr>
    <tr>
      <td>Blok sonu</td>
      <td><code class="language-plaintext highlighter-rouge">}</code> karakteri</td>
      <td>Önceki girinti seviyesine dönüş</td>
    </tr>
    <tr>
      <td>Görsel düzen</td>
      <td>Çalışmayı etkilemeyebilir</td>
      <td>Sözdiziminin zorunlu parçasıdır</td>
    </tr>
    <tr>
      <td>Yaygın standart</td>
      <td>Değişken olabilir</td>
      <td>Genellikle dört boşluk</td>
    </tr>
  </tbody>
</table>

<p>Aşağıdaki örnekte <code class="language-plaintext highlighter-rouge">if</code> satırından sonra gelen iki komut aynı girinti seviyesindedir ve koşul bloğuna dahildir:</p>

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

<span class="k">if</span> <span class="n">sicaklik</span> <span class="o">&gt;</span> <span class="mi">25</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">'</span><span class="s">Hava sıcak.</span><span class="sh">'</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">'</span><span class="s">Su içmeyi unutma!</span><span class="sh">'</span><span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="sh">'</span><span class="s">Program tamamlandı.</span><span class="sh">'</span><span class="p">)</span>
</code></pre></div></div>

<p>Koşul doğruysa girintili iki satır çalışır. Son satır sola döndüğü için <code class="language-plaintext highlighter-rouge">if</code> bloğunun dışındadır ve koşuldan bağımsız olarak yürütülür. Buradaki iki nokta <code class="language-plaintext highlighter-rouge">:</code>, yeni bir kod bloğunun başlayacağını haber verir.</p>

<h2 id="girinti-seviyelerinin-mantığı">Girinti seviyelerinin mantığı</h2>

<p>Her iç içe blok, bir önceki seviyeye göre daha fazla girintilenir. Girinti düzeyi $n$, standart olarak kullanılan boşluk sayısı da $4$ ise satırın toplam girintisi yaklaşık olarak şöyle düşünülebilir:</p>

\[Girinti(n) = 4n\]

<p>Örneğin bir döngünün içindeki koşul ikinci seviyededir ve sekiz boşluk kullanır:</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">3</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">11</span><span class="p">,</span> <span class="mi">14</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="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="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">'</span><span class="si">{</span><span class="n">sayi</span><span class="si">}</span><span class="s"> çift sayıdır.</span><span class="sh">'</span><span class="p">)</span>
    <span class="k">else</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="si">{</span><span class="n">sayi</span><span class="si">}</span><span class="s"> tek sayıdır.</span><span class="sh">'</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu kod, listedeki sayıları dolaşır ve <code class="language-plaintext highlighter-rouge">%</code> operatörüyle kalanı kontrol eder. Girintiler sayesinde döngü, koşul ve alternatif dal gözle kolayca ayırt edilir.</p>

<h2 id="boşluk-mu-sekme-mi">Boşluk mu, sekme mi?</h2>

<p>Python teknik olarak sekmelerle girintiye izin verse de <strong>PEP 8</strong>, her seviye için dört boşluk kullanılmasını önerir. Boşluk ve sekmeyi aynı dosyada karıştırmak <code class="language-plaintext highlighter-rouge">TabError</code> hatasına veya editörler arasında farklı görünümlere yol açabilir.</p>

<table>
  <thead>
    <tr>
      <th>Tercih</th>
      <th>Avantaj</th>
      <th>Risk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Dört boşluk</td>
      <td>Tutarlı ve PEP 8 uyumlu</td>
      <td>Elle yazarken daha fazla tuşlama</td>
    </tr>
    <tr>
      <td>Sekme</td>
      <td>Tek tuşla girinti</td>
      <td>Görünüm ayara göre değişebilir</td>
    </tr>
    <tr>
      <td>Karışık kullanım</td>
      <td>Belirgin avantajı yok</td>
      <td>Hata ve hizalama problemi</td>
    </tr>
  </tbody>
</table>

<p>Modern editörler Tab tuşuna basıldığında otomatik olarak dört boşluk ekleyebilir. Böylece hem hız hem tutarlılık elde edilir.</p>

<h2 id="okunabilirliğin-pratik-sonucu">Okunabilirliğin pratik sonucu</h2>

<p>Python’ın girinti zorunluluğu ilk başta katı görünebilir; aslında ekip içinde ortak bir görsel dil oluşturur. Gereksiz parantezler azalır, blokların kapsamı hızla anlaşılır ve kötü biçimlendirilmiş kod daha yazılmadan engellenir. Kısacası girinti, Python’da dekorasyon değil anlamdır. Bu yaklaşımı benimsediğinizde yalnızca çalışan programlar değil, başkalarının keyifle okuyabileceği temiz ve sürdürülebilir yazılımlar üretmeye başlarsınız.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="Python" /><category term="Sözdizimi" /><category term="Temiz Kod" /><summary type="html"><![CDATA[Python öğrenmeye başladığınızda ilk şaşkınlık genellikle şudur: “Süslü parantezler nerede?” Cevap basit ama önemlidir: Python, kod bloklarını {} karakterleriyle değil, girintiyle tanımlar. Bu tercih yalnızca farklı bir sözdizimi oluşturmaz; programcıyı düzenli, sade ve okunabilir kod yazmaya yönlendiren bilinçli bir tasarım felsefesini temsil eder.]]></summary></entry><entry><title type="html">Python Kurulumu ve VS Code ile Geliştirme Ortamı Hazırlama</title><link href="https://sonsuzus.github.io/posts/python-kurulumu-ve-vs-code-ile-gelistirme-ortami-hazirlama/" rel="alternate" type="text/html" title="Python Kurulumu ve VS Code ile Geliştirme Ortamı Hazırlama" /><published>2026-07-30T00:00:00+00:00</published><updated>2026-07-30T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/python-kurulumu-ve-vs-code-ile-gelistirme-ortami-hazirlama</id><content type="html" xml:base="https://sonsuzus.github.io/posts/python-kurulumu-ve-vs-code-ile-gelistirme-ortami-hazirlama/"><![CDATA[<p>Python öğrenmeye başlarken ilk programdan önce küçük ama önemli bir görevimiz var: bilgisayara Python dilini çalıştıracak yorumlayıcıyı tanıtmak ve kod yazacağımız ortamı hazırlamak. Bu süreç, bir mutfakta yemek yapmadan önce ocağı bağlamaya ve araçları tezgâha dizmeye benzer. Doğru kurulan bir ortam sayesinde ileride “Kodum mu bozuk, bilgisayar mı naz yapıyor?” ikilemiyle daha az karşılaşırız.
``</p>
<h2 id="python-yorumlayıcısı-ne-yapar">Python yorumlayıcısı ne yapar?</h2>

<p>Python, yüksek seviyeli ve yorumlanan bir programlama dilidir. Yazdığımız kaynak kod doğrudan işlemcinin anlayacağı makine dili değildir. Python yorumlayıcısı kodu okur, bytecode adı verilen ara gösterime dönüştürür ve Python Sanal Makinesi üzerinde çalıştırır.</p>

<p>Bu ilişkiyi basitleştirirsek:</p>

\[\text{Kaynak Kod} \rightarrow \text{Bytecode} \rightarrow \text{Python VM} \rightarrow \text{Çıktı}\]

<p>Bir programın toplam çalışma süresini kavramsal olarak şöyle düşünebiliriz:</p>

\[T_{toplam} = T_{çeviri} + T_{çalıştırma}\]

<p>Bu yaklaşım Python’a taşınabilirlik kazandırır. Aynı <code class="language-plaintext highlighter-rouge">.py</code> dosyası, uygun yorumlayıcı bulunduğu sürece Windows, macOS ve Linux üzerinde çalışabilir.</p>

<table>
  <thead>
    <tr>
      <th>Kavram</th>
      <th>Görevi</th>
      <th>Örnek</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Yorumlayıcı</td>
      <td>Python kodunu çalıştırır</td>
      <td><code class="language-plaintext highlighter-rouge">python</code>, <code class="language-plaintext highlighter-rouge">python3</code></td>
    </tr>
    <tr>
      <td>Editör</td>
      <td>Kod yazmayı kolaylaştırır</td>
      <td>VS Code</td>
    </tr>
    <tr>
      <td>Terminal</td>
      <td>Komutları işletim sistemine iletir</td>
      <td>PowerShell, Bash</td>
    </tr>
    <tr>
      <td>PATH</td>
      <td>Çalıştırılabilir dosyaların konumunu bildirir</td>
      <td>Python klasörü</td>
    </tr>
    <tr>
      <td>Sanal ortam</td>
      <td>Proje bağımlılıklarını izole eder</td>
      <td><code class="language-plaintext highlighter-rouge">venv</code></td>
    </tr>
  </tbody>
</table>

<h2 id="python-kurulumu">Python kurulumu</h2>

<p>Python, resmi olarak <a href="https://www.python.org/downloads/">python.org</a> adresinden indirilebilir. Windows kurulumunda <strong>Add Python to PATH</strong> kutusunu işaretlemek kritik önemdedir. PATH, işletim sisteminin <code class="language-plaintext highlighter-rouge">python</code> komutunu yazdığımızda yorumlayıcıyı nerede bulacağını belirleyen dizinler listesidir.</p>

<p>macOS kullanıcıları Homebrew, Linux kullanıcıları ise dağıtımlarının paket yöneticisini tercih edebilir:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># macOS</span>
brew <span class="nb">install </span>python

<span class="c"># Ubuntu veya Debian</span>
<span class="nb">sudo </span>apt update
<span class="nb">sudo </span>apt <span class="nb">install </span>python3 python3-venv
</code></pre></div></div>

<p>Kurulumun başarılı olduğunu terminalde doğrulayalım:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python <span class="nt">--version</span>
<span class="c"># Bazı sistemlerde:</span>
python3 <span class="nt">--version</span>
</code></pre></div></div>

<p>Ekranda <code class="language-plaintext highlighter-rouge">Python 3.x.x</code> benzeri bir sonuç görülüyorsa yorumlayıcı göreve hazırdır. Komut bulunamıyorsa terminali yeniden başlatmak ve PATH ayarını kontrol etmek gerekir.</p>

<h2 id="vs-code-ortamını-hazırlama">VS Code ortamını hazırlama</h2>

<p>VS Code kurulduktan sonra sol menüdeki Extensions bölümünü açıp Microsoft tarafından yayımlanan <strong>Python</strong> eklentisini yükleyin. Bu eklenti sözdizimi renklendirme, otomatik tamamlama, hata analizi ve hata ayıklama gibi özellikler sağlar.</p>

<p>Ardından bir proje klasörü oluşturup VS Code ile açın. Terminali <code class="language-plaintext highlighter-rouge">Ctrl + Ö</code> veya menüdeki <strong>Terminal &gt; New Terminal</strong> seçeneğiyle çalıştırabilirsiniz. Projeye özel sanal ortam oluşturalım:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python <span class="nt">-m</span> venv .venv
</code></pre></div></div>

<p>Sanal ortamı etkinleştirme komutu işletim sistemine göre değişir:</p>

<table>
  <thead>
    <tr>
      <th>Sistem</th>
      <th>Komut</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Windows PowerShell</td>
      <td><code class="language-plaintext highlighter-rouge">.venv\Scripts\Activate.ps1</code></td>
    </tr>
    <tr>
      <td>Windows CMD</td>
      <td><code class="language-plaintext highlighter-rouge">.venv\Scripts\activate.bat</code></td>
    </tr>
    <tr>
      <td>macOS / Linux</td>
      <td><code class="language-plaintext highlighter-rouge">source .venv/bin/activate</code></td>
    </tr>
  </tbody>
</table>

<p>Sanal ortam, bir projede kurulan paketlerin diğer projeleri etkilemesini önler. Örneğin bir proje <code class="language-plaintext highlighter-rouge">Paket 1.0</code>, diğeri <code class="language-plaintext highlighter-rouge">Paket 2.0</code> kullanabilir; böylece bağımlılık kavgası çıkmaz.</p>

<p>VS Code’da <code class="language-plaintext highlighter-rouge">Ctrl + Shift + P</code> tuşlarına basıp <strong>Python: Select Interpreter</strong> komutunu seçin ve <code class="language-plaintext highlighter-rouge">.venv</code> içindeki yorumlayıcıyı işaretleyin.</p>

<h2 id="i̇lk-programı-çalıştırma">İlk programı çalıştırma</h2>

<p><code class="language-plaintext highlighter-rouge">main.py</code> adlı bir dosya oluşturup aşağıdaki kodu yazalım:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">name</span> <span class="o">=</span> <span class="nf">input</span><span class="p">(</span><span class="sh">"</span><span class="s">Adın nedir? </span><span class="sh">"</span><span class="p">)</span>
<span class="n">message</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">"</span><span class="s">Merhaba </span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s">, Python ortamın çalışıyor!</span><span class="sh">"</span>
<span class="nf">print</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu program <code class="language-plaintext highlighter-rouge">input()</code> ile kullanıcıdan veri alır, f-string ile metin oluşturur ve <code class="language-plaintext highlighter-rouge">print()</code> ile sonucu terminale gönderir. Çalıştırmak için şu komutu kullanın:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python main.py
</code></pre></div></div>

<p>Artık yorumlayıcı, editör, terminal ve sanal ortam aynı ekipte çalışıyor. Kısacası sahne hazır; bundan sonra hatalar bile öğrenme macerasının eğlenceli karakterleri olacak!</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="Python" /><category term="VS Code" /><category term="Geliştirme Ortamı" /><summary type="html"><![CDATA[Python öğrenmeye başlarken ilk programdan önce küçük ama önemli bir görevimiz var: bilgisayara Python dilini çalıştıracak yorumlayıcıyı tanıtmak ve kod yazacağımız ortamı hazırlamak. Bu süreç, bir mutfakta yemek yapmadan önce ocağı bağlamaya ve araçları tezgâha dizmeye benzer. Doğru kurulan bir ortam sayesinde ileride “Kodum mu bozuk, bilgisayar mı naz yapıyor?” ikilemiyle daha az karşılaşırız.]]></summary></entry><entry><title type="html">Python Listeleri ve Demetleri: Değişim mi, Performans mı?</title><link href="https://sonsuzus.github.io/posts/python-listeleri-ve-demetleri-degisim-mi-performans-mi/" rel="alternate" type="text/html" title="Python Listeleri ve Demetleri: Değişim mi, Performans 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/python-listeleri-ve-demetleri-degisim-mi-performans-mi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/python-listeleri-ve-demetleri-degisim-mi-performans-mi/"><![CDATA[<p>Python’da sıralı verileri saklamak istediğimizde karşımıza çoğunlukla iki güçlü seçenek çıkar: listeler (<code class="language-plaintext highlighter-rouge">list</code>) ve demetler (<code class="language-plaintext highlighter-rouge">tuple</code>). İlk bakışta ikisi de elemanları sırayla tutar, indekslenebilir ve döngülerde kullanılabilir. Ancak perde arkasında önemli bir ayrım vardır: Listeler değiştirilebilirken demetler oluşturulduktan sonra sabit kalır. Bu fark; güvenlikten performansa, bellek tüketiminden kodun okunabilirliğine kadar pek çok kararı etkiler.</p>

<p>``</p>

<h2 id="ortak-temel-sıralı-veri-yapıları">Ortak temel: Sıralı veri yapıları</h2>

<p>Liste ve demetler, elemanların eklenme sırasını korur. Her iki yapıda da indeksler sıfırdan başlar. $n$ elemanlı bir koleksiyonun geçerli indeks aralığı şu şekilde ifade edilir:</p>

\[0 \leq i &lt; n\]

<p>Negatif indeksler ise sondan erişim sağlar. Örneğin <code class="language-plaintext highlighter-rouge">-1</code> son elemanı, <code class="language-plaintext highlighter-rouge">-2</code> sondan ikinci elemanı temsil eder. İndeks üzerinden okuma işlemi iki yapıda da genellikle $O(1)$ zaman karmaşıklığına sahiptir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">liste</span> <span class="o">=</span> <span class="p">[</span><span class="sh">"</span><span class="s">Python</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">JavaScript</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">Go</span><span class="sh">"</span><span class="p">]</span>
<span class="n">demet</span> <span class="o">=</span> <span class="p">(</span><span class="sh">"</span><span class="s">Python</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">JavaScript</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">Go</span><span class="sh">"</span><span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="n">liste</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>   <span class="c1"># Python
</span><span class="nf">print</span><span class="p">(</span><span class="n">demet</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>  <span class="c1"># Go
</span></code></pre></div></div>

<p>Bu kod, iki veri yapısında da indeksleme mantığının aynı olduğunu gösterir. Fakat koleksiyonu değiştirmeye çalıştığımızda yollar ayrılır.</p>

<h2 id="değiştirilebilirlik-listenin-süper-gücü">Değiştirilebilirlik: Listenin süper gücü</h2>

<p>Listeler <strong>mutable</strong>, yani değiştirilebilir yapılardır. Eleman ekleyebilir, silebilir veya mevcut bir değeri güncelleyebiliriz. Bu nedenle kullanıcı sepeti, görev listesi ya da sürekli büyüyen sensör verileri gibi dinamik senaryolarda idealdir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">gorevler</span> <span class="o">=</span> <span class="p">[</span><span class="sh">"</span><span class="s">Kod yaz</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">Test yap</span><span class="sh">"</span><span class="p">]</span>

<span class="n">gorevler</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="sh">"</span><span class="s">Belgele</span><span class="sh">"</span><span class="p">)</span>       <span class="c1"># Sona yeni görev ekler
</span><span class="n">gorevler</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="sh">"</span><span class="s">Temiz kod yaz</span><span class="sh">"</span>    <span class="c1"># İlk görevi günceller
</span><span class="n">gorevler</span><span class="p">.</span><span class="nf">remove</span><span class="p">(</span><span class="sh">"</span><span class="s">Test yap</span><span class="sh">"</span><span class="p">)</span>      <span class="c1"># Belirtilen görevi siler
</span>
<span class="nf">print</span><span class="p">(</span><span class="n">gorevler</span><span class="p">)</span>
</code></pre></div></div>

<p>Bir listenin sonuna <code class="language-plaintext highlighter-rouge">append()</code> ile eleman eklemek ortalama $O(1)$ maliyetlidir. Buna karşılık listenin başına eleman eklemek, diğer elemanların kaydırılmasını gerektirdiği için $O(n)$ maliyetine ulaşabilir.</p>

<p>Demetler ise <strong>immutable</strong>, yani değiştirilemez yapılardır:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">koordinat</span> <span class="o">=</span> <span class="p">(</span><span class="mf">41.0082</span><span class="p">,</span> <span class="mf">28.9784</span><span class="p">)</span>
<span class="c1"># koordinat[0] = 40.0  # TypeError üretir
</span></code></pre></div></div>

<p>Buradaki “sabitlik”, demetin tuttuğu referansların değiştirilememesi anlamına gelir. Demetin içinde bir liste bulunuyorsa o listenin içeriği yine değiştirilebilir. Kısacası demet koruyucu bir kasa gibidir; ancak kasanın içine koyduğunuz nesnenin kendi davranışı ayrıca değerlendirilmelidir.</p>

<h2 id="karşılaştırma-tablosu">Karşılaştırma tablosu</h2>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Liste (<code class="language-plaintext highlighter-rouge">list</code>)</th>
      <th>Demet (<code class="language-plaintext highlighter-rouge">tuple</code>)</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Yazım</td>
      <td><code class="language-plaintext highlighter-rouge">[1, 2, 3]</code></td>
      <td><code class="language-plaintext highlighter-rouge">(1, 2, 3)</code></td>
    </tr>
    <tr>
      <td>Değiştirilebilirlik</td>
      <td>Evet</td>
      <td>Hayır</td>
    </tr>
    <tr>
      <td>Eleman ekleme/silme</td>
      <td>Desteklenir</td>
      <td>Desteklenmez</td>
    </tr>
    <tr>
      <td>Bellek kullanımı</td>
      <td>Genellikle daha fazla</td>
      <td>Genellikle daha az</td>
    </tr>
    <tr>
      <td>Sözlük anahtarı olabilme</td>
      <td>Hayır</td>
      <td>Elemanları uygunsa evet</td>
    </tr>
    <tr>
      <td>Uygun senaryo</td>
      <td>Dinamik koleksiyonlar</td>
      <td>Sabit kayıtlar</td>
    </tr>
  </tbody>
</table>

<h2 id="demetler-neden-daha-performanslı-olabilir">Demetler neden daha performanslı olabilir?</h2>

<p>Python listeleri gelecekte eklenecek elemanlar için fazladan kapasite ayırabilir. Bu yaklaşım ekleme işlemlerini hızlandırır, fakat ek bellek kullanır. Demetlerin boyutu baştan belli olduğu için daha kompakt bir bellek düzeni kullanılabilir. Ayrıca değişmeyecekleri bilindiğinden bazı işlemler daha az kontrol gerektirir.</p>

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

<span class="n">liste</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">demet</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="nf">print</span><span class="p">(</span><span class="n">sys</span><span class="p">.</span><span class="nf">getsizeof</span><span class="p">(</span><span class="n">liste</span><span class="p">))</span>
<span class="nf">print</span><span class="p">(</span><span class="n">sys</span><span class="p">.</span><span class="nf">getsizeof</span><span class="p">(</span><span class="n">demet</span><span class="p">))</span>
</code></pre></div></div>

<p>Bu örnek, aynı elemanları içeren yapıların yüzeysel bellek boyutlarını karşılaştırır. Sonuçlar Python sürümüne ve platforma göre değişse de demet çoğunlukla daha az yer kaplar. Yine de küçük koleksiyonlarda performans farkı için okunabilirliği feda etmek pek mantıklı değildir.</p>

<h2 id="paketleme-ve-parçalama">Paketleme ve parçalama</h2>

<p>Demetler, bir fonksiyondan birden fazla değer döndürürken oldukça kullanışlıdır:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">min_max</span><span class="p">(</span><span class="n">sayilar</span><span class="p">):</span>
    <span class="k">return</span> <span class="nf">min</span><span class="p">(</span><span class="n">sayilar</span><span class="p">),</span> <span class="nf">max</span><span class="p">(</span><span class="n">sayilar</span><span class="p">)</span>

<span class="n">en_kucuk</span><span class="p">,</span> <span class="n">en_buyuk</span> <span class="o">=</span> <span class="nf">min_max</span><span class="p">([</span><span class="mi">8</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">12</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">en_kucuk</span><span class="p">,</span> <span class="n">en_buyuk</span><span class="p">)</span>
</code></pre></div></div>

<p>Fonksiyon gerçekte iki değeri bir demet içinde paketler; atama sırasında bu demet parçalanır. Böylece kod hem kısa hem de anlamlı olur.</p>

<h2 id="hangisini-seçmeliyiz">Hangisini seçmeliyiz?</h2>

<p>Veriler zamanla değişecekse liste seçmek en doğal yaklaşımdır. Koordinat, RGB rengi, tarih bileşenleri veya veritabanından gelen sabit bir kayıt gibi elemanların değişmemesi gerekiyorsa demet daha güçlü bir niyet beyanıdır. Özetle liste “üzerimde çalış” derken demet “beni bir bütün olarak koru” der. Doğru seçim yalnızca birkaç nanosaniye kazanmak değil, kodun gelecekteki okuyucusuna verinin nasıl davranması gerektiğini açıkça anlatmaktır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="Python" /><category term="Listeler" /><category term="Demetler" /><summary type="html"><![CDATA[Python’da sıralı verileri saklamak istediğimizde karşımıza çoğunlukla iki güçlü seçenek çıkar: listeler (list) ve demetler (tuple). İlk bakışta ikisi de elemanları sırayla tutar, indekslenebilir ve döngülerde kullanılabilir. Ancak perde arkasında önemli bir ayrım vardır: Listeler değiştirilebilirken demetler oluşturulduktan sonra sabit kalır. Bu fark; güvenlikten performansa, bellek tüketiminden kodun okunabilirliğine kadar pek çok kararı etkiler.]]></summary></entry><entry><title type="html">Python’da Karakter Dizileri: Metinleri Dilimle, Dönüştür ve Yönet</title><link href="https://sonsuzus.github.io/posts/pythonda-karakter-dizileri-metinleri-dilimle-donustur-ve-yonet/" rel="alternate" type="text/html" title="Python’da Karakter Dizileri: Metinleri Dilimle, Dönüştür ve Yönet" /><published>2026-07-30T00:00:00+00:00</published><updated>2026-07-30T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/pythonda-karakter-dizileri-metinleri-dilimle-donustur-ve-yonet</id><content type="html" xml:base="https://sonsuzus.github.io/posts/pythonda-karakter-dizileri-metinleri-dilimle-donustur-ve-yonet/"><![CDATA[<p>Programlama dünyasında isimlerden e-posta adreslerine, kullanıcı mesajlarından dosya içeriklerine kadar pek çok veri metin biçiminde karşımıza çıkar. Python, bu metinleri <code class="language-plaintext highlighter-rouge">str</code> yani karakter dizisi türüyle temsil eder. String’leri yalnızca ekrana yazdırılan cümleler olarak değil, indekslenebilen ve güçlü metotlarla dönüştürülebilen karakter koleksiyonları olarak düşünmek gerekir.
``</p>
<h2 id="string-nedir">String Nedir?</h2>

<p>Python’da tek, çift veya üç tırnak arasına yazılan değerler string kabul edilir. Her string, sıralı bir karakter dizisidir:</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">Python eğlencelidir!</span><span class="sh">"</span>
<span class="nf">print</span><span class="p">(</span><span class="nf">type</span><span class="p">(</span><span class="n">mesaj</span><span class="p">))</span>  <span class="c1"># &lt;class 'str'&gt;
</span></code></pre></div></div>

<p>Bir string’in uzunluğu <code class="language-plaintext highlighter-rouge">len()</code> fonksiyonuyla bulunur. Matematiksel olarak uzunluğu $n$ olan bir string’in geçerli pozitif indeksleri $0$ ile $n-1$ arasındadır. Python ayrıca sondan erişim için negatif indeksleri destekler; son karakterin indeksi $-1$ olur.</p>

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

<span class="nf">print</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">kelime</span><span class="p">))</span>  <span class="c1"># 6
</span><span class="nf">print</span><span class="p">(</span><span class="n">kelime</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>    <span class="c1"># P
</span><span class="nf">print</span><span class="p">(</span><span class="n">kelime</span><span class="p">[</span><span class="mi">5</span><span class="p">])</span>    <span class="c1"># n
</span><span class="nf">print</span><span class="p">(</span><span class="n">kelime</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>   <span class="c1"># n
</span><span class="nf">print</span><span class="p">(</span><span class="n">kelime</span><span class="p">[</span><span class="o">-</span><span class="mi">2</span><span class="p">])</span>   <span class="c1"># o
</span></code></pre></div></div>

<table>
  <thead>
    <tr>
      <th>İfade</th>
      <th>Anlamı</th>
      <th>Sonuç</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">kelime[0]</code></td>
      <td>İlk karakter</td>
      <td><code class="language-plaintext highlighter-rouge">P</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">kelime[2]</code></td>
      <td>Üçüncü karakter</td>
      <td><code class="language-plaintext highlighter-rouge">t</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">kelime[-1]</code></td>
      <td>Son karakter</td>
      <td><code class="language-plaintext highlighter-rouge">n</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">len(kelime)</code></td>
      <td>Karakter sayısı</td>
      <td><code class="language-plaintext highlighter-rouge">6</code></td>
    </tr>
  </tbody>
</table>

<p>Var olmayan bir indekse erişmek <code class="language-plaintext highlighter-rouge">IndexError</code> üretir. Örneğin altı karakterli bir string’de <code class="language-plaintext highlighter-rouge">kelime[6]</code> kullanılamaz.</p>

<h2 id="slicing-metni-dilimlemek">Slicing: Metni Dilimlemek</h2>

<p>Dilimleme söz dizimi <code class="language-plaintext highlighter-rouge">metin[başlangıç:bitiş:adım]</code> biçimindedir. Başlangıç dahil, bitiş hariçtir. Başlangıç $a$, bitiş $b$ olduğunda ve adım bir olduğunda seçilen karakter sayısı genel olarak $b-a$ kadardır.</p>

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

<span class="nf">print</span><span class="p">(</span><span class="n">metin</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">7</span><span class="p">])</span>   <span class="c1"># Program
</span><span class="nf">print</span><span class="p">(</span><span class="n">metin</span><span class="p">[:</span><span class="mi">7</span><span class="p">])</span>    <span class="c1"># Program
</span><span class="nf">print</span><span class="p">(</span><span class="n">metin</span><span class="p">[</span><span class="mi">7</span><span class="p">:])</span>    <span class="c1"># lama
</span><span class="nf">print</span><span class="p">(</span><span class="n">metin</span><span class="p">[::</span><span class="mi">2</span><span class="p">])</span>   <span class="c1"># Pormaa
</span><span class="nf">print</span><span class="p">(</span><span class="n">metin</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>  <span class="c1"># amalmargorP
</span></code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">[::-1]</code> ifadesi string’i tersten okumak için kullanılan kısa ve eğlenceli bir yöntemdir. Palindrom kontrolünde de işe yarar:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">palindrom_mu</span><span class="p">(</span><span class="n">metin</span><span class="p">):</span>
    <span class="n">temiz</span> <span class="o">=</span> <span class="n">metin</span><span class="p">.</span><span class="nf">lower</span><span class="p">().</span><span class="nf">replace</span><span class="p">(</span><span class="sh">"</span><span class="s"> </span><span class="sh">"</span><span class="p">,</span> <span class="sh">""</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">temiz</span> <span class="o">==</span> <span class="n">temiz</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>

<span class="nf">print</span><span class="p">(</span><span class="nf">palindrom_mu</span><span class="p">(</span><span class="sh">"</span><span class="s">Nalan</span><span class="sh">"</span><span class="p">))</span>  <span class="c1"># True
</span></code></pre></div></div>

<p>Bu fonksiyon önce harfleri küçültür, boşlukları kaldırır ve metni ters hâliyle karşılaştırır.</p>

<h2 id="string-metotlarıyla-dönüşüm">String Metotlarıyla Dönüşüm</h2>

<p>String’ler değiştirilemez, yani <strong>immutable</strong> yapılardır. Bir metot mevcut string’i yerinde değiştirmez; yeni bir string üretir. Sonucu korumak için bir değişkene atamak gerekir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">ad</span> <span class="o">=</span> <span class="sh">"</span><span class="s">  ada lovelace  </span><span class="sh">"</span>
<span class="n">sonuc</span> <span class="o">=</span> <span class="n">ad</span><span class="p">.</span><span class="nf">strip</span><span class="p">().</span><span class="nf">title</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"># Ada Lovelace
</span></code></pre></div></div>

<table>
  <thead>
    <tr>
      <th>Metot</th>
      <th>Görevi</th>
      <th>Örnek sonuç</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">lower()</code></td>
      <td>Harfleri küçültür</td>
      <td><code class="language-plaintext highlighter-rouge">python</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">upper()</code></td>
      <td>Harfleri büyütür</td>
      <td><code class="language-plaintext highlighter-rouge">PYTHON</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">title()</code></td>
      <td>Kelime başlarını büyütür</td>
      <td><code class="language-plaintext highlighter-rouge">Merhaba Dünya</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">strip()</code></td>
      <td>Kenar boşluklarını siler</td>
      <td><code class="language-plaintext highlighter-rouge">metin</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">replace(a, b)</code></td>
      <td>Parçaları değiştirir</td>
      <td>Yeni metin</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">split()</code></td>
      <td>String’i listeye böler</td>
      <td><code class="language-plaintext highlighter-rouge">['a', 'b']</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">join()</code></td>
      <td>Parçaları birleştirir</td>
      <td><code class="language-plaintext highlighter-rouge">a-b</code></td>
    </tr>
  </tbody>
</table>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">cumle</span> <span class="o">=</span> <span class="sh">"</span><span class="s">Python hızlı ve okunaklıdır</span><span class="sh">"</span>
<span class="n">kelimeler</span> <span class="o">=</span> <span class="n">cumle</span><span class="p">.</span><span class="nf">split</span><span class="p">()</span>
<span class="nf">print</span><span class="p">(</span><span class="n">kelimeler</span><span class="p">)</span>

<span class="n">yeni_cumle</span> <span class="o">=</span> <span class="sh">"</span><span class="s">-</span><span class="sh">"</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="n">kelimeler</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">yeni_cumle</span><span class="p">)</span>  <span class="c1"># Python-hızlı-ve-okunaklıdır
</span></code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">split()</code> metni parçalarken <code class="language-plaintext highlighter-rouge">join()</code> parçaları yeniden bir araya getirir. Özellikle CSV verileri, etiketler ve kullanıcı girdileri işlenirken bu ikili adeta metin mutfağının bıçak ve kesme tahtasıdır.</p>

<h2 id="arama-ve-kontrol-i̇şlemleri">Arama ve Kontrol İşlemleri</h2>

<p>Bir parçanın metinde bulunup bulunmadığı <code class="language-plaintext highlighter-rouge">in</code> operatörüyle kontrol edilebilir. <code class="language-plaintext highlighter-rouge">find()</code> konumu döndürür; eşleşme yoksa <code class="language-plaintext highlighter-rouge">-1</code> verir. <code class="language-plaintext highlighter-rouge">startswith()</code> ve <code class="language-plaintext highlighter-rouge">endswith()</code> ise başlangıç ya da bitiş denetimi yapar.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">dosya</span> <span class="o">=</span> <span class="sh">"</span><span class="s">rapor_2026.pdf</span><span class="sh">"</span>

<span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">2026</span><span class="sh">"</span> <span class="ow">in</span> <span class="n">dosya</span><span class="p">)</span>          <span class="c1"># True
</span><span class="nf">print</span><span class="p">(</span><span class="n">dosya</span><span class="p">.</span><span class="nf">find</span><span class="p">(</span><span class="sh">"</span><span class="s">rapor</span><span class="sh">"</span><span class="p">))</span>      <span class="c1"># 0
</span><span class="nf">print</span><span class="p">(</span><span class="n">dosya</span><span class="p">.</span><span class="nf">startswith</span><span class="p">(</span><span class="sh">"</span><span class="s">rapor</span><span class="sh">"</span><span class="p">))</span> <span class="c1"># True
</span><span class="nf">print</span><span class="p">(</span><span class="n">dosya</span><span class="p">.</span><span class="nf">endswith</span><span class="p">(</span><span class="sh">"</span><span class="s">.pdf</span><span class="sh">"</span><span class="p">))</span>    <span class="c1"># True
</span></code></pre></div></div>

<p>Sonuç olarak indeksleme tek karaktere erişmeyi, slicing belirli aralıkları çıkarmayı, yerleşik metotlar ise metni temizleyip dönüştürmeyi sağlar. Bu araçları birlikte kullanmak; doğrulama, arama, veri temizleme ve doğal dil işleme gibi daha büyük problemlerin temelini oluşturur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="Python" /><category term="String" /><category term="Metin İşleme" /><summary type="html"><![CDATA[Programlama dünyasında isimlerden e-posta adreslerine, kullanıcı mesajlarından dosya içeriklerine kadar pek çok veri metin biçiminde karşımıza çıkar. Python, bu metinleri str yani karakter dizisi türüyle temsil eder. String’leri yalnızca ekrana yazdırılan cümleler olarak değil, indekslenebilen ve güçlü metotlarla dönüştürülebilen karakter koleksiyonları olarak düşünmek gerekir.]]></summary></entry><entry><title type="html">Python’da Koşullu Durumlar: if-elif-else ile Akışı Yönetmek</title><link href="https://sonsuzus.github.io/posts/pythonda-kosullu-durumlar-if-elif-else-ile-akisi-yonetmek/" rel="alternate" type="text/html" title="Python’da Koşullu Durumlar: if-elif-else ile Akışı Yönetmek" /><published>2026-07-30T00:00:00+00:00</published><updated>2026-07-30T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/pythonda-kosullu-durumlar-if-elif-else-ile-akisi-yonetmek</id><content type="html" xml:base="https://sonsuzus.github.io/posts/pythonda-kosullu-durumlar-if-elif-else-ile-akisi-yonetmek/"><![CDATA[<p>Bir programın yalnızca komutları sırayla çalıştırması çoğu zaman yeterli değildir. Kullanıcının yaşına göre farklı mesaj göstermek, hatalı girişleri engellemek veya bir oyundaki karakterin canı sıfıra düştüğünde macerayı bitirmek için programın karar vermesi gerekir. Python’daki <code class="language-plaintext highlighter-rouge">if</code>, <code class="language-plaintext highlighter-rouge">elif</code> ve <code class="language-plaintext highlighter-rouge">else</code> blokları, kodumuza tam olarak bu karar mekanizmasını kazandırır.</p>

<p>``</p>

<h2 id="koşul-nedir">Koşul Nedir?</h2>

<p>Koşul, sonucu doğru veya yanlış olan bir ifadedir. Programlama dilinde bu iki sonuç <code class="language-plaintext highlighter-rouge">True</code> ve <code class="language-plaintext highlighter-rouge">False</code> değerleriyle temsil edilir. Örneğin <code class="language-plaintext highlighter-rouge">puan &gt;= 50</code> ifadesi, puan 50 veya daha büyükse doğru; aksi durumda yanlıştır.</p>

<p>Bu mantık matematiksel olarak bir karar fonksiyonu şeklinde düşünülebilir:</p>

\[f(x) = \begin{cases}
\text{Geçti}, &amp; x \geq 50 \\
\text{Kaldı}, &amp; x &lt; 50
\end{cases}\]

<p>Buradaki $x$, öğrencinin puanıdır. Koşullu bloklar, bu matematiksel ayrımı çalıştırılabilir koda dönüştürür.</p>

<h2 id="if-elif-ve-else-görevleri">if, elif ve else Görevleri</h2>

<table>
  <thead>
    <tr>
      <th>Anahtar kelime</th>
      <th>Ne zaman çalışır?</th>
      <th>Kullanım amacı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">if</code></td>
      <td>İlk koşul doğruysa</td>
      <td>Karar zincirini başlatmak</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">elif</code></td>
      <td>Önceki koşullar yanlış, kendi koşulu doğruysa</td>
      <td>Alternatif durumları sınamak</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">else</code></td>
      <td>Diğer koşulların tamamı yanlışsa</td>
      <td>Geriye kalan durumları yakalamak</td>
    </tr>
  </tbody>
</table>

<p>Basit bir not değerlendirme sistemi oluşturalım:</p>

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

<span class="k">if</span> <span class="n">puan</span> <span class="o">&gt;=</span> <span class="mi">85</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Pekiyi</span><span class="sh">"</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">puan</span> <span class="o">&gt;=</span> <span class="mi">70</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">İyi</span><span class="sh">"</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">puan</span> <span class="o">&gt;=</span> <span class="mi">50</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Geçer</span><span class="sh">"</span><span class="p">)</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">Kaldı</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>Python koşulları yukarıdan aşağıya kontrol eder. <code class="language-plaintext highlighter-rouge">puan &gt;= 70</code> doğru olduğunda ekrana <code class="language-plaintext highlighter-rouge">İyi</code> yazdırılır ve zincirin geri kalanı değerlendirilmez. Bu nedenle koşulların sırası önemlidir. Önce daha genel olan <code class="language-plaintext highlighter-rouge">puan &gt;= 50</code> yazılsaydı 76 puan, yanlışlıkla yalnızca <code class="language-plaintext highlighter-rouge">Geçer</code> olarak sınıflandırılırdı.</p>

<h2 id="karşılaştırma-ve-mantıksal-operatörler">Karşılaştırma ve Mantıksal Operatörler</h2>

<p>Koşullar oluşturulurken karşılaştırma operatörlerinden yararlanılır:</p>

<table>
  <thead>
    <tr>
      <th>Operatör</th>
      <th>Anlamı</th>
      <th>Örnek</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">==</code></td>
      <td>Eşittir</td>
      <td><code class="language-plaintext highlighter-rouge">rol == "admin"</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">!=</code></td>
      <td>Eşit değildir</td>
      <td><code class="language-plaintext highlighter-rouge">durum != "kapalı"</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">&gt;</code> / <code class="language-plaintext highlighter-rouge">&lt;</code></td>
      <td>Büyük / küçüktür</td>
      <td><code class="language-plaintext highlighter-rouge">sicaklik &gt; 30</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">&gt;=</code> / <code class="language-plaintext highlighter-rouge">&lt;=</code></td>
      <td>Büyük-eşit / küçük-eşit</td>
      <td><code class="language-plaintext highlighter-rouge">yas &gt;= 18</code></td>
    </tr>
  </tbody>
</table>

<p>Birden fazla şartı birleştirmek için <code class="language-plaintext highlighter-rouge">and</code>, <code class="language-plaintext highlighter-rouge">or</code> ve <code class="language-plaintext highlighter-rouge">not</code> kullanılır. <code class="language-plaintext highlighter-rouge">and</code> bütün şartların, <code class="language-plaintext highlighter-rouge">or</code> ise en az bir şartın doğru olmasını bekler. <code class="language-plaintext highlighter-rouge">not</code>, mantıksal sonucu tersine çevirir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">yas</span> <span class="o">=</span> <span class="mi">22</span>
<span class="n">bileti_var</span> <span class="o">=</span> <span class="bp">True</span>

<span class="k">if</span> <span class="n">yas</span> <span class="o">&gt;=</span> <span class="mi">18</span> <span class="ow">and</span> <span class="n">bileti_var</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Etkinliğe giriş yapabilirsiniz.</span><span class="sh">"</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">yas</span> <span class="o">&gt;=</span> <span class="mi">18</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">bileti_var</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Önce bilet almalısınız.</span><span class="sh">"</span><span class="p">)</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">Yaş sınırı nedeniyle giriş yapılamaz.</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu kod hem yaş hem de bilet bilgisini değerlendirerek akışı dinamik biçimde yönlendirir. Gerçek uygulamalarda kullanıcı yetkilendirme, ödeme kontrolü ve form doğrulama gibi pek çok süreç aynı mantığa dayanır.</p>

<h2 id="i̇ç-i̇çe-koşullar-mı-birleşik-koşullar-mı">İç İçe Koşullar mı, Birleşik Koşullar mı?</h2>

<p>Bir <code class="language-plaintext highlighter-rouge">if</code> bloğunun içine başka bir <code class="language-plaintext highlighter-rouge">if</code> yazılabilir. Buna iç içe koşul denir. Ancak gereksiz katmanlar kodu merdivene dönüştürebilir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">kullanici_aktif</span> <span class="o">=</span> <span class="bp">True</span>
<span class="n">rol</span> <span class="o">=</span> <span class="sh">"</span><span class="s">admin</span><span class="sh">"</span>

<span class="k">if</span> <span class="n">kullanici_aktif</span><span class="p">:</span>
    <span class="k">if</span> <span class="n">rol</span> <span class="o">==</span> <span class="sh">"</span><span class="s">admin</span><span class="sh">"</span><span class="p">:</span>
        <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Yönetim paneli açıldı.</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>Aynı kontrol, <code class="language-plaintext highlighter-rouge">if kullanici_aktif and rol == "admin":</code> biçiminde daha sade yazılabilir. Yine de ikinci kontrol yalnızca ilk koşul gerçekleştiğinde anlamlıysa iç içe yapı tercih edilebilir.</p>

<h2 id="yaygın-hatalar-ve-i̇puçları">Yaygın Hatalar ve İpuçları</h2>

<p>Python’da bloklar süslü parantezle değil, girintilerle belirlenir. Bu yüzden koşul altındaki satırlar aynı miktarda girintilenmelidir. Ayrıca değer atayan <code class="language-plaintext highlighter-rouge">=</code> ile karşılaştırma yapan <code class="language-plaintext highlighter-rouge">==</code> birbirine karıştırılmamalıdır.</p>

<p>Koşulları yazarken en özel durumdan en genel duruma ilerlemek, beklenmeyen girişler için bir <code class="language-plaintext highlighter-rouge">else</code> dalı bırakmak ve karmaşık ifadeleri anlamlı değişkenlere ayırmak okunabilirliği artırır. Kısacası <code class="language-plaintext highlighter-rouge">if-elif-else</code>, programın yol ayrımlarındaki trafik ışığıdır: Doğru tasarlanırsa akış düzenli ilerler; yanlış sıralanırsa kod kendini beklenmedik bir mahallede bulabilir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="Python" /><category term="Akış Kontrolü" /><category term="Koşullu İfadeler" /><summary type="html"><![CDATA[Bir programın yalnızca komutları sırayla çalıştırması çoğu zaman yeterli değildir. Kullanıcının yaşına göre farklı mesaj göstermek, hatalı girişleri engellemek veya bir oyundaki karakterin canı sıfıra düştüğünde macerayı bitirmek için programın karar vermesi gerekir. Python’daki if, elif ve else blokları, kodumuza tam olarak bu karar mekanizmasını kazandırır.]]></summary></entry></feed>