4.6 “in” Parçacı ˘ gı ile Aitlik Kontrolü
4.7 Listelerin Metotları
4.7.1 append Metodu
Bir önceki bölümde append() metoduna de˘ginmi¸stik. Orada söyledi˘gimize göre bu metodun görevi bir listeye ö˘ge eklemek idi. Zaten “append” kelimesi ˙Ingilizce’de “eklemek, ili¸stirmek”
gibi anlamlara gelir. Hemen bu metodu nasıl kullanabilece˘gimizi gösteren bir örnek yapalım.
Önce bir liste tanımlayalım. ˙Isterseniz bo¸s bir liste olsun bu:
>>> liste = []
Listemizi kontrol edelim:
>>> print(liste)
[]
Hakikaten listemiz bo¸s!
¸
Simdi bu bo¸s listeye bir ö˘ge ekleyelim:
>>> liste.append("Ubuntu")
¸
Simdi listemizi tekrar kontrol edelim:
>>> print(liste)
[’Ubuntu’]
Bu listeye ¸simdi ba¸ska bir ö˘ge daha ekleyelim:
>>> liste.append("Debian")
Listemize bakalım tekrar:
>>> print(liste)
[’Ubuntu’, ’Debian’]
Listemizin ö˘gelerine tek tek eri¸sebilece˘gimizi biliyorsunuz:
>>> print(liste[0])
Ubuntu
...veya..
>>> print(liste[1])
Debian
Hatta liste ö˘gelerini ters de çevirebiliriz:
>>> print(liste[::-1])
[’Debian’, ’Ubuntu’]
Peki ya bir ö˘geyi de˘gi¸stirmek istersek...
>>> liste[1] = "Gentoo"
>>> print(liste)
[’Debian’, ’Gentoo’]
append() metodunu kullanarak bir listeye sadece tek bir ö˘ge ekleyebiliriz. Yani ¸söyle bir ¸sey mümkün de˘gildir:
>>> liste.append("SuSe", "RedHat")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: append() takes exactly one argument (2 given)
Bu hata çıktısına göreappend() metodu yalnızca tek bir ö˘ge alabiliyor. Biz ise 2 tane vermi¸siz...
Ama ¸söyle bir ¸sey yapmak mümkündür:
>>> liste.append(["SuSe", "RedHat"])
Gördü˘günüz gibi, “SuSe” ve “RedHat” ö˘gelerini bir liste olarak ekledik. Yalnız, ö˘geleri bu ¸ sek-ilde ekledi˘gimizde listenin durumu pek bekledi˘giniz gibi olmayabilir:
>>> print(liste)
[’Debian’, ’Gentoo’, [’SuSe’, ’RedHat’]]
Gördü˘günüz gibi, “SuSe” ve “RedHat” ö˘geleri listeye ayrı bir liste olarak eklendi. Yani aslında yine listeye tek bir ö˘ge eklenmi¸s oldu:
>>> print(liste[2])
[’SuSe’, ’RedHat’]
Demek ki listemizin üçüncü ö˘gesi buymu¸s... Burada sadece “SuSe” ö˘gesini almak isterseniz
¸
söyle bir ¸sey yazmanız gerekti˘gini biliyorsunuz:
>>> print(liste[2][0])
’SuSe’
“RedHat”i almak için ise:
>>> print(liste[2][1])
’RedHat’
E˘ger append() metodunu kullanarak bir listeye birden fazla ö˘ge eklemek isterseniz elbette çaresiz de˘gilsiniz. for döngüsü ne güne duruyor?
>>> for s in ["Fedora", "Knoppix"]:
... liste.append(s)
[’Debian’, ’Gentoo’, [’SuSe’, ’RedHat’], ’Fedora’, ’Knoppix’]
Dedi˘gimiz gibi,for döngüsünü kullanarak bu ¸sekilde birden fazla ö˘geyi listeye ekleyebilirsiniz.
Ama isterseniz, bu i¸slem için üretilmi¸s ayrı bir metottan da yararlanabilirsiniz. Bu yeni metodun adı extend(). Bunu bir sonraki bölümde görece˘giz... Ama append() metodu ile ilgili olarak söylememiz gerekenler henüz bitmedi.
append() metodu liste metotları içinde en çok kullanılan metottur. Dolayısıyla listelerin ba¸ska hiçbir metodunu bilmeseniz de append() metodunu bilmeniz gerekir. Bu metodu kullanarak bazı örnekler vermeye devam edelim. Mesela ¸su programa bakalım:
tek_sayılar = []
çift_sayılar = []
ba¸sla = 1
bilgi = """Rastgele sayılar giriniz.
Her sayı giri¸ste enter tu¸suna basınız.
˙I¸slemi bitirmek için "ç" tu¸suna basınız:"""
print("Girdi˘giniz ¸su sayılar çifttir: ", çift_sayılar) print("Girdi˘giniz ¸su sayılar ise tektir: ", tek_sayılar)
Burada öncelikle “tek_sayılar” ve “çift_sayılar” adlı iki farklı liste olu¸sturduk. Kullanıcıdan gele-cek tek ve çift sayıları ayrı ayrı listelerde depolayaca˘gız.
Ardından “ba¸sla = 1” ¸seklinde bir kod yazarak “ba¸sla” de˘gi¸skenini “1” olarak ayarlıyoruz. Bu de˘gi¸sken, programın biti¸sini kontrol etmemizi sa˘glayacak.
Daha sonra “bilgi” adlı ba¸ska bir de˘gi¸sken daha tanımlıyoruz. Burada kullanıcıyı pro-gramın nasıl çalı¸stırılaca˘gı hakkında bilgilendiriyoruz. Buna göre kullanıcıdan rastgele sayılar girmesini, her sayıdan sonra da enter tu¸suna basmasını istiyoruz. E˘ger kullanıcı programdan çıkmak isterse “ç” tu¸suna basacak.
Bir sonraki satırda bilgi adlı de˘gi¸skeni ekrana yazdırıyoruz.
Daha sonra, programımızın sürekli olarak çalı¸smasını temin etmek için birwhile döngüsü ku-ruyoruz. Programımızın sürekli olarak çalı¸sması “ba¸sla” adlı de˘gi¸skenin de˘gerinin “1” olmasına ba˘glı. En ba¸sta, bu “ba¸sla” adlı de˘gi¸skenin de˘gerini “1” olarak ayarladı˘gımız için programımız sürekli olarak çalı¸smaya devam edecektir.
Bir alttaki satırda kullanıcıdan veri almamızı sa˘glayacak olaninput() fonksiyonunu yazıyoruz.
Dikkat edersenizinput() fonksiyonunu bo¸s bıraktık. Neden? Çünkü zaten kullanıcıya göstere-ce˘gimiz bilgiyi en ba¸sta “bilgi” adlı bir de˘gi¸sken tanımlayarak gösterdik. Elbette isteseydik bu input() fonksiyonuyla da kullanıcıya bilgi verebilirdik. Ama burada input() fonksiyonunu bo¸s bırakmamızın nedeni biraz da estetik kaygılar.. Çünkü programımız içinde birwhile döngüsü oldu˘gu için, e˘ger buradainput() fonksiyonunu bo¸s bırakmazsak, kullanıcı her sayı giri¸sinde bu input() fonksiyonu içinde tanımladı˘gımız karakter dizisini de görecektir. ˙Isterseniz, input() fonksiyonunu bo¸s bırakmadan bir deneme yapın. Görece˘giniz gibi, kullanıcının her sayı gir-i¸sinde tekrar tekrar aynı karakter dizisini görmesi pek ho¸s olmuyor...
Bir sonraki adımda programdan çıkı¸s ko¸sulumuzu belirliyoruz. E˘ger kullanıcı “ç” harfine basarsa “ba¸sla” de˘gi¸skeninin de˘geri “0” olarak ayarlanacaktır. Daha önce tanımladı˘gımız while döngüsüne göre, programımızın sürekli olarak çalı¸sması “ba¸sla” de˘gi¸skeninin de˘gerinin
“1” olmasına ba˘glıydı. Kullanıcı “ç” tu¸suna bastı˘gında “ba¸sla” de˘gi¸skeninin de˘geri “0” olaca˘gı için programımız duracaktır.
Hemen ardından kullanıcıdan gelen sayıların çift olup olmadı˘gına bakıyoruz. Burada “soru”
de˘gi¸skenini int() fonksiyonu yardımıyla sayıya çevirdi˘gimize dikkat edin. Bildi˘giniz gibi, input() fonksiyonunun verdi˘gi de˘gerin tipi karakter dizisidir. Kullanıcıdan gelen bilgiyle ar-itmetik bir i¸slem yapabilmek için bu bilgiyi öncelikle sayıya dönü¸stürmemiz gerekir. Bir önceki satırda programdan çıkı¸s ko¸sulunu tanımlarken “soru” de˘gi¸skenini sayıya dönü¸stürmedi˘gimize
dikkat edin. Aksi halde kullanıcı “ç” tu¸suna bastı˘gında Python “ç” harfini sayıya dönü¸ stürm-eye çalı¸sacak, bunu ba¸saramayınca da hata verecektir. O yüzden orada input() fonksiy-onuna herhangi bir dönü¸stürme i¸slemi uygulamadık... Çift sayıları belirledikten sonra
“çift_sayılar.append(soru)” komutu yardımıyla kullanıcıdan aldı˘gımız çift sayıları “çift_sayılar”
adlı listeye ekliyoruz.
¸
Simdi sıra geldi tek sayıları belirlemeye. Bunu da birelse: blo˘gu yardımıyla yapıyoruz. E˘ger kullanıcıdan gelen bilgi bir çift sayı de˘gilse veya kullanıcı “ç” harfine basmamı¸ssa kullanıcının girdi˘gi sayı bir tek sayıdır. Bunu da “tek_sayılar” adlı listeye ekliyoruz. Tabii kullanıcı “ç” harfi dı¸sında ba¸ska bir harfe basarsa programımız hata verecektir. Henüz bu tür durumlara kar¸sı önlem almayı bilmiyoruz. Ama ilerde bunu nasıl yapaca˘gımızı da ö˘grenece˘giz. Fakat ¸simdilik
¸
söyle bir kod yazarak en azından bu tür bir problemi büyük ölçüde çözmü¸s olursunuz:
tek_sayılar = []
çift_sayılar = []
kontrol = "0123456789"
ba¸sla = 1
bilgi = """Rastgele sayılar giriniz.
Her sayı giri¸ste enter tu¸suna basınız.
˙I¸slemi bitirmek için "ç" tu¸suna basınız:"""
print(bilgi) while ba¸sla == 1:
soru = input() if soru == "ç":
ba¸sla = 0
elif soru[0] not in kontrol:
print("lütfen bir sayı giriniz") elif "." in soru:
print("yoksa ondalık bir sayı mı girdiniz?")
elif int(soru) % 2 == 0:
çift_sayılar.append(soru) else:
tek_sayılar.append(soru)
print("Girdi˘giniz ¸su sayılar çifttir: ", çift_sayılar) print("Girdi˘giniz ¸su sayılar ise tektir: ", tek_sayılar)
Burada bir önceki kodlara ilave olarak bir “kontrol” de˘gi¸skeni tanımlıyoruz. Bu de˘gi¸sken 0’dan 9’a kadar olan bütün sayıları içeriyor. Daha sonra program içinde iki adetelif... blo˘gu olu¸ s-turarak bu kontrol de˘gi¸skeninin içindeki sayılara göre bazı denetlemeler yapıyoruz. Burada daha önce ö˘grendi˘gimiz in ve not parçacıklarını kullandı˘gımıza dikkat edin. Bu parçacık-lar yardımıyla, kullanıcının girdi˘gi verilerin kontrol de˘gi¸skeni içinde olup olmadı˘gını denetliy-oruz. Yani “aitlik” kontrolü yapıydenetliy-oruz... Burada ayrıca kontrol de˘gi¸skenimizin bir karakter dizisi oldu˘guna dikkat edin. Daha önce de söyledi˘gimiz gibi,in ve not parçacıkları sadece listelere özgü bir özellik de˘gildir. Bunları Python’daki ba¸ska ö˘gelerle birlikte de kullanabiliriz. Dedi˘gimiz gibi, bu kodlar da kar¸sı kar¸sıya oldu˘gumuz sorunu tam anlamıyla çözmeye yetmez. Bu sorunun kökten çözümünü birkaç ders sonra görece˘giz.
¸
Simdi artık bir sonraki metodumuzu incelemeye geçebiliriz.