C Bilen Python’u Neden Başka Görür? Zihnin Gizli Derleyicisi

Bir programlama dilini öğrenmek, yalnızca yeni komutlar ezberlemek değildir; zihne yeni bir gözlük takmaktır. C öğrenmiş biri Python’a geçtiğinde, çoğu zaman sadece farklı bir söz dizimiyle karşılaşmaz. Belleğin, türlerin, döngülerin, fonksiyonların ve hataların dünyasına dair eski alışkanlıklarıyla yeni bir ülkeye göç eder. Bavulunda işaretçiler, derleme hataları, noktalı virgüller ve karakter dizilerinin sert disiplini vardır. Python ise kapıda terlikle karşılar: Rahat ol, der, burada girintiler konuşur.

İşte öğrenme transferi tam bu noktada sahneye çıkar. Önceden öğrenilmiş bir bilginin, yeni bir öğrenme alanını etkilemesine transfer diyoruz. Bu etki iki türlü olabilir: olumlu ya da olumsuz. C’de değişkenlerin tipini açıkça belirtmeye alışmış birinin Python’da veri türlerini daha dikkatli düşünmesi olumlu transferdir. Aynı kişinin her şeyi düşük seviyeli bellek mantığıyla çözmeye çalışıp Python’un hazır soyutlamalarını görmezden gelmesi ise olumsuz transfer olabilir. Yani eski bilgi bazen pusula, bazen de pranga olur.

C’nin Zihinsel Kasları

C, programcıya bilgisayarın perde arkasını gösteren sert ama öğretici bir ustadır. Bellek yönetimi, işaretçiler, dizilerin sınırları, derleme süreci ve donanıma yakın düşünme biçimi, öğrencide mekanik bir sezgi geliştirir. C bilen biri çoğu zaman programı yalnızca ne yaptığıyla değil, nasıl yaptığıyla da düşünür. Bir liste büyürken içeride neler olabilir, fonksiyon çağrısı bellekte nasıl temsil edilir, karakter dizisi neden tehlikeli olabilir gibi sorular zihnin arka planında sürekli çalışır.

Bu zihinsel kas, Python öğrenirken büyük avantaj sağlar. Çünkü Python’un sunduğu kolaylıkların sihir değil, soyutlama olduğunu fark edersiniz. Bir listeye eleman eklemek tek satırdır; fakat C geçmişiniz varsa o tek satırın arkasında kapasite, yeniden ayırma, referans ve nesne yönetimi gibi süreçlerin saklandığını sezersiniz. Böylece Python sizin için oyuncak değil, zarif bir makineye dönüşür.

Python’un Esnekliği ve Eski Refleksler

Fakat her kas her sporda işe yaramaz. C’den gelen programcı bazen Python’da gereksiz yere düşük seviyeli düşünür. Basit bir liste kavrama ifadesiyle çözülebilecek bir problemi uzun döngülerle yazar. Sözlüklerin, kümelerin, üreteçlerin ve dekoratörlerin sunduğu dilsel zarafeti ilk anda hafife alabilir. Çünkü zihni hâlâ şunu sorar: Bellekte tam olarak ne oluyor? Bu soru değerlidir, ama her zaman ilk soru olmak zorunda değildir.

Python’un düşünce yapısı daha çok okunabilirlik, hızlı deneme, soyutlama ve ifade gücü etrafında şekillenir. C size makinenin nasıl düşündüğünü öğretirken, Python size insanın problemi nasıl daha yalın ifade edebileceğini öğretir. C’de çözüm çoğu zaman inşa edilir; Python’da ise çoğu zaman tarif edilir. Bu fark küçümsenmemelidir. Birinde tornavida ve lehim vardır, diğerinde harita ve büyüteç.

Transferi Bilinçli Kullanmak

İyi bir öğrenen, eski bilgisini silmez; onu yeniden konumlandırır. C’den Python’a geçerken yapılması gereken şey, C mantığını çöpe atmak değil, onu doğru rafta tutmaktır. Performans, bellek, veri yapısı veya algoritmik maliyet konuşuluyorsa C geçmişi altın değerindedir. Ama temiz kod, hızlı prototipleme, veri analizi veya otomasyon yapılıyorsa Python’un doğal deyimlerini öğrenmek gerekir. Her dilin kendi ritmi vardır; iyi programcı o ritmi duyar.

Bu yüzden Python öğrenen C programcısına verilecek en iyi tavsiye şudur: Önce Python gibi yaz, sonra C gibi sorgula. Yani çözümü Python’un araçlarıyla sade kur; ardından gerekirse altta olup biteni analiz et. Bu yaklaşım hem dilin felsefesine saygı duyar hem de derin teknik sezgiyi korur. Tersi durumda, Python’da C yazmaya çalışırsınız; çalışan ama ruhsuz, doğru ama hantallaşmış programlar üretirsiniz.

