Python’da Koşullu Durumlar: if-elif-else ile Akışı Yönetmek

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.

Devamı...

Python’da Karakter Dizileri: Metinleri Dilimle, Dönüştür ve Yönet

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.

Devamı...

Python’da Hata Yakalama: Try-Except ile Programları Ayakta Tutmak

Bir programın doğru kodlanmış olması, çalışırken asla sorun yaşamayacağı anlamına gelmez. Kullanıcı sayı yerine metin girebilir, beklenen dosya silinmiş olabilir veya uzak sunucu kısa süreliğine yanıt vermeyebilir. Python’daki try-except yapısı, bu beklenmedik durumları programı aniden çökertmeden yakalamamızı ve kontrollü biçimde yönetmemizi sağlar.

Devamı...

Python Sözlükleri ve Kümeleri: Hızlı Aramanın Anahtarları

Bir kullanıcıyı adına göre bulmak veya tekrar eden ürün kodlarını ayıklamak istediğinizde listeler işe yarar; ancak veri büyüdükçe tek tek arama yapmak yorucu hâle gelir. Python’ın sözlükleri (dict) ve kümeleri (set), hash tabanlı yapıları sayesinde arama, ekleme ve silme işlemlerini çoğu durumda son derece hızlı gerçekleştirir. Biri anahtarları değerlerle eşleştirirken diğeri yalnızca benzersiz elemanları saklar.

Devamı...

Python Paket Yönetimi ve PIP: Tekerleği Yeniden İcat Etmeden Kod Yazmak

Bir projede HTTP isteği göndermek, Excel dosyası okumak veya görsel işlemek istediğinizi düşünün. Bunların tamamını sıfırdan geliştirmek mümkün olsa da pek mantıklı değildir. Python modülleri ve paket yönetimi, başkalarının test edilmiş çözümlerini projemize güvenli ve düzenli biçimde dahil etmemizi sağlar. Böylece enerjimizi tekerleği yeniden icat etmeye değil, gerçekten özgün problemlere ayırabiliriz.

Devamı...

Python Listeleri ve Demetleri: Değişim mi, Performans mı?

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.

Devamı...

Python Kurulumu ve VS Code ile Geliştirme Ortamı Hazırlama

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.

Devamı...

Python Felsefesi ve Temel Sözdizimi: Girintilerle Gelen Düzen

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.

Devamı...

Python Dekoratörleri: Fonksiyonlara Kaynak Kodu Değiştirmeden Süper Güç Kazandırmak

Bir fonksiyona zaman ölçümü, yetki kontrolü veya kayıt tutma özelliği eklemek istediğinizi düşünün. Aynı kodları her fonksiyonun içine yerleştirmek çalışır; ancak kısa sürede bakım kâbusuna dönüşür. Python dekoratörleri, mevcut fonksiyonun kaynak kodunu değiştirmeden onu başka bir fonksiyonla sarar ve yeni davranışlar kazandırır. Kısacası dekoratör, fonksiyonunuzun üzerine giydirilen akıllı bir monttur.

Devamı...

Operatörler ve İfadeler: Kodun Matematik Kutusu

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.

Devamı...

Nesne Yönelimli Programlama Temelleri: Gerçek Dünyadan Sınıflara

Bir otomobili yazılımla temsil etmek istediğimizi düşünelim. Otomobilin rengi, hızı ve yakıt miktarı gibi verileri; hızlanma veya fren yapma gibi davranışları vardır. Nesne Yönelimli Programlama (Object-Oriented Programming — OOP), birbiriyle ilişkili bu verileri ve davranışları tek bir yapı içinde toplamamızı sağlar. Böylece kodumuz, gerçek dünyadaki kavramlara benzeyen, anlaşılır ve yeniden kullanılabilir parçalardan oluşur.

Devamı...

List Comprehensions ile Pythonik ve Okunaklı Veri Üretimi

Python’da bir listedeki verileri dönüştürmek veya belirli koşullara göre süzmek için uzun döngüler yazmak zorunda değilsiniz. List comprehension, klasik for döngülerini daha kısa, çoğu zaman daha okunaklı ve verimli bir ifadeye dönüştürür. Fakat mesele yalnızca satır sayısını azaltmak değildir; asıl amaç, yeni listenin nasıl üretildiğini doğrudan anlatan Pythonik bir sözdizimi kullanmaktır.

Devamı...

Kapsam ve İsim Alanları: Değişkenler Nerede Yaşar?

Bir değişkeni tanımlamak, ona yalnızca bir değer vermek değildir; aynı zamanda bu ismin programın hangi bölümlerinde görülebileceğini de belirlemektir. Kapsam (scope), bir isme erişilebilen kod bölgesini; isim alanı (namespace) ise isimlerle nesneler arasındaki eşleşmelerin tutulduğu yapıyı ifade eder. Özellikle Python gibi girintinin blok yapısını belirlediği dillerde bu iki kavramı anlamak, beklenmedik hataları önlemenin anahtarıdır.

Devamı...

Kalıtım ve Çok Biçimlilik: Nesne Yönelimli Dünyanın Aile Albümü

Nesne yönelimli programlamada bazı sınıflar birbirine şaşırtıcı derecede benzer. Örneğin kedi de köpek de bir hayvandır; ikisinin de adı, yaşı ve ses çıkarma davranışı vardır. Ancak çıkardıkları sesler aynı değildir. Kalıtım ortak özellikleri tek bir temel sınıfta toplamamızı, çok biçimlilik ise ortak görünen davranışların nesneye göre farklı sonuç üretmesini sağlar. Böylece kodumuz hem tekrar etmekten kurtulur hem de yeni türlere daha kolay uyum sağlar.

Devamı...

Hata Ayıklamanın Zen'i: Bir Bug'ı Bulmak Aslında Kendini Bulmaktır

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?

Devamı...

Fonksiyonlar ve Modüler Kodlama: Kod Tekrarından Düzenli Tasarıma

Bir program büyüdükçe aynı işlemleri yapan kod satırları farklı yerlerde tekrar belirmeye başlar. Başlangıçta masum görünen bu kopyalar, değişiklik zamanı geldiğinde küçük birer baş ağrısı fabrikasına dönüşür. Fonksiyonlar, belirli bir görevi yerine getiren kod bloklarını isimlendirip ihtiyaç duyduğumuzda çağırmamızı sağlar. Böylece program, devasa bir komut yığını yerine anlaşılır ve yeniden kullanılabilir parçalardan oluşur.

Devamı...

Dosya İşlemleri ve Veri Kalıcılığı: Baytları Kalıcı Bilgiye Dönüştürmek

Bir program çalışırken üretilen değişkenler çoğunlukla RAM üzerinde yaşar; program kapanınca da küçük bir vedalaşma töreni bile yapmadan kaybolur. Dosya işlemleri, dışarıdaki ham veriyi belleğe almayı ve işlenmiş sonuçları kalıcı depolamaya yazmayı sağlar. Böylece uygulamamız yalnızca “anı yaşayan” bir süreç olmaktan çıkar, geçmişini hatırlayan bir sisteme dönüşür.

Devamı...

Döngüsel Yapılar ve İterasyon: while ve for ile Kodun Ritmini Yakalamak

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.

Devamı...

Değişkenler ve Dinamik Tip Sistemi: Verinin Çalışma Zamanındaki Macerası

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.

Devamı...

Blockchain'in Sosyolojik Vaadi: Güvenmeden Güvenmek Mümkün mü?

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.

Devamı...