Bu bölümde, önceki derslerde üstünkörü bakıp geçtiğimiz bir konu olan karakter dizilerini çok daha derinlemesine ele alacağız.
Karakter Dizilerinin Öğelerine Erişmek
İstersek karakter dizilerini bir for
döngüsü içine alabilir, böylece bu dizinin öğelerine tek tek de erişebiliriz:
for karakter in nesne:
print(karakter)
for
döngüsüyle elde ettiğimiz bu etkiyi şu kodlar yardımıyla da elde edebileceğimizi gayet iyi biliyor olmalısınız:
print(*nesne, sep="\n")
Önceki derslerde verdiğimiz örneklerden de bildiğiniz gibi, karakter dizilerinin öğelerine yukarıdaki yöntemlerle tek tek erişebilmemiz sayesinde herhangi bir işlemi karakter dizilerinin bütün öğelerine bir çırpıda uygulayabiliyoruz. Mesela:
nesne = "123456789"
for n in nesne:
print(int(n) * 2)
Burada nesne değişkeni içindeki sayı değerli karakter dizilerini n olarak adlandırdıktan sonra, n değişkenlerinin her birini tek tek 2 sayısı ile çarptık. Yani çarpma işlemini karakter dizisinin bütün öğelerine tek seferde uygulayabildik.
Peki ya biz bir karakter dizisinin öğelerinin tamamına değil de, sadece tek bir öğesine erişmek istersek ne yapacağız?
Python’da karakter dizilerinin içindeki öğelerin bir sırası vardır. Örneğin “Python” dediğimizde, bu karakter dizisinin ilk öğesi olan “P” karakterinin sırası 0’dır. “y” karakteri ise 1. sıradadır. Aynı şekilde devam edersek, “t” karakteri 2., “h” karakteri 3., “o” karakteri 4., “n” karakteri ise 5. sırada yer alır.
Bu anlattığımız soyut durumu bir örnekle somutlaştırmaya çalışalım:
Diyelim ki “Python” karakter dizisinin ilk karakterini almak istiyoruz. Yani biz bu karakter dizisinin sadece “P” harfine ulaşmayı amaçlıyoruz.
Bu isteğimizi nasıl yerine getirebileceğimizi basit bir örnek üzerinde göstermeye çalışalım:
>>> kardiz = "Python"
>>> kardiz[0]
'P'
Karakter dizisinin istediğimiz bir öğesine ulaşmak için, ilgili öğenin sırasını köşeli parantezler içinde belirttik. Biz bu örnekte karakter dizisinin ilk öğesine ulaşmak istediğimiz için köşeli parantez içinde 0 sayısını kullandık.
Şimdi de, ilk verdiğimiz örnekteki nesne değişkeni içinde yer alan sayılar arasından sadece birini 2 ile çarpmak istediğimizi düşünelim:
>>> nesne = "123456789"
>>> int(nesne[1]) * 2
4
Burada da öncelikle nesne değişkeninin birinci sırasında yer alan öğeyi (dikkat: sıfırıncı sırada yer alan öğeyi değil!) elde etmek için köşeli parantezler içinde 1 sayısını kullandık. Daha sonra int()
fonksiyonu yardımıyla bu karakter dizisini tam sayıya çevirdik, ki bununla aritmetik işlem yapabilelim… Son olarak da elimizdeki tam sayıyı 2 ile çarparak istediğimiz sonuca ulaştık.
Bu yapının mantığını kavramak için şu örnekleri dikkatlice inceleyin:
>>> kardiz = "Python"
>>> kardiz[0]
'P'
>>> kardiz[1]
'y'
>>> kardiz[3]
'h'
>>> kardiz[5]
'n'
>>> kardiz[2]
't'
>>> kardiz[4]
'o'
>>> nesne = "123456789"
>>> nesne[0]
'1'
>>> nesne[1]
'2'
>>> nesne[2]
'3'
>>> nesne[3]
'4'
>>> nesne[4]
'5'
>>> nesne[5]
'6'
>>> nesne[6]
'7'
>>> nesne[7]
'8'
>>> nesne[8]
'9'
Asla unutmayın, Python saymaya her zaman 0’dan başlar. Dolayısıyla bir karakter dizisinin ilk öğesinin sırası 0’dır.
Karakter dizilerinin öğelerine tek tek erişirken dikkat etmemiz gereken önemli noktalardan biri de, öğe sırası belirtirken, karakter dizisinin toplam uzunluğu dışına çıkmamaktır.
Yani mesela 7 karakterlik bir karakter dizimiz varsa, bu karakter dizisinin son öğesinin sırası 6 olacaktır. Örneğin:
>>> kardiz = "istihza"
>>> len(kardiz)
7
Gördüğünüz gibi, “istihza” adlı karakter dizisinin uzunluğu 7. Yani bu karakter dizisi içinde 7 adet karakter var.
Şu ana kadar öğe sırası olarak hep artı değerli sayılar kullandık. Ancak istersek öğe sırası olarak eksi değerli sayıları da kullanabiliriz.
Eğer bir karakter dizisine öğe sırası olarak eksi değerli bir sayı verirsek Python o karakter dizisini sondan başa doğru okumaya başlayacaktır. Yani:
>>> kardiz[-1]
'a'
Peki karakter dizisinin uzunluğunu aşan bir sayı verirsek ne olur?
>>> kardiz = "istihza"
>>> kardiz[7]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: string index out of range
…veya:
>>> kardiz[-8]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: string index out of range
Eğer karakter dizisinin uzunluğunu aşan bir sayı belirtirsek Python bize IndexError
türünde bir hata mesajı verecektir.
Gördüğünüz gibi, kardiz[0]
, kardiz[1]
, kardiz[2]
, vb. komutlarla karakter dizisinin öğelerine erişebiliyoruz.
Burada öğe sıralarını tek tek yazmak yerine range()
fonksiyonunu kullanarak da öğelere tek tek erişebilirsiniz:
for i in range(7):
print(kardiz[i])
Bu kodlarda, kardiz[0]
, kardiz[1]
, kardiz[2]
şeklinde öğe sıralarını tek tek elle yazmak yerine, range(7)
aralığındaki sayıları bir for döngüsüne alıyoruz.
Uzunluğunu bilmediğiniz karakter dizileri için range()
fonksiyonuyla birlikte len()
fonksiyonundan yararlanabilirsiniz.
for karakter in range(len(kardiz)):
print(kardiz[karakter])
Yukarıdaki durumu daha iyi anlayabilmek için bir örnek daha verelim. Diyelim ki kullanıcıya ismini sorup, kendisine şöyle bir çıktı vermek istiyorsunuz:
isminizin 1. harfi ...
isminizin 2. harfi ...
isminizin 3. harfi ...
...
Bunu yapabilmek için şöyle bir uygulama yazabilirsiniz:
isim = input("isminiz: ")
for i in range(len(isim)):
print("isminizin {}. harfi: {}".format(i+1, isim[i]))
Gördüğünüz gibi, kullanıcının girdiği kelimenin uzunluğu kaç ise o sayı otomatik olarak range()
fonksiyonuna atanıyor. Diyelim ki kullanıcı Ferhat ismini girmiş olsun.
Bu kelimede toplam 6 karakter var. Dolayısıyla Python for
satırını şöyle yorumlayacaktır:
for i in range(6):
...
Python for
döngüsünün ilk turunda şöyle bir işlem gerçekleştirir:
print("isminizin {}. harfi: {}".format(0, isim[0]))
İkinci turda ise şöyle bir işlem:
print("isminizin {}. harfi: {}".format(1, isim[1]))
Bu döngü 6 sayısına gelene kadar devam eder. Burada i adlı değişkenin değerinin her döngüde nasıl değiştiğine dikkat edin.
Python i adını verdiğimiz değişkene, for
döngüsünün her turunda sırasıya 0, 1, 2, 3, 4 ve 5 sayılarını atayacağı için isim adlı değişkenin öğeleri isim[öğe_sırası]
formülü sayesinde tek tek ekrana dökülecektir.
Karakter Dizilerini Dilimlemek
Bu bölümde karakter dizilerini ‘dilimlemekten’ söz edeceğiz. Peki ‘dilimlemek’ derken neyi kastediyoruz? Şu örnek, ne demek istediğimizi daha net ortaya koyacaktır:
>>> site = "www.istihza.com"
>>> site[4:11]
'istihza'
>>> site[12:16]
'com'
>>> site[0:3]
'www'
Gördüğünüz gibi, karakter dizisine köşeli parantez içinde bazı değerler vererek bu karakter dizisini dilim dilim ayırdık. Peki bunu nasıl yaptık? Yukarıdaki örneklerde şöyle bir yapı gözümüze çarpıyor:
karakter_dizisi[alınacak_ilk_öğenin_sırası:alınacak_son_öğenin_sırasının_bir_fazlası]
Bu formülü çok basit bir örneğe uygulayalım:
>>> karakter_dizisi = "istanbul"
>>> karakter_dizisi[0:3]
'ist'
Bu bilgileri kullanarak şöyle bir uygulama yazalım:
site1 = "www.google.com"
site2 = "www.istihza.com"
site3 = "www.yahoo.com"
site4 = "www.gnu.org"
for isim in site1, site2, site3, site4:
print("site: ", isim[4:-4])
Yukarıdaki örnekte isim[4:-4]
yapısını kullanarak, site1, site2, site3, site4 adlı karakter dizilerini, ilk dört ve son dört karakterler hariç olacak şekilde dilimledik.
Böylece elimizde “google”, “istihza”, “yahoo” ve “gnu” kalmış oldu.
Bütün bu anlattıklarımızı daha iyi anlayabilmek için bir örnek daha verelim:
ata1 = "Akıllı bizi arayıp sormaz deli bacadan akar!"
ata2 = "Ağa güçlü olunca kul suçlu olur!"
ata3 = "Avcı ne kadar hile bilirse ayı da o kadar yol bilir!"
ata4 = "Lafla pilav pişse deniz kadar yağ benden!"
ata5 = "Zenginin gönlü oluncaya kadar fukaranın canı çıkar!"
Burada beş adet atasözü verdik. Bizim görevimiz, bu atasözlerinin sonunda bulunan ünlem işaretlerini ortadan kaldırmak:
for ata in ata1, ata2, ata3, ata4, ata5:
print(ata[0:-1])
Peki bu ünlem işaretlerini kaldırdıktan sonra bunların yerine birer nokta koymak istersek ne yapacağız?
for ata in ata1, ata2, ata3, ata4, ata5:
print(ata[0:-1] + ".")
Böylece karakter dizilerini nasıl dilimleyeceğimizi öğrenmiş olduk. Bu konuyu kapatmadan önce dilimlemeye ilişkin bazı ayrıntılardan söz edelim. Diyelim ki elimizde şöyle bir karakter dizisi var:
>>> kardiz = "Sana Gül Bahçesi Vadetmedim"
Bu karakter dizisi içinden sadece ‘Sana’ kısmını dilimlemek için şöyle bir şey yazabileceğimizi biliyorsunuz:
>>> kardiz[0:4]
'Sana'
Eğer karakter dizisi içinden alınan ilk karakterin sırasını gösteren sayı 0 ise, bu sayıyı belirtmesek de olur. Yani kardiz[0:4]
kodunu şöyle de yazabiliriz:
>>> kardiz[:4]
'Sana'
Gördüğünüz gibi, ilk sıra sayısını yazmazsak Python ilk sayıyı 0 kabul ediyor.
Şimdi de aynı karakter dizisi içindeki ‘Vadetmedim’ kısmını dilimlemeye çalışalım:
>>> kardiz[17:27]
'Vadetmedim'
Alacağımız son karakterin sırası karakter dizisinin sonuncu karakterine denk geliyorsa o sayıyı da yazmamıza gerek yok. Yani yukarıdaki kardiz[17:27]
kodunu şöyle de yazabiliriz:
>>> kardiz[17:]
'Vadetmedim'
Python’daki bu dilimleme özelliğini kullanarak karakter dizilerini istediğiniz gibi eğip bükebilir, evirip çevirebilirsiniz.
Karakter Dizilerini Ters Çevirmek
Eğer amacınız bir karakter dizisini ters çevirmek, yani karakter dizisi içindeki her bir öğeyi tersten yazdırmaksa biraz önce öğrendiğimiz dilimleme yöntemini kullanabilirsiniz. Dikkatlice bakın:
>>> kardiz[::-1]
'midemtedaV iseçhaB lüG anaS'
Gördüğünüz gibi, “Sana Gül Bahçesi Vadetmedim” adlı karakter dizisi içindeki bütün karakterler sondan başa doğru ekrana dizildi.
Eğer bir karakter dizisinin tamamının değil de, sadece belli bir kısmının ters çevrilmiş halini elde etmek istiyorsanız elbette yapmanız gereken şey, almak istediğiniz ilk ve son karakterlerin sırasını parantez içinde belirtmek olacaktır.
>>> kardiz[7:4:-1]
'lüG'
Yukarıdaki örnek, karakter dizisi dilimlemeye ilişkin olarak bize bazı başka ipuçları da veriyor. Gördüğünüz gibi, köşeli parantez içinde toplam üç adet parametre kullanabiliyoruz. Yani formülümüz şöyle:
kardiz[ilk_karakter:son_karakter:atlama_sayısı]
Bir örnek verelim:
>>> kardiz = "istanbul"
>>> kardiz[0:8:1]
'istanbul'
Burada “istanbul” adlı karakter dizisinin bütün öğelerini birer birer ekrana döktük. Bir de şuna bakalım:
>>> kardiz[0:8:2]
'itnu'
Burada ise “istanbul” adlı karakter dizisinin bütün öğelerini ikişer ikişer atlayarak ekrana döktük. Yani bir karakter yazıp bir karakter atladık (istanbul).
Python’ın kuralları gereğince yukarıdaki kodu şöyle yazabileceğimizi de biliyorsunuz:
>>> kardiz[::2]
'itnu'
Eğer karakter dizisini ters çevirmek istiyorsak, yukarıdaki örneği eksi değerli bir atlama sayısı ile yazmamız gerekir:
>>> kardiz = "istanbul"
>>> kardiz[::-1]
'lubnatsi'
>>> kardiz[::-2]
'lbas'
Dediğimiz gibi, yukarıdaki yöntemi kullanarak karakter dizilerini ters çevirebilirsiniz. Ama eğer isterseniz reversed()
adlı bir fonksiyondan da yararlanabiliriz.
>>> reversed("Sana Gül Bahçesi Vadetmedim")
<reversed object at 0x00E8E250>
Gördüğünüz gibi, bu fonksiyonu düz bir şekilde kullandığımızda bize bir ‘reversed’ nesnesi vermekle yetiniyor.
for i in reversed("Sana Gül Bahçesi Vadetmedim"):
print(i, end="")
…veya:
print(*reversed("Sana Gül Bahçesi Vadetmedim"), sep="")
Dilimleme veya reversed()
fonksiyonunu kullanma yöntemlerinden hangisi kolayınıza geliyorsa onu tercih edebilirsiniz.
Karakter Dizilerini Alfabe Sırasına Dizmek
Python’da karakter dizilerinin öğelerine tek tek ulaşma, öğeleri dilimleme ve ters çevirmenin yanısıra, bu öğeleri alfabe sırasına dizmek de mümkündür. Bunun için sorted()
adlı bir fonksiyondan yararlanacağız:
>>> sorted("kitap")
['a', 'i', 'k', 'p', 't']
sorted()
fonksiyonu bize çıktı olarak, birkaç bölüm sonra inceleyeceğimiz ‘liste’ adlı bir veri tipi verir.
Ama tabii eğer isterseniz bu çıktıyı alıştığınız biçimde alabilirsiniz:
print(*sorted("kitap"), sep="")
…veya:
for i in sorted("kitap"):
print(i, end="")
Bir örnek daha verelim:
>>> sorted("elma")
['a', 'e', 'l', 'm']
Gördüğünüz gibi, sorted()
fonksiyonunu kullanmak çok kolay, ama aslında bu fonksiyonun önemli bir problemi var. Dikkatlice bakın:
>>> sorted("çiçek")
['e', 'i', 'k', 'ç', 'ç']
Burada Türkçe bir karakter olan ‘ç’ harfinin düzgün sıralanamadığını görüyoruz. Bu sorun bütün Türkçe karakterler için geçerlidir.
Bu sorunu aşmak için şöyle bir yöntem deneyebilirsiniz:
>>> import locale
>>> locale.setlocale(locale.LC_ALL, "Turkish_Turkey.1254") #Windows için
>>> locale.setlocale(locale.LC_ALL, "tr_TR") #GNU/Linux için
>>> sorted("çiçek", key=locale.strxfrm)
['ç', 'ç', 'e', 'i', 'k']
Burada locale
adlı bir modülden yararlandık. Bu modülü ilerleyen derslerde daha ayrıntılı bir şekilde inceleyeceğiz.
Yukarıdaki örnekte Türkçe karakterleri doğru sıralayabilmek için sorted()
fonksiyonunu nasıl kullandığımıza dikkat edin:
>>> sorted("çiçek", key=locale.strxfrm)
Burada sorted()
metodunun key adlı özel bir parametresine locale.strxfrm değerini vererek Türkçeye duyarlı bir sıralama yapılmasını sağladık.
Karakter Dizileri Üzerinde Değişiklik Yapmak
Elimizde şöyle bir karakter dizisi olduğunu düşünün:
>>> meyve = "elma"
Amacımız bu karakter dizisinin ilk harfini büyütmek olsun.
Bunun için dilimleme yönteminden yararlanabileceğimizi biliyorsunuz:
>>> "E" + meyve[1:]
'Elma'
Burada “E” harfi ile, meyve değişkeninin ilk harfi dışında kalan bütün harfleri birleştirdik.
Bir örnek daha verelim.
Elimizde şöyle dört adet internet sitesi adresi olsun:
site1 = "www.google.com"
site2 = "www.istihza.com"
site3 = "www.yahoo.com"
site4 = "www.gnu.org"
Bizim amacımız bu adreslerin her birinin baş tarafına http:// ifadesini eklemek. Bunun için de yine karakter dizisi birleştirme işlemlerinden yararlanabiliriz. Dikkatlice inceleyin:
site1 = "www.google.com"
site2 = "www.istihza.com"
site3 = "www.yahoo.com"
site4 = "www.gnu.org"
for i in site1, site2, site3, site4:
print("http://", i, sep="")
Eğer www. kısımlarını atmak isterseniz karakter dizisi birleştirme işlemleri ile birlikte dilimleme yöntemini de kullanmanız gerekir:
for i in site1, site2, site3, site4:
print("http://", i[4:], sep="")
Yukarıdaki örneklerde gördüğümüz değişiklikler kalıcı değildir. Yani aslında bu değişikliklerin orijinal karakter dizisi üzerinde hiçbir etkisi yoktur.
>>> kardiz = "istihza"
>>> "İ" + kardiz[1:]
'İstihza'
Dediğimiz gibi, sanki burada “istihza” karakter dizisini “İstihza” karakter dizisine çevirmişiz gibi duruyor. Ama aslında öyle değil:
>>> print(kardiz)
istihza
Eğer bir karakter dizisi üzerinde değişiklik yapmanız gerekiyorsa, yapabileceğiniz tek şey o karakter dizisini yeniden tanımlamaktır. Mesela yukarıdaki örnekte kardiz değişkeninin tuttuğu karakter dizisini değiştirmek isterseniz şöyle bir kod yazabilirsiniz:
>>> kardiz = "İ" + kardiz[1:]
>>> print(kardiz)
İstihza
Yukarıdaki örnekte karakter dizisinin baş kısmı üzerinde değişiklik yaptık. Eğer karakter dizisinin ortasında kalan bir kısmı değiştirmek isterseniz de şöyle bir şey yazabilirsiniz:
>>> kardiz = "istihza"
>>> kardiz = kardiz[:3] + "İH" + kardiz[5:]
>>> kardiz
'istİHza'
Gördüğünüz gibi, yukarıdaki kodlarda karakter dizilerini dilimleyip birleştirerek, yani bir bakıma kesip biçerek istediğimiz çıktıyı elde ettik.
Bir karakter dizisi üzerinde değişiklik yapmak istiyorsak, o karakter dizisini baştan tanımlamamız gerekir.
Üç Önemli Fonksiyon
Bu fonksiyonlar sadece karakter dizileri ile değil, başka veri tipleri ile çalışırken de işlerimizi bir hayli kolaylaştıracak.
dir()
İlk olarak dir()
adlı özel bir fonksiyondan söz edeceğiz. Bu metot bize Python’daki bir nesnenin özellikleri hakkında bilgi edinme imkanı verecek.
Mesela karakter dizilerinin bize hangi metotları sunduğunu görmek için bu fonksiyonu şöyle kullanabiliriz:
>>> dir(str)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__',
'__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__',
'__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__',
'__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__',
'__subclasshook__', 'capitalize', 'center', 'count', 'encode', 'endswith',
'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha',
'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable',
'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip',
'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition',
'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase',
'title', 'translate', 'upper', 'zfill']
İngilizcede ‘karakter dizisi’nin karşılığının string, bu kelimenin kısaltmasının da ‘str’ olduğunu hatırlıyor olmalısınız. İşte dir()
fonksiyonuna parametre olarak bu ‘str’ kelimesini verdiğimizde, Python bize karakter dizilerinin bütün metotlarını listeliyor.
Karakter dizilerinin metotlarını sorgulamak için ‘str’ kelimesini kullanabileceğimiz gibi, herhangi bir karakter dizisini de kullanabiliriz. Yani:
>>> dir("")
Burada dir()
fonksiyonuna parametre olarak boş bir karakter dizisi verdik. Bu kodun dir(str)
kodundan hiçbir farkı yoktur. Bu komut da bize karakter dizilerinin metotlarını listeler.
dir("")
komutunun çıktısından da göreceğiniz gibi, karakter dizilerinin epey metodu var. Metot listesi içinde bizi ilgilendirenler başında veya sonunda _ işareti olmayanlar. Yani şunlar:
>>> for i in dir(""):
... if "_" not in i[0]:
... print(i)
...
Bu arada bu metotları listelemek için nasıl bir kod kullandığımıza dikkat edin:
for i in dir(""):
if "_" not in i[0]:
print(i)
Burada dir("")
komutunun içerdiği her bir metoda tek tek bakıyoruz. Bu metotlar içinde, ilk harfi _ karakteri olmayan bütün metotları listeliyoruz. İsterseniz ilgilendiğimiz metotların sayısını da çıktıya ekleyebiliriz:
sayaç = 0
for i in dir(""):
if "_" not in i[0]:
sayaç += 1
print(i)
print("Toplam {} adet metot ile ilgileniyoruz.".format(sayaç))
Burada da, ilk karakteri _ olmayan her bir metot için sayaç değişkeninin değerini 1 artırıyoruz. Böylece programın sonunda sayaç değişkeni ilgilendiğimiz metot sayısını göstermiş oluyor.
enumerate()
Eğer yazdığınız bir programda numaralandırmaya ilişkin işlemler yapmanız gerekiyorsa Python’ın size sunduğu çok özel bir fonksiyondan yararlanabilirsiniz. Bu fonksiyonun adı enumerate()
.
Gelelim bu fonksiyonun nasıl kullanılacağına… Önce şöyle bir deneme yapalım:
>>> enumerate("istihza")
<enumerate object at 0x00E3BC88>
Tıpkı reversed()
fonksiyonunun bir ‘reversed’ nesnesi vermesi gibi, bu fonksiyonun da bize yalnızca bir ‘enumerate’ nesnesi verdiğini görüyorsunuz.
reversed()
fonksiyonunu kullanabilmek için şöyle bir kod yazmıştık:
>>> print(*reversed("istihza"))
enumerate()
için de benzer bir şeyi deneyebiliriz:
>>> print(*enumerate("istihza"))
Burada şu çıktıyı aldık:
(0, 'i') (1, 's') (2, 't') (3, 'i') (4, 'h') (5, 'z') (6, 'a')
Enumerate kelimesi İngilizcede ‘numaralamak, numaralandırmak’ gibi anlamlara gelir. Dolayısıyla enumerate()
fonksiyonu, kendisine parametre olarak verilen değer hakkında bize iki farklı bilgi verir:
Bir öğe ve bu öğeye ait bir sıra numarası. Yukarıdaki çıktıda gördüğünüz şey de işte her bir öğenin kendisi ve o öğeye ait bir sıra numarasıdır.
Yukarıdaki çıktıyı daha iyi anlayabilmek için bir for
döngüsü kullanmak daha açıklayıcı olabilir:
>>> for i in enumerate("istihza"):
... print(i)
...
(0, 'i')
(1, 's')
(2, 't')
(3, 'i')
(4, 'h')
(5, 'z')
(6, 'a')
Gördüğünüz gibi, gerçekten de bu fonksiyon bize bir öğe (mesela ‘i’ harfi) ve bu öğeye ait bir sıra numarası (mesela 0) veriyor.
for sıra, metot in enumerate(dir("")):
print(sıra, metot)
Yukarıdaki kodlar yardımıyla, bu öğelerin her birini ayrı bir değişkene (sıra ve metot) atamış oluyoruz. Böylece bu çıktıyı manipüle etmek bizim için daha kolay oluyor.
Mesela bu özelliği kullanarak metot ve sıra numarasının yerlerini değiştirebiliriz:
>>> for sıra, metot in enumerate(dir("")):
... print(metot, sıra)
...
__add__ 0
__class__ 1
__contains__ 2
__delattr__ 3
__doc__ 4
__eq__ 5
__format__ 6
__ge__ 7
(...)
Pratik olması açısından şöyle bir örnek daha verelim:
>>> for sıra, metot in enumerate(dir("")):
... print(sıra, metot, len(metot))
...
0 __add__ 7
1 __class__ 9
2 __contains__ 12
3 __delattr__ 11
4 __doc__ 7
5 __eq__ 6
(...)
Burada, dir("")
ile elde ettiğimiz metotların sırasını (sıra), bu metotların adlarını (metot) ve her bir metodun kaç karakterden oluştuğunu (len(metot)
) gösteren bir çıktı elde ettik.
Bu arada, gördüğünüz gibi, enumerate()
fonksiyonu numaralandırmaya 0’dan başlıyor. Elbette eğer isterseniz bu fonksiyonun numaralandırmaya kaçtan başlayacağını kendiniz de belirleyebilirsiniz.
>>> for sıra, harf in enumerate("istihza", 1):
... print(sıra, harf)
...
1 i
2 s
3 t
4 i
5 h
6 z
7 a
enumerate()
fonksiyonunu da incelediğimize göre önemli bir başka fonksiyondan daha söz edebiliriz.
help()
Herhangi bir nesne hakkında hızlı bir şekilde ve İngilizce olarak yardım almak isterseniz help()
adlı özel bir fonksiyondan yararlanabilirsiniz.
Bu fonksiyonu iki farklı şekilde kullanıyoruz. Birinci yöntemde, etkileşimli kabuğa help()
yazıp Enter düğmesine basıyoruz:
>>> help()
Welcome to Python 3.3! This is the interactive help utility.
If this is your first time using Python, you should definitely check out
the tutorial on the Internet at http://docs.python.org/3.3/tutorial/.
Enter the name of any module, keyword, or topic to get help on writing
Python programs and using Python modules. To quit this help utility and
return to the interpreter, just type "quit".
To get a list of available modules, keywords, or topics, type "modules",
"keywords", or "topics". Each module also comes with a one-line summary
of what it does; to list the modules whose summaries contain a given word
such as "spam", type "modules spam".
help>
Gördüğünüz gibi, Python bu komutu verdiğimizde özel bir yardım ekranı açıyor bize. Bu ekranda >>> yerine help> ifadesinin olduğuna dikkat edin.
Mesela dir()
fonksiyonu hakkında bilgi almak için help> ifadesinden hemen sonra, hiç boşluk bırakmadan, şu komutu verebiliriz:
help> dir
Bu komut bize şu çıktıyı veriyor:
Help on built-in function dir in module builtins:
dir(...)
dir([object]) -> list of strings
If called without an argument, return the names in the current scope.
Else, return an alphabetized list of names comprising (some of) the attributes
of the given object, and of attributes reachable from it.
If the object supplies a method named __dir__, it will be used; otherwise
the default dir() logic is used and returns:
for a module object: the module's attributes.
for a class object: its attributes, and recursively the attributes of its bases.
for any other object: its attributes, its class's attributes, and
recursively the attributes of its class's base classes.
Gördüğünüz gibi, dir()
fonksiyonunun ne işe yaradığı ve nasıl kullanıldığı konusunda ayrıntılı bir bilgi ediniyoruz. Bu arada, hakkında bilgi almak istediğimiz fonksiyonu parantezsiz yazdığımıza dikkat edin.
‘help’ ekranından çıkmak için Enter düğmesine basabilir veya quit
komutu verebilirsiniz.
İkinci yöntem ise doğrudan etkileşimli kabukta şu komutu kullanmaktır: (Mesela dir()
fonksiyonu hakkında yardım alalım…)
>>> help(dir)
Help on built-in function dir in module builtins:
dir(...)
dir([object]) -> list of strings
If called without an argument, return the names in the current scope.
Else, return an alphabetized list of names comprising (some of) the attributes
of the given object, and of attributes reachable from it.
If the object supplies a method named __dir__, it will be used; otherwise
the default dir() logic is used and returns:
for a module object: the module's attributes.
for a class object: its attributes, and recursively the attributes of its bases.
for any other object: its attributes, its class's attributes, and
recursively the attributes of its class's base classes.
Gördüğünüz gibi, ‘help’ ekranını açmadan, doğrudan etkileşimli kabuk üzerinden de help()
fonksiyonunu herhangi bir fonksiyon gibi kullanıp, hakkında yardım almak istediğimiz nesneyi help()
fonksiyonunun parantezleri içine parametre olarak yazabiliyoruz.
Bu eğitim seti Kaynak tarafından oluşturulmuştur.