Daha önceki yazılarda liste yapılarından söz etmiş ve daha sonra bunu detaylı olarak ele alacağımızı söylemiştim; şimdi bunu konuşacağız. Ancak konu biraz detaylı olduğu için bunu sakin bir kafayla okuyup uygulamanız sizin için daha iyi olacaktır.
Listeler, programlama konusunda bize gerçekten çok yardımcı olan ve inanılmaz kolaylık sağlayan yapılardır. Aslında listeler, hayatımızın neredeyse her alanında vardır. Programlamadaki liste mantığı da buna benzer bir yapıdadır. Örneğin 'yapılacaklar listesi' tuttuğunuzu varsayarsak gerçekleştirdiğiniz hedeflerinizin üstünü çizersiniz yani onu bir nevi listeden çıkarırsınız. Yahut, istediğiniz zaman bu listeye yeni bir madde ekleyebilirsiniz. İşte, bunları ve bunlar gibi birçok şeyi programlamada da yapabiliyoruz.
Boş bir liste aşağıdaki gibi tanımlanır.
myList = []
Evet, yapmanız gereken tek şey listenize bir isim vermek ve bunu köşeli parantez ile tamamlamaktır.
Listeler, birçok programlama dilinde veri tipini esas alır. Örneğin GoLang dilinde bir liste (dizi) tanımlayacaksanız bunun belli bir veri tipine sahip olması gerekir. Daha açıklayıcı olursak; int veri tipine sahip bir liste tanımlarsanız o listenin içine sadece int veri tipi değerleri yerleştirebilirsiniz. Python, bu konuda bize biraz esneklik sağlıyor. Yani bir liste içerisine farklı veri tiplerine sahip değerleri yerleştirebiliyoruz.

type() fonksiyonunu daha önce görmüştük. Tanımladığımız listenin tipini sorguladığımızda bunun bir 'list' olduğunu görüyoruz. Bunları ekrana yazdırabilir miyiz?

Gördüğünüz gibi çıktımız başarılı. Bir listenin içinde daha önce bahsettiğim 4 temel veri tipinin hepsi var ve biz herhangi bir sorun yaşamıyoruz. İsterseniz aynı şeyi bir de GoLang'de deneyelim.

Gördüğünüz gibi hata aldık. Özetle, bize dediği şey; "sen string bir dizi tanımladın ama içinde int, float ve bool var".
Python'daki bu özgürlük durumunu anladığımıza göre listelerin mantığına bakalım.
Listelerde 'index' mantığı söz konusudur. Bu listeye eklediğimiz elemanları kontrol edebilmek için 'index' dediğimiz olayı iyice kavramamız gerekiyor. Normalde insanlar, sayı saymaya 1'den başlar ancak programlamada sayı saymaya 0'dan başlanır. Ne demek istiyorum?

Yukarıdaki örnek güzel bir referans olacaktır. Listedeki her elemanı birbirinden virgül ile ayırıyoruz. Bu durumda bunların her biri, listenin bir elemanı oluyor. Ancak birinci eleman, aslında sıfırıncı index'tir. Elemanları saymaya başladığınızda 1'den başlarsınız ancak size index sorulursa bunun 'n-1' formülünü ifade ettiğini bilmeniz gerekir. Yukarıdaki örnekte 5 elemanlı bir listenin 4 index'li olduğunu görüyorsunuz. Çünkü saymaya sıfırdan başlanıyor.
Peki, kendi kodumuza dönelim.
len()len() fonksiyonu, 'length' kelimesinden gelir ve anlamı 'uzunluk' şeklindedir. Bu fonksiyon bize, listenin kaç elemandan oluştuğunu gösterir. Hemen bakalım.

Fonksiyonumuz, diğer fonksiyonlar gibi; parantezleri içerisine listenin ismini ister. Bunu yazdıktan sonra myList isimli listemizin 4 elemandan oluştuğunu görüyoruz. Peki, bu listenin kaç index'ten oluştuğunu nasıl bulursunuz? Elbette, 4-1 yaparsınız; basittir. Ancak bunu programlamaya dökmek zorunda kalabilirsiniz.

Bu konuyu kaptığımıza göre şimdi, listenin elemanlarıyla nasıl oynayacağımıza bir bakalım.
Bunun için, eleman sayısını değil index sayısını bilmemiz gerekir. Ne demek istiyorum?

Gördüğünüz üzere; aslında birinci eleman olan 'CyberWorm' ifadesi aynı zamanda sıfırıncı index'tedir. Biz de bunu çağırırken listenin ismini yazıyoruz ve bir köşeli parantez açarak istediğimiz elemanın index'ini veriyoruz; myList[0]. Bu sayede ilk eleman yani sıfırıncı index'i çağırabiliyoruz.
Şimdi, diğerlerini de çağıralım ve olmayan bir elemanı çağırmayı deneyelim.

