C Programcıları İçin Python

Uyarı: Bu yazı hazırlanması devam eden bir taslak halindedir. Bilgilerin doğruluğu ve bütünlüğü tamamlanana kadar garanti edilmemektedir.

Giriş

Daha önceden kaptığınız birçok alışkanlıktan sizi uzaklaştıracak bir dil için hazır olun. Tür tanımlamaları, değişken belirtmeleri, boyut kısıtlamaları gibi kavramlarla uzun uzun süreler boyunca uğraşmayacağınız bir dil olan Python hakkında bu yazıda elimden geldiğince bir C programcısının Python’a geçişi için karşılaştırmalara, özelliklere yer vermeyi düşünüyorum. Eğer daha önce bir programlama tecrübeniz yoksa, Python başlangıç için uygun bir dildir. Ancak başlangıç kaynağı olarak bu sayfayı kullanmanız önerilmez. Python ile başlamak isterseniz İstihza‘yı kullanabilirsiniz. Bunun dışında daha az kapsamlı olan, oyun yapımının temellerini ve bilgisayar bilimlerini öğrenmek isterseniz, çevirisi yeni biten Arcade Türü Oyun Programlamayı ve Bilgisayar Bilimlerini Öğrenin linkinden faydalanabilirsiniz.

Bunların ardından, konumuza, yani C’den Python’a geçişe dönelim. Öncelikli olarak, daha önce JavaScript veya herhangi başka bir script dili ile tecrübeniz varsa, Python’un da bir script dili olduğunu bilmeniz sizi rahatlatabilir. Python kodları derlenerek çalışmaz, yorumlanarak çalışır. Ama ticari bir uygulama geliştirmek, uygulamanızı daha rahat yaymak vb. bir sebebiniz varsa derlemek için de yöntemler mevcuttur. Bu şekilde hazırlanmış birkaç uygulamayı bu blogta bulmanız mümkün. Yorumlanan bir dille çalışmanın faydası, kodunuzu satır satır yazıp test edebilmeniz, tıpkı işletim sisteminizin komut satırında işlem yapar gibi de ufak denemelerinizi gerçekleştirmeniz, ve belki de en önemlisi büyük projelerle çalışırken uzayıp gidebilecek derlenme süresinden kurtulmanız anlamına gelir. Bu kadar bilginin ardından artık biraz aksiyon görme zamanı geldi sanırım.

Genel Program Yapısı

Yukarıda gördüğünüz kodu Python’da Türkçe karakter kısıtlamasına takılmaksızın şöyle yazıyoruz:

printf fonksiyonu yerine print isimli bir fonksiyon kullandık. Python3 utf8 ile geldiği için, Türkçe karakter konusunda aklınıza gelebilecek birçok yerde kısıtlamayla veya hatayla karşılaşmayacaksınız. Ancak yine de, el alışkanlığını bozmamak adına değişken isimlerinde Türkçe karakter kullanmamanızı öneririm. İsterseniz şimdi değişkenlere bir bakalım.

Değişkenler

Değişken türü tanımlamadığımıza, değişkenlerin başlarına vs. bir şey koymadığımıza dikkat edin! Ayrıca, print fonksiyonundaki gibi, satır sonunda yine noktalı virgülün olmadığına dikkat edin. Python’da satır sonlarına “;” konulmaz. Ama alışkanlıklarınızın size problem yaratacağını düşünmeyin. Şu kod da tıpkı yukardaki gibi sorunsuz çalışacaktır:

C’de şöyle bir tanımlama yapmamız mümkündü:

Bunu bazı Python kitaplarında şu şekilde görmemiz mümkün:

Kısacası noktalı virgül kullanımında kendinizi özgür hissedin. Ama yine de, karşılaşacağınız Python kodlarının büyük kısmında onları göremeyeceğinizi ve onları kullanmanın Python geleneğine çok da uygun olmadığını bilin.

Değişken isimlendirme kuralları birçok dilde olduğu gibi Python’da da C ile aynıdır. Tek fark biraz önce bahsedildiği gibi Türkçe karakter kullanımına Python 3 itibariyle izin verilmesidir. Python ile çalışırken kodları etkileşimli kabukta(shell) şu şekilde yazmak da mümkündür:

Burada, yukarıda da bahsettiğimiz gibi ufak çaplı denemeleri yapabilmek için oldukça ideal bir ortam buluyoruz. Özellikle veritabanı sorgulamalarında, url isteklerinde ve buna benzer durumlarda bunun faydasını anlayacaksınız. Değişkenlerin türlerini öğrenmek için detype() fonksiyonunu kullanabiliriz.

Uyarı: Başlarında >>> ibaresi bulunan kodlar etkileşimli kabukta çalıştırılmıştır. Bunları program dosyasına koymayın.

Ayrıca, Python’da tanımlanan her şey aslında birer nesne olarak tanımlanır. Python’un nesne tabanlı olduğunu da burda hatırlatmış olalım. Bir değişken, fonksiyon, nesne veya her ne olursa olsun, üzerinde kullanılabilecek metotları da dir() fonksiyonunu kullanarak şu şekilde görmemiz mümkün:

Bir kez atama yapılan değişkenin türü sabit değildir. Yani tamsayı olan değişkene, bir string atanabilir, hatta birazdan bahsedeceğimiz liste, demet ya da bir nesne bile atayabilirsiniz:

If Yapıları (Koşullu İfadeler)

Çoğu dilde olduğu gibi Python’da da, C’ye benzer bir if yapısı kullanılır. Yapının benzer olması, Python’un etkilerinin görülmesine engel değildir. Python’da, C’de kullandığımız { } yerine girintileme sistemi kullanılmaktadır. Bu sadece if yapısı için değil, döngüler, sınıflar ve buna benzer her yerde geçerlidir. Girintileme sistemi dediğimiz, if yapısının içerisinde yer alan kodların { ve } simgelerinin arasına yazılması yerine, birer sekme (tab tuşuna basarak) boşluk bırakılarak yapılmasıdır. Burada sekme boyutu kullandığınız geliştirme ortamı (IDE) üzerinden ayarlanabilmektedir. Python’da girintilemeyi sekme ile yapma zorunluluğu da yoktur. Boşluk tuşuna bir sekme oluşturacak kadar basmak yeterlidir. Ayrıca, sekmenin 4 boşluktan oluşması da zorunlu değildir. İki boşlukla da, 8 boşlukla da bir if yapısı kurulması mümkündür. Burada önemli nokta, girintilerin programın tamamında aynı şekilde kullanılmasıdır. Yani ilk if yapısında 4 boşluk boyutunda 1 sekme kullanıldıysa devamındaki döngüde 2 boşluk bırakılması hataya yol açacaktır. Kısacası, tutarlılık önemlidir. Bu da Python kodunun okunabilirliğinin yüksek olmasının temel sebeplerinden biridir. Şimdi bu kurallara bağlı olarak, aynı işi yapan birkaç if örneği görelim:

Girintileme sistemi yukarıdan anlaşılabilir. Bunun dışında, if’in ardından sadece girintileme değil, bir de iki nokta işareti (:) kullanıldığına dikkat edin. Python’da girintilemelerden önce bu işareti kullanıyoruz. C’den farklı olan bir diğer nokta ise, birçok dildeki else if yapısı yerine Python’da kısaca elif yapısının kullanılmasıdır. Bunu da şöyle örneklendirebiliriz:

C’de kullandığımız || ve && yerine Python altında genellikle and ve or kelime olarak kullanılmaktadır. Ancak bu işaretler kesinlikle kullanılmak istenirse, tek bir tane ( | veya & olarak ) kullanılmaları gerekmektedir. Operatörlerin işlevleri (^ dahil) C’deki ile aynıdır.

Son olarak, switch-case yapısı Python’da bulunmamaktadır.

Diziler

Başlıkta her ne kadar dizi yazdıysam da, Python’da array tipinde bir veri, dışarıdan bir kütüphane kullanmadığınız sürece (numpy modülünde rastladım) yoktur. Onun yerine elimizdeliste, demet ve sözlükler vardır. Burada, yaygınlığı sebebiyle liste ve demetlerden bahsetmekle yetineceğim. Sözlüklerden de kısaca bahsedeceğim.