Sonuçta programlama dilleri yalnızca bilgisayara verilen emirler değildir; zihnin problem görme biçimleridir. C size disiplin, dikkat ve makine sezgisi kazandırır. Python ise esneklik, açıklık ve soyutlama cesareti verir. Öğrenme transferinin ustalığı, bu iki sesi kavga ettirmek değil, orkestraya dönüştürmektir. Çünkü gerçek programcı tek bir dilde konuşan kişi değildir; farklı dillerin zihninde açtığı pencereleri kullanarak problemi daha derinden görebilen kişidir.

Python Rahat Koltuksa, C Neden Hâlâ Motor Odasında Terletiyor?

Programlama dilleri arasında hız tartışması çoğu zaman bir pist yarışına benzetilir: Python ağır adımlarla yürüyen zeki bir profesör, C ise yağ lekeleri içinde çalışan, homurdanan ama inanılmaz hızlı bir mekanik canavar. Bu benzetme komiktir ama eksiktir. Çünkü mesele yalnızca kimin daha hızlı koştuğu değildir; kimin neyi, hangi bedelle, hangi bilinç düzeyinde yaptığıdır. Python ile C arasındaki fark, aslında insanın konfor arzusu ile gerçekliğin çıplak maliyetleri arasındaki kadim pazarlığın bilgisayar ekranına düşmüş gölgesidir.

Python: Düşüncenin Hızlı Prototipi

Python’un büyüsü, işlemciden çok insan beynini hızlandırmasındadır. Bir fikri dakikalar içinde koda dökebilirsiniz. Dosya okuyabilir, veri işleyebilir, grafik çizebilir, yapay zekâ modeli kurabilir, web servisi ayağa kaldırabilirsiniz. Üstelik noktalı virgül ayini yapmadan, bellek yönetiminin karanlık koridorlarında kaybolmadan. Python, programcıya şunu fısıldar: “Sen problemi düşün, ben ayrıntıların bir kısmını hallederim.”

Bu konforun bedeli vardır. Python çoğunlukla yorumlanan, dinamik tipli ve yüksek seviyeli bir dildir. Değişkenin türünü çalışma zamanında anlamak, nesneleri esnek biçimde yönetmek, otomatik bellek temizliği yapmak, soyutlamaları kullanıcıdan saklamak zaman alır. CPU’nun gözünde bu nezaket pahalıdır. Makine, sizin şık bir satırda yazdığınız şeyi anlamak için sahne arkasında onlarca küçük kontrol, çağrı ve düzenleme yapar. Yani Python’un zarafeti, silikon düzeyinde bürokrasi üretir.

C: Makineyle Yapılan Sert Pazarlık

C ise bambaşka bir anlaşma teklif eder: “Sana hız veririm, ama hatalarının sorumluluğunu da alırsın.” Belleği kendin ayırırsın, dizinin sınırına çarparsan kimse seni nazikçe uyarmayabilir, yanlış işaretçiyle evrenin karanlık tarafına geçebilirsin. C, programcıya büyük güç verir; ama bu güç, kullanım kılavuzu olmayan bir elektrik santrali gibidir. Yanlış hamlede program çökmez bile; daha kötüsü, çalışıyor gibi görünür.

C’nin hızlı olmasının temel nedeni, donanıma yakın konuşmasıdır. Derleyici kodu makine diline çevirir, tipler nettir, bellek düzeni daha öngörülebilirdir, soyutlama katmanları daha incedir. Bir döngüde milyarlarca işlem yapacaksanız, her küçük ek maliyet büyür ve Python’un rahatlığı bir anda sırt çantasına konmuş tuğlalara dönüşür. C burada acımasız gerçekçidir: İşlemci ne yapacaksa onu söyler, fazla şiir yazmaz.

Hız Nedir, Kime Göredir?

Yine de “C hızlıdır, Python yavaştır” demek bazen düşünsel tembelliktir. Hangi hızdan söz ediyoruz? Programın çalışma hızı mı, geliştirme hızı mı, bakım hızı mı, ekibin anlama hızı mı? Bir veri analisti için Python, üç saatlik işi üç dakikaya indirebilir. Bir gömülü sistem mühendisi için aynı Python, mikrodenetleyicide lüks bir yük olabilir. Bir oyun motorunun fizik çekirdeğinde C ya da C++ parıldarken, bir otomasyon betiğinde Python kral gibi davranır.

Ayrıca Python ekosisteminin büyük sırrı şudur: En hızlı Python kodu çoğu zaman Python’da çalışmaz. NumPy, TensorFlow, PyTorch gibi kütüphaneler arka planda C, C++ veya CUDA gibi daha düşük seviyeli katmanlara yaslanır. Kullanıcı Python ile orkestrayı yönetir; ağır enstrümanları ise alt katta kaslı müzisyenler çalar. Bu, modern yazılımın güzel ikiyüzlülüğüdür: Üstte konfor, altta ter.

