Bölüm 1 String String, Türkçe’de metin diye adlandırılan veri tipidir. Bilgisayara giriş ve çıkışlar karekter dizileri biçimindedir; yani girdi ve çıktılar birer stringdir. Dolayısıyla, programlama dillerinde en çok kullanılan veri tipidir. Her dilde string (metin) veri tipi vardır ya da karekter dizileri olarak elde edilebilirler. Nesne tabanlı dillerde bir sınıf olarak vardır. Farklı dillerde string’ler üzerinde yapılan işlemler de birbirlerine benzer. String veri tipi ile yapılan çok iş vardır. Çıktıyı biçemlemek, iki metni birleştirmek, bir metnin bir alt metnini seçmek, metindeki harfleri büyük harfe ya da küçük harfe dönüştürmek, iki metni mukayese etmek, bir metinde bir alt metni ya da bir karekteri aramak gibi işleri yapan metotlar string işlemleri diye adlandırılır. 1.1 Python’da String Python’da string (metin) veri tipi str adlı bir sınıftır. Bu sınıf dile gömülüdür (built-in). Dolayısıyla str öğelerini sınıfı çağırmaya gerek kalmadan kullanabiliriz. Ayrıca string modülü çok sayıda özniteliğe (değişken) ve metoda sahiptir. Onlar, metinlerle yapılabilecek hemen her işlemi yapmaya yeterlidir. Tabii, programcı, istediğinde kendi sınıf, modül ve metotlarını tanımlayabilir. String’ler nesnelerdir. Bir string nesnesi yaratıldığında, onun karekterleri ana bellekte ardışık hücrelere yerleşir. Çünkü string nesnesi bir karekter array’idir. O nedenle, hemen her dilde string nesneleri ana bellekte yerleştikleri yerde uzayıp kısalamazlar. Başka bir deyişle, string nesneleri değiştirilemez (immutable). Değiştirilmeleri için, ana bellekte yeni biçemle- 2 String rine (format) uyan bir yer ayrılır ve oraya yeni biçemleriyle yazılırlar. Python dilinde de böyledir;string nesneleri değişemez (immutable). Prosedural dillerden gelen alışkanlığa uyarak, string’lerle ile yapılan işlemlere string işlemleri diyeceğiz. str çok kullanılan bir veri tipi olduğu için, onunla ilgili işlemler de çoktur. Bu bölümde Python’da string işlemlerinin başlıcalarını; yani string nesnelerine uygulanan başlıca operatörleri ve metotları inceleyeceğiz. Metotların tam listesi için Python web sayfasına bakılabilir [1]. Regüler python stringleri unicode karekterleri ile yazılmaz. UTF-8 dönüşümünü kullanarak her alfabede yazabilir. Ayrıca karekterin ya da stringin önüne u konularak unicode’a dönüştürülebilir. str bir unicode ile yazılmış olsun. str stringini byte karekterlere dönüştürmek için 1 s = str . encode ( ’utf -8 ’) deyimi kullanılır. Tersine olarak byte karekterlerle yazılmış bir stringi unicode karekterlere dönüştürmek için 1 t = unicode (s , ’utf -8 ’) deyimi kullanılır. Bu eylemlerden sonra 1 t == unistring deyimi True değerini verecektir. 1.2 Python’da Karekterler Python’da karekter (char, character) veri tipi yoktur. Uzunluğu 1 olan string bir karekter yerine geçer. Karekterler string’in altstringi olarak elde edilebilir. 1.3 Python’da String Bildirimi Python’da string tipi değişken bildirimi, genel değişken bildirimi kuralına uyar. Bir değişken adına string tipinden bir değer atanınca, bildirim tamamlanmış olur. Gerçekte bu eylem, str sınıfına ait bir nesne yaratır ve söz konusu değişken o nesnenin işaretçisi (pointer) olur. Python’da str nesneleri tek tırnak (’ ’) içinde, iki tırnak (" ") içinde, üç tane tek tırnak (” ’ ” ’) ya 1.3 Python’da String Bildirimi 3 da üç tane çift tırnak (""" """) içinde oluşturulabilir. Aşağıdaki bildirimler geçerlidir; yani her birisi bir str nesnesi yaratır: Betik 1.1. 1 3 str1 str2 str3 str4 = = = = ’ Uzun ince bir yoldayım ’ " Gidiyorum gündüz gece " ’’’ Bilmiyorum ne haldayım ’’’ """ Gidiyorum gündüz gece """ Gerçekten bunların string tipinden olup olmadıklarını denetlemek için, Python’un type() metodunu kullanabiliriz. Betik 1.2. 2 4 >>> type ( str1 ) < class ’ str ’ > >>> type ( str2 ) < class ’ str ’ > 6 8 10 >>> type ( str3 ) < class ’ str ’ > >>> type ( str4 ) < class ’ str ’ > type() metodunun verdiği yanıtlardan çıkan sonuç şudur: yukarıdaki deyimlerle tanımlanan dört değişkenin her birisi str sınıfına ait bir nesnenin referansıdır; yani herbirisi str tipi bir nesne işaret eden pointerdir. Son iki bildirim açıklama (döküman) hazırlamaya da yaradığı için, ilk ikisinden farklıdır. Bu konuyu sonra ele alacağız. Şimdilik, string tipinden değişken tanımlarken, ilk iki yöntemi kullanacağız; yani stringi ya tek tırnak ya da çift tırnak içinde vereceğiz. Python’da string için tek tırnak ile çift tırnak aynı işi görür. Betik 1.3. 1 metin1 = ’ Merhaba Python ! ’ metin2 = " Python nesne tabanlı bir programlama dilidir . " deyimleri metin1 ve metin2 adlı iki string tanımlar. String içinde kesme simgesi kullanılacağı zaman tek ve çift tırnak kullanmak kolaylık getirir. Örneğin, Betik 1.4. 4 String metin3 = " Ankara ’ nın taşına bak ! " metninde (’) kesme simgesi kaçış (escape, \) karekteri kullanmaya gerek bırakmaz. Oysa, bazı dillerde (’) karekterini yazmak için (\’) biçiminde kaçış karekterini kesme simgesinin önüne koymak gerekir. Python’da string için tek ve çift kesme karekterlerinin kullanılabiliyor oluşu, metin yazmayı kolaylaştırır. Unutmayalım ki, Python’da string veri tipi çok kullanılır. Bir alıntı yaparken tek ve çift tırnak karekterleri ayrı işlevler için kullanılabilir. Betik 1.5. 1 >>> ’ Yunus der ki " Beğler azdı yolundan , bilmez yoksul halinden " ’ ’ Yunus der ki " Beğler azdı yolundan , bilmez yoksul halinden " ’ 3 5 1.3.1 >>> " Yunus der ki ’ Beğler azdı yolundan , bilmez yoksul halinden ’ " " Yunus der ki ’ Beğler azdı yolundan , bilmez yoksul halinden ’ " \n operatörü Bir çok dilde olduğu gibi, Pythonda da satırbaşı (newline) eylemi \n operatörü ile yapılır. Betik 1.6. 1 3 5 1.3.2 >>> s = " Ala gözlerini sevdiğim dilber \ nGöster cemalini görmeye geldim \n - Karacaoğlan - " >>> print ( s ) Ala gözlerini sevdiğim dilber Göster cemalini görmeye geldim - Karacaoğlan - Stringleri Birleştirme İki metni (string) birleştirmek için Python’da farklı yöntemler izlenebilir. Bunlardan bazılarını şimdi ele alabiliriz. + operatörü: İki stringi birleştirmek (concatenate) için (+) operatörü kullanılabilir. Birleşen stringlerin arasına boşluk koymak için " " boş string konulabilir. Örneğin, 1.3 Python’da String Bildirimi 5 >>> a = " Bilmek istersen seni " >>> b = ’ Sen seni bil sen seni ’ >>> a + " " + b ’ Bilmek istersen seni Sen seni bil sen seni ’ - Hacı Bayram Veli - 1 3 5 olur. %s operatörü: Betik 1.7. >>> str1 = " Python " >>> str2 = ’ Programlama Dili ’ 1 string değişkenlerinin bildirimi yapılsın. String biçemleme operatörü (%s) ile iki stringi birleştirebiliriz. "%s %s" % (str1, str2) deyiminin çıktısı şudur: /** ’ Python Programlama Dili ’ 2 */ Bir stringe %s operatörü ile başka bir string ekleyebiliriz. "Python %s" % ("nesne tabanlı bir dildir.") deyiminin çıktısı şudur: 1 /** 3 */ ’ Python nesne tabanlı bir dildir . ’ print() metodu: Print() metodu iki stringi birleştirip yazar. 1 /** >>> print ( str1 , str2 ) Python Programlama Dili 3 */ liste yöntemi: stringler bir liste biçimine konulabilir /** >>> m1 = " Aşam dedim , " >>> m2 = " karlı dağlar başından " >>> m3 = " - Karacaoğlan - " >>> listeM = [ m1 , m2 , m3 ] >>> listeM [ ’ Aşam dedim , ’ , ’ karlı dağlar başından ’ , ’ Karacaoğlan - ’] 2 4 6 8 */ 6 1.4 1.4.1 String Altstring Python’da Altstring İşlemleri Python’da str (string) tipi öz olarak bir lst (liste) tipidir. lst veri tipi başka dillerdeki array yapısına benzer işlevlere sahiptir; ama lst, array kavramından daha geneldir. Çünkü, lst’nin öğeleri aynı veri tipinden olmayabilir. Bir string içinde yer alan karekterler bir karekter dizisi oluşturur. Bunu bir lst yapısı olarak görürsek, stringin ilk karekteri 0-ıncı öğe, ikinci karekteri 1-inci öğe, . . . vb. dir. Başka bir deyişle, python lst’in öğelerini saymaya 0’dan başlar. n tane öğesi olan bir lst’in son öğesi (n-1)-inci öğedir. lst’in öğelerinin sıra numarası, array yapısında olduğu gibi ([ ]) köşeli parantez içine yazılır. Örneğin, Betik 1.8. 2 a = " Bilmek istersen seni " b = " Sen seni bil sen seni " stringinleri verilsin. İşlemlerde yazma kolaylığı için stringlere a ve b gibi kısa adlar verdik. Ancak, uzun programlarda böyle kısa adlar yerine, değişken ve metotlara işlevlerini çağrıştıracak uzun adlar verilmelidir. type(), len(), a[0], a[3], a[19] deyimlerine python aşağıdaki yanıtları verecektir. Betik 1.9. 2 4 6 8 10 >>> a = " Bilmek istersen seni " >>> type ( a ) < class ’ str ’ > >>> len ( a ) 20 >>> a [0] ’B ’ >>> a [3] ’m ’ >>> a [19] ’i ’ x bir değişken ise type(x) metodu x’in veri tipini, len(x) metodu x listesinin uzunluğunu verir. a stringinin ilk karekteri a[0]== ’B’, dördüncü karekteri a[3]== ’m’, . . . , son karekteri ise a[19]== ’i’ olur. 7 1.4 Altstring 1.4.2 String İçinden Karekter Seçme Genel olarak, bir met stringinden indisi r olan karekteri seçmek için Betik 1.10. met [ r ] 1 deyimini kullanırız. 1.4.3 Altstring Seçme Dilimleme Bir stringin bir altstringini seçmek için [alt_indis : üst_indis] operatörünü kullanırız. Operatör alt indisi dahil eder, üst ündisi hariç tutar. Bu işlem, stringden bir dilim seçme gibidir. Örneğin, a[7:15] deyimi a stringinin 7 indisli öğesinden başlar 17 indisli öğesine kadar olan altstringi seçer. 7 dahil, 15 hariçtir. 1 >>> a [7:15] ’ istersen ’ Stringin başından başlayarak verilen n indisine kadar olan altstringi seçmek için [ :n] operatörü kullanılır. n indisli karekter seçime dahil olmaz. Örneğin, 2 >>> a [ :6] ’ Bilmek ’ olur. Stringin verilen m indisinden başlayarak stringin sonuna kadar olan altstringi seçmek için [m: ] operatörü kullanılır. m indisli karekter seçime dahil olur. Örneğin, 2 >>> a [7: ] ’ istersen seni ’ olur. Bazen bir stringi bir kaç kez yazmak isteyebiliriz. O zaman (*) operatörünü kullanabiliriz. Örneğin, 2 >>> s = " Python " >>> s * 3 ’ P ythonPythonPython ’ 8 String olur. Bir karekterin bir string içinde olup olmadığını anlamak için (in) operatörünü kullanırız: 1 >>> ’h ’ True in " Python " 3 5 7 ya da >>> s = " Python " >>> ’t ’ in s True olur. Bir karekterin bir string içinde olup olmadığını anlamak için (in) operatörünün olumsuzu olan (not in) operatörünü de kullanabiliriz. Ancak bunu kullandığımızda True değerini alırsak, karekterin string içinde olmadığı anlamını çıkarmalıyız: 1 >>> ’d ’ not in " Python " True 3 5 >>> ’t ’ False not in " Python " olur. Stringi belli bir yerden bölüp, bölünen kısmı yeni satıra yazdırmak için (\n) operatörünü kullanırız. 1 >>> s = " Ankara \ n başkenttir " >>> print ( s ) 3 5 Ankara başkenttir olur. 1.5 Python’da String Operatörleri Buraya kadar incelediğimiz string operatörlerini bir tablo biçiminde görmek, onları anımsamamıza yardım edebilir. Örnekler 1 >>> str1 [:4] ’ Uzun ’ 1.6 Büyük-küçük Harfe Dönüştürme 9 Tablo 1.1: Python’da String Operatörleri Operatör + * [i] [:] in not in \n % Açıklama iki metni birleştirir Solundaki metni tekrarlatır stringden indisi i olan karekteri seçer dilimlenen altstringi seçer) üyelik in operatörünün olumsuzu satırbaşı yap biçemleme (String Biçemleme’ye bkz.) str1[ :4] deyimi str1 stringi’nin başından başlayarak indisi 4 olan öğesine kadar olan altstringini verir. 4 indisli olan beşinci öğe hariçtir. >>> print ( str1 [5: ]) ince bir yoldayım 2 str1[5:] deyimi str1 stringi’nin indisi 5 olan öğesinden başlar sonuna kadar olan altstringini verir. 5 indisli olan dördüncü öğe dahildir. 2 >>> print ( str1 [ :4] + str1 [4: ]) Uzun ince bir yoldayım örneği, str1’den seçilen iki alt stringi (+) operatörü ile birleştiriyor. >>> str1 [ -6] ’d ’ 2 örneği, str1 stringinin sondan 6-ıncı karekterini seçer. >>> print ( str1 [ -13: ]) bir yoldayım 2 örneği, str1 stringinin sondan 13-üncü karekterinden sonrakileri seçer. 1.6 Büyük-küçük Harfe Dönüştürme Python’da büyük-küçük harf dönüşümü yapan üç metot vardır. • lower() metodu string küçük harfe dönüştürür. • upper() metodu stringi büyük harfe dönüştürür. 10 String • title() metodu, string içindeki her kelimenin ilk harfini büyük harfe dönüştürür. >>> strA = " Merhaba Python " >>> strA . lower () ’ merhaba python ’ >>> strA . upper () ’ MERHABA PYTHON ’ >>> strA . title () ’ Merhaba Python ’ 2 4 6 1.6.1 Yerine Koyma (replace) Bir string yerine başkasını koymak için replace() metodu kullanılır. 1 /** >>> s = " kartal kartal havada " >>> s . replace ( " kartal " , " leylek " ) ’ leylek leylek havada ’ 3 5 */ 1.6.2 split() metodu Bir ayraç ile bitişik yazılmış bir stringi ayraçlardan ayrılan altstringlerin bir listesi biçimine koyar. Uygulamada (,), (;) gibi karakterlerle birleştirilmiş metinleri bileşenleine ayırmak için yararlı bir metottur. Örneğin, 1 /** >>> kim = " Yasemin ,23 , Ankara , Üniversite " >>> kim . split ( ’ , ’) [ ’ Yasemin ’ , ’ 23 ’ , ’ Ankara ’ , ’ Üniversite ’] 3 5 */ 1.6.3 join() metodu join() metodu bir string listesini, verilen ayraç ile birleştirilmiş bir string biçimine koyar. Başka bir deyişle split() metodunun tersini yapar. Örneğin, 1 3 5 /** >>> clist = [ " Ece " , " 20 " , " Mersin " , " Dr . " ] >>> ’; ’. join ( clist ) ’ Ece ;20; Mersin ; Dr . ’ */ 1.7 String Biçemleme Operatörleri 1.6.4 11 find() metodu join() metodu bir string içinde aranan bir alt metnin başladığı yerin indisini verir. Örneğin, 1 3 5 /** >>> s = " Senden başka ağaç olsaydı " >>> s . find ( " ağaç " ) 13 */ 1.6.5 isalpha(), isdigit(), isspace() metotları Bir stringin harflerden mi, sayılardan mı yoksa boşluklardan mı oluştuğunu denetleyen metotlardır. Örneğin, 1 /** >>> m = " Ankara " >>> m . isalpha () True 3 5 >>> m . isdigit () False 7 >>> m . isspace () False 9 11 */ 1.7 String Biçemleme Operatörleri Bilgisayara giriş ve çıkışlar, bizim anlayacağımız biçemlerdedir; yani string tipindendir. Aslında bütün karekterler birer resimdir. Bilgisayara veri girerken bu resimleri (karekterleri) kullanırız. Onların bileşimleri birer stringdir. Öyleyse bilgisayara girdiğimiz her şey string tipindendir. Onlar içeride bilgisayarın anladığı makina diline dönüşür. Bilgisayar çıktıları için de aynı şey geçerlidir. İçeride makina dili ile yazılan veriler dışarıya (output) bizim anlayacağımız şekillere dönüşmüş olarak gelir. Başka bir deyişle, içeride makina diliyle yazılan veriler ekran, printer vb. gibi bir çıkış ortamına giderken string tipine dönüşür. Ayrıca, stringleri veri tiplerine ayırmak ve gerekiyorsa her birine özel biçemler vermek mümkündür. Örneğin çıkan veriyi metin olarak yazmak, sayı olarak yazmak, sayıları binliklerine ayırmak, kesir hanelerini azaltıp çoğaltmak, çıktıyı sağa ya da sola yanaşık yazmak 12 String vb. gibi eylemler çıktının biçemlenmesi eylemleridir. Bunları yapmak, çıktının kolay algılanmasını sağlar. Bütün çıktılar string olduğuna göre, string biçemleyen operatörlerin olması gerekir. String biçemleme operatörleri bir çok dilde ortaktır. Python’da kullanılan string biçemleme operatörleri aşağıdaki tabloda listelenmiştir. Tablo 1.2: Python String Biçemleme Operatörleri Operatör %c %s %i %d %u %o %x %X %e %E %f %g %G 1.7.1 Açıklama Çıktıyı karekter olarak verir Çıktıyı string olarak verir Çıktıyı onlu sistemde işaretli tamsayı (decimal) olarak verir Çıktıyı onlu sistemde işaretli tamsayı (decimal) olarak verir Çıktıyı onlu sistemde işaretsiz tamsayı (decimal) olarak verir Çıktıyı oktal (8 tabanlı) sistemde verir Çıktıyı hexadecimal (16 tabanlı) sistemde verir Çıktıyı hexadecimal (16 tabanlı) sistemde büyük harfle verir Çıktıyı üstel biçemde verir (e üstü) Çıktıyı üstel biçemde verir (E üstü) Çıktıyı float sayı olarak verir Çıktıyı %f ya da %e biçiminde verir (kısa olan seçilir) Çıktıyı %f ya da %E biçiminde verir (kısa olan seçilir) Program İçinde Açıklamalar Program yazılırken değişkenlerin ve metotların ne iş yaptıklarını açıklamak yararlıdır. İlerdeki zamanlarda programda güncelleme ya da değişiklik yapılacağı zaman bu açıklama satırları çok işe yarar. O nedenle, yazılım şirketleri büyük programlar için geniş açıklamalar isterler. Böylece, programın ilerideki zamanlarda kolayca güncellenebilmesini güvenceye almış olurlar. Açıklamalar tek satır ya da çok satırlı olabilir. Bazı dillerde tek satırlı açıklamalar (//) simgeleri ile yapılır. (//) simgelerinden sonra satır sonuna kadar yazılanları derleyiciler görmez. Python’da tek satırlık açıklamalar için (#) simgesi kullanılır. Örneğin, 1 # s değişkeni personelin sicil numarasını tutacaktır s = 123 1.7 String Biçemleme Operatörleri 13 ya da aynı işi yapmak üzere s = 123 # s değişkeni personelin sicil numarasıdır yazabiliriz. Bu durumda, s = 123 yorumlanacak, ama (#) simgesinden başlayarak satır sonuna kadar yazılanlar yorumlanmayacaktır. Bazen program içinde yapılan açıklamalar bir satıra sığmayabilir. O zaman çok satırlı açıklama yapılabilir. C, java ve başka bazı dillerde çok satırlı açıklamalar * . . . * içine yazılır. java’da dökümana girmesi istenen açıklamalar /** . . . */ içine yazılır. Python’da çok satırlı açıklama öz olarak yoktur. Açıklama satırlarının hepsinin önüne (#) simgesi konulur. Böyle olması belki programdaki açıklamaların kolay algılanmasını sağlıyor. Ancak ardışık üç tane tek ya da ardışık üç tane çift kesme simgeleri arasında yer alan satırları Python derleyicisi yorumlamaz. Dolayısıyla onlar çok satırlı açıklama olarak kullanılabilirler. Örneğin, 1 ’’’ Bu pythonda üç satırlı bir açıklamadır ’’’ ya da 2 """ Bu metin python ’ da iki satırlı bir açıklamadır """ Ayrıca bu biçimde yazılan açıklamalar döküman olarak da yazdırılabilir. Bu durumuyla python’daki üç tırnak, java’daki ** . . . * açıklamasına benzer. Strinleri birleştirmek için kullandığımız + operatörü sayılarda kullandığımız + operatöründen farklıdır. Onun adaşlanmışıdır (overloaded). (Bu konuyu Metotları incelerken ele alacağız.) Aşağıdaki betik, stringleri (+) operatörü ile birleştiriyor. Betik 1.11. 1 3 5 7 9 >>> str1 = " Neler yapmadık şu vatan için ! " >>> str2 = " Kimimiz öldük , " >>> str3 = " Kimimiz nutuk söyledik . " >>> >>> str4 = str1 + ’\ n ’ + str2 + ’\ n ’ + str3 >>> print ( str4 ) Neler yapmadık şu vatan için ! Kimimiz öldük , Kimimiz nutuk söyledik . 14 String Kural 1.1. Stringlere sayısal işlemlerde kullanılan çıkarma, çarpma ve bölme işlemleri uygulanamaz. Sözkonusu işlemlerin uygulanamayacağını aşağıdaki örneklerden görebiliriz. Her işlem için python yorumlayıcısının verdiği hata uyarısına dikkat ediniz. Betik 1.12. 1 >>> str1 - str2 TypeError : unsupported operand type ( s ) for -: ’ str ’ and ’ str ’ 3 5 7 >>> str1 * str2 TypeError : can ’t multiply sequence by non - int of type ’ str ’ >>> str1 / str2 TypeError : unsupported operand type ( s ) for /: ’ str ’ and ’ str ’ Kural 1.2. Stringlere sayı eklenemez, çıkarılamaz. Stringler sayılara bölünemez. Sözkonusu işlemlerin uygulanamayacağını aşağıdaki örneklerden görebiliriz. Her işlem için python yorumlayıcısının verdiği hata uyarısına dikkat ediniz. Betik 1.13. 2 4 >>> str1 + 123 TypeError : Can ’t convert ’ int ’ object to str implicitly >>> str1 - 123 TypeError : unsupported operand type ( s ) for -: ’ str ’ and ’ int ’ 6 8 >>> str1 / 2 TypeError : unsupported operand type ( s ) for /: ’ str ’ and ’ int ’ Kural 1.3. Stringlerle sayılar çarpılabilir, ama bu işlem sayılardaki çarpma işlemi değildir; onun adaşlanmışıdır. Sözkonusu işlemleri örneklerden görebiliriz. Betik 1.14. 1.7 String Biçemleme Operatörleri 2 4 >>> 2 * str2 ’ Kimimiz öldük , Kimimiz öldük , ’ >>> str2 * 2 ’ Kimimiz öldük , Kimimiz öldük , ’ 15 16 String Kaynakça [1] python.org. docs.python.org/3/, 2013. Dizin \n, 4 altstring, 6 altstring seçme, 7 biçemleme, 11 dönüştürme, 9 dilimleme, 7 dizim, 1 find(), 11 formatting, 11 join(), 10 karekter, 2 karekter seçme, 7 metin, 1 split(), 10 string, 1 string biçemleme, 11 string formatting, 11 string operatörleri, 8 strinkleri birleştirme, 4