Listeler

Öncelikle, burada listelerde ve diğer türlerde tanımlayacağımız nesnelerin C’den farklı olarak içlerinde farklı değişken türlerini aynı anda bulundurabildiklerini söylemek gerekiyor. Yani bir dizide hem integer, hem string hem de bir object(nesne) aynı anda bulunabiliyor. Listeler, arraylerden farklı olarak sabit boyutlu değillerdir. Yani içerisinde 5 öğe olan bir listeye istediğimiz kadar daha öğe eklememiz mümkündür. Ayrıca, tanımlama esnasında da boyutu belirtilmez. Listeler, [ ] işaretleri arasında tanımlanır. Boş liste tanımlamak için de [] kullanabiliriz. İndisleme sistemi ise C ile aynıdır.

İndisleme sisteminde, son satırda 2:4 ifadesinin 2 ve 3 indisli öğeleri verdiğine dikkat edin. Bunun anlamı, ilk sayıdan(2) başlayarak son sayıdan(4) bir önceki öğeye kadar olanları bize döndürdüğüdür. Arada belirtilen len() fonksiyonunun anlaşılır olduğunu ümit ediyorum. Arada verdiğimiz append() metodu yardımıyla listenin sonuna ekleme yapmak mümkündür. Ayrıca, listenin istenilen yerine ekleme yapmak için insert() metodunu kullanabilirsiniz (liste.insert(indis,”öğe”) şeklinde).
Listelerden yeri geldiğince bahsetmek üzere, onlara burada ara verip, demetlere geçelim.

Demetler

Demetler, listelerle aşağı yukarı aynı işlevi gören öğelerdir. Farkları ise, üzerlerinde değişiklik yapılamamasıdır. Yani bir demet tanımlandıktan sonra, ekleme, silme veya herhangi bir öğesinin içeriğini değiştirme gibi işlemleri yapmamız mümkün değildir. Avantajı ise listelere göre daha hızlı çalışmalarıdır. Ayrıca istenmeyen veri kayıplarını da engellemek için kullanılabilir. Tanımlarken listelerden farklı olarak parantezleri ( ) kullanıyoruz.

Sonda yapılan işlemde demetin bir elemanına yeni bir atama yapılmaya çalışılmış ve hata alınmıştır. Bu atama işlemini liste ve birazdan göreceğimiz sözlüklerde istediğimiz gibi yapabiliyoruz.

Sözlükler

Küme parantezi içerisinde tanımlanırlar. Anahtar ve değer çiftlerinden oluşurlar. Kod örneği aşağıda görülmekle birlikte, indisleme sisteminin kullanılamadığını gösterme amaçlı da bir hatalı deneme yapılmış ve sonucu da eklenmiştir.

Sözlüklerin türünü sorguladığımızda da dictionary’den kısaltma dict‘e rastlıyoruz.
Python’da bu veri türlerine benzer olarak bir de kümeler vardır. Ancak kullanımı çok yaygın olmadığı için şu anlık ondan bahsetmiyorum.

Döngüler

Öncelikle C’de kullandığımız do-while döngüsünün Python’da olmadığını belirterek başlayayım. Python’da iki adet döngü ile haşır neşir oluyoruz; for döngüsü ve while döngüsü. Eğer işimiz sonsuz döngüye sokmaksa, birazdan farkedeceğiniz nedenlerden dolayı çözümümüz while döngüsü oluyor.

For Döngüsü

Python’da for döngüsü, elimizde iterasyona uğratabileceğimiz bir nesne yer aldığında kullanılabilir. İterasyona uğrayabilecek nesneler denince akla ilk gelenler ise listeler, demetler, sözlüklerin anahtar ve değerleri, bazı fonksiyonların verdikleri çıktılar(generator objects) olmaktadır. For döngsünün özelliği ise, bir sıralı liste ya da bu tür bir nesnenin tüm elemanlarını bir değişkene sıra ile atıp her değer için tekrar dönmesi, elemanlar bitince döngünün otomatik olarak sonlanmasıdır. Bu sebeple for döngüsünü sonsuz döngüye sokamıyoruz.