Bizim 3 index'imiz vardı. Sıfırıncı index 'CyberWorm'; üçüncü index ise 'True' şeklinde. Ancak biz, 'myList[4]' ifadesini de verdik yani dördüncü index'i de çağırdık. Python, listeye baktığında listede dördüncü index'te bir eleman olmadığını gördü ve bize bir hata mesajı döndürdü; 'list index out of range'. Bu mesajın anlamı; 'index, aralığın dışında.' şeklindedir. Yani biz, olmayan bir elemanın olmayan index'ini çağırdık. Zaten dikkat ederseniz hatanın ismi 'IndexError'. Buna dikkat edeceğiz.
Bu noktada aklınıza, "index yazarak elemanı çağırabiliyorsak elemanın kendisini yazarak kaçıncı index olduğunu bulabilir miyiz?" tarzında bir soru takılabilir. İsterseniz deneyelim.

Bu sefer de 'TypeError' hatası aldık. Bunun anlamını önceki bloglardan zaten biliyorsunuz. Ancak hata mesajına baktığımıza şunu görüyoruz: "list indices must be integers, not str". Bunun anlamı ise; "Index int olmalıdır, string değil." şeklindedir. Demek ki biz bunu yapamıyoruz; ancak index ile çağırabiliyoruz.
Bu noktada Python bize güzel bir kolaylık sağlıyor. Bir listedeki elemanın kaçıncı index'te olduğunu gösteren bir fonksiyonumuz mevcut.

Bakın; myList. dedikten sonra 'index()' isimli fonksiyonu çağırıyorum ve kaçıncı index'te olduğunu merak ettiğim elemanı tam olarak aynı olacak şekilde çağırıyorum. Çıktı, parametre olarak verdiğimiz elemanın index'ini gösteriyor.
İsterseniz listedeki elemanların veri tiplerine de tek tek bakalım.

Gördüğünüz gibi hepsi farklı tipte değerler ve hepsini tek bir liste yapısında tutabiliyoruz.
Bir listenin içine başka bir liste de tanımlayabiliyoruz. Önce nasıl olduğuna bakalım, ondan sonra detaya girelim.

Lütfen ok işaretlerinin renk uyumuna dikkat edelim. İç içe listeler için ilk önce bildiğimiz şekilde bir liste tanımlıyoruz:
myList = []
Sonrasında bu köşeli parantezler içerisine bir köşeli parantez daha açıyoruz:
myList = [["cyber", "worm"]]
Bu, iç içe bir liste örneğidir. Sonrasında daha fazla liste tanımlamak isterseniz içerideki listeye ait olan köşeli parantezin yanına virgül koymanız gerekir.
myList = [["cyber", "worm"], [...], [...]]
Bu noktada sıfırıncı index, bir liste olarak görülecektir. Hemen bakalım.

Peki, ben sıfırıncı index'te bulunan listenin sıfırıncı index'ine nasıl ulaşabilirim?

myList[0] derken myList isimli listenin sıfırıncı index'ini çağırıyorum. Bu durumda sonucumuz şu olacaktır: '["cyber", "worm"]'. Ancak biz, bunun da bir liste olduğunu biliyoruz. Dolayısıyla bu liste içerisinden de eleman çekebiliriz, öyle değil mi? Bunun için myList[0] ifadesine yeni bir index daha yazıyoruz: 'myList[0][0]'. Bu sayede listenin sıfırıncı index'inde bulunan listenin sıfırıncı index'ine eriştik (cümle karışıklığı için kusura bakmayın :D).
Bunu yapmak için kod kullanmaya gerek olmadığını düşünebilirsiniz. Ancak bazı yerlerde (özellikle if koşulları içerisinde) bu değerlerin bazılarını değiştirmek zorunda kalabilirsiniz. Hemen nasıl yapıldığına bakalım.

Görseldeki açıklamaları destekler nitelikte şeyler söyleyeceğim. myList[2] dediğimizde biz, myList isimli listenin ikinci index'ini çağırmış oluyoruz. Ancak yukarıdaki kodda bunun değerini değiştiriyoruz ve print ile listenin yeni hâlini ekrana veriyoruz. Dikkat ederseniz bu aslında değişken tanımlamak gibi; yalnızca yöntem biraz farklı. Burada listedeki elemanın değeri geçici olarak değişecektir. Zaten gördüğünüz üzere listenin orijinal hâli hâlâ yukarıda duruyor. Bu, bazı olasılıklar doğrultusunda isteyebileceğiniz bir 'geçici değiştirme' sağlar. Listedeki bir elemanın değerini geçici olarak değiştirmek için bu şekilde bir kullanım sağlıyoruz.
append()Bu komutun anlamı 'eklemek' şeklindedir. Tahmin edebileceğiniz üzere bu komutu, listeye yeni bir eleman eklemek istediğimizde kullanıyoruz ve yine tahmin edebileceğiniz üzere parantezleri arasına bir index değeri veriyoruz.

