Python ile Programlamaya Giris Ders 6 list Veri Tipi - Diziler Su ana kadar gördügümüz veri tipleri sadece bir deger barindiran veri tipleriydi. Yani sadece bir tane tamsayi veya sadece bir tane string temsil eder veri tipleri. Python ile birden fazla degeri bir yerde barindiran list veri tipini görecegiz. list veri tipi matematikte ögrendigimiz dizilere çok benzer. list veri tipine bu yüzden dizi de diyecegiz. Bir dizinin elemanlari [ ] sembollerinin arasinda virgül (,) ile ayrilarak verilir. notlar = [80, 90, 70] Yukaridaki örnekte 3 elemanli bir dizi tanimlaniyor. notlar degiskeni 3 elemanli bir dizi degerini içeriyor. Bos bir dizi eleman içermeyen dizidir ve asagidaki gibi tanimlanabilir. bos = [] Dizinin elemanlarina, daha önce str degerlerinin karakterlerine ulastigimiz gibi, indeks ile ulasilir. Yine str degerlerinde oldugu gibi dizilerde de indeks sifirdan baslar. >>> notlar[0] 80 >>> notlar[1] 90 >>> notlar[2] 70 Ayni sekilde negatif indeksler de diziler için geçerlidir.
>>> notlar[-1] 70 >>> notlar[-2] 90 str degerlerinde gördügümüz bölme islemleri dizilerde de geçerli. Mesela dizinin ilk elemanindan ikinci elemani dahil olmak üzere bir alt dizisine asagidaki gibi ulasabiliriz. >>> notlar[0:2] [80, 90] Bölme isleminin sonucu yine her zaman bir dizidir. in sorgulama operatörü bir elemanin dizide bulunup bulunmadigini tespit eder. >>> 80 in notlar True >>> 60 in notlar False Daha önce gördügümüz len, min ve max dahili fonksiyonlari da diziler için kullanilabilir. len bir dizinin eleman sayisini verir. >>> len(notlar) 3 min dizinin en küçük elemanini verir. >>> min(notlar) 70 max dizinin en büyük elemanini verir. >>> max(notlar) 90 min ve max fonksiyonlari sadece sayisal degerler için degil, büyüktür ve
küçüktür kiyaslamalarinin yapilabildigi her veri tipi için kullanilabilir. Alistirma: min(["a","b"]) ve max(["a","b"]) ifadelerinin sonucu nedir? Eger dizide sayisal degerler varsa, notlar degiskeninde oldugu gibi, sum dahili fonksiyonu elemanlarin toplamini verir. >>> sum(notlar) 240 Mesela notlar dizinin aritmetik ortalamasi çok kolay bir sekilde asagidaki gibi bulunabilir. >>> sum(notlar)/len(notlar) 80.0 Bir dizinin elemanlari hep ayni veri tipinden olmak zorunda degil. Mesela asagidaki dizi bir tamsayi ve bir string içeriyor. [40, "Biyoloji"] str ile for döngüsünü hatirlayalim. str degerinin her bir karakterine for döngüsü ile asagidaki gibi ulasilabiliyordu. >>> for ch in "Abc": print(ch) A b c Bir dizinin elemanlarina for döngüsü ile ayni sekilde ulasilabilir.
>>> for e in notlar: print(e) 80 90 70 list Metodlari Su ana kadar hep modüllere ait fonksiyonlari gördük. Mesela len ve min gibi fonksiyonlar builtins modülüne ait fonksiyonlardi. Bu modüle ait fonksiyonlara dahili fonksiyonlar dedik. Daha sonra harici fonksiyonlara örnek olarak math modülünü verdik. sqrt ve log10 gibi fonksiyonlar bu modülde bulunuyordu degil mi? dir(math) ile math modülünde tanimli bütün fonksiyonlari listeleyebiliyorduk. Simdi dir fonksiyonunu bir baska amaç için kullanacagiz: Bir veri tipinde tanimli metodlari listelemek için. Modüller için fonksiyonlar ne ise veri tipleri için metodlar da o dur. Mesela math modülündeki sqrt fonksiyonunu çagirmak için math.sqrt(9) yazmamiz gerekiyordu. Asagida dir(list) ile list veri tipi için tanimli fonksiyonlar, yani metodlar, listeleniyor. >>> dir(list) [, 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'] Bu metodlarin bazilari diziyi degistirebiliyor, bazilari ise sadece dizi hakkinda bilgiler veriyor. Mesela renkler dizisi asagidaki gibi tanimlansin. renkler = ["sari", "siyah"]
append metodu dizinin sonuna bir eleman ekler. renkler.append("kirmizi") renkler dizisinde su anda "sari", "siyah" ve "kirmizi" var. ['sari', 'siyah', 'kirmizi'] extend metodu dizinin sonuna bir dizi ekler. renkler.extend(["yesil", "mavi"]) renkler dizisinin artik 5 elemani var. ['sari', 'siyah', 'kirmizi', 'yesil', 'mavi'] pop dizinin son elemani çikartir ve geriye verir..pop() 'mavi' Artik dizide sadece 4 eleman kaldi. ['sari', 'siyah', 'kirmizi', 'yesil'] pop sadece dizinin son elemanini degil, elemanin indeksini vererek istedigimiz elemanini çikartabiliriz. Asagidaki örnek indeksi 2 olan elemani çikartir. Bu sefer pop fonksiyonunun ayni zamanda çikarttigi elemanini bir degiskene atayalim. renk = renkler.pop(2) renk degiskeninde çikartilan eleman, yani "kirmizi" var.
>>> renk 'kirmizi' Dizimizde böylece "sari", "siyah" ve "yesil" kaldi. ['sari', 'siyah', 'yesil'] Eger çikartmak istedigimiz elemanin indeksini bilmiyoruz fakat elemanin kendisini biliyorsak remove metodunu kullanabiliriz. renkler.remove('siyah') Su dizide sadece "sari" ve "yesil" kaldi. Eger disize bulunmayan bir elemani çikartmak istersek Python hata verir. Mesela "pembe" dizimizde mevcut degilken çikartmaya çalisalim ve hatayi görelim..pembe("pembe") Traceback (most recent call last): File "<pyshell#44>", line 1, in <module> renkler.pembe("pembe") AttributeError: 'list' object has no attribute 'pembe' count metodu verilen elemanin bir dizide kaç defa bulundugunu verir. Bu metodu kullanarak elemanlari güvenli bir sekilde çikartabiliriz. if renkler.count('pembe'): renkler.remove('pembe') Dikkatli olanlar ayni islemin in operatörü ile de yapilabilecegini farketmistir. if 'pembe' in renkler: renkler.remove('pembe') Alistirma: Bir eleman bir dizide birden fazla kez bulunuyorsa pop ve remove fonksiyonlari nasil çalisir? Python IDLE ile deneyin. Burada metodlarin parametrelerinin veri tipine dikkat çekmekte fayda var. Mesela extend metodu parametre olarak bir liste bekliyor. Yani asagidaki
örnek hata verir çünkü list tipinden bir parametre bekleyen metoda str tipinden 3 parametre verilmistir..extend('fistik yesili', 'inci siyahi', 'amber sar Traceback (most recent call last): File "<pyshell#50>", line 1, in <module> renkler.extend('fistik yesili', 'inci siyahi', 'amber sar TypeError: extend() takes exactly one argument (3 given) Dogrusu tabi ki parametre olarak bir tane dizi vermek olacaktir. Asagidaki örnekte extend metoduna 3 elemanli bir dizi veriliyor. renkler.extend(['fistik yesili', 'inci siyahi', 'amber sarisi Böylece dizimizin eleman sayisi 5 oldu. ['sari', 'yesil', 'fistik yesili', 'inci siyahi', 'amber sari sort ile bir diziyi siralayabiliriz..sort() ['amber sarisi', 'fistik yesili', 'inci siyahi', 'sari', 'yes min ve max 'ta oldugu gibi sort metodunda da önemli olan dizide kiyaslanabilir elemanlarin olmasi. Dizinin elemanlari str tipinden oldugundan siralama alfabetik siralamaya göre yapilmistir. Burada str tip için tanimli < ve > gibi operatörlere tekrar bakmakta fayda var. reverse metoduyla dizinin elemanlari tersine çevrilebilir..reverse() ['yesil', 'sari', 'inci siyahi', 'fistik yesili', 'amber sari append ile bir elemanin dizinin en sonun eklendigini görmüstük. insert ile elemani dizinin istedigimiz yerine ekleyebiliriz. Mesela asagidaki örnek 'pembe'yi indeksi 2 olan elemanin soluna ekliyor.
renkler.insert(2,'pembe') ['yesil', 'sari', 'pembe', 'inci siyahi', 'fistik yesili', 'a Alistirma: renkler.insert(-2, 'pembe') olsaydi ne olurdu? Bir elemanin indeksini bilmiyorsak index metodu ile bulabiliriz. Mesela 'fistik yesili'nin indeksini bulalim..index('fistik yesili') 4 'fistik yesili'nin indeksi 4. Eger indeksini aradigimiz eleman dizide mevcut degilse Python yine hata verir. Mesela 'siyah'nin indeksi bulmaya çalisalim..index('siyah') Traceback (most recent call last): File "<pyshell#64>", line 1, in <module> renkler.index('siyah') ValueError: 'siyah' is not in list remove metodunda oldugu gibi, index metodunda da güvenli bir sorgulama için count metodu veya in operatörü ile önce sorgulayarak kullanilabilir. if 'siyah' in renkler: indeks = renkler.index('siyah') list - Dizilerin Degiskenligi Su ana kadar gördügümüz veri tiplerinin list hariç hepsi de degistirilemez verit tipleriydi. str için daha önce verilen bir bilgi vardi, one hatirlayalim: Stringler asla degistirilemez. Degistirilemeyen verilere immutable denir. Mesela s = "Merhaba" ifadesinde s[0], "M" harfini gösteriyor. s degiskeninin ilk karakterini "A" yapmak için s[0] = "A" ifadesini kullanirsak hata verir. Mutlaka yeni bir string olusturmamiz lazim. Bu problemin
çözümü s = "A" + s[1:] dir. Hatirlamak için bir önceki dersin "str Degiskenleri Degistirilemez" baslikli konusunu okumaniz tavsiye olunur. list degistirilebilen bir veri tipidir. Mesela m asagidaki gibi tanimli olsun. m = [0, 2, 4, 6, 8] Dizinin ikinci elemanini degistirmek için yine [ ] operatörü ve indeks kulanilir. m[1] = 3 Dizinin ikinci elemaninin indeksi 1 dir çünkü indeks her zaman 0 dan baslar. Yukarindaki örnkete diznin ikinci elemani artik 2 degil 3 olmustur. >>> m [0, 3, 4, 6, 8] Degistirilebilen veri tiplerine mutable denir. Aslinda bir önceki konuda gördügümüz remove, append ve extend gibi metodlar zaten verilen diziyi degistiriyordu. Fakat bu gördügümüz ilk degistirilebilen veri tipi oldugunu farketmemis olabiliriz. Degistirilebilir (mutable) veri tipleri ile programlarken çok dikkatli olmak gerekir. Stringlerin degistirilemez olmasinin elbette bir nedeni var. Çünkü stringler çok fazla yerde kullaniliyor ve degistirilebilir olsaydi programcilarin çok daha fazla dikkat etmesi gerekirdi. Neye mi? Python'da buna aliasing diyecegiz. Konuya devam etmeden birinci dersin "Degiskenler ve hafiza kullanimi" baslikli konusunu okumaniz tavsiye olunur. Aliasing birden fazla degiskenin ayni hafiza adresini göstermesidir. Mesela notlar ve puanlar asagidaki gibi tanimlansin. notlar = [30, 40, 50, 60] puanlar = notlar notlar degiskeni 4 elemanli bir diziyi gösteriyor. puanlar degiskeni ise ayni diziyi gösteriyor.
notlar x22 x21 puanlar x22 x22 [30, 40, 50, 60] x23 Dizinin ikinci elemanini 75 yapalim. notlar[1] = 75 notlar ve puanlar ayni diziyi gösterdigi için ikisinin içerigi ayni olacaktir. >>> notlar [30, 75, 50, 60] >>> puanlar [30, 75, 50, 60] Hafizda sadece bir tane dizi tanimli ve biz o dizinin ikinci elemanini degistirdik. puanlar degiskeni kendi basina vir veri tipi tutmuyor. Sadece notlar degiskeninin tuttugu diziyi gösteriyor. O yüzden bu degiskene alias denir. notlar x22 x21 puanlar x22 x22 [30, 75, 50, 60] x23 Asagidaki örnekte gösterilen fonksiyon verilen bir dizinin elemanlarini ikiye katliyor. def iki_kati(dizi): i = 0 while i < len(dizi): dizi[i] = dizi[i] * 2 i = i + 1
iki_kati fonksiyonu verilen diziyi degistiriyor. Burada dizi degiskeni bir alias degiskendir. Yani bir baska degiskenin gösterdigi adresi gösterir. >>> m = [0, 1, 2, 3, 4] >>> iki_kati(m) >>> m [0, 2, 4, 6, 8] Peki alias degiskenleri nasil anlasilir? Degiskene = ile atama yapilirken eger sag tarafinda bir baska degisken varsa soldaki degisken bir alias degisken demektir. puanlar = notlar ifadesinin sag tarafinda bir degisken var. puanlar degiskeni için yeni bir veri olusturulmamis, sadece notlar degiskeninin adresi atanmis. Dikkat edilirse notlar = [30, 40, 50, 60] ifadesinde yeni tanimlanan biz dizi vardi. range Dahili Fonksiyonu Programlamada sayi dizileri çok kullanilir. Python'da sayi dizisi üretmek için range fonksiyonunu kulanacagiz. range fonksiyonu farkli sekillerde kullanilabilir. Bu bölümde for döngüsü ile kullanimini görecegiz. >>> for i in range(5): print(i) 0 1 2 3 4 Yukaridaki örnekte range fonksiyonu sifirdan baslayarak verilen sayiya kadar (verilen sayi dahil degil!) olan sayilari birer birer artirarak üretir. Döngü her çalistiginda i degiskenine bir sonraki sayi ataniyor. Mesela s degiseni asagidaki gibi tanimlanmis olsun. s = "Merhaba"
s degiskeni 7 harfli bir kelimeyi gösteriyor. Dolayisiyla len(s) 7 olacaktir. Peki range(len(7)) hangi sayi dizisini üretir? Tabi ki sifirdan altiya kadar (alti dahil) olan sayi dizisini. >>> for i in range(len(s)): print(i) 0 1 2 3 4 5 6 Programlamana genelde indeks degeri tutan degiskenlere i ismi verilir. Böylece bu degiskenin bir indeks tuttugu anlasilir. Yukaridaki örnekte i aslinda s degiskenin tüm elemanlarinin indeksi oluyor. Eger i yerine s[i] nin çiktisini yazsaydik indeks yerine indekslerin karsilik geldigi karakterleri görürdük. >>> for i in range(len(s)): print(s[i]) M e r h a b a range fonksiyonu sadece sifirdan baslamak zorunda degil. help(range) ile bu fonksiyon hakkinda detayli bilgi elde edebilirsiniz. Eger sayi dizisinin sifirdan farkli bir sayidan baslamasini istiyorsak range fonksiyonuna iki parametre veririz. Asagidaki örnek birden basliyor.
>>> for i in range(1,4): print(i) 1 2 3 Sayi dizimiz birer birer artmak zorunda da degil. range fonksiyonuna eger üç paramtere verirsek üçüncü parametre artis sayisini verir. Mesela asagidaki örnek birden ona kadar tek sayilari üretiyor. >>> for i in range(1,10, 2): print(i) 1 3 5 7 9