Kod örneğini görmeden önce, range fonksiyonunu da belirtmekte fayda var. Python 2 ile çalışıyorsanız range() fonksiyonu size istediğiniz aralıktaki sayıları veren bir liste döndürecektir. Python 3 altında ise bu olay biraz daha gelişmiş, ilerletilebilir nesne olayı daha netleşmiş ve bunun sonucunda da range fonksiyonu bir generator object döndürmeye başlamıştır. Bu fonksiyonun aldığı parametreler range([başlangıç,]bitiş[,artış]) olarak sıralanabilir. Yaptığı iş ise başlangıç değerinden bitiş değerinin bir eksiğine kadar olan sayıları aradaki artış kadar verir. Dilerseniz örnek üzerinde daha detaylı olarak görebilirsiniz.

Bunun dışında, list comprehension, tuple comprehension gibi isimlerle görebileceğiniz kavramalar ile bir liste veya demeti tek satırda istediğiniz işlemi yaptırarak ya da istediğiniz fonksiyonu çağırarak oluşturabilirsiniz:

Elimizdeki bir listeye indisleme sistemi eklemek için de enum benzeri enumerate isimli bir fonksiyonumuz var:

While Döngüsü

While döngüsü, C’de bildiğimiz while döngüsünden pek de farklı değildir. If yapısında olduğu gibi Python kod dizimine uygun hale şu şekilde getirilir:

Yaygın olmadığı için kullanmamış olsak da, break ve continue deyimlerini de Python’da kullanabilirsiniz. Sonsuz döngüye sokmak için while True yazmanız yeterlidir. Bu arada unutmadan, True ve False ifadelerinin baş harflerinin büyük olduğunu da belirtelim.

Fonksiyonlar

Python’da fonksiyon tanımlarken, dönecek verinin türünü ve fonksiyona gelecek parametrelerin türlerini belirtmeyiz. Fonksiyon tanımlarken define sözcüğünden gelen def ifadesini kullanıyoruz.return ise aynı şekilde duruyor. Ayrıca, fonksiyon çağıran fonksiyonlar, fonksiyon içerisinde tanımlanmış fonksiyonlar gibi yapıları Python’da sıkça görmek de mümkün.

Örnekte modül içeren bir fonksiyon tanımladık. Bunu birazdan göreceğiz. C’deki sinüs fonksiyonundan farklı olmadığını, sadece başında math öneki olduğuna dikkat etmeniz şu anlık yeterli. Daha sonra bu öneki kullanmadan nasıl yapacağımıza da değineceğiz. Şimdirange fonksiyonuna benzer işlev gören bir fonksiyon hazırlayalım.

Şunu da belirtmeden ilerlemeyelim; Python’da pointer kavramı yok. Yukarıdaki kodta fonksiyondan bir liste döndürdük. Fonksiyonlar değer olarak liste, demet, değişken, sayı, yazı, nesne vb. aklınıza gelebilecek her türlü şeyi döndürebilirler. Dönecek değişkenin türü de Python tarafından belirlenir.

Modüller

C’deki kütüphane kavramının yerini Python’da modüller almaktadır. Aslında, bu iki kavram çoğu kez birbirinin yerine kullanılabilir. Ama genel olarak, birden fazla modülün bir arada bulunması bir kütüphaneyi oluşturur. Python’da yazdığımız her program aynı zamanda bir modüldür. Bu yüzden, profesyonel kodlarda, yazılan sınıfların, fonksiyonların ve hatta değişkenlerin başka programların içerisinde de kullanılabilmesi için şöyle bir yazım şekli kullanılır:

Pek işe yararlığı olmayan bu örnekte, program çalıştırıldığı zaman aslında __main__ isimli bir fonksiyonun çalıştığını görüyorsunuz. Bu, programınızdaki kodları satır satır işliyor. C’de .h uzantılı header dosyaları yerine, programınızı kaydettiğiniz isim.py dosyasını import isim şeklinde çağırabilirsiniz. Bunu yapmadan önce isterseniz aynı işi yapan bir de C kodu yazıp karşılaştıralım. Kod:

Aynı işi Python ile şu şekilde yapıyoruz:

Kodun çalışması yine aynı şekilde. Ayrıca, derece cinsinden veri girmek isterseniz de şu şekilde bir işlem mümkün:

Fonksiyonu, C kodunda olduğu gibi herhangi bir ön ek olmadan kullanabilmek için from modül import fonksiyon yapısını kullanabiliriz. Bu sadece modülü değil, aynı zamanda içerisindeki sınıflar, değişkenler ve herhangi başka bir şey için de kullanılması mümkün bir import şeklidir.

Sınıflar

Sınıf yapısı aslında C’deki yapılara biraz benziyor. Ya da, onun oldukça gelişmiş bir hali diyerek başlayalım. Sonuç olarak, yapacağımız işlemler sonrasında aralarındaki farkın ne derece büyük olduğunu göreceksiniz. Sınıf tanımlarken, direk ingilizcesi olarak class yapısını kullanıyoruz. Sınıfların içerisinde de yapılarda olduğu gibi değişkenler olabilir. Çağırırken de önce onun bir örneğini oluşturup daha sonra örnek.değişken şeklinde ya da örnek.fonksiyon şeklinde çağırıyoruz. Bir örneğini görelim:

Sınıf içerisinde fonksiyon tanımlayacaksak yapmamız gereken fonksiyona ilk parametre olarak self yazmak. Daha ayrıca sınıfın içerisindeki değişkenlere ulaşırken self.değişken yapısını da kullanmamız mümkün. Burada self bir zorunluluk değil, ancak kuvvetli bir gelenek.

Rastgele Sayı Üretmek

Python’da rastgele sayı üretme işlemlerini random adlı modülle gerçekleştiriyoruz. Bu modülün en güzel özelliklerinden birisi, direk aralık vererek ya da bir listenin elemanları arasından rastgele seçim yapabilmesi. Örnek bazı kullanımları şu şekilde:

Ayrıca, rastgele sayı seçme işlemini belirli bir aralıkta yapacaksak range() fonksiyonundan bizi kurtaracak randrange() fonksiyonu bir gün ciddi derecede hız katabilir. Unutmadan, bu fonksiyon en fazla 9007199254740992 aralıkta çalışabiliyor. Parametreleri range() ile aynı:

Random modülü ile elimizdeki bir liste veya demetten seçim yapacaksak, random.choice() methodunu kullanabiliriz.

Örnek çıktı şu şekildedir:

Tür Dönüşümleri

Python’da casting, class türleri arasında dönüşümle yapılıyor. Aynı zamanda atoi, atof tarzı fonksiyonları da aynı mantıkla yapabiliyoruz. Örneğin bir integer ı float olarak yorumlatmak için:

Aynı şekilde atoi benzeri, bir string i bir tamsayıya çevirirken:

Soket oluşturma

Python’da soket yapısı C ile oldukça benzer. Bir server-client yani sunucu-istemci yapısını gerçekleyecek olursak, önce portun belirleme(TCP/IP mi ve Internet/Unix portu) sonra portu açarak dinlemeye başlayarak sunucu yapısını, soketi belirleyip son aşamada dinlemek yerine sunucuya bağlanarak da istemci yapısını gerçekleştirmiş oluyoruz.

 Devam edecektir.

  • Anonymous

    programlamaya C ile başlamış biri olarak böyle bir geçişe ihtiyacım vardı.elinize sağlık :)

  • Pingback: Python dersleri | R.Sercan Arıcı()

  • Kenan Kemal

    Hocam hulk benzeri layer7 atak yapan python bi yazılım kullanıyorum.Torshammeri bilirsin tor agına start verip tor üzerinden atak yapabiliyoruz.Bendeki yazılımada tor agına bağlanma kodu eklememiz gerek birkaç yerde buldum fakat anlamadığım için yapamadım mail adresim kelkenan34@gmail.com

    http://stackoverflow.com/questions/30286293/make-requests-using-python-over-tor

    konuyu açan kişi aşağıdaki gibi yazmış

    Ben bir web sayfasına Tor kullanarak birden fazla GET istekleri yapmak istiyorum. Ben her istek için farklı bir ipaddress kullanmak istiyorum…

Linux Sysadmin, DevOps, Docker Enthusiast