You are on page 1of 481

Python Klavuzu

Srm 2.x

Frat zgl

17/04/2012

NDEKLER I I I

Temel Bilgiler 1.1 Python Hakknda . . . . . 1.2 Python Nasl Okunur? . . 1.3 Python Nereden ndirilir? 1.4 Python Nasl altrlr? . 1.5 Python'dan Nasl klr? 1.6 Blm Sorular . . . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . .

2 2 3 3 5 7 8 9 9 11 16 19 20 25 27 27 31 38 41 42 43 44 46 49 50

Python'a Giri 2.1 print Komutu . . . . . . . . . . . . . . . . . 2.2 Karakter Dizileri . . . . . . . . . . . . . . . 2.3 Python'da Saylar ve Matematik lemleri 2.4 Deikenler . . . . . . . . . . . . . . . . . . 2.5 Ka Dizileri . . . . . . . . . . . . . . . . . 2.6 Blm Sorular . . . . . . . . . . . . . . . . Python Programlarn Kaydetmek 3.1 GNU/Linux Sistemi . . . . . . . . . . . . 3.2 Windows Sistemi . . . . . . . . . . . . . 3.3 Trke Karakter Kullanm . . . . . . . 3.4 MS-DOS'ta Trke Karakter Problemi 3.5 Blm Sorular . . . . . . . . . . . . . . . . . . . .

Kullancyla letiim: Veri Al-Verii 4.1 raw_input() fonksiyonu . . . . . . . . . . . . 4.2 input() fonksiyonu . . . . . . . . . . . . . . . . 4.3 Gvenlik Asndan input() ve raw_input() . 4.4 Blm Sorular . . . . . . . . . . . . . . . . . .

Python'da Koula Bal Durumlar 5.1 if Deyimi . . . . . . . . . . . . . . . 5.2 elif Deyimi . . . . . . . . . . . . . . 5.3 else Deyimi . . . . . . . . . . . . . . 5.4 Python'da Girintileme Sistemi . . . 5.5 Python Kodlarna Yorum Eklemek 5.6 Blm Sorular . . . . . . . . . . . . Baz 6.1 6.2 6.3 6.4 nemli Ayrntlar leler (Operators) . Bool Deerler . . . . . Dntrme lemleri Blm Sorular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

51 51 53 56 57 59 61 62 62 66 71 74 76 76 80 82 82 83 84 85

Python'da Dngler 7.1 while Dngs . . 7.2 for Dngs . . . 7.3 range() fonksiyonu 7.4 len() fonksiyonu . 7.5 break deyimi . . . 7.6 continue deyimi . 7.7 Blm Sorular . . Hata 8.1 8.2 8.3

Yakalama 86 try... except... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 pass Deyimi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 Blm Sorular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 . 92 . 93 . 96 . 104 . 105 . 107 . 108 . 108

Listeler 9.1 Liste Oluturmak . . . . . . . 9.2 Liste elerine Erimek . . . 9.3 Liste Metotlar . . . . . . . . . 9.4 sum() Fonksiyonu . . . . . . . 9.5 enumerate() Fonksiyonu . . . 9.6 in Deyimi . . . . . . . . . . . . 9.7 min() ve max() Fonksiyonlar 9.8 Blm Sorular . . . . . . . . .

10 Demetler 110 10.1 Demetlerin Metotlar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 10.2 Blm Sorular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 11 Szlkler 11.1 Szlk 11.2 Szlk 11.3 Szlk 11.4 Szlk
ii

Oluturmak . . . . . . elerine Erimek . . elerini Deitirmek elerini Silmek . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

114 . 114 . 115 . 119 . 119

11.5 Szlklerin Metotlar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 11.6 Blm Sorular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 12 Kmeler 12.1 Kme Oluturmak . . . . . . . . . . 12.2 Kmelerin Metotlar . . . . . . . . 12.3 Dondurulmu Kmeler (Frozenset) 12.4 Blm Sorular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 . 126 . 128 . 138 . 139 140 . 141 . 144 . 148 . 152 . 155 . 159 . 162 . 163 . 166 . 168 . 169 . 171 173 . 173 . 174 . 175 . 178 . 180 . 192 . 199 . 200 201 . 201 . 205 . 207 . 209 . 210 . 212 . 213 . 215 . 217 . 218

13 Fonksiyonlar 13.1 Fonksiyonlar Tanmlamak . . . . . . . . . . 13.2 Fonksiyonlarda Parametre Kullanm . . . . 13.3 simli ve Sral Argmanlar . . . . . . . . . 13.4 Varsaylan Deerli Argmanlar . . . . . . . 13.5 stenen Sayda Sral Argman Kullanm . 13.6 stenen Sayda simli Argman Kullanm . 13.7 Gml Fonksiyonlar (Built-in Functions) 13.8 global Deyimi . . . . . . . . . . . . . . . . . 13.9 return Deyimi . . . . . . . . . . . . . . . . . 13.10 Fonksiyonlarda pass Deyimi . . . . . . . . . 13.11 Fonksiyonlarn Belgelendirilmesi . . . . . . 13.12 Blm Sorular . . . . . . . . . . . . . . . . . 14 Modller 14.1 Modllerin eitleri . . . . . . . . . . 14.2 Kendi Yazdnz Modller . . . . . . 14.3 Modlleri e Aktarmak . . . . . . . 14.4 Modlleri e Aktarma Yntemleri . 14.5 Gelitiricilerin Yazd Modller . . . 14.6 nc ahslarn Yazd Modller 14.7 Modllerin Yolu . . . . . . . . . . . . 14.8 Blm Sorular . . . . . . . . . . . . . 15 Dosya lemleri 15.1 Dosya Oluturmak . . . . . . . . . . . 15.2 Dosyaya Yazmak . . . . . . . . . . . . 15.3 Dosyay Okumak . . . . . . . . . . . . 15.4 Dosya Silmek . . . . . . . . . . . . . . 15.5 Dosyaya Rastgele Satr Eklemek . . 15.6 Dosyadan Rastgele Satr Silmek . . . 15.7 os Modlnde Dosya-Dizin lemleri 15.8 Kmeler ve Dosyalar . . . . . . . . . 15.9 with Deyimi . . . . . . . . . . . . . . 15.10 Blm Sorular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

16 Karakter Dizileri 219 16.1 Karakter Dizisi Nedir? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219


iii

16.2 16.3 16.4 16.5 16.6

Trnak Tipleri . . . . . . . . . . Karakter Dizilerini Birletirmek Karakter Dizilerini Dilimlemek Karakter Dizilerinin Metotlar . Blm Sorular . . . . . . . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. 221 . 223 . 226 . 229 . 256

17 Biim Dzenleyiciler 259 17.1 Biim Dzenlemede Kullanlan Karakterler . . . . . . . . . . . . . . . . . . . . . 260 17.2 leri Dzeyde Karakter Dizisi Biimlendirme . . . . . . . . . . . . . . . . . . . . 264 17.3 Blm Sorular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269 18 ascii, 18.1 18.2 18.3 18.4 unicode ve Python Giri . . . . . . . . . . . . . . ascii . . . . . . . . . . . . . . unicode . . . . . . . . . . . . Python'da unicode Destei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 . 270 . 271 . 275 . 279 289 . 290 . 296 . 312 . 316 . 317 . 319 . 323 325 . 325 . 326 . 328 . 329 . 330 . 332 . 334 . 340 . 346 . 348 349 . 349 . 350 . 350 . 351 . 352 . 354 . 355 . 357

19 Dzenli fadeler (Regular Expressions) 19.1 Dzenli fadelerin Metotlar . . . . . . . . . . . . . . . . . . . . 19.2 Metakarakterler . . . . . . . . . . . . . . . . . . . . . . . . . . . 19.3 Eleme Nesnelerinin Metotlar . . . . . . . . . . . . . . . . . . 19.4 Dzenli fadelerin Derlenmesi . . . . . . . . . . . . . . . . . . . 19.5 compile() ile Derleme Seenekleri . . . . . . . . . . . . . . . . . 19.6 Dzenli fadelerle Metin/Karakter Dizisi Deitirme lemleri 19.7 Sonu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 Nesne Tabanl Programlama  OOP (NTP) 20.1 Neden Nesne Tabanl Programlama? . . . . 20.2 Snar . . . . . . . . . . . . . . . . . . . . . . 20.3 rnekleme (Instantiation) . . . . . . . . . . 20.4 p Toplama (Garbage Collection) . . . . . 20.5 Niteliklere Deinme (Attribute References) 20.6 __init__ Nedir? . . . . . . . . . . . . . . . 20.7 self Nedir? . . . . . . . . . . . . . . . . . . . 20.8 Miras Alma (Inheritance) . . . . . . . . . . 20.9 Eski ve Yeni Snar . . . . . . . . . . . . . . 20.10 Sonu . . . . . . . . . . . . . . . . . . . . . . 21 Sqlite ile Veritaban Programlama 21.1 Giri . . . . . . . . . . . . . . . . . . . . 21.2 Neden Sqlite? . . . . . . . . . . . . . . . 21.3 Sqlite'n Yaps . . . . . . . . . . . . . . 21.4 Veritabanyla Balant Kurmak . . . . 21.5 Veri Girii . . . . . . . . . . . . . . . . . 21.6 Veri leme - commit() Metodu . . . . 21.7 Veritabanndan Veri Almak . . . . . . 21.8 Veritaban Gvenlii - SQL Injection .
iv

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

22 sys Modl 22.1 sys Modlnn erii . . . . . . 22.2 argv Nitelii . . . . . . . . . . . . 22.3 exit() Fonksiyonu . . . . . . . . . 22.4 getdefaultencoding() Fonksiyonu 22.5 path Nitelii . . . . . . . . . . . . 22.6 platform Nitelii . . . . . . . . . . 22.7 stdout Nitelii . . . . . . . . . . . 22.8 version_info Nitelii . . . . . . . 23 math 23.1 23.2 23.3 23.4 23.5 23.6 23.7 23.8 23.9 23.10 23.11 23.12 23.13 23.14 23.15 23.16 23.17 23.18 23.19 23.20 23.21 23.22 23.23 Modl sl fadeler Fonksiyonu (pow) Pi Nitelii (pi) . . . . . . . . . . Karekk Fonksiyonu (sqrt) . . . Euler Sabiti (e) . . . . . . . . . exp Fonksiyonu . . . . . . . . . . Logaritma (log) Fonksiyonu . . Logaritma (log10) Fonksiyonu . Degrees Fonksiyonu . . . . . . . Radians Fonksiyonu . . . . . . . Kosins Fonksiyonu (cos) . . . . Sins Fonksiyonu (sin) . . . . . Tanjant (tan) Fonksiyonu . . . Faktoriyel (factorial) . . . . . . fmod Fonksiyonu . . . . . . . . . ceil Fonksiyonu . . . . . . . . . . oor Fonksiyonu . . . . . . . . . fabs Fonksiyonu . . . . . . . . . frexp Fonksiyonu . . . . . . . . . ldexp Fonksiyonu . . . . . . . . modf Fonksiyonu . . . . . . . . . trunc Fonksiyonu . . . . . . . . hypot Fonksiyonu . . . . . . . . Hiperbolik Fonksiyonlar . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

362 . 362 . 363 . 366 . 367 . 367 . 368 . 369 . 373 374 . 374 . 375 . 375 . 375 . 376 . 376 . 376 . 376 . 377 . 377 . 378 . 378 . 379 . 380 . 380 . 381 . 381 . 381 . 381 . 382 . 382 . 382 . 383 385 . 385 . 386 . 388 . 390 391 . 391 . 393 . 395 . 396

24 datetime Modl 24.1 Bugnn Tarihini Bulmak . . . . . . . . . . 24.2 Bir Tarihin Hangi Gne Geldiini Bulmak 24.3 Tarihleri Biimlendirmek . . . . . . . . . . . 24.4 Tarihlerle Aritmetik lem Yapmak . . . . . 25 time 25.1 25.2 25.3 25.4 Modl sleep() Fonksiyonu . . . . . . . . . . . . . . strftime() Fonksiyonu . . . . . . . . . . . . localtime() Fonksiyonu . . . . . . . . . . . gmtime(), time() ve ctime() Fonksiyonlar . . . .

26 len() Fonksiyonu ve ascii'nin Laneti 27 Python'da id() Fonksiyonu, is leci ve nbellekleme Mekanizmas 28 Windows'ta Python' YOL'a (PATH) Eklemek 29 PEP 29.1 29.2 29.3 29.4 29.5 29.6 29.7 29.8 29.9 3000 zet . . . . . . . . . . . . . . . . . . Adlandrma . . . . . . . . . . . . . . PEP'lerin Numaralandrlmas . . . Takvim . . . . . . . . . . . . . . . . Uyumluluk ve Gei . . . . . . . . . Gerekleme Dili (Implementation) st-Katklar . . . . . . . . . . . . . Kaynaklar . . . . . . . . . . . . . . . Telif Hakk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

398 404 409 416 . 416 . 416 . 417 . 417 . 417 . 418 . 418 . 418 . 419 420 . 421 . 422 . 424 . 427 . 430 . 432 433 . . . . Betii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436 . 436 . 438 . 439 . 441 . 444 . 445 . 446 . 447 . 447 . 448 . 448 . 448 450 . 450 . 451 . 453 . 456 . 458

30 Python ve OpenOce 30.1 PyUno'nun Kurulumu . . . . . . . . . . . . . . . . . . . . . . . . . 30.2 OpenOce'yi Dinleme Kipinde Amak (listening mode) . . . . . 30.3 OpenOce'ye Balanmak . . . . . . . . . . . . . . . . . . . . . . . 30.4 Karakter Biimlendirme . . . . . . . . . . . . . . . . . . . . . . . . 30.5 Karakterleri Renklendirme . . . . . . . . . . . . . . . . . . . . . . . 30.6 PyUno, Python ve OpenOce Hakknda Bilgi Veren Kaynaklar 31 Python'da Paket Kurulumu - Kullanm 32 reStructuredText 32.1 Giri . . . . . . . . . . . . . . . . . . . . . 32.2 RestructuredText Dosyalar ve rst2html 32.3 Paragraf Stilleri . . . . . . . . . . . . . . 32.4 Listeler . . . . . . . . . . . . . . . . . . . 32.5 Kprler/Balantlar . . . . . . . . . . . 32.6 Deikenler . . . . . . . . . . . . . . . . . 32.7 Kod Alanlar . . . . . . . . . . . . . . . . 32.8 Dipnotlar . . . . . . . . . . . . . . . . . . 32.9 Resimler . . . . . . . . . . . . . . . . . . . 32.10 Yorumlar . . . . . . . . . . . . . . . . . . 32.11 Alntlar . . . . . . . . . . . . . . . . . . . 32.12 Tablolar . . . . . . . . . . . . . . . . . . . 33 Sphinx 33.1 Sphinx Hakknda . . . . 33.2 Sphinx Nasl Kurulur? . 33.3 Sphinx Nasl Kullanlr? 33.4 conf.py Dosyas . . . . . 33.5 index Dosyas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

vi

33.6 zel Ynergeler (Directives) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460 Dizin 465

vii

viii

Uyar: Aa daki bilgiler Pythonun 2.x srmleri iindir. E er kulland nz srm s g g g Pythonun 3.x srmlerinden biriyse suradaki belgeleri inceleyebilirsiniz. TEMEL KONULAR

BLM

Temel Bilgiler

Python 1990 ylndan bu yana byk bir topluluk tarafndan gelitirilen kvrak ve dinamik bir s dildir. Sz diziminin sade olmas, kolay renilmesi ve program gelitirme srecini hzlandrg s mas ile tannan bu dil Windows, GNU/Linux ve MacOs X gibi pek ok farkl iletim sistemi zs erinde alabilmektedir. Dolaysyla tek bir platformda gelitirdi iniz bir Python uygulamas, s s g zerinde hi bir de iiklik yapmaya gerek olmadan veya kk de iikliklerle baka platformgs gs s larda da alabilecektir. s Son yllarda Trkiyede de ilgi uyandrmaya balayan bu dil yava yava niversite mfredatns s s daki yerini alyor. Her ne kadar lkemizde henz yeterli ilgiyi grmese de, bugn Googledan NASAya, YouTubedan Hewlett Packarda kadar pek ok kurum ve sirkette Python program lama dilinden yararlanld n gryoruz. g Burada, Python programlama diline merak duyan okurlara bu dilin temellerini sa lam ve hzl g bir sekilde retmeyi amalyoruz. Bu belgelerden yararlanabilmek iin nceden bir program g lama dili biliyor olmanz gerekmez. Buradaki bilgiler, okurun programlama konusunda hi bir bilgisi olmad varsaylarak ve herkesin anlayabilece i bir slupla hazrlanmtr. g g s

1.1 Python Hakknda


Pythonn ba gelitiricisi Guido Van Rossum adl Hollandal bir programcdr. E er Guido Van s s g Rossumun neye benzedi ini merak ediyorsanz, onun http://www.python.org/~guido/pics.html g adresindeki foto raarn inceleyebilirsiniz. g Her ne kadar Python programlama dili ile ilgili o u grsel malzemenin zerinde bir piton g resmi grsek de, Python kelimesi aslnda o u kiinin zannetti inin aksine piton ylan ang s g lamna gelmiyor. Python programlama dili, Guido Van Rossumun ok sevdi i, Monty Python g adl alt kiilik bir s Ingiliz komedi grubunun Monty Pythons Flying Circus adl gsterisinden alyor ismini. Python programlama dili, C ve C++ gibi daha yerleik ve kkl dillere kyasla ok uzun bir s gemie sahip de ildir, ama bu programlama dillerine gre hem daha kolaydr hem de program s g gelitirme srecini bir hayli ksaltr. stelik bu dil ayr bir derleyiciye de ihtiya duymaz. Ayrca s bu dilde yazlan kodlar baka dillere gre hem daha okunakl hem de daha temizdir... s ste Python, bu ve buna benzer stnlkleri sayesinde pek ok kimsenin gzdesi haline I gelmitir. Googlen da Pythona zel bir nem ve de er verdi ini, ok iyi derecede Python s g g bilenlere i olana sundu unu hemen syleyelim. s g g Mesela Pythonn gelitiricisi Guido s

Van Rossum 2005 ylnn Aralk ayndan beri Googleda alyor. (Guido Van Rossumun s zgemiine http://www.python.org/~guido/Resume.html adresinden eriebilirsiniz.) s s

1.2 Python Nasl Okunur?


Gelitiricisi Hollandal olsa da Python s Ingilizce bir kelimedir. Dolaysyla bu kelimenin telaffuzunda Ingilizcenin kurallar geerli. Ancak bu kelimeyi hakkyla telaffuz etmek, ana dili Trke olanlar iin pek kolay de il. nk bu kelime iinde, Trkede yer almayan ve okunuu g s peltek syi andran th sesi var. Ingilizce bilenler bu sesi think [dnmek] kelimesinden hatrs layacaklardr. Ana dili Trke olanlar think kelimesini genellikle tink seklinde telaffuz eder. Dolaysyla Python kelimesini de paytn seklinde telaffuz edebilirsiniz... Asl syleniinin dnda bu kelimeyi tamamen Trkeletirerek piton seklinde telaffuz edenler s s s de var. Elbette siz de dilinizin dnd bir telaffuzu tercih etmekte zgrsnz. g E er python kelimesinin g Ingilizce telaffuzunu dinlemek istiyorsanz http://www.howjsay.com/ adresini ziyaret edebilir, Guido Van Rossumun bu kelimeyi nasl telaffuz etti ini merak ediyg orsanz da http://video.google.com/videoplay?docid=-6459339159268485356# adresindeki tantm videosunu izleyebilirsiniz.

1.3 Python Nereden ndirilir? I


Python kullanabilmek iin, bu programlama dilinin sistemimizde kurulu olmas gerekiyor. ste I biz de bu blmde Python nereden indirip sistemimize nasl kuraca mz renece iz. g g g Python Windows ve GNU/Linux iletim sistemlerine kurulma asndan farkllklar gsterir. Biz s burada Pythonn hem GNU/Linuxa hem de Windowsa nasl kurulaca n ayr ayr inceleyeg ce iz. Ancak her ne kadar GNU/Linux ve Windows blmlerini ayrm da olsak, hangi ileg s s tim sistemini kullanyor olursanz olun, ben size her iki blm de okumanz tavsiye ederim. nk GNU/Linux blmnde Windows kullanclarnn, Windows blmnde ise GNU/Linux kullanclarnn ilgisini ekebilecek ksmlar olabilir. Ayrca yazd nz bir programn sadece tek bir g iletim sistemine ba ml olmamas nemli bir zelliktir. O yzden hem Windows hem de s g GNU/Linux hakknda bilgi sahibi olmann zararn de il, faydasn greceksiniz. g ncelikle GNU/Linuxtan balayalm: s

1.3.1 GNU/Linuxta Python Kurmak


Python hemen hemen btn GNU/Linux da tmlarnda kurulu geliyor. Mesela Pardus ve g Ubuntuda Pythonn kurulu oldu unu biliyoruz, o yzden Pardus veya Ubuntu kullanyorsanz g Python kurmanza gerek yok. E er Python kurmanz gerekirse http://www.python.org/download adresinden Pythonn kayg nak dosyalarn indirebilirsiniz. Ancak Python GNU/Linux da tmlarnda ok nemli baz g paralarla etkileim halinde oldu u iin kaynaktan derleme pek tavsiye edilmez. Hele ki Pardus s g gibi, sistemin belkemi ini Pythonn oluturdu u bir da tmda Python kaynaktan derlemeye g s g g almak, e er dikkatsiz davranrsanz epeyce banz a rtabilir. Szn z, GNU/Linux siss g s g temlerinde en kestirme yol da tmn kendi Python paketlerini kullanmaktr. g Ancak GNU/Linux sistemlerinde kurulu olarak gelen Python o unlukla en yeni srm de ildir. g g E er mutlaka ama mutlaka Pythonn daha yeni bir srmne ihtiyacnz yoksa eski de olsa g da tmnzla birlikte gelen Python srmn kullanmanz neririm. Ama e er, Ben illa ki en g g

yeni srm kullanaca m! derseniz, kulland nz GNU/Linux da tmna, sisteminizdekinden g g g daha yeni (veya daha eski) bir Python srm kurmanz da elbette mmkndr. Bunun iin;
ncelikle su adresi ziyaret ediyoruz: http://www.python.org/download Bu adreste, zerinde Python 2.x.x compressed source tarball (for Linux, Unix or OS X) yazan ba lantya tklayarak ilgili .tgz dosyasn bilgisayarmza indiriyoruz. g Daha sonra bu sktrlm dosyay ayoruz ve alan dosyann iine girip, orada srasyla s s aa daki komutlar veriyoruz: s g
./configure make make altinstall

Ancak bir noktaya dikkatinizi ekmek isterim: Pythonn dzgn kurulabilmesi iin make altinstall komutunu yetkili kullanc veya root olarak altrmalsnz. s E er her sey yolunda gittiyse Pythonn farkl bir srm sistemimize kurulmu oldu. Yalnz g s burada make install yerine make altinstall komutunu kulland mza dikkat edin. make g altinstall komutu, Python kurulurken klasr ve dosyalara srm numarasnn da eklenmesini sa lar. Bylece yeni kurdu unuz Python, sistemdeki eski Python srmn silip zerine g g yazmam olur ve iki farkl srm yan yana varolabilir. Bu nemli ayrnty kesinlikle gzden s karmamalsnz. Bu noktada bir uyar yapmadan gemeyelim: Daha nce de dedi imiz gibi, Python zellikle g baz GNU/Linux da tmlarnda pek ok sistem aracyla sk skya ba lantldr. Yani Python, g g kulland nz da tmn belkemi i durumunda olabilir. Bu yzden Python kaynaktan derg g g lemek baz riskler tayabilir. E er yukarda anlatld sekilde, kaynaktan Python derleyes g g cekseniz, kar karya oldu unuz risklerin farknda olmalsnz. Ayrca GNU/Linux zerinde s s g kaynaktan program derlemek konusunda tecrbeli de ilseniz ve e er yukardaki aklamalar g g size kafa kartrc geliyorsa, kesinlikle da tmnzla birlikte gelen Python srmn kullans g malsnz. Python srmlerini baa ba takip etti i iin, ben size Ubuntu GNU/Linuxu dens s g emenizi nerebilirim. Ubuntunun depolarnda Pythonn en yeni srmlerini rahatlkla bulabilirsiniz. Ubuntunun resmi sitesine http://www.ubuntu.com adresinden, yerel Trkiye sitesine ise http://www.ubuntu.org.tr adresinden ulaabilirsiniz. s

1.3.2 Windowsta Python Kurmak


GNU/Linux da tmlarnn aksine, Windows iletim sisteminde Python programlama dili g s kurulu olarak gelmez. Dolaysyla Python Windowsta kullanabilmek iin bu program sitesinden [http://www.python.org] indirmemiz gerekiyor. Resmi sitedeki indirme adresinde [http://www.python.org/download] programn Microsoft Windows iletim sistemiyle uyumlu s srmlerini bulabilirsiniz. Bu adresten Python indirmek isteyen o u Windows kullancs g iin en uygunu, zerinde Python 2.x.x Windows installer (Windows binary does not include source) yazan ba lantya tklamak olacaktr. g Windows kullanclar resmi sitedeki indirme adresinde yer alan Python kurulum beti ini bilg gisayarlarna indirdikten sonra kurulum dosyasna ift tklayarak ve ekrandaki ynergeleri takip ederek Python kurabilirler. Python kurmak ok kolaydr. Python kurarken, ntanml ayarlarda herhangi bir de iiklik yapmadan, sadece Next tularna basarak kurulumu gerekgs s letirebilirsiniz. Python otomatik olarak C:\Python2x dizini iine kurulacaktr. s E er Python programlama dilinin hangi srmn kullanmanz gerekti i konusunda kararsg g zlk yayorsanz, ben size 2.6 srmn tavsiye ederim. Aslnda 2.5 ve st btn srms

ler kullanma uygundur. Ancak Pythonn 2.6 srm su anda mevcut srmler arasnda en olgunudur. Biz burada konular anlatrken Pythonn 2.6 srmn temel alacak olsak da Pythonn baka srmlerini kullananlar da buradaki belgelerden faydalanabilir. s Yeri gelmiken nemli bir uyarda bulunalm: Pythonn 2.x numaral srmleri ile 3.x numaral s srmleri birbirinden farkldr. E er Pythonn 3.x srmlerinden birini kullanmak istiyorsanz g http://www.istihza.com/py3/icindekiler_python.html adresindeki belgelerle alabilirsiniz. s

1.4 Python Nasl al trlr? s


Bu blmde hem GNU/Linux, hem de Windows kullanclarnn Python nasl altrmas gereks ti ini tartaca z. ncelikle GNU/Linux kullanclarndan balayalm. g s g s

1.4.1 GNU/Linuxta Python al trmak s


E er GNU/Linux iletim sistemi zerinde KDE kullanyorsak Python programn altrmak iin g s s nce ALT+F2 tularna basp, kan ekranda su komutu vererek bir konsol ekran ayoruz: s
konsole

E er kulland mz masast GNOME ise ALT+F2 tularna bastktan sonra vermemiz gereken g g s komut sudur:
gnome-terminal

Bu sekilde komut satrna ulat mzda; s g


python

yazp ENTER tuuna basarak Python programlama dilini balatyoruz. Karmza suna benzer s s s bir ekran gelmeli:
Python 2.6.5 (r265:79063, Apr 3 2010, 01:57:29) [GCC 4.4.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>>

Bu ekranda kulland mz Python srmnn 2.6.5 oldu unu gryoruz. Buradaki >>> iareti g g s Pythonn bizden komut almaya hazr oldu unu gsteriyor. Komutlarmz bu iaretten hemen g s sonra, bo luk brakmadan yazaca z. Bunun dnda, istersek Python kodlarn bir metin s g s dosyasna da kaydedebilir, bu kaydetti imiz metin dosyasn konsoldan altrabiliriz. Bu g s ilemin nasl yaplaca n daha sonra konuaca z. s g s g E er python komutunu verdi inizde yukardaki ekran yerine bir hata mesajyla karlayorg g s s sanz iki ihtimal var: Birincisi, python kelimesini yanl yazm olabilirsiniz. Mesela yanllkla pyhton, pyton, s s s phyton veya Python yazm olabilirsiniz. Do ru kelimenin tamamen kk harerden olus g s tu una zellikle dikkat etmemiz gerekiyor. Windows asndan python kelimesini byk veya g kk harerle yazmanzn bir nemi olmayabilir, ama GNU/Linux asndan byk-kk harf ayrm son derece nemlidir. Ikincisi, e er ilk maddede sylenenlerin geerli olmad ndan eminseniz, ok dk bir ihtimal g g s olmakla birlikte, Python sisteminizde kurulu de il demektir. Yalnz GNU/Linux sistemlerinde g Pythonn kurulu olmama ihtimalinin sfra yakn oldu unu syleyeyim. O yzden sisteminizde g

Pythonn kurulu olmad na kesinkes karar vermeden nce, durumunuzun birinci madde kapg samna girmedi inden emin olmalsnz. g E er kulland nz GNU/Linux da tmnda Pythonn kurulu olmad na eminseniz, nnzde g g g g iki seenek var: Birincisi, Python o anda sisteminizde kurulu olmasa bile, kulland nz da tmn paket depog g larnda olabilir. O yzden ncelikle da tmnzn paket depolarnda python kelimesini kullag narak bir arama yapn ve kulland nz da tma uygun bir sekilde Python paketini kurun. g g Ikincisi, Python kulland nz da tmn paket depolarnda bulunsa bile, siz Python kaynakg g tan derlemek istiyor olabilirsiniz. E er yleyse http://www.python.org/download adresinden g Python 2.x.x compressed source tarball (for Linux, Unix or OS X) ba lantsna tklayarak, g .tgz dosyasn bilgisayarnza indirin ve klasr ap orada srasyla ./configure, make ve make install komutlarn verin. Burada farkl olarak make altinstall yerine make install komutunu kulland mza dikkat edin. nk sizin sisteminizde Pythonn hi bir srm kug rulu olmad iin, elle kuraca nz yeni srmn eski bir srmle akma riski de yok. O g g s yzden make altinstall yerine do rudan make install komutunu kullanabilirsiniz. Ancak g daha nce de dedi imiz gibi, biz size da tmnzn depolarnda bulunan Python srmn kulg g lanmanz siddetle tavsiye ediyoruz. Gelelim Microsoft Windows kullanclarna...

1.4.2 Windowsta Python al trmak s


Python yukarda verdi imiz indirme adresinden indirip bilgisayarlarna kurmu olan Wing s dows kullanclar, Balat/Programlar/Python 2.x/Python (Command Line) yolunu takip ederek s Pythonn komut satrna ulaabilirler. s Ayrca alternatif olarak, Balat/altr yolunu takip ederek, cmd komutuyla ulat nz MS-DOS s s s g ekrannda su komutu verdi inizde de karnza Pythonn komut satr gelecektir: g s
c:/python26/python

E er yukarda yapt mz gibi uzun uzun konum belirtmek yerine sadece python komutunu g g kullanmak isterseniz Python YOLa (PATH) eklemeniz gerekir. Peki Python nasl YOLa ekleyece iz? Syle: g
Denetim Masas iinde Sistem simgesine ift tklayn. (E er klasik grnmde de ilsg g eniz Sistem simgesini bulmak iin Performans ve Bakm kategorisinin iine bakn veya Denetim Masas akken adres ubu una do rudan sistem yazp ENTER tuuna basn.) g g s Gelimi sekmesine girin ve Ortam De ikenleri d mesine basn. s s gs g Sistem De ikenleri blmnde Path esini bulup buna ift tklayn. gs g De iken De eri ifadesinin hemen karsndaki kutucu un en sonuna su girdiyi ekleyin: gs g s g ;C:\Python26. TAMAMa basp kn. Bu de iikliklerin geerlilik kazanabilmesi iin ak olan btn MS-DOS pencerelerini kapgs atp yeniden an.

Not: E er bu ilemler size kark geldiyse, resimli ve daha ayrntl bir anlatm iin Windowsta g s s Python YOLa Eklemek adl makalemizi inceleyebilirsiniz.

E er yukardaki ilemleri baaryla gerekletirdiyseniz, Balat/altr yolunu takip edip cmd g s s s s s komutunu vererek ulat nz MS-DOS ekrannda; s g
python

yazp ENTER tuuna bast nzda karnza syle bir ekran geliyor olmal: s g s
Python 2.6.5 (r265:79096, Mar 19 2010, 21:48:26) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>>

Bu ekranda kulland mz Python srmnn 2.6.5 oldu unu gryoruz. Buradaki >>> iareti g g s Pythonn bizden komut almaya hazr oldu unu gsteriyor. Komutlarmz bu iaretten hemen g s sonra, bo luk brakmadan yazaca z. Bunun dnda, istersek Python kodlarn bir metin s g s dosyasna da kaydedebilir, bu kaydetti imiz metin dosyasn komut satrndan altrabiliriz. g s Bu ilemin nasl yaplaca n daha sonra konuaca z. s g s g E er python komutunu verdi inizde yukardaki ekran yerine bir hata mesajyla karlayorg g s s sanz ihtimal var: 1. python kelimesini yanl yazm olabilirsiniz. Mesela yanllkla pyhton, pyton veya s s s phyton yazm olabilirsiniz. Bu yzden python kelimesini do ru yazd nza emin olun. s g g 2. Python YOLa ekleyememi olabilirsiniz. E er yukarda anlatt mz YOLa ekleme adms g g larn uygulamak konusunda sknt yayorsanz, kistihza [at] yahoo [nokta] com adresins den bana ulaabilirsiniz. Ben size elimden geldi ince yardmc olmaya alrm. s g s 3. Python kuramam olabilirsiniz. Balat/Programlar yolu iinde bir Python26 girdisi olup s s olmad na bakn. Ayrca C:\ dizininin iini de kontrol edin. Orada Python26 adl bir klasr g gryor olmalsnz. E er programlar listesinde veya C:\ dizini iinde Python26 diye g bir sey yoksa Python kuramamsnz demektir. Bu durumda Python yeniden kurmay s deneyebilirsiniz. Ben sizin yukardaki komutu dzgn bir sekilde altrabilmi oldu unuzu varsayyorum. s s g

1.5 Pythondan Nasl klr?


Farkl iletim sistemlerinde python komutunu vererek Pythonn komut satrna nasl eriebiles s ce imizi rendik. Peki bu komut satrndan kmak istersek ne yapaca z? Elbette do rudan g g g g komut penceresi zerindeki arp tuuna basarak bu ortam terk edebilirsiniz. Ancak bu ilemi s s kaba kuvvete bavurmadan yapmann bir yolu olmal, de il mi? s g Komut satrndan kmann birka farkl yolu vardr: 1. Komut ekran zerindeki arp d mesine basmak (kaba kuvvet) g 2. nce CTRL+Z tularna, ardndan da ENTER tuuna basmak (Windows) s s 3. CTRL+Z tularna basmak (GNU/Linux) s 4. quit() yazp ENTER tuuna basmak (Btn iletim sistemleri) s s 5. nce import sys, ardndan da sys.exit() komutlarn vermek (Btn iletim sistemleri) s Siz bu farkl yntemler arasndan, kolaynza hangisi geliyorsa onu seebilirsiniz.

Bylece Python nereden indirece imizi, nasl kuraca mz ve Pythonn komut satrn nasl g g balatp kapatabilece imizi renmi olduk. Pythona ilikin en temel bilgileri edinmi oldu us g g s s s g muza gre artk Pythonla daha ciddi iler yapmaya do ru ilk admlarmz atabiliriz. Ama nce s g blm sorularna bakalm.

1.6 Blm Sorular


1. Pythonn GNU/Linux, Windows ve Mac OS X srmleri oldu unu biliyoruz. g http://www.python.org/download adresini ziyaret ederek, Pythonn baka hangi platformlara s ait srmlerinin oldu unu inceleyin. Sizce Pythonn bu kadar farkl iletim sistemi ve platform g s zerinde alabiliyor olmas bu dilin hangi zelli ini gsteriyor? s g 2. E er GNU/Linux da tmlarndan birini kullanyorsanz, sisteminizde Python programlama g g dilinin kurulu olup olmad n denetleyin. Kulland nz da tmda Python kurulumla birlikte mi g g g geliyor, yoksa baka bir paketin ba mll olarak m sisteme kuruluyor? E er Python kurus g g g lumla birlikte geliyorsa, kurulu gelen, Pythonn hangi srm? Da tmnzn depolarndaki en g yeni Python srm hangisi? 3. Tercihen VirtualBox gibi bir sanallatrma arac ile kurdu unuz bir GNU/Linux da tm zs g g erinde Python kurulumuna ilikin baz denemeler yapn. rne in Pythonn resmi sitesinden s g dilin kaynak kodlarn indirip program kaynaktan derleyin. Sistemde kurulu olarak gelen Python srmyle, sizin kaynaktan derledi iniz Python srmnn birbiriyle akmamas iin g s gerekli nlemleri aln. Diyelim ki sisteminizde Pythonn 2.6 srm var. Siz Pythonn sitesinden farkl bir Python srm indirdi inizde Pythonn ntanml srmne ve kaynaktan derg lenen srmne ayr ayr nasl ulaabilece inizi dnn. s g s 4. E er siz bir Windows kullancsysanz ve .Net ats ile ainal nz varsa IronPythonn ne g s g oldu unu aratrn. g s 5. E er siz bir Java programcs iseniz Jythonn ne oldu unu aratrn. g g s 6. Kulland nz iletim sisteminde Python ka farkl biimde altrabildi inizi kontrol edin. g s s g 7. Windowsta Pythonn hangi aralarla birlikte kuruldu unu kontrol edin. Kurulumla birlikte g gelen evrimd s Ingilizce klavuzlar inceleyin. Localhosttan hizmet veren pydoc (Module Docs) sunucusunu altrn ve bunun ne ie yarad n anlamaya aln. s s g s 8. Windowsta YOL (PATH) yapsn inceleyin. Windows dizinleri YOLa nasl ekleniyor? YOLa eklenen dizinler birbirinden hangi iaret ile ayrlyor? Bir dizinin YOL stnde olup olmamas s neyi de itiriyor? Sitesinden indirip kurdu unuz Python srmn YOLa eklemeyi deneyin. gs g Bu ilem srasnda ne gibi sorunlarla karlat nz de erlendirin. s s s g g

BLM

Pythona Giri s

Bir nceki blmde Pythonn komut satrna nasl ulaaca mz grmtk. Bu komut satrna s g s teknik dilde etkile imli kabuk (interactive shell) veya yorumlayc (interpreter) ad verilir. s Simdi nceki blmde anlatt mz yntemlerden herhangi birini kullanarak Pythonn etk g ileimli kabu unu aalm ve suna benzer bir ekranla karlaalm: s g s s
istihza@istihza:~$ python Python 2.6.5 (r265:79063, Apr 3 2010, 01:57:29) [GCC 4.4.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>>

Komutlarmz bu >>> iaretinden hemen sonra, hi boluk brakmadan yazmaya balayas s s ca mz daha nce sylemitik. Simdi isterseniz birka parmak altrmas yapp kendimizi g s s Pythona sndralm. Bu blmde inceleyece imiz ilk komutumuzun ad print. g

2.1 print Komutu


print komutunun grevi, ekrana bir seyler yazdrmamz sa lamaktr. Mesela bu komutu tek g bana kullanmay deneyelim: s
>>> print

yazp hemen ENTER tuuna basalm. s Not: Yukardaki komutta grd mz >>> iaretini kendimiz yazmayaca z. O iaret, etkg s g s ileimli kabu un grntsn temsil ediyor. Bizim sadece print yazmamz yeterli. s g Ne oldu? Python bir satr boluk brakarak alt satra geti, de il mi? Bunu ona yapmasn biz s g syledik, o da yapt... Simdi de bo bir satr brakmak yerine ekrana bir seyler yazmasn syleyelim Pythona: s

>>> print "Programa hogeldiniz. Ltfen giri yapn!" s s

Bu satr yazp ENTER tuuna bastktan sonra ekranda Programa hogeldiniz. Ltfen giri yapn! s s s ktsn grmemiz gerekiyor. Grd nz gibi print komutunun ardndan gelen Programa hogeldiniz. Ltfen giri yapn! g s s ifadesini ift trnak iinde belirtiyoruz. E er burada ift trnak iaretini koymazsak veya koyg s may unutursak Python bize bir hata kts gsterecektir. Zaten yukardaki komutu verdikten sonra bir hata alyorsanz, ok byk bir ihtimalle trnaklar dzgn yerletirmemisinizdir. s s Not: E er yukardaki komutu do ru yazd nz halde hata alyorsanz, g g g muhtemelen kulland nz Python srm 2.x de il, g g 3.xtir. E er yleyse, g http://www.istihza.com/py3/icindekiler_python.html adresindeki Python 3.x belgelerinden yararlanabilirsiniz. Biz istersek yukardaki rnekte ift trnak yerine tek trnak () da kullanabiliriz. Trnak seiminde zgrz:
>>> print Programa hogeldiniz. Ltfen giri yapn! s s

Bu komut da bize istedi imiz kty baaryla verecektir. Dedi imiz gibi, kullanaca nz trg s g g nak tipi konusunda zgrsnz. Ancak trnak seiminde baz noktalara da dikkat etmemiz gerekiyor. Diyelim ki Istanbulun 5 gnlk hava tahmini ifadesini ekrana yazdrmak istiyoruz. Bunu ift trnak kullanarak su sekilde gsterebiliriz:
>>> print "stanbulun 5 gnlk hava tahmini" I

Bu komut bize hatasz bir sekilde stanbulun 5 gnlk hava tahmini ktsn verir. Ancak ayn I ilemi tek trnakla yapmaya alrsak syle bir hata mesaj alrz: s s
File "<stdin>", line 1 print stanbulun 5 gnlk hava tahmini I ^ SyntaxError: invalid syntax

Bunun sebebi, Istanbulun kelimesindeki kesme iaretinden tr Pythonn trnaklarn s nerede balayp nerede bitti ini anlamamasdr. E er mutlaka tek trnak kullanmak istiyorsak, s g g kodu su hale getirmemiz gerekir:
>>> print Istanbul\un 5 gnlk hava tahmini

Ayn sekilde, syle bir rnekte de ift trnak bize zorluk karr:
>>> print "Pythonda nemli komutlardan biri de "print" komutudur."

Bu komut bize syle bir hata mesaj verecektir:


File "<stdin>", line 1 print "Pythondaki nemli komutlardan biri de "print" komutudur." ^ SyntaxError: invalid syntax

Bu cmleyi dzgn olarak gsterebilmek iin yukardaki komutu syle yazmamz gerekir:
>>> print "Pythonda nemli komutlardan biri de \"print\" komutudur."

Yukardaki iki rnekte grd mz \ iaretleri, kendilerinden sonra gelen karakterlerin g s Python tarafndan normalden farkl alglanmasn sa lar. Yani bu iaret sayesinde, cmle iinde g s geen trnak iaretleri, cmleyi balatan ve bitiren trnak iaretleriyle karmaz. Buna bens s s s zer hatalardan kamamz sa layan bu tr iaretlere Python dilinde Ka Dizileri (Escape Seg s s quences) ad verilir. Simdilik bu ka dizisi kavramn ok fazla kafamza takmadan yolumuza s devam edelim. Zaten birka blm sonra bu ka dizilerinden ayrntl olarak sz edece iz. s g Biz su anda sadece, cmle iinde geen trnak iaretlerine dikkat etmemiz gerekti ini bilelim s g yeter. Dedi imiz gibi, print komutu Pythondaki en nemli ve en temel komutlardan biridir. Pythonla g yazd nz programlarda kullanclarnza herhangi bir mesaj gstermek istedi inizde bu print g g komutundan yararlanacaksnz. Dilerseniz bu nemli komutla birka rnek daha yapalm elimizi altrmak iin: s
>>> print "GAME OVER" GAME OVER >>> print "FINISH HIM!" FINISH HIM! >>> print "Linuxun gl yanlar" Linuxun gl yanlar >>> print Linux\un gl yanlar Linuxun gl yanlar

Yukardaki son rnekte \ iaretini neden kulland mz biliyorsunuz. Linuxun gl yanlar s g cmlesini tek trnak iine ald mz iin, Linuxun kelimesindeki kesme iaretinden () tr g s Python trnaklarn nerede balayp nerede bitti ini anlayamaz. Pythonn kafasn kartrmas g s mak iin burada ka dizilerinden yararlanarak dzgn kt almay sa lyoruz. Yani Linuxun s g kelimesindeki kesme iaretiyle karlaan Pythona syle demi oluyoruz: Bu trnak senin s s s s arad n trnak de il. Sen yoluna devam et. Biraz ilerde arad n trna bulacaksn! g g g g

2.2 Karakter Dizileri


Pythondaki en nemli komutlardan biri olan printi rendi imize gre, bundan sonraki konug g lar daha rahat anlayabilmemiz iin baz kavramlardan sz etmemiz faydal olabilir. Bu blmde karakter dizisi diye bir seyden sz edece iz. Yabanclar buna string ad veriyor... g Aslnda biz karakter dizisinin ne oldu unu biliyoruz. Yukarda print komutunu ilerken bu karakg s ter dizilerini zaten kullandk. Oradaki rneklerden de grece iniz gibi, karakter dizileri, trnak g iinde gsterilen herhangi bir eydir. Tanmndan da anlalaca gibi, trnak iinde gsteres s g bildi imiz her sey bir karakter dizisi olabilir. Mesela su rnekler birer karakter dizisidir: g
"Python" "Perl" "Ruby" "23"

"35" "@falanca" "c"

Karakter dizilerinin ayrt edici zelli i, trnak iareti tamalardr. E er yukardaki rnekleri g s s g trnak iaretsiz olarak kullanrsak, artk bu eler birer karakter dizisi olmayacaktr... Yukars g daki rneklerden de grd mz gibi, bir karakter dizisinin ne kadar uzun veya ne kadar ksa g oldu unun hibir nemi yok. Bir karakter dizisi tek bir karakterden oluabilece i gibi, birden g s g fazla karakterden de oluabilir. Bu nedenle c de bir karakter dizisidir, @falanca da... s Pythonda karakter dizilerini ekrana yazdrabilmek iin print komutundan yararlanabilece imizi g biliyorsunuz. Mesela:
>>> print "k" k >>> print "456" 456 >>> print "Ruby" Ruby >>> print "stanbulun 5 gnlk hava tahmini" I stanbulun 5 gnlk hava tahmini I

Etkileimli kabukta alrken, istersek yukardaki rnekleri print komutunu kullanmadan da s s ekrana yazdrabiliriz:
>>> "Python" Python >>> "Perl" Perl >>> "Ruby" Ruby >>> "4243" 4243

Ancak bu durum sadece etkileimli kabuk iin geerlidir. Yani ilerde kodlarmz bir dosyaya s kaydetti imiz zaman, yukardaki kodlarn kt vermedi ini, herhangi bir seyi ekrana yazdrag g bilmek iin mutlaka print komutundan yararlanmamz gerekti ini grece iz. g g Su rne e bir bakalm: g
>>> print "Python programlama dili"

Python yukardaki gibi bir komutla karlat nda iki basamakl bir ilem gerekletirir. nce s s g s s

Python programlama dili adl karakter dizisini okur, ardndan da print komutunun etkisiyle bu karakter dizisini ekrana basp kullancya gsterir. Yani syle bir kt verir:
Python programlama dili

Etkileimli kabukta bir karakter dizisini print komutu olmadan kulland mzda Python yalnzca s g birinci basama gerekletirmi olur. Byle bir durumda yapt tek sey bu karakter dizisini g s s g okumaktr. print komutunu kullanarak bu karakter dizisini kullancya gstermedi imiz iin g ikinci basamak gereklemez. Dolaysyla elde etti imiz kt, sz konusu karakter dizisini s g kullancnn de il, Pythonn ne sekilde grd n gsterir. Yani Python bize syle bir sey g g sylemi olur: s Sen simdi etkileimli kabu a bir seyler yazdn. Ben de bunu algladm. Yazd n seyi al s g g glad m gstermek iin de, kty sana tek trnak iaretleri iinde gsterdim. Ancak print g s gibi bir komut yardmyla ekrana herhangi bir sey basmam olman da dikkatimden kamad s de il! g Basit bir rnek verelim:
>>> "dnya" d\xc3\xbcnya

Grd nz gibi, dnya kelimesi iindeki Trke karakter () ktda dzgn grnmyor. g Demek ki Python bizim girdi imiz dnya adl karakter dizisini d\xc3\xbcnya seklinde gryg ormu... (Buradaki \xc3\xbc ksm kulland nz iletim sistemine gre farkllk gsterebilir.) s g s Biz bu karakter dizisini kullancya gsterebilmek iin syle yazaca z: g
>>> print "dnya" dnya

Yazd mz Python programlarn dosyaya kaydedip altrd mzda yukarda anlattklarmzn g s g ne demek oldu unu ok daha net bir sekilde anlayaca z. O yzden, e er yukardaki akg g g lamalar size kafa kartrc geldiyse hi endie etmenize gerek yok. Okumaya devam edes s bilirsiniz. Karakter dizilerini gstermek iin trnak iaretlerinden yararlanyoruz demitik. Pythonda s s karakter dizilerini gstermek iin farkl trnak tiplerini kullanabilirsiniz. rne in ift trnak kulg lanabilirsiniz:
>>> print "Python gl bir programlama dilidir."

veya tek trnak:


>>> print Python gl bir programlama dilidir.

Bu trnak tiplerini nceki rneklerimizde grmtk. Ama Python bize bunlarn dnda bir s s trnak alternati daha sunar. trnak:
>>> print """Python gl bir programlama dilidir."""

Grd nz gibi, karakter dizileriyle birlikte farkl trnak eidi kullanabiliyoruz. Hangi trnak g s eidini kulland nzn ok fazla bir nemi yok. nemli olan, karakter dizisini hangi trnakla s g atysanz o trnakla kapatmanzdr. Bu trnak tipleri iinde en yaygn kullanlan ift trnaktr. Tabii siz istedi iniz trnak biimini g kullanmakta zgrsnz. Yalnz nceki blmde, duruma gre kullanlan trnak tipinin nem kazand n gsteren syle bir rnek verdi imizi biliyorsunuz: g g

>>> print "Istanbulun 5 gnlk hava tahmini"

Burada Istanbulun 5 gnlk hava tahmini bir karakter dizisidir. Bu karakter dizisini gstermek iin ift trnaklardan yararlandk. Istersek elbette bu karakter dizisini tek trnak ile de gsterebiliriz. Ancak stanbulun kelimesi iinde geen kesme iaretinden tr, kullanlan I s trnaklarn birbirine karmas gibi bir tehlike sz konusu. Yani, daha nce de grd mz gibi, s g syle bir kullanm Pythonn kafasnn karmasna yol aacaktr: s
>>> print Istanbulun 5 gnlk hava tahmini

Bu kullanmda, Python karakter dizisini kapatan trna n hangisi oldu unu anlayamayacak, o g g yzden de syle bir hata mesaj verecektir:
File "<stdin>", line 1 print stanbulun 5 gnlk hava tahmini I ^ SyntaxError: invalid syntax

Dikkat ederseniz hata ktsndaki stanbulun kelimesinin sonunda minik bir ok iareti var. I s ste bu ok, hata reten sorunlu blgeyi gsteriyor. I Byle bir hata mesaj almamak iin ka dizilerinden yararlanmamz gerekti ini sylemitik: s g s
>>> print stanbul\un 5 gnlk hava tahmini I

Biraz sonra ka dizilerinden ayrntl olarak sz edece iz. O yzden yukardaki kullanmn s g kafanz kartrmasna izin vermeyin. s E er bunlarn hibiriyle u ramak istemezseniz trnaktan da yararlanabilirsiniz: g g s
>>> print """Ahmetin retmeni Cem Bey, "devini yapmadan gelme!" dedi.""" g

Grd nz gibi, trnak iareti sayesinde karakter dizisi iinde hem tek trnak, hem de ift g s trnak kullanabildik. Zira yukardaki karakter dizisine tek trnakla balasak Ahmetin kelimesi s iindeki kesme iareti, ift trnakla balasak devini yapmadan gelme! ifadesi iindeki s s ift trnak iaretleri bize sorun yaratacak... Bu engellere taklmadan, kodumuzu dzgn bir s sekilde ekrana yazdrabilmek iin trnak iaretlerini kullanmay tercih ettik. s trnak iaretinin marifetleri yukardakilerle snrl de ildir. Bu trnak tipi, kimi durumlarda s g iimizi bir hayli kolaylatrr. Mesela kullanclarmza syle bir kt gstermemiz gerekti ini s s g varsayalm:
Gnn mns -----------Makarna .... 6 TL orba....... 3 TL Tatl....... 2 TL

Byle bir kt vermenin en kolay yolu trnak iaretlerinden yararlanmaktr: s


>>> ... ... ... ... ... ... print """ Gnn mns -----------Makarna .... 6 TL orba....... 3 TL Tatl....... 2 TL """

Burada ilk trnak iaretini koyduktan sonra ENTER tuuna bastk. Alt satra geildi inde s s g >>> iaretinin ... iaretine dnd ne dikkat edin. Bu iaret Pythonn bizden komut girmeye s s g s devam etmemizi bekledi ini gsteriyor. Biz de bu beklentiye uyarak, Gnn mns satrn g yazyoruz. Tekrar ENTER tuuna bast mzda yine ... iaretini gryoruz ve hemen - s g s satrn yazyoruz. Yazaca mz kodlar bitene kadar byle devam ediyoruz. simiz bitti inde de g I g kapan trnaklarn koyup ENTER tuuna basarak kty alyoruz: s s
Gnn mns -----------Makarna .... 6 TL orba....... 3 TL Tatl....... 2 TL

Normalde, tek trnak veya ift trnak ile balad mz bir karakter dizisinde kapan trna n s g s g koymadan ENTER tuuna basarsak hata alrz: s
>>> print "Gnn Mns File "<stdin>", line 1 print "Gnn Mns ^ SyntaxError: EOL while scanning string literal

Burada Gnn Mns karakter dizisine ift trnakla baladk, ama trna kapatmadan ENTER s g tuuna bast mz iin Python bize bir hata mesaj gsterdi. Ayn sey tek trnak iin de geers g lidir. Ama yukarda da grd nz gibi trnak farkldr: g
>>> print """Gnn Mns ...

trnak iareti, karakter dizileri iinde geen farkl tipte trnaklar atlatmamz sa lamann s g yansra, bize karakter dizilerimizi birden fazla satra blme imkan da tanyor. Ayn seyi tek veya ift trnakla yapamyoruz. Ilerde bu zellikten sk sk faydaland mz greceksiniz. g Karakter dizilerine ilikin nemli bir konu da bu karakter dizilerinin birbirleriyle nasl birletirs s ilece idir. Mesela bir kimsenin ad ile soyadn birletirmek istersek ne yapmalyz? g s
>>> print "Frat" + "zgl" Fratzgl

Grd nz gibi, + iaretini kullanarak iki karakter dizisini birletirebiliyoruz. Ancak burada g s s bir sorun var. ktda isim ve soyisim birbirine bitiik olarak grnyor. Bu problemi zmek s iin syle bir sey yapabilirsiniz:
>>> print "Frat" + " " + "zgl" Frat zgl

Burada Frat ile zgl karakter dizileri arasna bo bir karakter dizisi yerletirdik. Bylece s s ktmz tam istedi imiz gibi olmu oldu. g s Python karakter dizilerini birletirebilmemiz iin bize baka imkanlar da tanr. Mesela su rne e s s g bir bakn:
>>> print "Istanbul" "eliktepe" stanbuleliktepe I

Grd nz gibi, iki karakter dizisini, araya herhangi bir iaret koymadan da birletirebiliyoruz. g s s Ancak burada da biraz ncekine benzer bir sorunla kar karyayz. Karakter dizilerimiz yine s s birbirine bitiik grnyor. Biraz nceki yntemi kullanarak bu karakter dizilerini ayrmamz s mmkn:
>>> print "Istanbul" " " "eliktepe"

Hatta yukardaki gibi bir kt alabilmek iin syle bir seyler de yapabilirsiniz:
>>> print "Istanbul " + "eliktepe"

veya:
>>> print "Istanbul " "eliktepe"

Burada ayr bir bo karakter dizisi eklemek yerine, s Istanbul adl karakter dizisinin kapan s trna n koymadan nce bir boluk brakyoruz... g s Elbette Pythonda areler tkenmez. Dilerseniz yukardaki btn her seyi unutup syle bir sey yazmay da tercih edebilirsiniz:
>>> print "Frat", "zgl" Frat zgl

Burada da karakter dizilerini birbirlerinden virglle ayrmay tercih ettik. Bu son kullanm sklkla karmza kacak. O yzden bu kullanm aklmzda tutmamz gerekiyor. s Karakter dizilerinden ve bunlarn inceliklerinden ileride de sz etmeye devam edece iz. Ama g isterseniz bu konuya simdilik bir ara verelim ve Pythonda farkl bir konuya giri yapalm. s

2.3 Pythonda Saylar ve Matematik slemleri I


Simdiye kadar Pythonda baz seyler rendik. Ancak rendiklerimiz henz drt drtlk bir g g program yazmaya yetmiyor. Ama bu durum, Python simdilik basit bir hesap makinesi niyetine kullanabilmemize engel de il. g rne in: g
>>> 2 + 5 7

... veya:
>>> 5 - 2 3

... ya da:
>>> 2 * 5 10

... hatta:

>>> 6 / 2 3

Isterseniz bunlarn bana print komutu ekleyerek de kullanabilirsiniz bu kodlar. Bir rnek s verelim:
>>> print 234 + 546 780

Aritmetik ilemler yapabilmek iin kulland mz iaretlerin size mantkl gelmi oldu unu s g s s g zannediyorum. Toplama ilemi iin +, karma ilemi iin -, arpma ilemi iin *, blme s s s ilemi iin ise / iaretlerini kullanmak gayet makul duruyor, de il mi? s s g Grd nz gibi saylar yazarken trnak iaretlerini kullanmyoruz. E er trnak iareti kullanrg s g s sak Python yazdklarmz say olarak de il karakter dizisi olarak alglayacaktr. Bu durumu g birka rnekle grelim:
>>> print 25 + 50 75

Bu komut, 25 ve 50yi toplayp sonucu kt olarak verir. Simdi aa daki rne e bakalm: s g g
>>> print "25 + 50" 25 + 50

Bu komut 25 ile 50yi toplamak yerine, ekrana 25 + 50 seklinde bir kt verecektir. Peki, syle bir komut verirsek ne olur?
>>> print "25" + "50"

Byle bir komutla karlaan Python derhal 25 ve 50 karakter dizilerini (bu saylar trnak s s iinde oldu u iin Python bunlar say olarak alglamaz) yan yana getirip birletirecektir. Yani g s syle bir sey yapacaktr:
>>> print "25" + "50" 2550

Uzun lafn ksas, 25 ifadesi ile eliktepe ifadesi arasnda Python asndan hi bir fark yoktur. Bunlarn ikisi de karakter dizisi snfna girer. Ancak trnak iareti olmayan 25 ile eliks tepe ifadeleri Python dilinde ayr anlamlar tar. nk bunlardan biri say teki ise karakter s dizisidir (string). Simdi aritmetik ilemlere geri dnelim. ncelikle su komutun ktsn inceleyelim: s
>>> print 5 / 2 2

Ama biz biliyoruz ki 5i 2ye blerseniz 2 de il 2,5 kar. Ayn komutu bir de syle deneyelim: g
>>> print 5.0 / 2 2.5

Grd nz gibi blme ilemini oluturan bileenlerden birinin yanna .0 koyulursa sorun g s s s zlyor. Bylelikle Python bizim sonucu kayan noktal say olarak grmek istedi imizi ang lyor. Bu .0 ifadesini istedi imiz saynn nne koyabiliriz. Birka rnek grelim: g
>>> print 5 / 2.0 2.5 >>> print 5.0 / 2.0 2.5

Pythonda aritmetik ilemler yaplrken alt mz matematik kurallar geerlidir. Yani mesela s s g ayn anda blme karma, toplama, arpma ilemleri yaplacaksa ilem ncelik sras, nce s s blme ve arpma sonra toplama ve karma seklinde olacaktr. rne in: g
>>> print 2 + 6 / 3 * 5 - 4

ileminin sonucu 8 olacaktr. Tabii biz istersek parantezler yardmyla Pythonn kendili inden s g kulland ncelik srasn de itirebiliriz. Bu arada yapaca mz aritmetik ilemlerde saylar g gs g s kayan noktal say cinsinden yazmamz ilem sonucunun kesinli i asndan byk nem tar. s g s E er her defasnda .0 koymaktan sklyorsanz, su komutla Pythona, Bana her zaman kesin g sonular gster, mesaj gnderebilirsiniz:
>>> from __future__ import division

Not: Burada __ iaretini klavyedeki alt izgi tuuna iki kez art arda basarak yapabilirsiniz. s s Artk bir sonraki Python oturumuna kadar btn ilemlerinizin sonucu kayan noktal say s olarak gsterilecektir. Bu arada dilerseniz konuyla ilgili baz ufak tefek teknik bilgiler verelim. Bylece karlat mz rnekleri daha kolay anlayabiliriz. Mesela yukarda saylardan s s g bahsettik. Pythonda saylar eit eittir: s s Tamsaylar (integers) Tamsaylar, herhangi bir ondalk ksm barndrmayan saylardr. Mesela 3, 5, 6, 100, 1450, -56, -3 vb... Kayan Noktal Saylar (oating point numbers) Ondalk bir ksm da barndran saylardr. Mesela 3.4, 5.5, 6.4, vb... Bu arada ondalk ksm virglle de il noktayla gsterdi imize g g dikkat edin. Uzun Saylar (long integers) -2.147.483.648 ile 2.147.483.647 arasnda kalan saylardr. Karma k Saylar (complex numbers) Karmak saylar bir gerel, bir de sanal ksmdan s s oluan saylardr. Mesela 34.3j, 2j+4, vb... s Bu saylar iinde en sk karlaacaklarmz tamsaylar ve kayan noktal saylardr. E er zel s s g olarak matematikle ilgili iler yapmyorsanz uzun saylar ve karmak saylar pek karnza s s s kmaz. Hatrlarsanz, karakter dizilerinden bahsederken, printli ve printsiz kullanmdan sz etmitik. s Orada szn etti imiz durum saylar iin de geerlidir. Mesela su rne e bakalm: g g
>>> 12 - 3.3 8.6999999999999993

Herhalde bekledi iniz kt bu de ildi. Bu kt, 12 - 3.3 ilemini Pythonn nasl grd n g g s g gsteriyor. E er bu ilemi insanlarn anlayabilece i bir biime getirmek istersek syle yazg s g mamz gerekir:

>>> print 12 - 3.3 8.7

Ilerde yeri geldi inde saylardan daha ayrntl bir sekilde bahsedece iz. O yzden saylar g g konusunu simdi bir kenara brakp ok nemli baka bir konuya de inelim. s g

s 2.4 Degi kenler


Kabaca, bir veriyi kendi iinde depolayan birimlere de iken ad veriyorlar. Ama su anda gs aslnda bizi de ikenin ne oldu undan ziyade neye yarad ilgilendiriyor. O yzden hemen gs g g bir rnekle durumu aklamaya alalm. Mesela; s
>>> n = 5

ifadesinde n bir de ikendir. Bu n de ikeni 5 verisini sonradan tekrar kullanlmak zere depogs gs lar. Python komut satrnda n = 5 seklinde de ikeni tanmladktan sonra print n komutunu gs verirsek ekrana yazdrlacak veri 5 olacaktr. Yani:
>>> n = 5 >>> print n 5

Bu n de ikenini alp bununla aritmetik ilemler de yapabiliriz: gs s


>>> n * 2 10 >>> n / 2.0 2.5

Hatta bu n de ikeni, iinde bir aritmetik ilem de barndrabilir: gs s


>>> n = 34 * 45 >>> print n 1530

Su rneklere bir gz atalm:


>>> a = 5 >>> b = 3 >>> print a * b 15 >>> print "a ile byi arparsak", a * b, "elde ederiz" a ile byi arparsak 15 elde ederiz

Burada de ikenleri karakter dizileri arasna nasl yerletirdi imize, virglleri nerede kulgs s g land mza dikkat edin. g Ayn de ikenlerle yapt mz su rne e bakalm bir de: gs g g

>>> print a, "says", b, "saysndan byktr"

Grd nz gibi, aslnda burada yapt mz sey, karakter dizilerini birbiriyle birletirmekten g g s ibarettir. Hatrlarsanz bir nceki blmde iki karakter dizisini su sekilde birletirebilece imizi s g renmitik: g s
>>> print "Frat", "zgl"

ste yukarda yapt mz seyin de bundan hibir fark yoktur. Dikkatlice bakn: I g
>>> print a, "says", b, "saysndan byktr"

Yukardaki kod sununla ede erdir: s g


>>> print 5, "says", 3, "saysndan byktr"

Biz burada do rudan saylar yazmak yerine, bu saylar tutan de ikenleri yazdk... g gs De ikenleri kullanmann baka bir yolu da zel iaretler yardmyla bunlar karakter dizileri gs s s iine gmmektir. Su rne e bir bakalm: g
>>> print "%s ile %s arplrsa %s elde edilir" %(3, 5, 3*5)

Bu da olduka kullanl bir tekniktir. Burada, parantez iinde gsterece imiz her bir e iin s g g karakter dizisi iine %s iaretini ekliyoruz. Karakter dizisini yazdktan sonra da % iaretinin s s ardndan parantez iinde bu de ikenleri teker teker tanmlyoruz. Buna gre birinci de ikengs gs imiz 3, ikincisi 5, ncs ise bunlarn arpm... Bir de su rne i inceleyelim: g
>>> print "%s ve %s iyi bir ikilidir." %("Python", "Django")

Grlece i gibi, bu kez de ikenlerimiz tamsay yerine karakter dizisi oldu u iin parantez g gs g iinde de ikenleri belirtirken trnak iaretlerini kullanmay unutmuyoruz. gs s

2.5 Ka Dizileri s
nceki blmlerde ka dizisi diye bir seyden sz ettik. Hatta bununla ilgili bir rnek de s yaptk. Isterseniz o rne i hatrlayalm: g
>>> print Istanbul\un 5 gnlk hava tahmini

ste bu karakter dizisi iinde kulland mz \ iareti bir ka dizisidir. Bu ka dizisinin buI g s s s radaki grevi, stanbulun kelimesi iinde geen kesme iaretinin, karakter dizisini aan ve I s kapatan trnak iaretleriyle karmasn nlemek. Python bir karakter dizisiyle karlat nda, s s s s g bu karakter dizisini soldan sa a do ru okur. Mesela yukardaki rnekte nce tek trnak iaretini g g s gryor ve bir karakter dizisi tanmlayaca mz anlyor. Ardndan karakter dizisi iindeki kesme g iaretine rastlyor ve bu iaretin karakter dizisinin bitiini gsteren kesme iareti oldu unu, s s s s g yani karakter dizisinin sona erdi ini zannediyor. Ancak okumaya devam etti inde, karakter g g dizisine birleik bir halde un 5 gnlk hava tahmini diye bir seyle karlayor ve ite bu noks s s s tada kafas allak bullak oluyor. Bizim stanbulun kelimesindeki kesme iaretinin sol tarafna I s yerletirdi imiz \ ka dizisi Pythona, bu kesme iaretini grmezden gelme emri veriyor. s g s s Bylece karakter dizimiz hatasz bir sekilde ekrana baslyor... Dilerseniz bununla ilgili birka rnek daha yapalm:

>>> print "1 numaral oyuncudan gelen cevap: "Sola dn!""

Bu karakter dizisi iinde Sola dn! ifadesi var. Biz yukardaki karakter dizisini tanmlarken ift trnaktan yararland mz iin, karakter dizisi iindeki bu Sola dn! ifadesi akmaya g s sebep oluyor. Istersek yukardaki karakter dizisini su sekilde yazabiliriz:
>>> print 1 numaral oyuncudan gelen cevap: "Sola dn!"

Bu komut sorunsuz bir sekilde yazdrlr. Ama e er karakter dizisini ift trnakla tanmlamanz g gerekirse, ka dizilerinden yararlanabilirsiniz: s
>>> print "1 numaral oyuncudan gelen cevap: \"Sola dn!\""

Burada iki adet ka dizisi kulland mza dikkat edin. Bunun nedeni, karakter dizisi iinde s g balang ve biti trnaklaryla karabilecek iki adet trnak iareti olmasdr... Ayrca ka s s s s s dizisini, sorunlu trna n soluna koydu umuza da dikkat edin. g g Hatrlarsanz ka dizilerinden ilk bahsetti imiz yerde syle bir rnek de vermitik: s g s
>>> print "Pythonda nemli komutlardan biri de "print" komutudur."

Bu komutun hata verece ini biliyoruz. nk karakter dizisini ift trnak iinde tanmladk. g Dolaysyla karakter dizisi iinde geen ift trnakl print ifadesi akmaya yol at. Bu sorunu s amak iin karakter dizisini syle yazyoruz: s
>>> print "Pythonda nemli komutlardan biri de \"print\" komutudur."

Burada ka dizilerini ift trnakl print kelimesine nasl uygulad mza dikkat edin. Her bir s g ift trna n soluna bir adet \ iareti yerletirdik. Bylece hatadan kvrak hareketlerle kam g s s s olduk... \ iareti yalnzca trnak iaretleriyle birlikte kullanlmaz. Bu iaret baka karakterlerle birlikte s s s s de kullanlarak farkl amalara hizmet edebilir. Su rne e bir bakn: g
>>> print "birinci satr\nikinci satr"

Burada \ iaretini n haryle birlikte kullandk. \ iareti n haryle birlikte kullanld nda s s g zel bir anlam ifade eder. Yukardaki kod syle bir kt verir:
birinci satr ikinci satr

Grd nz gibi, karakter dizisini iki satra bldk. Bunu yapmamz sa layan sey \n adl g g ka dizisidir. Bu ka dizisi yeni bir satra gememizi sa lar. Daha belirgin bir rnek verelim: s s g
>>> print "Yolun sonu\n"

Bu komut, Yolun sonu karakter dizisini kt olarak verdikten sonra bir satr boluk brakacaks tr. Hatrlarsanz nceki blmde, print komutunu kullanmadan herhangi bir karakter dizisi yazd mzda elde etti imiz ktnn Pythonn bak asn yanstt n sylemitik. Bu durumu g g s g s ok daha net anlayabilmemizi sa layacak bir rnek verelim: g
>>> """ ... Gnn mns ... ------------

... ... ... ...

Makarna..... 6 TL orba....... 3 TL Tatl....... 2 TL """

Bu rne i hatrlyorsunuz. Daha nce ayn rne i print komutu ile birlikte kullanmtk. g g s Bu kodlar syle bir kt verir:
\nGnn mns\n------------\nMakarna..... 6 TL\norba....... 3 TL\nTatl....... 2 TL\n

Grd nz gibi, ktda \n adl ka dizileri de grnyor. Demek ki Python trnak g s yardmyla girdi imiz kodlar byle gryormu. Bu ktdan sunu da anlyoruz: Demek ki biz g s trnak yerine tek trnak kullanmak istesek ayn kty elde etmek iin syle gibi bir komut vermemiz gerekecek:
>>> print \nGnn mns\n------------\nMakarna..... 6 TL\norba....... \ ... 3 TL\nTatl....... 2 TL\n Gnn mns -----------Makarna..... 6 TL orba....... 3 TL Tatl....... 2 TL

Buradan, trnak iaretlerinin kimi durumlarda hayatmz ne kadar da kolaylatrabilece ini s s g anlayabilirsiniz... Bu arada, yukardaki komutlarda bir sey dikkatinizi ekmi olmal. >>> print \nGnn s mns\n--- ile balayan komutun ilk satrnn sonunda, ENTER tuuna basp yeni satra s s gemeden nce \ adl ka dizisini kullandk. Elbette istersek bu iki satr tek bir satrda s da yazabiliriz. Ancak grnt asndan kodlarn bu sekilde sa a do ru uzamas ho de il. g g s g Kt bir kod grnm ortaya kmamas iin, bu ka dizisini kullanarak kodlarmz iki satra s blmeyi tercih ettik. Not: Pythonda do ru kod yazmak kadar, yazd nz kodlarn dzgn grnmesi ve okug g nakl olmas da nemlidir. Bu yzden yazd mz programlarda satr uzunlu unun mmkn g g oldu unca 79 karakterden fazla olmamasna dikkat ediyoruz. E er yazd mz bir satr 79 g g g karakterden uzun olacaksa satr uygun bir yerinden blp yeni bir satra gememiz gerekir. Bu durum teknik bir zorunluluk de ildir, ancak okunakll artrd iin uyulmas tavsiye edilir. g g g rne in biz de yukardaki rnekte kodlarmzn sa a do ru irkin bir sekilde uzamamas iin g g g satr uygun bir yerinden blp alt satra getik. Bu ka dizisini kullanmamzn amac, Pythonn herhangi bir hata vermeden alt satra s gemesini sa lamak. E er orada o ka dizisini kullanmazsak, ENTER tuuna bast mz anda g g s s g Python hata verecektir. \ iareti, alt satra geilmi de olsa kodlarn ilk satrdan devam etmesi s s gerekti ini gsteriyor. Bu durumu belirgin bir sekilde gsteren bir rnek verelim: g
>>> print mer\ ... haba merhaba

Grd nz gibi, merhaba kelimesini mer hecesinden blp \ iareti ile alt satra g s geti imiz halde, ktmz merhaba oldu. E er amacnz merhaba kelimesini mer ve g g haba olarak blmekse syle bir sey yapabilirsiniz:

>>> print """mer ... haba""" mer haba

E er trnak kulland nz halde, merhaba kelimesinin blnmesini istemiyorsanz yine \ g g ka dizisinden yararlanabilirsiniz: s
>>> print """mer\ ... haba""" merhaba

E er trnak yerine ift veya tek trnak kullanarak merhaba kelimesini ortadan blmek g isterseniz elbette \n adl ka dizisinden yararlanabilirsiniz: s
>>> print "mer\nhaba" mer haba >>> print mer\nhaba mer haba

Not: ok uzun bir karakter dizisini iki satra blmek iin \ iaretini kullanrken, bu iaretin s s satrdaki son karakter olmasna zen gsterin. Yani \ iaretini koyar koymaz ENTER tuuna s s basmalsnz. \ iaretinden sonra boluk bile olmamal. s s Btn bu rneklerden sunu anlyoruz: Pythonda temel olarak tek bir ka dizisi var. O da \ s iareti... Bu iaret farkl karakterlerle bir araya gelerek, de iik anlamlar ortaya karabiliyor. s s gs Mesela bu karakter dizisi trnak iaretiyle birlikte kullanld nda, karakter dizisini balatp s g s bitiren trnaklarla aklmasn nlyor. E er bu ka dizisini n haryle birlikte kullanrsak, s g s karakter dizilerini blp alt satra geebiliyoruz. E er bu ka dizisini tek bana kullanrsak, g s s bir karakter dizisini herhangi bir yerinden blp alt satra geti imiz halde, o karakter dizisi g ktda tek satr olarak grnyor. Btn bunlarn dnda bu ka dizisi t haryle de yan s s yana gelebilir. O zaman da syle bir anlam kazanr:
>>> print "Uzak... \t ok uzak" Uzak... ok uzak

Bu ka dizisinin grevi karakter dizisi iindeki karakterler arasna mesafe koymak. Bu ka s s dizisi de kimi yerlerde hayatnz kolaylatrabilir. \ ka dizisi baka karakterlerle de bir s s s araya gelebilir. Ancak en nemlilerini zaten yukarda verdik. Programlama maceramzda en ok iimize yarayacak olanlar bunlardr. s Yukardakilerin dnda, Pythonda sablona uymayan nemli bir ka dizisi daha bulunur. Bu s s ka dizisinin ad rdir. Bu ka dizisinin hem grn hem de kullanm yukardaki ka s s s s dizilerinden biraz farkldr. Dilerseniz bu ka dizisini anlatmadan nce size syle bir soru s soraym: Acaba aa daki karakter dizisini nasl yazdrrz? s g C:\Documents and Settings\nergis\test

Isterseniz bu karakter dizisini nce syle yazdrmay deneyelim:


>>> print "C:\Documents and Settings\nergis\test" C:\Documents and Settings ergis est

Grd nz gibi Python bize tuhaf bir kt verdi. Sizce neden byle oldu? g Cevap aslnda ok basit. Karakter dizisinde kaln harerle gsterdi imiz ksmlara dikkat edin: g C:\Documents and Settings\nergis\test Burada nergis ve test kelimelerinin bandaki harer, dizin ayrac olan \ iareti ile yan s s yana geldi i iin Python bunlar birer ka dizisi olarak alglyor. Bu durumdan kurtulmak iin g s birka seene imiz var. g Istersek yukardaki karakter dizisini syle yazabiliriz:
>>> print "C:\\Documents and Settings\\nergis\\test"

Burada \ iaretlerini iftleyerek sorunun stesinden gelebiliyoruz. Ama e er istersek yukars g daki soruna ok daha temiz bir zm de bulabiliriz. ste byle bir duruma kar Pythonda r I s adl bir ka dizisi daha bulunur. Bunu syle kullanyoruz: s
>>> print r"C:\Documents and Settings\nergis\test"

Grd nz gibi, r adl ka dizisi, karakter dizisi iinde geen btn ka dizilerini etkisiz g s s hale getiriyor. Bu ka dizisi zellikle dizin adlarn yazdrrken ok iinize yarayacaktr. s s Isterseniz bununla ilgili syle bir rnek daha verelim. Diyelim ki su cmleyi ekrana yazdrmak istiyoruz:
Pythondaki ka dizileri unlardr: \, \n, \t s s

Bu cmleyi syle yazdramayz:


>>> print "Pythondaki ka dizileri unlardr: \, \n, \t" s s Pythondaki ka dizileri unlardr: \, s s ,

Grd nz gibi kt hi de bekledi imiz gibi de il. nk Python karakter dizisi iinde geen g g g ka dizilerini ileme sokuyor ve buradaki her bir ka dizisinin grevini yerine getirmesine s s s izin veriyor. Bu ka dizilerinin etkisizletirilebilmesi iin su kodu yazabilirsiniz: s s
print "Pythondaki ka dizileri sunlardr: \\, \\n, \\t" s

Ama burada r ka dizisini kullanrsak ok daha temiz bir kod grnm elde etmi oluruz: s s
print r"Pythondaki ka dizileri unlardr: \, \n, \t" s s

r adl ka dizisi, karakter dizisi iindeki ka dizilerinin grevlerini yerine getirmesine engel s s olacaktr. Dilerseniz simdiye kadar grd mz ka dizilerini syle bir zetleyelim: g s \ ENTER tuuna baslarak alt satra kaydrlan karakter dizilerinin ktda tek satr olarak grns mesini sa lar. g \ Karakter dizilerini balatp bitiren tek trnaklarla, karakter dizisi iinde geen tek trnaklarn s karmasn engeller. s \ Karakter dizilerini balatp bitiren ift trnaklarla, karakter dizisi iinde geen ift trnaklarn s karmasn engeller. s

\n Yeni bir satra geilmesini sa lar. g \t Karakter dizileri iinde sekme (TAB) tuuna baslm gibi boluklar oluturulmasn sa lar. s s s s g r Karakter dizileri iinde geen ka dizilerini etkisiz hale getirir. s Simdi dilerseniz blm sorularna geelim ve bu konuyu kapatalm.

2.6 Blm Sorular


1. Pythonn 2.x srmn m yoksa 3.x srmn m kulland nz tespit g edin. E er hangi srm kullanmanz gerekti i konusunda tereddtleriniz varsa g g http://www.istihza.com/blog/hangisinden-baslamali-python-2x-mi-yoksa-3x-mi.html/ adresindeki makalemizi inceleyin. 2. Aa dakilerden hangisi bir karakter dizisi de ildir? s g g
"python" www.google.com 23 """@%&""" istihza

3. Aa daki tabloyu ekrana kt olarak verin: s g


Yllara Gre Asgari cret ------------------------2005........ 488,70 YTL 2006........ 531,00 YTL 2007........ 585,00 YTL 2008........ 638,70 YTL 2009........ 666,00 TL 2010........ 760,50 TL

4. Aa daki karakter dizilerini farkl yntemler kullanarak birletirin ve tek bir cmle elde s g s edin:
"Ahmet" "yarn Ankaraya" "gidecek"

Sizce en kolay ve kullanl yntem hangisi? s 5. Aa daki ilemin sonucunu nce kafanzdan sonra da Pythonla hesaplayn. s g s Pythondan ald nz sonu bekledi iniz gibi de ilse nedenini bulmaya aln. g g g s
2 + 3 x 7

E er g

6. Aa daki ifadeyi trnak i areti kullanmadan ekrana kt olarak verin: s g s


Bilmezler yalnz yaamayanlar, s Nasl korku verir sessizlik insana. O.Veli

7. Aa daki de ikenleri kullanarak Depoda 10 kilo elma, 20 kilo da armut kald cmlesini s g gs elde edin:
elma = 10 armut = 20

8. Aa daki cmleleri, farkl trnak tiplerini kullanarak yazdrn: s g


Doktor Kemalin yapt aklamaya gre, "Endie edecek hibir ey yok!" g s s Pythondaki en kullanl trnak tiplerinden biri de " trnak" (""") iaretidir. s s

BLM

Python Programlarn Kaydetmek

zellikle kk kod paralar yazp bunlar denemek iin Python komut satr mkemmel bir ortamdr. Ancak kodlar o alp bymeye balaynca komut satr yetersiz gelmeye balayag s s caktr. stelik tabii ki yazd nz kodlar bir yere kaydedip saklamak isteyeceksiniz. ste burada g I metin dzenleyiciler devreye girecek. Python kodlarn yazmak iin istedi iniz herhangi bir metin dzenleyiciyi kullanabilirsiniz. Hatta g Notepad bile olur. Ancak Python kodlarn ayrt edip renklendirebilen bir metin dzenleyici ile yola kmak her bakmdan hayatnz kolaylatracaktr. s Biz bu blmde farkl iletim sistemlerinde, metin dzenleyici kullanlarak Python programs larnn nasl yazlaca n tek tek inceleyece iz. Daha nce de syledi imiz gibi, hangi iletim g g g s sistemini kullanyor olursanz olun, hem Windows hem de GNU/Linux bal altnda yazlanlar s g okumanz tavsiye ederim. Dilerseniz nce GNU/Linux ile balayalm: s

3.1 GNU/Linux Sistemi


E er kulland nz sistem GNU/Linuxta KDE masast ortam ise balang dzeyi iin Kwrite g g s veya Kate adl metin dzenleyicilerden herhangi biri yeterli olacaktr. Su aamada kullanm s kolayl ve sadeli i nedeniyle Kwrite nerilebilir. g g E er kulland nz sistem GNU/Linuxta GNOME masast ortam ise Gediti kullanabilirsiniz. g g se yeni bir Kwrite belgesi aarak balayalm. Yeni bir Kwrite belgesi amann en kolay yolu I s ALT+F2 tularna basp, kan ekranda: s
kwrite

yazmaktr. Yeni bir Gedit belgesi oluturmak iin ise ALT+F2 tularna basp: s s
gedit

komutunu veriyoruz. Bo Kwrite veya Gedit belgesi karmza geldikten sonra ilk yapmamz gereken, ilk satra: s s

27

#!/usr/bin/env python

yazmak olacaktr. Peki bu komut ne ie yaryor? s Bu komut, biraz sonra yazaca mz kodlarn birer Python kodu oldu unu ve Pythonn da sisg g temde hangi konumda yer ald n gsteriyor. Bylece sistemimiz Python nerede bulmas g gerekti ini anlyor. g GNU/Linux sistemlerinde Pythonn altrlabilir dosyas genellikle /usr/bin dizini altndadr. s Dolaysyla yukardaki satr aslnda syle de yazabilirsiniz:
#!/usr/bin/python

Bylece sisteminiz Python /usr/bin dizini altnda arayacak ve yazd nz program Pythonla g altrmas gerekti ini anlayacaktr. Ancak baz GNU/Linux sistemlerinde Pythonn altrlas g s bilir dosyas baka bir dizinin iinde de olabilir (Mesela /usr/local/bin). Bu durumda, altrlas s bilir dosya /usr/bin altnda bulunamayaca iin, baz koullarda sistem yazd nz program g s g altramayacaktr. Pythonn altrlabilir dosyasnn her sistemde ayn dizin altnda buluns s mama ihtimalinden tr yukardaki gibi sabit bir dizin ad vermek iyi bir kir olmayabilir. Bu tr sistem farkllklarna kar nlem olarak GNU/Linux sistemlerindeki env adl bir betikten s yararlanabiliriz. /usr/bin dizini altnda bulundu unu varsayabilece imiz bu env beti i Pythonn g g g sistemde hangi dizin iinde oldu unu bulmamz sa lar. Bylece yazd mz bir programn, g g g Pythonn /usr/bin dizini haricinde bir konuma kuruldu u sistemlerde altrlmas konusunda g s endie etmemize gerek kalmaz. Programmzn en bana ekledi imiz #/usr/bin/env python s s g satr sayesinde Python sistemde nereye kurulmu olursa olsun kolaylkla tespit edilebilecektir. s Uzun lafn ksas, #!/usr/bin/python yazd mzda sisteme su emri vermi oluyoruz: g s Python /usr/bin dizini iinde ara! #!/usr/bin/env python yazd mzda ise su emri: Python nereye saklandysa bul! g Neyse... Biz daha fazla teknik ayrntya dalmadan yolumuza devam edelim. Aslnda metin iine kod yazmak, Python komut satrna kod yazmaktan ok farkl de ildir. Simdi g aa da verilen satrlar Kwrite veya Gedit belgesinin iine ekleyelim: s g
#!/usr/bin/env python a = "elma" b = "armut" c = "muz" print "bir", a, "bir", b, "bir de", c, "almak istiyorum"

Bunlar yazp bitirdikten sonra sra geldi dosyamz kaydetmeye. Simdi dosyamz deneme.py adyla herhangi bir yere kaydediyoruz. Gelin biz masastne kaydedelim dosyamz. Su anda masastnde deneme.py adnda bir dosya gryor olmamz lazm. Simdi hemen bir konsol ekran ayoruz. (Ama Python komut satrn altrmyoruz.) Su komutu vererek, masastne, s yani dosyay kaydetti imiz yere geliyoruz: g
cd Desktop

Tabii burada ben sizin ev dizininde oldu unuzu varsaydm. Komut satrn ilk balatt nzda g s g iinde bulundu unuz dizin ev dizininiz olacaktr (/home/kullanici_adi). Dolaysyla yukarda g gsterdi imiz cd Desktop komutu sizi masastnn oldu u dizine gtrr. Tabii e er siz g g g komut satrn farkl bir dizin iinde amsanz tek bana yukardaki komutu vermeniz sizi s s masastne gtrmez. yle bir durumda, suna benzer bir komut vermeniz gerekir:

cd /home/kullanici_adi/Desktop

Not: Baz Trke GNU/Linux sistemlerinde masastn gsteren dizin Desktop yerine Masast adn da tayabilmektedir. yle ise tabii ki verece iniz komutta Desktop kes g limesini Masast kelimesiyle de itirmeniz gerekir. gs E er baaryla masastne gelmiseniz, yazd nz program altrmak iin su komutu verip g s s g s ENTER tuuna basn: s
python deneme.py

E er her sey yolunda gitmise su kty almamz lazm: g s


bir elma, bir armut, bir de muz almak istiyorum

GNOME kullanclar da yukarda anlatlan ilemleri takip ederek ve Kwrite yerine Gedit adl s metin dzenleyiciyi kullanarak dosyay kaydedip altrabilir. s Grd nz gibi, python deneme.py komutuyla programlarmz altrabiliyoruz. Normal g s sartlar altnda tercih edece imiz program altrma biimi de bu olacaktr. Peki, ama acaba g s Python programlarn baa python komutu eklemeden altrmann bir yolu var m? ste bus s I rada biraz nce bahsetti imiz #!/usr/bin/env python satrnn nemi ortaya kyor. g Baa python komutu getirmeden programmz altrabilmek iin ncelikle programmza s s altrma yetkisi vermemiz gerekiyor. Bunu su komut yardmyla yapyoruz: s ncelikle:
cd Desktop

komutuyla dosyay kaydetti imiz yer olan masastne geliyoruz. Bunun ardndan: g
chmod a+x deneme.py

komutuyla da deneme.py adl dosyaya altrma yetkisi veriyoruz, yani dosyay altrlabilir s s (executable) bir dosya haline getiriyoruz. Artk komut satrnda su komutu vererek programmz altrabiliriz: s
./deneme.py

Peki, tm bu ilemlerin #!/usr/bin/env python satryla ne ilgisi var? s E er bu satr metne yerletirmezsek, sistem bu beti i hangi programla altrmas gerekg s g s ti ini anlayamayaca iin ./deneme.py komutu almayacaktr. python deneme.py komug g s tunu verdi imizde, beti i Python programnn altraca anlalyor. Ancak bataki python g g s g s s ifadesini kaldrd mzda, e er beti in ilk satrnda #!/usr/bin/env python da yoksa, sistem g g g bu betikle ne yapmas gerekti ine karar veremez. g E er bu satr #!/usr/bin/python seklinde yazarsanz ve e er programnzn altrld sisg g s g temde Pythonn altrlabilir dosyas /usr/bin/ dizini altnda de ilse suna benzer bir hata ks g ts alrsnz:
bash: ./deneme.py: /usr/bin/python: bad interpreter: No such file or directory

Byle bir hata almamak iin o satr #!/usr/bin/env python seklinde yazmaya zen gsteriy oruz. Bylece Python nereye kurulmu olursa olsun sistemimiz Python tespit edebiliyor. s

Yukardaki ilemlerden sonra bu deneme.py dosyasnn isminin sonundaki .py uzantsn s kaldrp,
./deneme

komutuyla da programmz altrabiliriz. s Ya biz programmz sadece ismini yazarak altrmak istersek ne yapmamz gerekiyor? s Bunu yapabilmek iin programmzn PATH de ikeni iinde yer almas, yani Trke ifade etmek gs gerekirse, programn YOL stnde olmas gerekir. Peki, bir programn YOL stnde olmas ne demek? Bilindi i gibi, bir programn veya dosyann yolu, kabaca o programn veya dosyann iinde yer g ald dizindir. rne in fstab dosyasnn yolu /etc/fstabdr. Baka bir rnek vermek gerekirse, g g s xorg.conf dosyasnn yolu /etc/X11/xorg.conf tur. Bu yol kelimesinin bir de daha zel bir anlam bulunur. Bilgisayar dilinde, altrlabilir dosyalarn (.bin ve .sh dosyalar altrlas s bilir dosyalardr) iinde yer ald dizinlere de zel olarak YOL ad verilir ve bu anlamda kulg lanld nda yol kelimesi genellikle byk hare yazlr. g sletim sistemleri, bir program a rd mzda, sz konusu program altrabilmek iin baz I g g s zel dizinlerin iine bakar. altrlabilir dosyalar e er bu zel dizinler iinde iseler, iletim s g s sistemi bu dosyalar bulur ve altrlmalarn sa lar. Bylece biz de bu programlar do rudan s g g isimleriyle a rabiliriz. Simdi bu konuyu daha iyi anlayabilmek iin birka deneme yapalm. g Hemen bir konsol ekran ap su komutu veriyoruz:
echo $PATH

Bu komutun kts suna benzer bir sey olacaktr:


/usr/local/sbin:/usr/local/bin:/usr/sbin: /usr/bin:/sbin:/bin:/usr/games

Bu kt bize YOL de ikeni ( gs Ingilizcede PATH variable) dedi imiz seyi gsteriyor. sletim sisg I temimiz, bir program a rmak istedi imizde ncelikle yukarda ad verilen dizinlerin iini g g kontrol edecektir. E er a rd mz programn altrlabilir dosyas bu dizinlerden herhangi g g g s birinin iinde ise o program ismiyle a rabiliyoruz. g rne in; g
which gedit

komutunun ktsna bir bakalm:


/usr/bin/gedit

Grd nz gibi Gedit programnn YOLu /usr/bin/gedit. Hemen yukarda echo $PATH komug tunun ktsn kontrol ediyoruz ve gryoruz ki /usr/bin/ dizini YOL de ikenleri arasnda var. gs Dolaysyla, Gedit program YOL stndedir, diyoruz. Zaten Gedit programnn YOL stnde olmas sayesinde, konsolda sadece gedit komutunu vererek Gedit programn altrabiliyoruz. s Simdi e er biz de yazd mz program do rudan ismiyle a rabilmek istiyorsak programmz g g g g echo $PATH ktsnda verilen dizinlerden birinin iine kopyalamamz gerekiyor. Mesela programmz /usr/bin iine kopyalayalm. Tabii ki bu dizin iine bir dosya kopyalayabilmek iin root yetkilerine sahip olmalsnz. Su komut iinizi grecektir: s
sudo cp Desktop/deneme /usr/bin

Simdi konsol ekrannda:

deneme

yaznca programmzn alt n grmemiz lazm. s g Program dosyamz YOL stnde bulunan dizinlerden birine eklemek yerine, dosyamzn iinde bulundu u dizini YOLa eklemek de mmkn. Syle ki: g
PATH=$PATH:$HOME/Desktop

Bu sekilde masast dizinini YOLa eklemi olduk. s Isterseniz;


echo $PATH

komutuyla masastnzn YOL stnde grnp grnmedi ini kontrol edebilirsiniz. Bu g sayede artk masastnde bulunan altrlabilir dosyalar da kendi adlaryla a rlabileceks g ler. Ancak masastn YOLa ekledi inizde, masastnz hep YOL stnde kalmayacak, mevg cut konsol oturumu kapatlnca her sey yine eski haline dnecektir. E er herhangi bir dizini g kalc olarak YOLa eklemek isterseniz, .prole dosyanzda de iiklik yapmanz gerekir. Mesela gs masastn YOLa eklemek iin /home/kullanici_adi/.prole dosyanzn en sonuna su satr ek lemelisiniz:
export PATH=$PATH:$HOME/Desktop

Yoruldunuz mu? Yoksa skldnz m? Bence ne yorulun, ne de skln... nk bu blmde verdi imiz bilgiler, Pythonla bir program yazp bu program, kulland nz da tmn KDE veya g g g GNOME mensne eklemek istedi inizde iinize ok yarayacaktr. E er GNU/Linux altnda herg s g hangi bir programlama faaliyetinde bulunmak istiyorsanz yukarda verdi imiz bilgileri zmseg meniz gerekir. Gelelim Windows kullanclarna...

3.2 Windows Sistemi


Windows kullanclar IDLE adl metin dzenleyici ile alabilirler. s IDLEa ulamak iin s Balat/Programlar/Python/IDLE (Python GUI) yolunu takip ediyoruz. IDLE ilk balatld nda s s g syle bir grnme sahip olacaktr:

Burada grd mz >>> iaretinden de anlayabilece imiz gibi, bu ekran aslnda Pythonn g s g etkileimli kabu unun ta kendisidir... Dilerseniz, etkileimli kabukta yapaca nz ilemleri bu s g s g s ekranda da yapabilirsiniz. Ama su anda bizim amacmz etkileimli kabukla oynamak de il. Biz s g Python programlarmz yazabilece imiz bir metin dzenleyici aryoruz. g Burada File mens iindeki New Window d mesine tklayarak aa daki ekrana ulayoruz: g s g s

ste Python kodlarn yazaca mz yer buras. Simdi bu bo sayfaya su kodlar ekliyoruz: I g s
a = "elma" b = "armut" c = "muz" print "bir", a, "bir", b, "bir de", c, "almak istiyorum"

Kodlarmz yazdktan sonra yapmamz gereken sey dosyay bir yere kaydetmek olacaktr. Bunun iin File/Save as yolunu takip ederek dosyay deneme.py adyla masastne kaydediyoruz. Dosyay kaydettikten sonra Run/Run Module yolunu takip ederek veya do rudan F5 g tuuna basarak yazd mz program altrabiliriz. Bu durumda syle bir grnt elde ederiz: s g s

E er programnz do rudan komut satrn kullanarak altrmak isterseniz su ilemleri yapn: g g s s 1. Balat/altr yolunu takip edip, alan pencereye cmd yazn ve ENTER tuuna basn. s s s 2. Su komutu vererek, masastne, yani dosyay kaydetti iniz yere gelin: g
cd Desktop

Windowsta komut satr ilk ald nda C:\Documents and Settings\kullanici_adi gibi bir dizinin g iinde olacaksnz. Dolaysyla yukarda gsterdi imiz cd Desktop komutu sizi masastnn g oldu u dizine gtrecektir. Tabii e er siz komut satrn farkl bir dizin iinde amsanz tek g g s bana yukardaki komutu vermeniz sizi masastne gtrmez. yle bir durumda suna benzer s bir komut vermeniz gerekir:
cd C:/Documents and Settings/Kullanici_adi/Desktop

Masastne geldikten sonra su komutu vererek programnz altrabilirsiniz: s


python deneme.py

Tabii ben burada sizin daha nce anlatt mz sekilde Python YOLa ekledi inizi varsayg g dm. E er Python YOLa eklemediyseniz programnz altrmak iin su yntemi de kullang s abilirsiniz:
c:/python26/python deneme.py

E er her sey yolunda gitmise su kty almamz lazm: g s


bir elma bir armut bir de muz almak istiyorum

Grd nz gibi gayet basit. g Bu arada birka defadr YOL diye bir seyden sz ediyoruz. Hatta geen blmde Python nasl YOLa ekleyece imizi de rendik. Peki ama nedir bu YOL denen sey? Dilerseniz biraz g g bu konuyu inceleyelim. Zira ileride bir Python program yazp bu program kullanclarnza sunmak istedi inizde bu bilgiler ok iinize yarayacak: g s

Bir programn veya dosyann yolu, kabaca o programn veya dosyann iinde yer ald dizindir. g rne in Internet Explorer programnn yolu C:\Program Files\Internet Explorer\iexplore.exedir. g Dolaysyla su komutu vererek IEyi komut satrndan balatabilirsiniz: s
"C:\Program Files\Internet Explorer\iexplore.exe"

Baka s bir rnek vermek gerekirse, hosts dosyasnn yolu C:\WINDOWS\system32\drivers\etc\hoststur. Dolaysyla bu dosyann ieri ini grntleg mek iin su komutu verebilirsiniz:
notepad "C:\WINDOWS\system32\drivers\etc\hosts"

Pythonn yolu ise C:\Python26\python.exedir. Dolaysyla Python altrmak iin su komutu s verebiliyoruz:
C:\Python26\python.exe

Bu yol kelimesinin bir de daha zel bir anlam bulunur. Bilgisayar dilinde, altrlabilir s dosyalarn (.exe dosyalar altrlabilir dosyalardr) iinde yer ald dizinlere de zel olarak s g YOL ad verilir ve bu anlamda kullanld nda yol kelimesi genellikle byk hare yazlr. g sletim sistemleri, bir program a rd mzda, sz konusu program altrabilmek iin baz I g g s zel dizinlerin iine bakar. altrlabilir dosyalar e er bu zel dizinler iinde iseler, iletim s g s sistemi bu dosyalar bulur ve altrlmalarn sa lar. Bylece biz de bu programlar do rudan s g g isimleriyle a rabiliriz. Simdi bu konuyu daha iyi anlayabilmek iin birka deneme yapalm. g Balat/altr yolunu takip edip, alan pencerede cmd komutunu vererek MS-DOSu balatalm s s s ve orada syle bir komut yazalm:
echo %PATH%

Bu komutun kts suna benzer bir sey olacaktr:


C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;

Bu kt bize YOL de ikeni ( gs Ingilizcede PATH variable) dedi imiz seyi gsteriyor. sletim sisg I temimiz, bir program a rmak istedi imizde ncelikle yukarda ad verilen dizinlerin iini g g kontrol edecektir. E er a rd mz programn altrlabilir dosyas bu dizinlerden herhangi g g g s birinin iinde ise o program ismiyle a rabiliyoruz. g Not: YOL dizinlerinin birbirlerinden noktal virgl ile ayrld na dikkat edin! Dolaysyla, YOLa g yeni bir dizin eklemek isterseniz, sizin de bu dizini nceki dizinden noktal virgl ile ayrmanz gerekir. rne in notepad.exe C:\Windows dizini altnda bulunan bir programdr. Bu dizin, YOL g stnde yer ald iin, Notepad programn do rudan ismiyle a rabiliriz. Komut satrnda g g g notepad komutunu vererek bunu kendiniz de test edebilirsiniz. Ayn sekilde calc.exe de C:\Windows\System32 klasr altnda bulunan bir programdr. Bu klasr de YOL stnde oldu u iin, Calc programn do rudan ismiyle a rabiliyoruz... g g g Simdi e er biz de yazd mz program do rudan ismiyle a rabilmek istiyorsak programmz g g g g echo %PATH% ktsnda verilen dizinlerden birinin iine kopyalamamz gerekiyor. Mesela programmz C:\Windows dizini iine kopyalayalm. Simdi komut satrnda:
deneme.py

yaznca programmzn alt n grmemiz lazm. s g

Program dosyamz YOL stnde bulunan dizinlerden birine eklemek yerine, dosyamzn iinde bulundu u dizini YOLa eklemek de mmkn. Bunun iin MS-DOSta syle bir komut vermemiz g gerekiyor:
PATH=%PATH%;%USERPROFILE%\Desktop

Bu sekilde masast dizinini YOLa eklemi olduk. s Isterseniz;


echo %PATH%

komutuyla masastnzn YOL stnde grnp grnmedi ini kontrol edebilirsiniz. Bu g sayede artk masastnde bulunan altrlabilir dosyalar da kendi adlaryla a rlabilecekler. s g Ancak masastn YOLa ekledi inizde, masastnz hep YOL stnde kalmayacak, mevcut g MS-DOS oturumu kapatlnca her sey yine eski haline dnecektir. E er masast dizinini kalc g olarak YOLa eklemek isterseniz, daha nce gsterdi imiz sekilde, bu dizini Sistem De ikeng gs leri iindeki PATH listesine yazmanz gerekir. Burada hemen syle bir soru akla geliyor: Notepad ve Calc gibi programlar, hi .exe uzan tsn belirtmeden do rudan isimleriyle a rabildik. Ama mesela deneme.py adl programmz g g altrabilmek iin .py uzantsn da belirtmemiz gerekti. Peki bu durumun nedeni nedir? s Windowsta PATHEXT adl zel bir de iken vardr. Bu de iken, sistemin altrlabilir kabul gs gs s etti i uzantlar tutar. Su komutu verelim: g
echo %PATHEXT%

Buradan su kty alyoruz:


.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH

Windowsta e er bir program yukarda grlen uzantlardan birine sahipse altrlabilir olarak g s kabul edilecektir. Grd nz gibi, .exe de bu uzantlardan biri. Dolaysyla bu uzantya sahip g bir dosyay, uzantsn belirtmeden de a rabiliyoruz. E er isterseniz bu listeye .py uzantsn g g da ekleyebilirsiniz. Bunun iin su ilemleri yapabilirsiniz: s 1. Denetim Masasnda Sistem simgesine ift tklayn. 2. Gelimi sekmesine girin ve Ortam De ikenleri d mesine basn. s s gs g 3. Sistem De ikenleri blmnde PATHEXT esini bulup buna ift tklayn. gs g 4. En son girdi olan .WSHden sonra ;.PY girdisini ekleyin. 5. TAMAMa basp kn. Bylece artk .py uzantl dosyalar da, uzant belirtmeden altrabilirsiniz... s Simdiye kadar bir Python programn nasl yazaca mz ve IDLE ya da MS-DOSu kullanarak bu g program nasl altraca mz rendik. Peki yazd mz bir program ift tklayarak altras g g g s maz myz? Elbette altrabiliriz. s Python Windowsa kurulurken kendini kt e (Registry) kaydeder. Dolaysyla Windows Python g programlarn nasl altrmas gerekti ini bilir. Hatta bu sayede Windows zerinde yazd mz s g g Python programlarn, programn bulundugu dizin iinde sadece ismini kullanarak altrs mamz da mmkndr. Yani yazd mz program masastne kaydetti imizi varsayarsak ve g g su komutla da masastne geldi imizi dnrsek: g s
cd C:/Documents and Settings/Kullanici_adi/Desktop

Masastne geldikten sonra su komutu vererek programnz altrma imkanna sahibiz: s

deneme.py

Ancak bu komutun ie yarayabilmesi iin, MS-DOSta o anda programn bulundu u dizin s g iinde olmamz gerek. Yani e er programnz Belgelerim dizini iinde ise ve siz de MS-DOSta g C:/Documents and Settings/Kullanici_adi/Desktop dizini altndaysanz bu komut bir ie yaras mayacaktr. Yazd nz program konum farketmeksizin her yerden a rabilmek istiyorsanz, g g programnz biraz nce anlatt mz sekilde YOLa eklemelisiniz... Neyse... Biz simdi tekrar g konumuza dnelim. Ne diyorduk? Evet, yazd mz programlar ift tklayarak altramaz myz? Tabii ki altrag s s biliriz. Python Windowsa kurulurken kendini kt e kaydetti i iin, yazd mz .py uzang g g tl dosyaya ift tklad mzda programmz alacaktr. Ancak burada syle bir problem g s var. Dosyamza ift tklad mzda programmz alr almasna, ama bu ilem o kadar g s s s hzl olup biter ki, biz sadece arkada son hzla siyah bir komut satrnn alp kapand n g grrz... Aslnda programmz alyor, ama ok hzl bir sekilde alp sona erdi i iin biz s s g programmzn alt n gremiyoruz. Programmzn alt n grebilmemiz iin o siyah kos g s g mut satrnn kapanmasna engel olmamz gerekir. Bunu da, programmzn en son satrna su ilaveyi yaparak hallediyoruz:
raw_input()

Yani kodlarmz syle grnmeli:


a = "elma" b = "armut" c = "muz" print "bir", a, "bir", b, "bir de", c, "almak istiyorum" raw_input()

Son satra ekledi imiz bu raw_input() ifadesinin ne oldu unu ve tam olarak ne ie yarad n g g s g birka blm sonra inceleyece iz. Simdilik siz sadece bu satrn, MS-DOSun kapanmasn eng gelledi ini bilin. Bu komut sayesinde MS-DOS siz ENTER tuuna basana kadar ak kalacaktr... g s Ancak bu noktada ok nemli bir uyar yapmamz gerekiyor. Pythonla bir program gelitirirken, programlarnz altrmak iin asla bu ift tklama yntemini kullanmayn. Pros s gramlarnz her zaman komut satrndan altrn. Bylece, e er programnzda bir hata varsa, s g bu hatann nereden kaynakland n anlayabilirsiniz. Ama e er programnz ift tklayarak g g altrrsanz hatay grme sansnz olmaz. Buna bir rnek verelim. s Diyelim ki bir genin alann hesaplayan bir program yazacaksnz. Bir genin alan forml sudur:
alan = taban x (yukseklik / 2)

Kodlarmz syle olmal:


yukseklik = 4 taban = 6 alan = taban * (yukseklik / 2) print alan

Burada yapt mz sey su: g 1. ncelikle yukseklik adl bir de iken tanmladk. Bu de ikenin de eri 4 gs gs g

2. Ardndan taban adl baka bir de iken daha tanmladk. Bu de ikenin de eri ise 6 s gs gs g 3. genin alann hesaplamamz sa layan formlmz yazyoruz: g (yukseklik / 2) alan = taban *

4. Son olarak da alan adl de ikenin de erini print komutu yardmyla ekrana kt olarak gs g veriyoruz. 5. Bu program altrd mzda alaca mz sonu 12 olacaktr... s g g Simdi syle bir dnn. Diyelim ki biz bu program yazarken ufak bir hata yaptk ve syle bir s sey kardk ortaya:
yukseklik = 4 taban = 6 ala = taban * (yukseklik / 2) print alan

E er bu program ift tklayarak altrrsanz, programdaki hatann nereden kaynakland n g s g anlayamazsnz. nk MS-DOS ekran son hzla alp kapanacaktr. stelik son satra raw_input() eklemeniz de hi bir ie yaramaz. Bu satr sadece hatasz programlarn ift tks lanarak almasn sa lar. nk Python kodlar yukardan aa ya do ru okur. Bir hatayla s g s g g karlat nda da kodlarn geri kalann okumadan programdan kar. Dolaysyla, raw_input() s s g satrndan nce bir hata varsa, Python bu satra ulaamadan program kapatacak, bu sebeple s MS-DOS satrnn kapanmasn nleyen kod hibir zaman almam olacaktr... s s Ama e er ayn program komut satrndan altrmay denerseniz hatann nereden kayg s nakland konusunda bir kir edinebilirsiniz. Bu program syle bir hata verecektir: g
Traceback (most recent call last): File "deneme.py", line 6, in <module> print alan NameError: name alan is not defined

Bu hata bize, alan diye bir seyin tanmlanmad n sylyor. Kodlarmza dikkatli baknca g gryoruz ki, hakikaten alan diye bir de iken tanmlamamz. nk formlde alan yazags s ca mza yanllkla ala yazmz! g s s Bylece bir blm daha bitirmi olduk. Yalnz bu noktada su hatrlatmay yapmadan gemeyes lim. Yukarda verdi imiz bilgiler son derece nemlidir. Sadece Pythonla de il, hangi dille prog g gramlama yapyor olursanz olun, yukarda anlatt mz seyleri zmsemi olmalsnz. bir g s Iyi programc, zerinde program gelitirece i iletim sistemini yakndan tanmaldr. s g s

3.3 Trke Karakter Kullanm


Simdiye dek Python hakknda epey bilgi edindik. Dilerseniz elimizi altrmak iin santigrat s fahrenhayta eviren bir betik yazalm ve neler oldu una bakalm: g
santigrat = 22 fahrenhayt = santigrat * (9.0/5.0) + 32 print "%s santigrat derece %s fahrenhayta \ karlk gelir." %(santigrat, fahrenhayt) s

Bu program altrd nzda biraz hayal krkl na u ram olabilirsiniz. nk yukardaki s g g g s kodlar suna benzer bir hata mesaj almanza sebep olacaktr:
File "deneme.py", line 6 SyntaxError: Non-ASCII character \xc5 in file deneme.py on line 6, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

Bu hata mesajn almamzn nedeni, programmz iinde kulland mz , s gibi Trke karakg terler. Python yazd mz kodlar iindeki bu Trke karakterler nedeniyle bize bu hata mesajn g gsterecektir. Byle bir hata mesaj almamak iin kodlarmzn arasna su satr eklememiz gerekir:
# -*- coding: utf-8 -*-

Windows kullanclar ise utf-8 yerine cp1254 adl karakter kodlamasn kullanmay tercih edebilir:
# -*- coding: cp1254 -*-

Bylelikle kulland mz karakter tipini Pythona tantm oluyoruz. g s Ilerde ascii, unicode ve Python konusunu ilerken Pythonn Trke karakterlere neden byle davrand n inceleyes g ce iz. Ama siz simdilik bu konuyu ok fazla dert edinmeyin. g Programmzn en son hali syle olacak:
# -*- coding: utf-8 -*santigrat = 22 fahrenhayt = santigrat * (9.0/5.0) + 32 print "%s santigrat derece %s fahrenhayta \ karlk gelir." %(santigrat, fahrenhayt) s

Grd nz gibi bu defa programmz Trke karakterleri dzgn bir sekilde gsterebildi. Bu g arada isterseniz yukardaki kodlar biraz inceleyelim: Burada ncelikle # -*- coding: utf-8 -*- satrn yazdk. Bu satr sayesinde kullanaca mz kodlama biimini Pythona tantm olduk. Bylece kodlarmz iinde Trke karakg s ter kullanabilece iz. Bu satrn Windowsta -*- coding: cp1254 -*- biimini alaca n biliyg g orsunuz. Ardndan santigrat adl bir de iken tanmladk ve bu de ikenin de erini 22 olarak belirledik. gs gs g Daha sonra da fahrenhayt santigrata evirebilmek iin gereken formlmz yazdk. Formlde 9/5 yerine 9.0/5.0 yazd mza dikkat edin. Bylece 9 saysn 5 saysna hassas bir g sekilde blebilmi olduk. Aksi halde formlmz sonucu hatal hesaplayacaktr. s Son olarak da 22 santigrat derecenin ka fahrenhayta karlk geldi ini dzgn bir cmle s g halinde kullancya gsterdik. Burada karakter dizisini nasl biimlendirdi imize dikkat edin. g IDLE zerinde alan Windows kullanclar bu program # -*- coding: cp1254 -*- satrn s yazmadan kaydetmeye altklarnda syle bir uyar penceresiyle karlaacaklar: s s s

IDLE, karakter kodlamasn belirtmeniz konusunda sizi uyaryor. E er burada Edit My File g d mesine basacak olursanz, IDLE programnzn ilk satrna sizin yerinize # -*- coding: g cp1254 -*- komutunu ekleyecektir... Yukardaki kodlarda dikkat etmemiz gereken baka bir nokta da kodlar nasl bld mzdr. s g Daha nceki derslerimizde de bahsetti imiz gibi Pythonda kodlarn grnm de nem tar. g s Kodlarn irkin bir sekilde sa a do ru uzamasn engellemek amacyla \ ka dizisini kulla g g s narak kodlarmz alt satra kaydrdk. E er arzu ederseniz, yukardaki kodlar su sekilde de g blebilirsiniz:
# -*- coding: cp1254 -*santigrat = 22 fahrenhayt = santigrat * (9.0/5.0) + 32 print ("%s santigrat derece %s fahrenhayta karlk gelir." s %(santigrat, fahrenhayt))

Burada kulland mz blme biimine ok dikkat edin. Burada karakter dizisinin tamamn g parantez iine aldk:
print ("%s santigrat derece %s fahrenhayta karlk gelir." s %(santigrat, fahrenhayt))

Yalnz bu yntemi, bir karakter dizisini ortadan blmek iin kullanamazsnz. Bu yntemi kullanabilmeniz iin %s iaretlerinin kullanld bir kodla kar karya olmanz ve satr % s g s s iaretinden blmeniz gerekir. Yani su kullanmlar yanltr: s s
print ("Ben ok uzun bir karakter dizisiyim. O yzden iki satra blnmem gerekir.")

veya:
print ("%s santigrat derece %s fahrenhayta karlk gelir."%(santigrat, fahrenhayt)) s

Python satr blme konusunda pek ok alternatif sunar. Hatta syle bir sey dahi yapmanza izin verir. Dikkatlice inceleyin:
print ("Ben ok uzun bir karakter dizisiyim. O yzden" " iki satra blnmem gerekir.")

ya da:
print ("%s santigrat derece %s fahrenhayta" " karlk gelir."%(santigrat, fahrenhayt)) s

Aslnda su son iki yntemi biliyor olmanz lazm. Hatrlarsanz ilk derslerimizde karakter dizilerini birletirmeyi renirken syle bir rnek vermitik: s g s
>>> print "Istanbul " "eliktepe"

Yukardaki rne in de bundan hibir fark yoktur. Biz simdiki rne imizde alt satra geti imiz g g g iin btn karakter dizilerini parantez iine aldk, o kadar... Yani nceki derste grd mz g rne i iki satra blmek isteseydik syle bir kod yazacaktk: g
>>> print ("Istanbul " ... "eliktepe")

Bu yntemlerden herhangi birini tercih edebilirsiniz. Ama etrafta grece iniz programlarda g hepsiyle karlama ihtimaliniz var... s s

3.4 MS-DOSta Trke Karakter Problemi


Yukarda kodlama biimi belirterek Trke karakterleri nasl gsterece imizi inceledik. Trke g karakterlerin problem kard bir baka ortam da MS-DOStur. Windowsun komut satr g s Trke karakterleri dzgn gstermekte zorlanabiliyor... Bu blmde bu sorunu nasl aabiles ce imizi inceleyece iz. g g Mesela su kodlar deneme.py adl bir dosyaya kaydetti imizi varsayalm: g
# -*- coding: cp1254 -*santigrat = 22 fahrenhayt = santigrat * (9.0/5.0) + 32 print ("%s santigrat derece %s fahrenhayta karlk gelir." s %(santigrat, fahrenhayt))

Bu dosyay MS-DOSta python deneme.py komutunu vererek altrmak istedi imizde syle s g bir kt alyoruz:
22 santigrat derece 71.6 fahrenhayta kar?lk gelir.

Grd nz gibi btn Trke karakterler birbirine girmi durumda. Bunun temel sebebi Wing s dowsta komut satrnn ntanml yaz tipinin Trke karakterleri dzgn gsterememesi. Bu durumu dzeltmek iin su admlar takip ediyoruz:
nce MS-DOS ekrann ayoruz. Ardndan su komutu veriyoruz:
chcp 1254

Daha sonra pencere bal na sa tklayp zelliklere giriyoruz. s g g Yaz Tipi sekmesi iinde yaz tipini Lucida console olarak de itiriyoruz. gs Tamama basyoruz. Karmza kan pencerede, zellikleri, ayn balkla ileride oluturulacak pencereler iin s s s kaydet seene ini iaretliyoruz. g s

Simdi en bata verdi imiz kodlar altrd mzda su kty alyoruz: s g s g

22 santigrat derece 71.6 fahrenhayta karlk gelir. s

Bylece ok nemli bir konuyu daha geride brakm olduk. stelik bu noktaya kadar Pythonla s ilgili epey bilgi de edindik. Dilerseniz simdi blm sorularmza bir gz atalm ve ondan sonra yeni ve yine ok nemli bir konuya geelim.

3.5 Blm Sorular


1. Komut satrnda masastnn bulundu u konuma gelebilmek iin hangi komutu kullang manz gerekiyor? 2. E er Windows kullanyorsanz C:\Program Files dizini altnda, GNU/Linux kullanyorsanz g /usr/bin dizini altnda bir komut ekran an. 3. E er Windows kullanyorsanz, nce http://www.videolan.org/vlc/ adresini ziyaret edin ve g oradan VLC adl program indirin. Simdi indirdi iniz bu program normal bir sekilde kurun. g Ardndan, bilgisayarnzda VLC klasrn bulup, bu klasr iindeki vlc.exeyi YOLa (PATH) ekleyin. Son olarak, vlc komutu ile program MS-DOStan altrn. s 4. Hem Windowsta hem de GNU/Linuxta su beti i herhangi bir konumdan sadece ismi ile g a rlabilecek hale getirin. Yani beti e hesaplayici.py adn verdi inizi varsayarsak, komut g g g satrndan sadece hesaplayici komutu girilerek programnz altrlabilmeli: s
yukseklik = 4 taban = 6 alan = taban * (yukseklik / 2) print alan

5. E er Windows kullanyorsanz, 4. soruda yazd nz Python programnn ift tklamayla g g almasn sa layn. s g 6. Aa daki bilgileri kullanarak bir Python program yazn. Buradaki uzun karakter dizisini s g yazdrrken, farkl yntemler kullanarak karakter dizisini uygun yerinden blmeye dikkat edin:
maa: 3500 TL, nvan: Gelitirme Uzman, s Is s alt sre: 5 s g "Ahmet Bey ... TL maala alan bir ...dr. s s Kendisi ... yldr bu grevde bulunmaktadr."

7. E er GNU/Linux kullanyorsanz, yazd nz bir Python programnn ilk satrna g g #!/usr/bin/env python yerine farkl bir sey yazn. Mesela sunu:
#!/usr/python

Simdi bu program chmod komutuyla altrlabilir hale getirin ve program adyla a rmay s g deneyin. Ne tr bir hata mesaj alyorsunuz? Ayn program bir de #!/usr/bin/env python gibi bir satr yazmadan altrmay deneyin. Bu s defa nasl bir hata mesaj alyorsunuz? Sizce bu hata mesajlarn almanzn sebebi nedir?

BLM

Kullancyla leti im: Veri I s Al -Veri i s s

Bu blmde de Pythondaki nemli konulara de inmeye devam ediyoruz. Bu defaki konumuz g kullancyla iletiim. s Dikkat ettiyseniz, simdiye dek sadece tek ynl bir programlama faaliyeti iinde bulunduk. Yani yazd mz kodlar kullancyla herhangi bir etkileim iermiyordu. Ama artk, Pythonda g s baz temel seyleri rendi imize gre, kullancyla nasl iletiim kurabilece imizi de ren g g s g g memizin vakti geldi. Bu blmde kullanclarmzla nasl veri al-veriinde bulunaca mz s s g grece iz. g Hatrlarsanz geen blmde syle bir rnek vermitik: s
#!/usr/bin/env python # -*- coding: utf-8 -*santigrat = 22 fahrenhayt = santigrat * (9.0/5.0) + 32 print ("%s santigrat derece %s fahrenhayta karlk gelir." s %(santigrat, fahrenhayt))

Dikkat ederseniz burada santigrat de ikenini kendimiz kod iinde elle belirledik. Dolaysyla gs formle giren btn saylar zaten belli oldu u iin bu kodlarn nasl bir kt verece ini de g g biliyoruz. Byle bir kod yazmnn ne kadar skc oldu u ortada... Bu santigrat de ikenini g gs kendimiz elle yazmak yerine, kullancya sorabilsek ve kullancnn girdi i miktara gre g hesaplama yapabilsek ne gzel olurdu, de il mi? Bylece her defasnda farkl bir de er alp g g bunu hesaplayabilen esnek bir programmz olurdu. ste bu blmde byle bir program nasl I yazabilece imizi renece iz. g g g Pythonda kullancdan birtakm veriler alabilmek, yani kullancyla iletiime geebilmek iin iki s tane fonksiyondan faydalanlr: raw_input() ve input() (Bu fonksiyon kelimesine taklmayn. Birka blm sonra fonksiyonun ne demek oldu unu inceleyece iz.) Bu iki fonksiyon birbirg g lerinden baz farkllklar gsterir. Bunlardan ncelikle ilkine bakalm.

43

4.1 raw_input() fonksiyonu


raw_input() fonksiyonu kullanclarmzn klavye aracl yla girdi i verileri almamz sa lar. g g g Isterseniz bu fonksiyonu tarif etmeye almak yerine hemen bununla ilgili bir rnek verelim. s ncelikle bo bir Kwrite (veya Gedit ya da IDLE) belgesi aalm. Her zaman yapt mz gibi, ilk s g satrmz ekleyelim belgeye:
#!/usr/bin/env python

Not: Bu satr sadece GNU/Linux kullanclarn ilgilendirir. Windows kullanclar bu satr yazmasalar da olur. Bu satrn Windowsta hibir etkisi yoktur. Simdi raw_input() fonksiyonuyla kullancdan baz bilgiler alaca z. g parola sorup kendisine teekkr edelim... s
#!/usr/bin/env python # -*- coding: utf-8 -*raw_input("Ltfen parolanz girin:") print "Teekkrler!" s

Mesela kullancya bir

raw_input() fonksiyonunu nasl kulland mza ok dikkat edin. Parantez iinde yazd mz g g karakter dizisi, kullancdan ne bekledi imizi gstermemizi sa lyor. Buna gre biz bu kodlarla g g kullancdan parolasn girmesini isteyece iz. g Simdi bu belgeyi deneme.py ismiyle kaydediyoruz. Daha sonra bir konsol ekran ap, pro grammzn kaytl oldu u dizine geerek su komutla programmz altryoruz: g s
python deneme.py

Elbette siz isterseniz daha nce anlatt mz sekilde dosyaya altrma yetkisi vererek ve g s gerekli dzenlemeleri yaparak programnz do rudan ismiyle de a rabilirsiniz. Bu sizin terg g cihinize kalm. s Program alt nda, kullanc Ltfen parolanz girin: cmlesini grecek ve bylece kens g disinden ne beklendi ini anlayacak. Elbette raw_input() fonksiyonundaki parantezi bo da g s brakabilirsiniz. Ancak o u zaman, parantez iine aklayc bir seyler yazmak isteyeceksiniz. g nk aksi halde programnz alt nda kullancnz ne yapmas gerekti ini anlayamayacaks g g tr. Windows kullanclar esasnda bu fonksiyonu nceki derslerimizden hatrlayacaktr. Bu fonksiyonu Windowsta ift tklayarak altrmak istedi imiz programlarda MS-DOS ekrannn program s g sonunda kapanmasn nlemek iin kullanmtk. O rnekte gsterdi imiz program su sekilde s g yazarsak herhalde raw_input() fonksiyonunun oradaki grevi daha belirgin bir sekilde ortaya kacaktr:
# -*- coding: cp1254 -*a = "elma" b = "armut" c = "muz" print "bir", a, "bir", b, "bir de", c, "almak istiyorum" raw_input("Programdan kmak iin ENTER tuuna basn.") s

Biz o dersteki rnekte parantez iini bo brakmtk... s s Dilerseniz biraz nce yazd mz parola soran program biraz gelitirelim. Mesela programmz g s su ilemleri yapsn: s 1. Program ilk altrld nda kullancya parola sorsun, s g 2. Kullanc parolasn girdikten sonra programmz kullancya teekkr etsin, s 3. Bir sonraki satrda kullanc tarafndan girilen bu parola ekrana yazdrlsn, 4. Kullanc daha sonraki satrda parolann yanl oldu u konusunda uyarlsn. s g Simdi kodlarmz yazmaya balayabiliriz. ncelikle yazaca mz kodlardan ba msz olarak s g g girmemiz gereken bilgileri ekleyelim:
#!/usr/bin/env python # -*- coding: utf-8 -*-

Simdi raw_input() fonksiyonuyla kullancya parolasn soraca z. Ama isterseniz bu raw_input() g fonksiyonunu bir de ikene atayalm: gs
parola = raw_input("Parolanz girin:")

Simdi kullancya teekkr ediyoruz: s


print "Teekkrler!" s

Kullanc tarafndan girilen parolay ekrana yazdrmak iin su satr ekliyoruz:


print parola

Biraz nce raw_input() fonksiyonunu neden bir de ikene atad mz anladnz sanrm. Bu gs g sayede do rudan parola de ikenini a rarak kullancnn yazd parolay ekrana dkebiliyg gs g g oruz. Simdi de kullancya parolasnn yanl oldu unu bildirece iz: s g g
print "Ne yazk ki doru parola bu deil" g g

Programmzn son hali syle olacak:


#!/usr/bin/env python # -*- coding: utf-8 -*parola = raw_input("Parolanz girin:") print "Teekkrler!" s print parola print "Ne yazk ki doru parola bu deil." g g

Isterseniz son satrda su de iikli i yapabiliriz: gs g


print "Ne yazk ki doru parola", parola, "deil." g g

Bylelikle, parola de ikenini, yani kullancnn yazd parolay cmlemizin iine (ya da gs g Pythonca ifade etmek gerekirse: karakter dizisi iine) eklemi olduk. s Bu parola de ikenini karakter dizisi iine eklemenin baka bir yolu da kodu su sekilde yazgs s maktr:

print "Ne yazk ki doru parola %s deil" %(parola) g g

Bu sayede kullancnn girdi i parolay istedi iniz gibi biimlendirebilirsiniz. Mesela kullancdan g g gelen parolay trnak iine alarak cmle iinde daha belirgin durmasn sa layabilirsiniz: g
print "Ne yazk ki doru parola %s deil" %(parola) g g

Simdi raw_input() fonksiyonuna bir ara verip, kullancdan bilgi almak iin kullanabilece imiz g ikinci fonksiyondan biraz bahsedelim. Az sonra raw_input() fonksiyonuna geri dnece iz. g

4.2 input() fonksiyonu


Tpk raw_input() fonksiyonunda oldu u gibi, input() fonksiyonuyla da kullanclardan baz bilg gileri alabiliyoruz. Su basit rne e bir bakalm: g
#!/usr/bin/env python # -*- coding: utf-8 -*a = input("Ltfen bir say girin:") b = input("Ltfen baka bir say daha girin:") s print a + b

Kullanm asndan, grld gibi, raw_input() ve input() fonksiyonlar birbirlerine ok beng zer. Ama bunlarn arasnda ok nemli bir fark vardr. Hemen yukarda verilen kodlar bir de raw_input() fonksiyonuyla yazmay denersek bu fark ok ak bir sekilde ortaya kacaktr:
#!/usr/bin/env python # -*- coding: utf-8 -*a = raw_input("Ltfen bir say girin:") b = raw_input("Ltfen baka bir say daha girin:") s print a + b

Bu kodlar yazarken input() fonksiyonunu kullanrsak, kullanc tarafndan girilen saylar birbirleriyle toplanacaktr. Diyelim ki ilk girilen say 25, ikinci say ise 40 olsun. Programn sonunda elde edece imiz say 65 olacaktr. g Ancak bu kodlar yazarken e er raw_input() fonksiyonunu kullanrsak, girilen saylar birbirg leriyle toplanmayacak, sadece yan yana yazlacaklardr. Yani elde edece imiz sey 2540 olag caktr. Hatrlarsanz buna benzer bir seyle saylar konusunu ilerken de karlamtk. O zaman su s s s s rnekleri vermitik: s
>>> print 25 + 50 75 >>> print "25" + "50" 2550

ste raw_input() ile input() arasndaki fark, yukardaki iki rnek arasndaki farka benzer. YukarI daki rneklerde, Pythonn saylara ve karakter dizilerine nasl davrand n gryoruz. E er g g

Python iki adet sayyla karlarsa bu saylar birbiriyle topluyor. Ama e er iki adet karakter s s g dizisiyle karlarsa, bu karakter dizilerini yanyana yazmakla yetiniyor... s s Btn bu aklamalardan anlyoruz ki raw_input() fonksiyonu kullancnn girdi i verileri karakg ter dizisine dntryor. Bu durumu daha net grebilmek iin dilerseniz syle bir rnek veres lim:
#!/usr/bin/env python # -*- coding: utf-8 -*sayi = raw_input("Bir say girin. Ben size o \ saynn karesini syleyeyim:\n") print "girdiiniz say\t\t: %s" %(sayi) g print "girdiiniz saynn karesi: %s" % (sayi * sayi) g

Bu kodlar altrd nzda sayy girip ENTER tuuna bastktan sonra syle bir hata mesaj s g s alacaksnz:
File "deneme.py", line 8, in <module> print "girdiiniz saynn karesi: %s" % (sayi * sayi) g TypeError: cant multiply sequence by non-int of type str

Bu durum, raw_input() fonksiyonunun kullanc verilerini karakter dizisi olarak almasndan kaynaklanyor. Karakter dizileri ile aritmetik ilem yaplamayaca iin de hata vermekten s g baka aresi kalmyor. Burada tam olarak ne dnd n anlayabilmek iin etkileimli kabukta s g s verdi imiz su rneklere bakalabilirsiniz: g
>>> a = "12" >>> b = "12" >>> print a * b TypeError: cant multiply sequence by non-int of type str

Grd nz gibi biraz ncekiyle ayn hatay aldk. karakter dizisini birbiriyle arpamaz, g Iki blemez ve bu karakter dizilerini birbirinden karamazsnz. nk aritmetik ilemler ancak s saylar arasnda olur. Karakter dizileri ile aritmetik ilem yaplmaz... Yukardaki rneklerin s dzgn kt verebilmesi iin o rnekleri syle yazmamz gerekir:
>>> a = 12 >>> b = 12 >>> print a * b 144

Dolaysyla, yukarda hata veren kodlarmzn da dzgn alabilmesi iin o kodlar syle yazs mamz gerek:
#!/usr/bin/env python # -*- coding: utf-8 -*sayi = input("Bir say girin. Ben size o \ saynn karesini syleyeyim:\n") print "girdiiniz say\t\t: %s" %(sayi) g print "girdiiniz saynn karesi: %s" % (sayi * sayi) g

raw_input() fonksiyonundan farkl olarak input() fonksiyonu kullancdan gelen verileri oldu u g gibi alr. Yani bu verileri karakter dizisine dntrmez. Bu yzden, e er kullanc bir say s g

girmise, input() fonksiyonu bu sayy oldu u gibi alaca iin, bizim bu sayyla aritmetik ilem s g g s yapmamza msaade eder. Bu durumu daha iyi anlayabilmek iin mesela aa da raw_input() s g fonksiyonuyla yazd mz kodlar siz bir de input() fonksiyonuyla yazmay deneyin: g
#!/usr/bin/env python # -*- coding: utf-8 -*a = raw_input("isminiz: ") b = raw_input("soyisminiz: ") print a, b

E er bu kodlar input() fonksiyonuyla yazmay denediyseniz, Pythonn ilk veri giriinden sonra g s syle bir hata verdi ini grmsnzdr: g s
SyntaxError: invalid syntax

Etkileimli kabukta su komutu verdi inizde de ayn hatay ald nz greceksiniz: s g g


>>> Ahmet SyntaxError: invalid syntax

Burada hata almamak iin syle yapmak gerek:


>>> "Ahmet" Ahmet

Dolaysyla Pythonn input() fonksiyonuyla bu hatay vermemesi iin de tek yol, kullancnn ismini ve soyismini trnak iinde yazmas olacaktr. Ama tabii ki normal sartlarda kimseden ismini ve soyismini trnak iinde yazmasn bekleyemezsiniz. Btn bunlardan sunu anlyoruz: input() fonksiyonu, kullancnn geerli bir Python komutu girmesini bekler. Yani e er kulg lancnn girdi i sey Pythonn etkileimli kabu unda hata verecek bir ifade ise, input()lu kog s g dunuz da hata verecektir. Dolaysyla e er biz programmz aracl yla kullanclardan baz saylar isteyeceksek ve e er g g g biz bu saylar ileme sokacaksak (karma, toplama, blme gibi...) input() fonksiyonunu ters cih edebiliriz. Ama e er biz kullanclardan say de il de karakter dizisi girmesini istiyorsak g g raw_input() fonksiyonunu kullanaca z. g Simdi dilerseniz bu blmn en banda verdi imiz fahrenhayta dntrme programn, yeni s g s rendi imiz bilgiler yardmyla biraz gelitirelim: g g s
#!/usr/bin/env python # -*- coding: utf-8 -*santigrat = input("Santigrat cinsinden bir deer girin: ") g fahrenhayt = santigrat * (9.0/5.0) + 32 print ("%s santigrat derece %s fahrenhayta karlk gelir." s %(santigrat, fahrenhayt))

Bylece elimizde gayet sk bir derece dntrme program olmu oldu.. Gnn birinde santi s s grat dereceleri fayhrenhayta dntrmeniz gerekirse yukardaki program kullanabilirsiniz... s

4.3 Gvenlik Asndan input() ve raw_input()


Yukarda da bahsetti imiz gibi, Pythonda kullancdan veri alabilmek iin input() ve raw_input() g adl iki farkl fonksiyondan faydalanyoruz. Bu iki fonksiyonun kendilerine has grevleri ve kullanm alanlar vardr. Ancak e er yazd nz kodlarda gvenli i de n planda tutmak isterseniz g g g input() fonksiyonundan kanmay tercih edebilirsiniz. nk input() fonksiyonu kullancdan gelen bilgiyi bir komut olarak alglar. Peki bu ne anlama geliyor? Simdi syle bir kod yazd mz dnn: g s
#!/usr/bin/env python # -*- coding: utf-8 -*sayi = input("bir say girin: ") print sayi

Bu kodlarmz altrd mzda bir say girin: sorusuyla karlaaca z. Simdi bu soruya s g s s g cevap olarak sunlar yazalm:
2 + 2

Bunu yazp ENTER tuuna bast mzda 4 ktsn elde ediyoruz. Bu demek oluyor ki, input() s g fonksiyonu kullancdan gelen bilgiyi bir komut olarak yorumlad iin, bu fonksiyon yardmyla g kullanclarmz Python kodlarn altrabiliyor. Ne gzel, de il mi? Hi de de il! Bata ok s g g s ho bir zellik gibi grnse de bu, aslnda beraberinde baz gvenlik risklerini de getirir. Simdi s yukardaki program tekrar altrn ve soruya su cevab yazn: s
eval("__import__(os).system(dir)")

ENTER tuuna bast nzda, o anda iinde bulundu unuz dizin altndaki dosyalarn ekranda s g g listelendi ini greceksiniz. Yukardaki satrda geen komutlar henz renmedik. Ama yukarg g daki satr yardmyla sistem komutlarn altrabildi imizi gryorsunuz. Burada grd mz s g g dir bir sistem komutudur. Bu komutun grevi bir dizin altndaki dosyalar listelemek. Mesela GNU/Linuxta dosya silmemizi sa layan komut rm, Windowsta ise deldir. Dolaysyla yukarg daki komutu su sekilde yazd mzda neler olabilece ini bir dnn: g g s
eval("__import__(os).system(rm bir_dosya)")

veya:
eval("__import__(os).system(del bir_dosya)")

Hatta bu satr, simdi burada gstermek istemedi imiz, ok daha ykc sonular do urabile g g cek sistem komutlarnn altrlabilmesini sa lar (btn sabit diski silmek gibi...). Dolaysyla s g e er zellikle sunucu zerinden alacak kodlar yazyorsanz input() fonksiyonunu kullanrken g s dikkatli olmalsnz. input() fonksiyonunun yukardaki risklerinden tr Python programclar genellikle bu fonksiyonu kullanmamay tercih eder. Bunun yerine her zaman raw_input() fonksiyonu kullanlr. Zaten raw_input() fonksiyonu kullancyla veri al-veriine ilikin btn ihtiyalarmz karlayas s s s cak zelliktedir. Ancak biz henz raw_input() fonksiyonunu tam kapasite kullanacak kadar bilgi sahibi de iliz. Birka blm sonra eksik bilgilerimizi de tamamladktan sonra input() fonksiyg onuna hi ihtiyacnz olmad n greceksiniz. Ama biz simdilik input() fonksiyonundan yararg lanmaya devam edece iz. nk dmanmz tanmalyz ki dmanmzdan korunabilelim... g s s

4.4 Blm Sorular


1. Ana grevi do um yl sorup ya hesaplamak olan bir program yazn. Yazd nz program g s g kullancya ismiyle hitap edip, ona yan syleyebilmeli. s 2. Trk Lirasn gnlk kura gre Dolar, Euro ve Sterline eviren bir program yazn. Program kullancdan TL miktar alp bu miktar kullancya Dolar, Euro ve Sterlin olarak geri bildirebilmeli. 3. 2009 yl Nisan aynn ilk gnne ait Dolar kuru ile 2010 yl Nisan aynn ilk gnne ait Dolar kurunu karlatrn ve bir yllk de iimin yzdesini hesaplayn. s s gs 4. Bir nceki soruda yazd nz program, gerekli de erleri kullancdan alarak tekrar yazn. g g 5. raw_input() ile input() fonksiyonlarn birbiriyle karlatrn. input() fonksiyonunu kullanarak s s bir sisteme ne tr zararlar verebilece inizi ve bu zararlar nlemek iin teorik olarak neler g yapabilece inizi dnn. g s 6. Aa daki iki kodu karlatrn ve birinci kod hatasz alrken, ikinci kodun hata vermesinin s g s s s sebebini aklayn.
>>> print "Hayr! " * 5 >>> print "Hayr! " * "Hayr! "

BLM

Pythonda Ko ula Bagl Durumlar s

Pythonda en nemli konulardan biri de kukusuz koula ba l durumlardr. s s g Isterseniz ne demek istedi imizi bir rnekle aklayalm. Diyelim ki Gmailden ald nz e-posta hesabnza g g gireceksiniz. Gmailin ilk sayfasnda size bir kullanc ad ve parola sorulur. Siz de kendinize ait kullanc adn ve parolay sayfadaki kutucuklara yazarsnz. E er yazd nz kullanc ad g g ve parola do ruysa hesabnza eriebilirsiniz. Yok, e er kullanc adnz ve parolanz do ru g s g g de ilse, hesabnza eriemezsiniz. Yani e.posta hesabnza erimeniz, kullanc ad ve parolay g s s do ru girme kouluna ba ldr. g s g Ya da su rne i dnelim: Diyelim ki Pardusta konsol ekranndan gncelleme ilemi ya g s s pacaksnz. sudo pisi up komutunu verdi iniz zaman gncellemelerin listesi size bildirilecek, g bu gncellemeleri yapmak isteyip istemedi iniz size sorulacaktr. E er evet cevab verirseniz g g gncelleme ilemi balayacaktr. Yok, e er hayr cevab verirseniz gncelleme ilemi balas s g s s mayacaktr. Yani gncelleme ileminin balamas kullancnn evet cevab vermesi kouluna s s s ba ldr. Biz de simdi Pythonda bu tip koullu durumlarn nasl oluturulaca n renece iz. g s s g g g Bu i iin kullanaca mz tane deyim var: if, elif ve else s g Bu konu iinde ayrca Pythonda girintilerin nemine ve yazd mz kodlarn iine nasl aklama g yerletirebilece imize de de inece iz. s g g g

5.1 if Deyimi
If kelimesi Ingilizcede e er anlamna geliyor. Dolaysyla, adndan da anlalabilece i gibi, g s g bu deyim yardmyla Pythonda koula ba l bir durumu belirtebiliyoruz. Cmle yapsn ans g layabilmek iin bir rnek verelim:
>>> if a == b:

Bunun anlam sudur: e er a ile b birbirine eit ise... g s Biraz daha aarak sylemek gerekirse: e er a de ikeninin de eri b de ikeninin de eriyle g gs g gs g ayn ise... Uyar: kod iindeki == (ift eittir) iaretini birbirine bitiik olarak yazmamz gerekir. s s s Yani bu ift eittir iaretini ayr yazmamaya zen gstermeliyiz. Aksi halde yazd mz s s g program hata verecektir.

51

Grd nz gibi cmlemiz su anda yarm. Yani belli ki bunun bir de devam olmas gerekiyor. g Mesela cmlemizi syle tamamlayabiliriz:
>>> if a == b: ... print "a ile b birbirine eittir" s

Yukarda yazd mz kod su anlama geliyor: E er a de ikeninin de eri b de ikeninin g g gs g gs de eriyle ayn ise, ekrana a ile b birbirine eittir, diye bir cmle yazdr. g s Cmlemiz artk tamamlanm da olsa, tabii ki programmz hl eksik. Bir defa, henz elimizde s tanmlanm birer a ve b de ikeni yok. Zaten bu kodlar bu haliyle altrmaya kalkrsanz s gs s s Python size, a ve b de ikenlerinin tanmlanmad n syleyen bir hata mesaj gsterecektir. gs g Biraz sonra bu yarm yamalak kodu eksiksiz bir hale nasl getirece imizi grece iz. Ama simdi g g burada bir parantez aalm ve Pythonda girintileme ileminden bahsedelim ksaca. nk s bundan sonra girintilerle bol bol har neir olacaksnz. s s Dikkat ettiyseniz yukarda yazd mz yarm kod iinde print ile balayan ifade, if ile balayan g s s ifadeye gre daha ieride. Bu durum, print ile balayan ifadenin, if ile balayan ifadeye ait s s bir alt-ifade oldu unu gsteriyor. Yani bu iki satr beraberce bir if blo u oluturuyor. E er g g s g metin dzenleyici olarak Kwrite kullanyorsanz, if a == b: yazp ENTER tuuna bastktan s sonra Kwrite sizin iin bu girintileme ilemini kendili inden yapacak, imleci print "a ile b s g birbirine eittir" komutunu yazmanz gereken yere getirecektir. Ama e er bu girintileme s g ilemini elle yapmanz gerekirse genel kural olarak klavyedeki TAB tuuna bir kez veya SPACE s s tuuna drt kez basmalsnz. s Ancak bu kural uygularken TAB veya SPACE tularna basma seeneklerinden yalnzca birini s uygulayn. Yani bir yerde TAB tuuna baka yerde SPACE tuuna basp Pythonn kafasnn s s s karmasna yol amayn. s Simdi yukarda verdi imiz yarm program tamamlamaya alalm. Hemen bo bir Kwrite g s s belgesi ap iine sunlar yazyoruz:
#!/usr/bin/env python # -*- coding: utf-8 -*-

Bunlar zaten ilk etapta yazmamz gereken kodlard. Devam ediyoruz:


#!/usr/bin/env python # -*- coding: utf-8 -*alinin_yasi = 23 aysenin_yasi = 23

Yukarda alinin_yasi ve aysenin_yasi adnda iki tane de iken tanmladk. Bu iki de ikenin gs gs de de eri 23. g Programmz yazmaya devam edelim:
#!/usr/bin/env python # -*- coding: utf-8 -*alinin_yasi = 23 aysenin_yasi = 23 if alinin_yasi == aysenin_yasi: print "Ali ile Aye ayn yatadr!" s s

Bu sekilde programmz tamamlam olduk. Bu programn pek nemli bir i yapt sylen s s g emez. Yapt tek sey, alinin_yasi ile aysenin_yasi de ikenlerinin de erine bakp, e er g gs g g

bunlar birbirleriyle aynysa ekrana Ali ile Aye ayn yatadr! diye bir kt vermektir. Ama s s bu program ahm sahm bir sey olmasa da, en azndan bize if deyiminin nasl kullanlaca g hakknda nemli bir kir verdi. Artk bilgilerimizi bu programn bize sa lad temel zerine g g ina etmeye devam edebiliriz. Her zamanki gibi bo bir Kwrite (veya Gedit ya da IDLE) belgesi s s ayoruz ve iine sunlar yazyoruz:
#!/usr/bin/env python # -*- coding: utf-8 -*parola = "python" cevap = raw_input("Ltfen parolanz giriniz: ") if cevap == parola: print "Parola onayland! Programa ho geldiniz!" s

Grd nz gibi, burada ncelikle parola adl bir de iken oluturduk. (Bu arada de ikenlere g gs s gs ad verirken Trke karakter kullanmamalsnz.) Bu parola adl de ikenin de eri, kullancnn gs g girmesi gereken parolann kendisi oluyor. Ardndan cevap adl baka bir de iken daha tanms gs layp raw_input() fonksiyonunu bu de ikene atadk. Daha sonra da if deyimi yardmyla, E er gs g cevap de ikeninin de eri parola de ikeninin de eriyle ayn ise ekrana Parola onayland! gs g gs g Programa ho geldiniz! yazdr, dedik. Bu program altrd mzda, e er kullancnn girdi i s s g g g kelime python ise parola onaylanacaktr. Yok, e er kullanc baka bir kelime yazarsa, prog s gram derhal kapanacaktr. Ayn program su sekilde ksaltarak da yazabiliriz:
#!/usr/bin/env python # -*- coding: utf-8 -*parola = raw_input("Ltfen parolanz giriniz: ") if parola == "python": print "Parola onayland! Programa ho geldiniz!" s

Burada raw_input() fonksiyonunun de erini do rudan parola adl de ikene atyoruz. Hemen g g gs alttaki satrda ise girilmesi gereken parolann ne oldu unu su sekilde ifade ediyoruz: E er g g parola python ise ekrana Parola onayland! Programa ho geldiniz! yazdr. s

5.2 elif Deyimi


Bazen kullancdan bir veri alrken, kullancnn verebilece i farkl cevaplara gre programmzn g farkl tepkiler vermesini isteyebiliriz. Mesela su rne e bakn: g
#!/usr/bin/env python # -*- coding: utf-8 -*meyve = raw_input("Bir meyve ad yaznz: ") if meyve == "elma": print "elma bir meyvedir" elif meyve == "armut": print "armut bir meyvedir" elif meyve == "kiraz": print "kiraz bir meyvedir"

elif meyve == "kabak": print "kabak bir meyve deildir" g

Burada su Trke ifadeyi Pythoncaya evirdik: Kullancya, bir meyve ismi yazmasn syle. E er kullancnn yazd isim elma ise, ekrana elma bir meyvedir kts verilsin. Yok, e er g g g kullancnn yazd isim elma de il, ama armut ise ekrana armut bir meyvedir kts verg g ilsin. Yok, e er kullancnn yazd isim elma veya armut de il, ama kiraz ise ekrana kiraz bir g g g meyvedir kts verilsin. Yok, e er kullancnn yazd isim elma, armut veya kiraz de il, ama g g g kabak ise ekrana kabak bir meyve de ildir kts verilsin. g Grd nz gibi, e er birden fazla koullu durumla kar karyaysak elif deyimini kullanyg g s s s oruz. Burada en baa bir adet if deyimi koydu umuza, bundan sonra da tane elif deyimi s g kulland mza dikkat edin. g Elbette bu tr durumlar iin birden fazla if deyimini art arda da kullanabiliriz:
#!/usr/bin/env python # -*- coding: utf-8 -*meyve = raw_input("Bir meyve ad yaznz: ") if meyve == "elma": print "elma bir meyvedir" if meyve == "armut": print "armut bir meyvedir" if meyve == "kiraz": print "kiraz bir meyvedir" if meyve == "kabak": print "kabak bir meyve deildir" g

Bu rneklerde pek belli olmuyor, ama aslnda if ile elif arasnda ok nemli bir fark vardr. Mesela su rne e bakalm: g
#!/usr/bin/env python # -*- coding: utf-8 -*sayi = 100 if sayi == 100: print "sayi 100dr" if sayi <= 150: print "sayi 150den kktr" if sayi > 50: print "sayi 50den byktr" if sayi <= 100: print "sayi 100den kktr veya 100e eittir" s

Bu program altrld nda btn olas sonular listelenecektir. Yani ktmz syle olacaktr: s g
sayi sayi sayi sayi 100dr 150den kktr 50den byktr 100den kktr veya 100e eittir s

E er bu program elif deyimlerinden de yararlanarak yazarsak sonu su olacaktr: g ncelikle kodumuzu grelim:
#!/usr/bin/env python # -*- coding: utf-8 -*sayi = 100 if sayi == 100: print "sayi 100dr" elif sayi <= 150: print "sayi 150den kktr" elif sayi > 50: print "sayi 50den byktr" elif sayi <= 100: print "sayi 100den kktr veya 100e eittir" s

Bu kodlarn kts ise syle olacaktr:


say 100dr

Grd nz gibi programmz elif deyimini kullanarak yazarsak Python belirtilen koulu g s karlayan ilk sonucu ekrana yazdracak ve orada duracaktr. if deyimi ise olas btn sonular s ekrana basacaktr. Buraya kadar Pythonda pek ok sey renmi olduk. Simdiye dek rendiklerimizi kullanarak g s g artk ok basit bir hesap makinesi yazabiliriz:
#!/usr/bin/env python # -*- coding:utf-8 -*from __future__ import division secenek1 secenek2 secenek3 secenek4 print print print print = = = = "(1) "(2) "(3) "(4) toplama" karma" arpma" blme"

secenek1 secenek2 secenek3 secenek4

soru = raw_input("Yaplacak ilemin numarasn girin: ") s if soru == "1": sayi1 = input("Toplama iin ilk sayy girin: ") print sayi1 sayi2 = input("Toplama iin ikinci sayy girin: ") print sayi1, "+", sayi2, ":", sayi1 + sayi2 if soru == "2": sayi3 = input("karma iin ilk sayy girin: ") print sayi3

sayi4 = input("karma iin ikinci sayy girin: ") print sayi3, "-", sayi4, ":", sayi3 - sayi4 if soru == "3": sayi5 = input("arpma iin ilk sayy girin: ") print sayi5 sayi6 = input("arpma iin ikinci sayy girin: ") print sayi5, "x", sayi6, ":", sayi5 * sayi6 if soru == "4": sayi7 = input("Blme iin ilk sayy girin: ") print sayi7 sayi8 = input("Blme iin ikinci sayy girin: ") print sayi7, "/", sayi8, ":", sayi7 / sayi8

Bu rnek program inceleyip, programn nasl alt n anlamaya u rar, eksik yanlarn s g g s tespit eder ve bu eksikleri giderme yollar zerinde kafa yorarsanz, verdi imiz bu basit rnek g amacna ulam demektir. s s

5.3 else Deyimi


else deyimi ksaca, if ve elif deyimleriyle tanmlanan koullu durumlar dnda kalan btn s s durumlar gstermek iin kullanlr. Kk bir rnek verelim:
#!/usr/bin/env python # -*- coding: utf-8 -*isim = raw_input("Senin ismin ne?") if isim == "Ferhat": print "Ne gzel bir isim bu!" elif isim == "Serhat": print "Hmm.. Fena isim deil..." g else: print isim, "adn pek sevmem!"

Burada yapt mz sey su: ncelikle kullancya, Senin ismin ne? diye soruyoruz. Bu soruyu, g isim ad verdi imiz bir de ikene atadk. Daha sonra su cmleyi Pythoncaya evirdik: E er g gs g isim de ikeninin de eri Ferhat ise, ekrana Ne gzel bir isim bu! cmlesini yazdr. Yok, gs g e er isim de ikeninin de eri Ferhat de il, ama Serhat ise ekrana Hmm.. Fena isim de il... g gs g g g cmlesini yazdr. E er isim de ikeninin de eri bunlarn hibiri de il, ama baka herhangi bir g gs g g s seyse, ekrana isim de ikeninin de erini ve adn pek sevmem! cmlesini yazdr. gs g Bu rendi imiz else deyimi sayesinde artk kullanc yanl parola girdi inde uyar mesaj g g s g gsterebilece iz: g
#!/usr/bin/env python # -*- coding: utf-8 -*parola = raw_input("Ltfen parolanz giriniz: ") if parola == "python": print "Parola onayland! Programa hogeldiniz!" s

else: print "Ne yazk ki, yanl parola girdiniz!" s

Isterseniz daha nce grd mz bir rne e de uygulayalm bu else deyimini: g g


#!/usr/bin/env python # -*- coding: utf-8 -*meyve = raw_input("Bir meyve ad yaznz: ") if meyve == "elma": print "elma bir meyvedir" elif meyve == "armut": print "armut bir meyvedir" elif meyve == "kiraz": print "kiraz bir meyvedir" elif meyve == "kabak": print "kabak bir meyve deildir" g else: print "%s dediiniz eyin ne olduunu bilmiyorum!" %meyve g s g

Bylece zel olarak tanmlad mz durumlar dnda kalan her sey iin kullancya gsterecek g s bir cmlemiz var artk...

5.4 Pythonda Girintileme Sistemi


Pek ok programlama dilinde girintileme bir tercih meselesidir. Bu dillerde yazd nz kodlar g girintilenmi de olsa girintilenmemi de olsa dzgn bir sekilde alacaktr. Mesela aa daki s s s s g C koduna bakalm:
#include <stdio.h> int main() { int a = 1; if (a == 1) { printf("Elveda Zalim Dnya!\n"); return 0; } }

E er istersek yukardaki kodlar syle de yazabiliriz: g


#include <stdio.h> int main(){int a = 1;if (a == 1){printf("Elveda Zalim Dnya!\n");return 0;}}

Bu kodlar daha sonra okuyacak kiilerin nefretini kazanmak dnda, kodlar bu sekilde yazs s mamz herhangi bir soruna neden olmaz. Yani yukarda gsterilen her iki kod da derleyiciler (compiler) tarafndan ayn sekilde okunup, baaryla derlenecektir. E er yazd nz kodlarn s g g okunakl olmasn istiyorsanz, yukarda gsterilen ilk kodlama biimini tercih etmeniz gerekir. Ama dedi im gibi, ikinci kodlama biimini kullanmanz da programnzn almasn etkilemez. g s

Ancak Pythonla ilgilenen herkesin ok iyi bildi i gibi, Python programlama dilinde girintileme g basit bir slup meselesi de ildir. g Yani yukardaki C kodlarnn yapt ii Pythonla yerine getirmek istersek syle bir kod yazg s mamz gerekir:
a = 1 if a == 1: print "Elveda Zalim Dnya"

Bu kodlarn sahip oldu u girintileme yaps Python asndan byk nem tar. rne in yukarg s g daki kodlar su sekilde yazamayz:
a = 1 if a == 1: print "Elveda Zalim Dnya"

Bu kodlar alma srasnda hata verecektir. s Aslnda Pythondaki girintileme mevzuu bundan biraz daha karktr. Yukardaki rneklerde s grld gibi girinti verilmesi gereken yerde girinti verilmemesinin hataya yol amas dnda, g s programn yazlmas esnasnda baz yerlerde SPACE tuuna baslarak, baz yerlerde ise TAB s (Sekme) tuuna baslarak girinti verilmesi de hatalara yol aabilir. Dolaysyla yazd nz pros g gramlarda girintileme asndan mutlaka tutarl olmanz gerekir. Boluk ve sekme tularn s s kark bir sekilde kullanmanz, kimi zaman yazd nz kodlarn dzgn almasn engellemese s g s bile, farkl metin dzenleyicilerde farkl kod grnmlerinin ortaya kmasna sebep olabilir. Yani mesela herhangi bir metin dzenleyici kullanarak yazd nz bir program baka bir metin g s dzenleyici ile at nzda girintilerin birbirine girdi ini grebilirsiniz. g g Girintilemelerin dzgn grnmesini sa lamak ve hatal alan veya hi almayan prog s s gramlar ortaya kmasna sebep olmamak iin, kulland nz metin dzenleyicide de birtakm g ayarlamalar yapmanz gerekir. Bir defa kulland nz metin dzenleyicinin, mutlaka sekmelerin g ka boluktan oluaca n belirleyen bir ayarnn olmas gerekir. rne in Gnomedeki Gedit, s s g g KDEdeki Kate ve Kwrite, Windowstaki Notepad++ ve Notepad2 adl metin dzenleyiciler size byle bir ayar yapma sans tanr. Herhangi bir program yazmaya balamadan nce mutlaka s sekme ayarlarn yapmanz veya bu ayarlarn do ru olup olmad n kontrol etmeniz gerekir. g g Mesela Gedit program zerinden bir rnek verelim. Gediti ilk at nzda dzen/ye lenenler/dzenleyici yolunu takip ederek sekmeler bal alg g s g tndaki ayarlar kontrol etmelisiniz. Python programlarmzn girinti yapsnn dzgn olabilmesi iin orada sekme genili ini 4 olarak ayarlamanz, Sekme yerine boluk ekle s g s seene inin yanndaki kutucu u da iaretli hale getirmeniz gerekir. Buna benzer ayarlar btn g g s iyi metin dzenleyicilerde bulunur. rne in Geany adl metin dzenleyiciyi kullanyorsanz, g dzenle/tercihler/dzenleyici/girinti yolunu takip ederek su ayarlamalar yapabilirsiniz: genilik => 4 s Tr => Boluklar s sekme genili i => 4 s g Not: E er IDLE zerinde alyorsanz herhangi bir ayar yapmanza gerek yok. IDLEda bu g s syledi imiz ayarlar zaten yaplmtr... g s te yandan, bu iin bir de sizin pek elinizde olmayan bir boyutu vardr. E er yazd nz kods g g lar birden fazla kii tarafndan dzenleniyorsa, sekme ayarlar dzgn yaplmam bir metin s s dzenleyici kullanan kiiler kodunuzun girinti yapsn allak bullak edebilir. Bu yzden, ors tak proje gelitiren kiilerin de sekme ayarlar konusunda belli bir kural benimsemesi ve s s

bu konuda da tutarl olmas gerekir. Ingilizce bilenler iin, bu girintileme konusuyla ilgili http://wiki.python.org/moin/HowToEditPythonCode adresinde gzel bir makale var. Bu makaleyi okumanz tavsiye ederim.

5.5 Python Kodlarna Yorum Eklemek


Program yazanlarn genellikle ihmal etti i, ancak aslnda son derece nemle bir konudan sz g edece iz: Yazd nz programlara yorum/aklama eklemek. g g Diyelim ki, ierisinde satrlar dolusu kod barndran bir program yazdk ve bu programmz bakalarnn da kullanabilmesi iin internet zerinden da taca z. Bizim yazd mz program s g g g kullanacak kiiler, kullanmadan nce kodlar incelemek istiyor olabilirler. ste bizim de, kods I larmz incelemek isteyen kiilere yardmc olmak maksadyla, programmzn iine neyin ne ie s s yarad n aklayan baz notlar eklememiz en azndan nezaket gere idir. Bakalarn bir kenara g g s brakalm, bu aklayc notlar sizin de iinize yarayabilir. Aylar nce yazmaya balad nz bir s s g programa aylar sonra geri dnmek istedi inizde, Acaba ben burada ne yapmaya almm? g s s demenizi de engelleyebilir bu aklayc notlar. Peki, programmza bu aklayc notlar nasl ekleyece iz? g Kuralmz su: Pythonda kod iine aklayc notlar eklemek iin # iaretini kullanyoruz. s Hemen bir rnek verelim:
print "deneme 1, 2, 3" #deneme yapyoruz...

Yorumlarmz Python kodlar iinde hemen hemen her yere yerletirebiliriz. Mesela: s
#!/usr/bin/env python # -*- coding: utf-8 -*#Program ad: #Yazar : #Tarih : #Amac : #Platform : HTMLYap Orun Kunek 19 Nisan 2010 HTML belgesi retmek GNU/Linux, Windows

#HTML belgesinin <title> imine gelecek karakter dizisi baslik = "rnek bir HTML Dosyas" #HTML belgesinin gvde metni metin = "Merhaba HTML!" #Burada standart bir HTML ablonu iine, Pythondaki s #%s iaretlerini kullanarak bir balk ve gvde s s #metni gmyoruz. print """ <html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>%s</title> </head> <body> <p><b>%s</b></p> </body>

</html> """ %(baslik, metin) #balk ve metin deikenleri... s g s

Kodlarmz iine yorum eklerken gz nnde bulundurmamz gereken nemli bir nokta da ne ok az ne de haddinden fazla yorum girmektir. zellikle gere inden fazla yorumlanm prog s gramlar okumak ok zor olabilir. Yukarda verdi imiz rne i dikkatli incelerseniz, program iine ekledi imiz yorumlarn birbirg g g lerinden farkl amalara hizmet etti ini grrsnz. Mesela su ksmn grevi geri kalan yorumg larnkinden farkldr:
#Program ad: #Yazar : #Tarih : #Amac : #Platform : HTMLYap Orun Kunek 19 Nisan 2010 HTML belgesi retmek GNU/Linux, Windows

Burada kodlarmz hakknda aklayc bir yorum yapmak yerine, programmz hakknda genel bir bilgi veriyoruz. Buradan da anlayabilece iniz gibi, yorumlar bir program iinde ok farkl g amalara hizmet edebilir. Hatta yorumlardan ssleme amacyla da yararlanabilirsiniz:
####################################################### #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# # FALANCA v.1 # # Yazan: Keramet Su # # Lisans: GPL v2 # #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# #######################################################

Pythondaki yorumlarn baka kullanm alanlar da vardr. rne in, yazd mz programa bir s g g zellik eklemeyi dnyoruz, ama henz bu zelli i yeni srme eklemek istemiyoruz. O s g zaman syle bir sey yapabiliriz:
# -*- coding: utf-8 -*sistem = raw_input("Hangi iletim sistemini kullanyorsunuz? ") s if sistem == "Windows": print "Merhaba Windows kullancs!" elif sistem == "GNU/Linux": print "Merhaba GNU/Linux kullancs!" #elif sistem == "MacOsX": # print "Merhaba MacOsX kullancs!" else: print "Kullandnz iletim sistemi tandk gelmedi..." g s

Burada elif sistem == "MacOsX": ksmn yorum iine alarak simdilik bu ksm iptal ediyoruz ( Ingilizcede bu yorum iine alma ilemine comment out deniyor). Python yorum iinde bir s kod bile yer alsa o kodlar altrmayacaktr. nk Python # iareti ile balayan satrlarn s s s ieri ini grmez (#!/usr/bin/env python satr hari). g Peki eklemek istemedi imiz zelli i yorum iine almaktansa do rudan silsek olmaz m? Elbette g g g olur. Ama programn daha sonraki bir srmne ilave edece imiz bir zelli i yorum iine almak g g yerine silecek olursak, vakti geldi inde o zelli i nasl yapt mz hatrlamakta zorlanabiliriz! g g g Hatta bir sre sonra programmza hangi zelli i ekleyece imizi dahi unutmu olabiliriz. Hayr, g g s ben hafzama gveniyorum! diyorsanz karar sizin!

Yorum iine alarak iptal etti iniz bu kodlar programa ekleme vakti geldi inde yapaca nz tek g g g sey, kodlarn bandaki # iaretlerini kaldrmak olacaktr. Hatta baz metin dzenleyiciler bu s s ilemi tek bir tua basarak da gerekletirme yetene ine sahiptir. rne in IDLE ile alyors s s g g s sanz, yorum iine almak istedi iniz kodlar fare ile setikten sonra ALT+3 tularna basarak ilg s gili kodlar yorum iine alabilirsiniz. Bu kodlar yorumdan kurtarmak iin ise ilgili alan setikten sonra ALT+4 tularna basmanz yeterli olacaktr (yorumdan kurtarma ilemine s s Ingilizcede uncomment diyorlar).

5.6 Blm Sorular


1. ocuklara hayvanlarn kard sesleri reten basit bir program yazn. g g 2. Kullancnn girdi i sehir veya semt bilgisine gre kira yat aralklarn gsteren bir program g yazn. 3. Haftann 5 gn iin farkl bir yemek mens oluturun. rnek bir men biimi syle olmal: s
Gn : Mteri Ad : s orba eidi: s Ana yemek : Tatl :

Daha sonra mterinize hangi gne ait meny grmek istedi ini sorun ve cevaba gre s g meny gsterin. 4. Bir nceki soruda mterinin yedi i yemekler iin ayrntl hesap dkm karn ve ms g s teriyi bilgilendirin.

BLM

Baz nemli Ayrntlar

Su noktaya kadar Pythonla ilgili epey bilgi edindik. Artk Pythonla az ok ynmz tayin etmeye yetecek kadar malzemeye sahibiz. Bu blme gelene kadar, kafa karkl na yol as g mamak iin baz nemli ayrntlar es gemek zorunda kaldk. ste bu blmde simdiye kadar I iledi imiz konular iinde de inmedi imiz, ama mutlaka bilmemiz gereken bu nemli ayrns g g g tlardan sz edece iz. Bu blm tamamladktan sonra Pythonla ilgili en temel konular epey g ayrntl bir sekilde renmi olacaksnz. Bu da size ilerki konular daha rahat anlayabilmeniz g s asndan sa lam bir temel kazandrm olacak. Bu blmn sonunda, e er varsa, aklnzg s g daki sphelerin ve belirsizliklerin byk bir ksm da aydnl a kavumu olacaktr. stelik bu g s s blmde, nceki blmlerde rendi imiz konularla ilgili de bolca rnek yapma frsat bulag g ca z. Hem eski bilgilerimizi tazeleyece imiz, hem de yeni seyler renece imiz bu blme g g g g haketti i ilgiyi gstermeniz halinde, nmzdeki konular ok daha rahat kavrad nz farkedeg g cek, kendinizden emin bir sekilde ilerleyebileceksiniz.

6.1 sleler (Operators) I


Hatrlarsanz saylar konusunu incelerken aritmetik ilemleri yapabilmek iin +, -, / ve s * gibi iaretlerden yararlanmtk. Pythonda aritmetik ilemler iin kulland mz bu yardmc s s s g iaretlere ile (operator) ad verilir. Bu ileler bizim yabancs oldu umuz bir kavram de ildir. s s s g g Bunlar daha nce de bol bol kullandk, simdiden sonra da bol bol kullanmaya devam edece iz. g Dilerseniz bilgilerimizi tazelemek iin birka rnek yapalm:
>>> print 456 + 654 1110 >>> print 456 - 654 -198 >>> print 45 / 56 #iki tamsay birbirine blnrse ... #sonu da tamsay olur. 0 >>> print 45.0 / 56 #saylardan biri kayan noktalysa ... #sonu da kayan noktaldr.

62

0.803571428571 >>> print 5 / 0 #bir saynn 0a blnmesi hataya yol aar. Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: integer division or modulo by zero >>> print 45 * 76 3420

Bu ileler aritmetik ilemleri yapmamz sa lad iin bunlara zel olarak aritmetik ileler s s g g s (arithmetic operators) ad verilir. Bunlarn dnda, renmemiz gereken birka aritmetik ile s g s daha var. Isterseniz onlara bir gz atalm: ** i leci s nceki derslerimizin birinde suna benzer bir rnek vermitik: s
#!/usr/bin/env python # -*- coding: utf-8 -*sayi = raw_input("Bir say girin. Ben size o \ saynn karesini syleyeyim:\n") sayi = int(sayi) print "girdiiniz say\t\t: %s" %(sayi) g print "girdiiniz saynn karesi: %s" % (sayi * sayi) g

Burada bir saynn karesini almak iin o sayy kendisiyle arptk. Ama Pythonda bir saynn karesini almann ok daha temiz bir yolu var:
>>> print 12 ** 2 144

** ileci Pythonda bir saynn herhangi bir kuvvetini almamz sa lar. Yukardaki komut 122 s g ifadesiyle ede erdir. E er bir saynn nc kuvvetini almak isterseniz yukardaki komutu s g g syle yazmalsnz:
>>> print 12 ** 3 1728

Bu da 123 ifadesine ede erdir. s g % i leci s Diyelim ki syle bir blme ilemi yaptnz: s
>>> print 13 / 3 4

Grd nz gibi bu blme ileminin sonucu 4tr. Peki biz bu blme ileminden kalan sayy g s s bulmak istersek ne yapaca z? ste bunun iin Pythonda % adl bir ile var: g I s

>>> print 13 % 3 1

Demek ki 13 says 3e blnd nde kalan 1 imi... g s Bu ile, bir saynn tek mi yoksa ift mi oldu unu tespit etmeniz gerekti i durumlarda ok s g g iinize yarayacaktr. E er bir saynn 2ye blmnden kalan say 0 ise o say ifttir. Aksi halde s g o say tektir:
#!/usr/bin/env python # -*- coding: utf-8 -*sayi = input("Bir say girin: ") if sayi % 2 == 0: print "Girdiiniz say ifttir." g else: print "Girdiiniz say tektir." g

Bu ilecin, arayz tasarm srasnda dahi iinize yarad n greceksiniz. O yzden Blme s s g ileminden kalan sayy bilsem ne olur, bilmesem ne olur, diye dnmeyin sakn... s s Pythonda ileler yukardakilerle snrl de ildir. Tpk yukardakiler gibi, nceki derslerimizden s g bildi imiz ve matematikten de aina oldu umuz birka ile daha var: g s g s == > < >= <= eittir anlamna geliyor s byktr anlamna geliyor kktr anlamna geliyor byk eittir anlamna geliyor s kk eittir anlamna geliyor s

Saylar karlatrmamz sa ladklar iin bu ilelere karlatrma ileleri (comparison ops s g s s s s erators) ad verilir. Biz bu ileleri nceki derslerimizde if, elif, ve else deyimleri ile birlikte s kullanmtk. Mesela: s
#!/usr/bin/env python # -*- coding: utf-8 -*yas = int(raw_input("Yanz ka? ")) s if yas < 0: print "Yok canm, daha neler!?" elif yas <= 30: print "Hmm.. Epey gensin." elif yas >= 60: print "Ya kemale ermi!" s s elif yas > 30: print "Yalanyorsun dostum!" s

Bunlara ek olarak bu blmde birka yeni ile daha grece iz. Bu yeni ilelere gemeden s g s nce isterseniz Pythona yeni balayanlarn ska yapt bir hataya de inelim. s g g Python renmeye yeni balayanlar, zellikle ilk zamanlarda, = ve == iaretlerini birg s s birine kartrr. Bu iaretler her ne kadar ayn anlama geliyormu gibi grnse de aslnda s s s

birbirlerinden ok farkldr. Durumu birka rnekle aklamaya alalm: s


>>> sayi = 3456

Burada sayi adl bir de iken tanmladk. Pythonda de ikenleri tanmlarken, yani de ikengs gs gs lere de er atarken = iaretinden yararlanyoruz. Bu iaretin tek grevi bir de ikene de er g s s gs g atamaktr. Burada sayi adl de ikene 3456 de erini atyor. gs g Bir de suna bakalm:
>>> sayi == 3456 True

Burada yapt mz sey sayi adl de ikene de er atamak de ildir. g gs g g Burada biz sayi de ikeninin de erini sorguluyoruz. Yani burada syle bir soru soruyoruz Pythona: sayi adl gs g de ikenin de eri 3456 m?. Bu soruyu duyan Python bize bir cevap veriyor. Pythonun cevgs g abn biraz sonra tartaca z... s g Dedi imiz gibi, yukarda yapt mz sey bir de er atamak de il, de er sorgulamaktr. Olmayan g g g g g bir seyin de eri sorgulanamaz. Dolaysyla syle bir ilem hata verecektir: g s
>>> meyve == "elma" Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name meyve is not defined

Ama siz nce bir meyve de ikeni oluturursanz, daha sonra bu de ikenin de erini sorgulayags s gs g bilirsiniz:
>>> meyve = "elma" >>> meyve == "elma" True

Burada ald mz True ktsna taklmayn. Az sonra bunun ne demek oldu unu inceleyece iz. g g g Grd nz gibi, = ve == iaretleri birbirlerinden ok farkl anlamlara geliyorlar. O yzden g s bunlar kartrmamaya zen gsteriyoruz. s Hatrlarsanz == ilecini nceki derslerimizde syle bir rnek iinde kullanmtk: s s
#!/usr/bin/env python #-*- coding: utf-8 -*alinin_yasi = 23 aysenin_yasi = 23 if alinin_yasi == aysenin_yasi: print "Ali ile Aye ayn yatadr!" s s

Burada da == ilecini kullanarak Alinin ya ile Ayenin yan birbiriyle karlatryoruz. s s s s s s Yukardaki rnekte e er if alinin_yasi = aysenin_yasi gibi bir sey yazarsak Python bize g bir hata mesaj gsterecektir. nk daha nce de dedi imiz gibi = iareti de er atamaya g s g yarar. Bu rnekte bizim yapmamz gereken sey de er atamaktan ziyade iki de eri karlatr g g s s mak olmaldr. E er siz burada == yerine = ilecini kullanacak olursanz Python ne yapg s maya alt nz anlayamayacaktr. s g

Burada syle bir soru akla geliyor: Biz eitlik karlatrmas yapmak iin == ilecini kul s s s s lanyoruz. Peki eitsizlik karlatrmas iin herhangi bir ile var m? s s s s Elbette var. Pythonda iki de erin eitsizli ini sorgulamak iin, eit de ildir, anlamna gelen g s g s g != ilecinden yararlanyoruz. Mesela bu ileci kullanarak yukardaki rne i syle yazabiliriz: s s g
#!/usr/bin/env python # -*- coding: utf-8 -*alinin_yasi = 30 aysenin_yasi = 23 if alinin_yasi != aysenin_yasi: print "Ali ile Aye ayn yata deildir!" s s g

Burada su Trke cmleyi Pythoncaya evirmi olduk: s E er alinin_yasi adl de ikenin de eri aysenin_yasi adl de ikenin de erine eit de ilse, g gs g gs g s g ekrana Ali ile Aye ayn yata de ildir! cmlesini yazdr! s s g Gelin bununla ilgili bir rnek daha verelim konuyu daha net kavramak iin:
#!/usr/bin/env python # -*- coding: utf-8 -*parola_ilk = raw_input("Parolanz giriniz: ") parola_tekrar = raw_input("Ayn parolay tekrar giriniz: ") if parola_ilk != parola_tekrar: print "Parolalar elemiyor!" s s else: print "Programa hogeldiniz!" s

Burada, karlatrma ilelerinden biri olan != ilecini kullanarak parola_ilk ve s s s s parola_tekrar adl de ikenlerin de erini karlatryoruz. E er parola_ilkin de eri gs g s s g g parola_tekrarn de erine eit de ilse Parolalar elemiyor! kts veriyoruz. Aksi halde, g s g s s yani bu iki de er birbirine eitse kullancy ieri alyoruz. Grd nz gibi != ileci olduka g s g s kullanl bir ara. s

6.2 Bool Degerler


Ingilizcede, anlamn btn programclarn ok iyi bilmesi gereken true ve false diye iki kelime vardr. True kelimesinin anlam do ru, False kelimesinin anlam ise yanltr. g s Bilgisayar mant nda her sey ya do rudur, ya da yanl... Dolaysyla herhangi bir sey bilgisag g s yar asndan ya True ya da False de ere sahiptir. g Hatrlarsanz yukarda == ilecini incelerken, bu ilecin iki de er arasnda karlatrma yaps s g s s t n sylemitik. Bunu sylerken de syle bir rnek vermitik: g s s
>>> sayi == 3456 True

Bu rnek bize True kts veriyor. Dedi imiz gibi, g Ingilizcede true do ru demektir. g Dolaysyla yukardaki ktya gre sayi adl de ikenin de eri gerekten de 3456. gs g Bir de su rneklere bakalm:

>>> a = 3 >>> a == 3 True >>> a == 4 False

Burada ncelikle a adl bir de iken tanmladk. Bu de ikenin de eri 3. Bir sonraki satrda gs gs g a de ikeninin de erini sorguluyoruz. Burada sordu umuz soru su: a de ikeninin de eri 3 gs g g gs g m?. a de ikeninin de eri 3 oldu u iin burada True yani do ru ktsn aldk. Bir sonraki gs g g g satrda ise a == 4 gibi bir ifade gryoruz. Bu da su anlama geliyor: a de ikeninin de eri 4 gs g m?. a de ikeninin de eri 4 olmad iin bu kez False, yani yanl kts alyoruz. gs g g s Dedi imiz gibi, bilgisayar dilinde istisnasz her sey ya True [do ru] ya da False [yanl]tur. g g s ste bu iki de ere Bool De erler ad verilir ve bu sistem bilgisayarn temelini oluturur. I g g s Simdi biraz daha ayrntya girelim. Yukarda a de ikeninin de erinin baka bir de ere eit gs g s g s olup olmad n sorguladk. Yani, a 3 m?, a 4 m? gibi sorular sorduk ve buna uygun g cevaplar aldk. Bunun yansra, balbana ann kendisini de do ruluk ve yanllk asndan s s g s sorgulayabiliriz. Mesela syle sorular sorabiliriz: a do ru mu? veya a yanl m?. Pythonda g s byle bir soru sorabilmek iin bool() adl bir fonksiyondan yararlanaca z: g
>>> a = 3 >>> bool(a) True

Pythonda e er herhangi bir sey, herhangi bir de ere sahipse o sey True, yani do rudur. Ama g g g e er o sey hi bir de ere sahip de ilse, False, yani yanltr. Biraz kafa kartrc gelmi olabilir g g g s s s bu tanm. rnekler durumu daha net anlatacaktr:
>>> a = "" >>> bool(a) False >>> a = "elma" >>> bool(a) True >>> a = " " >>> bool(a) True

rnekte a bo bir karakter dizisidir. Yani burada a de ikeni hi bir de ere sahip de il. Ilk s gs g g Dolaysyla bu de iken Falsetur. gs Ikinci rnekte ise a de ikenin elma diye bir de eri var. Bu gs g yzden bu de iken Truedur. nc rnek sizi biraz sartm olabilir. Ama hi sartmasn. gs s s s nk burada a de ersiz de il. Bu de ikenin bir de eri var. O da boluk karakteri! Yani g g gs g s burada a, bir adet boluk karakteri barndran bir karakter dizisidir. Unutmayn, bo bir karakter s s

dizisi ile boluk karakteri ieren bir karakter dizisi birbiriyle ayn sey de ildir. Dilerseniz bu s g durumu kendi gzlerimizle grelim:
>>> a = "" >>> b = " " >>> a == b False

Grd nz gibi, a ile b birbirine eit de il. nk a bo bir karakter dizisi iken, b bir adet g s g s boluk karakterinden oluan bir karakter dizisidir... Bu ayrm asla gzden karmayn. s s Dilerseniz bununla ilgili kk bir rnek verelim:
#!/usr/bin/env python # -*- coding: utf-8 -*soru = raw_input("Adnz: ") if bool(soru) == True: print "Teekkrler" s else: print "Bu soruyu bo geemezsiniz!" s

Bu rnekte e er kullanc soruya herhangi bir cevap verirse ekrana Teekkrler kts verilir. g s Ama e er kullanc soruyu cevaplamadan ENTER tuuna basarsa o zaman Bu soruyu bo geeg s s mezsiniz kts alr. Grd nz gibi burada bool() fonksiyonunu kullandk. Buradaki if bool(soru) == True: g ifadesi su anlama gelir: E er soru de ikeninin bool de eri True ise... g gs g Yukardaki kodlar Pythonda ok daha kolay yazabiliriz aslnda. Zaten Python programclar yukardaki gibi bir sey yazacaklar zaman baka bir yol tutmay tercih ederler. Grelim: s
#!/usr/bin/env python # -*- coding: utf-8 -*soru = raw_input("Adnz: ") if soru: print "Teekkrler" s else: print "Bu soruyu bo geemezsiniz!" s

Grd nz gibi, hi bool() fonksiyonunu araya sokmadan, sadece if soru: diyerek g amacmza ulayoruz. Bu ifade de E er soru de ikeninin bool de eri True ise... anlamna s g gs g gelir. E er yukardakinin tersini yapmak isterseniz not ilecinden yararlanabilirsiniz (Bu ileci biraz g s s sonra ayrntl olarak inceleyece iz): g
#!/usr/bin/env python # -*- coding: utf-8 -*soru = raw_input("Adnz: ") if not soru: print "Bu soruyu bo geemezsiniz!" s

else: print "Teekkrler" s

Burada syle demi oluyoruz: E er soru de ikeninin bool de eri True de il ise... s g gs g g Bir nceki blmde su ileleri grmtk: s s Aritmetik sleler I + / * Toplama ilemi yapar s karma ilemi yapar s Blme ilemi yapar s arpma ilemi yapar s

Kar la trma sleleri s s I == != > < >= <= eittir anlamna geliyor s eit de ildir anlamna geliyor s g byktr anlamna geliyor kktr anlamna geliyor byk eittir anlamna geliyor s kk eittir anlamna geliyor s

Simdi de mantk ilelerini (logical operators) inceleyece iz. Bir nceki blmde henz Bool s g kavramn renmemi oldu umuz iin mantk ilelerinden bahsedememitik. Ama artk bu g s g s s kavram bildi imize gre rahatlkla mantk ilelerini ileyebiliriz. g s s Mantk sleleri I and or not VE anlamna geliyor VEYA anlamna geliyor IL DEG anlamna geliyor

Bu ileler, lisede mantk dersi alm olanlara hi yabanc gelmeyecektir. s s Peki ne ie yarar bu mantk ileleri? s s Isterseniz uzun uzun aklama yapmak yerine bir rnek verelim:
#!/usr/bin/env python # -*- coding: utf-8 -*kullanici_adi = raw_input("Kullanc adnz: ") parola = raw_input("Parola: ") if kullanici_adi == "ahmet" and parola == "ah12345678": print "Programa hogeldiniz!" s else: print "Kullanc adnz ya da parolanz yanl" s

Burada and ilecinin ne ie yarad apak anlalyor. Yukardaki kodlarda, kullancnn pros s g s grama kabul edilmesini, hem kullanc adnn hem de parolann do ru girilmesi sartna ba lyg g oruz. E er kullanc ad ve paroladan herhangi biri yanlsa kullanc programa giri izni elde g s s edemez. Yukardaki kodlar bir de syle yazalm:
#!/usr/bin/env python # -*- coding: utf-8 -*kullanici_adi = raw_input("Kullanc adnz: ")

parola = raw_input("Parola: ") if kullanici_adi == "ahmet" or parola == "ah12345678": print "Programa hogeldiniz!" s else: print "Kullanc adnz ya da parolanz yanl" s

Burada and yerine or kulland mza dikkat edin. Bu sekilde kullancnn programa giri g s yapabilmesi iin kullanc ad veya paroladan birini do ru girmesi yeterli olacaktr. g Dilerseniz etkileimli kabukta birka ufak rnekle durumu daha net anlamaya alalm: s s
>>> True and True True

Dedi imiz gibi, iki True de er birbirine and ile ba lanrsa sonu True olacaktr. g g g
>>> True and False False

E er de erlerden biri bile False ise sonu da False olacaktr. g g


>>> False and False False

Elbette her iki de erin de False oldu u durumda sonu da Falsetur. g g


>>> True or False True

E er iki de er birbirine or ile ba lanrsa ve e er bu de erlerden sadece biri bile True ise g g g g g sonu da True olacaktr.
>>> False or False False

or ile birbirine ba lanm iki de erin ikisi de False ise sonu da Falsetur. g s g
>>> True or True True

Elbette her iki de er de True ise sonu da True olacaktr. g Gelelim not ilecine... Bu ile de il anlamna gelir. Yani bu ile cmleye olumsuz bir s s g s anlam katar. Birka rnek verelim:
>>> kullanici_adi = "ahmet" >>> not kullanici_adi False

Burada Pythona syle bir sey sylemi olduk: s kullanici_adi de ikeninin bool de eri True de ildir gs g g

O da bize su cevab verdi: Hayr, dostum. Truedur. Yanlyorsun! nk kullanc_adi de ikeni bir de ere sahip oldu u iin gs g g

Hatrlarsanz yukarda syle bir rnek vermitik: s


#!/usr/bin/env python # -*- coding: utf-8 -*soru = raw_input("Adnz: ") if not soru: print "Bu soruyu bo geemezsiniz!" s else: print "Teekkrler" s

Burada if not soru ifadesine dikkat edin. Burada Pythona sunu diyoruz: E er soru de ikeninin bool de eri True de il ise... g gs g g Yukardaki rnekte e er kullanc Adnz sorusunu bo geerse soru de ikeninin de eri syle g s gs g olacaktr:
soru = ""

Pythonda bo karakter dizilerinin False oldu unu biliyoruz. Dolaysyla e er kullanc soruyu s g g bo geerse if not soru: satr iletilecektir... s s

6.3 Dn trme slemleri s I


Programclk maceramz srasnda, verileri birbirine dntrmemiz gereken durumlarla ska s karlaaca z. Mesela pek ok durumda bir sayy karakter dizisine ve e er mmknse bir s s g g karakter dizisini de sayya dntrmek zorunda kalacaksnz. Simdi dilerseniz bu duruma ok s basit bir rnek verelim: Bildi iniz gibi, Pythonda iki tamsayy birbirine blersek elde edece imiz kt da tamsay olag g caktr. Yani:
>>> print 23 / 3 7

Burada iki adet tamsay oldu u iin Python bize sonucu da tamsay olarak gsterir. Yani ong dalk ksm atar. Bunu nlemek iin, ileme giren saylardan birini kayan noktal say olarak s tanmlamamz yeterlidir:
>>> print 23.0 / 3 7.66666666667

Peki buna benzer bir seyi aa daki programda nasl yaparz? s g


#!/usr/bin/env python # -*- coding: utf-8 -*bolen = input("Blme ilemi iin ilk sayy girin: ") s bolunen = input("Blme ilemi iin ikinci sayy girin: ") s

print "Blme ileminin sonucu:", bolen / bolunen s

Biraz nce, saylar kendimiz girdi imiz iin, bunlarn sa na birer .0 iareti koyarak sorunu g g s zyorduk. Ama simdi saylar kullancdan alyoruz. Dolaysyla yukardaki programn hassas bir sonu verebilmesi iin burada bir dntrme ilemi yapmamz gerekiyor. Bu dntrme s s s ilemi iin oat() adl bir fonksiyondan yararlanaca z: s g
>>> a = 23 >>> float(a) 23.0

Grd nz gibi, oat() fonksiyonu 23 saysn 23.0 seklinde bir kayan noktal sayya g dntrd... Simdi suna bakn: s
>>> a = 23 >>> b = 3 >>> a / b 7 >>> float(a) / b 7.666666666666667

Grd nz gibi, blme ilemine giren saylardan birini bu oat() fonksiyonu ile kayan nokg s tal sayya dndrerek hassas bir kt alabildik. Gelin simdi bu ilemi yukardaki programa s uygulayalm:
#!/usr/bin/env python # -*- coding: utf-8 -*bolen = input("Blme ilemi iin ilk sayy girin: ") s bolunen = input("Blme ilemi iin ikinci sayy girin: ") s print "Blme ileminin sonucu:", float(bolen) / bolunen s

Artk blme ileminin sonucunu hassas bir sekilde alabilece iz... s g Elbette Pythonda oat() gibi baka fonksiyonlar da vardr. Mesela int() fonksiyonu bunlardan s biridir. Hatrlarsanz, input() ve raw_input() fonksiyonlarn incelerken, input() fonksiyonuyla yapabilece imiz her seyi aslnda raw_input() fonksiyonuyla da yapabilece imizi sylemitik. ste bu g g s I int() fonksiyonu bize bu konuda yardmc olacak. Dilerseniz nce bu fonksiyonu etkileimli s kabukta biraz inceleyelim:
>>> a = "23"

Bildi iniz gibi yukardaki a de ikeni bir karakter dizisidir. Simdi bunu sayya evirelim: g gs
>>> int(a) 23

Bylece 23 karakter dizisini sayya evirmi olduk. Ancak tahmin edebilece iniz gibi her s g karakter dizisi sayya evrilemez. int() fonksiyonu yalnzca say de erli karakter dizilerini g sayya dntrebilir: s
>>> kardiz = "elma" >>> int(kardiz) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: invalid literal for int() with base 10: elma

Grd nz gibi, elma karakter dizisi say olarak temsil edilemeyece i iin Python bize bir g g hata mesaj gsteriyor. Ama 23 gibi bir karakter disini say olmaktan karan tek sey trnak iaretleri oldu u iin, bu karakter dizisi say olarak temsil edilebiliyor... Gelin isterseniz bu s g bilgiyi su rne e uygulayalm: g
#!/usr/bin/env python # -*- coding: utf-8 -*ilk_sayi = int(raw_input("lk sayy girin: ")) I ikinci_sayi = int(raw_input("kinci sayy girin: ")) I toplam = ilk_sayi + ikinci_sayi print "Bu iki saynn toplam: ", toplam

Grd nz gibi, burada yapt mz sey ok basit. raw_input() fonksiyonunu tmden int() g g fonksiyonu iine aldk:
int(raw_input("lk sayy girin: ")) I

Burada zellikle kapan trnaklarn eksik yazmamaya zen gsteriyoruz. Pythona yeni s balayanlarn en sk yapt hatalardan biri de alm trnaklar kapatmay unutmaktr. s g s Bylece input() fonksiyonunun prangasndan kurtulmu olduk! Artk raw_input() fonksiyonuyla s da aritmetik ilemler yapabiliyoruz. Nihayet input() gibi tehlikeli bir fonksiyondan yakay s syrd mza gre bu durumu bir rnekle kutlayabiliriz: g
#!/usr/bin/env python # -*- coding: utf-8 -*sayi = int(raw_input("Bir say girin. Ben size bu saynn " "istediiniz kuvvetini hesaplayaym: ")) g kuvvet = int(raw_input("imdi de %s saysnn kanc kuvvetini " S "hesaplamak istediinizi syleyin: " g %sayi)) print "%s saysnn %s. kuvveti %s olur." %(sayi, kuvvet, sayi ** kuvvet)

Burada, yazd mz kodlarn nasl iledi ine dikkat etmenin yansra, kodlar grn asndan g s g s nasl dzenledi imize ve satrlar nasl bld mze de dikkat edin. Daha nce de dedi im g g g gibi, Python grne de nem veren zarif bir dildir. s Peki yukarda yapt mz seyin tersi mmkn m? Yani acaba bir sayy karakter dizisine evireg bilir miyiz? Bu sorunun yant evettir. Bu ilem iin de str() adl fonksiyondan yararlanaca z: s g

>>> a = 23 >>> str(a) 23

Gelin isterseniz simdiye kadar grd mz dntrme fonksiyonlarn topluca grelim: g s oat() int() str() Herhangi bir sayy veya say de erli karakter dizisini kayan noktal sayya dntrr. g s Herhangi bir sayy veya say de erli karakter dizisini tamsayya dntrr. g s Herhangi bir sayy karakter dizisine dntrr. s

Bu fonksiyonlar iyi renmelisiniz, nk Python maceranzda bunlar bol bol karnza kag s cak... Bu blm kapatmadan nce dilerseniz Pythondaki kk ama nemli bir fonksiyondan daha sz edelim: type() fonksiyonu. type() fonksiyonu, herhangi bir de erin hangi tipte oldu unu sorgulamamz sa lar. rne in: g g g g
>>> i = 23 >>> type(i) <type int>

int, integer (tamsay) kelimesinin ksaltmasdr. Demek ki i de ikeni bir integer, yani tamgs say imi... Bir de suna bakalm: s
>>> s = "elma" >>> type(s) <type str>

str de string (karakter dizisi) kelimesinin ksaltmasdr. Dolaysyla s de ikeni bir karakter gs dizisidir.
>>> f = 14.3 >>> type(f) <type float>

oat, oating point number (kayan noktal say) kelimesinin ksaltmasdr. Yani f de ikeni gs bir kayan noktal saydr. Bu konuyu da bitirdi imize gre artk blm sorularna geebiliriz. g

6.4 Blm Sorular


1. Aa daki rnekte if ve elif deyimlerini farkl sralarda yerletirdi inizde nasl bir sonu elde s g s g edece inizi dnn. Syle bir kod yazm ne tr sorunlarn ortaya kmasna yol aar? Mesela g s aa daki kodlar altran bir kullanc cevap olarak 60 zeri bir say girerse nasl bir kt alr? s g s ktnn bekledi imiz gibi olmamasnn nedeni nedir? g

#!/usr/bin/env python # -*- coding: utf-8 -*yas = int(raw_input("Yanz ka? ")) s if yas < 0: print "Yok canm, daha neler!?" elif yas <= 30: print "Hmm.. Epey gensin." elif yas > 30: print "Yalanyorsun dostum!" s elif yas >= 60: print "Ya kemale ermi!" s s

2. Aa daki ilemlerin sonucu nedir? s g s


>>> True or False >>> True and False >>> True and (True or False) >>> True or (False and True) >>> True or (False and False) >>> (False or False) and (False or True)

3. Geen blmde yapt mz basit hesap makinesinde input() fonksiyonunu kullanmtk. Siz g s o hesap makinesini raw_input() fonksiyonunu kullanarak yeniden yazn.

BLM

Pythonda Dngler

Hatrlarsanz geen blmlerden birinde basit bir hesap makinesi yapmtk. Ancak dikkat s ettiyseniz, o hesap makinesi programnda toplama, karma, arpma veya blme ilemlerinden s birini seip, daha sonra o seti imiz ilemi bitirdi imizde program kapanyor, baka bir ilem g s g s s yapmak istedi imizde ise program yeniden balatmamz gerekiyordu. Ayn sekilde kullanc g s ad ve parola soran bir program yazsak, su anki bilgilerimizle her defasnda program yeniden balatmak zorunda kalrz. Yani kullanc ad ve parola yanl girildi inde bu kullanc ad ve s s g parolay tekrar tekrar soramayz; program yeniden balatmamz gerekir. ste bu blmde s I Pythonda yazd mz kodlar srekli hale getirmeyi, tekrar tekrar dndrmeyi renece iz. g g g Kodlarmz srekli dndrmemizi sa lamada bize yardmc olacak paracklara Pythonda g dng ( Ingilizce: Loop) ad veriliyor. Bu blmde iki tane dngden bahsedece iz: while g ve for dngleri. Ayrca bu blmde dngler dnda break ve continue deyimleri ile range() s ve len() fonksiyonlarna da de inece iz. Bylece ilerleyen blmlerde ileyece imiz daha karg g s g mak konular biraz daha kolay anlamamz sa layacak temeli edinece iz. s g g Isterseniz laf daha fazla uzatmadan yola koyulalm ve ilk olarak while dngsyle ie balayalm... s s

7.1 while Dngs


Yazd mz kodlar tekrar tekrar dndrmemizi sa layan, programmza bir sreklilik katan g g elere dng ad verilir. while dngs, yukarda verilen tanma tam olarak uyar. Yani g yazd mz bir programdaki kodlarn tamam iletilince programn kapanmasna engel olur ve g s kod dizisinin en baa dnmesini sa lar. Ne demek istedi imizi anlatmann en iyi yolu bununla s g g ilgili bir rnek vermek olacaktr. O halde su kck rne i bir inceleyelim bakalm: g
#!/usr/bin/ env python #-*- coding: utf-8 -*a = 0 a = a + 1 print a

Bu minicik kodun yapt i, birinci satrda a de ikeninin de erine bakp ikinci satrda bu g s gs g de ere 1 eklemek, nc satrda da bu yeni de eri ekrana yazdrmaktr. Dolaysyla bu kod g g parasnn verece i kt da 1 olacaktr. Bu kty verdikten sonra ise program sona erecektir. g

76

Bu arada ufak bir ipucu verelim size. Python yukarda grd nz a = a + 1 satrn su sekilde g yazmanza da izin verir:
a += 1

E er a = a - 1 gibi bir sey yazm olsaydk, bunu da su sekilde ksaltabilirdik: g s


a -= 1

a = a * 2 veya a = a / 2 gibi ifadeler de syle ksaltlabilir:


a *= 2

ve:
a /= 2

Bu ksaltmalar son derece nemlidir, nk yazd nz Python programlarnn performansn g artrc etkileri vardr. O yzden kodlarnzda mmkn oldu unca bu ksaltmalar kullanmaya g aln. s Simdi yukardaki koda baz eklemeler yapalm:
#!/usr/bin/env python #-*- coding: utf-8 -*a = 0 while a < 100: a += 1 print a

Bu kodu altrd mzda, 1den 100e kadar olan saylarn ekrana yazdrld n grrz. s g g Konuyu anlayabilmek iin simdi de satrlar teker teker inceleyelim: satrda, 0 de erine sahip bir a de ikeni tanmladk. Ilk g gs Ikinci ve nc satrlarda, a de ikeninin de eri 100 saysndan kk oldu u mddete a gs g g de ikeninin de erine 1 ekle, cmlesini Pythoncaya evirdik. gs g Son satrda ise, bu yeni a de erini ekrana yazdrdk. g ste bu noktada while dngsnn faziletlerini gryoruz. Bu dng sayesinde programmz I son satra her geliinde baa dnyor. Yani: s s
a de ikeninin de erini kontrol ediyor, gs g a de erinin 0 oldu unu gryor, g g a de erinin 100den kk oldu unu idrak ediyor, g g a de erine 1 ekliyor (0 + 1 = 1), g Bu de eri ekrana yazdryor (1), g Baa dnp tekrar a de ikeninin de erini kontrol ediyor, s gs g a de erinin su anda 1 oldu unu gryor, g g a de erinin hl 100den kk oldu unu anlyor, g g a de erine 1 ekliyor (1 + 1 = 2), g Bu de eri ekrana yazdryor (2), g

Bu ilemi 99 saysna ulaana dek tekrarlyor ve en sonunda bu sayya da 1 ekleyerek s s vuslata eriyor.

Grd nz gibi, while dngsn anlamak ve kullanmak hi de zor de il. g g Isterseniz altrma s olmas bakmndan bir rnek daha verelim:
#!/usr/bin/env python # -*- coding: utf-8 -*a = 1 kullanici_adi = "ahmet_hamdi" parola = "Saatleri_Ayarlama_Enstits" while a == 1: kull_ad = raw_input("Kullanc ad: ") par = raw_input("Parola: ") if kull_ad == kullanici_adi and par == parola: print "Programa hogeldiniz!" s a = 2 elif not kull_ad or not par: print "Bu alanlar bo brakamazsnz!" s else: print "Kullanc ad veya parolanz hatal."

Burada ncelikle de eri 1 olan a adl bir de iken tanmladk. Bu de ikenin de eri 1 oldu u g gs gs g g mddete programmz almaya devam edecek. s Bir sonraki satrda kullanici_adi ve parola adl iki de iken daha tanmlyoruz. E er kulgs g lanc, bu de ikenlerin de erini do ru girerse sisteme giri yapabilecek. gs g g s Daha sonra da while dngmz tanmlyoruz. Burada yapt mz seye dikkat edin. while a g == 1 ifadesi ile Pythona sunu sylemi oluyoruz: s a de ikeninin de eri 1 oldu u mddete aa daki kodlar altrmaya devam et! gs g g s g s Bu satrn ardndan normal bir sekilde raw_input() fonksiyonlarmz yardmyla kullancdan kul lanc ad ve parola bilgilerini istiyoruz. Ardndan gelen if deyimini nasl yazd mza dikkat edin. Burada syle bir sey demi olduk: g s E er kull_ad de ikeninin de eri kullanici_adi de ikeninin de eriyle VE par de ikeninin g gs g gs g gs de eri parola de ikeninin de eriyle aynysa... g gs g Buradaki and (VE) ilecinin grevini biliyorsunuz. Bu sayede kullancnn hem kullanc ad hem s de parola bilgisini do ru girmesini isteyebiliyoruz. g Bu arada, buradaki if blo unun iinde grnen a = 2 ifadesi de ok nemli. Bu ifade ile, en g bata belirledi imiz a de ikeninin 1 olan de erini 2ye getiriyoruz. Bylece a de ikeninin s g gs g gs de eri artk 1 olmam oluyor. Bylece kullancmz kullanc ad ve parola bilgilerini do ru g s g girdi inde while dngs sona eriyor. E er burada a de ikeninin de erini 1 dnda bir de ere g g gs g s g ayarlamazsak, kullanc ad ve parola do ru girildi i halde programmz kullanc ad ve parola g g sormaya devam edecektir. Sonraki satrda grd mz elif blo unda ise kullanc ad ve parola alanlarnn bo braklp g g s braklmad n denetliyoruz. E er kullancmz, kullanc ad VEYA (or) parola bilgilerinden herg g hangi birini bo brakrsa kendisine Bu alanlar bo brakamazsnz! uyars gsteriyoruz. s s

else blo unda ise kullanc ad ve parolann yanl girilmesi halinde kullancya nasl bir uyar g s gsterece imizi belirliyoruz. g Yukardaki kodlar istedi imiz ilemi rahatlkla yerine getirmemizi sa lar. Bu adan yukardaki g s g kodlar tamamen do ru ve geerli bir Python programdr. Ancak e er istersek yukardaki kodg g lar biraz sadeletirme ve profesyonel bir grnm kazandrma imkanna da sahibiz. s Su kodlara bir bakn:
#!/usr/bin/env python # -*- coding: utf-8 -*kullanici_adi = "ahmet_hamdi" parola = "Saatleri_Ayarlama_Enstits" while True: kull_ad = raw_input("Kullanc ad: ") par = raw_input("Parola: ") if kull_ad == kullanici_adi and par == parola: print "Programa hogeldiniz!" s quit() elif not kull_ad or not par: print "Bu alanlar bo brakamazsnz!" s else: print "Kullanc ad veya parolanz hatal."

Burada nceki kodlara gre baz farkllklar dikkatimizi ekiyor. Mesela nceki kodlarda yer alan a de ikenini burada artk kullanmyoruz. nk bu de ikene ihtiyacmz kalmad. Bunun gs gs yerine while dngmz su sekilde yazdk:
while True:

Hatrlarsanz geen blmde Bool de erleri incelerken True kelimesinin do ru anlamna g g geldi ini sylemitik. Dolaysyla burada grd mz while True ifadesi su anlama geliyor: g s g Do ru oldu u mddete aa daki kodlar altrmaya devam et! g g s g s Peki ne do ru oldu u mddete? Neyin do ru oldu unu aka belirtmedi imiz iin Python bug g g g g rada her seyi do ru kabul ediyor. Yani bir nevi, aksi belirtilmedi i srece aa daki komutlar g g s g altrmaya devam et! emrini yerine getiriyor. s Bunun dnda farkl olarak ilk if blo u iindeki a = 2 satrn da kaldrdk. Programn en bans g s daki a de ikenini kaldrd mz iin artk bu satra da ihtiyacmz yok. Onun yerine, quit() gs g adl bir fonksiyon kullanyoruz. Siz bu fonksiyonu ilk derslerimizden hatrlyor olmalsnz. Bu fonksiyon Pythonun etkileimli kabu undan kmamz sa lyordu... s g g while dngsn yeni renenlerin en sk yapt hatalardan biri, dngy sona erdirecek bir g g koul belirtmeyi unutmaktr. s Su rne e bir bakalm: g
#!/usr/bin/env python # -*- coding: utf-8 -*soru = raw_input("Python mu Ruby mi?") while soru != "Python": print "Yanl cevap!" s

Dikkat ederseniz burada da ilelerimizden birini kullandk. Kulland mz ile eit de ildir s g s s g anlamna gelen != ileci. Ancak burada dngy sona erdirecek bir koul belirlemedik... s s Bu program altrd mzda sorulan soruya Python cevab vermezsek, program biz mdahale s g edene kadar ekrana Yanl cevap! ktsn vermeye devam edecek, yani sonsuz bir dngye s girecektir. nk biz Pythona su komutu vermi olduk bu kodla: s soru de ikeninin cevab Python olmad mddete ekrana Yanl cevap! ktsn vermeye gs g s devam et! E er bu program durdurmak istiyorsak CTRL+C tularna basmamz gerekir. g s Yukardaki kodlarn iletiliini snrlamak iin syle bir sey yazabiliriz: s s
#!/usr/bin/env python # -*- coding: utf-8 -*olcut = 0 soru = raw_input("Python mu Ruby mi?") while olcut <= 10: olcut += 1 if soru != "Python": print "Yanl cevap!" s

Bu kodlar sayesinde, e er kullancnn verdi i cevap Python de ilse, ekrana on kez Yang g g l cevap! kts verilecektir. Bu kodlar iindeki en nemli satr olcut += 1dir. nk bu s kod, while dngsnn her baa dnnde olcut de ikeninin de erini 1 artrarak 10a yaks s gs g latryor. E er bu satr yazmazsak, olcut de ikeninin de eri her zaman 0 olmaya devam s g gs g edecek, bu nedenle de dngmz srekli almaya devam edecektir. s Simdilik while dngsne ara verip bu konuda incelememiz gereken ikinci dngmze geiy oruz.

7.2 for Dngs


Pythonda en sk kullanlan dng for dngsdr desek abartm olmayz. s yazd nz programlarda bu dngy bolca kullanacaksnz. g Siz de kendi

for dngsnn grevi bir dizi iindeki elerin zerinden tek tek gemektir. Bu tanm big raz kafa kartrc gelmi olabilir. O yzden isterseniz ne demek istedi imizi basit bir rnek s s g zerinde anlatalm:
>>> for harf in "istihza": ... print harf ... i s t i h z a

istihza bir karakter dizisidir. for dngs, bu dizi iindeki elerin zerinden tek tek gememg izi sa lyor. Burada yapt mz sey su: g g

1. ncelikle istihza karakter dizisinin her bir esine harf ad veriyoruz. (for harf in g "istihza") 2. Daha sonra da bu harf de ikenlerini tek tek ekrana yazdryoruz. (print harf) gs for dngs baz durumlarda while dngs ile benzer bir ilevi yerine getirir. Mesela yukarda s while dngsn anlatrken yazd mz su kodu hatrlyorsunuz: g
#!/usr/bin/env python # -*- coding: utf-8 -*a = 0 while a < 100: a += 1 print a

Bu kod yardmyla ekrana 1den 100e kadar olan saylar yazdrabiliyorduk. Ayn ilemi daha s basit bir sekilde for dngs (ve range() fonksiyonu) yardmyla da yapabiliriz:
#!/usr/bin/env python # -*- coding: utf-8 -*for i in range(1, 100): print i

Ben burada de iken ad olarak i harni kullandm, siz isterseniz baka bir harf veya kelime gs s de kullanabilirsiniz. Yukardaki Pythonca kod Trkede aa yukar su anlama gelir: 1- 100 aral ndaki saylarn s g g her birine i adn verdikten sonra ekrana inin de erini yazdr! g Dedi imiz gibi, for dngs, bir dizi iinde bulunan btn elerin zerinden tek tek g g geilmesini sa lar. Yukardaki rnekte de bu dng 1-100 aral ndaki saylarn her biri zg g erinden tek tek geiyor ve bu elerin her birini srayla i olarak adlandryor. g for dngsnn bu zelli inden yararlanarak baz ilgin seyler yapabilirsiniz. Mesela 1-100 g arasndaki ift saylar listelemek istiyor olabilirsiniz:
#!/usr/bin/env python # -*- coding: utf-8 -*for i in range(1, 100): if i % 2 == 0: print i

Burada yapt mz sey aslnda ok basit. Yukardaki kodlar Trkeye syle evirebiliriz: g
#!/usr/bin/env python # -*- coding: utf-8 -*1-100 aralndaki saylara i dersek: g bu iler iinde 2ye tam blnenleri: ekrana bas!

Ayn sekilde tek saylar listelemek de mmkn:


#!/usr/bin/env python # -*- coding: utf-8 -*for i in range(1, 100):

if i % 2 == 1: print i

E er bir say ikiye blnd nde kalan 1 ise o say tektir, kuralndan yararlanarak 1-100 g g aras saylar szgeten geiriyoruz. Bylelikle Pythonda while ve for dnglerini de renmi olduk. Bu arada dikkat ettiyseniz, g s for dngs iin verdi imiz ilk rnekte dng iinde yeni bir fonksiyon kullandk. g Isterseniz bu vesileyle biraz da hem dnglerde hem koullu ifadelerde hem de baka yerlerde karmza s s s kabilecek faydal fonksiyonlara ve ifadelere de inelim: g

7.3 range() fonksiyonu


nceki blmde bu fonksiyonla ilgili epey rnek yapt mz iin, artk bu fonksiyonun yabancs g saylmayz. Bu fonksiyonun ne ie yarad n gayet iyi biliyoruz. Bu fonksiyon Pythonda say s g Ingilizcede de bu kelime aralk anlamna gelir. Mesela: aralklarn belirtmemizi sa lar. Zaten g
print range(100)

komutu 0 ile 100 arasndaki saylar yazdrmamz sa lar. Dedi imiz gibi, bu range() fonksiyg g onunu bir nceki blmde birka rnekte kullanmtk. s Baka bir rnek daha verelim: s
print range(100, 200)

komutu 100 ile 200 arasndaki saylar dker. Bir rnek daha:
print range(1, 100, 2)

Bu komut ise 1 ile 100 arasndaki saylar 2er 2er atlayarak yazdrmamz sa lar. s s g Su ise 100den 1e kadar olan saylar tersten sralar:
print range(100, 1, -1)

Hemen for dngsyle range() fonksiyonunun birlikte kullanld bir rnek verip baka bir g s fonksiyonu anlatmaya balayalm: s
#!/usr/bin/env python #-*- coding: utf-8 -*for sarki in range (1, 15): print sarki, "mumdur"

7.4 len() fonksiyonu


Bu fonksiyon, karakter dizilerinin uzunlu unu gsterir. Mesela: g
#!/usr/bin/env python #-*- coding: utf-8 -*-

a = "Afyonkarahisar" print len(a)

Bu kod, Afyonkarahisar karakter dizisi iindeki harerin saysn ekrana dkecektir. Bu fonksiyonu nerelerde kullanabiliriz? Mesela yazd nz bir programa kullanclarn giri yag s pabilmesi iin parola belirlemelerini istiyorsunuz. Seilecek parolalarn uzunlu unu snrlamak g istiyorsanz bu fonksiyondan yararlanabilirsiniz. Hemen rnek bir kod yazalm:
#!/usr/bin/env python #-*- coding: utf-8 -*a = raw_input("Ltfen bir parola belirleyin: ") if len(a) >= 6: print "Parola 5 karakteri gememeli!" else: print "Parolanz etkinletirilmitir." s s

len() fonksiyonunu yalnzca karakter dizileri ile birlikte kulland mza dikkat edin. g Ilerde bu fonksiyonu baka veri tipleri ile birlikte kullanmay da renece iz. Ancak henz o veri tiplerini s g g grmedik. Dolaysyla simdilik bu fonksiyonun karakter dizileriyle birlikte kullanlabildi ini, ama g saylarla birlikte kullanlamad n bilmemiz yeterli olacaktr. Yani syle bir rnek bizi hsrana g u ratr: g
>>> sayi = 123456 >>> len(sayi) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: object of type int has no len()

Burada grd mz hata mesaj bize, tamsay veri tipinin len() fonksiyonu ile birlikte kulg lanlamayaca n sylyor. Ama syle yaparsak olur: g
>>> kardiz = "123456" >>> len(kardiz) 6

123456 saysn trnak iine alarak bunu bir karakter dizisi haline getirdi imiz iin len() fonksiyg onu grevini yerine getirecektir.

7.5 break deyimi


break deyimi dng iinde bir noktada program sona erdirmek gerekti i zaman kullanlr. g Aa daki rnek break deyiminin ne ie yarad n aka gsteriyor: s g s g
#!/usr/bin/env python #-*- coding:utf-8 -*kullanici_adi = "kullanici" parola = "parola" while True:

soru1 = raw_input("Kullanc ad: ") soru2 = raw_input("Parola: ") if soru1 == kullanici_adi and soru2 == parola: print "Kullanc ad ve parolanz onayland." break else: print "Kullanc adnz veya parolanz yanl." s print "Ltfen tekrar deneyiniz!"

Bu programda break deyimi yardmyla, kullanc ad ve parola do ru girildi inde parola sorma g g ileminin durdurulmas sa lanyor. Yukardaki kodlar arasnda, dikkat ederseniz, daha nce s g bahsetti imiz ilelerden birini daha kullandk. Kulland mz bu ile, ve anlamna gelen g s g s and ileci. Bu ilecin geti i satra tekrar bakalm: s s g
if soru1 == kullanici_adi and soru2 == parola: print "Kullanc ad ve parolanz onayland."

Burada su Trke ifadeyi Pythoncaya evirmi olduk: E er soru1 de ikeninin de eri kul s g gs g lanici_adi de ikeniyle; soru2 de ikeninin de eri de parola de ikeniyle ayn ise ekrana Kulgs gs g gs lanc ad ve parolanz onayland, cmlesini yazdr! Burada dikkat edilmesi gereken nokta su: and ilecinin birbirine ba lad soru1 ve soru2 s g g de ikenlerinin ancak ikisi birden do ruysa o bahsedilen cmle ekrana yazdrlacaktr. Yani gs g kullanc ad ve paroladan biri yanlsa if deyiminin gerektirdi i koul yerine gelmemi olacaks g s s tr. Okulda mantk dersi alm olanlar bu and ilecini yakndan tanyor olmallar. and ilecinin s s s kart or ilecidir. Bu ile Trkede veya anlamna gelir. Buna gre, a veya b do ru ise s s s g dedi iniz zaman, bu a veya b ifadelerinden birinin do ru olmas yetecektir. Sayet a ve b do ru g g g ise derseniz, burada hem a hem de b do ru olmaldr. g

7.6 continue deyimi


Bu deyim ise dng iinde kendisinden sonra gelen her seyin es geilip dngnn en bana s dnlmesini sa lar. ok bilindik bir rnek verelim: g
#!/usr/bin/env python #-*- coding:utf-8 -*while True: s = raw_input("Bir say girin: ") if s == "iptal": break if len(s) <= 3: continue print "En fazla haneli bir say girin."

Burada e er kullanc klavyede iptal yazarsa programdan klacaktr. Bunu, g


if s == "iptal": break

satryla sa lamay baardk. g s

E er kullanc tarafndan girilen say haneli veya daha az haneli bir say ise, continue g deyiminin etkisiyle:
print "En fazla haneli bir say girin."

satr es geilecek ve dngnn en bana dnlecektir. s E er kullancnn girdi i saydaki hane ten fazlaysa ekrana En fazla haneli bir say girin. g g cmlesi yazdrlacaktr.

7.7 Blm Sorular


1. Daha nce yazd mz basit hesap makinesini, while dngs yardmyla srekli alabileg s cek hale getirin. 2. Bu blmde birleik ilelere de de indik. Mesela a += 1 ifadesinde bu birleik ilelerden s s g s s biri olan +=i kullandk. Grd nz gibi, birleik ileler; bir adet aritmetik ile (+) ve bir g s s s adet de atama ilecinden (=) oluuyor. Birleik ilelerde aritmetik ile atama ilecinden nce s s s s s s geliyor. Peki sizce ileler neden byle sralanm. Yani neden a =+ 1 denmemi? s s s 3. 1-10 aras btn ift saylarn karesini hesaplayan bir program yazn. 4. Kullancyla say tahmin oyunu oynayan bir Python program yazn. Programda sabit bir say belirleyin ve kullancdan bu sayy tahmin etmesini isteyin. Kullancnn girdi i saylara gre, g yukar ve aa gibi ifadelerle kullancy do ru sayya yneltin. s g g 5. Kullancyla sohbet eden bir program yazn. Yazd nz bu program kullancnn verdi i cevapg g lara gre tavr de itirebilmeli. rne in balang olarak kullancya nereli oldu unu sorabilir, gs g s g verece i cevaba gre sohbeti ilerletebilirsiniz. g 6. E er siz bir GNU/Linux kullancsysanz, Hangi da tm benim ihtiyalarma uygun? g g sorusuna cevap veren bir program yazn. Bunun iin kullancya baz sorular sorun. Mesela Bilgisayarnzn RAM miktar nedir?, Depolardaki program says sizin iin nem tar m? s gibi... Ald nz cevaplara gre, kullancya nerilerde bulunun. Alternatif olarak, kullancdan g ald cevaplara gre, herhangi baka bir konuda neride bulunan bir program da yazabilirsiniz. g s 7. E er siz bir Windows kullancsysanz, Windows 7ye mi gemeliyim? sorusuna cevap g veren bir program yazn. Yazd nz programda kullancya hz, uyumluluk, yenilik gibi konug larla ilgili sorular sorun. Ald nz cevaplara gre kullancy ynlendirin. Alternatif olarak, g kullancdan ald cevaplara gre, herhangi baka bir konuda neride bulunan bir program da g s yazabilirsiniz.

BLM

Hata Yakalama

Hatalar programclk deneyiminizin bir parasdr. Programclk hayatnz boyunca hatalarla srekli muhatab olacaksnz. Ancak bizim burada kastetti imiz, program yazarken sizin yag paca nz hatalar de il. Kastetti imiz sey, programnz altran kullanclarn sebep oldu u g g g s g ve programnzn kmesine yol aan kusurlar. Dilerseniz ne demek istedi imizi anlatmak iin syle bir rnek verelim: g
#!/usr/bin/env python # -*- coding: utf-8 -*sayi = int(raw_input("Ltfen bir say girin: ")) print "Girdiiniz say", sayi g print "Teekkrler. Hoakaln!" s s

Gayet basit bir program bu, de il mi? Bu program grnte herhangi bir kusur tamyor. E er g s s g kullancmz burada bizim istedi imiz gibi bir say girerse bu programda hibir sorun kmaz. g Programmz grevini baaryla yerine getirir. Peki ama ya kullanc say yerine harf girerse ne s olacak? Mesela kullanc yukardaki program altrp a harne basarsa ne olur? s Byle bir durumda programmz syle bir hata mesaj verir:
Traceback (most recent call last): File "deneme.py", line 4, in <module> sayi = int(raw_input("Ltfen bir say girin: ")) ValueError: invalid literal for int() with base 10: a

Grd nz gibi, ortaya kan hata nedeniyle programn son satr ekrana baslamad. Yani g programmz hata yznden kt iin ilem yarda kald. g s Burada byle bir hata almamzn nedeni, kullancdan say bekledi imiz halde kullancnn harf g girmesi. Biz yukardaki programda int() fonksiyonunu kullanarak kullancdan ald mz karakg ter dizilerini sayya dntrmeye alyoruz. Mesela kullanc 23 de erini girerse bu karaks s g ter dizisi rahatlkla sayya dntrlebilir. Dilerseniz bunu etkileimli kabukta test edelim: s s
>>> int("23") 23

Grd nz gibi 23 adl karakter dizisi rahatlkla sayya dntrlebiliyor. Peki ya su? g s

86

>>> int("a") Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: invalid literal for int() with base 10: a

ste bizim programmzn yapmaya alt sey de tam olarak budur. Yani programmz kulI s g lancdan ald a harni sayya dntrmeye alyor ve tabii ki baarsz oluyor. g s s s Bir kod yazarken, yazlan kodlar iletecek kullanclar her zaman gz nnde bulundurmanz s gerekti ini asla unutmayn. Program altrlrken kullanclarn ne gibi hatalar yapabilecekg s lerini kestirmeye aln. nk kullanclar her zaman sizin istedi iniz gibi davranmayabilir. s g Siz programn yazar olarak, kodlarnz tand nz iin programnz nasl kullanmanz gerekg ti ini biliyorsunuzdur, ama son kullanc byle de ildir. g g Yukardaki kodun, ok uzun bir programn paras oldu unu dnrsek, kullancnn yanl g s s veri girii koskoca bir programn kmesine veya durmasna yol aabilir. Bu tr durumlarda s Python gerekli hata mesajn ekrana yazdrarak kullancy uyaracaktr, ama tabii ki Pythonun sundu u karmak hata mesajlarn kullancnn anlamasn bekleyemeyiz. Bylesi durumlar g s iin Pythonda try... except ifadeleri kullanlr. ste biz de bu blmde bu tr ifadelerin ne I zaman ve nasl kullanlaca n anlamaya alaca z. g s g

8.1 try... except...


Dedi imiz gibi, Pythonda hata yakalamak iin try... except bloklarndan yararlanlr. Gelin g isterseniz bunun nasl kullanlaca na bakalm. g Giri blmnde verdi imiz rne i hatrlyorsunuz. O rnek, kullancnn say yerine harf s g g girmesi durumunda hata veriyordu. Simdi hata mesajna tekrar bakalm:
Traceback (most recent call last): File "deneme.py", line 4, in <module> sayi = int(raw_input("Ltfen bir say girin: ")) ValueError: invalid literal for int() with base 10: a

Burada nemli ksm ValueErrordur. Hatay yakalarken bu ifade iimize yarayacak. s Pythonda hata yakalama ilemleri iki admdan oluur. nce ne tr bir hata ortaya kabilece i s s g tespit edilir. Daha sonra bu hata meydana geldi inde ne yaplaca na karar verilir. Yukardaki g g rnekte biz birinci adm uyguladk. Yani ne tr bir hata ortaya kabilece ini tespit ettik. g Buna gre, kullanc say yerine harf girerse ValueError denen bir hata meydana geliyormu... s Simdi de byle bir hata ortaya karsa ne yapaca mza karar vermemiz gerekiyor. Mesela g yle bir durumda kullancya, Ltfen harf de il, say girin! gibi bir uyar mesaj gsterebiliriz. g Dilerseniz bu dediklerimizi somutlatralm. Kodlarmzn ilk hali syleydi: s
#!/usr/bin/env python # -*- coding: utf-8 -*sayi = int(raw_input("Ltfen bir say girin: ")) print "Girdiiniz say", sayi g print "Teekkrler. Hoakaln!" s s

Bu tarz bir kodlamann hata verece ini biliyoruz. Simdi suna bakn: g

#!/usr/bin/env python # -*- coding: utf-8 -*try: sayi = int(raw_input("Ltfen bir say girin: ")) print "Girdiiniz say", sayi g except ValueError: print "Ltfen harf deil, say girin!" g print "Teekkrler. Hoakaln!" s s

Burada, hata verece ini bildi imiz kodlar bir try... blo u iine aldk. Ardndan bir except blo u g g g g aarak, ne tr bir hata bekledi imizi belirttik. Buna gre, bekledi imiz hata tr ValueError. g g Son olarak da hata durumunda kullancya gsterece imiz mesaj yazdk. Artk kullanclarmz g say yerine harfe basarsa programmz kmeyecek, aksine almaya devam edecektir. Dikkat s ederseniz print "Teekkrler. Hoakaln!" satr her koulda ekrana baslyor. Yani kuls s s lanc do ru olarak say da girse, yanllkla say yerine harf de girse programmmz yapmas g s gereken ilemleri tamamlayp yoluna devam edebiliyor. s Konuyu daha iyi anlayabilmek iin bir rnek daha verelim. Hatrlarsanz bir sayy 0a blmenin hata oldu unu sylemitik. Simdi syle bir program yazd mz dnn: g s g s
#!/usr/bin/env python # -*- coding: utf-8 -*ilk = int(raw_input("Blme ilemi iin ilk sayy girin: ")) s ikinci = int(raw_input("imdi de ikinci sayy girin: ")) S sonuc = float(ilk) / ikinci print sonuc

E er burada kullanc ikinci sayya 0 cevab verirse programmz syle bir hata mesaj verip g kecektir:
Traceback (most recent call last): File "deneme.py", line 7, in <module> sonuc = float(ilk) / ikinci ZeroDivisionError: float division

Byle bir durumda hata alaca mz bildi imize gre ilk adm olarak ne tr bir hata mesaj g g alabilece imizi tespit ediyoruz. Buna gre alaca mz hatann tr ZeroDivisionError. Simdi g g de byle bir hata durumunda ne yapaca mza karar vermemiz gerekiyor. g Isterseniz yine kullancya bir uyar mesaj gsterelim. Kodlarmz yazyoruz:
#!/usr/bin/env python # -*- coding: utf-8 -*s ilk = int(raw_input("Blme ilemi iin ilk sayy girin: ")) ikinci = int(raw_input("imdi de ikinci sayy girin: ")) S try: sonuc = float(ilk) / ikinci print sonuc

except ZeroDivisionError: print "Ltfen sayy 0a blmeye almayn!" s

Bir nceki rnekte de yapt mz gibi burada da hata verece ini bildi imiz kodlar try... blo u g g g g iine aldk. Byle bir durumda alnacak hatann ZeroDivisionError oldu unu da bildi imiz g g iin except blo unu da buna gre yazdk. Son olarak da kullancya gsterilecek uyary beg lirledik. Bylece programmz hata karsnda kmeden yoluna devam edebildi. s Burada nemli bir problem dikkatinizi ekmi olmal. Biz yukardaki kodlarda, kullancnn bir s sayy 0a blmesi ihtimaline kar ZeroDivisionError hatasn yakaladk. Ama ya kullanc s say yerine harf girerse ne olacak? ZeroDivisionError ile birlikte ValueErroru da yakalamamz gerekiyor... E er yukardaki kodlar altran bir kullanc say yerine harf girerse syle g s bir hatayla karlar: s s
Traceback (most recent call last): File "deneme.py", line 4, in <module> ilk = int(raw_input("Blme ilemi iin ilk sayy girin: ")) s ValueError: invalid literal for int() with base 10: a

Buradan anlad mza gre hata veren satr su: ilk = int(raw_input("Blme ilemi iin g s ilk sayy girin: ")) Dolaysyla bu satr da try... blo u iine almamz gerekiyor. g Su kodlar dikkatlice inceleyin:
#!/usr/bin/env python # -*- coding: utf-8 -*try: ilk = int(raw_input("Blme ilemi iin ilk sayy girin: ")) s ikinci = int(raw_input("imdi de ikinci sayy girin: ")) S sonuc = float(ilk) / ikinci print sonuc except ZeroDivisionError: print "Ltfen sayy 0a blmeye almayn!" s except ValueError: print "Ltfen harf deil, say girin!" g

Grd nz gibi hata verece ini bildi imiz kodlarn hepsini bir try... blo u iine aldk. Ardndan g g g g da verilecek hatalar birer except blo u iinde teker teker yakaladk. E er her iki hata iin de g g ayn mesaj gstermek isterseniz syle bir sey yazabilirsiniz:
#!/usr/bin/env python # -*- coding: utf-8 -*try: ilk = int(raw_input("Blme ilemi iin ilk sayy girin: ")) s ikinci = int(raw_input("imdi de ikinci sayy girin: ")) S sonuc = float(ilk) / ikinci print sonuc except (ZeroDivisionError, ValueError): print "Girdiiniz veri hatal!" g

Hata trlerini nasl gruplad mza dikkat edin. Hatalar birbirinden virglle ayrp parantez g

iine alyoruz... Bylece programmz her iki hata tr iin de ayn uyary gsterecek kullancya. Bu blm, hata yakalama konusuna iyi bir giri yapmamz sa lad. s g Ilerde ok daha farkl hata trleriyle karlat nzda bu konuyu ok daha net bir sekilde iinize sindirmi olacaksnz. s s g s Isterseniz simdi bu konuyla ba lantl oldu unu dnd mz, nemli bir deyim olan passi g g s g inceleyelim.

8.2 pass Deyimi


pass kelimesi Ingilizcede gemek anlamna gelir. Bu deyimin Python programlama dilindeki anlam da buna ok yakndr. Bu deyimi Pyhonda grmezden gel, hibir sey yapma anlamnda kullanaca z. Mesela bir hata ile karlaan programnzn hibir sey yapmadan g s s yoluna devam etmesini isterseniz bu deyimi kullanabilirsiniz:
#!/usr/bin/env python # -*- coding: utf-8 -*try: ilk = int(raw_input("Blme ilemi iin ilk sayy girin: ")) s ikinci = int(raw_input("imdi de ikinci sayy girin: ")) S sonuc = float(ilk) / ikinci print sonuc except (ZeroDivisionError, ValueError): pass

Bylece programnz ZeroDivisionError veya ValueError ile karlat nda sessizce yols s g una devam edecek, bylece kullancmz programda ters giden bir seyler oldu unu dahi an g lamayacaktr. Yazd nz programlarda bunun iyi bir sey mi yoksa kt bir sey mi oldu una g g programc olarak sizin karar vermeniz gerekiyor. E er bir hatann kullancya gsterilmesinin g gerekmedi ini dnyorsanz yukardaki kodlar kullann, ama e er verilen hata nemli bir g s g hataysa ve kullancnn bu durumdan haberdar olmas gerekti ini dnyorsanz, bu hatay g s pass ile geitirmek yerine, kullancya hatayla ilgili makul ve anlalr bir mesaj gstermeyi s s dnebilirsiniz. s Yukarda anlatlan durumlarn dnda, pass deyimini kodlarnz henz taslak aamasnda s s oldu u zaman da kullanabilirsiniz. rne in, diyelim ki bir kod yazyorsunuz. Programn g g gidiatna gre, bir noktada yapmanz gereken bir ilem var, ama henz ne yapaca nza s s g karar vermediniz. Byle bir durumda pass deyiminden yararlanabilirsiniz. Mesela birtakm if deyimleri yazmay dnyor olun: s
if .....: byle yap elif .....: s yle yap else: pass

Burada henz else blo unda ne yaplaca na karar vermemi oldu unuz iin, oraya bir pass g g s g koyarak durumu simdilik geitiriyorsunuz. Program son haline gelene kadar oraya bir seyler s yazm olaca z. s g Szn z, pass deyimlerini, herhangi bir ilem yaplmasnn gerekli olmad durumlar iin s g

kullanyoruz. Ilerde ie yarar programlar yazd nzda, bu pass deyiminin grnd nden daha s g g faydal bir ara oldu unu anlayacaksnz. g

8.3 Blm Sorular


1. E er yazd nz bir programda, kullancnn yapabilece i olas hatalar nceden kestirip g g g bunlar yakalamazsanz ne gibi sonularla karlarsnz? s s 2. Daha nce yazd mz basit hesap makinesini, program kullanan kiilerin yapabilece i g s g hatalara kar nlem alarak yeniden yazn. s 3. Pythonda syle bir sey yazmak mmkndr:
try: bir takm iler s except: print "bir hata olutu!" s

Burada dikkat ederseniz herhangi bir hata tr belirtmedik. Bu tr bir kod yazmnda, ortaya kan btn hatalar yakalanacak, bylece kullancya btn hatalar iin tek bir mesaj gsterilebilecektir. bakta gayet gzel bir zellik gibi grnen bu durumun sizce ne gibi Ilk s sakncalar olabilir?

BLM

Listeler

Bu blmden itibaren Pythondaki nemli veri tiplerini incelemeye balayaca z. Burada ins g celeyece imiz veri tipleri srasyla sunlardr: g 1. Liste (list) 2. Demet (tuple) 3. Szlk (dictionary) 4. Kme (set) Bu veri tipleri arasnda zellikle listeler, Pythonun en gl oldu u alanlardan biri olmas g bakmndan ayr bir yere ve neme sahiptir. O yzden ilk nce listeleri inceleyece iz. g Dilerseniz listenin ne demek oldu unu anlatmaya almakla vakit kaybetmek yerine do rudan g s g konuya girelim. Bylece soyut kavramlarla kafa kartrmadan ilerlememiz mmkn olabilir. s Zaten ilk liste rne ini grr grmez bu veri tipinin nasl bir sey oldu unu hemen anlayacakg g snz.

9.1 Liste Olu turmak s


Listeleri kullanabilmek iin ncelikle bir liste oluturmamz gerekiyor. Pythonda herhangi bir s liste oluturmak iin nce listemize bir ad vermeli, ardndan da keli parantezler iinde bu s s listenin elerini belirlemeliyiz. Yani liste olutururken dikkat etmemiz gereken iki temel nokta g s var: Birincisi tpk de ikenlere isim veriyormuuz gibi listelerimize de isim verece iz. Tabii gs s g listelerimizi isimlendirirken Trke karakterler kullanmayaca z. g Ikincisi, listemizi oluturan s eleri keli parantezler iinde yazaca z. Yani Pythonda bir liste oluturmak iin syle bir g s g s yol izleyece iz: g
>>> liste = []

Bylece ilk listemizi baaryla oluturmu olduk. Grd nz gibi, bir liste oluturmak son s s s g s derece kolay. Yapaca mz tek sey liste iin bir ad belirlemek ve liste elerini keli parantez g g s iine almak. Burada listemizin henz herhangi bir esi yok. Yani listemiz su anda bo. Gelin g s isterseniz eleri de olan bir liste oluturmay deneyelim: g s
>>> liste = ["Hale", "Jale", "Lale", 12, 23]

92

Bylece iinde e de barndran, eksiksiz bir liste oluturmu olduk. g s s Isterseniz oluturdu us g muz seyin bir liste oldu unu teyit edelim: g
>>> type(liste) <type list>

Tahmin edece iniz gibi, list kelimesi liste anlamna geliyor. Demek ki gerekten de bir liste g oluturmuuz... s s Daha nce de syledi imiz gibi, burada dikkat etmemiz gereken nokta, liste elerini olutug g s rurken keli parantezler kullanyor olmamz. nk Python, listeleri parantez iaretlerinden s s ayrt eder. Grd nz gibi, liste iine e eklemek de zor de il. Liste iindeki karakter dizilerini her zag g g manki gibi trnak iinde belirtmeyi unutmuyoruz. Tabii ki saylar yazarken bu trnak iaretlerini s kullanmayaca z. g Olmas gerekti i sekilde listemizi oluturduk. Simdi komut satrnda: g s
>>> print liste

komutunu verdi imizde, oluturdu umuz bu liste adl listenin eleri ekrana yazdrlacaktr. g s g g Pythonda liste oluturmann bir baka yolu da list() adl bir fonksiyondan yararlanmaktr. Su s s rne e bir bakalm: g
>>> meyve = "elma" >>> list(meyve) [e, l, m, a]

Grd nz gibi, bu list() fonksiyonunu kullanarak karakter dizisi iindeki karakterlerden bir g liste oluturabiliyoruz. Diyelim ki elinizde birka tane karakter dizisi var ve siz bunlar bir liste s haline getirmek istiyorsunuz. Byle bir durumda bu fonksiyon iinize yarayabilir: s
#!/usr/bin/env python # -*- coding: utf-8 -*a = "elma" b = "armut" c = "kiraz" print list((a, b, c))

list() fonksiyonunda parantez iine sadece tek bir e yazabiliriz. E er birden fazla e kulg g g lanmak istiyorsanz bu eleri ayr bir parantez iinde belirtmeniz gerekir. Bylece Python bu g eleri tek bir eymi gibi alglayacak ve size istedi iniz kty verecektir. g g s g Bylece Pythonda bir listenin nasl oluturulaca n renmi olduk. Simdi isterseniz Python s g g s listelerini biraz daha ayrntl bir sekilde inceleyelim.

9.2 Liste gelerine Eri mek s


Yukardaki rneklerden de grd mz gibi Pythondaki listeler tpk birer de iken gibi tanmg gs lanyor:

>>> liste = []

Bir liste iine e eklemek istedi imiz zaman, eleri birbirinden virgl ile ayryoruz: g g g
>>> spor = ["futbol", "basketbol", "tenis", "golf"]

Peki bir listedeki e saysn nasl renebiliriz? Elbette elle sayarak de il... Mesela su listg g g edeki e saysn elle sayarak bulmak bir Python programcsna hi yakmaz: g s
>>> ... ... ... dagitimlar = ["Ubuntu", "Debian", "Fedora", "Arch", "Gentoo", "SuSe", "Pardus", "RedHat", "Truva", "Gelecek", "Mint", "Mandriva", "PCLinuxOs", "Sabayon", "Mepis", "Puppy", "Slackware", "CentOS", "Knoppix", "Zenwalk", "Sidux", "Elive", "Nexenta", "GNewSense", "Ututo", "Vector"]

Tanmlad mz bir listenin e saysn, bir nceki blmde rendi imiz len() fonksiyonu g g g g yardmyla elde edebiliriz:
>>> len(dagitimlar) 26

Demek ki listemiz 26 eden oluuyormu. Bu arada uzun bir listeyi nasl bld mze ve alt g s s g satra geti imize dikkat edin. g Bu listeyi ekrana yazdrmak iin syle bir sey yapmamz gerekti ini de biliyoruz: g
>>> print dagitimlar [Ubuntu, Debian, Fedora, Arch, Gentoo, SuSe, Pardus, RedHat, Truva, Gelecek, Mint, Mandriva, PCLinuxOs, Sabayon, Mepis, Puppy, Slackware, CentOS, Knoppix, Zenwalk, Sidux, Elive, Nexenta, GNewSense, Ututo, Vector]

Bu sekilde listenin btn elerini ekrana dktk. Peki ya biz bu 26 eli listenin btn g g elerini de il de, mesela sadece birinci esini almak istersek ne yapaca z? g g g g Bunun iin syle bir yntemimiz var:
>>> print dagitimlar[1] Debian

Grd nz gibi, formlmz syle: g


>>> liste_ad[e_sras] g

Yalnz burada dikkat ettiyseniz print dagitimlar[1] komutu Debian kts verdi. Halbuki listenin ilk esi Ubuntu. Bu durum Python listelerinin ok nemli bir zelli idir. Pythonda liste g g eleri 0dan balar. Yani bir listenin ilk esinin sras her zaman 0dr. Dolaysyla yukardaki g s g listede Ubuntu esini elde etmek istiyorsak su komutu yazmalyz: g
>>> print dagitimlar[0] Ubuntu

Bu yntem bize ok daha ilgin seyler yapma imkan da verir. Mesela bu yntemi kullanarak bir listenin belli bir aralktaki elerini alabiliriz: g
>>> liste = ["Hale", "Jale", "Lale", "Ahmet", "Mehmet", "Kezban"]

>>> print liste[0:2] [Hale, Jale]

Grd nz gibi, bu sekilde listenin birinci ve ikinci elerini ayr bir liste olarak alabiliyoruz. g g E er alaca nz ilk enin sras 0 ise yukardaki komutu syle de yazabilirsiniz: g g g
>>> print liste[:2]

E er iki nokta st ste iaretinin sol tarafndaki sayy yazmazsanz Python oraya 0 yazmsnz g s s gibi davranacaktr. Elimiz alsn diye birka rnek yapalm bununla ilgili: s
>>> print liste[2:5] [Lale, Ahmet, Mehmet] >>> print liste[2:6] [Lale, Ahmet, Mehmet, Kezban]

Son rnekte alaca mz son e listenin de son esi. O yzden o komutu syle de yazabiliriz: g g g
>>> print liste[2:] [Lale, Ahmet, Mehmet, Kezban]

E er iki nokta st ste iaretinin sa ndaki sayy yazmazsak Python oraya listenin son esinin g s g g srasn yazmz gibi davranacaktr. s E er 0dan balayarak bir listenin btn elerini almak istersek de syle bir sey yazabiliriz: g s g
>>> print liste[:] [Hale, Jale, Lale, Ahmet, Mehmet, Kezban]

Bu yntem, bir listeyi tamamen kopyalamann iyi bir yoludur:


>>> liste2 = liste[:] >>> print liste2 [Hale, Jale, Lale, Ahmet, Mehmet, Kezban] >>> print liste [Hale, Jale, Lale, Ahmet, Mehmet, Kezban]

Grd nz gibi, ayn elere sahip iki farkl liste oluturduk. Yalnz bu iki listenin birbirinden g g s farkl oldu unu unutmayn. Yani bir liste zerinde yapt nz de iiklik teki listeyi etkilemeyeg g gs cektir. Listelere yukardaki gibi eriirken nc bir say daha verebiliriz: s
>>> liste[0:6:2] [Hale, Lale, Mehmet]

Grd nz gibi, nc say liste elerinin kaar kaar atlanarak ekrana baslaca n gsg g g teriyor. Burada 0dan balayarak 6. sraya kadar olan eleri ikier ikier atlayarak ekrana s g s s bastk.

Yukardaki komutu syle de yazabilirdik:


>>> liste[::2] [Hale, Lale, Mehmet]

nc say eksi de erli de olabilir. O zaman liste eleri geriye do ru sralanacaktr: g g g


>>> liste[::-2] [Kezban, Ahmet, Jale]

Btn eleri tersten sralamak istersek syle bir sey yazabiliriz: g


>>> liste[::-1] [Kezban, Mehmet, Ahmet, Lale, Jale, Hale]

Pythonda liste oluturmay ve bu listenin elerine erimeyi rendi imize gre simdi listeleri s g s g g ynetmeyi; yani listeye e ekleme, listeden e karma gibi ilemleri nasl yapaca mz g g s g renebiliriz. Bu ii Pythonda baz paracklar (ya da daha teknik bir dille sylemek gerekirse g s metotlar...) yardmyla yapyoruz. Isterseniz gelin simdi bu metotlarn neler oldu una ve g nasl kullanldklarna bakalm.

9.3 Liste Metotlar


Dedi imiz gibi, Pythondaki listeleri ynetebilmek iin metot denen baz aralardan yararg lanmamz gerekiyor. Peki nedir bu metot denen sey? Metotlar, Pythonda bir veri tipinin zelliklerini de itirmemizi veya sorgulamamz sa layan gs g olduka yetenekli paracklardr. Listelerle birlikte hangi metotlar kullanabilece imizi reng g mek iin dir() adl bir fonksiyondan yararlanabiliriz. Bu fonksiyonu listeler zerine su sekilde uyguluyoruz:
>>> liste = [] >>> dir(liste)

Dilerseniz bo bir liste tanmlamakla hi u ramadan, listelerin ayrt edici zelli i olan keli s g s g s parantezleri de kullanabilirsiniz:
>>> dir([])

Hatta listelerin Pythondaki ad olan list kelimesini dahi kullanabilirsiniz:


>>> dir(list)

Tercih tamamen size kalm... s Bu komutlardan herhangi birini verdi imizde syle bir cevap alrz: g
[__add__, __class__, __contains__, __delattr__, __delitem__, __delslice__, __doc__, __eq__, __format__, __ge__, __getattribute__, __getitem__, __getslice__, __gt__, __hash__, __iadd__, __imul__, __init__, __iter__, __le__, __len__, __lt__, __mul__, __ne__, __new__, __reduce__, __reduce_ex__, __repr__, __reversed__, __rmul__, __setattr__, __setitem__, __setslice__, __sizeof__, __str__, __subclasshook__, append, count, extend,

index, insert, pop, remove, reverse, sort ]

ste bu grd mz ktdaki eler listelerin metotlar oluyor. Burada bizi ilgilendiren metotlar I g g banda ve sonunda __ iaretini tamayanlar. Yani sunlar: s s s
append count extend index insert pop remove reverse sort

Biz bu blmde bu metotlar ilevlerine gre gruplayarak inceleyece iz. s g Isterseniz hemen yola koyulalm.

9.3.1 Listeye ge Eklemek


Pythonda herhangi bir listeye e eklemek iin append() metodundan yararlanabiliriz. append g kelimesi Trkede eklemek anlamna gelir. Bu metodun yapt sey de tam olarak budur g zaten. ncelikle bir liste oluturalm: s
>>> programlama_dilleri = ["Python", "Ruby", "Perl"]

Bylece elimizde programlama_dilleri adl bir liste olmu oldu. Simdi bu listeye C++ esini s g ekleyelim:
>>> programlama_dilleri.append("C++")

Simdi listeyi ekrana yazdrd mzda eler arasnda C++ da grece iz: g g g
>>> print programlama_dilleri [Python, Ruby, Perl, C++]

Burada append() metodunu nasl kulland mza dikkat edin. Formlmz syle: g
liste_ad.metot()

Altrma olmas iin bir rnek daha yapalm: s


>>> alisveris_listesi = [] >>> alisveris_listesi.append("soan") g >>> print alisveris_listesi [so\xa7an]

Grd nz gibi, append() metoduyla bo bir listeye de e ekleyebiliyoruz. g s g Burada dikkatimizi eken baka bir sey daha var. Listeyi ekrana yazdrd mzda Trke karaks g ter ieren so an esi dzgn grnmyor. Bu durum normal. Python liste ktlarnda Trke g g

karakterleri gsteremez. Ama liste iindeki Trke karakterli eleri dzgn gstermenin bir g yolu var:
>>> for oge in alisveris_listesi: ... print oge ... soan g

for dngsnden yararlanarak liste elerini tek tek ekrana dkebiliriz. Bu srada da Trke g karakterler, olmas gerekti i gibi grnecektir. Bir rnek daha yapalm: g
>>> alisveris_listesi = ["soan", "sarmsak", "ilek", "zm"] g >>> print alisveris_listesi [so\xa7an, sar\x8dmsak, \x87ilek, \x81z\x81m] >>> for i in alisveris_listesi: ... print i ... soan g sarmsak ilek zm

Grd nz gibi Pythonda areler tkenmiyor. g append() metodunu kullanarak bir listeye tek tek e ekleyebiliyoruz. Peki ayn metodu kullag narak listeye birden fazla e ekleyebilir miyiz? Deneyelim: g
>>> iller = [] >>> iller.append("Adana", "Mersin") Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: append() takes exactly one argument (2 given)

Burada Python bize bir hata mesaj verir, nk append() metodu yalnzca tek bir e kabul g eder. Biz burada iki e vermiiz... g s Demek ki bu metodu kullanarak bir listeye sadece tek bir e ekleyebiliyoruz. g metodu ile syle bir sey yapabilirsiniz, ancak istedi iniz tam olarak bu olmayabilir: g
>>> iller.append(["Adana", "Mersin"])

append()

Burada append() metodu iinde bir liste oluturduk ([Adana, Mersin]) ve do rudan bu s g listeyi iller adl listeye ekledik. Simdi suna bakalm:
>>> print iller [[Adana, Mersin]]

Burada i ie gemi iki tane liste gryoruz. Demek ki yukardaki sekilde e ekledi imizde s g g Python bunu yine tek bir e olarak ekliyor. O yzden her zaman istedi iniz sey bu olmayabilir. g g Peki bir listeye birden fazla e eklemek istersek elimizde hi bir imkan yok mu? Elbette var. g Mesela for dnglerinden yararlanabilirsiniz:

>>> lst = ["Adana", "Mersin"] >>> iller = [] >>> for i in lst: ... iller.append(i) >>> print iller [Adana, Mersin]

Bylece istedi imizi elde etmi olduk. Ama Python bize ayn seyi ok daha temiz bir sekilde g s yapma imkan da sa lar. Bunun iin baka bir metottan yararlanaca z. O metodun ad extend. g s g Yukardaki rne i extend metodunu kullanarak yazalm: g
>>> iller = [] >>> iller.extend(["Adana", "Mersin"]) >>> print iller [Adana, Mersin]

extend kelimesi Trkede geniletmek, uzatmak gibi anlamlara gelir. Bu metot, anlamna s uygun olarak bir listeyi baka bir liste ile geniletir... Yani bir listenin elerini baka bir listeye s s g s tek tek ekler. extend metodunu kullanarak bir listeye tek bir e ekleyemezsiniz. Daha do rusu ald nz g g g sonu bekledi iniz gibi olmayabilir. Mesela: g
>>> os = ["Windows", "Mac"] >>> os.extend("GNU/Linux") >>> print os [Windows, Mac, G, N, U, /, L, i, n, u, x]

Grd nz gibi, extend metodu GNU/Linux iindeki her bir karakteri tek tek listeye ekledi. g Ayn etkiyi append() metodu ile elde etmek istersek yine for dngsnden yararlanabiliriz:
>>> os = ["Windows", "Mac"] >>> for harf in "GNU/Linux": ... os.append(harf) >>> print os [Windows, Mac, G, N, U, /, L, i, n, u, x]

Dikkat ederseniz hem append(), hem de extend() metotlar eyi hep listenin en sonuna ekg liyor. Ama biz yazd mz programlarda bazen eyi belli bir sraya yerletirmek isteyebiliriz. g g s ste bunun iin kullanabilece imiz baka bir metot daha var Pythonda: insert() metodu. I g s Kelime olarak insert, Trkede yerletirmek, sokmak gibi anlamlara gelir. Bu metodu kullas narak bir eyi bir listenin belli bir srasna yerletirece iz. rne in: g s g g

>>> lst = ["Ahmet", "Mehmet", "Salih"] >>> lst.insert(0, "Ali") >>> print lst [Ali, Ahmet, Mehmet, Salih]

Burada insert() metodunu nasl kulland mza dikkat edin. Metodun parantezi iindeki ilk say, g yeni enin yerletirilece i konumu gsteriyor. g s g Ikinci enin ne oldu u ise belli. Burada biz g g listenin sfrnc, yani ilk srasna Ali adl bir e yerletirdik. g s

9.3.2 Listeden ge Silmek


Bir nceki blmde grd mz metotlar yardmyla listeye e ekleyebiliyoruz. Peki ya listeg g den e silmek istersek ne yapaca z? g g Bu ilem iin de baz metotlarmz var. Mesela remove() metodu. s
>>> mevsimler = ["lkbahar", "Yaz", "Sonbahar", "K"] I s >>> mevsimler.remove("lkbahar") I >>> print mevsimler [Yaz, Sonbahar, K\x8d\x9f]

Grd nz gibi, remove() metodunu kullanarak liste iindeki istedi imiz bir eyi listeden g g g karabiliyoruz. Burada eyi listeden karabilmek iin enin adn yazmamz gerekti. Peki g g ya biz eyi adna gre de il de listedeki srasna gre karmak istersek ne yapaca z? Yani g g g mesela listedeki 1. eyi karmak istiyoruz diyelim... g del adl zel bir deyimi kullanarak bu amacmz gerekletirebiliriz: s
>>> del mevsimler[0]

Bu komut, mevsimler adl listenin ilk esini siler. g silebilirsiniz:


>>> del mevsimler

Ayn deyimle listenin tamamn da

Bylece mevsimler adl listeyi tamamen silmi olduk: s


>>> print mevsimler Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name mevsimler is not defined

remove() metodu ve del deyimi dnda, listelerden e silmenin bir baka yolu daha vardr: s g s pop() metodu.
>>> gunler = ["Pazartesi", "Sal", "aramba", "Perembe", s s ... "Cuma", "Cumartesi", "Pazar"] >>> gunler.pop() Pazar

pop() metodunun teki metotlardan fark, sildi i eyi bir de ekrana basmasdr. Bu metot g g bir listedeki en son eyi siler ve ekrana basar. g Isterseniz bu metodun kanc sradaki eyi g silece ini belirleyebilirsiniz: g
>>> gunler.pop(0) Pazartesi

Bu komut listedeki 0. eyi silip ekrana basacaktr. g

9.3.3 Liste gelerini Sralamak


Pythonda liste elerini iki sekilde sralayabiliriz: Birincisi, liste elerini ters evirebiliriz. g g Ikincisi, liste elerini alfabe srasna dizebiliriz. g Liste elerini ters evirmek iin reverse() adl bir metottan yararlanaca z: g g
>>> sayilar = range(10) >>> print sayilar [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> sayilar.reverse() >>> print sayilar [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

Liste elerini alfabe srasna dizmek iin ise sort() adl bir metottan yararlanaca z: g g
>>> isimler = ["Ahmet", "Mehmet", "Selami", "Doruk", "Ege"] >>> isimler.sort() >>> print isimler [Ahmet, Doruk, Ege, Mehmet, Selami]

Grd nz gibi liste iindeki isimler alfabe srasna dizildi. Yalnz bu metot Trke karakter g ieren kelimelerde sorun yaratabilir:
>>> isimler = ["Krat", "kke", "etin", "Frat"] s s >>> isimler.sort() >>> print isimler [F\x8drat, K\x81r\x9fat, \x80etin, \x99kke\x9f]

Isimlerde Trke karakter oldu u iin alfabe srasna dizme ilemi baarsz oldu. g s s Bu sorunun stesinden gelmek iin syle bir kod yazabilirsiniz:
#!/usr/bin/env python # -*- coding: utf-8 -*import locale

locale.setlocale(locale.LC_ALL, "") isimler = ["Krat", "kke", "etin", "Frat"] s s isimler.sort(key = locale.strxfrm) for i in isimler: print i

Bu kodlardaki pek ok seyi henz renmedik. Benim amacm sadece sort() metoduyla Trke g karakter ieren kelimelerin de alfabe srasna dizilebilece ini gstermek. Yukardaki kodlarda g grd mz her seyi birka blm sonra renmi olaca z. g g s g

9.3.4 Liste gelerinin Srasn Bulmak


Pythonda bir liste iindeki elerin srasn bulmak iin index() adl bir metottan yararlanyg oruz. Bu metot bir enin liste iinde hangi srada yer ald n bildirir: g g
>>> lst = ["erik", "ilek", "karpuz", "kavun"] >>> lst.index("ilek") 1

E er bir liste iinde ayn eden birden fazla sayda varsa, bu metot yalnzca ilk rastlad g g g eyi bulacaktr. Mesela: g
>>> meyveler = ["elma", "erik", "elma", "ilek", ... "karpuz", "kavun", "su", "elma"] >>> meyveler.index("elma") 0

Grd nz gibi, elma esi liste iinde birka farkl konumda geti i halde index() metodu g g g yalnzca 0. konumdaki eyi buldu. Ancak bu metodun liste iinde geen ayn elerin g g tamamn bulmasn sa lamak da mmkn. Peki ama nasl? g index() metodu, parantez iinde ikinci bir de er daha alr. Su rne e bakalm: g g
>>> meyveler = ["elma", "erik", "elma", "ilek", ... "karpuz", "kavun", "su", "elma"] >>> meyveler.index("elma") 0 >>> meyveler.index("elma", 1) 2 >>> meyveler.index("elma", 2) 2 >>> meyveler.index("elma", 3)

Burada parantez iine yazd mz ikinci de er, index() metodunun, bir eyi liste iinde hangi g g g konumdan itibaren aramaya balayaca n gsteriyor. Bunun ntanml de eri 0dr. Yani e er s g g g parantez iindeki ikinci de eri belirtmezseniz, Python siz oraya 0 yazmsnz gibi davranacak g s ve aramaya 0. srada balayacaktr. E er bu de er 1 yaparsanz Python listeyi taramaya 1. s g g eden balayacak ve bylece, 0. sray atlad iin 2. srada yer alan elma esini bulabileg s g g cektir. E er bu de eri 3 yaparsak, Python bu kez listeyi taramaya 3. sradan balayacak ve g g s bylece, 0. ve 2. sradaki eleri atlad iin 7. sradaki elma esini bulabilecektir. g g g Bu bilgiyi kullanarak, bir liste iindeki elerin hangi konumlarda yer ald n gsteren bir prog g gram yazabiliriz:
#!/usr/bin/env python # -*- coding: utf-8 -*#meyve listesini tanmlayalm... meyveler = ["elma", "erik", "elma", "ilek", "karpuz", "kavun", "su", "elma"] #Bu say index() metodunun parantezi iindeki #ikinci deer olacak. Bu deeri bir while g g #dngs iinde birer birer arttracaz. g sira = 0 #Bu liste, aranan enin listede bulunduu g g #konumlar tutuyor. liste = [] #while dngmz yazyoruz. while sira < len(meyveler): #Bu try... except... blounun grevini anlamak g #iin "elma" yerine baka bir e koyun ve try... s g #except... bloklarn kaldrn. try: oge = meyveler.index("elma", sira) except ValueError: pass #sra deikeninin deerini birer birer g s g #arttryoruz. Bylece index() metodu listenin #her noktasn tarayabiliyor. sira += 1 #Burada amacmz ayn saynn listeye eklenmesini #engellemek. Bunu tam olarak ne ie yaradn s g #anlamak iin de "if not oge in liste:" satrn #kaldrmay deneyebilirsiniz. if not oge in liste: liste.append(oge) #listedeki deerleri bir karakter dizisi iine g #alp ekrana basyoruz. for nmr in liste: print "aranan e %s konumunda bulundu!"%nmr g

9.3.5 Liste gelerinin Saysn Bulmak


Pythonda bir liste iindeki elerin saysn bulmak iin count() adl bir metottan yararlanyg oruz. Bu metot bir enin liste iinde ka kez geti ini bildirir: g g
>>> lst = ["erik", "ilek", "karpuz", "erik", "kavun", "karpuz", "ilek"] >>> lst.count("erik") 2

9.4 sum() Fonksiyonu


Diyelim ki kullancdan ald saylar birbiriyle toplayan bir program yazmak istiyorsunuz. g Bunun iin syle bir sey yapabilirsiniz:
#!/usr/bin/env python # -*- coding: utf-8 -*a = 0 print """ Toplama ilemi iin say girin: s (Programdan kmak iin q tuuna basn) s """ while True: sayi = raw_input("say: ") if sayi == "q": print "hoakaln!" s break else: a += int(sayi) print "girdiiniz saylarn toplam: ", a g

Bu programn mant sudur: ncelikle a adl bir de iken oluturuyoruz. Bu de ikenin de eri g gs s gs g bir saydr. Kullancnn girdi i her say bu de ikenin mevcut de eriyle toplandktan sonra g gs g yine bu de ikene atanacak. Bylece kullancnn girdi i btn saylarn toplam de eri bu a gs g g de ikeninin de de eri olacak. Dolaysyla kullancnn girdi i saylarn toplamn bulmak iin gs g g programn sonunda a de ikenini ekrana yazdrmamz yeterli olacaktr. gs Kullancnn program sona erdirebilmesi iin q tuunu belirliyoruz. E er kullanc say girmek s g yerine bu tua basarsa program sona erecektir. Ayrca else blo u iinde, kullancdan ald mz s g g sayy inte, yani tamsayya dntrd mze dikkat edin. s g Yukardakine benzer bir ilemi Pythonda zel bir fonksiyon olan sum() yardmyla da gereks letirebiliriz. Bu fonksiyon, bir dizi iindeki saylarn birbiriyle kolayca toplanmasn sa lar. s g Bununla ilgili bir rnek syle olabilir:
>>> sayilar = [2, 3, 4] >>> print sum(sayilar) 9

veya:
>>> print sum([2, 3, 4]) 9

Grd nz gibi, sum() fonksiyonu, kendisine verilen bir dizi sayy alp bu saylar birbiriyle g topluyor. Dilerseniz bu blmn banda verdi imiz rne i sum() fonksiyonunu kullanarak s g g tekrar yazalm:
#!/usr/bin/env python # -*- coding: utf-8 -*sayilar = [] print """ Toplama ilemi iin say girin: s (Programdan kmak iin q tuuna basn) s """ while True: sayi = raw_input("say: ") if sayi == "q": print "hoakaln!" s break else: sayilar.append(int(sayi)) print "girdiiniz saylarn toplam: ", sum(sayilar) g

Bu defa ncelikle sayilar adl bir liste oluturduk. Kullancdan gelen saylar bu listede s tutaca z. Kullancdan gelen saylar bu listeye eklemek iin append() metodundan yararg land mza dikkat edin. sayilar adl liste iinde biriken saylar toplamak iin de sum() g fonksiyonundan yararlandk.

9.5 enumerate() Fonksiyonu


Hatrlarsanz, dir() adl bir fonksiyon yardmyla liste metotlarn topluca ekrana yazdrabilece imizi renmitik: g g s
>>> dir(list)

E er burada toplam ka metot oldu unu renmek istersek len() fonksiyonu iimizi gryor: g g g s
>>> len(dir(list)) 45

Peki ya dir(list) ktsnda grnen metotlar numaralandrmak istersek ne yapaca z? g ste bunun iin enumerate() adl bir fonksiyonumuz var. Bakalm bu fonksiyonu nasl kullanyI oruz:
>>> liste = dir(list) >>> for i in enumerate(liste):

... ... (0, (1, (2, (3, (4, (5, (6, (7, (8, (9,

print i __add__) __class__) __contains__) __delattr__) __delitem__) __delslice__) __doc__) __eq__) __format__) __ge__)

Biz burada ktnn tamamn gstermiyoruz, ancak grd nz gibi, dir(list) komutunun g verdi i btn ktlar (sra_no, metot_ad) seklinde ekrana dklyor. Simdi suna bakn: g
>>> for sira_no, metot_adi in enumerate(liste): ... print "%s. %s" %(sira_no, metot_adi) ... 0. __add__ 1. __class__ 2. __contains__ 3. __delattr__ 4. __delitem__ 5. __delslice__ 6. __doc__ 7. __eq__ 8. __format__ 9. __ge__

Bu kodlarla kty nasl istedi imiz kvama getirdi imizi gryorsunuz. Burada for sira_no, g g metot_adi in enumerate(liste): satrna zellikle dikkat edin. Bir nceki rnekte enumerate(liste) ieri inin (sira_no, metot_adi) seklinde oldu unu grmtk. ste g g s I biz for sira_no, metot_adi satr ile, ktdaki sra numaralarn sira_no adl de ikene, gs metot adlarn ise metot_adi adl de ikene atyoruz. Yukardaki kodu syle yazacak olursanz gs durum daha da netleecektir: s
>>> for sira_no, metot_adi in enumerate(liste): ... print sira_no ... 0 1 2 3 4 5 6 7 8 9 >>> for sira_no, metot_adi in enumerate(liste): ... print metot_adi ... __add__ __class__ __contains__ __delattr__

__delitem__ __delslice__ __doc__ __eq__ __format__ __ge__

Grd nz gibi, sira_no de ikeni sra numaralarn, metot_adi de ikeni ise metot adg gs gs larn tutuyor. Yukarda print "%s. %s" %(sira_no, metot_adi) satryla yapt mz sey g ise enumerate() fonksiyonundan gelen bu sra numaralarn ve metot adlarn %s iaretlerini s kullanarak dzgn bir sekilde biimlendirmekten ibarettir. Bu arada dikkat ederseniz enumerate() ile verdi imiz numaralar sfrdan balyor. E er ilk g s g saynn 0 yerine 1 olmasn isterseniz yukardaki kodu syle yazabilirsiniz:
>>> for sira_no, metot_adi in enumerate(liste, 1): ... print "%s. %s" %(sira_no, metot_adi)

Burada 1 yerine istedi iniz sayy yerletirerek, sralamaya istedi iniz saydan balanmasn g s g s sa layabilirsiniz. g

9.6 in Deyimi
Aslnda biz bu in deyimini biliyoruz. Mesela:
>>> for i in range(10): ... print i

Biz bu deyimi for dngsyle birlikte kullanyorduk.

in deyimi bir ifadeye temel olarak -de/-da, iinde anlam katar. Bu deyimi kullanarak bir seyin baka bir seyin iinde olup olmad n sorgulayabiliriz: s g
>>> liste = ["elma", "armut", "ilek", "erik", "muz"] >>> "elma" in liste True

Burada tam olarak syle dedik: liste iinde elma var m? elma esi liste iinde bulundu u iin Python bize True cevabn verdi. Bir de suna bakalm: g g
>>> "karpuz" in liste False

Liste iinde karpuz diye bir e olmad iin Python bize False cevab verdi... g g Gelin isterseniz bununla ilgili syle bir rnek verelim:
#!/usr/bin/env python # -*- coding: utf-8 -*turkce_harfler = "" sg ISG kontrol_listesi = [] dosya = raw_input("Dosya iin bir ad sein: ")

for hrf in dosya: if hrf in turkce_harfler: kontrol_listesi.append(hrf) if kontrol_listesi: print "Dosya adnda Trke harf olmamal!" elif len(dosya) > 8: print "Dosya ad en fazla 8 karakter ierebilir!" else: print "Dosya %s adyla kaydedildi!" %dosya

Burada yapt mz sey aslnda ok basit. nce Trke harerin tanmland bir liste olutug g s ruyoruz. Daha sonra kullancdan gelen dosya adna bakp bunun iinde Trke karakter olup olmad n denetliyoruz. E er dosya adnda Trke karakter varsa bunlar kontrol listesine ekg g liyoruz. E er kontrol listesinde en az bir tane e varsa dosya ad Trke karakter ieriyor g g demektir.

9.7 min() ve max() Fonksiyonlar


Bir say dizisi iinde yer alan saylarn en by n veya en k n renmeniz gerekirse g g g ne yaparsnz? Elbette min() ve max() fonksiyonlarndan yararlanrsnz.
>>> ... ... ... ... ... lst 80, 35, 94, 39, 75, = [45, 24, 98, 71, 43, 94, 35, 90, 66, 39, 97, 96, 66, 26, 34, 61, 77, 30, 92, 88, 59, 64, 50, 27, 63, 77, 48, 28, 52, 78, 56, 61, 52, 41, 53, 75, 93, 97, 58, 75, 73, 57, 73, 73, 46, 74, 31, 40, 100, 73, 40, 25, 64, 96, 27, 33, 77, 62, 97, 25, 76, 33, 42, 99, 33, 54, 99, 62, 99, 72, 90, 62, 78, 39, 92, 42, 58, 50, 41, 73, 27, 54, 37, 34, 63, 80, 100, 83, 32, 65, 49, 82, 64, 42, 30]

>>> min(lst) #listedeki en kk say 24 >>> max(lst) #listedeki en byk say 100

9.8 Blm Sorular


1. Su rnekte, kullancdan ald mz karakter dizisini neden int(raw_input("say: ")) g seklinde en bata de il de else blo u iinde sayya dntrmeyi tercih etti imizi aklayn. s g g s g
#!/usr/bin/env python # -*- coding: utf-8 -*a = 0 print """ Toplama ilemi iin say girin: s (Programdan kmak iin q tuuna basn) s """

while True: sayi = raw_input("say: ") if sayi == "q": print "hoakaln!" s break else: a += int(sayi) print "girdiiniz saylarn toplam: ", a g

2. http://wiki.ubuntu-tr.net/index.php/Ubuntuda_S%C3%BCr%C3%BCm_%C4%B0simleri_ve_Anlamlar%C4%B adresinde bulunan Ubuntu srm isimlerini bir liste haline getirin ve ekrana suna benzer bir kt verin:
1) Warty Warthog 2) Hoary Hedgehog ...

3. Bir program yazarak kullancdan 10 adet say girmesini isteyin. Kullancnn ayn sayy birden fazla girmesine izin vermeyin. Programn sonunda, kullancnn girdi i saylar tek ve g ift saylar olarak ikiye ayrn ve her bir say grubunu ayr ayr ekrana basn. 4. Aa daki program, liste esini kullancdan alacak sekilde yeniden yazn. E er kullancnn s g g g arad e listede yoksa kendisine bir uyar mesaj gsterin ve baka bir e arayabilme sans g g s g verin:
#!/usr/bin/env python # -*- coding: utf-8 -*meyveler = ["elma", "erik", "elma", "ilek", "karpuz", "kavun", "su", "elma"] sira = 0 liste = [] while sira < len(meyveler): try: oge = meyveler.index("elma", sira) except ValueError: pass sira += 1 if not oge in liste: liste.append(oge) for nmr in liste: print "aranan e %s konumunda bulundu!"%nmr g

5. Liste metotlar iinde sadece bizi ilgilendiren su metotlar ekrana dken bir program yazn:
append count extend index insert pop remove reverse sort

BLM

10

Demetler

Demetler, bir nceki blmde inceledi imiz listelere ok benzer. Ama listeler ile aralarnda g ok temel bir fark vardr. Listeler zerinde oynamalar yapabiliriz. Yani e ekleyebilir, e g g karabiliriz. Demetlerde ise byle bir sey yoktur. Demeti su sekilde tanmlyoruz:
>>> demet = "Ali", "Veli", 49, 50

Grd nz gibi, yapt mz bu i de iken tanmlamaya ok benziyor. g g s gs Istersek demetin elerini parantez iinde de gsterebiliriz: g
>>> demet2 = ("Ali", "Veli", 49, 50)

Parantezli de olsa parantezsiz de olsa yukarda tanmladklarmzn ikisi de demet snfna giriyor. Isterseniz bu durumu teyit edelim:
>>> type(demet) <type tuple> >>> type(demet2) <type tuple>

tuple kelimesi Trkede demet anlamna gelir... Peki bo bir demet nasl oluturulur? ok basit: s s
>>> demet = ()

Peki tek eli bir demet nasl oluturulur? O kadar basit de il. Aslnda basit ama biraz tuhaf: g s g
>>> demet = ("su",)

Grd nz gibi, tek eli bir demet oluturabilmek iin enin yanna bir virgl koyuyoruz! g g s g Hemen teyit edelim:
>>> type(demet) <type tuple>

110

O virgl koymazsak ne olur?


>>> demet2 = ("su")

demet2nin tipini kontrol edelim:


>>> type(demet2) <type str>

Demek ki, virgl koymazsak demet de il, alelade bir karakter dizisi oluturmu oluyoruz. g s s Yukarda anlatt mz sekilde bir demet oluturma iine demetleme (packing) ad veriliyor. g s s Bunun tersini de yapabiliriz. Buna da demet zme deniyor (unpacking). nce demetleyelim:
>>> aile = "Anne", "Baba", "Kardesler"

Simdi demeti zelim:


>>> a, b, c = aile

Bu sekilde komut satrna print a yazarsak, Anne esi; print b yazarsak Baba esi; print g g c yazarsak Kardesler esi ekrana yazdrlacaktr. Demet zme ileminde dikkat etmemiz g s gereken nokta, eittir iaretinin sol tarafnda demetteki e says kadar de iken ad belirs s g gs lememiz gerekti idir. g nceki blmde grd mz enumerate() fonksiyonunu hatrlyorsunuz. Bu fonksiyonu syle g bir rnek iinde kullanabilece imizi de biliyorsunuz: g
>>> liste = dir(list) >>> for a, b in enumerate(liste): ... print a, b

Bu da aslnda bir demet zme ilemidir. Bildi iniz gibi enumerate() fonksiyonu bir demet s g retir. Bunu hemen teyit edelim:
>>> liste = dir(list) >>> for i in enumerate(liste): ... print type(i) ... <type tuple>

Grd nz gibi elde etti imiz sey bir demet. Dolaysyla print a dedi imiz zaman bu g g g demetin ilk esini, print b dedi imiz zaman da ikinci esini ekrana yazdrm oluyoruz. g g g s En bata da dedi imiz gibi, demetler listelere ok benzer. Peki, listeler varken bu demetler s g ne ie yarar? diye sordu unuzu duyar gibiyim. s g Bir defa, demetler listelerin aksine de iiklik yapmaya msait olmadklarndan listelere gre gs daha gvenlidirler. Yani yanllkla de itirmek istemedi iniz veriler ieren bir liste hazrlas gs g mak istiyorsanz demetleri kullanabilirsiniz. Ayrca demetler listelere gre daha hzl alr. s Dolaysyla bir program iinde sonradan de itirmeniz gerekmeyecek verileri gruplamak iin gs liste yerine demet kullanmak daha mantkldr.

10.1 Demetlerin Metotlar


Demetler zerinde de iiklik yapmak mmkn olmad iin bu veri tipi metot bakmndan gs g da bir hayli fakirdir. Su komutlardan herhangi biri yardmyla demetlerin metotlarn grebile ce imizi biliyoruz: g
>>> demet = () >>> dir(demet) >>> dir(tuple) >>> dir(())

Bu komutlar bize su kty verir:


[__add__, __class__, __contains__, __delattr__, __doc__, __eq__, __format__, __ge__, __getattribute__, __getitem__, __getnewargs__, __getslice__, __gt__, __hash__, __init__, __iter__, __le__, __len__, __lt__, __mul__, __ne__, __new__, __reduce__, __reduce_ex__, __repr__, __rmul__, __setattr__, __sizeof__, __str__, __subclasshook__, count, index]

Burada bizi ilgilendirenler banda ve sonunda _ iareti barndrmayanlar. Yani sunlar: s s


count index

10.1.1 Demet gelerinin Srasn Bulmak


Tpk listelerde oldu u gibi, demetlerde de sra bulma ilemleri iin index() metodunu kullanyg s oruz. rne in: g
>>> demet = ("gl", "papatya", "kasmpat", "erguvan") >>> demet.index("gl") 0

Demek ki gl adl e demetin 0. srasnda imi... Yine tpk listelerde oldu u gibi bu metot g s g sadece ilk buldu u eyi dikkate alr. Burada da parantez iinde ikinci bir de er kullang g g abilirsiniz:
>>> demet.index("gl", 2)

10.1.2 Demet gelerinin Saysn Bulmak


Pythonda bir demet iindeki elerin saysn bulmak iin, tpk listelerde oldu u gibi, count() g g adl bir metottan yararlanyoruz. Bu metot bir enin demet iinde ka kez geti ini bildirir: g g
>>> demet = ("erik", "ilek", "karpuz", "erik", "kavun", "karpuz", "ilek") >>> demet.count("erik") 2

10.2 Blm Sorular


1. Listelerin aksine demetler zerinde de iiklik yaplamamamasnn ne gibi avantajlar olags bilece i zerinde dnn. g s 2. Demetlerin btn metotlarn numaralandran ve her metottaki karakter saysn gsteren bir program yazn. Programnz syle bir kt vermeli:
No 0 1 2 3 4 5 Metot Ad __add__ __class__ __contains__ __delattr__ __doc__ __eq__ Metot Uzunluu g 7 9 12 11 7 6

3. Bir nceki soruda, numaralandrmay 0 yerine 1den balatmak iin ne yapmanz gerekir? s 4. Diyelim ki elimizde syle bir liste var:
liste = ["elma", "armut", "elma", "kiraz", "ilek", "kiraz", "elma", "kebap"]

Bu listedeki her bir enin, listede ka kez geti ini syleyen bir program yazn. Programnz g g tam olarak syle bir kt vermeli:
elma esi listede 3 kez geiyor! g armut esi listede 1 kez geiyor! g kiraz esi listede 2 kez geiyor! g ilek esi listede 1 kez geiyor! g kebap esi listede 1 kez geiyor! g

BLM

11

Szlkler

Su ana kadar Pythonda iki nemli veri tipinden bahsettik. Bunlar listeler ve demetler idi. Simdi de szlk adl veri tipinden sz edece iz. Szlkler Pythonun en nemli veri tiplerinden g bir tanesidir. Bu veri tipini rendikten sonra pek ok seyi rahatlkla yapabildi inizi grecek, g g ufkunuzun geniledi ini hissedeceksiniz. s g O halde laf daha fazla uzatmadan yola koyulalm.

11.1 Szlk Olu turmak s


Szlkleri kullanabilmek iin yapmamz gereken ilk i szl oluturmak olacaktr. Pythonda s g s szlkleri syle oluturuyoruz: s
>>> sozluk = {}

Grd nz gibi, szlklerin ayrt edici iareti kme parantezleridir. Yukarda bo bir szlk g s s oluturduk. Gelin isterseniz bunu test edelim: s
>>> type(sozluk) <type dict>

Hatrlarsanz, listeleri tanmlayan szck list, demetleri tanmlayan szck ise tuple idi. Grd nz gibi szlkleri tanmlayan szc mz de dict... g g Yukarda bo bir szlk oluturduk. Dilerseniz simdi de eleri olan bir szlk oluturalm: s s g s
>>> sozluk = {"elma": "meyve", "domates": "sebze", 1: "sayi"}

Szlkler grn asndan teki veri tiplerinden biraz farkldr. Liste ve demet gibi veri tips lerinde her bir eyi birbirinden virgl ile ayryorduk. Aslnda szlklerde de durum byledir. g Yani szlklerde de eleri birbirlerinden virgl ile ayryoruz. Ama grd nz gibi, elerin g g g biiminde baz farkllklar var. Szlkler, anahtar-deger iftlerinden oluan bir veri tipidir. Burada mesela, elma bir s anahtar, meyve ise bu anahtarn de eridir. Ayn sekilde sebze de erinin anahtar dog g mates, sayi de erinin anahtar ise 1dir. Dolaysyla Pythonda szlk; anahtar ve de er g g arasnda ba kuran bir veri tipidir diyoruz. g

114

Bu durumu daha net anlayabilmek iin bir rnek daha verelim:


>>> sozluk = {"Adana": "01", "Istanbul": "34", "zmir": "35"} I

Bu szlk eden oluuyor. Bunu su sekilde teyit edebilirsiniz: g s


>>> len(sozluk) 3

Bu szl n her esi bir anahtar-de er iftidir. Mesela Adana anahtar, 01 ise bu anahtarn g g g de eridir. g Bir rnek daha verelim. Mesela szlkleri kullanarak bir telefon defteri yazalm:
>>> telefon_defteri = {"Ahmet": "0533 123 45 67", ... "Salih": "0532 321 54 76", ... "Selin": "0533 333 33 33"}

Burada kodlarmzn sa a do ru biimsiz bir biimde uzamamas iin virglden sonra ENTER g g tuuna basarak eleri tanmlamaya devam etti imize dikkat edin. Sa a do ru ok fazla uzas g g g g m olan kodlar hem grnt asndan ho de ildir, hem de gr alann da tt iin okumay s s g s g g zorlatrr. s Isterseniz bir de yukardaki kodlarn metin dzenleyici iinde nasl grnece ine bakalm: g
#!/usr/bin/env python # -*- coding: utf-8 -*telefon_defteri = {"Ahmet": "0533 123 45 67", "Salih": "0532 321 54 76", "Selin": "0533 333 33 33"} print telefon_defteri

Kodlarmz daha okunakl bir hale getirmek iin szl uygun yerlerinden blerek alt satra g geiyoruz. Unutmayn, kod bir kez yazlr bin kez okunur. Okunakl ve anlalr kodlar yazmak s herkesin hayrnadr. Neyse, biz konumuza dnelim. Szlk tanmlarken dikkat etmemiz gereken birka nokta var. Bunlardan birincisi eleri belirg lerken kme parantezlerini kullanyor olmamz. Ikincisi karakter dizilerinin yansra saylar da trnak iinde gsteriyor olmamz. Isterseniz saylar trnaksz kullanrsanz ne olaca n deneyg erek grebilirsiniz. Ancak e er girece iniz say boluklu de ilse ve 0 ile balamyorsa bu sayy g g s g s trnaksz da yazabilirsiniz. ncs iki nokta st ste ve virgllerin nerede, nasl kullanld na g da dikkat etmeliyiz. Szlkleri nasl oluturaca mz rendik. Simdi gelelim bu szlkleri nasl kullanaca mza... s g g g

11.2 Szlk gelerine Eri mek s


Bir szlk oluturduktan sonra, tabii ki bu szl n elerine erimek isteyeceksiniz. Bir ss g g s zl n tamamn ekrana dkmek iin yapmamz gereken sey belli: g
>>> sozluk = {"Python": "programlama dili", ... "ngilizce": "dil", "elma": "meyve"} I >>> print sozluk

print komutunu kullanarak bir szl n tamamn ekrana dkebiliyoruz. Peki ya biz bu sg zl n elerine tek tek erimek istersek ne yapaca z? g g s g Hatrlarsanz liste ve demetlerin elerine tek tek su sekilde eriiyorduk: g s
>>> liste = ["Ali", "Ahmet", "Mehmet"] >>> liste[0] Ali >>> demet = ("Ali", "Ahmet", "Mehmet") >>> demet[1] Ahmet

Liste ve demetlerde eleri sralarna gre a rabiliyoruz. nk liste ve demetler sral veri g g tipleridir. Yani liste ve demetlerdeki elerin her birinin bir sras vardr. Ancak szlkler yle g de ildir. Szlklerde herhangi bir sra kavram bulunmaz. Mesela su rne e bakalm: g g
>>> a = {"a": 1, "b": 2, "c": 3} >>> print a {a: 1, c: 3, b: 2}

Grd nz gibi, eler tanmlad mz srada grnmyor. Szlklerde herhangi bir sra g g g kavram olmad iin syle bir giriim baarszl a u rayacaktr: g s s g g
>>> a[0] Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 0

Szlkler srasz bir veri tipi oldu u iin, szlk elerini sralarna gre de il, isimlerine gre g g g a ryoruz. g Suna bir bakalm:
>>> telefon_defteri = {"Ahmet": "0533 123 45 67", ... "Salih": "0532 321 54 76", ... "Selin": "0533 333 33 33"} >>> telefon_defteri["Ahmet"] 0533 123 45 67 >>> telefon_defteri["Salih"] 0532 321 54 76

Grd nz gibi, bu komutlar Ahmet ve Salih adl anahtarlarn karsnda hangi de er varsa g s g onu ekrana yazdryor. Dikkat edin, szlkten e a rrken kme parantezlerini de il, keli g g g s parantezleri kullanyoruz. Bu arada aklnzda bulunsun, szlk iindeki eleri anahtara gre g a ryoruz, de ere gre de il. Yani iki nokta st ste iaretinin solundaki ifadeleri kullanyoruz g g g s eleri a rrken, sa ndakileri de il... g g g g

11.2.1 Szlklere ge Eklemek


Szlklere e eklemek son derece kolay bir ilemdir. Diyelim ki elimizde syle bo bir szlk g s s var:
>>> sozluk = {}

Bu szl e e eklemek iin su yapy kullanyoruz: g g


>>> sozluk[anahtar] = deger

Dilerseniz bu yapy somutlatracak bir rnek verelim: s


>>> sozluk["Ad"] = "Ahmet"

Burada Ad bir anahtar, Ahmet ise bir de erdir. Yani szlklere e eklemek iin hem bir g g anahtar, hem de bir de er belirtmemiz gerekiyor. Mesela bu szl e bir e daha ekleyelim: g g g
>>> sozluk["Soyad"] = "Su"

Simdi szl mz yazdralm: g


>>> print sozluk {Ad: Ahmet, Soyad: Su}

Grd nz gibi elerimiz szl e eklenmi. Bu yapy ve for dngsn kullanarak szlkg g g s lere birden fazla eyi bir rpda ekleyebilirsiniz: g
>>> liste = dir(list) >>> sozluk = {} >>> for anahtar, deger in enumerate(liste): ... sozluk[anahtar] = deger >>> print sozluk {0: __add__, 1: __class__, 2: __contains__, 3: __delattr__, 4: __delitem__, 5: __delslice__, 6: __doc__, 7: __eq__, 8: __format__, 9: __ge__, 10: __getattribute__, 11: __getitem__, 12: __getslice__, 13: __gt__, 14: __hash__, 15: __iadd__, 16: __imul__, 17: __init__, 18: __iter__, 19: __le__, 20: __len__, 21: __lt__, 22: __mul__, 23: __ne__, 24: __new__, 25: __reduce__, 26: __reduce_ex__, 27: __repr__, 28: __reversed__, 29: __rmul__, 30: __setattr__, 31: __setitem__, 32: __setslice__, 33: __sizeof__, 34: __str__, 35: __subclasshook__, 36: append, 37: count, 38: extend, 39: index, 40: insert, 41: pop, 42: remove, 43: reverse, 44: sort}

Grd nz gibi dir(list) ktsndaki eleri tek tek numaralandrp bunlar szl e ekledik. g g g Bylece artk liste metotlarn numara vererek a rabiliriz: g
>>> sozluk[1] __class__ >>> sozluk[10]

__getattribute__ >>> sozluk[20] __len__ >>> sozluk[36] append >>> sozluk[40] insert

Yukardaki rnekte, szlk anahtarlar birer say oldu u iin ktda eler sral olarak g g grnyor. Bu, Pythondaki szlklerin i tasarmndan kaynaklanan tesad bir durumdur. Ne olursa olsun, szlklerde sra kavramna gvenerek i yapmamak gerekir. Mesela su rne e s g bakn:
>>> kayitlar = {}

Burada ncelikle bo bir szlk oluturduk. Bu szl e tek tek e ekleyece iz: s s g g g
>>> kayitlar["Ad"] = "Ahmet" >>> kayitlar["Soyad"] = "Okan" >>> kayitlar["Meslek"] = "Mimar"

Bylece szl mze farkl e eklemi olduk. Simdi bu szl ekrana dkelim: g g s g
>>> kayitlar {Soyad: Okan, Ad: Ahmet, Meslek: Mimar}

Grd nz gibi, e sralamas bozulmu... g g s Bu arada, e er kendi kendinize denemeler yapmsanz, szlklerin Trke karakterleri dzgn g s gsteremedi ini farketmisinizdir. rne in: g s g
>>> ... ... ... stok = {"ilek": "100 kilo", "eker": "5 kilo", S "ay": "10 kilo", "Kak": "100 adet"} s

>>> print stok {\x80ay: 10 kilo, \x9eeker: 5 kilo, Ka\x9f\x8dk: 100 adet, \x80ilek: 100 kilo}

Grd nz gibi, Trke karakterlerin hibiri dzgn grntlenemiyor. Hatrlarsanz buna g benzer durumlarla listelerde de karlamtk. Orada bu sorunu zmek iin for dngsnden s s s yaralanmtk. Szlkler iin de ayn yntemi kullanabiliriz: s
>>> for i in stok: ... print i ay S eker Kak s ilek

Bu szlkteki elere, herhangi bir Trke karakter sorunu yaamadan, normal bir sekilde g s eriebiliyoruz: s
>>> print stok["ay"] >>> print stok["eker"] S

s 11.3 Szlk gelerini Degi tirmek


Bir nceki blmde szlklere nasl e ekleyece imizi grdk. Buna gre syle bir rnek g g verebiliyoruz:
>>> telefon_defteri = {} >>> telefon_defteri["Zekiye"] = "0544 444 01 00" >>> print telefon_defteri {Zekiye: 0544 444 01 00}

Peki szl mzdeki bir enin de erini de itirmek istersek ne yapaca z? Onu da syle g g g gs g yapyoruz
>>> telefon_defteri["Zekiye"] = "0555 555 55 55"

Bylece szlkteki Zekiye anahtarnn de erini de itirmi olduk. g gs s Buradan anlad mz su: Bir szl e yeni bir e eklerken de, varolan bir eyi de itirirken g g g g gs de ayn komutu kullanyoruz. Demek ki bir eyi de itirirken aslnda eyi de itirmiyor, silip g gs g gs yerine yenisini koyuyoruz. Bu arada, szlk elerinde byk-kk harn nemli oldu una dikkat edin: g g
>>> telefon_defteri["zekiye"] = "0555 555 55 55" >>> telefon_defteri {zekiye: 0555 555 55 55, Zekiye: 0555 555 55 55}

Zekiye ve zekiye ayn grnse de aslnda Python asndan bunlarn ikisi tamamen birbirinden farkldr...

11.4 Szlk gelerini Silmek


E er bir eyi szlkten silmek istersek su komutu kullanyoruz: g g
>>> del telefon_defteri["Salih"]

E er biz szlkteki btn eleri silmek istersek su komut kullanlyor: g g


>>> telefon_defteri.clear()

Bylece bo bir szlk elde etmi olduk. E er szl tamamen ortadan kaldrmak isterseniz s s g g yine del komutundan yararlanabilirsiniz:

>>> del telefon_defteri

Yukardaki rneklerden birinde grd mz clear() ifadesi, Python szlklerinin metotlarng dan biridir. Szlklerin bunun dnda baka metotlar da vardr. Dilerseniz simdi bu metotlar s s inceleyelim.

11.5 Szlklerin Metotlar


Demetlerin aksine, szlkler zerinde de iiklik yapabiliriz. Dolaysyla szlkler de, tpk lisgs teler gibi, metot bakmndan zengin bir veri tipidir. Szlklerin metotlarn listelemek iin su yntemlerden herhangi birini izleyebilirsiniz:
>>> dir(dict) >>> dir({}) >>> d = {} >>> dir(d)

Bu yntemlerin herhangi birini takip etti inizde syle bir kt elde edeceksiniz: g
[__class__, __cmp__, __contains__, __delattr__, __delitem__, __doc__, __eq__, __format__, __ge__, __getattribute__, __getitem__, __gt__, __hash__, __init__, __iter__, __le__, __len__, __lt__, __ne__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__, __setitem__, __sizeof__, __str__, __subclasshook__, clear, copy, fromkeys, get, has_key, items, iteritems, iterkeys, itervalues, keys, pop, popitem, setdefault, update, values]

Burada bizi ilgilendirenler, her zamanki gibi sunlar olacaktr:


>>> for i in dir(dict): ... if "_" not in i[0]: ... print i clear copy fromkeys get has_key items iteritems iterkeys itervalues keys pop popitem setdefault update values

Simdi bu metotlarn en nemlilerini inceleyece iz. g

11.5.1 keys() ve values()


Szlk metotlar arasnda en nemlileri bu keys() ve values() adl metotlardr. Kabaca sylemek gerekirse keys() metodu bir szlkteki anahtarlar, values() metodu ise szlkteki de erg leri verir. Mesela:
>>> telefon_defteri = {"Ahmet": "0533 123 45 67", ... "Salih": "0532 321 54 76", "Selin": "0533 333 33 33"} >>> print telefon_defteri.keys() [Ahmet, Salih, Selin] >>> print telefon_defteri.values() [0533 123 45 67, 0532 321 54 76, 0533 333 33 33]

11.5.2 clear(), pop() ve popitem()


clear() metodu bir szl n btn elerini siler: g g
>>> telefon_defteri = {"Ahmet": "0533 123 45 67", ... "Salih": "0532 321 54 76", "Selin": "0533 333 33 33"} >>> telefon_defteri.clear() >>> telefon_defteri {}

Grd nz gibi, szlk tamamen boald. g s pop() metodu bir szlkteki eleri adlarna gre siler ve ekrana basar: g
>>> telefon_defteri = {"Ahmet": "0533 123 45 67", ... "Salih": "0532 321 54 76", "Selin": "0533 333 33 33"} >>> telefon_defteri.pop("Ahmet") 0533 123 45 67

Grd nz gibi, szlkteki Ahmet anahtarn sildik. Bu anahtar silinirken, bunun de eri de g g ekrana basld. popitem() metodu ise bir szlkteki rastgele bir anahtar siler ve silinen anahtarn de erini g ekrana basar:
>>> telefon_defteri.popitem() (Selin, 0533 333 33 33)

Bu silme sekli tamamen tesaddir. Hangi enin silinece ini kontrol edemezsiniz. g g

11.5.3 items() ve iteritems()


items() metodu bir szlk iindeki anahtar ve de erleri listeler: g
>>> telefon_defteri.items() [(Selin, 0533 333 33 33), (Ahmet, 0533 123 45 67), (Salih, 0532 321 54 76)]

Grd nz gibi, burada szlk iindeki btn anahtar ve de erleri bir liste iinde yer alyor. g g Her anahtar ve de er ifti de birer demet biiminde. g Yukarda bir demet dizisi elde etti imize gre, bu demetleri su sekilde zebiliriz (Bu ileme g s Ingilizcede unpacking ad veriliyor):
>>> for k, v in telefon_defteri.items(): ... print k, v Selin 0533 333 33 33 Ahmet 0533 123 45 67 Salih 0532 321 54 76

iteritems() metodu da bir szlk iindeki anahtar ve de erleri listeler. Ancak items() metodu g ile iteritems() metodu arasnda baz kullanm farklar vardr. rne in: g
>>> telefon_defteri.iteritems() <dictionary-itemiterator object at 0x00EC2AB0>

Grd nz gibi, iteritems() metodu listeyi kt olarak vermedi. Bu durum iteritems() metog dunun ok nemli bir zelli idir. items() metodu, anahtar-de er iftlerinden oluan listeyi derg g s hal meydana getirip ekrana basar. iteritems() metodu ise anahtar-de er iftlerinden oluan g s listeyi meydana getirdi ini bildiren bir nesne retir. iteritems() metodu ile oluturdu unuz g s g listeyi siz istedi iniz zaman ekrana dkebilirsiniz: g
>>> for anahtar, deger in telefon_defteri.items(): ... print anahtar, deger ... Selin 0533 333 33 33 Ahmet 0533 123 45 67 Salih 0532 321 54 76

iteritems() metodu, bu zelli i sayesinde ok byk listeler zerinde daha performansl alag s caktr.

11.5.4 iterkeys() ve itervalues()


Bu iki metot, biraz nce grd mz keys() ve values() metotlaryla ayn ii yapar. Bu metot g s ifti arasndaki fark, items() ve iteritems() metotlar arasndaki fark gibidir.

11.5.5 copy()
Bu metot bir szl kopyalamamz sa lar: g g
>>> yeni_rehber = telefon_defteri.copy()

11.5.6 get() ve has_key()


E er amacnz bir anahtarn szlk iinde varolup olmad n denetlemekse has_key() metog g dundan yararlanabilirsiniz:
>>> telefon_defteri.has_key("Veli") False >>> telefon_defteri.has_key("Selin") True

Buna benzer bir seyi syle de yapabilece imizi grmtk: g s


>>> telefon_defteri["Selin"] 0533 333 33 33 >>> telefon_defteri["Veli"] Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: Veli

Grd nz gibi, e er aranan anahtar szlkte varsa o anahtarn de eri ekrana baslyor. Ama g g g e er aranan anahtar szlkte yoksa bir hata mesaj alyoruz. Normalde bu hata mesajn alg mamak iin try... except: bloklarndan yararlanabiliriz:
>>> try: ... telefon_defteri["Veli"] ... except KeyError: ... print "Aranan e szlkte yok!" g ... Aranan e szlkte yok! g

Ancak Pythonda bunu yapmann ok daha kolay bir yolu var. Simdi su senaryoyu inceleyin: Diyelim ki bir hava durumu program yazmak istiyoruz. Tasarmza gre kullanc bir sehir ad girecek. Program da girilen sehre zg hava durumu bilgilerini ekrana yazdracak. Bunu yapabilmek iin, daha nceki bilgilerimizi de kullanarak syle bir sey yazabiliriz:
#!/usr/bin/env python # -*- coding: utf-8 -*soru = raw_input("ehrinizin adn tamam kk " S "harf olacak ekilde yaznz: ") s if soru == "istanbul": print "gk grltl ve saanak yal" g g s elif soru == "ankara": print "ak ve gneli" s elif soru == "izmir": print "bulutlu" else:

print ("Bu ehre ilikin havadurumu " s s "bilgisi bulunmamaktadr.")

Ama yukardaki yntemin, biraz meakkatli olaca ak. Sadece sehir iin hava durumu s g bilgilerini sorgulayacak olsak mesele de il, ancak onlarca sehri kapsayacak bir program retg mekse amacmz, yukardaki yntem yerine daha pratik bir yntem uygulamak gayet yerinde bir tercih olacaktr. ste bu noktada programcnn imdadna Pythondaki szlk veri tipi ve bu I veri tipinin get() adl metodu yetiecektir. Yukardaki kodlarn yerine getirdi i ilevi, su kodlarla s g s da gerekletirebiliriz: s
#!/usr/bin/env python # -*- coding: utf-8 -*soru = raw_input("ehrinizin adn tamam kk " S "harf olacak ekilde yaznz: ") s cevap = {"istanbul": "gk grltl ve saanak yal", g g s "ankara": "ak ve gneli", "izmir": "bulutlu"} s print cevap.get(soru, "Bu ehre ilikin havadurumu " s s "bilgisi bulunmamaktadr.")

Grd nz gibi, ilk nce normal biimde, kullancya sorumuzu soruyoruz. Ardndan da g anahtar-de er iftleri seklinde sehir adlarn ve bunlara karlk gelen hava durumu bilgilerini g s bir szlk iinde depoluyoruz. Daha sonra, szlk metotlarndan biri olan get() metodunu seiyoruz. Bu metot bize szlk iinde bir de erin varolup olmad n denetleme imknnn g g yansra, ad geen de erin szlk iinde varolmamas durumunda kullancya gsterilecek bir g mesaj seme olana da sunar. Python szlklerinde bulunan bu get() metodu bizi else veya g try-except bloklar kullanarak hata yakalamaya u rama zahmetinden de kurtarr. g s Burada print cevap.get(soru, "Bu ehre ilikin hava durumu bilgisi s s bulunmamaktadr.") satr yardmyla soru adl de ikenin de erinin szlk iinde varolup gs g varolmad n sorguluyoruz. E er kullancnn girdi i sehir ad szl mz iinde bir anahtar g g g g olarak tanmlanmsa, bu anahtarn de eri ekrana yazdrlacaktr. E er kullancnn girdi i s g g g sehir ad szl mz iinde bulunmuyorsa, bu defa kullancya Bu sehre ilikin hava durumu g s bilgisi bulunmamaktadr. biiminde bir mesaj gsterilecektir. if deyimleri yerine szlklerden yararlanmann, yukarda bahsedilen faydalarnn dnda bir s de su yararlar vardr: 1. ncelikle sz geen senaryo iin szlkleri kullanmak programcya daha az kodla daha ok i yapma olana sa lar. s g g 2. Szlk programcnn elle oluturaca if-elif-else bloklarndan daha performansldr ve s g bize ok hzl bir sekilde veri sorgulama imkn sa lar. g 3. Kodlarn daha az yer kaplamas sayesinde programn bakm da kolaylaacaktr. s 4. Tek tek if-elif-else bloklar iinde sehir ad ve buna ilikin hava durumu bilgileri tanmla s maya kyasla szlk iinde yeni anahtar-de er iftleri oluturmak daha pratiktir. g s

11.6 Blm Sorular


1. Basit bir Trke- Ingilizce szlk program yazn. Yazd nz programda kullanc Trke bir g kelime sorup, bu kelimenin Ingilizce karl n alabilmeli. s g

2. Rakamla girilen saylar yazyla gsteren bir program yazn. Mesela kullanc 5 saysn girdi inde programmz be cevabn vermeli. g s 3. Python szlklerinde sra kavram yoktur. Yani bir szl e girdi iniz de erler ktda sral g g g olarak grnmeyebilir. Ancak bir szlkte anahtarlar say oldu unda Python bu saylar sraya g dizmektedir. Pythonun say de erli anahtarlara neden byle davrand n aratrn. Anahtarg g s larn birer say oldu u szlklerle baz denemeler yaparak, ktda grnen e srasnn hangi g g durumlarda bozuldu unu bulmaya aln. Mesela su iki szl n ktlarn e sralamas g s g g asndan karlatrn: s s
a = {3: "", 2: "iki", 7: "yedi", 10: "on"} b = {3: "", 2: "iki", 8:"sekiz", 9: "dokuz", 5: "be", 6:"alt", 4: "drt", 1: "bir", s 7: "yedi", 10: "on"}

4. Su rnekte neden i yerine i[0] yazd mz aklayn: g


>>> for i in dir(dict): ... if "_" not in i[0]: ... print i

5. Su program, tekrar tekrar alacak sekilde yeniden yazn: s


#!/usr/bin/env python # -*- coding: utf-8 -*soru = raw_input("ehrinizin adn tamam kk " S "harf olacak ekilde yaznz: ") s cevap = {"istanbul": "gk grltl ve saanak yal", g g s "ankara": "ak ve gneli", "izmir": "bulutlu"} s print cevap.get(soru, "Bu ehre ilikin havadurumu " s s "bilgisi bulunmamaktadr.")

Kullanc q tuuna basarak programdan kabilmeli. s 6. Aa daki szl n hem anahtarlarn hem de de erlerini ekrana basn: s g g g
>>> ... ... ... stok = {"ilek": "100 kilo", "eker": "5 kilo", S "ay": "10 kilo", "Kak": "100 adet"} s

Burada her anahtar ve de er su biimde grnmeli: g


Depoda Depoda Depoda Depoda 10 kilo ay mevcuttur. 5 kilo eker mevcuttur. S 100 adet Kak mevcuttur. s 100 kilo ilek mevcuttur.

BLM

12

Kmeler

Bu blmde, bir dizi halinde inceledi imiz veri tiplerinin sonuncusu olan kmeleri inceleyeg ce iz. Bu blmn sonunda kme denen seyin ne oldu unu ve ne ie yarad n reneceksg g s g g eniz. Ingilizcede kmeye set diyorlar. Pythonda nispeten yeni saylabilecek bir ara olan kmeler hem ok hzldr, hem de epey ie yarar. s Kmeleri rendi imizde, bunlarn kimi zaman hi tahmin bile edemeyece imiz yerlerde g g g iimize yarad n grece iz. Normalde uzun uzun kod yazmay gerektiren durumlarda s g g kmeleri kullanmak, bir-iki satrla ilerimizi halletmemizi sa layabilir. s g Kmeler, matematikten bildi imiz kme kavramnn sahip oldu u btn zellikleri tar. Yani g g s kesiim, birleim ve fark gibi zellikler Pythondaki setler iin de geerlidir. s s

12.1 Kme Olu turmak s


Kmelerin bize sunduklarndan faydalanabilmek iin elbette ncelikle bir kme oluturmamz s gerekiyor. Kme oluturmak ok kolay bir ilemdir. rne in bo bir kmeyi syle oluturuyoruz: s s g s s
>>> bos_kume = set()

Listeler, demetler ve szlklerin aksine kmelerin ayrt edici bir iareti yoktur. Kme oluturs s mak iin set() fonksiyonundan yararlanyoruz. Yukarda bo bir kme oluturduk. s s Iinde e de barndran kmeleri ise su sekilde oluturuyg s oruz:
>>> kume = set(["elma", "armut", "kebap"])

Bylelikle, iinde e barndran ilk kmemizi baaryla oluturduk. Dikkat ederseniz, kme g s s olutururken listelerden faydalandk. Grd nz gibi set() fonksiyonu iindeki eler bir liste s g g iinde yer alyor. Dolaysyla yukardaki tanmlamay syle de yapabiliriz:
>>> liste = ["elma", "armut", "kebap"] >>> kume = set(liste)

126

Bu daha temiz bir grnt oldu. Elbette kme tanmlamak iin mutlaka liste kullanmak zorunda de iliz. g Istersek demetleri de kme haline getirebiliriz:
>>> demet = ("elma", "armut", "kebap") >>> kume = set(demet)

Hatta ve hatta karakter dizilerinden dahi kme yapabiliriz:


>>> kardiz = "Python Programlama Dili iin Trke Kaynak" >>> kume = set(kardiz)

Kulland mz karakter dizisinin byle uzun olmasna da gerek yok. Tek karakterlik dizilerden g bile kme oluturabiliriz: s
>>> kardiz = "a" >>> kume = set(kardiz)

Ama saylardan kme oluturamayz: s


>>> n = 10 >>> kume = set(n) TypeError: int object is not iterable

Peki szlkleri kullanarak kme oluturabilir miyiz? Evet, neden olmasn? s


>>> bilgi = {"iletim sistemi": "GNU", "sistem ekirdei": "Linux", s g ... "datm": "Ubuntu GNU/Linux"} g >>> kume = set(bilgi)

Bylece kmeleri nasl oluturaca mz rendik. E er oluturdu unuz kmeyi ekrana yazdrs g g g s g mak isterseniz, ne yapaca nz biliyorsunuz. Burada tanmlad nz kme de ikenini kullang g gs manz yeterli olacaktr:
>>> kume {iletim sistemi, sistem ekirdei, datm} s g g

Bir de suna bakalm:


>>> kardiz = "Python Programlama Dili" >>> kume = set(kardiz) >>> print kume set([a, , D, g, i, h, m, l, o, n, P, r, t, y])

Burada bir sey dikkatinizi ekmi olmal. Bir karakter dizisini kme olarak tanmlayp ekrana s yazdrd mzda elde etti imiz kt, o karakter dizisi iindeki her bir karakteri tek bir kez g g ieriyor. Yani mesela Python Programlama Dili iinde iki adet P karakteri var, ama ktda bu iki P karakterinin yalnzca biri grnyor. Buradan anlyoruz ki, kmeler ayn eyi g birden fazla tekrar etmez. Bu ok nemli bir zelliktir ve pek ok yerde iimize yarar. Ayn dus rum karakter dizisi dnda kalan teki veri tipleri iin de geerlidir. Yani mesela e er bir listeyi s g

kme haline getiriyorsak, o listedeki eler kme iinde yalnzca bir kez geecektir. Listede g ayn eden iki- tane bulunsa bile, kmemiz bu eleri teke indirecektir. g g
>>> liste = ["elma", "armut", "elma", "kebap", "eker", "armut", s ... "ilek", "aa", "eker", "kebap", "eker"] g s s >>> for i in set(liste): ... print i ... aa g elma s eker kebap ilek armut

Grd nz gibi, liste iinde birden fazla bulunan eler, Pythondaki kmeler yardmyla teke g g indirilebiliyor. rendi imiz bu bilgi sayesinde, daha nce grd mz count() metodunu da kullanarak, g g g syle bir kod yazabiliriz:
>>> liste = ["elma", "armut", "elma", "kiraz", ... "ilek", "kiraz", "elma", "kebap"]

>>> for i in set(liste): ... print "%s listede %s kez geiyor!"%(i, liste.count(i)) elma listede 3 kez geiyor! kiraz listede 2 kez geiyor! armut listede 1 kez geiyor! kebap listede 1 kez geiyor! ilek listede 1 kez geiyor!

Burada set(liste) ifadesini kullanarak, liste elerini esiz ve benzersiz bir hale getirdik. g s Esasnda tek bir kme pek bir ie yaramaz. Kmeler ancak birden fazla oldu unda bunlarla s g yararl iler yapabiliriz. nk kmelerin en nemli zelli i, baka kmelerle karlatrlas g s s s bilme kabiliyetidir. Yani mesela kmelerin kesiimini, birleimini veya farkn bulabilmek iin s s ncelikle elimizde birden fazla kme olmas gerekiyor. ste biz de simdi bu tr ilemleri nasl I s yapaca mz renece iz. O halde hi vakit kaybetmeden yolumuza devam edelim. g g g

12.2 Kmelerin Metotlar


Daha nceki veri tiplerinde oldu u gibi, kmelerin de metotlar vardr. Artk biz bir veri tipinin g metotlarn nasl listeleyece imizi ok iyi biliyoruz. Nasl liste iin list(); demet iin tuple(); g szlk iin de dict() fonksiyonlarn kullanyorsak, kmeler iin de set() adl fonksiyondan yararlanaca z: g
>>> dir(set) [__and__, __class__, __contains__, __delattr__, __doc__, __eq__, __format__, __ge__, __getattribute__, __gt__, __hash__, __iand__, __init__, __ior__, __isub__, __iter__, __ixor__, __le__, __len__, __lt__, __ne__, __new__, __or__, __rand__, __reduce__, __reduce_ex__, __repr__,

__ror__, __rsub__, __rxor__, __setattr__, __sizeof__, __str__, __sub__, __subclasshook__, __xor__, add, clear,copy, difference, difference_update, discard, intersection, intersection_update, isdisjoint, issubset, issuperset, pop, remove, symmetric_difference, symmetric_difference_update, union, update]

Hemen iimize yarayacak metotlar alalm: s


>>> for i in dir(set): ... if "__" not in i: ... print i ... add clear copy difference difference_update discard intersection intersection_update isdisjoint issubset issuperset pop remove symmetric_difference symmetric_difference_update union update

Grd nz gibi kmelerin epey metodu var. Bu arada if "__" not in i satrnda _ yerg ine __ kulland mza dikkat edin. Neden? nk e er sadece _ kullanrsak symmetg g ric_difference ve symmetric_difference_update metotlar ktmzda yer almayacaktr. Unutmadan syleyelim: Kmeler de, tpk listeler ve szlkler gibi, de itirilebilir bir veri tipidir. gs

12.2.1 clear metodu


Kmelerle ilgili olarak inceleyece imiz ilk metot clear(). Bu metodu daha nce szlkleri g alrken de grmtk. Szlklerde bu metodun grevi szl n iini boaltmak idi. Burada s s g s da ayn vazifeyi grr:
>>> km = set("adana") >>> for i in km: ... print i ... a d n >>> km.clear() >>> km set([])

Burada nce km adl bir kme oluturduk. Daha sonra da clear() metodunu kullanarak bu s kmenin btn elerini sildik. Artk elimizde bo bir szlk var. g s

12.2.2 copy metodu


Listeler ve szlkleri incelerken copy() adl bir metot renmitik. Bu metot ayn zamanda g s kmelerle birlikte de kullanlabilir. stelik ilevi de ayndr: s
>>> km = set("kahramanmara") s >>> yedek = km.copy() >>> yedek set([a, r, h, k, m, \x9f, n]) >>> km set([a, h, k, m, n, r, \x9f])

Burada bir sey dikkatinizi ekmi olmal. km adl kmeyi yedek adyla kopyaladk, ama bu s iki kmenin ktlarna bakt mz zaman e sralamasnn birbirinden farkl oldu unu gryg g g oruz. Bu da bize kmelerle ilgili ok nemli bir bilgi daha veriyor. Demek ki, tpk szlklerde oldu u gibi, kmeler de srasz veri tipleriymi. Elde etti imiz ktda eler rastgele diziliyor. g s g g Dolaysyla elere sralarna gre eriemiyoruz. Aynen szlklerde oldu u gibi... g s g

12.2.3 add metodu


Kmelerden bahsederken, bunlarn de itirilebilir bir veri tipi oldu unu sylemitik. Dolaysyla gs g s kmeler, zerlerinde de iiklik yapmamza msaade eden metotlar da ierir. rne in add() gs g bu tr metotlardan biridir. Add kelimesi Trkede eklemek anlamna gelir. Adndan da anlalaca gibi, bu metot yardmyla kmelerimize yeni eler ilave edebilece iz. Hemen s g g g bunun nasl kullanld na bakalm: g
>>> kume = set(["elma", "armut", "kebap"]) >>> kume.add("ilek") >>> print kume set([elma, armut, kebap, \x87ilek])

Grd nz gibi, add() metodunu kullanarak, kmemize ilek adl yeni bir e ekledik. E er g g g kmede zaten varolan bir e eklemeye alrsak kmede herhangi bir de iiklik olmayacakg s gs tr. nk, daha nce de syledi imiz gibi, kmeler her bir eyi tek bir sayda barndrr. g g E er bir kmeye birden fazla eyi ayn anda eklemek isterseniz for dngsnden yararlang g abilirsiniz:
>>> yeni = [1,2,3] >>> for i in yeni: ... kume.add(i) ...

>>> kume set([1, 2, 3, elma, kebap, \x87ilek, armut])

Burada yeni adl listeyi kmeye for dngs ile ekledik. Ama bu ilemi yapmann baka bir s s yolu daha vardr. Bu ilem iin Pythonda ayr bir metot bulunur. Bu metodun ad update() s metodudur. Sras gelince bu metodu da grece iz. g

12.2.4 difference metodu


Bu metot iki kmenin farkn almamz sa lar. rne in: g g
>>> k1 = set([1, 2, 3, 5]) >>> k2 = set([3, 4, 2, 10]) >>> k1.difference(k2) set([1, 5])

Demek ki k1in k2den fark buymu. Peki k2nin k1den farkn bulmak istersek ne yapaca z? s g
>>> k2.difference(k1) set([10, 4])

Grd nz gibi, birinci kullanmda, k1de bulunup k2de bulunmayan eleri elde ediyoruz. g g Ikinci kullanmda ise bunun tam tersi. Yani ikinci kullanmda k2de bulunup k1de bulunmayan eleri alyoruz. g Isterseniz uzun uzun difference() metodunu kullanmak yerine sadece eksi (-) iaretini kullas narak da ayn sonucu elde edebilirsiniz:
>>> k1 - k2

...veya...
>>> k2 - k1

Hayr, madem eksi iaretini kullanabiliyoruz, o halde art iaretini de kullanabiliriz! gibi bir s s kir do ru de ildir. g g

12.2.5 difference_update metodu


Bu metot, difference() metodundan elde edilen sonuca gre bir kmenin gncellenmesini sa lar. Yani? g Hemen bir rnek verelim:
>>> k1 = set([1, 2, 3]) >>> k2 = set([1, 3, 5]) >>> k1.difference_update(k2) set([2]) >>> print k1

set([2]) >>> print k2 set([1, 3, 5])

Grd nz gibi, bu metot k1in k2den farkn ald ve bu fark kullanarak k1i yeniden olug s turdu. k1 ile k2 arasndaki tek fark 2 adl e idi. Dolaysyla difference_update() metodunu g uygulad mzda k1in elerinin silinip yerlerine 2 adl enin geldi ini gryoruz. g g g g

12.2.6 discard metodu


Bir nceki blmde rendi imiz add() metodu yardmyla, nceden oluturdu umuz bir kmg g s g eye yeni eler ekleyebiliyorduk. Bu blmde renece imiz discard() metodu ise kmeden g g g e silmemizi sa layacak: g g
>>> hayvanlar = set(["kedi", "kpek", "at", "ku", "inek", "deve"]) s >>> hayvanlar.discard("kedi") >>> print hayvanlar set([ku\x9f, inek, deve, k\x94pek, at])

E er kme iinde bulunmayan bir e silmeye alrsak hi bir sey olmaz. Yani hata mesaj g g s almayz:
>>> hayvanlar.discard("ylan")

Burada etkileimli kabuk sessizce bir alt satra geecektir. Bu metodun en nemli zelli i s g budur. Yani olmayan bir eyi silmeye alt mzda hata vermemesi. g s g

12.2.7 remove metodu


Bu metot da bir nceki blmde grd mz discard() metoduyla ayn ilevi yerine getirir. g s E er bir kmeden e silmek istersek remove() metodunu da kullanabiliriz: g g
>>> hayvanlar.remove("kpek")

Peki discard() varken remove() metoduna ne gerek var? Ya da tersi. Bu iki metot ayn ilevi yerine getirse de aralarnda nemli bir fark vardr. Hatrlarsanz diss card() metoduyla, kmede olmayan bir eyi silmeye alrsak herhangi bir hata mesaj alg s mayaca mz sylemitik. E er remove() metodunu kullanarak, kmede olmayan bir eyi g s g g silmeye alrsak, discard() metodunun aksine, hata mesaj alrz: s
>>> hayvanlar.remove("fare") Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: fare

Bu iki metot arasndaki bu fark nemli bir farktr. Bazen yazd mz programlarda, duruma g gre her iki zelli e de ihtiyacmz olabilir. g

12.2.8 intersection metodu


intersection kelimesi Trkede kesiim anlamna gelir. Adndan da anlad mz gibi, inters g section() metodu bize iki kmenin kesiim kmesini verecektir: s
>>> k1 = set([1, 2, 3, 4]) >>> k2 = set([1, 3, 5, 7]) >>> k1.intersection(k2) set([1, 3])

Grd nz gibi, bu metot bize k1 ve k2nin kesiim kmesini veriyor. Dolaysyla bu iki kme g s arasndaki ortak elemanlar bulmu oluyoruz. s Hatrlarsanz, difference() metodunu anlatrken, difference() kelimesi yerine - iaretini de s kullanabilece imiz, sylemitik. Benzer bir durum intersection() metodu iin de geerlidir. g s Iki kmenin kesiimini bulmak iin & iaretinden yararlanabiliriz: s s
>>> k1 & k2 set([1, 3])

Python programclar genellikle uzun uzun intersection yazmak yerine & iaretini kullanrlar... s Isterseniz bu metot iin rnek bir program verelim. Bylece gerek hayatta bu metodu nasl kullanabilece imizi grm oluruz: g s
# -*- coding: utf-8 -*tr = "" s g S G I parola = raw_input("Sisteme giri iin bir parola belirleyin: ") s if set(tr) & set(parola): print "Parolanzda Trke harfler kullanmayn!" else: print "Parolanz kabul edildi!"

Burada e er kullanc, parola belirlerken iinde Trke bir harf geen bir kelime yazarsa prog grammz kendisini Trke harf kullanmamas konusunda uyaracaktr. Bu kodlarda kmeleri nasl kulland mza dikkat edin. Programda asl ii yapan ksm su satrdr: g s
if set(tr) & set(parola): print "Parolanzda Trke harfler kullanmayn!"

Burada aslnda syle bir sey demi oluyoruz: s E er set(tr) ve set(parola) kmelerinin kesiim kmesi bo de ilse, kullancya g s s g Parolanzda Trke harer kullanmayn! uyarsn gster! set(tr) ve set(parola) kmelerinin kesiim kmesinin bo olmamas, kullancnn girdi i s s g kelime iindeki harerden en az birinin tr adl de iken iinde geti i anlamna gelir. Burada gs g basite, tr de ikeni ile parola de ikeni arasndaki ortak eleri sorguluyoruz. E er kullanc gs gs g g herhangi bir Trke harf iermeyen bir kelime girerse set(tr) ve set(parola) kmelerinin kesiim kmesi bo olacaktr. s s Isterseniz kk bir deneme yapalm:

>>> tr = "" s g S G I >>> parola = "ilek" >>> set(tr) & set(parola) set([])

Burada kullancnn ilek adl kelimeyi girdi ini varsayyoruz. Byle bir durumda set(tr) g ve set(parola) kmelerinin kesiim kmesi harni ierecek, dolaysyla da programmz s kullancya uyar mesaj gsterecektir. E er kullancmz kalem gibi Trke harf iermeyen bir g kelime girerse:
>>> tr = "" s g S G I >>> parola = "kalem" >>> set(tr) & set(parola) set([])

Grd nz gibi, elde etti imiz kme bo. Dolaysyla byle bir durumda programmz kulg g s lancya herhangi bir uyar mesaj gstermeyecektir. intersection() metodunu pek ok yerde kullanabilirsiniz. Hatta iki dosya arasndaki benzerlikleri bulmak iin dahi bu metottan yararlanabilirsiniz. Ilerde dosya ilemleri konusunu ilerken bu s s metottan nasl yararlanabilece imizi de anlataca z. g g

12.2.9 intersection_update metodu


Hatrlarsanz difference_update() metodunu ilerken syle bir sey demitik: s s Bu metot, difference() metodundan elde edilen sonuca gre bir kmenin gncellenmesini sa lar. g ste intersection_update metodu da buna ok benzer bir ilevi yerine getirir. Bu metodun I s grevi, intersection() metodundan elde edilen sonuca gre bir kmenin gncellenmesini sa lag maktr:
>>> k1 = set([1, 2, 3]) >>> k2 = set([1, 3, 5]) >>> k1.intersection_update(k2) set([1, 3]) >>> print k1 set([1, 3]) >>> print k2 set([1, 3, 5])

Grd nz gibi, intersection_update() metodu k1in btn elerini sildi ve yerlerine k1 ve g g k2nin kesiim kmesinin elemanlarn koydu. s

12.2.10 isdisjoint metodu


Bu metodun ok basit bir grevi vardr. isdisjoint() metodunu kullanarak iki kmenin kesiim s kmesinin bo olup olmad sorgulayabilirsiniz. Hatrlarsanz ayn ii bir nceki blmde s g s grd mz intersection() metodunu kullanarak da yapabiliyorduk. Ama e er hayattan tek g g beklentiniz iki kmenin kesiim kmesinin bo olup olmad n, yani bu iki kmenin ortak eles s g man ierip iermedi ini renmekse, basite isdisjoint() metodundan yararlanabilirsiniz: g g
>>> a = set([1, 2, 3]) >>> b = set([2, 4, 6]) >>> a.isdisjoint(b) False

Grd nz gibi, a ve b kmesinin kesiimi bo olmad iin, yani bu iki kme ortak en az bir g s s g e barndrd iin, isdisjoint() metodu False kts veriyor. Burada temel olarak su soruyu g g sormu oluyoruz: s a ve b ayrk kmeler mi? Python da bize cevap olarak, Hayr de il, anlamna gelen False ktsn veriyor... nk a g ve b kmelerinin ortak bir eleman var (2). Bir de suna bakalm:
>>> a = set([1, 3, 5]) >>> b = set([2, 4, 6]) >>> a.isdisjoint(b) True

Burada a ve b kmeleri ortak hi bir elemana sahip olmad iin Do ru anlamna gelen True g g ktsn elde ediyoruz.

12.2.11 issubset metodu


Bu metot yardmyla, bir kmenin btn elemanlarnn baka bir kme iinde yer alp yer als mad n sorgulayabiliriz. Yani bir kmenin, baka bir kmenin alt kmesi olup olmad n bu g s g metot yardmyla renebiliriz. E er bir kme baka bir kmenin alt kmesi ise bu metot bize g g s True de erini verecek; e er de ilse False ktsn verecektir: g g g
>>> a = set([1, 2, 3]) >>> b = set([0, 1, 2, 3, 4, 5]) >>> a.issubset(b) True

Bu rnekte True ktsn aldk, nk a kmesinin btn eleri b kmesi iinde yer alyor. g Yani a, bnin alt kmesidir.

12.2.12 issuperset metodu


Bu metot, bir nceki blmde grd mz issubset() metoduna benzer. Matematik derg slerinde grd mz kmeler konusunda hatrlad nz b kmesi a kmesini kapsar g g

ifadesini bu metotla gsteriyoruz. nce bir nceki derste grd mz rne e bakalm: g g
>>> a = set([1, 2, 3]) >>> b = set([0, 1, 2, 3, 4, 5]) >>> a.issubset(b) True

Buradan, a kmesi b kmesinin alt kmesidir, sonucuna ulayoruz. Bir de suna bakalm: s
>>> a = set([1, 2, 3]) >>> b = set([0, 1, 2, 3, 4, 5]) >>> b.issuperset(a) True

Burada ise, b kmesi a kmesini kapsar, sonucunu elde ediyoruz. Yani b kmesi a kmesinin btn elemanlarn iinde barndryor.

12.2.13 union metodu


union() metodu iki kmenin birleimini almamz sa lar. Hemen bir rnek verelim: s g
>>> a = set([2, 4, 6, 8]) >>> b = set([1, 3, 5, 7]) >>> a.union(b) {1, 2, 3, 4, 5, 6, 7, 8}

nceki blmlerde grd mz baz metotlarda oldu u gibi, union() metodu da bir ksayola g g sahiptir. union() metodu yerine | iaretini de kullanabiliriz: s
>>> a | b

union() metodu yerine, bu metodun ksayolu olan | iareti Python programclar tarafndan s daha sk kullanlr.

12.2.14 update metodu


Hatrlarsanz add() metodunu anlatrken syle bir rnek vermitik: s
>>> kume = set(["elma", "armut", "kebap"]) >>> yeni = [1, 2, 3] >>> for i in yeni: ... kume.add(i) ... set([1, 2, 3, elma, kebap, \x87ilek, armut])

Bu rne i verdikten sonra da syle bir sey demitik: g s

Burada yeni adl listeyi kmeye for dngs ile ekledik. Ama bu ilemi yapmann baka bir s s yolu daha vardr. Bu ilem iin Pythonda ayr bir metot bulunur. s ste bu metodu renmenin vakti geldi. Metodumuzun ad update(). Bu metot, bir kmeyi I g gncellememizi sa lar. g Isterseniz yukardaki rne i, bu metodu kullanarak tekrar yazalm: g
>>> kume = set(["elma", "armut", "kebap"]) >>> yeni = [1, 2, 3] >>> kume.update(yeni) >>> print kume {1, 2, 3, elma, kebap, armut}

Grd nz gibi, for dngsn kullanmaya gerek kalmadan ayn sonucu elde edebildik. g

12.2.15 symmetric_difference metodu


Daha nceki blmlerde difference() metodunu kullanarak iki kme arasndaki farkl eleri g bulmay renmitik. rne in elimizde syle iki kme var diyelim: g s g
>>> a = set([1, 2, 5]) >>> b = set([1, 4, 5])

E er a kmesinin b kmesinden farkn bulmak istersek syle yapyoruz: g


>>> a.difference(b) set([2])

Demek ki a kmesinde bulunup b kmesinde bulunmayan e 2 imi. g s Bir de b kmesinde bulunup a kmesinde bulunmayan elere bakalm: g
>>> b.difference(a) set([4])

Bu da bize 4 ktsn verdi. Demek ki bu e b kmesinde bulunuyor, ama a kmesinde g bulunmuyormu. Peki ya kmelerin ikisinde de bulunmayan eleri ayn anda nasl alaca z? s g g ite bu noktada yardmmza symmetric_difference() adl metot yetiecek: s s
>>> a.symmetric_difference(b) set([2, 4])

Bylece iki kmede de bulunmayan eleri ayn anda alm olduk. g s

12.2.16 symmetric_difference_update metodu


Daha nce difference_update ve intersection_update gibi metotlar renmitik. g s ric_difference_update() metodu da bunlara benzer bir ilevi yerine getirir: s symmet-

>>> a = set([1,2, 5]) >>> b = set([1,4, 5]) >>> a.symmetric_difference_update(b) >>> print a set([2, 4])

Grd nz gibi, a kmesinin eski eleri gitti, yerlerine symmetric_difference() metoduyla g g elde edilen kt geldi. Yani a kmesi, symmetric_difference() metodunun sonucuna gre gncellenmi oldu... s

12.2.17 pop metodu


Inceleyece imiz son metot pop() metodu olacak. Geri bu metot bize hi yabanc de il. g g Bu metodu listeler konusundan hatrlyoruz. Orada rendi imize gre, bu metot listenin g g bir esini silip ekrana basyordu. Aslnda buradaki fonksiyonu da farkl de il. Burada da g g kmelerin elerini silip ekrana basyor: g
>>> a = set(["elma", "armut", "kebap"]) >>> a.pop() elma

Peki bu metot hangi lte gre kmeden e siliyor? Herhangi bir lt yok. Bu metot, kme g elerini tamamen rastgele siliyor. g Bylelikle Pythonda Listeler, Demetler, Szlkler ve Kmeler konusunu bitirmi olduk. Bu s konular sk sk tekrar etmek, hi olmazsa arada srada gz gezdirmek baz seylerin zihnimizde yer etmesi asndan olduka nemlidir.

12.3 Dondurulmu Kmeler (Frozenset) s


Daha nce de syledi imiz gibi, kmeler zerinde de iiklik yapabiliyoruz. Zaten kmelerin g gs add() ve remove() gibi metotlarnn olmas bu durumu teyit ediyor. Ancak kimi durumlarda, eleri zerinde de iiklik yaplamayan kmelere de ihtiya duyabilirsiniz. Hatrlarsanz lisg gs teler ve demetler arasnda da buna benzer bir iliki var. Demetler o u zaman, zerinde s g de iiklik yaplamayan bir liste gibi davranr. ste Python ayn imkan bize kmelerde de gs I sa lar. E er eleri zerinde de iiklik yaplamayan bir kme oluturmak isterseniz set() yerg g g gs s ine frozenset() fonksiyonunu kullanabilirsiniz. Dilerseniz hemen bununla ilgili bir rnek verelim:
>>> dondurulmus = frozenset(["elma", "armut", "ayva"])

Dondurulmu kmeleri bu sekilde oluturuyoruz. Simdi bu dondurulmu kmenin metotlarna s s s bakalm:


>>> dir(dondurulmus) [__and__, __class__, __contains__, __delattr__, __doc__, __eq__, __format__, __ge__, __getattribute__, __gt__, __hash__, __init__, __iter__, __le__, __len__, __lt__, __ne__, __new__, __or__,

__rand__, __reduce__, __reduce_ex__, __repr__, __ror__, __rsub__, __rxor__, __setattr__, __sizeof__, __str__, __sub__, __subclasshook__, __xor__, copy, difference, intersection, isdisjoint, issubset, issuperset, symmetric_difference, union]

Grd nz gibi, add(), remove(), update() gibi, de iiklik yapmaya ynelik metotlar listede g gs yok. Dondurulmu kmeler ile normal kmeler arasnda ilev olarak hibir fark yoktur. Bu ikisi s s arasndaki fark, listeler ile demetler arasndaki fark gibidir.

12.4 Blm Sorular


1. Liste, demet, szlk ve kmeleri karlatrd nzda, bu veri tiplerini oluturma bakmndan s s g s kmelerle teki veri tipleri arasnda nasl bir fark gryorsunuz? 2. Bir kme iinde herhangi bir enin bulunup bulunmad n nasl sorgulayabilece imizi g g g gsteren bir rnek kod yazn. 3. Karakter dizilerini, demetleri ve listeleri kullanarak kme oluturabiliyoruz. Ancak ayn s seyi saylar kullanarak yapamyoruz. Saylardan kme oluturmak istedi imizde syle bir hata s g mesaj veriyor bize Python:
>>> a = 10 >>> set(a) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: int object is not iterable

Burada Python bize kabaca syle bir sey sylemi oluyor: Saylar zerinde dng kurula s maz!. Ald nz bu hata mesajnn anlam zerinde dnn. Bu hatay baka hangi durumg s s larda alrsnz? 4. Kullancya renk adlar soran bir program yazn. Kullancdan gelen renk adlarn programn sonunda kullancya bildirin. Ancak kullancnn girdi i her renk ad kendisine bir kez bildirilmeli, g yani renk adlar tekrar etmemeli. 5. Demetler blmnde syle bir soru sormutuk: s Diyelim ki elimizde syle bir liste var:
liste = ["elma", "armut", "elma", "kiraz", "ilek", "kiraz", "elma", "kebap"]

Bu listedeki her bir enin, listede ka kez geti ini syleyen bir program yazn. Programnz g g tam olarak syle bir kt vermeli:
elma esi listede 3 kez geiyor! g armut esi listede 1 kez geiyor! g kiraz esi listede 2 kez geiyor! g ilek esi listede 1 kez geiyor! g kebap esi listede 1 kez geiyor! g

Kmeler blmnde rendi iniz bilgileri de dikkate alarak bu program yeniden yazn. g g

BLM

13

Fonksiyonlar

Simdi syle bir dnn: Diyelim ki alt nz iyerinde her gn bir yerlere dileke gnderiy s s g s orsunuz. Aslnda farkl yerlere gnderdi iniz bu dilekeler temel olarak ayn ieri e sahip. g g Yani mesela dilekeyi Mehmet Beye gnderece iniz zaman yazya Mehmet Beyin adn; Ahg met Beye gnderece iniz zaman ise Ahmet Beyin adn yazyorsunuz. Ayrca tabii dileke g zerindeki tarih bilgilerini de gne gre dzenliyorsunuz. Mantkl bir insan, yukardaki gibi bir durumda elinde bir dileke tasla bulundurur ve sadece de itirmesi gereken ksmlar g gs de itirip dilekeyi hazr hale getirir. Her defasnda ayn bilgileri en batan yazmaz. Dilerseniz gs s anlatt mz bu durumu Python programlama dili ile temsil etmeye alalm: g s
#!/usr/bin/env python # -*- coding: utf-8 -*print """Sayn Mehmet Bey, 19.12.2009 tariginde yaptmz bavurunun sonulandrlmas g s hususunda yardmlarnz rica ederiz. Sayglarmzla, Orun Kunek"""

Bu dileke Mehmet Beye gidiyor. Isterseniz bir tane de Ahmet Beye yazalm...
#!/usr/bin/env python # -*- coding: utf-8 -*print """Sayn Ahmet Bey, 15.01.2010 tariginde yaptmz bavurunun sonulandrlmas g s hususunda yardmlarnz rica ederiz. Sayglarmzla, Orun Kunek"""

Burada dikkat ederseniz iki dilekenin metin ieri i aslnda ayn. Sadece bir-iki yer de iiyor. g gs Bu kodlar bu sekilde yazmak olduka verimsiz bir yoldur. nk bu sistem hem program cya ok vakit kaybettirir, hem fazlasyla kopyala-yaptr ilemi gerektirir, hem de bu kodlarn s s bakmn yapmak ok zordur. E er dileke metni zerinde bir de iiklik yapmak isterseniz g gs program iindeki ilgili kodlar tek tek bulup dzeltmeniz gerekir. Yani mesela yukardaki iki dilekenin ayn program iinde oldu unu varsayarsak, dileke metnindeki bir hatay dzeltmek g 140

istedi imizde ayn dzeltmeyi birka farkl yerde yapmamz gerekir. rne in yukardaki dileke g g metninde bir yazm hatas var. satrda tarihinde yazaca mza tariginde yazmz... Ilk g s Tabii biz Mehmet Beye yazd mz dilekenin metnini Ahmet Beye yazaca mz dilekeyi g g hazrlarken kopyala-yaptr yapt mz iin ayn hata Mehmet Beye gidecek dilekede de var. s g Simdi biz bu yazm hatasn dzeltmek istedi imizde, btn dileke metinlerini tek tek gzden g geirmemiz gerekecektir. Hele bir de dileke says ok fazlaysa bu ilemin ne kadar zor olas ca n bir dnn. Tabii bu basit durum iin, her metin dzenleyicide bulunan bul-de itir g s gs zelli ini kullanabiliriz. Ama iler her zaman bu kadar kolay olmayabilir. Bu bakm ve taslakg s lama iini kolaylatracak bir zm olsa ve bizi ayn seyleri tekrar tekrar yazmaktan kurtarsa s s ne kadar gzel olurdu, de il mi? ste Python buna benzer durumlar iin bize fonksiyon denen g I bir ara sunar. Biz de bu blmde bu faydal arac nasl kullanaca mz renecek ve bu arac g g olabildi ince ayrntl bir sekilde incelemeye alaca z. g s g

13.1 Fonksiyonlar Tanmlamak


Pythonda fonksiyonlar kullanabilmek iin ncelikle fonksiyonlar tanmlamamz gerekiyor. Fonksiyon tanmlamak iin def adl bir paracktan yararlanaca z. Pythonda fonksiyonlar g syle tanmlyoruz:
def fonksiyon_adi(): ...

Grd nz gibi, nce def parac n, ardndan da fonksiyonumuzun adn yazyoruz. g g Fonksiyon ad olarak istedi iniz her seyi yazabilirsiniz. Ancak fonksiyon ad belirlerken, fonksiyg onun ne ie yarad n anlatan ksa bir isim belirlemeniz hem sizin hem de kodlarnz okuyan s g kiilerin iini bir hayli kolaylatracaktr. Yalnz fonksiyon adlarnda Trke karakter kullanmas s s manz gerekiyor. Ayrca fonksiyonlar tanmlarken en sona parantez ve iki nokta st ste iarets lerini de koymay unutmuyoruz. Bylece ilk fonksiyonumuzu tanmlam olduk. Ama henz iimiz bitmedi. Bu fonksiyonun s s bir ie yarayabilmesi iin bunun altn doldurmamz gerekiyor. Fonksiyon tanmnn iki nokta s st ste iareti ile bitmesinden, sonraki satrn girintili olmas gerekti ini tahmin etmisinizdir. s g s Gelin isterseniz biz bu fonksiyonun altn ok basit bir sekilde dolduralm:
def fonksiyon_adi(): print "merhaba fonksiyon!"

Bylece eksiksiz bir fonksiyon tanmlam olduk. Burada dikkat etmemiz gereken en nemli s sey, def fonksiyon_adi(): satrndan sonra gelen ksmn girintili yazlmasdr. Simdi isterseniz bu fonksiyonu nasl kullanabilece imizi grelim: g
#!/usr/bin/env python # -*- coding: utf-8 -*def fonksiyon_adi(): print "merhaba fonksiyon!"

Bu kodlar bir metin dzenleyiciye kaydedip altrd mzda hi bir kt elde edemeyiz. nk s g biz burada fonksiyonumuzu sadece tanmlamakla yetindik. Henz bu fonksiyonun iletilmesini s sa layacak kodu yazmadk. Simdi bu fonksiyonun hayat kazanmasn sa layacak kodlar gireg g biliriz:
#!/usr/bin/env python # -*- coding: utf-8 -*-

def fonksiyon_adi(): print "merhaba fonksiyon!" fonksiyon_adi()

Burada fonksiyonun almasn sa layan sey, en son satrdaki fonksiyon_adi() kodudur. Bu s g satr ekleyerek, daha nce tanmlad mz fonksiyonu a rm oluyoruz. Bu satra teknik g g s olarak fonksiyon a rs (function call) ad verilir. g Yukardaki kodlar altrd mzda ekrana merhaba fonksiyon! satrnn yazdrld n gres g g ce iz. g Tebrikler! Bylece ilk eksiksiz fonksiyonunuzu hem tanmlam, hem de a rm oldunuz. s g s Dilerseniz, bu konunun en banda verdi imiz dileke rne ini de bir fonksiyon haline getirelim: s g g
#!/usr/bin/env python # -*- coding: utf-8 -*def dilekce_gonder(): print """\ Sayn Mehmet Bey, 19.12.2009 tarihinde yaptmz bavurunun sonulandrlmas g s hususunda yardmlarnz rica ederiz. Sayglarmzla, Orun Kunek""" dilekce_gonder()

Elbette bu rnek Pythondaki fonksiyonlarn btn yeteneklerini ortaya koymaktan aciz. stelik bu fonksiyon, en bata bahsetti imiz sorunlar da zemiyor henz. Ama ne yapalm... s g Su ana kadar rendiklerimiz ancak bu kadarn yapmamza msaade ediyor. Biraz sonra g reneceklerimiz sayesinde fonksiyonlarla ok daha faydal ve manal iler yapabilece iz. g s g Yeni bir blme gemeden nce isterseniz fonksiyonlarla ilgili olarak buraya kadar rendi imiz ksm biraz irdeleyelim: g g 1. Pythonda fonksiyonlar bizi ayn seyleri tekrar tekrar yazma zahmetinden kurtarr. 2. Fonksiyonlar bir bakma bir taslaklama sistemi gibidir. Biraz sonra verece imiz rneklerde g bu durumu daha net olarak grece iz. g 3. Pythonda fonksiyonlar kullanabilmek iin ncelikle fonksiyonu tanmlamamz gerekir. Bir fonksiyonu tanmlamak iin def adl paracktan yararlanyoruz. 4. Pythonda bir fonksiyon tanm syle bir yapya sahiptir:
def fonksiyon_adi(): ...

5. Fonksiyon adlarn belirlerken Trke karakter kullanmyoruz. Fonksiyonlarmza verece imiz adlarn olabildi ince betimleyici olmas herkesin hayrnadr. g g 6. Elbette bir fonksiyonun ilevli olabilmesi iin sadece tanmlanmas yetmez. Ayrca tanms lad mz fonksiyonun bir de gvdesinin olmas gerekir. Fonksiyon gvdesini girintili olarak g yazyoruz. Dolaysyla Pythonda bir fonksiyon temel olarak iki ksmdan oluur. ksm s Ilk fonksiyonun tanmland balk ksm; ikinci ksm ise fonksiyonun ieri ini oluturan g s g s gvde ksmdr. Balk ve gvde dnda kalan her sey fonksiyonun da dndadr. s s s 7. Bir fonksiyon, gvdedeki girintili ksmn bitti i yerde biter. rne in su bir fonksiyondur: g g

def selamla(): print "merhaba!" print "naslsn?"

Bu fonksiyon def selamla(): satryla balar, print "naslsn?" satryla biter. s 8. Fonksiyonlarn ilevli olabilmesi iin bu fonksiyonlar tanmlandktan sonra a rlmaldr. s g rne in yukardaki fonksiyonu syle a ryoruz: g g
def selamla(): print "merhaba!" print "naslsn?" selamla()

Dedi imiz gibi, bu fonksiyon def selamla(): satryla balar, print "naslsn?" satryla g s biter. Fonksiyon a rs dedi imiz selamla() satr bu fonksiyonun dndadr. nk bu satr g g s selamla() fonksiyonunun gvdesini oluturan girintili ksmn dnda yer alyor. s s E er bu sylediklerimiz size biraz kafa kartrc gelmise, hi endie etmenize gerek yok. Tam g s s s olarak ne demek istedi imizi biraz sonra gayet net bir sekilde anlamanz sa layacak rnekler g g verece iz. g Dilerseniz bu blm kapatmadan nce fonksiyonlarla ilgili birka basit rnek daha yaparak bu konuya snmanz sa layalm: g
#!/usr/bin/env python # -*- coding: utf-8 -*def tek(): print "Girdiiniz say bir tek saydr!" g def cift(): print "Girdiiniz say bir ift saydr!" g sayi = raw_input("Ltfen bir say giriniz: ") if int(sayi) % 2 == 0: cift() else: tek()

Burada tek() ve cift() adl iki fonksiyon tanmladk. tek() adl fonksiyonun grevi ekrana Girdi iniz say bir tek saydr! kts; cift() adl fonksiyonun grevi ise Girdi iniz say bir ift g g saydr! kts vermek. Daha sonra Pythonun raw_input() fonksiyonunu kullanarak kullancdan bir say girmesini istiyoruz. Ardndan da kullanc tarafndan girilen bu saynn tek mi yoksa ift mi oldu unu denetliyg oruz. E er say 2ye tam olarak blnyorsa ifttir. Aksi halde bu say tektir. g Burada cift() ve tek() adl fonksiyonlar nasl a rd mza dikkat edin. E er kullancnn girdi i g g g g say 2ye tam olarak blnyorsa, yani bu say iftse, daha nce tanmlad mz cift() adl g fonksiyon devreye girecektir. Yok, e er kullancnn verdi i say 2ye tam olarak blnmyorsa g g o zaman da tek() adl fonksiyon devreye girer. Bu kodlarda zellikle fonksiyonlarn nerede balayp nerede bitti ine dikkat edin. Daha nce s g de dedi imiz gibi, bir fonksiyon def parac yla balar, gvdesindeki girintili alann sonuna g g s kadar devam eder. Girintili alann dnda kalan btn kodlar o fonksiyonun dndadr. Mesela s s

yukardaki rnekte tek() ve cift() birbirinden ba msz iki fonksiyondur. Bu fonksiyonlardan g sonra gelen say de ikeni de fonksiyon alannn dnda yer alr. gs s

13.2 Fonksiyonlarda Parametre Kullanm


Yukardaki rneklerde grd nz gibi, bir fonksiyon tanmlarken, fonksiyon adn belirledikten g sonra bir parantez iareti kullanyoruz. Bu parantez iaretleri, rneklerde de grd mz gibi s s g hibir bilgi iermeyebilir. Yani bu parantezler bo olabilir. Ancak yapaca mz iin niteli ine s g s g gre bu parantezlerin iine birtakm bilgiler yerletirmemiz gerekebilir. ste bu bilgilere s I parametre ad verilir. Zaten Python fonksiyonlar da asl gcn bu parametrelerden alr. Simdi syle bir rnek verdi imizi dnelim: g s
#!/usr/bin/env python # -*- coding: utf-8 -*def selamla(): print "merhaba, benim adm istihza!" selamla()

Burada fonksiyonumuzu tanmladktan sonra en sondaki selamla() satr yardmyla fonksiyonumuzu a rdk. Yani tanmlad mz fonksiyona hayat pc verdik. g g g Ancak yukarda tanmlad mz fonksiyon olduka kstl bir kullanm alanna sahiptir. Bu g fonksiyon ekrana yalnzca merhaba, benim adm istihza! ktsn verebilir. E er fonksiyonlarn g yapabildi i sey bundan ibaret olsayd, emin olun fonksiyonlar hibir iimize yaramazd. Ama g s simdi renece imiz parametre kavram sayesinde fonksiyonlarmza takla atmay rete g g g ce iz. Gelin isterseniz ok basit bir rnekle balayalm: g s
def selamla(isim): print "merhaba, benim adm %s!" %isim

Belki fark ettiniz, belki de fark etmediniz, ama burada aslnda ok nemli bir sey yap tk. Fonksiyonumuza bir parametre verdik! Simdiye kadar tanmlad mz fonksiyonlarda, g fonksiyon tanm hep bo bir parantezden oluuyordu. Ancak bu defa parantezimizin iinde bir s s de iken ad gryoruz. Bu de ikenin ad isim. Fonksiyonlar sz konusu oldu unda, parangs gs g tez iindeki bu de ikenlere parametre ad verilir. Fonksiyonumuzu tanmlarken bir parametre gs belirttikten sonra bu parametreyi fonksiyonun gvdesinde de kullandk. Isterseniz simdi tanm lad mz bu fonksiyonun bir ie yarayabilmesi iin fonksiyonumuzu a ralm: g s g
selamla("istihza")

Kodlar bir arada grelim:


#!/usr/bin/env python # -*- coding: utf-8 -*def selamla(isim): print "merhaba, benim adm %s!" %isim selamla("istihza")

Bu kodlar altrd mzda syle bir kt alrz: s g


merhaba, benim adm istihza!

Burada selamla() adl fonksiyonu istihza argman ile birlikte a rdk. Bylece ktda istihza g de erini aldk. Burada terminolojiyle ilgili ufak bir not delim: Fonksiyonlar tanmlanrken g s parantez iinde belirtilen de erlere parametre ad verilir. Ayn fonksiyon agrlrken parang tez iinde belirtilen de erlere ise argman ad verilir. Ama her iki durum iin de parametre g adnn kullanld n da grebilirsiniz baz yerlerde... Neyse... Biz bu terminoloji iini bir kenara g s brakp yolumuza devam edelim. E er selamla() adl fonksiyonu farkl bir argman ile a rrsak elbette alaca mz kt da farkl g g g olacaktr:
selamla("Ahmet Efendi")

Bu defa ktmz syle:


merhaba, benim adm Ahmet Efendi!

Burada nemli olan nokta, selamla() fonksiyonunun bir adet parametreye sahip olmasdr. Dolaysyla bu fonksiyonu argmansz olarak veya birden fazla argmanla a ramayz. Yani g fonksiyonu su sekillerde a rmak hata almamza yol aacaktr: g
selamla("Ahmet", "Mehmet")

veya:
selamla()

Sanrm bu rnekler fonksiyonlardaki parametre kavramnn ne oldu unu net bir biimde org taya koyuyor. Daha sonraki blmlerde bu parametre kavramndan bolca yararlanaca z. g Ilerde grece imiz rnekler ne kadar karmak olursa olsun, iin temeli aynen yukarda ang s s latt mz gibidir. E er bu temeli iyi kavrarsanz baka yerlerde grece iniz daha karmak g g s g s rnekleri anlamakta zorlanmazsnz. Dilerseniz bu anlattklarmzla ilgili ufak bir rnek daha yapp baka bir konuya geelim... s Pythonda, verilen saylar toplayan sum() adl bir fonksiyon oldu unu nceki derslerimizde g renmitik. Bu fonksiyonu syle kullanyorduk: g s
>>> sayilar = [45, 90, 43] >>> sum(sayilar) 178

sum() fonksiyonu, kendisine argman olarak verilen bir say listesinin elerini birbiriyle g toplayp sonucu bize bildiriyor. Ancak Pythonda bu sum() fonksiyonuna benzer bir sekilde bir say listesini alp, elerini birbiriyle arpan hazr bir fonksiyon bulunmuyor. Python bize bu g ilem iin herhangi bir hazr fonksiyon sunmad ndan, byle bir durumda kendi yntemimizi s g kendimiz icat etmek zorundayz. O halde hemen balayalm. Diyelim ki elimizde syle bir say s listesi var:
>>> sayilar = [45, 90, 43]

Soru su: Acaba bu listedeki saylar birbiriyle nasl arparz? Bunu yapmann en kolay yolu, listedeki btn saylar 1le arpp, btn de erleri tek bir de iken iinde toplamaktr. Yani g gs ncelikle de eri 1 olan bir de iken belirlememiz gerekiyor: g gs
>>> a = 1

Daha sonra listedeki btn saylar a de ikeninin de eriyle arpp, bu de eri yine a de ikegs g g gs nine atayaca z: g

>>> for i in sayilar: ... a = a * i

Yukardaki kodlar syle de yazabilece imizi biliyorsunuz: g


>>> for i in sayilar: ... a *= i

Bylece listedeki btn saylarn arpmn gsteren de er a de ikenine atanm oldu. g gs s Isterseniz bu a de ikeninin de erini yazdrp sonucu kendi gzlerinizle grebilirsiniz: gs g
>>> print a 174150

Grd nz gibi, listedeki btn saylarn arpm a de ikeninde tutuluyor. g gs Kodlar topluca grelim:
>>> >>> >>> ... ... >>> sayilar = [45, 90, 43] a = 1 for i in sayilar: a *= i print a

174150

Simdi syle bir dnn: Diyelim ki bir program yazyorsunuz ve bu programn de iik yer s gs lerinde, bir liste iindeki saylar birbiriyle arpmanz gerekiyor. Bunun iin syle bir yol takip edebilirsiniz: 1. nce bir say listesi tanmlarsnz, 2. Daha sonra, de eri 1 olan bir de iken tanmlarsnz, g gs 3. Son olarak da listedeki btn saylar bu de ikenin de eriyle arpp, elde etti iniz de eri gs g g g tekrar bu de ikene atarsnz, gs 4. Program iinde, gereken her yerde bu ilemleri tekrar edersiniz... s Bu yntem, sizi ayn seyleri srekli tekrar etmek zorunda brakt iin olduka verimsiz bir g yoldur. ste Pythondaki fonksiyonlar byle bir durumda hemen devreye girer. Mantkl bir proI gramc, yukardaki gibi her defasnda tekerle i yeniden icat etmek yerine, tekerle i bir kez icat g g eder, sonra gereken yerlerde icat etti i bu tekerle i kullanr. Biz de yukardaki ilemleri ieren g g s bir fonksiyonu tek bir kez tanmlayaca z ve program iinde gereken yerlerde bu fonksiyonu g a raca z. Simdi gelin yukardaki ilemleri ieren fonksiyonumuzu tanmlayalm: g g s
#!/usr/bin/env python # -*- coding: utf-8 -*def carp(liste): a = 1 for i in liste: a *= i print a

Bylece tasla mz oluturmu olduk. Artk bu fonksiyonu kullanarak istedi imiz bir say g s s g grubunu birbiriyle rahatlkla arpabiliriz. Bunun iin yapmamz gereken tek sey carp() adl fonksiyonu a rmak: g

carp([3, 5, 7])

Burada dikkat ederseniz, carp() fonksiyonuna argman olarak verdi imiz saylar bir liste iine g aldk. nk carp() fonksiyonu tek bir parametre alyor. E er bu fonksiyonu su sekilde a rrg g sanz hata alrsnz:
carp(3, 5, 7)

nk burada carp() fonksiyonuna birden fazla argman verdik. Halbuki fonksiyonumuz sadece tek bir argman alyor. Elbette dilerseniz nce bir say listesi tanmlayabilir, ardndan da bu listeyi fonksiyona argman olarak verebilirsiniz:
sayilar = [3, 5, 7] carp(sayilar)

Simdi kodlar topluca grelim:


#!/usr/bin/env python # -*- coding: utf-8 -*def carp(liste): a = 1 for i in liste: a = a * i print a sayilar = [3, 5, 7] carp(sayilar)

Bu kodlar altrd nzda 105 sonucunu alrsnz. s g Bu arada, yukardaki kodlarda carp() fonksiyonuna ait liste adl parametrenin yalnzca temsili bir isimlendirme oldu una dikkat edin. Program iinde daha sonra fonksiyonu a rrken g g argman olarak kullanaca nz de erin liste adn tama zorunlulu u yoktur. Mesela bizim g g s g rne imizde carp() fonksiyonunu sayilar adl bir liste ile a rdk... Yani yukardaki fonksiyonu g g syle de yazabilirdik:
#!/usr/bin/env python # -*- coding: utf-8 -*def carp(osman): a = 1 for i in osman: a = a * i print a

Daha sonra da yine bu fonksiyonu su sekilde a rabiliriz: g


saylar = [3, 5, 7] carp(sayilar)

Elbette fonksiyon iinde belirtti iniz parametrelerin anlaml bir ada sahip olmas herkes iin en g do rusudur. g Fonksiyonlarn iimizi ne kadar kolaylatrd n gryorsunuz. Yapmak istedi imiz ilemleri bir s s g g s fonksiyon olarak tanmlyoruz ve gerekti i yerde bu fonksiyonu a rarak iimizi hallediyoruz. g g s E er ilemlerde bir de iiklik yapmak gerekirse, tanmlad mz fonksiyonu yeniden dzeng s gs g lememiz yeterli olacaktr. E er fonksiyonlar olmasayd, fonksiyon iinde tek bir kez tanmg lad mz ilemi programn farkl yerlerinde defalarca tekrar etmemiz gerekecekti. stelik g s

ilemlerde bir de iiklik yapmak istedi imizde de, btn program batan sona tarayp de iiks gs g s gs likleri tek tek elle uygulamak zorunda kalacaktk. Dilerseniz en bata verdi imiz dileke rne ine tekrar dnelim ve o durumu fonksiyonlara s g g uyarlayalm:
#!/usr/bin/env python # -*- coding: utf-8 -*def dilekce_gonder(kime, tarih, kimden): print """\ Sayn %s, %s tarihinde yaptmz bavurunun sonulandrlmas g s hususunda yardmlarnz rica ederiz. Sayglarmzla, %s""" %(kime, tarih, kimden) dilekce_gonder("Mehmet Bey", "19.12.2009", "Orun Kunek")

Grd nz gibi, yukardaki fonksiyon iimizi bir hayli kolaylatryor. Burada fonksiyonumuzu g s s sadece bir kez oluturuyoruz. Ardndan dilekeyi kime gndereceksek, uygun bilgileri kuls lanarak yeni bir fonksiyon a rs yapabiliriz. Mesela dilekeyi Ahmet Beye gndereceksek g syle bir satr yazmamz yeterli olacaktr:
dilekce_gonder("Ahmet Bey", "21.01.2010", "Erdener Topu")

Ayrca dileke metninde bir de iiklik yapmak istedi imizde sadece fonksiyon gvdesini dzengs g lememiz yeterli olacaktr.

13.3 simli ve Sral Argmanlar I


Bir nceki blmde fonksiyon parametrelerini nasl kullanaca mz rendik. Pythonda g g fonksiyonlara istedi iniz sayda parametre verebilirsiniz. Mesela syle bir fonksiyon tanmg layabilirsiniz:
#!/usr/bin/env python # -*- coding: utf-8 -*def kayit_ekle(isim, soyisim, sehir, meslek, tel, adres): kayit = {} kayit["%s %s" %(isim, soyisim)] = [sehir, meslek, tel, adres] print "Balant bilgileri kaytlara eklendi!\n" g for k, v in kayit.items(): print k print "-"*len(k) for i in v: print i kayit_ekle("Orun", "Kunek", "Adana", "arkc", S "0322 123 45 67", "Baraj Yolu")

Yine burada, kodlarmzn irkin bir grnt oluturmamas iin eleri nasl alt satra s g geirdi imize dikkat edin. E er Python kodlarna duyarl bir metin dzenleyici kullanyorg g sanz (mesela IDLE) virgl iaretlerinden sonra ENTER tuuna bast nzda dzgn girinti yaps s s g otomatik olarak oluturulacaktr. s Bu kodlarda ncelikle kayit_ekle() adl bir fonksiyon tanmladk. Bu fonksiyon toplam alt adet parametre alyor. Bunlar; isim, soyisim, sehir, meslek, tel ve adres. Tanmlad mz bu fonksiyonun gvdesinde ilk olarak kayit adl bir szlk oluturduk. Bu sg s zlk, ekleyece imiz ba lantya dair bilgileri tutacak. Daha sonra, oluturdu umuz bu szl e g g s g g e ekliyoruz. Buna gre, fonksiyon parametrelerinden olan isim ve soyisim; kayit adl sg zlkteki anahtar ksmn oluturacak. sehir, meslek, tel ve adres de erleri ise kayit adl s g szlkteki de er ksmn meydana getirecek. g Szl oluturduktan sonra ekrana Ba lant bilgileri kaytlara eklendi! biiminde bir mesaj g s g yazdryoruz. Daha sonra da kayt adl szl n elerini belli bir dzen erevesinde ekrana g g yazdryoruz. Bu ilemi nasl yapt mza dikkat edin. Python szlklerinde items() adl bir metot oldu unu s g g szlkler konusunu ilerken renmitik. Bu metot yardmyla bir szlk iinde bulunan btn s g s anahtar ve de er iftlerini elde edebiliyorduk. Dilerseniz buna bir rnek vererek bu metodu g tekrar hatrlayalm. Diyelim ki elimizde syle bir szlk var:
>>> sozluk = {"programlama dili": "Python", ... "metin duzenleyici": "Kwrite"}

Simdi items() metodunu bu szlk zerine uygulayalm:


>>> print sozluk.items() [(programlama dili, Python), (metin duzenleyici, Kwrite)]

Grd nz gibi, sozluk adl szl e ait btn anahtar ve de erler bir liste iinde demetler g g g halinde topland. Simdi syle bir sey yazalm:
>>> for k, v in sozluk.items(): ... print k, v

Buradan syle bir kt alrz:


programlama dili Python metin dzenleyici Kwrite

Bu sekilde bir kt elde ettikten sonra artk bu kty istedi imiz sekilde biimlendirebile g ce imizi biliyoruz. g items() metodunu hatrlatt mza gre biz tekrar kayit_ekle() fonksiyonumuzu incelemeye g devam edebiliriz. Biraz nce anlatt mz gibi, kayit_ekle() fonksiyonu iindeki for k, v in g kayit.items(): satrnda k de ikeni kayit adl szlkteki anahtarlar, v de ikeni ise ayn gs gs szlkteki de erleri temsil ediyor. Bylece szlkteki anahtar ve de er iftlerini birbirinden g g ayrm olduk. s Bu ilemi yaptktan sonra, ncelikle k de ikenini ekrana yazdryoruz. Yani kayit adl szlks gs teki anahtar ksmn alm oluyoruz. Bu ksm, fonksiyondaki isim ve soyisim parametrelerinin s de erini gsteriyor... print "-"*len(k) satr ise, bir nceki satrda ekrana yazdrd mz g g

isim ve soyismin altna, isim ve soyisim de erlerinin uzunlu u kadar izgi ekmemizi sa lyor. g g g Bylece isim ve soyismi, fonksiyondaki teki bilgilerden grsel olarak ayrm oluyoruz. s En son olarak da kayit adl szl n de er ksmndaki eleri tek tek ekrana yazdryoruz. g g g Fonksiyonumuzu baaryla tanmladktan sonra sra geldi bu fonksiyonu a rmaya... s g Fonksiyonumuzu srasyla, Orun, Kunek, Adana, Sarkc, 0322 123 45 67 ve Baraj Yolu arg manlaryla birlikte a ryoruz. Bylece bu kodlar altrd mzda syle bir kt elde ediyoruz: g s g
Balant bilgileri kaytlara eklendi! g Orun Kunek ----------Adana S arkc 0322 123 45 67 Baraj Yolu

Isterseniz, kayit_ekle() fonksiyonundaki parametreleri kendiniz yazmak yerine kullancdan almay da tercih edebilirsiniz. Mesela syle bir sey yazabilirsiniz:
#!/usr/bin/env python # -*- coding: utf-8 -*def kayit_ekle(isim, soyisim, sehir, meslek, tel, adres): kayit = {} kayit["%s %s" %(isim, soyisim)] = [sehir, meslek, tel, adres] print "\nBalant bilgileri kaytlara eklendi!\n" g for k, v in kayit.items(): print k print "-"*len(k) for i in v: print i isi soy seh mes tel adr = = = = = = raw_input("isim: ") raw_input("soyisim: ") raw_input("ehir: ") s raw_input("meslek: ") raw_input("telefon: ") raw_input("adres: ")

kayit_ekle(isi, soy, seh, mes, tel, adr)

Yukardaki fonksiyonlar kullanrken dikkat etmemiz gereken ok nemli bir nokta var. kayit_ekle() adl fonksiyonu kullanrken argman olarak verece imiz de erlerin sras byk g g nem tayor. Yani bu de erleri, fonksiyon tanmndaki sraya gre yazmamz gerek. Buna gre s g kayit_ekle() fonksiyonunu a rrken, ilk argmanmzn isim, ikincisinin soyisim, ncsnn g sehir, drdncsnn meslek, beincisinin telefon, altncsnn ise adres olmas gerekiyor. Aksi s halde, bizim yukarda verdi imiz rnekte ok belli olmasa da, fonksiyondan alaca mz kt hi g g de bekledi imiz gibi olmayabilir. Ancak takdir edersiniz ki, bu kadar fazla sayda parametrenin g srasn aklda tutmak hi de kolay bir i de il. ste bu noktada Pythondaki isimli argmanlar s g I (keyword arguments) devreye girer ve bizi byk bir dertten kurtarr. Nasl m? Isterseniz yukarda verdi imiz rnekten yararlanalm: g

#!/usr/bin/env python # -*- coding: utf-8 -*def kayit_ekle(isim, soyisim, sehir, meslek, tel, adres): kayit = {} kayit["%s %s" %(isim, soyisim)] = [sehir, meslek, tel, adres] print "\nBalant bilgileri kaytlara eklendi!\n" g for k, v in kayit.items(): print k print "-"*len(k) for i in v: print i kayit_ekle(isim = "Abdurrahman", soyisim = "elebi", meslek = "retmen", g tel = "0212 123 45 67", sehir = "stanbul", I adres = "eliktepe")

Grd nz gibi, kayit_ekle() adl fonksiyonumuzun argmanlarn isimleriyle birlikte a ryg g oruz. Bylece argmanlar sra gzetmeden kullanma imknmz oluyor. Bizim rne imizde g btn parametreler karakter dizilerinden olutu u iin, isimli parametre kullanmann faydas s g ilk bakta pek belli olmuyor. Ama zellikle saylar ve karakter dizilerini kark olarak ieren s s fonksiyonlarda yukardaki yntemin faydas daha belirgindir. Mesela su rne e bakalm: g
#!/usr/bin/env python # -*- coding: utf-8 -*def terfi_ettir(kisi, e_poz, y_poz, e_maas, z_orani): print ("%s, %s pozisyonundan %s pozisyonuna " "terfi etmitir!" %(kisi, e_poz, y_poz)) s print ("Bu kiinin %s TL olan maa %s TLye " s s "ykseltilmitir!" %(e_maas, e_maas + s (e_maas * z_orani / 100))) terfi_ettir("Ahmet ncel", " Gelitirme Uzman", Is s " Gelitirme Mdr", Is s 3500, 25)

ste bu rnekte, parametre/argman sralamasnn nemi ortaya kar. E er burada mesela I g Ahmet ncel argmanyla 3500 argmannn yerini de itirirseniz programnz hata verecekgs tir. nk bu fonksiyonda biz 3500 saysn kullanarak aritmetik bir ilem yapyoruz. E er s g 3500n olmas gereken yerde bir say yerine karakter dizisi olursa aritmetik ilem yaplamaz... s Bu arada yukardaki fonksiyonun sa a do ru ok fazla yaylarak irkin bir kod grnts verg g memesi iin satrlar nasl alta kaydrd mza dikkat edin. g Yukardaki rne i, isimli argmanlar kullanarak yazarsak sralama meselesini dert etmemize g gerek kalmaz:

#!/usr/bin/env python # -*- coding: utf-8 -*def terfi_ettir(kisi, e_poz, y_poz, e_maas, z_orani): print ("%s, %s pozisyonundan %s pozisyonuna " "terfi etmitir!" %(kisi, e_poz, y_poz)) s print ("Bu kiinin %s TL olan maa %s TLye " s s "ykseltilmitir!" %(e_maas, e_maas + s (e_maas * z_orani / 100))) terfi_ettir(e_maas = 3500, e_poz = " Gelitirme Uzman", Is s kisi = "Ahmet ncel", y_poz = " Gelitirme Mdr", Is s z_orani = 25)

Teknik olarak sylemek gerekirse Python fonksiyonlarnda e sralamasnn nem tad g s g argmanlara sral argman (positional argument) ad verilir. Python fonksiyonlarnda sral argmanlardan bolca yararlanlr. Ancak argman saysnn ok fazla oldu u durumlarda isimli g argmanlar kullanmak da iinizi bir hayli kolaylatrabilir. s s

13.4 Varsaylan Degerli Argmanlar


nceki derslerimizden range() fonksiyonunu biliyorsunuz. Gelin isterseniz bu fonksiyona simdi biraz daha yakndan bakalm. Hatrlarsanz range() fonksiyonunu syle kullanyorduk:
>>> range(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Bu kullanm bize 0dan 10a kadar olan saylarn listesini veriyor. Dikkat ederseniz, biz yukarda range() fonksiyonunu tek bir argman ile a rdk. Ancak biz dilersek yukardaki fonksiyonu g ikinci bir argmanla daha a rabiliriz: g
>>> range(4, 10) [4, 5, 6, 7, 8, 9]

Bu sekilde de 4ten 10a kadar olan saylarn listesini elde ediyoruz. range() fonksiyonu bun larn dnda nc bir argman daha alr: s
>>> range(4, 10, 2) [4, 6, 8]

Bu nc argman, range() fonksiyonunun saylar atlayarak gstermesini sa lyor. g Grd nz gibi range() fonksiyonu su parametrelerden oluuyor: g s
range(balang_deeri, biti_deeri, atlama_deeri) s g s g g

range() fonksiyonunu kullanabilmek iin bu parametreler iinde sadece biti_de eri adl s g parametreye bir argman vermemiz yeterli olacaktr:

range(10)

teki iki parametreyi ise bo geebiliyoruz, nk o parametrelerin birer varsaylan de eri var. s g Bu yzden o parametreleri belirtmesek de oluyor. O parametrelerin varsaylan de erlerinin g syle oldu unu biliyorsunuz: g
balang_deeri = 0 s g atlama_deeri = 1 g

Dolaysyla, biz range(10) yazd mzda Python bunu range(0, 10, 1) seklinde alglayacak g ve ona gre ilem yapacaktr. s Peki varsaylan de erli argmanlarn bize ne gibi bir faydas var? Varsaylan de erli argg g manlar suna benzetebiliriz: Diyelim ki bilgisayarnza bir program kuruyorsunuz. E er bu g program ilk defa kuruyorsanz, kurulumla ilgili btn seeneklerin ne ie yarad n bilmiyor s g olabilirsiniz. Dolaysyla e er program size kurulumun her aamasnda bir soru sorarsa her g s soruya ne cevap verece inizi kestiremeyebilirsiniz. O yzden, makul bir program, kullancnn g en az seimle program kullanlabilir hale getirmesine msaade etmelidir. Yani bir programn kurulumu esnasnda baz seeneklere program yazan kii tarafndan baz mantkl varsaylan s de erler atanabilir. rne in kullanc program kurarken herhangi bir kurulum dizini belirtg g mezse program otomatik olarak varsaylan bir dizine kurulabilir. Veya programla ilgili, kullancnn iine yarayacak bir zellik varsaylan olarak ak gelebilir. ste biz de yazd mz pros I g gramlarda kullanaca mz fonksiyonlara bu sekilde varsaylan de erler atarsak programmz g g kullanacak kiilere kullanm kolayl sa lam oluruz. rne in range() fonksiyonunu yazan s g g s g Python gelitiricileri bu fonksiyona baz varsaylan de erler atayarak bizim iin bu fonksiyonun s g kullanmn kolaylatrmlardr. Bu sayede range() fonksiyonunu her defasnda argman s s vermek yerine tek argman ile altrabiliyoruz. s ste biz de kendi yazd mz fonksiyonlarda byle varsaylan de erler belirleyebiliriz. Mesela I g g su rne e bir bakalm: g
#!/usr/bin/env python # -*- coding: utf-8 -*def kuvvet(sayi, kvt=2): print sayi ** kvt

Burada, kendisine verilen bir saynn kuvvetini hesaplayan bir fonksiyon yazdk. Bu fonksiyonun varsaylan de erli bir parametresi var (kvt). Fonksiyonu su sekilde a ryoruz: g g
kuvvet(12)

Fonksiyonu byle a rd mzda otomatik olarak 12 saysnn 2. kuvveti hesaplanacaktr. g g nk kvt parametresinin varsaylan de eri 2dir. Ama e er biz 12 saysnn farkl bir kuvvetini g g hesaplamak istersek ayn fonksiyonu su sekilde a rabiliriz: g
kuvvet(12, 3)

Bylece 12 saysnn 3. kuvvetini hesaplam olduk. s Grd nz gibi, kuvvet() adl fonksiyon toplam 2 parametreden oluuyor. Bu fonksiyonu g s kullanabilmek iin sayi parametresini mutlaka belirtmemiz gerekiyor. kvt parametresini belirtmesek de olur. nk bunun varsaylan bir de eri var. Dolaysyla biz fonksiyonu tek g argmanla a rd mzda Python kvt parametresinin de erini 2 kabul edecektir. E er bizim g g g g istedi imiz sey herhangi bir saynn farkl bir kuvvetini hesaplamaksa bizim bunu ak ak g belirtmemiz gerekiyor. Gelin isterseniz bununla ilgili bir baka rnek daha verelim: s

def bol(bolen, bolunen, hassas=True): sonuc = bolen / float(bolunen) if hassas == True: print float(sonuc) if hassas == False: print int(sonuc)

Burada bol() adl bir fonksiyon tanmladk. Bu fonksiyon toplam 3 parametre alyor: bolen, bolunen ve hassas. Bu parametreden sonuncusu varsaylan bir de ere sahip. Dolaysyla g bizim bu fonksiyonu en az iki argman ile a rmamz gerekiyor: g
bol(10, 3)

Bu program altrd mzda su sonucu alrz: s g


3.33333333333

Grd nz gibi, sonu iinde ondalk ksm da grnyor. E er tamsay seklinde bir sonu g g elde etmek istersek fonksiyonumuzu syle a raca z: g g
bol(10, 3, False)

Bu sekilde syle bir sonu alrz:


3

Dedi imiz gibi, fonksiyonumuza bakt mz zaman, bol() fonksiyonunun adet parametre g g ald n gryoruz. Ama sonuncu parametreye varsaylan bir de er atad mz iin, fonksiyg g g onumuzu kullanrken sadece iki argman vermemiz yeterli oluyor. E er nc parametreyi g belirtmezsek, bu parametrenin de eri True varsaylacaktr. Parametrenin de eri True kabul g g edildi i iin de fonksiyonumuz hesaplamada hassas bir sonu verir. E er biz bu tr bir hasg g sasiyet istemezsek nc parametre olan hassas False de eri ile a ryoruz. g g Bu arada, yukardaki fonksiyonu su sekilde tanmlayabilece imizi de biliyoruz: g
def bol(bolen, bolunen, hassas=True): sonuc = bolen / float(bolunen) if hassas: print float(sonuc) if not hassas: print int(sonuc)

Burada if hassas: ifadesi if hassas == True: ile eanlamldr. if not hassas: ise if s hassas == False ile ayn anlama gelir. Varsaylan de erli fonksiyonlar tanmlarken dikkat etmemiz gereken nemli bir kural var. Bu g tr fonksiyonlarda varsaylan de erin, parametre sralamasnda en sonda gelmesi gerekiyor. g Yani syle bir sey yazamayz:
def bol(hassas = True, bolen, bolunen): ...

E er varsaylan de erli argman en sona de il de baa veya ortaya alrsak Python bize syle g g g s bir hata verir:

SyntaxError: non-default argument follows default argument

Yani:
SzdizimiHatas: varsaylan deersiz argman, varsaylan deerli argmandan sonra geliyor g g

Dolaysyla kural olarak, varsaylan de ere sahip argmanlar parametre listesinin en sonuna g yerletirmeye zen gstermemiz gerekiyor. s

13.5 stenen Sayda Sral Argman Kullanm I


Fonksiyonlar anlatrken syle bir rnek vermitik: s
def selamla(isim): print "merhaba, benim adm %s!" %isim

Bu fonksiyon, kendisine argman olarak verilen herhangi bir ismi, mesela Ahmeti, merhaba, benim adm Ahmet! seklinde ekrana dkyordu. E er biz hem ismin hem de soyismin ekrana g dklmesini istersek syle bir sey yazabiliriz:
def selamla(isim, soyisim): print "merhaba, ben ", isim, soyisim

Bu fonksiyonu su sekilde a ryoruz: g


selamla("Frat", "zgl")

Bu kodlar altrd mzda syle bir kt alrz: s g


merhaba, ben Frat zgl

Yazd mz bu fonksiyona istedi imiz sayda parametre ekleyebilece imizi biliyoruz. Mesela: g g g
def sicile_ekle(isim, soyisim, tc_kimlik, dog_yeri, dog_tarihi, adres): ...

Bu parametreler byle uzayp gider... rne in yukardaki fonksiyon 6 adet parametre alyor. g Dolaysyla biz bu fonksiyonu 6dan az veya fazla sayda argman ile a ramayz. Aksi halde g Python bize hata mesaj gsterir. Peki ya biz kendimizi herhangi bir sayyla snrlamak istemezsek ne olacak? Yani mesela biz bir fonksiyon tanmlarken parametre saysn nceden belirtmesek de istedi imiz kadar argmanla fonksiyonumuzu a rabilsek olmaz m? rne in g g g syle bir sey yapamaz myz?
fonksiyon_adi(arg1, arg2, arg3, arg4, arg5, ...)

Elbette yapabiliriz. Simdi su kodlar dikkatlice inceleyin:


#!/usr/bin/env python # -*- coding: utf-8 -*def birlestir(*argumanlar): a = "" for i in argumanlar: a += i + " " print a

birlestir("Ahmet", "z", "Mersin", "Mhendis", "0533 123 45 67")

Grd nz gibi, bu fonksiyonun tam olarak ka adet parametre ald n belirtmedik. *arg g g gibi zel bir yapdan faydalanarak bu fonksiyonun snrsz sayda argman ile a rlmasna g olanak tandk. Gelin isterseniz bir rnek daha yaparak durumu biraz daha netletirelim. Hatrlarsanz yukarda s syle bir fonksiyon yazmtk: s
#!/usr/bin/env python # -*- coding: utf-8 -*def carp(liste): a = 1 for i in liste: a *= i print a

Bu fonksiyonu su sekilde a ryorduk: g


liste = [2, 3, 4] carp(liste)

Bylece liste iindeki btn saylar birbiriyle arpabiliyorduk. Bu fonksiyonun zelli i yalnzca g tek bir parametre almasdr. Dolaysyla bu fonksiyonu a rrken 1den az veya ok sayda g argman kullanamyoruz. Biz bu snrlamay amak iin Pythondaki listelerden yararlandk. s Biraz nce rendi imiz *arg yapsn kullanarak ayn fonksiyonu syle de yazabiliriz: g g
#!/usr/bin/env python # -*- coding: utf-8 -*def carp(*liste): a = 1 for i in liste: a *= i print a

Burada parametre saysn kstlamad mz iin artk fonksiyonumuzu rahatlkla syle a rag g biliriz:
carp(2, 3, 4, 5, 6, 7, 8)

Fonksiyonumuz, kendisine argman olarak verilen btn de erleri birbiriyle arpacaktr... g Dilerseniz bu *arg yapsna biraz daha yakndan bakalm. Simdi syle bir sey yazd mz g dnn: s
def fonk(*arg): print arg

Bu fonksiyonu istedi iniz sayda argmanla a rabilirsiniz: g g


fonk("Ahmet", "Mehmet", "Veli", "Ouz", "Ozan") g

Bu fonksiyonu altrd nzda syle bir kt alrsnz: s g

(Ahmet, Mehmet, Veli, Ouz, Ozan) g

Grd nz gibi, ktmz bir demet. Fonksiyon ktsn bu sekilde elde edece inizi bildikten g g sonra bu kty istedi iniz sekilde biimlendirebilirsiniz. Mesela: g
def fonk(*arg): for sira, isim in enumerate(arg): print "%s --> %s" %(sira, isim) fonk("Ahmet", "Mehmet", "Veli", "Ouz", "Ozan") g

Bu fonksiyonu altrd mzda syle bir kt elde ediyoruz: s g


0 1 2 3 4 --> --> --> --> --> Ahmet Mehmet Veli Ouz g Ozan

Pythondaki bu * iareti zel grevi olan bir aratr. Bu iaret, bir dizi iindeki (bu demet s s olabilir, liste olabilir, vb.) btn eleri tek tek fonksiyona uygular. Bu dedi imiz seyi daha iyi g g anlayabilmek iin syle bir rnek verelim:
def fonk(arg1, arg2, arg3): print arg1, arg2, arg3

Bu basit fonksiyonu su sekilde a rabiliriz: g


fonk("Ahmet", "Mehmet", "Ali")

E er istersek bu fonksiyonu, * iaretini de kullanarak su sekilde de a rabiliriz: g s g


ls = ["Ahmet", "Mehmet", "Ali"] fonk(*ls)

E er ayn fonksiyonu su sekilde a rrsanz hata alrsnz: g g


ls = ["Ahmet", "Mehmet", "Ali"] fonk(ls)

Burada * iareti, listenin her bir esinin tek tek fonksiyona uygulanmasn sa lyor. s g g Yukarda syle bir rnek verdi imizi hatrlyorsunuz: g
#!/usr/bin/env python # -*- coding: utf-8 -*def kayit_ekle(isim, soyisim, sehir, meslek, tel, adres): kayit = {} kayit["%s %s" %(isim, soyisim)] = [sehir, meslek, tel, adres] print "Balant bilgileri kaytlara eklendi!\n" g for k, v in kayit.items(): print k print "-"*len(k)

for i in v: print i kayit_ekle("Orun", "Kunek", "Adana", "arkc", S "0322 123 45 67", "Baraj Yolu")

Biraz nce rendi imiz bilgiyi kullanarak ayn fonksiyonu su sekilde de yazabiliriz: g g
#!/usr/bin/env python # -*- coding: utf-8 -*def kayit_ekle(isim, soyisim, sehir, meslek, tel, adres): kayit = {} kayit["%s %s" %(isim, soyisim)] = [sehir, meslek, tel, adres] print "Balant bilgileri kaytlara eklendi!\n" g for k, v in kayit.items(): print k print "-"*len(k) for i in v: print i isimler = ["Orun", "Kunek", "Adana", "arkc", S "0322 123 45 67", "Baraj Yolu"] kayit_ekle(*isimler)

Normalde kayit_ekle() fonksiyonu 6 argman alyor. Biz burada btn bu argmanlar ieren bir listenin btn elerini tek tek fonksiyona uyguluyoruz. Bunu yapmamz sa layan sey de g g ite biraz nce rendi imiz * iaretidir... s g g s Yukardaki rnekte, isimler listesini oluturan eleri kullancdan da alabilece imizi biliyoruz. s g g Hatta bunun iin daha nce syle bir kod da yazmtk: s
#!/usr/bin/env python # -*- coding: utf-8 -*def kayit_ekle(isim, soyisim, sehir, meslek, tel, adres): kayit = {} kayit["%s %s" %(isim, soyisim)] = [sehir, meslek, tel, adres] print "\nBalant bilgileri kaytlara eklendi!\n" g for k, v in kayit.items(): print k print "-"*len(k) for i in v: print i isi soy seh mes = = = = raw_input("isim: ") raw_input("soyisim: ") raw_input("ehir: ") s raw_input("meslek: ")

tel = raw_input("telefon: ") adr = raw_input("adres: ") kayit_ekle(isi, soy, seh, mes, tel, adr)

E er istersek, biraz nce rendi imiz bilgileri kullanarak bu kodlar su sekilde de ksaltabiliriz: g g g
#!/usr/bin/env python # -*- coding: utf-8 -*def kayit_ekle(isim, soyisim, sehir, meslek, tel, adres): kayit = {} kayit["%s %s" %(isim, soyisim)] = [sehir, meslek, tel, adres] print "\nBalant bilgileri kaytlara eklendi!\n" g for k, v in kayit.items(): print k print "-"*len(k) for i in v: print i ls = [] sorular = ["isim: ", "soyisim: ", "ehir: ", s "meslek: ", "tel: ", "adr: "] for i in sorular: ls.append(raw_input(i)) kayit_ekle(*ls)

Burada nce ls adl bo bir liste oluturduk. Bu liste, kullancdan raw_input() fonksiyonu s s yardmyla alnan cevaplar tutacak. Ardndan da sorular adl baka bir liste oluturduk. Bu s s da kullancya soraca mz sorular tutuyor. Daha sonra ise raw_input() fonksiyonunu bir for g dngs iine sokarak, kullancya sordu umuz btn sorularn cevabn tek tek ls adl listeye g ekliyoruz. Son olarak da bu ls listesindeki btn eleri tek tek kayit_ekle() adl fonksiyona g uyguluyoruz.

13.6 stenen Sayda simli Argman Kullanm I I


Bir nceki blmde fonksiyonlar kullanarak, istedi imiz sayda isimsiz argman nasl vereg bilece imizi renmitik. Bu blmde ise istedi imiz sayda isimli argman verme konusunu g g s g inceleyece iz. g Bildi iniz gibi isimli argmanlar, adndan da anlalaca gibi, bir isimle birlikte kullanlan argg s g manlardr. rne in su fonksiyonda isimli argmanlar kullanlmtr: g s
#!/usr/bin/env python # -*- coding: utf-8 -*def adres_defteri(isim, soyisim, telefon): defter = {} defter["isim"] = isim

defter["soyisim"] = soyisim defter["telefon"] = telefon for k, v in defter.items(): print("%s\t:\t%s" %(k, v)) adres_defteri(isim="Frat", soyisim="zgl", telefon="02122121212")

Burada ncelikle defter adl bir szlk tanmladk. Adres bilgilerini bu szlk iine kaydece iz. g Daha sonra bu defter adl szlk iinde yer alacak alanlar belirliyoruz. Yazd mz kodlara g gre defter adl szlk iinde isim, soyisim ve telefon olmak zere farkl alan bulunacak. Fonksiyon parametresi olarak belirledi imiz isim, soyisim ve telefon elerine karlk gelen g g s de erler, defter adl szlkteki ilgili alanlara yerletirilecek. g s Daha sonra gelen satrda syle bir kod gryoruz:
for k, v in defter.items(): print("%s\t:\t%s" %(k, v))

Burada defter szl nn items() metodunu kullanarak, szlk iindeki anahtar ve de er g g iftlerini birer demet halinde alyoruz. E er yukardaki kodu syle yazacak olursanz neler olup g bitti i biraz daha netleecektir: g s
for ogeler in defter.items(): print ogeler (soyisim, zgl) (adres, stanbul) I (telefon, 02122121212) (eposta, firatozgul@frtzgl.com) (cep, 05994443322) (isim, Frat)

Grd nz gibi, yukardaki kod bize defter adl szl n anahtar ve de er ierini ieren g g g birer demet veriyor. for k, v in defter.items() satr ile bu demetlerdeki elere tek tek g eriebiliyoruz. Burada k har, demetlerin ilk elerini, v har ise ikinci elerini temsil s g g ediyor. Alt satrdaki print("%s\t:\t%s" %(k, v)) kodu yardmyla yapt mz sey, k ve g v ile temsil edilen eleri biraz biimlendirerek ekrana basmaktan ibaret... Bu satr iinde g grd mz \t harerinin ne ie yarad n biliyoruz. Bunlar karakter dizileri iine sekme g s g (TAB) eklemek iin kullanlan ka dizileridir. s Bu fonksiyona gre, isim, soyisim ve telefon alanlarn doldurarak fonksiyonu alr hale s getirebiliyoruz. Simdi yukardaki fonksiyona syle bir ekleme yapalm:
#!/usr/bin/env python # -*- coding: utf-8 -*def adres_defteri(isim, soyisim, telefon, **arglar): defter = {} defter["isim"] = isim defter["soyisim"] = soyisim defter["telefon"] = telefon for i in arglar.keys(): defter[i] = arglar[i]

for k, v in defter.items(): print "%s\t:\t%s" %(k, v) adres_defteri(isim="Frat", soyisim="zgl", telefon="02122121212", eposta="firatozgul@frtzgl.com", adres="stanbul", I cep="05994443322")

Burada yapt mz eklemeler sayesinde adres_defteri() adl fonksiyona isim, soyisim ve g telefon parametrelerini yerletirdikten sonra istedi imiz sayda baka isimli argmanlar da bes g s lirtebiliyoruz. Burada **arglar parametresinin bir szlk (dictionary) oldu una zellikle dikkat g edin. Bu parametre bir szlk oldu u iin, szlklerin btn zelliklerine de do al olarak sahipg g tir. Yukardaki kodlar su sekilde yazarak, arka planda neler olup bitti ini daha ak bir sekilde g grebiliriz:
#!/usr/bin/env python # -*- coding: utf-8 -*def adres_defteri(isim, soyisim, telefon, **arglar): print "isim:\n\t", isim print "soyisim:\n\t", soyisim print "telefon:\n\t", telefon print "teki argmanlar:\n\t", arglar adres_defteri(isim="Frat", soyisim="zgl", telefon="02122121212", eposta="firatozgul@frtzgl.com", adres="stanbul", I cep="05994443322")

Bu kodlar altrd mzda suna benzer bir kt alaca z: s g g


isim: Frat soyisim: zgl telefon: 02122121212 teki argmanlar: {adres: stanbul, I eposta: firatozgul@frtzgl.com, cep: 05994443322}

Grd nz gibi, arglar parametresi bize bir szlk veriyor. Dolaysyla syle bir kod yazmamz g mmkn olabiliyor:
for i in arglar.keys(): defter[i] = arglar[i]

Bu kodlar yardmyla arglar adl szl n elerini defter adl szl e ekliyoruz. Bu yapnn g g g kafanz kartrmasna izin vermeyin. Aslnda yapt mz sey ok basit. Szlkler konusunu s g anlatrken szlklere nasl e ekleyebilece imizi anlatt mz hatrlyorsunuz: g g g

sozluk = {} sozluk["ayakkab"] = 2 sozluk["elbise"] = 1 sozluk["gmlek"] = 4

Bu rnekte sozluk adl szl e ayakkab, elbise ve gmlek adl eler ekliyoruz. Bu elerin g g g de erini srasyla 2, 1 ve 4 olarak ayarlyoruz. Dedi im gibi, yukardaki rnek for i in g g arglar.keys()... satryla yapt mz seyden farkl de ildir. Syle dnn: g g s
defter = {} defter["adres"] = "stanbul" I defter["eposta"] = "firatozgul@frtzgl.com" defter["cep"] = "05994443322"

defter[i] dedi imiz sey, adres, eposta ve cep elerine; arglar[i] dedi imiz sey ise stang g g I bul, ratozgul@frtzgl.com ve 05994443322 elerine karlk geliyor. g s Grd nz gibi, ift yldzl parametreler fonksiyonlara istedi imiz sayda isimli argman ekg g leme imkan tanyor bize... Dedi im gibi, bu parametreler bir szlk oldu u iin yukardaki g g rne i su sekilde de yazabilirsiniz: g
#!/usr/bin/env python # -*- coding: utf-8 -*def adres_defteri(isim, soyisim, telefon, **arglar): defter = {} defter["isim"] = isim defter["soyisim"] = soyisim defter["telefon"] = telefon for i in arglar.keys(): defter[i] = arglar[i] for k, v in defter.items(): print "%s\t:\t%s" %(k, v) sozluk = {"eposta": "firatozgul@frtzgl.com", "adres": "stanbul", I "cep": "05994443322"} adres_defteri(isim="Frat", soyisim="zgl", telefon="02122121212", **sozluk)

Burada szl nceden tanmlad mza ve bunu fonksiyonu a rrken do rudan argman g g g g olarak ekledi imize dikkat edin. Ayrca sozluk argmann fonksiyona yazarken yine ift yldzl g yapy kullanmay da unutmuyoruz.

13.7 Gml Fonksiyonlar (Built-in Functions)


Pythonda en byk nimetlerden biri de bu dilin yapsnda bulunan gml fonksiyonlardr (built-in functions). Peki, bir fonksiyonun gml olmas ne anlama gelir? gml demek,

Pythonun iinde yer alan demektir. Yani gml fonksiyonlar, Python programlama dilinin iinde yer alan, hazr fonksiyonlardr. Mesela daha nce rendi imiz ve sk sk kulland mz g g g range() fonksiyonu gml bir fonksiyondur. Bu fonksiyon Pythonun iinde, kullanlmaya hazr bir sekilde bekler. Bu fonksiyonun ilevini yerine getirebilmesi iin tanmlanmasna gerek s yoktur. Python gelitiricileri bu fonksiyonu tanmlam ve dilin iine gmmlerdir. Mesela s s s len(), enumerate() ve sum() fonksiyonlar da birer gml fonksiyondur. Pythondaki gml fonksiyonlarn listesine http://docs.python.org/library/functions.html adresinden eriebilirsiniz. Bir program yazarken, zel bir ilevi yerine getirmeniz gerekti inde s s g yukardaki adresi mutlaka kontrol edin. Bakn bakalm sizden nce birisi tekerle i zaten icat g etmi mi? rne in tamsaylar (integer) ikili saylara (binary) evirmeniz gerekiyorsa, oturup s g bu ilemi yapan bir fonksiyon tanmlamaya almanz bo bir aba olur. Bunun yerine halis s s hazrda tanmlanp dilin iine gmlm olan bin() fonksiyonunu kullanabilirsiniz. Yukardaki s adreste bunun gibi onlarca gml fonksiyon greceksiniz. Peki, gml fonksiyonlarla, bizim kendi yazd mz fonksiyonlar arasnda tam olarak ne fark g vardr? Bir defa, gml fonksiyonlar olduka hzl ve verimlidir. nk bu fonksiyonlar Python gelitiricileri tarafndan zel olarak optimize edilmitir. s s Ikincisi (ve belki de en nemlisi), bu fonksiyonlar her an hazr ve nazrdr. Yani bu fonksiyonlar kullanabilmek iin zel bir sey yapmanza gerek yoktur. Istedi inizde veya bu fonksiyg onlar lazm oldu unda do rudan kullanabilirsiniz bu fonksiyonlar. Ama bizim tanmlad mz g g g fonksiyonlar byle de ildir. Kendi yazd mz fonksiyonlar kullanabilmek iin, bu fonksiyonu g g ieren modl ncelikle ie aktarmamz (import) gerekir. Su son syledi im seyin kafanz g kartrmasna izin vermeyin. Yeri ve zaman geldi inde modl ve ie aktarmak kavrams g larndan sz edece iz. g

13.8 global Deyimi


Bu blmde global adl bir deyimden sz edece iz. g Isterseniz globalin ne oldu unu anlatmaya g almak yerine do rudan bir rnekle ie balayalm. Diyelim ki syle bir sey yazdk: s g s s
#!/usr/bin/env python # -*- coding: utf-8 -*def fonk(): a = 5 print a fonk()

Burada her zamanki gibi fonk() adl bir fonksiyon tanmladk ve daha sonra bu fonksiyonu a rdk. Sonu olarak bu fonksiyonu altrd mzda 5 ktsn aldk. g s g Grd nz gibi, fonksiyon iinde a adl bir de ikenimiz var. Simdi syle bir sey yazarak bu a g gs de ikenine ulamaya alalm: gs s s
#!/usr/bin/env python # -*- coding: utf-8 -*def fonk(): a = 5 print a fonk() print "ann deeri: ", a g

Bu kodlar altrd mzda syle bir hata alrz: s g


Traceback (most recent call last): File "deneme.py", line 7, in <module> print a NameError: name a is not defined

Bu hata mesaj bize a diye bir de iken olmad n sylyor. Halbuki biz fonk() adl fonksiyon gs g iinde bu a de ikenini tanmlamtk, de il mi? O halde neden Python a de ikenini bulags s g gs mad ndan yaknyor? Hatrlarsanz bu blmn en banda, bir fonksiyonun snrlarnn ne g s oldu undan sz etmitik. Buna gre yukardaki fonk() adl fonksiyon def fonk(): ifadesiyle g s balyor, print a ifadesiyle bitiyor. Bu fonksiyonun etkisi bu alanla snrldr. Pythonda buna s isim alan (namespace) ad verilir. Herhangi bir fonksiyon iinde tanmlanan her sey o fonksiy onun isim alanyla snrldr. Yani mesela yukardaki fonksiyon iinde tanmlad mz a de ikeni g gs yalnzca bu fonksiyon snrlar dhilinde geerlidir. Bu alann dna kld nda a de ikeninin s g gs herhangi bir geerlili i yoktur. O yzden Python yukardaki gibi bir kod yazd mzda a g g de ikenini bulamayacaktr. gs Isterseniz bu durumu daha iyi anlayabilmek iin yukardaki rne i g syle de itirelim: gs
#!/usr/bin/env python # -*- coding: utf-8 -*def fonk(): a = 5 print a fonk() a = 10 print "ann deeri: ", a g

Bu kodlar altrd mzda ise syle bir kt alrz: s g


5 ann deeri: 10 g

Buradaki ilk 5 says fonksiyon iindeki ann de erini gsteriyor. Alt satrdaki 10 de eri ise g g ann fonksiyon snrlar dndaki de erini... Grd nz gibi, a de ikenini fonksiyon dnda s g g gs s da kullanabilmek iin bu de ikeni darda tekrar tanmlamamz gerekiyor. Peki, biz fonksiyon gs s iindeki a de ikenine fonksiyon dndan da eriemez miyiz? Elbette eriebiliriz. Ama bunun gs s s s iin global adl bir deyimden yararlanmamz gerekir. Dilerseniz yukarda ilk verdi imiz rnek g zerinden giderek bu global deyimini anlamaya alalm: s
#!/usr/bin/env python # -*- coding: utf-8 -*def fonk(): a = 5 print a fonk() print "ann deeri: ", a g

Kodlar bu sekilde yazd mzda Pythonun bize bir hata mesaj gsterece ini biliyoruz. Simdi g g bu kodlara syle bir ekleme yapalm:
#!/usr/bin/env python # -*- coding: utf-8 -*-

def fonk(): global a a = 5 print a fonk() print "ann deeri: ", a g

Burada yapt mz sey, fonksiyonu tanmladktan sonra fonksiyon gvdesinin ilk satrna g global a diye bir sey eklemekten ibaret. Bu ifade fonksiyon iindeki a adl de ikenin global gs oldu unu, yani fonksiyonun kendi snrlar dnda da geerli bir de er oldu unu sylyor. Bu g s g g kodlar altrd mzda syle bir kt alyoruz: s g
5 ann deeri: g 5

Grd nz gibi, global deyimi bir fonksiyon iindeki de erlere fonksiyon dndan da erg g s imemize yardmc oluyor... s Simdi syle bir sey yazd mz dnn: g s
#!/usr/bin/env python # -*- coding: utf-8 -*a = 10 def fonk(): a = 5 return a print "ann fonksiyon iindeki deeri", fonk() g print "ann fonksiyon dndaki deeri: ", a s g

Buradaki return deyimine taklmayn biraz sonra bunun tam olarak ne ie yarad n grece iz. s g g Biz yalnzca yukardaki kodlarn ktsna odaklanalm. Burada ncelikle bir a de ikeni tanmladk. Bu de ikenin de eri 10. Ardndan fonk() adl gs gs g bir fonksiyon oluturduk. Bu fonksiyon iinde de eri 5 olan bir a de ikeni daha tanmladk. s g gs Fonksiyon dnda ise, iki adet kt veriyoruz. Bunlardan ilki fonksiyon iindeki a de ikeninin s gs de erini gsteriyor. g Ikincisi ise fonksiyon dndaki a de ikeninin de erini... Yani bu kodlar s gs g altrd mzda syle bir kt elde ediyoruz: s g
ann fonksiyon iindeki deeri 5 g ann fonksiyon dndaki deeri: s g 10

Burada fonksiyon iinde ve dnda ayn adda iki de iken tanmlamamza ra men, Pythondaki s gs g isim alan kavram sayesinde bu iki de ikenin de eri birbirine karmyor. Ama bir de su gs g s kodlara bakn:
#!/usr/bin/env python # -*- coding: utf-8 -*a = 10 def fonk(): global a a = 5 return a

print "ann fonksiyon iindeki deeri", fonk() g print "ann fonksiyon dndaki deeri: ", a s g

Burada bir nceki kodlara ilave olarak global a satrn yazdk. Bu defa ktmz syle oldu:
ann fonksiyon iindeki deeri 5 g ann fonksiyon dndaki deeri: s g 5

Grd nz gibi, global deyimi fonksiyon dndaki a de ikenini sildi. Simdi bu noktada g s gs kendimize su soruyu sormamz lazm: Acaba bizim istedi imiz sey bu mu? zellikle zerinde g birka farkl kiinin alt byk projelerde byle bir zellik ne tr sorunlara yol aabilir? s s g zerinde pek ok farkl kiinin alt byk projelerde global deyiminin byk skntlar s s g do urabilece i apak ortada. Siz programn bir yerine bir de iken tanmlamaya alrken, g g gs s baka bir gelitirici bir fonksiyon iinde global deyimini kullanarak fonksiyon dndaki ayn adl s s s de ikenlerin de erini birbirine katm olabilir... ste bu tr skntlardan tr, her ne kadar gs g s I faydal bir aram gibi grnse de, global deyiminin sakncalar faydalarndan oktur. O yzs den yazd nz programlarda global deyiminden mmkn oldu unca uzak durmanzda fayda g g var.

13.9 return Deyimi


Hatrlarsanz bir nceki blmde syle bir fonksiyon tanmlamtk: s
def fonk(): a = 5 return a

Dikkat ederseniz burada return diye bir sey kullandk. Bu kelime Trkede vermek, dndrmek, iade etmek gibi anlamlara gelir. Buna gre yukardaki fonksiyon a de ikenini gs dndryor. Peki bu ne demek? Aklayalm: Pythonda her fonksiyonun bir dn de eri vardr. Yani Pythondaki btn fonksiyonlar bir s g de er dndrr. Burada dndrmekten kastmz bir ilemin sonucu olarak ortaya kan g s de eri vermektir. Mesela, Bu fonksiyonun dn de eri bir karakter dizisidir. veya Bu g s g fonksiyon bir karakter dizisi dndrr. dedi imiz zaman kastetti imiz sey; bu fonksiyonun g g iletilmesi sonucu ortaya kan de erin bir karakter dizisi oldu udur. rne in yukardaki s g g g fonksiyon a adl de ikeni dndryor ve bu a de ikeni bir tamsay oldu u iin, fonksiyongs gs g umuzun dn de eri bir tamsaydr. Peki, fonksiyonlar bir de er dndryor da ne oluyor? s g g Yani bir fonksiyonun herhangi bir de er dndrmesinin kime ne faydas var? g Isterseniz bunu daha iyi anlayabilmek iin yukardaki rne i bir de syle yazalm: g
def fonk(): a = 5 print a

Burada herhangi bir de er dndrmyoruz. Yapt mz sey bir a de ikeni belirleyip, print g g gs deyimini kullanarak bunu ekrana bastrmaktan ibaret. Bu arada sunu da belirtelim: Her ne kadar biz bir fonksiyonda ak ak bir de er dndrmesek de o fonksiyon otomatik olarak bir g de er dndrecektir. Herhangi bir de er dndrmedi imiz fonksiyonlar otomatik olarak None g g g diye bir de er dndrr. Bunu su sekilde test edebiliriz: g
print fonk()

Fonksiyonu bu sekilde a rd mzda syle bir kt ald mz greceksiniz: g g g


5 None

ste burada grd mz None de eri, fonk() adl fonksiyonumuzun otomatik olarak I g g dndrd de erdir. Yukardaki fonksiyonu print olmadan da a rabilece imizi biliyorsunuz: g g g g
fonk()

Bu defa a de ikeninin de eri ekrana dklecek, ancak None de erini gremeyece iz. Simdi gs g g g su fonksiyona bakalm:
def fonk(): a = 5 return a fonk()

Burada ise ekranda herhangi bir kt gremeyiz. Bunun nedeni, bu fonksiyonda herhangi bir print ilemi yapmyor olmamzdr. Biz burada sadece a de ikenini dndrmekle yetiniyoruz. s gs Yani ekrana herhangi bir kt vermiyoruz. Bu fonksiyondan kt alabilmek iin fonksiyonu syle a rmamz gerekir: g
print fonk()

Peki, btn bu anlattklarn ne ie yarar? diye sordu unuzu duyar gibiyim... s g Bir defa sunu anlamamz lazm: print ve return ayn seyler de ildir. print deyimi bir mesajn g ekrana baslmasn sa lar. return deyimi ise herhangi bir de erin dndrlmesinden sorumg g ludur. Siz bir fonksiyondan bir de er dndrdkten sonra o de erle ne yapaca nz tamag g g men size kalm. E er tanmlad nz bir fonksiyonda bir de er dndrmek yerine o de eri s g g g g ekrana basarsanz (yani print deyimini kullanrsanz) fonksiyonun ilevini bir bakma kstlam s s olursunuz. nk tanmlad nz bu fonksiyonun tek grevi bir de eri ekrana basmak olacakg g tr. Ama e er o de eri ekrana basmak yerine dndrmeyi tercih ederseniz, fonksiyonu hem g g ekranda bir mesaj gstermek iin hem de baka iler iin kullanabilirsiniz. Bunu anlayabilmek s s iin syle bir rnek verelim:
#!/usr/bin/env python # -*- coding: utf-8 -*def ekrana_bas(): a = 5 print a print "a deikeninin deeri: %s" %ekrana_bas() g s g

Bu kodlar altrd mzda syle bir kt alrz: s g


5 a deikeninin deeri: None g s g

Gryorsunuz, iler hi de istedi imiz gibi gitmedi. Halbuki biz a de ikeninin de eri: 5 gibi s g gs g bir kt alaca mz zannediyorduk. g Daha nce de dedi imiz gibi, bir fonksiyondan herhangi bir de er dndrmedi imizde g g g otomatik olarak None de eri dndrld iin ktda bu de eri gryoruz. Ama e er yukarg g g g daki fonksiyonu su sekilde tanmlasaydk iimiz daha kolay olurdu: s

#!/usr/bin/env python # -*- coding: utf-8 -*def ekrana_bas(): a = 5 return a print "a deikeninin deeri: %s" %ekrana_bas() g s g

Grd nz gibi, bu defa istedi imiz kty aldk. Bir de su rne e bakn: g g g
#!/usr/bin/env python # -*- coding: utf-8 -*def sayi_isle(): sor = input("bir say girin: ") return sor sayi = sayi_isle() print "girdiiniz say: %s" %sayi g if sayi % 2 == 0: print "girdiiniz say ifttir" g else: print "girdiiniz say tektir" g print "girdiiniz saynn karesi: %s" %sayi ** 2 g print "girdiiniz saynn kp: %s" %sayi ** 3 g

Burada sayi_isle() adl fonksiyonda kullancya bir say sorup bu sayy dndryoruz. Daha sonra fonksiyonu a rrken, bu dndrdmz de erle istedi imiz ilemi yapabiliyoruz. g g g s Isterseniz bu fonksiyonu bir de return yerine print ile tanmlamay deneyin. O zaman ne demek istedi imi gayet net bir biimde anlayacaksnz. g

13.10 Fonksiyonlarda pass Deyimi


Hatrlarsanz hata yakalama konusunu ilerken pass adl bir deyimden sz etmitik. s s Isterseniz o deyimi tekrar hatrlayalm. Pass kelimesi Trkede gemek, amak gibi anlamlara gelir. Pythonda ise bu deyim hers hangi bir ilem yapmadan geece imiz durumlarda kullanlr. Peki, bu ne demek? s g Su rne e bir bakalm: g
#!/usr/bin/env python # -*- coding: utf-8 -*def deneme(): liste = [] while True: a = raw_input("Giriniz: ") if a == "0": pass else: liste.append(a)

print liste deneme()

Burada grd mz gibi, e er kullanc 0 de erini girerse, bu de er listeye eklenmeyecek, g g g g Python hibir sey yapmadan bu satr atlayacaktr. ste pass buna benzer durumlarda, hibir I sey yapmadan yola devam et! anlam katar kodlarmza. Dedi imiz gibi, pass deyiminin bu grevlerini daha nce renmitik. pass deyimini yukardaki g g s durumlar dnda bir de syle bir durumda kullanabilirsiniz: Diyelim ki bir program yazyors sunuz. Bu programda bir fonksiyon tanmlayacaksnz. Fonksiyonun isminin ne olaca na karar g verdiniz, ama fonksiyon ieri ini nasl yazaca nz dnmediniz. E er program iinde sadece g g s g fonksiyonun ismini yazp brakrsanz programnz alma srasnda hata verecektir. ste byle s I bir durumda pass deyimi imdadnza yetiir. Bu deyimi kullanarak syle bir sey yazabilirsiniz: s
def bir_fonksiyon(): pass

Fonksiyon tanmlarken fonksiyon gvdesini bo brakamazsnz. nk dedi imiz gibi, e er s g g gvdeyi bo brakrsanz programnz almaz. Byle bir durumda, yukarda gsterdi imiz gibi s s g fonksiyonu tanmlayp gvde ksmna da bir pass deyimi yerletirebilirsiniz. Daha sonra gvde s ksmna ne yazaca nza karar verdi inizde bu pass deyimini silebilirsiniz. g g

13.11 Fonksiyonlarn Belgelendirilmesi


Her zaman syledi imiz gibi, kod bir kez yazlr, bin kez okunur. Bu yzden yazd nz kodlarn g g anlalr olmas her seyden nemlidir. Program yazarken, yazd nz kodlarn ilevinin yansra s g s anlalr olmasna da dikkat etmeniz gerekir. Program yazarlar, yazdklar kodlarn daha kolay s anlalmasn sa lamak iin baz yardmc aralardan da faydalanr. Mesela nceki derslerims g izde grd mz yorum (comment) kavram bu yardmc aralardan biridir. g Python programclarnn, okunakll artrmak iin kullanabilece i bir baka yardmc ara da g g s belgelendirme dizileridir (docstring). Dilerseniz hemen bununla ilgili kk bir rnek verelim:
#!/usr/bin/env python # -*- coding: utf-8 -*def fonk(): """bo bir fonksiyondur. Hibir s ie yaramaz...""" s pass

Grd nz gibi, belgelendirme dizisini fonksiyon tanmnn hemen ardndan getiriyoruz. Belg gelendirme dizilerinde trnak kullanmak adettendir. Bir fonksiyona ait belgelendirme dizisine erimek iin su yntemi kullanyoruz: s Mesela sum() fonksiyonunun belgelendirme dizisine ulaalm: s
>>> print sum.__doc__ sum(sequence[, start]) -> value Returns the sum of a sequence of numbers (NOT strings) plus the value of parameter start (which defaults to 0). When the sequence is empty, returns start.

Kendi yazd mz fonksiyonlarn belgelendirme dizilerine de ayn sekilde ulaabiliriz. nce g s fonksiyonumuzu tanmlayalm:
>>> def fonk(): ... """bo bir fonksiyondur. Hibir s ... ie yaramaz...""" s ... pass

Simdi de fonksiyonumuzun belgelendirme dizisine ulaalm: s


>>> print fonk.__doc__ bo bir fonksiyondur. Hibir s ie yaramaz... s

Gelin isterseniz biraz daha anlaml bir rnek verelim:


#!/usr/bin/env python # -*- coding: utf-8 -*def not_ortalamasi_hesapla(ogrenci_sayisi=5): """Not ortalamas hesaplayan bir fonksiyon. Bu fonksiyonun ald tek argman g kullancya ka kez not bilgisi sorulacan g gsterir.""" deneme = 0 toplam = [] while deneme < ogrenci_sayisi: deneme += 1 toplam.append(int(raw_input("%s. rencinin notu: " g % deneme))) print "Toplam %s renci var." % deneme g print ("Bu rencilerin not ortalamas: %s" g %(sum(toplam)/deneme)) not_ortalamasi_hesapla()

Grd nz gibi, belgelendirme dizileri bize yazd mz bir fonksiyonun ne ie yarad n ang g s g latma imkan sa lyor. Belgelendirme dizileri zellikle yazd mz kodlar okuyan bakalar iin g g s kymetlidir. Belgelendirme dizileri sayesinde, yazd mz kodlar okuyanlar, yazd mz seyin g g ne ie yarad hakknda kir sahibi olacaktr. s g Yukardaki kodlarda yer alan belgelendirme dizisini ekrana basmak iin kodlarnza syle bir satr eklemelisiniz:
print not_ortalamasi_hesapla.__doc__

Bu arada, yazd nz belgelendirme dizilerinin de Pythonun girintileme kurallarna uygun olg mas gerekti ine dikkat edin. g Bylece fonksiyonlar konusunu tamamlam olduk. Artk yeni ve ok nemli bir konu olan s Modllere balayabiliriz. Ama tabii ki nce blm sorularmz... s

13.12 Blm Sorular


1. Esasnda siz, bu blmde inceledi imiz fonksiyon konusuna hi de yabanc saylmazsnz. g Bu blme gelinceye kadar pek ok fonksiyon renmitik. Mesela daha nceki derslerimizden g s hangi fonksiyonlar hatrlyorsunuz? 2. Pythondaki sum() fonksiyonunun yapt ii yapan bir fonksiyon yazn. Yazd nz fonksiyon g s g bir liste iindeki saylarn toplamn verebilmeli. 3. Kullancya isim soran bir program yazn. Bu program kullancnn ismini ekrana dkebilmeli. Ancak e er kullancnn girdi i isim 5 karakterden uzunsa, 5 karakterden uzun olan g g ksm ekrana baslmamal, onun yerine ... iareti gsterilmelidir. rne in kullancdan alnan s g isim Abdullah ise programnz Abdul... ktsn vermeli. 4. Bir nceki soruda yazd nz programda kullanc, iinde Trke karakterler bulunan bir isim g girdi inde programnzda nasl bir durum ortaya kyor? rne in programnz Il ismine g g s nasl bir tepki veriyor? Sizce bunun sebebi nedir? 5. Yukardaki fonksiyonlarla ilgili syle bir rnek vermitik: s
#!/usr/bin/env python # -*- coding: utf-8 -*def tek(): print "Girdiiniz say bir tek saydr!" g def cift(): print "Girdiiniz say bir ift saydr!" g sayi = raw_input("Ltfen bir say giriniz: ") if int(sayi) % 2 == 0: cift() else: tek()

Bu kodlara syle bir bakt nzda, aslnda bu kodlar su sekilde de yazabilece imizi farket g g misinizdir: s
#!/usr/bin/env python # -*- coding: utf-8 -*sayi = raw_input("Ltfen bir say giriniz: ") if int(sayi) % 2 == 0: print "Girdiiniz say bir ift saydr!" g else: print "Girdiiniz say bir tek saydr!" g

Bu kodlar byle de il de fonksiyon iinde yazmamzn sizce ne gibi avantajlar vardr? g 6. Argman ile parametre arasndaki fark aklayn. 7. Standart bir kurulum beti ini taklit eden bir program yazn. rne in programnz su aag g s malar gerekletirebilmeli: s
Kullancya, Kuruluma hogeldiniz! mesaj gstermeli, s

Kullancya bir lisans anlamas sunmal ve bu anlamann sartlarn kabul edip etmedi ini s s g sormal, E er kullanc lisans anlamasnn sartlarn kabul ederse kuruluma devam etmeli, aksi g s halde kurulumdan kmal, Kullancya, standart paket, minimum kurulum ve zel kurulum olmak zere farkl kurulum seene i sunmal, g Kullancnn seimine gre, programda kurulu gelecek zelliklerin bazlarn etkinletirmeli s veya devre d brakmal, s Programn sistem zerinde hangi dizine kurulaca n kullancya sorabilmeli, g Kurulumdan hemen nce, programn hangi zelliklerle kurulmak zere oldu unu kulg lancya son kez bildirmeli ve bu aamada kullancya kurulumdan vazgeme veya kus rulum zelliklerini de itirme imkan vermeli, gs E er kullanc kurulum zelliklerini de itirmek isterse nceki aamaya geri dnebilmeli, g gs s E er kullanc, seti i zelliklerle kurulumu gerekletirmek isterse program kullancnn g g s belirledi i sekilde sisteme kurulabilmeli, g Son olarak kullancya kurulumun baaryla gerekletirildi ini bildiren bir mesaj gsters s g meli.

Not: Bu admlar kendi hayal gcnze gre de itirebilir, bunlara yeni basamaklar ekleyegs bilirsiniz. 8. Fonksiyonlar konusunu anlatrken syle bir rnek vermitik: s
#!/usr/bin/env python # -*- coding: utf-8 -*def tek(): print "Girdiiniz say bir tek saydr!" g def cift(): print "Girdiiniz say bir ift saydr!" g sayi = raw_input("Ltfen bir say giriniz: ") if int(sayi) % 2 == 0: cift() else: tek()

Bu programn zayf ynlerini bulmaya aln. Sizce bu program hangi durumlarda ker? Bu s programn kmesini engellemek iin ne yapmak gerekir?

BLM

14

Modller

Bu blmde Pythondaki en nemli konulardan biri olan modllerden sz edece iz. Ancak g modlleri kullanabilmek iin tabii ki ncelikle modl denen seyin ne oldu unu anlamamz g gerekiyor. Syle dnn: Diyelim ki bir program yazyorsunuz. Yazd nz bu programn iinde karakter s g dizileri, saylar, de ikenler, listeler, demetler, szlkler, kmeler ve fonksiyonlar var. Progs gramnz da .py uzantl bir metin dosyas iinde yer alyor. ste btn bu eleri ve veri tipI g lerini ieren .py uzantl dosyaya modl ad verilir. Bu bilgiye gre, simdiye kadar yazd nz ve g bundan sonra yazaca nz btn Python programlar ayn zamanda birer modldr. g Peki, bu bilginin bize ne faydas var? Ya da syle soralm: Yazd mz bir Python programnn g modl olmas neden bu kadar nemli? Hatrlarsanz bir nceki blmde Pythondaki fonksiyonlardan bahsetmitik. Yine hatrlarsanz s o blmde carp() adl bir fonksiyon da tanmlamtk. Bu fonksiyonu kullanabilmek iin ne s yapmamz gerekti ini biliyorsunuz. carp() fonksiyonuna ihtiyacmz oldu unda bu fonksiyonu g g a rmamz yeterli oluyor. Simdi syle bir dnelim: Biz bu carp() fonksiyonuna ihtiyacmz g s oldu unda fonksiyonu a rmak yoluyla ayn program iinde kullanabiliyoruz. Peki ya ayn g g fonksiyona baka bir Python programnda da ihtiyacmz olursa ne yapaca z? O fonksiyonu s g kopyalayp br Python programna yaptracak myz? Tabii ki hayr! Kodlar alp oradan s oraya kopyalamak programclk tecrbeniz asndan hi de verimli bir yntem de ildir. steg lik do as gere i kopyala-yaptr tekni i hatalara olduka ak bir yoldur. Biz herhangi bir g g s g Python programnda bulunan herhangi bir fonksiyona (veya niteli e) ihtiya duydu umuzda o g g fonksiyonu (veya niteli i) programmza aktaraca z. Peki, bunu nasl yapaca z? g g g Dedi imiz gibi btn Python programlar ayn zamanda birer modldr. Bu zellik sayesinde g Python programlarnda bulunan fonksiyon ve nitelikler baka Python programlar iine aktarlas bilirler. Bylece bir Python programndaki ilevsellikten, baka bir Python programnda da s s yararlanabilirsiniz. ste bu blmde, btn bu ilemleri nasl yapaca mz renece iz. Dilerseniz laf daha fazla I s g g g dolandrmadan modller konusuna hzl bir giri yapalm. s

14.1 Modllerin e itleri s


Pythonda modller eit eittir. Temel olarak Pythonda eit modlden sz edilebilir: s s s 1. Kendi Yazd nz Modller g 173

2. Gelitiricilerin Yazd Modller s g 3. nc Sahslarn Yazd Modller g Kendi yazdgnz modller, adndan da anlalaca gibi, bir Python programcs olarak otus g rup sizin yazd nz modllerdir. g Geli tiricilerin yazdg modller, sizin modllerinizin aksine Python gelitiricileri tarafndan s s yazlp Python programlama diline entegre edilmi olan ve bu bakmdan dilin bir paras olan s modllerdir. nc sahslarn yazdg modller, genellikle internet zerindeki kaynaklardan edinebile ce iniz, Python programclar tarafndan hazrlanp herkesin kullanmna sunulmu olan modg s llerdir. Biz bu blmde, yukarda sayd mz modl trn de olabildi ince ayrntl bir sekilde g g incelemeye alaca z. Dilerseniz ncelikle kendi yazd mz modllerden balayalm... s g g s

14.2 Kendi Yazdgnz Modller


Yukarda da tanmlad mz gibi, kendi yazd nz modller, birer Python programcs olarak otug g rup sizin yazd nz Python programlardr. Mesela bir program yazdnz ve adn da deneme.py g koydunuz. Bu programn ieri i syle olsun: g
#!/usr/bin/env python # -*- coding: utf-8 -*def carp(liste): a = 1 for i in liste: a = a * i print a

ste deneme.py adl bu Python program bir modldr ve bu modl, carp() adl tek bir I fonksiyondan oluur. Elbette modller tek bir fonksiyondan ibaret olmak zorunda de ildir. s g Bir modl pek ok farkl fonksiyondan oluabilir. rne in: s g
#!/usr/bin/env python # -*- coding: utf-8 -*def carp(liste): a = 1 for i in liste: a = a * i return a def bol(bolen, bolunen, hassas=True): sonuc = bolen / float(bolunen) if hassas: return float(sonuc) if not hassas: return int(sonuc) def topla(*args): toplam = 0 for i in args:

toplam += i return toplam def cikar(bir, iki): return iki - bir

Burada drt farkl fonksiyona sahip bir modl tanmladk. Dilerseniz bu modl masastne aritmetik.py adyla kaydedelim. Bu noktada Modl nedir? sorusunu tekrar sormakta fayda var. Bu blmn en banda s yapt mz tanma gre, carp(), bol(), topla() ve cikar() fonksiyonlarn ieren yukardaki arg itmetik.py adl program bir modldr. Bu modln ad da aritmetiktir. Pythonda modller (genellikle) .py uzantsna sahiptir. Ancak bir modln ad sylenirken bu .py uzants es geilir ve sadece isim ksm dikkate alnr. Bu yzden elinizdeki aritmetik.py adl program aritmetik modl olarak adlandrlacaktr. Dedi imiz gibi, bu modl iinde toplam drt adet fonksiyon var. Biz bu fonksiyonlar ayn modl g iinde rahatlkla kullanabiliriz. Mesela cikar() fonksiyonuna ihtiyacmz oldu unda yapmamz g gereken tek sey bu fonksiyonu a rmaktr: g
print cikar(1545, 1432)

Veya topla() fonksiyonuna gereksinim duyarsak, yine bu fonksiyonu a rmak ok kolaydr: g


print topla(3, 15, 43, 23, 88)

Peki ya bu fonksiyonlara baka bir programda da ihtiya duyarsak ne olacak? Byle bir dus rumda yapaca mz sey bu fonksiyonu o program iinden a rmak olacak. Ancak bunu yapg g mann belli kurallar var. Peki, nedir bu kurallar? ste simdi bu kurallarn ne oldu unu inceleyeI g ce iz... g

14.3 Modlleri e Aktarmak I


Bu blmn banda syle bir cmle sarfetmitik: s s Herhangi bir Python programnda bulunan herhangi bir fonksiyona (veya niteli e) g ihtiya duydu umuzda o fonksiyonu (veya niteli i) programmza aktarabiliriz. g g Pythonda bir modl baka bir programa tama ilemine ie aktarma ad verilir. s s s Ingilizcede ise bu ileme import deniyor. s Simdi yukarda aritmetik.py adyla kaydetti imiz dosyann bulundu u dizin iinde bir ko g g mut satr ap Pythonun etkileimli kabu unu altrn. Mesela e er aritmetik.py dosyasn s g s g masastne kaydettiyseniz bir komut satr an, cd Desktop komutuyla masastne gelin ve orada python komutunu vererek etkileimli kabu u balatn. Simdi su komutu verin: s g s
>>> import aritmetik

E er hibir sey olmadan bir alt satra geildiyse modlnz baaryla ie aktardnz demektir. g s E er syle bir hata ktsyla karlayorsanz, muhtemelen Pythonu masastnn oldu u g s s g dizinde balatamamsnzdr: s s
>>> import aritmetik Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named aritmetik

import aritmetik komutunun baarl oldu unu varsayarak yolumuza devam edelim... s g Modl ie aktardktan sonra dir() adl zel bir fonksiyondan yararlanarak, ie aktard mz bu g modl iindeki kullanlabilir fonksiyon ve nitelikleri grebilece imizi biliyorsunuz: g
>>> dir(aritmetik)

Bu komut bize syle bir kt verir:


[__builtins__, __doc__, __file__, __name__, __package__, bol, carp, cikar, topla]

Burada bizi ilgilendiren ksm bol, carp, cikar ve topla adl eler. Bu ktdan anlyoruz ki, aritg metik adl modln iinde bol, carp, cikar ve topla adl fonksiyonlar var ve biz bu fonksiyonlar kullanma imknna sahibiz. O halde gelin mesela bu modl iindeki carp() adl fonksiyonu kullanabilmek iin srasyla syle bir seyler yazalm:
>>> liste = [45, 66, 76, 12] >>> aritmetik.carp(liste)

Bu komutlar syle bir kt verir:


2708640

Grd nz gibi, aritmetik modl iindeki carp() adl fonksiyonu kullanarak liste iindeki g saylar birbiriyle arptk. aritmetik modln nasl ie aktard mza ve bu modln iindeki bir g fonksiyon olan carp() fonksiyonunu nasl kulland mza ok dikkat edin. nce modlmzn g ad olan aritmetiki yazyoruz. Ardndan bir nokta iareti koyup, ihtiyacmz olan fonksiyonun s adn belirtiyoruz. Yani syle bir forml takip ediyoruz:
modl_ad.fonksiyon

Bylece modl iindeki fonksiyona erimi olduk. Yalnz burada asla unutmamamz gereken s s sey ncelikle kullanaca mz modl import modl_ad komutuyla ie aktarmak olacaktr. g Modl ie aktarmazsak tabii ki o modldeki fonksiyon veya niteliklere eriemeyiz. s Simdi aritmetik.py adl dosyanz ap dosyann en bana su kodu ekleyin: s
pi_sayisi = 22/7.0

Yani aritmetik.py dosyasnn son hali syle olsun:


#!/usr/bin/env python # -*- coding: utf-8 -*pi_sayisi = 22/7.0 def carp(liste): a = 1 for i in liste: a = a * i return a def bol(bolen, bolunen, hassas=True): sonuc = bolen / float(bolunen) if hassas: return float(sonuc) if not hassas:

return int(sonuc) def topla(*args): toplam = 0 for i in args: toplam += i return toplam def cikar(bir, iki): return iki - bir

Simdi tekrar komut satrna dnp su komutu verin:


dir(aritmetik)

Bu komut biraz ncekiyle ayn kty verecektir. Halbuki biz modlmze pi_sayisi adl bir de iken daha ekledik. O halde neden bu de iken listede grnmyor? gs gs Pythonda bir modl komut satrnda ie aktardktan sonra e er o modlde bir de iiklik yag gs parsanz, o de iikli in etkili olabilmesi iin modl yeniden yklemeniz gerekir. Bu ilemi gs g s reload() adl zel bir fonksiyon yardmyla yapyoruz:
>>> reload(aritmetik)

Bu komut syle bir kt verir:


<module aritmetik from aritmetik.py>

Bu kt modln baaryla yeniden yklendi ini gsteriyor. Simdi dir(aritmetik) komutunu s g tekrar verelim:
>>> dir(aritmetik)

Bu defa listede bol, carp, cikar ve topla eleriyle birlikte pi_sayisi esini de greceksiniz. g g Dolaysyla artk bu eye de eriebilirsiniz: g s
>>> aritmetik.pi_sayisi 3.1428571428571428

Eh, yarm yamalak da olsa pi saysn elde etmi olduk!.. s Buraya kadar modlleri hep etkileimli kabukta ie aktardk. Ama tabii ki nemli olan bir s modl baka bir python program iinden a rabilmektir. s g Isterseniz simdi bir modl baka s bir Python program iinden nasl a rabilece imizi renelim. g g g Simdi masastnde test.py adl bir dosya oluturun ve Kwrite, Kate, Gedit veya IDLE adl metin s dzenleyicilerden birini kullanarak bu dosyay an. Dosyaya su satrlar yazn:
#!/usr/bin/env python # -*- coding: utf-8 -*import aritmetik

iki satr zaten demirba. Burada nemli olan satr import aritmetik. Bu satrla, yine Ilk s masastnde kaytl bulunan aritmetik.py adl program, yani aritmetik modln ie aktardk. Bu modl ie aktard mza gre, artk bu modln iindeki btn fonksiyon ve nitelikleri g kullanabiliriz. O halde yazmaya devam edelim:

#!/usr/bin/env python # -*- coding: utf-8 -*import aritmetik print aritmetik.cikar(1455, 32)

Yazd mz son satrda, aritmetik modlnn iinde yer alan cikar() adl fonksiyonu kullanm g s olduk. Bylece daha nce bir kez tanmlad mz cikar() adl fonksiyona baka bir Python prog s gramnda da ihtiya duydu umuzda, bu fonksiyonu tekrar yazmak zorunda kalmadan, gerekli g fonksiyonu barndran modl programmz iine aktararak (import) iimizi hallettik. Ayn seks ilde aritmetik modl iindeki br fonksiyonlar ve nitelikleri de kullanabilirsiniz. Mesela modl iinde yer alan pi_sayisi niteli ini de kullanabiliriz: g
#!/usr/bin/env python # -*- coding: utf-8 -*import aritmetik print aritmetik.cikar(1455, 32) print "pi saysnn deeri: %s" %aritmetik.pi_sayisi g

Simdi bu test.py adl program altrn ve nasl bir sonu ald nz inceleyin. s g

14.4 Modlleri e Aktarma Yntemleri I


Pythonda programmz iinde kullanaca mz modlleri birka farkl yntemle ie aktarabiliriz. g Biz simdiye kadar sadece import modl_ad yntemini rendik. Hemen ksaca bu yntem g leri inceleyelim: import modl_ad Bu yntemle bir modl, btn ieri iyle birlikte ie aktarabiliriz. Baka bir deyile bir modln g s s iinde ne var ne yoksa programmz iine davet edebiliriz. Yukarda kulland mz da zaten bu g yntemdir. from modl_ad import * Bu yntemle bir modl iinde ad __ ile balayanlar hari btn fonksiyonlar programmz s iine aktarabiliriz. Yani bu yntem de tpk yukarda anlatlan yntemde oldu u gibi, btn g fonksiyonlar alacaktr. Yalnz __ ile balayan fonksiyonlar hari... s E er bir modl bu yntemi kullanarak ie aktarmsanz, ie aktard mz modln nitelik g s g ve fonksiyonlarna do rudan nitelik veya fonksiyon adn kullanarak eriebilirsiniz. rne in g s g import modl_ad yntemiyle ie aktard mz modllerin nitelik ve fonksiyonlarn syle kulg lanyorduk:
>>> modl_ad.fonksiyon

from modl_ad import * yntemiyle ie aktard mz modllerin nitelik ve fonksiyonlarn g ise syle kullanyoruz:
>>> fonksiyon

Mesela yukarda bahsetti imiz aritmetik modln rnek alalm: g

>>> from aritmetik import * >>> liste = [2, 3, 4] >>> print carp(liste) 24

Grd nz gibi, bu defa aritmetik.carp(liste) gibi bir komut vermedik. carp() fonksiyg onunu do rudan kullanabildik. Bu yntem olduka pratiktir. Programcya ayn ii daha az g s kodla yapma imkn sa lar. Ancak bu yntemin baz sakncalar vardr. Bunlara biraz sonra g de inece iz. g g from modl_ad import falanca, lanca Bu yntem ise bir modlden falanca ve lanca adl fonksiyonlar a rmamz sa layacaktr. g g Yani btn ieri i de il, bizim istedi imiz fonksiyonlar ie aktarmakla yetinecektir. rne in: g g g g
>>> from aritmetik import carp

Bu sekilde aritmetik modlnn yalnzca carp() fonksiyonunu ie aktarm olduk. Bu sekilde s carp() fonksiyonuna eriebiliriz: s
>>> liste = [2, 3, 4] >>> print carp(liste) 24

Ama pi_sayisi niteli ine eriemeyiz. nk biz burada sadece carp() fonksiyonunu ie akg s tardk. E er pi_sayisi niteli ine de eriebilmek istersek modlmz su sekilde ie aktarg g s mamz gerekir:
>>> from deneme import carp, pi_sayisi

Bu sekilde hem carp() fonksiyonunu, hem de pi_sayisi niteli ini ie aktarm olduk. g s import modl_ad as yeni_isim Diyelim ki herhangi bir sebepten, modln adn programnz iinde do rudan kullanmak isg temiyorsunuz. O zaman bu yntemi kullanarak modle farkl bir ad verebilirsiniz:
>>> import aritmetik as arit >>> liste = [2, 3, 4] >>> arit.carp(liste)

Mesela ie aktaraca nz modl ad ok uzunsa ve her defasnda bu uzun ismi yazmak size g zor geliyorsa bu yntemi kullanarak modl adn ksaltabilirsiniz. Ayrca programnzda zaten aritmetik adl baka bir nitelik veya fonksiyon varsa bu ikisinin birbirine karmasn engelles s mek iin de bu yntemi kullanmay tercih edebilirsiniz. Peki bu yntemlerden hangisini kullanmak daha iyidir? E er ne yapt nzdan tam olarak g g emin de ilseniz veya o modlle ilgili bir belgede farkl bir yntem kullanmanz nerilmiyg orsa, anlatlan birinci yntemi kullanmak her zaman daha gvenlidir (import modl_ad). nk bu sekilde bir fonksiyonun nereden geldi ini kartrma ihtimaliniz ortadan kalkar. g s Mesela aritmetik.carp(liste) gibi bir komuta bakt nzda carp() fonksiyonunun aritmetik g adl bir modl iinde oldu unu anlayabilirsiniz. Ama sadece carp(liste) gibi bir komutla g

karlat nzda bu fonksiyonun program iinde mi yer ald n, yoksa baka bir modlden s s g g s mi ie aktarld n anlayamazsnz. Ayrca mesela programnz iinde zaten carp() adl bir g fonksiyon varsa, aritmetik adl modlden carp() fonksiyonunu ald nzda isim akmas neg s deniyle hi istemedi iniz sonularla karlaabilirsiniz. Buna bir rnek verelim. Komut satrnda g s s syle bir kod yazn:
>>> pi_sayisi = 46

Simdi aritmetik adl modl su yntemle ie aktarn:


>>> from aritmetik import *

Bakn bakalm pi_sayisi de ikeninin de eri ne olmu? gs g s


>>> print pi_sayisi 3.1428571428571428

Grd nz gibi, aritmetik modlndeki pi_sayisi niteli i sizin kendi programnzdaki g g pi_sayisi de ikenini silip att. Herhalde byle bir seyin banza gelmesini istemezsiniz. O gs s yzden ieri ini bilmedi iniz modlleri ie aktarrken import modl_ad yntemini kullanmak g g sizi byk ba a rlarndan kurtarabilir. s g

14.5 Geli tiricilerin Yazdg Modller s


Buraya kadar kendi kendimize nasl Python modl yazaca mz ve yazd mz bu modlg g leri nasl kullanaca mz grdk. Ama modl eitlerinden bahsederken de syledi imiz gibi, g s g Python sadece kendi modllerimizi yazmamza izin vermez. Bir de hazr yazlm modller s vardr. Python programlama dili iinde ok sayda modl kullanma hazr bir sekilde bizi bekler. Python modllerinin listesine http://docs.python.org/modindex.html adresinden eriebilirsiniz. s Biz bu blmde, os adl bir modl zerinden, size gelitiricilerin yazd modlleri tantmaya s g alaca z. s g

14.5.1 os Modl
os adl modl Pythondaki en nemli modllerden biridir. Bu blmn en banda yapt mz s g modl tanmn dikkate alacak olursak, aslnda os modl, bilgisayarmzda bulunan os.py adl bir Python programdr. Peki biz bu os.py programn nereden bulabiliriz. GNU/Linux sistemlerinde bu modl o unlukla /usr/lib/python2.6/ dizini iinde bulunur. Windows sistemlerinde g ise bu modl bulmak iin C:/Python26/Lib adl dizinin iine bakabilirsiniz. os.py dosyasn ap iine bakt nzda, aslnda bu dosyann birtakm fonksiyon ve niteliklerden g oluan alelade bir Python program oldu unu greceksiniz. Bu dosyann sizin yazd nz Python s g g programlarndan hi bir fark yoktur. Kendi yazd nz modller iindeki fonksiyonlar, modl g ie aktarmak suretiyle nasl kullanyorsanz, os modln de aynen yle ie aktarp bunun iindeki fonksiyon ve nitelikleri kullanacaksnz. os modl bize, iletim sistemleriyle ilgili ilemler yapma olana sunar. Bu modle ilikin s s g s resmi ( Ingilizce) belgelere http://docs.python.org/library/os.html adresinden eriebilirsiniz. s Modln kendi belgelerinde belirtildi ine gre, bu modl kullanan programlarn farkl ileg s tim sistemleri zerinde alma sans daha fazladr. Bunun neden byle oldu unu biraz sonra s g daha iyi anlayacaksnz. Bu modl, tpk kendi yazd mz modlleri ie aktaryormuuz gibi aktaraca z: g s g

>>> import os

Grd nz gibi, kullanm olarak kendi yazd mz bir modl nasl ie aktaryorsak os g g modln de aynen yle ie aktaryoruz. Neticede bu modl siz de yazm olabilirdiniz. s Dolaysyla, ieri i dnda, bu modln sizin yazd nz herhangi bir Python programndan g s g (baka bir syleyile Python modlnden) hi bir fark yoktur. Tabii bu modln sizin s s yazd nz modlden nemli bir fark, komut satrn hangi dizin altnda am olursanz olun g s os modln ie aktarabilmenizdir. Yani bu modl kullanabilmek iin os.py dosyasnn bulundu u dizine gitmenize gerek yok. Bunun neden byle oldu unu biraz sonra aklayaca z. O g g g yzden bunu simdilik dert etmeyin. Neyse, biz konumuza dnelim... Burada en nemli konu, bu modl ie aktarmaktr. Bu modln iindeki herhangi bir fonksiyonu ya da niteli i kullanabilmek iin ncelikle modl ie aktarmalyz. E er bu sekilde modl g g import etmezsek, bu modlle ilgili kodlarmz altrmak istedi imizde Python bize bir hata s g mesaj gsterecektir. Bu modl programmz iine nasl davet edece imizi rendi imize gre, os modl iindeki g g g fonksiyonlardan ve niteliklerden sz edebiliriz. ncelikle, isterseniz bu modl iinde neler var neler yok syle bir listeleyelim. Python komut satrnda >>> iaretinden hemen sonra: s
>>> import os

komutuyla os modln ie aktaryoruz. Daha sonra su komutu veriyoruz:


>>> dir(os)

Isterseniz daha anlalr bir kt elde edebilmek iin bu komutu su sekilde de verebilirsiniz: s
>>> for icerik in dir(os): ... print icerik

Grd nz gibi, bu modl iinde bir y n fonksiyon ve nitelik var. Simdi biz bu fonksiyonlar g g ve niteliklerden nemli olanlarn incelemeye alalm. s name Niteligi dir(os) komutuyla os modlnn ieri ini inceledi inizde orada name adl bir nitelik oldu unu g g g greceksiniz. Bu nitelik, kulland nz iletim sisteminin ne oldu u hakknda bilgi verir. g s g Basit bir rnekle balayalm: s
>>> print os.name

Bu komutu hangi iletim sisteminde verdi inize ba l olarak ald nz kt da farkl olacaktr. s g g g Mesela ben bu komutu GNU/Linux iletim sistemi zerinde verdi im iin posix kts aldm. s g os modlnde iletim sistemi isimleri iin ntanml olarak su ifadeler bulunur: s GNU/Linux iin posix, Windows iin nt, dos, ce Macintosh iin mac OS/2 iin os2 Risc Os iin riscos

E er mesela siz bu komutu Windows XP zerinde verdiyseniz nt kts alm olmalsnz... g s rendi imiz bu bilgiyi kullanarak syle basit bir sey yazabiliriz: g g
#!/usr/bin/env python # -*- coding: utf-8 -*import os if os.name == "posix": a = raw_input("Linus Torvaldsa mesajnz yazn:") if os.name == "nt": a = raw_input("Bill Gatese mesajnz yazn:")

Bu basit rnekte ncelikle os adl modl btn ieri iyle birlikte programmza aktardk. Daha g sonra bu modl iindeki name niteli inden yararlanarak, kullanlan iletim sistemini sorguladk. g s Buna gre bu program altrld nda, e er kullanlan iletim sistemi GNU/Linux ise, kullancs g g s dan Linus Torvaldsa mesajn yazmas istenecektir. E er kullanlan iletim sistemi Windows g s ise, Bill Gatese mesaj yazlmas istenecektir. Ayn komutlar su sekilde de yazabiliriz:
#!/usr/bin/env python #-*- coding:utf-8 -*from os import name if name == "posix": a = raw_input("Linus Torvaldsa mesajnz yazn:") if name == "nt": a = raw_input("Bill Gatese mesajnz yazn:")

Dikkat ederseniz burada from os import name komutuyla, os modl iindeki name niteli ini g aldk yalnzca. Ayrca program iinde kulland mz os.name ifadesini de name sekline g dntrdk. nk from os import name komutuyla yalnzca name niteli ini ekti imiz, s g g aslnda os modln ekmedi imiz iin, os.name yapsn kullanrsak Python bize os isminin g tanmlanmad n syleyecektir. g Bu name niteli inin ne kadar faydal bir sey oldu unu tahmin edersiniz. E er yazd nz bir prog g g g gramda name niteli ini kullanarak iletim sistemi sorgulamas yaparsanz, yazd nz programn g s g birden fazla iletim sistemi zerinde alma imkn olacaktr. nk bu sayede programnzn, s s kullanlan iletim sistemine gre ilem yapmasn sa layabilirsiniz. s s g system() Fonksiyonu Bu fonksiyon, kulland mz iletim sistemine ait sistem komutlarn altrmamz sa lar. Peki g s s g sistem komutu ne demek? Sistem komutu, zerinde alt mz iletim sisteminin bir paras s g s olan ve bu iletim sistemine ilikin ilemleri yerine getirmemizi sa layan komutlardr. rne in s s s g g GNU/Linuxta ls bir sistem komutudur ve bu komutun grevi o anda iinde bulundu unuz g dizindeki dosya ve klasrleri listelemektir. Bu komutun Windowstaki karl ise dir komus g tudur. ste buna benzer sistem komutlarn Python yardmyla altrabilmek iin os modlnn bize I s sundu u system() adl fonksiyondan yararlanaca z. rne in: g g g
>>> os.system("ls")

veya:

>>> os.system("dir")

Grd nz gibi, system() komutunu kullanmak ok basit. Yapmamz gereken tek sey parang tez iinde, altrlmasn istedi imiz sistem komutunu belirtmek... s g Bir rnek daha verelim. Diyelim ki GNU/Linuxtaki Kwrite programn kullanarak bir dosya amak istiyoruz:
>>> os.system("kwrite dosyaad.txt")

Ancak bir dosyay atrrken, o dosyay aacak program do rudan belirtmek pek do ru bir yol g g de ildir. nk mesela Kwrite her GNU/Linux kullancsnn bilgisayarnda kurulu olmayabilir. g Kwrite yerine mesela Gedit olabilir... Bu yzden Pythonda herhangi bir dosya veya klasr atrmak iin en gvenilir yol xdg-open adl sistem komutundan yararlanmak olacaktr. Bunu syle kullanabiliriz:
>>> os.system("xdg-open dosyaad.txt")

Burada kulland mz xdg-open komutu btn GNU/Linux sistemlerinde alan bir sistem kog s mutudur. Bu komutun grevi herhangi bir dosya veya klasr sistemdeki varsaylan uygulamayla amaktr. Yani mesela bir sistemde metin dosyalarn aan ntanml program Kwrite ise dosya Kwrite ile alacaktr. E er metin dosyalarn aan ntanml program baka bir g s seyse (mesela Gedit), dosya o programla alacaktr. xdg-open komutu zellikle bir dizini atrmaya alrken ok ie yarar. nk GNU/Linux sistemlerinde dizin grntleyici uygulas s mann hangisi oldu unu kestirmek ok gtr. Sistemde Konqueror, Dolphin, Thunar ve benzg eri dizin grntleyicilerden hangisinin bulundu una emin olamazsnz. xdg-open komutu bu g noktada size yardmc olacaktr. rne in /usr/share dizinini grntlemek iin syle bir kod g yazabilirsiniz:
>>> os.system("xdg-open /usr/share")

Bylece, acaba kullancnn bilgisayarnda hangi dizin grntleyici uygulama kurulu, diye endie etmenize gerek kalmaz. xdg-open komutu, sistemde hangi grntleyici varsa s /usr/share dizinini onunla aacaktr. Yukarda Kwrite ile yapt mz ilemi bir de Windowsta Notepad programyla yapalm: g s
>>> os.system("notepad dosyaad.txt")

Tpk GNU/Linuxta oldu u gibi, Windowsta da bir ilemi yapacak uygulamay do rudan belirtg s g mek iyi bir kir de ildir. GNU/Linuxtaki xdg-open yerine os modlnn startle() adl fonksiyg onundan yararlanabilirsiniz. rne in: g
# -*- coding: cp1254 -*import os dosya = "falancadosya" os.startfile(dosya)

startle() fonksiyonu GNU/Linuxta bulunmaz. Bu fonksiyon yalnzca Windowsta geerlidir ve GNU/Linuxtaki xdg-open komutunun yapt seye benzer bir ilevi vardr. g s Yukardaki bilgileri kullanarak rne in su basit program yazabiliriz: g
#!/usr/bin/env python # -*- coding: utf-8 -*-

import os dosya = "falanca.txt" print "%s adl dosya alyor..." %dosya if os.name == "nt": os.startfile(dosya) elif os.name == "posix": os.system("xdg-open %s" %dosya)

Bu program olduka kk bir kod parasndan ibaret olmasna ra men, bize os modlyle g ilgili ok nemli bilgiler veriyor. Gelin isterseniz yukardaki kod parasnn ne iler evirdi ini s g adm adm inceleyelim: 1. iki satrn ne i yapt n sylememize gerek yok. Artk siz bu satrlarn ne oldu unu Ilk s g g adnz gibi biliyorsunuz. 2. nc satr da artk bizim iin olduka tandk bir koddan oluuyor. Bu komutla os mods ln btn ieri iyle birlikte programmzn iine aktaryoruz. g 3. Sonraki satrda falanca.txt adl bir dosya tanmladk. Bu de ikenin yerine, bilgisags yarnzda bulunan herhangi bir dosyann adn yazabilirsiniz. 4. print "%s adl dosya alyor..." %dosya satryla dosyasnn almak zere oldu una dair bilgi veriyoruz. g kullancya falanca.txt

5. E er kullancnn iletim sistemi Windows XP ise (if os.name == "nt":) os modlnn g s startle() adl fonksiyonunu kullanarak dosyay ayoruz (os.startle(dosya)) 6. E er kullancnn iletim sistemi GNU/Linux ise (if os.name == "posix":) os modg s lnn system() adl fonksiyonunu kullanarak dosyay ayoruz (os.system("xdg-open %s" %dosya)) Dedi imiz gibi, system() fonksiyonu her trl sistem komutunu altrmanza izin verir. Mesela g s Windowsta Python yardmyla Program Files dizinini grntleyelim:
>>> os.system("explorer C:\\Program Files")

Burada kulland mz bl iaretinin iki adet ters bl (\\) oldu una dikkat ediyoruz. g s g Ayn sekilde, Internet Explorer program ile bir web sitesini amak iin de system() fonksiy onundan yararlanabilirsiniz:
>>> os.system("start iexplore.exe http://www.istihza.com")

Burada da Windowsun start adl sistem komutunu kullanarak IE ile istihza.com sitesini grntledik. listdir() Fonksiyonu Python yardmyla bir dizin iindeki dosyalar grntlemek istersek, system() fonksiyonundan yardm alabilece imizi biliyoruz. Bunun iin GNU/Linux kullanclar sunu yazabilir: g
>>> os.system("ls")

Windows kullanclar ise sunu:

>>> os.system("dir")

Ancak bu ilemi Pythonda ok daha kolay ve esnek bir biimde yapmann bir yolu daha var. s os modl iinde yer alan listdir() adl fonksiyon bize bir dizin iindeki dosyalar veya klasrleri listeleme imkn veriyor. Mesela /usr/bin dizini iindeki btn dosyalar listelemek iin syle bir sey yazabiliriz:
>>> import os >>> a = os.listdir("/usr/bin") >>> print a

Yukardaki rnekte her zamanki gibi, modlmz import os komutuyla programmza aktardk ilk nce. Ardndan kullanm kolayl asndan listdir() fonksiyonunu a adl bir de ikene g gs atadk. rnekte listdir() fonksiyonunun nasl kullanld n gryorsunuz. rne imizde /usr/bin g g dizini altndaki dosya ve klasrleri listeliyoruz. Burada parantez iinde trnak iaretlerini ve s yatk izgileri nasl kulland mza dikkat edin. En son da print a komutuyla /usr/bin dizininin g ieri ini liste olarak ekrana yazdryoruz. ktnn tipinden anlad mz gibi, elimizde olan sey, g g eleri yan yana dizilmi bir liste. E er biz dizin ieri inin byle yan yana de il de alt alta g s g g g dizildi inde daha sk grnece ini dnyorsak, kodlarmz su biime sokabiliriz: g g s
import os a = os.listdir("/usr/bin") for dosyalar in a: print dosyalar

E er dosyalarmza numara da vermek istersek syle bir sey yazabiliriz: g


import os a = os.listdir("/usr/bin") c = 0 for dosyalar in a: if c < len(a): c = c+1 print c, dosyalar

Hatta daha nce rendi imiz enumerate() fonksiyonunu kullanarak bu ilemi ok daha ksa g g s bir yoldan halledebilirsiniz:
import os a = os.listdir("/usr/bin") for numara, dosya in enumerate(a, 1): print numara, dosya

E er amacnz, o anda iinde bulundu unuz dizindeki dosyalar listelemekse listdir() fonksiyg g onunu su sekilde kullanabilirsiniz:
>>> os.listdir(".")

Buradaki . argman, o anda iinde bulunulan dizini temsil eder. E er bir st dizinin ieri ini g g listelemek isterseniz tek nokta yerine iki nokta iaretini kullanabilirsiniz: s

>>> os.listdir("..")

Bu komut o anda iinde bulundu unuz dizine gre bir st dizinin ieri ini ekrana liste olarak g g verecektir. Yani mesela o anda /usr/local/bin dizini iindeyseniz yukardaki komut /usr/local dizininin ieri ini listeleyecektir. g Bu fonksiyonu ve daha nce rendi imiz system() fonksiyonunu kullanarak, bir dizin iing g deki btn dosyalar aan ve bu sebeple bilgisayarnzn bir sre yant vermemesine bile yol aabilecek korkun bir program yazabilirsiniz! (Denemeyin!)
#!/usr/bin/env python # -*- coding: utf-8 -*if os.name == "posix": for i in os.listdir("/usr/bin"): os.system("xdg-open %s%s" %("/usr/bin/", i)) elif os.name == "nt": for i in os.listdir("C:\\Program Files"): os.startfile("%s%s" %("C:\\Program Files\\", i))

Srada yine nemli bir fonksiyon var... getcwd() Fonksiyonu os modl iinde yer alan bu fonksiyon bize o anda hangi dizin iinde bulundu umuza dair g bilgi verir. Isterseniz bu fonksiyonun tam olarak ne ie yarad n bir rnek zerinde grelim: s g
>>> os.getcwd()

Grd nz gibi bu komut bize o anda hangi dizin iinde bulundu umuzu sylyor. Bu arada g g Ingilizce bilenler iin syleyelim, buradaki cwdnin alm current working directory. Yani kabaca mevcut alma dizini... Daha ak ifade etmek gerekirse: O anda iinde bulundu us g muz dizin. Syle bir rnek vererek konuyu biraz aalm:
#!/usr/bin/env python # -*- coding: utf-8 -*import os mevcut_dizin = os.getcwd() if mevcut_dizin == "/home/istihza/Desktop": for i in os.listdir(mevcut_dizin): print i else: print ("Bu program yalnzca /home/istihza/Desktop " "dizininin ieriini gsterebilir!") g

Yukardaki rnekte ncelikle os modln ie aktardk. Daha sonra mevcut_dizin adnda bir de iken tanmlayp getcwd() fonksiyonunun kendisini bu de ikenin de eri olarak atadk. gs gs g Ardndan, e er mevcut_dizin /home/istihza/Desktop ise bu dizin iindeki dosyalar bize listele g ve sonucu ekrana yazdr, yok e er mevcut_dizin /home/istihza/Desktop de il ise, bu program g g yalnzca /home/istihza/Desktop dizininin ieri ini gsterebilir, cmlesini gster dedik. Burada g dikkat ederseniz if deyiminden sonra for dngsn kullandk. Bu ilemi, ekran kts daha s dzgn olsun diye yaptk. E er byle bir kaygmz olmasayd, g

if mevcut_dizin == "/home/istihza/Desktop":

satrnn hemen altna:


print mevcut_dizin

yazp ii bitirirdik. s Biz burada getcwd() fonksiyonu iin basit rnekler verdik, ama eminim siz yaratcl nzla ok g daha farkl ve kullanl kodlar yazabilirsiniz. Mesela kendi yazd nz bir modl ie aktarmak s g istedi inizde neden hata verdi ini anlamak iin bu fonksiyondan yararlanabilirsiniz. E er bu g g g fonksiyonun verdi i kt, ie aktarmaya alt nz modln bulundu u dizinden farklysa o g s g g modl bouna ie aktarmaya alyorsunuz demektir! s s Simdi de os modl iindeki baka bir fonksiyona de inelim. s g chdir() Fonksiyonu Bu fonksiyon yardmyla iinde bulundu umuz dizini de itirebiliriz. Diyelim ki o anda g gs /usr/share/apps dizini iindeyiz. E er bir st dizine, yani /usr/share/ dizinine gemek istiyg orsak, su komutu verebiliriz:
>>> import os >>> os.chdir(os.pardir) >>> print os.getcwd()

Hatrlarsanz bir st dizini temsil etmek iin .. iaretinden yararlanyorduk. ste pardir de s I bu iaretin yapt ii yapar. Buradaki pardir niteli i, s g s g Ingilizce parent directory (bir st dizin) ifadesinin ksaltmas oluyor. pardir niteli i dnda, bir de curdir niteli i vardr. Bu sabiti g s g kullanarak mevcut dizin zerinde ilemler yapabiliriz. Tpk . iaretinde oldu u gibi...: s s g
>>> import os >>> os.listdir(os.curdir)

Grd nz gibi bu curdir niteli i getcwd() fonksiyonuna benziyor. Bunun dnda, istersek g g s gitmek istedi imiz dizini kendimiz elle de belirtebiliriz: g
>>> import os >>> os.chdir("/var/tmp")

Bylece do rudan /var/tmp dizinine ulam olduk. Yukardaki komutun ardndan su komutu g s s verirseniz bu durumu teyit edebilirsiniz:
>>> os.getwd() /var/tmp

mkdir() ve makedirs() Fonksiyonlar Bu iki fonksiyon yardmyla dizin veya dizinler oluturaca z. Mesela: s g

>>> import os >>> os.mkdir("/test")

Bu kod / dizini altnda test adl bo bir klasr oluturacaktr. E er bu kodu su sekilde yazarsak, s s g mevcut alma dizini iinde yeni bir dizin oluacaktr: s s
>>> import os >>> os.mkdir("test")

Yani, mesela mevcut alma dizini masast ise bu test adl dizin masastnde oluacaks s tr. Isterseniz bu kodlar su sekle getirerek yeni oluturulan dizinin nerede oldu unu da gre s g bilirsiniz:
>>> import os >>> print os.getcwd() >>> os.mkdir("test")

Bundan baka, e er isterseniz mevcut bir dizin yaps iinde baka bir dizin de oluturas g s s bilirsiniz. Yani mesela /home/kullanc_adnz/ dizini iinde deneme adl bo bir dizin olus s turabilirsiniz:
>>> import os >>> os.mkdir("/home/istihza/deneme")

Peki diyelim ki i ie birka tane yeni klasr oluturmak istiyoruz. s Yani mesela /home/kullanc_adnz dizini altnda yeni bir Programlar dizini, onun altnda da Python adl yeni baka bir dizin daha oluturmak istiyoruz. s s Hemen deneyelim:
>>> import os >>> os.mkdir("/home/istihza/Programlar/Python")

Ne oldu? Syle bir hata kts elde ettik, de il mi? g


>>> os.mkdir("/home/istihza/Programlar/Python") Traceback (most recent call last): File "<stdin>", line 1, in <module> OSError: [Errno 2] No such file or directory: /home/istihza/Programlar/Python

Demek ki bu sekilde oklu dizin oluturamyoruz. ste bu ama iin elimizde makedirs() fonksiy s I onu var. Hemen deneyelim yine:
>>> import os >>> os.makedirs("/home/istihza/Programlar/Python")

Grd nz gibi, /home/kullanc_admz/ dizini altnda yeni bir Programlar dizini ve onun g altnda da yeni bir Python dizini olutu. Buradan kan sonu, demek ki mkdir() fonksiyonu s bize yalnzca bir adet dizin oluturma izni veriyor. E er biz birden fazla, yani oklu yeni dizin s g oluturmak istiyorsak makedirs() fonksiyonunu kullanmamz gerekiyor. s

Kk bir rnek daha verip bu bahsi kapatalm:


>>> import os >>> print os.getcwd() >>> os.makedirs("test/test1/test2/test3")

Tahmin etti iniz gibi bu kod mevcut alma dizini altnda i ie test, test1, test2 ve g s test3 adl dizinler oluturdu. E er test ifadesinin soluna / iaretini eklerseniz, bu bo s g s s dizinler kk dizini altnda oluacaktr. s rmdir() ve removedirs() fonksiyonlar Bu fonksiyonlar bize mevcut dizinleri silme olana tanyor. Yalnz, burada hemen bir uyar g yapalm: Bu fonksiyonlar ok dikkatli kullanmamz gerekiyor. Ne yapt nzdan, neyi sildi inizg g den emin de ilseniz bu fonksiyonlar kullanmayn! nk Python bu komutu verdi inizde tek g g bir soru bile sormadan silecektir belirtti iniz dizini. Geri, bu komutlar yalnzca ii bo dizinleri g s silecektir, ama yine de uyaralm... Hemen bir rnek verelim. Diyelim ki mevcut alma dizinimiz olan masastnde TEST adl s bo bir dizin var ve biz bu dizini silmek istiyoruz: s
>>> import os >>> os.rmdir("TEST")

Bylece TEST dizini silindi. Bir de su rne e bakn: g


>>> import os >>> os.rmdir("/home/istihza/TEST")

Bu kod ise /home/kullanc_ad dizini altndaki bo TEST dizinini silecektir. s Tpk mkdir() ve makedirs() fonksiyonlarnda oldu u gibi, i ie birden fazla bo dizini silmek g s istedi imizde ise removedirs() fonksiyonundan yararlanyoruz: g
>>> import os >>> os.removedirs("test1/test2")

Yine hatrlatmakta fayda var: Neyi sildi inize mutlaka dikkat edin... g Pythonda dizinleri nasl ynetece imizi, nasl dizin oluturup silece imizi basite grdk. g s g Simdi de bu dizinleri ynetme iini biraz irdeleyelim. Simdiye kadar hep bir dizin, onun s altnda baka bir dizin, onun altnda da baka bir dizini nasl oluturaca mz altk. Peki, s s s g s ayn dizin altnda birden fazla dizin oluturmak istersek ne yapaca z? Bu ilemi ok kolay bir s g s sekilde syle yapabiliriz:
>>> import os >>> os.makedirs("test1/test2") >>> os.makedirs("test1/test3")

Bu kodlar mevcut alma dizini altnda test1 adl bir dizin ile bunun altnda test2 ve test3 s adl baka iki adet dizin daha oluturacaktr. Peki, bu test1, test2 ve test3 ifadelerinin s s sabit de il de de iken olmasn istersek ne yapaca z. Syle bir sey deneyelim: g gs g
>>> import os >>> test1 = "Belgelerim" >>> test2 = "Hesaplamalar" >>> test3 = "Resimler" >>> os.makedirs(test1/test2) >>> os.makedirs(test1/test3)

Bu kodlar altrd mzda Python bize syle bir sey syler: s g


>>> os.makedirs(test1/test3) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for /: str and str

Peki, neden byle oldu ve bu hata ne anlama geliyor? Kod yazarken baz durumlarda / iareti programclar skntya sokabilir. nk bu iaret s s Pythonda hem blme ileci hem de dizin ayrac olarak kullanlyor. Biraz nce yazd mz s g kodda Python bu iareti dizin ayrac olarak de il blme ileci olarak alglad ve sanki s g s test1 ifadesini test2 ifadesine blmek istiyormuuz gibi davrand bize. Ayrca kulland mz s g os.makedirs() fonksiyonunu da grd iin ne yapmaya alt mz anlayamad ve kafas g s g kart. Peki, bu meseleyi nasl halledece iz? s g Bu meseleyi halletmek iin kullanmamz gereken baka bir nitelik var Pythonda... s sep niteligi Bu nitelik, iletim sistemlerinin dizin ayralar hakknda bize bilgi veriyor. E er yazd mz bir s g g programn farkl iletim sistemleri zerinde almasn istiyorsak bu fonksiyon epey iimize s s s yarayacaktr. nk her iletim sisteminin dizin ayrac birbiriyle ayn de il. Bunu su rnekle s g gsterebiliriz: Hemen bir Python komut satr ap su komutlar verelim:
>>> import os >>> os.sep /

Bu komutu GNU/Linuxta verdi imiz iin komutun kts / seklinde oldu. E er ayn komutu g g Windowsta verirsek sonu syle olacaktr:
>>> import os >>> os.sep \\

Peki bu sep niteli i ne ie yarar? Yazd mz kodlarda do rudan dizin ayrac vermek yerine g s g g bu niteli i kullanrsak, programmz farkl iletim sistemlerinde altrrken, sistemin kendine g s s zg dizin ayracnn kullanlmasn sa lam oluruz. Yani mesela: g s

>>> import os >>> os.makedirs("test/test2")

komutu yerine;
>>> import os >>> os.makedirs("test" + os.sep + "test2")

komutunu kullanrsak programmz farkl iletim sistemlerinde altrrken herhangi bir aksaks s lk olmasn nlemi oluruz. nk burada sep niteli i, ilgili iletim sistemi hangisiyse ona ait s g s olan dizin ayracnn otomatik olarak yerletirilmesini sa layacaktr. s g Bu sep niteli i ayrca dizin adlarn de iken yapmak istedi imizde de bize yardmc olacaktr. g gs g Hatrlarsanz yukarda syle bir kod yazmtk: s
>>> import os >>> test1 = "Belgelerim" >>> test2 = "Hesaplamalar" >>> test3 = "Resimler" >>> os.makedirs(test1/test2) >>> os.makedirs(test1/test3)

Yine hatrlarsanz bu kodu altrd mzda Python hata vermiti. nk Python burada / s g s iaretini blme ileci olarak alglamt. ste bu hatay almamak iin sep niteli inden faydalans s s I g abiliriz. Syle ki:
>>> import os >>> test1 = "Belgelerim" >>> test2 = "Hesaplamalar" >>> test3 = "Resimler" >>> os.makedirs(test1) >>> os.makedirs(os.sep.join([test1, test2])) >>> os.makedirs(os.sep.join([test1, test3]))

Dikkat ederseniz, burada sep niteli ini join() adl bir fonksiyon ile birlikte kullandk. (join() g fonksiyonunu birka ders sonra daha ayrntl bir sekilde inceleyece iz). Yukardaki kod g sayesinde do rudan / iaretine bulamadan, bamz derde sokmadan iimizi halledebiliyg s s s s oruz. Ayrca burada parantez ve keli parantezlerin nasl kullanld na da dikkat etmemiz s g gerekiyor. Yukarda test1, test2 ve test3 de ikenlerinin adlarn do rudan kod iinde verdik. Tabii gs g e er istersek raw_input() fonksiyonuyla dizin adlarn kullancya setirebilece imiz gibi, syle g g bir sey de yapabiliriz:

import os def dizinler(test1, test2, test3): os.makedirs(test1) os.makedirs(os.sep.join([test1, test2])) os.makedirs(os.sep.join([test1, test3]))

Dikkat ederseniz, burada ncelikle os modln a ryoruz. Daha sonra dizinler() adl bir g fonksiyon oluturup parametre olarak test1, test2 ve test3 adl de ikenler belirliys gs oruz. Ardndan os.makedirs(test1) komutuyla test1 adl bir dizin oluturuyoruz. Tabii s bu test1 bir de iken oldu u iin adn daha sonradan biz belirleyece iz. Alttaki satrda ise gs g g os.makedirs() ve os.sep.join() komutlar yardmyla, bir nceki satrda oluturdu umuz s g test1 adl dizinin iinde test2 adl bir dizin daha oluturuyoruz. Burada os.sep.join() s fonksiyonu / iaretiyle u ramadan dizinleri birletirme imkn sa lyor bize. Hemen alttaki s g s s g satrda da benzer bir ilem yapp kodlarmz bitiriyoruz. Bylece bir fonksiyon tanmlam s s olduk. Simdi bu dosyay deneme.py adyla masastne kaydedelim. Bylelikle kendimize bir modl yapm olduk. Simdi Python komut satrn aalm ve su komutlar verelim: s
>>> import deneme >>> deneme.dizinler("Belgelerim", "Videolar", "Resimler")

Burada ncelikle import deneme satryla deneme adl modlmz a rdk. Daha sonra g deneme.dizinler satryla bu modl iindeki dizinler() adl fonksiyonu a rdk. Bylelikle g masastnde Belgelerim adl bir klasrn iinde Videolar ve Resimler adl iki klasr olus turmu olduk. Bu os.sep.join() ifadesi ile ilgili son bir sey daha syleyip bu konuya bir nokta s koyalm. Simdi Python komut satrn aarak su kodlar yazalm:
>>> import os >>> os.sep.join(["Dizin1", "Dizin2"])

ENTER tuuna bast mzda, bu komutlarn kts syle olur: s g


Dizin1/Dizin2

Ayn kodlar Windows zerinde verirsek de su kty alrz:


Dizin1\\Dizin2

Grd nz gibi farkl platformlar zerinde, os.sep kts birbirinden farkl oluyor. Bu rnek, g sep niteli inin, yazd mz programlarn tanabilirli i (portability), yani farkl iletim sistemg g s g s leri zerinde alabilme kabiliyeti asndan ne kadar nemli olabilece ini gsteriyor. s g

14.6 nc Sahslarn Yazdg Modller


Buraya kadar kendi yazd mz modlleri ve gelitiriciler tarafndan yazlp dilin iine enteg s gre edilen modlleri ayr ayr grdk. Bunlarn dnda bir de nc sahslar tarafndan s yazlan modller vardr. Bu modller, yazarlar tarafndan genellikle internet zerinden eriime s sunulmutur. Dolaysyla bu modlleri, yazarlarnn internet sitelerinden indirip bilgisayarnza s kurabilir, bu modlleri de herhangi bir Python modl gibi kullanabilirsiniz. Piyasada pek ok nc sahs modl bulunur. Bu modller sayesinde, ok zor baz ileri ok kolay bir sekilde s

halledebiliriz. Biz bu blmde pyPdf adl bir rnek modl zerinden, nc sahs modllerini tanmaya alaca z. s g Ancak bu noktada kk bir uyar yapalm. Aa da inceleyece imiz PyPdf modln ans g g latrken, henz renmedi imiz baz seylerle de karlaacaksnz. Anlayamad nz noktalar g g s s g olursa bunlara ok fazla taklmayn. Zira btn o ayrntlar sonraki derslerimizde inceleyece iz. Bizim burada amacmz, Pythonda nc sahs modllerinin neye benzedi i ve bung g larn nasl kullanlaca hakknda yalnzca bir kir vermekten ibarettir. g

14.6.1 pyPdf Modl


Bu blmde inceleyece imiz rnek modln ad pyPdf. Bu modl, Pythonda pdf dosyalar ile g ilgili temel ilemleri yapmamz sa lyor. Mathieu Fenniak tarafndan yazlm olan bu nc s g s sahs modlnn anasayfasna http://pybrary.net/pyPdf/ adresinden ulaabilirsiniz. s pyPdf modl bir nc sahs modl oldu undan, bunu kullanabilmek iin ncelikle bu g modl bilgisayarmza kurmamz gerekiyor. E er bu modl kurmazsak elbette kullanmamz g mmkn olmaz. Gelin bir deneme yapalm:
>>> import pyPdf Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named pyPdf

Grd nz gibi, bilgisayarmzda pyPdf modl olmad iin import pyPdf komutu hata g g veriyor. O yzden ncelikle bu modl bilgisayarmza kuraca z. g Bu modl GNU/Linux da tmlarnn paket depolarnda bulunur. E er Ubuntu kullanyorsanz, g g pyPdf modln su komut yardmyla sisteminize kurabilirsiniz:
sudo apt-get install python-pypdf

E er Ubuntu dnda bir GNU/Linux da tm kullanyorsanz, paket yneticiniz yardmyla g s g pypdf seklinde bir arama yapmanz neririm. Kullandklar da tmn paket depolarnda pyPdf modln bulamayan arkadalarm su g s adresten ilgili tar.gz dosyasn indirerek kaynaktan kurulum yapmay tercih edebilirler: http://pybrary.net/pyPdf/ Bu sktrlm dosyay bilgisayarmza indirdikten sonra dosyay ap, orada su komutu veriys s oruz:
sudo python setup.py install

E er herhangi bir aksilik olmadysa pyPdf modl bu komutun ardndan sistemimize kurulag caktr. Windows kullanclar ise su adresten .exe dosyasn indirip ift tklayarak modl bilgisa yarlarna kurabilir: http://pybrary.net/pyPdf/ Gelin isterseniz biraz nce ie aktarrken hata ald mz komutu tekrar vererek pyPdf modln g do ru bir sekilde kurup kuramad mz denetleyelim: g g
>>> import pyPdf

Bu komutu verdi inizde syle bir uyar mesaj alm olabilirsiniz: g s

>>> import pyPdf DeprecationWarning: the sets module is deprecated from sets import ImmutableSet

pyPdf modlnn uyumlu oldu u son Python srm 2.5tir. Bu modl Pythonun 2.6 g srmnde de alyor, ancak program ktsnda baz uyarlar alyoruz. Bu uyarlar, Pythonun s 3.x srmnde kullanmdan kaldrlacak zelliklere ilikindir. Ancak bu uyarlara ra men bu s g modl Python 2.6 srmnde de kullanlabilir. Yukardaki uyar mesaj modlmzn als masn engellemez. pyPdf modlnn Python3.x srmlerine uyumlu hale getirilmesi iin almalar da srdrlmektedir. s Bu arada pyPdf modln ie aktarrken byk-kk harfe dikkat etmelisiniz... pyPdf modln kurdu umuza gre artk bu modl incelemeye balayabiliriz. g s pdf Bilgilerine Ula mak s Bata da syledi imiz gibi pyPdf modln kullanarak pdf belgelerine ait baz bilgileri toplayas g bilirsiniz. Bu bilgiler neler olabilir? Mesela belgenin bal , belgenin yazar, belgenin hangi s g yazlm ile oluturuldu u, vb... Birka rnek verelim. s g ncelikle pyPdf modlnden baz fonksiyonlar ie aktaryoruz:
from pyPdf import PdfFileWriter, PdfFileReader

import komutunu nasl verdi imize dikkat edin. Daha nce modllerin ie aktarlma yntemg lerini incelerken bu biimi rendi imizi hatrlyor olmalsnz. pyPdf modlnn tamamna g g de il de, bunun iindeki sadece iki fonksiyona ihtiya duydu umuz iin yalnzca o iki fonksiyg g onu ie aktaryoruz. Simdi de okuyaca mz pdf dosyasn tanmlyoruz: g
belge = "diveintopython.pdf"

Ben rnek olarak kendime diveintopython.pdf adl bir pdf dosyas setim. Siz elbette baka bir s dosya ile alabilirsiniz. s Yukarda tanmlad mz belge adl pdf dosyasn okumak zere ayoruz: g
kaynak = PdfFileReader(open(belge, "rb"))

Burada belge adl pdf dosyasn rb kipinde at mza dikkat edin. pdf dosyalar ikili (binary) g dzende olduklar iin, bunlar okurken rb kipini kullanmamz gerekir. Daha nce de dedi imiz gibi, bu konuyu anlatrken henz yabancs oldu umuz kavramlarla g g karlayoruz. Ama bunlar ok fazla dert edinmeyin. Siz simdilik sadece nc sahs modls s lerin neye benzedi i zerine yo unlamaya aln. Neyse... Biz incelememize devam edelim. g g s s Simdi de pyPdf modl iinde bulunan getDocumentInfo() fonksiyonunun title adl niteli ini g kullanarak, belge adl pdf dosyamzn bal n alalm: s g
print (u"%s adl dosyann bal udur: %s" s g s %(belge, kaynak.getDocumentInfo().title))

Burada, Trke karakterlerin dzgn grntlenememesi gibi bir sorunla karlamamak iin, s s u harni kullanarak karakter dizimizi unicode haline getiriyoruz. unicode kavramndan birka ders sonra daha ayrntl olarak bahsedece iz. g Isterseniz yazd mz kodlar topluca grelim: g

#!/usr/bin/env python # -*- coding: utf-8 -*from pyPdf import PdfFileWriter, PdfFileReader belge = "diveintopython.pdf" kaynak = PdfFileReader(open(belge, "rb")) print (u"%s adl dosyann bal udur: %s" s g s %(belge, kaynak.getDocumentInfo().title))

Daha nce de dedi imiz gibi, e er sisteminizdeki Python srm 2.6 ise, yukardaki kodlar g g altrd nzda suna benzer uyarlar alabilirsiniz: s g
istihza@istihza:~/Desktop$ python deneme.py DeprecationWarning: the sets module is deprecated from sets import ImmutableSet

Bu uyarlar programmzn almasn engellemez. nk bunlar birer hata de il, sadece s g uyardr. Bu uyarya gre, pyPdf ktphanesi iinde kullanlm olan baz modller, Pythonun s mevcut srmnde alyor olsa bile, bir st srmde artk kullanlmayacak. E er siz bu s g uyarlar almak istemiyorsanz, programmz syle yazabilirsiniz:
#!/usr/bin/env python # -*- coding: utf-8 -*import warnings warnings.simplefilter("ignore", DeprecationWarning) from pyPdf import PdfFileWriter, PdfFileReader belge = "diveintopython.pdf" kaynak = PdfFileReader(open(belge, "rb")) print (u"%s adl dosyann bal udur: %s" s g s %(belge, kaynak.getDocumentInfo().title))

Burada warnings adl bir baka modl ie aktard mza dikkat edin. Bu modl gelitiricilerin s g s yazd modllerden biridir. Dolaysyla bilgisayarmza herhangi bir program kurmaya gerek g kalmadan do rudan programlarmz iinde kullanlabilir. Bu modln simplelter() adl fonksiyg onunu kullanarak DeprecationWarning olarak ifade edilen, tedavlden kalkacak zellikler hakkndaki uyarlar etkisizletiriyoruz. Bu kodlar altrd mz zaman syle bir kt elde s s g edece iz: g
diveintopython.pdf adl dosyann bal udur: Dive Into Python s g s

Her pdf belgesinin bal olmayabilir. Dolaysyla e er sizin alt nz belgenin bir bal s g g s g s g yoksa, balk yerine None de erini alacaksnz. s g pyPdf modl yardmyla bir belgenin bal dnda, yazarnn kim oldu unu da renebiliriz. s g s g g Bunun iin title yerine author niteli ini kullanyoruz: g
#!/usr/bin/env python #-*- coding: utf-8 -*-

import warnings warnings.simplefilter("ignore", DeprecationWarning) from pyPdf import PdfFileWriter, PdfFileReader belge = "falanca.pdf" kaynak = PdfFileReader(open(belge, "rb")) print (u"%s adl dosyann yazar udur: %s" s %(belge, kaynak.getDocumentInfo().author))

Tpk title niteli inde oldu u gibi, e er pdf belgesinde yazar bilgisi gemiyorsa, None de erini g g g g alrz. Bir pdf belgesinin hangi yazlm ile oluturuldu unu renmek iin ise creator niteli ini kuls g g g lanyoruz:
#!/usr/bin/env python # -*- coding: utf-8 -*import warnings warnings.simplefilter("ignore", DeprecationWarning) from pyPdf import PdfFileWriter, PdfFileReader belge = "falanca.pdf" kaynak = PdfFileReader(open(belge, "rb")) print (u"%s adl dosya u yazlmla oluturulmutur: %s" s s s %(belge, kaynak.getDocumentInfo().creator))

Bu kodlar altrd mzda suna benzer ktlar alabiliriz: s g Scribus 1.3.3.12, Writer, Adobe InDesign CS3 (5.0.4), vb... Bu ktlar, elimizdeki pdf belgesinin hangi yazlmn hangi srm kullanlarak oluturuls du unu gsterir. E er belge baka bir formattan pdf formatna dntrlmse, zgn forg g s s s mat oluturmak iin kullanlan yazlm grnecektir. Mesela bir belge nce OpenOfce ile s yazlp daha sonra OpenOfce kullanlarak pdf formatna dntrlmse ktda OpenOfce s s grnecektir. (OpenOfce ktda Writer olarak grnr.) creator niteli ine benzer bir sekilde, pdf belgesini oluturan yazlm grntleyen bir baka g s s metot da producer adl niteliktir. Bu niteli i su sekilde kullanyoruz (Sadece ilgili kod parasn g gsteriyoruz)
kaynak.getDocumentInfo().producer

rne in, creator niteli i ile Scribus 1.3.3.12 ktsn almsak, producer niteli i bize su g g s g kty verebilir: Scribus PDF Library 1.3.3.12 Veya creator niteli i bize Adobe InDesign CS3 (5.0.4) ktsn verdiyse, producer niteli i suna g g benzer bir kt verebilir: Adobe PDF Library 8.0

Ya da creator niteli i ile Writer kts elde etmisek, producer niteli iyle sunu elde edebilig s g riz: OpenOfce.org 2.3 Daha nce de belirtti imiz gibi, her pdf dosyas yukardaki zelliklerin hepsini barndrmayag bilir. Yani mesela her pdf belgesinin bir bal (title) olmayabilir... Byle bir pdf belgesine s g title niteli ini uygulad mzda None kts alrz. g g getDocumentInfo() fonksiyonunun en nemli metotlarn grd mze gre, pyPdf modlnn g baka bir zelli ini incelemeye balayabiliriz. s g s pyPdf ile pdf Belgelerinden Sayfa Almak pyPdf modln kullanarak bir pdf belgesinden istedi imiz sayfalar alabiliriz. rne in, e er g g g bir pdf belgesinin ilk sayfasn almak istiyorsak syle bir ilem yapmamz gerekir: s
#!/usr/bin/env python # -*- coding: utf-8 -*from pyPdf import PdfFileReader, PdfFileWriter kaynak = PdfFileReader(open("falanca.pdf", "rb")) nesne = PdfFileWriter() hedef = open("hedef.pdf", "wb") nesne.addPage(kaynak.getPage(0)) nesne.write(hedef) hedef.close()

Daha nce bahsetti imiz gibi, bu kodlar altrd nzda baz zararsz uyarlar alacaksnz. g s g Isterseniz yukarda gsterdi imiz sekilde bu uyarlar kapatabilirsiniz. Yukardaki program bir g dosyaya kaydedip altrd nzda, alma dizininiz iinde hedef.pdf adnda bir pdf belgesi s g s oluacak. Bu yeni pdf belgesini ap bakt nzda, ieri inin falanca.pdf adl belgenin ilk sayfas s g g oldu unu greceksiniz. Bu demek oluyor ki, yukardaki kodlar yardmyla bir pdf dosyasnn ilk g sayfasn alp baka bir pdf dosyas oluturabiliyoruz... s s Gelin isterseniz bu kodlar biraz aklayalm: Burada ncelikle pyPdf modlnden, pdf dosyasn okumamza yarayan PdfFileReader() fonksiyonunu ve pdf dosyasndan okudu umuz paralar yazmamz sa layan PdfFileWriter() g g fonksiyonunu ie aktaryoruz. Daha sonra, kaynak = PdfFileReader(open("falanca.pdf", "rb")) satryla kaynak dosyamz tanmlyoruz. Burada okuyaca mz kaynak pdf dosyamzn g ad falanca.pdf. Bu dosyay rb kipiyle ayoruz. (Bu kiplerin ne demek oldu unu bir song raki blmde renece iz) Ardndan, falanca.pdf dosyasndan okudu umuz verileri hedef g g g dosyaya yazmadan nce, PdfFileWriter() fonksiyonunu kullanarak, yazaca mz verileri bir g pyPdf.pdf.PdfFileWriter nesnesi haline getiriyoruz. E er yukardaki kodlar su sekilde yazacak g olursanz:
#!/usr/bin/env python # -*- coding: utf-8 -*import warnings warnings.simplefilter("ignore", DeprecationWarning) from pyPdf import PdfFileReader, PdfFileWriter

kaynak = PdfFileReader(open("falanca.pdf", "rb")) nesne = PdfFileWriter() print nesne

Syle bir kt alrsnz:


<pyPdf.pdf.PdfFileWriter object at 0xb7cdea0c>

Demek ki, aslnda kaynak de ikeni iinde depolad mz ey bir nesnedir. Biz bu nesgs g s neyi alp do ruca hedef dosyamza yazaca z. Tabii ki nce hedef dosyamz tanmlamamz g g gerekiyor. Bunu da yukardaki kodlardaki su satrla hallettik:
hedef = open("hedef.pdf", "wb")

Burada hedef.pdf adl dosyamz yine ikili dzende (binary) at mza dikkat edin. g Artk bir nceki admda oluturdu umuz pyPdf.pdf.PdfFileWriter nesnesini hedef dosyamza s g yazdrabiliriz. Bu ilemi yapan satrlarmz sunlar: s
nesne.addPage(kaynak.getPage(0)) nesne.write(hedef) hedef.close()

Burada ncelikle, kaynak.getPage(0) satr yardmyla kaynak dosyasnn sfrnc (yani ilk) sayfasn alyoruz. pyPdf modlnn addPage() fonksiyonunu kullanarak, ald mz bu sfrnc g sayfay bir nceki satrda oluturdu umuz nesnenin iine ekliyoruz. Sondan bir nceki satr s g yardmyla da, iini doldurdu umuz bu nesneyi hedef adl dosyaya yazdryoruz. Son satrmz g ise hedef dosyay kapatmamz sa lyor. g Pdf Belgelerinin Sayfa Saysn grenmek pyPdf modl yardmyla, elimizdeki pdf belgelerinin sayfa saysn da rahatlkla sorgulayabiliriz. Bu ilemi yapmak iin pyPdf modlnn getNumPages() fonksiyonundan yararlanaca z: s g
#!/usr/bin/env python # -*- coding: utf-8 -*import warnings warnings.simplefilter("ignore", DeprecationWarning) from pyPdf import PdfFileReader kaynak = PdfFileReader(open("python.pdf", "rb")) print kaynak.getNumPages()

Grd nz gibi, getNumPages() fonksiyonunu kullanarak bir pdf belgesinin sayfa saysn g renmek son derece kolay. g Bylelikle Pythonla temel pdf ilemlerini yapmamz sa layan pyPdf modln ksaca tanm s g s olduk. Bu modl ayn zamanda HARMAN programnda da kullanlmtr. Bu program ve s kaynak kodlarn incelemek iin http://istihza.com/harman/icindekiler_harman.html adresini ziyaret edebilirsiniz. Bu blmde pek ok yeni sey rendik. rendiklerimizin bir ksm henz bize ok fazla sey g g ifade etmemi olabilir. Ama birka ders sonra burada anlatlan her seyin zihninizde berraks lat n greceksiniz. s g

14.7 Modllerin Yolu


Kendi yazd mz modlleri anlatrken syle bir problemden sz etmitik: Kendimiz bir modl g s yazd mzda, bu modl dzgn bir sekilde ie aktarabilmemiz iin o modln mevcut alma g s dizini iinde yer alyor olmas gerekiyor. Yani e er ie aktarmaya alt mz modl, o anda g s g bulundu umuz dizin iinde de ilse ImportError adl bir hata alyoruz. Ancak byle bir probg g lem, mesela os modlnde bulunmuyor. Biz o anda hangi dizin altnda bulunursak bulunalm, her halkarda os modln rahatlkla ie aktarabiliyoruz. ste bu blmde biz bu durumun I nedenini anlatmaya alaca z. s g Python bir modl ie aktarmaya alrken belli dizinlerin iine bakar. E er aranan modl o s g dizinlerin iinde yoksa Python yukarda bahsetti imiz ImportError hatasn verecektir. Peki g Python bir modl ararken hangi dizinlerin iine bakar? Python bir modl ararken ilk olarak mevcut alma dizinine bakar. Yani ie aktarmaya s alt mz modl ilk olarak, komut satrnn ald dizin iinde bulmaya alr. Peki ya s g g s aranan modl mevcut alma dizini iinde yoksa? s Byle bir durumda Python tabii ki hemen pes etmez. nk bakmas gereken baka dizinler s de vardr... Pythonda sys adl bir modl bulunur. (Bu modle ilikin bilgiyi Modl Dizini balkl s s blmmzde bulabilirsiniz.) Bu modln path adl bir niteli i vardr. ste Python bir modg I l ararken bu niteli in gsterdi i dizinlerin iine bakar. Yani: g g
>>> import sys >>> sys.path [, /usr/local/lib/python2.6/dist-packages/setuptools-0.6c11-py2.6.egg, /usr/local/lib/python2.6/dist-packages/docutils-0.6-py2.6.egg, /usr/local/lib/python2.6/dist-packages/Jinja2-2.4.1-py2.6.egg, /usr/local/lib/python2.6/dist-packages/Pygments-1.3.1-py2.6.egg, /usr/local/lib/python2.6/dist-packages/Sphinx-1.0b2-py2.6.egg, /usr/lib/python2.6, /usr/lib/python2.6/plat-linux2, /usr/lib/python2.6/lib-tk, /usr/lib/python2.6/lib-old, /usr/lib/python2.6/lib-dynload, /usr/lib/python2.6/dist-packages, /usr/lib/python2.6/dist-packages/PIL, /usr/lib/python2.6/dist-packages/gst-0.10, /usr/lib/pymodules/python2.6, /usr/lib/python2.6/dist-packages/gtk-2.0, /usr/lib/pymodules/python2.6/gtk-2.0, /usr/local/lib/python2.6/dist-packages]

Elbette kulland nz iletim sistemine ba l olarak sizde bu komutun kts farkl olacaktr. g s g ste Python bir modl ie aktarmaya alt mz zaman bu ktda grnen dizinlerin iini I s g tek tek kontrol edecek ve arad mz modln bu dizinlerden herhangi birinin iinde olup g olmad na bakacaktr. E er arad mz modl bu dizinlerden herhangi birinin iindeyse ne g g g ala! Ama e er modl bu dizinlerin hi birinde yoksa ite o zaman biraz nce bahsetti imiz o g s g ImportError hatasn alrz. Grd nz gibi, sys.path kts aslnda basit bir listeden ibarettir. Dolaysyla listeler zg erinde yapabilece iniz her seyi bu sys.path kts zerinde de yapabilirsiniz. Mesela bu listg eye yeni dizinler ekleyebilirsiniz:
>>> sys.path.append("/herhangi/bir/dizin")

Ancak unutmayn ki, sys.path listesine sonradan ekledi iniz dizinler kalc de ildir. Yazd nz g g g program sona erdi inde sys.path listesi de eski haline dnecektir. g

14.8 Blm Sorular


1. Modller konusunu anlatrken syle bir rnek vermitik: s
#!/usr/bin/env python # -*- coding: utf-8 -*import aritmetik print aritmetik.cikar(1455, 32) print "pi saysnn deeri: %s" %aritmetik.pi_sayisi g

Bu programda, aritmetik modlnn ie aktarlmas srasnda bir hata ortaya kabilece ini g gz nne alarak bu program yeniden yazn. 2. Dedi imiz gibi, btn Python programlar temelde birer modldr. Ancak modl ve alelade g bir Python program arasnda baz farklar da vardr. Modller konusunu anlatrken sylediklerimizi de dikkate alarak, modlleri alelade Python programlarndan ayran zelliklerin neler olabilece ini tartn. Bir Python programnn gerek anlamda bir modl olabilmesi ve ciddi g s olarak bir ie yarayabilmesi iin modl yazarken sizce hangi noktalara dikkat etmek gerekir? s 3. Python modllerini ka farkl sekilde ie aktarabiliyoruz? Bu ie aktarma biimleri arasndaki farklar nelerdir? Bunlar iinde sizce en mantkls ve en kullanls hangisidir? s 4. Modller, yazd nz Python programlarn organize etmenizi sa lar. rne in binlerce satrg g g dan oluan tek bir .py dosyas yazmaktansa, programnz ayr ayr modllere blebilirsiniz. s Mesela programnzda arayzle ilgili olan kodlar bir modl, asl ii yapan kodlar ise baka bir s s modl olarak dzenleyebilirsiniz. Ya da mesela programnzla ilgili ayarlar kontrol eden kodlar farkl bir modle yerletirebilirsiniz. Daha sonra birbirinden ayrd nz bu modlleri ie aktars g mak suretiyle kullanabilirsiniz. Bylece kalabalk kod y nlarn ynetmek ve bunlarn bakmn g yapmak ok daha kolay bir i haline gelir. Bu bilgiler nda, su ana kadar Python programs sg lama dilini renirken altrma olsun diye yazd nz programlar modllere ayrmaya aln. g s g s Programlarnz modllere ayrmann getirileri zerinde dnn. s 5. os modln kullanarak, yalnzca GNU/Linux veya yalnzca Windows zerinde alan bir s program yazn. 6. pyPdf modlnden yararlanarak bir pdf belgesinin 2, 5 ve 7. sayfalarn ayr bir pdf belgesi olarak kaydetmeyi deneyin. 7. Bir dizin iinde yer alan btn dosyalar iinde, yalnzca uzants .txt olanlar listeleyin. 8. Pythonda sys.path gibi bir niteli in olmasnn, yazaca nz programlar asndan ne gibi g g faydalar olabilece ini tartn. g s 9. os modlndeki system() fonksiyonu son derece gl bir aratr. Bu gl aracn, yanl s kullanld nda nelere mal olabilece i zerinde dnn. g g s

BLM

15

Dosya slemleri I

Bu blmde Python programlama dilini kullanarak dosyalar nasl ynetece imizi, yani nasl g yeni bir dosya oluturaca mz, bir dosyaya nasl bir seyler yazabilece imizi ve buna benzer s g g ilemleri renece iz. Esasnda biz bundan nceki baz derslerimizde bu konuya stnkr de s g g olsa de inmitik. ste bu blm, daha nce grp de tam olarak anlayamad mz baz kod g s I g paralarn ok daha iyi anlayabilmemizi sa layacak bilgileri edinece imiz bir blm olacak. g g Hatrlarsanz os modln anlatrken Windows iin startle() adl bir fonksiyondan, GNU/Linux iin ise xdg-open adl bir sistem komutundan sz etmitik. Bu aralar yardmyla, bilgisas yarmzda bulunan dosyalar (ve programlar), sistemdeki varsaylan uygulama ile aabiliyorduk. Ancak bu blmde daha farkl bir seyden sz edece iz. Burada yapaca mz sey, g g sistemimizde bulunan herhangi bir dosyay varsaylan uygulamayla amak de il. Biz burada g Pythonu kullanarak sistemimizde yeni dosyalar oluturmann yansra, varolan dosyalar da, s herhangi bir arac program kullanmadan do rudan Python ile aaca z. Bu ikisi arasndaki fark g g biraz sonra daha net bir sekilde greceksiniz. Programclk yaamnz boyunca dosyalarla bol bol har neir olacaksnz. O yzden bu blm s s s dikkatle takip etmenizi neririm. Isterseniz laf hi uzatmadan konumuza geelim.

15.1 Dosya Olu turmak s


Bu blmde amacmz bilgisayarmzda yeni bir dosya oluturmak. Anlamas daha kolay olsun s diye, Pythonla ilk dosyamz mevcut alma dizini altnda oluturaca z. ncelikle mevcut s s g alma dizinimizin ne oldu unu grelim. Hemen Python komut satrn ayoruz ve su komuts g lar veriyoruz:
>>> import os >>> os.getcwd()

Biraz sonra oluturaca mz dosya bu komutun kts olarak grnen dizin iinde oluacaks g s tr. Sayn ki bu dizin Masast (Desktop) olsun. Mevcut alma dizinimizi de rendi imize s g g gre artk yeni dosyamz oluturabiliriz. Bu i iin open() adl bir fonksiyondan faydalanaca z. s s g Bu fonksiyonu Modller bal altnda pyPdf modln anlatrken de grd mz hatrlyors g g sunuz... Bu arada bir yanl anlalma olmamas iin hemen belirtelim. Bu fonksiyonu kullanmak iin s s os modlnn ie aktarlmasna gerek yok. Biraz nce os modln ie aktarmamzn nedeni

201

yalnzca getcwd() fonksiyonunu kullanmakt. Bu noktay da belirttikten sonra komutumuzu veriyoruz:


>>> open("deneme_metni.txt", "w")

Bylelikle masastnde deneme_metni.txt adl bir metin dosyas oluturmu olduk. Simdi s s verdi imiz bu komutu biraz inceleyelim. open() fonksiyonunun ne oldu u belli. Bir dosyay g g amaya yaryor. Tabii ortada henz bir dosya olmad iin burada amak yerine yeni bir dosya g oluturmaya yarad. Parantez iindeki deneme_metni.txtnin de ne oldu u ak. Oluturas g s ca mz dosyann adn trnak iine almay unutmuyoruz. Peki, bu w ne oluyor? g Pythonda dosyalar ynetirken, dosya izinlerini de belirtmemiz gerekir. Yani mesela bir dosyaya yazabilmek iin w kipini (mode) kullanyoruz. Bu harf Ingilizcede yazma anlamna gelen write kelimesinin ksaltmasdr. Bunun dnda bir de r kipi ve a kipi bulunur. r, s Ingilizcede okuma anlamna gelen read kelimesinin ksaltmas. r kipi, oluturulan veya s alan bir dosyaya yalnzca okuma izni verildi ini gsterir. Yani bu dosya zerinde herhangi g bir de iiklik yaplamaz. De iiklik yapabilmek iin biraz nce gsterdi imiz w kipini kulgs gs g lanmak gerekir. Bir de a kipi vardr, dedik. a da Ingilizcede eklemek anlamna gelen append kelimesinden geliyor. a kipi nceden oluturdu umuz bir dosyaya yeni veri ekles g mek iin kullanlr. Bu su anlama geliyor. rne in deneme_metni.txt adl dosyay w kipinde g oluturup iine bir seyler yazdktan sonra tekrar bu kiple ap iine bir seyler eklemek istersek s dosya iindeki eski verilerin kayboldu unu grrz. nk w kipi, ayn dosyadan bilgisag yarnzda zaten var olup olmad na bakmakszn, ayn adda yepyeni bir dosya oluturacak, g s bunu yaparken de eski dosyay silecektir. Dolaysyla dosya iindeki eski verileri koruyup bu dosyaya yeni veriler eklemek istiyorsak a kipini kullanmamz gerekecek. Bu kiplerin hepsini sras geldi inde grece iz. Simdi tekrar konumuza dnelim. g g Biraz nce;
>>> open("deneme_metni.txt", "w")

komutuyla deneme_metni.txt adnda, yazma yetkisi verilmi bir dosya oluturduk s s masastnde. Bu komutu bir de ikene atamak, kullanm kolayl asndan epey faydal gs g olacaktr. Biz de simdi bu ilemi yapalm: s
>>> ilkdosyam = open("deneme_metni.txt", "w")

Bu arada dikkatli olun, dedi imiz gibi, e er bilgisayarnzda nceden deneme_metni.txt adl bir g g dosya varsa, yukardaki komut size hi bir uyar vermeden eski dosyay silip zerine yazacaktr. Simdi baka bir rnek verelim: s
>>> ilkdosyam = open("eski_dosya.txt", "r")

Dikkat ederseniz burada w kipi yerine r kipini kullandk. Biraz nce de aklad mz gibi g bu kip dosyaya okuma yetkisi verildi ini gsteriyor. Yani e er biz bir dosyay bu kipte aarsak g g dosya iine herhangi bir veri girii yapma imknmz olmaz. Ayrca bu kip yardmyla yeni bir s dosya da oluturamayz. Bu kip bize varolan bir dosyay ama imkn verir. Yani mesela: s
>>> ikincidosyam = open("deneme.txt", "r")

komutunu verdi imizde e er bilgisayarda deneme.txt adl bir dosya yoksa bu adla yeni bir g g dosya oluturulmayacak, bunun yerine Python bize bir hata mesaj gsterecektir: s
>>> f = open("deneme.txt") Traceback (most recent call last): File "<stdin>", line 1, in <module> IOError: [Errno 2] No such file or directory: deneme.txt

Burada grd mz hata mesaj nemlidir. IOError adl bu hata mesaj yardmyla, herg hangi bir dosyann sistemde var olup olmad n denetleyebiliriz. Mesela su basit programa g bir bakalm:
#!/usr/bin/env python # -*- coding: cp1254 -*import sys def programdan_cik(): print "Programdan klyor!" print "Hoakaln..." s sys.exit() while True: dosya_adi = raw_input("Alacak dosyann adn girin: ") if dosya_adi: try: f = open(dosya_adi, "r") print "dosya bulundu" except IOError: print "Dosya bulunamad!" programdan_cik() else: print "dosya ad belirtmediniz!"

Burada kullancdan, alacak dosyann adn alyoruz. Kullancnn, sistemde var olmayan bir dosya ad belirtmesi ihtimaline kar da try... except bloklarndan yararlanyoruz. E er kuls g lancnn verdi i dosya ad geerliyse, programmz dosya bulundu kts vererek program song landryor. Ama e er belirtilen dosya bulunamazsa kullanc dosyann bulunamad konusunda g g uyarlyor ve kendisinden yeni bir dosya ad girmesi isteniyor. Elbette isterseniz, dosyann bulunamamas durumunda o adla yeni bir dosya oluturulmasn da sa layabilirsiniz: s g
#!/usr/bin/env python # -*- coding: cp1254 -*import sys def programdan_cik(): print "Programdan klyor!" print "Hoakaln..." s sys.exit() while True: dosya_adi = raw_input("Alacak dosyann adn girin: ") if dosya_adi: try: f = open(dosya_adi, "r") print "dosya bulundu" except IOError:

print "Dosya bulunamad!" open(dosya_adi, "w") print "%s adl yeni bir dosya oluturuldu." %dosya_adi s programdan_cik() else: print "dosya ad belirtmediniz!"

Yukardaki rneklerde, yoktan bir dosya oluturmay ve halihazrda sistemimizde bulunan bir s dosyay amay rendik. Pythonda bir dosyay r kipinde at mz zaman, o dosyay yalg g nzca okuma hakk elde ediyoruz. Bu kiple at mz bir dosya zerinde herhangi bir de iiklik g gs yapamayz. E er bir dosyay w kipinde aarsak, Python belirtti imiz addaki dosyay sfrdan g g oluturacak, e er ayn adla baka bir dosya varsa o dosyann zerine yazacaktr. Pythonda s g s dosya ilemleri yaparken, ieri i dolu bir dosyay ap bu dosyaya eklemeler yapmamz da s g gerekebilir. ste byle durumlar iin a adl zel bir kipten yararlanaca z. Bu kipi syle kulI g lanyoruz:
>>> dosya = open("deneme_metni.txt", "a")

Pythonda bir dosyay a kipinde at mz zaman, o dosyann iine yeni veriler ekleyebiliriz. g Ayrca a kipinin, r kipinin aksine bize yeni dosya oluturma imkn da verdi iniz aklmzn s g bir kesine not edelim. s E er yazd mz kod iinde yukardaki kipten hibirini kullanmazsak; Python, ntanml g g olarak r kipini kullanacaktr. Tabii r kipinin yukarda bahsetti imiz zelli inden dolay, bilg g gisayarmzda yeni bir dosya oluturmak istiyorsak, kip belirtmemiz, yani w veya a kips lerinden birini kullanmamz gerekir. Bu arada, yukardaki rneklerde biz dosyamz mevcut alma dizini iinde oluturduk. Tabii ki siz isterseniz tam yolu belirterek, dosyanz istedi iniz s s g yerde oluturabilirsiniz. Mesela: s
>>> dosya = open("/home/kullanc_ad/deneme.txt","w")

komutu /home/kullanc_ad/ dizini altnda, yazma yetkisi verilmi, deneme.txt adl bir dosya s oluturacaktr. Ayrca sadece .txt uzantl dosyalar de il, pek ok farkl dosya tipi de olus g s turabilirsiniz. Mesela .odt uzantl bir dosya oluturarak dosyann OpenOfce ile almasn s sa layabilirsiniz. Ya da .html uzantl bir dosya oluturarak internet taraycnzla alabilecek g s bir dosya oluturabilirsiniz. s Yalnz burada kk bir uyar yapalm. Yazd mz kodlarda yol ad belirtirken kulland mz g g yatk izgilerin ynne dikkat etmemiz gerekir. En emin yol, yukarda yapt mz gibi dosya g yolunu sa a yatk bl iaretiyle ayrmaktr: g s
>>> dosya = open("/home/kullanc_ad/deneme.txt","w")

Sa a yatk bl btn iletim sistemlerinde sorunsuz alr. Ama sola yatk bl problem g s s yaratabilir:
>>> f = open("C:\Documents and Settings\fozgul\Desktop\filanca.txt", "a") Traceback (most recent call last): File "<stdin>", line 1, in <module> IOError: [Errno 22] invalid mode (a) or filename: C:\\Documents and Settings\ x0cozgul\\Desktop\x0cilanca.txt

Burada sorun, Pythonun \ iaretini bir ka dizisi olarak alglamas. Halbuki biz burada s s bu iareti yol ayrac olarak kullanmak istedik... E er sa a yatk bl kullanmak isterseniz \ s g g iaretini iftlemeniz gerekir: s

>>> f = open("C:\\Documents and Settings\\fozgul\\Desktop\\filanca.txt", "a")

Veya r adl ka dizisinden yararlanabilirsiniz: s


>>> f = open(r"C:\Documents and Settings\fozgul\Desktop\filanca.txt", "a")

Bylece dosya yolunu oluturan karakter dizisi iindeki ka dizilerini ilevsiz hale getirerek s s s Pythonn hata vermesini engelleyebilirsiniz.

15.2 Dosyaya Yazmak


Su ana kadar rendi imiz sey, Pythonda dosya amak ve oluturmaktan ibarettir. Ancak g g s henz at mz bir dosyaya nasl mdahale edece imizi veya nasl veri girii yapabilece imizi g g s g bilmiyoruz. ste birazdan, bilgisayarmzda halihazrda var olan veya bizim sonradan oluturI s du umuz bir dosyaya nasl veri girii yapabilece imizi grece iz. Mesela deneme.txt adl bir g s g g dosya oluturarak iine Guido Van Rossum yazalm. Ama bu kez komut satrnda de il de s g metin zerinde yapalm bu ilemi. Hemen bo bir sayfa ap iine sunlar yazyoruz: s s
#/usr/bin/env python # -*- coding: utf-8 dosya = open("deneme.txt", "w") dosya.write("Guido Van Rossum") dosya.close()

iki satrn ne oldu unu zaten bildi imiz iin geiyoruz. Ilk g g Aynen biraz nce grd mz sekilde dosya adl bir de iken oluturup bu de ikenin de eri g gs s gs g olarak open("deneme.txt", "w") satrn belirledik. Bylelikle deneme.txt adnda, yazma yetkisi verilmi bir dosya oluturduk. Daha sonra write() adl bir fonksiyon yardmyla s s deneme.txt dosyasnn iine Guido Van Rossum yazdk. En son da close() adl baka s bir fonksiyondan yararlanarak dosyay kapattk. Aslnda GNU/Linux kullanclar bu son dosya.close() satrn yazmasa da olur. Ama zellikle Windows zerinde alrken, eks lemelerin dosyaya ilenebilmesi iin dosyann kapatlmas gerekiyor. Ayrca muhtemelen s Pythonun ileriki srmlerinde, btn platformlarda bu satr yazmak zorunlu olacak. O yzden bu satr da yazmak en iyisi. Simdi de syle bir sey yapalm: Biraz nce oluturdu umuz ve iine Guido Van Rossum yazd mz dosyamza ikinci bir satr s g g ekleyelim:
#!/usr/bin/env python #-*- coding: utf-8 dosya = open("deneme.txt", "a") dosya.write("\nMonty Python") dosya.close()

Grd nz gibi bu kez dosyamz a kipiyle atk. Zaten w kipiyle aarsak eski dosyay g silmi oluruz. O yzden Pythonla programlama yaparken bu tr seylere ok dikkat etmek s gerekir. Dosyamz a kipiyle atktan sonra write() fonksiyonu yardmyla Monty Python satrn eski dosyaya ekledik. Burada \n adl ka dizisinden yararland mza da dikkat edin. E er s g g bunu kullanmazsak eklemek istedi imiz satr bir nceki satrn hemen arkasna getirilecektir. g

Btn bunlardan sonra da close() fonksiyonu yardmyla dosyamz kapattk. Bir de su rne e g bakalm:
#!/usr/bin/env python #-*- coding: utf-8 dosya = open(u"iir.txt", "w") s dosya.write("Btn gneler batmadan,\nBi trk daha \ s syleyeyim bu yerde\n\t\t\t\t --Orhan Veli--") dosya.close()

Grd nz gibi, iir adl bir metin dosyas oluturup bu dosyaya yazma yetkisi verdik. Bug s s rada bir sey dikkatinizi ekmi olmal. Dosya adn belirlerken (iir.txt) karakter dizisinin bana s s s bir adet u har getirdik. Siz bu har pyPdf modln ilerken de grmtnz. Bu u harni s s kullanmamzn amac, dosya adnda geen Trke karakterin dzgn grntlenmesini sa lag mak. Buradaki u har, iir.txt adl karakter dizisini Unicode olarak tanmlamamz sa lyor. s g Bu konuyu birka blm sonra ok daha ayrntl bir sekilde inceleyece iz. Simdilik sadece g byle bir seyin varoldu unu bilmemiz yeterli olacaktr... g Bu dosyann iine yazlan verilere ve burada ka dizilerini nasl kulland mza ok dikkat edin. s g Ikinci msray bir alt satra almak iin \n ka dizisini kullandk. Daha sonra Orhan Veli s satrn sayfann sa na do ru kaydrmak iin \t ka dizisinden yararlandk. Bu rnekte \n g g s ve \t ka dizilerini yan yana kullandk. Bylece ayn cmleyi hem alt satra alm, hem de s s sa a do ru kaydrm olduk. Ayrca birka tane \t ka dizisini yan yana kullanarak cmleyi g g s s sayfann istedi imiz noktasna getirdik. g Yukardaki write() fonksiyonu dnda ok yaygn kullanlmayan bir de writelines() fonksiys onu vardr. Bu fonksiyon birden fazla satr bir kerede dosyaya ilemek iin kullanlr. Syle s ki:
#!/usr/bin/env python #-*- coding: utf-8 dosya = open(u"iir2.txt", "w") s dosya.writelines(["Bilmezler yalnz yaamayanlar\n", s "Nasl korku verir sessizlik insana\n", "nsan nasl konuur kendisiyle\n", I s "Nasl koar aynalara bir cana hasret\n", s "Bilmezler...\n"]) dosya.close()

Burada parantez iindeki keli parantezlere dikkat edin. Aslnda oluturdu umuz sey bir liste. s s g Dolaysyla bu fonksiyon bir listenin ieri ini do rudan bir dosyaya yazdrmak iin faydal olag g bilir. Ayn kodu write() fonksiyonuyla yazmaya kalkrsanz alaca nz sey bir hata mesaj s g olacaktr. E er bir liste iinde yer alan eleri write() fonksiyonunu kullanarak dosyaya yazdrg g mak isterseniz for dngsnden yararlanabilirsiniz:
>>> >>> >>> ... ... >>> liste = ["elma", "armut", "kalem"] f = open("falanca.txt", "w") for i in liste: f.write(i+"\n") f.close()

15.3 Dosyay Okumak


Simdiye kadar nasl yeni bir dosya oluturaca mz, bu dosyaya nasl veri girece imizi ve bu s g g dosyay nasl kapataca mz rendik. Simdi de oluturdu umuz bir dosyadan nasl veri okuyg g s g aca mz renece iz. Bu i iin de read(), readlines() ve readline() fonksiyonlarndan g g g s faydalanaca z. Su rne e bir bakalm: g g
>>> >>> ... ... ... >>> >>> >>> yeni = open(u"iir.txt","w") s yeni.write("Sular ekilmeye balad \ s kklerden...\nIsnmaz m acaba ellerimde kan? \ \nAh,ne olur! Btn gneler batmadan\nBi trk \ s daha syleyeyim bu yerde...") yeni.close() yeni=open(u"iir.txt") s yeni.read()

Sular \xc3\xa7ekilmeye ba\xc5\x9flad\xc4\xb1 k\xc3\xb6klerden... \nIs\xc4\xb1nmaz m\xc4\xb1 acaba ellerimde kan? \nAh,ne olur! B\xc3\xbct\xc3\xbcn g\xc3\xbcne\xc5\x9fler batmadan \nBi t\xc3\xbcrk\xc3\xbc daha s\xc3\xb6yleyeyim bu yerde...

yeni.read() satrna kadar olan ksm zaten biliyoruz. Burada kulland mz read() fonksiyonu g yeni adl de ikenin ieri ini okumamz sa lyor. yeni adl de ikenin de eri siir.txt adl bir gs g g gs g dosya oldu u iin, bu fonksiyon siir.txt adl dosyann ieri ini bize gsterecektir. Grd nz g g g gibi bu komutun ktsnda Trke karakterler bozuk grnyor. Ayrca kulland mz \n g ifadesi de ktda yer alyor. Esasnda bu komut bize Pythonun yazd mz kodlar nasl g grd n gsteriyor. E er biz daha dzgn bir kt elde etmek istersek en son satrdaki g g komutu su sekilde vermemiz gerekir:
>>> print yeni.read()

Ayrca read() dnda bir de readlines() adl bir fonksiyon bulunur. E er yukardaki komutu: s g
>>> yeni.readlines()

seklinde verecek olursak, ktnn bir liste oldu unu grrz. g Bir de, e er bu readlines() fonksiyonunun sonundaki s harni atp; g
>>> yeni.readline()

seklinde bir kod yazarsak, dosya ieri inin yalnzca ilk satr okunacaktr. Pythonun read g line() fonksiyonunu de erlendirirken kulland lt sudur: Dosyann bandan itibaren ilk g g s \n ifadesini grd n yere kadar oku. Bunlarn dnda, e er istersek bir for dngs kug s g rarak da dosyamz okuyabiliriz:
>>> yeni = open(u"iir.txt") s >>> for satir in yeni: ... print satir

Dikkat ettiyseniz:
>>> print yeni.readlines()

veya alternatif komutlarla dosya ieri ini okurken syle bir sey oluyor. Mesela iinde; g

Birinci satr kinci satr I nc satr

yazan bir dosyamz olsun:


>>> dosya.readline()

komutuyla bu dosyann ilk satrn okuyalm. Daha sonra tekrar bu komutu verdi imizde birinci g satrn de il, ikinci satrn okundu unu grrz. nk Python ilk okumadan sonra imleci (Evet, g g biz grmesek de aslnda Pythonun dosya iinde gezdirdi i bir imle var.) dosyada ikinci satrn g bana kaydryor. E er bir daha verirsek bu komutu, nc satr okunacaktr. Son bir kez daha s g bu komutu verirsek, artk dosyann sonuna ulald iin, ekrana hi bir sey yazlmayacaktr. s g Byle bir durumda dosyay baa sarmak iin su fonksiyonu kullanyoruz. (Dosyamzn adnn s dosya oldu unu varsayyoruz): g
>>> dosya.seek(0)

Bylece imleci tekrar dosyann en bana alm olduk. Tabii siz isterseniz, bu imleci farkl s s noktalara da tayabilirsiniz. Mesela: s
>>> dosya.seek(10)

komutu imleci 10. karakterin bana getirecektir (Saymaya her zamanki gibi 0dan balyoruz.) s s Bu seek() fonksiyonu aslnda iki adet parametre alabiliyor. Syle ki:
>>> dosya.seek(5, 0)

komutu imleci dosyann bandan itibaren 5. karakterin bulundu u noktaya getirir. Burada 5 s g says imlecin kaydrlaca noktay, 0 says ise bu ilemin dosyann bandan sonuna do ru g s s g olaca n, yani saymaya dosyann bandan balanaca n gsteriyor: g s s g
>>> dosya.seek(5, 1)

komutu imlecin o anda bulundu u konumdan itibaren 5. karakterin oldu u yere ilerlemesini g g sa lar. Burada 5 says yine imlecin kaydrlaca noktay, 1 says ise imlecin o anda g g bulundu u konumun lt alnaca n gsteriyor. g g Son olarak:
>>> dosya.seek(-5,2)

komutu ise saymaya tersten balanaca n, yani dosyann bandan sonuna do ru de il de s g s g g sonundan bana do ru ilerlenerek, imlecin sondan 5. karakterin oldu u yere getirilece ini s g g g gsterir. Bu ifadeler biraz kark gelmi olabilir. Bu konuyu anlamann en iyi yolu bol bol uygulama yaps s mak ve deneyerek grmektir. Isterseniz, yukardaki okuma fonksiyonlarna da belirli parametreler vererek dosya iinde okunacak satrlar veya karakterleri belirleyebilirsiniz. Mesela:
>>> yeni.readlines(3)

komutu dosya iinde, imlecin o anda bulundu u noktadan itibaren 3. karakterden sonrasn g okuyacaktr. Peki, o anda imlecin hangi noktada oldu unu nereden bilece iz? Pythonda bu g g ilem iin de bir fonksiyon bulunur: s
>>> dosya.tell()

komutu yardmyla imlecin o anda hangi noktada bulundu unu grebilirsiniz. Hatta dosyay bir g kez:
>>> dosya.read()

komutuyla tamamen okuttuktan sonra:


>>> dosya.tell()

komutunu verirseniz imle mevcut dosyann en sonuna gelece i iin, ekranda grd nz say g g ayn zamanda mevcut dosyadaki karakter saysna eit olacaktr. s Pythonda dosya ilemleri yaparken bilmemiz gereken en nemli noktalardan biri de sudur: s Python ancak karakter dizilerini (strings) dosyaya yazdrabilir. Saylar yazdramaz. E er biz g saylar da yazdrmak istiyorsak nce bu saylar karakter dizisine evirmemiz gerekir. Bir rnek verelim:
>>> x = 50 >>> dosya = open("deneme.txt", "w") >>> dosya.write(x)

Bu kodlar bize su kty verir:


Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: argument 1 must be string or read-only character buffer, not int

Grd nz gibi Python bize bir hata mesaj gsterdi. nk x de ikeninin de eri bir say. g gs g Halbuki karakter dizisi olmas gerekiyor. Bu meseleyi zmek iin komutumuzu su sekilde veriyoruz. En batan alrsak: s
>>> x = 50 >>> dosya = open("deneme.txt", "w") >>> dosya.write(str(x))

Burada:
>>> str(x)

komutuyla, bir say olan x de ikenini karakter dizisine evirdik. Tabii ki bu ilemin tersi de gs s mmkn. E er x bir karakter dizisi olsayd, su komutla onu sayya evirebilirdik: g
>>> int(x)

15.4 Dosya Silmek


Peki, oluturdu umuz bu dosyalar nasl silece iz? Pythonda herhangi bir sekilde oluturdu us g g s g muz bir dosyay silmenin en kestirme yolu sudur:
>>> os.remove("dosya/yolu")

Mesela, masastndeki deneme.txt dosyasn syle siliyoruz:


>>> import os >>> os.remove("/home/kullanc_ad/Desktop/deneme.txt")

E er masast zaten sizin mevcut alma dizininiz ise bu ilem ok daha basittir: g s s
>>> import os >>> os.remove("deneme.txt")

15.5 Dosyaya Rastgele Satr Eklemek


Simdiye kadar hep dosya sonuna satr ekledik. Peki ya bir dosyann ortasna bir yere satr eklemek istersek ne yapaca z? Simdi: Diyelim ki elimizde deneme.txt adl bir dosya var ve g iinde sunlar yazl:
Birinci Satr kinci Satr I nc Satr Drdnc Satr Beinci Satr s

Biz burada kinci Satr ile nc Satr arasna Merhaba Python! yazmak istiyoruz. nce bu I deneme.txt adl dosyay aalm:
>>> kaynak = open("deneme.txt")

Bu dosyay okuma kipinde atk, nk bu dosyaya herhangi bir yazma ilemi yapmayaca z. s g Yapaca mz sey, bu dosyadan veri okuyup baka bir hedef dosyaya yazmak olacak. O yzden g s hemen bu hedef dosyamz oluturalm: s
>>> hedef = open("test.txt", "w")

Bu dosyay ise yazma modunda atk. nk kaynak dosyadan okudu umuz verileri buraya g yazdraca z. Simdi de, yapaca mz okuma ilemini tanmlayalm: g g s
>>> oku = kaynak.readlines()

Bylece kaynak dosya zerinde yapaca mz satr okuma ilemini de tanmlam olduk... g s s Simdi kaynak dosyadaki birinci satr ve ikinci satr verilerini alp hedef dosyaya yazdryoruz. Bu i iin bir for dngs oluturaca z: s s g
>>> for satirlar in oku[:2]: ... hedef.write(satirlar)

Burada biraz nce oluturdu umuz okuma ilemi de ikeni yardmyla 0 ve 1 nolu satrs g s gs lar alp hedef adl dosyaya yazdrdk. Simdi eklemek istedi imiz satr olan Merhaba Python! g satrn ekleyece iz: g
>>> hedef.write("Merhaba Python!\n")

Sra geldi kaynak dosyada kalan satrlar hedef dosyasna eklemeye:


>>> for satirlar in oku[2:]: ... hedef.write(satirlar)

Artk iimiz bitti ine gre hedef ve kaynak dosyalar kapatalm: s g


>>> kaynak.close() >>> hedef.close()

Bu noktadan sonra e er istersek kaynak dosyay silip adn da hedef dosyann adyla de itireg gs biliriz:
>>> os.remove("deneme.txt") >>> os.rename("test.txt","deneme.txt")

Tabii bu son ilemleri yapmadan nce os modln ie aktarmay unutmuyoruz... s Yukardaki ilemleri yapmann daha pratik bir yolu da var. Diyelim ki elimizde, ieri i su olan s g falanca.xml adl bir dosya var:
<EnclosingTag> <Fierce <Fierce <Fierce <Fierce <Fierce name="Item1" name="Item2" name="Item3" name="Item4" name="Item5" separator="," separator="," separator="," separator="," separator="," src="myfile1.csv" src="myfile2.csv" src="myfile3.csv" src="myfile4.csv" src="myfile5.csv" /> /> /> /> />

<NotFierce Name="Item22"> </NotFierce> </EnclosingTag>

Not: Bu dosya ieri i http://www.python-forum.org/pythonforum/viewtopic.php?f=1&t=19641 g adresinden alnmtr. s Biz bu dosyada, Item2 ile Item3 arasna yeni bir satr eklemek istiyoruz. Dilerseniz bu ilemi nasl yapaca mz gsteren kodlar verelim nce: s g
#!/usr/bin/env python # -*- coding: utf-8 -*oku = open("falanca.xml") eklenecek_satir = <Fierce name="Item2.5" separator="," src="myfile25.csv" /> icerik = oku.readlines() icerik.insert(4, eklenecek_satir+"\n") oku.close() yaz = open("falanca.xml", "w") yaz.writelines(icerik) yaz.close()

Simdi de bu kodlar tek tek inceleyelim: 1. oku = open("falanca.xml") satr yardmyla falanca.xml adl dosyay okumak zere ayoruz. 2. Daha sonra, dosyaya eklemek istedi imiz satr bir de ikene atyoruz. g gs 3. Hemen ardndan readlines() adl metodu kullanarak falanca.xml adl dosyann tm ieri ini bir liste iinde topluyoruz. Bylece dosya ieri ini ynetmek ok daha kolay olacak. g g Bildi iniz gibi, readlines() metodu bize kt olarak bir liste veriyor... g 4. Bir sonraki satrda, dosyaya eklemek istedi imiz metni, readlines() metodu ile oluturg s du umuz listenin 4. srasna yerletiriyoruz. Burada listelerin insert() metodunu kulg s

land mza dikkat edin. g 5. Artk dosyay okuma ilemi sona erdi i iin dosyamz close() metodunu kullanarak kaps g atyoruz. 6. Simdi yapmamz gereken sey, gerekli bilgileri dosyaya yazmak olacak. O yzden bu defa falanca.xml adl dosyay yazma kipinde ayoruz. (yaz = open("falanca.xml", "w")) 7. Sonra, yukarda oluturdu umuz ieri i, yazmak zere at mz dosyaya gnderiyoruz. s g g g Bunun iin writelines() metodunu kullandk. Bildi iniz gibi bu metot listeleri dosyaya g yazdrmak iin kullanlyor. 8. Son olarak, dosyayla iimizi bitirdi imize gre dosyamz kapatmay unutmuyoruz. s g

15.6 Dosyadan Rastgele Satr Silmek


Bazen, zerinde alt mz bir dosyann herhangi bir satrn silmemiz de gerekebilir. Bunun s g iin yine bir nceki blmde anlatt mz yntemi kullanabiliriz. Dilerseniz gene yukarda bahg setti imiz .xml dosyasn rnek alalm: g
<EnclosingTag> <Fierce <Fierce <Fierce <Fierce <Fierce name="Item1" name="Item2" name="Item3" name="Item4" name="Item5" separator="," separator="," separator="," separator="," separator="," src="myfile1.csv" src="myfile2.csv" src="myfile3.csv" src="myfile4.csv" src="myfile5.csv" /> /> /> /> />

<NotFierce Name="Item22"> </NotFierce> </EnclosingTag>

Simdi diyelim ki biz bu dosyann Item2 satrn silmek istiyoruz. Bu ilemi su kodlarla hallede s biliriz:
#!/usr/bin/env python # -*- coding: utf-8 -*oku = open("write_it.xml") icerik = oku.readlines() del icerik[3] oku.close() yaz = open("write_it.xml", "w") yaz.writelines(icerik) yaz.close()

Burada da, tpk bir nceki blmde oldu u gibi, ncelikle readlines() metodunu kullanarak g dosya ieri ini bir listeye gnderdik. Daha sonra bu listede silmek istedi imiz satra karlk g g s gelen enin sra numarasn kullanarak del deyimi yardmyla ilgili eyi listeden kaldrdk. g g Son olarak da elimizdeki de itirilmi listeyi bir dosyaya yazdrdk. gs s Grd nz gibi bir dosyaya veri girmek veya dosyadan veri karmak son derecek kolay bir g ilem. Yapmamz gereken tek sey dosya ieri ini bir listeye alp, bu liste zerinde gerekli s g

de iiklikleri yapmak. Daha sonra da bu de itirilmi listeyi dosyaya yazdrararak amacmza gs gs s ulaabiliyoruz. s

15.7 os Modlnde Dosya-Dizin slemleri I


Hatrlarsanz geen blmde Modller konusunu ilerken os modlnden de ayrntl olarak s bahsetmitik. Ancak orada bu modln btn zelliklerini anlatmadm. os modlnn baz s zelliklerini anlatabilmek iin nce Dosya slemleri konusunu renmemizin daha do ru I g g olaca n dndm. Dosya ilemleri konusunu rendi imize gre, geen derste bahg s s g g setmedi imiz baz metot ve fonksiyonlar incelemeye balayabiliriz. g s

15.7.1 os.path.abspath()
Bu metot bir dosyann, iinde yer ald dizin yolunu verir. Bunu bir rnek zerinde grelim: g
>>> os.path.abspath("falanca.pdf") C:\\Documents and Settings\\fozgul\\falanca.pdf

Grd nz gibi, os.path.abspath() fonksiyonuna argman olarak bir dosya ad verdik. g O da bize bu dosyann tam yolunu gsterdi. Ancak bu fonksiyonun nemli bir zelli i g vardr. os.path.abspath(), bir dosyann sistemde var olup olmad n kontrol etmez. Yani g os.path.abspath("falanca.pdf") komutunu verebilmek iin sisteminizde falanca.pdf adl bir dosyann olmasna gerek yok. Bu fonksiyonun yapt tek sey, os.getcwd() fonksiyonunun g ktsyla, verdi iniz dosya adn birletirmektir... Bu fonksiyonu bo bir karakter dizisi ile g s s a rd nzda zaten bu fonksiyonun mevcut alma dizinini dndrd n grrsnz: g g s g
>>> os.path.abspath("") C:\\Documents and Settings\\fozgul

15.7.2 os.path.basename()
Bu metot size bir yol iinde yer alan dosyann adn verir. rne in: g
>>> os.path.basename("C:\\Documents and Settings\\fozgul\\falanca.pdf") falanca.pdf

Grd nz gibi, bu metot yol ve dosya adn ayklayarak, bize dosya adn veriyor. g

15.7.3 os.path.dirname()
Bu metot ise bir nceki metodun yapt iin tam tersini yapar: Dosya adn de il, yol adn g s g dndrr:
>>> os.path.dirname("C:\\Documents and Settings\\fozgul\\falanca.pdf") C:\\Documents and Settings\\fozgul

15.7.4 os.path.exists()
Bu metot bir dosyann veya dizinin var olup olmad n gsterir: g
>>> os.path.exists("C:\\Documents and Settings\\fozgul\\falanca.pdf") False >>> os.path.exists("C:\\Documents and Settings\\fozgul") True

15.7.5 os.path.isdir()
Bu metot, verilen bir yolun dizin olup olmad n kontrol eder: g
>>> os.path.isdir("C:\\Documents and Settings\\fozgul\\falanca.pdf") False

falanca.pdf bir dizin olmad iin False kts aldk: g


>>> os.path.isdir("C:\\Documents and Settings\\fozgul") True

C:\Documents and Settings\fozgul ise bir dizin oldu u iin True kts aldk. g os.path.isdir() metodu, ayn zamanda bir dizinin var olup olmad n da kontrol eder: g
>>> os.path.isdir("C:\\falanca\\dizin") False

Bilgisayarmzda C:\falanca\dizin adl bir dizin var olmad iin False kts alyoruz... g

15.7.6 os.path.isle()
Bu metot, verilen bir yolun dosya olup olmad n kontrol eder: g
>>> os.path.isfile("C:\\Documents and Settings\\fozgul\\deneme.txt") True

Benim bilgisayarmda deneme.txt adl bir dosya oldu u iin True kts aldm. g Bir de suna bakalm:
>>> os.path.isfile("C:\\Documents and Settings\\fozgul\\falanca.txt") False

Bilgisayarmda falanca.txt adl bir dosya yer almad iin bu kez False kts aldm. g Bu metot dosya ve dizinler arasnda da ayrm yapar:
>>> os.path.isfile("C:\\Documents and Settings\\fozgul") False

C:\Documents and Settings\fozgul bir dosya de il, ama dizin ad oldu u iin isle() metodu g g False kts veriyor.

15.7.7 os.path.split()
Bu metot, dosya ve dizin adn birbirinden ayrr:
>>> os.path.split("C:\\Documents and Settings\\fozgul\\falanca.pdf") (C:\\Documents and Settings\\fozgul, falanca.pdf)

Dolaysyla su komut size bir dosyann, iinde yer ald dizini gsterecektir: g
>>> yol = os.path.split("C:\\Documents and Settings\\fozgul\\falanca.pdf") >>> yol[0] C:\\Documents and Settings\\fozgul

Su ise size dosya adn verecektir:


>>> yol = os.path.split("C:\\Documents and Settings\\fozgul\\falanca.pdf") >>> yol[1] falanca.pdf

Bu metot da bir dosya ya da dizinin sistemde var olup olmad na bakmaz... g

15.7.8 os.path.splitext()
Bu metot, bir dosya adyla uzantsn birbirinden ayrr:
>>> os.path.splitext("falanca.pdf") (falanca, .pdf)

15.8 Kmeler ve Dosyalar


nceki blmlerden birinde kmelerden bahsetmitik. Kmeleri ilk grd nzde bunlarn s g tam olarak ne ie yarayaca n anlamam olabilirsiniz. Ama aslnda kmeler Pythonun epey s g s kullanl aralarndan bir tanesidir. Biz kmeleri dosya ilemleri yaparken dahi kullanabiliriz. s s Hatrlarsanz, kmeleri ilerken birtakm metotlardan sz etmitik. Bildi iniz gibi kmeler su s s g metotlara sahipti:
add clear copy difference difference_update discard intersection intersection_update isdisjoint issubset

issuperset pop remove symmetric_difference symmetric_difference_update union update

Bu metotlar iinde zellikle iki tanesi, dosyalarla alrken bizim ok iimize yarayacak. Bahs s setti imiz bu metotlar difference() ve intersection() adl metotlardr. g Bildi iniz gibi, difference() metodu iki kmenin farkn alyor. Bu metodu syle kullanyoruz: g
>>> a_kumesi = set([1, 2, 3]) >>> b_kumesi = set([1, 2, 3, 4]) >>> b_kumesi.difference(a_kumesi) set([4])

Demek ki b kmesinin a kmesinden fark 4 adl e imi... Bu metodu dosyalara da uygulayag s biliriz. Diyelim ki elimizde syle iki adet dosya var:
birinci satr ikinci satr nc satr

Yukardaki dosya1.txt olsun. Bir de dosya2.txt adl bir dosya oluturalm: s


birinci satr ikinci satr nc satr drdnc satr

Bu iki dosyann farkn almak, yani mesela ikinci dosyada bulunup birinci dosyada bulunmayan satrlar gstermek iin syle bir kod yazabiliriz:
>>> f1 = open("dosya1.txt") >>> f2 = open("dosya2.txt") >>> s1 = set(f1) >>> s2 = set(f2) >>> for i in s2.difference(s1): ... print i drdnc satr

Ayn sekilde, intersection() metodunu kullanarak da iki dosyada ortak olan satrlar bula bilirsiniz:
>>> for i in s1.intersection(s2): ... print i birinci satr ikinci satr

nc satr

15.9 with Deyimi


Dosyalarla alrken asla unutmamamz gereken sey, iimizi bitirdikten sonra dosyay kapats s maktr. nk e er bir dosya zerinde altktan sonra o dosyay kapatmazsak, yapt mz g s g de iikliklerin hepsi dosyaya ilenmeyebilir. O yzden bu tr durumlar nlemek iin alan gs s dosyay ilem sonunda kapatmamz gerekir. Ayrca dosyay kapatmak, ak bir dosya zerinde s yanllkla de iiklik yapma riskini de ortadan kaldrr. s gs Normal sartlar altnda bir dosya zerinde alma dngs syle iler: s s
>>> dosya = open("dosya_ad", "w") >>> dosya.write("bir takm eyler...") s >>> dosya.close()

Burada syle bir yol izliyoruz: 1. Dosyay ayoruz. 2. Dosya zerinde gerekli de iiklikleri yapyoruz. gs 3. simiz bitince dosyay kapatyoruz. I Pythonda bu dngy daha pratik bir sekilde yapmamz sa layan bir deyim bulunur. Bu g deyim, with deyimidir. with deyimini yukardaki syle uygulayabiliriz:
>>> with open("dosya_ad", "w") as dosya: ... dosya.write("bir takm eyler...") s

Bu iki satrlk kod sayesinde dosyamz hem am, hem zerinde gerekli de iiklikleri yapm, s gs s hem de dosyay kapatm olduk. s with deyiminin en nemli zelli i, alan dosyay mutlaka kapatmasdr. Yani dosya zerinde g ilem yaplrken bir hata da olusa o dosya baaryla kapatlacaktr. Bu durumu daha net s s s anlamak iin syle bir rnek verelim:
>>> dosya = open("falanca") >>> dosya.write("bir takm eyler...") s Traceback (most recent call last): File "<stdin>", line 2, in <module> IOError: File not open for writing >>> dosya <open file write_it.xml, mode r at 0x00F5B650>

Grd nz gibi, dosyay yazma kipinde amad mz iin dosyaya veri yazdrmamz mmkn g g olmuyor. Byle bir durumda Python bize bir hata mesaj gsteriyor. Ancak bu hata mesajndan sonra, dosyay henz kapatmad mz iin dosyamz hala ak. Bu durumu dosya de ikenini g gs ekrana yazdrarak teyit ettik. Dosya ak oldu u iin zerinde ilem yapmaya devam edebiliriz: g s
>>> dosya.read() varolan ierik...

Bir de suna bakalm:


>>> with open("falanca") as dosya: ... dosya.write("bir takm eyler...") s Traceback (most recent call last): File "<stdin>", line 2, in <module> IOError: File not open for writing >>> dosya <closed file write_it.xml, mode r at 0x00F5B5A0>

Grd nz gibi, dosyaya yazma ilemi srasnda hata ald mz halde, dosya her seye ra men g s g g kapanyor. Artk dosya zerinde herhangi bir ilem yapmamz mmkn de il: s g
>>> dosya.read() Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: I/O operation on closed file

Python bizi, kapal bir dosya zerinde ilem yapmaya alt mz konusunda nazike uyaryor... s s g

15.10 Blm Sorular


1. Python yardmyla, ieri i ve grn aa daki gibi olan, istihza.html adl bir belge olug s s g s turun: istihza.com Hakknda istihza.com, Python programlama dili ve Tkinter iin bir Trke kaynak oluturma s almasdr. Burada ayn zamanda PyGTK adl arayz takmna ilikin Trke bilgi s s de verilmektedir. Gnlk ise konu eitlili i asndan daha esnek bir blm olarak s g tasarland... Gnlk blmnden, bu siteye ilikin son gelimeler ve duyurular s s hakknda ayrntl bilgiye de eriebilirsiniz. s 2. Kullancdan ald birtakm bilgiler do rultusunda anlaml bir paragraf oluturabilen bir prog g s gram yazn. Oluturdu unuz bu paragraf daha sonra .html uzantl bir dosya halinde kaydedip, s g sistemdeki ntanml internet taraycs yardmyla kullancya gsterin. 3. Python ile oluturdu unuz veya at nz herhangi bir dosyayla iiniz bittikten sonra e er s g g s g bu dosyay close() fonksiyonu ile kapatmazsanz ne gibi sonularla karlarsnz? At nz s s g dosyay kapatmadan, varolan dosyay sa tk > sil yolunu takip ederek silmeye alt nzda g s g iletim sisteminiz nasl bir tepki veriyor? s 4. os.path.abspath() fonksiyonunun yapt ii taklit eden bir fonksiyon yazn. g s 5. Bir PDF belgesinin herhangi bir sayfasn kesip ayr bir PDF belgesi oluturan bir program s yazn. Bu program sadece PDF belgeleri zerinde ilem yapmal. E er kullanc PDF d s g s bir dosya ad belirtirse, programnz dosyann PDF biiminde olmad konusunda kullancy g uyarmal. 6. Bir dosyada belli bir satrn olup olmamasna gre ilem yapan bir program yazn. Mesela s yazd nz program bir dosyaya bakp iinde o satrn geip gemedi ini tespit edebilmeli. E er g g g ilgili satr dosyada yoksa o satr dosyaya eklemeli, aksi halde herhangi bir ilem yapmadan s program sonlandrmal.

BLM

16

Karakter Dizileri

Dikkat ettiyseniz ilk dersten bu yana srekli olarak karakter dizileri ile har neir oluyoruz. s s Karakter dizileriyle bu kadar ili dl olmamz kesinlikle bouna de il. Zira karakter dizileri s s g Pythonn en nemli konularndan biridir. Geri biz su ana kadar karakter dizilerine ilikin s epey sey rendik. Ancak karakter dizileri konusunda henz grmedi imiz, ama grmemiz g g gereken pek ok sey de var. ste bizim bu blmde amacmz, karakter dizileri hakknda daha I nce rendiklerimizi bir yandan pekitirirken, bir yandan da bu konu hakknda renmemiz g s g gerekenleri renmek. Bu blmde, karakter dizilerini ve bunlarn metotlarn/fonksiyonlarn g derinlemesine inceleme frsat bulaca z. g

16.1 Karakter Dizisi Nedir?


Isterseniz ie en bandan balayalm ve su soruyu soralm kendimize: Karakter dizisi nedir? s s s Kabaca tarif etmek gerekirse, trnak iinde gsterebilece imiz her sey bir karakter dizisidir. g Mesela su bir karakter dizisidir:
>>> "elma"

Grd nz gibi, Pythonda bir karakter dizisi tanmlamak iin ok zel bir ilem yapmanza g s gerek yok. Karakter dizisi olmasn istedi iniz bir seyi trnak iine ald nz anda o artk bir g g karakter dizisidir. Isterseniz bu durumu teyit edelim:
>>> type(elma) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name elma is not defined

Grd nz gibi, elma kelimesini trnak iaretleri iine almad mzda (ve e er daha nce g s g g elma adl bir de iken de tanmlamamsak) Python bize yukardaki gibi bir hata mesaj gs s gsterecektir. Bir de suna bakn:
>>> type("elma") <type str>

219

Ama e er elma kelimesini trnak iine alrsak her sey bir anda de iir. Bu ilemi yapt mz g gs s g anda artk elma kelimesi Python asndan bir karakter dizisidir. Eee, ne olmu yani? s dedi inizi duyar gibiyim... Belki bu bilgi su anda size pek fazla bir sey ifade etmemi olag s bilir. Ancak ileride nesne tabanl programlama konusunu incelerken bunun ne kadar nemli bir zellik oldu unu anlayacaksnz. Simdilik biz yolumuza devam edelim. g Yukardaki komutun ktsndan da anlad mz gibi, Pythonda karakter dizileri str ksaltmasyla g gsteriliyor. Bu ifade Ingilizce string (karakter dizisi) kelimesinin ksaltmasdr. Peki bir veri tipinin karakter dizisi olup olmamasnn ne nemi var? Pythonda program yazarken elimizdeki herhangi bir verinin tipini bilmek son derece nemlidir. Yani o anda elimizde olan seyin mesela bir say m yoksa karakter dizisi mi oldu unu g bilmek, yazd mz kodlarn dzgn alabilmesi asndan byk nem tar. Mesela su g s s rne e bakalm: g
# -*- coding: utf-8 -*with open("sayilar.txt", "w") as f: for i in range(5): f.write(i)

Bu kodlar alma srasnda hata verecektir. nk range() fonksiyonu say retir. Yani range() s fonksiyonundan gelen veri tipi saydr. Dolaysyla bu veri tipini do rudan bu sekilde dosyaya g yazdramazsnz. Bu fonksiyondan gelen veri tipinin dosyaya yazdrlabilmesi iin ncelikle karakter dizisine evrilmesi gerekir:
# -*- coding: utf-8 -*with open("sayilar.txt", "w") as f: for i in range(5): f.write(str(i))

Burada str() fonksiyonundan yararlanarak, range() fonksiyonunun retti i saylar birer karakg ter dizisine evirdik ve ondan sonra bunlar do ruca dosyaya yazdrdk. g Ayn sekilde, mesela raw_input() fonksiyonu ile kullancdan ald nz verilerin tipinin de birer g karakter dizisi oldu unu bilmek ok nemlidir. E er bunu bilmezseniz syle bir kod yazma g g hatasna debilirsiniz: s
# -*- coding: utf-8 -*sayi = raw_input("Bir say girin: ") print "Girdiiniz saynn karesi: ", sayi ** 2 g

Bu kodlar alma srasnda hata verecektir. nk dedi imiz gibi, raw_input() fonksiyonu bize s g bir karakter dizisi verir. E er biz bu fonksiyonla say almak istiyorsak, buradan gelen karakter g dizisini sayya evirmemiz gerekir:
# -*- coding: utf-8 -*sayi = raw_input("Bir say girin: ") print "Girdiiniz saynn karesi: ", int(sayi) ** 2 g

Burada int() fonksiyonunu kullanarak, raw_input()tan gelen karakter dizisini sayya evirdik. Burada elbette raw_input() fonksiyonundan gelen karakter dizisini dmdz bir sekilde sayya evirmeye almak iyi bir yntem de ildir. Pythonda herhangi bir dntrme ilemi yas g s s parken, bu ilem srasnda baz hatalarn da ortaya kabilece ini hesaba katmamz gerekir. s g

Mesela yukardaki rnekte kullanc say yerine bir harf girerse kodlarmz hata verecektir. Bu yzden yukardaki gibi bir kod yazmamz gerekti inde bu tr hatalara kar nlem almamz g s gerekir:
# -*- coding: utf-8 -*def deger_hatasi(): return "Harf yerine say girmeyi deneyin!" def sifir_uyarisi(): return "0 dnda bir say girin!" s sayi = raw_input("Bir say girin: ") if sayi == "0": print sifir_uyarisi() quit() try: n = int(sayi) print "Girdiiniz saynn karesi: ", n ** 2 g except ValueError: print deger_hatasi()

Bu arada, bir saynn karesini almak iin Pythondaki pow() adl bir fonksiyondan da yararlanabiliriz:
>>> print pow(12, 2) 144

pow() fonksiyonu bir saynn istedi imiz bir kuvvetini hesaplamamz sa lar. Mesela yukarg g daki rnekte biz 12 saysnn 2. kuvvetini hesapladk. E er 12nin 3. kuvvetini hesaplamak g isteseydik syle bir sey yazardk:
>>> print pow(12, 3) 1728

Yukardaki iki rnek srasyla sununla ede erdir: 122 ve 123 s g

16.2 Trnak Tipleri


Dedi imiz gibi, Pythonda karakter dizilerini baka veri tiplerinden ayran en nemli zellik, g s trnak iinde gsterilmeleridir. Python, karakter dizisi tanmlarken kullanabilece imiz trnak g tipleri konusunda bize birka farkl seenek sunar. Karakter dizilerini tanmlarken tek trnak, ift trnak veya trnak iaretlerinden yararlanabiliriz. rne in: s g
>>> kardiz = "elma"

Biz yukarda tanmlad mz elma karakter dizisini ift trnak ile gsterdik. Ama siz isterseniz bu g karakter dizisini tek veya trnak iaretlerini kullanarak da tanmlayabilece inizi biliyorsunuz. s g Hemen bir ka rnek verelim:
>>> "C Programlama Dili" >>> Guido Van Rossum >>> """Monty Python"""

Bunlarn hepsi birer karakter dizisidir. Ancak daha nceki derslerimizden edindi imiz tecrbg eye gre, bir karakter dizisini tanmlarken kullanaca mz trnak tipi konusunda baz noktalara g da dikkat etmemiz gerekiyor. rne in karakter dizisi iinde bir kesme iareti varsa, karakter g s dizisini tek trnak iaretleri iinde gstermemiz baz sorunlara yol aabilir. Mesela Pythonn s 3.x srmleri ifadesini bir karakter dizisi olarak tanmlamak istedi imizde, kullanaca mz trg g nak tipini belirlerken ifade iinde geen kesme iaretini de dikkate almamz gerekir. E er bu s g ifadeyi karakter dizisi olarak tanmlarken tek trnak iaretlerini kullanrsak, Pythonn kelimesi s iinde geen kesme iareti karkl a sebep olacaktr: s s g
>>> print Pythonn 3.x srmleri

Yukardaki gibi bir kullanmn hataya yol aaca n biliyorsunuz. Bu tr hatalar nlemek iin g izleyebilece imiz birka farkl yol var: g
>>> print "Pythonn 3.x srmleri"

Burada kesme iaretinin karakter dizisini balatan ve bitiren trnak iaretleriyle karmasn s s s s nlemek iin karakter dizisini tek trnak yerine ift trnak iinde gsterdik. ift trnak yerine trnak da kullanabiliriz:
>>> print """Pythonn 3.x srmleri"""

Bu kullanm da geerli bir yoldur. Ama e er mutlaka tek trnak kullanmak istersek ka g s dizilerinden faydalanmamz gerekti ini nceki derslerimizde de sylemitik: g s
>>> print Python\n 3.x srmleri

Peki bu trnak tiplerinden hangisini kullanmak daha iyidir? Cevap: Hangisi iinize geliyorsa! s Teknik olarak bu trnak tiplerinden hangisini kulland nzn hi bir nemi yok. Yazd nz g g karakter dizisini tanmlamada hata vermedi i srece herhangi bir trnak tipini kullanabilirsiniz. g Python camiasnda zellikle tek ve ift trnaklar olduka yaygn bir sekilde kullanlr. Ancak tek trnak iareti karakter dizisi iinde geen kesme iaretleriyle karabilece i iin, e er ka s s s g g s dizileriyle de u ramak istemiyorsanz, tek trnak yerine ift trnak iaretlerini kullanmak daha g s s pratik olabilir. trnak iareti ise genellikle karakter dizisi tanmlamada pek kullanlmaz. s Python programclar, birden fazla satra blnecek karakter dizilerini daha rahat bir sekilde oluturmamz sa lad iin trnak iaretlerini o unlukla belgelendirme dizilerini tanms g g s g larken kullanr. Mesela:
#!/usr/bin/env python # -*- coding: utf-8 -*def bir_fonksiyon(parametre): """Bu fonksiyonun herhangi bir ilevi s yoktur. rnek olsun diye verilmitir...""" s pass

Grd nz gibi, burada trnak iaretlerini belgelendirme dizisi oluturmak maksadyla kulg s s landk. nk trnak, teki trnak tiplerinden farkl olarak bize birden fazla satra blnm s karakter dizilerini kolayca gsterme imkan verir. Dilerseniz bununla ilgili syle bir rnek daha verelim:
#!/usr/bin/env python # -*- coding: utf-8 -*print """\ Falanca v0.1e hogeldiniz. Program u s s parametreleri kullanarak altrabilirsiniz: s

-v -h -c """

srm numarasn grntler yardm belgesini grntler program yazarlar hakknda bilgi verir

def bir_fonksiyon(parametre): pass

Grd nz gibi, trnak sayesinde, karakter dizisini nasl yazdysak kt da ayn sekilde g grnyor... Ayn kty tek veya ift trnakla elde etmek olduka gtr.

16.3 Karakter Dizilerini Birle tirmek s


Pythonla programlama maceranzda karakter dizileri ile en sk yapaca nz ilemlerden biri de g s karakter dizilerini birbiriyle birletirmek olacaktr. Pythonda karakter dizilerini birletirmenin s s birden fazla yntemi var:
>>> >>> >>> >>> ad = "Frat" soyad = "zgl" ad_soyad = ad + soyad print ad_soyad

Fratzgl

Burada basite + ilecinden yararlanarak iki karakter dizisini birletirdik. Ancak grd nz s s g gibi, burada iki karakter dizisi arasnda boluk yok. Ama tabii siz bu bolu u kendiniz de s s g ekleyebilirsiniz:
>>> bosluk = " " >>> print ad + bosluk + soyad Frat zgl

Bu yntemi kullanarak syle bir sey yazabilirsiniz mesela:


>>> a = "" >>> for i in range(10): ... a += str(i) ... >>> print a 0123456789

Pythonda karakter dizileri de itirilemeyen (immutable) veri tipleridir. Yani karakter dizileri gs zerinde de iiklik yaplamaz. Ama mesela listeler byle de ildir. Listeler de itirilebilir (mugs g gs table) veri tipleri olduklar iin listeler zerinde de iiklik yapabiliyoruz. Bir rnek verelim: gs
>>> lst = ["elma", "armut", "muz"] >>> lst.append("kiraz") >>> print lst ["elma", "armut", "muz", "kiraz"]

Grd nz gibi, oluturdu umuz bir listeye append() metodunu kullanarak yeni bir e g s g g ekleyebildik. Ama karakter dizileri byle de ildir. rne in: g g

>>> kardiz = "elma" >>> kardiz + "armut" elmaarmut

Burada sanki karakter dizisi zerinde de iiklik yapabilmiiz gibi grnyor, ama aslnda dugs s rum yle de il: g
>>> print kardiz elma

Grd nz gibi, zgn karakter dizisinde herhangi bir de iiklik olmad. zgn karakter dizisi g gs hala elma... E er bir karakter dizisi zerinde de iiklik yapmak istersek, zgn karakter g gs dizisinin zerine yazmamz veya de iiklikleri farkl bir karakter dizisi iinde depolamamz gs gerekir. rne in de iiklikleri farkl bir karakter dizisinde depolamak iin syle bir sey yazg gs abiliriz:
>>> kardiz2 = kardiz + "armut" >>> print kardiz2 elmaarmut

Bu sekilde elma de erini tayan kardiz adl karakter dizisi ile armut karakter dizisini g s kardiz2 adl baka bir de ikene atam olduk. Ancak tabii ki zgn karakter dizisi yerli s gs s yerinde duruyor:
>>> print kardiz elma

Dedi imiz gibi, de iiklikleri zgn karakter dizisinin zerine de yazabiliriz: g gs


>>> kardiz = kardiz + "armut" >>> print kardiz elmaarmut

Burada kardiz adl karakter dizisini silip, yine kardiz adn tayan baka bir karakter dizisi s s oluturmu olduk. Yukardaki rne i su sekilde ksaltabilece imizi biliyorsunuz: s s g g
>>> kardiz += "armut" >>> print kardiz elmaarmut

Gsterdi imiz bu zelli i daha karmak bir rnek iinde kullanalm. Diyelim ki elinizde syle g g s bir metin var:
saip 1990 ajnjfc v acc yaym k s psnvnvm ccjfc hgnkukkng mjzcm zg fkcokm k fknfk. s g s s s s trb fkbkokk tcfg pnoctj, mpnca rgknogtk zg sphco s s s hgnkukog tygdkk ijbncfjoctj kng cjc v fkn s s s wkfpwt, hv/nkvx zg ocdpt x hkk sgm epm cmnj kungko g s tktgok ybgkfg ecnjucknogmgfk. fpncajtjanc gm k s s s sncpofc hgnkukfkkkb k saip vahvncoctj, ybgkfg g s s s s ike k fgkukmnkm acsocac hggm pnocfc zgac myeym s s fgkukmnkmngng cumc sncponcfc fc ecnjuckngdgmk. s g s s s

Anlamsz harerden olumu gibi grnen bu metin, Trke bir metnin sifrelenmi halidir. Bus s s rada hangi harn hangi harfe karlk geldi ini gsteren syle bir tablo da olsun elimizde: s g
g a j p = = = = = = f y b o n c f m s y = = = = = = g a d k p v b i l r z = = = = = = u z h j v g e h o u = = = = = = e g m s t s d k n t = = = = = r c i l s

Bu tablo, sifrelenmi metin iinde grd mz her harn alfabedeki karl n gsteriyor. Yani s g s g mesela sifrelenmi metin iindeki harni f haryle de itirece iz. s g gs g Bu bilgileri kullanarak, yukardaki sifreli metni rahatlkla zebiliriz. Bunun iin syle bir kod yazmamz yeterli olacaktr:
#!/usr/bin/env python # -*- coding: utf-8 -*sifreli_metin = """saip 1990 ajnjfc v acc yaym k s psnvnvm ccjfc hgnkukkng mjzcm zg fkcokm k fknfk. s g s s s s trb fkbkokk tcfg pnoctj, mpnca rgknogtk zg sphco s s s hgnkukog tygdkk ijbncfjoctj kng cjc v fkn s s s wkfpwt, hv/nkvx zg ocdpt x hkk sgm epm cmnj kungko g s tktgok ybgkfg ecnjucknogmgfk. fpncajtjanc gm k s s s sncpofc hgnkukfkkkb k saip vahvncoctj, ybgkfg g s s s s ike k fgkukmnkm acsocac hggm pnocfc zgac myeym s s fgkukmnkmngng cumc sncponcfc fc ecnjuckngdgmk.""" s g s s s sozluk = {"a": "": "f": "h": "j": "m": "": "s": "u": "y": "y", "b", "d", "g", "", "k", "n", "p", "", s "", "b": "d": "g": "": "k": "n": "p": "": s "": "z": "z", "c", "e", "", g "i", "l", "o", "r", "t", "v"} "c": "e": "": g "i": "l": "o": "r": "t": "v": "a", "", "f", "h", "j", "m", "", "s", "u",

sifresiz_metin = "" for harf in sifreli_metin: sifresiz_metin += sozluk.get(harf, harf) print sifresiz_metin

Burada karakter dizilerini nasl birletirdi imize dikkat edin. Aslnda bu kodlarda syle bir sey s g yapm olduk: s 1. nce sifreli metnimizi bir karakter dizisi olarak tanmladk. Uzun bir metinle kar karya s s oldu umuzdan, satr sonlarnda bir sonraki satra geerken problem yaamamak iin g s karakter dizisini tanmlarken trnak iaretlerinden yararlandk. Bildi iniz gibi, birden s g fazla satra yaylm uzun karakter dizilerini tanmlamann en kolay yolu trnak kullans maktr. 2. Daha sonra hangi harn hangi harfe karlk geldi ini gsteren tablomuzu bir szlk haline s g getiriyoruz. 3. Ardndan, sifreli metnin zlm halini tutacak olan sifresiz_metin adl karakter diz s

imizi tanmlyoruz. Bir sonraki admda her bir karakteri birbiriyle birletirip bu bo karakter s s dizisi iine gnderece iz. g 4. Simdi de sifreli_metin adl karakter dizisi iindeki her bir karakteri, szlkteki karlk s larna gre tek tek sifresiz_metin adl karakter dizisine gnderiyoruz. Burada szlklerin get() adl metodunu kulland mza dikkat edin. E er bu metodun nasl kullanld na g g g ilikin spheleriniz varsa Szlkler blmndeki get() metoduna bakabilirsiniz. s 5. Son olarak da sifresiz_metin adl karakter dizisini ekrana yazdryoruz. Ayrca bkz.: Benzer bir rnek: http://www.istihza.com/blog/this-modulu-icindeki-sifreli-metin.html/ Dedi imiz gibi, Pythonda karakter dizilerini birletirmek iin elimizde eitli alternatier var. g s s Biz yukarda + ilecini kullanarak karakter dizilerini nasl birletirebilece imizi grdk. Karaks s g ter dizilerini , iaretleriyle de birletirebiliriz: s s
>>> a = "birinci karakter dizisi" >>> b = "ikinci karakter dizisi" >>> print a, b birinci karakter dizisi ikinci karakter dizisi

Grd nz gibi, karakter dizilerini , iaretiyle birletirdi imizde Python karakter dizileri g s s g arasna otomatik olarak bir boluk yerletiriyor. Gelin isterseniz bununla ilgili olarak az ok s s ie yarar bir rnek verelim: s
# -*- coding: cp1254 -*import os print print print print print print "Kullanc ad: ", "Bilgisayar ad: ", "Ev dizini: ", "lemci: Is ", "lemci says: ", Is "letim sistemi:", Is os.environ["USERNAME"] os.environ["COMPUTERNAME"] os.environ["HOMEPATH"] os.environ["PROCESSOR_IDENTIFIER"] os.environ["NUMBER_OF_PROCESSORS"] os.environ["OS"]

Bu betik yardmyla kullancnn iletim sistemine ilikin baz bilgileri ekrana dktk. Burada s s os modlnn environ adl niteli inden yararland mza dikkat edin. os.environ aslnda bir g g szlktr. Dolaysyla bu szlk birtakm anahtar-de er iftlerinden oluur. Bu szlkteki btn g s anahtar-de er iftlerini ekrana dkmek iin syle bir sey yazabilirsiniz: g
>>> for k, v in os.environ.items(): ... print k, v

Bu komutlarn kts, kulland nz iletim sistemine gre baz farkllklar gsterebilir. rne in g s g yukardaki betik Windows kurulu bir bilgisayar zerinde yazlmtr. Dolaysyla bu beti in kts s g GNU/Linux iletim sistemlerinde farkl olacaktr. s Yukardaki iki rnekte de karakter dizilerini birletirmek iin , iaretlerinden yararland mza s s g dikkat edin.

16.4 Karakter Dizilerini Dilimlemek


Baz durumlarda, elimizdeki bir karakter dizisinin tamamna ihtiyacmz olmayabilir. Yazd mz g program asndan, elimizdeki karakter dizisinin sadece bir blmn kullanmak isteyebiliriz.

Elimizde syle bir karakter dizisi oldu unu varsayalm: g


>>> url = "http://www.istihza.com"

Diyelim ki biz bu karakter dizisinin bandaki http:// ksmn atmak istiyoruz... ste bunun s I iin karakter dizilerinin dilimleme (slicing) zelli inden faydalanabiliriz. Yukardaki rne i g g dilimlemeden nce dilerseniz bir iki temel rnek zerinden dilimlemenin ne demek oldu unu g anlamaya alalm: s
>>> kardiz = "elma" >>> print kardiz[0] e >>> print kardiz[1] l >>> print kardiz[-1] a

Burada kardiz adl karakter dizisinin elerine tek tek nasl ulaabildi imizi gryorsunuz. g s g Byle bir kullanm listelerde ve demetlerde de grmtk: s
>>> lst = ["Python", "Perl", "Ruby", "PHP"] >>> print lst[0] Python >>> print lst[-1] PHP

Bu yntemi kullanarak, karakter dizilerini dilim dilim blebiliriz. Mesela:


>>> kardiz = "Python" >>> print kardiz[0:4] Pyth >>> print kardiz[2:5] tho

Grd nz gibi, bu yntemle karakter dizilerinin istedi imiz bir parasn alabiliyoruz. Gelin g g bununla ilgili baz denemeler yapalm:
>>> kardiz = "Kahramanmaral Abdullah" s >>> print kardiz[0:5] Kahra >>> print kardiz[:5] Kahra

E er : iaretinden nceki de erimiz 0 ise, bu de eri yazmasak da olur. : iaretinden g s g g s nce herhangi bir de er belirtmezsek Python saymaya en batan balayacak, sanki oraya 0 g s s

yazmsnz gibi davranacaktr. Yani : iaretinden nceki enin varsaylan de eri 0dr... Bir s s g g de suna bakalm:
>>> print kardiz[3:] ramanmaral Abdullah s

: iaretinden sonraki de eri yazmad mzda ise karakter dizisinin sonuna kadar gidiliyor. s g g Yukardaki komut sununla ede erdir: s g
>>> print kardiz[3:len(kardiz)]

Simdi isterseniz bu blmn en banda verdi imiz rne e dnelim: s g g


>>> url = "http://www.istihza.com"

Biraz nce gsterdi imiz dilimleme yntemini kullanarak bu karakter dizisinin en bandaki g s http:// ksmn ataca z: g
>>> print url[7:] www.istihza.com

Grd nz gibi, bataki http:// ksmn gayet sk bir sekilde attk... Bunu syle bir rnek g s iinde kullanabiliriz:
# -*- coding: utf-8 -*url_list = ["http://www.python.org", "http://www.istihza.com", "http://www.google.com", "http://www.yahoo.com"] for i in url_list: print i[7:]

Karakter dizilerinin dilimlenme zelli inden yararlanarak yapabilecekleriniz bunlarla snrl g de ildir elbette. Mesela: g
>>> kardiz = "Python Programlama Dili" >>> print kardiz[2:15:2] to rgal

Burada, karakter dizisinin 2. karakterinden 15. karakterine kadar olan ksm ikier ikier ats s layarak ekrana yazdrdk. Ayn karakter dizisinin bandan sonuna kadar er er atlayarak s ilerlemek isteseydik syle bir sey yazabilirdik:
>>> print kardiz[::3] Ph oaa l

Burada dilimleme zelli inin varsaylan de erlerinden yararland mza dikkat ediyoruz. Yani g g g yukardaki kodu aslnda syle de yazabilirdik:
>>> print kardiz[0:len(kardiz):3] Ph oaa l

E er bir karakter dizisini ters evirmek isterseniz yine bu dilimleme zelli inden faydalang g abilirsiniz:
>>> kardiz = "Python programlama dili renmesi kolay bir dildir!" g >>> print kardiz[::-1] !ridlid rib yalok isemner ilid amalmargorp nohtyP g

Karakter dizilerini dilimleyerek yapabilecekleriniz hakknda bir rnek daha vererek bu konuyu kapatalm:
# -*- coding: utf-8 -*url_list = ["http://www.python.org", "http://www.istihza.com", "http://www.google.com", "http://www.yahoo.com"] for i in url_list: print "ftp" + i[10:]

Bu rnekte, url_list iinde bulunan adreslerin bandaki http://www ksmn atarak yerlerine s ftp ifadesini getirdik...

16.5 Karakter Dizilerinin Metotlar


Bu blmde Pythondaki karakter dizilerinin metotlarndan sz edece iz. Su halde isterseniz g gelin Pythonun bize hangi metotlar sundu unu topluca grelim: g
>>> for i in dir(str): ... if "_" not in i: ... print i [__add__, __class__, __contains__, __delattr__, __doc__, __eq__, __ge__, __getattribute__, __getitem__, __getnewargs__, __getslice__, __gt__, __hash__, __init__, __le__, __len__, __lt__, __mod__, __mul__, __ne__, __new__, __reduce__, __reduce_ex__, __repr__, __rmod__, __rmul__, __setattr__, __str__, capitalize, center, count, decode, encode, endswith, expandtabs, find, index, isalnum, isalpha, isdigit, islower, isspace, istitle, isupper, join, ljust, lower, lstrip, partition, replace, rfind, rindex, rjust, rpartition, rsplit, rstrip, split, splitlines, startswith, strip, swapcase, title, translate, upper, zfill]

Grd nz gibi, Pythonda karakter dizilerinin bir hayli metodu varm... E er bu listeleme g s g biimi gznze biraz kark grndyse, elbette kty istedi iniz gibi biimlendirmek sizin s g elinizde. Mesela nceki bilgilerinizi de kullanp syle bir sey yaparak kty biraz daha okunakl hale getirebilirsiniz:
>>> for i in dir(""): ... print i

Hatta ka adet metot oldu unu da merak ediyorsanz syle bir yol izleyebilirsiniz. (Elle tek g tek sayarm, diyenlere teesserimi iletiyorum...)

>>> print len(dir(""))

Simdi sra geldi bu metotlar incelemeye...

s 16.5.1 Byk-Kk Harf Degi tirme


Pythonda karakter dizilerinin byk-kk harf durumlarn de itirmek iin kullanabilegs ce imiz be farkl metot var. Bu metotlar syle sralanabilir: g s capitalize() metodu Karakter dizilerinin ilk harni bytr. title() metodu Karakter dizisi iinde geen her bir kelimenin ilk harni bytr. upper() metodu Kk harerden oluan bir karakter dizisi iindeki btn hareri bytr. s lower() metodu Byk harerden oluan bir karakter dizisi iindeki btn hareri kltr. s swapcase() metodu Karakter dizisi iindeki byk hareri kk, kk hareri byk hale getirir. Bu metotlarn tanmlarn verdi imize gre, artk bunlarla ilgili rnekler yaparak bu metotlarn g tam olarak ne ie yaradklarn anlamaya alabiliriz. s s olarak capitalize() metoduyla balayalm... Ilk s capitalize() Dedi imiz gibi, capitalize() metodu bir karakter dizisinin ilk harni bytr. rne in: g g
>>> "adana".capitalize() Adana >>> kent = "adana" >>> kent.capitalize() Adana

Yalnz burada dikkat etmemiz gereken bir nokta var: Bu metot yardmyla birden fazla kelime ieren karakter dizilerinin sadece ilk kelimesinin ilk harni bytebiliyoruz:
>>> a = "ltfen parolanz giriniz" >>> print a.capitalize() Ltfen parolanz giriniz

Bu metodu kullanarak bir liste iindeki btn karakter dizilerinin ilk harni bytebilirsiniz:
>>> a = ["elma", "armut", "kebap", "salata"] >>> for i in a: ... print i.capitalize() ... Elma Armut Kebap Salata

title() capitalize() metoduna ok benzeyen bir baka metot ise title() adl metottur. capitalize() s metodu bir karakter dizisi iinde geen yalnzca ilk kelimenin ilk harni bytyordu. title() metodu ise bir karakter dizisi iindeki btn kelimelerin ilk harerini bytyor:
>>> a = u"cumhurbakanl senfoni orkestras" s g >>> print a.title() Cumhurbakanl Senfoni Orkestras s g

Burada dikkat ederseniz karakter dizisini tanmlarken karakter dizisinin en bana bir u har s getirdik. Esasnda biz bu har nceki derslerimizde de grmtk. Bir-iki ders sonra bu harn s tam olarak ne ie yarad n gayet net bir sekilde renece iz. Simdilik biz sadece bunun s g g g karakter dizisi iindeki Trke harerin dzgn kt vermesini sa lad n bilelim yeter. Dilg g erseniz karakter dizisini u har olmadan tanmlamay deneyip sonucun ne oldu unu kendi g gzlerinizle grebilirsiniz. Sra geldi upper() adl metodu incelemeye... upper() Yukarda yapt mz tanmdan da anlalaca gibi, bu metot yardmyla tamam kk harerg s g den oluan bir karakter dizisinin btn harerini bytebiliyoruz. Hemen bir rnek verelim: s
>>> "enflasyon".upper() ENFLASYON

Grd nz gibi, enasyon kelimesinin btn harerini byk harfe evirdik. g upper() metodunun bir de tersi vardr: lower() metodu. lower() metodu byk harerden oluan karakter dizilerini kk hari karakter dizilerine dntryor: s s
>>> a = "ARMUT" >>> a.lower() armut

swapcase() Bu balkta inceleyece imiz son metodumuzun ad swapcase(). Bu metot bize, bir karaks g ter dizisinin o anda sahip oldu u harerin byklk ve kklk zellikleri arasnda gei g s yapma imkan sa lyor. Yani, e er o anda bir harf bykse, bu metodu kulland mzda o harf g g g klyor; e er bu harf o anda kkse, bu metot o har byk harfe eviriyor. Grd nz g g gibi, bu metodun ne yapt n, anlatarak aklamak zor oluyor. O yzden hemen birka rnek g yapalm:
>>> a = "kebap" >>> a.swapcase() KEBAP >>> b = "KEBAP" >>> b.swapcase()

kebap >>> c = "KeBaP" >>> c.swapcase() kEbAp

16.5.2 Byk-Kk Harf ve Bo luk Sorgulama s


Yukarda gsterdi imiz sekilde karakter dizilerinin byk-kk harf durumlarn de itirebiliyg gs oruz. Python bize ayn zamanda karakter dizilerinin byk-kk harf durumlarn sorgulama imkan da veriyor. Bu sorgulama ilemleri iin yine birtakm metotlardan yararlanyoruz. Bu s metotlar syle sralayabiliriz: islower() Karakter dizisinin tamamen kk harerden oluup olumad n sorgular s s g isupper() Karakter dizisinin tamamen byk harerden oluup olumad n sorgular s s g istitle() Karakter dizisi iindeki kelimelerin ilk harerinin byk olup olmad n sorgular g isspace() Karakter dizisinin tamamen boluk karakterlerinden oluup olumad n sorgular s s s g metodumuz olan islower() ile balayalm... Ilk s islower() Bir karakter dizisinin tamamen kk harerden oluup olumad n sorgulamak iin islower() s s g metodundan yararlanaca z. Mesela: g
>>> kent = "istanbul" >>> kent.islower() True

Demek ki kent de ikeninin de eri olan karakter dizisi tamamen kk harerden oluuyorgs g s mu. s Aa daki rnekler ise False (yanl) kts verecektir: s g s
>>> a = "Istanbul" >>> a.islower() False >>> b = "ADANA" >>> b.islower() False

isupper() Bir karakter dizisinin tamamen byk harerden oluup olumad n denetlemek iin ise isups s g per() adl baka bir metottan faydalanyoruz: s

>>> a = "ADANA" >>> a.isupper() True >>> "istanbul".isupper() False

istitle() Hatrlarsanz daha nce rendi imiz metotlar arasnda title() adl bir metot vard. Bu metot g g yardmyla tamam kk harerden oluan bir karakter dizisinin ilk harerini bytebiliyorduk. s ste simdi renece imiz istitle() metodu da bir karakter dizisinin ilk harerinin byk olup I g g olmad n sorgulamamz sa layacak: g g
>>> a = "Karakter Dizisi" >>> a.istitle() True >>> b = "karakter dizisi" >>> b.istitle() False

Grd nz gibi, e er karakter dizisinin ilk hareri bykse bu metot True kts; aksi halde g g False kts veriyor. isspace() Son olarak isspace() adl bir metottan sz edece iz. Bu metot ile, bir karakter dizisinin tamag men boluk karakterlerinden oluup olumad n kontrol ediyoruz. E er bir karakter dizisi s s s g g tamamen boluk karakterinden oluuyorsa, bu metot True kts verecektir. Aksi halde, alas s ca mz kt False olacaktr: g
>>> a = " >>> a.isspace() True >>> a = "selam!" >>> a.isspace() False >>> a = "" >>> a.isspace() False "

Son rnekten de grd mz gibi, bu metodun True kts verebilmesi iin karakter dizisi g iinde en az bir adet boluk karakteri olmas gerekiyor. s

16.5.3 Metotlarda Trke Karakter Sorunu


Yukarda anlatt mz be metodu kullanrken bir sey dikkatinizi ekmi olmal. Karakter g s s dizilerinin upper(), lower(), title(), capitalize() ve swapcase() adl metotlar, iinde Trke karakterler geen karakter dizilerini dntrmede sorun karabiliyor. Mesela su rneklere s bir bakalm:
>>> a = "ekerli ay" s >>> print a.capitalize() s ekerli ay

Grd nz gibi, ekerli ay karakter dizisinin ilk har olan de herhangi bir de iiklik olg s s gs mad. Halbuki capitalize() metodunun bu har bytmesi gerekiyordu. Bu problemi su sekilde aabiliriz: s
>>> a = u"ekerli ay" s >>> print a.capitalize() S ekerli ay

Burada ekerli ay karakter dizisini unicode olarak tanmladk. Bylece capitalize() metodu s bu karakter dizisinin ilk harni do ru bir sekilde bytebildi. g Ayn sorun teki metotlar iin de geerlidir:
>>> a = "ekerli ay" s >>> print a.upper() #"EKERLI AY" vermeli. S s EKERLI AY >>> print a.title() #"ekerli ay" vermeli. S s Ekerli Ay >>> a = "EkErLi Ay" s >>> print a.swapcase() #"eKeRlI aY" vermeli. S s eKeRlI aY >>> a = "EKERL AY" S I >>> print a.lower() #"ekerli ay" vermeli. s S ekerl ay I

Yukardaki sorunlarn o unu, ilgili karakter dizisini unicode olarak tanmlayarak giderebiliriz: g
>>> a = u"ekerli ay" s >>> print a.title() S ekerli ay

Ancak karakter dizisini unicode olarak tanmlamann dahi ie yaramayaca bir durum da s g vardr. Trkedeki i har hibir dnmde sonucunu vermez... rne in: s I g
>>> a = u"ekerli ay" s >>> print a.upper() S EKERLI AY >>> a = "EkErLi Ay" s >>> print a.swapcase() S eKeRlI aY

Grd nz gibi, i harnin byk hali yanl bir sekilde I oluyor. Ayn biimde I har de g s kltld nde harni de il, i harni verecektir: g g
>>> a = u"ISLIK" >>> print a.lower() islik

Bu sorunlar zebilmek iin, kendi metotlarnz icat etmeyi deneyebilirsiniz. rne in Trke g karakterleri dzgn bir sekilde bytebilen bir tr_upper() fonksiyonu tanmlayabilirsiniz:
# -*- coding: utf-8 -* lst = {u"i": u"I", u"": u"I"} def tr_upper(kardiz): for i in lst: if i in kardiz: return kardiz.replace(i, lst[i]).upper() return kardiz.upper()

Buradaki replace() metodunu biraz sonra ileyece iz... s g Gelin isterseniz bu Trke sorunu ile ilgili bir rnek daha gsterelim:
>>> c = "Gn Bugndr" >>> c.istitle() False

Halbuki sonucun True olmas gerekiyordu, de il mi? Peki sizce neden byle oldu? Evet, tahmin g etti iniz gibi, karakter dizisinin iinde Trkeye zg harer oldu u iin metodumuz yanl g g s sonu verdi. Simdi bunu dzeltmeyi renece iz. Ama nce isterseniz Trke karakterlerin g g bazen nasl sonular do urabilece ine bir rnek verelim: g g
>>> d = "gn bugndr" >>> print d.title() GN BugNdR

Grd nz gibi Trke karakterler, title metodunun tamamen kontrolden kmasna, ksa deg vre yapmasna yol at!... Normalde title() metodunun ne yapmas gerekti ini biliyoruz: g

>>> e = "armut bir meyvedir" >>> e.title() Armut Bir Meyvedir

Yukarda grd mz, Trke karakterler barndran rnekte ise title() metodu karakter dizisi g iindeki kimi hareri bytt, kimi hareri ise kk brakt! Bu durumu nasl dzeltece imizi biliyorsunuz: g
>>> c = u"Gn Bugndr" >>> c.istitle() True

Burada karakter dizisini unicode olarak tanmlad mza dikkat edin. Bu defa metotlarn sorung suz iledi ini greceksiniz. s g

16.5.4 Saga-Sola Yaslama slemleri I


Pythonda karakter dizilerini sa a-sola yaslama ilemleri iin kullanabilece imiz farkl metot g s g bulunur. Bunlar syle sralayabiliriz: center() metodu Karakter dizilerinin sa nda ve solunda, programcnn belirledi i sayda g g boluk brakarak karakter dizisini iki yana yaslar. s ljust() metodu Karakter dizilerinin sa nda boluk brakarak, karakter dizisinin sola yaslang s masn sa lar. g rjust() metodu Karakter dizilerinin solunda boluk brakarak, karakter dizisinin sa a yaslans g masn sa lar. g Gelelim bu metotlarn tam olarak ne ie yarad n renmeye... ncelikle center() metoduns g g dan balayalm. s center() Tanmnda da syledi imiz gibi, center() metodu bir karakter dizisini iki yana yaslamak iin g kullanlr. Gelin isterseniz buna kk bir rnek verelim:
>>> "a".center(15) a

Grd nz gibi, bu metodun parantezi iine yazd mz say karakter dizisinin sa nda ve solg g g unda toplam ne kadar boluk braklaca n gsteriyor. Yalnz burada nemli bir ayrntya dikkas g tinizi ekmek isterim. Parantez iinde gsterilen 15 karakterlik bolu a karakter dizisinin kens g disi de dahildir. Peki bu ne anlama geliyor? Durumu hemen bir rnekle aklamaya alalm: s
>>> kardiz = "istanbul" >>> kardiz.center(5) istanbul

Grd nz gibi, karakter dizisinin sa nda ve solunda herhangi bir boluk olumad. Bunun g g s s nedeni, parantez iinde belirtti imiz 5 saysnn istanbul karakter dizisi iindeki karakter g saysndan az olmasdr. Yani istanbul karakter dizisi bu 5 karakterlik bolu un tamamn s g

zaten kendisi dolduruyor. Dolaysyla karakter dizisinin sa nda ve solunda boluk olabilmesi g s iin en az, karakter dizisinin uzunlu unun bir fazlasn vermemiz gerekiyor. Yani: g
>>> kardiz.center(len("istanbul") + 1) istanbul

Buna gre, istanbul karakter dizisi iinde 8 karakter bulundu u iin bizim en az 9 saysn g kullanmamz gerekiyor:
>>> kardiz.center(9) istanbul

center() metodu bize, boluk yerine kendi belirledi imiz bir karakteri yerletirme imkan da s g s verir:
>>> "istanbul".center(15, "#") ####istanbul###

Bu kt aslnda center() metodunun nasl alt n ok daha net bir sekilde ortaya koyuyor. s g Dikkat ederseniz ktda toplam 15 karakter var. Bunlardan drt tanesi bizim belirledi imiz g # karakteri, 8 tanesi istanbul karakter dizisini oluturan karakterler, 3 tanesi ise yine bizim s belirledi imiz # karakteri... g Grd nz gibi, parantez iinde belirtti imiz say braklacak boluktan ziyade, bir karakg g s ter dizisinin ne kadar yer kaplayaca n gsteriyor. Yani mesela yukardaki rne i gz nne g g alrsak, asl karakter dizisi (istanbul) + 7 adet # iareti = 15 adet karakter dizisinin yers letirildi ini gryoruz. E er karakter dizimiz, 15 harften olusayd, parantez iinde verdi imiz s g g s g 15 says hi bir ie yaramayacakt. Byle bir durumda, # iaretini ktda gsterebilmek iin s s parantez iinde en az 16 saysn kullanmamz gerekirdi. Gelelim ljust() metoduna... ljust() Tanmnda da belirtti imiz gibi bu metot, karakter dizilerinin sa nda boluk brakarak, karakter g g s dizisinin sola yaslanmasn sa lar: g
>>> "istanbul".ljust(15) istanbul

Tpk center() metodunda oldu u gibi, bunun parametrelerini de istedi imiz gibi dzenleyeg g biliriz:
>>> "istanbul".ljust(15, "#") istanbul#######

Son olarak rjust() metodunu inceleyelim. rjust() Bu metot ljust()n tersidir. Yani karakter dizilerini sa a yaslar: g

>>> "istanbul".rjust(15, "#") #######istanbul

Sa a-sola yaslama ilemleri iin kullanlan bu metotlar iinde zellikle ljust() ve rjust() epey g s iinize yarayacak. Mesela bu metotlar kullanarak tablovari grnmler elde edebilirsiniz: s
#!/usr/bin/env python # -*- coding: utf-8 -*distro = ["Ubuntu", "Debian", "SuSe", "Pardus", "Fedora", "PCLinuxOS", "Arch", "Gentoo", "Hadron", "Truva", "Gelecek", "Mandriva", "Sabayon", "Mint", "Slackware", "Mepis", "CentOS", "Puppy", "GnewSense", "Ututo", "Red Hat", "Knoppix", "BackTrack", "Karoshi", "Kongoni", "DreamLinux", "Yoper", "Slax"] for k, v in enumerate(distro): if k % 4 == 0: print print "%s"%(v.ljust(15)),

Bu kodlar altrd mzda syle bir kt elde ederiz: s g


Ubuntu Fedora Hadron Sabayon CentOS Red Hat Kongoni Debian PCLinuxOS Truva Mint Puppy Knoppix DreamLinux SuSe Arch Gelecek Slackware GnewSense BackTrack Yoper Pardus Gentoo Mandriva Mepis Ututo Karoshi Slax

Son satrdaki ljust() metodu yerine rjust() metodunu kullanrsak ayn kodlar syle bir kt verir:
Ubuntu Fedora Hadron Sabayon CentOS Red Hat Kongoni Debian PCLinuxOS Truva Mint Puppy Knoppix DreamLinux SuSe Arch Gelecek Slackware GnewSense BackTrack Yoper Pardus Gentoo Mandriva Mepis Ututo Karoshi Slax

Grd nz gibi, bu defa tablo eleri sa a yasland. Bu eleri ekrana ortalamak iin ise g g g g center() metodunu kullanabilece imizi biliyorsunuz. Mesela son satr syle yazalm: g
print "%s"%(v.center(15, "~")),

Bu sekilde syle bir kt elde ederiz:


~~~~~Ubuntu~~~~ ~~~~~Fedora~~~~ ~~~~~Hadron~~~~ ~~~~Sabayon~~~~ ~~~~~CentOS~~~~ ~~~~Red Hat~~~~ ~~~~Kongoni~~~~ ~~~~~Debian~~~~ ~~~PCLinuxOS~~~ ~~~~~Truva~~~~~ ~~~~~~Mint~~~~~ ~~~~~Puppy~~~~~ ~~~~Knoppix~~~~ ~~~DreamLinux~~ ~~~~~~SuSe~~~~~ ~~~~~~Arch~~~~~ ~~~~Gelecek~~~~ ~~~Slackware~~~ ~~~GnewSense~~~ ~~~BackTrack~~~ ~~~~~Yoper~~~~~ ~~~~~Pardus~~~~ ~~~~~Gentoo~~~~ ~~~~Mandriva~~~ ~~~~~Mepis~~~~~ ~~~~~Ututo~~~~~ ~~~~Karoshi~~~~ ~~~~~~Slax~~~~~

16.5.5 Sfrla Doldurma


zll() Yukarda bahsetti imiz ljust(), rjust() gibi metotlar yardmyla karakter dizilerinin sa n-solunu g g istedi imiz karakterlerle doldurabiliyorduk. Karakter dizilerinin metotlar arasnda yer alan g zll() adl bir metot yardmyla da bir karakter dizisinin soluna istedi imiz sayda 0 yerletireg s biliriz:
>>> a = "8" >>> a.zfill(4) 0008

zll() metodunun kullanmyla ilgili syle bir rnek verebiliriz:


import time while True: for i in range(21): time.sleep(1) print str(i).zfill(2) while i > 20: continue

s 16.5.6 Karakter Degi tirme


replace() Pythondaki karakter dizisi metotlar iinde belki de en ok iimize yarayacak metotlardan birisi s de bu replace() metodudur. replace kelimesi Ingilizcede de itirmek, yerine koymak gibi gs anlamlara gelir. Dolaysyla anlamndan da anlalaca gibi bu metot yardmyla bir karakter s g dizisi iindeki karakterleri baka karakterlerle de itiriyoruz. Metot su forml zerine iler: s gs s
karakter_dizisi.replace("eski_karakter", "yeni_karakter")

Hemen bir rnek vererek durumu somutlatralm: s


>>> karakter = "Kahramanmaral Abdullah" s >>> print karakter.replace("a", "o") Kohromonmorol Abdulloh s

Grd nz gibi, replace() metodu yardmyla karakter dizisi iindeki btn a harerini g kaldrp yerlerine o harni koyduk. Burada normalde print deyimini kullanmasak da olur, ama karakter dizisi iinde Trkeye zg harer oldu u iin, e er :keywordprint deyimini g g kullanmazsak ktda bu harer bozuk grnecektir. Bu metodu, isterseniz bir karakteri silmek iin de kullanabilirsiniz. O zaman syle bir sey yapmamz gerekir:
>>> karakter = "Adanal istihza" >>> karakter_dgs = karakter.replace("a", "") >>> print karakter_dgs Adnl istihz

Burada bir karakteri silmek iin ii bo bir karakter dizisi oluturdu umuza dikkat edin. s s g replace() metodunun, yukardaki formlde belirtmedi imiz nc bir parametresi daha vardr. g Dikkat ettiyseniz, yukardaki kod rneklerinde replace metodu karakter dizisi iindeki bir karakteri, dizi iinde geti i her yerde de itiriyordu. Yani rne in a.replace("b", "c") g gs g dedi imizde, a de ikeninin saklad karakter dizisi iinde ne kadar b har varsa bunlarn g gs g hepsi cye dnyor. Bahsetti imiz nc parametre yardmyla, karakter dizisi iinde s g geen harerin ka tanesinin de itirilece ini belirleyebiliyoruz: gs g
>>> karakter = "Adanal istihza" >>> karakter_dgs = karakter.replace("a", "", 2) >>> print karakter_dgs Adnl istihza

Burada, Adanal istihza karakter dizisi iinde geen a harerinden 2 tanesini siliyoruz. a har ile A harnin Pythonun gznde birbirlerinden farkl iki karakterler oldu unu unutg mayn...

16.5.7 Karakter Dizilerinin Ba lang ve Biti Degerlerini Sorgulama s s


Pythonda karakter dizilerinin en bandaki ve en sonundaki karakterler zerinde ilem yapas s bilmemizi sa layan iki farkl metot bulunur. Bunlardan birincisi startswith() metodudur. g startswith() Bu metot yardmyla bir karakter dizisinin belirli bir harf veya karakterle balayp balamad n s s g denetleyebiliyoruz. rne in: g
>>> a = "elma" >>> a.startswith("e") True >>> b = "armut" >>> a.startswith("c") False

Grld gibi e er bir karakter dizisi parantez iinde belirtilen harf veya karakterle balyorsa, g g s yani bir karakter dizisinin ilk har veya karakteri parantez iinde belirtilen harf veya karakterse do ru anlamna gelen True ktsn; aksi halde ise yanl anlamna gelen False ktsn g s elde ediyoruz. Bu metot sayesinde karakter dizilerini ilk harerine gre sorgulayp sonuca gre istedi imiz g ilemleri yaptrabiliyoruz: s
>>> liste = ["elma", "erik", "ev", "elbise", "karpuz", "armut", "kebap"] >>> for i in liste: ... if i.startswith("e"): ... i.replace("e", "i") ... ilma irik iv ilbisi

Sizin bu metodu kullanarak daha faydal kodlar yazaca nza inanyorum... g endswith() endswith(), yukarda anlatt mz startswith() metodunun yapt iin tam tersini yapyor. g g s Hatrlarsanz startswith() metodu ile, bir karakter dizisinin hangi hare balad n denetliyors g duk. ste bu endswith() metodu ile ise karakter dizisinin hangi hare bitti ini denetleyece iz. I g g Kullanm startswith() metoduna ok benzer:
>>> a = "elma" >>> a.endswith("a") True >>> b = "armut" >>> a.endswith("a") False

Bu metot yardmyla, cmle sonlarnda bulunan istemedi iniz karakterleri ayklayabilirsiniz: g


>>> >>> >>> >>> kd1 kd2 kd3 kd4 = = = = "ekmek elden su glden!" "sakla saman gelir zaman!" "karga karga gak dedi..." "Vay vicdanszlar..."

>>> for i in kd1, kd2, kd3, kd4: ... if i.endswith("!"): ... print i.replace("!", "") ... ekmek elden su glden sakla saman gelir zaman

16.5.8 Karakter Dizilerini Sayma


count() count() metodu bize bir karakter dizisi iinde bir karakterden ka adet bulundu unu g denetleme imkan verecek. Laf uzatmadan bir rnek verelim:
>>> besiktas = "Sinan Paa Pasaj" s >>> besiktas.count("a") 5

Demek ki Sinan Paa Pasaj karakter dizisi iinde 5 adet a har varm... s s Simdi bu metodun nerelerde kullanlabilece ine ilikin bir rnek verelim: g s
# -*-coding: utf-8 -*while True: #replace metodu ile karakter dizisi iindeki #boluklar siliyoruz. s soru = raw_input("Bir karakter dizisi giriniz: ").replace(" ", "")

#Kmeleri kullanarak, karakter dizisi iindeki #ift eleri teke indiriyoruz g ortak = set(soru) #ortak kmesi iindeki eleri karakter dizisi g #iinde kaar adet getiini buluyoruz. g for i in ortak: print "%s harfinden = => %s tane" %(i, soru.count(i))

Yukardaki almada kullancdan herhangi bir karakter dizisi girmesini istiyoruz. Kodlarmz s bize, kullancnn girdi i karakter dizisi iinde her bir harften ka tane oldu unu sylyor. g g

16.5.9 Karakter Dizilerinin Niteligini Sorgulama


Karakterleri e ayrarak inceleyebiliriz: 1. alfabetik karakterler 2. nmerik karakterler 3. alfanmerik karakterler Alfabetik karakterler, adndan da az ok anlalaca gibi, alfabedeki harerin ta kendisidir. s g Mesela a, b, e, j, vb... Saylar ve _?=* gibi simgeler alfabetik de ildir. g isalpha() Bir karakterin alfabetik olup olmad n anlamak iin Pythonda isalpha() adl bir metottan g yararlanabiliriz:
>>> "a".isalpha() True

Demek ki a, alfabetik bir karakter dizisi imi. Bir de suna bakalm: s


>>> "1".isalpha() False

Demek ki 1 alfabetik bir karakter de ilmi. g s Syle bir rnek vererek durumu biraz daha netletirelim: s
>>> for i in "abc234_?=*jkl": ... if i.isalpha(): ... print "%s alfabetik bir karakter dizisidir"%i ... else: ... print "%s alfabetik bir karakter dizisi deildir"%i g ... a alfabetik bir karakter dizisidir. b alfabetik bir karakter dizisidir. c alfabetik bir karakter dizisidir. 2 alfabetik bir karakter dizisi deildir. g 3 alfabetik bir karakter dizisi deildir. g 4 alfabetik bir karakter dizisi deildir. g

_ ? = * j k l

alfabetik alfabetik alfabetik alfabetik alfabetik alfabetik alfabetik

bir bir bir bir bir bir bir

karakter karakter karakter karakter karakter karakter karakter

dizisi deildir. g dizisi deildir. g dizisi deildir. g dizisi deildir. g dizisidir. dizisidir. dizisidir.

Ancak burada dikkat edilmesi gereken bir nokta var. Mesela su rne e bir bakalm: g
>>> "".isalpha() g False

Grd nz gibi, isalpha() metodu Trke karakterleri do ru de erlendiremiyor. Bu sorunun g g g stesinden gelmek iin Trke karakter dizilerini unicode olarak tanmlamanz gerekir:
>>> u"".isalpha() g True

Sadece tek bir karakterin de il, birden fazla karakterden oluan dizilerin alfabetik olup olg s mad n da denetleyebiliriz. rne in: g g
>>> "istihza".isalpha() True

Burada istihza karakter dizisi tamamen alfabetik karakterlerden olutu u iin, istihza kes g limesi alfabetiktir, diyoruz. . . Bir de suna bakalm:
>>> "istihza.com".isalpha() False

istihza.com karakter dizisi iinde alfabetik olmayan bir karakter bulundu u iin (. karakg teri), bu karakter dizisi alfabetik de ildir. Dolaysyla bir karakter dizisinin alfabetik olabilmesi g iin, o karakter dizisini oluturan btn karakterlerin alfabetik olmas gerekir. Tek bir alfabetik s olmayan karakter dizisi dahi ii bozar. s Bu arada, iinde Trke karakterler geen bir karakter dizisinin alfabetik olup olmad n g denetlerken bu karakter dizisini unicode olarak tanmlamay unutmuyoruz:
>>> "k".isalpha() s False

Do rusu syle olacak: g


>>> u"k".isalpha() s True

Gelelim nmerik karakterlere...

isdigit() Nmerik karakterler alfabetik karakterlerin tersidir. Buna gre, saylar temsil eden karakterlere nmerik ad verilir. rne in 1, 2, 5, 10, 20 saylar nmerik karakterlerdir. g Bir karakterin nmerik olup olmad n isdigit() metodunu kullanarak denetleyebiliriz: g
>>> "1".isdigit True

Ama:
>>> "a".isdigit() False

Alfabetik karakter dizilerindeki ya hep ya hi kural nmerik karakter dizileri iin de geerlidir. Yani bir karakter dizisinin nmerik olabilmesi iin, o karakter dizisini oluturan btn karaks terlerin nmerik olmas gerekir. Tek bir nmerik olmayan karakter dahi, o karakter dizisinin nmerik olmamasna yol aacaktr. . . Sra geldi alfanmerik karakterlere... isalnum() Alfanmerik karakterler, yukarda anlatt mz alfabetik ve nmerik karakterlerinin birleimidir. g s Yani iinde hem alfabetik hem de nmerik karakterler barndran dizilere alfanmerik karakter dizileri ad verilir. Tabii sadece alfabetik ve sadece nmerik karakterler barndran diziler de ayn zamanda birer alfanmerik karakter dizisidir. . . Tek bir karakter iin konumak gerekirse, alfabetik veya nmerik olan karakterlere alfanmerik s ad verilir. Bir karakterin alfanmerik olup olmad n Pythondaki isalnum() adl metot yardmyla g denetleyebiliriz. Dilerseniz bu aklamalar birka rnekle talandralm:
>>> "a".isalnum() True

Demek ki a, alfanmerik bir karaktermi. s


>>> "1".isalnum() True

Demek ki 1 de alfanmerik bir karaktermi. . . s Buradan su sonular karabiliriz:


Btn alfabetik karakterler ayn zamanda birer alfanmerik karakterdir. Btn nmerik karakterler de ayn zamanda birer alfanmerik karakterdir. Btn alfanmerik karakterler ayn zamanda birer alfabetik karakter OLMAYAB ILIR. Btn alfanmerik karakterler ayn zamanda birer nmerik karakter de OLMAYAB ILIR.

Birden fazla karakterden oluan dizilerin durumuna da bakalm isterseniz: s

>>> "abc124".isalnum() True >>> "istihza.com".isalnum() False

Grd nz gibi, istihza.com karakter dizisi iindeki . karakterinden tr karakter dizg imiz alfanmerik olma zelli i tayamyor. Bir karakter dizisinin alfanmerik olabilmesi iin, g s barndrd btn karakterlerin alfanmerik olmas gerekir. . . g

16.5.10 Sekme Bo luklarn Geni letme s s


expandtabs() expandtabs() adl bir metot yardmyla karakter dizileri iindeki sekme boluklarn geniletes s biliyoruz: rne in: g
>>> a = "elma\tbir\tmeyvedir" >>> print a.expandtabs(10) elma bir meyvedir

16.5.11 Karakter Konumu Bulma


Pythonda bir karakterin karakter dizisi iinde hangi konumda yer ald n bulabilmek iin drt g farkl metottan yararlanyoruz. Bunlar nd(), rnd(), index() ve rindex() metotlardr. ncelikle nd() metodundan balayalm. s nd() Bu metot, bir karakterin, karakter dizisi iinde hangi konumda yer ald n sylyor bize: g
>>> a = "armut" >>> a.find("a") 0

nd() metodu karakter dizilerini soldan sa a do ru okur. Dolaysyla e er arad mz karakter g g g g birden fazla sayda bulunuyorsa, ktda yalnzca en soldaki karakter grnecektir:
>>> b = "adana" >>> a.find("a") 0

Grd nz gibi, nd() metodu yalnzca ilk a harni gsterdi. g E er arad mz karakter, o karakter dizisi iinde bulunmuyorsa, ktda -1 sonucu g g grnecektir:

>>> c = "mersin" >>> c.find("t") -1

nd() metodu bize ayn zamanda bir karakter dizisinin belli noktalarnda arama yapma imkan da sunar. Bunun iin syle bir szdizimini kullanabiliriz:
>>> "karakter_dizisi".find("aranacak_karakter",balang_noktas,biti_noktas) s s

Bir rnek verelim:


>>> a = "adana"

Burada normal bir sekilde a harni arayalm:


>>> a.find("a") 0

Do al olarak nd() metodu karakter dizisi iinde ilk buldu u a harnin konumunu syleyeg g cektir. Bizim rne imizde a har kelimenin banda geti i iin ktda 0 ifadesini gryg s g oruz. Demek ki bu karakter dizisi iinedeki ilk a har 0nc konumdaym. s Istersek syle bir arama yntemi de kullanabiliriz:
>>> a.find("a", 1, 3)

Bu arama yntemi su sonucu verecektir:


2

Bu yntemle, a harni, karakter dizisinin 1 ve 3. konumlarnda aryoruz. Bu biimin ileyii, s s daha nceki derslerimizde grd mz dilimleme ilemine benzer: g s
>>> a[1:3] "da"

Peki bir karakter dizisi iinde geen herhangi bir karakterin, o karakter dizisi iinde geti i g btn konumlar bulmann bir yolu var m? Elbette var. Bunun iin syle bir sey yazabilirsiniz:
# -*- coding: utf-8 -*def nerede(kardiz, harf): lst = [] for i in range(len(kardiz)): lst.append(kardiz.find(harf, i)) final = set(lst) for o in final: if int(o) > -1: print o,

Bu fonksiyonu syle kullanyoruz:


nerede(u"kahramanmara", "a") s

Bylece kahramanmara karakter dizisi iindeki a harerinin hangi konumlarda yer ald n s g bulmu olduk... Ayn sekilde izmir karakter dizisi iindeki i harerinin konumunu sorgulays alm:
nerede(u"izmir", "i")

Bununla ilgili kendi kendinize baz denemeler yaparak, ileyii tam anlamyla kavrayabilirsiniz. s s rnd() Pythonda karakter dizisi iindeki karakterlerin konumunu bulmak iin kullanabilece imiz ikinci g fonksiyonumuz rnd() fonksiyonudur. Bu metot yukarda anlatt mz nd() metodu ile ayn ii g s yapar. Tek farkl karakter dizilerini sa dan sola do ru okumasdr. g g nd() metodu karakter dizilerini soldan sa a do ru okur. Mesela: g g
>>> a = "adana" >>> a.find("a") 0

rnd() metodu ise karakter dizilerini sa dan sola do ru okur. Mesela: g g


>>> a.rfind("a") 4

Grd nz gibi, rnd() metodu karakter dizisini sa dan sola do ru okudu u iin ncelikle en g g g g sondaki a harni dndrd. index() Konum bulma ilemleri iin kullanabilece imiz nc metodumuz olan index() metodu da s g yukarda anlatt mz nd() metoduna ok benzer. metot da ayn ii yapar: g Iki s
>>> a = "istanbul" >>> a.index("t") 2

Bu metot da bize, tpk nd() metodunda oldu u gibi, konuma gre arama olana sunar: g g
>>> b = "kahramanmara" s >>> b.index("a", 8, 10) 9

Demek ki, b de ikeninin tuttu u karakter dizisinin 8 ve 10 numaral konumlar arasnda a gs g har 9. srada yer alyormu.... s Peki bu index() metodunun nd() metodundan fark nedir? Hatrlarsanz nd() metodu arad mz karakteri bulamad zaman -1 sonucunu veriyordu. g g index() metodu ise aranan karakteri bulamad zaman bir hata mesaj gsterir bize. rne in: g g
>>> c = "istanbul" >>> c.index("m")

Bu kodlar su kty verir:


Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: substring not found

rindex() Konum bulma ilemlerinde kullanaca mz son metodumuz ise rindex() metodudur. Bu metot, s g index() metodu ile ayndr. Farklar, rindex() metodunun karakter dizisini sa dan sola do ru; g g index() metodunun ise soldan sa a do ru okumasdr: g g
>>> c = "adana" >>> c.index("a") 0 >>> c.rindex("a") 4

16.5.12 join() metodu


join() metodu, karakter dizisi metotlar arasnda bulunan en nemli ve en yaygn kullanlan metotlardan biridir. O yzden bu metodu hakkyla renmenizde byk yarar var... g Bu metodu aklamak biraz zor ve kafa kartrc olabilir. O yzden aklama yerine do rudan s g bir rnekle, bu metodun ne ie yarad n gstermeye alalm. s g s Syle bir karakter dizimiz olsun:
>>> a = "Linux"

Simdi syle bir ilem yapalm: s


>>> ".".join(a)

Elde edece imiz kt syle olur: g


L.i.n.u.x

Sanrm burada join() metodunun ne i yapt anlalyor. Linux karakter dizisi iindeki btn s g s karakterlerin arasna birer tane . (nokta) koydu. Tabii ki, nokta yerine baka karakterler de s kullanabiliriz:
>>> "*".join(a) L*i*n*u*x

Dikkat ederseniz join() metodunun szdizimi teki metotlarnkinden biraz farkl. Bu metotta parantez iine do rudan de ikenin kendisi yazdk. Yani a.join("*") gibi bir sey yazmyoruz. g gs Bu metot yardmyla ayrca listeleri de karakter dizisine evirebiliriz. Mesela elimizde syle bir liste olsun:
>>> a = ["python", "php", "perl", "C++", "Java"]

Bu listenin elerini tek bir karakter dizisine dntrmek iin su kodu kullanyoruz: g s

>>> "; ".join(a) python; php; perl; C++; Java

Istersek bu kodu bir de iken iinde depolayp kalc hale de getirebiliriz: gs


>>> b = "; ".join(a) >>> print b python; php; perl; C++; Java

En bataki a adl liste de bylece bozulmadan kalm olur: s s


>>> print a [python, php, perl, C++, Java]

Hatrlarsanz biz bu metodu aslnda daha nce de farkl yerlerde kullanmtk. Mesela Mods ller konusunu anlatrken de grmtk bu join() adl metodu... Orada bunu os.sep.join() s seklinde kullanmtk. s
>>> import os >>> yol = ["home", "istihza", "Desktop"] >>> os.sep.join(yol) home/istihza/Desktop

Veya:
>>> yol = ["C:", "Program Files", "Python26"] >>> os.sep.join(yol) C:\\Program Files\\Python26

Bu kodlar srasyla syle de yazabilirdik:


>>> yol = ["home", "istihza", "Desktop"] >>> "/".join(yol) /home/istihza/Desktop/ >>> yol = ["C:", "Program Files", "Python26"] >>> "\\".join(yol) C:\\Program Files\\Python26

Hatrlarsanz bu blmn banda syle bir rnek vermitik: s s


>>> a = "" >>> for i in range(10): ... a += str(i) ... >>> print a

Bu rnek, karakter dizilerinin nasl birletirilece ini gsteriyordu. s g yardmyla ok daha verimli bir biimde de yapabiliriz:
>>> "".join([str(i) for i in range(10)]) 0123456789

Ayn seyi join() metodu

Grd nz gibi, iimizi tek satrda hallettik. Bu rnekteki sz dizimi size biraz tuhaf grnm g s s olabilir. Ama hi endie etmeyin. Liste reteleri konusunu ilerken bu sz dizimini ok daha s s ayrntl bir sekilde inceleyece iz. g

16.5.13 translate metodu


Bu metot, karakter dizisi metotlar iindeki en karmak metotlardan birisi olmakla birlikte, zor s ileri halletmekte kullanlabilecek olmas asndan da bir hayli faydal bir metottur. s translate() metodu yardmyla mesela sifreli mesajlar zebiliriz. Yalnz bu metodu string mod lndeki maketrans() adl fonksiyonla birlikte kullanaca z. Bir rnek verelim. g Elimizde syle bir karakter dizisi olsun:
"tbyksr sn jcho elu gloglu"

Bu sifreli mesaj zmek iin de syle bir ipucumuz var diyelim: t = => p s = => o m = => j Elimizdeki ipucuna gre sifreli mesajdaki t harnin karl p olacak. Alfabetik olarak s g dnrsek: s t har, p harne gre, 5 harf geride kalyor (p, r, s, s, t) s har o harne gre 5 harf geride kalyor (o, , p, r, s) j har m harne gre 4 harf geride kalyor (j, k, l, m) Bu karmn bizi bir yere gtrmeyece i ak. nk harer arasnda ortak bir iliki bulamadk. g s Peki ya alfabedeki Trke karakterleri yok sayarsak? Bir de yle deneyelim: t har, p harne gre, 4 harf geride kalyor (p, r, s, t) s har o harne gre 4 harf geride kalyor (o, p, r, s) j har m harne gre 4 harf geride kalyor (j, k, l, m) Bylece karakterler arasndaki ilikiyi tespit etmi olduk. Simdi hemen bir metin dzenleyici s s ap kodlarmz yazmaya balayabiliriz: s
# -*- coding: utf8 -*-

Bu satr aklamaya gerek yok. Ne oldu unu biliyoruz: g


import string

Python modlleri arasndan string modln ie aktaryoruz (import):


metin = "tbyksr sn jcho elu gloglu"

Sifreli metnimizi bir de ikene atayarak sabitliyoruz: gs


kaynak= "defghijklmnoprstuvyzabc" hedef = "abcdefghijklmnoprstuvyz"

Burada kaynak, sifreli metnin yapsn; hedef ise alfabenin normal yapsn temsil ediyor. kaynak adl de ikende d harnden balamamzn nedeni yukarda kefetti imiz harergs s s g aras ilikidir. Dikkat ederseniz, hedefteki hareri, kaynaktaki harere gre, her bir harf s drt sra geride kalacak sekilde yazdk. (d -> a, e ->b, gibi...) Dikkat edece imiz bir baka g s nokta ise bunlar yazarken Trke karakter kullanmamamz gerekti idir: g
cevir = string.maketrans(kaynak,hedef)

Burada ise, yukarda tanmlad mz harf kmeleri arasnda bir evrim ilemi balatabilmek g s s iin string modlnn maketrans() adl fonksiyonundan yararlanyoruz. Bu komut, parantez iinde gsterdi imiz kaynak de ikenini hedef de ikenine eviriyor; aslnda bu iki harf kmesi g gs gs arasnda bir iliki kuruyor. Bu ilem sonucunda kaynak ve hedef de ikenleri arasndaki ilikiyi s s gs s gsteren bir forml elde etmi olaca z: s g
soncevir = metin.translate(cevir)

Bu komut yardmyla, yukarda cevir olarak belirledi imiz forml, metin adl karakter dizig sine uyguluyoruz:
print soncevir

Bu komutla da son darbeyi vuruyoruz. Simdi bu komutlara topluca bir bakalm:


# -*- coding: utf8 -*import string metin = "tbyksr sn jcho elu gloglu" kaynak= "defghijklmnoprstuvyzabc" hedef = "abcdefghijklmnoprstuvyz" cevir = string.maketrans(kaynak,hedef) soncevir = metin.translate(cevir) print soncevir

Bu program komut satrndan altrd nzda ne elde ettiniz? s g

16.5.14 Karakter Dizilerini Paralarna Ayrma


Pythonda karakter dizilerini paralarna ayrmak iin iki metottan yararlanaca z. Bunlar parg tition() ve rpartition() adl metotlar. nce partition() metoduna bakalm. partition() Bu metot yardmyla bir karakter dizisini belli bir lte gre e blyoruz. rne in: g
>>> a = "istanbul" >>> a.partition("an") (ist, an, bul)

E er partition() metoduna parantez iinde verdi imiz lt karakter dizisi iinde bulunmuyorsa g g su sonula karlarz: s s

>>> a = "istanbul" >>> a.partition("h") (istanbul, , )

rpartition() rpartition() metodu da partition() metodu ile ayn ii yapar, ama yntemi biraz farkldr. partis tion() metodu karakter dizilerini soldan sa a do ru okur. rpartition() metodu ise sa dan sola g g g do ru.. Peki bu durumun ne gibi bir sonucu vardr? Hemen grelim: g
>>> b = "istihza" >>> b.partition("i") (, i, stihza)

Grd nz gibi, partition() metodu karakter dizisini ilk i harnden bld. Simdi ayn ilemi g s rpartition() metodu ile yapalm:
>>> b.rpartition("i") (ist, i, hza)

rpartition() metodu ise, karakter dizisini sa dan sola do ru okudu u iin ilk i harnden de il, g g g g son i harnden bld karakter dizisini... partition() ve rpartition() metotlar, ltn karakter dizisi iinde bulunmad durumlarda da g farkl tepkiler verir:
>>> b.partition("g") (istihza, , ) >>> b.rpartition("g") (, , istihza)

Grd nz gibi, partition() metodu bo karakter dizilerini sa a do ru yaslarken, rpartition() g s g g metodu sola do ru yaslad. g

16.5.15 Karakter Dizilerini Krpma


Pythonda karakter dizilerini krpmak iin farkl metottan yararlanaca z. Bunlar strip(), g rstrip() ve lstrip(). Inceleyece imiz ilk metot strip(). g strip() Bu metot bir karakter dizisinin banda (solunda) ve sonunda (sa nda) yer alan boluk ve yeni s g s satr (\n) gibi karakterleri siler:
>>> a = " boluk " s >>> a.strip()

boluk s >>> b = "boluk\n" s >>> b.strip() boluk s

rstrip() rstrip() metodu bir karakter dizisinin sadece sonunda (sa nda) yer alan boluk ve yeni satr g s (\n) gibi karakterleri siler:
>>> a = "boluk " s >>> a.rstrip() boluk s >>> b = "boluk\n" s >>> b.rstrip() boluk s

lstrip() lstrip() metodu ise bir karakter dizisinin sadece banda (solunda) yer alan boluk ve yeni satr s s (\n) gibi karakterleri siler:
>>> a = " boluk" s >>> a.lstrip() boluk s >>> b = "\nboluk" s >>> b.lstrip() boluk s

16.5.16 Karakter Dizilerini Blme


Bu blmde, karakter dizilerini blmeye yarayan farkl metottan sz edece iz. Bunlar g split(), rsplit() ve splitlines(). split() Karakter dizisini soldan sa a do ru okuyarak liste haline getirir. g g rsplit() Karakter dizisini sa dan sola do ru okuyarak liste haline getirir. g g splitlines() Karakter dizisini satr sonlarndan blerek liste haline getirir. Anlatmaya nce split() metodundan balayalm. s split() Bu metot biraz join() metodunun yapt ii tersine evirmeye benzer. Hatrlarsanz join() g s metodu yardmyla bir listenin elerini karakter dizisi halinde sralayabiliyorduk: g

>>> a = ["Debian", "Pardus", "Ubuntu", "SuSe"] >>> b = ", ".join(a) >>> print b Debian, Pardus, Ubuntu, SuSe

ste split() metoduyla bu ilemi tersine evirebiliriz: I s


>>> yeni = b.split(",") >>> print yeni [Debian, Pardus, Ubuntu, SuSe]

Burada karakter dizisini, virgllerin oldu u ksmlardan bldk. Bylece her karakter dizisi g farkl bir liste esi haline geldi: g
>>> yeni[0] Debian >>> yeni[1] Pardus >>> yeni[2] Ubuntu >>> yeni[3] SuSe

E er karakter dizisi iinde virgl yoksa, elbette split() metodunu yukardaki sekilde kullanmak g istedi iniz seyi yerine getirmeyecektir: g
>>> kardiz = "Python Programlama Dili" >>> kardiz.split(",") [Python Programlama Dili]

Yukardaki gibi bir karakter dizisi ile kar karya oldu unuzda, bu karakter dizisini virgllerin s s g oldu u ksmlardan de il, boluklarn oldu u ksmlardan blmeniz gerekir: g g s g
>>> kardiz = "Python Programlama Dili" >>> kardiz.split(" ") [Python, Programlama, Dili]

Hatta e er isterseniz karakter dizilerini belli harerin oldu u ksmlardan da blebilirsiniz: g g


>>> kardiz = "Python Programlama Dili" >>> kardiz.split("P") [, ython , rogramlama Dili]

Bu metotta ayrca isterseniz ltn yansra ikinci bir parametre daha kullanabilirsiniz:
>>> b = "Debian, Pardus, Ubuntu, SuSe" >>> c = b.split(",", 1)

>>> print c [Debian, Pardus, Ubuntu, SuSe]

Grd nz gibi, parantez iinde , ltnn yanna bir adet 1 says koyduk. kty dikkag tle inceledi imizde split() metodunun bu parametre yardmyla karakter dizisi iinde sadece bir g adet blme ilemi yapt n gryoruz. Yani oluan listenin bir esi Debian, teki esi de Pars g s g g dus, Ubuntu, SuSe oldu. Bunu su sekilde daha ak grebiliriz:
>>> c[0] Debian >>> c[1] Pardus, Ubuntu, SuSe

Grd nz gibi listenin 0. esi Debian iken; listenin 1. esi Pardus, Ubuntu, Suse ls. g g g Yani bu l tek bir karakter dizisi seklinde tanmlanm. s Yukarda tanmlad mz yeni adl listeyle c adl listenin uzunluklarn karlatrarak durumu g s s daha net grebiliriz:
>>> len(yeni) 4 >>> len(c) 2

Parantez iindeki 1 parametresini de itirerek kendi kendinize denemeler yapmanz metodu gs daha iyi anlamanza yardmc olacaktr. rsplit() Bu blmde inceleyece imiz ikinci metodumuzun ad rsplit(). Bu metot yukarda anlatt mz g g split() metoduna ok benzer. Hatta tamamen ayn ii yapar. Tek bir farkla: split() metodu s karakter dizilerini soldan sa a do ru okurken; rsplit() metodu sa dan sola do ru okur. nce g g g g syle bir rnek verip bu iki metodun birbirine ne kadar benzedi ini grelim: g
>>> a = "www.python.quotaless.com" >>> a.split(".") [www, python, quotaless, com] >>> a.rsplit(".") [www, python, quotaless, com]

Burada www.python.quotaless.com adl karakter dizisini noktalarn oldu u ksmlardan g bldk. Bu rnekte ikisi arasndaki fark pek belli olmasa da, split() metodu soldan sa a do ru okurken, g g rsplit() metodu sa dan sola do ru okuyor. Daha ak bir rnek verelim: g g
>>> orneksplit = a.split(".", 1) >>> print orneksplit

[www, python.quotaless.com] >>> ornekrsplit = a.rsplit(".", 1) >>> print ornekrsplit [www.python.quotaless, com]

Sanrm bu sekilde ikisi arasndaki fark daha belirgin oldu. yle de il diyorsanz bir de suna g bakn:
>>> orneksplit[0] www >>> ornekrsplit[0] www.python.quotaless

splitlines() Bu blmn son metodunun ad splitlines(). Bu metot yardmyla, bir karakter dizisini satr kesme noktalarndan blerek, blnen eleri liste haline getirebiliyoruz: g
>>> satir = "Tahir olmak da ayp deil\nZhre olmak da" g >>> print satir.splitlines() ["Tahir olmak da ayp deil", Zhre olmak da] g

Grd nz gibi, splitlines() metodu karakter dizisini \n ka dizisinin oldu u yerden ikiye g s g bld... Bylece karakter dizisi metotlarn bitirmi olduk. Dikkat ederseniz metot listesi iindeki iki s metodu anlatmadk. Bunlar encode ve decode metotlar... Bunlar unicode konusunu ilerken s anlatmak zere simdilik bir kenara brakyoruz. Bu konuyu iyice sindirebilmek iin kendi kendinize bolca rnek ve denemeler yapmanz, bu konuyu arada srada tekrar etmenizi neririm.

16.6 Blm Sorular


1. Elinizde syle bir liste var:
url_list = [http://www.python.org, http://www.istihza.com, http://www.google.com, http://www.yahoo.com]

Bu listedeki elerin banda bulunan http://www ksmn https:// ile de itirerek syle bir g s gs liste elde edin:
url_list = [https://python.org, https://istihza.com, https://google.com, https://yahoo.com]

Ancak beti in yazm srasnda hi bir aamada ikinci bir liste oluturmayn. slemlerinizi do rug s s I g dan url_list adl liste zerinde gerekletirin. s Hatrlatma: Bir listenin eleri zerinde de iiklik yapmak iin su yolu izliyorduk: g gs
>>> lst = ["Python", "Ruby", "Perl", "C++"] >>> lst[3] = "C" >>> print lst ["Python", "Ruby", "Perl", "C"]

2. Metotlarda Trke Karakter Sorunu bal altnda, Trke karakterleri dzgn bir sekilde s g byten tr_upper() adl bir fonksiyon tanmlamtk. Siz de ayn sekilde Trke karakterleri s dzgn bir sekilde klten tr_lower() adl bir fonksiyon tanmlayn. 3. Konu anlatm srasnda syle bir rnek vermitik: s
#!/usr/bin/env python # -*- coding: utf-8 -*distro = ["Ubuntu", "Debian", "SuSe", "Pardus", "Fedora", "PCLinuxOS", "Arch", "Gentoo", "Hadron", "Truva", "Gelecek", "Mandriva", "Sabayon", "Mint", "Slackware", "Mepis", "CentOS", "Puppy", "GnewSense", "Ututo", "Red Hat", "Knoppix", "BackTrack", "Karoshi", "Kongoni", "DreamLinux", "Yoper", "Slax"] for k, v in enumerate(distro): if k % 4 == 0: print print "%s"%(v.ljust(15)),

Siz bu rne i print yerine, sys modlnde anlatt mz sys.stdout.write() fonksiyonunu g g kullanarak yazn. Bu ikisi arasndaki farklarn ne oldu unu aklayn. g 4. Kullancdan parola belirlemesini isteyen bir betik yazn. Kullanc, belirledi i parolada karakg terler arasnda boluk brakamamal. s 5. Bu blmde syle bir rnek verdi imizi hatrlyorsunuz: g
#!/usr/bin/env python # -*- coding: utf-8 -*sifreli_metin = """saip 1990 ajnjfc v acc yaym k s psnvnvm ccjfc hgnkukkng mjzcm zg fkcokm k fknfk. s g s s s s trb fkbkokk tcfg pnoctj, mpnca rgknogtk zg sphco s s s hgnkukog tygdkk ijbncfjoctj kng cjc v fkn s s s wkfpwt, hv/nkvx zg ocdpt x hkk sgm epm cmnj kungko g s tktgok ybgkfg ecnjucknogmgfk. fpncajtjanc gm k s s s sncpofc hgnkukfkkkb k saip vahvncoctj, ybgkfg g s s s s ike k fgkukmnkm acsocac hggm pnocfc zgac myeym s s fgkukmnkmngng cumc sncponcfc fc ecnjuckngdgmk.""" s g s s s sozluk = {"a": "": "f": "h": "j": "m": "y", "b", "d", "g", "", "k", "b": "d": "g": "": "k": "n": "z", "c", "e", "", g "i", "l", "c": "e": "": g "i": "l": "o": "a", "", "f", "h", "j", "m",

"": "s": "u": "y":

"n", "p", "", s "",

"p": "": s "": "z":

"o", "r": "", "r", "t": "s", "t", "v": "u", "v"}

sifresiz_metin = "" for harf in sifreli_metin: sifresiz_metin += sozluk.get(harf, harf) print sifresiz_metin

Siz simdi bu rne i bir de join() metodunu kullanarak yazmay deneyin. E er yazamazsanz g g endie etmeyin, nk, daha nce de syledi imiz gibi, bu rne i join() metodunu kullanarak s g g rahatlkla yazmanz sa layacak bilgiyi birka blm sonra daha ayrntl bir sekilde edinece iz. g g

BLM

17

Biim Dzenleyiciler

Bu blmde, daha nce sk sk kulland mz, ancak ayrntl bir sekilde hi incelemedi imiz bir g g konudan sz edece iz. Konumuz karakter dizilerinde biim dzenleyiciler. Yabanclar buna g format modiers ad veriyor... Dedi imiz gibi, biz daha nceki konularmzda biim dzenleyicilerden yararlanmtk. g s Dolaysyla yabancs oldu umuz bir konu de il bu. g g Pythonda her trl biim dzenleme ilemi iin tek bir simge bulunur. Bu simge %dir. Biz s bunu daha nceki derslerimizde su sekilde kullanabilece imizi grmtk: g s
>>> print "Benim adm %s" %"istihza"

Burada % adl biim dzenleyiciyi s karakteriyle birlikte kullandk. Bu kodlardaki s karakteri Ingilizce string, yani karakter dizisi ifadesinin ksaltmasdr. Pythonda biim dzenleyicileri kullanrken dikkat etmemiz gereken en nemli nokta, karakter dizisi iinde kulland mz biimlendirici saysyla, karakter dizisinin dnda bu biimlendirig s cilere karlk gelen de erlerin saysnn ayn olmasdr. Bu ne demek oluyor? Hemen su rne e s g g bakalm:
>>> print "Benim adm %s, soyadm %s" %"istihza" Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: not enough arguments for format string

Grd nz gibi bu kodlar hata verdi. nk karakter dizisi iindeki iki adet %s ifadesine g karlk, karakter dizisinin dnda tek bir de er var (istihza). Halbuki bizim syle bir kod s s g yazmamz gerekiyordu:
>>> isim = "istihza" >>> print "%s adl kiinin mekan www.%s.com adresidir." %(isim, isim) s

Bu defa herhangi bir hata mesaj almadk. nk bu kodlarda, olmas gerekti i gibi, karakter g dizisi iindeki iki adet %s ifadesine karlk, darda iki adet de er var... s s g Bu arada, yukardaki rnek biim dzenleyiciler hakknda bize nemli bir bilgi daha veriyor. Dikkat ettiyseniz, karakter dizisi dnda tek bir de er varsa bunu parantez iinde belirts g memize gerek yok. Ama e er de er says birden fazlaysa bu de erleri bir demet (tuple) g g g

259

olarak tanmlamamz gerekiyor. Yani bu de erleri parantez iinde gstermeliyiz. Aksi halde g yazd mz kodlar hata verecektir. g Yukardaki rneklerde % adl biim dzenleyiciyi s karakteriyle birlikte kullandk. Esasnda en yaygn ift de budur. Yani etraftaki Python programlarnda yaygn olarak %s yapsn grrz... Ancak Pythonda % biim dzenleyicisiyle birlikte kullanlabilecek tek karakter s de ildir. Daha nce de dedi imiz gibi, s karakteri string, yani karakter dizisi kelimesinin g g ksaltmasdr. Yani aslnda %s yaps Pythonda zel olarak karakter dizilerini temsil eder. Peki bu ne demek oluyor? Bir karakter dizisi iinde %s yapsn kulland mzda, darda buna g s karlk gelen de erin bir karakter dizisi veya karakter dizisine evrilebilecek bir de er olmas s g g gerek. Bunun tam olarak ne demek oldu unu biraz sonra daha net bir sekilde anlayaca z. g g Biraz sabr, diyerek yolumuza devam edelim... Grd nz gibi, Pythonda biim dzenleyici olarak kullanlan simge ayn zamanda yzde g (%) anlamna da geliyor... O halde size syle bir soru soraym: Acaba 0dan 100e kadar olan saylarn bana birer yzde iareti koyarak bu saylar nasl gsterirsiniz? %0, %1, %10, s s %15, gibi... nce syle bir sey deneyelim:
>>> for i in range(100): ... print "%s" %i ...

Bu kodlar tabii ki sadece 0dan 100e kadar olan saylar ekrana dkmekle yetinecektir... Saylarn banda % iaretini gremeyece iz... s s g Bir de syle bir sey deneyelim:
>>> for i in range(100): ... print "%%s" %i ... Traceback (most recent call last): File "<stdin>", line 2, in <module> TypeError: not all arguments converted during string formatting

Bu defa da hata mesaj aldk... Do ru cevap su olmalyd: g


>>> for i in range(100): ... print "%%%s" %i ...

Burada % iaretini arka arkaya iki kez kullanarak bir adet % iareti elde ettik. Daha sonra s s da normal bir sekilde %s biimini kullandk. Yani adet % iaretini yan yana getirmi s s olduk.

17.1 Biim Dzenlemede Kullanlan Karakterler


Daha nce de dedi imiz gibi, biim dzenleyici karakterler iinde en yaygn kullanlan s g hardir ve bu harf, karakter dizilerini ya da karakter dizisine dntrlebilen de erleri tems g sil eder. Ancak Pythonda % adl biim dzenleyici ile birlikte kullanlabilecek tek harf s de ildir. Pythonda farkl amalara hizmet eden, bunun gibi baka harer de bulunur. ste bu g s I ksmda bu harerin neler oldu unu ve bunlarn ne ie yarad n inceleyece iz. g s g g

17.1.1 d Har
Yukarda grd mz s har nasl karakter dizilerini temsil ediyorsa, d har de saylar g temsil eder. Isterseniz kk bir rnekle aklamaya alalm durumu: s
>>> print "ubat ay bu yl %d gn ekiyor" %28 S S ubat ay bu yl 28 gn ekiyor.

Grd nz gibi, karakter dizisi iinde %s yerine bu defa %d gibi bir sey kullandk. Buna g uygun olarak da d tarafta 28 saysn kullandk. Peki yukardaki ifadeyi syle de yazamaz s myz?
>>> print "ubat ay bu yl %s gn ekiyor" %28 S

Elbette yazabiliriz. Bu kod da bize do ru kt verecektir. nk daha nce de dedi imiz g g gibi, s har karakter dizilerini ve karakter dizisine evrilebilen degerleri temsil eder. Pythonda saylar karakter dizisine evrilebildi i iin %s gibi bir yapy hata almadan kullang abiliyoruz. Ama mesela syle bir sey yapamayz:
>>> print "ubat ay bu yl %d gn ekiyor" %"yirmi sekiz" S Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: %d format: a number is required, not str

Grd nz gibi bu defa hata aldk. nk d har yalnzca say de erleri temsil edebilir. Bu g g hare birlikte karakter dizilerini kullanamayz. Do rusunu sylemek gerekirse, d har aslnda tamsay (integer) de erleri temsil eder. E er g g g bu harn kullanld bir karakter dizisinde de er olarak mesela bir kayan noktal say (oat) g g verirsek, bu de er tamsayya evrilecektir. Bunun ne demek oldu unu hemen bir rnekle g g grelim:
>>> print "%d" %13.5 13

Grd nz gibi, %d ifadesi, 13.5 saysnn ondalk ksmn ktda gstermiyor. nk d g har sadece tamsaylar temsil etme ilevi gryor... s

17.1.2 i Har
Bu harf de integer, yani tamsay kelimesinin ksaltmasdr. Kullanm ve ilev olarak, d s harnden hi bir fark yoktur.

17.1.3 o Har
Bu harf octal (sekizlik) kelimesinin ksaltmasdr. Adndan da anlalaca gibi, sekizlik dzens g deki saylar temsil eder. rne in: g
>>> print "%i saysnn sekizlik dzendeki karl %o saysdr." %(10, 10) s g 10 saysnn sekizlik dzendeki karl 12 saysdr. s g

17.1.4 x Har
Bu harf hexadecimal, yani onaltlk dzendeki saylar temsil eder:
>>> print "%i saysnn onaltlk dzendeki karl %x saysdr." %(20, 20) s g 20 saysnn onaltlk dzendeki karl 14 saysdr. s g

Buradaki x kk harf olarak kullanld nda, onaltlk dzende hare gsterilen saylar da g kk hare temsil edilecektir:
>>> print "%i saysnn onaltlk dzendeki karl %x saysdr." %(10, 10) s g 10 saysnn onaltlk dzendeki karl a saysdr. s g

17.1.5 X Har
Bu da tpk x harnde oldu u gibi, onaltlk dzendeki saylar temsil eder. Ancak bunun fark, g hare gsterilen onaltlk saylar byk hare temsil etmesidir:
>>> print "%i saysnn onaltlk dzendeki karl %X saysdr." %(10, 10) s g 10 saysnn onaltlk dzendeki karl A saysdr. s g

17.1.6 f Har
Pythonda karakter dizilerini biimlendirirken s harnden sonra en ok kullanlan harf f hardir. Bu harf Ingilizcedeki oat, yani kayan noktal say kelimesinin ksaltmasdr. Adndan da anlalaca gibi, karakter dizileri iindeki kayan noktal saylar temsil etmek iin kuls g lanlr...
>>> print "Dolar %f TL olmu..." %1.4710 s Dolar 1.471000 TL olmu... s

E er yukardaki komutun kts sizi sarttysa okumaya devam edin. Biraz sonra bu kty g s istedi imiz kvama nasl getirebilece imizi inceleyece iz... g g g

17.1.7 c Har
Bu harf de Pythondaki nemli karakter dizisi biimlendiricilerinden biridir. Bu harf tek bir karakteri temsil eder:
>>> print "%c" %"a" a

Ama:
>>> print "%c" %"istihza" Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: %c requires int or char

Grd nz gibi, c har sadece tek bir karakteri kabul ediyor. Karakter says birden fazla g oldu unda bu komut hata veriyor. g c harnin bir baka zelli i de ASCII tablosunda saylara karlk gelen karakterleri de s g s gsterebilmesidir:
>>> print "%c" %65 A

ASCII tablosunda 65 says A harne karlk geldi i iin yukardaki komutun kts A harni s g gsteriyor. E er isterseniz c harni kullanarak btn ASCII tablosunu ekrana dkebilirsiniz: g
>>> for i in range(128): ... "%s ==> %c" %(i, i)

E er bu ASCII tablosuna tam anlamyla tablovari bir grnm vermek isterseniz syle bir sey g yazabilirsiniz:
a = ["%s = %c" %(i, i) for i in range(32, 128)] for i in range(0, 120, 7): a.insert(i, "\n") for v in a: print v.rjust(8),

Burada yapt mz sey su: g ncelikle bir liste reteci (list comprehension) kullanarak 32 ile 128 arasndaki saylara karlk s gelen hareri bir liste haline getiriyoruz. E er oluan bu a adl listeyi ekrana yazdrrsanz, g s liste elerinin syle bir biime sahip oldu unu grrsnz: g g
[32 = , 33 = !, 34 = ", 35 = #, 36 = $, 37 = %, 38 = &,...]

Bu 127ye kadar devam eder... Ardndan bu listenin her 6. esinden sonra (yani 7. sraya) bir adet \n karakteri yerletiriyg s oruz. Bu sayede listeyi her 7. ede bir alt satra geecek sekilde ayarlam oluyoruz. for i g s in range(0, 120, 7) satr iindeki 120 saysn deneme yanlma yoluyla bulabilirsiniz veya bu sayy tespit edebilmek iin kendinizce bir forml de retebilirsiniz. Ancak forml retmeye enenler iin deneme yanlma yntemi daha cazip gelecektir! Burada amacmz listedeki her s 7. eyi bulurken liste sonuna kadar ulaabilmek... Ben burada bu sayy biraz yksek tuttum, g s ki tablo ekrana basldktan sonra bir satr fazladan boluk olsun... E er isterseniz yukardaki s g kodlar su sekilde yazarak a.insert(i, "\n") satrnn listenin hangi noktalarna \n karak teri yerletirdi ini inceleyebilirsiniz: s g
a = ["%s = %c" %(i, i) for i in range(32, 128)] for i in range(0, 120, 7): a.insert(i, "\n") print a

Ayrca 120 yerine farkl saylar koyarak hangi saynn yetersiz kald n, hangi saynn fazla g geldi ini de inceleyebilirsiniz... g Son olarak da, karakter dizisi metotlarn ilerken grd mz rjust() adl metot yardmyla, s g tabloya girecek karakterleri 8 karakterlik bir alan iinde sa a yaslayarak ekrana dktk. g

17.2 leri Dzeyde Karakter Dizisi Biimlendirme I


Pythonda karakter biimlendirmenin amac birtakm kodlar yardmyla elde edilen verilerin istedi imiz bir biimde kullancya sunulabilmesini sa lamaktr. Karakter biimlendirme genel g g olarak karmak verilerin son kullanc tarafndan en kolay sekilde anlalabilmesini sa lamak s s g iin kullanlr. rne in syle bir szlk olsun elimizde: g
>>> stok = {"elma": 10, "armut": 20, "patates": 40}

Stokta ka kilo elma kald n renmek isteyen kullancya bu bilgiyi su sekilde verebiliriz: g g
>>> mal = "elma" >>> print stok[mal] 10

Ancak bundan daha iyisi, kty biraz biimlendirerek kullancya daha temiz bir bilgi sunmaktr:
>>> mal = "elma" >>> print "Stokta %d KG %s kald!" %(stok["elma"], mal) Stokta 10 KG elma kald!

Ya da mevcut stoklarn genel durumu hakknda bilgi vermek iin syle bir yol tercih ede bilirsiniz:
stok = {"elma": 10, "armut": 20, "patates": 40} print "stok durumu:" for k, v in stok.items(): print "%s\t=\t%s KG"%(k, v)

Burada ncelikle stok szl mz tanmladk. Daha sonra for k, v in stok.items() g satr ile, stok szl nn btn elerini teker teker k ve v adl iki de ikene atadk. g g gs Bylece szlk iindeki anahtarlar k de ikenine; de erler ise v de ikenine atanm gs g gs s oldu... Son olarak da print "%s\t=\t%s KG"%(k, v) satryla bu k ve v de ikenlerini gs rne in elma = 10 KG ktsn verecek sekilde biimlendirip ekrana yazdrdk. Burada meyve g adlaryla meyve miktarlar arasndaki mesafeyi biraz amak iin \t adl ka dizisinden yarars land mza dikkat edin. g Yukardaki rnekler, karakter dizisi biimlendirme kavramnn en temel kullanmn gstermektedir. Ancak isterseniz Pythondaki karakter dizisi biimlendiricilerini kullanarak daha karmak s ilemler de yapabilirsiniz... s

17.2.1 Karakter Dizisi Biimlendirmede Szlkleri Kullanmak


Aslnda Pythondaki karakter dizisi biimlendiricilerinin, yukarda verdi imiz rneklerde grg nenden daha karmak bir szdizimi vardr. Mesela su rne e bir bakalm: s g
>>> print "Ben %(isim)s %(soyisim)s" %{"isim": "Frat", "soyisim": "zgl"}

Buradaki yap ilk anda gznze karmak gelmi olabilir. Ancak aslnda olduka basittir. stes s lik bu yap epey kullanldr ve baz durumlarda ilerinizi bir hayli kolaylatrabilir. Burada s s s yapt mz sey, %s adl karakter dizisi biimlendiricisindeki % ve %s karakterleri arasna g

de iken adlar yerletirmekten ibarettir. Burada belirtti imiz de iken adlarn daha sonra gs s g gs karakter dizisi dnda bir szlk olarak tanmlyoruz. s Bir de su rne e bakalm: g
#-*- coding: utf-8 -*randevu = {"gun_sayi": 13, "ay": "Ocak", "gun": u"aramba", s "saat": "17:00"} print u"%(gun_sayi)s %(ay)s %(gun)s %(saat)sda bulualm!" %randevu s

Tabii e er isterseniz szl nz do rudan karakter dizisini yazarken de tanmlayabilirsiniz: g g g


#-*- coding: utf-8 -*print u"%(gun_sayi)s %(ay)s %(gun)s %(saat)sda bulualm!" %{"gun_sayi": 13, s "ay": "Ocak", "gun": u"aramba", s "saat": "17:00"}

Kodlar bu sekilde yazd mzda karakter dizisi dnda % iaretinden sonra demet yerine g s s szlk kulland mza dikkat edin. g Pythonun bize sundu u bu yap karakter dizisi iindeki de ikenlerin neler oldu unu takip g gs g edebilmek asndan epey kullanl bir aratr. s

17.2.2 Saylarda Hassas Biimlendirme


Yukarda f adl biimlendiriciden bahsederken hatrlarsanz syle bir rnek vermitik: s
>>> print "Dolar %f TL olmu..." %1.4710 s Dolar 1.471000 TL olmu... s

Burada karakter dizisinin dnda belirtti imiz say 1.4710 oldu u halde ktda elde etti imiz s g g g say 1.471000... Grd nz gibi, elde etti imiz say tam istedi imiz gibi de il. Ama e er g g g g g arzu edersek bu kty ihtiyalarmza gre biimlendirme imkanna sahibiz. Bu blmde, Pythondaki saylar nasl hassas biimlendirece imizi inceleyece iz. Kk bir rnekle balayg g s alm:
>>> "%f" %1.4 1.400000

Grd nz gibi, noktadan sonra istedi imizden daha fazla sayda basamak var. Diyelim ki g g biz noktadan sonra sadece 2 basamak olsun istiyoruz:
>>> "%.2f" %1.4 1.40

Burada yapt mz sey, % iareti ile f karakteri arasna bir adet nokta (.) ve istedi imiz g s g basamak saysn yerletirmekten ibaret... Bir de su rne e bakalm: s g

>>> "%.2f" %5 5.00

Grd nz gibi, bu zelli i kayan noktal saylarn yansra tamsaylara (integer) da uygulayag g biliyoruz.

17.2.3 Saylarn Soluna Sfr Eklemek


Bir nceki blmde %s iareti ile f har arasna zel eler yerletirerek yapt mz sey s g s g f har dndaki karakterler zerinde farkl bir etki do urur. Laf dolandrp kafa kartrmak s g s yerine isterseniz basit bir rnek verelim. Hatrlarsanz f har ile syle bir sey yazabiliyorduk:
>>> print "Bugnk dolar kuru: %.3f" %1.49876 Bugnk dolar kuru: 1.499

Burada yazd mz .3 ifadesi, noktadan sonra sadece 3 basamaklk bir hassasiyet istedi imizi g g gsteriyor. Ama bir de su rne e bakn: g
>>> print "Bugnk dolar kuru: %.3d" %1.49876 Bugnk dolar kuru: 001

Grd nz gibi, f yerine d karakterini kulland mzda .3 gibi bir ifade, saylarn sol g g tarafn sfrlarla dolduruyor. Burada dikkat ederseniz, ktda adet 0 yok. .3 ifadesinin yapt sey, toplam basamakl bir tamsay oluturmaktr. E er tamsay normalde tek basamakl g s g ise, bu ifade o tek basamakl saynn soluna iki sfr koyarak basamak saysn 3e tamamlar. E er say 3 veya daha fazla sayda basamaktan oluuyorsa, .3 ifadesinin herhangi bir etkg s isi olmaz... Bu yapnn tam olarak ne ie yarad n anlamak iin farkl saylarla denemeler s g yapmanz tavsiye ederim. Bu zelli i syle bir i iin kullanabilirsiniz: g s
>>> for i in range(11): ... print "%.3d" %i ... 000 001 002 003 004 005 006 007 008 009 010

Yukardaki zelli in, daha nce karakter dizisi metotlarn ilerken rendi imiz zfill() metog s g g duna benzedi ini farketmisinizdir. Ayn seyi zfill() metodunu kullanarak syle yapyorduk: g s
>>> for i in range(11): ... print str(i).zfill(3) ... 000 001

002 003 004 005 006 007 008 009 010

17.2.4 Karakter Dizilerini Hizalamak


Hatrlarsanz karakter dizilerinin metotlarn incelerken rjust() adl bir metottan bahsetmitik. s Bu metot karakter dizilerini sa a yaslamamz sa lyordu... Daha nce bu metodu kulland mz g g g syle bir rnek vermitik: s
a = ["%s = %c" %(i, i) for i in range(32, 128)] for i in range(0, 120, 7): a.insert(i, "\n") for v in a: print v.rjust(8),

Burada print v.rjust(8), satr, oluturdu umuz tablodaki elerin sa a yaslanmasn s g g g sa lamt. Aslnda ayn etkiyi, biim dzenleyiciler yardmyla da sa layabiliriz: g s g
a = ["%s = %c" %(i, i) for i in range(32, 128)] for i in range(0, 120, 7): a.insert(i, "\n") for v in a: print "%8s" %v,

Isterseniz konuyu daha iyi anlayabilmek iin daha basit bir rnek verelim:
>>> for i in range(20): ... print "%2d" %i ... 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

17 18 19

Dikkat ederseniz burada 10dan nceki saylar sa a yaslanm durumda. Yukardaki kodlar g s herhangi bir biimlendirici iermeyecek sekilde yazarsanz fark daha net grebilirsiniz:
>>> for i in range(11): ... print i ... 0 1 2 3 4 5 6 7 8 9 10

Fark gryorsunuz.. Bu defa saylar normal bir sekilde sola yaslanm durumda. s Yine bu biimlendiricileri kullanarak karakter dizileri arasnda belli sayda boluklar da brakas bilirsiniz. Mesela:
>>> print "merhaba %10s dnya" %"" merhaba dnya

Buna benzer bir seyi ka dizilerinden biri olan \t ile de yapabiliyoruz. Ancak \tyi kul s land mzda boluk miktarnn tam olarak ne kadar olaca n kestiremeyiz. Karakter dizisi g s g biimlendiricileri ise bize bu konuda ok daha fazla kontrol imkan verir.

17.2.5 Karakter Dizilerini Hem Hizalamak Hem de Sola Sfr Eklemek


Yukarda karakter dizilerini nasl hizalayaca mz ve sol taraarna nasl sfr ekleyebilece imizi g g ayr ayr grdk. Esasnda Pythondaki biim dzenleyiciler bize bu ilemlerin her ikisini birlikte s yapma imkan da tanr. Hatrlarsanz bir karakter dizisinin sol tarafna sfr eklemek iin syle bir sey yapyorduk:
>>> for i in range(11): ... print "%.3d" %i

Karakter dizilerini hizalamak iin ise syle bir sey...


>>> for i in range(20): ... print "%2d" %i

Karakter dizilerini hem hizalamak hem de sol taraarna sfr eklemek iin de syle bir sey yapyoruz:
>>> for i in range(11): ... print "%3.2d"%i

Grd nz gibi nokta iaretinden nce getirdi imiz say karakter dizisinin hizalanma miktarn g s g gsterirken, noktadan sonra getirdi imiz say karakter dizisinin sol tarafna eklenecek sfrlarn g saysn gsteriyor. E er yukardaki rneklerde f adl biimlendirme karakterini kullanrsanz, sonu biraz farkl g olacaktr:
>>> print "kur: %8.3f" %1.2 kur: 1.200

Bu iaret ve karakterlerin tam olarak nasl bir etki oluturdu unu daha iyi anlayabilmek iin s s g kendi kendinize rnekler yapmanz tavsiye ederim... Bylece Pythondaki nemli bir konuyu daha geride brakm olduk. Aslnda burada sylenecek s birka sey daha olsa da yukardakilerin Python programlar yazarken en ok ihtiyacnz olacak bilgiler oldu unu gnl rahatl yla syleyebiliriz... g g

17.3 Blm Sorular


1. Elimizde syle bir liste var:
stok = ["elma", "armut", "kiraz"]

Bu listede bulunan eleri kullanarak su cmleyi kurun: g


Stokta bulunan rnler: elma, armut, kiraz

2. Kullancya, banka hesabnda ka TLsi oldu unu soran bir program yazn. Bu program, g kullancdan ald TL bilgisini dolara evirerek 6 haneli bir say biiminde ekrana basabilmeli. g rne in kullancnn banka hesabnda 1000 TL varsa, programnz ekrana su bilgiyi basmal: g
bankada 001000 TLniz var! (000657 $)

BLM

18

ascii, unicode ve Python

Not: Burada verilen bilgiler, len() Fonksiyonu ve asciinin Laneti adl makalede anlatlanlarla birlikte de erlendirilmelidir. Bu belge ve oradaki makale birbirini tamamlayc bilgiler g iermektedir. Sz konusu makalede temel dzeyde bilgiler verilmekte, burada ise konunun ayrntlarna inilmektedir.

18.1 Giri s
Orada burada mutlaka Pythonun varsaylan kod zcsnn ascii oldu una dair bir cmle g duymusunuzdur. s Yine sa da solda Pythonun unicodeyi destekledi ine dair bir cmle de duymu olmalsnz. g g s O halde bu ascii ve unicode denen seylerin ne oldu unu da merak etmisinizdir. g s Ben simdi size burada iin teknik ksmna bulamadan hem ascii, hem de unicode ile ilgili s s ok kaba bir tarif verece im: g ascii, Trkeye zg , , , , ve gibi hareri tanmayan bir karaks g ter kodlama biimidir. unicode ise Trkeye zg harerle birlikte dnya zerindeki pek ok dile ait hareri de tanyabilen karakter kodlama biimlerini ieren, gelimi bir sistemdir. s s Esasnda unicode, karakter kodlarn gsteren byk bir listeden ibarettir. Bu liste iinde dnyadaki (hemen hemen) btn dillere ait karakterler, simgeler, harer, vb. yer alr. Ayn sekilde ascii de karakter kodlarn ieren bir listedir. Ancak ascii listesi sadece 128 karakterden oluurken, unicode yz binlerce karakteri temsil edebilir. s ste biz bu makalede, her yerde karmza kan bu ascii ve unicode kavramlarn anlaI s maya, bu kavramlarn Pythondaki yerini ve Pythonda ne sekilde kullanld n renmeye g g alaca z. s g nce asciiden balayalm... s

270

18.2 ascii
Ne kadar gelimi olurlarsa olsunlar, bugn kulland mz bilgisayarlarn anlad tek sey s s g g saylardr. Yani mesela karakter, harf ve kelime gibi kavramlar bir bilgisayar iin hibir sey ifade etmez. rne in ekranda grd mz a har znde sadece bir saydan ibarettir. g g Bilgisayar bunu a har seklinde de il, bir say olarak grr. Dolaysyla, ekranda grd mz g g btn harer ve simgeler makine dilinde bir say ile temsil edilir. ste bu her karakteri bir I sayyla temsil etme ilemine karakter kodlama (character encoding) ad verilir. Her bir karaks ter bir sayya karlk gelecek sekilde, bu karakterleri ve bunlarn karl olan saylar bir araya s s g toplayan sistematik yapya ise karakter kmesi (charset character set) denir. rne in ascii, g unicode, ISO-8859, vb. birer karakter kmesidir. nk bunlar her biri bir sayya karlk gelen s karakterleri bir arada sunan sistematik yaplardr. Biraz sonra bu sistemleri daha detayl bir sekilde inceledi imizde tam olarak ne demek istedi imizi gayet net anlayacaksnz. g g 1960l yllara gelininceye kadar, yaz yazmaya yarayan makineler reten her rma, farkl karakterlerin farkl saylarla temsil edildi i karakter kmeleri kullanyordu. Bu karmakl n bir g s g sonucu olarak, herhangi bir makinede oluturulan bir metin baka bir makinede ayn sekilde s s grntlenemiyordu. nk rne in a har bir makinede falanca say ile temsil edilirken, g baka bir makinede lanca say ile temsil ediliyordu. Hatta ayn reticinin farkl model s makinelerinde dahi bir btnlk sa lanm de ildi... Dolaysyla her retici kendi ihtiyalarna g s g uygun olarak farkl bir karakter kmesi kullanyordu... Bu da nkl nlemek ve yaz makinelerinde bir birlik sa lamak iin American Standards g g g Association (Amerikan Standartlar Birli i) tarafndan American Standard Code for Information g Interchange (Bilgi Alverii iin Amerikan Standart Kodu) ad altnda bir standartlama als s s s mas yrtlmesine karar verildi. ste ascii bu American Standard Code for Information I Interchange ifadesinin ksaltmasdr. Bu kelime askii seklinde telaffuz edilir... srm 1963 ylnda yaymlanan ascii 7-bitlik bir karakter kmesidir. Dolaysyla bu kme Ilk iinde toplam 27 = 128 adet karakter yer alabilir, yani bu sistemle sadece 128 adet karakter kodlanabilir. (E er 7-bit kavram size yabanc ise okumaya devam edin. Biraz sonra bu g kavram aklayaca z.) g Bu bahsetti imiz 128 karakteri ieren ascii tablosuna (yani ascii karakter kmesine) g http://www.asciitable.com/ adresinden eriebilirsiniz. Buradaki tablodan da grece iniz gibi, s g toplam 128 saynn (0dan balayarak) ilk 33 tanesi ekranda grnmeyen karakterlere s ayrlmtr. Bu ilk 33 say, bir metnin akn belirleyen sekme, yeni satr ve benzeri s s karakterleri temsil eder. Ayrca grd nz gibi, karakter kmesi denen sey, temelde belli g karakterlerle belli saylar eletiren bir tablodan ibarettir... s s Mesela ascii tablosunda 10 saysnn yeni satr karakterini temsil etti ini gryoruz (O g tabloda dec stununa bakn). ascii tablosu bugn iin de geerlidir. Bu yzden bu tablodaki karakterleri modern sistemler de kabul edecektir. Mesela Pythonda, chr() fonksiyonundan da yararlanarak syle bir sey yazabiliriz:
>>> print "Merhaba" + chr(10) + "dnya" Merhaba dnya

Grd nz gibi, gerekten de 10 says yeni bir satra gememizi sa lad. Burada chr() g g fonksiyonu ascii tablosundaki saylarn karakter karlklarn grmemizi ve kullanabilmemizi s sa lyor... g Ayn tabloda 9 saysnn ise sekme karakterini temsil etti ini gryoruz. g Pythonda syle bir sey yazma olana sa lyor: g g Bu da bize

>>> print "Merhaba" + chr(9) + "dnya" Merhaba dnya

Yukarda yazd mz kodlar ileten Python, Merhaba ve dnya kelimeleri arasnda bir sekg s melik boluk brakt... E er buradaki sekme bolu unun az oldu unu dnyorsanz kos g s g g s dunuzu syle de yazabilirsiniz:
>>> print "Merhaba" + chr(9) * 2 + "dnya" Merhaba dnya

chr(9)a karlk gelen sekme karakterini istedi iniz kadar tekrar ederek, karakter dizileri s g arasnda istedi iniz boyutta sekmeler oluturabilirsiniz... Elbette bunu Pythonda \t ka g s s dizisini kullanarak da yapabilece inizi biliyorsunuz. g E er ascii sisteminden yararlanp bilgisayarnzn bir bip sesi karmasn isterseniz sadece g syle bir sey yazmanz yeterli olacaktr:
>>> print chr(7) !bip!

Ancak bu biplemeyi (e er kernel modllerinden biri olan pcspkr ykl de ilse) GNU/Linux g g sistemlerinde duyamayabilirsiniz... Elbette ascii tablosu sadece yukardaki grnmez karakterlerden ibaret de ildir. Tablodan g grd mz gibi, 33ten 128e kadar olan ksmda ekrana baslabilen karakterler yer alyor. g Mesela a har 97 says ile gsteriliyor. Dolaysyla Pythonda syle bir sey yazabiliyoruz:
>>> print "Merhab" + chr(97) + dnya" Merhabadnya

Burada iki kelime arasnda tabii ki boluk yer almyor. Boluk karakterini kendiniz yerletires s s bilirsiniz... Ama e er ascii kodlarn do rudan karakter dizilerinin iinde kullanmak isterseniz, g g ascii tablosunda dec stunu yerine oct stunundaki saylar da kullanabilirsiniz. Tablodaki oct stununu kontrol etti imizde a harnin 141 saysna karlk geldi ini gryoruz. O g s g halde syle bir kod yazmamz mmkn:
>>> print "Merhab\141 dnya" Merhaba dnya

Burada 141 saysn do rudan kullanmad mza dikkat edin. Pythonun ekrana 141 yazdrg g mak istedi imizi zannetmemesi iin \ ka dizisini kullanarak, Pythona o 141 bildi in 141 g s g de il, gibi bir mesaj vermi oluyoruz... g s Yok, ben illa dec stunundaki ondalk saylar kullanmak istiyorum, diyorsanz sizi kracak de iliz. Bunu elbette su sekilde yapabilece inizi biliyorsunuz: g g
>>> print "Merhab%s dnya" %chr(97)

Dikkat ederseniz, ascii tablosunda Hx (Hexadecimal) adl bir stun daha var. E er bu stung daki saylar size daha sevimli geliyorsa syle bir yazm tarz benimseyebilirsiniz:
>>> print "Merhab\x61 dnya"

ascii tablosunu inceledi inizde, bu tabloda baz seylerin eksik oldu u gznze arpm olmal. g g s Mesela bu tabloda gibi hareri gremiyoruz... s g Simdi Pythonda syle bir kod yazd mz dnelim: g s
print "Trke karakterler: " s g I

E er bu kodlar do rudan etkileimli kabuk zerinde altrmsanz Python size dzgn bir g g s s s kt vermi olabilir. Ancak bu sizi yanltmasn. Etkileimli kabuk pratik bir aratr, ama her s s zaman gvenilir bir ara oldu u sylenemez. Burada ald nz ktlarn her ortamda ayn g g kty verece inden emin olamazsnz. O yzden asl programlarnzda do rudan yukardaki g g gibi bir kod yazamazsnz. Bu kodu bir metin dosyasna yazp kaydettikten sonra program altrmak istedi imizde syle s g bir kt alrz:
SyntaxError: Non-ascii character \xfc in file deneme.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

Burada grd nz gibi, Python ascii olmayan karakterler kulland mzdan yaknyor... g g Aslnda bu ok do al. nk dedi imiz ve grd mz gibi, hareri ascii tablosunda g g g s g I yer almyor... Bu yaznn Giri blmndeki kaba tarifte de ifade etti imiz gibi, ascii Trke karakters g leri tanmayan bir karakter kodlama biimidir. Aslnda ascii sadece Trkeyi de il, g Ingilizce dndaki hi bir dilin zel karakterlerini tanmaz. s Python varsaylan olarak ascii kodlamasn kullanr... Hemen bunu teyit edelim:
>>> import sys >>> sys.getdefaultencoding() ascii

Demek ki Pythondaki varsaylan kodlama biimi hakikaten ascii imi... Yukardaki durum nes deniyle, Python ascii tablosunda yer almayan bir karakterle karlat zaman do al olarak s s g g hata mesajnda grd mz kty veriyor. g Bu arada, asciinin 7-bitlik bir sistem oldu unu sylemitik. Peki 7-bitlik ne demek? Hemen g s ksaca onu da aklayalm: Bildi iniz gibi bilgisayarlarn temelinde 1ler ve 0lar yatar. Bilgisayarlar yalnzca bu saylar g anlayp bu saylarla ilem yapabilir. Bu 1 ve 0larn her birine bit ad verilir. Bu 1 ve 0larn 7 s tanesi yan yana gelince 7-bitlik bir say oluturur! Gayet mantkl, de il mi? s g ste ascii sisteminde tanmlanan btn karakterler 7-bitlik bir say iine s drlabiliyor. Yani 7 I g adet 1 ve 0 btn ascii karakterleri temsil etmeye yetiyor. Mesela F harnin ascii karl s g olan 70 says ondalk bir saydr. Bu ondalk say ikili dzende 1000110 saysna karlk gelir. s Pythonda herhangi bir ondalk saynn ikili dzende hangi sayya karlk geldi ini bulmak iin s g bin() adl fonksiyondan yararlanabilirsiniz:
>>> bin(70) 0b1000110

Bu saynn bandaki 0b karakterleri Pythonun ikili saylar gstermek iin kulland bir s g aratr. Bu ara Pythona bir seyler ifade ediyor olabilir, ama bize bir sey ifade etmez. O yzden bu sayda bizi ilgilendiren ksm 1000110. Grd nz gibi burada toplam 7 adet 1 ve 0 var... Baka bir rnek verelim: ascii tablosunda g s r har 114 saysna karlk geliyor. Bu ondalk saynn ikili dzendeki karl 1110010 s s g saysdr:

>>> bin(114) 0b1110010

Yine grd nz gibi, bu ikili say da 7 adet 1 ve 0dan oluuyor. Dolaysyla bu da 7-bitlik bir g s saydr. 7-bitle gsterilebilecek son say 127dir. Bunun da ikili dzendeki karl 1111111 s g saysdr. 128 says ikili dzende 10000000 olarak gsterilir. Grd nz gibi 128in ikili g dzendeki karl olan say 7-bit de il. nk burada 7 adet 1 ve 0 yerine 8 adet 1 ve 0 var... s g g Dolaysyla 7 bit kullanarak 0 says ile birlikte 128 adet ondalk sayy gsterebiliyoruz. 129. say ancak 8 bit kullanlarak gsterilebiliyor. 1990l yllarn ortalarna kadar bilgisayar sistemleri sadece bu 7-bitlik veriler ile ilem yapys ordu. Ancak 90lu yllarn ortalarndan itibaren btn bilgisayar sistemleri 8 bitlik verileri de depolayabilmeye balad. 8. bitin geliiyle birlikte, 7-bitlik sistemin sundu u 128 karaktere ek s s g olarak bir 128 karakteri daha temsil edebilme olana do du. nk 8-bitlik sistemler 28 = g g 256 adet karakterin kodlanmasna imkan tanr. 128 karakteri destekleyen standart asciinin Ingilizce dndaki karakterleri gsterememesi ve s 8. bitin sa lad olanaklar gz nnde bulundurularak ortaya Geniletilmi ascii diye bir sey g g s s kt. Ancak ilk 128 karakterden sonra gelen 128 karakterin hangi karakterleri temsil edece i g konusu, yani Geniletilmi ascii denen sistem standart bir yapya hi bir zaman kavuamad. s s s Bilgisayar reticileri bu 8. biti kendi ihtiyalarna gre doldurma yolunu setiler. Bylece ortaya kod sayfas (codepage) denen bir kavram kt. zellikle IBM ve Microsoft gibi byk sirketlerin, kendi ihtiyalarna ve farkl lkelere gre dzenlenmi farkl farkl kod sayfalar bulunur. rne in Microsoft rmasnn Trkiyeye s g gnderdi i bilgisayarlarda kulland , 857 numaral bir kod sayfas vardr. Bu kod sayg g fasna http://msdn.microsoft.com/en-us/library/cc195068.aspx adresinden ulaabilirsiniz. Bu s adresteki kod sayfasnda grece iniz gibi, saylar 32den balyor. ascii tablosunun ilk 32 g s says ekranda grnmeyen karakterleri temsil etti i iin Microsoft bunlar gsterme gere i g g duymam. Bu tabloda 128e kadar olan ksm zaten standart asciidir ve btn kod says falarnda ilk 128lik ksm ayndr. Sonraki 128lik ksm ise farkl kod sayfalarnda farkl karakterlere karlk gelir... rne in buradaki 857 numaral kod sayfasnda ikinci 128lik s g ksm zel karakterlere ayrlmtr. Bu kod sayfas Trkedeki karakterleri dzgn gsteres bilmek iin retildi inden bu listede , , , , ve gibi hareri grebiliyoruz. g s g I Ama e er http://msdn.microsoft.com/en-us/library/cc195065.aspx adresindeki 851 numaral g kod sayfasna bakacak olursanz, bu listede ikinci 128lik ksmn 857 numaral kod sayfasndakilerden farkl karakterlere ayrld n grrsnz. nk 851 numaral kod sayfas Yunan g alfabesindeki hareri gsterebilmek iin tasarlanmtr... s Kod sayfalar dnda, az ok standartlam karakter kmeleri de bu dnemde s s s Ingilizce dndaki dillerin karakter ihtiyalarn karlamak iin kullanlyordu. rne in ISO karaks s g ter kmeleri de kod sayfalarna benzer bir biimde 8. biti olabildi ince standartlatrmaya g s alan giriimlerdi. ISO-8859 karakter kmeleri bunlarn en bilinenlerindendir. Bunlar iinde s s Trkeye ayrlan kme ISO-8859-9 adl karakter kmesidir. ISO-8859-9 karakter kmesine http://czyborra.com/charsets/iso8859.html#ISO-8859-9 adresinden ulaabilirsiniz... s Hatrlarsanz yukarda chr() adl bir fonksiyondan bahsetmitik. Bu fonksiyon kendisine args man olarak verilen ondalk bir saynn ascii tablosundaki karl n gsteriyordu. Pythonda bir s g de bu chr() fonksiyonunun yapt iin tam tersini yapan baka bir fonksiyon daha bulunur. g s s Bu fonksiyonun ad ord()dur. ord() fonksiyonunu syle kullanyoruz:
>>> ord("g") 103

Demek ki g karakterinin ascii tablosundaki karl 103m... s g s Bu chr() ve ord() fonksiyonlar farkl platformlarda farkl davranabilir. rne in: g

>>> print ord("") 135 >>> print chr(135)

Grd nz gibi, ord("") kts 135 sonucunu veriyor. 135 saysna karlk gelen karakter g s standart asciinin dnda kalr. nk dedi imiz gibi standart ascii sadece 128 karakterden s g oluur... Dolaysyla karakteri ikinci 128lik ksmda yer alr. Ancak dedi imiz gibi, yukars g daki sonu epey yanltcdr. nk bu kty yalnzca Windowsta elde edebilirsiniz. Ayn komut GNU/Linux zerinde hata verecektir. Microsoft rmas ikinci 128lik ksm iin kendine zg bir kod sayfas kullanyor ve 135 says bu zel kod sayfasnda karakterine karlk s geliyor. Isterseniz bir de teki Trke karakterlerin durumunu kontrol edelim:
>>> for i in "": s g I ... print i, ord(i) ... s 159 135 148 167 g 129 141 152 I

Grd nz gibi btn Trke karakterler 128den byk. O yzden bunlar standart ascii g tablosuna girmiyor. Ama Microsoftun kulland 857 numaral kod sayfas sayesinde bu karakg terler ikinci 128lik ksma girebilmi... Ancak dedi im gibi, yukardaki kt gvenilir de ildir. s g g Bu komutu ben Windows kurulu bir bilgisayarda verdim. Ayn komutu GNU/Linux iletim siss teminde verdi inizde hi beklemedi iniz sonular elde edersiniz. nk elbette GNU/Linux g g iletim sistemleri Microsoftun 857 numaral kod sayfasn kullanmyor... GNU/Linux farkl bir s kodlama sistemini kullanr. Bunun ne oldu unu biraz sonra grece iz. Simdilik biz konumuza g g devam edelim. Buraya kadar anlattklarmzdan anlalaca gibi, standart ascii tablosu s g Ingilizce dndaki s dillere zg karakter ve simgeleri gstermek konusunda yetersizdir. Standart ascii 128 karakterden ibarettir. Geniletilmi ascii ise toplam 256 karakterden oluur. Ancak ilk 128 karaks s s terden sonra gelen ikinci 128lik ksm standart bir yapya sahip de ildir. Her retici bu ikinci g 128lik ksm kendi kod sayfasndaki karakterlerle doldurur. Bu yzden geniletilmi asciiye s s gvenip herhangi bir i yapamazsnz. s ste tam da bu noktada unicode denen sey devreye girer. O halde gelelim bu unicode I mevzuuna...

18.3 unicode
Her ne kadar ascii kodlama sistemi Ingilizce dndaki karakterleri temsil etmek konusunda s yetersiz kalsa da insanlar uzun sre asciiyi temel alarak altlar. Yerel ihtiyalar gidermek s iin ise 8. bitin sa lad 128 karakterlik alandan ve reticilerin kendi kod sayfalarndan yararg g lanld. Ancak bu yaklamn yetersizli i gn gibi ortadadr. Bir defa 7 bit bir kenara, 8 bit dahi s g dnya zerindeki btn dillerin karakter ve simgelerini gstermeye yetmez. rne in Asya dilg lerinin alfabelerindeki harf saysn temsil etmek iin 256 karakterlik alan kesinlikle yetmeyecektir ve yetmemitir de... Ayrca mesela tek bir metin iinde hem Trke hem de Yunanca s

karakterler kullanmak isterseniz ascii sizi yar yolda brakacaktr. Trke iin 857 numaral kod sayfasn (veya iso-8859-9 karakter kmesini) kullanabilirsiniz. Ama bu kod sayfasnda Yunanca harer yer almaz... Onun iin 851 numaral kod sayfasn veya iso-8859-7 karakter kmesini kullanmanz gerekir. Ancak bu iki kod sayfasn ayn metin iinde kullanmanz mmkn de il... g ste btn bu yetersizlikler evrensel bir karakter kmesi oluturmann gereklili ini ortaya I s g kard. 1987 ylnda Xerox rmasndan Joseph D. Becker ve Lee Collins ile Apple rmasndan Mark Davis byle bir evrensel karakter kmesi oluturabilmenin altyaps zerinde almaya s s balad. unicode kelimesini ortaya atan kii Joe Beckerdir. Becker bu kelimeyi benzersiz s s (unique), birleik (unied) ve evrensel (universal) bir kodlama biimi anlamnda kullanmtr. s s Joseph Beckerin 29 A ustos 1988 tarihinde yazd Unicode 88 balkl makale, unicode g g s hakkndaki ilk taslak metin olmas bakmndan nem tar. Becker bu makalede neden unis code gibi bir sisteme ihtiya duyuldu unu, asciinin g Ingilizce dndaki dillere ait karakterleri s gstermekteki yetersizli ini ve herkesin ihtiyacna cevap verebilecek bir sistemin nasl ortaya g karlabilece ini anlatr. Bu makaleye http://unicode.org/history/unicode88.pdf adresinden g ulaabilirsiniz. s 1987 ylndan itibaren unicode zerine yaplan yo un almalarn ardndan 1991 ylnda hem g s Unicode Konsorsiyum kurulmu hem de ilk unicode standard yaymlanmtr. Unicode ve s s bunun tarihi konusunda en ayrntl bilgiyi http://www.unicode.org/ adresinden edinebilirsiniz... unicode standard 16-bit temel alnarak hazrlanmtr. Unicode kavram ilk ortaya kt nda Ilk s g Joe Becker 16 bitin dnyadaki btn dillere ait karakterleri temsil etmeye yetece ini dnyg s ordu. Ne de olsa; 27 = 128 28 = 256 216 = 65536 Ancak zamanla 16 bitin dahi tm dilleri kapsayamayaca anlald. Bunun zerine unicode g s 2.0dan itibaren 16-bit snrlamas kaldrlarak, dnya zerinde konuulan dillere ilaveten arkaik s dillerdeki karakterler de temsil edilebilme olana na kavutu. Dolaysyla unicode 16-bitlik bir g s sistemdir, yargs do ru de ildir. Unicode ilk kt nda 16-bitlikti, ama artk byle bir snrlama g g g yok... Unicode, asciiye gre farkl bir bak asna sahiptir. asciide sistem olduka basittir. Buna s gre her say bir karaktere karlk gelir. Ancak unicode iin ayn seyi sylemek mmkn s de il. Unicode sisteminde karakterler yerine kod konumlar (code points) bulunur. O yzden g unicode sisteminde baytlar zerinden dnmek yanltc olacaktr... s rne in http://www.unicode.org/charts/PDF/U0100.pdf adresindeki Latin Extended A adl g unicode tablosuna bakalm. Bu tablo Trke ve Azericenin de dahil oldu u baz dillere zg g karakterleri barndrr. Bu sayfada yer alan tabloda her karakterin bir kod konumu bulundu unu gryoruz. Mesela harnin kod konumu 011Fdir. Unicode dilinde kod konumlar g g geleneksel olarak U+xxxx seklinde gsterilir. Mesela harnin kod konumu U+011Fdir. g Esasnda bu 011F bir onaltlk saydr. Bunun ondalk say olarak karl n bulmak iin int() s g fonksiyonundan yararlanabilirsiniz:
>>> int("011F", 16) 287

Pythonda chr() fonksiyonuna ok benzeyen unichr() adl baka bir fonksiyon daha bulunur. s chr() fonksiyonu bir saynn ascii tablosunda hangi karaktere karlk geldi ini gsteriyordu. s g unichr() fonksiyonu ise bir saynn unicode tablosunda hangi kod konumuna karlk geldi ini s g

gsterir. Mesela yukarda grd mz 287 saysnn hangi kod konumuna karlk geldi ine g s g bakalm:
>>> unichr(287) u\u011f

Grd nz gibi harnin kod konumu olan 011Fyi elde ettik. Burada Python kendi i ig g s leyii asndan 011Fyi u\u011F seklinde gsteriyor. Yukardaki kodu syle yazarak do rus g dan harni elde edebilirsiniz: g
>>> print unichr(287) g

Peki do rudan bir say vererek de il de, karakter vererek o karakterin unicode kod konumunu g g bulmak mmkn m? Elbette. Bunun iin yine ord() fonksiyonundan yararlanabiliriz:
>>> ord(u"") g 287

ord() fonksiyonu bir karakterin kod konumunu ondalk say olarak verecektir. Elde etti iniz g bu ondalk sayy unichr() fonksiyonuna vererek onaltlk halini ve dolaysyla unicode kod konumunu elde edebilirsiniz:
>>> unichr(287) u\u011f

Bu arada ord() fonksiyonunu burada nasl kulland mza dikkat edin. Sadece ord("") yazg g mak Pythonun hata vermesine sebep olacaktr. nk znde ord() fonksiyonu sadece 0256 aral ndaki ascii karakterlerle alr. E er yukardaki kodu ord("") seklinde yazarsanz, g s g g syle bir hata alrsnz:
>>> ord("") g ValueError: chr() arg not in range(256)

nin de eri 287 oldu u ve bu say da 256dan byk oldu u iin ord() fonksiyonu normal g g g g olarak bu karakteri gsteremeyecektir. Ama e er siz bu kodu ord(u"") seklinde bana bir g g s u har getirerek yaparsanz mutlu mesut yaamaya devam edebilirsiniz... Biraz sonra bu u s harnin tam olarak ne ie yarad n grece iz. Simdilik biz yine yolumuza kald mz yerden s g g g devam edelim. Isterseniz elimiz alsn diye dndaki bir Trke karakteri de inceleyelim. Mesela harni s g s alalm. Bu da yalnzca Trk alfabesinde bulunan bir harftir...
>>> ord(u"") 305

Demek ki harnin unicode kod konumu 305 imi... Ancak bildi iniz gibi bu ondalk bir s g de erdir. Unicode kod konumlar ise onaltlk sisteme gre gsterilir. O halde kodumuzu yazag lm:
>>> unichr(305) u\u0131

Burada Pythonun kendi ekledi i u\u ksmn atarsak 0131 saysn elde ederiz. Test etmek g amacyla bu 0131 saysnn ondalk karl n kontrol edebilece inizi biliyorsunuz: s g g
>>> int("0131", 16) 305

Simdi e er http://www.unicode.org/charts/PDF/U0100.pdf adresindeki unicode tablosuna baka g cak olursanz harnin kod konumunun gerekten de 0131 oldu unu greceksiniz. g Isterseniz bakn... Do rudan harni elde etmek isterseniz syle bir sey de yazabilirsiniz: g
>>> print u\u0131

Unicode sistemi bu kod konumlarndan oluan devasa bir tablodur. Unicode tablosuna s http://www.unicode.org/charts adresinden ulaabilirsiniz. Ancak unicode sadece bu kod kons umlarndan ibaret bir sistem de ildir. Zaten unicode sistemi sadece bu kod konumlarndan g ibaret olsayd pek bir ie yaramazd. nk unicode sistemindeki kod konumlarnn bilgisas yarlarda do rudan depolanmas mmkn de ildir. Bilgisayarlarn bu kod konumlarn ileyeg g s bilmesi iin bunlarn bayt olarak temsil edilebilmesi gerekir. ste unicode denen sistem bir de I bu kod konumlarn bilgisayarlarn ileyebilmesi iin bayta eviren kod zclere sahiptir. s Unicode sistemi iinde UTF-8, UTF-16 ve UTF-32 gibi kod zcler vardr. Bunlar arasnda en yaygn kullanlan UTF-8dir ve bu kodlama sistemi GNU/Linux sistemlerinde de standart olarak kabul edilir. Python programlama dili de 3.x srmlerinden itibaren varsaylan kodlama biimi olarak UTF-8i kullanr. Hemen bunu teyit edelim. Python 3.x srmnde syle bir komut verelim:
>>> import sys >>> sys.getdefaultencoding() utf-8

Yukarda da gsterdi imiz gibi, Pythonun 2.x srmlerinde bu komutun kts ascii idi... Kod g zcler her kod konumunu alp farkl bir biimde kodlarlar. Ufak bir rnek yapalm:
>>> unicode.encode(u"", "utf-8") g \xc4\x9f >>> unicode.encode(u"", "utf-16") g \xff\xfe\x1f\x01 >>> unicode.encode(u"", "utf-32") g \xff\xfe\x00\x00\x1f\x01\x00\x00

Buradaki unicode.encode() yapsna kafanz takmayn. Biraz sonra bunlar iyice inceleyece iz. Burada benim amacm sadece farkl kod zclerin karakterleri nasl kodlad n g g gstermek... Dedi im gibi, bu kod zcler iinde en gzde olan utf-8dir ve bu zc g GNU/Linuxta da standarttr.

18.4 Pythonda unicode Destegi


ascii ve unicodenin ne oldu unu rendik. g g konusunu ilemeye... s Simdi sra geldi Pythondaki unicode deste i g

Esasnda unicode konusundan bahsederken bunun Pythona yansmasnn bir ksmn da grmedik de il. rne in unichr() fonksiyonunu kullanarak bir kod konumunun hangi karakg g tere karlk geldi ini bulabilece imizi rendik: s g g g
>>> print unichr(351) s

Ancak daha nce syledi imiz seyler para para bilgiler ieriyordu. Bu blmde ise gerek g hayatta unicode ve Pythonu nasl ba datraca mz anlamaya alaca z. g s g s g Pythonda karakterlere ilikin iki farkl tip bulunur: karakter dizileri (strings) ve unicode s dizileri (unicode strings). Mesela su bir karakter dizisidir:
>>> "elma"

Hemen kontrol edelim:


>>> type("elma") <type str>

Su ise bir unicode dizisidir:


>>> u"elma"

Bunu da kontrol edelim:


>>> type(u"elma") <type unicode>

Grd nz gibi, unicode dizileri, karakter dizilerinin bana bir u har getirilerek kolayca g s elde edilebiliyor. Peki bir karakter dizisini unicode olarak tanmlamann bize ne faydas var? Bir rnek bin sze bedeldir!.. O yzden isterseniz derdimizi bir rnekle anlatmaya alalm. Suna bir bakn: s
>>> kardiz = "k" s >>> len(kardiz) 7

Grd nz gibi, k kelimesinde sadece drt karakter bulundu u halde len() fonksiyonu g s g 7 sonucunu veriyor... Bu blmn en banda bahsetti imiz makalede de syledi imiz gibi s g g len() fonksiyonu aslnda bir karakter dizisinde ka karakter oldu una bakmaz. Bu fonksiyonun g ilgilendi i sey o karakter dizisinin ierdi i bayt saysdr. k kelimesini etkileimli kabukta g g s s yazacak olursanz sorunun nerede oldu unu grebilirsiniz: g
>>> "k" s \xc4\xb1\xc5\x9f\xc4\xb1k

Burada xc4, xb1, xc5, x9f, xc4, xb1 ve k seklinde gsterilen toplam 7 baytlk bir veri var. Dolaysyla burada len() fonksiyonunun 4 kts vermesini bouna beklememek s lazm. Bir de suna bakn:
>>> unidiz = u"k" s >>> len(unidiz) 4

Grd nz gibi, k karakter dizisini unicode olarak tanmlad mzda Python bu dizideki g s g gerek karakter saysn verecektir. Isterseniz biraz nce yapt mz gibi uk adl unicode g s dizisini etkileimli kabukta yazarak durumu daha net grmeyi tercih edebilirsiniz: s
>>> u"k" s u\u0131\u015f\u0131k

Bu ktda grnen unicode kod konumlarna zellikle dikkat edin. Python bu kod konumlarn birer baytm gibi grecektir. E er unicode tablosunu ap bakarsanz, bu kod konumlarnn s g hangi harere karlk geldi ini grebilirsiniz. Veya daha nce syledi imiz gibi, su yolu da s g g kullanabilirsiniz:
>>> ord(u"\u0131") 305 >>> unichr(305) u\u0131 >>> print unichr(305)

Ya da bu aamay tek admda halletmek de isteyebilirsiniz: s


>>> print unichr(ord(u"\u0131"))

Demek ki karakter dizilerini unicode olarak tanmlamak programlarmzn almas asndan s hayati nem tayabiliyormu... Ama tabii bu daha iin ufak bir boyutu. Bir de suna bakn: s s s
>>> kardiz = "k" s >>> print kardiz.upper() K s

Gayet baarsz bir sonu! Karakter dizilerinin metotlarndan biri olan upper() metodu sadece s k harni bytebildi... Geri kalan hareri ise oldu u gibi brakt. Ama artk siz bu sorunun g stesinden nasl gelebilece imizi az ok tahmin ediyorsunuzdur: g
>>> unidiz = u"k" s >>> print unidiz.upper() IIK S

18.4.1 Python Betiklerinde unicode Destegi


Bu blmn banda ascii konusundan bahsederken, syle bir rnek vermitik: s s
print "Trke karakterler: I" s g

Dedik ki, e er bu satr bir metin dosyasna yazp kaydeder ve ardndan bu program altrrg s sanz syle bir hata mesaj alrsnz:
SyntaxError: Non-ascii character \xfc in file deneme.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

Esasnda biz bu hatann stesinden nasl gelebilece imizi daha nceki derslerimizde g edindi imiz bilgiler sayesinde ok iyi biliyoruz. Python derslerinin ta en bandan beri g s yazd mz bir satr, bizim yukardaki gibi bir hata almamz engelleyecektir: g
#-*-coding: utf-8-*-

Hatrlarsanz, unicode konusundan sz ederken unicode sistemi iinde baz kod zclerin yer ald n sylemitik. Orada da dedi imiz gibi, utf-8 de bu kod zclerden biri ve en gzde g s g olandr. Yukardaki satr yardmyla, yazd mz programn utf-8 ile kodlanmasn sa lyoruz. g g Bylelikle programmz iinde geen ascii d karakterler ktda dzgn gsterilebilecektir. s GNU/Linux sistemlerinde utf-8 kodlamas her zaman ie yarayacaktr. Ancak Windowsta utfs 8 yerine cp1254 adl zel bir kod zc kullanmanz gerekebilir. Dolaysyla e er Windows g kullanyorsanz yukardaki satr syle yazmanz gerekebilir:
#-*-coding: cp1254-*-

Yazaca nz betiklerin en bana yukardaki gibi bir satr koyarak, programlarnza unicode g s deste i vermi oluyorsunuz. Yazd nz o satr sayesinde Python kendi varsaylan kod zcs g s g olan asciiyi kullanarak programnzn kmesine sebep olmak yerine, sizin belirledi iniz g kod zc olan utf-8i (veya cp-1254) kullanarak programlarnzn iinde rahatlkla Ingilizce dndaki karakterleri de kullanmanza msaade edecektir. s Hatrlarsanz, unicode sistemleri iindeki kod konumlarnn bilgisayarlar asndan pek bir sey ifade etmedi ini, bunlarn bilgisayarlarda depolanabilmesi iin ncelikle uygun bir kod zc g yardm ile bilgisayarn anlayabilece i baytlara dntrlmesi gerekti ini sylemitik. g s g s Isterseniz biraz da bunun ne demek oldu unu anlamamza yardmc olacak birka rnek yapalm. g Biliyoruz ki, Pythonda unicode dizileri oluturmann en kolay yolu, karakter dizilerinin bana s s bir adet u har eklemektir:
>>> uni_diz = u"k" s

Bu unicode dizisini etkileimli kabukta yazdrd mz zaman syle bir kt elde ediyoruz: s g
>>> uni_diz u\u0131\u015f\u0131k

Burada grd nz sey bir bayt dizisi de ildir. Burada grd mz sey bir dizi unicode kod g g g konumudur... Dolaysyla bu unicode dizisi bu haliyle bilgisayarda depolanamaz. Isterseniz deneyelim:
>>> f = open("deneme.txt", "w") >>> f.write(uni_diz)

Bu kodlar syle bir hata verecektir:

Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: ascii codec cant encode characters in position 0-2: ordinal not in range(128)

Python, unicode kod konumlarndan olumu bir diziyi bilgisayara kaydetmek istedi imizde s s g olanca iyi niyetiyle bu kod konumlarn bilgisayarn anlayabilece i bir biime dntrmeye g s alr. Bunu yaparken de tabii ki varsaylan kod zcs olan asciiyi kullanmay dener. E er s g uni_diz adl de ikende sadece gs Ingilizce karakterler olsayd, Python bunlar ascii yardmyla bilgisayarn anlayabilece i bir biime evirir ve rahatlkla dosyaya yazdrabilirdi. Ancak bug rada bulunan Trke karakterler nedeniyle ascii kod zcs bu karakterleri zemez ve programn kmesine yol aar... Bu yzden bizim yapmamz gereken sey, unicode dizilerini depolayabilmek iin ncelikle bunlar uygun bir kod zc yardmyla bilgisayarn anlayabilece i bir biime getirmektir. Biraz sonra bunu nasl yapaca mz grece iz. Ama biz simdilik g g g yine yolumuza devam edelim. ascii, unicode ve bunlarn Pythonla ilikisi konusunda temel bilgileri edindi imize gre s g Pythondaki unicode deste inin biraz daha derinlerine inmeye balayabiliriz. Bunun iin isg s terseniz ncelikle unicode ile ilgili metotlara bir gz atalm.

18.4.2 unicode() Fonksiyonu


Hatrlarsanz Pythonda bir unicode dizisi oluturmak iin karakter dizisinin bana bir adet s s u har getirmemizin yeterli olaca n sylemitik. Ayn seyi unicode() adl bir fonksiyonu g s kullanarak da yapabiliriz:
>>> unicode("elma") >>> type(unicode("elma")) <type unicode>

Burada dikkat etmemiz gereken nemli bir nokta var. unicode() adl fonksiyon ikinci (ve hatta nc) bir parametre daha alr. nce ikinci parametrenin ne oldu una bakalm: g
>>> unicode("elma", "utf-8")

Burada elma adl karakter dizisini utf-8 adl kod zcy kullanarak bir unicode dizisi haline getirdik. asciinin kendisi unicode sistemi iinde yer almasa da, ascii tablosunda bulunan karakterler unicode sisteminde de ayn sekilde yer ald iin, burada kulland mz g g unicode() fonksiyonu bir karakter dizisini ascii ile kodlamamza da msaade eder:
>>> unicode("elma", "ascii")

Esasnda e er unicode() fonksiyonunun ikinci parametresini belirtmezseniz Python otomatik g olarak sizin asciiyi kullanmak istedi inizi varsayacaktr: g
>>> unicode("elma")

Peki karakter dizilerini bu sekilde kodlamak ne iimize yarar? Bunu anlamak iin syle bir s rnek verelim:
>>> a = "rnga" s >>> print a.upper() s RNGA

Grd nz gibi, karakter dizilerinin metotlarndan biri olan upper(), iindeki Trke karakg terlerden tr rnga kelimesini bytemedi. Bu kelimeyi dzgn bir sekilde bytebilmek s iin iki yntem kullanabilirsiniz. nce basit olann grelim:
>>> a = u"rnga" s >>> print a.upper() S IRINGA

Burada daha en batan rnga karakter dizisini unicode olarak tanmladk. Bu ilemi, karaks s s ter dizisinin bana sadece bir u har getirerek yaptk. Peki ya bataki karakter dizisini s s de itirme imkanmz yoksa ne olacak? ste bu durumda ikinci yolu tercih edebiliriz: gs I
>>> a = "rnga" s >>> b = unicode(a, "utf-8") >>> print b.upper() S IRINGA

unicode() fonksiyonu karakterleri daha esnek bir biimde kodlamamz sa lar. E er burada g g unicode() fonksiyonunu ikinci parametre olmadan a rrsanz hata mesaj alrsnz: g
>>> b = unicode(a) UnicodeDecodeError: ascii codec cant decode byte 0xc5 in position 0: ordinal not in range(128)

Daha nce de dedi imiz gibi, ikinci parametrenin belirtilmemesi durumunda Python ascii kod g zcsn kullanacaktr. O yzden, ve harerini dzgn grntleyebilmek iin bizim s utf-8 adl kod zcsn kullanmamz gerekiyor... unicode() adl fonksiyon nc bir parametre daha alr. Bu parametre, kullanlan kod zcnn, baz karakterleri dzgn kodlayamamas durumunda Pythonun ne yapmas gerekti ini belirler. Bu parametre farkl de er alr: strict, ignore ve replace. Hemen bir g g rnek verelim:
>>> b = unicode(a, "ascii", errors = "strict") UnicodeDecodeError: ascii codec cant decode byte 0xc5 in position 0: ordinal not in range(128)

Grd nz gibi, biraz nce ald mz hatann aynsn almamza sebep oldu bu kod... nk g g errors adl parametrenin varsaylan de eri stricttir. Peki strict ne anlama geliyor? E er g g errors adl parametreye de er olarak strict verirsek, kullanlan kod zcnn dzgn kodg layamad karakterlerle karlald nda Python bize bir hata mesaj gsterecektir. Dedi imiz g s s g g gibi, errorsun varsaylan de eri stricttir. Dolaysyla e er errors parametresini hi kullang g mazsanz, ters durumlarda Python size bir hata mesaj gsterir. Bu parametre strict dnda s ignore ve replace adl iki de er daha alabilir. nce ignorenin ne yapt na bakalm: g g
>>> b = unicode(a, "ascii", errors = "ignore") >>> print b.upper() RNGA

Burada ignore de eri, Pythonun herhangi bir ters durumda, zlemeyen karakteri es g gemesini sa lyor. Bu sebeple Python zlemeyen karakterleri tamamen ortadan kaldryor... g Peki replace de eri ne ie yaryor? Hemen bakalm: g s

>>> b = unicode(a, "ascii", errors = "replace") >>> print b.upper() ????R??NGA

Burada da Python zlemeyen karakterlerin yerine soru iaretleri yerletirdi... E er Pythonun s s g her karakter yerine neden iki soru iareti koydu unu merak ediyorsanz, bu blmn en s g banda ba lantsn verdi imiz makaleyi inceleyebilirsiniz (ipucu: len() fonksiyonunu kullas g g narak rnga kelimesindeki Trke karakterlerin uzunlu una bakn...) s g Bu anlatt mz konu ile ilgili olarak syle basit bir rnek verebiliriz: g
#-*-coding:utf-8-*a = raw_input("herhangi bir karakter yaznz: ") print a.upper()

E er kodlarmz bu sekilde yazarsak istedi imiz sonucu elde edemeyiz. Python ekranda g g girdi imiz Trke karakterleri bu sekilde dzgn bytemeyecektir. Yukardaki kodlarn alg s mas iin syle bir sey yazmalyz:
#-*-coding:utf-8-*a = raw_input("herhangi bir karakter yaznz: ") print unicode(a, "utf-8", errors = "replace").upper()

Bylece unicodeye duyarl bir program yazm olduk. Artk kullanclarmz s Ingiliz alfabesindeki harerin dnda bir harf girdiklerinde de programmz dzgn alacaktr. Kullancnn, tanns s mayan bir karakter girmesi ihtimaline karlk da errors parametresine replace de erini s g verdik... Yukardaki rne e benzer sekilde, e er kullanclarnzn girdi i karakterlerin saysna gre g g g ilem yapan bir uygulama yazyorsanz ya kullanclarnz ascii dnda karakter girmemeye s s zorlayacaksnz, ya da syle bir kod yazacaksnz:
#-*-coding:utf-8-*a = raw_input("Bir parola belirleyiniz: ") print "Parolanz %s karakter ieriyor!"%len(unicode(a, "utf-8", errors="replace"))

E er burada bir unicode dizisi oluturmazsanz lmeye alt nz karakter uzunlu u bekg s s g g ledi iniz gibi kmayacaktr. g Simdi tekrar unicode kod konumlarn dosyaya kaydetme meselesine dnelim. Bu ksmda rendi imiz unicode() fonksiyonu da kod konumlarn dosyaya kaydetmemizi sa lamaya g g g yetmeyecektir:
>>> >>> >>> >>> kardiz = "k" s unikod = unicode(kardiz, "utf-8") f = open("deneme.txt", "w") f.write(unikod)

Bu kodlar su hatay verir:


Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: ascii codec cant encode characters in position 0-2: ordinal not in range(128)

nk unicode() fonksiyonu da aslnda bir dntrme ilemi yapmaz. Bu fonksiyonun yapt s s g sey bir karakter dizisini kod konumlar seklinde temsil etmekten ibarettir... Bunu su sekilde teyit edebilirsiniz:
>>> kardiz = "k" s >>> unikod = unicode(kardiz, "utf-8") >>> unikod u\u0131\u015f\u0131k

Burada grd mz sey bayt de il unicode kod konumlardr... unicode() fonksiyonu iinde g g kulland mz utf-8 zcsnn grevi ise k kelimesini Pythonun do ru okumasn sa lag s g g maktr...

18.4.3 encode() ve decode() Metotlar


Hatrlarsanz, unicode sisteminde her bir karakterin bir kod konumuna sahip oldu unu g sylemitik. Karakterlerin kod konumlarn ya unicode tablolarna bakarak, ya da Pythondaki s ord() ve unichr() fonksiyonlarn kullanarak bulabilece inizi biliyorsunuz. Mesela: g
>>> unichr(ord(u"")) s

u\u015f

Benzer bir seyi unicode() metodunu kullanarak daha da kolay bir sekilde yapabilirsiniz:
>>> unicode(u"") s u\u015f

Burada unicode() fonksiyonunu tek parametreyle kulland mza dikkat edin. E er utf-8 g g veya baka bir kod zc kullanarak ikinci parametreyi de girersek Python burada bize bir s hata mesaj gsterecektir. Tekrar tekrar syledi imiz gibi, bu kod konumu esasnda bilgisayarlar iin ok fazla sey ifade g etmez. Bunlarn bir sey ifade edebilmesi iin bir kod zc vastasyla kodlanmas gerekir. Mesela bu kod konumunu utf-8 ile kodlamay tercih edebilirsiniz:
>>> kod_konumu = unicode(u"") s >>> utfsekiz = kod_konumu.encode("utf-8")

Burada encode() adl bir metottan yararland mza dikkat edin. g Bylece unicode kod konumunu utf-8 kod zcs ile kodlam oldunuz. E er zgn kod s g konumunu tekrar elde etmek isterseniz bu kez decode() adl baka bir metottan yararlans abilirsiniz:
>>> utfsekiz.decode("utf-8") u\u015f

ste Pythonda asl dntrme ilemlerini yapanlar bu encode() ve decode() adl metotlardr. I s s Dolaysyla artk syle bir sey yazabilirsiniz:
>>> >>> >>> >>> kardiz = "k" s unikod = unicode(kardiz, "utf-8") unibayt = unicode.encode(unikod, "utf-8") f = open("deneme.txt", "w")

>>> f.write(unibayt) >>> f.close()

Bu ksm ksaca zetleyecek olursak syle syleyebiliriz: Pythonda karakterlere ilikin iki farkl tip bulunur: karakter dizileri ve unicode dizileri s Mesela su bir karakter dizisidir:
>>> kardiz = "elma"

Bu karakter dizisi 4 baytlk bir veri ierir:


>>> len(kardiz) 4

Su da bir karakter dizisidir:


>>> kardiz = "k" s

Bu karakter dizisi ise 7 baytlk bir veri ierir:


>>> len(kardiz) 7

Buradan kan sonuca bakarak karakter dizisi ile bayt saysnn ayn sey olmad n anlam g s oluyoruz. Ayrca len() fonksiyonu da bir karakter dizisindeki karakter saysn de il bayt g saysn veriyor. kardiz adl de ikeni etkileimli kabukta yazdrrsak baytlar temsil eden karakterleri tek tek gs s grebiliriz:
>>> kardiz \xc4\xb1\xc5\x9f\xc4\xb1k

Su ise bir unicode dizisidir:


>>> unidiz = u"elma"

Grd nz gibi, Pythonda unicode dizisi oluturmak olduka kolay. Yapmamz gereken tek g s sey karakter dizisinin bana bir u har getirmek. s Su da bir unicode dizisidir:
>>> unidiz = u"k" s

Bu unicode dizisi, karakter dizilerinin aksine baytlardan de il unicode kod konumlarndan g oluur. E er yukardaki unicode dizisini etkileimli kabukta yazdracak olursanz bu unicode s g s kod konumlarn grebilirsiniz:
>>> unidiz u\u0131\u015f\u0131k

E er len() fonksiyonunu bu unicode dizisi zerine uygulayacak olursanz, len() fonksiyonu g her bir kod konumunu bir baytm gibi de erlendirecektir: s g

>>> len(unidiz) 4

Kod konumlarnn bir ie yarayabilmesi iin bunlarn uygun bir kod zc yardmyla bayta s evrilmeleri gerekir. Unicode sistemi iinde UTF-8, UTF-16 ve UTF-32 gibi kod zcler vardr. Bu kod zclerin her biri, kod konumlarn farkl bir biimde ve boyutta bayta evirir. Bu kod zcleri iinde en esnek ve yaygn olan utf-8 adl kod zcdr. Pythonda kod konumlarn bayta evirmek iin encode() adl bir metottan yararlanabiliriz:
>>> unidiz.encode("utf-8") \xc4\xb1\xc5\x9f\xc4\xb1k

Unicode kod konumlar bayta evrildikten sonra artk bir unicode dizisi de il, karakter dizisi g olur:
>>> type(unidiz.encode("utf-8") <type str>

E er bir karakter dizisini unicode kod konumlar ile temsil etmek isterseniz decode() metog dundan yararlanabilirsiniz:
>>> kardiz.decode("utf-8") u\u0131\u015f\u0131k

Yukardaki ilem sununla ayndr: s


>>> unicode(kardiz, "utf-8") u\u0131\u015f\u0131k

Bylece Pythondaki unicode deste ine ilikin en nemli metotlar grm olduk. g s s Pythonda unicodeye ilikin baz nemli modlleri de incelemeye geebiliriz... s

Artk

18.4.4 unicodedata Modl


Bu modl unicode veritabanna erierek, bu veritabanndaki bilgileri kullanmamz sa lar. s g Kk bir rnek verelim:
>>> import unicodedata >>> unicodedata.name(u"") g LATIN SMALL LETTER G WITH BREVE

harnin unicode sistemindeki uzun ad LATIN SMALL LETTER G WITH BREVEdir. E er g g isterseniz bu ismi ve lookup() metodunu kullanarak sz konusu karakterin unicode kod konumuna da ulaabilirsiniz: s
>>> unicodedata.lookup("LATIN SMALL LETTER G WITH BREVE") u\u011f

Bir de suna bakalm:

>>> unicodedata.category(u"") g L1

category() metodu ise bir unicode dizisinin unicode sistemindeki kategorisini gsteriyor. Yukarda verdi imiz rne e gre harnin kategorisi L1 yani Latin-1. g g g

18.4.5 codecs Modl


Bu modl Pythonda bir dosyay, kod zcy de belirterek amamz sa lar: g
import codecs f = codecs.open("unicode.txt", "r", encoding="utf-8") for i in f: print i

Bylece dosya iindeki ascii d karakterleri do ru grntleyebiliriz... s g Ayrca bu metot, yukardaki encode() metodunu kullanarak yapt mz dosyaya yazma ilemini g s biraz daha kolaylatrabilir: s
>>> >>> >>> >>> import codecs f = codecs.open("deneme.txt", "w", encoding="utf-8") f.write(u"k") s f.close()

Elbette codecs modlnn open() metodunu sadece yeni dosya oluturmak iin de il, s g her trl dosya ileminde kullanabilirsiniz. Bu metot, dosya ilemleri konusunu ilerken s s s grd mz open() metoduyla birbirine ok benzer. g Tpk o metotta oldu u gibi g codecs.open() metodunda da dosyalar w, r, a gibi kiplerde aabilirsiniz.

BLM

19

Dzenli fadeler (Regular I Expressions)

Dzenli ifadeler Python programlama dilindeki en etrelli konulardan biridir. Hatta dzenli ifadelerin Python iinde ayr bir dil olarak dnlmesi gerekti ini syleyenler dahi vardr. s g Btn zorluklarna ra men programlama deneyimimizin bir noktasnda mutlaka karmza g s kacak olan bu yapy renmemizde byk fayda var. Dzenli ifadeleri rendikten sonra, g g elle yaplmas saatler srecek bir ilemi saliseler iinde yapabildi inizi grd nzde eminim s g g dzenli ifadelerin ne byk bir nimet oldu unu anlayacaksnz. Tabii her gzel sey gibi, dzenli g ifadelerin nimetlerinden yararlanabilecek dzeye gelmek de biraz kan ve gzya istiyor. s Peki, dzenli ifadeleri kullanarak neler yapabiliriz? ok genel bir ifadeyle, bu yapy kullanarak metinleri veya karakter dizilerini parma mzda oynatabiliriz. rne in bir web sitesinde g g da nk halde duran verileri bir rpda ayklayabiliriz. Bu veriler, mesela, toplu halde grmek g istedi imiz web adreslerinin bir listesi olabilir. Bunun dnda, rne in, ok sayda belge zg s g erinde tek hareketle istedi imiz de iiklikleri yapabiliriz. g gs Genel bir kural olarak, dzenli ifadelerden kaabildi imiz mddete kamamz gerekir. E er g g Pythondaki karakter dizisi metotlar, o anda yapmak istedi imiz sey iin yeterli geliyorsa mutg laka o metotlar kullanmalyz. nk karakter dizisi metotlar, dzenli ifadelere kyasla hem daha basit, hem de ok daha hzldr. Ama bir noktadan sonra karakter dizilerini kullanarak yazd nz kodlar iyice karmaklamaya balamsa, kodlarn her taraf if deyimleriyle dolg s s s s musa, hatta basit bir ilemi gerekletirmek iin yazd nz kod sayfa snrlarn zorlamaya s s s g balamsa, ite o noktada artk dzenli ifadelerin dnyasna adm atmanz gerekiyor olabilir. s s s Ama bu durumda Jamie Zawinskinin su szn de aklnzdan karmayn: Bazlar, bir sorunla kar karya kaldklarnda syle der: Evet, dzenli ifadeleri kullanmam gerekiyor. ste onlarn s s I bir sorunu daha vardr artk... Bata da syledi im gibi, dzenli ifadeler bize zorluklar unutturacak kadar byk kolaylklar s g sunar. Emin olun yzlerce dosya zerinde tek tek elle de iiklik yapmaktan daha zor de ildir gs g dzenli ifadeleri renip kullanmak... Hem zaten biz de bu sayfalarda bu sevimsiz konuyu g olabildi ince sevimli hale getirmek iin elimizden gelen abay gsterece iz. Sizin de aba g g gstermeniz, bol bol altrma yapmanz durumunda dzenli ifadeleri kavramak o kadar da s zorlayc olmayacaktr. Unutmayn, dzenli ifadeler ne kadar u ratrc olsa da programcnn g s en nemli silahlarndan biridir. Hatta dzenli ifadeleri rendikten sonra onsuz geen yllarnza g acyacaksnz. Simdi laf daha fazla uzatmadan iimize koyulalm. s

289

19.1 Dzenli fadelerin Metotlar I


Pythondaki dzenli ifadelere ilikin her sey bir modl iinde tutuluyor. Bu modln ad re. s Tpk os modlnde, sys modlnde, Tkinter modlnde ve teki btn modllerde oldu u g gibi, dzenli ifadeleri kullanabilmemiz iin de ncelikle bu re modln ie aktarmamz gerekecek. Bu ilemi nasl yapaca mz ok iyi biliyorsunuz: s g
>>> import re

Bir nceki blmde syledi imiz gibi, dzenli ifadeler bir programcnn en nemli silahlarndan g biridir. Su halde silahmzn zelliklerine bakalm. Yani bu yapnn bize sundu u aralar syle g bir listeleyelim. Etkileimli kabukta su kodu yazyoruz: s
>>> dir(re)

Tabii yukardaki dir(re) fonksiyonunu yazmadan nce import re seklinde modlmz ie aktarm olmamz gerekiyor. s Grd nz gibi, re modl iinde epey metot/fonksiyon var. Biz bu sayfada ve ilerleyen g sayfalarda, yukardaki metotlarn/fonksiyonlarn en sk kullanlanlarn size olabildi ince yaln g bir sekilde anlatmaya alaca z. E er isterseniz, su komutu kullanarak yukardaki metot s g g lar/fonksiyonlar hakknda yardm da alabilirsiniz:
>>> help(metot_veya_fonksiyon_ad)

Bir rnek vermek gerekirse:


>>> help(re.match) Help on function match in module re: match(pattern, string, flags=0) Try to apply the pattern at the start of the string, returning a match object, or None if no match was found.

Ne yazk ki, Pythonun yardm dosyalar hep Ingilizce. Dolaysyla e er g Ingilizce bilmiyorsanz, bu yardm dosyalar pek iinize yaramayacaktr. s Bu arada yukardaki yardm blmnden kmak iin klavyedeki q d mesine basmanz g gerekir.

19.1.1 match() Metodu


Bir nceki blmde metotlar hakknda yardm almaktan bahsederken ilk rne imizi match() g metoduyla vermitik, o halde match() metodu ile devam edelim. s match() metodunu tarif etmek yerine, isterseniz bir rnek yardmyla bu metodun ne ie s yarad n anlamaya alalm. Diyelim ki elimizde syle bir karakter dizisi var: g s
>>> a = "python gl bir programlama dilidir."

Varsayalm ki biz bu karakter dizisi iinde python kelimesi geip gemedi ini renmek isg g tiyoruz. Ve bunu da dzenli ifadeleri kullanarak yapmak istiyoruz. Dzenli ifadeleri bu rne e g uygulayabilmek iin yapmamz gereken sey, ncelikle bir dzenli ifade kalb oluturup, daha s sonra bu kalb yukardaki karakter dizisi ile karlatrmak. Biz btn bu ilemleri match() s s s metodunu kullanarak yapabiliriz:

>>> re.match("python",a)

Burada, python seklinde bir dzenli ifade kalb oluturduk. Dzenli ifade kalplar match() s metodunun ilk argmandr (yani parantez iindeki ilk de er). g Ikinci argmanmz ise (yani parantez iindeki ikinci de er), hazrlad mz kalb kendisiyle eletirece imiz karakter dizisi g g s s g olacaktr. Klavyede ENTER tuuna bastktan sonra karmza syle bir kt gelecek: s s
<_sre.SRE_Match object at 0xb7d111e0>

Bu kt, dzenli ifade kalbnn karakter dizisi ile eleti i anlamna geliyor. Yani arad mz sey, s s g g karakter dizisi iinde bulunmu. Python bize burada ne buldu unu sylemiyor. Bize syledi i s g g tek sey, arad mz seyi buldu u. Bunu syleme tarz da yukardaki gibi... Yukardaki k g g tda grd mz ifadeye Pythoncada eleme nesnesi (match object) ad veriliyor. nk g s s match() metodu yardmyla yapt mz sey aslnda bir eletirme ilemidir (match kelimesi g s s s Ingilizcede elemek anlamna geliyor). Biz burada python dzenli ifadesinin a de ikeniyle s s gs eleip elemedi ine bakyoruz. Yani re.match("python",a) ifadesi aracl yla python s s s s g g ifadesi ile a de ikeninin tuttu u karakter dizisinin eleip elemedi ini sorguluyoruz. Bizim gs g s s s s g rne imizde python a de ikeninin tuttu u karakter dizisi ile eleti i iin bize bir eleme g gs g s s g s s nesnesi dndrlyor. Bir de su rne e bakalm: g
>>> re.match("Java",a)

Burada ENTER tuuna bast mzda hi bir kt almyoruz. Aslnda biz grmesek de Python s g burada None kts veriyor. E er yukardaki komutu syle yazarsak None ktsn biz de greg biliriz:
>>> print re.match("Java",a) None

Grd nz gibi, ENTER tuuna bastktan sonra None kts geldi. Demek ki Java ifadesi, g s a de ikeninin tuttu u karakter dizisi ile elemiyormu. Buradan kard mz sonuca gre, gs g s s s g Python match() metodu yardmyla arad mz seyi eletirdi i zaman bir eleme nesnesi g s s g s s (match object) dndryor. E er eleme yoksa, o zaman da None de erini dndryor. g s s g Biraz kafa kartrmak iin syle bir rnek verelim: s
>>> a = "Python gl bir dildir" >>> re.match("gl", a)

Burada a de ikeninde gl ifadesi geti i halde match() metodu bize bir eleme gs g s s nesnesi dndrmedi. Aslnda bu normal. nk match() metodu bir karakter dizisinin sadece en bana bakar. Yani Python gl bir dildir ifadesini tutan a de ikenine s gs re.match("gl",a) gibi bir fonksiyon uygulad mzda, match() metodu a de ikeninin g gs yalnzca en bana bakaca iin ve a de ikeninin en banda gl yerine python oldu u s g gs s g iin, match() metodu bize olumsuz yant veriyor. Aslnda match() metodunun yapt bu ii, karakter dizilerinin split() metodu yardmyla da g s yapabiliriz:
>>> a.split()[0] == "python" True

Demek ki a de ikeninin en banda python ifadesi varm. Bir de suna bakalm: gs s s

>>> a.split()[0] == "gl" False

Veya ayn ii sadece startswith() metodunu kullanarak dahi yapabiliriz: s


>>> a.startswith("python")

E er dzenli ifadelerden tek beklentiniz bir karakter dizisinin en bandaki veriyle eletirme g s s s ilemi yapmaksa, split() veya startswith() metotlarn kullanmak daha mantkldr. nk s split() ve startswith() metotlar match() metodundan ok daha hzl alacaktr. s match() metodunu kullanarak bir ka rnek daha yapalm:
>>> sorgu = "1234567890" >>> re.match("1",sorgu) <_sre.SRE_Match object at 0xb7d111e0> >>> re.match("1234",sorgu) <_sre.SRE_Match object at 0xb7d111e0> >>> re.match("124",sorgu) None

Isterseniz simdiye kadar rendi imiz seyleri syle bir gzden geirelim: g g 1. Dzenli ifadeler Pythonun ok gl aralarndan biridir. 2. Pythondaki dzenli ifadelere ilikin btn fonksiyonlar re adl bir modl iinde yer alr. s 3. Dolaysyla dzenli ifadeleri kullanabilmek iin ncelikle bu re modln import re diyerek ie aktarmamz gerekir. 4. re modlnn ieri ini dir(re) komutu yardmyla listeleyebiliriz. g 5. match() metodu re modl iindeki fonksiyonlardan biridir. 6. match() metodu bir karakter dizisinin yalnzca en bana bakar. s 7. E er arad mz sey karakter dizisinin en banda yer alyorsa, match() metodu bir g g s eletirme nesnesi dndrr. s s 8. E er arad mz sey karakter dizisinin en banda yer almyorsa, match() metodu None g g s de eri dndrr. g Daha nce syledi imiz gibi, match() metodu ile bir eletirme ilemi yapt mzda, e er g s s s g g eleme varsa Python bize bir eleme nesnesi dndrecektir. Ama biz bu ktdan, match() s s s s metodu ile bulunan seyin ne oldu unu gremiyoruz. Ama istersek tabii ki bulunan seyi de g grme imknmz var. Bunun iin group() metodunu kullanaca z: g
>>> a = "perl, python ve ruby yksek seviyeli dillerdir." >>> b = re.match("perl",a) >>> print b.group() perl

Burada, re.match("perl",a) fonksiyonunu bir de ikene atadk. Hatrlarsanz, bu fonksiygs onu komut satrna yazd mzda bir eleme nesnesi elde ediyorduk. ste burada de ikene g s s I gs

atad mz sey aslnda bu eleme nesnesinin kendisi oluyor. Bu durumu su sekilde teyit edeg s s bilirsiniz:
>>> type(b) <type _sre.SRE_Match>

Grd nz gibi, b de ikeninin tipi bir eleme nesnesi (match object). g gs s s Isterseniz bu nesnenin metotlarna bir gz gezdirebiliriz:
>>> dir(b)

Dikkat ederseniz yukarda kulland mz group() metodu listede grnyor. Bu metot, do rug g dan do ruya dzenli ifadelerin de il, eleme nesnelerinin bir metodudur. Listedeki br g g s s metotlar da sras geldi inde inceleyece iz. Simdi isterseniz bir rnek daha yapp bu konuyu g g kapatalm:
>>> iddia = "Adana memleketlerin en gzelidir!" >>> nesne = re.match("Adana", iddia) >>> print nesne.group()

Peki, eletirmek istedi imiz dzenli ifade kalb bulunamazsa ne olur? yle bir durumda s s g yukardaki kodlar hata verecektir. Hemen bakalm:
>>> nesne = re.match("stanbul", iddia) I >>> print nesne.group()

Hata mesajmz:
Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: NoneType object has no attribute group

Byle bir hata, yazd nz bir programn kmesine neden olabilir. O yzden kodlarmz suna g benzer bir sekilde yazmamz daha mantkl olacaktr:
>>> nesne = re.match("stanbul",iddia) I >>> if nesne: ... print "eleen ifade: %s" %nesne.group() s s ... else: ... print "eleme baarsz!" s s s

Simdi isterseniz bu match() metoduna bir ara verip baka bir metodu inceleyelim. s

19.1.2 search() Metodu


Bir nceki blmde inceledi imiz match() metodu, karakter dizilerinin sadece en bana bakyg s ordu. Ama her zaman istedi imiz sey bununla snrl olmayacaktr. match() metodunun, g karakter dizilerinin sadece bana bakmasn engellemenin yollar olmakla birlikte, bizim iimizi s s grecek ok daha kullanl bir metodu vardr dzenli ifadelerin. nceki blmde dir(re) seks linde gsterdi imiz listeye tekrar bakarsanz, orada re modlnn search() adl bir metodu g oldu unu greceksiniz. ste bu yazmzda inceleyece imiz metot bu search() metodu olacakg I g tr. search() metodu ile match() metodu arasnda ok nemli bir fark vardr. match() metodu bir karakter dizisinin en bana bakp bir eletirme ilemi yaparken, search() metodu karakter s s s s

dizisinin genelinde bir arama ilemi yapar. Yani biri eletirir, br arar. Zaten search kelimesi s s s de Ingilizcede aramak anlamna gelir... Hatrlarsanz, match() metodunu anlatrken syle bir rnek vermitik: s
>>> a = "Python gl bir dildir" >>> re.match("gl", a)

Yukardaki kod, karakter dizisinin banda bir eleme bulamad iin bize None de eri s s s g g dndryordu. Ama e er ayn ilemi syle yaparsak, daha farkl bir sonu elde ederiz: g s
>>> a = "Python gl bir dildir" >>> re.search("gl", a) <_sre.SRE_Match object at 0xb7704c98>

Grd nz gibi, search() metodu gl kelimesini buldu. nk search() metodu, g match() metodunun aksine, bir karakter dizisinin sadece ba tarafna bakmakla yetinmiyor, s karakter dizisinin geneli zerinde bir arama ilemi gerekletiriyor. Tpk match() metodunda s s oldu u gibi, search() metodunda da group() metodundan faydalanarak bulunan seyi grng tleyebiliriz:
>>> a = "Python gl bir dildir" >>> b = re.search("gl",a) >>> print b.group()

Simdiye kadar hep karakter dizileri zerinde altk. s Isterseniz biraz da listeler zerinde rnekler verelim. Syle bir listemiz olsun:
>>> liste = ["elma", "armut", "kebap"] >>> re.search("kebap", liste)

Ne oldu? Hata aldnz, de il mi? Bu normal. nk dzenli ifadeler karakter dizileri zg erinde iler. Bunlar do rudan listeler zerinde ilem yapamaz. O yzden bizim Pythona biraz s g s yardmc olmamz gerekiyor:
>>> for i in liste: ... b = re.search("kebap", i) ... if b: ... print b.group() ... kebap

Hatta simdiye kadar rendiklerimizle daha karmak bir seyler de yapabiliriz: g s


>>> import re >>> import urllib >>> f = urllib.urlopen("http://www.istihza.com") >>> for i in f.readlines(): ... b = re.search("programlama", i) ... if b: ... print b.group() ... programlama programlama

Grd nz gibi, http://www.istihza.com sayfasnda ka adet programlama kelimesi geiyg orsa hepsi ekrana dklyor. Siz isterseniz bu kodlar biraz daha gelitirebilirsiniz: s
#-*-coding:utf-8-*import re import urllib kelime = raw_input("istihza.comda aramak \ istediiniz kelime: ") g adres = urllib.urlopen("http://www.istihza.com") kar_dizisi = "".join(adres) nesne = re.search(kelime,kar_dizisi) if nesne: print "kelime bulundu: %s"%nesne.group() else: print "kelime bulunamad!: %s"%kelime

Ilerde bilgimiz artnca daha yetkin kodlar yazabilecek duruma gelece iz. Ama simdilik elimg izde olanlar ancak yukardaki kodu yazmamza msaade ediyor. Unutmayn, dzenli ifadeler sahasnda snma turlar atyoruz daha...

19.1.3 ndall() Metodu


Python komut satrnda, yani etkileimli kabukta, dir(re) yazd mz zaman ald mz listeye s g g tekrar bakarsak orada bir de findall() adl bir metodun oldu unu grrz. ste bu blmde g I findall() adl bu nemli metodu incelemeye alaca z. s g nce syle bir metin alalm elimize:
metin = """Guido Van Rossum Pythonu gelitirmeye 1990 ylnda balam... s s s Yani aslnda Python iin nispeten yeni bir dil denebilir. Ancak Pythonun ok uzun bir gemii olmasa da, bu dil teki dillere kyasla kolay olmas, s hzl olmas, ayr bir derleyici programa ihtiya duymamas ve bunun gibi pek ok nedenden tr ou kimsenin gzdesi haline gelmitir. Ayrca g s Googlenin de Pythona zel bir nem ve deer verdiini, ok iyi derecede g g Python bilenlere i olana sunduunu da hemen syleyelim. Mesela bundan s g g ksa bir sre nce Pythonun yaratcs Guido Van Rossum Googlede ie balad...""" s s

Bu metin iinde geen btn Python kelimelerini bulmak istiyoruz:


>>> print re.findall("Python",metin) [Python, Python, Python, Python, Python, Python]

Grd nz gibi, metinde geen btn Python kelimelerini bir rpda liste olarak aldk. Ayn g ilemi search() metodunu kullanarak yapmak istersek yolu biraz uzatmamz gerekir: s
>>> liste = metin.split() >>> for i in liste: ... nesne = re.search("Python",i) ... if nesne: ... print nesne.group() ...

Python Python Python Python Python Python

Grd nz gibi, metinde geen btn Python kelimelerini search() metodunu kullanarak g bulmak iin ncelikle metin adl karakter dizisini, daha nce karakter dizilerini ilerken s grd mz split() metodu yardmyla bir liste haline getiriyoruz. Ardndan bu liste zerinde g bir for dngs kurduktan sonra search() ve group() metotlarn kullanarak btn Python kelimelerini ayklyoruz. E er karakter dizisini yukardaki sekilde listeye dntrmezsek syle g s bir netice alrz:
>>> nesne = re.search("Python",metin) >>> print nesne.group() Python

Bu sekilde metinde geen sadece ilk Python kelimesini alabiliyoruz. E er, do rudan karakter g g dizisine, listeye dntrmeksizin, for dngs uygulamaya kalkarsak syle bir sey olur: s
>>> for i in a: ... nesne = re.search("Python",metin) ... if nesne: ... print nesne.group()

Grd nz gibi, yukardaki kod ekranmz Python ktsyla dolduruyor. E er en sonda g g print nesne.group() yazmak yerine print i yazarsanz, Pythonun ne yapmaya alt n s g ve neden byle bir kt verdi ini anlayabilirsiniz. g

19.2 Metakarakterler
Simdiye kadar dzenli ifadelerle ilgili olarak verdi imiz rnekler sizi biraz sartm olabilir. g s s Zor dedi in bunlar myd? diye dnm olabilirsiniz. Haklsnz, zira zor dedi im, bug s s g raya kadar olan ksmda verdi im rneklerden ibaret de ildir. Buraya kadar olan blmde g g verdi im rnekler iin en temel ksmn gzler nne sermek iindi. Simdiye kadar olan g s blmde, mesela, python karakter dizisiyle eletirme yapmak iin python kelimesini kuls s landk. Esasnda bu, dzenli ifadelerin en temel zelli idir. Yani python karakter dizisini bir g dzenli ifade sayacak olursak (ki zaten yledir), bu dzenli ifade en bata kendisiyle elees s s cektir. Bu ne demek? Syle ki: E er arad nz sey python karakter dizisi ise, kullanmanz g g gereken dzenli ifade de python olacaktr. Diyoruz ki: Dzenli ifadeler en bata kendileriyle s eleirler. Buradan su anlam kyor: Demek ki bir de kendileriyle elemeyen dzenli ifadeler s s s s var. ste bu durum, Pythondaki dzenli ifadelere kiili ini kazandran seydir. Biraz sonra ne I s g demek istedi imizi daha ak anlayacaksnz. Artk gerek anlamyla dzenli ifadelere giri g s yapyoruz! ncelikle, elimizde aa daki gibi bir liste oldu unu varsayalm: s g g
>>> liste = ["zcan", "mehmet", "sleyman", "selim", ... "kemal", "zkan", "esra", "dndar", "esin", ... "esma", "zhan", "zlem"]

Diyelim ki, biz bu liste iinden zcan, zkan ve zhan elerini ayklamak/almak istiyoruz. g Bunu yapabilmek iin yeni bir bilgiye ihtiyacmz var: Metakarakterler.

Metakarakterler; kabaca, programlama dilleri iin zel anlam ifade eden sembollerdir. rne in g daha nce grd mz \n bir bakma bir metakarakterdir. nk \n sembol Python g iin zel bir anlam tar. Python bu sembol grd yerde yeni bir satra geer. Yukarda s g kendisiyle elemeyen karakterler ifadesiyle kastetti imiz sey de ite bu metakarakterlerdir. s s g s rne in, a har yalnzca kendisiyle eleir. Tpk istihza kelimesinin yalnzca kendisiyle g s s eleece i gibi... Ama mesela \t ifadesi kendisiyle elemez. Python bu iareti grd s s g s s s g yerde sekme (tab) d mesine baslm gibi tepki verecektir. ste dzenli ifadelerde de buna g s I benzer metakarakterlerden yararlanaca z. Dzenli ifadeler iinde de, zel anlam ifade eden g pek ok sembol, yani metakarakter vardr. Bu metakarakterlerden biri de [ ] semboldr. Simdi yukarda verdi imiz listeden zcan, zhan ve zkan elerini bu sembolden yararla g g narak nasl ayklayaca mz grelim: g
>>> re.search("z[chk]an",liste)

Bu kodu byle yazmamamz gerekti ini artk biliyoruz. Aksi halde hata alrz. nk daha nce g de dedi imiz gibi, dzenli ifadeler karakter dizileri zerinde ilem yapabilir. Listeler zerinde g s de il. Dolaysyla komutumuzu su sekilde vermemiz gerekiyor: g
>>> for i in liste: ... nesne = re.search("z[chk]an",i) ... if nesne: ... print nesne.group()

Ayn ilemi su sekilde de yapabiliriz: s


>>> for i in liste: ... if re.search("z[chk]an",i): ... print i

Ancak, bu rnekte pek belli olmasa da, son yazd mz kod her zaman istedi imiz sonucu g g vermez. Mesela listemiz syle olsayd:
>>> liste = ["zcan demir", "mehmet", "sleyman", ... "selim", "kemal", "zkan nuri", "esra", "dndar", ... "esin", "esma", "zhan kamil", "zlem"]

Yukardaki kod bu liste zerine uyguland nda, sadece almak istedi imiz ksm de il, ilgisiz g g g ksmlar da gelecektir. Grd nz gibi, uygun kodlar kullanarak, zcan, zkan ve zhan g elerini listeden kolayca aykladk. Bize bu imkn veren sey ise [ ] adl metakarakter oldu. g Aslnda [ ] metakarakterinin ne ie yarad n az ok anlam olmalsnz. Ama biz yine de s g s syle bir bakalm bu metakaraktere. [ ] adl metakarakter, yukarda verdi imiz listedeki z ile balayp, c, h veya k g s harerinden herhangi biri ile devam eden ve an ile biten btn eleri ayklyor. Gelin g bununla ilgili bir rnek daha yapalm:
>>> for i in liste: ... nesne = re.search("es[mr]a",i) ... if nesne: ... print nesne.group()

Grd nz gibi, es ile balayp, m veya r harerinden herhangi biriyle devam eden g s ve sonunda da a har bulunan btn eleri aykladk. Bu da bize esma ve esra ktlarn g verdi... Dedi imiz gibi, metakarakterler programlama dilleri iin zel anlam ifade eden sembollerdir. g Normal karakterlerden farkl olarak, metakarakterlerle karlaan bir bilgisayar normalden s s farkl bir tepki verecektir. Yukarda metakarakterlere rnek olarak \n ve \t ka dizilerini s

vermitik. rne in Pythonda print "\n" gibi bir komut verdi imizde, Python ekrana \n s g g yazdrmak yerine bir alt satra geecektir. nk \n Python iin zel bir anlam tamaktadr. s Dzenli ifadelerde de birtakm metakarakterlerin kullanld n rendik. Bu metakarakterler, g g dzenli ifadeleri dzenli ifade yapan seydir. Bunlar olmadan dzenli ifadelerle yararl bir i s yapmak mmkn olmaz. Bu giri blmnde dzenli ifadelerde kullanlan metakarakterlere s rnek olarak [ ] semboln verdik. Herhangi bir dzenli ifade iinde [ ] semboln gren Python, do rudan do ruya bu sembolle eleen bir karakter dizisi aramak yerine, zel bir ilem g g s s s gerekletirecektir. Yani [ ] sembol kendisiyle elemeyecektir... s s s Pythonda bulunan temel metakarakterleri topluca grelim: [].*+?{}^$|() Do rudur, yukardaki karakterler, izgi romanlardaki kfrlere benziyor. Endielenmeyin, g s biz bu metakarakterleri olabildi ince sindirilebilir hale getirmek iin elimizden gelen abay g gsterece iz. g Bu blmde dzenli ifadelerin zor ksm olan metakarakterlere, okurlarmz rktmeden, yumuak bir giri yapmay amaladk. Simdi artk metakarakterlerin temelini att mza gre ste s s g kat kmaya balayabiliriz. s

19.2.1 [ ] (K eli Parantez) s


[ ] adl metakaraktere nceki blmde de inmitik. Orada verdi imiz rnek suydu: g s g
>>> for i in liste: ... nesne = re.search("z[chk]an",i) ... if nesne: ... print nesne.group()

Yukardaki rnekte, bir liste iinde geen zcan, zhan ve zkan elerini ayklyoruz. Burada g bu edeki farkl karakterleri (c, h ve k) keli parantez iinde nasl belirtti imize g s g dikkat edin. Python, keli parantez iinde grd btn karakterleri tek tek liste elerine s g g uyguluyor. nce z ile balayan btn eleri alyor, ardndan z hecesinden sonra c s g haryle devam eden ve an hecesi ile biten eyi buluyor. Bylece zcan esini bulmu g g s oldu. Ayn ilemi, z hecesinden sonra h harni barndran ve an hecesiyle biten eye s g uyguluyor. Bu sekilde ise zhan esini bulmu oldu. En son hedef ise z ile balayp k g s s har ile devam eden ve an ile biten e. Yani listedeki zkan esi... En nihayetinde de g g elimizde zcan, zhan ve zkan eleri kalm oluyor. g s Bir nceki blmde yine [ ] metakarakteriyle ilgili olarak su rne i de vermitik: g s
>>> for i in liste: ... nesne = re.search("es[mr]a",i) ... if nesne: ... print nesne.group()

Bu rne in de zcan, zkan, zhan rne inden bir fark yok. Burada da Python keli parang g s tez iinde grd btn karakterleri tek tek liste elerine uygulayp, esma ve esra elerini g g g bize veriyor. Simdi bununla ilgili yeni bir rnek verelim. Diyelim ki elimizde syle bir liste var:
>>> a = ["23BH56","TY76Z","4Y7UZ","TYUDZ","34534"]

Mesela biz bu listedeki eler iinde, sayyla balayanlar ayklayalm. g s dikkatlice inceleyin:
>>> for i in a: ... if re.match("[0-9]",i): ... print i ... 23BH56 4Y7UZ 34534

Simdi su kodlar

Burada parantez iinde kulland mz ifadeye dikkat edin. 0 ile 9 arasndaki btn eleri g g ieren bir karakter dizisi tanmladk. Yani ksaca, iinde herhangi bir say barndran eleri g kapsama alanmza aldk. Burada ayrca search() yerine match() metodunu kulland mza g da dikkat edin. match() metodunu kullanmamzn nedeni, bu metodun bir karakter dizisinin sadece en bana bakmas... Amacmz say ile balayan btn eleri ayklamak oldu una s s g g gre, yukarda yazd mz kod, liste eleri iinde yer alan ve say ile balayan btn eleri g g s g ayklayacaktr. Biz burada Pythona su emri vermi oluyoruz: Bana say ile balayan btn s s eleri bul! nemli olan bu elerin sayyla balamasdr! Sayyla balayan bu eler ister g g s s g hare devam etsin, ister baka bir karakterle... Sen yeter ki bana say ile balayan eleri s s g bul! Bu emri alan Python, hemen liste elerini gzden geirecek ve bize 23BH56, 4Y7UZ ve 34534 g elerini verecektir. Dikkat ederseniz, Python bize listedeki TY76Z ve TYUDZ elerini verg g medi. nk TY76Z iinde saylar olsa da bunlar bizim ltmze uyacak sekilde en bata s yer almyor. TYUDZ esinde ise tek bir say bile yok... g Simdi de isterseniz listedeki TY76Z esini nasl alabilece imize bakalm: g g
>>> for i in a: ... if re.match("[A-Z][A-Z][0-9]",i): ... print i

Burada dikkat ederseniz dzenli ifademizin banda A-Z diye bir sey yazdk. Bu ifade A ile s Z hareri arasndaki btn karakterleri temsil ediyor. Biz burada yalnzca byk hareri sorguladk. E er kk hareri sorgulamak isteseydik A-Z yerine a-z diyecektik. Dzenli g ifademiz iinde geen birinci A-Z ifadesi arad mz karakter dizisi olan TY76Z iindeki T g harni, ikinci A-Z ifadesi Y harni, 0-9 ifadesi ise 7 saysn temsil ediyor. Karakter dizisi iindeki geri kalan harer ve saylar otomatik olarak eletirilecektir. O yzden ons s lar iin ayr bir sey yazmaya gerek yok. Yalnz bu syledi imiz son sey sizi aldatmasn. Bu g otomatik eletirme ilemi bizim su anda kar karya oldu umuz karakter dizisi iin geers s s s s g lidir. Farkl nitelikteki karakter dizilerinin sz konusu oldu u baka durumlarda iler byle g s s yrmeyebilir. Dzenli ifadeleri baarl bir sekilde kullanabilmenin ilk sart, zerinde ilem s s yaplacak karakter dizisini tanmaktr. Bizim rne imizde yukardaki gibi bir dzenli ifade kalb g oluturmak iimizi gryor. Ama baka durumlarda, duruma uygun baka kalplar yazmak s s s s gerekebilir/gerekecektir. Dolaysyla, tek bir dzenli ifade kalbyla hayatn gemeyece ini ung utmamalyz. Simdi yukardaki kodu search() ve group() metotlarn kullanarak yazmay deneyin. Elde etti iniz sonular dikkatlice inceleyin. match() ve search() metotlarnn ne gibi farkllklara g sahip oldu unu kavramaya aln... Sorunuz olursa bana nasl ulaaca nz biliyorsunuz... g s s g Bu arada, dzenli ifadelerle ilgili daha fazla sey rendi imizde yukardaki kodu ok daha sade g g bir biimde yazabilece iz. g

19.2.2 . (Nokta)
Bir nceki blmde [ ] adl metakarakteri incelemitik. Bu blmde ise farkl bir metakarakteri s inceleyece iz. g Inceleyece imiz metakarakter: . g Bu metakarakter, yeni satr karakteri hari btn karakterleri temsil etmek iin kullanlr. Mesela:
>>> for i in liste: ... nesne = re.match("es.a",i) ... if nesne: ... print nesne.group() ... esma esra

Grd nz gibi, daha nce [ ] metakarakterini kullanarak yazd mz bir dzenli ifadeyi bu kez g g farkl sekilde yazyoruz. Unutmayn, bir dzenli ifade birka farkl sekilde yazlabilir. Biz bunlar iinde en basit ve en anlalr olann semeliyiz. Ayrca yukardaki kodu birka farkl sekilde de s yazabilirsiniz. Mesela su yazm da bizim durumumuzda geerli bir seenek olacaktr:
>>> for i in liste: ... if re.match("es.a",i): ... print i

Tabii ki biz, o anda zmek durumunda oldu umuz soruna en uygun olan seene i tercih g g etmeliyiz... Yalnz, unutmamamz gereken sey, bu . adl metakarakterin sadece tek bir karakterin yerini tutuyor olmasdr. Yani syle bir kullanm bize istedi imiz sonucu vermez: g
>>> liste = ["ahmet","kemal", "kamil", "mehmet"] >>> for i in liste: ... if re.match(".met",i): ... print i

Burada . sembol ah ve meh hecelerinin yerini tutamaz. . sembolnn grevi sadece tek bir karakterin yerini tutmaktr (yeni satr karakteri hari). Ama biraz sonra renece imiz g g metakarakter yardmyla ah ve meh hecelerinin yerini de tutabilece iz. g . semboln kullanarak bir rnek daha yapalm. Bir nceki blmde verdi imiz a listesini g hatrlyorsunuz:
>>> a = [23BH56, TY76Z, 4Y7UZ, TYUDZ, 34534]

nce bu listeye bir e daha ekleyelim: g


>>> a.append("1agAY54")

Artk elimizde syle bir liste var:


>>> a = [23BH56, TY76Z, 4Y7UZ, TYUDZ, ... 34534, "1agAY54"]

Simdi bu listeye syle bir dzenli ifade uygulayalm:


>>> for i in a: ... if re.match(".[0-9a-z]",i): ... print i ...

23BH56 34534 1agAY54

Burada yapt mz sey ok basit. Su zelliklere sahip bir karakter dizisi aryoruz: g 1. Herhangi bir karakter ile balayacak. Bu karakter say, harf veya baka bir karakter olas s bilir. 2. Ardndan bir say veya alfabedeki kk harerden herhangi birisi gelecek. 3. Bu ltleri karladktan sonra, arad mz karakter dizisi herhangi bir karakter ile devam s g edebilir. Yukardaki ltlere uyan karakter dizilerimiz: 23BH56, 34534, 1agAY54 Yine burada da kendinize gre birtakm de iiklikler yaparak, farkl yazm sekilleri ve farkl gs metotlar kullanarak ne olup ne bitti ini daha iyi kavrayabilirsiniz. Dzenli ifadeleri gere i gibi g g anlayabilmek iin bol bol uygulama yapmamz gerekti ini unutmamalyz. g

19.2.3 * (Yldz)
Bu metakarakter, kendinden nce gelen bir dzenli ifade kalbn sfr veya daha fazla sayda eletirir. Tanm biraz kark olsa da rnek yardmyla bunu da anlayaca z: s s s g
>>> yeniliste = ["st", "sat", "saat", "saaat", "falanca"] >>> for i in yeniliste: ... if re.match("sa*t",i): ... print i

Burada * sembol kendinden nce gelen a karakterini sfr veya daha fazla sayda eletiriyor. Yani mesela st iinde sfr adet a karakteri var. Dolaysyla bu karakter s s yazd mz dzenli ifadeyle eleiyor. sat iinde bir adet a karakteri var. Dolaysyla bu da g s s eleiyor. saat ve saaat karakter dizilerinde srasyla iki ve adet a karakteri var. Tabii s s ki bunlar da yazd mz dzenli ifadeyle eleiyor. Listemizin en son esi olan falancada da g s s g ilk hecede bir adet a karakteri var. Ama bu edeki sorun, bunun s haryle balamamas. g s nk biz yazd mz dzenli ifadede, arad mz seyin s har ile balamasn, sfr veya daha g g s fazla sayda a karakteri ile devam etmesini ve ardndan da t harnin gelmesini istemitik. s falanca esi bu koullar karlamad iin szgecimizin dnda kald. g s s g s Burada dikkat edece imiz nokta, * metakarakterinin kendinden nce gelen yalnzca bir g karakterle ilgileniyor olmas... Yani bizim rne imizde * sembol sadece a harnin sfr g veya daha fazla sayda bulunup bulunmamasyla ilgileniyor. Bu ilgi, en bataki s harni kaps samyor. s harnin de sfr veya daha fazla sayda elemesini istersek dzenli ifademizi s s s*a*t veya [sa]*t biiminde yazmamz gerekir... Bu iki seenek iinde [sa]*t seklindeki yazm tercih etmenizi tavsiye ederim. Burada, daha nce rendi imiz [ ] metakarakteri g g yardmyla sa harerini nasl gruplad mza dikkat edin... g Simdi . metakarakterini anlatrken istedi imiz sonucu alamad mz listeye dnelim. Orada g g ahmet ve mehmet elerini listeden baaryla ayklayamamtk. O durumda bizim g s s baarsz olmamza neden olan kullanm syleydi: s
>>> liste = ["ahmet", "kemal", "kamil", "mehmet"] >>> for i in liste: ... if re.match(".met",i): ... print i

Ama artk elimizde * gibi bir ara oldu una gre simdi istedi imiz seyi yapabiliriz. Yapmamz g g gereken tek sey . sembolnden sonra * semboln getirmek:
>>> for i in liste: ... if re.match(".*met",i): ... print i

Grd nz gibi ahmet ve mehmet elerini bu kez baaryla aykladk. Bunu yapmamz g g s sa layan sey de * adl metakarakter oldu... Burada Pythona su emri verdik: Bana kelime g banda herhangi bir karakteri (. sembol herhangi bir karakterin yerini tutuyor) sfr veya s daha fazla sayda ieren ve sonu da met ile biten btn eleri ver! g Bir nceki rne imizde a harnin sfr veya daha fazla sayda bulunup bulunmamasyla ilg gilenmitik. Bu son rne imizde ise herhangi bir harn/karakterin sfr veya daha fazla sayda s g bulunup bulunmamasyla ilgilendik. Dolaysyla .*met seklinde yazd mz dzenli ifade, ah g met, mehmet, muhammet, ismet, ksmet ve hatta tek bana met gibi btn eleri s g kapsayacaktr. Ksaca ifade etmek gerekirse, sonu met ile biten her sey (met ifadesinin kendisi de dhil olmak zere) kapsama alanmza girecektir. Bunu gnlk hayatta nerede kullanabilece inizi hemen anlam olmalsnz. Mesela bir dizin iindeki btn mp3 dosyalarn g s bu dzenli ifade yardmyla listeleyebiliriz:
>>> import os >>> import re >>> dizin = os.listdir(os.getcwd()) >>> for i in dizin: ... if re.match(".*mp3",i): ... print i

match() metodunu anlatt mz blmde bu metodun bir karakter dizisinin yalnzca g balangcyla ilgilendi ini sylemitik. Mesela o blmde verdi imiz su rne i hatrlyorsunuzs g s g g dur:
>>> a = "python gl bir dildir" >>> re.match("gl", a)

Bu rnekte Python bize kt olarak None de erini vermiti. Yani herhangi bir eleme bug s s s lamamt. nk dedi imiz gibi, match() metodu bir karakter dizisinin yalnzca en bana s g s bakar. Ama geldi imiz su noktada artk bu kstlamay nasl kaldraca nz biliyorsunuz: g g
>>> re.match(".*gl",a)

Ama match() metodunu bu sekilde zorlamak yerine performans asndan en do ru yol bu tr g iler iin search() metodunu kullanmak olacaktr. s Bunu da geti imize gre artk yeni bir metakarakteri incelemeye balayabiliriz. g s

19.2.4 + (Art)
Bu metakarakter, bir nceki metakarakterimiz olan * ile benzerdir. Hatrlarsanz, * metakarakteri kendisinden nceki sfr veya daha fazla sayda tekrar eden karakterleri ayklyordu. + metakarakteri ise kendisinden nceki bir veya daha fazla sayda tekrar eden karakterleri ayklar. Bildi iniz gibi, nceki rneklerimizden birinde ahmet ve mehmet elerini g g su sekilde ayklamtk: s

>>> for i in liste: ... if re.match(".*met",i): ... print i

Burada ahmet ve mehmet dnda met seklinde bir e de bu dzenli ifadenin kapsamna s g girecektir. Mesela listemiz syle olsa idi:
>>> liste = ["ahmet","mehmet","met","kezban"]

Yukardaki dzenli ifade bu listedeki met esini de iine alacakt. nk * adl metakarakg ter sfr sayda tekrar eden karakterleri de ayklyor. Ama bizim istedi imiz her zaman bu g olmayabilir. Bazen de, ilgili karakterin en az bir kez tekrar etmesini isteriz. Bu durumda yukardaki dzenli ifadeyi su sekilde yazmamz gerekir:
>>> for i in liste: ... if re.match(".+met",i): ... print i

Burada su komutu vermi olduk: Bana sonu met ile biten btn eleri ver! Ama bana met s g esini yalnz bana verme! Ayn ilemi search() metodunu kullanarak da yapabilece imizi g s s g biliyorsunuz:
>>> for i in liste: ... nesne = re.search(".+met",i) ... if nesne: ... nesne.group() ... ahmet mehmet

Bir de daha nce verdi imiz su rne e bakalm: g g


>>> yeniliste = ["st", "sat", "saat", "saaat", "falanca"] >>> for i in yeniliste: ... if re.match("sa*t",i): ... print i

Burada yazd mz dzenli ifadenin zelli i nedeniyle st de kapsama alan iine giriyordu. g g nk burada * sembol a karakterinin hi bulunmad durumlar da iine alyor. Ama g e er biz a karakteri en az bir kez gesin istiyorsak, dzenli ifademizi su sekilde yazmalyz: g
>>> for i in yeniliste: ... if re.match("sa+t",i): ... print i

Hatrlarsanz nceki derslerimizden birinde keli parantezi anlatrken syle bir rnek vers mitik: s
>>> a = ["23BH56","TY76Z","4Y7UZ","TYUDZ","34534"] >>> for i in a: ... if re.match("[A-Z][A-Z][0-9]",i): ... print i

Burada amacmz sadece TY76Z esini almakt. Dikkat ederseniz, enin bandaki T ve g g s Y harerini bulmak iin iki kez [A-Z] yazdk. Ama artk + metakarakterini rendi imize g g gre ayn ii daha basit bir sekilde yapabiliriz: s

>>> for i in a: ... if re.match("[A-Z]+[0-9]",i): ... print i ... TY76Z

Burada [A-Z] dzenli ifade kalbn iki kez yazmak yerine bir kez yazp yanna da + semboln koyarak, bu ifade kalbnn bir veya daha fazla sayda tekrar etmesini istedi imizi beg lirttik... + sembolnn ne i yapt n da anlad mza gre, artk yeni bir metakarakteri incelemeye s g g balayabiliriz. s

19.2.5 ? (Soru sareti) I


Hatrlarsanz, * karakteri sfr ya da daha fazla sayda elemeleri; + ise bir ya da daha s s fazla sayda elemeleri kapsyordu. ste simdi grece imiz ? sembol de eleme saysnn s s I g s s sfr veya bir oldu u durumlar kapsyor. Bunu daha iyi anlayabilmek iin nceden verdi imiz g g su rne e bakalm: g
>>> yeniliste = ["st", "sat", "saat", "saaat", "falanca"] >>> for i in yeniliste: ... if re.match("sa*t",i): ... print i ... st sat saat saaat >>> for i in yeniliste: ... if re.match("sa+t",i): ... print i ... sat saat saaat

* ve + sembollerinin hangi karakter dizilerini ayklad n gryoruz. Simdi de ? semg bolnn ne yapt na bakalm: g
>>> for i in yeniliste: ... if re.match("sa?t",i): ... print i ... st sat

Grd nz gibi, ? adl metakarakterimiz, kendisinden nce gelen karakterin hi bulung mad (yani sfr sayda oldu u) ve bir adet bulundu u durumlar iine alyor. Bu yzden de g g g kt olarak bize sadece st ve sat elerini veriyor. g Simdi bu metakarakteri kullanarak gerek hayatta karmza kabilecek bir rnek verelim. s Bu metakarakterin tanmna tekrar bakarsak, olsa da olur olmasa da olur diyebilece imiz g durumlar iin bu metakarakterin rahatlkla kullanlabilece ini grrz. g

Syle bir rnek verelim: Diyelim ki bir metin zerinde arama yapacaksnz. Arad nz kelime g uluslararas:

metin = """Uluslararas hukuk, uluslar aras ilikiler altnda bir disiplindir. Uluslararas ilikile s s

Not: Bu metin http://tr.wikipedia.org/wiki/Uluslararas%C4%B1_hukuk adresinden alnp zerinde ufak de iiklikler yaplmtr. gs s Simdi yapmak istedi imiz sey uluslararas kelimesini bulmak. Ama dikkat ederseniz metin g iinde uluslararas kelimesi ayn zamanda uluslar aras seklinde de geiyor. Bizim bu iki kullanm da kapsayacak bir dzenli ifade yazmamz gerekecek.
>>> nesne = re.findall("[Uu]luslar ?aras",metin) >>> for i in nesne: ... print i

Verdi imiz dzenli ifade kalbn dikkatlice inceleyin. Bildi iniz gibi, ? metakarakteri, g g kendinden nce gelen karakterin (dzenli ifade kalbn) sfr veya bir kez geti i durumlar g aryor. Burada ? semboln karakterinden, yani boluk karakterinden sonra kullandk. s Dolaysyla, boluk karakterinin sfr veya bir kez geti i durumlar hedeedik. Bu sekilde s g hem uluslar aras hem de uluslararas kelimesini ayklam olduk. Dzenli ifademizde s ayrca syle bir sey daha yazdk: [Uu]. Bu da gerekiyor. nk metnimiz iinde ulus lararas kelimesinin byk hare balad yerler de var... Bildi iniz gibi, uluslar ve Uluslar s g g kelimeleri asla ayn de ildir. Dolaysyla hem u harni hem de U harni bulmak iin, daha g nce rendi imiz [] metakarakterini kullanyoruz. g g

19.2.6 { } (Kme Parantezi)


{ } adl metakarakterimiz yardmyla bir elemeden ka adet istedi imizi belirtebiliyoruz. Yine s s g ayn rnek zerinden gidelim:
>>> for i in yeniliste: ... if re.match("sa{3}t",i): ... print i ... saaat

Burada a karakterinin 3 kez tekrar etmesini istedi imizi belirttik. Python da bu emrimizi g hemen yerine getirdi. Bu metakarakterin ilgin bir zelli i daha vardr. Kme iinde iki farkl g say yazarak, bir karakterin en az ve en ok ka kez tekrar etmesini istedi imizi belirtebiliriz. g rne in: g
>>> for i in yeniliste: ... if re.match("sa{0,3}t",i): ... print i ... st sat saat saaat

sa{0,3}t ifadesiyle, a harnin en az sfr kez, en ok da kez tekrar etmesini istedi imiz g syledik. Dolaysyla, a harnin sfr, bir, iki ve kez tekrar etti i durumlar ayklanm oldu. g s Bu say iftlerini de itirerek daha farkl sonular elde edebilirsiniz. Ayrca hangi say iftinin gs daha nce rendi imiz ? metakarakteriyle ayn ii yapt n bulmaya aln... g g s g s

19.2.7 ^ (Sapka)
^ sembolnn iki ilevi var. Birinci ilevi, bir karakter dizisinin en bandaki veriyi sorgulamaks s s tr. Yani aslnda match() metodunun varsaylan olarak yerine getirdi i ilevi bu metakarakter g s yardmyla aka belirterek yerine getirebiliyoruz. Su rne e bakalm: g
>>> a = [23BH56, TY76Z, 4Y7UZ, TYUDZ, ... 34534, 1agAY54] >>> for i in a: ... if re.search("[A-Z]+[0-9]",i): ... print i ... 23BH56 TY76Z 4Y7UZ 1agAY54

Bir de suna bakalm:


>>> for i in a: ... nesne = re.search("[A-Z]+[0-9]",i) ... if nesne: ... print nesne.group() ... BH5 TY7 Y7 AY5

Dikkat ederseniz, su son verdi imiz kod olduka hassas bir kt verdi bize. ktdaki btn g de erler, aynen dzenli ifademizde belirtti imiz gibi, yan yana bir veya daha fazla harf ieriyor g g ve sonra da bir say ile devam ediyor. Bu farkll n nedeni, ilk kodlarda print i ifadesini kulg lanmamz. Bu durumun ktlarmz nasl de itirdi ine dikkat edin. Bir de su rne e bakalm: gs g g
>>> for i in a: ... if re.match("[A-Z]+[0-9]",i): ... print i ... TY76Z

Burada sadece TY76Z ktsn almamzn nedeni, match() metodunun karakter dizilerinin en bana bakyor olmas. Ayn etkiyi search() metoduyla da elde etmek iin, balkta geen ^ s s (apka) sembolnden yararlanaca z: s g
>>> for i in a: ... nesne = re.search("^[A-Z]+[0-9]",i) ... if nesne: ... print nesne.group() ... TY7

Grd nz gibi, ^ (apka) metakarakteri search() metodunun, karakter dizilerinin sadece g s en bana bakmasn sa lad. O yzden de bize sadece, TY7 ktsn verdi. Hatrlarsanz ayn s g kodu, sapkasz olarak, su sekilde kullanmtk yukarda: s
>>> for i in a: ... nesne = re.search("[A-Z]+[0-9]",i) ... if nesne:

... ... BH5 TY7 Y7 AY5

print nesne.group()

Grd nz gibi, sapka sembol olmad nda search() metodu karakter dizisinin bana bakg g s makla yetinmiyor, ayn zamanda karakter dizisinin tamamn taryor. Biz yukardaki koda bir ^ sembol ekleyerek, metodumuzun sadece karakter dizisinin en bana bakmasn istes dik. O da emrimize sadakatle uydu. Burada dikkatimizi ekmesi gereken baka bir nokta s da search() metodundaki ktnn krplm olmas. Dikkat ettiyseniz, search() metodu bize s enin tamamn vermedi. elerin yalnzca [A-Z]+[0-9] kalbna uyan ksmlarn kesip att g g nmze. nk biz ona tersini sylemedik. E er elerin tamamn istiyorsak bunu ak ak g g belirtmemiz gerekir:
>>> for i in a: ... nesne = re.search("[A-Z]+[0-9].*",i) ... if nesne: ... print nesne.group() ... BH56 TY76Z Y7UZ AY54

Veya metodumuzun karakter dizisinin sadece en bana bakmasn istersek: s


>>> for i in a: ... nesne = re.search("^[A-Z]+[0-9].*",i) ... if nesne: ... print nesne.group() ... TY76Z

Bu kodlarda dzenli ifade kalbnn sonuna .* semboln ekledi imize dikkat edin. Bylelikle g metodumuzun sonu herhangi bir sekilde biten eleri bize vermesini sa ladk... g g Bata da syledi imiz gibi, ^ metakarakterinin, karakter dizilerinin en bana demir atmak s g s dnda baka bir grevi daha vardr: Hari anlamna gelmek... Bu grevini sadece [] s s metakarakterinin iinde kullanld zaman yerine getirir. Bunu bir rnekle grelim. Yukarg daki listemiz zerinde yle bir szge uygulayalm ki, 1agAY54 esi ktlarmz arasnda g grnmesin... Bu eyi avlayabilmek iin kullanmamz gereken dzenli ifade syle olacaktr: g [0-9A-Z][^a-z]+
>>> for i in a: ... nesne = re.match("[0-9A-Z][^a-z]+",i) ... if nesne: ... print nesne.group()

Burada su ltlere sahip bir e aryoruz: g 1. Arad mz e bir say veya byk harf ile balamal g g s 2. En bataki say veya byk harften sonra kk harf GELMEMEL (Bu lt ^ iareti s I s sa lyor) g 3. stelik bu kk harf gelmeme durumu bir veya daha fazla sayda tekrar etmeli... Yani bataki say veya byk harften sonra ka tane olursa olsun asla kk harf gelmemeli s

(Bu lt de + iareti sa lyor) s g Bu ltlere uymayan tek e 1agAY54 olacaktr. Dolaysyla bu e ktda grnmeyecek... g g Burada, ^ iaretinin nasl kullanld na ve kk hareri nasl darda brakt na dikkat s g s g edin. Unutmayalm, bu ^ iaretinin hari anlam sadece [] metakarakterinin iinde kuls lanld zaman geerlidir. g

19.2.8 $ (Dolar)
Bir nceki blmde ^ iaretinin, karakter dizilerinin en bana demir att n sylemitik. s s g s Yani bu sembol arama/eletirme ileminin karakter dizisinin en bandan balamasn sa lys s s s s g ordu. Bu sembol bir bakma karakter dizilerinin nasl balayaca n belirliyordu. ste simdi s g I grece imiz dolar iareti de ($) karakter dizilerinin nasl bitece ini belirliyor. Bu soyut akg s g lamalar somut bir rnekle ba layalm: g
>>> liste = ["at", "katk", "fakat", "atk", "rahat", ... "mat", "yat", "sat", "satlk", "katlm"]

Grd nz gibi, elimizde on elik bir liste var. Diyelim ki biz bu listeden, at hecesiyle biten g g kelimeleri ayklamak istiyoruz:
>>> for i in liste: ... if re.search("at$",i): ... print i ... at fakat rahat mat yat sat

Burada $ metakarakteri sayesinde arad mz karakter dizisinin nasl bitmesi gerekti ini beg g lirleyebildik. E er biz at ile balayan btn eleri ayklamak isteseydik ne yapmamz gerekg s g ti ini biliyorsunuz: g
>>> for i in liste: ... if re.search("^at",i): ... print i ... at atk

Grd nz gibi, ^ iareti bir karakter dizisinin nasl balayaca n belirlerken, $ iareti g s s g s ayn karakter dizisinin nasl bitece ini belirliyor. Hatta istersek bu metakarakterleri birlikte de g kullanabiliriz:
>>> for i in liste: ... if re.search("^at$",i): ... print i ... at

Sonu tam da bekledi imiz gibi oldu. Verdi imiz dzenli ifade kalb ile at ile balayan ve g g s ayn sekilde biten karakter dizilerini aykladk. Bu da bize at ktsn verdi.

19.2.9 \ (Ters Bl)


Bu iaret bildi imiz ka dizisidir... Peki burada ne ii var? Simdiye kadar rendi imiz konus g s s g g lardan grd nz gibi, Pythondaki dzenli ifadeler asndan zel anlam tayan bir takm g s semboller/metakarakterler var. Bunlar kendileriyle elemiyorlar. Yani bir karakter dizisi iinde s s bu sembolleri aryorsak e er, bunlarn tadklar zel anlam yznden bu sembolleri ayklag s mak hemencecik mmkn olmayacaktr. Yani mesela biz $ semboln aryor olsak, bunu Pythona nasl anlataca z? nk bu sembol yazd mz zaman Python bunu farkl alglyor. g g Laf dolandrmadan hemen bir rnek verelim... Diyelim ki elimizde syle bir liste var:
>>> liste = ["10$", "25", "20$", "10TL", "25"]

Amacmz bu listedeki dolarl de erleri ayklamaksa ne yapaca z? Sunu deneyelim nce: g g


>>> for i in liste: ... if re.match("[0-9]+$",i): ... print i

Python $ iaretinin zel anlamndan dolay, bizim sayyla biten bir karakter dizisi arad mz s g zannedecek, dolaysyla da herhangi bir kt vermeyecektir. nk listemizde sayyla biten bir karakter dizisi yok... Peki biz ne yapaca z? ste bu noktada \ metakarakteri devreye g I girecek... Hemen bakalm:
>>> for i in liste: ... if re.match("[0-9]+\$",i): ... print i ... 10$ 20$

Grd nz gibi, \ semboln kullanarak $ iaretinin zel anlamndan katk... Bu g s metakarakteri de ksaca anlatt mza gre yeni bir metakarakterle yolumuza devam edebilig riz...

19.2.10 | (Dik izgi)


Bu metakarakter, birden fazla dzenli ifade kalbn birlikte eletirmemizi sa lar. Bu ne des s g mek? Hemen grelim:
>>> liste = ["at", "katk", "fakat", "atk", "rahat", ... "mat", "yat", "sat", "satlk", "katlm"] >>> for i in liste: ... if re.search("^at|at$",i): ... print i ... at fakat atk rahat mat yat sat

Grd nz gibi | metakarakterini kullanarak bata ve sonda at hecesini ieren kelimeleri g s aykladk. Ayn sekilde, mesela, renkleri ieren bir listeden belli renkleri de ayklayabiliriz bu metakarakter yardmyla...
... ... if re.search("krmz|mavi|sar",i): print i

Srada son metakarakterimiz olan () var...

19.2.11 ( ) (Parantez)
Bu metakarakter yardmyla dzenli ifade kalplarn gruplayaca z. Bu metakarakter bizim bir g karakter dizisinin istedi imiz ksmlarn ayklamamzda ok byk kolaylklar sa layacak. g g Diyelim ki biz http://www.istihza.com/py2/icindekiler_python.html adresindeki btn balklar s ve bu balklara ait html dosyalarn bir liste halinde almak istiyoruz. Bunun iin syle bir sey s yazabiliriz:
import re import urllib url = "http://www.istihza.com/py2/icindekiler_python.html" f = urllib.urlopen(url) for i in f: nesne = re.search(<a href=".+html">.+</a>,i) if nesne: print nesne.group()

Burada yapt mz sey su: g 1. ncelikle http://www.istihza.com/py2/icindekiler_python.html sayfasn urllib modl yardmyla atk. Amacmz bu sayfadaki balklar ve bu balklara ait html dosyalarn s s listelemek 2. Ardndan, btn sayfay taramak iin basit bir for dngs kurduk 3. Dzenli ifade kalbmz syle yazdk: <a href=".+html">.+</a>. nk bahsi geen web sayfasndaki html uzantl dosyalar a href= tag iinde yer alyor. Bu durumu, web taraycnzda http://www.istihza.com/py2/icindekiler_python.html sayfasn ap sayfa kayna n grntleyerek teyit edebilirsiniz. (Firefoxta CTRL+Uya basarak g sayfa kayna n grebilirsiniz) g 4. Yazd mz dzenli ifade kalb iinde dikkatimizi ekmesi gereken baz noktalar var: g Kalbn (.+html) ksmnda geen + metakarakteri kendisinden nce gelen dzenli ifadenin bir veya daha fazla sayda tekrar eden elemelerini buluyor. Burada + s s metakarakterinden nce gelen dzenli ifade, kendisi de bir metakarakter olan . sembol... Bu sembol bildi iniz gibi, herhangi bir karakter anlamna geliyor. Dolaysyla g .+ ifadesi su demek oluyor: Bana bir veya daha fazla sayda tekrar eden btn karak terleri bul! Dolaysyla burada (.+html) ifadesini birlikte dnrsek, yazd mz sey s g su anlama geliyor: Bana html ile biten btn karakter dizilerini bul! 5. http://www.istihza.com/py2/icindekiler_python.html adresinin kayna na g bakt mz zaman arad mz bilgilerin hep su sekilde oldu unu gryoruz: g g g <a href=tbilgi_giris.html>Temel Bilgiler</a> Dolaysyla aslnda dzenli ifade kalbmz yazarken yapt mz sey, dzenli ifademizi kaynakta grnen sablona uydurmak... g

Yukarda verdi imiz kodlar altrd mz zaman ald mz kt su sekilde oluyor: g s g g


<a href="index.html">ANA SAYFA</a> ... ... ...

Hemen hemen amacmza ulatk saylr. Ama grd nz gibi ktmz biraz karmak. Bunlar s g s istedi imiz gibi dzenleyebilsek iyi olurdu, de il mi? Mesela bu ktlar su sekilde dzenleyeg g bilmek ho olurdu: s
Balk: ANA SAYFA; Balant: index.html s g

ste bu blmde grece imiz ( ) metakarakteri istedi imiz seyi yapmada bize yardmc olaI g g cak. Dilerseniz en bata verdi imiz kodlara tekrar dnelim: s g
import re import urllib url = "http://www.istihza.com/py2/icindekiler_python.html" f = urllib.urlopen(url) for i in f: nesne = re.search(<a href=".+html">.+</a>,i) if nesne: print nesne.group()

Simdi bu kodlarda su de iikli i yapyoruz: gs g


#-*-coding:utf-8-*import re import urllib url = "http://www.istihza.com/py2/icindekiler_python.html" f = urllib.urlopen(url) for i in f: nesne = re.search(<a href="(.+html)">(.+)</a>,i) if nesne: print "Balk: %s;\nBalant: %s\n" \ s g %(nesne.group(2),nesne.group(1))

Kodlarda yapt mz de iikliklere dikkat edin ve anlamaya aln. Baz noktalar gznze g gs s karanlk grndyse hi endie etmeyin, nk bir sonraki blmde btn karanlk noktalar s tek tek aklayaca z. Burada en azndan, ( ) metakarakterini kullanarak dzenli ifadenin g baz blmlerini nasl gruplad mza dikkat edin. g Bu arada, elbette www.istihza.com sitesinde herhangi bir de iiklik olursa yukardaki kodgs larn istedi iniz kty vermeyece ini bilmelisiniz. nk yazd mz dzenli ifade istihza.com g g g sitesinin sayfa yapsyla sk skya ba lantldr. g

19.3 E le me Nesnelerinin Metotlar s s


19.3.1 group() metodu
Bu blmde do rudan dzenli ifadelerin de il, ama dzenli ifadeler kullanlarak retilen g g eleme nesnelerinin bir metodu olan group() metodundan bahsedece iz. Esasnda biz bu s s g metodu nceki blmlerde de kullanmtk. Ama burada bu metoda biraz daha ayrntl olarak s bakaca z. g Daha nceki blmlerden hatrlayaca nz gibi, bu metot dzenli ifadeleri kullanarak g eletirdi imiz karakter dizilerini grme imkan sa lyordu. Bu blmde bu metodu () s s g g metakarakteri yardmyla daha verimli bir sekilde kullanaca z. g Isterseniz ilk olarak syle basit bir rnek verelim:
>>> a = "python bir program:lama dilidir" >>> nesne = re.search("(python) (bir) (programlama) (dilidir)",a) >>> print nesne.group() python bir programlama dilidir

Burada dzenli ifade kalbmz nasl gruplad mza dikkat edin. print nesne.group() komug tunu verdi imizde eleen karakter dizileri ekrana dkld. Simdi bu gruplad mz blmlere g s s g tek tek erielim: s
>>> print nesne.group(0) python bir programlama dilidir

Grd nz gibi, 0 indeksi eleen karakter dizisinin tamamn veriyor. Bir de suna bakalm: g s s
>>> print nesne.group(1) python

Burada 1 numaral grubun esi olan pythonu aldk. Gerisinin nasl olaca n tahmin edeg g bilirsiniz:
>>> print nesne.group(2) bir >>> print nesne.group(3) programlama >>> print nesne.group(4) dilidir

Bu metodun bize ilerde ne byk kolaylklar sa layaca n az ok tahmin ediyorsunuzdur. g g Isterseniz kullanabilece imiz metotlar tekrar listeleyelim: g
>>> dir(nesne)

Bu listede group() dnda bir de groups() adl bir metodun oldu unu gryoruz. Simdi bunun s g ne i yapt na bakalm. s g

19.3.2 groups() metodu


Bu metot, bize kullanabilece imiz btn gruplar bir demet halinde sunar: g
>>> print nesne.groups() (python, bir, programlama, dilidir)

Simdi isterseniz bir nceki blmde yapt mz rne e geri dnelim: g g


#-*-coding:utf-8-*import re import urllib url = "http://www.istihza.com/py2/icindekiler_python.html" f = urllib.urlopen(url) for i in f: nesne = re.search(<a href="(.+html)">(.+)</a>,i) if nesne: print "Balk: %s;\nBalant: %s\n" \ s g %(nesne.group(2),nesne.group(1))

Bu kodlarda son satr syle de itirelim: gs


#-*-coding:utf-8-*import re import urllib url = "http://www.istihza.com/py2/icindekiler_python.html" f = urllib.urlopen(url) for i in f: nesne = re.search(<a href="(.+html)">(.+)</a>,i) if nesne: print nesne.groups()

Grd nz gibi suna benzer ktlar elde ediyoruz: g


(index.html, ANA SAYFA) (icindekiler_python.html, PYTHON) (icindekiler_tkinter.html, TKINTER) (makaleler.html, MAKALELER) ... ... ...

Demek ki nesne.groups() komutu bize () metakarakteri ile daha nceden gruplam oldu us g muz eleri bir demet olarak veriyor. Biz de bu demetin elerine daha sonradan rahatlkla g g eriebiliyoruz... s Bylece eletirme nesnelerinin en sk kullanlan iki metodunu grm olduk. Bunlar daha s s s sonraki rneklerimizde de bol bol kullanaca z. O yzden simdilik bu konuya ara verelim. g

19.3.3 zel Diziler


Dzenli ifadeler iinde metakarakterler dnda, zel anlamlar tayan baz baka ifadeler de s s s vardr. Bu blmde bu zel dizileri inceleyece iz: Boluk karakterinin yerini tutan zel dizi: \s g s Bu sembol, bir karakter dizisi iinde geen boluklar yakalamak iin kullanlr. rne in: s g
>>> a = ["5 Ocak", "27Mart", "4 Ekim", "Nisan 3"] >>> for i in a: ... nesne = re.search("[0-9]\s[A-Za-z]+",i) ... if nesne: ... print nesne.group() ... 5 Ocak 4 Ekim

Yukardaki rnekte, bir say ile balayan, ardndan bir adet boluk karakteri ieren, sonra da bir s s byk veya kk hare devam eden karakter dizilerini aykladk. Burada boluk karakterini s s simgesi ile gsterdi imize dikkat edin. g Ondalk Saylarn Yerini Tutan zel Dizi: \d Bu sembol, bir karakter dizisi iinde geen ondalk saylar eletirmek iin kullanlr. Buraya s s kadar olan rneklerde bu ilevi yerine getirmek iin [0-9] ifadesinden yararlanyorduk. Simdi s artk ayn ilevi daha ksa yoldan, \d dizisi ile yerine getirebiliriz. s Isterseniz yine yukardaki rnekten gidelim:
>>> a = ["5 Ocak", "27Mart", "4 Ekim", "Nisan 3"] >>> for i in a: ... nesne = re.search("\d\s[A-Za-z]+",i) ... if nesne: ... print nesne.group() ... 5 Ocak 4 Ekim

Burada, [0-9] yerine \d yerletirerek daha ksa yoldan sonuca vardk. s Alfanmerik Karakterlerin Yerini Tutan zel Dizi: \w Bu sembol, bir karakter dizisi iinde geen alfanmerik karakterleri ve buna ek olarak _ karakterini bulmak iin kullanlr. Su rne e bakalm: g
>>> a = "abc123_$%+" >>> print re.search("\w*",a).group() abc123_

\w zel dizisinin hangi karakterleri eledi ine dikkat edin. Bu zel dizi su ifadeyle ayn ans g lama gelir:
[A-Za-z0-9_]

Dzenli ifadeler iindeki zel diziler genel olarak bunlardan ibarettir. Ama bir de bunlarn byk hari versiyonlar vardr ki, nemli olduklar iin onlar da inceleyece iz. g Grd nz gibi; g 1. \s zel dizisi boluk karakterlerini avlyor s

2. \d zel dizisi ondalk saylar avlyor 3. \w zel dizisi alfanmerik karakterleri ve _ karakterini avlyor Dedik ki, bir de bunlarn byk hari versiyonlar vardr. ste bu byk hari versiyonlar da I yukardaki dizilerin yapt iin tam tersini yapar. Yani: g s 1. \S zel dizisi boluk olmayan karakterleri avlar s 2. \D zel dizisi ondalk say olmayan karakterleri avlar. Yani [^0-9] ile ede erdir. s g 3. \W zel dizisi alfanmerik olmayan karakterleri ve _ olmayan karakterleri avlar. Yani [^A-Z-a-z_] ile ede erdir. \D ve \W dizilerinin yeterince anlalr oldu unu zannediyos g s g rum. Burada sanrm sadece \S dizisi bir rnekle somutlatrlmay hakediyor: s
>>> a = ["5 Ocak", "27Mart", "4 Ekim", "Nisan 3"] >>> for i in a: ... nesne = re.search("\d+\S\w+",i) ... if nesne: ... print nesne.group() ... 27Mart

Burada \S zel dizisinin listede belirtilen konumda boluk iermeyen eyi nasl buldu una s g g dikkat edin. Simdi bu zel diziler iin genel bir rnek verip konuyu kapatalm... Bilgisayarmzda su bilgileri ieren adres.txt adl bir dosya oldu unu varsayyoruz: g
esra : istinye 05331233445 esma : levent 05322134344 sevgi : dudullu 05354445434 kemal : sanayi 05425455555 osman : tahtakale 02124334444 metin : taksim 02124344332 kezban : caddebostan 02163222122

Amacmz bu dosyada yer alan isim ve telefon numaralarn isim > telefon numaras seklinde almak:
# -*- coding: utf-8 -*import re dosya = open("adres.txt") for i in dosya.readlines(): nesne = re.search("(\w+)\s+:\s(\w+)\s+(\d+)",i) if nesne: print "%s > %s"%(nesne.group(1),nesne.group(3))

Burada formlmz su sekilde: Bir veya daha fazla karakter + bir veya daha fazla boluk s + : iareti + bir adet boluk + bir veya daha fazla say s s Isterseniz bu blm ok basit bir soruyla kapatalm. Sorumuz su: Elimizde su adresteki gibi bir y n var: http://www.istihza.com/denemeler/yigin.txt g Yapmanz gereken, bu y n iindeki gizli mesaj dzenli ifadeleri kullanarak bulmak... Cevapg larnz kistihza[at]yahoo[nokta]com adresine gnderebilirsiniz.

19.4 Dzenli fadelerin Derlenmesi I


19.4.1 compile() metodu
En bata da syledi imiz gibi, dzenli ifadeler karakter dizilerine gre biraz daha yava alrs g s s lar. Ancak dzenli ifadelerin ileyiini hzlandrmann da baz yollar vardr. Bu yollardan biri s s de compile() metodunu kullanmaktr. compile kelimesi Ingilizcede derlemek anlamna gelir. ste biz de bu compile() metodu yardmyla dzenli ifade kalplarmz kullanmadan I nce derleyerek daha hzl almalarn sa layaca z. Kk boyutlu projelerde compile() s g g metodu pek hissedilir bir fark yaratmasa da zellikle byk apl programlarda bu metodu kullanmak olduka faydal olacaktr. Basit bir rnekle balayalm: s
>>> liste = ["Python2.4", "Python2.5", "Python2.6", ... "Python3.0", "Java"] >>>derli = re.compile("[A-Za-z]+[0-9]\.[0-9]") >>> for i in liste: ... nesne = derli.search(i) ... if nesne: ... print nesne.group() ... Python2.4 Python2.5 Python2.6 Python3.0

Burada ncelikle dzenli ifade kalbmz derledik. Derleme ilemini nasl yapt mza dikkat s g edin. Derlenecek dzenli ifade kalbn compile() metodunda parantez iinde belirtiyoruz. Daha sonra search() metodunu kullanrken ise, re.search() demek yerine, derli.search() seklinde bir ifade kullanyoruz. Ayrca dikkat ederseniz derli.search() kullanmnda parantez iinde sadece eleecek karakter dizisini kullandk (i). E er derleme ilemi yapmam olsaydk, s s g s s hem bu karakter dizisini, hem de dzenli ifade kalbn yan yana kullanmamz gerekecektir. Ama dzenli ifade kalbmz yukarda derleme ilemi esnasnda belirtti imiz iin, bu kalb ikinci s g kez yazmamza gerek kalmad. Ayrca burada kulland mz dzenli ifade kalbna da dikkat g edin. Nasl bir sablon oturttu umuzu anlamaya aln. Grd nz gibi, liste elerinde g s g g bulunan . iaretini eletirmek iin dzenli ifade kalb iinde \. ifadesini kullandk. nk s s s bildi iniz gibi, tek bana . iaretinin Python asndan zel bir anlam var. Dolaysyla bu g s s zel anlamdan kamak iin \ iaretini de kullanmamz gerekiyor. s Simdi isterseniz kk bir rnek daha verelim. Diyelim ki amacmz gnlk dolar kurunu almak olsun. Bu i iin http://www.tcmb.gov.tr/kurlar/today.html adresini kullanaca z: s g
#-*-coding:utf8-*import re import urllib f = urllib.urlopen("http://www.tcmb.gov.tr/kurlar/today.html") derli = re.compile("ABD\sDOLARI\s+[0-9]\.[0-9]+") nesne = derli.search(f.read()) print nesne.group()

Burada kulland mz \s adl zel diziyi hatrlyorsunuz. Bu zel dizinin grevi karakter dizileri g

iindeki boluklarn yerini tutmakt. Mesela bizim rne imizde ABD ve DOLARI kelimeleri s g arasndaki bolu un yerini tutuyor. Ayrca yine DOLARI kelimesi ile 1 dolarn TL karl olan s g s g de erin arasndaki boluklarn yerini de tutuyor. Yalnz dikkat ederseniz \s ifadesi tek bana g s s sadece bir adet bolu un yerini tutar. Biz onun birden fazla bolu un yerini tutmas iin yanna s g s g bir adet + metakarakteri yerletirdik. Ayrca burada da . iaretinin yerini tutmas iin \. s s ifadesinden yararlandk.

19.5 compile() ile Derleme Seenekleri


Bir nceki blmde compile() metodunun ne oldu unu, ne ie yarad n ve nasl kullanld n g s g g grmtk. Bu blmde ise compile (derleme) ilemi srasnda kullanlabilecek seenekleri s s anlataca z. g

19.5.1 re.IGNORECASE veya re.I


Bildi iniz gibi, Pythonda byk-kk harer nemlidir. Yani e er python kelimesini aryorg g sanz, alaca nz ktlar arasnda Python olmayacaktr. nk python ve Python birg birlerinden farkl iki karakter dizisidir. ste re.IGNORECASE veya ksaca re.I adl derleme I seenekleri bize byk-kk harfe dikkat etmeden arama yapma imkan sa lar. Hemen bir g rnek verelim:
#-*-coding:utf8-*import re metin = """Programlama dili, programcnn bir bilgisayara ne yapmasn istediini anlatmasnn standartlatrlm bir yoludur. Programlama g s s dilleri, programcnn bilgisayara hangi veri zerinde ilem yapacan, s g verinin nasl depolanp iletileceini, hangi koullarda hangi ilemlerin g s s yaplacan tam olarak anlatmasn salar. u ana kadar 2500den fazla g g S programlama dili yaplmtr. Bunlardan bazlar: Pascal, Basic, C, C#, s C++, Java, Cobol, Perl, Python, Ada, Fortran, Delphi programlama dilleridir.""" derli = re.compile("programlama",re.IGNORECASE) print derli.findall(metin) [Programlama, Programlama, programlama, programlama]

Not: Bu metin http://tr.wikipedia.org/wiki/Programlama_dili adresinden alnmtr. s Grd nz gibi, metinde geen hem programlama kelimesini hem de Programlama g kelimesini ayklayabildik. Bunu yapmamz sa layan sey de re.IGNORECASE adl derleme g seene i oldu. g E er bu seene i kullanmasaydk, ktda yalnzca programlama keg g limesini grrdk. nk arad mz sey aslnda programlama kelimesi idi. Biz istersek g re.IGNORECASE yerine ksaca re.I ifadesini de kullanabiliriz. Ayn anlama gelecektir...

19.5.2 re.DOTALL veya re.S


Bildi iniz gibi, metakarakterler arasnda yer alan . sembol herhangi bir karakterin yerini tug tuyordu. Bu metakarakter btn karakterlerin yerini tutmak zere kullanlabilir. Hatrlarsanz,

. metakarakterini anlatrken, bu metakarakterin, yeni satr karakterinin yerini tutmayaca n g sylemitik. Bunu bir rnek yardmyla grelim. Diyelim ki elimizde syle bir karakter dizisi s var:
>>> a = "Ben Python,\nMonty Python"

Bu karakter dizisi iinde Python kelimesini temel alarak bir arama yapmak istiyorsak e er, g kullanaca mz su kod istedi imiz seyi yeterince yerine getiremeyecektir: g g
>>> print re.search("Python.*",a).group()

Bu kod su kty verecektir:


Python,

Bunun sebebi, . metakarakterinin \n (yeni satr) ka dizisini dikkate almamasdr. Bu s yzden bu ka dizisinin tesine geip orada arama yapmyor. Ama simdi biz ona bu yetene i s g de kazandraca z: g
>>> derle = re.compile("Python.*",re.DOTALL) >>> nesne = derle.search(a) >>> if nesne: ... print nesne.group()

re.DOTALL seene ini sadece re.S seklinde de ksaltabilirsiniz... g

19.5.3 re.UNICODE veya re.U


Bu derleme seene i, Trke programlar yazmak isteyenlerin en ok ihtiya duyaca seenekg g lerden biridir. Ne demek istedi imizi tam olarak anlatabilmek iin su rne e bir bakalm: g g
>>> liste = ["ilek","fstk", "kebap"] >>> for i in liste: ... nesne=re.search("\w*",i) ... if nesne: ... print nesne.group() ... f kebap

Burada alfanmerik karakterler ieren eleri ayklamaya altk. Normalde ktmz ilek g s fstk kebap seklinde olmalyd. Ama ilekteki ve fstktaki hareri Trkeye zg harer oldu u iin dzenli ifade motoru bu hareri tanmad. g ste burada imdadmza re.UNICODE seene i yetiecek. I g s nce GNU/Linux kullanclarnn bu seene i nasl kullanabilece ine bir rnek verelim: g g
# -*- coding: utf-8 -*import re import locale locale.setlocale(locale.LC_ALL,"") liste = ["ilek","fstk", "kebap"] for i in liste:

liste[liste.index(i)] = unicode(i,"utf8") derle = re.compile("\w*",re.UNICODE) for i in liste: nesne=derle.search(i) if nesne: print nesne.group()

Burada hangi ilemleri yapt mza ok dikkat edin. Yukardaki kodlarda geen import locale s g ve ardndan gelen satr zellikle nemli. Daha sonra liste elerini nasl unicode haline geg tirdi imize bakn. Liste elerini unicode haline getirmezsek alaca mz kt yine istedi imiz g g g g gibi olmayacaktr. (Benzer bir konu iin bkz: http://www.istihza.com/py2/lenascii.html). Ayrca dzenli ifade kalbmz derlerken de, kty dzgn alabilmek iin re.UNICODE seene ini kulg landk... Simdi ayn seyi Windows kullanclarnn nasl yapaca na bakalm: g
#-*-coding:cp1254-*import locale locale.setlocale(locale.LC_ALL,"") import re liste = ["ilek","fstk","kebap"] derle = re.compile("\w*",re.UNICODE) for i in liste: nesne = derle.search(i) if nesne: print nesne.group()

Grd nz gibi, GNU/Linux ve Windowstaki kodlar arasnda baz ufak tefek farkllklar var. g Bu farkllklarn nedeni iki sistemde Trke karakterleri gstermek iin takip edilen yolun farkl olmas...

s 19.6 Dzenli fadelerle Metin/Karakter Dizisi Degi tirme I slemleri I


19.6.1 sub() metodu
Simdiye kadar hep dzenli ifadeler yoluyla bir karakter dizisini nasl eletirece imizi inceledik. s s g Ama tabii ki dzenli ifadeler yalnzca bir karakter dizisi bulmakla ilgili de ildir. Bu ara g ayn zamanda bir karakter dizisini de itirmeyi de kapsar. Bu i iin temel olarak iki metot gs s kullanlr. Bunlardan ilki sub() metodudur. Bu blmde sub() metodunu inceleyece iz. En g basit sekliyle sub() metodunu su sekilde kullanabiliriz:
>>> a = "Krmz balkl kz, krmz elma dolu sepetiyle \ s ... anneannesinin evine gidiyormu!" s >>> derle = re.compile("krmz",re.IGNORECASE|re.UNICODE)

>>> print derle.sub("yeil",a) s

Burada karakter dizimiz iinde geen btn krmz kelimelerini yeil kelimesiyle s de itirdik. Bunu yaparken de re.IGNORECASE ve re.UNICODE adl derleme seeneklerinden gs yararlandk. Bu ikisini yan yana kullanrken | adl metakarakterden faydaland mza dikkat g edin. Elbette sub() metoduyla daha karmak ilemler yaplabilir. Bu noktada syle bir hatrlatma s s yapalm. Bu sub() metodu karakter dizilerinin replace() metoduna ok benzer. Ama tabii ki sub() metodu hem kendi bana replace() metodundan ok daha gldr, hem de bes raber kullanlabilecek derleme seenekleri sayesinde replace() metodundan ok daha esnektir. Ama tabii ki, e er yapmak istedi iniz i replace() metoduyla halledilebiliyorsa en g g s do ru yol, replace() metodunu kullanmaktr... g Simdi bu sub() metodunu kullanarak biraz daha karmak bir ilem yapaca z. Aa daki s s g s g metne bakalm:
metin = """Karadeniz Erelisi denince akla ilk olarak kmr ve demir-elik gelir. g Kokusu ve tadyla dnyaya nam salm mehur Osmanl ilei ise ismini verdii s s g g festival gnleri dnda pek hatrlanmaz. Oysa in den Arnavutkye oradan da s Ereliye getirilen krallarn meyvesi ilek, burada geirdii deiim sonucu g g g s tadna doyulmaz bir hal alr. Erelinin havasndan m suyundan m bilinmez, g kokusu, tad bambaka bir hale dnr ve mehur Osmanl ilei unvann hak s s s g eder. Bu nazik ve aromal ilekten yaplan reel de likr de bir baka olur. s Bu yl dokuzuncusu dzenlenen Uluslararas Osmanl ilei Kltr Festivalinde g 36 retici arasnda yetitirdii ileklerle birinci olan Kocaali Kynden Gner s g zdemir, ylda bir ton rn alyor. 60 yandaki zdemir, ileklerinin srrn s youn ilgiye ve iten duyduu sevgiye balyor: "Erkekler bahemize giremez. g g g Koca ayaklaryla ezerler ileklerimizi" ilei toplamann zor olduunu syleyen Aye zhan da ocukluundan bu yana g g s g ilek bahesinde alyor. Her sabah 04.00te kalkan zhan, ileklerini zenle s suluyor. Kasm banda ektii ilek fideleri haziran banda meyve veriyor.""" s g s

Not: Bu metin http://www.radikal.com.tr/haber.php?haberno=40130 adresinden alnmtr. s Gelin bu metin iinde geen ilek kelimelerini erik kelimesi ile de itirelim. Ama bunu gs yaparken, metin iinde ilek kelimesinin ilek seklinde de geti ine dikkat edelim. Ayrca g Trke kurallar gere i bu ilek kelimesinin baz yerlerde nsz yumuamasna u rayarak g s g ile - sekline dnt n de unutmayalm. g s g Bu metin iinde geen ilek kelimelerini erikle de itirmek iin birka yol kullanabilirsiniz. gs Birinci yolda, her de iiklik iin ayr bir dzenli ifade oluturulabilir. Ancak bu yolun dezavangs s taj, metnin de birka kez kopyalanmasn gerektirmesidir. nk ilk dzenli ifade oluturulup s buna gre metinde bir de iiklik yapldktan sonra, ilk de iiklikleri ieren metnin, farkl bir gs gs metin olarak kopyalanmas gerekir (metin2 gibi...). Ardndan ikinci de iiklik yaplaca zags g man, bu de iikli in metin2 zerinden yaplmas gerekir. Ayn sekilde bu metin de, mesela, gs g metin3 seklinde tekrar kopyalanmaldr. Bundan sonraki yeni bir de iiklik de bu metin3 z gs erinden yaplacaktr... Bu durum bu sekilde uzar gider... Metni tekrar tekrar kopyalamak yerine, dzenli ifadeleri kullanarak syle bir zm de retebiliriz:
#-*-coding:utf-8-*import locale locale.setlocale(locale.LC_ALL,"")

import re metin_uni=unicode(metin,"utf8") derle = re.compile(u"ile[k]",re.UNICODE|re.IGNORECASE) g def degistir(nesne): a = {u"ile":u"eri", u"ile":u"Eri", g g g g u"ilek":u"Erik", u"ilek":u"erik"} b = nesne.group().split() for i in b: return a[i] print derle.sub(degistir,metin_uni)

Yukardaki zm GNU/Linux kullanclar iindir. Windows kullanclar ayn kodu ufak de iikgs liklerle syle yazabilir:
#-*-coding:cp1254-*import locale locale.setlocale(locale.LC_ALL,"") import re derle = re.compile("ile[k]",re.UNICODE|re.IGNORECASE) g def degistir(nesne): a = {"ile":"eri", "ile":"Eri", g g g g "ilek":"Erik", "ilek":"erik"} b = nesne.group().split() for i in b: return a[i] print derle.sub(degistir,metin)

Grd nz gibi, sub() metodu, argman olarak bir fonksiyon da alabiliyor. Yukardaki kodlar g biraz kark grnm olabilir. Tek tek aklayalm... s s ncelikle su satra bakalm:
derle = re.compile("ile[k]",re.UNICODE|re.IGNORECASE) g

Burada amacmz, metin iinde geen ilek ve ile kelimelerini bulmak. Neden ile ? g g nk ilek kelimesi bir sesli harften nce geldi inde sonundaki k har ye dnyor. g g s Bu seenekli yapy, daha nceki blmlerde grd mz [ ] adl metakarakter yardmyla g oluturduk. Dzenli ifade kalbmzn hem byk hareri hem de kk hareri ayn anda s bulmas iin re.IGNORECASE seene inden yararlandk. Ayrca Trke harer zerinde ilem g s yapaca mz iin de re.UNICODE seene ini kullanmay unutmadk. Bu iki seene i | adl g g g metakarakterle birbirine ba lad mza dikkat edin... Simdi de su satrlara bakalm: g g
def degistir(nesne): a = {"ile":"eri", "ile":"Eri", g g g g "ilek":"Erik", "ilek":"erik"} b = nesne.group().split()

for i in b: return a[i]

Burada, daha sonra sub() metodu iinde kullanaca mz fonksiyonu yazyoruz. Fonksiyonu, g def degistir(nesne) seklinde tanmladk. Burada nesne adl bir argman kullanmamzn nedeni, fonksiyon iinde group() metodunu kullanacak olmamz. Bu metodu fonksiyon iinde nesne adl argmana ba layaca z. Bu fonksiyon, daha sonra yazaca mz sub() metodu g g g tarafndan a rld nda, yapt mz arama ilemi sonucunda ortaya kan eleme nesnesi g g g s s s fonksiyona atanacaktr (eleme nesnesinin ne demek oldu unu ilk blmlerden hatrlyors s g sunuz). ste nesne adl bir argman kullanmamzn nedeni de, eleme nesnelerinin bir I s s metodu olan group() metodunu fonksiyon iinde kullanabilmek... Bir sonraki satrda bir adet szlk gryoruz:
a = {"ile":"eri", "ile":"Eri", g g g g "ilek":"Erik", "ilek":"erik"}

Bu szl oluturmamzn nedeni, metin iinde geen btn ilek kelimelerini tek bir erik g s kelimesiyle de itiremeyecek olmamz... nk ilek kelimesi metin iinde pek ok farkl gs biimde geiyor. Bata da dedi imiz gibi, yukardaki yol yerine metni birka kez kopyalas g yarak ve her defasnda bir de iiklik yaparak da sorunu zebilirsiniz. (Mesela nce ilek gs kelimelerini bulup bunlar erik ile de itirirsiniz. Daha sonra ile kelimelerini arayp gs g bunlar eri ile de itirirsiniz, vb...) Ama metni tekrar tekrar oluturmak pek performansl g gs s bir yntem olmayacaktr. Bizim simdi kulland mz yntem metin kopyalama zorunlulu unu g g ortadan kaldryor. Bu szlk iinde ilek kelimesinin alaca sekilleri szlk iinde birer g anahtar olarak, erik kelimesinin alaca sekilleri ise birer de er olarak belirliyoruz. Bu g g arada GNU/Linux kullanclar Trke karakterleri dzgn grntleyebilmek iin bu szlkteki eleri unicode olarak belirliyor (uerik gibi...) Sonraki satrda iki metot birden var: g
b = nesne.group().split()

Burada, fonksiyonumuzun argman olarak vazife gren eleme nesnesine ait metotlars s dan biri olan group() metodunu kullanyoruz. Bylece derle = re.compile("ile[k]", g re.UNICODE|re.IGNORECASE) satr yardmyla metin iinde buldu umuz btn ilek ve g enilerini alyoruz. Karakter dizilerinin split() metodunu kullanmamzn nedeni ise group() s metodunun verdi i kty liste haline getirip daha kolay maniple etmek. Burada for i in g b:print i komutunu verirseniz group() metodu yardmyla ne buldu umuzu grebilirsiniz: g
ile g ilek ile g ilek ile g ilek ilek ilek ile g ilek ilek ilek

Bu kty grdkten sonra, kodlarda yapmaya alt mz sey daha anlaml grnmeye s g balam olmal... Simdi sonraki satra geiyoruz: s s
for i in b: return a[i]

Burada, group() metodu yardmyla buldu umuz elemeler zerinde bir for dngs olug s s s turduk. Ardndan da return a[i] komutunu vererek a adl szlk iinde yer alan eleri g yazdryoruz. Bu arada, buradaki inin yukarda verdi imiz group() ktlarn temsil etti ine g g dikkat edin. a[i] gibi bir komut verdi imizde aslnda srasyla su komutlar vermi oluyoruz: g s
a["ilek"] a["ile"] g a["ilek"] a["ile"] g a["ilek"] a["ilek"] a["ilek"] a["ile"] g a["ilek"] a["ilek"]

Bu komutlarn ktlar srasyla erik, eri , erik, Eri , erik, erik, erik, Eri , erik, erik olacakg g g tr. ste bu return satr bir sonraki kod olan print derle.sub(degistir,metin) ifadesinde I etkinlik kazanacak. Bu son satrmz szlk elerini tek tek metne uygulayacak ve mesela g a["ilek"] komutu sayesinde metin iinde ilek grd yerde erik kelimesini yaptrag s cak ve bylece bize istedi imiz sekilde de itirilmi bir metin verecektir... g gs s Bu kodlarn biraz kark gibi grnd n biliyorum, ama aslnda ok basit bir mant var: s g g group() metodu ile metin iinde arad mz kelimeleri ayklyor. Ardndan da a szl iinde g g bunlar anahtar olarak kullanarak ilek ve eitleri yerine erik ve eitlerini koyuyor... s s Yukarda verdi imiz dzenli ifadeyi byle ufak bir metinde kullanmak ok anlaml olmayabilir. g Ama ok byk metinler zerinde ok eitli ve karmak de iiklikler yapmak istedi inizde bu s s gs g kodlarn iinize yarayabilece ini greceksiniz. s g

19.6.2 subn() metodu


Bu metodu ok ksa bir sekilde anlatp geece iz. nk bu metot sub() metoduyla neredeyse g tamamen ayndr. Tek fark, subn() metodunun bir metin iinde yaplan de iiklik saysn da gs gstermesidir. Yani bu metodu kullanarak, kullanclarnza toplam su kadar sayda de iiklik gs yaplmtr seklinde bir bilgi verebilirsiniz. Bu metot kt olarak iki eli bir demet verir. Birinci s g e de itirilen metin, ikinci e ise yaplan de iiklik saysdr. Yani kullancya de iiklik g gs g gs gs saysn gstermek iin yapmanz gereken sey, bu demetin ikinci esini almaktr. Mesela g sub() metodunu anlatrken verdi imiz kodlarn son satrn syle de itirebilirsiniz: g gs
ab = derle.subn(degistir,metin_uni) print "Toplam %s deiiklik yaplmtr."%ab[1] g s s

19.7 Sonu
Bylelikle dzenli ifadeler konusunu bitirmi olduk. Buradaki amacmz, size dzenli ifadeler s konusunda genel bir bak sunabilmekti. Bu yazlar okuduktan sonra kafanzda dzenli ifadels erle ilgili kabataslak da olsa bir resim olutuysa bu yazlar amacna ulam demektir. Elbette s s s dzenli ifadeler burada anlattklarmzdan ibaret de ildir. Bu konunun zerine e ildi inizde g g g aslnda dzenli ifadelerin dipsiz bir kuyu gibi oldu unu greceksiniz. Esasnda en bata da g s dedi imiz gibi, dzenli ifadeler apayr bir dil gibidir. Do rusu su ki, dzenli ifadeler bal g g s bana ba msz bir sistemdir. Hemen hemen btn programlama dilleri yle ya da byle s g dzenli ifadeleri destekler. Pythonda dzenli ifadeleri bnyesine adapte etmi dillerden biridir. s

Bizim dzenli ifadeler konusundaki yaklammz, her zaman bunlar gerekti inde kullans g mak olmaldr. Dedi imiz gibi, e er yapmak istedi iniz bir ilemi karakter dizilerinin metotg g g s lar yardmyla yapabiliyorsanz dzenli ifadelere girimemek en iyisidir. nk karakter dizisi s metotlar hem daha hzldr hem de anlamas daha kolaydr.

BLM

20

Nesne Tabanl Programlama OOP (NTP)

Bu yazmzda ok nemli bir konuyu ilemeye balayaca z: Pythonda Nesne Tabanl Pros s g gramlama (Object Oriented Programming). Yabanclar bu ifadeyi OOP olarak ksaltyor. Gelin isterseniz biz de bunu Trkede NTP olarak ksaltalm. . . Simdilik bu Nesne Tabanl Programlamann ne oldu u ve tanm bizi ilgilendirmiyor. Biz simdi g lik iin teorisiyle pek u ramayp prati ine bakaca z. NTPnin pratikte nasl iledi ini anlarsak, s g s g g s g teorisini aratrp renmek de daha kolay olacaktr. s g

20.1 Neden Nesne Tabanl Programlama?


Isterseniz nce kendimizi biraz yreklendirip cesaretlendirelim. Su soruyu soralm kendimize: Nesne Tabanl Programlamaya hi girmesem olmaz m? Bu soruyu cevaplandrmadan nce bak amz syle belirleyelim. Daha do rusu bu soruyu s g iki farkl adan inceleyelim: NTPyi renmek ve NTPyi kullanmak... g E er yukardaki soruya, NTPyi kullanmak penceresinden bakarsak, cevabmz, Evet, olag caktr. Yani, Evet, NTPyi kullanmak zorunda de ilsiniz. Bu bakmdan NTPyle ilgilenmek g istemeyebilirsiniz, nk Python baka baz dillerin aksine NTPyi dayatmaz. bir Python s Iyi programcs olmak iin NTPyi kullanmasanz da olur. NTPyi kullanmadan da gayet baarl s programlar yazabilirsiniz. Bu bakmdan nnzde bir engel yok. Ama e er yukardaki soruya NTPyi renmek penceresinden bakarsak, cevabmz, Hayr, g g olacaktr. Yani, Hayr, NTPyi renmek zorundasnz!. Bu bakmdan NTPyle ilgilenmeniz g gerekir, nk siz NTPyi kullanmasanz da bakalar bunu kullanyor. Dolaysyla, NTPnin s btn erdemlerini bir kenara braksak dahi, srf bakalarnn yazd kodlar anlayabilmek iin s g bile olsa, elinizi NTPyle kirletmeniz gerekecektir... Bir de syle dnn: Gerek internet z s erinde olsun, gerekse basl yaynlarda olsun, Pythona ilikin pek ok kaynakta kodlar bir noks tadan sonra NTP yaps iinde ilenmektedir. Bu yzden zellikle balang seviyesini getiks s ten sonra karnza kacak olan kodlar anlayabilmek iin bile NTPye bir ainal nzn olmas s s g gerekir. Dolaysyla en bata sordu umuz soruya karlk ben de size su soruyu sormak isterim: s g s Daha nereye kadar kaacaksnz bu NTPden? 325

Dikkat ederseniz, bildik anlamda NTPnin faydalarndan, bize getirdi i kolaylklardan hi bahg setmiyoruz. Zira su anda iinde bulundu umuz noktada bunlar bilmenin bize pek faydas g dokunmayacaktr. nk daha NTPnin ne oldu unu dahi bilmiyoruz ki cicili bicili cmlelerle g bize anlatlacak faydalar zmseyebilelim... NTPyi renmeye alan birine birka sayfa g s boyunca NTP syle iyidir, NTP byle hotur, demenin pek faydas olmayacaktr. nk byle s bir aba, konuyu anlatan kiiyi ister istemez okurun henz bilmedi i kavramlar kullanarak baz s g seyleri aklamaya almaya itecektir. Bu da okurun zihninde birtakm fantastik cmlelerin s uumasndan baka bir ie yaramayacaktr. Dolaysyla, NTPnin faydalarn size burada bir s s s rpda saymak yerine, renme srecine brakyoruz bu zmseme iini... NTPyi rendikg s g ten sonra, bu programlama tekni inin Python deneyiminize ne tr bir katk sa layaca n, size g g g ne gibi bir fayda getirece ini kendi gzlerinizle greceksiniz. g En azndan biz bu noktada sunu rahatlkla syleyebiliriz: NTPyi rendi inizde Python Pro g g gramlamada bir anlamda boyut atlam olacaksnz. Sonunda zgveniniz artacak, orada s burada Pythona ilikin okudu unuz seyler zihninizde daha anlaml izler brakmaya balayas g s caktr.

20.2 Snar
NTPde en nemli kavram snardr. Zaten NTP denince ilk akla gelen sey de genellikle snar olmaktadr. Snar yap olarak fonksiyonlara benzetilebilir. Hatrlarsanz, fonksiyonlar yardmyla farkl de ikenleri ve veri tiplerini, tekrar kullanlmak zere bir yerde toplayags biliyorduk. ste snar yardmyla da farkl fonksiyonlar, veri tiplerini, de ikenleri, metotlar I gs gruplandrabiliyoruz.

20.2.1 Snf Tanmlamak


ncelikle bir snf nasl tanmlayaca mza bakmamz gerekiyor. Hemen, bir snf nasl tanmg layaca mz bir rnekle grmeye alalm: g s Pythonda bir snf oluturmak iin su yapy kullanyoruz: s
class IlkSinif:

Bylece snar oluturmak iin ilk adm atm olduk. Burada dikkat etmemiz gereken baz s s noktalar var: Hatrlarsanz fonksiyonlar tanmlarken def parac ndan yararlanyorduk. Mesela: g
def deneme():

Snar tanmlarken ise class parac ndan faydalanyoruz: g


class IlkSinif:

Tpk fonksiyonlarda oldu u gibi, isim olarak herhangi bir kelimeyi seebiliriz. Mesela yukarg daki fonksiyonda deneme adn semitik. Yine yukarda grd mz snf rne inde de s g g IlkSinif adn kullandk. Tabii isim belirlerken Trke karakter kullanamyoruz. . . Snf adlarn belirlerken kullanaca mz kelimenin byk harf veya kk harf olmas nemli g de ildir. Ama seilen kelimelerin ilk harerini byk yazmak adettendir. Mesela class Sinif g veya class HerhangiBirKelime. Grd nz gibi snf ad birden fazla kelimeden oluuyorsa g s her kelimenin ilk har byk yazlyor. Bu bir kural de ildir, ama her zaman adetlere uymak g yerinde bir davran olacaktr... s

Son olarak, snfmz tanmladktan sonra parantez iareti kullanmak zorunda olmad mza s g dikkat edin. En azndan simdilik... Bu parantez meselesine tekrar dnece iz. g adm att mza gre ilerleyebiliriz: Ilk g
class IlkSinif: mesele = "Olmak ya da olmamak"

Bylece eksiksiz bir snf tanmlam olduk. Aslnda tabii ki normalde snar bundan biraz daha s karmaktr. Ancak yukardaki rnek, gerek hayatta bu haliyle karmza kmayacak da olsa, s s hem yap olarak kurallara uygun bir snftr, hem de bize snara ilikin pek ok nemli ipucu s vermektedir. Srasyla bakalm: satrda do ru bir sekilde snfmz tanmladk. Ilk g Ikinci satrda ise mesele adl bir de iken oluturduk. gs s Bylece ilk snfmz baaryla tanmlam olduk. s s

20.2.2 Snar al trmak s


Simdi gzel gzel yazd mz bu snf nasl altraca mza bakalm: g s g Herhangi bir Python programn nasl altryorsak snar da yle altrabiliriz. Yani pek s s ok farkl yntem kullanabiliriz. rne in yazd mz sey arayz olan bir Tkinter programysa g g python programad.py komutuyla bunu altrabilir, yazd mz arayz grebiliriz. Hatta s g gerekli ayarlamalar yaptktan sonra programn simgesine ift tklayarak veya GNU/Linux sistemlerinde konsol ekrannda programn sadece adn yazarak altrabiliriz programmz. E er s g komut satrndan alan bir uygulama yazdysak, yine python programad.py komutuyla s programmz altrp konsol zerinden ynetebiliriz. Ancak bizim simdilik yazd mz kodun s g bir arayz yok. stelik bu sadece NTPyi renmek iin yazd mz, tam olmayan bir kod g g parasndan ibaret. Dolaysyla snfmz tecrbe etmek iin biz simdilik do rudan Python ko g mut satr iinden alaca z. s g Su halde herkes kendi platformuna uygun sekilde Python komut satrn balatsn! Pythonu s balattktan sonra btn platformlarda su komutu vererek bu kod parasn altrlabilir dus s ruma getirebiliriz:
from sinif import *

Burada sizin bu kodlar sinif.py adl bir dosyaya kaydetti inizi varsaydm. Dolaysyla bu g sekilde dosyamz bir modl olarak ie aktarabiliyoruz (import). Bu arada Pythonun bu modl dzgn olarak ie aktarabilmesi iin komut satrn, bu modln bulundu u dizin iinde amak g gerekir. Python ie aktarlacak modlleri ararken ilk olarak o anda iinde bulunulan dizine bakaca iin modlmz rahatlkla bulabilecektir. g GNU/Linux kullanclar komut satryla daha ili dl olduklar iin etkileimli kabu u modln s s g bulundu u dizinde nasl aacaklarn zaten biliyorlardr... Ama biz yine de hzlca zerinden g geelim...(Modln masastnde oldu unu varsayyoruz): g ALT+F2 tularna basp alan pencereye konsole (KDE) veya gnome-terminal (GNOME) s yazyoruz. Ardndan konsol ekrannda cd Desktop komutunu vererek masastne eriiyoruz. s Windows kullanclarnn komut satrna daha az aina oldu unu varsayarak biraz daha detayl s g anlatalm bu ilemi... s Windows kullanclar ise Python komut satrn modln oldu u dizin iinde amak iin su yolu g izleyebilir (yine modln masastnde oldu unu varsayarsak...): Balat > altr yolunu takip g s s edip alan kutuya cmd yazyoruz (parantezler olmadan). Komut ekran karmza gelecek. s

Muhtemelen iinde bulundu unuz dizin C:Documents and Settingssminiz olacaktr. Orada g I su komutu vererek masastne geiyoruz:
cd Desktop

Simdi de su komutu vererek Python komut satrn balatyoruz: s


C:/python25/python

Tabii kulland nz Python srmnn 2.5 oldu unu varsaydm. Sizde srm farklysa komutu g g ona gre de itirmelisiniz. gs E er herhangi bir hata yapmadysanz karnza suna benzer bir ekran gelmeli: g s
C:\Documents and Settings\Isminiz>c:/python25/Python Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>>

Simdi bu ekrandaki >>> satrndan hemen sonra su komutu verebiliriz:


>>> from sinif import *

Artk snfmz altrmamzn nnde hi bir engel kalmad saylr. Bu noktada yapmamz s gereken tek bir ilem var: rnekleme s

20.3 rnekleme (Instantiation)


Simdi syle bir sey yazyoruz:
deneme = IlkSinif()

Bylece oluturdu umuz snf bir de ikene atadk. NTP kavramlaryla konuacak olursak, s g gs s snfmz rneklemi olduk. s Peki bu rnekleme denen sey de ne oluyor? Hemen bakalm: Ingilizcede instantiation olarak ifade edilen rnekleme kavram sayesinde snfmz kullanrken belli bir kolaylk sa lam oluyoruz. Grd nz gibi, rnekleme (instantiation) g s g aslnda sekil olarak yalnzca bir de iken atama ileminden ibarettir. Nasl daha nce gs s grd mz de ikenler uzun ifadeleri ksaca adlandrmamz sa lyorsa, burada da rnekg gs g leme ilemi hemen hemen ayn vazifeyi gryor. Yani bylece ilk satrda tanmlad mz snfa s g daha kullanl bir isim vermi oluyoruz. Dedi imiz gibi, bu ileme rnekleme (instantiation) s s g s ad veriliyor. Bu rneklemelerin her birine ise rnek (instance) deniyor. Yani, IlkSinif adl snfa bir isim verme ilemine rnekleme denirken, bu ilem sonucu ortaya kan de ikene s s gs de, rnek (instance) diyoruz. Buna gre, burada deneme adl de iken, IlkSinif adl snfn gs bir rne idir (deneme is an instance of the class IlkSinif). Daha soyut bir ifadeyle, rnekg leme ilemi Class (snf) nesnesini etkinletirmeye yarar. Yani snfn btnn alr ve onu s s paketleyip, istedi imiz sekilde kullanabilece imiz bir nesne haline getirir. Syle de diyebiliriz: g g Biz bir snf tanmlyoruz. Bu snfn iinde birtakm de ikenler, fonksiyonlar, vb. olacakgs tr. Hayli kaba bir benzetme olacak ama, biz bunlar bir internet sayfasnn ieri ine beng zetebiliriz. ste biz bu snf rnekledi imiz zaman, snf ieri ini bir bakma eriilebilir hale I g g s getirmi oluyoruz. Tpk bir internet sayfasnn, www.... seklinde gsterilen adresi gibi... s Mesela www.python.quotaless.com adresi iindeki btn bilgileri bir snf olarak dnrsek, s www.python.quotaless.com ifadesi bu snfn bir rne idir... Durum tam olarak byle olmasa g

bile, bu benzetme, rnekleme ilemine ilikin en azndan zihnimizde bir kvlcm akmasn s s sa layabilir. g Daha yerinde bir benzetme syle olabilir: Insan byk bir snf olarak kabul edelim. ste siz I (yani Ahmet, Mehmet, vb...) bu byk snfn bir rne i, yani ete kemi e brnm hali oluyorg g s sunuz... Buna gre insan snf insann ne tr zellikleri oldu una dair tanmlar (fonksiyonlar, g veriler) ieriyor. Mehmet rne i (instance) ise bu tanmlar, nitelikleri, zellikleri tayan bir g s nesne oluyor...

20.4 p Toplama (Garbage Collection)


Peki biz bir snf rneklemezsek ne olur? E er bir snf rneklemezsek, o rneklenmeyen snf g program tarafndan otomatik olarak p toplama (garbage collection) ad verilen bir srece tabi tutulacaktr. Burada bu srecin ayrntlarna girmeyece iz. Ama ksaca syle anlatabiliriz: g Pythonda (ve bir ok programlama dilinde) yazd mz programlar iindeki ie yaramayan g s veriler bellekten silinir. Bylece etkili bir hafza ynetimi uygulanm ve programlarn perfors mans artrlm olur. Mesela: s
>>> a = 5 >>> a = a + 6 >>> print a 11

Burada a de ikeninin gsterdi i 5 verisi, daha sonra gelen a = a + 6 ifadesi nedeniyle gs g boa dm, skartaya km oluyor. Yani a = a + 6 ifadesi nedeniyle, a de ikeni artk s s s s gs 5 verisini gstermiyor. Dolaysyla 5 verisi o anda bellekte bou bouna yer kaplam s s s oluyor. nk a = a + 6 ifadesi yznden, 5 verisine gnderme yapan, onu gsteren, bu veriye bizim ulamamz sa layacak hi bir iaret kalmam oluyor ortada. ste Python, bir s g s s I veriye iaret eden hi bir referans kalmad durumlarda, yani o veri artk ie yaramaz hale s g s geldi inde, otomatik olarak p toplama ilemini devreye sokar ve bu rnekte 5 verisini g s pe gnderir. Yani artk o veriyi bellekte tutmaktan vazgeer. ste e er biz de yukarda I g oldu u gibi snarmz rneklemezsek, bu snara hibir yerde iaret edilmedi i, yani bu g s g snf gsteren hibir referans olmad iin, snfmz oluturuldu u anda p toplama ilemg s g s ine tabi tutulacaktr. Dolaysyla artk bellekte tutulmayacaktr. p Toplama ilemini de ksaca anlatt mza gre artk kald mz yerden yolumuza devam s g g edebiliriz... Bu arada dikkat ettiyseniz snfmz rneklerken parantez kullandk. Yani syle yaptk:
>>> deneme = IlkSinif()

E er parantezleri kullanmazsak, yani deneme = IlkSinif gibi bir sey yazarsak, yapt mz sey g g rnekleme olmaz. Byle yaparak snf sadece kopyalam oluruz... Bizim yapmak istedi imiz s g bu de il. O yzden, parantezlere dikkat! diyoruz... g Artk su komut yardmyla, snf rne imizin niteliklerine ulaabiliriz: g s
>>> deneme.mesele Olmak ya da olmamak

20.5 Niteliklere Deginme (Attribute References)


Biraz nce nitelik diye bir seyden sz ettik. Ingilizcede attribute denen bu nitelik kavram, Pythondaki nesnelerin zelliklerine iaret eder. Pythonun yazar Guido Van Rossum s bu kavram iin syle diyor: I use the word attribute for any name following a dot (Noktadan sonra gelen btn isimler iin ben nitelik kelimesini kullanyorum) kaynak: http://docs.python.org/tut/node11.html Bu tanma gre, rne in: g
>>> deneme.mesele

dedi imiz zaman, buradaki mesele; deneme adl snf rne inin (instance) bir niteli i (atg g g tribute) oluyor. Biraz kark gibi mi? Hemen bir rnek yapalm o halde: s
class a b c Toplama: = 15 = 20 = a + b

satrda Toplama adl bir snf tanmladk. Bunu yapmak iin class parac ndan yararIlk g landk. Srasyla; a, b ve c adl adet de iken oluturduk. c de ikeni a ve b de ikenlerinin gs s gs gs toplamdr. Bu snftaki a, b ve c de ikenleri ise, Toplama snf rne inin (rne i biraz sonra tanmlayags g g ca z) birer niteli i oluyor. Bundan nceki rne imizde ise mesele adl de iken, deneme g g g gs adl snf rne inin bir niteli i idi... g g Bu snf yazp kaydetti imiz dosyamzn adnn matematik.py oldu unu varsayarsak; g g
>>> from matematik import *

komutunu verdikten sonra sunu yazyoruz:


>>> sonuc = Toplama()

Bylece Toplama adl snfmz rnekliyoruz. Bu ileme rnekleme (instantiation) ad s veriyoruz. sonuc kelimesine ise Pythoncada rnek (instance) ad veriliyor. Yani sonuc, Toplama snfnn bir rne idir, diyoruz. . . g Artk,
>>> sonuc.a >>> sonuc.b >>> sonuc.c

biiminde, sonuc rne inin niteliklerine tek tek eriebiliriz. g s Peki kodlar syle altrrsak ne olur? s
>>> import matematik

E er modl bu sekilde ie aktarrsak (import), snf rne inin niteliklerine ulamak iin su g g s yapy kullanmamz gerekir:
>>> matematik.sonuc.a >>> matematik.sonuc.b >>> matematik.sonuc.c

Yani her defasnda dosya adn (ya da baka bir ifadeyle modln adn) da belirtmemiz s gerekir. Bu iki kullanm arasnda, zellikle sa ladklar gvenlik avantajlar/dezavantajlar g asndan baka baz temel farkllklar da vardr, ama simdilik konumuzu da tmamak iin s g bunlara girmiyoruz... Ama temel olarak sunu bilmekte fayda var: Genellikle tercih edilmesi gereken yntem from modl import * yerine import modl biimini kullanmaktr. E er g from modl import * yntemini kullanarak ie aktard nz modl iindeki isimler (de ikeng gs ler, nitelikler), bu modl kullanaca nz dosya iinde de bulunuyorsa isim akmalar ortaya g s kabilir... Esasnda, from modl import * yapsn sadece ne yapt mz ok iyi biliyorsak g ve modlle ilgili belgelerde modln bu sekilde ie aktarlmas gerekti i bildiriliyorsa kullan g mamz yerinde olacaktr. Mesela Tkinter ile programlama yaparken rahatlkla from Tkinter import * yapsn kullanabiliriz, nk Tkinter bu kullanmda problem yaratmayacak sekilde tasarlanmtr. Yukarda bizim verdi imiz rnekte de from modl import * yapsn rahatlkla s g kullanyoruz, nk simdilik tek bir modl zerinde alyoruz. Dolaysyla isim akmas s s yaratacak baka bir modlmz olmad iin ne yapt mz biliyoruz!... s g g Yukarda anlatt mz kod altrma biimleri tabii ki, bu kodlar komut ekranndan g s altrd nz varsaymaktadr. E er siz bu kodlar IDLE ile altrmak isterseniz, bunlar hazrs g g s ladktan sonra F5 tuuna basmanz, veya Run > Run Module yolunu takip etmeniz yeterli s olacaktr. F5e bast nzda veya Run > Run Module yolunu takip etti inizde IDLE sanki kog g mut ekrannda from matematik import * komutunu vermisiniz gibi davranacaktr. s Veya GNU/Linux sistemlerinde sistem konsolunda:
python -i sinif.py

komutunu vererek de bu kod paralarn altrlabilir duruma getirebiliriz. Bu komutu s verdi imizde from sinif import * komutu otomatik olarak verilip hemen ardndan Python g komut satr alacaktr. Bu komut verildi inde ekranda grece iniz >>> iaretinden, g g s Pythonun sizden hareket bekledi ini anlayabilirsiniz... g Simdi isterseniz buraya kadar sylediklerimizi syle bir toparlayalm. Bunu da yukardaki rnek zerinden yapalm:
class Toplama: a = 15 b = 20 c = a + b

Toplama adl bir snf tanmlyoruz. Snfmzn iine istedi imiz kod paralarn ekliyoruz. Biz g burada adet de iken ekledik. Bu de ikenlerin her birine, nitelik adn veriyoruz. Bu gs gs kodlar kullanabilmek iin Python komut satrnda su komutu veriyoruz:
>>> from matematik import *

Burada modl adnn (yani dosya adnn) matematik oldu unu varsaydk. g Simdi yapmamz gereken sey, Toplama adl snf rneklemek (instantiation). Yani bir nevi, snfn kendisini bir de ikene atamak. Bu de ikene biz Pythoncada rnek (instance) adn gs gs veriyoruz. Yani, sonuc adl de iken, Toplama adl snfn bir rne idir diyoruz (sonuc is an gs g instance of Toplama)
>>> sonuc = Toplama()

Bu komutu verdikten sonra niteliklerimize eriebiliriz: s


>>> sonuc.a >>> sonuc.b >>> sonuc.c

Dikkat ederseniz, niteliklerimize eriirken rnekten (instance), yani sonuc adl de ikenden s gs yararlanyoruz. Simdi bir an bu snfmz rneklemedi imizi dnelim. Dolaysyla bu snf syle kullanmamz g s gerekecek:
>>> Toplama().a >>> Toplama().b >>> Toplama().c

Ama daha nce de anlatt mz gibi, siz Toplama().a der demez snf altrlacak ve g s altrldktan hemen sonra ortada bu snfa iaret eden herhangi bir referans kalmad iin s s g Python tarafndan ie yaramaz olarak alglanan snfmz p toplama ilemine tabi tutularak s s derhal belle i terketmesi sa lanacaktr. Bu yzden bunu her altrd nzda yeniden belle e g g s g g yklemi olacaksnz snf. Bu da bir hayli verimsiz bir alma seklidir. s s Bylelikle zor ksm geride brakm olduk. Artk nmze bakabiliriz. Zira en temel baz s kavramlar gzden geirdi imiz ve temelimizi oluturdu umuz iin, daha kark seyleri anlag s g s mak kolaylaacaktr. s

20.6 __init__ Nedir?


E er daha nce etrafta snar ieren kodlar grmseniz, bu __init__ fonksiyonuna en azndan g s bir gz ainal nz vardr. Genellikle su sekilde kullanld n grrz bunun: s g g
def __init__(self):

Biz simdilik bu yapdaki __init__ ksmyla ilgilenece iz. selfin ne oldu unu simdilik bir kenara g g brakp, onu oldu u gibi kabul edelim. se hemen bir rnekle balayalm. g I s Isterseniz kendimizce ufack bir oyun tasarlayalm:
#!/usr/bin/env python #-*- coding:utf8 -*class Oyun: def __init__(self): enerji = 50 para = 100 fabrika = 4 isci = 10 print "enerji:", enerji print "para:", para print "fabrika:", fabrika print "ii:", isci s macera = Oyun()

Gayet gzel. Dikkat ederseniz rnekleme (instantiation) ilemini do rudan dosya iinde hals g lettik. Komut satrna brakmadk bu ii. s Simdi bu kodlar altraca z. Bir ka seene imiz var: s g g zerinde alt mz platforma gre Python komut satrn, yani etkileimli kabu u ayoruz. s g s g Orada su komutu veriyoruz:

>>> from deneme import *

Burada dosya adnn deneme.py oldu unu varsaydk. E er rnekleme ilemini dosya iinden g g s halletmemi olsaydk, from deneme import * komutunu verdikten sonra macera = Oyun() s satr yardmyla ilk olarak snfmz rneklendirmemiz gerekecekti. GNU/Linux sistemlerinde baka bir seenek olarak, ALT+F2 tularna basyoruz ve alan s s pencerede konsole (KDE) veya gnome-terminal (GNOME) yazp entere bastktan sonra at mz komut satrnda su komutu veriyoruz: g
python -i deneme.py

E er Windowsta IDLE zerinde alyorsak, F5 tuuna basarak veya Run>Run Module yolg s s unu takip ederek kodlarmz altryoruz. s Bu kodlar yukardaki seeneklerden herhangi biriyle altrd mzda, __init__ fonksiyonu s g iinde tanmlanm olan btn de ikenlerin, yani niteliklerin, ilk alma esnasnda ekrana s gs s yazdrld n gryoruz. ste bu niteliklerin balang de eri olarak belirlenebilmesi hep g I s g __init__ fonksiyonu sayesinde olmaktadr. Dolaysyla syle bir sey diyebiliriz: Pythonda bir programn ilk kez altrld anda ilemesini istedi imiz seyleri bu __init__ s g s g fonksiyonu iine yazyoruz. Mesela yukardaki ufak oyun almasnda, oyuna baland anda s s g bir oyuncunun sahip olaca zellikleri __init__ fonksiyonu iinde tanmladk. Buna gre bu g oyunda bir oyuncu oyuna balad nda: s g enerjisi 50, paras 100 fabrika says 4, ii says ise 10 olacaktr. s Yalnz hemen uyaralm: Yukardaki rnek aslnda pek de dzgn saylmaz. ok nemli eksiklikleri var bu kodun. Ama simdi konumuz bu de il... Olayn i yzn kavrayabilmek iin yle bir g rnek vermemiz gerekiyordu. Bunu biraz sonra aklayaca z. Biz okumaya devam edelim... g Bir de Tkinter ile bir rnek yapalm. Zira sn yaplarn en ok ve en verimli kullanld yer g arayz programlama almalardr: s
from Tkinter import * class Arayuz: def __init__(self): pencere = Tk() dugme = Button(text="tamam") dugme.pack() uygulama = Arayuz()

Bu kodlar da yukarda sayd mz yntemlerden herhangi biri ile altryoruz. Tabii ki bu kod g s da eksiksiz de ildir. Ancak simdilik amacmza hizmet edebilmesi iin kodlarmz bu sekilde g yazmamz gerekiyordu. Ama grece iniz gibi yine de alyor bu kodlar... Dikkat ederseniz g s burada da rnekleme ilemini dosya iinden hallettik. E er rnekleme satrn dosya iine s g yazmazsak, Tkinter penceresinin almas iin komut satrnda uygulama = Arayuz() gibi bir satr yazmamz gerekir. Buradaki __init__ fonksiyonu sayesinde Arayuz adl snf her a rld nda bir adet Tkinter g g penceresi ve bunun iinde bir adet d me otomatik olarak oluacaktr. Zaten bu __init__ g s fonksiyonuna da Ingilizcede o u zaman constructor (oluturan, ina eden, meydana geg s s tiren) ad verilir. Geri __init__ fonksiyonuna constructor demek pek do ru bir ifade saylmaz, g ama biz bunu simdi bir kenara brakalm. Sadece aklmzda olsun, __init__ fonksiyonu gerek anlamda bir constructor de ildir, ama ona ok benzer... g Syle bir yanl anlalma olmamasna dikkat edin: s s

__init__ fonksiyonunun, varsaylan de erleri belirleme, yani ina etme zelli i konumung s g dan kaynaklanmyor. Yani bu __init__ fonksiyonu, ilevini srf ilk srada yer ald iin yers g ine getirmiyor. Bunu test etmek iin, isterseniz yukardaki kodlar __init__ fonksiyonunun adn de itirerek altrmay deneyin. Ayn ilevi elde edemezsiniz. . . Mesela __init__ yerine gs s s __simit__ deyin. almaz. . . s __init__ konusuna biraz olsun k tuttu umuza gre artk en nemli bileenlerden ikincisine s g s gelebiliriz: self

20.7 self Nedir?


Bu kck kelime Pythonda snarn en can alc noktasn oluturur. Esasnda ok basit bir s ilevi olsa da, bu ilevi kavrayamazsak neredeyse btn bir snf konusunu kavramak imkansz s s hale gelecektir. Selfi anlamaya do ru ilk adm atmak iin yukarda kulland mz kodlardan g g faydalanarak bir rnek yapmaya alalm. Kodumuz syleydi: s
class Oyun: def __init__(self): enerji = 50 para = 100 fabrika = 4 isci = 10 print "enerji:", enerji print "para:", para print "fabrika:", fabrika print "ii:", isci s macera = Oyun()

Diyelim ki biz burada enerji, para, fabrika, ii de ikenlerini ayr bir fonksiyon iinde kullans gs mak istiyoruz. Yani mesela gster() adl ayr bir fonksiyonumuz olsun ve biz bu de ikenleri gs ekrana yazdrmak istedi imizde bu gster fonksiyonundan yararlanalm. Kodlarn su anki g halinde oldu u gibi, bu kodlar tanmlansn, ama do rudan ekrana dklmesin. Syle bir sey g g yazmay deneyelim. Bakalm sonu ne olacak?
class Oyun: def __init__(self): enerji = 50 para = 100 fabrika = 4 isci = 10 def goster(): print "enerji:", enerji print "para:", para print "fabrika:", fabrika print "ii:", isci s macera = Oyun()

ncelikle bu kodlarn sahip oldu u niteliklere bir bakalm: g enerji, para, fabrika, ici ve goster() s Burada rne imiz (instance) macera adl de iken. Dolaysyla bu niteliklere su sekilde g gs ulaabiliriz: s

>>> >>> >>> >>> >>>

macera.enerji macera.para macera.fabrika macera.isci macera.goster()

Hemen deneyelim. Ama o da ne? Mesela macera.goster() dedi imizde syle bir hata alyg oruz:
Traceback (most recent call last): File "<pyshell0>", line 1, in <module> macera.goster() TypeError: goster() takes no arguments (1 given)

Belli ki bir hata var kodlarmzda. goster() fonksiyonuna bir self ekleyerek tekrar deneyelim. Belki dzelir:
class Oyun: def __init__(self): enerji = 50 para = 100 fabrika = 4 isci = 10 def goster(self): print "enerji:", enerji print "para:", para print "fabrika:", fabrika print "ii:", isci s macera = Oyun()

Tekrar deniyoruz:
>>> macera.goster()

Olmad... Bu sefer de syle bir hata aldk:


enerji: Traceback (most recent call last): File "<pyshell0>", line 1, in <module> macera.goster() File "xxxxxxxxxxxxxxxxxxx", line 9, in goster print "enerji:", enerji NameError: global name enerji is not defined

Hmm... Sorunun ne oldu u az ok ortaya kt. Hatrlarsanz buna benzer hata mesajlarn g Fonksiyon tanmlarken global de ikeni yazmad mz zamanlarda da alyorduk. . . ste self gs g I burada devreye giriyor. Yani bir bakma, fonksiyonlardaki global ifadesinin yerini tutuyor. Daha do ru bir ifadeyle, burada macera adl snf rne ini temsil ediyor. Artk kodlarmz g g dzeltebiliriz:
class Oyun: def __init__(self): self.enerji = 50 self.para = 100 self.fabrika = 4 self.isci = 10

def goster(self): print "enerji:", self.enerji print "para:", self.para print "fabrika:", self.fabrika print "ii:", self.isci s macera = Oyun()

Grd nz gibi, kodlar iinde yazd mz de ikenlerin, fonksiyon dndan da a rlabilmesi g g gs s g iin, yani bir bakma global bir nitelik kazanmas iin self olarak tanmlanmalar gerekiyor. Yani mesela, enerji yerine self.enerji diyerek, bu enerji adl de ikenin yalnzca iinde gs bulundu u fonksiyonda de il, o fonksiyonun dnda da kullanlabilmesini sa lyoruz. g g s g Iyice somutlatrmak gerekirse, __init__ fonksiyonu iinde tanmlad mz enerji adl de iken, s g gs bu haliyle goster adl fonksiyonun iinde kullanlamaz. Daha da nemlisi bu kodlar bu haliyle tam olarak altramayz da. Mesela su temel komutlar iletemeyiz: s s
>>> >>> >>> >>> macera.enerji macera.para macera.isci macera.fabrika

E er biz enerji adl de ikeni goster() fonksiyonu iinde kullanmak istersek de ikeni g gs gs sadece enerji de il, self.enerji olarak tanmlamamz gerekir. Ayrca bunu goster adl g fonksiyon iinde kullanrken de sadece enerji olarak de il, self.enerji olarak yazmamz g gerekir. stelik mesela enerji adl de ikeni herhangi bir yerden a rmak istedi imiz zags g g man da bunu nceden self olarak tanmlam olmamz gerekir. s Simdi tekrar deneyelim:
>>> macera.goster enerji: 50 para: 100 fabrika: 4 ii: 10 s >>> macera.enerji 50 >>> macera.para 100 >>> macera.fabrika 4 >>> macera.isci 10

Snfn niteliklerine tek tek nasl eriebildi imizi gryorsunuz. . . Bu arada, isterseniz selfi, s g macera rne inin yerini tutan bir kelime olarak da kurabilirsiniz zihninizde. Yani kodlar g altrrken macera.enerji diyebilmek iin, en bata bunu self.enerji olarak tanmlamamz s s gerekiyor... Bu dnme tarz iimizi biraz daha kolaylatrabilir. s s s Bir de Tkinterli rne imize bakalm: g

from Tkinter import * class Arayuz: def __init__(self): pencere = Tk() dugme = Button(text="tamam") dugme.pack() uygulama = Arayuz()

Burada tanmlad mz d menin bir i yapmasn sa layalm. Mesela d meye baslnca kog g s g g mut ekrannda bir yaz ksn. nce syle deneyelim:
from Tkinter import * class Arayuz: def __init__(self): pencere = Tk() dugme = Button(text="tamam",command=yaz) dugme.pack() def yaz(): print "Hadi eyvallah!" uygulama = Arayuz()

Tabii ki bu kodlar altrd mzda syle bir hata mesaj alrz: s g


Traceback (most recent call last): File "xxxxxxxxxxxxxxxxxxxx", line 13, in <module> uygulama = Arayuz() File "xxxxxxxxxxxxxxxxxxxxxxxx", line 7, in __init__ dugme = Button(text="tamam",command=yaz) NameError: global name yaz is not defined

Bunun sebebini bir nceki rnekte renmitik. Kodlarmz su sekilde yazmamz gerekiyor: g s
from Tkinter import * class Arayuz: def __init__(self): pencere = Tk() dugme = Button(text="tamam",command=self.yaz) dugme.pack() def yaz(self): print "Hadi eyvallah!" uygulama = Arayuz()

Grd nz gibi, e er programn farkl noktalarnda kullanaca mz de ikenler veya fonksiyg g g gs onlar varsa, bunlar self neki ile birlikte tanmlyoruz. def self.yaz seklinde bir fonksiyon tanmlama yntemi olmad na gre bu ilemi def yaz(self) seklinde yapmamz gerekiyor. Bu g s son rnek aslnda yine de tam anlamyla kusursuz bir rnek de ildir. Ama simdilik elimizden bu g kadar geliyor. Daha ok bilgimiz oldu unda bu kodlar daha dzgn yazmay da renece iz. g g g Bu iki rnek iinde, selflerle oynayarak olayn i yzn kavramaya aln. Mesela s yaz() fonksiyonundaki self parametresini silince ne tr bir hata mesaj alyorsunuz, com-

mand=self.yaz iindeki self ifadesini silince ne tr bir hata mesaj alyorsunuz? Bunlar iyice inceleyip, selfin nerede ne ie yarad n kavramaya aln. s g s Bu noktada kk bir sr verelim. Siz bu kelimeyi btn sn kodlamalarda bu sekilde gryor olsanz da aslnda illa ki self kelimesini kullanacaksnz diye bir kaide yoktur. Self yerine baka kelimeler de kullanabilirsiniz. Mesela yukardaki rne i syle de yazabilirsiniz: s g
from Tkinter import * class Arayuz: def __init__(armut): pencere = Tk() dugme = Button(text="tamam",command=armut.yaz) dugme.pack() def yaz(armut): print "Hadi eyvallah!" uygulama = Arayuz()

Ama siz byle yapmayn. self kelimesinin kullanm o kadar yaygnlam ve yerlemitir ki, s s s s sizin bunu kendi kodlarnzda dahi olsa de itirmeye kalkmanz pek ho karlanmayacaktr. gs s s Ayrca sizin kodlarnz okuyan bakalar, ne yapmaya alt nz anlamakta bir an da olsa s s g tereddt edecektir. Hatta birka yl sonra dnp siz dahi ayn kodlara bakt nzda, Ben bug rada ne yapmaya almm, diyebilirsiniz. . . O yzden, self iyidir, self kullann!... s s Sizi self kullanmaya ikna etti imizi kabul edersek, artk yolumuza devam edebiliriz. g Hatrlarsanz yukarda ufack bir oyun almas yapmaya balamtk. s s s oyunumuzu biraz ayrntlandralm. Elimizde simdilik sunlar vard:
class Oyun: def __init__(self): self.enerji = 50 self.para = 100 self.fabrika = 4 self.isci = 10 def goster(self): print "enerji:", self.enerji print "para:", self.para print "fabrika:", self.fabrika print "ii:", self.isci s macera = Oyun()

Gelin isterseniz

Buradaki kodlar yardmyla bir oyuncu oluturduk. Bu oyuncunun oyuna balad nda sahip s s g olaca enerji, para, fabrika ve ii bilgilerini de girdik. Kodlarmz arasndaki goster() fonksiyg s onu yardmyla da her an bu bilgileri grntleyebiliyoruz. Simdi isterseniz oyunumuza biraz hareket getirelim. Mesela kodlara yeni bir fonksiyon ekley erek oyuncumuza yeni fabrikalar kurma olana tanyalm: g
class Oyun: def __init__(self): self.enerji = 50 self.para = 100 self.fabrika = 4 self.isci = 10

def goster(self): print "enerji:", self.enerji print "para:", self.para print "fabrika:", self.fabrika print "ii:", self.isci s def fabrikakur(self, miktar): if self.enerji > 3 and self.para > 10: self.fabrika = miktar + self.fabrika self.enerji = self.enerji - 3 self.para = self.para - 10 print miktar, "adet fabrika kurdunuz! Tebrikler!" else: print "Yeni fabrika kuramazsnz. Yeterli enerjiniz/paranz yok!" macera = Oyun()

Burada fabrikakur() fonksiyonuyla ne yapmaya alt mz aslnda ok ak. Hemen bunun s g nasl kullanlaca n grelim: g
>>> macera.fabrikakur(5)

Bu komutu verdi imizde, 5 adet fabrika kurdunuz! Tebrikler! seklinde bir kutlama mesaj g gsterecektir bize programmz. . . Kodlarmz iindeki def fabrikakur(self,miktar) ifadesinde grd mz miktar kelimesi, kodlar altrrken verece imiz parametreyi temsil ediyor. g s g Yani burada 5 saysn temsil ediyor. E er macera.fabrikakur() fonksiyonunu kullanrken g herhangi bir say belirtmezseniz, hata alrsnz. nk kodlarmz tanmlarken fonksiyon iinde miktar adl bir ifade kullanarak, kullancdan fonksiyona bir parametre vermesini bekledi imizi belirttik. Dolaysyla Python kullancdan parantez iinde bir parametre girmesini g bekleyecektir. E er fonksiyon parametresiz altrlrsa da, Pythonun beklentisi karlang s s mad iin, hata verecektir. Burada dikkat edece imiz nokta, kodlar iinde bir fonksiyon tanmg g larken ilk parametrenin her zaman self olmas gerekti idir. Yani def fabrikakur(miktar) g de il, def fabrikakur(self,miktar) dememiz gerekiyor. g Simdi de su komutu verelim:
>>> macera.goster() enerji: 47 para: 90 fabrika: 9 ii: 10 s

Grd nz gibi oyuncumuz 5 adet fabrika kazanm, ama bu ilem enerjisinde ve parasnda g s s bir miktar kayba neden olmu (fabrika kurmay bedava m sandnz!). s Yazd mz kodlara dikkatlice bakarsanz, oradaki if deyimi sayesinde oyuncunun enerjisi 3n g altna, paras da 10un altna derse syle bir mesaj verilecektir: s Yeni fabrika kuramazsnz. Yeterli enerjiniz/paranz yok! Art arda fabrikalar kurarak bunu kendiniz de test edebilirsiniz.

20.8 Miras Alma (Inheritance)


Simdiye kadar bir oyuncu oluturduk ve bu oyuncuya oyuna balad anda sahip olaca baz s s g g zellikler verdik. Oluturdu umuz oyuncu isterse oyun iinde fabrika da kurabiliyor. Ama s g byle, kendin al, kendin oyna tarz bir durumun skc olaca belli. O yzden gelin oyuna g biraz hareket katalm! Mesela oyunumuzda bir adet oyuncu dnda bir adet de dman olsun. s s O halde hemen bir adet dman oluturalm: s s
class Dusman:

Dmanmzn gvdesini oluturduk. Simdi sra geldi onun kolunu baca n oluturmaya, ona s s g s bir kiilik kazandrmaya. . . s Hatrlarsanz, oyunun banda oluturdu umuz oyuncunun baz zellikleri vard. (enerji, para, s s g fabrika, ii gibi. . . ) s Isterseniz dmanmzn da buna benzer zellikleri olsun. Mesela ds s manmz da oyuncunun sahip oldu u zelliklerin aynsyla oyuna balasn. Yani onun da: g s enerjisi 50, paras 100 fabrika says 4, ii says ise 10 s olsun. Simdi hatrlarsanz oyuncu iin bunu syle yapmtk: s
class Oyun: def __init__(self): enerji = 50 para = 100 fabrika = 4 isci = 10

Simdi ayn seyi Dusman snf iin de yapaca z. Peki bu zellikleri yeniden tek tek d g s man iin de yazacak myz? Tabii ki hayr. O halde nasl yapaca z bunu? ste burada img I dadmza Python snarnn miras alma zelli i yetiiyor. Yabanclar bu kavrama inherig s tance adn veriyorlar. Yani, nasl Msrdaki dedenizden size miras kald nda dedenizin size g brakt mirasn nimetlerinden her ynyle yararlanabiliyorsanz, bir snf baka bir snftan g s miras ald nda da ayn sekilde miras alan snf miras ald snfn zelliklerini kullanabiliyor. g g Az laf, ok i. Hemen bir rnek yapalm. Yukarda Dusman adl snfmz oluturmutuk: s s s
class Dusman:

Dusman snf henz bu haliyle hibir sey miras alm de il. Hemen miras aldralm. Bunun iin s g snfmz syle tanmlamamz gerekiyor:
class Dusman(Oyun):

Bylelikle daha en bata tanmlad mz Oyun adl snf, bu yeni oluturdu umuz Dusman s g s g adl snfa miras verdik. Dusman snfnn durumunu Pythoncada syle ifade edebiliriz: Dusman snf Oyun snfn miras ald (Dusman inherits from Oyun) Bu haliyle kodlarmz henz eksik. Simdilik syle bir sey yazp snfmz kitabna uyduralm:
class Dusman(Oyun): pass dsman = Dusman()

Yukarda pass ifadesini neden kulland mz biliyorsunuz. Snf tanmladktan sonra iki nokta g st stenin ardndan aa ya bir kod blo u yazmamz gerekiyor. Ama su anda oraya yazacak s g g bir kodumuz yok. O yzden idareten oraya bir pass ifadesi yerletirerek gerekli kod blo unu s g geitirmi oluyoruz. O ksm bo brakamayz. Yoksa snfmz kullanlamaz durumda olur. s s s

Daha sonra oraya yazaca mz kod bloklarn hazrladktan sonra oradaki pass ifadesini sileg ce iz. g Simdi bakalm bu sna neler yapabiliyoruz? Bu kodlar, yaznn banda anlatt mz sekilde altralm. Dedi imiz gibi, Dusman adl s g s g snfmz daha nce tanmlad mz Oyun adl snf miras alyor. Dolaysyla Dusman adl g snf Oyun adl snfn btn zelliklerine sahip. Bunu hemen test edelim:
>>> dsman.goster() enerji: 50 para: 100 fabrika: 4 ii: 10 s

Grd nz gibi, Oyun snfnn bir fonksiyonu olan goster()i Dusman snf iinden de g altrabildik. stelik Dusman iinde bu de ikenleri tekrar tanmlamak zorunda kalmadan... s gs Istersek bu de ikenlere teker teker de ulaabiliriz: gs s
>>> dsman.enerji 50 >>> dsman.isci 10

Dusman snf ayn zamanda Oyun snfnn fabrikakur() adl fonksiyonuna da eriebiliyor: s
dsman.fabrikakur(4)

4 adet fabrika kurdunuz! Tebrikler! Grd nz gibi dmanmz kendisine 4 adet fabrika kurdu!.. g s bakalm:
>>> dsman.goster() enerji: 47 para: 90 fabrika: 8 ii: 10 s

Dmanmzn durumuna s

Evet, dmanmzn fabrika says artm, enerjisi ve paras azalm. Bir de kendi durumumuzu s s s kontrol edelim:
>>> macera.goster() enerji: 50 para: 100 fabrika: 4 ii: 10 s

Dikkat ederseniz, Oyun ve Dusman snar ayn de ikenleri kullandklar halde birindeki gs de iiklik brn etkilemiyor. Yani dmanmzn yeni bir fabrika kurmas bizim de erlerimizi gs s g de iikli e u ratmyor. gs g g Simdi syle bir sey yapalm:

Dmanmzn, oyuncunun zelliklerine ek olarak bir de ego adl bir niteli i olsun. Mesela s g dmanmz bize her zarar verdi inde egosu bysn!... s g nce syle deneyelim:
class Dusman(Oyun): def __init__(self): self.ego = 0

Bu kodlar altrd mzda hata alrz. nk burada yeni bir __init__ fonksiyonu tanms g lad mz iin, bu yeni fonksiyon kendini Oyun snfnn __init__ fonksiyonunun zerine yazyor. g Dolaysyla Oyun snfndan miras ald mz btn nitelikleri kaybediyoruz. Bunu nlemek iin g syle bir sey yapmamz gerekir:
class Dusman(Oyun): def __init__(self): Oyun.__init__(self) self.ego = 0

Burada Oyun.__init__(self) ifadesiyle Oyun adl snfn __init__ fonksiyonu iinde yer alan btn nitelikleri, Dusman adl snfn __init__ fonksiyonu iine kopyalyoruz. Bylece self.ego de ikenini tanmlarken, enerji, para, vb. niteliklerin kaybolmasn engelliyoruz. gs Aslnda bu haliyle kodlarmz dzgn sekilde alr. Kodlarmz altrd mzda biz ekranda s s g gremesek de aslnda ego adl niteli e sahiptir dmanmz. Ekranda bunu gremememizin g s nedeni tabii ki kodlarmzda henz bu niteli i ekrana yazdracak bir print deyiminin yer alg mamas. . . Isterseniz bu zelli i daha nce de yapt mz gibi ayr bir fonksiyon ile halledelim: g g
class Dusman(Oyun): def __init__(self): Oyun.__init__(self) self.ego = 0 def goster(self): Oyun.goster(self) print "ego:", self.ego dsman = Dusman()

Tpk __init__ fonksiyonunda oldu u gibi, burada da Oyun.goster(self) ifadesi yardmyla g Oyun snfnn goster() fonksiyonu iindeki de ikenleri Dusman snfnn goster() gs fonksiyonu iine kopyaladk. Bylece ego de ikenini yazdrrken, teki de ikenlerin de gs gs yazdrlmasn sa ladk. g Simdi artk dmanmzn btn niteliklerini istedi imiz sekilde oluturmu olduk. s g s s deneyelim:
>>> dsman.goster() enerji: 50 para: 100 fabrika: 4 ii: 10 s ego: 0

Hemen

Grd nz gibi dmanmzn zellikleri arasnda oyuncumuza ilave olarak bir de ego g s adl bir nitelik var. Bunun balang de erini 0 olarak ayarladk. Daha sonra yazaca mz s g g fonksiyonda dmanmz bize zarar verdike egosu byyecek. . . . Simdi gelin bu fonksiyonu s yazalm:

class Dusman(Oyun): def __init__(self): Oyun.__init__(self) self.ego = 0 def goster(self): Oyun.goster(self) print "ego:", self.ego def fabrikayik(self,miktar): macera.fabrika = macera.fabrika - miktar self.ego = self.ego + 2 print "Tebrikler. Oyuncunun", miktar, "adet fabrikasn yktnz!" print "stelik egonuz da tavana vurdu!" dsman = Dusman()

Dikkat ederseniz, fabrikayik() fonksiyonu iindeki de ikeni macera.fabrika seklinde gs yazdk. Yani bir nceki Oyun adl snfn rne ini (instance) kullandk. Dusman snfnn g de il... Neden? ok basit. nk kendi fabrikalarmz de il oyuncunun fabrikalarn ykmak g g istiyoruz!.. Burada, su kodu altrarak oyuncumuzun kurdu u fabrikalar ykabiliriz: s g
>>> dsman.fabrikayik(2)

Biz burada 2 adet fabrika ykmay tercih ettik. . . Kodlarmzn en son halini topluca grelim isterseniz:
class Oyun: def __init__(self): self.enerji = 50 self.para = 100 self.fabrika = 4 self.isci = 10 def goster(self): print "enerji:", self.enerji print "para:", self.para print "fabrika:", self.fabrika print "ii:", self.isci s def fabrikakur(self,miktar): if self.enerji > 3 and self.para > 10: self.fabrika = miktar + self.fabrika self.enerji = self.enerji - 3 self.para = self.para - 10 print miktar, "adet fabrika kurdunuz! Tebrikler!" else: print "Yeni fabrika kuramazsnz. Yeterli enerjiniz/paranz yok!" macera = Oyun() class Dusman(Oyun): def __init__(self): Oyun.__init__(self) self.ego = 0 def goster(self):

Oyun.goster(self) print "ego:", self.ego def fabrikayik(self,miktar): macera.fabrika = macera.fabrika - miktar self.ego = self.ego + 2 print "Tebrikler. Oyuncunun", miktar, "adet fabrikasn yktnz!" print "stelik egonuz da tavana vurdu!" dsman = Dusman()

En son oluturdu umuz fonksiyonda nerede Oyun snfn do rudan adyla kulland mza s g g g ve nerede bu snfn rne inden (instance) yararland mza dikkat edin. Dikkat ederg g seniz, fonksiyon balklarn a rrken do rudan snfn kendi adn kullanyoruz (mesela s g g Oyun.__init__(self)). Bir fonksiyon iindeki de ikenleri a rrken ise (mesela macgs g era.fabrika), rne i (instance) kullanyoruz. g E er bir fonksiyon iindeki de ikenleri g gs a rrken de snf isminin kendisini kullanmak isterseniz, ifadeyi Oyun().__init__(self) sekg linde yazmanz gerekir. Ama siz byle yapmayn... Yani de ikenleri a rrken rne i kullann. gs g g Artk kodlarmz didiklenmek zere sizi bekliyor. Burada yaplan seyleri iyice anlayabilmek iin kafanza gre kodlar de itirin. Neyi nasl de itirdi inizde ne gibi bir sonu elde etti inizi gs gs g g dikkatli bir sekilde takip ederek, bu konunun zihninizde iyice yer etmesini sa layn. g Aslnda yukardaki kodlar daha dzenli bir sekilde de yazmamz mmkn. rne in, enerji, g para, fabrika gibi nitelikleri ayr bir snf halinde dzenleyip, teki snarn do rudan bu g snftan miras almasn sa layabiliriz. Bylece snfmz daha derli toplu bir grnm kazang m olur. Aa daki kodlar iinde, isimlendirmeleri de biraz de itirerek standartlatrd mza s s g gs s g dikkat edin:
class Oyun: def __init__(self): self.enerji = 50 self.para = 100 self.fabrika = 4 self.isci = 10 def goster(self): print "enerji:", self.enerji print "para:", self.para print "fabrika:", self.fabrika print "ii:", self.isci s oyun = Oyun() class Oyuncu(Oyun): def __init__(self): Oyun.__init__(self) def fabrikakur(self,miktar): if self.enerji > 3 and self.para > 10: self.fabrika = miktar + self.fabrika self.enerji = self.enerji - 3 self.para = self.para - 10 print miktar, "adet fabrika kurdunuz! Tebrikler!" else: print "Yeni fabrika kuramazsnz. Yeterli enerjiniz/paranz yok!"

oyuncu = Oyuncu() class Dusman(Oyun): def __init__(self): Oyun.__init__(self) self.ego = 0 def goster(self): Oyun.goster(self) print "ego:", self.ego def fabrikayik(self,miktar): oyuncu.fabrika = oyuncu.fabrika - miktar self.ego = self.ego + 2 print "Tebrikler. Oyuncunun", miktar, "adet fabrikasn yktnz!" print "stelik egonuz da tavana vurdu!" dusman = Dusman()

Bu kodlar hakknda son bir noktaya daha de inelim. Hatrlarsanz oyuna balarken oluturulan g s s niteliklerde de iiklik yapabiliyorduk. Mesela yukarda Dusman snf iin ego adl yeni gs bir nitelik tanmlamtk. Bu nitelik sadece Dusman tarafndan kullanlabiliyordu, Oyuncu s tarafndan de il. Ayn sekilde, yeni bir nitelik belirlemek yerine, istersek varolan bir niteli i g g iptal de edebiliriz. Diyelim ki Oyuncunun oyuna balarken fabrikalar olsun istiyoruz, ama s Dusmann oyun balangcnda fabrikas olsun istemiyoruz. Bunu syle yapabiliriz: s
class Dusman(Oyun): def __init__(self): Oyun.__init__(self) del self.fabrika self.ego = 0

Grd nz gibi Dusman snf iin __init__ fonksiyonunu tanmlarken fabrika niteli ini g g del komutuyla siliyoruz. Bu silme ilemi sadece Dusman snf iin geerli oluyor. Bu ilem s s teki snar etkilemiyor. Bunu syle de ifade edebiliriz; del komutu yardmyla fabrika adl de ikene Dusman adl blgeden eriilmesini engelliygs s oruz. Dolaysyla bu de iiklik sadece o blgeyi etkiliyor. teki snar ve daha sonra oluturulacak gs s yeni snar bu ilemden etkilenmez. Yani aslnda del komutuyla herhangi bir seyi sildi imiz s g yok! Sadece eriimi engelliyoruz. s Kk bir not: Burada blge olarak bahsetti imiz sey aslnda Pythoncada isim alan g (namespace) olarak adlandrlyor. Simdi bir rnek de Tkinter ile yapalm. Yukarda verdi imiz rne i hatrlyorsunuz: g g
from Tkinter import * class Arayuz: def __init__(self): pencere = Tk() dugme = Button(text="tamam",command=self.yaz) dugme.pack() def yaz(self): print "Hadi eyvallah!"

uygulama = Arayuz()

Bu rnek gayet dzgn alsa da bu snf daha dzgn ve dzenli bir hale getirmemiz s mmkn:
#!/usr/bin/env python #-*-coding:utf-8-*from Tkinter import * class Arayuz(Frame): def __init__(self): Frame.__init__(self) self.pack() self.pencerearaclari() def pencerearaclari(self): self.dugme = Button(self,text="tamam",command=self.yaz) self.dugme.pack() def yaz(self): print "Hadi eyvallah!" uygulama = Arayuz() uygulama.mainloop()

Burada dikkat ederseniz, Tkinterin Frame adl snfn miras aldk. Buradan anlayaca mz g gibi, miras alma (inheritance) zelli ini kullanmak iin miras alaca mz snfn o anda kulg g land mz modl iinde olmas sart de il. Burada oldu u gibi, baka modllerin iindeki g g g s snar da miras alabiliyoruz. Yukardaki kodlar dikkatlice inceleyin. Bata biraz kark gibi s s grnse de aslnda daha nce verdi imiz basit rneklerden hi bir fark yoktur. g

20.9 Eski ve Yeni Snar


Simdiye kadar verdi imiz snf rneklerinde nemli bir konudan hi bahsetmedik. Pythonda g iki tip snf vardr: Eski tip snar ve yeni tip snar. Ancak korkmanz gerektirecek kadar fark yoktur bu iki snf tipi arasnda. Ayrca hangi snf tipini kullanrsanz kullann sorun yaas mazsnz. Ama tabii ki kendimizi yeni tipe altrmakta fayda var, nk muhtemelen Pythonun s sonraki srmlerinden birinde (byk ihtimalle Python 3.0da) eski tip snar kullanmdan kaldrlacaktr. Eski tip snar ile yeni tip snar arasndaki en byk fark sudur: Eski tip snar syle tanmlanr:
class Deneme:

Yeni tip snar ise syle tanmlanr:


class Deneme(object)

Grd nz gibi, eski tip snarda baka bir snf miras alma zorunlulu u yoktur. O yzden g s g snar istersek parantezsiz olarak tanmlayabiliyoruz. Yeni tip snarda ise her snf mutlaka baka bir snf miras almaldr. E er kodlarnz iinde gerekten miras almanz gereken s g baka bir snf yoksa, ntanml olarak object adl snf miras almanz gerekiyor. Dolaysyla s politikamz su olacak:

Ya bir snf miras al, ya da miras alman gereken herhangi bir snf yoksa, object adl snf miras al... Dedi imiz gibi, eski ve yeni snar arasndaki en temel fark budur. g Aslnda daha en bata hi eski tip snar anlatmadan do rudan yeni tip snar anlatmakla ie s g s balayabilirdik. Ama bu pek do ru bir yntem olmazd. nk her ne kadar eski tip snar sons g raki bir Python srmnde tedavlden kaldrlacaksa da, etrafta eski snarla yazlm bolca s kod greceksiniz. Dolaysyla sadece yeni tip snar renmek mevcut tabloyu eksik alglag mak olacaktr... Yukarda hatrlarsanz pass ifadesini kullanmtk. Snarn yaps gere i bir kod blo u belirts g g memiz gerekti inde, ama o anda yazacak bir seyimiz olmad nda srf bir yer tutucu vazifesi g g grsn diye o pass ifadesini kullanmtk. Yine bu pass ifadesini kullanarak baka bir sey daha s s yapabiliriz. Su rne e bakalm: g
class BosSinif(object): pass

Bylece ii bo da olsa kurallara uygun bir snf tanmlam olduk. Ayrca dikkat ederseniz, s s snfmz tanmlarken yeni snf yapsn kullandk. zel olarak miras alaca mz bir snf g olmad iin do rudan object adl snf miras aldk. Yine dikkat ederseniz snfmz iin bir g g rnek (instance) de belirtmedik. Hem snfn iini doldurma iini, hem de rnek belirleme s iini komut satrndan halledece iz. nce snfmz rnekliyoruz: s g
sinifimiz = BosSinif()

Grd nz gibi BosSinif() seklinde, parametresiz olarak rnekliyoruz snfmz. g parantez iinde bir parametre belirtirseniz hata mesaj alrsnz... Simdi bo olan snfmza nitelikler ekliyoruz: s
>>> >>> >>> >>> sinifimiz.sayi1 = 45 sinifimiz.sayi2 = 55 sinifimiz.sonuc = sinifimiz.sayi1 * sinifimiz.sayi2 sinifimiz.sonuc

Zaten

2475

Istersek snfmzn son halini, Python snarnn __dict__ metodu yardmyla grebiliriz:
sinifimiz.__dict__ {sayi2: 55, sayi1: 45, sonuc: 2475}

Grd nz gibi snfn ieri i aslnda bir szlkten ibaret... Dolaysyla szlklere ait su ilemg g s ler snfmz iin de geerlidir:
sinifimiz.__dict__.keys() [sayi2, sayi1, sonuc] sinifimiz.__dict__.values() [55, 45, 2475]

Buradan rendi imiz baka bir sey de, snarn ieri inin dinamik olarak de itirilebilece idir. g g s g gs g Yani bir snf her seyiyle tanmladktan sonra, istersek o snfn niteliklerini etkileimli olarak s de itirebiliyoruz. gs

20.10 Sonu
Bylece Nesne Tabanl Programlama konusunun sonuna gelmi oluyoruz. Aslnda daha do ru s g bir ifadeyle, Nesne Tabanl Programlamaya hzl bir giri yapm oluyoruz. nk NTP su birka s s sayfada anlatlanlardan ibaret de ildir. Bu yazmzda bizim yapmaya alt mz sey, okuyug s g cuya NTP hakknda bir kir vermektir. E er okuyucu bu yaz sayesinde NTP hakknda hi g de ilse birazck kir sahibi olmusa kendimizi baarl sayaca z. Bu yazdaki ama NTP gibi g s s g etrelli bir konuyu okuyucunun gznde bir nebze de olsa sevimli klabilmek, konuyu kolay hazmedilir bir hale getirmektir. Okuyucu bu yazdan sonra NTPye ilikin baka kaynaklar daha s s bir kendine gvenle inceleme imkanna kavuacak ve okudu unu daha kolay anlayacaktr. s g

BLM

21

Sqlite ile Veritaban Programlama

21.1 Giri s
Bu blmde, Pythondaki ileri dzey konulardan biri olan veritaban programlamay (database programming) inceleyece iz. Peki nedir bu veritaban denen sey? g Esasnda veritaban, hibirimizin yabancs oldu u bir kavram de il. Biz bu kelimeyi, teknik g g anlamnn dnda, gnlk hayatta da ska kullanyoruz. Veritaban, herkesin bildi i ve kuls g land anlamyla, iinde veri barndran bir eydir. Gnlk kullanmda, hakikaten, iinde veri g s barndran her seye veritaban dendi ini duyarsnz. g Veritaban kelimesinin gnlk kullanmdaki anlam dnda bir de teknik anlam vardr. Bizi s esas ilgilendiren de zaten terimin teknik anlamdr. Mesela Vikipedide veritaban syle tanm lanyor: Bilgisayar terminolojisinde, sistematik eriim imkn olan, ynetilebilir, gncels lenebilir, tanabilir, birbirleri arasnda tanml ilikiler bulunabilen bilgiler kmesidir. s s Bir baka tanm da, bir bilgisayarda sistematik sekilde saklanm, programlarca s s ilenebilecek veri y ndr. s g Yukardaki tanm, veritabannn ne demek oldu unu gayet iyi ifade ediyor. Ama esasnda bizim g veritaban tanm zerinde fazlaca durmamza gerek yok. Biz her zaman oldu u gibi iin teknik g s boyutuyla de il, taktik boyutuyla ilgilenmeyi tercih edece iz. O halde yava yava ie koyulg g s s s maya balayalm. s Pythonla veritaban programlama ilemleri s iin pek ok alternatimiz var. Pythonla hangi veritaban sistemlerini kullanabilece inizi grmek iin g http://wiki.python.org/moin/DatabaseInterfaces adresindeki listeyi inceleyebilirsiniz. Biz bunlar iinde, sadeli i, basitli i ve kullanm kolayl nedeniyle Sqlite adl veritaban ynetim g g g sistemini kullanaca z. g

349

21.2 Neden Sqlite?


Dedi imiz gibi, Pythonda veritaban ilemleri iin kullanabilece iniz pek ok alternatif bulunur. g s g Ama biz btn bu alternatier iinde Sqlite tercih edece iz. Peki neden Sqlite? g Sqliten teki sistemlere gre pek ok avantaj bulunur. Gelin isterseniz Sqliten baz avantajlarna syle bir gz gezdirelim:
Her seyden nce Sqlite Pythonun 2.5 srmlerinden bu yana bu dilin bir parasdr. Dolaysyla e er kulland nz Python srm 2.5 veya st ise Sqlite Pythondaki herg g hangi bir modl gibi ie aktarabilir ve kullanmaya balayabilirsiniz. s Sqlite herhangi bir yazlm veya sunucu kurulumu gerektirmez. Bu sayede, bu modl kullanabilmek iin sunucu kongrasyonu yapmaya da gerek yoktur. Baz veritabanlarn kullanabilmek iin arka planda bir veritaban sunucusu altryor olmanz gerekir. Sqliteta s ise byle bir sey yapmazsnz. Sqlite, teki pek ok veritaban alternatine gre basittir. Bu yzden Sqlite ok ksa bir srede kavrayp kullanmaya balayabilirsiniz. s Sqlite zgr bir yazlmdr. Bu yazlmn batan aa btn kodlar kamuya aktr. s s g Dolaysyla Sqlite kodlarnn her zerresini istedi iniz gibi kullanabilir, de iikli e u ratag gs g g bilir, satabilir ve ticari veya ticari olmayan uygulamalarnzda gnl rahatl yla kullang abilirsiniz. Sqliten sade ve basit olmas sizi yanltmasn. Bu zelliklerine bakarak, Sqliten yeteneksiz bir veritaban sistemi oldu unu dnmeyin. Bugn Sqlite aktif olarak kulg s lanan pek ok byk ve tannm sirket bulunur. Mesela, Adobe, Apple, Mozilla/Firefox, s Google, Symbian ve Sun bu sirketlerden bazlardr. Hatta GNOME masast ortamnn sevilen mzik ve video alarlarndan Bansheede de veritaban olarak Sqlite kullanld n g syleyelim.

Yukardaki sebeplerden tr, veritaban konusunu Sqlite zerinden anlataca z. g hemen yola koyulalm.

O halde

21.3 Sqliten Yaps


Bu blmn en banda verdi imiz veritaban tanmndan da anlalaca gibi, veritabanlar, s g s g verileri sonradan kullanlmak zere iinde tutan bir sistemdir. Btn ilikisel veritabanlarnda s oldu u gibi, Sqlite da bu verileri bir tablo yaps iinde tutar. Yani aslnda bir Sqlite veritaban g iindeki veriler syle bir yapya sahiptir: Stun 1 De er 1/1 g De er 1/2 g De er 1/3 g De er 1/4 g Stun 2 De er 2/1 g De er 2/2 g De er 2/3 g De er 2/4 g Stun 3 De er 3/1 g De er 3/2 g De er 3/3 g De er 3/4 g Stun 4 De er 4/1 g De er 4/2 g De er 4/3 g De er 4/4 g Stun 5 De er 5/1 g De er 5/2 g De er 5/3 g De er 5/4 g

Sqlite iinde oluturulan yukardakine benzer her tablonun bir de ismi vardr. Daha do rusu, s g Sqlite ile bir tablo olutururken, bu tabloya bir de ad vermemiz gerekir. Mesela yukardaki s tabloya De erler adn verdi imizi varsayabilirsiniz... g g Sqlite ile alrken veriler zerinde yapaca mz ilemleri, yukardaki tablonun adn ve bu s g s tablodaki stunlar kullanarak gerekletirece iz. Bu yzden Sqliten yapsn anlamak byk s g nem tar. Grd nz gibi, bu veritaban sisteminin yapsn anlamak da yle zor bir i s g s de ildir. g

21.4 Veritabanyla Baglant Kurmak


Bu blmde sqlite modln kullanarak bir veritabanna nasl ba lanaca mz, elimizde herg g hangi bir veritaban yoksa veritabann nasl oluturaca mz inceleyece iz. s g g Dikkat ederseniz burada bir sqlite modlnden sz ettik. Dolaysyla, tahmin edebilece iniz gibi, bu modl kullanabilmek iin ncelikle modl ie aktarmamz gerekiyor. Bu g blmn banda da syledi imiz gibi, Sqlite, Pythonun 2.5 srmnden bu yana Pythonun s g bir parasdr:
>>> import sqlite3

Pythonda Sqlite veritaban sistemine ait modl sqlite3 adn tar. Bu yzden, bu modl ie s aktarmak iin import sqlite3 ifadesini kullanmamz gerekiyor. E er bu isim size ok uzun g geliyorsa veya modl adnda saylarn ve harerin birlikte bulunmas nedeniyle hem say hem de harf girmeyi bir angarya olarak gryorsanz elbette sqlite3 modln farkl bir adla da ie aktarabilece inizi biliyorsunuz. Mesela: g
>>> import sqlite3 as sql

Veya:
>>> import sqlite3 as lite

Bylece sqlite3 modln sql veya lite adyla ie aktarm olduk. Ancak ben konuyu ans latrken, okur asndan kafa karkl na sebep olmamak iin, modl import sqlite3 seks g linde ie aktarmz gibi davranaca m. s g Gelelim bu modl yardmyla nasl veritaban oluturulaca na... Bunun iin sqlite3 mods g lnn connect() adl fonksiyonundan yararlanaca z. Bu fonksiyonu su sekilde kullanyoruz: g
>>> sqlite3.connect("veritaban_ad")

connect() metoduna verdi imiz varitaban_ad adl argman kullanaca mz veritabannn g g addr. E er belirtilen isimde bir veritaban sistemde bulunmuyorsa o adla yeni bir veritaban g oluturulacaktr. Mesela: s
>>> vt = sqlite3.connect("deneme.db")

E er bu komutu verdi iniz dizin iinde deneme.db adl bir veritaban yoksa, bu ada sahip bir g g veritaban oluturulur. E er zaten bu adla bir veritaban dosyanz varsa, sqlite3 bu veritas g banna ba lanacaktr. g Elbette isterseniz connect() metoduna argman olarak tam dosya yolu da verebilirsiniz:
>>> import sqlite3 as sq >>> v = sq.connect("/home/istihza/test.db") #GNU/Linux >>> v = sq.connect("c:/documents and settings/fozgul/desktop/test.db") #Windows

Bu komut yardmyla sabit disk zerinde bir dosya oluturmu veya varolan bir dosyaya ba lans s g m oluyoruz. Ancak isterseniz sqlite3 ile geici bir veritaban da oluturabilirsiniz: s s
>>> vt = sqlite3.connect(":memory:")

Oluturdu unuz bu geici veritaban sabit disk zerinde de il RAM (bellek) zerinde alr. s g g s Veritabann kapatt nz anda da bu geici veritaban silinir. E er arzu ederseniz, RAM zerinde g g

de il, disk zerinde de geici veritabanlar oluturabilirsiniz. Bunun iin de syle bir komut g s kullanyoruz:
>>> vt = sqlite3.connect("")

Grd nz gibi, disk zerinde geici bir veritaban oluturmak iin bo bir karakter dizisi g s s kullandk. Tpk :memory: kullanmnda oldu u gibi, bo karakter dizisiyle oluturulan geici g s s veritabanlar da veritaban ba lantsnn kesilmesiyle birlikte ortadan kalkacaktr. g Geici veritaban oluturmak, zellikle eitli testler veya denemeler yapt nz durumlarda s s g iinize yarar. Sonradan nasl olsa silece iniz, srf test amal tuttu unuz bir veritabann disk s g g zerinde oluturmak yerine RAM zerinde oluturmay tercih edebilirsiniz. Ayrca, geici veris s tabanlar sayesinde, yazd nz bir kodu test ederken bir hatayla karlarsanz sorunun veritag s s ban iinde varolan verilerden de il, yazd nz koddan kaynakland ndan da emin olabilirsiniz. g g g nk, dedi imiz gibi, programn her yeniden alnda veritaban batan oluturulacaktr. g ss s s Her seyden te, bellek zerinde yaplan ilemler sabit disk zerinde yaplan ilemlere gre s s daha hzldr... Dikkatinizi ekmek istedi im bir nokta da sudur: Grd nz gibi Sqlite, veritabann o anda g g iinde bulundu unuz dizin iinde oluturuyor. Mesela MySQL kullanyor olsaydnz, oluturulan g s s veritabanlarnn nceden tanmlanm bir dizin iine atld n grecektiniz. rne in GNU/Linux s g g sistemlerinde, MySQL veritabanlar /var/lib/mysql gibi bir dizinin iinde tutulur... Bylece Sqlite ile nasl veritaban ba lants kuraca mz ve nasl yeni bir veritaban olutug g s raca mz renmi olduk. Veritaban oluturduktan sonra, veritaban zerinde ilem yapag g s s s bilmek iin ilk adm olarak bir imle oluturmamz gerekir. s Imle oluturmak iin cursor() s metodundan yararlanaca z: g
>>> im = vt.cursor()

Imleci oluturduktan sonra artk nmz iyice alyor. Bylece, yukarda oluturdu umuz s s g imlec nesnesinin execute() metodunu kullanarak SQL komutlarn altrabilece iz. s g

21.5 Veri Giri i s


nceki blmn sonunda syledi imiz gibi, bir imle nesnesi oluturduktan sonra bunun g s execute() metodunu kullanarak SQL komutlarn iletebiliyoruz. s Dilerseniz simdi basit bir rnek yaparak neyin ne oldu unu anlamaya alalm: g s
>>> im.execute("CREATE TABLE adres_defteri (isim, soyisim)")

Hatrlarsanz, Sqlite veritaban sisteminin tablo benzeri bir yapya sahip oldu unu ve bu sisg temdeki her tablonun da bir isminin bulundu unu sylemitik. ste burada yapt mz sey, g s I g adres_defteri adl bir tablo oluturup, bu tabloya isim ve soyisim adl iki stun eklemeks ten ibarettir. Yani aslnda syle bir sey oluturmu oluyoruz: s s isim soyisim

Ayrca oluturdu umuz bu tablonun adnn da adres_defteri oldu unu unutmuyoruz... s g g Bu ilemleri nasl yapt mza dikkat edin. Burada CREATE TABLE adres_defteri (isim, s g soyisim) tek bir karakter dizisidir. Bu karakter dizisindeki CREATE TABLE ksm bir SQL komutu olup, bu komut bir tablo oluturulmasn sa lar. s g Burada CREATE TABLE ifadesini byk harerle yazdk. Ancak bu ifadeyi siz isterseniz kk harerle de yazabilirsiniz. Benim burada byk harf kullanmaktaki amacm SQL komutlarnn,

adres_defteri, isim ve soyisim gibi de ikenlerden grsel olarak ayrt edilebilmesini gs sa lamak. Yani CREATE TABLE ifadesinin mesela adres_defteri de ikeninden kolayca ayrt g gs edilebilmesini istedi im iin burada CREATE TABLE ifadesini byk harerle yazdm. g Karakter dizisinin devamnda (isim, soyisim) ifadesini gryoruz. Tahmin edebilece iniz g gibi, bunlar tablodaki stun balklarnn adn gsteriyor. Buna gre, oluturdu umuz tabloda s s g isim ve soyisim adl iki farkl stun bal olacak. s g Yukarda execute() metodunu kullanarak, veritaban iinde adres_defteri adl bir tablo oluturs duk. Ardndan da bu tablo iine isim ve soyisim adl iki stun bal yerletirdik. Bu ilemin ne s g s s kadar kolay oldu unu gryorsunuz. Simdi yine buna benzer bir komut yardmyla, yukarda g oluturdu umuz stun balklarnn altn dolduraca z: s g s g
>>> im.execute("INSERT INTO adres_defteri VALUES (Frat, zgl)")

Burada CREATE TABLE komutundan sonra INSERT INTO adl yeni bir SQL komutu daha reniyg oruz. CREATE TABLE ifadesi Trkede TABLO OLU TUR anlamna geliyor. INSERT INTO ise S ... IINE YERLE T S IR anlamna gelir. Yukardaki karakter dizisi iinde grnen VALUES ise DEGERLER demektir. Yani aslnda yukardaki karakter dizisi su anlama gelir: adres_defteri NE Frat ve zgl DEGERLERN YERLE TR. Yani syle bir tablo olutur: I I I I S I s isim Frat soyisim zgl

Buraya kadar gayet gzel gidiyoruz. Isterseniz simdi derin bir nefes alp, su ana kadar yap t mz seyleri bir gzden geirelim: g
ncelikle sqlite3 modln ie aktardk. Bu modln nimetlerinden yararlanabilmek iin bunu yapmamz gerekiyordu. sqlite3 kelimesini her defasnda yazmak bize angarya gibi gelebilece i iin bu modl farkl bir adla ie aktarmay tercih edebiliriz. Mesela g import sqlite3 as sql veya import sqlite3 as lite gibi... sqlite3 modln ie aktardktan sonra bir veritabanna ba lanmamz veya elimizde bir g veritaban yoksa yeni bir veritaban oluturmamz gerekiyor. Bunun iin connect() adl s bir fonksiyondan yararlanyoruz. Bu fonksiyonu, sqlite3.connect("veritaban_ad") seklinde kullanyoruz. E er iinde bulundu umuz dizinde, veritaban_ad adl bir veri g g taban varsa Sqlite bu veritabanna ba lanr. E er bu adda bir veritaban yoksa, alma g g s dizini altnda bu ada sahip yeni bir veritaban oluturulur. zellikle deneme amal ilems s ler yapmamz gerekti inde, sabit disk zerinde bir veritaban oluturmak yerine RAM g s stnde geici bir veritaban ile almay da tercih edebiliriz. Bunun iin yukardaki kos mutu syle yazyoruz: sqlite3.connect(":memory:"). Bu komutla RAM zerinde olu s turdu umuz veritaban, ba lant kesildi i anda ortadan kalkacaktr. g g g Veritabanmz oluturduktan veya varolan bir veritabanna ba landktan sonra yapmamz s g gereken sey bir imle oluturmak olacaktr. Daha sonra bu imlece ait metotlardan yarar s lanarak nemli iler yapabilece iz... Sqliteta bir imle oluturabilmek iin db.cursor() s g s gibi bir komut kullanyoruz. Tabii ben burada oluturdu unuz veritabanna db adn s g verdi inizi varsayyorum... g Imlecimizi de oluturduktan sonra nmz iyice alm oldu. Simdi dir(im) gibi bir kos s mut kullanarak imlecin metotlarnn ne oldu unu inceleyebilirsiniz. Tabii ben burada img lece im adn verdi inizi varsaydm... Grd nz gibi, listede execute() adl bir metot g g da var. Artk imlecin bu execute() metodunu kullanarak SQL komutlarn iletebiliriz. s Yukarda iki adet SQL komutu rendik. Bunlardan ilki CREATE TABLE. Bu komut veritag ban iinde bir tablo oluturmamz sa lyor. s g Ikincisi ise INSERT INTO ... VALUES .... Bu komut da, oluturdu umuz tabloya ierik eklememizi sa lyor. Bunlar su sekilde kuls g g land mz hatrlyorsunuz: g

>>> im.execute("CREATE TABLE adres_defteri (isim, soyisim)") >>> im.execute("INSERT INTO adres_defteri VALUES (Frat, zgl)")

Burada bir sey dikkatinizi ekmi olmal. SQL komutlarn yazmaya balarken ift trnakla s s baladk. Dolaysyla karakter dizisini yazarken i taraftaki Frat ve zgl de erlerini yazmak s g iin tek trnak kullanmamz gerekti. Karakter dizileri iindeki manevra alannz geniletmek s iin, SQL komutlarn trnak iinde yazmay da tercih edebilirsiniz. Bylece karakter dizisi iindeki tek ve ift trnaklar daha rahat bir sekilde kullanabilirsiniz. Yani:
>>> im.execute("""CREATE TABLE adres_defteri (isim, soyisim)""") >>> im.execute("""INSERT INTO adres_defteri VALUES ("Frat", "zgl")""")

Ayrca trnak kullanmanz sayesinde, uzun satrlar gerekti inde blerek ok daha okunakl g kodlar da yazabilece inizi biliyorsunuz. g

21.6 Veri sleme - commit() Metodu I


Bir nceki blmde bir Sqlite veritabanna nasl veri girece imizi rendik. Ama aslnda i g g s sadece veri girmeyle bitmiyor. Verileri veritabanna ileyebilmek iin bir adm daha atmamz s gerekiyor. Mesela su rne e bir bakalm: g
# -*- coding: utf-8 -*import sqlite3 vt = sqlite3.connect(":memory:") im = vt.cursor() im.execute("""CREATE TABLE personel (isim, soyisim, ehir, eposta)""") s im.execute("""INSERT INTO personel VALUES ("Orun", "Kunek", "Adana", "okunek@gmail.com")""")

Burada ncelikle RAM zerinde geici bir veritaban oluturduk. Zaten gerek bir uygulama s yazmad mz, henz test aamasnda oldu umuz iin en iyi yaklam geici bir veritaban g s g s oluturmak olacaktr. s Ardndan, vt.cursor() komutuyla imlecimizi de oluturduktan sonra, SQL komutlarmz s altryoruz. nce isim, soyisim, sehir ve eposta adl stunlardan oluan, personel adl s s bir tablo oluturduk. Daha sonra personel tablosunun iine Orun, Kunek, Adana ve s okunek@gmail.com de erlerini yerletirdik. g s Ancak her ne kadar veritabanna veri ilemi gibi grnsek de aslnda henz ilenmi bir sey s s s s yoktur. Biz henz sadece verileri girdik. Ama verileri veritabanna ilemedik. Bu girdi imiz s g verileri veritabanna ileyebilmek iin commit() adl bir metottan yararlanaca z: s g
>>> vt.commit()

Grd nz gibi, commit() imlecin de il, ba lant nesnesinin (yani burada vt de ikeninin) g g g gs bir metodudur. Simdi bu satr da beti imize ekleyelim: g
# -*- coding: utf-8 -*import sqlite3

vt = sqlite3.connect(":memory:") im = vt.cursor() im.execute("""CREATE TABLE personel (isim, soyisim, ehir, eposta)""") s im.execute("""INSERT INTO personel VALUES ("Orun", "Kunek", "Adana", "okunek@gmail.com")""") vt.commit()

Bu son satr da ekledikten sonra Sqlite veritaban iinde syle bir tablo oluturmu olduk: s s isim Orun soyisim Kunek sehir Adana eposta okunek@gmail.com

21.7 Veritabanndan Veri Almak


Yukarda, bir veritabanna nasl veri girece imizi ve ileyece imizi grdk. sin asl nemli g s g I ksm, bu verileri daha sonra veritabanndan geri alabilmektir. Simdi bu ilemi nasl ya s paca mza bakaca z. g g Veritabanndan herhangi bir veri alabilmek iin SELECT...FROM... adl bir SQL komutundan yararlanmamz gerekiyor. Dilerseniz nce bir tablo oluturalm: s
# -*- coding: utf-8 -*import sqlite3 vt = sqlite3.connect(":memory:") im = vt.cursor() im.execute("""CREATE TABLE faturalar (fatura, miktar, ilk_odeme_tarihi, son_odeme_tarihi)""")

Simdi bu tabloya baz veriler ekleyelim:


im.execute("""INSERT INTO faturalar VALUES ("Elektrik", 45, "23 Ocak 2010", "30 Ocak 2010")""")

Verileri veritabanna ileyelim: s


vt.commit()

Yukardaki kodlar bize syle bir tablo verdi: fatura Elektrik miktar 45 ilk_odeme_tarihi 23 Ocak 2010 son_odeme_tarihi 30 Ocak 2010

Buraya kadar olan ksm zaten biliyoruz. Bilmedi imiz ise bu veritabanndan nasl veri alag ca mz. Onu da syle yapyoruz: g
im.execute("""SELECT * FROM faturalar""")

Burada zel bir SQL komutu olan SELECT...FROM...dan faydalandk. Burada joker karakterlerden biri olan * iaretini kulland mza dikkat edin. SELECT * FROM faturalar ifadesi su s g anlama gelir: faturalar adl tablodaki btn eleri se! g Burada SELECT kelimesi SEMEK demektir. FROM ise ...DEN/...DAN anlam verir. Yani SELECT FROM faturalar dedi imizde faturalardan se demi oluyoruz... Burada kulg s land mz * iareti de her sey anlamna geldi i iin, SELECT * FROM faturalar ifadesi g s g faturalardan her seyi se gibi bir anlama gelmi oluyor. s Beti imizi yazmaya devam edelim: g
veriler = im.fetchall()

Burada da ilk defa grd mz bir metot var: fetchall(). Grd nz gibi, fetchall() g g imlecin bir metodudur. Yukarda grd mz SELECT...FROM... komutu bir tablodaki verig leri seiyordu. fetchall() metodu ise seilen btn verileri alma ilevi grr. Yukarda biz s fetchall() metoduyla ald mz btn verileri veriler adl bir de ikene atadk. g gs Artk bu verileri rahatlkla yazdrabiliriz:
print veriler

Dilerseniz beti imizi topluca grelim: g


# -*- coding: utf-8 -*import sqlite3 vt = sqlite3.connect(":memory:") im = vt.cursor() im.execute("""CREATE TABLE faturalar (fatura, miktar, ilk_odeme_tarihi, son_odeme_tarihi)""") im.execute("""INSERT INTO faturalar VALUES ("Elektrik", 45, "23 Ocak 2010", "30 Ocak 2010")""") vt.commit() im.execute("""SELECT * FROM faturalar""") veriler = im.fetchall() print veriler

Bu beti i altrd mzda syle bir kt alrz: g s g


[(uElektrik, 45, u23 Ocak 2010, u30 Ocak 2010)]

Grd nz gibi, veriler bir liste iinde demet halinde yer alyor. Ama tabii siz bu verileri g istedi iz gibi biimlendirecek kadar Python bilgisine sahipsiniz. g Bu arada, tablo olutururken stun adlarnda boluk (ve Trke karakter) kullanmak iyi bir kir s s de ildir. Mesela ilk deme tarihi yerine ilk_odeme_tarihi ifadesini tercih edin. E er keg g limeler arasnda mutlaka boluk brakmak isterseniz btn kelimeleri trnak iine aln. Mesela: s "ilk odeme tarihi" veya "ilk deme tarihi".

21.8 Veritaban Gvenligi - SQL Injection


Pythonda veritabanlar ve Sqlite konusunda daha fazla ilerlemeden nce ok nemli bir konudan bahsetmemiz gerekiyor. Tahmin edebilece iniz gibi, veritaban denen sey olduka g hassas bir konudur. Bilgiyi bir araya toplayan bu sistem, ierdeki bilgilerin de erine ve neg mine de ba l olarak nc sahslarn a zn sulandrabilir. Ancak depolad nz verilerin ne g g g kadar de erli ve nemli oldu undan ba msz olarak veritaban gvenli ini sa lamak, siz prog g g g g gramclarn asli grevidir. Peki veritaban ynetim sistemleri acaba hangi tehditlerle kar karya? s s SQL komutlarn ileten btn veritabanlar iin gnmzdeki en byk tehditlerden birisi hi s kukusuz kt niyetli kiilerin SQLe szma (SQL injection) giriimleridir. s s s Simdi syle bir sey dnn: Diyelim ki siz bir alveri karl birine 100.000 TLlik bir ek s s s s g verdiniz. Ancak eki verdi iniz kii bu ek zerindeki miktar tahrif ederek artrd ve banka da g s tahrif edilerek artrlan bu miktar eki getiren kiiye (hamiline) dedi. Byle bir durumda epey s banz a ryacaktr. s g ste byle tatsz bir durumla karlamamak iin, ek veren kii ekin zerindeki miktar hem I s s s rakamla hem de yazyla belirtmeye zen gsterir. Ayrca rakam ve yazlara ekleme yaplmasn da engellemek iin rakam ve yazlarn sa na soluna # gibi iaretler de koyar. Bylece eki g s alan kiinin, kendisine izin verilenden daha fazla bir miktar elde etmesini engellemeye alr. s s Yukardakine benzer bir sey veritaban uygulamalarnda da karmza kabilir. Simdi su rne e s g bakalm:
# -*- coding: utf-8 -*import sqlite3 #Deneme amal bir alma yaptmz iin veritabanmz s g #bellek zerinde oluturuyoruz. s db = sqlite3.connect(":memory:") #Veritaban zerinde istediimiz ilemleri yapabilmek g s #iin bir imle oluturmamz gerekiyor. s im = db.cursor() #imlecin execute() metodunu kullanarak, veritaban iinde #"kullanicilar" adl bir tablo oluturuyoruz. Bu tabloda s #kullanc_adi ve parola olmak zere iki farkl stun var. im.execute("""CREATE TABLE kullanicilar (kullanici_adi, parola)""") #Yukarda oluturduumuz tabloya yerletireceimiz verileri s g s g #hazrlyoruz. Verilerin liste iinde birer demet olarak #nasl gsterildiine zellikle dikkat ediyoruz. g veriler = [ ("ahmet123", "12345678"), ("mehmet321", "87654321"), ("selin456", "123123123") ] #veriler adl liste iindeki btn verileri kullanicilar adl #tabloya yerletiriyoruz. Burada tek eli bir demet s g #tanmladmza dikkat edin (i,) g for i in veriler: im.execute("""INSERT INTO kullanicilar VALUES %s""" %(i,))

#Yaptmz deiikliklerin tabloya ilenebilmesi iin g g s s #commit() metodunu kullanyoruz. db.commit() #Kullancdan kullanc ad ve parola bilgilerini alyoruz... kull = raw_input("Kullanc adnz: ") paro = raw_input("Parolanz: ") #Burada yine bir SQL komutu iletiyoruz. Bu komut, kullanicilar s #adl tabloda yer alan kullanici_adi ve parola adl stunlardaki #bilgileri seiyor. im.execute("""SELECT * FROM kullanicilar WHERE kullanici_adi = %s AND parola = %s"""%(kull, paro)) #Hatrlarsanz daha nce fetchall() adl bir metottan s #sz etmitik. Ite bu fetchone() metodu da ona benzer. s #fetchall() btn verileri alyordu, fetchone() ise #verileri tek tek alr. data = im.fetchone() #Eer data adl deiken False deilse, yani bu g g s g #deikenin iinde bir deer varsa kullanc ad g s g #ve parola doru demektir. Kullancy ieri alyoruz. g if data: print u"Programa hogeldin %s!" % data[0] s #Aksi halde kullancya olumsuz bir mesaj veriyoruz. else: print u"Parola veya kullanc ad yanl!" s

Bu rnekte henz bilmedi imiz baz ksmlar var. Ama siz simdilik bunlar kafanza takmayn. g Nasl olsa bu kodlarda grnen her seyi biraz sonra tek tek renece iz. Siz simdilik sadece g g iin zne odaklann. s Yukardaki kodlar altrd nzda, e er kullanc ad ve parolay do ru girerseniz Programa s g g g hogeldin ktsn greceksiniz. E er kullanc adnz veya parolanz yanlsa bununla ilgili bir s g s uyar alacaksnz. Her sey iyi ho, ama bu kodlarda ok ciddi bir problem var. s Dedi imiz gibi, bu kodlar alrken e er kullanc, veritabannda varolan bir kullanc ad ve g s g parola yazarsa sisteme kabul edilecektir. E er do ru kullanc ad ve parola girilmezse sistem g g kullancya giri izni vermeyecektir. Ama acaba gerekten yle mi? s Simdi yukardaki program tekrar altrn. Kullanc ad ve parola soruldu unda da her ikisi s g iin sunu yazn:
x OR 1 = 1

O da ne! Program sizi ieri ald... Hem de kullanc ad ve parola do ru olmad halde... Hatta g g su kodu sadece kullanc ad ksmna girip parola ksmn bo brakmanz da sisteme giri hakk s s elde etmenize yetecektir.:
x OR 1 = 1 --

ste yukarda gsterdi imiz bu ileme SQLe szma (SQL injection) ad verilir. Kullanc, tpk I g s en bata verdi imiz tahrif edilmi ek rne inde oldu u gibi, sistemin zaaarndan yararlas g s g g narak, elde etmeye hakk olandan daha fazlasna eriim hakk elde ediyor. s

Burada en basit sekliyle bool ilelerinden biri olan ordan yararlanyoruz. orun nasl iledi ini s s g gayet iyi biliyorsunuz, ama ben yine de birka rnekle orun ne oldu unu ve ne yapt n size g g hatrlataym. Su rneklere bakn:
>>> a = 21 >>> a == 22 False >>> b = 13 >>> b == 13 True >>> if a == 22 and b == 13: ... print "Merhaba!" ... >>> if a == 22 or b == 13: ... print "Merhaba!" ... Merhaba!

rneklerden de grd nz gibi, and ilecinin True sonucunu verebilmesi iin her iki nerg s menin de do ru olmas gerekir. O yzden a == 22 and b == 13 gibi bir ifade False de eri g g veriyor. Ancak or ilecinin True sonucu verebilmesi iin iki nermeden sadece birinin do ru s g olmas yeterlidir. Bu yzden, sadece b == 13 ksm True oldu u halde a == 22 or b == 13 g ifadesi True sonucu veriyor... ste biz de yukardaki SQLe szma giriiminde orun bu zelli inI s g den faydalanyoruz. Dilerseniz neler olup bitti ini daha iyi anlayabilmek iin, szdrlan kodu do rudan ilgili satra g g uygulayalm:
im.execute("""SELECT * FROM kullanicilar WHERE kullanici_adi = x OR 1 = 1 AND parola = x OR 1 = 1""")

Sanrm bu sekilde neler olup bitti i daha net grlyor. Durumu biraz daha netletirmek iin g s Pythonu yardma a rabiliriz: g
>>> kullanici_adi = ahmet123 >>> parola = 12345678 >>> kullanici_adi == x False >>> 1 == 1 True >>> kullanici_adi == x or 1 == 1 True >>> parola == x

False >>> (kullanici_adi == x or 1 == 1) and (parola == x or 1 == 1) True

1 == 1 ifadesi her zaman True de eri verecektir. Dolaysyla kullanc adnn ve parolann g do ru olup olmamas hibir nem tamaz. Yani her zaman True de erini verece i kesin olan g s g g ifadeler yardmyla yukardaki gibi bir szma giriiminde bulunabilirsiniz. s Yukarda yapt mz sey, %s ile gsterilen yerlere kt niyetli bir SQL komutu szdrmaktan g ibarettir. Burada zaten balang ve biti trnaklar oldu u iin szdrlan kodda balang ve s s g s biti trnaklarn yazmyoruz. O yzden szdrlan kod syle grnyor: s
x OR 1 = 1

Grd nz gibi, xin bandaki ve 1in sonundaki trnak iaretleri koymuyoruz. g s s Peki yukarda verdi imiz su kod nasl alyor: g s
x OR 1 = 1 --

Pythonda yazd mz kodlara yorum eklemek iin # iaretinden yararland mz biliyorg s g sunuz. ste SQL kodlarna yorum eklemek iin de iaretlerinden yararlanlr. Simdi dilerseniz I s yukardaki kodu do rudan ilgili satra uygulayalm ve ne oldu unu grelim: g g
im.execute("""SELECT * FROM kullanicilar WHERE kullanici_adi = x OR 1=1 --AND parola = %s""")

Burada yazd mz iareti AND parola = %s ksmnn sistem tarafndan yorum olarak g s alglanmasn sa lyor. Bu yzden kodlarn bu ksm iletilmiyor. Dolaysyla da sisteme giri g s s yapabilmek iin sadece kullanc adn girmemiz yeterli oluyor!.. Burada ayrca kodlarmzn almas iin 1in sonuna bir adet trnak yerletirerek kodu kapatt mza dikkat edin. nk s s g normal biti trna yorum tarafnda kald... s g Dikkat ederseniz SQLe szd mzda ahmet123 adl kullancnn hesabn ele geirmi olduk. g s Peki neden tekiler de il de ahmet123? Bunun sebebi, ahmet123 hesabnn tablonun en g banda yer almas. E er tablonun banda admin diye bir hesap olmu olsayd, veritabanna s g s s azami dzeyde zarar verme imkanna kavuacaktnz... s Peki SQLe szma giriimlerini nasl nleyece iz? Bu giriime kar alabilece iniz balca nlem s g s s g s %s iaretlerini kullanmaktan kanmak olacaktr. Bu iaret yerine ? iaretini kullanacaks s s snz. Yani yukardaki program syle yazaca z: g
# -*- coding: utf-8 -*import sqlite3 db = sqlite3.connect(":memory:") im = db.cursor() im.execute("""CREATE TABLE kullanicilar (kullanici_adi, parola)""") veriler = [ ("ahmet123", "12345678"), ("mehmet321", "87654321"), ("selin456", "123123123") ]

for i in veriler: im.execute("""INSERT INTO kullanicilar VALUES (?, ?)""", i) db.commit() kull = raw_input("Kullanc adnz: ") paro = raw_input("Parolanz: ") im.execute("""SELECT * FROM kullanicilar WHERE kullanici_adi = ? AND parola = ?""", (kull, paro)) data = im.fetchone() if data: print u"Programa hogeldin %s!" % data[0] s else: print u"Parola veya kullanc ad yanl!" s

Dedi imiz gibi, SQLe szma giriimlerine kar alabilece iniz balca nlem %s iaretleri yerg s s g s s ine ? iaretini kullanmak olmaldr. Bunun dnda, SQL komutlarn iletmeden nce baz s s s szgeler uygulamak da gvenlik asndan iinize yarayabilir. rne in kullancdan alnacak s g verileri alfanmerik karakterlerle [http://www.istihza.com/blog/alfanumerik-ne-demek.html/] snrlayabilirsiniz:
if kull.isalnum() and paro.isalnum(): im.execute("""SELECT * FROM kullanicilar WHERE kullanici_adi = %s AND parola = %s"""%(kull, paro))

Bylece kullancnn baz tehlikeli karakterleri girmesini engelleyebilir, onlar sadece harf ve say girmeye zorlayabilirsiniz. Her halkarda unutmamamz gereken sey, gvenli in ok boyutlu bir kavram oldu udur. g g Birka nlemle pek ok gvenlik a n engelleyebilirsiniz, ancak btn gvenlik aklarn g bir rpda yamamak pek mmkn de ildir. Bir programc olarak sizin greviniz, yazd nz g g programlar gvenlik aklarna kar srekli taramak ve herhangi bir ak ortaya kt nda da s g bunu derhal kapatmaya almaktr. MODL DZN s I I I

BLM

22

sys Modl

Pythondaki en nemli modllerden biri os ise, br de sys adl modldr. Bu modller o kadar nemlidir ki, Pythondaki hi bir modl bilmeseniz de bu iki modl bilmeniz gerekir. os modln, Modller konusunu ilerken anlatmtk. Simdi de sys modln inceleyece iz. s s g sys modl, Python sistemine ilikin fonksiyonlar ve nitelikler barndrr. Bu modl kullanarak, s elinizdeki Python srmn ynetebilirsiniz. Bunun tam olarak ne demek oldu unu biraz sonra g gayet net bir sekilde anlayacaksnz. Modller konusunu anlatrken, modllerin aslnda .py uzantl birer Python program oldu unu sylemitik. Mesela daha nce inceledi imiz os modl, bilgisayarmzda bulug s g nan os.py adl bir dosyayd. Pythondaki hemen hemen btn modller byledir. Yani hemen hemen btn Python modlleri birer .py dosyas olarak sistemimizde bulunur. Ancak bu durumun baz istisnalar da vardr. rne in sys modl bu istisnalardan biridir. Bu g modl, teki pek ok modln aksine Python programlama dili ile de il C programlama dili ile g yazlmtr. Dolaysyla bu modln Python kodlar yoktur. Bu modln C kodlarn grmek iin s http://svn.python.org/projects/python/branches/release26-maint/Python/sysmodule.c adresini ziyaret edebilirsiniz.

22.1 sys Modlnn erigi I


Her zaman oldu u gibi, sys modlnn iinde ne oldu unu grmek iin dir() fonksiyonundan g g yararlanabilirsiniz:
>>> dir(sys) [__displayhook__, __doc__, __egginsert, __excepthook__, __name__, __package__, __plen, __stderr__, __stdin__, __stdout__, _clear_type_cache, _current_frames, _getframe, api_version, argv, builtin_module_names, byteorder, call_tracing, callstats, copyright, displayhook, dont_write_bytecode, exc_clear, exc_info, exc_type, excepthook, exec_prefix, executable, exit, flags, float_info, getcheckinterval, getdefaultencoding, getdlopenflags, getfilesystemencoding, getprofile, getrecursionlimit, getrefcount, getsizeof, gettrace, hexversion, maxint, maxsize, maxunicode, meta_path, modules, path, path_hooks, path_importer_cache, platform,

362

prefix, ps1, ps2, py3kwarning, pydebug, setcheckinterval, setdlopenflags, setprofile, setrecursionlimit, settrace, stderr, stdin, stdout, subversion, version, version_info, warnoptions]

Grd nz gibi sys modl iinde epey fonksiyon ve nitelik var. Biz bu fonksiyon ve nitelikg ler arasndan en nemlilerini incelemeye alaca z. Bu blmde su fonksiyon ve nitelikleri s g inceleyece iz: g 1. argv 2. exit 3. getdefaultencoding 4. path 5. platform 6. stdout 7. version_info O halde ilk niteli imizle balayalm... g s

22.2 argv Niteligi


Bu nitelik sys modlnn en bilinen ve en sk kullanlan niteli idir. Dolaysyla bu niteli i g g renirken bu niteli e zel nem ve ilgi gstermenizi neririm. g g Etrafta syle programlar ska grm olmalsnz: Komut satrnda programn ad ile birlikte s birtakm seenekler de belirtirsiniz ve ilgili program o belirtti iniz seeneklere gre program g iletir. Mesela elimizde muzikcalar adl bir program oldu unu varsayalm. Amac mzik s g almak olan program mesela syle kullanlyor olabilir:
muzikcalar sarki_adi.mp3

Bu komutla sarki_adi.mp3 adl sarky alabiliriz... Byle bir program Pythonda yazmak iin argv niteli inden yararlanabiliriz. Simdi su kodlara bakn: g
#!/usr/bin/env python # -*- coding: utf-8 -*import sys import os def sarkiyi_cal(): if os.name == "nt": os.startfile(sys.argv[1]) elif os.name == "posix": os.system("xdg-open %s" %sys.argv[1]) if len(sys.argv) < 2: print "alnacak ark adn belirtmediniz!" s elif len(sys.argv) > 2: print "Birden fazla dosya ad belirttiniz!"

else: sarkiyi_cal()

Gelin isterseniz bu kodlar aklamaya balamadan nce, argv niteli inin tam olarak nasl bir s g ie yarad n anlamak iin syle bir sey yazalm: s g
#!/usr/bin/env python # -*- coding: utf-8 -*import sys print sys.argv

Simdi bu program argv_testi.py adyla kaydedin ve program python argv_testi.py komu tuyla altrn. Bu program altrd nzda syle bir kt alacaksnz: s s g
istihza@istihza:~/Desktop$ python argv_testi.py [argv_testi.py]

Grd nz gibi sys modlnn argv niteli i aslnda basit bir listeden ibarettir. Bu listenin ilk g g esi de yazd mz programn addr (argv_testi.py). argv niteli i bir liste oldu u iin listelerle g g g g yapabildi iniz her seyi bu nitelikle de yapabilirsiniz. g Simdi ayn program su sekilde altrn: s
istihza@istihza:~/Desktop$ python argv_testi.py falanca filanca

Bu defa syle bir kt alaca z: g


[argv_testi.py, falanca, filanca]

Grd nz gibi, yazd nz programa ekledi iniz her seenek argv listesine srayla ekleniyor. g g g argv listesinin ilk esi her zaman programnzn addr. Dolaysyla e er argv listesinin uzung g lu u 2den azsa, programnz herhangi bir seenek belirtilmeden, sadece ismi belirtilerek g altrlm demektir. Bu bilgiyi kullanarak syle bir program yazabilirsiniz: s s
#!/usr/bin/env python # -*- coding: utf-8 -*import sys if len(sys.argv) < 2: print "Herhangi bir seenek belirtmediniz!" elif len(sys.argv) >= 2: print "Program u seeneklerle birlikte altrdnz: " s s for i in sys.argv[1:]: print i

Dedi imiz gibi, e er argv niteli inin gsterdi i listenin uzunlu u 2den azsa kullanc hi bir g g g g g seenek belirtmemi demektir (if len(sys.argv) < 2:). s Ama e er argv niteli in gsterdi i listenin uzunlu u 2 veya daha fazla ise kullancmz prog g g g gram altrrken baz seenekler belirtmi demektir (elif len(sys.argv) >= 2:). Bu s s seenekleri argv listesinin ilk esi dndaki btn elerini ekrana yazdrarak grebilirsiniz: g s g

for i in sys.argv[1:]: print i

eyi ekrana yazdrmaya gerek yok. nk bildi iniz gibi, ilk e her zaman programmzn Ilk g g g adn gsteriyor... Btn bu aklamalardan sonra, ilk bata yazd mz program anlamak ok daha kolay bir hal s g alm olmal. Programmz tekrar grelim: s
#!/usr/bin/env python # -*- coding: utf-8 -*import sys import os def sarkiyi_cal(): if os.name == "nt": os.startfile(sys.argv[1]) elif os.name == "posix": os.system("xdg-open %s" %sys.argv[1]) if len(sys.argv) < 2: print "alnacak ark adn belirtmediniz!" s elif len(sys.argv) > 2: print "Birden fazla dosya ad belirttiniz!" else: sarkiyi_cal()

Burada ncelikle sys ve os modllerini ie aktaryoruz. nk programmz iinde bu iki modle ait nitelik ve fonksiyonlardan yararlanaca z. g Ardndan sarkiyi_cal() adl bir fonksiyon yazdk. E er kullanlan iletim sistemi Windows ise g s argv listesinin birinci esini, yani kullancnn program adndan sonra yazd ilk seene i, g g g os modlnn startle() fonksiyonunu kullanarak altryoruz. E er kullanlan iletim sistemi s g s GNU/Linux ise, os modlnn system() fonksiyonunu kullanarak yine argv listesinin ilk esini g altryoruz. s Elbette kullancnn program adndan sonra hi bir seenek belirtmeme veya 2den fazla seenek belirtme ihtimali de var. ste bu ihtimallere kar su kodlar yazyoruz: I s
if len(sys.argv) < 2: print "alnacak ark adn belirtmediniz!" s elif len(sys.argv) > 2: print "Birden fazla dosya ad belirttiniz!"

E er kullancmz program adnn yanna sadece 1 adet seenek eklerse, o zaman sarkiyi_cal() g adl fonksiyonu devreye sokuyoruz. Peki size bir soru: Bu haliyle programmz mzik dosyas veya baka bir tr dosya diye bir ayrmda bulunmakszn btn dosyalar, sistemde o trdeki s dosyay aan ntanml uygulamayla altracaktr. Acaba biz bu programda kullancnn girdi i s g dosya adlarnn mzik dosyas olup olmad n nasl denetler ve programmz sadece mzik g dosyalarn altracak hale getirebiliriz? s argv niteli i baka pek ok faydal i iin kullanlabilecek harika bir aratr. Mesela su programa g s s bir bakn:

#!/usr/bin/env python # -*- coding: utf-8 -*import sys surum = "0.2" yardim = """ "FALANCA programnn %s srmn kullanyorsunuz. Bu program kullanabilmek iin sisteminizde Python dnda filanca adl modln de kurulu olmas gerekiyor. s Program komut satrndan python falanca.py komutuyla altrabilirsiniz. yi elenceler!""" % surum s I g if len(sys.argv) < 2: print "..." elif sys.argv[1] == "-v": print surum elif sys.argv[1] == "-h": print yardim else: print "Byle bir seenek yok!"

Grd nz gibi bu programda kullanclarmza programn srmn ve yardm dosyasn g grntleme imkan veriyoruz. E er kullancmz su komutu verirse kulland programn g g srmn renebilir: g
python falanca.py -v

Ya da e er su komutu verirse programn yardm dosyasna ulaabilir: g s


python falanca.py -h

E er kullanc -v ve -h dnda baka bir sey yazarsa programmz kendisini byle bir g s s seenek olmad konusunda uyaracaktr. g

22.3 exit() Fonksiyonu


sys modlnn iindeki fonksiyonlardan biri de exit() fonksiyonudur. Aslnda siz bu fonksiyonu daha nce de grmtnz. Hatrlarsanz ilk derslerimizin birinde bu fonksiyonun Pythonun s etkileimli kabu undan kmak iin kullanld n sylemitik. Mesela yukarda yazd mz pros g g s g gramda bu fonksiyonu kullanmak istersek syle bir sey yazabiliriz:
#!/usr/bin/env python # -*- coding: utf-8 -*import sys surum = "0.2" yardim = """ "FALANCA programnn %s srmn kullanyorsunuz. Bu program kullanabilmek iin sisteminizde Python

dnda filanca adl modln de kurulu olmas gerekiyor. s Program komut satrndan python falanca.py komutuyla altrabilirsiniz. yi elenceler!""" % surum s I g if len(sys.argv) < 2: sys.exit() elif sys.argv[1] == "-v": print surum elif sys.argv[1] == "-h": print yardim else: print "Byle bir seenek yok!"

Bylece e er argv listesinin uzunlu u 2den azsa programmz kapanacaktr. g g Bu fonksiyonun ok fazla bir zelli i yoktur. Grd nz gibi exit() fonksiyonunu programdan g g kmak iin kullanyoruz.

22.4 getdefaultencoding() Fonksiyonu


Bildi iniz gibi, yazd mz bir programda Trke karakterler kullanabilmemiz iin programmzn g g en bana suna benzer bir satr eklememiz gerekiyor: s
# -*- coding: utf-8 -*-

Bylece Pythona, program iinde kullanaca mz kodlama biiminin utf-8 olaca n bildirmi g g s oluyoruz. E er bu satr yazmazsak Python otomatik olarak ascii adl bir kodlama biimini g kullanacaktr. Not: utf-8, ascii ve unicode konularnda ayrntl bilgi edinmek iin ascii, unicode ve Python balkl konuyu inceleyebilirsiniz. s Pythonun ntanml kodlama biiminin ne oldu unu renmek iin getdefaultencoding() adl g g fonksiyondan yararlanabilirsiniz:
>>> sys.getdefaultencoding() ascii

Grd nz gibi Python ntanml olarak ascii adl kodlama biimini kullanyor. Pythonda g yaad mz pek ok Trke karakter probleminin nedeni budur. s g Not: Pythonun 3.x srmlerinde ntanml kodlama biimi utf-8 olarak de itirildi. Bu gs yzden Pythonun 3.x srmlerinde Trke karakter problemleri ok daha az olacaktr.

22.5 path Niteligi


Modller konusu iinde os modln anlatrken sys modlnn path adl niteli inden sz etg mitik. Orada da syledi imiz gibi, Python ie aktarmaya alt mz bir modl ararken path s g s g

niteli inin gsterdi i dizinlerin iine bakar. g g Bu niteli i syle kullanyoruz: g


>>> import sys >>> sys.path

Bu komutun ktsnn, komutu verdi iniz iletim sistemine gre farkllk gsterece ini biliyorg s g sunuz. Tpk argv niteli i gibi, path niteli i de bir listedir. Dolaysyla listeler zerinde yapt nz her g g g seyi path niteli i zerinde de yapabilirsiniz. Mesela listelerin insert() veya append() metotlarn g kullanarak path listesine yeni eler ekleyebilirsiniz: g
>>> sys.path.append("/herhangi/bir/dizin")

Bu komut, ekledi iniz dizini listenin en sonuna ilitirecektir. E er dizininizi listenin en bana g s g s eklemek isterseniz su komutu kullanabilirsiniz:
>>> sys.path.insert(0, "/herhangi/bir/dizin")

Python ie aktaraca nz bir modl path listesinde ararken listenin bandan sonuna do ru g s g ilerler ve modl buldu u anda arama ilemini durdurur. Dolaysyla, mesela bir modl iki g s farkl dizin iinde yer alyorsa, Python listede soldan sa a do ru buldu u ilk modl dikkate g g g alacaktr. O yzden yazd nz programlarda bazen bir dizini bu listenin en bana eklemeniz g s gerekebilir.

22.6 platform Niteligi


Hatrlarsanz kullanlan iletim sistemini tespit etmek iin os modlnn name adl niteli ini s g kullanyorduk. Aynen buna benzer bir sekilde, kullanlan iletim sistemini tespit etmek iin sys s modlnn platform adl niteli inden de yararlanabiliriz: g
>>> sys.platform linux2

Ben bu komutu GNU/Linux zerinde verdi im iin ald m kt linux2 oldu. E er ayn komutu g g g Windows zerinde verirseniz syle bir kt alrsnz:
>>> sys.platform win32

Bu komut Mac Os Xte ise syle bir kt verir:


>>> sys.platform darwin

Bu nitelik ile ilgili syle bir uyar yapalm: Windows mimariniz 32 bit de olsa 64 bit de olsa bu nitelik her zaman win32 kts verecektir. Dolaysyla bu niteli i kullanarak 32/64 bit ayrm g yapamazsnz. Kullanlan iletim sisteminin 32 bit mi yoksa 64 bit mi oldu unu tespit edebilmek s g iin platform adl baka bir modlden yararlanabilirsiniz: s

>>> import platform >>> platform.architecture() (32bit, ELF)

Ben bu komutu 32 bitlik bir GNU/Linux iletim sisteminde verdi im iin kt yukardaki gibi s g oldu. E er sistemim 64 bit olsayd syle bir kt alacaktm: g
>>> platform.architecture() (64bit, ELF)

Bu komut 32 bitlik Windows iletim sistemlerin su kty verir: s


>>> platform.architecture() (32bit, WindowsPE)

64 bitlik Windows iletim sisteminde ise su kty alacaksnz: s


>>> platform.architecture() (64bit, WindowsPE)

Grd nz gibi bu ktlar birer demettir. Dolaysyla demetlere nasl davranyorsanz bu g ktlara da yle davranabilirsiniz.

22.7 stdout Niteligi


Bildi iniz gibi Pythonda ekrana herhangi bir sey yazdrabilmek iin print deyiminden yararg lanyoruz:
>>> print "merhaba!" merhaba!

Python print deyimlerinden sonra otomatik olarak yeni satra geer. Yani:
>>> for i in range(10): ... print "%s. satr" %(int(i)+1) ... 1. satr 2. satr 3. satr 4. satr 5. satr 6. satr 7. satr 8. satr 9. satr 10. satr

Grd nz gibi, her satrdan sonra bir alt satra geiliyor. print deyiminin bir sonraki satra g gemesini engellemek iin virglden yararlanabiliriz:

>>> for i in range(10): ... print i, ... 0 1 2 3 4 5 6 7 8 9

Burada ktya dikkat edin. Saylar alt alta de il, yan yana diziliyor. Bunu sa layan sey print g g i satrndan sonra getirdi imiz bir adet virgl iaretidir... Ancak burada her saynn arasnda g s birer adet de boluk karakteri var. s Istedi iniz sey bu olabilir. Ama olmaya da bilir... E er g g hem eleri yan yana dizmek hem de eler arasnda boluk brakmamak istiyorsanz sys g g s modlnn stdout niteli ini kullanabilirsiniz. Daha do rusu bu i iin sys modlnn stdout g g s niteli inin write() adl metodunu kullanaca z. Hemen bir rnek verelim: g g
>>> sys.stdout.write("Merhaba!") Merhaba!>>>

Grd nz gibi, sys.stdout.write() print niteli iyle ayn ii gryor. Tek farklar, print g g s niteli inin iini bitirdikten sonra yeni satra geerken sys.stdout.write() metodunun bunu g s yapmamas. Bu durumu daha net bir sekilde grebilmek iin syle bir rnek verebiliriz:
>>> for i in range(10): ... sys.stdout.write(str(i)) ... 0123456789>>>

Grd nz gibi, sys.stdout.write() metodu btn saylar yan yana dizdi ve satr sog nunda da yeni satra gemedi. Bu kodlarda dikkat etmemiz gereken bir baka sey de s sys.stdout.write() metoduna verdi imiz argmann bir karakter dizisi olmas zorunlug lu udur. sys.stdout.write() metodu saylar ekrana basamaz: g
>>> for i in range(10): ... sys.stdout.write(i) Traceback (most recent call last): File "<stdin>", line 2, in <module> TypeError: argument 1 must be string or read-only character buffer, not int

Byle bir hata almamak iin, for dngs iinde i de ikenini str() fonksiyonunu kullanarak gs karakter dizisine dntryoruz. s sys.stdout.write() komutunu kullanabilece iniz faydal bir rnek syle olabilir: g
>>> import sys, time >>> for i in range(20): ... time.sleep(1) ... sys.stdout.write("%s\r" %i) ... sys.stdout.flush()

Bu kodlar altrd nzda 0dan 20ye kadar olan saylar birer saniye aralklarla tek bir satra s g yazdrlacaktr. Ayrca bu saylar yan yana de il, birbirlerinin yerine geerek ekrana baslacakg tr... Peki bu kodlar nasl alyor? Hemen aklayalm: s 1. satrda sys ve time adl iki modl ie aktardk. Bunlardan sys modln biliyoruz. time Ilk modln ise henz renmedik. Ama bu modl de zaman geldi inde inceleyece iz. Simdig g g lik biz bu time adl modln, Pythonda tarih ve zamanla ilgili ilemler yapmamz sa layan bir s g modl oldu unu bilelim yeter. g

2. Sonraki satrda bir for dngs kurduk. Bu dngde 0dan 20ye kadar olan saylar ekrana basaca z. g 3. for dngsnn ilk satrnda time.sleep(1) gibi bir kod gryoruz. Burada time modlnn sleep() adl fonksiyonunu kullandk. Bu fonksiyon, yaplan ilemlere belli srelerde zaman s aralklar koymamz sa lar. Biz burada bu sre aral n 1 saniye olarak belirledik. Bizim g g kodlarmzda 0dan 20ye kadar olan saylar 1er saniye aralklarla ekrana baslacak. 4. Sonraki satrda sys.stdout.write("%s\r" %i) komutunu gryoruz. Bu kod 0dan 20ye kadar olan saylarn alt alta de il, yan yana yazlmasn sa lyor. Burada bir de \r ifadesini g g gryoruz. Aslnda bu bir ka dizisidir. Grevi ise bir karakter dizisinin 0. konumuna s dnlmesini sa lamaktr. Bu ka dizisinin nasl alt n anlamak iin syle bir rnek vereg s s g biliriz:
>>> print "merhaba\ristihza" istihza

Burada olan sey su: merhaba karakter dizisinin hemen ardndan \r ka dizisinin etkisiyle s 0. konuma, yani karakter dizisinin en bana dnlyor ve istihza karakter dizisi merhaba s karakter dizisinin zerine yazlyor. istihza karakter dizisi ile merhaba karakter dizisi ayn sayda karakterden olutu u iin merhaba karakter dizisi siliniyor, onun yerine sadece istis g hza karakter dizisi ktda grnyor. Yukardaki sys.stdout.write("%s\r" %i) komutunda da \r ka dizisi saylar ekrana dkldke en baa dnlmesini, bylece bir sonraki saynn s s bir nceki sayy silmesini sa lyor. g 5. Son satrdaki sys.stdout.flush() ise saylarn ekranda hemen grnebilmesini sa lyor. g Dilerseniz bu satr kaldrp program yle altrmay deneyerek bu satrn tam olarak ne ie s s yarad n grebilirsiniz. (Baz iletim sistemlerinde bu satr gereksizdir. Ancak yazd nz g s g programn birden fazla iletim sisteminde dzgn almasn istiyorsanz bu satr eklemeniz s s gerekir.) Aslnda yukarda yazd mz kodlar syle de yazabilirdik: g
>>> import sys, time >>> for i in range(20): ... time.sleep(1) ... print "%s\r" %i, ... sys.stdout.flush()

Ancak sys.stdout niteli i size ayn ii daha do al bir sekilde yapma imkan verir. Ayrca g s g sys.stdoutun baka meziyetleri de vardr. s Normal sartlar altnda print deyimi yardmyla yazdrd mz seyler do rudan ekranda grnr. g g Yani:
>>> print "bir ey" s

Bu komutu verdi imizde bir sey kts hemen ekranda grnecektir. nk print komutu, g ktlar do rudan ekrana verir. Ama e er istersek biz print ktlarn ekran dnda baka g g s s yerlere de ynlendirebiliriz. Mesela su kodlara bir bakn:
>>> import sys >>> f = open("log.txt", "w") >>> sys.stdout = f

>>> print "Yeni bir mesajnz var!" >>> f.close()

Burada su ilemleri yaptk: s 1. ncelikle sys modln ie aktardk. Bunu neden yapt mz artk adnz gibi biliyorg sunuz... 2. Daha sonra, mevcut alma dizini iinde log.txt adl bir dosya oluturduk ve bu dosyay s s yazma kipinde (w) atk. 3. Sonraki satrda f adn verdi imiz dosyamz sys.stdout niteli ine atadk. stdout g g kelimesinin alm standard outputtur. Bu ifade standart kt konumu anlamna gelir. Dolaysyla sys.stdout niteli i Pythonda print komutunun nereye kt vereg ce ini belirler. Normal sartlar altnda, bildi iniz gibi, print komutu do rudan ekrana g g g kt verir. Yani Pythonun ntanml standart kt konumu bilgisayar ekrandr. ste I biz bu sys.stdout niteli inin gsterdi i de eri baka bir konuma atayarak standart kt g g g s konumunu de itirebiliriz. Biz yukardaki rnekte standart kt konumu olarak f adn gs verdi imiz dosyay gsterdik. g 4. Grd nz gibi, bir nceki admda yapt mz ilemlerden tr artk print komutu g g s ekrana kt vermiyor. Bu komutla yazdrd mz seyler do ruca log.txt dosyasna g g yazdrlyor. 5. Son olarak, dosyada yapt mz de iikliklerin etkili olabilmesi iin dosyamz kapatyoruz. g gs Simdi mevcut alma dizini altndaki log.txt adl dosyay an ve iinde ne yazd na bakn. s g Dosyay kapattktan sonra artk print komutunu kullanamayz. Dosyay kapattktan sonra print komutunu kullanmaya alrsak Python bize syle bir hata mesaj verecektir: s
>>> print "deneme" Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: I/O operation on closed file

Pythonda kapatt nz bir dosya zerinde yeni ilem yapamazsnz. Ya dosyay yeniden ag s manz, ya da gerekli btn ilemleri dosyay kapatmadan nce yapmanz gerekir... s Yalnz burada syle bir soru akla geliyor: Biz yukardaki komutlar yardmyla standart kt konumunu de itirdik. Dolaysyla artk print komutu, ktlarn ekrana de il dosyaya veriyor... gs g Peki biz print komutunu eski haline nasl dndrece iz? Bunun birka yolu vardr: g 1. Etkileimli kabu u kapatp yeniden aabilirsiniz. s g at nzda her sey eski haline dnecektir. g 2. Su komutu kullanabilirsiniz:
>>> sys.stdout = sys.__stdout__

Etkileimli kabu u kapatp yeniden s g

sys.__stdout__ ifadesi, Pythonun ntanml standart kt konumunu tutar. Dolaysyla sys.stdout niteli inin de erini sys.__stdout__ yapacak olursanz print komutu eski haline g g dnecektir. 3. Python gelitiricilerinin, bu tr ilemler iin tavsiye etti i yol ise sudur: s s g
>>> import sys >>> orijinal_konum = sys.stdout

>>> f = open("log.txt", "w") >>> sys.stdout = f >>> print "deneme mesaj" >>> f.close() >>> sys.stdout = orijinal_konum >>> print "deneme" deneme

Burada sys.stdoutun de erini de itirmeden nce, zgn kt konumunu orijinal_konum g gs adl bir de ikende saklyoruz. Daha sonra normal bir sekilde kt konumu ynlendirme ilemgs s lerini gerekletiriyoruz. simiz bitip dosyay kapattktan sonra da sys.stdout de erini eski s I g haline dndrebilmek iin bu niteli in de erini orijinal_konum olarak de itiriyoruz. Bylece g g gs print komutu eski ilevine yeniden kavumu oluyor. s s s

22.8 version_info Niteligi


sys modl konusunda inceleyece imiz son niteli in ad version_info. Olduka kolay bir g g niteliktir bu. Bu niteli in grevi kullanlan Python srm hakknda bilgi vermektir. Bunu syle g kullanyoruz:
>>> sys.version_info (2, 6, 5, final, 0)

Grd nz gibi, version_info niteli i kt olarak bir demet veriyor. Bu niteli i kullanarak, g g g yazd nz programlarda srm kontrol yapabilirsiniz. Mesela: g
>>> if not sys.version_info[:2] == (2, 6): ... print ("Bu program kullanabilmeniz iin " ... "Pythonun 2.6 srm kurulu olmal!")

Bylelikle sys modln tamamlam olduk. En bata da syledi imiz gibi, bu modl s s g Pythondaki en nemli modllerden biridir. Dolaysyla bu konu iinde anlatlanlar sk sk tekrar etmenizi neririm. Not: Bu yaz Sayn Krat rsel tarafndan hazrlanmtr. Pythondaki ileri dzey modllerden s s biri olan math modl matematikle u raanlarn ilerini bir hayli kolaylatracak metotlar ve g s s s fonksiyonlar barndrr.

BLM

23

math Modl

Pythonda matematiksel fonksiyonlar math modl ile kullanmaktayz. Simdi math mod lmzn ieri ine bakalm. Unutmadan modlmz almamza a ralm: g s g
>>> import math

Bu komut ile modlmz almamza dahil etmi olduk. Simdi ierdi i fonksiyonlar aa s s g s g daki komutu vererek grelim:
>>> dir(math) [__doc__, __name__, __package__, acos, acosh, asin, asinh, atan, atan2, atanh, ceil, copysign, cos, cosh, degrees, e, exp, fabs, factorial, floor, fmod, frexp, fsum, hypot, isinf, isnan, ldexp, log, log10, log1p, modf, pi, pow, radians, sin, sinh, sqrt, tan, tanh, trunc]

Modlmzn ieri ini de grd mze gre simdi kosins, sins, tanjant, pi, karekk, sl g g ifadeler gibi fonksiyonlarla ilgili rneklerle kullanmn anlamaya alalm. s

23.1 sl fadeler Fonksiyonu (pow) I


sl ifadeler matematikte hep karmza kmtr, Pythonda bunun iin pow fonksiyonu kuls s lanlmaktadr. pow power kelimesinin ksaltmas olup Trkede kuvvet, s anlamlarna denk gelmektedir. rnek verecek olursak 23 ifadesinin Pythondaki karl : s g
>>> math.pow(2, 3)

seklindedir. Yukardaki kodu yazd mzda Python bize cevap olarak sunu gsterir: g
8.0

pow ifadesinin kullanmnda parentez ierisindeki ilk say taban, ikinci say ise ss gstermektedir.

374

23.2 Pi Niteligi (pi)


pi says hepimizin okul yllarndan bildi i zere alan, hacim hesaplamalarnda bolca kullanlr g ve de eri genellikle 3 ya da 3,14 olarak alnr. Tabii ki esasen pi says bu kadar ksa de ildir. g g Hemen Pythona sorarak renelim bu pi saysnn de erinin ka oldu unu. Aa daki komutu g g g s g yazyoruz:
>>> math.pi

Dedi imizde Python bize aa daki kty gsterir: g s g


>>> 3.1415926535897931

Demek ki gerek pi says biraz daha uzunmu. Simdi kk bir hacim hesaplamas rne i ile s g konuyu pekitirelim. Krenin hacmini bulalm. Kre hacmi; s Kre hacmi= 4/3(.r3 ) forml ile bulunuyordu. Hemen kodlarmz yazmaya balayalm: s
>>> 4.0 / 3.0 * math.pi * math.pow(2, 3)

Bu kod ile sunu demi olduk: 4 ile 3 bl, pi says ile arp, sonra da sonucu 2nin 3nc s kuvveti ile arp. Python bize cevap olarak sunu gsterdi:
33.510321638291124

Tabii ki bu ilemleri kwrite programnda bir dosya aarak aa daki gibi de yazabiliriz: s s g
#/usr/bin/env python #-*- coding:utf-8 -*from __future__ import division import math r = input("Krenin yarapn giriniz:") hacim = 4 / 3 * math.pi * math.pow(r, 3)

Bylece krenin hacmini veren kk bir programmz oldu.

23.3 Karekk Fonksiyonu (sqrt)


Karekk ile ilgili fonksiyonumuz sqrt. Kullanm ise aa daki gibidir: s g
>>> math.sqrt(9)

Kodunu yazp entere bast mzda Python bize aa daki sonucu gsterir: g s g
3.0

23.4 Euler Sabiti (e)


Bu nitelik, matematikteki euler sabitini veriyor. Kullanm ise aa daki gibi: s g

>>> math.e

Yukardaki kodu yazp entere bast mzda karmza euler sabiti 2.7182818284590451 cevap g s olarak Python tarafndan gsteriliyor. Kullanm ve benzerlik asndan ayn pi says gibi:
2.7182818284590451

23.5 exp Fonksiyonu


exp fonksiyonunun kullanm su sekilde:
>>> math.exp(x)

Bu kodu kk bir rnekle aklamak daha kolay olacak. math.exp(2) kodunu yazd mzda Python aa daki cevab verir: g s g
7.3890560989306504

Bu say da nereden kt diyorsanz, exp fonksiyonu yukarda bahsetti imiz euler sabitinin g kuvvetini alan bir fonksiyon. exp(x) ifadesindeki x parametresi bizim kuvvetimizdir. Yani exp(2) dedi imizde esasen biz Pythona sunu demi oluyoruz: (2.7182818284590451) Yani g s euler sabitinin karesini alm olduk. s

23.6 Logaritma (log) Fonksiyonu


Logaritma fonksiyonumuzun kullanm su sekilde; log(x, y). Burada x says logaritmas al nacak say, y says ise taban saysn temsil etmektedir. Bir rnek ile pekitirelim: s
>>> math.log(2, 2)

Python bize aa daki cevab verir: s g


1.0

23.7 Logaritma (log10) Fonksiyonu


Bu fonksiyonun yukardakinden tek fark taban saysnn nceden belirlenmi ve 10 olmas. Bu s yzden fonksiyonun kullanm syle; log10(x) Burada x onluk tabana gre logaritmas alnacak saydr:
>>> math.log10(10)

Dnen cevap:
1.0

23.8 Degrees Fonksiyonu


Degrees fonksiyonu girilen ay radyandan dereceye evirmeye yarar. Kullanm su sekilde;

>>> math.degrees(x)

x burada dereceye evrilecek radyandr. rnek olarak 45 radyanlk bir a verelim ve derece karl n bulalm: s g
>>> math.degrees(45) 2578.3100780887044

23.9 Radians Fonksiyonu


Radians fonksiyonu girilen ay dereceden radyana evirmeye yarar. Kullanm su sekilde;
>>> math.radians(x)

x burada radyana evrilecek amzdr. rnek olarak 45 derecelik bir a verelim ve radyan karl n bulalm: s g
>>> math.radians(45) 0.78539816339744828

Kosins, Sins, Tanjant fonksiyonlarna girmeden nce belirtmem gereken nemli bir nokta bulunmaktadr. Bu fonksiyonlarda a olarak Python radyan kullanmaktadr. Bu yzden ald mz g sonular okulda rendi imiz de erlerden farkl olacaktr. Bunuda radians fonksiyonu ile dzelg g g tece iz. g

23.10 Kosins Fonksiyonu (cos)


Hemen kosins fonksiyonu ile bir rnek yapalm:
>>> math.cos(0)

Python bunun sonucu olarak bize:


1.0

cevabn verir.
>>> math.cos(45) 0.52532198881772973

Evet yukarda grd mz zere bizim bekledi imiz cevap bu de il. Biz 0.7071 gibi bir de er g g g g bekliyorduk. Bunu aa daki sekilde dzeltebiliriz: s g
>>> math.cos(math.radians(45)) 0.70710678118654757

Simdi istedi imiz cevab aldk. g

23.11 Sins Fonksiyonu (sin)


Hemen sins fonksiyonu ile bir rnek yapalm:
math.sin(0)

Python bunun sonucu olarak bize:


0.0

cevabn verir.
>>> math.sin(45) 0.85090352453411844

Evet yukarda grd mz zere bizim bekledi imiz cevap bu de il. Biz 0.7071 gibi bir de er g g g g bekliyorduk. Bunu aa daki sekilde dzeltebiliriz: s g
>>> math.sin(math.radians(45)) 0.70710678118654746

Simdi istedi imiz cevab aldk. g

23.12 Tanjant (tan) Fonksiyonu


Tanjant fonksiyonu ile bir rnek yapalm:
>>> math.tan(0)

Python bunun sonucu olarak bize:


0.0

cevabn verir.
>>> math.tan(45) 1.6197751905438615

Evet yukarda grd mz zere bizim bekledi imiz cevap bu de il. Biz ~1.000(yaklak) gibi g g g s bir de er bekliyorduk. Bunu aa daki sekilde dzeltebiliriz: g s g
>>> math.tan(math.radians(45)) 0.99999999999999989

Buda yaklak olarak 1.000 yapar. s Simdi istedi imiz cevab aldk. g Yukarda verdi imiz fonksiyonlardan bazlarn kullanarak basit bir zik sorusu zelim. g 3 newton ve 5 newton bykl nde olan ve aralarndaki a 60 derece olan iki kuvvetin g bilekesini bulalm. Formlmz aa daki gibidir. s s g

Bo bir kwrite belgesi aarak iine kodlarmz yazmaya balayalm: s s


#/usr/bin/env python #coding:utf-8 -*import math #math modln ardk. g a = 60 # Amz a deikenine atadk. g s f1 = 3 # Birinci kuvveti f1 deikenine atadk. g s f2 = 4 # ikinci kuvveti f2 deikenine atadk. g s #imdi formlmz yazalm: S R = math.sqrt(math.pow(f1, 2) + math.pow(f2, 2) + 2 * f1 * f2 * math.cos(math.radians(a))) #...ve ekrana kt verelim: print "Bileke kuvvet:", R s

Kodlarmz altrd mzda sonu: s g


6.0827625303

Tabii ki daha farkl uygulamalar da yaplabilir.

23.13 Faktoriyel (factorial)


Faktoriyel ilemi iin Python 2.6 srm ile math modl ierisinde bir fonksiyon oluturulmu. s s s Bundan nceki 2.5 srmnde byle bir fonksiyon yoktu. Kullanm ise su sekilde:
math.factorial(x)

x says burada bizim faktoriyelini alaca mz sayy temsil ediyor. g Bir rnek ile inceleyelim. Lise matematik derslerinde faktoriyel su sekilde hesaplanyordu. n!=nx(n-1)x(n-2)x(n-3)x......x1 Modlmz ie aktaralm:
>>> import math

Simdi;
>>> math.factorial(5)

dedi imizde Python bize g


120

sonucunu veriyor. Kendimiz hesaplayacak olursak:


5!=5x4x3x2x1=120

sonucuna ularz. Bu fonksiyon ile Python bizi uzun ilemlerden ve ekstra tanmlamalardan s s kurtaryor.

23.14 fmod Fonksiyonu


Bu fonksiyon matematikteki modler aritmetik hesaplamalar iin oluturulmu. s s ksaca mod ilemleri nasl yaplyor ona de inelim. s g nce Ilk

Ahmet bey ile Fatma hanm; saat 09 da, 7 saat sonra bulumak zere anlap ayrlyorlar. Saat s s 12 blmeli oldu u iin, Ahmet bey ile Fatma hanm bulutu unda saat 4 gsterir. Bunu g s g modler aritmetik ile syle buluruz:

Burada 12 says bizim modumuzdur. Yaplan toplama ilemi, tam saylardaki toplama iles s minden farkldr. Bu tip ilemler Modler Aritmetikin konusudur. s Python bu uzun ilemi bizim iin fmod fonksiyonu ile tanmlam, ileri kolaylatrm. Birka s s s s s rnek ile fmod fonksiyonun kullanmna bakalm:
>>> fmod(x, y)

seklinde bir kullanm var. Burada x modu alnacak sayy, y ise modu temsil eder:
>>> math.fmod(639, 5)

komutunu verdi imizde, Python bize; g


4.0

cevabn dndrr.
>>> math.fmod(99,3) 0.0

23.15 ceil Fonksiyonu


Ceil kelimesinin Trke karl tavan ekmek, tavan ina etmek anlamlarna gelir. Anlalas g s s ca zere biz yukarya yuvarlama ilemi anlamnda kullanaca z. Fonksiyon matematikte g s g kullanlan yuvarlama ilemi ile ilgili fonksiyonlardan biridir. Ceil fonksiyonu verilen ondalkl s saydan byk, en kk tam sayy dndrr. Kullanm syle;
>>> math.ceil(x.y)

Burada x.y ondalkl sayy temsil etmektedir. rne in 7.3 gibi. g


>>> math.ceil(19.3) 20.0

cevabn dndrr.

23.16 oor Fonksiyonu


Di er yuvarlama ilemi fonksiyonu oor. Floor kelimesi zemin, yer, taban anlamna geliyor. g s Bizim iin taban anlam daha manal. Bu fonksiyon ile ondalkl saylar en yakn tabana yuvarlama ilemi gerekletiriliyor. Hemen bir rnekle inceleyelim. s s
>>> math.floor(3.5)

dedi imizde Python bize aa daki sonucu verir. g s g


3.0

Byle Python 3.5 saysn en yakn taban olan 3.0 a yuvarlad.

23.17 fabs Fonksiyonu


Bu fonksiyon verilen saynn mutlak de erini verir. Kullanm ise aa daki gibidir: g s g
>>> math.fabs(-3) 3.0

Python bize sonu olarak 3.0 de erini verdi. Tabi burada ama matematik dersi anlatmak g de il. Bir rnek daha verelim: g
>>> math.fabs(9) 9.0

23.18 frexp Fonksiyonu


Bu fonksiyon verilen de erin mantisini ve karakteristi ini veriyor. Fonksiyonun kullanm su g g sekilde:
>>> math.frexp(x)

Bu durumda Python bize (m, k) gibi bir sonu gnderiyor. m mantis, k ise karakteristik. Bir rnek ile inceleyelim:
>>> math.frexp(7) (0.875, 3)

23.19 ldexp Fonksiyonu


Bu fonksiyon ksaca anlatmak gerekirse frexp fonksiyonunun tersi ya da ztt diyebiliriz. Yukarda math.frexp(7) komutunu kullanarak (0.875, 3) sonucunu elde ediyoruz. Simdi bu sonutan elde etti imiz rakamlar kullanarak 7 saysna ldexp fonksiyonunu kullanarak g ulaalm: s

>>> math.ldexp(0.875, 3) 7.0

Bu sekilde ldexp fonksiyonunu kullanarak de erimize yeniden ulaabiliyoruz. g s

23.20 modf Fonksiyonu


Bu fonksiyon verilen saynn ondalkl ksm ile tam ksmn paralayarak size geri dndryor. Kullanm modf(x) seklinde. x burada tam say ve ondalkl say olabilir. Hemen bir rnek ile aklayalm:
>>> math.modf(6.5) (0.5, 6.0)

23.21 trunc Fonksiyonu


Bu fonksiyon verilen de erleri tam say olarak krpyor. Krpyor herhalde uygun kelime diye g dnyorum ya da kesiyor diyebiliriz. Peki neyi kesiyor? Verilen ondalkl veya tam saylarn s sadece tam ksmlarn bize dndryor. Ondalk ksm kesiyor(krpyor). Yukar ya da aa s g yuvarlyor diyemiyoruz. Bu da ve + operatr kullanlm rnek ilemlerde ortaya kyor. s s Simdi rneklerle bakalm:
>>> math.trunc(15.4) 15 >>> math.trunc(-15.4) -15

Bu iki rnekten de anlalaca zere birincisinde aa ya, ikincisinde ( operatrden dolay) s g s g yukar yuvarlad olarak alglanabilir. Fakat bu fonksiyonun yapt ilem sadece ondalkl ksm g s kesmek. Bu fonksiyon Python 2.6 srm ile eklenmi. s

23.22 hypot Fonksiyonu


klit ba nts iin oluturulmu bir fonksiyondur. (Pisagor teoremi diye geer.) Geri iin klitg s s s Pisagor ksmna de inmeyelim, oras matematik uzmanlarnn ii. Fonksiyonun kullanm; g s
>>> math.hypot(x, y)

seklindedir. klit ba nts a2 = b2 + c2 seklindedir. Hani bir zamanlar lise matematik ve zik g derslerinde genlerin kenar uzunluklarn, vektrlerin birim uzunluklarn bulmak iin oka kullad mz bir ba nt. Hatta ezberlerdik 3-4-5 geni, 5-12-13 geni gibi. Neyse bu kadar g g an yeter. ste hypot fonksiyonu iimizi kolaylatrarak bu ba ntnn sonucunu bize dndryor. I s s g Verilen de erlerin karesini al, topla, karekkn bul gibi skntlardan kurtaryor. Hemen yukarg daki genlerde deneyerek rnekleyelim:

>>> math.hypot(3, 4) 5.0

ya da:
>>> math.hypot(5, 12) 13.0

23.23 Hiperbolik Fonksiyonlar


23.23.1 cosh Fonksiyonu
Hiperbolik kosins fonksiyonunu dndrr. Kullanm:
>>> math.cosh(x)

seklindedir. Burada x girilen de erdir. Bir rnek ile inceleyelim: g


>>> math.cosh(0) 1.0

23.23.2 sinh Fonksiyonu


Hiperbolik sins fonksiyonunu dndrr. Kullanm:
>>> math.sinh(x)

seklindedir. Burada x girilen de erdir. Bir rnek ile inceleyelim: g


>>> math.sinh(0) 0.0

23.23.3 tanh Fonksiyonu


Hiperbolik tanjant fonksiyonunu dndrr. Kullanm:
>>> math.tanh(x)

seklindedir. Burada x girilen de erdir. Bir rnek ile inceleyelim: g


>>> math.tanh(90) 1.0

23.23.4 acosh Fonksiyonu


Hiperbolik kosins fonksiyonunun tersini dndrr. Kullanm:

>>> math.acosh(x)

seklindedir. Burada x girilen de erdir. Bir rnek ile inceleyelim: g


>>> math.acosh(1) 0.0

Bu fonksiyon Python 2.6 srm ile eklenmi. s

23.23.5 asinh Fonksiyonu


Hiperbolik sins fonksiyonunun tersini dndrr. Kullanm:
>>> math.asinh(x)

seklindedir. Burada x girilen de erdir. Bir rnek ile inceleyelim: g


>>> math.asinh(0) 0.0

Bu fonksiyon Python 2.6 srm ile eklenmi. s

23.23.6 atanh Fonksiyonu


Hiperbolik tanjant fonksiyonunun tersini dndrr. Kullanm:
>>> math.atanh(x)

seklindedir. Burada x girilen de erdir. Bir rnek ile inceleyelim: g


>>> math.atanh(0) 0.0

Bu fonksiyon da Python 2.6 srm ile eklenmi. s

BLM

24

datetime Modl

Pythonda datetime adl bir modl bulunur. Bu modl bize tarih ve zamanla ilgili ilemleri s gerekletirme imkan sa lar. Bu modl Pythonun standart ktphanesine dahil oldu undan, s g g yani Python gelitiricilerince yazld ndan, bu modl kullanmak iin herhangi bir harici pros g gram kurmamza gerek yok. Yazd mz bir programda datetime modlne ihtiya duyarsak, g modl normal bir sekilde ie aktarmamz yeterli olacaktr:
>>> import datetime

Dilerseniz ilk i olarak bu modln ieri inde neler olup olmad na bir bakalm: s g g
>>> dir(datetime) [MAXYEAR, MINYEAR, __doc__, __name__, __package__, date, datetime, datetime_CAPI, time, timedelta, tzinfo]

Biz bu derste, yukarda grnen nitelik ve fonksiyonlar isimlerine gre de il, ilevlerine gre g s inceleyece iz. g

24.1 Bugnn Tarihini Bulmak


datetime adl modl kullanarak bugnn tarihini bulabiliriz. Bunun iin syle bir kod yazy oruz:
>>> bugun = datetime.date.today()

Burada, datetime modlnn date adl snf iinde yer alan today() adl bir fonksiyonu a rdk. g Bu fonksiyon bize bugnn tarihini verir:
>>> print bugun 2010-07-08

Bu ktda grnen tarih yl-ay-gn seklindedir. Yani yukardaki karakter dizisi 8 Temmuz 2010 tarihini gsteriyor. Yukardaki kodu kullanarak, yl, ay ve gn bilgilerini tek tek ayklayabilirsiniz:

385

>>> print "%s ylndayz!" %bugun.year 2010 ylndayz! >>> print "%s ylnn %s. ayndayz!" %(bugun.year, bugun.month) 2010 ylnn 7. ayndayz! >>> print "%s. ayn %s. gnndeyiz!" %(bugun.month, bugun.day) 7. ayn 8. gnndeyiz!

Grd nz gibi bugun.year yl, bugun.month ay, bugun.day ise gn gsteriyor. g

24.2 Bir Tarihin Hangi Gne Geldigini Bulmak


Bir nceki blmde datetime modln kullanarak bugnn tarihiyle ilgili baz bilgiler edinebildik. Bu blmde ise bir tarihin haftann hangi gnne denk geldi ini bulmaya alag s ca z. Simdi su kodlara dikkatlice bakalm: g
>>> bugun = datetime.date.today()

Bylece bugnn tarihin aldk. Simdi bu tarihin hangi gne denk geldi ini bulaca z: g g
>>> print bugun.weekday() 3

Muhtemelen ktnn bu sekilde olmasn beklemiyordunuz. Python haftann gnlerini gs terirken saylardan yararlanr. Buna gre syle bir tablo izebiliriz: Say 0 1 2 3 4 5 6 Gn Pazartesi Sal aramba s Perembe s Cuma Cumartesi Pazar

Buna gre yukardaki ktda grd mz 3 says Perembe gnne iaret ediyor. E er g s s g Pythonn gnleri sayyla gstermesi hounuza gitmediyse, szlklerden yararlanarak syle s bir sey yazabilirsiniz:
#!/usr/bin/env python #-*- coding: utf-8 import datetime hafta = {0: 1: 2: 3: 4: 5: 6: "Pazartesi", "Sal", "aramba", s "Perembe", s "Cuma", "Cumartesi", "Pazar"}

bugun = datetime.date.today() print "Bugn %s" %(hafta[bugun.weekday()])

Yukarda yapt mz ilemler hep bugnn tarihi ile ilgiliydi. Ancak tabii istersek farkl tarihler g s zerinde de ilem yapabiliriz. Bunun iin ncelikle zerinde ilem yapaca mz tarihi belirts s g memiz gerekiyor. Bunu su sekilde yapyoruz:
>>> tarih = datetime.date(2010, 5, 30)

Burada, 30 Mays 2010 tarihini belirttik. Bunu nasl yapt mza ok dikkat edin. datetime.date g adl snf kullanarak, ilgili tarihi yl-ay-gn seklinde parantez iinde yazyoruz. Bylece su kty elde edebiliyoruz:
>>> print tarih 2010-05-30

Mesela bu tarihin hangi gne denk geldi ini bulmak istersek weekday() adl fonksiyondan g yararlanabilece imizi biliyorsunuz: g
>>> print tarih.weekday() 6

Demek ki 30 Mays 2010 tarihi Pazar gnne denk geliyormu... Tabii isterseniz yukarda s yazd mz szlkten yararlanarak daha net bir kt alabilirsiniz: g
#!/usr/bin/env python #-*- coding: utf-8 import datetime hafta = {0: 1: 2: 3: 4: 5: 6: "Pazartesi", "Sal", "aramba", s "Perembe", s "Cuma", "Cumartesi", "Pazar"}

tarih = datetime.date(2010, 5, 30) print ("%s tarihi %s gnne denk gelir" %(tarih, hafta[tarih.weekday()]))

Daha nce rendi imiz month, day ve year nitelikleri burada da geerlidir: g g
>>> print tarih.month #ay 5 >>> print tarih.day #gn 30 >>> print tarih.year #yl

2010

24.3 Tarihleri Biimlendirmek


Yukarda rendi imiz bilgilere gre bugnn tarihini elde edebilmek iin syle bir kod yazg g abiliyoruz:
>>> bugun = datetime.date.today()

Bu kod bize bugnn tarihinin ne oldu unu gsterir: g


>>> print bugun 2010-07-08

Ancak bu kt bir karakter dizisi olmad iin, bu kty istedi imiz gibi biimlendirmek g g mmkn de ildir. Yani mesela syle bir sey yazamayz: g
>>> print bugun[:4] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: datetime.date object is unsubscriptable

Dedi imiz gibi, yukardaki kt bir karakter dizisi de ildir. g g Isterseniz bu durumu hemen teyit edelim:
>>> type(bugun) <type datetime.date>

Grd nz gibi elimizdeki sey bir datetime.date nesnesi... E er biz tarih ktlarn karakter g g dizisi olarak almak istersek strftime() adl zel bir fonksiyondan yararlanabiliriz. Bunu syle kullanyoruz:
>>> bugun = datetime.date.today() >>> print bugun.strftime("%c") 08.07.2010 00:00:00

strftime() fonksiyonu son derece yararl bir aratr. Bu arac kullanarak tarih bilgilerini istedi imiz sekilde biimlendirebiliriz. Bu ii yaparken bir takm iaretlerden/karakterlerden yararg s s lanmamz gerekiyor. Biz yukardaki rnekte %c adl karakteri kullandk. Dilerseniz bu karakterlerin en nemlilerini listeleyelim:

Karakter %a %A %b %B %c %d %j %m %U %y %Y

Anlam hafta gnnn ksaltlm ad s hafta gnnn tam ad ayn ksaltlm ad s ayn tam ad tam tarih tamsay cinsinden gn belli bir tarihin, yln kanc gnne denk geldi ini gsteren 1-366 g aras bir say tamsay cinsinden ay belli bir tarihin yln kanc haftasna geldi ini gsteren 0-53 aras bir g say yln son iki rakam tamsay cinsinden yl

Isterseniz bu tabloya bakarak birka rnek de verelim:


>>> print "Bugn gnlerden %s" %bugun.strftime("%A") Bugn gnlerden Perembe s >>> print bugun.strftime("%a") Per

Dilerseniz btn karakter dizisini do rudan strftime() fonksiyonu iine de yazabilirsiniz: g


>>> print bugun.strftime("Aylardan %B") Aylardan Temmuz

Dedi imiz gibi, strftime() fonksiyonunun dn de eri bir karakter dizisidir. Dolaysyla bu g s g karakter dizisini istedi iniz gibi biimlendirebilirsiniz: g
>>> tarih = datetime.date(2005, 4, 3) >>> krk = tarih.strftime("%c") >>> print krk 03.04.2005 00:00:00 >>> print type(krk) <type str> >>> print krk[:2] 03

strftime() fonksiyonunun nemli bir zelli i vardr. Bu fonksiyon sisteminizde tanml olan dil g yereline (locale) gre ilem yapar. Yani e er sisteminizin dil yereli s g Ingilizce ise ay isimleri de tabii ki Ingilizce olacaktr. strftime() fonksiyonunun genellikle syle kullanld na tank olursunuz: g

>>> bugun = datetime.date.today() >>> print bugun.strftime("Son gncelleme: %d/%m/%y")

24.4 Tarihlerle Aritmetik slem Yapmak I


E er yazd nz bir programda tarihlere dayal bir ilem yapyorsanz, mevcut tarihin ncesini g g s ve sonrasn da bilmeniz gerekebilir. Mesela TCMBden dviz kuru bilgilerini alan bir program yazyorsunuz diyelim. En basitinden, mesela dolarn bir gn ncesine gre ykselip ykselmedi ini kullancya gsterebilmek iin, bugnn tarihini bilmenin yansra bir nceki gnn g tarihini de bilmeniz gerekir. Hatta rne in e er dolar kurundaki haftalk de iimi graklerle g g gs gsteren bir uygulama yazacaksanz mevcut gnn 7 gn ncesine kadar giden tarihleri de alabilmeniz gerekir. Gelin isterseniz bu tr ilemleri nasl yapabilece imizi gsteren basit bir s g rnek verelim:
>>> import datetime >>> bugun = datetime.date.today()

Bylece bugnn tarihini bulduk. Diyelim ki bugnn tarihi 09.07.2010 Cuma olsun. Siz bu tarihin 1 gn ncesini bulmak istiyorsunuz:
>>> fark = datetime.timedelta(1) >>> dun = bugun - fark >>> print dun 2010-07-08

Burada datetime modl iinde bulunan timedelta() adl zel bir fonksiyondan yararlandk. Bu fonksiyona verdi imiz say de erli argman, ka gnlk bir fark zerinden ilem yapaca mz g g s g gsteriyor. Bizim amacmz 1 gnlk fark zerinden ilem yapmak oldu u iin timedelta() s g fonksiyonuna argman olarak 1 saysn verdik. Daha sonra 1 gn ncesinin tarihi bulabilmek iin bugnn tarihinden, fark de ikeninin gs de erini (yani 1i) karyoruz. Bylece bugnn 1 gn ncesi olan 8 Temmuz 2010 tarihini g elde ediyoruz. E er bir nceki gnn haftann hangi gnne denk geldi ini bulmak istiyorsak g g syle bir sey yazabilece imizi biliyorsunuz: g
>>> print dun.weekday() 3

Demek ki 8 Temmuz 2010 tarihi Perembeye denk geliyormu... s s Dilerseniz strftime() fonksiyonunu kullanarak do rudan gn adn da alabilirsiniz: g
>>> print dun.strftime("%A") Perembe s

Bu strftime() fonksiyonunun olduka geni bir kullanm alan vardr. Mesela istihza.comdaki s sayfalarn en sonuna eklenen Son gncelleme tarihini oluturmak iin ben de bu fonksiyon s kullanlyor. Bunun iin kullanlan karakter dizisi syle:
bugun.strftime(%d/%m/%Y)

BLM

25

time Modl

time modl, Pythonda saat/zaman ile ilgili ilemler yapmamz sa lar. Bu modl ilev olarak s g s az ok datetime() modlyle benzerlik gsterir. Pythondaki bu time adl modl, tpk teki modller gibi iinde birtakm fonksiyonlar barndrr. Dilerseniz bu fonksiyonlar iinde en ok kullanlan inceleyerek balayalm konumuza... s

25.1 sleep() Fonksiyonu


Dedi imiz gibi, bu fonksiyon, time() modl iinde en sk kullanlan fonksiyondur. sleep() g fonksiyonu, yazd mz bir programn ileyiini belli bir sre durdurmamz sa lar. g s s g Isterseniz buna basit bir rnek verelim:
>>> import time >>> for i in range(10): ... time.sleep(1) ... print i

Grd nz gibi, 0dan 10a kadar olan saylar 1er saniye aralklarla ekrana dklyor. Prog gramn ka saniye duraca n, sleep() fonksiyonuna verdi imiz bir parametre ile belirliyoruz. g g Biz yukardaki rnekte bu parametreyi 1 olarak belirledik. Yani programmzn 1er saniye aralklarla almasn istedik... s Gelin isterseniz yukardaki bilgiyi kullanarak grak arayze sahip bir saya yazalm:
from Tkinter import * import time pencere = Tk() pencere.geometry("200x200") etk = Label(font = "Helvetica 60 bold", fg = "steelblue") etk.pack(pady=50) a = -1

391

while True: a += 1 time.sleep(1) pencere.update() etk["text"] = a pencere.mainloop()

Yalnz dikkat ettiyseniz bu saya program alma srasnda bloke oluyor, yani taklyor. Pros gram penceresini fare ile srklerken bu taklmalar daha iyi grebiliyoruz. stelik program arp d mesinden kapatmaya alt mzda da programda belli bir kaslma gze arpyor. g s g Ayrca program kapanrken hata da veriyor. Bunu engellemek iin programnz ok katmanl (multi-threaded) bir hale getirebilirsiniz:
# -*- coding: utf-8 -*from Tkinter import * import time import threading class GUI(object): def __init__(self): self.penar_olustur() def penar_olustur(self): """Pencere aralarmz burada oluturuyoruz. s Programmz bir etiket ve dmeden ibaret...""" g self.etk = Label(font = "Helvetica 60 bold", fg = "steelblue") self.etk.pack(pady=50) self.btn = Button(text = "KAPAT", relief = "raised", font = "Helvetica 15 bold", fg = "navy") self.btn["command"] = self.kapat self.btn.pack() #Kullanc arp dmesine bastnda kapat g g #fonksiyonu devreye girsin. Eer bunu yapmazsak g #program yine de kapanacak, ama kapanrken #hata verecektir... pencere.protocol("WM_DELETE_WINDOW", self.kapat) def kapat(self): """Programn kapanmasn salayan fonksiyon. g Burada program tamamen kapatmadan nce pencereyi "withdraw" durumuna alyoruz. Bylece sayacn durmasn salyoruz ve programn g aniden kapanp hata vermesine engel oluyoruz""" pencere.state("withdraw") #sayacn dzgn bir ekilde durabilmesi iin s #programmza 1 saniyelik bir sre tanyoruz.

time.sleep(1) #Pencere "withdraw" durumuna alnd ve sayacmz #durdu. Artk programmz sona erdirebiliriz. pencere.destroy() pencere = Tk() pencere.geometry("350x300") app = GUI() class Sayac(threading.Thread): def run(self): sayi = -1 #pencere durumu "withdrawn" olmad srece g #sayacmz saymaya devam edecek. while pencere.state() != "withdrawn": sayi += 1 time.sleep(1) app.etk["text"] = sayi syc = Sayac() syc.start() pencere.mainloop()

25.2 strftime() Fonksiyonu


strftime() fonksiyonu yardmyla gn, yl, ay, hafta, saat, dakika, saniye gibi bilgileri gsterebiliriz. rne in: g
>>> import time >>> time.strftime("%Y") 2010

Grd nz gibi, strftime() fonksiyonunu bir parametre ile birlikte kullanyoruz. Bu rnekteki g %Y ifadesi yl gstermemizi sa lyor. E er yln son iki hanesini grmek istersek syle yazg g abiliriz:
>>> time.strftime("%y") 10

Ay grmek iin:
>>> time.strftime("%m") 08

Gn grmek iin:
>>> time.strftime("%d") 16

Ay, gn ve yl birlikte grmek iin:

>>> time.strftime("%x") 08/16/2010

Tabii buradaki gsterim ay/gn/yl seklinde. Trkiyedeki tarih gsterimi ise gn-ay-yl sek lindedir. Trkiyeye uygun bir tarih gsterimi elde etmek iin iki yol takip edebilirsiniz. Birincisi:
>>> time.strftime("%d.%m.%Y") 16.08.2010

Burada gn, ay ve yl bileenlerini uygun srada ve tek tek belirttik. s Ikincisi:


>>> import locale >>> locale.setlocale(locale.LC_ALL, "tr_TR.UTF-8") >>> time.strftime("%x") 16-08-2010

Burada ise locale modlnden yararlanarak Trke yerelleri etkin hale getirdik. Yukardaki kullanm GNU/Linux iindir. Windows kullanclar yukardaki kodlar su sekilde yazabilir:
>>> import locale >>> locale.setlocale(locale.LC_ALL, "Turkish_Turkey.1254") >>> time.strftime("%x") 16.08.2010

E er strftime() modln kullanarak saat, dakika ve saniye bilgilerini elde etmek isterseniz g syle bir sey yazabilirsiniz:
>>> time.strftime("%X") 2:08:02 PM

Bu da, tpk tarih gsteriminde oldu u gibi, Amerikan sistemine uygun bir saat gsterimidir. g Bunu Trkiye sistemine uygun bir hale getirmek iin yine locale modlnden yararlanaca z: g
>>> locale.setlocale(locale.LC_ALL, "tr_TR.UTF-8") >>> time.strftime("%X") 14:08:02

Grd nz gibi, Amerikan sisteminde 12 saat zerinden ilem yaplrken, Trkiye sisteminde g s 24 saat zerinden ilem yaplyor. s Burada da, e er isterseniz saat, dakika ve saniye bilgilerini tek tek alabilirsiniz. g Saati almak iin:
>>> time.strftime("%H") 14

Dakikay almak iin:


>>> time.strftime("%M") 13

Saniyeyi almak iin:


>>> time.strftime("%S") 53

Elbette bunlar birletirebilirsiniz de: s


>>> time.strftime("%H:%M:%S") 14:13:53

Bunlarn dnda, strftime() fonksiyonu ile birlikte kullanlan baka harer de bulunur. s s hareri sylece zetleyebiliriz: fade I %a %A %b %B %c %d %H %I %j %m %M %S %U %x %X %y %Y Anlam Ksaltlm gn ad s Tam gn ad Ksaltlm ay ad s Tam ay ad Tam tarih ve saat Ondalk say cinsinden gn (aya gre) Ondalk say cinsiden saat (24 saat hesabna gre) Ondalk say cinsinden saat (12 saat hesabna gre) Ondalk say cinsinden gn (yla gre) Ondalk say cinsinden ay Ondalk say cinsinden dakika Ondalk say cinsinden saniye Yla gre hafta numaras. Pazar haftann ilk gn olarak alnr Tam tarih Tam saat Yln son iki hanesi Tam yl gsterimi

Bu

25.3 localtime() Fonksiyonu


localtime() fonksiyonunu kullanarak tarih ve saate ilikin btn bilgilerin yer ald bir demet s g elde edebilirsiniz:
>>> time.localtime() time.struct_time(tm_year=2010, tm_mon=8, tm_mday=16, tm_hour=16, tm_min=49, tm_sec=42, tm_wday=0, tm_yday=228, tm_isdst=1)

Bu demette toplam 9 adet de er bulunur ve bu de erlerin anlam sudur: g g

Sra 0 1 2 3 4 5 6 7 8

Deger tm_year tm_mon tm_mday tm_hour tm_min tm_sec tm_wday tm_yday tm_isdst

Anlam yl ay gn saat dakika saniye haftann gn (Pazartesi 0) yla gre gn gn ndan yararlanma uygulamasnn olup olmad n denetler sg g

Bu de erlere su sekilde ulaabiliriz: g s


>>> zaman = time.localtime() >>> zaman.tm_year 2010 >>> zaman.tm_mon 8 #Austos ay... g >>> zaman.tm_mday 16 #Ayn 16s... >>> zaman.tm_hour 16 #Saat akam 4 s >>> zaman.tm_min 49 #49. dakika >>> zaman.tm_wday 0 #Pazartesi... >>> zaman.tm_yday 228 #yln 228. gn... >>> zaman.tm_isdst 1 #gn ndan yararlanma uygulamas etkin s g

25.4 gmtime(), time() ve ctime() Fonksiyonlar


Pythonda zaman hesaplamas yaplrken epoch adl bir kavramdan yararlanlr. Epoch zamann balangcdr. Zamann balangcnn ne oldu unu bulmak iin gmtime() fonksiyonunu s s g kullanabiliriz:
>>> print time.gmtime(0).tm_year 1970

Demek ki epoch, yani zamann balangc 1970 imi... time() adl baka bir fonksiyonu kullas s s narak zamann balangcndan bu yana ka saniye geti ini bulabiliriz: s g
>>> time.time() 1282025564.984

ctime() fonksiyonu ise bize tam tarih ve saat bilgisini gsterir:


>>> time.ctime() Tue Aug 17 09:13:47 2010

time() ve ctime() fonksiyonlarn birlikte kullanarak sonraki bir zaman hesaplayabiliriz. Mesela su andan 60 saniye sonrasn hesaplamak iin syle bir sey yazabiliriz:
>>> sonraki_tarih = time.time() + 60 >>> print time.ctime(sonraki_tarih) Tue Aug 17 09:17:44 2010

E er tam bir saat sonrasn hesaplamak isterseniz su kodu kullanabilirsiniz: g


>>> bir_saat_sonra = time.time() + (60 * 60) >>> print time.ctime(bir_saat_sonra) Tue Aug 17 10:18:59 2010

ZEL KONULAR

BLM

26

len() Fonksiyonu ve asciinin Laneti

Bildi iniz gibi, iinde Trke karakterler geen bir program yazd mzda beti imizin en bana g g g s su satr eklememiz gerekir:
#-*-coding:utf8-*-

Not: Windows kullananlar utf8 yerine cp1254 kodlamasn kullanabilir... Diyelim ki syle bir sey var elimizde:
#!/usr/bin/env python print "Trkeye zg karakterler: s" g

Burada oldu u gibi, #--coding:utf8-- satrn eklemezsek suna benzer bir hata alrz: g
File "deneme.py", line 3 SyntaxError: Non-ASCII character \xc3 in file deneme.py on line 3, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

Burada Python bize ASCII olmayan bir karakter kulland mz, stelik uygun bir kodlama dzeni g de belirtmedi imizi sylyor. Bu hatay almamak iin beti imizi su hale getirmemiz gerekir: g g
#!/usr/bin/env python #-*-coding:utf8-*print "Trkeye zg karakterler: " s g

Burada ekledi imiz #--coding:utf8-- satr yardmyla beti imizin kodlama dzenini utf8 g g olarak belirledik. E er beti imiz iinde kendimiz bir kodlama dzeni belirtmezsek, Python g g otomatik olarak ascii kodlamasn kullanacaktr. Su komutun ktsna bakt mzda gerekten g de Pythonun varsaylan kod zcsnn ascii oldu unu gryoruz: g
>>> import sys >>> sys.getdefaultencoding() ascii

398

Peki bu ascii denen sey de ne oluyor? ascii kelimesi Ingilizce American Standard Code for Information Interchange (Bilgi Alverii s s iin Amerikan Standart Kodu) ifadesinin ksaltmas... ascii denen karakter kodlama dzeni Ingiliz alfabesi temel alnarak 1960l yllarda hazrlanm. Amac da o dnemde kullanmda s olan yaz makinelerinin standartlamasn ve bylece bu makinelerin birbirleriyle uyumlu als s masn sa lamak. ascii kelimesini askii seklinde telaffuz ediyoruz... ascii kodlamasnda, g Ingiliz alfabesindeki her harf bir sayya karlk geliyor. Mesela 65 saysnn karl A s s g hardir... Su kod yardmyla bunu do rulayabiliriz: g
>>> print chr(65) A

rne in 100 saysnn hangi karaktere karlk geldi ine bakalm: g s g


>>> print chr(100) d

Demek ki 100 says d harne karlk geliyormu. Standart ascii kodlamasnda toplam s s 128 karakter bulunur. Bunlarn ilk 33 tanesi ekranda grnmeyen karakterlerdir. Bu karakterlere, yazlan bir metnin akn kontrol etme grevi grdkleri iin, kontrol karakterleri s ad veriliyor. Geri kalan 95 karakter ise ekranda bilil grd mz karakterlerdir. ascii kodlag masnda hangi saynn hangi karaktere denk geldi ini bulmak iin http://www.asciitable.com/ g adresindeki tablodan faydalanabilirsiniz. Ayrca isterseniz su komutu kullanarak kendiniz de benzer bir ascii tablosu retebilirsiniz:
>>> for i in range(128): ... print chr(i)

Bu tabloda hangi saynn hangi karaktere karlk geldi ini ak ak grebilmek iin ise syle s g bir sey yazabilirsiniz:
>>> for i in range(128): ... print "%s => %c"%(i,i)

Burada %s, 128 aral ndaki saylarn bildi imiz halini; %c ise bu saylarn char yani g g karakter karlklarn gsteriyor... Peki burada neden 128e kadar olan saylar kullandk? s nk yukarda da syledi imiz gibi ascii tablosunda toplam 128 karakter bulunur. Yani bu g tabloda sadece 128 adet karakter tanmlanmtr. Bu durumun bir yansmasn, daha nce bir s yerlerde muhtemelen karnza km olan su hata mesajndan da hatrlyor olabilirsiniz: s s
UnicodeDecodeError: ascii codec cant decode byte 0xc5 in position 0: ordinal not in range(128)

Buradan anlad mza gre, Pythonun varsaylan kod zcs olan ascii, konumu belirtilen g karakteri zmleyemiyormu. Yani sz konusu karakter, yukarda bahsetti imiz 128 karaks g terlik tablonun dnda kalyormu... s s ascii tablosuna bakt mz zaman, Trke harerin ( ) bu tabloda bulunmad n gryg s g g oruz. ste biz beti imizde utf8 gibi bir kodlama dzeni belirtmedi imiz zaman, Pythonun I g g varsaylan kodlama dzeni olan ascii, tabloda bulunmayan bu karakterleri zmleyemiyor. Beti imizde utf8 kodlamas kullanarak Pythonun ascii yerine utf8i kullanmasn sa lyg g oruz. utf8 kodlamas, asciinin aksine Trke karakterleri de zmleyebiliyor. Simdi yukarda anlatt mz meseleye biraz daha yakndan bakalm. Hemen Python komut g satrnda sunu yazyoruz:

>>> "a"

Buradan elde edece imiz kt tabii ki syle olacaktr: g


a

Grd nz gibi Python a harni do ru bir sekilde alglad. Simdi bir de suna bakalm: g g
>>> "" s

Burada Trkeye zg bir harf olan yi kullandk. Bakalm Python ne yapacak? s


\xc5\x9f

Python, bu har a harnden farkl bir sekilde yorumlad. Bunun nedeni a harnin ascii tablosunda bulunuyorken, harnin bu tabloda bulunmuyor olmas... s Simdi bu konuya ufak bir ara verelim. Aslnda ara vermekten ziyade ayn konuya baka bir s pencereden bakmaya devam edece iz... g Hepimizin bildi i gibi, Pythonda bir nesnenin boyutunu renmek iin len() fonksiyonundan g g yararlanyoruz. En basit sekliyle bu fonksiyonu su sekilde kullanabiliriz:
>>> a = "python" >>> len(a) 6

Demek ki python karakter dizisi iinde 6 karakter varm. Bir de suna bakalm: s
>>> b = "ilek" >>> len(b) 6

Burada len() fonksiyonu 6 sonucunu verdi. Ama grd nz gibi aslnda ilek karakter g dizisi 6 de il, 5 karakterden oluuyor!.. Simdi bu tuha n nereden kaynakland n bulmaya g s g g alalm: s
>>> len("s") 1 >>> len("a") 1 >>> len("") 2

Grd nz gibi, a, s gibi harer normal olarak 1 karakter uzunlu unda, ama har g g yle de il... Dolaysyla Python ilek karakter dizisi iinde geen harni tek bana 2 g s sayd iin toplam 6 karakter buluyor... Burada a ve s harerinin ortak zelli i, bunlarn g g ascii kod tablosunda yer alyor olmas. Ya da kabaca syle diyebiliriz: a ve s harerinin ortak zelli i her ikisinin de g Ingiliz alfabesinde bulunuyor olmas... Dolaysyla bunlar ascii ile kodland nda tek karakter seklinde temsil edilebiliyor. harnin suu ise Trkeye zg g karakterlerden biri olmas... Ayn durumu, Trkeye zg teki karakterlerde de gryoruz:

>>> len("") 2 >>> len("") s 2 >>> len("") 2 >>> len("") g 2

Yukarda Pythonun harni nasl gsterdi ini hatrlyoruz: s g


>>> "" s \xc5\x9f

Ayn sekilde teki Trke harer de Ingilizce harerden farkl grnecektir:


>>> "","","","","" g s (\xc3\xa7, \xc3\xb6, \xc4\x9f, \xc5\x9f, \xc4\xb1)

Aslnda sorunun temelinde su yatyor: len() fonksiyonu, o u kiinin zannetti i gibi, karakter g s g saysn saymaz. Bu fonksiyonun yapt i, bir karakter dizisindeki bayt saysn saymaktr. g s Yani aslnda len() fonksiyonu bir karakter dizisinin bir veya birden fazla karakter (veya harf) ierip iermemesiyle ilgilenmez. Onun ilgilendi i, yalnzca bayt saysdr. nk bilgisayarlar g sadece saylardan anlar. Karakterler veya harer znde bilgisayara hi bir sey ifade etmez. Pythonun varsaylan kod zcs olan ascii yalnzca 1 baytlk verileri do ru olarak gstereg bilir. Trke harer ascii kodlamasna gre 1 baytla gsterilemedi i iin de yukardaki gibi bir g durum ortaya kar. Esasnda yukardaki ktlar inceledi imiz zaman bu durumu net olarak g gryoruz. Mesela harnin ktsna bakalm tekrar: s
>>> "" s \xc5\x9f

Buradaki ktda xcf + x9f seklinde gsterilen toplam 2 bayt var. ste len() fonksiyonu da I karakter iindeki bu bayt saysna bakyor. Bayt says 1den fazla oldu unda ise uvallyor!.. g Bu problem tabii ki yalnzca Trkeye zg karakterler iin geerli de il. Mesela avro iareti g s de asciinin lanetinden payn alyor:
>>> "" \xe2\x82\xac >>> len("") 3

Demek ki, iareti tek bana bayt ieriyormu... (xe2, x82 ve xac). s s s Btn bu anlattklarmzdan yola karak, zellikle Trke yazlm bir programda, e er kuls g lancdan birtakm veriler alyorsak ve program iinde bu verilerin uzunlu unu lyorsak, g

yukardaki duruma dikkat etmemiz gerekir. nk len() fonksiyonunu kullanrken aslnda bir karakterin boyunu posunu de il, bayt saysn lyoruz. Bu duruma bir rnek verelim. Diyelim g ki elimizde syle bir betik var:
#!/usr/bin/env python #-*-coding:utf8-*liste = [ ] while True: soru = raw_input("ltfen bir karakter giriniz: ") if len(soru) == 1: liste.append(soru) print liste else: print "ltfen birden fazla karakter girmeyiniz"

Burada, kullancdan tek bir karakter girmesini istiyoruz. Amacmz kullancnn yanllkla veya s bilerek birden fazla karakter girmesini engellemek. Byle bir seye, rne in bir adamasmaca g oyunu yazyorsanz ihtiyacnz olabilir... Yukarda yazd mz kodlara gre, e er kullanc sadece g g Ingilizcede bulunan hareri (ya da daha do ru bir ifadeyle ascii tablosunda bulunan karakterg leri) girerse sorun olmayacaktr. Ama kullanc gibi harer girmeye kalkrsa, bunlar s g s da grnte tek karakter olmasna ra men, programmz if blo u yerine else blo unu iletes g g g s cektir. Byle bir durumda kullancdan kfr yemeye hazrlkl olun!... Su ana kadar bahsetti imiz, asciinin lanetinden kurtulmann tek yolu, karakter diziler g imizi Pythonun varsaylan kod zcsnn ellerine ve insafna brakmamaktr. Bunun yerine, karakter dizilerimizi mutlaka unicode olarak kodlamamz gerekir (Bu unicode konusu baka bir yazda ayrntl olarak ele alnacak). s Trke iin en uygun unicode kodlamas utf8 olacaktr. (unicode ve utf8 ile ilgili gzel bir belge iin bkz: http://www.cl.cam.ac.uk/~mgk25/unicode.html#unicode) Hemen syle bir rnek yapalm:
>>> a = "k" s >>> len(a) 7

Burada Python , ve harerinin her birini ift sayd iin toplam 7 karakter buldu. s g Yanl! Ama biz simdi Pythona do ru yolu gsterece iz: s g g
>>> a = "k" s >>> a = unicode(a,"utf8") >>> len(a) 4

Grd nz gibi burada, a = unicode(a,utf8) satr yardmyla a de ikenini utf8 olarak g gs kodladk. Yani karakter dizimizi asciinin elinden kurtardk. Bir de bize daha nce sorun karan , , gibi harerin durumuna bakalm: s g
>>> a = "" s >>> a = unicode(a,"utf8") >>> len(a) 1

>>> b = "" g >>> b = unicode(b,"utf8") >>> len(b) 1

Yukarda asciinin yanl olarak 2 karakter uzunlu unda gsterdi i bu harerin utf8 kodlas g g masyla do ru olarak gsterildi ini gryoruz... Bir de su zavall avro iaretine bakalm: g g s
>>> avro = "" >>> len(avro) 3 >>> avro = unicode(avro,"utf8") >>> len(avro) 1

Grd nz gibi, avromuz artk mutlu!! g Btn bu sylediklerimizden kan sonuca gre, bizim yukarda verdi imiz, kullancdan karakg ter girmesini isteyen beti imizin iinde bir de iiklik yaparak, beti imizin Pythonun varsaylan g gs g zcs yerine, mesela utf8i kullanmasn sa lamamz gerekiyor. Yani kodlarmz syle g yazmalyz:
#!/usr/bin/env python #-*-coding:utf8-*liste = [ ] while True: soru = raw_input("ltfen bir karakter giriniz: ") if len(unicode(soru,"utf8")) == 1: liste.append(soru) for i in liste: print i else: print "Ltfen sadece tek bir karakter giriniz!"

Dikkat ederseniz, if len(unicode(soru,utf8)) == 1: gibi bir satr eklemenin yansra, listeyi ekrana yazdrrken bir for dngs kurarak listedeki Trke karakter ieren elerin ekrana g dzgn yazdrlmasn da sa ladk. g Bylece ascii ve kodlama meselesine ayrntl saylabilecek bir bak sunmu olduk. Daha s s sonra, bu makalede bahsedilen ve bu konuyla yakndan ilikili olan unicode konusuna da s de inece iz... g g

BLM

27

Pythonda id() Fonksiyonu, is sleci ve nbellekleme I Mekanizmas

Pythonda her nesnenin bir kimli i (identity) vardr. Kabaca sylemek gerekirse, bu kimlik g denen sey esasnda o nesnenin bellekteki adresini temsil eder. Pythondaki her nesnenin kim li i esiz, tek ve benzersizdir. Peki bir nesnenin kimli ine nasl ularz? Pythonda bu ii yapg s g s s mamz sa layacak basit bir fonksiyon bulunur. Bu fonksiyonun ad id(). Yani g Ingilizcedeki identity (kimlik) kelimesinin ksaltmas. Simdi rnek bir nesne zerinde bu id() fonksiyonunu nasl kullanaca mza bakalm: g Bildi iniz gibi Pythonda her sey bir nesnedir. Dolaysyla rnek nesne bulmakta zorlanmayag ca z... Herhangi bir ey, oluturdu umuz anda Python asndan bir nesneye dnvereg s s g s cektir zaten:
>>> a = 100 >>> id(a) 137990748

ktda grd mz 137990748 says a de ikeninin tuttu u 100 saysnn kimli ini gsg gs g g teriyor. Simdi id() fonksiyonunu bir de su sekilde deneyelim:
>>> id(100) 137990748

Grd nz gibi, Python a de ikenini ve 100 saysn ayr ayr sorgulamamza ra men ayn g gs g kimlik numaralarn gsterdi. Bu demek oluyor ki, Python iki adet 100 says iin bellekte iki farkl nesne yaratmyor. kullanmda nbelle ine ald sayy, ikinci kez ihtiya oldu unda Ilk g g g bellekten alp kullanyor. Ama bir de su rneklere bakalm:
>>> a = 1000 >>> id(a) 138406552 >>> id(1000)

404

137992088

Bu defa Python a de ikeninin tuttu u 1000 says ile teki 1000 says iin farkl kimlik numargs g alar gsterdi. Bu demek oluyor ki, Python a de ikeninin tuttu u 1000 says iin ve do rudan gs g g girdi imiz 1000 says iin bellekte iki farkl nesne oluturuyor. Yani bu iki 1000 says Python g s asndan birbirinden farkl... Bu durumu grebilece imiz baka bir yntem de Pythondaki is g s ilecini kullanmaktr. Deneyelim: s
>>> a is 1000 False

Grd nz gibi, Python False (Yanl) ktsn suratmza bir tokat gibi arpt... Peki bu g s ne anlama geliyor? Syle ki: Pythonda is ilecini kullanarak iki nesne arasnda karlatrma s s s yapmak gvenli de ildir. Yani is ve == ileleri birbirleriyle ayn ilevi grmez... Bu iki ile g s s s nesnelerin farkl ynlerini sorgular: is ileci nesnelerin kimliklerine bakp o nesnelerin ayn s nesneler olup olmad n kontrol ederken, == ileci nesnelerin ieri ine bakarak o nesnelerin g s g ayn de ere sahip olup olmadklarn sorgular. Yani: g
>>> a is 1000 False

Ama...
>>> a == 1000 True

Burada is ileci a de ikeninin tuttu u veri ile 1000 saysnn ayn kimlik numarasna sahip s gs g olup olmad n sorgularken, == ileci a de ikeninin tuttu u verinin 1000 olup olmad n g s gs g g denetliyor. Yani is ilecinin yapt sey kabaca su oluyor: s g
>>> id(a) == id(1000) False

Simdiye kadar denedi imiz rnekler hep sayyd. Simdi isterseniz bir de karakter dizilerinin g durumuna bakalm:
>>> a = "python" >>> a is "python" True

Burada True ktsn aldk. Bir de == ileci ile bir karlatrma yapalm: s s s
>>> a == "python" True

Bu da normal olarak True kts veriyor. Ama su rne e bakarsak: g


>>> a = "python gl ve kolay bir programlama dilidir" >>> a is "python gl ve kolay bir programlama dilidir" False

Ama...

>>> a == "python gl ve kolay bir programlama dilidir" True

is ve == ilelerinin nasl da farkl sonular verdi ini gryorsunuz. nk bunlardan biri s g nesnelerin kimli ini sorgularken, br nesnelerin ieri ini sorguluyor. Ayrca burada dikkag g timizi ekmesi gereken baka bir nokta da python karakter dizisinin nbelle e alnp gereks g ti inde tekrar tekrar kullanlyorken, python gl ve kolay bir programlama dilidir karakter g dizisinin ise nbelle e alnmyor olmasdr... Ayn karakter dizisinin tekrar kullanlmas gerekg ti inde Python bunun iin bellekte yeni bir nesne daha oluturuyor... g s Peki neden Python, rne in, 100 saysn ve python karakter dizisini nbelleklerken 1000 g saysn ve python gl ve kolay bir programlama dilidir karakter dizisini nbelle e almyor. g Sebebi su: Python kendi i mekanizmasnn ileyii gere ince ufak nesneleri nbelle e s s g g alrken byk nesneler iin her defasnda yeni bir depolama ilemi yapyor. s Isterseniz Python asndan ufak kavramnn snrnn ne olabilece ini syle bir kod yardmyla sorgulayabiliriz: g
>>> for k in range(1000): ... for v in range(1000): ... if k is v: ... print k

Bu kod 1000 aral ndaki iki say grubunu karlatrp, kimlikleri ayn olan saylar ekrana g s s dkyor... Yani bir bakma Pythonun hangi sayya kadar nbellekleme yapt n gsteriyor. g Burada ald mz sonuca gre syle bir denetleme ilemi yapalm: g s
>>> a = 256 >>> a is 256 True >>> a = 257 >>> a is 257 False

Dedi imiz gibi, id() fonksiyonu ve dolaysyla is ileci, nesnelerin kimliklerini denetler. g s rne in bir listenin kimli ini syle denetleyebiliriz: g g
>>> liste = ["elma","armut","kebap"] >>> id(liste) 3082284940L

Bunu baka bir liste zerinde daha deneyelim: s


>>> liste2 = ["elma","armut","kebap"] >>> id(liste2) 3082284172L

Grd nz gibi, ierik ayn oldu u halde iki listenin kimli i birbirinden farkl... Python bu iki g g g listeyi bellekte iki farkl adreste depoluyor. Ama bu listelerin ait oldu u veritipi (yani list), g bellekte tek bir adreste depolanacaktr. nk bir nesnenin veritipinin kendisi de balbana s s bir nesnedir. Nasl liste2 nesnesinin kimlik numaras, bu nesne ortalkta oldu u srece ayn g kalacaksa, btn listelerin ait oldu u byk list veritipi nesnesi de tek bir kimlik numarasna g sahip olacaktr...

>>> id(type(liste)) >>> 3085544992L >>> id(type(liste2)) 3085544992L

Bu iki kt ayndr, nk Python list veritipi nesnesi iin bellekte tek bir adres kullanyor. Ama ayr listeler iin ayr adres kullanyor... Ayn durum tabii ki teki veritipleri iin de geerlidir. Mesela dict veritipi (szlk)
>>> sozluk1 = {} >>> id(sozluk1) 3082285236L >>> sozluk2 = {} >>> id(sozluk2) 3082285916L

Ama tpk list veritipinde oldu u gibi, dict veritipinin nesne kimli i de hep ayn olacaktr: g g
>>> id(type(sozluk1) 3085549888L >>> id(type(sozluk2) 3085549888L

Peki biz bu bilgiden nasl yararlanabiliriz? Syle: is ilecini do rudan iki nesnenin kendisini s g karlatrmak iin kullanamasak da bu nesnelerin veritipini karlatrmak iin kullanabiliriz. s s s s Mesela syle bir fonksiyon yazabiliriz:
# -*- coding: utf-8 -*def karsilastir(a,b): if type(a) is type(b): print "Bu iki nesne ayn veritipine sahiptir" print "Nesnelerin tipi: %s"%(type(a)) else: print "Bu iki nesne ayn veritipine sahip DELDR!" GI I print "ilk argmann tipi: %s"%(type(a)) print "ikinci argmann tipi: %s"%(type(b))

Burada if type(a) is type(b): satr yerine, tabii ki if id(type(a)) == id(type(b)): da yazlabilir... nk is ileci, dedi imiz gibi, iki nesnenin kimlikleri zerinden bir sorgulama ilemi s g s yapyor. is ilecini veritipi karlatrmas yapmak iin isterseniz su sekilde de kullanabilirsiniz: s s s
>>> if type(a) is dict: ... sonuca gre bir ilem... s >>> if type(b) is list: ... sonuca gre baka bir ilem... s s

>>> if type(c) is file: ... sonuca gre daha baka bir ilem... s s

is ilecini ayn zamanda bir nesnenin None de erine e olup olmad n kontrol etmek iin s g s g de kullanabilirsiniz. nk None de eri bellekte her zaman tek bir adreste depolanacak, g dolaysyla bu de ere gnderme yapan btn nesneler iin ayn bellek adresi kullanlacaktr: g
>>> if b is None: ... .......

gibi... Szn z, is ileci iki nesne arasnda ierik karlatrmas yapmak iin gvenli de ildir. s s s g nk Python baz nesneleri (zellikle ufak boyutlu nesneleri) nbelle ine alrken, baz nesg neler iin her defasnda farkl bir depolama ilemi yapmaktadr. s Ierik karlatrmas iin == s s veya != ilelerini kullanmak daha do ru bir yaklam olacaktr. s g s

BLM

28

Windowsta Python YOL a (PATH) Eklemek

GNU/Linux kullananlarn Pythonn etkileimli kabu una ulamak iin yapmalar gereken tek s g s sey komut satrnda python yazp ENTER tuuna basmaktr. nk GNU/Linux da tmlar s g Python paketini sisteme eklerken, altrlabilir Python dosyasn da /usr/bin klasr iine s atar. Bu sayede GNU/Linux kullananlar zahmetsiz bir sekilde Python kurcalamaya balaya s bilirler... Ama Windows kullananlar iin ayn seyi syleyemiyoruz. nk Windows kullanan lar http://www.python.org adresinden Python programn indirip bilgisayarlarna kurduklarnda Python otomatik olarak YOLa (PATH) eklenmiyor. Bu durumu su sekilde teyit edebiliriz: 1. Balat > altr yolunu takip edin. s s 2. Alan kutucu a cmd yazp ENTER tuuna basn. g s Bylece Windows komut satrna ulam olduk. s s 3. Windows komut satrnda python yazp ENTER tuuna basn. s 4. Syle bir hata mesaj almsanz, Python YOLa eklenmemi demektir: s s
python i ya da d komut, altrlabilir s s program ya da toplu i dosyas olarak tannmyor. s

Bu durumda Pythonn etkileimli kabu una ulamak iin iki yolunuz var: s g s Birincisi, Windows komut satrnda Pythonn tam yolunu belirteceksiniz:
c:/python26/python.exe

Ikincisi, Balat > Programlar > Python 2.x > Python (Command Line) yolunu takip edeceksiniz. s Birinci yntem olduka meakkatli ve skcdr. Her program altrnzda bu kodu girmek s s s zamanla eziyete dnebilir. Bu sekilde; s
python program_ad

yazarak programnz altrma imkannz da olmayacaktr. Daha do rusu, bu imkan elde s g etmek iin Windows komut satrna daha fazla kod yazmanz gerekecek. Yani Pythona ulamak s iin, komut satrna her defasnda Pythonn ve/veya kendi programnzn tam yolunu yazmak zorunda kalacaksnz.

409

Ikinci yntem kolaydr, ancak etkileimli kabu a bu sekilde ulamann baz dezavantajlar bus g s lunur. rne in bu sekilde kabu a ulat nzda Python istedi iniz dizin iinde balatamam g g s g g s s oluyorsunuz. Bu sekilde Pythonn etkileimli kabu u, Pythonn kurulu oldu u C:/Python2x s g g dizini iinde alacaktr. Etkileimli kabuk akken hangi dizinde oldu unuzu srasyla su kos g mutlar vererek renebilirsiniz: g
>>> import os >>> os.getcwd()

Etkileimli kabu u istedi iniz dizinde aamad nz zaman, rne in masastne kaydetti iniz s g g g g g bir modle ulamak iin biraz daha fazla u raacaksnz demektir. s g s GNU/Linux kullanclar ise, zellikle KDEyi kullananlar, herhangi bir dizin iinde bulunan bir Python programn altrmak iin, o programn bulundu u dizine girecek ve orada F4 tuuna s g s basarak bir komut satr aabilecektir. Bu aamada sadece python yazp ENTER tuuna basarak s s etkileimli kabukla oynamaya balayabilecekler. ste bu yazmzda buna benzer bir kolayl a s s I g Windowsta nasl ulaabilece imizi anlataca z. Yani bu yazmzda, Windowsta sadece python s g g komutunu vererek nasl etkileimli kabu a eriebilece imizi renece iz. s g s g g g ncelikle Windowsun masastndeki Bilgisayarm simgesine sa tklyoruz. g

Bilgisayarm simgesine sa tkladktan sonra alan mennn en altnda yer alan zelliklere g (Properties) giriyoruz. Bu girdi imiz yerde Gelimi (Advanced) adl bir sekme grece iz. Bu sekmeyi ayoruz. g s s g

Gelimi sekmesine tklad mzda karmza syle bir ekran gelecek: s s g s

Burada evre De ikenleri (Environment Variables) d mesine tklyoruz. Bu d meye tkgs g g lad mzda syle bir pencere alacak: g

Bu ekranda Sistem De ikenleri (System Variables) blmnde yer alan liste iinde Path gs esini buluyoruz. Listedeki eler alfabe srasna gre dizildi i iin Pathi bulmanz zor olg g g mayacaktr. Path esi seili iken, Sistem de ikenleri blmndeki Dzenle (Edit) d mesine tklyg gs g oruz. Karmza syle bir sey geliyor: (Aa daki ekran grntsnde Sistem De ikenleri s s g gs blmndeki Path esini de listede grebilirsiniz...) g

Bu ekrandaki listenin en sonunda grnen ;C:\Python26 esini ben ekledim. Siz de listenin g sonuna bu eyi ayn sekilde ekleyeceksiniz. Yalnz tabii ki, benim sistemimde Python2.6 kug rulu oldu u iin oraya ;C\Python26 yazdm. Sizdeki srm farkl olabilir. Sizdeki srmn tam g adn renmek iin C:/ dizinini kontrol edebilirsiniz. Benim sistemimde C:/ dizini altndaki g Python klasrnn ad Python26. Bu klasrn ad sizdeki srme gre farkllk gsterebilir. Do ru srm numarasn gerekli yere yazdktan sonra Tamam d melerine basarak tekrar g g masastne dnyoruz. Simdi Balat > altr (Start > Run) yolunu takip ediyoruz. Alan kutucu a cmd yazp ENTER s s g tuuna bastktan sonra karmza Windows komut satr gelecek. Burada artk python komus s tunu vererek Pythonn etkileimli kabu una ulaabiliriz. s g s

Etkileimli kabuktan kmak iin nce CTRL+Zye, ardndan da ENTERe basyoruz. Artk, cmd ile s ulat mz bu komut satrnda su komutu vererek Python programlarn altrabiliriz: s g s
python program_ad

Windows komut satr Pythonn Windowsta sundu u komut satrndan biraz daha yeteneklidir. g cmd komutu ile ulat nz ekranda kopyalama/yaptrma ilemleri de yapabilirsiniz. s g s s Yukarda Pythonn altrlabilir dosyasn (executable) sistem YOLuna nasl ekleyece imizi s g rendik. Ancak o u zaman sadece bu dosyay YOLa eklemek yeterli olmayacaktr. Sadece g g altrlabilir dosyay YOLa ekledi inizde Python komut satrndan altrabilirsiniz, ancak s g s baka baz modllerin de alabilmesi iin Scripts adl dizini de YOLa eklemenizi tavsiye eds s erim. Bu dizini YOLa eklemek olduka basittir. Bu dizini YOLa eklemek iin yukardaki admlar tekrar ediyoruz ve ;C:\Python26\Scripts satrn da kutucu a ekliyoruz. g Bu konuyla ilgili herhangi bir sorunuz olmas halinde kistihza [et] yahoo [nokta] com adresine yazabilirsiniz...

BLM

29

PEP 3000

Ba lg PEP 3000 Python 3000 s Adresi http://www.python.org/dev/peps/pep-3000/ Yazar Guido Van Rossum Yazlma Tarihi 5 Nisan 2006 s Son Degi iklik 18 Mart 2008 Trkesi Frat zgl Not: evirmenin Notu: PEPin alm Python Enhancement Proposal, yani Pythonu Gelitirme nerileridir. Adndan da anlalaca gibi PEPlerin ilevi Pythonun geliimine k s s g s s s tutmaktr. PEPler Python toplulu una eitli konularda bilgi vermenin yansra, Pythona ilikin g s s bir zelli i veya zellik nerisini de tarif eder. PEPler genellikle teknik bir dil kullanlarak yazlr. g Aa daki metin, yukarda adresi verilen PEP 3000in evirisidir. s g

29.1 zet
Bu PEP Python 3000in gelitirilmesine ilikin bir klavuz niteli indedir. Tercihen, ilk olarak sre s s g zerinde uzlalmal, zellikler konusu ancak sre kararlatrlp kesinletirildikten sonra irdes s s lenmeye balanmaldr. Ama uygulamada zelliklerle srecin bir arada ele alnd na sahit olas g ca z. o unlukla belirli bir zellik zerinde yrtlen tartmalar, srecin de sorgulanmasna g g s yol aacaktr.

29.2 Adlandrma
Python 3000, Python 3.0 ve Py3K ayn seyin addr. Projenin ismi Python 3000 veya ksaca Py3kdr. Asl Python srm Python 3.0 olarak adlandrlacak, python3.0 -V komutunun kts da bu olacaktr. Dosya adlandrmalarnda ise, Python 2.x srmlerinde tutulan yol benimsenecektir. altrlabilir dosya iin yeni bir ad nermek veya Python kaynak dosyalarnn s uzantsn de itirmek istemiyorum. gs

416

29.3 PEPlerin Numaralandrlmas


Python 3000e ilikin PEPler PEP 3000 ile balar. 3000-3099 aras PEPler st-PEPler olup; buns s lar srece ilikin veya bilgi amal PEPlerdir. 3100-3999 aras PEPler zellikler zerinedir. PEP s 3000 (u anda okudu unuz PEP) ise zel bir duruma sahiptir: PEP 3000, Python 3000e ilikin s g s btn st-PEPlerin st-PEPidir. (Baka bir deyile bu PEP, srelerin nasl tanmlanaca na s s g ilikin sreci tarif eder). PEP 3100 de zel bir PEPtir: Bu PEP; asl Python 3000 srecine girs ilmeden nce Python 3000 iinde yer almas kararlatrlm (ya da yer almas mit edilen) s s zellikleri ieren bir yaplacaklar listesi gibidir. Son olarak, PEP 3099 ise, de imeyecek gs zellikleri sralar.

29.4 Takvim
Python 2.6 ve 3.0a ilikin srm takvimini ieren PEP 361e baknz. Bu srmlerin yaynlanma s tarihleri baaba gitmektedir. s s Not: Standart kitaplk geliiminin 3.0a1den sonra sratlenmesi beklenmektedir. s Python 2.x ve 3.x srmlerinin bir sre birbirine paralel gitmesini bekliyorum. Python 2.x srmleri, hata dzeltmelerini ieren geleneksel 2.x.y srmlerine kyasla daha uzun bir sre boyunca yaynlanmaya devam edecektir. Normalde 2.(x+1) srm kt anda 2.x iin hata g dzeltme srm yaynlamay brakyoruz. Ama 3.0 (son srm) ktktan sonra bile en az bir veya iki 2.x srmnn yaynlanaca n tahmin ediyorum. Hatta bu durum 3.1 veya 3.2 g srmlerine kadar devam edebilir. Bunun ne kadar devam edece i 2.x deste inin srdrlmeg g sine ynelik olarak topluluktan gelen taleplere, 3.0 srmnn kabul grp kararl bir hale gelmesine ve gnlllerin tahamml snrlarna ba ldr. g Python 3.0dan sonra, Python 3.1 ve 3.2nin knn 2.x serisine kyasla ok daha abuk s olaca n tahmin ediyorum. Topluluk 3.x srmlerine altktan sonra 3.x srm yaynlama g s dngs rayna oturacaktr.

29.5 Uyumluluk ve Gei s


Python 3.0 ile Python 2.x arasnda geriye dnk bir uyumluluk olmayacaktr. Python 2.6 ile yazlm kodlarn Python 3.0 altnda hibir de iikli e u ramadan alaca nn s gs g g s g teminat yoktur. Hatta bir kodun bir blmnn dahi alaca sylenemez. (Tabii ufak da olsa s g alacak ksmlar vardr, ama ana ilevinden yoksun olarak...) s s Python 2.6 ileriye dnk uyumlulu u su iki sekilde sa layacaktr: g g
Python 2.6 srmnde, Python 3.0da artk almayacak zellikler hakknda (mesela s range() fonksiyonunun dn de erinin liste oldu unu varsayarak) dinamik sekilde (yani s g g alma esnasnda) uyar verecek olan bir Py3k uyar kipi yer alacaktr. s Py3kya ait pek ok zellik (normalde 2.xte hata verecek szdizimleridir bunlar) Python 2.6ya geri tanacak, bu zellikler ya __future__ modl aracl yla ya da eski ve yeni s g szdizimi yan yana kullanlarak etkinletirilebilecektir. s

2.6 srmndeki ileriye dnk uyumluluk zelliklerinin yerine veya bunlara ek olarak ayr bir kaynak kod dntrme arac da olacaktr [1]. Bu ara, ba lamdan ba msz olarak kaynaktan s g g kayna a dntrme ilemi yapabilecek, rne in apply(f, args) fonksiyonunu f(*args) sekline g s s g dntrebilecektir. Ancak tabii ki bu ara veri ak analizi veya tip karsamas yapamaz. s s

Yani bu ara yukardaki gibi bir apply fonksiyonu grd nde, bunun o bildi imiz eski gml g g fonksiyon oldu unu varsayacaktr. g Python 2.6 ve 3.0 srmlerini birlikte desteklemesi gereken bir proje iin nerilen gelitirme s modeli aa daki gibidir: s g 0. Neredeyse tam kapsaml, kusursuz birim testleri hazrlayn. 1. Projenizi Python 2.6ya aktarn. 2. Py3k uyar kipini an. 3. Uyar kalmayncaya kadar test edin ve kodu dzenleyin. 4. Bu kaynak kodunu 3.0 srmnn szdizimine dntrmek iin 2to3 aracn kullann. s kty elle dzenlemeyin! 5. Dntrlm kaynak kodunu 3.0 srm altnda test edin. s s 6. E er sorunla karlarsanz, dzeltmeleri kaynak kodunun 2.6 srm zerinde yapn ve g s s 3. basama a geri dnn. g 7. Srm yaynlama vakti geldi inde 2.6 ve 3.0 iin ayr tar dosyalar (veya srmler iin g hangi arivleme biimini kullanyorsanz onu) hazrlayn. s Programnzn 2.6 srm iin verece iniz deste i salt bakm seviyesine getirene kadar 3.0 g g kaynak kodunun dzenlenmesi tavsiye edilmez (yani 2.6 kodunu bakm dalna aktaraca nz g ana kadar). Not: Gei srecine ilikin konular ayrntl olarak tarif eden bir st-PEPe ihtiyacmz var. s s

29.6 Gerekleme Dili (Implementation)


Python 3000 C dilinde gereklenecek, yeni srm, Python 2 kod tabanndan evrilecektir. Bu yaklam, batan aa yeniden yazmann tehlikeleri hakkndaki (Joel Spolsky[2] ile pays s s g lat m) grlerimden kaynaklanmaktadr. Python 3000 Python 2 zerinde yaplm nispeten s g s s orta dzeyli bir iyiletirme almas oldu u iin dili batan aa yeniden yazmaya kalks s g s s g s mazsak ok sey kazanrz. Ben bir yandan da sfrdan gerekleme almalarna giriilmesine s s kar de ilim, ama benim kendi abalarm en iyi bildi im dile ve gereklemeye ynelik olacaks g g tr.

29.7 st-Katklar
Bu PEP iin yaplacak ilave metin nerileri, yazar tarafndan memnuniyetle karlanacaktr. s Yukarda anlan ve anlmayan konulara ilikin taslak seklindeki st-PEPler ise daha da makbule s geecektir!

29.8 Kaynaklar
[1] subversion test alannda (sandbox) bulunan 2to3 arac [2] Joel on Software: Katiyen Yapmamanz Gereken Seyler, Blm I [3] PEP 361 (Python 2.6 ve 3.0 iin Srm Takvimi)

29.9 Telif Hakk


Bu belge kamuya almtr. s

BLM

30

Python ve OpenOfce

Not: Bu makale henz taslak halindedir. Zamanla bu makale iindeki bilgiler gelitirilecek ve s buraya yeni bilgiler de eklenecektir. E er bu makaleye katkda bulunmak veya makalede bulg du unuz hatalar bildirmek isterseniz kistihza [at] yahoo [nokta] com adresinden bana ulaag s bilirsiniz. o u kimsenin bildi i gibi, Sun Microsystems rmasnn etkin deste iyle gelitirilen OpenOfg g g s ce adl bir zgr yazlm, Microsoft rmasnn zgr olmayan os paketine alternatif olarak bilgisayarlarmzda kullanabiliyoruz. OpenOfce hem GNU/Linuxta hem de Windowsta alas biliyor. zellikle GNU/Linux kullanclar, OpenOfcenin GNU/Linuxtaki birincil ve en gelimi s s os paketi olmasndan tr, OpenOfceyi Windows kullanclarna nazaran ok daha yakndan tanr... Biz bu blmde OpenOfce ve Pythonu nasl ba datrabilece imizi, Pythonu g s g kullanarak OpenOfce belgelerini nasl ynetebilece imizi renmeye alaca z. g g s g OpenOfce; Writer, Calc ve br os bileenlerini ynetmek, evirip evirmek, dzenlemek s veya de itirmek iin programclara olduka gelimi bir API (uygulama programlama arayz) gs s s sunuyor. OpenOfce APIsinin zelli i dilden ba msz olmasdr. Yani farkl programlama dilg g lerini kullanan programclar (rne in C++, Java, Python, CLI, StarBasic, JavaScript, OLE prog gramclar), OpenOfce APIsine erierek os bileenlerini ynetebilirler... s s APIye eriebilmek iin UNO (Universal Network Objects Evrensel A Nesneleri) adl bileen s g s modelinden faydalanyoruz. Farkl programlama dilleri, kendilerine zg bir UNO kprs (UNO bridge) kullanarak OpenOfcenin UNO bileenlerine ve dolaysyla OpenOfcenin APIsine ers iebilirler. Su anda kullanlabilecek olan UNO kprleri syle listelenebilir: s
Uno/Binary Uno/CLI Uno/Cpp Uno/Delphi Uno/Java Uno/OLE Uno/PyUno Uno/Remote Perl Uno

420

Tcl Uno

Grd nz gibi, listede Uno/PyUno da var. g Isminden de anlalaca gibi, bu kpr, Python s g ile OpenOfcenin bileen modeli arasnda ba lant kurabilmemizi sa lyor. s g g

30.1 PyUnonun Kurulumu


Daha nce de dedi imiz gibi, Python ve OpenOfceyi birlikte kullanabilmek iin PyUno adl g bir yazlma ihtiyacmz olacak. O halde isterseniz bu yazlmn sistemimize nasl kurulaca n g inceleyelim ilk i olarak. Bu ilemin nasl yaplaca n GNU/Linux ve Windows iin ayr ayr s s g inceleyece iz. nce GNU/Linuxtan balayalm. g s GNU/Linux PyUno, OpenOfce ile birlikte gelen bir modldr. O yzden PyUnoyu bilgisayarnza kurmak iin herhangi bir ilem yapmanza gerek yok. E er sisteminizde OpenOfce kurulu ise PyUno s g da kuruludur. PyUnonun kurulu olup olmad n denetlemek iin Pythonun etkileimli kabu unda su komutu g s g verebilirsiniz:
>>> import uno

E er hibir sey olmadan bir alt satra geiliyorsa, PyUno modl sisteminizde kurulu demektir. g E er yukardaki komut bir hata mesaj veriyorsa okumaya devam edin... g Benim kulland m iletim sistemi Ubuntu Jaunty Jackalope. g s O yzden ben bu yazda PyUnonun Ubuntu zerine nasl kurulaca n anlataca m. Baka GNU/Linux da tmlarn kulg g s g lananlar, kendi paket yneticileri aracl yla aa da anlattklarma benzer ilemleri gerekg s g s letirebilirler... s nce Ubuntu paketleri arasnda kk bir aratrma yapalm. Acaba PyUno paketinin tam ad s neymi? s
aptitude search uno

Bu komut bize suna benzer bir kt verir:


plasma-widget-fortunoid python-uno python2.6-uno uno-libs3 uno-libs3-dbg unoconv

Burada python-uno ve python2.6-uno adl iki farkl paket gryoruz. E er python2.6-uno g paketini kurarsanz, PyUnonun Python 2.6ya uygun srm kurulacaktr. python-uno paketi ise, sistemdeki en yeni resmi Python srm hangisiyse bilgisayarnza ona uygun olan PyUno paketini kuracaktr. Su an itibariyle Ubuntu Jaunty Jackalopedeki en yeni resmi Python srm 2.6 oldu u iin, python-uno, bilgisayarmza PyUnonun Python 2.6 ile uyumlu olan srmn g kuracaktr. Dolaysyla python-uno ve python2.6-uno bugn itibariyle ayn paketleri kurar... Tabii siz bu yazy okurken Ubuntuda iler de imi olabilir... Ancak o u durumda en iyi yol s gs s g python-uno adl paketi kurmak olacaktr. O halde hemen bu paketi sistemimize kuralm:
sudo apt-get install python-uno

Bu komut, PyUno adl paketi bilgisayarmza kuracaktr. Ancak bata da dedi imiz gibi, PyUno s g OpenOfce ile birlikte geldi i iin, muhtemelen bu ilemi yapmak zorunda kalmayacaksnz. g s

Microsoft Windows Microsoft Windows iletim sisteminde de PyUno paketi OpenOfce kurulumu ile birlikte geliyor. s Dolaysyla e er sisteminizde OpenOfce kurulu ise baka herhangi bir sey kurmanza gerek g s yok. OpenOfceyi ise http://www.openofce.org/ adresinden indirebilirsiniz. E er kurulum aamasn baaryla getiysek emin admlarla yolumuza devam edebiliriz. g s s

30.2 OpenOfceyi mode)

Dinleme

Kipinde

Amak

(listening

Pythonu kullanarak OpenOfce ile herhangi bir ilem yapabilmek iin atmamz gereken ilk s adm OpenOfceyi dinleme kipinde amak olmaldr... Bu sayede Pythonla yapt mz ilemg s lerin OpenOfce tarafndan alglanmasn sa layaca z. g g Bu ilemi srasyla GNU/Linuxta ve Windowsta nasl yapaca mz grelim... Bu arada, aa da s g s g anlatacaklarm GNU/Linux ve Microsoft diye ayrm olsam da, hangi iletim sistemini kuls s lanyor olursanz olun hem GNU/Linux hem de Windows aklamalarn okumalsnz. nk GNU/Linux blmnde Windows kullanclarnn da iine yarayacak bilgiler bulundu u gibi, Wins g dows blmnde GNU/Linux kullanclarnn iine yarayacak bilgiler de yer alyor... s GNU/Linux OpenOfceyi dinleme kipinde aabilmek iin -accept adl bir parametreden faydalanaca z. g Bu parametre hakknda ksa bir bilgi almak iin konsolda su komutu verebilirsiniz:
soffice -h

Bu komutun kts iinde su satrlar greceksiniz:


-accept=<accept-string> Specify an UNO connect-string to create an UNO acceptor through which other programs can connect to access the API

Buradan anlad mza gre, -accept parametresi, baka programlarn OpenOfce APIsine g s ba lanmak iin kullanabilece i bir ba lant kabul etme mekanizmas (baka deyile bir UNO g g g s s alcs) oluturulmasn sa lyor... s g Yine yukardaki ksa bilgiden anlyoruz ki, OpenOfce APIsine ba lanmada kullanaca mz g g kabul mekanizmasn oluturabilmek iin bir UNO ba lant dizisi, yani UNO aracl yla s g g OpenOfce APIsine ba lanmamz sa layacak bilgileri ieren bir karakter dizisi de belirg g lememiz gerekiyor. OpenOfce APIsine ilikin resmi klavuzun syledi ine gre bu ilemi yapabilmek iin OpenOfs g s ceyi su sekilde balatmamz gerekiyor: s
soffice -accept=socket,host=0,port=2002;urp;

Bu komutu alp oldu u gibi kullanamyoruz. Bunu konsola yazmadan nce su sorunu zmemiz g gerek: Yukardaki parametre iinde grd mz ; iaretini Unix kabu unun farkl alglamasndan g s g tr, yukardaki komut OpenOfceyle ba lant kurmamz sa layamayacaktr. Unix kabu ug g g nun bize sorun karmamas iin yukardaki parametreyi trnak iine almamz yeterlidir. Yani komutumuzu syle yazaca z (Bu arada, bu komutu vermeden nce sistemde hibir OpenOf g ce belgesinin ak olmamasna dikkat ediyoruz)

soffice -accept="socket,host=0,port=2002;urp;"

Dilerseniz bu komuttaki parametreleri teker teker incelemeye alalm: s sofce: Bu ifadenin ne ie yarad n biliyoruz. Sistemimizdeki OpenOfceyi s g altrmamz sa layan dosyann ad sofcedir. s g -accept: Bu parametrenin ne oldu unu da biraz nce grmtk. Bu parameg s tre temel olarak, OpenOfcenin kendisine gelen ba lant giriimlerini kabul g s etmesini sa lyor. OpenOfce, gvenlik gerekesiyle, varsaylan olarak hi bir g ba lant giriimini kabul etmez. g s socket: Bu ifade, OpenOfceye ba lanrken kullanaca mz ba lant tipini gsg g g teriyor. Biz burada bir soket ba lants kurmay deniyoruz... soket, sunucu g ve istemci arasnda ift ynl ba lant kurmamz sa layan bir mekanizmadr. g g host: Bu parametre, OpenOfcenin dinleyece i konak sistemin adn veya IP nug marasn gsteriyor. Bu parametreye 0 veya localhost de erlerini verebiliriz. g 0 de eri, msait olan btn a arayzleri zerinden dinleme ilemi gerekg g s letirilmesini sa lar. Yukardaki komutta host=0 yerine host=localhost da s g yazabiliriz... port: Bu parametre, OpenOfce ile ba lanty hangi port zerinden gerekletireg s ce imizi belirtmemizi sa lyor. Biz burada, resmi klavuzun nerisine uyarak, g g 2002 portunu kullandk. urp: Bu ifade, Uno Remote Protocol teriminin ksaltmasdr. Bu terim Trkede Uno Uzak Ba lant Protokol anlamna gelir ve kurulacak ba lantnn hangi g g protokol zerinden gerekletirilece ini ifade eder. s g Ksacas yukardaki komut yardmyla, OpenOfceye 2002 portu zerinden bir soket ba lang ts gerekletirerek Uno Uzak Ba lant Protokol (URP) aracl yla OpenOfcenin bizi dinles g g meye almasn sa ladk. Bu arada, e er bu komutu verdikten sonra unable to get gail verg g sion number gibi bir hata alrsanz, bunu nemsemeyin... Ancak bu komutu verdikten sonra e er Could not nd a Java Runtime Environment gibi bir hata mesaj alyorsanz su komut g yardmyla gerekli paketi sisteminize kurmalsnz:
sudo apt-get install openoffice.org-java-common

sofce -accept=socket,host=0,port=2002;urp; komutu verildikten sonra bo bir OpenOfs ce Writer belgesi alacaktr. Bu belgeyi kapatmadan yolumuza devam edelim... Ama nce Windows kullanclarnn durumunu bir gzden geirelim. Microsoft Windows Windows kullananlar, yukarda GNU/Linux kullanclarnn verdi i sofce -accept... komug tunu, OpenOfcenin kurulu oldu u dizin iinde verecek. Windowsta OpenOfce program g C:\Program Files\OpenOfce 3 dizini altnda bulunur. Bu dizinin iinde program adl bir baka dizin daha greceksiniz. ste sofce.exe dosyasnn bulundu u dizin burasdr... Simdi s I g Balat>Run yolunu takip ederek cmd komutunu veriyoruz ve Windowsun komut satrna s ulayoruz. Orada nce su komutu vererek C:\Program Files\OpenOfce 3\program dizinine s ulayoruz: s
cd C:\Program Files\OpenOffice.org 3\program

E er sizdeki OpenOfce dizini farklysa, yukardaki komutu ona gre dzenlemeniz gerekiyor. g Bu noktada, sistemimizde hibir OpenOfce belgesinin ak olmad ndan emin olmamz g gerekiyor. Ayrca Windowsta saat simgesinin yanna yerleen OpenOfce QuickStarter uygus

lamasnn da kapal olmas lazm. E er kapal de ilse bu uygulamay da kapatp su komutu g g veriyoruz:
soffice -accept=socket,host=localhost,port=2002;urp;

Bu komutu verdikten sonra OpenOfce alacaktr. E er ne tr bir belge amak istedi inizi g g soran bir ekranla karlarsanz Text Document (veya Bo Belge) seene ini iaretleyerek s s s g s bo bir metin belgesi an. s Yukardaki komuta ek olarak baz baka parametreler de verebilirsiniz. Verece iniz bu parames g treler OpenOfce programnn al seklini ekleyecektir: s
soffice -accept=socket,host=localhost,port=2002;urp; -nofirstwizard

Buradaki -norstwizard parametresi OpenOfcenin do rudan bo bir metin belgesi amasn g s sa layacaktr. Bu parametre sayesinde OpenOfcenin ne tr bir belge amak istersiniz? g sorusunu sormamasn sa lyoruz. g E er OpenOfcenin, ilk alrken karmza kan al ekrann (splashscreen) da grmek isg s s temiyorsak yukardaki komutu su sekilde de verebiliriz:
soffice -accept=socket,host=localhost,port=2002;urp; -nologo

Bylece OpenOfce program, al ekrann gstermeden alacaktr. E er ne al ekran s g s ne de ne tr belge? ekran grmek isterseniz yukardaki iki parametreyi birlikte de kullanabilirsiniz:
soffice -accept=socket,host=localhost,port=2002;urp; -nofirstwizard, -nologo

OpenOfceyi bu parametrelerle birlikte altrd nzda OpenOfcenin her zamankinden bis g raz daha hzl ald n greceksiniz... g Bu arada, yukardaki komutlarn GNU/Linuxtakinden biraz farkl oldu una dikkat edin. Bu kog mutu Windowsta verirken host=0 yerine host=localhost yazyoruz. Komutta host=0 yazmak Windowsta OpenOfce ile ba lant kuramamamza sebep olabiliyor... Ayrca Wing dowstayken socket,host=localhost,port=2002;urp; satrn trnak iine almamza gerek olmad na da dikkatinizi ekmek isterim... g

30.3 OpenOfceye Baglanmak


Bir nceki admda OpenOfceyi dinleme kipinde atk. Bu, atmamz gereken ilk admd. Simdi ise Python aracl yla OpenOfceye ba lanmay deneyece iz. Yine srasyla GNU/Linux ve g g g Microsoft kullanclarnn ne yapmas gerekti ini anlataca z. Tabii hangi iletim sistemini kulg g s lanrsanz kullann, her iki blm de dikkatle okumann zararn de il faydasn grrsnz... g GNU/Linux ncelikle Pythonun etkileimli kabu unu balatyoruz: s g s
python

Gayet gzel... Madem iimiz Uno ile, o halde hemen uno modln ie aktaralm: s
>>> import uno

Bylece uno modlnn btn nimetlerinden faydalanabilece iz... g

Biraz sonra, OpenOfceye nasl ba lanaca mz inceleyece iz. Bu konuya gemeden nce g g g dilerseniz, ba lant ileminin hangi aamalardan olutu unu grelim. Bu arada, aa da kulg s s s g s g lanaca mz kavramlara ok taklmayn. Bunlarn ne oldu unu biraz sonra aklayaca z: g g g
nce uno modln ie aktaryoruz, Ardndan Bileen Ba lamn ie aktaryoruz, s g Servis Yneticisi yardmyla OpenOfce ba lant servisini altryoruz, g s Daha sonra OpenOfceye ba lant kuruyoruz, g Ba lanty kurduktan sonra, en bata sofce komutuyla at mz OpenOfce belgesine g s g erimemizi sa layacak servisi altryoruz, s g s Hemen ardndan mevcut belgeye eriiyoruz, s Belge iinde bir imle oluturuyoruz, s Ve istedi imiz bir metni belgeye yazdryoruz. g

Simdi gelelim yukarda sralanan aamalar gerek hayata aktarmaya... s Bu noktada karmza Bileen Ba lam (Component Context) ad verilen bir kavram kyor. s s g Bileen Ba lam kavramn, btn bileenlerin bir arada bulundu u bir ortam olarak s g s g dnebiliriz. Simdi yapmamz gereken sey, bu bileen ba lamn ie aktarmak, yani bu s s g ba lam yerel ortammzda kullanlabilir hale getirmektir. Bu ilemi, uno modlnn getg s ComponentContext() adl metodu yardmyla gerekletirece iz: s g
>>> uno.getComponentContext()

Dilerseniz bu metodu bir de ikene atayalm, ki kullanmas kolay olsun: gs


>>> yerel = uno.getComponentContext()

Bileen ba lamn, yani btn bileenlerin bir arada bulundu u ortam kendi alma alanmza s g s g s aktard mza gre, bu noktadan sonra OpenOfceye ba lanmamz sa layacak olan UnoUrlg g g Resolver adl servise erimeye alabiliriz. UnoUrlResolveri kullanabilmek iin Servis Ys s neticisinden (yani ServiceManagerden) ve onun createInstanceWithContext() adl metodundan yararlanarak ba lant servisini alr hale getirece iz: g s g
>>> baglanti_servisi = yerel.ServiceManager.createInstanceWithContext( ... "com.sun.star.bridge.UnoUrlResolver", yerel)

Bir nceki admda Bileen Ba lamn yerel ortammza aktard mz iin, ServiceManagere s g g ve onun createInstanceWithContext() adl metoduna do rudan yerel ortammzn bir esi g g olarak eriebiliyoruz. Bu yzden komutumuzu yerel.ServiceManager... seklinde yazabildik. s Burada createInstanceWithContext() metodunun iki parametre ald na dikkat edin. g Ilk parametre UnoUrlResolver, ikinci parametre ise biraz nce hazrlad mz yerel adl de ikg gs endir... Bu arada, UnoUrlResolveri nasl kulland mza dikkat edin. com.sun.star.bridge g OpenOfce APIsinin elerinden biridir. g Ba lant servisini alr hale getirdikten sonra resolve() metodu yardmyla OpenOfceye g s ba lanma ilemini gerekletirece iz: g s s g
>>> baglanti = baglanti_servisi.resolve( ... "uno:socket,host=0,port=2002;urp;StarOffice.ComponentContext")

Burada resolve() metoduna verdi imiz parametrenin, en bata sofce -accept... komutuna g s verdi imiz parametreyle hemen hemen ayn oldu una dikkat edin. g g

Ba lanty kurduktan sonra, yine Servis Yneticisinin, yani ServiceManagerin createg InstanceWithContext() metodunu kullanarak mevcut belgeye erimemizi sa layacak olan s g Desktop adl servisi hazr hale getiriyoruz.
>>> belge_servisi = baglanti.ServiceManager.createInstanceWithContext( ... "com.sun.star.frame.Desktop", baglanti)

Hemen ardndan da mevcut belgeye eriiyoruz: s


>>> belge = belge_servisi.getCurrentComponent()

Artk, en bata sofce... komutuyla at mz Writer belgesi elimizin altnda. Bu belgeye s g mdahale edebilmek iin, bu belge iinde bir imle oluturmamz gerekiyor. Simdi bu imleci s oluturalm: s
>>> imlec = belge.Text.createTextCursor()

Son olarak belgeye bir metin yazdryoruz:


>>> belge.Text.insertString(imlec, "Elveda Zalim Dnya!", 0)

Simdi bir kenarda ak halde bekleyen Writer belgesine bakn bakalm iinde ne yazyor... Dilerseniz bu kodlar topluca grelim:
>>> import uno >>> yerel = uno.getComponentContext() >>> baglanti_servisi = yerel.ServiceManager.createInstanceWithContext( ... "com.sun.star.bridge.UnoUrlResolver", yerel) >>> baglanti = baglanti_servisi.resolve( ... "uno:socket,host=0,port=2002;urp;StarOffice.ComponentContext") >>> belge_servisi = baglanti.ServiceManager.createInstanceWithContext( ... "com.sun.star.frame.Desktop", baglanti) >>> belge = belge_servisi.getCurrentComponent() >>> imlec = belge.Text.createTextCursor() >>> belge.Text.insertString(imlec, "Elveda Zalim Dnya!", 0)

Microsoft Windows Hatrlarsanz, bir nceki admda OpenOfce programn balatabilmek iin, cd komutu s yardmyla C:\Program Files\OpenOfce.org 3\program dizini altna gitmi ve orada sofs ce.exe adl altrlabilir dosyay balatabilmek iin sofce komutunu vermitik... Yine s s s C:\Program Files\OpenOfce.org 3\program dizini altnda python.exe adl bir dosya greceksiniz. Bu, OpenOfce ile birlikte gelen Python srmdr ve sisteminizdeki asl Pythondan farkldr. Windowsta Pythonu OpenOfce ile birlikte kullanabilmek iin, OpenOfce ile birlikte gelen Python srmnden yararlanmamz gerekiyor. Sistemdeki br Python program Windowsta OpenOfce ile ba lant kurmamz sa layamaz... C:\Program Files\OpenOfce.org g g 3\program dizini altndayken komut satrnda python komutunu verirsek, OpenOfcenin iindeki Python srm almaya balayacaktr. E er arzu ederseniz, program dizini altns s g daki python.exe dosyasna ift tklayarak da OpenOfceye zg Python srmn balatas bilirsiniz. O halde simdi istedi imiz bir yntemi kullanarak Pythonun etkileimli kabu unu g s g balatalm. Orada su komutu veriyoruz: s

>>> import uno

Bu komutu verdi imizde Pythonun etkileimli kabu u sessizce bir alt satra geecektir. E er g s g g OpenOfce ile birlikte gelen Python srmn de il de, sisteminizdeki asl Python srmn g altrp import uno komutunu verdiyseniz Python size bu modln bulunamad na dair s g bir hata mesaj gsterecektir... O yzden Windowsta OpenOfce ile birlikte gelen Python srmn kullanmak byk nem tayor. s Simdi GNU/Linux blmnde anlatt mz gibi Bileen Ba lamn ie aktaryoruz: g s g
>>> yerel = uno.getComponentContext()

Bundan sonra, yine GNU/Linux blmnde anlatt mz sekilde gerekli servisleri balatabiliriz: g s
>>> baglanti_servisi = yerel.ServiceManager.createInstanceWithContext( ... "com.sun.star.bridge.UnoUrlResolver", yerel) >>> baglanti = baglanti_servisi.resolve( ... "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext") >>> belge_servisi = baglanti.ServiceManager.createInstanceWithContext( ... "com.sun.star.frame.Desktop", baglanti) >>> belge = belge_servisi.getCurrentComponent()

Su anda yapmamz gereken, belge iinde bir imle oluturup, bu imleci de kullanarak belge s iine bir karakter dizisi yazdrmaktr:
>>> imlec = belge.Text.createTextCursor() >>> belge.Text.insertString(imlec, u"Elveda Zalim Dnya!", 0)

Bu satrlarla ilgili daha geni aklamaya GNU/Linux blmnden ulaabilirsiniz. s s E er baglanti_servisi = yerel.ServiceManager.cre... satrnda bir hata alrsanz, *import g uno satrndan nce import socket komutuyla socket adl modl ie aktarmay deneyin. Ayrca GNU/Linux kodlaryla Windows kodlar arasndaki baz ufak farkllklar da gzden karmayn. rne in baglanti = baglanti_servisi.resolve(uno......) satrnda host=0 yerine g host=localhost yazd mza dikkat edin... g Bunun dnda, belgeye yazdrd mz Elveda Zalim Dnya! cmlesindeki Trke karakters g lerin dzgn grntlenebilmesi iin karakter dizimizi unicode olarak tanmlamay da unutmuyoruz. (uElveda Zalim Dnya!)

30.4 Karakter Biimlendirme


Grd nz gibi, OpenOfceyle ba lant kurup bo bir belgeye bir seyler yazdrmak o kadar g g s da zor de il. Biz bu ilk adm at mza gre artk OpenOfceye yazd mz metinleri biimg s g g lendirme konusunu incelemeye geebiliriz... Unutmayn, OpenOfceye ba lanmak iin kulland mz sey Python programlama dilidir. g g Dolaysyla Pythonun kendi zelliklerini kullanarak OpenOfce belgelerini ok rahat bir biimde evirip evirebiliriz. Mesela belgemize yeni satr veya sekme eklemek istersek Pythonun kendi aralar emrimize amadedir:

>>> belge.Text.insertString(imlec, u"Uzak... \t\tok uzak...", 0)

Burada, bu satra kadar olan kodlar halihazrda yazm oldu unuzu varsayyorum... s g Ayn sekilde \n ka dizisini kullanarak yeni bir satr da oluturabilirsiniz: s s
>>> belge.Text.insertString(imlec, u"Birinci satr\nIkinci satr\nnc satr", 0)

Mesela Pythonun datetime modln kullanarak bugnn tarihini belgemize yazdralm:


>>> import datetime >>> bugun = datetime.date.today() >>> belge.Text.insertString(imlec, "%s"%bugun, 0)

Bunun dnda, PyUno aracl yla OpenOfce belgelerindeki yazlarn koyu, yana yatk, alt s g izgili, st izgili, vb. sekillerde grnmesini de sa layabilirsiniz. Bu zellikler tek tek in g celeyelim:

30.4.1 Kaln Karakterler (bold)


OpenOfce belgesine yazdraca mz harerin koyu olabilmesi iin, setPropertyValue() adl g bir metottan yararlanaca z. setPropertyValue() imlecin bir metodudur. Bu ne demek oluyor? g Hemen bir rnek verelim... Hatrlarsanz, PyUno yardmyla OpenOfce belgelerine ba lant kurma aamasnda, isteg s di imiz bir metni belgeye yazdrmadan nce mutlaka bir imle oluturmamz gerekiyordu. Bu g s imleci syle oluturuyorduk: s
>>> imlec = belge.Text.createTextCursor()

ste oluturdu umuz bu imlecin setPropertyValue() adl metodunu kullanarak, metne I s g yazdrd mz harerin koyu olmasn sa layabilece iz: g g g
>>> imlec.setPropertyValue("CharWeight", 150)

Dilerseniz, daha anlalr olmas iin yukardaki kodlar bir rnek iinde kullanalm... s nce komut satrnda sofce komutuyla OpenOfceyi balatalm: s
soffice -accept="socket,host=localhost,port=2002;urp"

Ardndan Pythonu altralm. GNU/Linux kullanclar kendi sistemlerindeki Pythonu kullans abilir, ancak Windows kullanclarnn OpenOfce ile birlikte gelen Python srmn kullanmalar gerekiyor. Sistemimize uygun sekilde Pythonu balattktan sonra Pythonun etkileimli s s kabu unda su komutlar veriyoruz: g
>>> import uno >>> yerel = uno.getComponentContext() >>> baglanti_servisi = yerel.ServiceManager.createInstanceWithContext( ... "com.sun.star.bridge.UnoUrlResolver", yerel) >>> baglanti = baglanti_servisi.resolve( ... "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext") >>> belge_servisi = baglanti.ServiceManager.createInstanceWithContext( ... "com.sun.star.frame.Desktop", baglanti)

>>> belge = belge_servisi.getCurrentComponent() >>> imlec = belge.Text.createTextCursor() >>> imlec.setPropertyValue("CharWeight", 150) >>> belge.Text.insertString(imlec, "deneme", 0)

imlecin setPropertyValue() adl metodunu nasl kulland mza dikkat edin. Burada Charg Weight adl bir zellikten yararlandk. CharWeight bir karakterin kalnlk-incelik durumunu belirler. Grd nz gibi, setPropertyValue() metodu CharWeight dnda bir parametre g s daha alyor. Bu parametre temel olarak iki farkl de er alr: 100 ve 150. g 100 kaln olmayan karakter olutururken, 150 kaln karakter oluturur. s s

30.4.2 Yana Yatk Karakterler (italic)


Yukarda hareri kaln yazabilmek iin CharWeight adl bir zellikten yararlandk. Hareri yatk yazmak iin ise CharPosture adl bir zellikten yararlanaca z: g
>>> imlec.setPropertyValue("CharPosture", 1)

Hareri yana yatk yazabilmek iin setPropertyValue() metodunun ikinci parametresi olarak 1 de erini kullanyoruz. E er bu de eri 0 yapacak olursak harerimiz dz grnecektir... g g g

30.4.3 Alt izgili Karakterler (underline)


Alti izgili harer retmek iin ise CharUnderline adl bir zellikten yararlanaca z. Bu zellik, g 0dan 19a kadar (19 hari) olan saylar de er olarak alabilir. Bu zelli i temel olarak syle g g kullanyoruz:
>>> imlec.setPropertyValue("CharUnderline", 1)

Bu komut, yazdraca mz metnin altn izecektir. E er teki de erlerin ne ie yarad n g g g s g merak ediyorsanz syle bir betik yazabilirsiniz:
>>> import uno >>> yerel = uno.getComponentContext() >>> baglanti_servisi = yerel.ServiceManager.createInstanceWithContext( ... "com.sun.star.bridge.UnoUrlResolver", yerel) >>> baglanti = baglanti_servisi.resolve( ... "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext") >>> belge_servisi = baglanti.ServiceManager.createInstanceWithContext( ... "com.sun.star.frame.Desktop", baglanti) >>> belge = belge_servisi.getCurrentComponent() >>> imlec = belge.Text.createTextCursor() >>> for i in range(20):

... ...

imlec.setPropertyValue("CharUnderline", i) belge.Text.insertString(imlec, "%s deneme"%i, 0)

Bylece hangi saynn nasl bir alt izgi retti ini rahatlkla grebilirsiniz... g

30.4.4 st izili Karakterler (strikeout)


Harerin stn izmek iin CharStrikeout adl zellikten yararlanaca z: g
>>> imlec.setPropertyValue("CharStrikeout", 1)

Yukardaki komut, kelimenin stne tek izgi eker. E er 1 yerine 2 yazarsak, bu komut g kelimenin zerine ift izgi ekecektir. 0 de eri ise kelimenin zerinde herhangi bir izgi g olmayaca n gsterir. g

30.4.5 Yanp Snen Karakterler (ash)


E er yazdraca mz karakterlerin yanp snmesini istersek CharFlash adl bir zellikten g g yararlanabiliriz:
>>> imlec.setPropertyValue("CharFlash", True)

CharFlash, True ve False olmak zere iki farkl de er alr. E er Bu zelli i True de eriyle g g g g birlikte kullanrsak, yazdrd mz karakter (veya karakterler) yanp snecektir. False ise yanp g snmeyi iptal eder.

30.4.6 Glgeli Karakterler (shadow)


E er karakterlerimize glge efekti kazandrmak istersek CharShadowed adl bir zellikten g yararlanaca z: g
>>> imlec.setPropertyValue("CharShadowed", True)

Bu zellik de True ve False olmak zere iki farkl de er alr. g

30.4.7 i Bo Karakterler (contour) I s


E er ii bo karakterler retmek isterseniz CharContoured zelli inden faydalanabilirsiniz: g s g
>>> imlec.setPropertyValue("CharContoured", True)

Bu zellik de True ve False olmak zere iki farkl de er alr. g

30.5 Karakterleri Renklendirme


Yukarda karakterleri nasl biimlendirece imizi grdk. Simdi ise bu karakterleri nasl reng klendirece imize bakaca z. Bu blmde CharColor ve CharBackColor olmak zere, iki g g temel renklendirme zelli inden bahsedece iz. g g

30.5.1 CharColor
CharColor zelli i, karakterlerin kendi renklerine iaret eder. Dolaysyla bu zelli i kullanarak g s g bir karakterin kendi rengini de itirebiliriz. Bu zellik syle kullanlyor: gs
>>> imlec.setPropertyValue("CharColor", renk)

Burada renk ifadesinin yerine uygun bir renk kodu yazmamz gerekiyor. OpenOfce onluk say biimindeki renk kodlarn kabul eder. Normal olarak, renk kodlar o u yerde karmza g s onaltlk (hexadecimal) say biiminde kar. Dolaysyla internet zerindeki herhangi bir renk tablosundan alaca mz onaltlk say biimindeki renk kodlarn OpenOfcede kullanabilmek g iin ncelikle bunlar onluk sayya evirmemiz gerekir. Mesela renk kodlarn renmek iin http://html-color-codes.info/ adresinden yararlanabiliriz. g Bu adresteki renk paleti iinden herhangi bir renk seti imizde bu rengin kodu Selected color g code is: ifadesinin yanndaki kutucuk iinde gsterilecektir. Diyelim ki orada #0174DF kodunu grdk. Bu kodun 0174DF ksmn alp, bu onaltlk sayy onluk say sistemine evirmemiz gerekiyor. Bunu kodlarmz iine syle uygulayabiliriz:
>>> imlec.setPropertyValue("CharColor", int("0174DF", 16))

Burada int("0174DF", 16) kodu bir onaltlk say olan 0174DFyi onluk say sistemine evirecektir. 0174DF saysnn onluk sistemdeki karl 95455tir. Dolaysyla isterseniz nce s g sayy onluk sisteme evirip, ardndan elde edilen sayy yukardaki koda eklemeyi de tercih edebilirsiniz:
>>> imlec.setPropertyValue("CharColor", 95455)

Dilerseniz bu kodlar ba lam iinde gsterelim: g


>>> import uno >>> yerel = uno.getComponentContext() >>> baglanti_servisi = yerel.ServiceManager.createInstanceWithContext( ... "com.sun.star.bridge.UnoUrlResolver", yerel) >>> baglanti = baglanti_servisi.resolve( ... "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext") >>> belge_servisi = baglanti.ServiceManager.createInstanceWithContext( ... "com.sun.star.frame.Desktop", baglanti) >>> belge = belge_servisi.getCurrentComponent() >>> imlec = belge.Text.createTextCursor() >>> imlec.setPropertyValue("CharColor", int("0174DF", 16)) >>> belge.Text.insertString(imlec, u"renkli yaz", 0)

Bu kodlar yazd mzda, OpenOfce belgesi iindeki karakterlerin renklerinin seti imiz renge g g gre de iti ini grece iz... gs g g

30.5.2 CharBackColor
CharBackColor zelli inin kullanm CharColor zelli inin kullanmna ok benzer. Charg g BackColor zelli i yardmyla bir karakterin arkaplan rengini de itiriyoruz: g gs
>>> imlec.setPropertyValue("CharBackColor", int("BDBDBD", 16))

30.6 PyUno, Python ve OpenOfce Hakknda Bilgi Veren Kaynaklar


Python ve OpenOfce ilikisi zerine almak isteyenler interneti aratrdklarnda bu konu s s s zerine yazlm ayrntl ve aklayc belgelerin ok az oldu unu grecekler. Eldeki kstl s g kaynaklar da (tabii ki) Ingilizce. Trke olarak bu konu zerine bir seyler bulmak pek mmkn de il. Benim bu belgeyi hazrlamaktaki amacm, en azndan bu ie balayacak olanlara yol g s s gsterebilmektir. E er internet zerinde bu konuyla ilgili hangi kaynaklarn mevcut oldu unu merak ediyorsanz, g g birka tanesini hemen burada sralayalm: [0] DevGuide [1] udk.openofce.org [2] LucasManual

BLM

31

Pythonda Paket Kurulumu Kullanm

Not: Bu yaz Sayn Samet Aras tarafndan hazrlanmtr. s Bu blmde, Pythonda paket kurulumu ve kullanm anlatlacaktr. Python iin yazlm paketler The Python Package Index sayfasnda bulunur. s Ba lang s Pythonun resmi sitesindeki The Python Package Index adl sayfada suan 7788 adet paket bulunmaktadr. Ben bir tane paket setim, bu paket zerinden Pythonda Paket kurulumu kullanmn anlataca m. g Kurulum
sudo python setup.py --help

komutu ile paket hakknda bilgi edinebilirsiniz. rne in paket yazarn renmek istersek: g g
sudo python setup.py --author

komutunu kullanabiliriz. Anlatmda kullanaca m paket Richard Jones tarafndan yazlm. g s Paket yazarnn E-Posta adresini renmek istersek su komutu veriyoruz: g
sudo python setup.py --author-email

Siz --help komutu ile di er seeneklere de bakabilirsiniz. g Anlatm iin simple, elegant HTML/XHTML generation paketini ye ledim. g Paket ierigi
setup.py html.py PGK-INFO #kurulum dosyasdr. #paket dosyasdr. #bilgi dosyasdr.

Simdi kuruluma geelim:

433

samet@samet:~$ cd /home/samet/Masast/html-1.6 samet@samet:~/Masast/html-1.6$ sudo python setup.py install [sudo] password for samet: running install running build running build_py creating build creating build/lib.linux-i686-2.6 copying html.py -> build/lib.linux-i686-2.6 running install_lib copying build/lib.linux-i686-2.6/html.py -> /usr/local/lib/python2.6/dist-package byte-compiling /usr/local/lib/python.2.6/dist-packages/html.py to html.pyc running install_egg_info Writing /usr/local/lib/python2.6/dist-packages/html-1.6.egg-info samet@samet:~/Masast/html-1.6$

Burada sudo komutu vermeliyiz. Zira yetki engelleri ile karlaabiliriz. s s Kullanm Sz konusu paketi kurduk. Simdi kullanma de inelim: g
>>> from html import HTML >>> h = HTML() >>> p = h.p(Merhaba dnya !\n) >>> p.text(more text, escape=False) >>> h.p <HTML p 0x9432b0c> >>> print h <p>Merhaba dnya ! more text</p> <p>

from html import HTML satr ile, ykledi imiz paketi dhil ettik. g rnek Artk Pythonda paket kurulumu ve kullanmn biliyoruz. Simdi ykledi imiz paket ile bir g Python program yazalm. Szgelimi, bir HTML dosyas oluturalm, ierisine HTML paketimiz s yardmyla bir liste ekleyelim. Bir Python dosyas oluturalm: s
#!/usr/bin/env python #-*- coding:utf-8 -*-

HTML modln dhil edelim:


from html import HTML

Simdi HTML modln h isimli bir nesneye atayalm:


h = HTML()

Simdi HTML listemizi oluturalm: s

l = h.ol l.li(C) l.li(Python) l.li("JavaScript") print h

Yukarda liste oluturduk, ve ierisine 3 adet eleman ekledik (C, Python ve JavaScript). Kodlar s topluca grelim:
#!/usr/bin/env python #-*- coding:utf-8 -*from html import HTML h = HTML() l = h.ul l.li(C) l.li(Python) l.li("JavaScript") print h

Bildi iniz gibi, <ul> HTMLde liste oluturmaya, <li> ise eleman eklemeye yaryor. Burada ilk g s elemann C olmasnn nedeni, Pythonun da HTML gibi kodlar okumaya yukardan balamasdr. s Simdi bu program biraz daha gelitirelim. Oluturdu umuz listeyi ekrana yazdrmak yerine, s s g bir HTML dosyas oluturup ierisine ekleyelim: s
#!/usr/bin/env python #-*- coding:utf-8 -*from html import HTML h = HTML() l = h.ul l.li(C) l.li(Python) l.li("JavaScript") dosya = open("liste.html", "w") # liste.html dosyamz oluturuyoruz s dosya.write("<html>\n") # html balang s dosya.write("<head>\n") # head ksm dosya.write("</head>\n") # head biti s dosya.write("<body>\n") # body ksm dosya.write(str(h)+"\n") dosya.write("</body>\n") dosya.write("</html>") dosya.close() # liste ksm # body biti s # html biti s # dosya kapatld

Yukarda HTML modl sayesinde bir HTML listesi oluturduk ve liste.html isimli bir HTML s dosyas atk. Temel HTML komutlarn bizzat kendimiz ekledik. Akabinde:
dosya.write(str(h)+"\n")

Kodu ile HTML dosyamza listemizi dhil ettik. Artk Pythona modl dhil etmeyi, kullanmay ve program gelitirmeyi rendiniz. Bilgilerinizi pekitirmek ve ilerletmek asndan, The Python s g s Package Index ba lantsn sk sk incelemenizde fayda vardr. Szgelimi, bu modl kullanarak g bir HTML Code Generator uygulamas yapabilirsiniz.

BLM

32

reStructuredText

32.1 Giri s
Diyelim ki bir program yazdnz ve kullanclarnza yol gstermek amacyla, bu program iin bir kullanma klavuzu oluturmak istiyorsunuz. Ya da benim yapt m gibi, bir programs g lama dilini reten bir site iletiyor da olabilirsiniz. E er hazrlad nz belgeleri internet zg s g g erinde yaymlayacaksanz bu belgeleri HTML biiminde dzenlemeniz gerekir. ste bu noktada, I belgelendirme ilemi tam bir ileye dnr. nk yazd nz belgeleri internet zerinde s s g sergilenebilecek bir hale getirmek, asl belgeleri hazrlamaktan daha vakit alcdr. Yani asl yapmanz gereken ie ayraca nz zaman, siteyi yaymlanabilir hale getirmeye harcad nz s g g farkedersiniz. stelik tek tek hazrlad nz HTML belgelerinin bakmn yapmak da bir hayli g meakkatlidir. s Bunun dnda, oluturdu unuz belgeleri farkl biimlerde yaymlamak istedi iniz zaman da s s g g byk zorluklarla karlarsnz. rne in oluturdu unuz HTML belgelerini daha sonra PDF s s g s g olarak da okurlarnza sunmak isterseniz omzunuzdaki yk daha da artacaktr. ste bu noktada reStructuredText ya da ksa adyla rst devreye girer. E er belgelerinizi I g HTML veya herhangi baka bir biimde hazrlamak yerine rst biiminde hazrlarsanz, bu bels geleri daha sonra pek ok farkl biime dntrmek epey kolay olacaktr. Yani bir kez rst s biimli belge hazrladktan sonra bu belgeleri daha sonra isterseniz PDF, HTML ve ODT gibi biimlere dntrebilirsiniz. Peki bu rst denen sey tam olarak nedir? Gelin isterseniz bu s sorunun cevabn bulmaya alalm. s Bu soruyu ok ksa bir sekilde syle cevaplayabiliriz: reStructuredText bir metin iaretleme s dili/sistemidir. Peki metin iaretleme ne demek? Syle dnn: Diyelim ki elinizde dmdz s s bir metin var. Mesela syle bir sey:
Python Programlama Dili Python Kelimesinin Anlam Her ne kadar Python programlama dili ile ilgili ou grsel malzemenin g zerinde bir piton resmi grsek de, Python kelimesi aslnda ou g kiinin zannettii gibi piton ylan anlamna gelmiyor. Python s g Programlama Dili, ismini Guido Van Rossumun ok sevdii, Monty Python g adl alt kiilik bir ngiliz komedi grubunun Monty Pythons Flying Circus s I adl gsterisinden alyor.

436

Burada Python Programlama Dili bir st balktr. Python Kelimesinin Anlam ise bir alt s balk... Bunun altnda ise asl metin yer alyor. Simdi bu metni su hale getirelim: s
*********************** Python Programlama Dili *********************** Python Kelimesinin Anlam ========================= Her ne kadar Python programlama dili ile ilgili ou grsel malzemenin g zerinde bir piton resmi grsek de, Python kelimesi aslnda ou g kiinin zannettii gibi piton ylan anlamna gelmiyor. Python s g Programlama Dili, ismini Guido Van Rossumun ok sevdii, Monty Python g adl alt kiilik bir ngiliz komedi grubunun Monty Pythons Flying Circus s I adl gsterisinden alyor.

ste bu sekilde yukardaki metni reStructuredText adl iaretleme dilini kullanarak iaretlemi I s s s olduk. Burada kulland mz iaretler * ve =. g s Elbette rst iaretleme dili sadece bu iaretlerden ibaret de ildir. Dz bir metni zel iaretlerle s s g s iaretleyerek farkl biimlerde metinler ortaya karabiliriz. Ancak bir metni sadece bu tr s iaretlerle iaretlemek tek bana hi bir ie yaramaz. Burada bizim ihtiyacmz olan sey bu s s s s iaretleri anlayacak zel bir programdr. Syle dnn: Diyelim ki Python programlama dilini s s kullanarak su kodlar ieren bir dosya oluturdunuz: s
#!/usr/bin/env python #-*- coding: utf-8 -*for i in range(10): print i

Bu kodlar ieren dosya bu haliyle hi bir ie yaramaz. Sizin ihtiyacnz olan sey, bu s dosyada yazl kodlar tanyacak ve yorumlayacak zel bir programdr. Burada o zel program Pythondur. Dolaysyla yukardaki kodlarn bir ie yarayabilmesi iin sisteminizde Pythonun s kurulu olmas gerekir... ste aynen burada oldu u gibi, rst iaretleme dilini kullanarak oluI g s s turdu unuz metinlerin de bir ie yarayabilmesi iin bu rst iaretlerini anlayacak bir programa g s s sahip olmalsnz. Piyasada rst iaretleme dilini anlayan farkl programlar bulunur. Biz bu s blmde bunlar iinde en gelimilerinden biri olan Sphinx adl yazlm kullanaca z. Ancak s s g o ksma gemeden nce isterseniz durumu biraz daha somutlatrmak iin bir uygulama yas palm. Dedi imiz gibi, rst dilini anlayan farkl programlar vardr piyasada. Siz bunlardan birini edinip g rst belgeleriyle almaya balarsnz. Ama bir de internet zerinden hizmet veren bir rst s s servisi de bulunur. Bu servis yardmyla oluturdu unuz rst belgelerini ok hzl bir sekilde test s g edebilirsiniz. Bu servise ulamak iin http://www.tele3.cz/jbar/rest/rest.html adresine gidelim. s Orada grd mz kutucu a yukarda yazd mz su rst metnini yaptralm: g g g s
*********************** Python Programlama Dili *********************** Python Kelimesinin Anlam ========================= Her ne kadar Python programlama dili ile ilgili ou grsel malzemenin g zerinde bir piton resmi grsek de, Python kelimesi aslnda ou g kiinin zannettii gibi piton ylan anlamna gelmiyor. Python s g Programlama Dili, ismini Guido Van Rossumun ok sevdii, Monty Python g

adl alt kiilik bir Ingiliz komedi grubunun Monty Pythons Flying Circus s adl gsterisinden alyor.

Bu metni o kutucu a yaptrdktan sonra alt tarafta grnen render d mesine bast mzda g s g g karmza yukardaki rst belgesinin HTML biiminde yorumlanm hali gelecek. Grd nz s s g gibi, yukarda * ile iaretledi imiz ksm metnin ana bal , = ile iaretledi imiz ksm ise s g s g s g metnin alt bal oldu. s g Bylece bir rst metninin neye benzedi i ve bu metnin yorumlanmas sonucu nasl bir seyin g ortaya kt konusunda temel bir kir edinmi olduk. Artk reStructuredTextin derinliklerine g s dalabiliriz.

32.2 RestructuredText Dosyalar ve rst2html Betigi


Giri s blmnde, yazd nz g bir rst belgesini test etmek iin http://www.tele3.cz/jbar/rest/rest.html adresinden yararlanabilece inizi sylemitik. g s Ancak bu yol her zaman tercih edilmeyebilir. Mesela kendiniz rst belgelerini html belgelerine dntrmek isterseniz bu yntem iinize yaramayacaktr. Bu blmde size rst belgelerini s s nasl kaydedip farkl biimlere dntrebilece inizi anlatmaya alaca m. s g s g ncelikle sunu syleyeyim. Bir rst dosyas mutlaka .rst uzantsna sahip olmak zorunda de ildir. rst belgelerinizi .txt uzantsyla da kaydedebilirsiniz. Mesela yukardaki verdi imiz g g rnek rst metnini deneme.rst veya deneme.txt adyla bilgisayarnza kaydedin. Yani elinizde, ieri i su olan, deneme.txt veya deneme.rst adl bir dosya olsun: g
*********************** Python Programlama Dili *********************** Python Kelimesinin Anlam ========================= Her ne kadar Python programlama dili ile ilgili ou grsel malzemenin g zerinde bir piton resmi grsek de, Python kelimesi aslnda ou g kiinin zannettii gibi piton ylan anlamna gelmiyor. Python s g Programlama Dili, ismini Guido Van Rossumun ok sevdii, Monty Python g adl alt kiilik bir ngiliz komedi grubunun Monty Pythons Flying Circus s I adl gsterisinden alyor.

Simdi bu rst dosyasn bir html dosyasna dntrece iz. En bata da syledi im gibi, rst bel s g s g geleri tek bana bir ie yaramaz. Bu belgeleri farkl biimlere dntrebilmek iin baz zel s s s programlardan yararlanmamz gerekir. Dedi im gibi, biz bu i iin Sphinx adl bir yazlmdan g s faydalanaca z. Ama Sphinx bu alandaki tek dntrc yazlm de ildir. Bu yazlm, olduka g s g ayrntl ve yeteneklidir, ancak su aamada bizim iin biraz a r kaabilir. O yzde biz bu giri s g s blmnde simdilik rst2html adl bir betikten yararlanaca z. Bu basit betik sayesinde, hi g baka seylerle kafamz kartrmadan, reStructuredText denen seye ainalk kazanaca z. Peki s s s g biz bu rst2html adl beti i nereden edinece iz? Bu betik docutils adl paketin bir bileenig g s dir. GNU/Linux kullanclar, da tmlarnn paket yneticisi aracl yla Docutilsi sistemlerine g g kurabilir. E er Ubuntu GNU/Linuxu kullanyorsanz su komutu vermeniz yeterli olacaktr: g
sudo aptitude install python-docutils

Windows kullanclar ise http://docutils.sourceforge.net/docutils-snapshot.tgz adresinden, en son Docutils paketini indirebilir. Bu paketi indirdikten sonra, paketi ap docutils klasr iinde su komutu vererek Docutilsi sisteminize kurabilirsiniz:

python setup.py install

Docutils paketini da tmlarnn paket yneticisinde bulamayan veya Docutilsin en son g srmn kullanmak isteyen GNU/Linux kullanclar da yukardaki adresten indirdikleri Docutils paketini ayn komut yardmyla sistemlerine kurabilir. Ancak GNU/Linux kullanclar yukardaki komutu yetkili kullanc olarak vermeye zen gstermeli... Dedi im gibi, rst2html adl betik Docutils paketinin bir bileenidir. Dolaysyla Docutils paketini g s sistemimize kurduktan sonra bu beti e eriebilece iz. Simdi yukarda oluturdu umuz deng s g s g eme.txt veya deneme.rst dosyasnn bulundu u klasre giderek su komutu veriyoruz: g
rst2html deneme.txt > deneme.html

Tabii ben burada dosya adnn deneme.txt oldu unu varsaydm. E er siz farkl bir dosya ad g g kullandysanz yukardaki komutu ona gre dzenlemeniz gerekir. Yukardaki komutu verdikten sonra, komutu verdi imiz klasr iinde deneme.html adl bir g dosya olutu unu grece iz. Bu dosyay herhangi bir internet taraycs yardmyla grns g g tleyebilirsiniz. Bu dosyay bir metin dzenleyici ile aarsanz, bunun standart bir html dosyas oldu unu greceksiniz. g Oluan bu html dosyasn internet taraycnz yardmyla at nzda rst belgesindeki zel iarets g s lerin nasl yorumland na dikkat edin. Grd nz gibi * iareti ile gsterilen ksm html g g s belgesinde st balk olarak, = iareti ile gsterilen ksm ise alt balk olarak yorumlans s s m. Balklarn altnda yer alan iaretsiz ksm ise html belgesine normal bir paragraf olarak s s s yerletirilmi. s s

32.3 Paragraf Stilleri


Bundan nceki blmlerde reStructuredTextin yaps hakknda bir-iki sey syledik. rendi imiz gibi, bir rst belgesi, zel baz iaretlerden oluuyor. Mesela * iaretinin st g g s s s balklar belirtmek iin, = iaretinin ise alt balklar belirtmek iin kullanld n renmitik. s s s g g s Ancak elbette reStructuredText bunlardan ibaret de ildir. ste biz de bu blmde bir rst belgesi g I iinde hangi iaretlerin hangi amalara hizmet etmek zere kullanlabilece ini tartaca z. s g s g Dilerseniz en batan balayalm: s s

32.3.1 Blm Ba lklar s


reStructuredText biimli metinleri olutururken, blm balklarn gstermek iin zel baz s s iaretlerden yararlanyoruz. Esasnda bu iaretlerin ne olaca tamamen size kalm. Yani bu s s g s konuda ok sk bir zorlama yok. Buradaki en temel kural, blm balklarn gsterirken harf s veya say kullanmamak. Yani - : " ~ ^ _ * + # < > iaretlerinden herhangi birini s rahatlkla kullanabilirsiniz. nemli olan, kulland nz iaretlerde tutarl olmanzdr. Mesela biz g s yukarda verdi imiz rnekte * iaretini st balklar iin, = iaretini ise alt balklar iin g s s s s kullandk. Ben * iaretini kullanrken, metin iinde st balklar daha kolay ayrt edilebilsin s s diye * iaretini hem bal n st tarafna hem de alt tarafna yerletirdim. Siz isterseniz bu s s g s iaretler yerine bakalarn da kullanabilirsiniz. rne in st balklar belirtmek iin _ iares s g s s tini, alt balklar gstermek iin ise : iaretini tercih edebilirsiniz. Dedi im gibi, nemli olan s s g tutarl olmanz ve ayn seviyedeki balklar btn metin boyunca ayn iaretle gstermenizdir. s s Ben bu durumlar iin size syle bir sablon nerebilirim:

********** ST BALIK S ********** Alt Balk s ========== Alt alt-balk s ^^^^^^^^^^^^^^

Elbette siz de isterseniz kendi gz zevkinize uygun baka bir sablon belirleyip her zaman s onu kullanabilirsiniz. Mesela Docutilsin resmi sayfasnda kullanlan balk sablonunu inceleys erek bir kir edinebilirsiniz. Sayfaya http://docutils.sourceforge.net/index.txt adresinden eries bilirsiniz. Docutilsin sayfasndaki html belgelerinin rst kaynaklarn grmek iin, her sayfann en altnda yer alan View document source ba lantsn takip edebilirsiniz. g Internet zerinde bulunan belgelerin rst kaynaklarn incelemek size bu belge biimi hakknda nemli ipular verecektir. rst belgelerindeki balklar hakknda sylenmesi gereken en nemli seylerden biri, kulland nz s g iaretlerin saysdr. Bir bal n alt tarafna yerletirece iniz iaretler en az o balktaki karaks s g s g s s ter says kadar olmaldr. Yani syle bir kullanm hatal olacaktr:
*** BALIK S ***

Burada st ve alt tarafa en az alt adet * iareti yerletirmemiz gerekir: s s


****** BALIK S ******

32.3.2 Paragraar
reStructuredText biimli metinler yazarken paragraar gstermek iin zel herhangi bir iaret s kullanmyoruz:
***** ilek ***** ilek (Fragaria), glgiller (Rosaceae) familyas iinde yer alan bir bitki cinsi ve bu cins iinde yer alan trlerin meyvelerinin ortak addr. Dnyada, adlandrlm 20den fazla ilek tr vardr; ayrca, eitli s s melezler ve kltivarlar da bulunur. Dnya apnda ticari olarak en ok yetitirilen ilekler, bahe ilei olarak adlandrlan Fragaria ananassa s g melezinin kltivarlardr. ilekler, deerli C vitamini kaynadr. g g

Not: Bu metin http://tr.wikipedia.org/wiki/%C3%87ilek adresinden alnmtr. s Grd nz gibi, paragraar gstermek iin zel bir iaret kullanmyoruz. Burada tek dikkat g s edece imiz sey her paragraf arasnda bir boluk brakmaktr. Ayrca bal yazdktan sonra g s s g ilk paragraf yazarken de, okunakllk asndan balkla ilk paragraf arasnda bir boluk braks s manz tavsiye ederim.

Yukarda verdi imiz rneklerin html olarak nasl grnd n test etmek iin g g http://www.tele3.cz/jbar/rest/rest.html adresindeki evrimii servisten, ya da Docutils paketi iinde yer alan rst2html adl betikten yararlanabilece inizi biliyorsunuz. g

32.3.3 Yana yatk (italic) Metinler


rst metinlerinde kelimeleri yana yatk harerle yazabilmek iin yine * iaretinden yarars lanaca z. Mesela su rne e bir bakalm: g g
*Python* kvrak bir programlama dilidir.

Grd nz gibi, Python kelimesini * iaretleri arasna aldk. Bylece bu kelime, mesela g s htmlye dntrld nde yana yatk olarak grnecektir. s g

32.3.4 Kaln (bold) Metinler


E er bir paragraf iindeki herhangi bir kelimeyi kaln harerle gstermek isterseniz yine * g iaretinden yararlabilirsiniz. Ancak bu defa bu iareti ift olarak kullanaca z: s s g
**Python** ve **Django** iyi bir ikilidir.

Bu metni html biimine dntrd nzde Python ve Django kelimelerinin kaln s g yazld n greceksiniz. g

32.3.5 Vurgulu Metinler


E er bir kelimeyi ve kelime grubunu, teki kelimelerden farkl olarak vurgulu bir biimde g gstermek isterseniz iaretinden yararlanabilirsiniz: s
Python ve Django iyi bir ikilidir.

32.4 Listeler
reStructuredText dilini kullanarak liste oluturmak olduka kolaydr. Biz bu blmde listeleri s temel listeler ve zel listeler olarak iki balk altnda inceleyece iz. s g

32.4.1 Temel Listeler


Temel listeler, ska kullanmamz gerekebilecek bilindik liste trleridir. numaral listeler ve numarasz listeler bu snfa girer. Hemen ufak bir rnek verelim:
* * * * Elma Armut ilek Erik

Burada * iaretini kullanarak numarasz bir liste oluturduk. s s Isterseniz * iareti yerine + s veya - iaretlerini de kullanabilirsiniz. Liste olutururken dikkat etmemiz gereken sey, iaret s s s ile e arasnda bir boluk brakmaktr. Yani mesela * iareti ile Elma esi arasnda bir g s s g boluk brakt mzdan emin olmalyz. s g

E er amacmz numarasz listeler de il de numaral listeler oluturmaksa yine bunu ok basit g g s bir sekilde halledebiliriz:
1. 2. 3. 4. Elma Armut ilek Erik

Burada numaral bir liste oluturmak iin saylardan yararlandk. Ayn sekilde byk ve kk s hareri kullanmak da mmkndr:
A. B. C. D. Elma Armut ilek Erik

Veya:
a. b. c. d. Elma Armut ilek Erik

Hatta:
i. Elma ii. Armut iii. ilek iv. Erik

Dikkat ederseniz yukarda numaralandrma iaretlerinin sa na birer adet nokta koyduk. Siz s g isterseniz nokta yerine ( veya () iaretlerini de kullanabilirsiniz: s
1) Elma 2) Armut

Veya:
(1) Elma (2) Armut

reStructuredText ile numaral liste oluturmann bir yolu da #. iaretlerini kullanmaktr: s s


#. #. #. #. Elma Armut ilek Erik

Yukardaki rst kodlarnn kts syle olacaktr: 1. Elma 2. Armut 3. ilek 4. Erik Yukarda gsterilen numaral ve numarasz listelerin yansra, dilerseniz tanm listeleri de olus turabilirsiniz. Tanm listesinin ne oldu unu isterseniz bir rnekle grmeye alalm: g s

Ubuntu Debian tabanl bir GNU/Linux datmdr g Mint Ubuntu tabanl bir GNU/Linux datmdr g Windows Microsoft firmasnn, zgr olmayan bir rndr

Sanrm bu rnek tanm listesinin ne demek oldu unu aklyor... Baz almalarnzda bu g s liste trnn olduka iinize yarad n greceksiniz. Bu arada, yukardaki listedeki balklarn s g s kaln olmas isterseniz bu rne i syle de yazabilirsiniz: g
**Ubuntu** Debian tabanl bir GNU/Linux datmdr g **Mint** Ubuntu tabanl bir GNU/Linux datmdr g **Windows** Microsoft firmasnn, zgr olmayan bir rndr

32.4.2 zel Listeler


Bu liste tr, adndan da anlalaca gibi, zel bir amaca hizmet eder. Mesela bir programn s g kullanm klavuzu iinde grd mz seenek listeleri; program hakknda yazar, srm, lisans g v.b bilgiler veren listeler hep bu snfa girer. olarak seenek listelerinden balayalm. Mesela Ilk s Pythonu python -h komutuyla balatt mzda kan seenek listesinin bir blmn rnek s g olarak alalm:
-B -c cmd -d -E -h -i -m mod dont write .py[co] files on import; also PYTHONDONTWRITEBYTECODE=x program passed in as string (terminates option list) debug output from parser; also PYTHONDEBUG=x ignore PYTHON* environment variables (such as PYTHONPATH) print this help message and exit (also --help) inspect interactively after running script; forces a prompt even if stdin does not appear to be a terminal; also PYTHONINSPECT=x run library module as a script (terminates option list)

Grd nz gibi, seenekleri ve bu seeneklerin aklamalarn, birbirlerinden boluklarla g s ayrarak yerletirdik. E er isterseniz seenek tanmlarn alt satra da alabilirsiniz: s g
-B dont write .py[co] files on import; also PYTHONDONTWRITEBYTECODE=x -c cmd program passed in as string (terminates option list) -d debug output from parser; also PYTHONDEBUG=x -E ignore PYTHON* environment variables (such as PYTHONPATH) -h print this help message and exit (also --help) -i inspect interactively after running script; forces a prompt even if stdin does not appear to be a terminal; also PYTHONINSPECT=x

-m mod run library module as a script (terminates option list)

Burada seenek aklamalarn alt satra aldktan sonra, tanm, ait oldu u seene e gre girg g intili yazd mza dikkat edin. Bu yap, zellikle uzun seenek adlarnn bulundu u listelerde g g grn asndan tutarllk elde etmenizi sa layabilir. s g zel listeler kategorisinde de erlendirilebilecek bir baka liste tr de knye listeleridir. g s rne in yazd nz bir programda kullanclarnza yazar ad, srm numaras, yaymlanma g g tarihi gibi knye bilgilerini derli toplu bir biimde vermek isterseniz bu liste trnden yararlanabilirsiniz:
:Program Ad: HARMAN :Yazar: Frat zgl :Srm: 0.8 :Dil: Trke, ngilizce I

32.5 Kprler/Baglantlar
Yazd nz belgelerin pek ok yerinde baka belgelere veya adreslere ba lantlar vermek g s g isteyeceksiniz. Bu ilemi reStructuredText ile yapmak olduka kolaydr. s Biz burada, bir metne farkl sekillerde nasl ba lant ekleyebilece inizi gsterece iz. g g g

32.5.1 Dogrudan Baglant


E er metninize bir web sitesinin ba lantsn do rudan eklemek isterseniz su yntemi kullang g g abilirsiniz:
Python, Guido Van Rossum adl Hollandal bir programc tarafndan yazlm bir s programlama dilidir. Eer Guido Van Rossumun neye benzediini merak ediyorsanz, g g onun http://www.python.org/~guido/pics.html adresindeki fotoraflarn inceleyebilirsiniz. g

Grd nz gibi, zel hibir iaret kullanmaya gerek olmadan, do rudan web adresini metne g s g ekleyerek amacmza ulaabiliyoruz. Yalnz reStructuredText biimli metinlere bu sekilde s ba lant eklerken http:// nekini yazmay unutmuyoruz. Aksi halde ba lant almayacakg g s tr...

32.5.2 Gizli Baglant


Ba lanty do rudan grnr klmak yerine bir kelime veya kelime grubunun altna da gizlemek g g isteyebilirsiniz. O zaman syle bir sey yazmanz gerekir:
Eer Guido Van Rossumun neye benzediini merak ediyorsanz, g g onun u <http://www.python.org/~guido/pics.html>_ adresteki s fotoraflarn inceleyebilirsiniz. g

Burada syle bir yap kullandk: balant metni <balant adresi>_. Bu yapda kul g g lanlan iaretlere ok dikkat ediyoruz. Formlde grd mz iaretinin kesme iareti () s g s s olmad na da zellikle dikkat edin. Bu entik iareti genellikle klavyede virgl iaretinin g s s oldu u tuun zerindedir. Bu iareti retmek iin ALT + entik tularna basyoruz. Baz sisg s s s temlerde bu iareti karabilmek iin ALT + entik tularna art arda iki kez basmanz gerekes s bilir. E er bu sekilde iki adet entik iareti oluuyorsa birini silersiniz olur biter!.. g s s

Yukarda gsterilen yntem dnda, metin altna ba lant eklemenin farkl yollar da vardr. s g rne in: g
Arama yapmak iin tklaynz_ .. _tklaynz: http://www.google.com

Veya daha basit bir sekilde:


Arama yapmak iin tklaynz__ __ http://www.google.com

Su son iki rnek, grnt asndan daha derli toplu reStructuredText metinleri hazrlamanza yardmc olabilir. Mesela iinde birden fazla ba lant ieren paragraar su sekilde yazarak g kendi anzdan daha dzenli ve tertipli bir rst belgesi elde edebilirsiniz:
Bu konu ile ilgili daha ayrntl bilgilere uradan__, s uradan__ ve uradan__ eriebilirsiniz. s s s Ayrca bu konuya ilikin almalarnzda yukardakilerin s s dndaki kaynaklar da incelemenizi tavsiye ederim. s __ http://www.google.com __ http://www.yahoo.com __ http://www.hotmail.com

Burada grd nz gibi, uradan kelimesi birden fazla kullanld nda, kelimelerin yazl g s g s sras dikkate alnyor. reStructuredText metinlerinde ba lant vermenin de iik yollar olsa da siz muhtemelen g gs yukarda verilen ilk iki yntemi kullanmay tercih edeceksiniz. Ancak elbette bu yntemler iinde size en kolay gelen yntemi semekte serbestsiniz...

s 32.6 Degi kenler


Bazen bir metin hazrlarken, zel bir kelime veya kelime grubunu de iken olarak kullanmak gs isteyebilirsiniz. Bunun syle bir faydas vardr: Diyelim ki yazd nz metnin pek ok yerinde g ayn web sitesine gndermede bulunuyorsunuz. Bu web sitesinin adresini her defasnda elle yazmak yerine, bunu bir de ikene atayp metin iindeki gerekli yerlerle kullanmak isteyegs bilirsiniz:
Bu konuda yazlm en iyi kaynak |web sitesi| adresinde bulunur. s Ancak |web sitesi| adresinden yararlanabilmek iin bu siteye ye olmanz gerekmektedir. |web sitesi| sitesinin sahipleri, inceleme yaptnz konuda g size ellerinden geldiince yardmc olmaya alacaklardr. g s .. |web sitesi| replace:: http://www.falanca.com

Burada replace adl zel bir ifadeden yararland mza dikkat edin. Ayrca kullanlan teki g iaretlere de zellikle dikkatinizi ekmek isterim. Bu yntemin, ilerinizi ne kadar kolaylatras s s ca n tahmin edebilirsiniz. Yukardaki metinde geen www.falanca.com adresini sadece tek g bir yerde de itirerek, bu de iikli in btn metne uygulanmasn sa layabilirsiniz. gs gs g g

Yukardaki gibi, metin de ikenleri kullanabilmenin yansra, reStructuredText bize resimleri gs de ayn sekilde kullanma imkan sa lar. Bunun iin replace yerine image adl bir ifadeden g yararlanaca z: g
|dikkat| simgesi, program kullanrken dikkat etmeniz gereken eyleri gsterir. s .. |dikkat| image:: dikkat.jpg

32.7 Kod Alanlar


reStructuredTexti kod ieren belgeleri hazrlamak iin kullanaca nz dnrek, iinize bir g s s hayli yarayacak bir zellikten bahsetmemizde yarar var. Su rne e bir bakalm: g
Tkinter kullanarak yazlabilecek rnek bir program yle olabilir:: s #-*-coding: utf-8 -*from Tkinter import* class Uygulama(object): def __init__(self): self.gui_pen_ar() def gui_pen_ar(self): self.label = Label(text = "Programmza hogeldiniz...") s self.label["bg"] = "light yellow" self.label["font"] = "helvetica 15 bold" self.label["relief"] = GROOVE self.label.pack(pady = 10, padx = 10)

for k, v in [("Tamam", None), ("k", pencere.quit)]: self.btn = Button() self.btn["text"] = k self.btn["command"] = v self.btn["width"] = 10 self.btn["font"] = "verdana 13 italic" self.btn["relief"] = RIDGE self.btn.pack(side = LEFT, padx = 20, pady = 20) pencere = Tk() uyg = Uygulama() pencere.title("Merhaba") pencere.mainloop()

E er yukardaki rne i rst2html beti i yardmyla HTMLye dntrecek olursanz, kod g g g s alannn metnin geri kalanndan sk bir sekilde ayrld n ve gri bir arkaplan rengiyle gster g ildi ini greceksiniz. g Ilerde Sphinx yazlmn kulland mz zaman buradaki kodlarn daha zarif g bir sekilde renklendi ine de sahit olaca z... g g Burada dikkat etmemiz gereken en nemli sey kod blo unun balayaca n gsteren :: g s g iaretidir. Tkinter kullanarak yazlabilecek rnek bir program yle olabilir cms s lesinin ardndan :: iaretini koyarak alt satra getikten sonra kodlarmz girintili olarak yazys

oruz. Buradaki :: iareti, HTML ktsnda cmle sonuna bir adet de iki nokta st ste iareti s s yerletirecektir. E er siz iki nokta st ste iareti yerine mesela noktal virgl koymak isterss g s eniz ilk cmleyi syle yazabilirsiniz:
Tkinter kullanarak yazlabilecek rnek bir program yle olabilir; :: s

Burada ; iaretinden sonra getirdi imiz :: iaretini noktal virglden ayr yazd mza dikkat s g s g edin. Ayrca bu cmleyi yazdktan sonra, kodlarmz yazmaya balamadan nce bir satr boluk s s brakmay da unutmuyoruz...

32.8 Dipnotlar
Yazd nz metinlere dipnotlarn eklemek iin syle bir yol izleyebilirsiniz: g
2009 ylna ait verilere gre [#]_ Python programlama dili ykselitedir. s .. [#] http://www.falanca.com

E er dipnotlarn elle numaralandrmak isterseniz yukardaki kodlar syle yazmanz gerekir: g


2009 ylna ait verilere gre [2]_ Python programlama dili ykselitedir. s .. [2] http://www.falanca.com

32.9 Resimler
Yazd nz metinlerde resim gsterebilmek iin syle bir yapdan faydalanyoruz: g
.. image:: resim.jpeg

E er arzu ederseniz resmin ekranda nasl grnece ini belirlemek iin baz seeneklerden de g g yararlanabilirsiniz:
:height: 100px :width: 200 px :scale: 50 % :alt: resmi tanmlayan bir metin :align: right

Burada height resmin boyunu, width resmin enini, scale resmin le ini, alt resmi g tanmlayan bir metni, align ise resmin ne tarafa hizalanaca n gsteriyor. E er resminizi g g sa a yaslamak isterseniz :align: de erini right, sola yaslamak isterseniz left, ortalamak g g isterseniz center seklinde belirleyebilirsiniz. Sonu olarak, bir metin iindeki resmi gster mek iin su biimi kullanyoruz:
.. image:: picture.jpeg :height: 100px :width: 200 px :scale: 50 % :alt: resmi tanmlayan bir metin :align: right

Burada elbette btn seenekleri kullanmak zorunda de ilsiniz. g Isterseniz varsaylan de erleri g de kabul edebilirsiniz.

32.10 Yorumlar
E er yazd nz metinlere yorum eklemek isterseniz syle yapmanz gerekir: g g
.. Bu bir yorumdur. Bu da bir yorumdur. Bu da...

.. iaretinden sonra alt satrda girintili olarak gsterdi iniz her sey bir yorum olarak de ers g g lendirilecek, mesela HTML ktsnda grnmeyecektir. Bylece Sphinx adl yazlm rahatlkla kullanmamz sa layacak kadar reStructuredText bilgisi g edinmi olduk. Simdi gnl rahatl yla Sphinxi anlatmaya balayabiliriz. s g s

32.11 Alntlar
Hazrlad nz belgelerde baka bir yazardan veya metinden alnt yapmak isterseniz syle bir g s yap kullanabilirsiniz:
Ana paragraf buradan balyor. Hemen altta ise s alnt bir metin yer alyor. Alnt metin burada balyor. s Alnt metnin devam... Alnt metin sona erdi. Artk ana paragraftayz.

Yukardaki rst metninin HMTL kts ise syle olacaktr: Ana paragraf buradan balyor. Hemen altta ise alnt bir metin yer alyor. s Alnt metin burada balyor. Alnt metnin devam... s Alnt metin sona erdi. Artk ana paragraftayz.

32.12 Tablolar
reStructuredTextin en zor, daha do rusu en skc yanlarndan birisi de tablo oluturmaktr. g s Yazaca mz belgelere bir tablo eklemek iin tabloyu elle izmemiz gerekiyor! g
+----------+----------+----------+----------+ | SM I I | SOYSM | ADRES I I | MESLEK | +==========+==========+==========+==========+ | Ferhat | Gider | stanbul | Yazar I | +----------+----------+----------+----------+ | Ahmet | Erden | Ankara | evirmen | +----------+----------+----------+----------+ | Mehmet | Artr | zmir I | izer | +----------+----------+----------+----------+ | Kezban | Gler | Adana | Mhendis | +----------+----------+----------+----------+ | Selin | Gle | Bursa | retmen | g +----------+----------+----------+----------+ | Selim | Gelir | zmit I | Esnaf | +----------+----------+----------+----------+

Bu izim, HTMLye dntrld nde syle bir kt verecektir: s g SM I I Ferhat Ahmet Mehmet Kezban Selin Selim SOYSM I I Gider Erden Artr Gler Gle Gelir ADRES Istanbul Ankara Izmir Adana Bursa Izmit MESLEK Yazar evirmen izer Mhendis retmen g Esnaf

Yukardaki tabloda, istedi iniz grnm elde etmek iin izgilerin yerlerini de itirebilir veya g gs gereksiz grd nz izgileri silebilirsiniz. g reStructuredText biimli belgelerde yukardaki gibi tablolar daha zahmetsiz bir biimde olus turmak isterseniz rstab modlnden yararlanabilirsiniz.

BLM

33

Sphinx

Bir nceki blmde reStructuredTextin ne oldu undan, neye benzedi inden ve nasl kulg g lanld ndan bahsettik. Hatrlarsanz o blmde rst2html adl bir betikten de sz etmitik. g s Bu betik yardmyla rst biiminde oluturdu umuz belgeleri rahatlkla HTMLye evirebiliyoruz. s g Ancak rst2html ile retilen HTML dosyalar grn olarak olduka sadedir. Pek ok kimse s rst2html ile retilen HTML sayfalarn yavan ve irkin bulabilir. E er siz de byle dnyorg s sanz, rst2htmlye kyasla ok daha cazip ktlar retebilen yazlmlardan faydalanabilirsiniz. Bir nceki blmde de bahsetti imiz gibi, rst2html beti i, reStructuredText biiminde hazrlang g m metinleri ayklayarak bunlardan HTML belgeleri retebilen bir uygulamadr. Ancak ayn ii s s ok daha yetenekli ve sk bir biimde yapan baka programlar da bulunur. ste bu blmde s I inceleyece imiz Sphinx adl yazlm da bunlardan biridir. g

33.1 Sphinx Hakknda


Dilerseniz Sphinxi kullanmaya balamadan nce biraz Sphinxten bahsedelim. s Sphinx? Nedir bu

Dedi imiz gibi Sphinx, reStructuredText biiminde yazlm metinleri yorumlayp, bu metinlerg s den HTML ve PDF gibi farkl biimlerde belgeler reten olduka yetenekli bir yazlmdr. Sphinx, Python toplulu unun da aktif bir yesi olan Georg Brandl tarafndan Python Programg lama Diline ait resmi belgelendirme almalarn dzene sokmak iin yazlmtr. Dolaysyla s s bu yazlmn Python diline deste i olduka kuvvetlidir. Ancak bu, Sphinxle sadece Python belg gelendirme almalar yaplabilir anlamna gelmiyor. http://sphinx.pocoo.org/examples.html s adresinde de grece iniz gibi, bugn halihazrda Sphinxi kullanan pek ok proje vardr. Bu g sayfada verilen projeleri inceleyerek Sphinxle neler yapabilece iniz konusunda iyi bir kir g edinebilirsiniz. Tahmin edebilece iniz gibi, http://docs.python.org/ adresinde bulunan Python g belgeleri de Sphinx ile hazrlanyor. Bunun yansra, ben de istihza.comdaki btn belgeleri bu Sphinx adl yazlm yardmyla hazrlyorum. Sphinxin resmi sitesi http://sphinx.pocoo.org/ adresindedir. Sphinxe ilikin en detayl bilgiye s bu adresten ulaabilirsiniz. s

450

33.2 Sphinx Nasl Kurulur?


Elbette Sphinxle herhangi bir sey yapabilmek iin ncelikle bu yazlm bilgisayarmza kur mamz gerekiyor. Biz bu blmde Sphinxi GNU/Linux ve Windows iletim sistemlerine nasl s kuraca mz inceleyece iz. Dilerseniz nce GNU/Linuxtan balayalm. g g s GNU/Linux GNU/Linux sistemlerinde Sphinxi kurmak iin iki yntem var. nce kolay olanndan balayalm: s Sphinx pek ok GNU/Linux da tmnn depolarnda bulunur. Dolaysyla Sphinxi, kulland nz g g da tmn paket yneticisi aracl yla bilgisayarnza kurabilirsiniz. rne in Ubuntu kullanyorg g g sanz su komut yardmyla Sphinxi kurabilirsiniz:
sudo aptitude install python-sphinx

Siz de kendi da tmnzn paket yneticisinde sphinx kelimesiyle bir arama yaparak, kurag ca nz paketin hangisi oldu unu renebilirsiniz. g g g Ancak bu yntemin bir dezavantaj vardr. GNU/Linux da tmlarnn depolarnda bulunan g Sphinx en yeni srm olmayabilir. E er Sphinxin en son srmn kullanmak isterseniz g Sphinxi sitesinden indirip kaynaktan kurmay da tercih edebilirsiniz. Ancak Sphinxin ba ml g oldu u baz ilave paketler vardr: g
Setuptools Docutils Jinja2 Pygments

Sphinxi kurmadan nce en azndan Setuptoolsu sisteminize kurmu olmanz lazm. Setups toolsu kurmak iin sunlar yapyoruz: 1. http://pypi.python.org/pypi/setuptools adresine gidiyoruz, 2. Downloads blmnden setuptools-x.y.tar.gz adl dosyay bilgisayarmza indiriyoruz, 3. Indirdi imiz sktrlm dosyay ayoruz ve dizin iinde su komutu veriyoruz. g s s
sudo python setup.py install

Bylece Setuptoolsu sistemimize kurmu olduk. teki ba mll kurmasanz da olur, nk s g g Sphinx kurulurken o ba mllk da otomatik olarak kurulacaktr. g Not: E er Sphinxi internete eriimi olmayan bir bilgisayara kurmak isterseniz, Sphinx g s paketinden nce, Setuptools, Docutils, Pygments ve Jinja2 paketlerinin hepsini indirip kurmalsnz. Bu paketlerin nereden indirilip nasl kurulaca n renmek iin aa daki Windows g g s g bal n inceleyebilirsiniz. s g Simdi Sphinxi nasl kuraca mza bakalm... g Bunun iin su admlar takip ediyoruz: 1. ncelikle http://pypi.python.org/pypi/Sphinx adresine gidiyoruz, 2. Buradan Sphinx-0.x.x.tar.gz adl dosyay bilgisayarmza indiriyoruz. 3. Indirdi imiz sktrlm dosyay ayoruz ve dizin iinde su komutu veriyoruz. g s s

sudo python setup.py install

Sphinx kurulurken, e er sisteminizde Docutils, Jinja2 ve Pygments adl yazlmlar yoksa, bunlar g otomatik olarak tek tek indirilip kurulacaktr. Bylece Sphinxi kaynaktan kurmu olduk. s E er Sphinxi paket yneticiniz aracl yla kuracaksanz, paket deponuzdaki Docutils g g srmne dikkat edin.Deponuzdaki srm 0.6dan kkse bir sorununuz var demektir. nk Docutilsin 0.6 ncesi srmleri Trke karakterlerle iyi anlaamyor. Bu yzden, Docutilsin s 0.6dan kk bir srmn kullanrsanz, Sphinx ile retti iniz HTML belgelerindeki URL adg larnda yer alan Trke karakterler grnmeyecektir. Mesela ben, Ubuntudaki Docutils srm 0.6dan kk oldu u iin Docutilsi kaynaktan kurarak kullanyorum. g E er Sphinx kurulumu ile ilgili herhangi bir sorun yaarsanz veya bu konuda herhangi bir g s sorunuz olursa bana kistihza[at]yahoo[nokta]com adresinden ulaabilirsiniz. s Windows Sphinxi Windowsa kurabilmek iin sistemimizde baz programlarn halihazrda kurulu olmas gerekiyor. Sphinxin ba ml oldu u programlar syle sralayabiliriz: g g 1. Python. Elbette Sphinxin en nemli ba mll Pythondur. E er sisteminizde Python g g g kurulu de ilse Sphinxi de kullanamazsnz. Pythonu nasl kuraca nz renmek iin g g g Temel Bilgiler blmne bakabilirsiniz. 2. Setuptools. Sphinxin Pythondan sonraki en nemli ba mll Setuptoolstur. Bu g g program kurduktan sonra, Sphinxin teki ba mllklarn kurmadan da Sphinxi kurag bilirsiniz. nk bu program sayesinde Sphinx, ihtiyac olan programlar internetten otomatik olarak indirip kurabilecektir. Kulland nz Python srmne uygun olan g .exe dosyasn http://pypi.python.org/pypi/setuptools adresinden indirebilirsiniz (Mesela setuptools-0.6c11.win32-py2.6.exe) 3. E er bilgisayarnz internete ba lysa bu aamada yukardakilere ilave olarak sadece g g s Sphinx paketini indirip kurmanz yeterli olacaktr. Sphinx paketini edinmek iin http://pypi.python.org/pypi/Sphinx adresindeki .tar.gz uzantl dosyay bilgisayarnza indirebilirsiniz. Bu dosyay indirdikten sonra WinRar gibi bir program yardmyla paketin ieri ini dar karn ve program dizini iinde su komutu verin: g s
python setup.py install

Bu komutun ardndan, e er her sey yolunda gittiyse Sphinx bilgisayarnza kurulmu olacakg s tr. Ama e er bilgisayarnzda internet ba lantnz yoksa ve niyetiniz internet ba lants olan g g g bir bilgisayar aracl yla gerekli btn paketleri indirip internetsiz bilgisayarnza kurmaksa, o g zaman Python ve Setuptoolstan sonra program daha indirmeniz gerekiyor: 1. Docutils. Bu program http://pypi.python.org/pypi/docutils adresinden indirebilirsiniz. Bu program kurmak iin, indirdi imiz sktrlm dosyay ap dizin iinde su komutu veriyg s s oruz:
python setup.py install

2. Pygments. Bu program http://pypi.python.org/pypi/Pygments adresinden indirebilirsiniz. Bu program kurmak iin, indirdi imiz sktrlm dosyay ap dizin iinde su g s s komutu veriyoruz:
python setup.py install

3. Jinja2. Bu program http://pypi.python.org/pypi/Jinja2 adresinden indirebilirsiniz. Bu program kurmak iin, indirdi imiz sktrlm dosyay ap dizin iinde su komutu veriyoruz: g s s

python setup.py install

4. Yukardaki paketleri kurduktan sonra, biraz nce gsterdi imiz sekilde Sphinx paketini de g kurarak iinizi bitirebilirsiniz. s Ancak Sphinxin alabilmesi iin yukardaki ilemler yeterli de ildir. s s g Bunun iin sistemimizdeki C:\Python26 ve C:\Python26\Scripts dizinlerinin de sistem yoluna (PATH) eklenmi olmas lazm. E er zaten bu dizinleri yola eklemiseniz ilave bir sey yapmanza s g s gerek yok. E er bu dizinleri YOLa eklemediyseniz ve nasl ekleyece inizi de bilmiyorsanz g g http://www.istihza.com/py2/windows-path.html adresindeki makalemizden yararlanabilirsiniz. Unutmayn, Sphinxin alabilmesi iin hem C:\Python26 hem de C:\Python26\Scripts dizins lerinin YOLa eklenmi olmas gerekir. s Sphinx kurulumu konusundaki sorularnz iin kistihza[at]yahoo[nokta]com adresinden bana ulaabilirsiniz. s

33.3 Sphinx Nasl Kullanlr?


Sphinxi baaryla kurdu umuza gre artk bu program nasl kullanaca mz incelemeye s g g balayabiliriz. s Sphinxi altrmadan nce baz n hazrlklar yapmamz gerekiyor. s ncelikle proje dosyalarmz barndracak bir dizin oluturmalyz. Mesela projemizin ad python3 olsun. s Simdi bilgisayarmzda python3 adl bir dizin oluturalm ve bu bo dizinin iine girelim. Artk s s Sphinxi altrmaya hazrz. s Sphinx programnn grak bir arayz yoktur. Bu yzden Sphinxi komut satrndan altras ca z. Simdi kulland mz sisteme uygun bir sekilde, python3 adl dizinin iinde komut satrn g g aalm ve orada su komutu verelim:
sphinx-quickstart

Bu komutu verdi imizde karmza syle bir ekran gelecek: g s


Welcome to the Sphinx quickstart utility. Please enter values for the following settings (just press Enter to accept a default value, if one is given in brackets). Enter the root path for documentation. > Root path for the documentation [.]:

Bu ekranda Sphinx bize baz sorular soracak. Hazrlayaca mz projenin temel baz zelliklerini g bu ekranda karmza gelecek sorular cevaplayarak oluturaca z. Her bir sorudan sonra : s s g iaretini grd mz yere baz de erler girece iz. s g g g Yukarda grd nz gibi, ilk sorumuz su: g
Enter the root path for documentation. > Root path for the documentation [.]:

Burada Sphinx bizden, hazrlayaca mz projeye ilikin btn dosyalarn hangi dizinde tutug s laca n soruyor. E er burada hibir de er girmeden ENTER tuuna basarsak, Sphinx, proje g g g s dosyalarn o anda iinde bulundu umuz dizin iinde tutmak istedi imizi varsayacaktr. Biz big g raz nce, oluturdu umuz python3 adl dizin iinde bir komut satr aarak sphinx-quickstart s g komutunu verdi imiz iin burada ENTER tuuna basabiliriz. Bylece Sphinx, proje dosyalarn g s

python3 adl dizin iinde tutmak istedi imizi anlayacaktr. E er siz sphinx-quickstart g g komutunu baka bir konumda verdiyseniz, do rudan ENTER tuuna basmak yerine, proje s g s dosyalarn tutaca nz dizinin yolunu elle de yazabilirsiniz. Ancak en kolay yntem, nce proje g dosyalarnn tutulaca dizine girmek, ardndan bu dizin iinde bir komut satr amak, daha g sonra komut satrnda sphinx-quickstart komutunu vermek ve ilk soruya cevap olarak da do rudan ENTER tuuna basmaktr. g s Bylece projeye ilikin btn dosyalarmz python3 adl dizin iine yerletirilecektir. s s Birinciyi soruyu cevaplayp ENTER tuuna bastktan sonra karmza ikinci soru gelecek: s s
You have two options for placing the build directory for Sphinx output. Either, you use a directory "_build" within the root path, or you separate "source" and "build" directories within the root path. > Separate source and build directories (y/N) [n]:

Sphinxle hazrlanan projelerde iki nemli kavram vardr: kaynak dosyalar ve ina dosyalar. s Kaynak dosyalar, projemizdeki belgeleri oluturan ham verilerdir. Yani reStructuredText biis minde hazrlad mz btn belgeler bizim kaynak dosyalarmz oluyor. sa dosyalar ise, g In Sphinxle yaplan derleme ilemi sonucu, bu reStructuredText belgelerinden retilen HTML s veya PDF dosyalardr. ste Sphinxin bize sordu u bu ikinci soru bu konuyla ilgili. Burada I g Sphinx bize bu kaynak ve ina dosyalarn ayr dizinlerde tutmak isteyip istemedi imizi soruyor. s g Burada y [evet] ve n [hayr] olmak zere iki farkl cevap verebilirsiniz. ntanml cevap n, yani hayrdr. E er bu soruya y [evet] cevab verirseniz, python3 adl proje dizininiz iinde build ve source g adl iki farkl dizin oluacak, derlenen HTML ve PDF dosyalar build adl dizin iinde, .rst veya s .txt uzantl kaynak dosyalar ise source dizini iinde yer alacaktr. E er n [hayr] cevab verirseniz .rst veya .txt uzantl kaynak dosyalar do rudan python3 g g dizini iinde, derlenen HTML veya PDF dosyalar ise python3 dizini altndaki _build adl bir ina s dizini iinde yer alacaktr. Ben, projelerinizin daha derli toplu grnmesi asndan kaynak ve ina dosyalarn ayr dizins lere koymanz tavsiye ederim. E er siz de benim gibi dnyorsanz burada nce y harne, g s hemen ardndan da ENTER tuuna basn. Kaynak ve ina dizinlerinizi ayrmak istemiyorsanz s s do rudan ENTER tuuna basabilirsiniz. g s Sra geldi nc sorumuza:
Inside the root directory, two more directories will be created; "_templates" for custom HTML templates and "_static" for custom stylesheets and other static files. You can enter another prefix (such as ".") to replace the underscore. > Name prefix for templates and static dir [_]:

Sphinx projelerinde iki temel dizin vardr. templates ve static. templates dizini iinde, HTML sablonlar, static dizini iinde ise HTML dosyalar iin kullanaca nz css ve resimler gibi sabit g dosyalar yer alr. Bu iki dizin Sphinxte ntanml olarak _ nekine sahiptir. Yani yukardaki soruya do rudan ENTER tuuna basarak cevap verirseniz proje dizini iinde oluturulacak temg s s plates ve static dizinleri _templates ve _static adlarna sahip olacaktr. ste burada Sphinx I size bu _ nekini de itirme imkan tanyor. E er geerli bir mazeretiniz yoksa, bu soruya gs g do rudan ENTER tuuna basarak cevap verebilirsiniz. Bylece Sphinx ntanml nek olan _ g s iaretini kullanacaktr. s Sradaki soruya bakalm:
The project name will occur in several places in the built documentation. > Project name:

Burada Sphinx bize proje adnn ne olaca n soruyor. Biz de ona uslu uslu cevap veriyoruz. g Mesela proje admz python olsun... yleyse bu sorunun hemen karsna python yazp s ENTER tuuna basalm. Burada girece iniz proje ismi, Sphinx ile retece iniz HTML ve PDF s g g belgelerinin baz yerlerinde geecektir. Ama endielenmeyin, buraya yazd nz ismi daha s g sonra de itirebilirsiniz. O yzden proje ismini ocu unuza isim veriyormusunuz gibi uzun gs g s uzun dnmenize gerek yok... s Sradaki soru, yazar ismidir:
> Author name(s):

Buraya projeyi yazan kii veya kiilerin adn yazyoruz. E er projeyi hazrlayan birden fazla kii s s g s varsa, bu kiilerin adlarn virglle ayrarak yazabilirsiniz. Buraya yazd nz isim veya isimler s g HTML ktsnda sayfann dip ksmnda Copyright 2010, isim soyisim seklinde, PDF ktsnda ise ilk sayfada proje bal nn altnda grnecektir. s g Simdi geldi srm numarasn belirtmeye:
Sphinx has the notion of a "version" and a "release" for the software. Each version can have multiple releases. For example, for Python the version is something like 2.5 or 3.0, while the release is something like 2.5.1 or 3.0a1. If you dont need this dual structure, just set both to the same value. > Project version:

Burada, projemiz iin bir srm numaras belirtiyoruz. Mesela 0.1 yazabilirsiniz. Sonraki soruda ise alt srm numaras soruluyor:
> Project release [0.1]:

Dikkat ederseniz keli parantez iinde, bir nceki admda verdi imiz srm numaras gss g teriliyor. E er ENTER tuuna basacak olursanz, srm numaras ayn zamanda alt srm nug s maras olarak da kullanlacaktr. E er alt srm numarasnn farkl bir sey olmasn isterseniz, g elbette bunu da belirtebilirsiniz... Sonraki soru nemli:
The file name suffix for source files. Commonly, this is either ".txt" or ".rst". Only files with this suffix are considered documents. > Source file suffix [.rst]:

Burada Sphinx bize kaynak dosyalarn hangi uzantya sahip olaca n soruyor. reStructuredText g konusunu ilerken, rst dosyalarnn .rst veya .txt uzantsna sahip olabilece ini sylemitik. s g s Dolaysyla bu soruya cevap olarak .txt de yazabilirsiniz. E er hibir sey yazmadan ENTER g tuuna basarsanz ntanml uzant .rst olarak belirlenecektir. Sphinx yalnzca bu soruda bes lirtti iniz uzantya sahip dosyalar kaynak dosya olarak dikkate alacaktr. g Yine nemli bir soruya geldi sra:
One document is special in that it is considered the top node of the "contents tree", that is, it is the root of the hierarchical structure of the documents. Normally, this is "index", but if your "index" document is a custom template, you can also set this to another filename. > Name of your master document (without suffix) [index]:

Burada iindekiler dizininin tutulaca dosyann adn belirtiyoruz. Mesela ben istihza.comdaki g Python 2.x blm iin bu dosyann adn icindekiler_python olarak belirledim. Siz burada do rudan ENTER tuuna basarak, Sphinxin size nerdi i index adn da kabul edebilirsiniz. g s g

E er daha sonra baka bir isim kullanmaya karar verirseniz bunu ileride de itirme imkannz g s gs var. O yzden bu sorunun zerinde de ok dnmenize gerek yok. s Simdi art arda birka soru dizisiyle karlaaca z: s s g
Please indicate if you want to use one of the following Sphinx extensions: > autodoc: automatically insert docstrings from modules (y/N) [n]: > doctest: automatically test code snippets in doctest blocks (y/N) [n]: > intersphinx: link between Sphinx documentation of different projects (y/N) [n]: > todo: write "todo" entries that can be shown or hidden on build (y/N) [n]: > coverage: checks for documentation coverage (y/N) [n]: > pngmath: include math, rendered as PNG images (y/N) [n]: > jsmath: include math, rendered in the browser by JSMath (y/N) [n]: > ifconfig: conditional inclusion of content based on config values (y/N) [n]:

Bu sorularn hepsini, su aamada, do rudan ENTER tuuna basarak geebilirsiniz. s g s Son iki soru ise syle:
A Makefile and a Windows command file can be generated for you so that you only have to run e.g. make html instead of invoking sphinx-build directly. > Create Makefile? (Y/n) [y]: > Create Windows command file? (Y/n) [y]:

Bu sorulara y, yani evet karl n vermenizi neririm. Bylece sadece make html gibi bir s g komut kullanarak HTML dosyalarn oluturabilece iz. s g E er her sey yolunda gitmise grece imiz son cmleler syle olacaktr: g s g
Finished: An initial directory structure has been created. You should now populate your master file ./source/index.txt and create other documentation source files. Use the Makefile to build the docs, like so: make builder where "builder" is one of the supported builders, e.g. html, latex or linkcheck.

Simdi en bata oluturdu umuz proje dizinini aalm. Orada build ve source adnda iki klasr, s s g make.bat ve Makele adnda da iki dosya grece iz. E er Sphinxin size sordu u sorular g g g arasnda yer alan ikinci soruya n, yani hayr cevab verdiyseniz proje dizini iinde source adl ayr bir dizin olmayacak, normalde bu dizin iinde bulunmas gereken dosyalar do rudan ana g klasr altnda yer alacaktr. Ben sizin o soruya e cevab verdi inizi varsayaca m. g g source adl dizinin iine girdi inizde, orada conf.py adl bir dosya greceksiniz. ste bu dosya g I Sphinxin projemiz iin otomatik olarak oluturdu u ayar dosyasdr. Biraz nce Sphinxin bize s g sordu u sorulara verdi imiz cevaplar bu ayar dosyasna ilendi. E er istersek conf.py adl g g s g bu dosya zerinde de iiklik yapabiliriz. Burada yapaca mz de iiklikler projemizin HTML gs g gs ve PDF olarak nasl grnece ini belirleyecektir. Bu yzden conf.py son derece nemli bir g dosyadr. Gelin isterseniz bu dosyaya biraz daha yakndan bakalm.

33.4 conf.py Dosyas


Dedi imiz gibi, conf.py projemizle ilgili btn ayarlar tutan, son derece nemli bir dosyadr. Bu g dosya bir bakma Sphinxin kalbidir. O halde gelin isterseniz bu nemli dosyay biraz didikleyelim. Uzantsndan da anlayaca nz gibi, conf.py esasnda bir Python programdr. Dolaysyla bu g dosyaya herhangi bir Python beti ine nasl davranyorsanz yle davranabilirsiniz. g

conf.py dosyasnn iini at mzda bunun, yukarda sphinx-quickstart komutunu altrdkg s tan sonra karmza kan sorulara verdi imiz yantlar da ieren bir ayar dosyas oldu unu s g g gryoruz. Dolaysyla, yukardaki sorulara verdi iniz cevaplar bu dosyann iinden rahatlkla g de itirebilirsiniz. Dilerseniz bu dosyay oldu u gibi de kullanabilirsiniz. Bu dosyadaki ngs g tanml de erler de Sphinxle iyi bir balang yapmanz iin yeterli olacaktr. g s Simdi bu conf.py dosyas iindeki de ikenlerin en nemlilerini incelemeye balayalm: gs s source_sufx Bu de iken, proje klasr iinde yer alan source dizini iindeki kaynak gs dosyalarmzn hangi uzantya sahip olaca n gsteriyor. Biz burada .rst veya .txt uzang tlarndan birini seebiliriz. Hangisini seti imizin nemi yok. E er kaynak dosyalarmz g g .txt uzantsna sahipse buraya .txt, e er kaynak dosyalarmz .rst uzantsna sahipse bug raya .rst yazaca z. Mesela benim istihza.com iin hazrlad m belgeler .txt uzantsna g g sahip. O yzden source_suffix de erini ben .txt olarak belirledim. g master_doc Bu de iken, iindekiler dizinini barndracak dosyann adn belirliyor. ntanml gs de er indextir. Siz elbette farkl bir ad da belirleyebilirsiniz. Mesela ben istihza.comdaki g Python 2.x iin hazrlad m conf.pyde bu de eri icindekiler_python olarak belirledim. g g project Bu de er, projenin adn gsteriyor. Bu de ikenin karsna projenizin adn yazacakg gs s snz. copyright Buraya copyright bilgilerini yazaca z. Mesela u2010, Frat zgl gibi... g language Bu de er, oluturulacak HTML dosyasnn hangi dilde olaca n gsteriyor. Su anda g s g bu seene in de eri sunlardan biri olabilir: g g
cs ekce de Almanca en Ingilizce es Ispanyolca Fince fr Franszca it Italyanca nl Felemenke pl Lehe pt_BR Portekizce (Brezilya) ru Rusa sl Slovence uk_UA Ukraynaca zh_TW ince (Geleneksel)

pygments_style Burada kod renklendirme ilemi iin hangi renk semasn kullanaca mz s g belirtiyoruz. Buraya su de erleri verebilirsiniz: g
fruity autumn manni perldoc pastie

friendly default vs native colorful murphy bw tango emacs vim borland trac

html_theme Kullanlacak HTML temasn gsterir. Buraya default veya sphinxdoc de erg lerinden birini yazabilirsiniz. E er default de erini kullanrsanz HTML ktlarnzn g g grn http://docs.python.org/ adresindeki gibi, e er sphinxdoc de erini kullanrs g g sanz http://www.istihza.com/py2/icindekiler_python.html adresindeki gibi olacaktr. html_title Bu de er HTML dosyalarnn bal n belirler. Mesela istihza.comdaki Python 2.x g s g blm iin ben bu de eri Python Klavuzu olarak belirledim. g

33.5 index Dosyas


sphinx-quickstart komutunun ardndan gelen sorulara cevap verdikten sonra sources dizini altnda bir adet conf.py dosyasnn olutu unu grmtk. ste bu conf.py dosyasnn s g s I bulundu u dizin iinde index.rst veya index.txt adl baka bir dosya daha bulunur. g s sphinx-quickstart sorular arasnda yer alan Name of your master document ve source le sufx sorularna verdi iniz cevaba ba l olarak bu dosyann ad sizde tamamen farkl olag g bilir. Mesela istihza.comda bu dosyann ad icindekiler_python.txt. Bu dosyay at mzda syle bir ierikle karlaaca z: g s s g
.. python documentation master file, created by sphinx-quickstart on Sat Mar 20 00:37:25 2010. You can adapt this file completely to your liking, but it should at least contain the root toctree directive. Welcome to pythons documentation! ================================== Contents: .. toctree:: :maxdepth: 2 Indices and tables ================== * :ref:genindex

* :ref:modindex * :ref:search

Grd nz gibi, reStructuredText biimli bir dosyadr bu. Bu dosya, dntrme ileminin g s s ardndan bizim HTML giri sayfamz oluturacaktr. s s Bu sayfay istedi iniz gibi dzenleyebilirsiniz. Ancak sayfada en azndan .. toctree:: yng ergesinin kalmasna dikkat etmeniz gerekiyor. Yani yukardaki dosyann ieri i en sade haliyle g syle olabilir:
.. toctree::

Mesela istihza.com iin hazrlad m icindekiler_python.txt dosyasnn ieri i syle: g g


.. meta:: :description: Python Programlama Dilinin 2.x Srm iin Trke Kaynak :keywords: python, trke, belgelendirme, 2.x Python 2.x iin Trke Klavuz ============================== .. warning:: Aadaki bilgiler Pythonun 2.x srmleri iindir. s g Eer kullandnz srm Pythonun 3.x srmlerinden biriyse g g uradaki <http://www.istihza.com/py3/icindekiler_python.html>_ s belgeleri inceleyebilirsiniz. ----------**TEMEL KONULAR** .. note:: Temel Konular blmnde Python programlama dilinin zn oluturan, karakter dizileri, saylar, listeler, demetler, s szlkler, fonksiyonlar, dosya ilemleri ve hata yakalama gibi s temel dzeydeki konular ilenmektedir. Bu blmde ayrca dzenli s ifadeler ve nesne tabanl programlama gibi orta-ileri dzey konulara da yer verilmitir. Bu blm bitirdiinizde Pythonla konsol s g uygulamalar yazabilecek dzeye geleceksiniz. Eer grafik arayze g sahip programlar gelitirmek isterseniz sitemizde bulunan s Tkinter <http://www.istihza.com/tk2/icindekiler_tkinter.html>_ veya PyGTK <http://www.istihza.com/gtk/icindekiler_pygtk.html>_ blmlerini inceleyebilirsiniz. .. toctree:: :numbered: temel_bilgiler.txt kosul.txt dongu.txt liste-demet-sozluk.txt fonksiyon.txt modul.txt dosya.txt hata.txt kardiz.txt regex.txt nesne.txt unicode.txt modifier.txt

------------**ZEL KONULAR** .. note:: zel Konular blm Python programlama diline ilikin s bir konunun zel bir ynn inceleyen makalelere ayrlmtr. Bu s blmde math modl ve pypdf modl gibi ileri dzey modllerin yansra, Pythonun nbellekleme mekanizmasna ilikin bir inceleme s yazs ve Pythonun Windows iletim sisteminde nasl sistem yoluna s (PATH) ekleneceini anlatan bir makale yer almaktadr. Bu blmde g ayrca Python ve OpenOffice ilikisini inceleyen bir makale de s bulacaksnz. Bunlarn dnda bu blmde, belgelendirme almas s s yapanlar iin byk kolaylk salayan reStructuredText iaretleme g s dili ve Sphinx yazlm da ayrntl olarak incelenmektedir. .. toctree:: :numbered: math.txt lenascii.txt id_is.txt windows-path.txt pep3000.txt pypdf.txt openoffice.txt paketler.txt restructuredtext.txt sphinx.txt

Bu rst dosyas Sphinx yardmyla HTMLye dntrld nde s g http://www.istihza.com/py2/icindekiler_python.html adresinde grd nz sayfa ortaya g kyor. Bu arada, yukardaki rnek sayfada bulunan pek ok reStructuredText niteli i size yabanc g gelmi olabilir. Ama hi endie etmeyin. Bu blmde o sayfada grd nz her seyi tek tek s s g inceleyece iz. g

33.6 zel Ynergeler (Directives)


reStructuredText biimli belgelerdeki bir kelimenin, satrn veya paragrafn nasl ilenece ini s g gsteren zel komutlara ynerge ad verilir (yabanclar buna directive diyor). Mesela reStructuredText blmnde grd mz .. image:: bir ynergedir. g Sphinxte ynergelerin zel bir sz dizimi bulunur. Buna gre bir ynerge syle gsterilir:
.. ynerge_ad::

Ynergeler, tanmladklar kelimenin, satrn ya da paragrafn zel bir sekilde yorumlanmasn sa lar. Dilerseniz sz daha fazla uzatmadan, ynerge kavramn rnekler vastasyla anlag maya alalm. s Bu blmde inceleyece imiz ilk ynergemiz .. g toctree:: ynergesi...

33.6.1 ..

toctree:: Ynergesi

Bu ynergenin grevi projeniz iin bir iindekiler tablosu oluturmaktr. s Yukarda da syledi imiz gibi, bir index dosyasnda en azndan bir adet .. toctree:: ynergesi olmal. g Bu ynergeyi syle kullanyoruz:
.. toctree:: dosya1.rst dosya2.rst dosya3.rst

Burada grnen dosya1.rst, dosya2.rst ve dosya3.rst projeniz iindeki reStructuredText biimli belgelerin dosya addr. Bu ynergeye gre, proje dizinimizdeki source klasr iinde dosya1.rst, dosya2.rst ve dosya3.rst adl adet dosya var. Dosyalarmzn uzants .txt veya .rst olabilir. Ben dosya uzantlarn genellikle .txt olarak belirliyorum, ama dosya uzantsnn ne oldu unun hi bir nemi yok. Tek nemli nokta, conf.py dosyasndaki source_suffix g de ikeninde belirtti iniz uzant ad ile proje dizini iindeki dosyalarn uzantsnn ayn olmas gs g gerekti idir. g .. toctree:: ynergesini bu sekilde yazd mzda, dosya1.rst, dosya2.rst ve dosya3.rst g adl dosyalarn iinde bulunan btn balklar iindekiler ksmndaki yerini alacaktr. Mesela s http://www.istihza.com/py2/icindekiler_python.html adresinde bulunan iindekiler tablosuna bakn. Orada Temel Bilgiler bal altnda grd nz btn o alt-balklar oluturan satr, s g g s s yukardaki rnek dosyada yer alan temel_bilgiler.txt satrdr. .. toctree:: ynergesi iinde yer alan balklarn davrann belirleyen iki nemli nitelik s s vardr. Bu niteliklerden ilki :numbered:, ikincisi ise :maxdepth: niteli idir. ncelikle :numbered: g niteli ine de inelim. E er .. toctree:: ynergesi iinde bir :numbered: niteli i belirtirsek, g g g g iindekiler tablosunda yer alan btn balklar kendi iinde numaralandrlacaktr. rne in: s g
.. toctree:: :numbered: dosya1.rst dosya2.rst dosya3.rst

Ikinci niteli imiz de :maxdepth: niteli idir. Bu nitelik, iindekiler tablosundaki balklarn ayrnt g g s dzeyini belirler. rne in: g
.. toctree:: :maxdepth: 2 dosya1.rst dosya2.rst dosya3.rst

Burada :maxdepth: 2 satr, iindekiler tablosunda ana balklarn ve bir alt dzeyde yer alan s balklarn gsterilece ini belirtiyor. E er 2 yerine 3 yazarsak, ana balklarla birlikte iki alt s g g s dzeyde yer alan balklar gsterilecektir. E er bu niteli i hi belirtmezsek, dosya iinde yer s g g alan btn balklar iindekiler tablosunda grnecektir. s

33.6.2 ..

meta:: Ynergesi

Bu ynerge, bir HTML belgesinin <head> ksmnda bulunmas gereken meta imlerini belirlememizi sa lar. Mesela: g
.. meta:: :description: Python Programlama Dilinin 2.x Srm iin Trke Kaynak :keywords: python, trke, belgelendirme, 2.x

Burada .. meta:: ynergesiyle birlikte :description: ve :keywords: adl iki tane de nitelikten yararlandk. :description: niteli i HTML belgesinin tanm ksmn oluturur. :keywords: ise g s HTML belgesinin anahtar kelimelerini sralamamz sa lar. Bu ynerge HTML ktsnn <head> g ksmnda syle bir girdi oluturacaktr: s
<meta name="description" content="Python Programlama Dilinin 2.x Srm iin Trke Kaynak"> <meta name="keywords" content="python, trke, belgelendirme, 2.x">

33.6.3 ..

highlight:: Ynergesi

Bu ynerge, belge iinde geen kodlarn hangi dile gre renklendirilece ini belirler. Mesela g Pythonla ilgili bir belgelendirme almas yapyorsanz, yazaca nz rnek kodlarn dzgn s g renklendirilebilmesi iin bu ynergeyi kullanabilirsiniz:
.. highlight:: py range() fonksiyonunu for dngsyle birlikte u ekilde s s kullanabilirsiniz:: for i in range(10): print i

Burada .. highlight:: py ynergesi, bir Python kodu yazaca mz gsteriyor. Ayn metin g iinde birden fazla .. highlight:: ynergesi kullanabiliriz. rne in bir paragrafta C kodu, g baka bir paragrafta Python kodu yazacaksak her biri iin ayr bir .. highlight:: ynergesi s belirtebiliriz:
.. highlight:: c C kodu:: #include <stdio.h> int main() { int a = 1; if (a == 1) { printf("Elveda Zalim Dnya!\n"); return 0; } } .. highlight:: py

Python kodu:: a = 1 if a == 1: print "Elveda Zalim Dnya"

.. highlight:: ynergesiyle birlikte, Pygmentsin destekledi i btn dilleri kullanabilirsiniz. g Pygmentsin hangi dilleri destekledi ini grmek iin http://pygments.org/docs/lexers/ adresini g ziyaret edebilirsiniz.

33.6.4 ..

note:: Ynergesi

Bu ynerge, okurlarnza inceledi iniz konuyla ilgili sk bir not gstermenizi sa lar. Mesela: g g
.. note:: Temel Konular blmnde Python programlama dilinin zn oluturan, karakter dizileri, saylar, listeler, demetler, s szlkler, fonksiyonlar, dosya ilemleri ve hata yakalama gibi s temel dzeydeki konular ilenmektedir. Bu blmde ayrca dzenli s ifadeler ve nesne tabanl programlama gibi orta-ileri dzey konulara da yer verilmitir. s

33.6.5 ..

warning:: Ynergesi

Bu ynerge, okurlarnza inceledi iniz konuyla ilgili sk bir uyar gstermenizi sa lar. Mesela: g g
.. warning:: Aadaki bilgiler Pythonun 2.x srmleri iindir. s g Eer kullandnz srm Pythonun 3.x srmlerinden biriyse g g uradaki <http://www.istihza.com/py3/icindekiler_python.html>_ s belgeleri inceleyebilirsiniz.

[...DEVAM EDECEK...]

Dizin

32 bit, 368 64 bit, 368 add() Kme, 130 addPage() pyPdf, 197 alan forml gen, 37 Anahtar Key, 114 append(), 97 architecture platform, 368 arg, 155 Argman, 144 isimli, 148 sral, 148 varsaylan de erli, 152 g args, 155 argv sys, 363 Aritmetik ilemler, 16 s ASCII, 38 author pyPdf, 195 Belgelendirme, 169 belgelendirme dizisi docstring, 169 Biim Dzenleyiciler, 258 c har, 262 d har, 260 f har, 262 i har, 261 o har, 261 X har, 262 x har, 261

break, 83 Builtin Functions Gml Fonksiyonlar, 162 C, 2, 57 programlama dili, 361 C++, 2 Ck, 7 s quit(), 7 sys.exit(), 7 Caltrma, 5 s cmd, 6 gnome-terminal, 5 GNU/Linuxta, 5 konsole, 5 Windowsta, 6 capitalize() Karakter Dizileri, 230 center() Karakter Dizileri, 236 chdir() os, 187 chmod, 29 clear(), 121 cok katmanl, 392 Comment Yorum, 59 Comment Out Yorum Iine Alma, 60 Compiler Derleyici, 57 continue, 84 copy() Kme, 130 count(), 103, 112 Karakter Dizileri, 241 cp1254, 39 creator 465

pyPdf, 196 datetime, 384 date, 385 strftime, 388 strftime(), 385 timedelta(), 390 today(), 385 De er g Value, 114 de ikenler, 19 gs def, 141 del, 100, 119 Demet elerinin srasn bulmak, 112 g elerinin saysn bulmak, 112 g count(), 112 index(), 112 metotlar, 112 Tuple, 109 denetim masas, 6 Derleme kaynaktan, 4 Derleyici Compiler, 57 dict, 114 dict(), 128 Dictionary Szlk, 113 difference() Kme, 131 difference_update() Kme, 131 dil yereli locale, 389 dilimleme slicing, 226 discard() Kme, 132 Dive into Python, 194 doc, 169 docstring belgelendirme dizisi, 169 Dosyalar, 200 dosyalar dosya oluturmak, 201 s dosyaya yazmak, 205 e-posta, 50 eittir, 51 s echo, 31 elif, 53 else, 56 encoding, 38

endswith() Karakter Dizileri, 241 enumerate(), 105 env beti i, 28 g Environment variables Ortam de ikenleri, 6 gs Etkileimli kabuk s Interactive shell, 9 Etkisizletirme s Raw, 20 exit sys, 366 expandtabs() Karakter Dizileri, 245 export, 31 extend(), 99 fahrenhayt, 39 Ferhat, 56 nd() Karakter Dizileri, 245 Fonksiyon, 139 tanmlamak, 141 Fonksiyon a rs g Function call, 142 Fonksiyonlar belgelendirilmesi, 169 for, 80 Format Modiers, 258 from __future__ import division, 18 frozenset Kme, 138 fstab, 30 Function call Fonksiyon a rs, 142 g Gml Fonksiyonlar Builtin Functions, 162 Geany, 58 Gedit Metin dzenleyici, 27 get(), 122 getcwd() os, 186 getdefaultencoding() sys, 367 getDocumentInfo() pyPdf, 194 getNumPages() pyPdf, 198 Girintileme Indentation, 52, 57 global, 163

Gmail, 50 Google, 2 Guido Van Rossum zgemii, 2 s fotograar, 2 Hollandal, 2 has_key(), 122 hata yakalama, 85 Hesap makinesi, 55 Hewlett Packard, 2 Hoary Hedgehog, 109 hosts, 35 HTML, 59 ie aktarma import, 175 Ilem ncelik sras, 18 s iexplore.exe, 34 if, 51 immutable de itirilemeyen, 223 gs import, 101 ie aktarma, 175 in deyimi, 107 Indentation Girintileme, 52, 57 index(), 102, 112 Karakter Dizileri, 247 input(), 46 insert(), 99 Interactive shell Etkileimli kabuk, 9 s Interpreter Yorumlayc, 9 intersection() Kme, 132 intersection_update() Kme, 134 IronPython, 8 isalnum() Karakter Dizileri, 244 isalpha() Karakter Dizileri, 242 isdigit() Karakter Dizileri, 243 isdisjoint() Kme, 134 isim alan namespace, 164 isimli argman istenen sayda, 159

islower() Karakter Dizileri, isspace() Karakter Dizileri, issubset() Kme, 135 issuperset() Kme, 135 istitle() Karakter Dizileri, isupper() Karakter Dizileri, items(), 121 iteritems(), 121 iterkeys(), 122 itervalues(), 122

232 233

233 232

join(), 191 Karakter Dizileri, 248 Jython, 8 Kme e sralamas, 130 g add(), 130 clear(), 129 copy(), 130 difference(), 131 difference_update(), 131 discard(), 132 frozenset, 138 intersection(), 132 intersection_update(), 134 isdisjoint(), 134 issubset(), 135 issuperset(), 135 metotlar, 128 oluturmak, 126 s pop(), 138 remove(), 132 Set, 125 symmetric_difference(), 137 symmetric_difference_update(), 137 union(), 136 update(), 136 Kmeler, 215 Ka dizileri, 20 s Karakter Dizileri biimleyiciler, 20 birletirme, 15 s capitalize(), 230 center(), 236 count(), 241 dilimleme, 226 endswith(), 241

expandtabs(), 245 nd(), 245 index(), 247 isalnum(), 244 isalpha(), 242 isdigit(), 243 islower(), 232 isspace(), 233 istitle(), 233 isupper(), 232 join(), 248 ljust(), 237 lstrip(), 252 metotlar, 229 partition(), 251 replace(), 239 rnd(), 247 rindex(), 248 rjust(), 237 rpartition(), 252 rsplit(), 255 rstrip(), 252 split(), 253 splitlines(), 256 startswith(), 240 Strings, 11, 218 strip(), 252 swapcase(), 231 title(), 230 translate(), 250 upper(), 231 zll(), 238 Karmak Saylar s Saylar, 18 Kate Metin dzenleyici, 27 Kayan noktal saylar Saylar, 18 Keramet Su, 60 Key Anahtar, 114 keys(), 120 Koula ba l durumlar, 50 s g kullanc ad, 50 Kurulum GNU/Linuxta, 3 kaynaktan, 4 make altinstall, 4 Windowsta, 4 Kwrite Metin dzenleyici, 27 len(), 82

List Liste, 91 listdir() os, 184 Liste e silmek, 100 g elerine erimek, 93 g s elerini sralamak, 101 g elerinin srasnn bulmak, 102 g elerinin saysn bulmak, 103 g List, 91 metotlar, 96, 97 oluturmak, 92 s ljust() Karakter Dizileri, 237 locale, 101, 388 dil yereli, 389 localtime() time, 395 lstrip() Karakter Dizileri, 252 Lucida console, 41 makedirs() os, 187 Matematik ilemleri, 16 s max(), 108 Metin dzenleyici, 26 Gedit, 27 IDLE, 31 Kate, 27 Kwrite, 27 min(), 108 mkdir() os, 187 Modller, 172 nc sahslarn yazd , 192 g eitleri, 173 s kendi yazd nz, 174 g yol, 198 Monty Pythons Flying Circus, 2 MS-DOS, 6, 41 multi-threading, 392 mutable de itirilebilir, 223 gs name os, 181 namespace isim alan, 164 NASA, 2 Net ats, 8 Non-ASCII, 38 None, 166

Notepad, 26 Notepad++, 58 Notepad2, 58 Orun Kunek, 59 Ortam de ikenleri gs Environment variables, 6 os, 180 chdir(), 187 environ, 226 getcwd(), 186 listdir(), 184 makedirs(), 187 mkdir(), 187 name, 181 removedirs(), 189 rmdir(), 189 sep, 190 startle, 183 system, 182 os.path.abspath(), 213 os.path.basename(), 213 os.path.dirname(), 213 os.path.exists(), 213 os.path.isdir(), 214 os.path.isle(), 214 os.path.split(), 215 os.path.splitext(), 215 Parametre, 144 Pardus, 3 parola, 50 partition() Karakter Dizileri, 251 pass deyimi, 90 fonksiyonlarda, 168 PATH, 6 YOL, 6, 30 path sys, 198, 367 PATHEXT, 36 pdf, 193 PdfFileReader() pyPdf, 194 PdfFileWriter() pyPdf, 194 platform, 368 architecture, 368 sys, 368 pop(), 100, 121 Kme, 138 popitem(), 121

pow(), 221 print komutu, 9 printf, 57 producer pyPdf, 196 pydoc, 8 pyPdf, 193 addPage(), 197 author, 195 creator, 196 getDocumentInfo(), 194 getNumPages(), 198 PdfFileReader(), 194 PdfFileWriter(), 194 producer, 196 title, 194 Python paytn, 3 piton, 3 2.x, 5 3.x, 5 kurulum, 3 peltek s, 3 piton ylan, 2 telaffuzu, 3 python.exe, 35 range(), 82 Raw Etkisizletirme, 20 s raw_input(), 43 ile ift tklama, 37 reload(), 177 remove(), 100 Kme, 132 removedirs() os, 189 replace() Karakter Dizileri, 239 return, 166 reverse(), 101 rnd() Karakter Dizileri, 247 rindex() Karakter Dizileri, 248 rjust() Karakter Dizileri, 237 rmdir() os, 189 root, 30 rpartition() Karakter Dizileri, 252 rsplit()

Karakter Dizileri, 255 rstrip() Karakter Dizileri, 252 Szlk e eklemek, 116 g elerine erimek, 115 g s elerini de itirmek, 119 g gs elerini silmek, 119 g Dictionary, 113 metotlar, 120 oluturmak, 114 s sra kavram, 124 Sral Argman istenen sayda, 155 santigrat, 39 Saylar, 16 Karmak Saylar, 18 s Kayan noktal saylar, 18 Tamsaylar, 18 Uzun saylar, 18 Sekme Tab, 20 sep os, 190 Set Kme, 125 set() fonksiyonu, 126 shebang, 27 sleep() time, 391 slicing dilimleme, 226 sort(), 101 SPACE, 52 split() Karakter Dizileri, 253 splitlines() Karakter Dizileri, 256 startle os, 183 startswith() Karakter Dizileri, 240 stdout.write() sys, 369 str(), 219 strftime() time, 393 Strings Karakter Dizileri, 11, 218 strip() Karakter Dizileri, 252 strxfrm, 101

sum(), 104, 145 swapcase() Karakter Dizileri, 231 symmetric_difference() Kme, 137 symmetric_difference_update() Kme, 137 sys, 361 argv, 363 exit, 366 getdefaultencoding(), 367 path, 198, 367 platform, 368 stdout, 369 stdout.write(), 369 version_info, 373 sys.stdout standart kt konumu, 372 system os, 182 Trke karakter problemi, 41 karakterler, 13, 38 trnak iaretleri s , 13 ift, 12 tek, 13 TAB, 52 Tab Sekme, 20 Tamsaylar Saylar, 18 Tarih aritmetik ilem, 390 s biimlendirme, 388 bugnn tarihi, 385 haftann hangi gn, 386 TCMB, 390 time, 390 localtime(), 395 sleep(), 391 strftime(), 393 title pyPdf, 194 title() Karakter Dizileri, 230 Tkinter, 392 translate() Karakter Dizileri, 250 try... except, 87 Tuple Demet, 109 type(), 219

fonksiyonu, 110 Ubuntu, 3 ubuntu.com, 4 ubuntu.org.tr, 4 Uncomment Yorumdan Kurtarma, 60 union() Kme, 136 update() Kme, 136 upper() Karakter Dizileri, 231 USERPROFILE, 35 utf-8, 39 Uzun saylar Saylar, 18 Value De er, 114 g ValueError, 86 values(), 120 VirtualBox, 8 vlc.exe, 42 Warty Warthog, 109 which, 30 while, 76 with, 217 xdg-open, 183 xorg.conf, 30 Yeni satr, 20 YOL PATH, 6, 30 Yorum Comment, 59 Yorum Iine Alma Comment Out, 60 Yorumdan Kurtarma Uncomment, 60 Yorumlayc Interpreter, 9 YouTube, 2 ZeroDivisionError, 88 zll() Karakter Dizileri, 238

You might also like