Yaşam Felsefesi Olarak Soyutlama

Python ve C bize yalnızca teknik değil, felsefi bir ders de verir. Hayatta da soyutlamalarla yaşarız. Para, hukuk, takvim, unvan, arayüz: Hepsi karmaşık gerçekliği yönetilebilir hale getiren yüksek seviyeli yapılardır. Ama kriz anlarında soyutlama katmanları soyulur. Banka uygulamasındaki rakamın arkasında enerji, emek, lojistik ve güven vardır. Python satırının arkasında da bellek, register, önbellek, derleyici ve işletim sistemi vardır.

Bilge programcı, konforu küçümsemez; ama onun bedelini bilir. Düşük seviyeyi romantikleştirmez; ama onun disiplinini anlar. Her şeyi C ile yazmak, şehirde her yere tankla gitmeye benzer. Her şeyi Python ile yazmak ise bazen dağa terlikle tırmanmaktır. Ustalık, aracın karakterini problemle eşleştirmektir.

Sonuçta Python bize düşüncenin akışını, C ise gerçekliğin sürtünmesini öğretir. Biri zihnin hızını artırır, diğeri makinenin nabzına dokundurur. İyi mühendis ikisini düşman gibi değil, farklı cephelerde savaşan iki müttefik gibi görür. Çünkü yazılımda da yaşamda da asıl soru şudur: Nerede rahatlık satın almalı, nerede bedeli doğrudan ödemeliyiz?

Çalışan Kod Yetmez: Python’da Okunabilirlik Neden Bir Nezaket Meselesidir?

Bir kod parçasının çalışması, onun iyi olduğu anlamına gelmez. Bu cümle ilk bakışta haksız gibi durabilir; sonuçta bilgisayar ekranda beklenen çıktıyı veriyorsa mesele kapanmış sayılmaz mı? Hayır. Çünkü kod yalnızca makineye yazılmaz. Kod, gelecekte onu okuyacak insana da yazılır: ekip arkadaşına, stajyere, açık kaynak katkıcısına ve en önemlisi, altı ay sonra o satırlara boş gözlerle bakacak olan sana.

Python bu konuda özel bir dile sahiptir. Sözdizimi sade, girintiler anlamlı, standart kütüphanesi zengindir. Fakat Python’ın asıl gücü sadece teknik olanaklarında değil, kültüründedir. Python topluluğunun meşhur ilkelerinden biri şudur: okunabilirlik önemlidir. Bu ilke, basit bir stil önerisi değil, yazılım dünyasında ahlaki bir pusuladır. Çünkü okunamayan kod, başkasının zamanını izinsizce harcar.

Makine Anlar, İnsan Acı Çeker

Bilgisayar için değişkenin adının x, tmp, zzz ya da user_session_timeout olması arasında büyük bir duygusal fark yoktur. Bilgisayar kırılmaz, sinirlenmez, kahveye ihtiyaç duymaz. İnsan ise bağlam arar. Niyet arar. Bir fonksiyonun neden orada olduğunu, hangi durumda ne yaptığını, hangi sınırları gözettiğini anlamaya çalışır. Eğer kod bu sorulara cevap vermiyorsa, çalışan bir labirentten ibarettir.

Okunabilirlik, kodun niyetini görünür kılma sanatıdır. Bir fonksiyon tek bir iş yapıyorsa, adı yaptığı işi söylüyorsa, karmaşık koşullar anlamlı parçalara ayrılmışsa, yorumlar gereksizi tekrar etmek yerine kararların nedenini açıklıyorsa, orada teknik beceriden daha fazlası vardır. Orada bir insan diğer insana şöyle der: Seni düşündüm.

Bu yüzden okunabilir kod bir nezaket biçimidir. Kapıyı çarpmadan kapatmak, toplantıya zamanında gelmek, ortak mutfağı temiz bırakmak gibidir. Kod tabanları da ortak yaşam alanlarıdır. Dağınık bırakılan her fonksiyon, gelecekte birinin zihinsel masasına dökülen kırıntıdır.

PEP 8 Bir Görgü Kuralı Kitabıdır

Python’da PEP 8 çoğu zaman biçimsel bir standart gibi anlaşılır: satır uzunluğu, boşluklar, isimlendirme, girintiler. Oysa daha derin bakınca PEP 8 bir topluluk sözleşmesidir. Hepimiz aynı dili konuşalım ki birbirimizi daha az yanlış anlayalım der. Kod biçimlendiriciler, linter araçları ve tip ipuçları bu sözleşmeyi destekleyen medeni kurumlar gibidir.