Gördüğünüz gibi myList. dedikten sonra karşımıza, bu liste ile alakalı kullanabileceğimiz fonksiyonlar geliyor. Biraz önce gösterdiğim 'index()' fonksiyonu da, şimdi kullanacağımız 'append()' fonksiyonu da orada duruyor.

index() için yaptığımızın aynısını yapıyoruz; 'myList.append()'. Bu noktada sadece, append fonksiyonunun parantezleri içerisine, listeye eklemek istediğimiz elemanı yazıyoruz. Zaten sonrasında listenin güncel hâlini ve dördüncü elemanı yazdırıyoruz.
Peki, append komutuyla listeye eleman ekledik. Doğal olarak eklenen bu eleman, listenin en sonunda yer alacaktır. Bu noktada biz, son elemana erişmek için önce len() fonksiyonunu kullanıp 1 eksiğini mi çağıracağız? Sizce de oldukça zahmetli bir iş değil mi?
Bunu yapabilmek için tersten düşünmemiz lazım. Eğer '0' değeri ilk index'i çağırıyorsa ve bu, bu şekilde devam ediyorsa '-1' değeri ne çağırır?

Yukarıdaki örnekte listenin sonundaki elemanı çağırıyoruz ve bunu '-1' ile yapıyoruz. Eksi değerler ile ileri gittikçe sondan başlayarak elemanlar çağırılır. Gördüğünüz gibi normal şartlarda üçüncü index'te yer alan 'True' ifadesini '-2' ile çağırabildik. Bu da demek oluyor ki; saymaya 0'dan başlayabiliyorsak; tersi durumda saymaya -1'den başlamamız gerekiyor.
pop()Bu fonksiyon, listeden bir eleman çıkarmamıza olanak tanır. Kullanımı diğer fonksiyonlarla aynıdır. Yalnızca çıkarılmasını istediğiniz elemanı parantezler arasına yazmanız yeterli olacaktır. Kullanımı, aşağıdaki gibidir.

remove()Bu fonksiyon, pop ile aynı şeyi yapıyor. Yani listeden eleman çıkarıyor. Ancak pop(), argüman olarak index numarası isterken remove() elemanın kendisini ister. Yani spesifik olarak bir eleman çıkarmak isterseniz remove() fonksiyonunu kullanabilirsiniz.

extend()Bu fonksiyonun anlamı 'uzatmak' şeklindedir. Bu fonksiyonu kullanarak bir listeyi başka bir listeye ekleyebiliyoruz yani listeyi uzatabiliyoruz.

liste1 ve liste2 adında, içerikleri birbirinden farklı iki listemiz var. Bu noktada liste1.extend(liste2) komutuyla liste2'deki elemanları liste1'e çekiyoruz. Zaten print(liste1) komutu ile liste1'i yazdırdığımızda sağ tarafta göreceğiniz üzere liste1 hem kendi elemanlarını hem de liste2'nin elemanlarını kapsıyor.
liste1.extend dediğimiz zaman aslında "liste1'i uzat" demiş oluyoruz. extend fonksiyonuna verdiğimiz parametre ise taşınacak/eklenecek/uzatılacak listenin ismi oluyor.
insert()Anlamı 'yerleştirmek' şeklindedir. append() fonksiyonunu konuşurken listenin en sonuna eleman eklediğini söylemiştim. Burada, listenin belli yerlerine eleman ekleme şansımız var. Ancak bunu, 'eleman değiştirmek' ile karıştırmayın. Eleman değiştirirken eleman komple gidiyor, yerine yenisi geliyordu. Burada ise durum biraz farklı. Burada örneğin sıfırıncı index'e eleman eklemek istersek 'CyberWorm' ifadesi kaybolmayacak, sadece yer değiştirecektir. Örneğimize bakalım.

