Seriler nümerik değerler, atamalar, dosyalar, olaylar ve istisnaların yanında, gömülü veri türlerinden biridir. Python altı seri (ya da sıralı) veri türü sunar:
• karakter dizileri
• bayt serileri
• bayt dizileri
• listeler
• demetler
• aralık nesneleri
Karakter dizileri, listeler, demetler, baytlar ve aralık nesneleri çok farklı şeyler gibi görünebilir ancak yine de aşağıda belirttiğimiz ortak özellikleri vardır:
• Karakter dizilerinin, listelerin ve demetlerin elemanları tanımlı bir sıraya göre dizilmiştir
• Elementlere indis kullanarak erişilebilir.
text = "Listelere ve Karakter Dizilerine indisler üzerinden erişilebilir!"
print(text[0], text[11], text[-1])
Listelere erişmek:
lst = ["Viyana", "Londra", "Paris", "Berlin", "Zürih", "Hamburg"]
print(lst[0])
print(lst[2])
print(lst[-1])
Başka programlama dillerinden farklı olarak, Python sıralı veri türleri üzerinde çalışmak üzere aynı sözdizimi ve fonksiyon adlarını kullanır. Örneğin, bir listenin, karakter dizisinin ve demetin uzunluğu len() isimli fonksiyonla bulunabilir:
ülkeler = ["Almanya","İsviçre","Avusturya","Fransa","Belçika", "Hollanda", "İngiltere"]
len(ülkeler)
fib = [1,1,2,3,5,8,13,21,34,55]
len(fib)
Baytlar¶
Bayt nesnesi küçük tamsayılardan oluşan bir seridir. Bir bayt nesnesinin elemanları 0-255 arasında yer alır, ASCII karakterlere karşılık gelir ve bu şekilde yazdırılır.
Python Listeleri¶
Şu ana kadar bazı listeler kullandık, ancak listelere düzgün bir giriş yapmadık. Listeler C, C++ veya Java gibi dillerin dizilerine benzer yapılardır, ancak Python listeleri “klasik” dizilerden çok daha esnek ve güçlüdür. Örneğin bir listedeki unsurların hepsinin aynı türden olması gerekmez. Bunun dışında, listeler bir program çalışırken değişebilir, C’de ise bir dizinin boyutu derleme zamanında sabitlenmiş olmalıdır.
Genel olarak konuşmak gerekirse liste bir nesne koleksiyonudur. Python’daki bir liste unsurların veya elemanların sıralanmış bir grubudur. Bu liste elemanlarının aynı türden olmasına gerek olmadığını belirtmek isteriz. Sayılar, karakter dizileri, diğer listeler vb., eleman karışımı olabilir. Python betikleri ve programları için liste türü çok elzemdir, yani içinde liste olmayan bir Python programı bulmak pek muhtemel değil.
Python listelerinin temel özellikleri:
• Sıralıdır
• Rastgele nesneler içebilir
• Listenin elemanlarına indeks ile erişilebilir,
• İstenirse iç içe geçirilebilir, yani alt listeler olarak başka listeler içerebilir
• Boyutları değişkendir
• Değişebilir, yani bir listenin elemanları değiştirilebilir.
Liste Notasyonu ve Örnekler¶
Liste nesneleri köşeli parantezle kapatılır ve virgüller ile ayrılır. Aşağıdaki tabloda listelerin bazı örneklerini bulabilirsiniz:
Liste | Açıklama |
---|---|
[] | Boş bir liste |
[1,1,2,3,5,8] | Tamsayıları içeren bir liste |
[42, "Soru ne?", 3.1415] | Farklı veri türleri içeren bir liste |
["Stuttgart", "Freiburg", "München", "Nürnberg", "Würzburg", "Ulm","Friedrichshafen", Zürich", "Wien"] | Karakter dizileri içeren bir liste |
[["London","England", 7556900], ["Paris","France",2193031], ["Bern", "Switzerland", 123466]] | İç içe geçmiş bir liste |
["High up", ["further down", ["and down", ["deep down", "the answer", 42]]]] | Derin iç içe geçmiş bir liste |
Liste Elemanlarına Erişim¶
Bir değişkene liste atamak:
diller = ["Python", "C", "C++", "Java", "Perl"]Bir listenin elemanlarına erişimin değişik yolları vardır. C programcıları için en kolay yöntem muhtemelen indisler üzerinden olur, yani listelerin numaraları 0’dan başlayarak numaralandırılır:
diller = ["Python", "C", "C++", "Java", "Perl"]
print(diller[0] + " ve " + diller[1] + " çok farklıdır!")
print("Listenin son öğesine ulaşıyorum: : " + diller[-1])
Yukarıdaki örnekler aynı veri türlerine sahip öğelerin bulunduğu listeler. Ama daha önce yaptığımız gibi, listelerin çeşitli veri türleri de olabilir. Aşağıdaki örnek bunu gösteriyor:
grup = ["Ali", 23, "Ayşe", 72, "Fatma", 29]
Alt listeler¶
Listelerin öğe olarak alt listeleri olabilir. Bu alt listeler de alt listelere sahip olabilir, yani listeler alt list yapıları ile özyinelemeli olarak oluşturulabilir.
kişi = [["Murat","Yıldırım"],["17, Atatürk Caddesi", "12345","Ankara"],"07876-7876"]
ad_soyad = kişi[0]
print(ad_soyad)
ad = kişi[0][0]
print(ad)
soyad = kişi[0][1]
print(soyad)
adres = kişi[1]
cadde = kişi[1][0]
print(cadde)
Sonraki örnekte derin yapılı ve karmaşık bir liste göreceğiz:
karmaşık_liste = [["a",["b",["c","x"]]]]
karmaşık_liste = [["a",["b",["c","x"]]],42]
karmaşık_liste[0][1]
karmaşık_liste[0][1][1][0]
Listeleri değiştirmek¶
diller = ["Python", "C", "C++", "Java", "Perl"]
diller[4] = "Lisp"
diller
diller.append("Haskell")
diller
diller.insert(1, "Perl")
diller
alışveriş_listesi = ['süt', 'yoğurt', 'yumurta', 'tereyağ', 'ekmek', 'muz']
Sanal bir markete gidiyoruz. Sepetinizi kapın ve alışverişe başlayın:
alışveriş_listesi = ['süt', 'yoğurt', 'yumurta', 'tereyağ', 'ekmek', 'muz']
sepet = []
# "pop()"" listedeki son ögeyi siler ve bunu (geri) döndürür.
öge = alışveriş_listesi.pop()
print(öge, alışveriş_listesi)
sepet.append(öge)
print(sepet)
# böyle devam ediyoruz:
öge = alışveriş_listesi.pop()
print("alışveriş_listesi:", alışveriş_listesi)
sepet.append(öge)
print("sepet: ", sepet)
Ve bir while loop ile:
alışveriş_listesi = ['süt', 'yoğurt', 'yumurta', 'tereyağ', 'ekmek', 'muz']
sepet = []
while alışveriş_listesi != []:
öge = alışveriş_listesi.pop()
sepet.append(öge)
print(öge, alışveriş_listesi, sepet)
print("alışveriş_listesi:", alışveriş_listesi)
print("sepet: ", sepet)
Demetler¶
Bir demet değiştirilemeyen bir listedir, yani oluşturulduktan sonra hiçbir şekilde değiştirilemez. Bir demet, listelerle benzeşir ancak öğeler köşeli parantezler yerine normal parantezler arasına alınır. İndeks kullanımı listelerle aynıdır. Bir demet oluşturulduğu zaman ona öğe eklenemez ve ondan öğe çıkartılamaz. Peki demetler neden kullanılır?
• Demetler listelerden daha hızlı çalışır.
• Bazı verilerin değişmemesi gerektiğini düşünüyorsanız, listeler yerine demetler kullanmalısınız, çünkü bu veri türü verilerinizi kaza eseri oluşacak değişmelere karşı korur.
• Demetlerin temel avantajı, bunların sözlüklerde anahtar değer olarak kullanılabilmesidir, ancak listeler bunu yapamaz.
Aşağıdaki örneklerde bir demetin nasıl tanımlanacağını ve ona nasıl erişileceğini göreceğiz. Ayrıca bir demetin öğesine yeni bir değer atamaya çalıştığımızda hata oluşacağını da göreceğiz:
t = ("demetler", "değiştirilmez")
t[0]
t[0]="öğelere atama yapmak mümkün değildir"
Dilimleme¶
Pek çok programlama dilinde bir karakter dizisinin bir kısmını dilimlemek oldukça zordur ve daha da zor olanı, “alt dizi” adreslemesi yapmak isterseniz ortaya çıkar. Python dilimleme operatörü ile bu işi sizin için kolaylaştırır. Dilimleme sıklıkla, “substring”, “gstr” veya “substr” gibi olası adlarla bir fonksiyon olarak sunulur.
Bir karakter dizisinin veya listenin bir kısmını almak istediğiniz her an Python’daki dilimleme operatörü kullanırsınız. Sözdizimi basittir. Gerçekten de bir indekse sahip tek bir öğeye erişmeye biraz benzer, ancak bir sayı yerine iki nokta üst üste (:) işareti ile ayrılır. Bir başlangıç ve bir de bitiş indeks değeri kullanılır, bunlardan biri veya ikisi de yazılmayabilir. Dilimlemenin nasıl işlediğini anlamak için aşağıdaki örneklere bakalım:
str = "Python harikadır"
ilk_altı = str[0:6]
ilk_altı
beşten_başla = str[5:]
beşten_başla
bir_kopya = str[:]
son_beşli_olmadan = str[0:-5]
son_beşli_olmadan
Sözdizimsel olarak listelerde bir fark yoktur. Şimdi Avrupa şehir isimlerini girdiğimiz örneğe geri dönelim:
şehirler = ["Viyana", "Londra", "Paris", "Berlin", "Zürih", "Hamburg"]
ilk_üç = şehirler[0:3]
# daha kolayı:
ilk_üç = şehirler[:3]
print(ilk_üç)
Şimdi son ikisi olmadan, diğer şehirlerimizi seçelim, yani “Zürih” ve “Hamburg”’u hariç tutalım:
son_ikisi_hariç_hepsi = şehirler[:-2]
print(son_ikisi_hariç_hepsi)
Dilimleme üç argüman ile de çalışır. Üçüncü argüman 3 ise, karakter dizisinden veya demetten ilk ile son değer arasında üçer üçer gidilerek alınır.
Bir sıralı veri türü olarak s alınırsa bu şöyle çalışır:
s[başlangıç: son: adım]Sonuçtaki sıra aşağıdaki öğeleri içerir:
s[başlangıç], s[başlangıç+ 1 * adım], ... s[başlangıç+ i * adım] hepsi için (başlangıç + i * adım) < son.Aşağıdaki örnekte bir karakter dizisi tanımlıyoruz ve bu karakter dizisinin her üçüncü karakterini görüyoruz:
str = "Python Linux'ta çok iyi çalışır"
str[::3]
Aşağıdaki kelime salatası olarak görülen dizi iki cümle içeriyor. Birincisi Kanada’daki Python derslerimde kullandığım örtülü reklam: "TPoyrtohnotno ciosu rtshees lianr gTeosrto nCtiot yb yi nB oCdaennasdeao"
Bunu adım argümanı kullanarak dilimlemeyi deneyin. Çözümü sadece iki adım!
s = "TPoyrtohnotno ciosu rtshees lianr gTeosrto nCtiot yb yi nB oCdaennasdeao"
print(s)
s[::2]
s[1::2]
Bu karakter dizisini nasıl yaptığımızı merak etmiş olabilirsiniz. Aşağıda yazdıklarımızı anlamak için liste kapsamı tekniğini (list comprehension) kavramanız gerekecek:
s = "Toronto is the largest City in Canada"
t = "Python courses in Toronto by Bodenseo"
s = "".join(["".join(x) for x in zip(s,t)])
s
Uzunluk¶
Bir dizinin uzunluğu, örneğin bir listenin, bir karakter dizisinin veya bir demetin uzunluğu len() fonksiyonu ile bulunur. Karakter dizileri için karakter sayıları ölçülürken listeler ve demetler için öğe sayısı ölçülür ve alt listeler bir öğe olarak sayılır.
txt = "Merhaba Dünya"
len(txt)
a = ["Swen", 45, 3.54, "Basel"]
len(a)
Dizilerin Birleştirilmesi¶
Karakter katarı veya listeler gibi iki dizinin birleştirilmesi iki sayı eklemek kadar kolaydır. Operatör işareti bile aynıdır. Aşağıdaki örnek iki karakter dizisinin nasıl birleştirildiğini gösteriyor:
adınız = "Homer"
soy_adınız = "Simpson"
isim = adınız + " " + soy_adınız
print(isim)
Listeler için de olay basittir:
renkler1 = ["kırmızı", "yeşil","mavi"]
renkler2 = ["siyah", "beyaz"]
renkler = renkler1 + renkler2
print(renkler)
Artırma değeri verme işareti olan “+=” aritmetik atamalarda iyi bilinir, ancak dizilerde de çalışır.
s += tSözdizim açısından şununla aynıdır:
s = s + tAncak sadece sözdizim açısından aynıdır. Uygulama ise değişiktir. İlk durumda sol taraf sadece bir kere değerlendirilir. Arttırma komutları optimizasyon için değiştirilebilir nesnelere uygulanabilir.
Bir Öğenin Bir Listede Bulunup Bulunmadığını Sorgulama¶
Bir öğenin bir listede bulunup bulunmadığını kontrol etmek kolaydır. “in” veya “not in” operatörlerini bu amaçla kullanabiliriz. Aşağıdaki örnekte bu operatörün nasıl uygulanacağını gösteriyoruz:
abc = ["a","b","c","d","e"]
"a" in abc
"a" not in abc
"e" not in abc
"f" not in abc
"y" in str
"x" in str
Tekrarlamalar¶
Şimdiye kadar diziler için “+” operatörünün varlığını öğrendik. Ayrıca “*”
operatörünün de olduğunu şimdi öğreniyoruz. Elbette iki dizi arasında bildiğimiz manada bir çarpma yoktur. “*”
bir dizi ve bir tamsayı ile tanımlıdır, örneğin s n veya n s gibi. Bu, n tane birleştirmenin kısa yoludur denebilir:
str * 4şununla aynıdır:
str + str + str + strBaşka örnekler:
3 * "xyz-"
"xyz-" * 3
3 * ["a","b","c"]
“” için çoğaltma emri de bu amaçla kullanılabilir: s = n ile s = s * n aynıdır.
Tekrarlamadaki Gizli Tehlikeler¶
Önceki örneklerimizde tekrarlama operatörünü karakter dizilerinde ve düz listelerde kullanmıştık. Bunu girintili listelerde de kullanabiliriz:
x = ["a","b","c"]
y = [x] * 4
y
y[0][0] = "p"
y
Bu sonuç Python programlamaya yeni başlayanlar için oldukça hayret vericidir. y değişkeninin ilk alt listesindeki ilk öğeye yeni bir değer atadık, yani y[0][0]'a ve y’nin bütün alt listelerindeki ilk değeri “otomatik olarak” değiştirmiş olduk. (y[1][0], y[2][0] ve y[3][0] gibi.) Bunun sebebi tekrarlama operatörü olan “* 4”ün x listesine dört başvuru yapmasıdır: ve y[0][0]’a yeni bir değer atarsak y’nin her öğesi değişmiş olur.