05 – 06 – 07
Python’da elinizde bir int değişken vardır ve siz onu işleme float olarak sokmak isteyebilirsiniz. Bunun gibi durumlarda int tutan değişkenin türünü float ‘a dönüştürmenize denilen işleme tür dönüşümü denir. Python’da türler aslında sınıf olarak tutulur, bunun c#’a benzeyen bir yönü var. Python’da int, float ve benzeri türler bir sınıf türünden oluşturulmuştur.
Eğer bir türü başka bir tür ile işleme sokmak istiyorsanız o türden bir nesne yaratarak işlemi oluşturmanız gerekmektedir. Buradan yola çıkarak her türü her türe dönüştürebilirsiniz denilemez ama tür dönüşümünü destekleyen türlerin başlangıç methodları dönüşümlerde kullanılır ve başka türlere böylelikle dönüştürülebilir.
- a=10
- b=float(a) olarak tür dönüşümünü ifade edecek olursak. Değeri a nesnesinin değeri olan float yeni bir nesne oluşturulur, bu yeni nesnenin adresi b değişkenine atanarak tür dönüşümü yapılır.
- Int türü flaot türüne dönüştürülürse bilgi kaybı olmaz ama float türü int türüne düştürüldüğünde noktadan sonraki kısım atılır.
- Int yada float türü str türüne dönüştürülebilir ve o sayıdan bir yazı elde edilir. Bool ve none gibi türlerde str türüne dönüştürülebilir.
Temel Veri Yapıları
Veri yapısı yazılım dünyasında çok karşılaştığımız mimarilerinden birisidir. Aralarında ilişki olan bir grup nesnenin oluşturduğu topluluğa denir. Veri yapısı çoğul bir durumu ifade eder. Örn tek başına bir int nesnesi bir veri yapısı değildir lakin bir liste veri yapısına örnek verilebilir.
Programlama dillerinin çoğunda temel veri yapıları hali hazırda bulunur. Python’da veri yapılarının büyük bir kısmı built-in yapılmıştır. C++ Java ve C# a göre daha gelişmiştir.
Python Listeler.
Python programlama dilinde dizi veri yapısı bulunmuyor, burada listeleri kullanıyoruz. Listeler bir grup nesneyi belli bir sıra içinde tutan bir veri yapısıdır. Yani listelerin tuttuğu elemanlara 0. 1. 2. 3. eleman gibi bir indis numarası ile sıralı bir ilişki ile erişilebilir.
Bir liste yaratmak için ya list fonksiyonunu kullanıyoruz ya da köşeli parantezleri kullanıyoruz. a=[10,20,30]. Listeler Python’da list sınıfından üretilmiştir. Liste yaratmanın başka bir yönteminide list() fonksiyonunun kullanılmasıdır. List() fonksiyonu içerisine iterable bir nesne alabilir.
- Bir liste içindeki elemanları bir sabit olması gerekmez, elemanlar değişkende olabilir.
- Python’da listeler heterojen türde nesneler olabilirler, a=[ 10 , 2.3 , ’ali’ , True] gibi düşünülebilir.
- Python’da listenin elemanları, nesnenin kendisi değil gerçek nesnelerin bellekteki adresini tutar. Sebebi Python’da bilindiği gibi değişkenler değerlerin adreslerini tutmasından kaynaklanmaktadır. Yani listeler bir çeşit referans dizisidir. Zaten ancak bu şekilde hetorojenlik sağlanabiliyor.
- Listenin elemanlarına [ ] parantez ile erişilebilir, tıpkı diğer dillerdeki dizilerde olduğu gibi listenin elmanın sayısını belirterek erişebilirsiniz.
- a=[10, 20, 30, ‘ali’ ]. id(a) fonksiyonu kullanıldığında listenin kendi adresini bulmuş olursunuz. id(a[0]) dediğimizde listenin ilk elemanının adresini elde etmiş oluyorum.
- Bir liste bildiğiniz gibi bir başka bir listede tutabilir a=[ 10, 20, [ 30, 40 ], 50] olarak düşündüğünüzde a[3][0] ile 30 nesnesine ulaşabilirsiniz. Sonuçta önce içerideki nesneye, o nesne bir liste ise, sonrada o listenin istediğim elemanına ulaşabilirim.
- len( ) isminde bir fonksiyon var, bu sadece listeler ile kullanılan bir fonksiyon değil iterable tüm nesneler ile kullanılabilir, kullanıldığında size o nesnenin eleman sayısını verir.
- Python da boş listeler için de bir yer tahsis edilir, fakat hiçbir indise erişilemez. Bool bir işlemde kullanılmak için boş liste false değer üretir. İçinde veri olan dolu listeler ise true olarak dünüştürülür. Yani bir liste if ile kullanılabilir. a[ [ ] ] boş liste tutan bir listedir ve bu listenin eleman sayısı 1 ‘dir, ve o elaman boş bir listedir.
- Listelerde negatif indexleme diye bir durum var. Eğer köşeli parantezin içindeki indis negatif değer ise, o zaman bu listenin uzunluğu ile o negatif değerin toplanması sonucunda asıl indis elde edilir. Yani örn a[-1] demek aslında a[len(a)-1] demektir. Örn, kısacası -1 indis için son liste elemanı demektir.
Listelerde Dilimleme (Slicing)
Özellikle yapay zeka ve makina öğrenimlerinde çok kullanılır, dilimleme bir listenin belirli bir kısmının elde edilme sürecidir. Sentaks olarak İlk index : Son index olarak kullanılıyor, liste son index dahil değil ama ilk index dahil olacalar şekilde dilimlenir.
- Bir listeyi dilimlediğinizde yeni bir liste elde edersiniz ve liste dilimlendiğinde her zaman yeni bir liste elde edilir.
- Dilimlemede negatif indexler kullanılabilir. a[10, 20, 30, 40, 50, 60 ]. a[3:-1] şeklinde kullanılabilir.
- a[ :3] yazdığınızda boş bırakılan yer 0 indisine denk gelir.
- a[2: ] ikinci eleman boş bırakılırsa listenin ikici elamanından sonuna kadar gidilir.
- a[2:4444] gibi liste dışına çıkarsanız sona kadar gider ama bir hata oluşmaz. Tam tersi durum da hata üretmez.
- a [ : ] yazdığımızda ise listenin bütün elemanları alacağını tahmin edebilirsiniz.
- a [ 1: 7: 2 ] şeklinde de dilimleme yapılabilir, burada aslında a[start: end: step] şeklinde düşünebilirsiniz, step kısmı kaçar kaçar atlanarak dilimleme yapılabileceğini belirtebilirsiniz.
- Step negatif olabilir, bu da ters yönde hareket edilecektir. Eğer tersten gidiliyorsa unutmamak gerekir start’ın stop’dan daha büyük olması gerekir.
- a[ : 2: -1] burada listenin sonundan ikinci indise kadar gider fakat ikinci indis dahil olmacak şekilde birer atlayarak listeyi tarar ve dilimler.
- a[ : : -1] bu bir listeyi ters düz etmek için kullanılır.
- Python’da iki liste + operatörü ile işleme sokulabilir, burada iki listenin uzunluğunun toplam uzunluğu kadar yeni bir liste yaratıp onları uç uca ekler. Listelerin içindeki elemanların adresleri de yeni listeye adres kopyalaması ile kopyalanır. Unutlmaması gereken liste ile liste toplanabilir, bir değişken ile bir liste toplanamaz ya da liste ile liste birbirinden çıkartılamaz ya da çarpılamaz. += operatörü ile de işleme sokulabilir.
- Bir listeyi bir tam sayı ile çarpabilirsiniz, bu işleme reputation denir.
- Bir listeyi negatif değerlere çarpılırsa boş liste elde edilir.
- Dilimleme yöntemi ile elemanlar güncellenebilir a[2:4] = [ 100,400,300,’ali’] gibi bir güncelleme yapabilirsiniz, dilimlediğiniz alan kadar uzunlukta bir liste eklemek zorunda değilsiniz, daha uzun bir listeyi de ilgili alana ekleyebilirsiniz. Ama mutlaka update edeceğiniz verinin bir liste olması ya da başka bir iterable bir nesne olması gerekir. Tabi bu araya eğer boş bir liste gönderirseniz seçtiğiniz alandaki nesneler silinir ve haliyle yeni bir nesne eklenmez.
Dilimleme ile ilgili yeterince örnek verdimiği düşünüyorum fakat burada dilimlemenin nasıl çalıştığı ile ilgili bir detay da paylaşmak gerektiğini düşünüyorum. Dilimlemede dilimlenen nesnelerin bir kopyası yaratılıyor gibi görüntü oluştuysa, aslında durum tam olarak böyle olmuyor, dilimlemede asıl listenin elemanlarında bulunan adresler yeni listeye kopyalanıyor. Böylece dilimlenmiş liste asıl listenin gösterdiği nesnelerde aynı adresleri gösteren dilimlenmiş aslında aynı adresleri gösteren bir liste olarak devam ediyor. Yani dilimleme işlemi adres kopyalama ile gerçekleştirilir. Yani burada aslında bir sığ kopyalama işlemi gerçekleşir. python shallow copy.
Listeler değiştirilebilir (mutable) türlerdir.
Listelerin tuttuğu adresler değiştirilebilirler, böylelikle liste üzerinden eriştiğiniz nesnelerin kendisine de adresleri değiştirildikten sonra erişemez olabilirsiniz. Yani bir liste yaratıldıktan sonra programın akışında, listenin 1. elemanına başka bir nesnenin adresini atayabilirsiniz. Bu durumda liste değiştirilmiş olur. Biz bu çalışma yöntemi ile listenin elemanlarını değiştirmiş oluyoruz tabiki. Burada değinmek istediğim şey listenin arka planda aslında listenin nasıl çalıştığını vurgulamaktır.
Burada neden uzun süre durduğumu ve önemli bulduğumu aşağıdaki örnekte açıklayım
- a=[10, [20, 30], 40, 50 ]
- b=a[1:3]
- # burada b aslında şu değerleri tutar oldu [ [20, 30 ], 40]
- # ben b ‘nin içindeki listenin ilk elemanını değiştiriyorum
- b[0][0] = 100
- # burada sadece b listesinin 0, 0 indisinde bulunan nesnenin adresini değil aynı zamanda aslında a listesinin içindeki 1 indiste bulunan listenin 0 ıncı indisinin tuttuğu nesnenin adresini değiştirmiş de oldum. Bu durumdan farkedileceği gibi mutable nesnelerin nasıl davrandığını açıklamaktadır.
Kaynaklar:
C ve Sistem Programcıları Derneği (CSD) – Kaan ASLAN