Çıktı kısmından da gördüğünüz gibi yeni listemizin başında, insert ile eklediğimiz ifade yer alıyor. Bu noktada 'CyberWorm' ifadesi yok olmamış, sadece bir index yana kaymıştır; elbette, diğer elemanlar da aynı şekilde kaymıştır. 'True' elemanı üçüncü index'te iken artık dördüncü index'te bulunuyor.
insert, parantezleri arasına iki değer alır. Bunlardan ilki index numarasıdır. Bu index numarasını, eklenecek olan elemanı nereye ekleyeceğini bilmesi için veriyoruz. Sonrasında bir adet virgül ile bunu ayırıyoruz ve eklemek istediğimiz elemanı yazıyoruz.
Yani 'insert(0, 'blog-cyberworm.com')' komutunda söylediğimiz şey şu oldu: "Sıfırıncı index'e 'blog-cyberworm.com' elemanını yerleştir."
sort()Bu, listedeki elemanları sıralamamıza olanak tanıyor. Örneğin doğru sırada yazılmayan bazı harfleri düzeltmek isterseniz bunu kullanabilirsiniz. Bu noktada düzelmiş hâlini bir değişkene de atayabilirsiniz; bunları biliyorsunuz.

Elbette bu, yalnızca string ifadeler için geçerli değil; sayısal ifadeler için de geçerlidir.

reverse()sort() fonksiyonu bunları düzgün bir şekilde sıralıyordu. reverse() fonksiyonu ise bir listeyi tersine çevirir ancak bunları sıralamaz.

count()Bu fonksiyon, liste içerisinde tekrar eden karakterlerin kaç defa tekrarlandığını söyler. Bunun için fonksiyona bir ifade vermemiz gerekir. count(), ona verdiğimiz ifadeyi listede arar ve onu kaç defa bulursa bunu yazdırır.

Bir örnek ile başlayıp açıklamalarla devam edelim.

Normal şartlarda print(myList) ile aynı şeyi yapan yukarıdaki kodu aynı şeyi yaptıklarını göstermek için yazmadım. Oradaki '[:]' ifadesini biz, dilimleme işlemlerinde kullanacağız. Bu işlem ile birlikte pasta dilimler gibi liste dilimlemeyi öğreneceğiz.

Şimdi, listede 1'den 10'a kadar sayılar mevcut. Aşağıda ise '[2:5]' şeklinde bir ifade görüyorsunuz ve çıktıda '[3, 4, 5]' ifadesini görüyorsunuz. İki nokta üst üste ifadesinin sol tarafının 2 olması, ikinci index'teki eleman ve sonrasının alınacağını ifade ederken sağ taraftaki 5 rakamı, bunun beşinci index'teki elemana kadar olacağını ifade eder. Yani "2 dahil 5 hariç" demiş oluyoruz. Buradaki '-a kadar' ifadesini yanlış anlamayın; Türkçe'de "beşinci index'teki elemana kadar" derken 5'in dahil olmadığını vurgularız; "oraya kadar git ama onu dahil etme". Başka bir örnek verelim.

Burada yine dördüncü index dahil olacak ancak sekizinci index dahil olmayacak şekilde işlem yapılacaktır. Dördüncü index 598 iken sekizinci index 49'dur. Çıktıda ise 598'in alındığını ancak 49'un alınmadığını görüyorsunuz.

Sol tarafa herhangi bir şey yazmadım ve Python bize, listenin tamamını sekizinci index'e kadar verdi. Bunun sebebi, sol tarafın varsayılan olarak '0' olmasıdır. Eğer oraya bir şey yazmazsanız bu, 0 olarak alınacaktır.

Eğer yukarıdaki gibi sağ tarafa bir şey yazmazsanız Python, soldaki index'ten başlayıp listenin kalanını alır. Bu konunun başında '[:]' ifadesinin bütün listeyi yazdırmasının sebebi de budur. Sol taraf varsayılan olarak 0 olduğu için ve sağ tarafta bir şey yazmadığı için Python 0'dan başlayıp tüm listeyi bize gösterdi.

Peki, bu ifade ne anlama geliyor? En soldaki kısım başlangıç noktası (dahil), ortadaki kısım da bitiş noktası idi (hariç). En sağdaki kısım ise atlama sayısıdır. Görsele dikkatle baktığınızda başlangıç ve bitiş noktalarına değer vermediğimi görüyorsunuz. Bu durumda listenin tamamının alınacağını artık biliyorsunuz. Fakat en son kısma da '2' koydum. Python bunu görünce listeden aldığı elemanları ikişer ikişer atlayarak seçecektir. İlk etapta sıfırıncı index alınacak, sonrasında 2, sonrasında 4 ve bu böyle sürecektir. Elbette, o değeri değiştirip üçer üçer atlamasını da sağlayabilirsiniz.
Yayınlanma Tarihi: 2022-10-28 13:55:27
Son Düzenleme Tarihi: 2022-11-01 17:13:53