Bu bölüme gelene kadar yalnızca iki farklı veri tipi görmüştük. Bunlardan biri karakter dizileri, öteki ise sayılardı.
İşte biz bu bölümde iki farklı veri tipi daha öğreneceğiz. Bu bölümde ele alacağımız veri tiplerinin adı ‘liste’ (list) ve ‘demet’ (tuple).
Listeleri ve demetleri incelemeye listelerden başlayalım…
Listeler
Listeleri tanımaya, bu veri tipini nasıl tanımlayacağımızı öğrenerek başlayalım.
Hatırlarsanız bir karakter dizisi tanımlayabilmek için şöyle bir yol izliyorduk:
>>> kardiz = "karakter dizisi"
Liste tanımlamak için de buna benzer bir şey yapıyoruz. Dikkatlice bakın:
>>> liste = ["öğe1", "öğe2", "öğe3"]
Bir liste elde etmek için, öğeleri birbirinden virgülle ayırıp, bunların hepsini köşeli parantezler içine alıyoruz.
Eğer bir nesne type()
fonksiyonuna <class ‘str’> cevabı veriyorsa o nesne bir karakter dizisidir. Listeler için de buna benzer bir sorgulama yapabiliriz:
>>> liste = ["öğe1", "öğe2", "öğe3"]
>>> type(liste)
<class 'list'>
Bu çıktıdan anlıyoruz ki, liste veri tipi type()
fonksiyonuna <class ‘list’> cevabı veriyor.
Listeler, bir veya daha fazla veri tipini içinde barındıran kapsayıcı bir veri tipidir. Mesela şu listeye bir bakalım:
>>> liste = ["Ahmet", "Mehmet", 23, 65, 3.2]
Gördüğünüz gibi, liste içinde hem karakter dizileri (“Ahmet”, “Mehmet”), hem de sayılar (23, 65, 3.2) var.
Dahası, listelerin içinde başka listeler de bulunabilir:
>>> liste = ["Ali", "Veli", ["Ayşe", "Nazan", "Zeynep"], 34, 65, 33, 5.6]
Bir de şunu deneyelim:
for öğe in liste:
print("{} adlı öğenin veri tipi: {}".format(öğe, type(öğe)))
Bu kodları çalıştırdığımızda da şöyle bir çıktı alıyoruz:
Ali adlı öğenin veri tipi: <class 'str'>
Veli adlı öğenin veri tipi: <class 'str'>
['Ayşe', 'Nazan', 'Zeynep'] adlı öğenin veri tipi: <class 'list'>
34 adlı öğenin veri tipi: <class 'int'>
65 adlı öğenin veri tipi: <class 'int'>
33 adlı öğenin veri tipi: <class 'int'>
5.6 adlı öğenin veri tipi: <class 'float'>
Bu kodlar bize şunu gösteriyor: Farklı öğeleri bir araya getirip bunları köşeli parantezler içine alırsak ‘liste’ adlı veri tipini oluşturmuş oluyoruz. Bu listenin öğeleri farklı veri tiplerine ait olabilir.
Hatırlarsanız karakter dizilerinin belirleyici özelliği tırnak işaretleri idi. Yukarıdaki örneklerden de gördüğünüz gibi listelerin belirleyici özelliği de köşeli parantezlerdir. Mesela:
>>> karakter = ""
Bu boş bir karakter dizisidir. Şu ise boş bir liste:
>>> liste = []
Yukarıdaki örneklerde bir listeyi kendimizin nasıl tanımlayacağımızı öğrendik. Peki listeler bize başka hangi kaynaktan gelebilir?
Hatırlarsanız karakter dizilerinin metotlarını sıralamak için dir()
adlı bir fonksiyondan yararlanmıştık.
>>> komut = dir(str)
>>> type(komut)
<class 'list'>
dir()
fonksiyonu dışında, başka bir şeyin daha bize liste verdiğini biliyoruz. Bu şey, karakter dizilerinin split()
adlı metodudur:
>>> kardiz = "İstanbul Büyükşehir Belediyesi"
>>> kardiz.split()
['İstanbul', 'Büyükşehir', 'Belediyesi']
Görüyorsunuz, split()
metodunun çıktısı da köşeli parantezler içinde yer alıyor. Demek ki bu çıktı da bir listedir.
Bir karakter dizisinin ilk harfi şu şekilde alabilirsiniz:
>>> kardiz = "İstanbul Büyükşehir Belediyesi"
>>> kardiz[0]
'İ'
Ama eğer bu ifade bir liste ise yukarıdaki yöntem size farklı bir sonuç verir:
>>> liste = kardiz.split()
>>> liste[0]
'İstanbul'
Çünkü “İstanbul Büyükşehir Belediyesi” adlı karakter dizisinin ilk öğesi “İ” karakteridir, ama [‘İstanbul’, ‘Büyükşehir’, ‘Belediyesi’] adlı listenin ilk öğesi, “İstanbul” kelimesidir.
Karakter dizilerini incelerken öğrendiğimiz len()
fonksiyonu listelerin boyutunu hesaplamada da kullanılabilir:
>>> diller = ["İngilizce", "Fransızca", "Türkçe", "İtalyanca", "İspanyolca"]
>>> len(diller)
5
len()
fonksiyonu dışında, range()
fonksiyonuyla listeleri de birlikte kullanabilirsiniz. Mesela herhangi bir kaynaktan size şunlar gibi iki öğeli listeler geliyor olabilir:
[0, 10]
[6, 60]
[12, 54]
[67, 99]
Bu iki öğeli listeleri tek bir liste içinde topladığımızı düşünürsek şöyle bir kod yazabiliriz:
sayılar = [[0, 10], [6, 60], [12, 54], [67, 99]]
for i in sayılar:
print(*range(*i))
Bu kod bize şöyle bir çıktı verecektir:
[0, 10]
[6, 60]
[12, 54]
[67, 99]
range()
fonksiyonunun nasıl kullanıldığını hatırlıyorsunuz. Yukarıdaki listelerde görünen ilk sayılar range()
fonksiyonunun ilk parametresi, ikinci sayılar ise ikinci parametresi olacak. Yani her döngüde şöyle bir şey elde etmemiz gerekiyor:
range(0, 10)
range(6, 60)
range(12, 54)
range(67, 99)
Aslında kodlarımızı şöyle yazarak yukarıdaki çıktıyı elde edebilirdik:
sayılar = [[0, 10], [6, 60], [12, 54], [67, 99]]
for i in sayılar:
print(range(i[0], i[1]))
Ancak ilk derslerimizden hatırlayacağınız gibi, bunu yapmanın daha kısa bir yolu var. Bildiğiniz gibi, öğelerden oluşan dizileri ayrıştırmak için yıldız işaretinden yararlanabiliyoruz.
sayılar = [[0, 10], [6, 60], [12, 54], [67, 99]]
for i in sayılar:
print(range(*i))
Gördüğünüz gibi, i değişkeninin soluna bir yıldız ekleyerek bu değişken içindeki değerleri ayrıştırdık ve şöyle bir çıktı elde ettik:
range(0, 10)
range(6, 60)
range(12, 54)
range(67, 99)
Listelerin öğelerine nasıl ulaşacağımızın ayrıntılarını biraz sonra göreceğiz. Ama biz şimdi listelere ilişkin önemli bir fonksiyonu inceleyerek yolumuza devam edelim.
list() Fonksiyonu
Yukarıdaki örneklerden de gördüğünüz gibi liste oluşturmak için öğeleri belirleyip bunları köşeli parantezler içine almamız yeterli oluyor.
Bu yöntemin dışında, liste oluşturmanın bir yöntemi daha bulunur. Mesela elimizde şöyle bir karakter dizisi olduğunu düşünelim:
>>> alfabe = "abcçdefgğhıijklmnoöprsştuüvyz"
Karakter dizilerini anlatırken split()
adlı bir metottan söz etmiştik. split()
metoduyla elde edilen verinin bir liste olduğunu biliyorsunuz. Örneğin:
>>> isimler = "ahmet mehmet cem"
>>> isimler.split()
['ahmet', 'mehmet', 'cem']
split()
metodu bu karakter dizisini boşluklardan bölebiliyor. Aynı şey şu karakter dizisi için de geçerlidir:
>>> isimler = "elma, armut, çilek"
Biz bu karakter dizisini split()
metodunu kullanarak “virgül + boşluk karakteri” ölçütüne göre bölebiliriz:
>>> isimler.split(", ")
['elma', 'armut', 'çilek']
Ancak bölümün başında tanımladığımız alfabe adlı karakter dizisi biraz farklıdır:
>>> alfabe = "abcçdefgğhıijklmnoöprsştuüvyz"
Gördüğünüz gibi, bu karakter dizisi tek bir parçadan oluşuyor.
İşte Türk alfabesindeki harflerden oluşan bu karakter dizisini, list()
adlı bir fonksiyondan yararlanarak istediğimiz şekilde bölebiliriz:
>>> harf_listesi = list(alfabe)
>>> print(harf_listesi)
['a', 'b', 'c', 'ç', 'd', 'e', 'f', 'g', 'ğ', 'h', 'ı', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'ö', 'p', 'r', 's', 'ş', 't', 'u', 'ü',
'v', 'y', 'z']
Böylece list()
fonksiyonu yardımıyla bu karakter dizisini tek hamlede listeye çevirmiş olduk.
list()
fonksiyonunun yaptığı işi, daha önce öğrendiğimiz str()
, int()
ve float()
fonksiyonlarının yaptığı işle kıyaslayabilirsiniz.
list()
fonksiyonu da tıpkı str()
, int()
ve float()
fonksiyonları gibi bir dönüştürme fonksiyonudur.
list()
fonksiyonunun önemli bir görevi de range()
fonksiyonunun, sayı aralığını ekrana basmasını sağlamaktır.
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Aslında burada yaptığımız şey range(10)
ifadesini bir listeye dönüştürmekten ibarettir. Burada range türünde bir veriyi list türünde bir veriye dönüştürüyoruz:
>>> type(range(10))
<class 'range'>
>>> li = list(range(10))
>>> type(li)
<class 'list'>
Böylece Python’da listelerin ne olduğunu ve bu veri tipinin nasıl oluşturulacağını öğrenmiş olduk. O halde bir adım daha atarak listelerin başka özelliklerine değinelim.
Listelerin Öğelerine Erişmek
Tıpkı karakter dizilerinde olduğu gibi, listelerde de her öğenin bir sırası vardır.
>>> meyveler = ["elma", "armut", "çilek", "kiraz"]
>>> meyveler[0]
'elma'
Bir listenin 0. öğesini aldığımızda ise o listenin ilk öğesini almış oluruz.
Eğer bu listenin öğelerinin hepsine tek tek ulaşmak isterseniz for
döngüsünden yararlanabilirsiniz:
meyveler = ["elma", "armut", "çilek", "kiraz"]
for meyve in meyveler:
print(meyve)
Bu listedeki öğeleri numaralandırmak da mümkün:
meyveler = ["elma", "armut", "çilek", "kiraz"]
for öğe_sırası in range(len(meyveler)):
print("{}. {}".format(öğe_sırası, meyveler[öğe_sırası]))
…veya enumerate()
fonksiyonunu kullanarak şöyle bir şey de yazabiliriz:
for sıra, öğe in enumerate(meyveler, 1):
print("{}. {}".format(sıra, öğe))
Karakter dizileri ile listeler arasındaki benzerlikleri birkaç örnek üzerinde gösterelim:
>>> meyveler = ["elma", "armut", "çilek", "kiraz"]
>>> meyveler[-1]
'kiraz'
Karakter dizilerinde olduğu gibi, öğe sırasını eksi değerli bir sayı yaptığımızda liste öğeleri sondan başa doğru okunuyor.
>>> meyveler[0:2]
['elma', 'armut']
Karakter dizileri konusunu işlerken öğrendiğimiz dilimleme yöntemi listeler için de aynen geçerlidir. Örneğin liste öğelerini ters çevirmek için şöyle bir kod yazabiliyoruz:
>>> meyveler[::-1]
['kiraz', 'çilek', 'armut', 'elma']
Bu bölümün başında da söylediğimiz gibi, liste adlı veri tipi, içinde başka bir liste de barındırabilir. Buna şöyle bir örnek vermiştik:
>>> liste = ["Ali", "Veli", ["Ayşe", "Nazan", "Zeynep"], 34, 65, 33, 5.6]
Bu listedeki öğeler şunlardır:
Ali
Veli
['Ayşe', 'Nazan', 'Zeynep']
34
65
33
5.6
Bu çıktıdan anlıyoruz ki, listemiz toplam 7 öğeden oluşuyor. Peki böyle bir liste içindeki gömülü listenin öğelerini elde etmek istersek ne yapacağız?
Örneğin sadece “Ayşe” öğesini almak istersek ne yapmamız gerekiyor?
>>> liste[2][0]
'Ayşe'
“Nazan” öğesini almak için:
>>> liste[2][1]
'Nazan'
“Zeynep” öğesini almak için:
>>> liste[2][2]
'Zeynep'
Yapmamız gereken tek şey, gömülü listenin önce ana listedeki konumunu, ardından da almak istediğimiz öğenin gömülü listedeki konumunu belirtmektir.
İstersek gömülü listeyi ayrı bir liste olarak da alabiliriz:
>>> yeni_liste = liste[2]
>>> yeni_liste
['Ayşe', 'Nazan', 'Zeynep']
Böylece bu listenin öğelerine normal bir şekilde ulaşabiliriz:
>>> yeni_liste[0]
'Ayşe'
>>> yeni_liste[1]
'Nazan'
>>> yeni_liste[2]
'Zeynep'
Listelerin Öğelerini Değiştirmek
Hatırlarsanız karakter dizilerinden söz ederken bunların değiştirilemez (immutable) bir veri tipi olduğunu söylemiştik.
Listeler ise değiştirilebilen (mutable) bir veri tipidir. Şu örneği dikkatlice inceleyin:
>>> renkler = ["kırmızı", "sarı", "mavi", "yeşil", "beyaz"]
>>> print(renkler)
['kırmızı', 'sarı', 'mavi', 'yeşil', 'beyaz']
>>> renkler[0] = "siyah"
>>> print(renkler)
['siyah', 'sarı', 'mavi', 'yeşil', 'beyaz']
Yukarıdaki örnekte renkler adlı listenin 0. öğesini değiştirmek istiyoruz. Bunun için şöyle bir formül kullandık:
renkler[öğe_sırası] = yeni_öğe
Örnek olması açısından, aynı listenin 2. sırasındaki “mavi” adlı öğeyi “mor” yapalım bir de:
>>> renkler[2] = "mor"
>>> print(renkler)
['siyah', 'sarı', 'mor', 'yeşil', 'beyaz']
Liste öğelerini değiştirmeye çalışırken, eğer var olmayan bir sıra numarasına atıfta bulunursanız Python size IndexError
tipinde bir hata mesajı gösterecektir:
>>> renkler[10] = "pembe"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
Sıra numaralarını kullanarak listeler üzerinde daha ilginç işlemler de yapabilirsiniz. Mesela şu örneğe bakın:
>>> liste = [1, 2, 3]
>>> liste[0:len(liste)] = 5, 6, 7
>>> print(liste)
[5, 6, 7]
Sıra numaralarını kullanarak gerçekten son derece enteresan işlemler yapabilirsiniz.
Sıra numaraları ile neler yapabileceğinizi görmek için kendi kendinize ve hayal gücünüzü zorlayarak bazı denemeler yapmanızı tavsiye ederim.
Listeye Öğe Eklemek
Listeler büyüyüp küçülebilen bir veri tipidir. Yani Python’da bir listeye istediğiniz kadar öğe ekleyebilirsiniz. Diyelim ki elimizde şöyle bir liste var:
>>> liste = [2, 4, 5, 7]
Bu listeye yeni bir öğe ekleyebilmek için şöyle bir kod yazabiliriz:
>>> liste + [8]
[2, 4, 5, 7, 8]
Python’da + işareti kullanarak bir listeye öğe ekleyecekseniz, eklediğiniz öğenin de liste olması gerekiyor.
Mesela bir listeye doğrudan karakter dizilerini veya sayıları ekleyemezsiniz:
>>> liste + 8
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "int") to list
>>> liste + "8"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "str") to list
Listelere + işareti ile ekleyeceğiniz öğelerin de bir liste olması gerekiyor. Aksi halde Python bize bir hata mesajı gösteriyor.
Listeleri Birleştirmek
Tıpkı karakter dizilerinde olduğu gibi, listelerde de birleştirme işlemleri için + işlecinden yararlanabilirsiniz.
Diyelim ki elimizde şöyle iki adet liste var:
>>> derlenen_diller = ["C", "C++", "C#", "Java"]
>>> yorumlanan_diller = ["Python", "Perl", "Ruby"]
Bu iki farklı listeyi tek bir liste haline getirmek için şöyle bir kod yazabiliriz:
>>> programlama_dilleri = derlenen_diller + yorumlanan_diller
['C', 'C++', 'C#', 'Java', 'Python', 'Perl', 'Ruby']
Bu işlemin sonucunu görelim:
>>> print(programlama_dilleri)
Diyelim ki kullanıcı tarafından girilen sayıların ortalamasını hesaplayan bir program yazmak istiyorsunuz. Bunun için şöyle bir kod yazabilirsiniz:
sayılar = 0
for i in range(10):
sayılar += int(input("not: "))
print(sayılar/10)
Peki girilen sayıların ortalaması ile birlikte, hangi sayıların girildiğini de göstermek isterseniz nasıl bir kod yazarsınız?
sayılar = 0
notlar = []
for i in range(10):
veri = int(input("{}. not: ".format(i+1)))
sayılar += veri
notlar += [veri]
print("Girdiğiniz notlar: ", *notlar)
print("Not ortalamanız: ", sayılar/10)
Burada kullanıcıdan gelen verileri her döngüde tek tek notlar adlı listeye gönderiyoruz.
Böylece programın sonunda, kullanıcıdan gelen veriler bir liste halinde elimizde bulunmuş oluyor.
Listeden Öğe Çıkarmak
Bir listeden öğe silmek için del adlı ifadeden yararlanabilirsiniz. Örneğin:
>>> liste = [1, 5, 3, 2, 9]
>>> del liste[-1]
>>> liste
[1, 5, 3, 2]
Listeleri Silmek
Python’da listeleri tamamen silmek de mümkündür. Örneğin:
>>> liste = [1, 5, 3, 2, 9]
>>> del liste
>>> liste
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'liste' is not defined
Listeleri Kopyalamak
Diyelim ki, yazdığınız bir programda, varolan bir listeyi kopyalamak istiyorsunuz. Mesela elimizde şöyle bir liste olsun:
>>> li1 = ["elma", "armut", "erik"]
Amacımız bu listeden bir tane daha oluşturmak. İlk olarak aklınıza şöyle bir yöntem gelmiş olabilir:
>>> li2 = li1
Gerçekten de bu yöntem bize aynı öğelere sahip iki liste verdi:
>>> print(li1)
["elma", "armut", "erik"]
>>> print(li2)
["elma", "armut", "erik"]
Gelin şimdi ilk listemiz olan li1 üzerinde bir değişiklik yapalım. Mesela bu listenin “elma” olan ilk öğesini “karpuz” olarak değiştirelim:
>>> li1[0] = "karpuz"
>>> print(li1)
["karpuz", "armut", "erik"]
Şimdi şu noktada, li2 adlı öbür listemizin durumunu kontrol edelim:
>>> print(li2)
["karpuz", "armut", "erik"]
li1 listesinde yaptığımız değişiklik li2 listesinde de gözüküyor
Peki sadece li1 listesinde nasıl değişiklik yapacağız
>>> li2 = li1[:]
Burada li1’i kopyalarken, listeyi baştan sona dilimlediğimize dikkat edin.
Bakalım li1’deki değişiklik öbürünü de etkiliyor mu:
>>> li1[0] = "elma"
>>> li1
["elma", "armut", "erik"]
>>> li2
["karpuz", "armut", "erik"]
Aynı işi yapmak için kullanabileceğimiz ikinci yöntem ise list()
fonksiyonunu kullanmaktır:
Önce özgün listemizi görelim:
>>> liste1 = ["ahmet", "mehmet", "özlem"]
Şimdi bu listeyi kopyalayalım:
>>> liste2 = list(liste1)
Artık elimizde birbirinin kopyası durumunda iki farklı liste var:
>>> liste2
['ahmet', 'mehmet', 'özlem']
>>> liste1
['ahmet', 'mehmet', 'özlem']
Şimdi liste2 üzerinde bir değişiklik yapalım:
>>> liste2[0] = 'veli'
liste2’yi kontrol edelim:
>>> liste2
['veli', 'mehmet', 'özlem']
Bakalım liste1 bu değişiklikten etkilenmiş mi:
>>> liste1
['ahmet', 'mehmet', 'özlem']
Listeleri kopyalamanın üçüncü bir yöntemi daha var. Bu yöntemi de bir sonraki bölümde liste metotlarını incelerken ele alacağız.
Devam edecek…
Bu eğitim seti Kaynak tarafından oluşturulmuştur.