Elbette okunabilirlik yalnızca güzel hizalanmış satırlar değildir. Bazen fazla akıllı olmak okunabilirliğin düşmanıdır. Tek satırda yazılmış büyülü bir liste üreteci, beş farklı koşulu ve iki yan etkiyi içine sıkıştırıyorsa, belki de programcı zekasını değil sabırsızlığını sergiliyordur. Kod golfü eğlencelidir; üretim kodunda ise çoğu zaman toplumsal bir suç mahalline dönüşür.

İyi Python kodu kendini açıklamaya çalışır. Örneğin kullanıcıları filtreleyen bir fonksiyon düşünelim. İçinde karmaşık bir if yığını yerine is_active_user, has_valid_subscription, can_receive_email gibi küçük, anlamlı yardımcı fonksiyonlar varsa, okuyucu kodu çözmez; kodla konuşur. Bu fark önemlidir. Çözülen şey şifredir. Okunan şey metindir.

Etik, Bakım Maliyetinde Saklıdır

Yazılım projelerinde maliyetin büyük kısmı ilk yazımda değil, bakımda ortaya çıkar. Bugün hızlıca geçiştirilen bir isimlendirme, yarın hatalı bir düzeltmeye; belirsiz bir fonksiyon, gelecek ay yanlış kullanılan bir API’ye dönüşebilir. Okunamazlık yalnızca estetik bir kusur değildir; hata üretir, güvenliği zayıflatır, ekipleri yavaşlatır, yeni katılanları dışarıda bırakır.

Bu noktada etik başlar. Çünkü etik, çoğu zaman görünmeyen sonuçları hesaba katma yeteneğidir. Ben şimdi bu kodu nasıl yazarsam, benden sonra gelenin hayatı kolaylaşır? Hangi soyutlama gerçekten gerekli, hangisi egomu parlatan sis makinesi? Nerede yorum yazmalıyım, nerede daha iyi bir isim yeterli? Bu sorular teknik olduğu kadar karakterle de ilgilidir.

Python bize şunu fısıldar: Basitlik tembellik değildir. Açıklık yüzeysellik değildir. Hatta çoğu zaman en zor beceri, karmaşık olanı sade biçimde ifade etmektir. Okunabilir kod yazmak, düşüncenin arıtılmasıdır. Dağınık kod çoğu zaman dağınık zihnin izidir; temiz kod ise disipline edilmiş dikkatin.

Sonuçta yazılım, yalnızca algoritmaların değil ilişkilerin de alanıdır. Her commit küçük bir mektuptur. Her fonksiyon bir sonraki okuyucuya bırakılmış nottur. Python’da okunabilirlik ahlakı tam da burada doğar: Kodum çalışıyor demek yetmez; kodum anlaşılabilir, sürdürülebilir ve başkasının zihnine saygılı olmalı. Çünkü iyi programcı yalnızca makineyi ikna eden kişi değildir. İyi programcı, insanı da yormadan gerçeğe götüren kişidir.

SonsuzUs Programlama

SonsuzUs programlama sitemiz SonsuzUs Github üzerinden yayın yapmaktadır. Sitemizde python, c, c++ gibi popüler dillerin yanı sıra hiç bilinmeyen diller de vardır. Geneli algoritma ve programlama teknikleri olan sitemizde örneğin python karışık listeleri tek düz liste yapma gibi teknik konular da içermektedir.

Ayrıca github hesabına sahipseniz her yazı ile etkileşim içinde olabilir ve yorum yazabilirsiniz.

Python programlama ile para sorusu

Sorumuz şu: Bir adam elindeki çeki bozdurmak için bankaya gitti. Fakat veznedar bir yanlışlık yaptı ve çekin üzerinde yazılı liralar yerine kuruş ve kuruşlar yerine de lira vererek çeki ödedi. Adam da dikkat etmeden paraları cebine koydu. Eve giderken paranın 5 kuruşunu düşürdü. Bu vesile ile parasını saydı ve cebinde çekin değerinin tam iki katı parası olduğunun farkına vardı. Çekin üzerinde yazılı olan miktar ne kadardı? *

Programımız oldukça basit, lira ve kuruşu 100 lük döngülere sokuyoruz ve formülü deniyoruz.

for lira in range(100):
    for kurus in range(100):
        if lira + kurus / 100 == 0:  continue
        if (kurus + (lira - 5) / 100) / (lira + kurus / 100) == 2:
            print(f"Çekin üzerinde yazan miktar: {lira}.{kurus}")
            break

continue kullanmamızın sebebi sıfıra bölünme hatasından kaçmak içindir.

Bir diğer çözüm de şu olabilir

for lira in  range(0,55):
    for kurus in range(lira+5,105):
            if 2*(float(lira)+float(kurus)/100)==float(kurus)+float(lira-5)/100:
                print(str(lira)+"."+str(kurus)+"₺")