Python Kılavuzu

Sürüm 2.x

Fırat Özgül (istihza)

14/05/2011

˙Ç˙NDEK˙LER I I I

1 Temel Bilgiler 1.1 Python Hakkında . . . . . 1.2 Python Nasıl Okunur? . . 1.3 Python Nereden İndirilir? 1.4 Python Nasıl Çalıştırılır? . 1.5 Python’dan Nasıl Çıkılır? 1.6 Bölüm 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

2 Python’a Giriş 2.1 print Komutu . . . . . . . . . . . . . . . . . 2.2 Karakter Dizileri . . . . . . . . . . . . . . . 2.3 Python’da Sayılar ve Matematik İşlemleri 2.4 Değişkenler . . . . . . . . . . . . . . . . . . 2.5 Kaçış Dizileri . . . . . . . . . . . . . . . . . 2.6 Bölüm Soruları . . . . . . . . . . . . . . . . 3 Python Programlarını Kaydetmek 3.1 GNU/Linux Sistemi . . . . . . . . . . . . 3.2 Windows Sistemi . . . . . . . . . . . . . 3.3 Türkçe Karakter Kullanımı . . . . . . . 3.4 MS-DOS’ta Türkçe Karakter Problemi 3.5 Bölüm Soruları . . . . . . . . . . . . . . . . . . . .

4 Kullanıcıyla İletişim: Veri Alış-Verişi 4.1 raw_input() fonksiyonu . . . . . . . . . . . . 4.2 input() fonksiyonu . . . . . . . . . . . . . . . . 4.3 Güvenlik Açısından input() ve raw_input() . 4.4 Bölüm Soruları . . . . . . . . . . . . . . . . . .

i

5 Python’da Koşula Bağlı Durumlar 5.1 if Deyimi . . . . . . . . . . . . . . . 5.2 elif Deyimi . . . . . . . . . . . . . . 5.3 else Deyimi . . . . . . . . . . . . . . 5.4 Python’da Girintileme Sistemi . . . 5.5 Python Kodlarına Yorum Eklemek 5.6 Bölüm Soruları . . . . . . . . . . . . 6 Bazı 6.1 6.2 6.3 6.4 Önemli Ayrıntılar İşleçler (Operators) . Bool Değerler . . . . . Dönüştürme İşlemleri Bölüm Soruları . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

7 Python’da Döngüler 7.1 while Döngüsü . . 7.2 for Döngüsü . . . 7.3 range() fonksiyonu 7.4 len() fonksiyonu . 7.5 break deyimi . . . 7.6 continue deyimi . 7.7 Bölüm Soruları . . 8 Hata 8.1 8.2 8.3

Yakalama 86 try... except... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 pass Deyimi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 Bölüm Soruları . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 . 92 . 93 . 96 . 104 . 105 . 107 . 108 . 108

9 Listeler 9.1 Liste Oluşturmak . . . . . . . 9.2 Liste Öğelerine Erişmek . . . 9.3 Liste Metotları . . . . . . . . . 9.4 sum() Fonksiyonu . . . . . . . 9.5 enumerate() Fonksiyonu . . . 9.6 in Deyimi . . . . . . . . . . . . 9.7 min() ve max() Fonksiyonları 9.8 Bölüm Soruları . . . . . . . . .

10 Demetler 110 10.1 Demetlerin Metotları . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 10.2 Bölüm Soruları . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 11 Sözlükler 11.1 Sözlük 11.2 Sözlük 11.3 Sözlük 11.4 Sözlük
ii

Oluşturmak . . . . . . Öğelerine Erişmek . . Öğelerini Değiştirmek Öğelerini Silmek . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

114 . 114 . 115 . 119 . 119

11.5 Sözlüklerin Metotları . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 11.6 Bölüm Soruları . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 12 Kümeler 12.1 Küme Oluşturmak . . . . . . . . . . 12.2 Kümelerin Metotları . . . . . . . . 12.3 Dondurulmuş Kümeler (Frozenset) 12.4 Bölüm 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ı Tanımlamak . . . . . . . . . . 13.2 Fonksiyonlarda Parametre Kullanımı . . . . 13.3 İsimli ve Sıralı Argümanlar . . . . . . . . . 13.4 Varsayılan Değerli Argümanlar . . . . . . . 13.5 İstenen Sayıda Sıralı Argüman Kullanımı . 13.6 İstenen Sayıda İsimli Argüman Kullanımı . 13.7 Gömülü Fonksiyonlar (Built-in Functions) 13.8 global Deyimi . . . . . . . . . . . . . . . . . 13.9 return Deyimi . . . . . . . . . . . . . . . . . 13.10 Fonksiyonlarda pass Deyimi . . . . . . . . . 13.11 Fonksiyonların Belgelendirilmesi . . . . . . 13.12 Bölüm Soruları . . . . . . . . . . . . . . . . . 14 Modüller 14.1 Modüllerin Çeşitleri . . . . . . . . . . 14.2 Kendi Yazdığınız Modüller . . . . . . 14.3 Modülleri İçe Aktarmak . . . . . . . 14.4 Modülleri İçe Aktarma Yöntemleri . 14.5 Geliştiricilerin Yazdığı Modüller . . . 14.6 Üçüncü Şahısların Yazdığı Modüller 14.7 Modüllerin Yolu . . . . . . . . . . . . 14.8 Bölüm Soruları . . . . . . . . . . . . . 15 Dosya İşlemleri 15.1 Dosya Oluşturmak . . . . . . . . . . . 15.2 Dosyaya Yazmak . . . . . . . . . . . . 15.3 Dosyayı Okumak . . . . . . . . . . . . 15.4 Dosya Silmek . . . . . . . . . . . . . . 15.5 Dosyaya Rastgele Satır Eklemek . . 15.6 Dosyadan Rastgele Satır Silmek . . . 15.7 os Modülünde Dosya-Dizin İşlemleri 15.8 Kümeler ve Dosyalar . . . . . . . . . 15.9 with Deyimi . . . . . . . . . . . . . . 15.10 Bölüm Soruları . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

16.2 16.3 16.4 16.5 16.6

Tırnak Tipleri . . . . . . . . . . Karakter Dizilerini Birleştirmek Karakter Dizilerini Dilimlemek Karakter Dizilerinin Metotları . Bölüm Soruları . . . . . . . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. 221 . 223 . 226 . 229 . 256

17 Biçim Düzenleyiciler 259 17.1 Biçim Düzenlemede Kullanılan Karakterler . . . . . . . . . . . . . . . . . . . . . 260 17.2 İleri Düzeyde Karakter Dizisi Biçimlendirme . . . . . . . . . . . . . . . . . . . . 264 17.3 Bölüm Soruları . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269 18 ascii, 18.1 18.2 18.3 18.4 unicode ve Python Giriş . . . . . . . . . . . . . . ascii . . . . . . . . . . . . . . unicode . . . . . . . . . . . . Python’da unicode Desteği . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 Düzenli İfadeler (Regular Expressions) 19.1 Düzenli İfadelerin Metotları . . . . . . . . . . . . . . . . . . . . 19.2 Metakarakterler . . . . . . . . . . . . . . . . . . . . . . . . . . . 19.3 Eşleşme Nesnelerinin Metotları . . . . . . . . . . . . . . . . . . 19.4 Düzenli İfadelerin Derlenmesi . . . . . . . . . . . . . . . . . . . 19.5 compile() ile Derleme Seçenekleri . . . . . . . . . . . . . . . . . 19.6 Düzenli İfadelerle Metin/Karakter Dizisi Değiştirme İşlemleri 19.7 Sonuç . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 Nesne Tabanlı Programlama – OOP (NTP) 20.1 Neden Nesne Tabanlı Programlama? . . . . 20.2 Sınıflar . . . . . . . . . . . . . . . . . . . . . . 20.3 Örnekleme (Instantiation) . . . . . . . . . . 20.4 Çöp Toplama (Garbage Collection) . . . . . 20.5 Niteliklere Değinme (Attribute References) 20.6 __init__ Nedir? . . . . . . . . . . . . . . . 20.7 self Nedir? . . . . . . . . . . . . . . . . . . . 20.8 Miras Alma (Inheritance) . . . . . . . . . . 20.9 Eski ve Yeni Sınıflar . . . . . . . . . . . . . . 20.10 Sonuç . . . . . . . . . . . . . . . . . . . . . . 21 Sqlite ile Veritabanı Programlama 21.1 Giriş . . . . . . . . . . . . . . . . . . . . 21.2 Neden Sqlite? . . . . . . . . . . . . . . . 21.3 Sqlite’ın Yapısı . . . . . . . . . . . . . . 21.4 Veritabanıyla Bağlantı Kurmak . . . . 21.5 Veri Girişi . . . . . . . . . . . . . . . . . 21.6 Veri İşleme - commit() Metodu . . . . 21.7 Veritabanından Veri Almak . . . . . . 21.8 Veritabanı Güvenliği - SQL Injection .
iv

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

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

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

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

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

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

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

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

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

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

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

. . . . . . . .

. . . . . . . .

. . . . . . . .

22 sys Modülü 22.1 sys Modülünün İçeriği . . . . . . 22.2 argv Niteliği . . . . . . . . . . . . 22.3 exit() Fonksiyonu . . . . . . . . . 22.4 getdefaultencoding() Fonksiyonu 22.5 path Niteliği . . . . . . . . . . . . 22.6 platform Niteliği . . . . . . . . . . 22.7 stdout Niteliği . . . . . . . . . . . 22.8 version_info Niteliği . . . . . . . 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 Modülü Üslü İfadeler Fonksiyonu (pow) Pi Niteliği (pi) . . . . . . . . . . Karekök Fonksiyonu (sqrt) . . . Euler Sabiti (e) . . . . . . . . . exp Fonksiyonu . . . . . . . . . . Logaritma (log) Fonksiyonu . . Logaritma (log10) Fonksiyonu . Degrees Fonksiyonu . . . . . . . Radians Fonksiyonu . . . . . . . Kosinüs Fonksiyonu (cos) . . . . Sinüs Fonksiyonu (sin) . . . . . Tanjant (tan) Fonksiyonu . . . Faktoriyel (factorial) . . . . . . fmod Fonksiyonu . . . . . . . . . ceil Fonksiyonu . . . . . . . . . . floor 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 Modülü 24.1 Bugünün Tarihini Bulmak . . . . . . . . . . 24.2 Bir Tarihin Hangi Güne Geldiğini Bulmak 24.3 Tarihleri Biçimlendirmek . . . . . . . . . . . 24.4 Tarihlerle Aritmetik İşlem Yapmak . . . . . 25 time 25.1 25.2 25.3 25.4 Modülü sleep() Fonksiyonu . . . . . . . . . . . . . . strftime() Fonksiyonu . . . . . . . . . . . . localtime() Fonksiyonu . . . . . . . . . . . gmtime(), time() ve ctime() Fonksiyonları . . . .

v

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 . . . . . . . . . . . . . . . . . . Adlandırma . . . . . . . . . . . . . . PEP’lerin Numaralandırılması . . . Takvim . . . . . . . . . . . . . . . . Uyumluluk ve Geçiş . . . . . . . . . Gerçekleme Dili (Implementation) Üst-Katkılar . . . . . . . . . . . . . Kaynaklar . . . . . . . . . . . . . . . Telif Hakkı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

30 Python ve OpenOffice 30.1 PyUno’nun Kurulumu . . . . . . . . . . . . . . . . . . . . . . . . . 30.2 OpenOffice’yi Dinleme Kipinde Açmak (listening mode) . . . . . 30.3 OpenOffice’ye Bağlanmak . . . . . . . . . . . . . . . . . . . . . . . 30.4 Karakter Biçimlendirme . . . . . . . . . . . . . . . . . . . . . . . . 30.5 Karakterleri Renklendirme . . . . . . . . . . . . . . . . . . . . . . . 30.6 PyUno, Python ve OpenOffice Hakkında Bilgi Veren Kaynaklar 31 Python’da Paket Kurulumu - Kullanımı 32 reStructuredText 32.1 Giriş . . . . . . . . . . . . . . . . . . . . . 32.2 RestructuredText Dosyaları ve rst2html 32.3 Paragraf Stilleri . . . . . . . . . . . . . . 32.4 Listeler . . . . . . . . . . . . . . . . . . . 32.5 Köprüler/Bağlantılar . . . . . . . . . . . 32.6 Değişkenler . . . . . . . . . . . . . . . . . 32.7 Kod Alanları . . . . . . . . . . . . . . . . 32.8 Dipnotları . . . . . . . . . . . . . . . . . . 32.9 Resimler . . . . . . . . . . . . . . . . . . . 32.10 Yorumlar . . . . . . . . . . . . . . . . . . 32.11 Alıntılar . . . . . . . . . . . . . . . . . . . 32.12 Tablolar . . . . . . . . . . . . . . . . . . . 33 Sphinx 33.1 Sphinx Hakkında . . . . 33.2 Sphinx Nasıl Kurulur? . 33.3 Sphinx Nasıl Kullanılır? 33.4 conf.py Dosyası . . . . . 33.5 index Dosyası . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

vi

33.6 Özel Yönergeler (Directives) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460 Dizin 465

vii

viii .

¸ TEMEL KONULAR . E˘ er kullandı˘ ınız sürüm s g g g Python’un 3.x sürümlerinden biriyse suradaki belgeleri inceleyebilirsiniz.Uyarı: A¸a˘ ıdaki bilgiler Python’un 2.x sürümleri içindir.

g Her ne kadar Python programlama dili ile ilgili ço˘ u görsel malzemenin üzerinde bir piton g resmi görsek de. Buradaki bilgiler. YouTube’dan Hewlett Packard’a kadar pek çok kurum ve sirkette Python program¸ lama dilinden yararlanıldı˘ ını görüyoruz. bu ve buna benzer üstünlükleri sayesinde pek çok kimsenin gözdesi haline I¸ gelmi¸tir. ama bu programlama dillerine göre hem daha kolaydır hem de program s g geli¸tirme sürecini bir hayli kısaltır. g Burada. GNU/Linux ve MacOs X gibi pek çok farklı i¸letim sistemi üzs erinde çalı¸abilmektedir. Python kelimesi aslında ço˘ u ki¸inin zannetti˘ inin aksine piton yılanı ang s g lamına gelmiyor.html g adresindeki foto˘ raflarını inceleyebilirsiniz. Bu belgelerden yararlanabilmek için önceden bir program¸ g lama dili biliyor olmanız gerekmez. s g g Mesela Python’ın geli¸tiricisi Guido s 2 . s ˙ste Python. onun http://www. okurun programlama konusunda hiç bir bilgisi olmadı˘ ı varsayılarak ve herkesin anlayabilece˘ i bir üslupla hazırlanmı¸tır. Python programlama dili. Guido Van Rossum’un çok sevdi˘ i. s s g üzerinde hiç bir de˘ i¸iklik yapmaya gerek olmadan veya küçük de˘ i¸ikliklerle ba¸ka platformgs gs s larda da çalı¸abilecektir. kolay ö˘ renilmesi ve program geli¸tirme sürecini hızlandırg s ması ile tanınan bu dil Windows. s Son yıllarda Türkiye’de de ilgi uyandırmaya ba¸layan bu dil yava¸ yava¸ üniversite müfredatıns s s daki yerini alıyor. Dolayısıyla tek bir platformda geli¸tirdi˘ iniz bir Python uygulaması. Python programlama diline merak duyan okurlara bu dilin temellerini sa˘ lam ve hızlı g bir sekilde ö˘ retmeyi amaçlıyoruz. Ayrıca s bu dilde yazılan kodlar ba¸ka dillere göre hem daha okunaklı hem de daha temizdir.BÖLÜM 1 Temel Bilgiler Python 1990 yılından bu yana büyük bir topluluk tarafından geli¸tirilen kıvrak ve dinamik bir s dildir. g g s 1. Python programlama dili. Google’ın da Python’a özel bir önem ve de˘ er verdi˘ ini. Söz diziminin sade olması. Monty Python g adlı altı ki¸ilik bir ˙ s Ingiliz komedi grubunun Monty Python’s Flying Circus adlı gösterisinden alıyor ismini. Her ne kadar ülkemizde henüz yeterli ilgiyi görmese de. Üstelik bu dil ayrı bir derleyiciye de ihtiyaç duymaz.org/~guido/pics. çok iyi derecede Python s g g bilenlere i¸ olana˘ ı sundu˘ unu hemen söyleyelim.. bugün Google’dan NASA’ya. E˘ er Guido Van s s g Rossum’un neye benzedi˘ ini merak ediyorsanız.python.1 Python Hakkında Python’ın ba¸ geli¸tiricisi Guido Van Rossum adlı Hollandalı bir programcıdır.. C ve C++ gibi daha yerle¸ik ve köklü dillere kıyasla çok uzun bir s geçmi¸e sahip de˘ ildir.

org/~guido/Resume. ana dili Türkçe olanlar için pek kolay de˘ il. (Guido Van Rossum’un s özgeçmi¸ine http://www. O yüzden hem Windows hem de s g GNU/Linux hakkında bilgi sahibi olmanın zararını de˘ il. g Öncelikle GNU/Linux’tan ba¸layalım: s 1. g E˘ er “python” kelimesinin ˙ g Ingilizce telaffuzunu dinlemek istiyorsanız http://www.3. bu programlama dilinin sistemimizde kurulu olması gerekiyor. hangi i¸leg s s tim sistemini kullanıyor olursanız olun. faydasını göreceksiniz. Ancak bu kelimeyi hakkıyla telaffuz etmek. E˘ er Python’ı kurmanız gerekirse http://www. ˙ Ingilizce bilenler bu sesi think [dü¸ünmek] kelimesinden hatırs layacaklardır. ¸ Dolayısıyla Python kelimesini de paytın seklinde telaffuz edebilirsiniz. g Ancak GNU/Linux sistemlerinde kurulu olarak gelen Python ço˘ unlukla en yeni sürüm de˘ ildir. ˙ste I¸ biz de bu bölümde Python’ı nereden indirip sistemimize nasıl kuraca˘ ımızı ö˘ renece˘ iz. Çünkü bu kelime içinde.. sistemin belkemi˘ ini Python’ın olu¸turdu˘ u bir da˘ ıtımda Python’ı kaynaktan derlemeye g s g g çalı¸mak. g g E˘ er mutlaka ama mutlaka Python’ın daha yeni bir sürümüne ihtiyacınız yoksa eski de olsa g da˘ ıtımınızla birlikte gelen Python sürümünü kullanmanızı öneririm. Ancak Python GNU/Linux da˘ ıtımlarında çok önemli bazı g parçalarla etkile¸im halinde oldu˘ u için kaynaktan derleme pek tavsiye edilmez.python. Dolayısıyla bu kelimenin telaffuzunda ˙ Ingilizce’nin kuralları geçerli.howjsay. Windows bölümünde ise GNU/Linux kullanıcılarının ilgisini çekebilecek kısımlar olabilir.com/ adresini ziyaret edebilir. Ancak her ne kadar GNU/Linux ve Windows bölümlerini ayırmı¸ da olsak. e˘ er dikkatsiz davranırsanız epeyce ba¸ınızı a˘ rıtabilir. GNU/Linux siss g s g temlerinde en kestirme yol da˘ ıtımın kendi Python paketlerini kullanmaktır. ben size her iki bölümü de okumanızı tavsiye ederim..org/download adresinden Python’ın kayg nak dosyalarını indirebilirsiniz. Mesela Pardus ve g Ubuntu’da Python’ın kurulu oldu˘ unu biliyoruz. g g g Python Windows ve GNU/Linux i¸letim sistemlerine kurulma açısından farklılıklar gösterir. Sözün özü. Biz s burada Python’ın hem GNU/Linux’a hem de Windows’a nasıl kurulaca˘ ını ayrı ayrı inceleyeg ce˘ iz.) s s 1. Guido Van Rossum’un bu kelimeyi nasıl telaffuz etti˘ ini merak ediyg orsanız da http://video. ¸ Asıl söyleni¸inin dı¸ında bu kelimeyi tamamen Türkçele¸tirerek piton seklinde telaffuz edenler s s s ¸ de var.2 Python Nasıl Okunur? Geli¸tiricisi Hollandalı olsa da Python ˙ s Ingilizce bir kelimedir. Hele ki Pardus s g gibi. Ayrıca yazdı˘ ınız bir programın sadece tek bir g i¸letim sistemine ba˘ ımlı olmaması önemli bir özelliktir. Ama e˘ er.python. Türkçe’de yer almayan ve okunu¸u g s peltek s’yi andıran th sesi var.html adresinden eri¸ebilirsiniz.1 GNU/Linux’ta Python’ı Kurmak Python hemen hemen bütün GNU/Linux da˘ ıtımlarında kurulu geliyor.3 Python Nereden ˙ndirilir? I Python’ı kullanabilmek için. Elbette siz de dilinizin döndü˘ ü bir telaffuzu tercih etmekte özgürsünüz. o yüzden Pardus veya Ubuntu kullanıyorsanız g Python’ı kurmanıza gerek yok. 1. Ana dili Türkçe olanlar think kelimesini genellikle tink seklinde telaffuz eder.com/videoplay?docid=-6459339159268485356# adresindeki tanıtım videosunu izleyebilirsiniz. “Ben illa ki en g g .google.Van Rossum 2005 yılının Aralık ayından beri Google’da çalı¸ıyor. Çünkü GNU/Linux bölümünde Windows kullanıcılarının.

orada sırasıyla s s a¸a˘ ıdaki komutları veriyoruz: s g . Python’ı kurarken. g g kullandı˘ ınız da˘ ıtımın belkemi˘ i durumunda olabilir. Bu adresten Python’ı indirmek isteyen ço˘ u Windows kullanıcısı g için en uygunu.5 ve üstü bütün sürüms . Python özellikle g bazı GNU/Linux da˘ ıtımlarında pek çok sistem aracıyla sıkı sıkıya ba˘ lantılıdır. Python kurulurken klasör ve dosyalara sürüm numarasının da eklenmesini sa˘ lar. Bu önemli ayrıntıyı kesinlikle gözden s kaçırmamalısınız.x. kaynaktan Python derleyes g g ¸ cekseniz. kesinlikle da˘ ıtımınızla birlikte gelen Python sürümünü kullans g malısınız. Bunun için. Python’ı kurmak çok kolaydır. Yani Python. make g altinstall komutu. g • Daha sonra bu sıkı¸tırılmı¸ dosyayı açıyoruz ve açılan dosyanın içine girip. Windows i¸letim sisteminde Python programlama dili g s kurulu olarak gelmez. • Öncelikle su adresi ziyaret ediyoruz: http://www. Bu yüzden Python’ı kaynaktan derg g g lemek bazı riskler ta¸ıyabilir. kar¸ı kar¸ıya oldu˘ unuz risklerin farkında olmalısınız. ben size Ubuntu GNU/Linux’u dens s g emenizi önerebilirim.x Windows installer (Windows binary – does not include source) yazan ba˘ lantıya tıklamak olacaktır.tgz dosyasını bilgisayarımıza indiriyoruz. s 1. s E˘ er Python programlama dilinin hangi sürümünü kullanmanız gerekti˘ i konusunda kararsıg g zlık ya¸ıyorsanız.6 sürümünü tavsiye ederim. Unix or OS X) yazan ba˘ lantıya tıklayarak ilgili .ubuntu. Python sürümlerini ba¸a ba¸ takip etti˘ i için. üzerinde Python 2. Bu noktada bir uyarı yapmadan geçmeyelim: Daha önce de dedi˘ imiz gibi. Aslında 2.python.2 Windows’ta Python’ı Kurmak GNU/Linux da˘ ıtımlarının aksine.ubuntu. s E˘ er her sey yolunda gittiyse Python’ın farklı bir sürümü sistemimize kurulmu¸ oldu. g Windows kullanıcıları resmi sitedeki indirme adresinde yer alan Python kurulum beti˘ ini bilg gisayarlarına indirdikten sonra kurulum dosyasına çift tıklayarak ve ekrandaki yönergeleri takip ederek Python’ı kurabilirler. Ubuntu’nun depolarında Python’ın en yeni sürümlerini rahatlıkla bulabilirsiniz.org/download] programın Microsoft Windows i¸letim sistemiyle uyumlu s sürümlerini bulabilirsiniz. Ayrıca GNU/Linux üzerinde s s g kaynaktan program derlemek konusunda tecrübeli de˘ ilseniz ve e˘ er yukarıdaki açıklamalar g g size kafa karı¸tırıcı geliyorsa. sistemdeki eski Python sürümünü silip üzerine g g yazmamı¸ olur ve iki farklı sürüm yan yana varolabilir. Yalnız g ¸ s burada make install yerine make altinstall komutunu kullandı˘ ımıza dikkat edin. Python otomatik olarak C:\Python2x dizini içine kurulacaktır.python. sadece Next tu¸larına basarak kurulumu gerçekgs s le¸tirebilirsiniz.org] indirmemiz gerekiyor. Böylece yeni kurdu˘ unuz Python. üzerinde Python 2. ben size 2.tr adresinden ula¸abilirsiniz.yeni sürümü kullanaca˘ ım!” derseniz.org.x. Dolayısıyla Python’ı Windows’ta kullanabilmek için bu programı sitesinden [http://www. yerel Türkiye sitesine ise http://www. öntanımlı ayarlarda herhangi bir de˘ i¸iklik yapmadan.x compressed source tarball (for Linux.python.com adresinden.3./configure make make altinstall Ancak bir noktaya dikkatinizi çekmek isterim: Python’ın düzgün kurulabilmesi için make altinstall komutunu yetkili kullanıcı veya root olarak çalı¸tırmalısınız. E˘ er yukarıda anlatıldı˘ ı sekilde. Resmi sitedeki indirme adresinde [http://www. kullandı˘ ınız GNU/Linux da˘ ıtımına.org/download ¸ • Bu adreste. Ubuntu’nun resmi sitesine http://www. sisteminizdekinden g g g daha yeni (veya daha eski) bir Python sürümü kurmanız da elbette mümkündür.

Biz burada konuları anlatırken Python’ın 2. ¸ s g python yazıp ENTER tu¸una basarak Python programlama dilini ba¸latıyoruz. e˘ er ilk maddede söylenenlerin geçerli olmadı˘ ından eminseniz. s 1. hem de Windows kullanıcılarının Python’ı nasıl çalı¸tırması gereks ti˘ ini tartı¸aca˘ ız.com/py3/icindekiler_python.5 oldu˘ unu görüyoruz. ˙ Ikincisi. Komutlarımızı bu i¸aretten hemen g s sonra.ler kullanıma uygundur.4.6 sürümü su anda mevcut sürümler arasında en ¸ olgunudur.4. Apr 3 2010. “pyton”. Bu g s i¸lemin nasıl yapılaca˘ ını daha sonra konu¸aca˘ ız. s Yeri gelmi¸ken önemli bir uyarıda bulunalım: Python’ın 2.6 sürümünü temel alacak olsak da Python’ın ba¸ka sürümlerini kullananlar da buradaki belgelerden faydalanabilir.1 GNU/Linux’ta Python’ı Çalı¸ tırmak s E˘ er GNU/Linux i¸letim sistemi üzerinde KDE kullanıyorsak Python programını çalı¸tırmak için g s s önce ALT+F2 tu¸larına basıp. Bunun dı¸ında.4 Python Nasıl Çalı¸ tırılır? s Bu bölümde hem GNU/Linux. Mesela yanlı¸lıkla “pyhton”. s s s “phyton” veya “Python” yazmı¸ olabilirsiniz. Do˘ ru kelimenin tamamen küçük harflerden olu¸s g s tu˘ una özellikle dikkat etmemiz gerekiyor. "credits" or "license" for more information. Buradaki >>> i¸areti g g s Python’ın bizden komut almaya hazır oldu˘ unu gösteriyor. çok dü¸ük bir ihtimal g g s olmakla birlikte. Öncelikle GNU/Linux kullanıcılarından ba¸layalım. bo¸ luk bırakmadan yazaca˘ ız. >>> Bu ekranda kullandı˘ ımız Python sürümünün 2.x numaralı s sürümleri birbirinden farklıdır. çıkan ekranda su komutu vererek bir konsol ekranı açıyoruz: s ¸ konsole E˘ er kullandı˘ ımız masaüstü GNOME ise ALT+F2 tu¸larına bastıktan sonra vermemiz gereken g g s komut sudur: ¸ gnome-terminal Bu sekilde komut satırına ula¸tı˘ ımızda. Python sisteminizde kurulu de˘ il demektir.x numaralı sürümleri ile 3. Ancak Python’ın 2.6. Kar¸ımıza suna benzer s s s ¸ bir ekran gelmeli: Python 2.6. "copyright". E˘ er Python’ın 3. “python” kelimesini yanlı¸ yazmı¸ olabilirsiniz.istihza. Yalnız GNU/Linux sistemlerinde g Python’ın kurulu olmama ihtimalinin sıfıra yakın oldu˘ unu söyleyeyim. istersek Python kodlarını bir metin s g s dosyasına da kaydedebilir. ama GNU/Linux açısından büyük-küçük harf ayrımı son derece önemlidir. g s g s 1. bu kaydetti˘ imiz metin dosyasını konsoldan çalı¸tırabiliriz. s g s g E˘ er python komutunu verdi˘ inizde yukarıdaki ekran yerine bir hata mesajıyla kar¸ıla¸ıyorg g s s sanız iki ihtimal var: Birincisi.3] on linux2 Type "help". Windows açısından “python” kelimesini büyük veya g küçük harflerle yazmanızın bir önemi olmayabilir. O yüzden sisteminizde g .5 (r265:79063.html adresindeki belgelerle çalı¸abilirsiniz.x sürümlerinden birini kullanmak istiyorsanız g http://www. 01:57:29) [GCC 4.

s s gs g • “Sistem De˘ i¸kenleri” bölümünde “Path” ö˘ esini bulup buna çift tıklayın. durumunuzun birinci madde kapg samına girmedi˘ inden emin olmalısınız.x. 1.tgz dosyasını bilgisayarınıza indirin ve klasörü açıp orada sırasıyla .. Çünkü sizin sisteminizde Python’ın hiç bir sürümü kug rulu olmadı˘ ı için. .2 Windows’ta Python’ı Çalı¸ tırmak s Python’ı yukarıda verdi˘ imiz indirme adresinden indirip bilgisayarlarına kurmu¸ olan Wing s dows kullanıcıları. (E˘ er klasik görünümde de˘ ilsg g eniz Sistem simgesini bulmak için “Performans ve Bakım” kategorisinin içine bakın veya Denetim Masası açıkken adres çubu˘ una do˘ rudan “sistem” yazıp ENTER tu¸una basın. kullandı˘ ınız da˘ ıtımın paket depog g larında olabilir. O yüzden öncelikle da˘ ıtımınızın paket depolarında “python” kelimesini kullag narak bir arama yapın ve kullandı˘ ınız da˘ ıtıma uygun bir sekilde Python paketini kurun. Unix or OS X)” ba˘ lantısına tıklayarak. E˘ er öyleyse http://www. elle kuraca˘ ınız yeni sürümün eski bir sürümle çakı¸ma riski de yok.python. cmd komutuyla ula¸tı˘ ınız MS-DOS s s s g ekranında su komutu verdi˘ inizde de kar¸ınıza Python’ın komut satırı gelecektir: ¸ g s c:/python26/python E˘ er yukarıda yaptı˘ ımız gibi uzun uzun konum belirtmek yerine sadece python komutunu g g kullanmak isterseniz Python’ı YOL’a (PATH) eklemeniz gerekir. Burada farklı olarak make altinstall yerine make install komutunu kullandı˘ ımıza dikkat edin. • TAMAM’a basıp çıkın. make ve make install komutlarını verin. biz size da˘ ıtımınızın depolarında bulunan Python sürümünü kulg g lanmanızı siddetle tavsiye ediyoruz. siz Python’ı kaynakg g tan derlemek istiyor olabilirsiniz.. Python kullandı˘ ınız da˘ ıtımın paket depolarında bulunsa bile. resimli ve daha ayrıntılı bir anlatım için Windows’ta g s s Python’ı YOL’a Eklemek adlı makalemizi inceleyebilirsiniz. • Bu de˘ i¸ikliklerin geçerlilik kazanabilmesi için açık olan bütün MS-DOS pencerelerini kapgs atıp yeniden açın. Ba¸lat/Programlar/Python 2. g . g E˘ er kullandı˘ ınız GNU/Linux da˘ ıtımında Python’ın kurulu olmadı˘ ına eminseniz. önünüzde g g g g iki seçenek var: Birincisi.4. s Ayrıca alternatif olarak.org/download adresinden g “Python 2.Python’ın kurulu olmadı˘ ına kesinkes karar vermeden önce. Ancak g daha önce de dedi˘ imiz gibi. gs g • “De˘ i¸ken De˘ eri” ifadesinin hemen kar¸ısındaki kutucu˘ un en sonuna su girdiyi ekleyin: gs g s g ¸ . Not: E˘ er bu i¸lemler size karı¸ık geldiyse.) g g s • “Geli¸mi¸” sekmesine girin ve “Ortam De˘ i¸kenleri” dü˘ mesine basın. Peki Python’ı nasıl YOL’a ekleyece˘ iz? Söyle: g ¸ • Denetim Masası içinde “Sistem” simgesine çift tıklayın.C:\Python26. g g ¸ ˙ Ikincisi. Python o anda sisteminizde kurulu olmasa bile.x/Python (Command Line) yolunu takip ederek s Python’ın komut satırına ula¸abilirler. O g g s yüzden make altinstall yerine do˘ rudan make install komutunu kullanabilirsiniz. ¸ Gelelim Microsoft Windows kullanıcılarına./configure.x compressed source tarball (for Linux. Ba¸lat/Çalı¸tır yolunu takip ederek.

Ben size elimden geldi˘ ince yardımcı olmaya çalı¸ırım. Önce CTRL+Z tu¸larına. s g g 2. Orada Python26 adlı bir klasör g görüyor olmalısınız. "copyright".E˘ er yukarıdaki i¸lemleri ba¸arıyla gerçekle¸tirdiyseniz. s g python yazıp ENTER tu¸una bastı˘ ınızda kar¸ınıza söyle bir ekran geliyor olmalı: s g s ¸ Python 2.exit() komutlarını vermek (Bütün i¸letim sistemleri) s Siz bu farklı yöntemler arasından. s g s 3. Komutlarımızı bu i¸aretten hemen g s sonra. kistihza [at] yahoo [nokta] com adresins den bana ula¸abilirsiniz. quit() yazıp ENTER tu¸una basmak (Bütün i¸letim sistemleri) s s 5. Mesela yanlı¸lıkla “pyhton”. Ba¸lat/Programlar yolu içinde bir “Python26” girdisi olup s s olmadı˘ ına bakın.1500 32 bit (Intel)] on win32 Type "help". bo¸ luk bırakmadan yazaca˘ ız. ardından da sys. Python’ı YOL’a ekleyememi¸ olabilirsiniz. Ancak bu i¸lemi s s kaba kuvvete ba¸vurmadan yapmanın bir yolu olmalı. 21:48:26) [MSC v. Peki bu komut satırından çıkmak istersek ne yapaca˘ ız? Elbette do˘ rudan g g g g komut penceresi üzerindeki çarpı tu¸una basarak bu ortamı terk edebilirsiniz. Ayrıca C:\ dizininin içini de kontrol edin. Python’ı kuramamı¸ olabilirsiniz. ¸ s s g 1. istersek Python kodlarını bir metin s g s dosyasına da kaydedebilir. “python” kelimesini yanlı¸ yazmı¸ olabilirsiniz. bu kaydetti˘ imiz metin dosyasını komut satırından çalı¸tırabiliriz. de˘ il mi? s g Komut satırından çıkmanın birkaç farklı yolu vardır: 1. g s Bu i¸lemin nasıl yapılaca˘ ını daha sonra konu¸aca˘ ız. E˘ er yukarıda anlattı˘ ımız YOL’a ekleme adıms g g larını uygulamak konusunda sıkıntı ya¸ıyorsanız. Önce import sys. ardından da ENTER tu¸una basmak (Windows) s s 3. Bu yüzden “python” kelimesini do˘ ru yazdı˘ ınıza emin olun.5 oldu˘ unu görüyoruz. Komut ekranı üzerindeki çarpı dü˘ mesine basmak (kaba kuvvet) g 2. kolayınıza hangisi geliyorsa onu seçebilirsiniz. E˘ er programlar listesinde veya C:\ dizini içinde “Python26” diye g bir sey yoksa Python’ı kuramamı¸sınız demektir. Bu durumda Python’ı yeniden kurmayı ¸ s deneyebilirsiniz.5 Python’dan Nasıl Çıkılır? Farklı i¸letim sistemlerinde python komutunu vererek Python’ın komut satırına nasıl eri¸ebiles s ce˘ imizi ö˘ rendik. s g s g E˘ er python komutunu verdi˘ inizde yukarıdaki ekran yerine bir hata mesajıyla kar¸ıla¸ıyorg g s s sanız üç ihtimal var: 1. “pyton” veya s s s “phyton” yazmı¸ olabilirsiniz. >>> Bu ekranda kullandı˘ ımız Python sürümünün 2. "credits" or "license" for more information. Mar 19 2010. Buradaki >>> i¸areti g g s Python’ın bizden komut almaya hazır oldu˘ unu gösteriyor. .6. Ba¸lat/Çalı¸tır yolunu takip edip cmd g s s s s s komutunu vererek ula¸tı˘ ınız MS-DOS ekranında. CTRL+Z tu¸larına basmak (GNU/Linux) s 4.5 (r265:79096. Bunun dı¸ında.6. Ben sizin yukarıdaki komutu düzgün bir sekilde çalı¸tırabilmi¸ oldu˘ unuzu varsayıyorum.

kurulu gelen. s g s 4. s s s g g . Localhost’tan hizmet veren “pydoc” (Module Docs) sunucusunu çalı¸tırın ve bunun ne i¸e yaradı˘ ını anlamaya çalı¸ın.6 sürümü var. Python’ın GNU/Linux. g http://www.Net çatısı ile a¸inalı˘ ınız varsa IronPython’ın ne g s g oldu˘ unu ara¸tırın. Sizce Python’ın bu kadar farklı i¸letim sistemi ve platform g s üzerinde çalı¸abiliyor olması bu dilin hangi özelli˘ ini gösteriyor? s g 2. Ama önce s g bölüm sorularına bakalım. sizin kaynaktan derledi˘ iniz Python sürümünün birbiriyle çakı¸maması için g s gerekli önlemleri alın. Tercihen VirtualBox gibi bir sanalla¸tırma aracı ile kurdu˘ unuz bir GNU/Linux da˘ ıtımı üzs g g erinde Python kurulumuna ili¸kin bazı denemeler yapın. E˘ er siz bir Windows kullanıcısıysanız ve . Sistemde kurulu olarak gelen Python sürümüyle. Python’ın ba¸ka hangi platformlara s ait sürümlerinin oldu˘ unu inceleyin. Windows dizinleri YOL’a nasıl ekleniyor? YOL’a eklenen dizinler birbirinden hangi i¸aret ile ayrılıyor? Bir dizinin YOL üstünde olup olmaması s neyi de˘ i¸tiriyor? Sitesinden indirip kurdu˘ unuz Python sürümünü YOL’a eklemeyi deneyin. yoksa ba¸ka bir paketin ba˘ ımlılı˘ ı olarak mı sisteme kuruluyor? E˘ er Python kurus g g g lumla birlikte geliyorsa. g s s g 7.org/download adresini ziyaret ederek. Windows’ta YOL (PATH) yapısını inceleyin. E˘ er GNU/Linux da˘ ıtımlarından birini kullanıyorsanız. g s 5. Siz Python’ın sitesinden farklı bir Python sürümü indirdi˘ inizde Python’ın öntanımlı sürümüne ve kaynaktan derg lenen sürümüne ayrı ayrı nasıl ula¸abilece˘ inizi dü¸ünün. E˘ er siz bir Java programcısı iseniz Jython’ın ne oldu˘ unu ara¸tırın. g g s 6. 1.python. Örne˘ in Python’ın resmi sitesinden s g dilin kaynak kodlarını indirip programı kaynaktan derleyin. Windows ve Mac OS X sürümleri oldu˘ unu biliyoruz. Kullandı˘ ınız i¸letim sisteminde Python’ı kaç farklı biçimde çalı¸tırabildi˘ inizi kontrol edin. nasıl kuraca˘ ımızı ve Python’ın komut satırını nasıl g g ba¸latıp kapatabilece˘ imizi ö˘ renmi¸ olduk. Python’ın hangi sürümü? Da˘ ıtımınızın depolarındaki en g yeni Python sürümü hangisi? 3. s s g s 8. sisteminizde Python programlama g g dilinin kurulu olup olmadı˘ ını denetleyin. Diyelim ki sisteminizde Python’ın 2. Windows’ta Python’ın hangi araçlarla birlikte kuruldu˘ unu kontrol edin. Python’a ili¸kin en temel bilgileri edinmi¸ oldu˘ us g g s s s g muza göre artık Python’la daha ciddi i¸ler yapmaya do˘ ru ilk adımlarımızı atabiliriz.Böylece Python’ı nereden indirece˘ imizi. Kurulumla birlikte g gelen çevrimdı¸ı ˙ s Ingilizce kılavuzları inceleyin.6 Bölüm Soruları 1. gs g Bu i¸lem sırasında ne gibi sorunlarla kar¸ıla¸tı˘ ınızı de˘ erlendirin. Kullandı˘ ınız da˘ ıtımda Python kurulumla birlikte mi g g g geliyor.

.BÖLÜM 2 Python’a Giri¸ s Bir önceki bölümde Python’ın komut satırına nasıl ula¸aca˘ ımızı görmü¸tük.1 print Komutu print komutunun görevi. s Not: Yukarıdaki komutta gördü˘ ümüz >>> i¸aretini kendimiz yazmayaca˘ ız. g 2. Simdi isterseniz birkaç parmak alı¸tırması yapıp kendimizi g s ¸ s Python’a ısındıralım. Apr 3 2010. Bu komut satırına s g s teknik dilde etkile¸ imli kabuk (interactive shell) veya yorumlayıcı (interpreter) adı verilir. ekrana bir seyler yazdırmamızı sa˘ lamaktır. >>> Komutlarımızı bu >>> i¸aretinden hemen sonra. Bu bölümde inceleyece˘ imiz ilk komutumuzun adı print. "copyright". O i¸aret.4. Bizim sadece print yazmamız yeterli..3] on linux2 Type "help". Simdi de bo¸ bir satır bırakmak yerine ekrana bir seyler yazmasını söyleyelim Python’a: ¸ s ¸ 9 . s Simdi önceki bölümde anlattı˘ ımız yöntemlerden herhangi birini kullanarak Python’ın etk¸ g ile¸imli kabu˘ unu açalım ve suna benzer bir ekranla kar¸ıla¸alım: s g ¸ s s istihza@istihza:~$ python Python 2.6. 01:57:29) [GCC 4. etkg s g s ile¸imli kabu˘ un görüntüsünü temsil ediyor. de˘ il mi? Bunu ona yapmasını biz s g söyledik. hiç bo¸luk bırakmadan yazmaya ba¸layas s s ca˘ ımızı daha önce söylemi¸tik. s g Ne oldu? Python bir satır bo¸luk bırakarak alt satıra geçti. o da yaptı.5 (r265:79063. Mesela bu komutu tek ¸ g ba¸ına kullanmayı deneyelim: s >>> print yazıp hemen ENTER tu¸una basalım. "credits" or "license" for more information.

Diyelim ki “˙ Istanbul’un 5 günlük hava tahmini” ifadesini ekrana yazdırmak istiyoruz.>>> print "Programa ho¸geldiniz.html adresindeki Python 3. Lütfen giri¸ yapın!” g s s ifadesini çift tırnak içinde belirtiyoruz.istihza.x belgelerinden yararlanabilirsiniz. line 1 print ’˙stanbul’un 5 günlük hava tahmini’ I ^ SyntaxError: invalid syntax Bunun sebebi. Lütfen giri¸ yapın!’ s s Bu komut da bize istedi˘ imiz çıktıyı ba¸arıyla verecektir. E˘ er mutlaka tek tırnak kullanmak istiyorsak. g g g muhtemelen kullandı˘ ınız Python sürümü 2. Ancak tırnak seçiminde bazı noktalara da dikkat etmemiz gerekiyor." . çok büyük bir ihtimalle tırnakları düzgün yerle¸tirmemi¸sinizdir.x de˘ il. E˘ er öyleyse. Dedi˘ imiz gibi. line 1 print "Python’daki önemli komutlardan biri de "print" komutudur. g http://www. “˙ Istanbul’un” kelimesindeki kesme i¸aretinden ötürü Python’ın tırnakların s nerede ba¸layıp nerede bitti˘ ini anlamamasıdır. Biz istersek yukarıdaki örnekte çift tırnak yerine tek tırnak (‘) da kullanabiliriz." Bu komut bize söyle bir hata mesajı verecektir: ¸ File "<stdin>".com/py3/icindekiler_python. E˘ er burada çift tırnak i¸aretini koymazsak veya koyg s mayı unutursak Python bize bir hata çıktısı gösterecektir. s s Not: E˘ er yukarıdaki komutu do˘ ru yazdı˘ ınız halde hata alıyorsanız. Ancak aynı ¸ I i¸lemi tek tırnakla yapmaya çalı¸ırsak söyle bir hata mesajı alırız: s s ¸ File "<stdin>". Lütfen giri¸ yapın! s s s çıktısını görmemiz gerekiyor. s g g kodu su hale getirmemiz gerekir: ¸ ˙ >>> print ’Istanbul\’un 5 günlük hava tahmini’ Aynı sekilde. Bunu çift tırnak kullanarak su sekilde gösterebiliriz: ¸ ¸ >>> print "˙stanbul’un 5 günlük hava tahmini" I Bu komut bize hatasız bir sekilde ˙stanbul’un 5 günlük hava tahmini çıktısını verir.x’tir. Gördü˘ ünüz gibi print komutunun ardından gelen “Programa ho¸geldiniz. g g 3. söyle bir örnekte de çift tırnak bize zorluk çıkarır: ¸ ¸ >>> print "Python’da önemli komutlardan biri de "print" komutudur. kullanaca˘ ınız tırg s g g nak tipi konusunda özgürsünüz. Zaten yukarıdaki komutu verdikten sonra bir hata alıyorsanız. Lütfen giri¸ yapın!" s s Bu satırı yazıp ENTER tu¸una bastıktan sonra ekranda Programa ho¸geldiniz." ^ SyntaxError: invalid syntax Bu cümleyi düzgün olarak gösterebilmek için yukarıdaki komutu söyle yazmamız gerekir: ¸ >>> print "Python’da önemli komutlardan biri de \"print\" komutudur. Tırnak seçiminde özgürüz: >>> print ’Programa ho¸geldiniz.

Tanımından da anla¸ılaca˘ ı gibi. cümleyi ba¸latan ve bitiren tırnak i¸aretleriyle karı¸maz. Yani bu i¸aret sayesinde. tırnak içinde gösteres s g bildi˘ imiz her sey bir karakter dizisi olabilir. Simdilik bu kaçı¸ dizisi kavramını çok fazla kafamıza takmadan yolumuza ¸ s devam edelim. “Linux’un güçlü yanları” s g cümlesini tek tırnak içine aldı˘ ımız için. print komutu Python’daki en önemli ve en temel komutlardan biridir. ¸ g Aslında biz karakter dizisinin ne oldu˘ unu biliyoruz.. Bu bölümde “karakter dizisi” diye bir seyden söz edece˘ iz. Mesela su örnekler birer karakter dizisidir: g ¸ ¸ "Python" "Perl" "Ruby" "23" . tırnak g içinde gösterilen herhangi bir “¸ey”dir. Python’la g yazdı˘ ınız programlarda kullanıcılarınıza herhangi bir mesaj göstermek istedi˘ inizde bu print g g komutundan yararlanacaksınız. cümle içinde geçen tırnak i¸aretlerine dikkat etmemiz gerekti˘ ini bilelim ¸ s g yeter. Python’ın kafasını karı¸tırmas g s mak için burada kaçı¸ dizilerinden yararlanarak düzgün çıktı almayı sa˘ lıyoruz. bundan sonraki konug g ları daha rahat anlayabilmemiz için bazı kavramlardan söz etmemiz faydalı olabilir. karakter dizileri. cümle içinde g s geçen tırnak i¸aretleri. Sen yoluna devam et. Dilerseniz bu önemli komutla birkaç örnek daha yapalım elimizi alı¸tırmak için: s >>> print "GAME OVER" GAME OVER >>> print "FINISH HIM!" FINISH HIM! >>> print "Linux’un güçlü yanları" Linux’un güçlü yanları >>> print ’Linux\’un güçlü yanları’ Linux’un güçlü yanları Yukarıdaki son örnekte “\” i¸aretini neden kullandı˘ ımızı biliyorsunuz. Yukarıda print komutunu i¸lerken bu karakg s ter dizilerini zaten kullandık.Yukarıdaki iki örnekte gördü˘ ümüz “\” i¸aretleri. Zaten birkaç bölüm sonra bu kaçı¸ dizilerinden ayrıntılı olarak söz edece˘ iz. Yani Linux’un s g kelimesindeki kesme i¸aretiyle kar¸ıla¸an Python’a söyle demi¸ oluyoruz: “Bu tırnak senin s s s ¸ s aradı˘ ın tırnak de˘ il.. s g Biz su anda sadece. Biraz ilerde aradı˘ ın tırna˘ ı bulacaksın!“ g g g g 2.2 Karakter Dizileri Python’daki en önemli komutlardan biri olan print‘i ö˘ rendi˘ imize göre. kendilerinden sonra gelen karakterlerin g s Python tarafından normalden farklı algılanmasını sa˘ lar. Dedi˘ imiz gibi. Buna bens s s s zer hatalardan kaçmamızı sa˘ layan bu tür i¸aretlere Python dilinde Kaçı¸ Dizileri (Escape Seg s s quences) adı verilir. Yabancılar buna string adı veriyor. Linux’un kelimesindeki kesme i¸aretinden (‘) ötürü g s Python tırnakların nerede ba¸layıp nerede bitti˘ ini anlayamaz. Oradaki örneklerden de görece˘ iniz gibi.

Yani ilerde kodlarımızı bir dosyaya s kaydetti˘ imiz zaman. bir karakter dizisinin ne kadar uzun veya ne kadar kısa g oldu˘ unun hiçbir önemi yok.. s Python’da karakter dizilerini ekrana yazdırabilmek için print komutundan yararlanabilece˘ imizi g biliyorsunuz. Bir karakter dizisi tek bir karakterden olu¸abilece˘ i gibi. tırnak i¸areti ta¸ımalarıdır.. g g Su örne˘ e bir bakalım: ¸ g >>> print "Python programlama dili" Python yukarıdaki gibi bir komutla kar¸ıla¸tı˘ ında iki basamaklı bir i¸lem gerçekle¸tirir. Mesela: >>> print "k" k >>> print "456" 456 >>> print "Ruby" Ruby >>> print "˙stanbul’un 5 günlük hava tahmini" I ˙stanbul’un 5 günlük hava tahmini I Etkile¸imli kabukta çalı¸ırken.. Yukarıs g daki örneklerden de gördü˘ ümüz gibi.. herhangi bir seyi ekrana yazdırag g ¸ bilmek için mutlaka print komutundan yararlanmamız gerekti˘ ini görece˘ iz. yukarıdaki kodların çıktı vermedi˘ ini. istersek yukarıdaki örnekleri print komutunu kullanmadan da s s ekrana yazdırabiliriz: >>> "Python" ’Python’ >>> "Perl" ’Perl’ >>> "Ruby" ’Ruby’ >>> "4243" ’4243’ Ancak bu durum sadece etkile¸imli kabuk için geçerlidir. E˘ er yukarıdaki örnekleri g s s g tırnak i¸aretsiz olarak kullanırsak. “@falanca” da. Bu nedenle “c” de bir karakter dizisidir. artık bu ö˘ eler birer karakter dizisi olmayacaktır. Önce s s g s s ."35" "@falanca" "c" Karakter dizilerinin ayırt edici özelli˘ i. birden g s g fazla karakterden de olu¸abilir.

Önemli olan.) s g s Biz bu karakter dizisini kullanıcıya gösterebilmek için söyle yazaca˘ ız: ¸ g >>> print "dünya" dünya Yazdı˘ ımız Python programlarını dosyaya kaydedip çalı¸tırdı˘ ımızda yukarıda anlattıklarımızın g s g ne demek oldu˘ unu çok daha net bir sekilde anlayaca˘ ız. (Buradaki “\xc3\xbc” kısmı kullandı˘ ınız i¸letim sistemine göre farklılık gösterebilir. g Demek ki Python bizim girdi˘ imiz “dünya” adlı karakter dizisini “d\xc3\xbcnya” seklinde görüyg ¸ ormu¸." veya tek tırnak: >>> print ’Python güçlü bir programlama dilidir. Python’ın ne sekilde gördü˘ ünü gösterir. Python’da s s karakter dizilerini göstermek için farklı tırnak tiplerini kullanabilirsiniz. Yani söyle bir çıktı verir: ¸ Python programlama dili Etkile¸imli kabukta bir karakter dizisini print komutu olmadan kullandı˘ ımızda Python yalnızca s g birinci basama˘ ı gerçekle¸tirmi¸ olur. Böyle bir durumda yaptı˘ ı tek sey bu karakter dizisini g s s g ¸ okumaktır. Yani Python bize söyle bir sey g ¸ g ¸ ¸ söylemi¸ olur: s “Sen simdi etkile¸imli kabu˘ a bir seyler yazdın. Yalnız önceki bölümde. Bu tırnak tipleri içinde en yaygın kullanılan çift tırnaktır. Üç tırnak: >>> print """Python güçlü bir programlama dilidir. e˘ er yukarıdaki açıkg ¸ g g lamalar size kafa karı¸tırıcı geldiyse hiç endi¸e etmenize gerek yok.. Okumaya devam edes s bilirsiniz. “dünya” kelimesi içindeki Türkçe karakter (“ü”) çıktıda düzgün görünmüyor. Örne˘ in çift tırnak kulg lanabilirsiniz: >>> print "Python güçlü bir programlama dilidir. print komutunu kullanarak bu karakter dizisini kullanıcıya göstermedi˘ imiz için g ikinci basamak gerçekle¸mez. Yazdı˘ ın seyi al¸ s g ¸ g ¸ gıladı˘ ımı göstermek için de. Hangi tırnak g s çe¸idini kullandı˘ ınızın çok fazla bir önemi yok. Dolayısıyla elde etti˘ imiz çıktı. Ancak print g s gibi bir komut yardımıyla ekrana herhangi bir sey basmamı¸ olman da dikkatimden kaçmadı ¸ s de˘ il!“ g Basit bir örnek verelim: >>> "dünya" ’d\xc3\xbcnya’ Gördü˘ ünüz gibi. duruma göre kullanılan tırnak tipinin önem kazandı˘ ını gösteren söyle bir örnek verdi˘ imizi biliyorsunuz: g ¸ g .""" Gördü˘ ünüz gibi. çıktıyı sana tek tırnak i¸aretleri içinde gösterdim. Tabii siz istedi˘ iniz tırnak biçimini g kullanmakta özgürsünüz.. Ben de bunu algıladım. karakter dizileriyle birlikte üç farklı tırnak çe¸idi kullanabiliyoruz. O yüzden. ardından da print komutunun etkisiyle bu karakter dizisini ekrana basıp kullanıcıya gösterir. Ama Python bize bunların dı¸ında bir s s tırnak alternatifi daha sunar. söz konusu karakter dizisini s g kullanıcının de˘ il. Karakter dizilerini göstermek için tırnak i¸aretlerinden yararlanıyoruz demi¸tik. karakter dizisini hangi tırnakla s g açtıysanız o tırnakla kapatmanızdır.’ Bu tırnak tiplerini önceki örneklerimizde görmü¸tük.“Python programlama dili” adlı karakter dizisini okur.

. .. o g g yüzden de söyle bir hata mesajı verecektir: ¸ File "<stdin>"... line 1 print ’˙stanbul’un 5 günlük hava tahmini’ I ^ SyntaxError: invalid syntax Dikkat ederseniz hata çıktısındaki ˙stanbul’un kelimesinin sonunda minik bir ok i¸areti var. I s ˙ste bu ok. Zira yukarıdaki karakter dizisine tek tırnakla ba¸lasak Ahmet’in kelimesi s içindeki kesme i¸areti.. Ancak ˙stanbul’un kelimesi içinde geçen kesme i¸aretinden ötürü.""" g Gördü˘ ünüz gibi. 3 TL Tatlı. "ödevini yapmadan gelme!" dedi. üç tırnak i¸areti sayesinde karakter dizisi içinde hem tek tırnak. Bu karakter dizisini göstermek için çift tırnaklardan yararlandık..... O yüzden yukarıdaki kullanımın s g kafanızı karı¸tırmasına izin vermeyin.. s g söyle bir kullanım Python’ın kafasının karı¸masına yol açacaktır: ¸ s ˙ >>> print ’Istanbul’un 5 günlük hava tahmini’ Bu kullanımda. Python karakter dizisini kapatan tırna˘ ın hangisi oldu˘ unu anlayamayacak...... kullanılan I s tırnakların birbirine karı¸ması gibi bir tehlike söz konusu... Bu engellere takılmadan.. 6 TL Çorba.... . I¸ Böyle bir hata mesajı almamak için kaçı¸ dizilerinden yararlanmamız gerekti˘ ini söylemi¸tik: s g s >>> print ’˙stanbul\’un 5 günlük hava tahmini’ I Biraz sonra kaçı¸ dizilerinden ayrıntılı olarak söz edece˘ iz. ¸ s Üç tırnak i¸aretinin marifetleri yukarıdakilerle sınırlı de˘ ildir. hem de çift g s tırnak kullanabildik....˙ >>> print "Istanbul’un 5 günlük hava tahmini" Burada “˙ Istanbul’un 5 günlük hava tahmini” bir karakter dizisidir. çift tırnakla ba¸lasak “ödevini yapmadan gelme!” ifadesi içindeki s s çift tırnak i¸aretleri bize sorun yaratacak. Yani....... Bu tırnak tipi. kodumuzu düzgün bir s sekilde ekrana yazdırabilmek için üç tırnak i¸aretlerini kullanmayı tercih ettik.. kimi durumlarda s g i¸imizi bir hayli kolayla¸tırır.. 2 TL Böyle bir çıktı vermenin en kolay yolu üç tırnak i¸aretlerinden yararlanmaktır: s >>> .... ... hata üreten sorunlu bölgeyi gösteriyor. . 2 TL """ .. daha önce de gördü˘ ümüz gibi. s E˘ er bunların hiçbiriyle u˘ ra¸mak istemezseniz üç tırnaktan da yararlanabilirsiniz: g g s >>> print """Ahmet’in ö˘retmeni Cem Bey. print """ Günün mönüsü -----------Makarna .. 6 TL Çorba. .. 3 TL Tatlı. ˙ Istersek elbette bu karakter dizisini tek tırnak ile de gösterebiliriz. Mesela kullanıcılarımıza söyle bir çıktı göstermemiz gerekti˘ ini s s ¸ g varsayalım: Günün mönüsü -----------Makarna .....

“+” i¸aretini kullanarak iki karakter dizisini birle¸tirebiliyoruz. g s Python karakter dizilerini birle¸tirebilmemiz için bize ba¸ka imkanlar da tanır.. Aynı sey tek tırnak için de geçers g ¸ lidir.. 2 TL Normalde. bize karakter dizilerimizi birden fazla satıra bölme imkanı da tanıyor. ˙ Ilerde bu özellikten sık sık faydalandı˘ ımızı göreceksiniz. Mesela bir kimsenin adı ile soyadını birle¸tirmek istersek ne yapmalıyız? g s >>> print "Fırat" + "Özgül" FıratÖzgül Gördü˘ ünüz gibi. tek tırnak veya çift tırnak ile ba¸ladı˘ ımız bir karakter dizisinde kapanı¸ tırna˘ ını s g s g koymadan ENTER tu¸una basarsak hata alırız: s >>> print "Günün Mönüsü File "<stdin>"..... Bu problemi çözmek s için söyle bir sey yapabilirsiniz: ¸ ¸ >>> print "Fırat" + " " + "Özgül" Fırat Özgül Burada “Fırat” ile “Özgül” karakter dizileri arasına bo¸ bir karakter dizisi yerle¸tirdik.....Burada ilk üç tırnak i¸aretini koyduktan sonra ENTER tu¸una bastık.. Çıktıda isim ve soyisim birbirine biti¸ik olarak görünüyor. Aynı seyi tek ¸ veya çift tırnakla yapamıyoruz.. 3 TL Tatlı.. Ancak burada g s s bir sorun var. Biz de bu beklentiye uyarak.. “Günün mönüsü” satırını g yazıyoruz. ˙simiz bitti˘ inde de g I¸ g kapanı¸ tırnaklarını koyup ENTER tu¸una basarak çıktıyı alıyoruz: s s Günün mönüsü -----------Makarna . ama tırna˘ ı kapatmadan ENTER s g tu¸una bastı˘ ımız için Python bize bir hata mesajı gösterdi.. Ama yukarıda da gördü˘ ünüz gibi üç tırnak farklıdır: g >>> print """Günün Mönüsü .. Mesela su örne˘ e s s ¸ g bir bakın: ˙ >>> print "Istanbul" "Çeliktepe" ˙stanbulÇeliktepe I . line 1 print "Günün Mönüsü ^ SyntaxError: EOL while scanning string literal Burada “Günün Mönüsü” karakter dizisine çift tırnakla ba¸ladık...... Üç tırnak i¸areti. g Karakter dizilerine ili¸kin önemli bir konu da bu karakter dizilerinin birbirleriyle nasıl birle¸tirs s ilece˘ idir. Tekrar ENTER tu¸una bastı˘ ımızda yine . Bu i¸aret Python’ın bizden komut girmeye s s g s devam etmemizi bekledi˘ ini gösteriyor. Alt satıra geçildi˘ inde s s g >>> i¸aretinin . 6 TL Çorba. i¸aretine döndü˘ üne dikkat edin. karakter dizileri içinde geçen farklı tipte tırnakları atlatmamızı sa˘ lamanın s g yanısıra. Yazaca˘ ımız kodlar bitene kadar böyle devam ediyoruz. i¸aretini görüyoruz ve hemen “———-” s g s satırını yazıyoruz. Böylece s s çıktımız tam istedi˘ imiz gibi olmu¸ oldu.

. iki karakter dizisini. hatta: . g s Elbette Python’da çareler tükenmez. ¸ s 2. Biraz önceki yöntemi kullanarak bu karakter dizilerini ayırmamız s mümkün: ˙ >>> print "Istanbul" " " "Çeliktepe" Hatta yukarıdaki gibi bir çıktı alabilmek için söyle bir seyler de yapabilirsiniz: ¸ ¸ ˙ >>> print "Istanbul " + "Çeliktepe" veya: ˙ >>> print "Istanbul " "Çeliktepe" Burada ayrı bir bo¸ karakter dizisi eklemek yerine. "Özgül" Fırat Özgül Burada da karakter dizilerini birbirlerinden virgülle ayırmayı tercih ettik.. Ama g isterseniz bu konuya simdilik bir ara verelim ve Python’da farklı bir konuya giri¸ yapalım. Dilerseniz yukarıdaki bütün her seyi unutup söyle bir sey ¸ ¸ ¸ yazmayı da tercih edebilirsiniz: >>> print "Fırat"..Gördü˘ ünüz gibi. Bu son kullanım sıklıkla kar¸ımıza çıkacak. O yüzden bu kullanımı aklımızda tutmamız gerekiyor. “˙ s Istanbul” adlı karakter dizisinin kapanı¸ s tırna˘ ını koymadan önce bir bo¸luk bırakıyoruz.2 3 . g s s Ancak burada da biraz öncekine benzer bir sorunla kar¸ı kar¸ıyayız. Karakter dizilerimiz yine s s birbirine biti¸ik görünüyor. Ancak ö˘ rendiklerimiz henüz dört dörtlük bir ¸ ¸ g g program yazmaya yetmiyor. ya da: >>> 2 * 5 10 ... araya herhangi bir i¸aret koymadan da birle¸tirebiliyoruz. Python’ı simdilik basit bir hesap makinesi niyetine ¸ kullanabilmemize engel de˘ il.3 Python’da Sayılar ve Matematik ˙slemleri I¸ Simdiye kadar Python’da bazı seyler ö˘ rendik. veya: >>> 5 .... Ama bu durum. s Karakter dizilerinden ve bunların inceliklerinden ileride de söz etmeye devam edece˘ iz. g Örne˘ in: g >>> 2 + 5 7 .

bölme s s s i¸lemi için ise “/” i¸aretlerini kullanmak gayet makul duruyor. Çünkü bunlardan biri sayı öteki ise karakter s dizisidir (string). Bu durumu g birkaç örnekle görelim: >>> print 25 + 50 75 Bu komut. Bir örnek s verelim: >>> print 234 + 546 780 Aritmetik i¸lemler yapabilmek için kullandı˘ ımız i¸aretlerin size mantıklı gelmi¸ oldu˘ unu s g s s g zannediyorum.5 çıkar. 25 ve 50’yi toplayıp sonucu çıktı olarak verir.0 / 2 2.5 . “25” ifadesi ile “Çeliktepe” ifadesi arasında Python açısından hiç bir fark yoktur. ekrana 25 + 50 seklinde bir çıktı verecektir. Simdi a¸a˘ ıdaki örne˘ e bakalım: ¸ s g g >>> print "25 + 50" 25 + 50 Bu komut 25 ile 50’yi toplamak yerine. Peki. E˘ er tırnak i¸areti kullanırg s g s sak Python yazdıklarımızı sayı olarak de˘ il karakter dizisi olarak algılayacaktır. Öncelikle su komutun çıktısını inceleyelim: ¸ s ¸ >>> print 5 / 2 2 Ama biz biliyoruz ki 5’i 2’ye bölerseniz 2 de˘ il 2. söyle ¸ ¸ bir komut verirsek ne olur? >>> print "25" + "50" Böyle bir komutla kar¸ıla¸an Python derhal “25” ve “50” karakter dizilerini (bu sayılar tırnak s s içinde oldu˘ u için Python bunları sayı olarak algılamaz) yan yana getirip birle¸tirecektir. Aynı komutu bir de söyle deneyelim: g ¸ >>> print 5. Yani g s söyle bir sey yapacaktır: ¸ ¸ >>> print "25" + "50" 2550 Uzun lafın kısası.>>> 6 / 2 3 ˙ Isterseniz bunların ba¸ına print komutu ekleyerek de kullanabilirsiniz bu kodları. Simdi aritmetik i¸lemlere geri dönelim. Toplama i¸lemi için “+”. çıkarma i¸lemi için “-”. de˘ il mi? s s g Gördü˘ ünüz gibi sayıları yazarken tırnak i¸aretlerini kullanmıyoruz. çarpma i¸lemi için “*”. Ancak tırnak i¸areti olmayan 25 ile “Çeliks tepe” ifadeleri Python dilinde ayrı anlamlar ta¸ır. Bunların ikisi de karakter dizisi sınıfına girer.

s g s E˘ er her defasında ”..5. E˘ er bu i¸lemi insanların anlayabilece˘ i bir biçime getirmek istersek söyle yazg s g ¸ mamız gerekir: . vb. bir de sanal kısımdan s s olu¸an sayılardır. 6. karakter dizilerinden bahsederken. E˘ er özel s s g olarak matematikle ilgili i¸ler yapmıyorsanız uzun sayılar ve karma¸ık sayılar pek kar¸ınıza s s s çıkmaz. Uzun Sayılar (long integers) -2. Örne˘ in: ¸ g >>> print 2 + 6 / 3 * 5 . s Bu sayılar içinde en sık kar¸ıla¸acaklarımız tamsayılar ve kayan noktalı sayılardır. önce s s bölme ve çarpma sonra toplama ve çıkarma seklinde olacaktır. 2j+4.5 Python’da aritmetik i¸lemler yapılırken alı¸tı˘ ımız matematik kuralları geçerlidir. Bu arada yapaca˘ ımız aritmetik i¸lemlerde sayıları g gs g s kayan noktalı sayı cinsinden yazmamız i¸lem sonucunun kesinli˘ i açısından büyük önem ta¸ır.Gördü˘ ünüz gibi bölme i¸lemini olu¸turan bile¸enlerden birinin yanına ”. 5.” mesajı gönderebilirsiniz: >>> from __future__ import division Not: Burada “__” i¸aretini klavyedeki alt çizgi tu¸una iki kez art arda basarak yapabilirsiniz. Hatırlarsanız.4 i¸leminin sonucu 8 olacaktır.483. Tabii biz istersek parantezler yardımıyla Python’ın kendili˘ inden s g kullandı˘ ı öncelik sırasını de˘ i¸tirebiliriz. çarpma i¸lemleri yapılacaksa i¸lem öncelik sırası.3. Böylelikle Python bizim sonucu kayan noktalı sayı olarak görmek istedi˘ imizi ang lıyor.6999999999999993 Herhalde bekledi˘ iniz çıktı bu de˘ ildi. print‘li ve print‘siz kullanımdan söz etmi¸tik. vb.. toplama. Birkaç örnek görelim: g >>> print 5 / 2. Mesela 3. s s Artık bir sonraki Python oturumuna kadar bütün i¸lemlerinizin sonucu kayan noktalı sayı s olarak gösterilecektir. 6. herhangi bir ondalık kısım barındırmayan sayılardır. Bu ”. su komutla Python’a. Bu arada ondalık kısmı virgülle de˘ il noktayla gösterdi˘ imize g g dikkat edin. Mesela yukarıda sayılardan s s g bahsettik. “Bana her zaman kesin g ¸ sonuçlar göster.3 8.4. 12 . Kayan Noktalı Sayılar (floating point numbers) Ondalık bir kısım da barındıran sayılardır.0” koymaktan sıkılıyorsanız. -3 vb... Mesela 34.483. -56. Mesela su örne˘ e bakalım: g ¸ g >>> 12 .. Yani mesela s s g aynı anda bölme çıkarma. Bu çıktı. Python’da sayılar çe¸it çe¸ittir: s s Tamsayılar (integers) Tamsayılar.648 ile 2. Mesela 3.3j. 5. s Orada sözünü etti˘ imiz durum sayılar için de geçerlidir.147. Karma¸ ık Sayılar (complex numbers) Karma¸ık sayılar bir gerçel.0 2.5 >>> print 5.647 arasında kalan sayılardır..3.0 / 2.0” ifadesini istedi˘ imiz sayının önüne koyabiliriz. Bu arada dilerseniz konuyla ilgili bazı ufak tefek teknik bilgiler verelim.0 2. 100. 1450.3 i¸lemini Python’ın nasıl gördü˘ ünü g g s g gösteriyor.4.147. Böylece kar¸ıla¸tı˘ ımız örnekleri daha kolay anlayabiliriz.0” koyulursa sorun g s s s çözülüyor.

Ama su anda gs ¸ aslında bizi de˘ i¸kenin ne oldu˘ undan ziyade neye yaradı˘ ı ilgilendiriyor.3 8. O yüzden sayılar g ¸ g konusunu simdi bir kenara bırakıp çok önemli ba¸ka bir konuya de˘ inelim. bir veriyi kendi içinde depolayan birimlere de˘ i¸ken adı veriyorlar. Mesela. O yüzden hemen gs g g bir örnekle durumu açıklamaya çalı¸alım. g Aynı de˘ i¸kenlerle yaptı˘ ımız su örne˘ e bakalım bir de: gs g ¸ g .>>> print 12 . Python komut satırında n = 5 seklinde de˘ i¸keni tanımladıktan sonra print n komutunu ¸ gs verirsek ekrana yazdırılacak veri 5 olacaktır. Yani: >>> n = 5 >>> print n 5 Bu n de˘ i¸kenini alıp bununla aritmetik i¸lemler de yapabiliriz: gs s >>> n * 2 10 >>> n / 2. virgülleri nerede kulgs s g landı˘ ımıza dikkat edin.7 ˙ Ilerde yeri geldi˘ inde sayılardan daha ayrıntılı bir sekilde bahsedece˘ iz. içinde bir aritmetik i¸lem de barındırabilir: gs s >>> n = 34 * 45 >>> print n 1530 Su örneklere bir göz atalım: ¸ >>> a = 5 >>> b = 3 >>> print a * b 15 >>> print "a ile b’yi çarparsak".5 Hatta bu n de˘ i¸keni. Bu n de˘ i¸keni 5 verisini sonradan tekrar kullanılmak üzere depogs gs lar. a * b.3. "elde ederiz" a ile b’yi çarparsak 15 elde ederiz Burada de˘ i¸kenleri karakter dizileri arasına nasıl yerle¸tirdi˘ imize.0 2.4 Degi¸ kenler Kabaca. s >>> n = 5 ifadesinde n bir de˘ i¸kendir. ¸ s g ˘ s 2.

karakter dizilerini birbiriyle birle¸tirmekten g g ¸ s ibarettir. bu kez de˘ i¸kenlerimiz tamsayı yerine karakter dizisi oldu˘ u için parantez g gs g içinde de˘ i¸kenleri belirtirken tırnak i¸aretlerini kullanmayı unutmuyoruz. ¸ Dilerseniz bununla ilgili birkaç örnek daha yapalım: . ikincisi 5. g gs De˘ i¸kenleri kullanmanın ba¸ka bir yolu da özel i¸aretler yardımıyla bunları karakter dizileri gs s s içine gömmektir. "Özgül" ˙ste yukarıda yaptı˘ ımız seyin de bundan hiçbir farkı yoktur. karakter dizisini açan ve I s kapatan tırnak i¸aretleriyle karı¸masını önlemek. gs s 2. bu kesme i¸aretini görmezden gelme emri veriyor. s g s s Böylece karakter dizimiz hatasız bir sekilde ekrana basılıyor.. "sayısı". 3*5) Bu da oldukça kullanı¸lı bir tekniktir. "sayısından büyüktür" Yukarıdaki kod sununla e¸de˘ erdir: ¸ s g >>> print 5.5 Kaçı¸ Dizileri s Önceki bölümlerde “kaçı¸ dizisi” diye bir seyden söz ettik. "sayısı". Burada. Buna göre birinci de˘ i¸kengs gs imiz 3. Bu kaçı¸ dizisinin buI¸ g s s s radaki görevi... ˙ Isterseniz o örne˘ i hatırlayalım: g ˙ >>> print ’Istanbul\’un 5 günlük hava tahmini’ ˙ste bu karakter dizisi içinde kullandı˘ ımız “\” i¸areti bir kaçı¸ dizisidir. "sayısı". 5. Python bir karakter dizisiyle kar¸ıla¸tı˘ ında. "Django") Görülece˘ i gibi. b.. parantez içinde gösterece˘ imiz her bir ö˘ e için s g g karakter dizisi içine “%s” i¸aretini ekliyoruz. Dikkatlice bakın: I¸ g ¸ >>> print a. s s s s g bu karakter dizisini soldan sa˘ a do˘ ru okur. Karakter dizisini yazdıktan sonra da “%” i¸aretinin s s ardından parantez içinde bu de˘ i¸kenleri teker teker tanımlıyoruz. ˙stanbul’un kelimesi içinde geçen kesme i¸aretinin. Hatta bununla ilgili bir örnek de s ¸ yaptık. Hatırlarsanız bir önceki bölümde iki karakter dizisini su sekilde birle¸tirebilece˘ imizi ¸ ¸ s g ö˘ renmi¸tik: g s >>> print "Fırat". bu sayıları tutan de˘ i¸kenleri yazdık. Su örne˘ e bir bakalım: ¸ g >>> print "%s ile %s çarpılırsa %s elde edilir" %(3.>>> print a. aslında burada yaptı˘ ımız sey. üçüncüsü ise bunların çarpımı. "sayısından büyüktür" Gördü˘ ünüz gibi." %("Python". Bir de su örne˘ i inceleyelim: ¸ g >>> print "%s ve %s iyi bir ikilidir. karakter g g dizisine birle¸ik bir halde “un 5 günlük hava tahmini” diye bir seyle kar¸ıla¸ıyor ve i¸te bu noks ¸ s s s tada kafası allak bullak oluyor. Bizim ˙stanbul’un kelimesindeki kesme i¸aretinin sol tarafına I s yerle¸tirdi˘ imiz “\” kaçı¸ dizisi Python’a. 3. Mesela yukarıdaki örnekte önce tek tırnak i¸aretini g g s görüyor ve bir karakter dizisi tanımlayaca˘ ımızı anlıyor. Ancak okumaya devam etti˘ inde. s s s s g yani karakter dizisinin sona erdi˘ ini zannediyor.. b.. "sayısından büyüktür" Biz burada do˘ rudan sayıları yazmak yerine. Ardından karakter dizisi içindeki kesme g i¸aretine rastlıyor ve bu i¸aretin karakter dizisinin biti¸ini gösteren kesme i¸areti oldu˘ unu.

g Dolayısıyla karakter dizisi içinde geçen çift tırnaklı “print” ifadesi çakı¸maya yol açtı. sorunlu tırna˘ ın soluna koydu˘ umuza da dikkat edin.. Bu kaçı¸ dizisi yeni bir satıra geçmemizi sa˘ lar. “\” i¸areti “n” harfiyle birlikte kullanıldı˘ ında s s g özel bir anlam ifade eder. Daha belirgin bir örnek verelim: s s g >>> print "Yolun sonu\n" Bu komut. Bu durumu g g s g s çok daha net anlayabilmemizi sa˘ layacak bir örnek verelim: g >>> """ .. karakter dizisini iki satıra böldük. Günün mönüsü . Bu i¸aret ba¸ka karakterlerle birlikte s s s s de kullanılarak farklı amaçlara hizmet edebilir. Bunu yapmamızı sa˘ layan sey “\n” adlı g g ¸ kaçı¸ dizisidir. Ama e˘ er karakter dizisini çift tırnakla tanımlamanız ¸ g gerekirse." Bu komutun hata verece˘ ini biliyoruz. Hatırlarsanız önceki bölümde.." Burada kaçı¸ dizilerini çift tırnaklı “print” kelimesine nasıl uyguladı˘ ımıza dikkat edin. Yukarıdaki kod söyle bir çıktı verir: ¸ birinci satır ikinci satır Gördü˘ ünüz gibi.. ˙ Istersek yukarıdaki karakter dizisini su sekilde yazabiliriz: ¸ ¸ >>> print ’1 numaralı oyuncudan gelen cevap: "Sola dön!"’ Bu komut sorunsuz bir sekilde yazdırılır. kaçı¸ dizilerinden yararlanabilirsiniz: s >>> print "1 numaralı oyuncudan gelen cevap: \"Sola dön!\"" Burada iki adet kaçı¸ dizisi kullandı˘ ımıza dikkat edin. ------------ . “Yolun sonu” karakter dizisini çıktı olarak verdikten sonra bir satır bo¸luk bırakacaks tır. Biz yukarıdaki karakter dizisini tanımlarken çift tırnaktan yararlandı˘ ımız için. Böylece hatadan kıvrak hareketlerle kaçmı¸ g s s s olduk. Bunun nedeni. Bu sorunu s a¸mak için karakter dizisini söyle yazıyoruz: s ¸ >>> print "Python’da önemli komutlardan biri de \"print\" komutudur. g g Hatırlarsanız kaçı¸ dizilerinden ilk bahsetti˘ imiz yerde söyle bir örnek de vermi¸tik: s g ¸ s >>> print "Python’da önemli komutlardan biri de "print" komutudur.>>> print "1 numaralı oyuncudan gelen cevap: "Sola dön!"" Bu karakter dizisi içinde “Sola dön!” ifadesi var..... Çünkü karakter dizisini çift tırnak içinde tanımladık. Her bir s g çift tırna˘ ın soluna bir adet “\” i¸areti yerle¸tirdik. print komutunu kullanmadan herhangi bir karakter dizisi yazdı˘ ımızda elde etti˘ imiz çıktının Python’ın bakı¸ açısını yansıttı˘ ını söylemi¸tik. “\” i¸areti yalnızca tırnak i¸aretleriyle birlikte kullanılmaz. Su örne˘ e bir bakın: ¸ g >>> print "birinci satır\nikinci satır" Burada “\” i¸aretini “n” harfiyle birlikte kullandık. karakter dizisi içindeki bu “Sola dön!” ifadesi çakı¸maya g s sebep oluyor. Ayrıca kaçı¸ s s s s s dizisini. karakter dizisi içinde s g ba¸langıç ve biti¸ tırnaklarıyla karı¸abilecek iki adet tırnak i¸areti olmasıdır.

... Elbette istersek bu iki satırı tek bir satırda s da yazabiliriz. Bu arada.... 6 TL\nÇorba. E˘ er amacınız “merhaba” kelimesini “mer” ve g g “haba” olarak bölmekse söyle bir sey yapabilirsiniz: ¸ ¸ .. ancak okunaklılı˘ ı artırdı˘ ı için uyulması tavsiye edilir. Bu durumu belirgin bir sekilde gösteren bir örnek verelim: g ¸ >>> print ’mer\ .. 3 TL Tatlı.. 6 TL Çorba.... Bu kaçı¸ dizisini kullanmamızın amacı. 2 TL\n’ Gördü˘ ünüz gibi. Makarna.... Bu çıktıdan sunu da anlıyoruz: Demek ki biz g s ¸ üç tırnak yerine tek tırnak kullanmak istesek aynı çıktıyı elde etmek için söyle gibi bir komut ¸ vermemiz gerekecek: >>> print ’\nGünün mönüsü\n------------\nMakarna. Bu durum teknik bir zorunluluk de˘ ildir.. yukarıdaki komutlarda bir sey dikkatinizi çekmi¸ olmalı. E˘ er orada o kaçı¸ dizisini kullanmazsak... Daha önce aynı örne˘ i print komutu ile birlikte kullanmı¸tık.... 3 TL Tatlı. Demek ki Python üç tırnak g s yardımıyla girdi˘ imiz kodları böyle görüyormu¸.. üç tırnak i¸aretlerinin kimi durumlarda hayatımızı ne kadar da kolayla¸tırabilece˘ ini s s g anlayabilirsiniz. ... Python’ın herhangi bir hata vermeden alt satıra s geçmesini sa˘ lamak. 2 TL\n’ Günün mönüsü -----------Makarna. 6 TL Çorba..... ENTER tu¸una bastı˘ ımız anda g g s s g Python hata verecektir..... 3 TL\nTatlı. ..... 2 TL Buradan. “merhaba” kelimesini “mer” hecesinden bölüp “\” i¸areti ile alt satıra g s geçti˘ imiz halde. g g s Bu kodlar söyle bir çıktı verir: ¸ ’\nGünün mönüsü\n------------\nMakarna. çıktımız “merhaba” oldu. \ . ¸ g g s g Kötü bir kod görünümü ortaya çıkmaması için..... alt satıra geçilmi¸ de olsa kodların ilk satırdan devam etmesi s s gerekti˘ ini gösteriyor.. 6 TL\nÇorba.. 2 TL """ Bu örne˘ i hatırlıyorsunuz.. haba’ merhaba Gördü˘ ünüz gibi.... Not: Python’da do˘ ru kod yazmak kadar. ENTER tu¸una basıp yeni satıra s s geçmeden önce “\” adlı kaçı¸ dizisini kullandık.. Bu yüzden yazdı˘ ımız programlarda satır uzunlu˘ unun mümkün g g oldu˘ unca 79 karakterden fazla olmamasına dikkat ediyoruz.. E˘ er yazdı˘ ımız bir satır 79 g g g karakterden uzun olacaksa satırı uygun bir yerinden bölüp yeni bir satıra geçmemiz gerekir. 3 TL\nTatlı.. Ancak görüntü açısından kodların bu sekilde sa˘ a do˘ ru uzaması ho¸ de˘ il...ile ba¸layan komutun ilk satırının sonunda. g g g Örne˘ in biz de yukarıdaki örnekte kodlarımızın sa˘ a do˘ ru çirkin bir sekilde uzamaması için g g g ¸ satırı uygun bir yerinden bölüp alt satıra geçtik.. bu kaçı¸ dizisini kullanarak kodlarımızı iki satıra s bölmeyi tercih ettik.... yazdı˘ ınız kodların düzgün görünmesi ve okug g naklı olması da önemlidir... . “\” i¸areti................ çıktıda “\n” adlı kaçı¸ dizileri de görünüyor....... >>> print ’\nGünün ¸ s mönüsü\n--..

Bu s ¸ s kaçı¸ dizisinin adı “r“‘dir.>>> print """mer . haba""" merhaba E˘ er üç tırnak yerine çift veya tek tırnak kullanarak “merhaba” kelimesini ortadan bölmek 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 satıra bölmek için “\” i¸aretini kullanırken. Programlama maceramızda en çok i¸imize yarayacak olanlar bunlardır. Ancak en önemlilerini zaten yukarıda verdik. s g s karakter dizilerini bölüp alt satıra geçebiliyoruz. Dilerseniz bu kaçı¸ dizisini anlatmadan önce size söyle bir soru s ¸ sorayım: Acaba a¸a˘ ıdaki karakter dizisini nasıl yazdırırız? s g “C:\Documents and Settings\nergis\test” .. Çok uzak Bu kaçı¸ dizisinin görevi karakter dizisi içindeki karakterler arasına mesafe koymak.. haba""" mer haba E˘ er üç tırnak kullandı˘ ınız halde. Bütün bunların dı¸ında bu kaçı¸ dizisi “t” harfiyle de yan s s yana gelebilir. E˘ er bu kaçı¸ dizisini tek ba¸ına kullanırsak. “\” i¸aretinden sonra bo¸luk bile olmamalı. g s s bir karakter dizisini herhangi bir yerinden bölüp alt satıra geçti˘ imiz halde.. Bu kaçı¸ dizisinin hem görünü¸ü hem de kullanımı yukarıdaki kaçı¸ s s s s dizilerinden biraz farklıdır. s s Bütün bu örneklerden sunu anlıyoruz: Python’da temel olarak tek bir kaçı¸ dizisi var.. s Yukarıdakilerin dı¸ında. E˘ er bu kaçı¸ dizisini “n” harfiyle birlikte kullanırsak. de˘ i¸ik anlamlar ortaya çıkarabiliyor. \t Çok uzak" Uzak. O zaman da söyle bir anlam kazanır: ¸ >>> print "Uzak... karakter dizisini ba¸latıp s g s bitiren tırnaklarla çakı¸ılmasını önlüyor.. “merhaba” kelimesinin bölünmesini istemiyorsanız yine “\” g g kaçı¸ dizisinden yararlanabilirsiniz: s >>> print """mer\ . o karakter dizisi g çıktıda tek satır olarak görünüyor.. bu i¸aretin s s satırdaki son karakter olmasına özen gösterin.. Bu i¸aret farklı karakterlerle bir araya gelerek. Yani “\” i¸aretini koyar koymaz ENTER tu¸una s s basmalısınız.. Python’da sablona uymayan önemli bir kaçı¸ dizisi daha bulunur. Bu kaçı¸ s s dizisi de kimi yerlerde hayatınızı kolayla¸tırabilir. “\” kaçı¸ dizisi ba¸ka karakterlerle de bir s s s araya gelebilir. s s gs Mesela bu karakter dizisi tırnak i¸aretiyle birlikte kullanıldı˘ ında. O da “\” ¸ s i¸areti.

Bu kaçı¸ dizilerinin etkisizle¸tirilebilmesi için su kodu yazabilirsiniz: s s ¸ print "Python’daki kaçı¸ dizileri sunlardır: \\. s \” Karakter dizilerini ba¸latıp bitiren çift tırnaklarla. dizin ayracı olan “\” i¸areti ile yan s s yana geldi˘ i için Python bunları birer kaçı¸ dizisi olarak algılıyor. ˙ g Istersek yukarıdaki karakter dizisini söyle yazabiliriz: ¸ >>> print "C:\\Documents and Settings\\nergis\\test" Burada “\” i¸aretlerini çiftleyerek sorunun üstesinden gelebiliyoruz. Sizce neden böyle oldu? g Cevap aslında çok basit. karakter dizisi içinde geçen çift tırnakların s karı¸masını engeller. Çünkü Python karakter dizisi içinde geçen g g g kaçı¸ dizilerini i¸leme sokuyor ve buradaki her bir kaçı¸ dizisinin görevini yerine getirmesine s s s izin veriyor. Bu durumdan kurtulmak için g s birkaç seçene˘ imiz var. \n. “r” adlı kaçı¸ dizisi. \t" s s Python’daki kaçı¸ dizileri ¸unlardır: \. \n. Diyelim ki su cümleyi ekrana yazdırmak ¸ ¸ istiyoruz: Python’daki kaçı¸ dizileri ¸unlardır: \. \t" s s “r” adlı kaçı¸ dizisi. Ama e˘ er istersek yukarıs g daki soruna çok daha temiz bir çözüm de bulabiliriz. karakter dizisi içinde geçen tek tırnakların s karı¸masını engeller. Gördü˘ ünüz gibi çıktı hiç de bekledi˘ imiz gibi de˘ il. g \’ Karakter dizilerini ba¸latıp bitiren tek tırnaklarla. \n. Karakter dizisinde kalın harflerle gösterdi˘ imiz kısımlara dikkat edin: g C:\Documents and Settings\nergis\test Burada “nergis” ve “test” kelimelerinin ba¸ındaki harfler. Bunu söyle kullanıyoruz: s ¸ >>> print r"C:\Documents and Settings\nergis\test" Gördü˘ ünüz gibi. \\t" s ¸ Ama burada “r” kaçı¸ dizisini kullanırsak çok daha temiz bir kod görünümü elde etmi¸ oluruz: s s print r"Python’daki kaçı¸ dizileri ¸unlardır: \. karakter dizisi içinde geçen bütün kaçı¸ dizilerini etkisiz g s s hale getiriyor. ˙ s s Isterseniz bununla ilgili söyle bir örnek daha verelim. s s . ˙ste böyle bir duruma kar¸ı Python’da “r” I¸ s adlı bir kaçı¸ dizisi daha bulunur. Bu kaçı¸ dizisi özellikle dizin adlarını yazdırırken çok i¸inize yarayacaktır. \\n. karakter dizisi içindeki kaçı¸ dizilerinin görevlerini yerine getirmesine engel s s olacaktır. Dilerseniz simdiye kadar gördü˘ ümüz kaçı¸ dizilerini söyle bir özetleyelim: ¸ g s ¸ \ ENTER tu¸una basılarak alt satıra kaydırılan karakter dizilerinin çıktıda tek satır olarak görüns mesini sa˘ lar. \t s s Bu cümleyi söyle yazdıramayız: ¸ >>> print "Python’daki kaçı¸ dizileri ¸unlardır: \.˙ Isterseniz bu karakter dizisini önce söyle yazdırmayı deneyelim: ¸ >>> print "C:\Documents and Settings\nergis\test" C:\Documents and Settings ergis est Gördü˘ ünüz gibi Python bize tuhaf bir çıktı verdi. s .

g \t Karakter dizileri içinde sekme (TAB) tu¸una basılmı¸ gibi bo¸luklar olu¸turulmasını sa˘ lar.70 YTL 2006. 531.html/ adresindeki makalemizi inceleyin.......x sürümünü mü yoksa 3...x sürümünü mü kullandı˘ ınızı tespit g edin. E˘ er hangi sürümü kullanmanız gerekti˘ i konusunda tereddütleriniz varsa g g http://www. 2.. A¸a˘ ıdaki tabloyu ekrana çıktı olarak verin: s g Yıllara Göre Asgari Ücret ------------------------2005. A¸a˘ ıdaki karakter dizilerini farklı yöntemler kullanarak birle¸tirin ve tek bir cümle elde s g s edin: "Ahmet" "yarın Ankara’ya" "gidecek" Sizce en kolay ve kullanı¸lı yöntem hangisi? s 5.50 TL 4..00 YTL 2008. A¸a˘ ıdaki ifadeyi üç tırnak i¸ areti kullanmadan ekrana çıktı olarak verin: s g s Bilmezler yalnız ya¸amayanlar...... 666. 760.00 YTL 2007... 638.70 YTL 2009. s s s s g r Karakter dizileri içinde geçen kaçı¸ dizilerini etkisiz hale getirir.. ¸ 2....6 Bölüm Soruları 1.istihza. O. s Simdi dilerseniz bölüm sorularına geçelim ve bu konuyu kapatalım. 585. 488.. A¸a˘ ıdakilerden hangisi bir karakter dizisi de˘ ildir? s g g "python" www.com ’23’ """@%&""" ’’’istihza’’’ 3.00 TL 2010....... s Nasıl korku verir sessizlik insana...... Python’ın 2...Veli .....com/blog/hangisinden-baslamali-python-2x-mi-yoksa-3x-mi.google... s g s Python’dan aldı˘ ınız sonuç bekledi˘ iniz gibi de˘ ilse nedenini bulmaya çalı¸ın.. g g g s 2 + 3 x 7 E˘ er g 6. A¸a˘ ıdaki i¸lemin sonucunu önce kafanızdan sonra da Python’la hesaplayın.\n Yeni bir satıra geçilmesini sa˘ lar.

A¸a˘ ıdaki cümleleri. 20 kilo da armut kaldı” cümlesini s g gs elde edin: elma = 10 armut = 20 8. "Endi¸e edecek hiçbir ¸ey yok!" g s s Python’daki en kullanı¸lı tırnak tiplerinden biri de "üç tırnak" (""") i¸aretidir. A¸a˘ ıdaki de˘ i¸kenleri kullanarak “Depoda 10 kilo elma. farklı tırnak tiplerini kullanarak yazdırın: s g Doktor Kemal’in yaptı˘ı açıklamaya göre.7. s s .

s Biz bu bölümde farklı i¸letim sistemlerinde. çıkan ekranda: s kwrite yazmaktır. Su a¸amada kullanım ¸ s kolaylı˘ ı ve sadeli˘ i nedeniyle Kwrite önerilebilir. metin düzenleyici kullanılarak Python programs larının nasıl yazılaca˘ ını tek tek inceleyece˘ iz. Dilerseniz önce GNU/Linux ile ba¸layalım: s 3. ilk satıra: s s 27 . Ancak Python kodlarını ayırt edip renklendirebilen bir metin düzenleyici ile yola çıkmak her bakımdan hayatınızı kolayla¸tıracaktır. Python kodlarını yazmak için istedi˘ iniz herhangi bir metin düzenleyiciyi kullanabilirsiniz.1 GNU/Linux Sistemi E˘ er kullandı˘ ınız sistem GNU/Linux’ta KDE masaüstü ortamı ise ba¸langıç düzeyi için Kwrite g g s veya Kate adlı metin düzenleyicilerden herhangi biri yeterli olacaktır. Yeni bir Kwrite belgesi açmanın en kolay yolu I¸ s ALT+F2 tu¸larına basıp. hangi i¸letim g g g s sistemini kullanıyor olursanız olun. Yeni bir Gedit belgesi olu¸turmak için ise ALT+F2 tu¸larına basıp: s s gedit komutunu veriyoruz. Hatta g Notepad bile olur. Daha önce de söyledi˘ imiz gibi. Bo¸ Kwrite veya Gedit belgesi kar¸ımıza geldikten sonra ilk yapmamız gereken. g g E˘ er kullandı˘ ınız sistem GNU/Linux’ta GNOME masaüstü ortamı ise Gedit’i kullanabilirsiniz. Üstelik tabii ki yazdı˘ ınız kodları bir yere kaydedip saklamak isteyeceksiniz. g g ˙se yeni bir Kwrite belgesi açarak ba¸layalım. Ancak kodlar ço˘ alıp büyümeye ba¸layınca komut satırı yetersiz gelmeye ba¸layag s s caktır. ˙ste burada g I¸ metin düzenleyiciler devreye girecek.BÖLÜM 3 Python Programlarını Kaydetmek Özellikle küçük kod parçaları yazıp bunları denemek için Python komut satırı mükemmel bir ortamdır. hem Windows hem de GNU/Linux ba¸lı˘ ı altında yazılanları s g okumanızı tavsiye ederim.

bazı ko¸ullarda sistem yazdı˘ ınız programı g s g çalı¸tıramayacaktır. Aslında metin içine kod yazmak.. Dolayısıyla yukarıda g gösterdi˘ imiz cd Desktop komutu sizi masaüstünün oldu˘ u dizine götürür. Bu tür sistem farklılıklarına kar¸ı önlem olarak GNU/Linux sistemlerindeki env adlı bir betikten s yararlanabiliriz. b. Simdi dosyamızı deneme. s Uzun lafın kısası. Komut satırını ilk ba¸lattı˘ ınızda g s g içinde bulundu˘ unuz dizin ev dizininiz olacaktır (/home/kullanici_adi). Böylece yazdı˘ ımız bir programın. Su anda ¸ masaüstünde deneme. "bir de". Ancak bazı GNU/Linux sistemlerinde Python’ın çalı¸tırılas g s bilir dosyası ba¸ka bir dizinin içinde de olabilir (Mesela /usr/local/bin). g GNU/Linux sistemlerinde Python’ın çalı¸tırılabilir dosyası genellikle /usr/bin dizini altındadır. s Dolayısıyla yukarıdaki satırı aslında söyle de yazabilirsiniz: ¸ #!/usr/bin/python Böylece sisteminiz Python’ı /usr/bin dizini altında arayacak ve yazdı˘ ınız programı Python’la g çalı¸tırması gerekti˘ ini anlayacaktır. Programımızın en ba¸ına ekledi˘ imiz #/usr/bin/env python s s g satırı sayesinde Python sistemde nereye kurulmu¸ olursa olsun kolaylıkla tespit edilebilecektir. biraz sonra yazaca˘ ımız kodların birer Python kodu oldu˘ unu ve Python’ın da sisg g temde hangi konumda yer aldı˘ ını gösteriyor.. suna benzer bir komut vermeniz gerekir: ¸ . g g g Python’ın /usr/bin dizini haricinde bir konuma kuruldu˘ u sistemlerde çalı¸tırılması konusunda g s endi¸e etmemize gerek kalmaz. "almak istiyorum" Bunları yazıp bitirdikten sonra sıra geldi dosyamızı kaydetmeye. /usr/bin dizini altında bulundu˘ unu varsayabilece˘ imiz bu env beti˘ i Python’ın g g g sistemde hangi dizin içinde oldu˘ unu bulmamızı sa˘ lar. Simdi hemen bir konsol ¸ ekranı açıyoruz. c. Peki bu komut ne i¸e yarıyor? s Bu komut. #!/usr/bin/python yazdı˘ ımızda sisteme su emri vermi¸ oluyoruz: g ¸ s “Python’ı /usr/bin dizini içinde ara!“ #!/usr/bin/env python yazdı˘ ımızda ise su emri: “Python’ı nereye saklandıysa bul!“ g ¸ Neyse. Python’ın çalı¸tırılabilir dosyasının her sistemde aynı dizin altında buluns s mama ihtimalinden ötürü yukarıdaki gibi sabit bir dizin adı vermek iyi bir fikir olmayabilir. Öyle bir durumda.#!/usr/bin/env python yazmak olacaktır.) Su komutu vererek. Bu durumda. Simdi g ¸ a¸a˘ ıda verilen satırları Kwrite veya Gedit belgesinin içine ekleyelim: s g #!/usr/bin/env python a = "elma" b = "armut" c = "muz" print "bir".py ¸ adıyla herhangi bir yere kaydediyoruz. a. "bir".py adında bir dosya görüyor olmamız lazım. çalı¸tırılas s bilir dosya /usr/bin altında bulunamayaca˘ ı için. Tabii e˘ er siz g g g komut satırını farklı bir dizin içinde açmı¸sanız tek ba¸ına yukarıdaki komutu vermeniz sizi s s masaüstüne götürmez. Biz daha fazla teknik ayrıntıya dalmadan yolumuza devam edelim. masaüstüne. Python komut satırına kod yazmaktan çok farklı de˘ ildir. Böylece sistemimiz Python’ı nerede bulması g gerekti˘ ini anlıyor. s ¸ yani dosyayı kaydetti˘ imiz yere geliyoruz: g cd Desktop Tabii burada ben sizin ev dizininde oldu˘ unuzu varsaydım. Gelin biz masaüstüne kaydedelim dosyamızı. (Ama Python komut satırını çalı¸tırmıyoruz.

Peki. Öyle ise tabii ki verece˘ iniz komutta “Desktop” kes g limesini “Masaüstü” kelimesiyle de˘ i¸tirmeniz gerekir. Ancak ba¸taki “python” g g s g s s ifadesini kaldırdı˘ ımızda. sistem bu beti˘ i hangi programla çalı¸tırması gerekg s g s ti˘ ini anlayamayaca˘ ı için .py E˘ er her sey yolunda gitmi¸se su çıktıyı almamız lazım: g ¸ s ¸ bir elma.py komutu çalı¸mayacaktır./deneme. python deneme. sistem g g g bu betikle ne yapması gerekti˘ ine karar veremez. bir armut. Bunun ardından: g chmod a+x deneme./deneme. g E˘ er bu satırı #!/usr/bin/python seklinde yazarsanız ve e˘ er programınızın çalı¸tırıldı˘ ı sisg ¸ g s g temde Python’ın çalı¸tırılabilir dosyası /usr/bin/ dizini altında de˘ ilse suna benzer bir hata çıks g ¸ tısı alırsınız: bash: . s Gördü˘ ünüz gibi.py komutuyla programlarımızı çalı¸tırabiliyoruz. ama acaba ¸ g s Python programlarını ba¸a python komutu eklemeden çalı¸tırmanın bir yolu var mı? ˙ste bus s I¸ rada biraz önce bahsetti˘ imiz #!/usr/bin/env python satırının önemi ortaya çıkıyor. yani dosyayı çalı¸tırılabilir s s (executable) bir dosya haline getiriyoruz. tüm bu i¸lemlerin #!/usr/bin/env python satırıyla ne ilgisi var? s E˘ er bu satırı metne yerle¸tirmezsek. beti˘ i Python programının çalı¸tıraca˘ ı anla¸ılıyor. Artık komut satırında su komutu vererek programımızı çalı¸tırabiliriz: ¸ s .py komug g s tunu verdi˘ imizde.py Peki. Bunu su komut yardımıyla yapıyoruz: s ¸ Öncelikle: cd Desktop komutuyla dosyayı kaydetti˘ imiz yer olan masaüstüne geliyoruz. bir de muz almak istiyorum GNOME kullanıcıları da yukarıda anlatılan i¸lemleri takip ederek ve Kwrite yerine Gedit adlı s metin düzenleyiciyi kullanarak dosyayı kaydedip çalı¸tırabilir. Böylece Python nereye kurulmu¸ olursa olsun sistemimiz Python’ı tespit edebiliyor. python deneme. g Ba¸a python komutu getirmeden programımızı çalı¸tırabilmek için öncelikle programımıza s s çalı¸tırma yetkisi vermemiz gerekiyor. e˘ er beti˘ in ilk satırında #!/usr/bin/env python da yoksa. gs E˘ er ba¸arıyla masaüstüne gelmi¸seniz.py: /usr/bin/python: bad interpreter: No such file or directory Böyle bir hata almamak için o satırı #!/usr/bin/env python seklinde yazmaya özen gösteriy¸ oruz.py komutuyla da deneme. yazdı˘ ınız programı çalı¸tırmak için su komutu verip g s s g s ¸ ENTER tu¸una basın: s python deneme.py adlı dosyaya çalı¸tırma yetkisi veriyoruz.cd /home/kullanici_adi/Desktop Not: Bazı Türkçe GNU/Linux sistemlerinde masaüstünü gösteren dizin “Desktop” yerine “Masaüstü” adını da ta¸ıyabilmektedir./deneme. s . Normal g s sartlar altında tercih edece˘ imiz program çalı¸tırma biçimi de bu olacaktır.

Peki. Tabii ki bu dizin içine bir dosya kopyalayabilmek için root yetkilerine sahip olmalısınız. i¸letim s g s sistemi bu dosyaları bulur ve çalı¸tırılmalarını sa˘ lar. konsolda sadece gedit komutunu vererek Gedit programını çalı¸tırabiliyoruz. g g s xorg. g which gedit komutunun çıktısına bir bakalım: /usr/bin/gedit Gördü˘ ünüz gibi Gedit programının YOL’u /usr/bin/gedit. ˙sletim sisg ¸ I¸ temimiz. g Örne˘ in.conf dosyasının yolu /etc/X11/xorg. g ˙sletim sistemleri. s Ya biz programımızı sadece ismini yazarak çalı¸tırmak istersek ne yapmamız gerekiyor? s Bunu yapabilmek için programımızın PATH de˘ i¸keni içinde yer alması. Su komut i¸inizi görecektir: ¸ s sudo cp Desktop/deneme /usr/bin Simdi konsol ekranında: ¸ . Çalı¸tırılabilir dosyalar e˘ er bu özel dizinler içinde iseler.Yukarıdaki i¸lemlerden sonra bu deneme.py uzantısını s kaldırıp. Örne˘ in fstab dosyasının yolu /etc/fstab‘dır. Böylece biz de bu programları do˘ rudan s g g isimleriyle ça˘ ırabiliriz.py dosyasının isminin sonundaki . Simdi bu konuyu daha iyi anlayabilmek için birkaç deneme yapalım.sh dosyaları çalı¸tırılas s bilir dosyalardır) içinde yer aldı˘ ı dizinlere de özel olarak YOL adı verilir ve bu anlamda kulg lanıldı˘ ında “yol” kelimesi genellikle büyük harfle yazılır. bir programın YOL üstünde olması ne demek? Bilindi˘ i gibi. .bin ve . kabaca o programın veya dosyanın içinde yer g aldı˘ ı dizindir. Mesela programımızı /usr/bin içine kopyalayalım. bir programı ça˘ ırmak istedi˘ imizde öncelikle yukarıda adı verilen dizinlerin içini g g kontrol edecektir. bir programı ça˘ ırdı˘ ımızda.conf ‘tur. diyoruz. s Simdi e˘ er biz de yazdı˘ ımız programı do˘ rudan ismiyle ça˘ ırabilmek istiyorsak programımızı ¸ g g g g echo $PATH çıktısında verilen dizinlerden birinin içine kopyalamamız gerekiyor. E˘ er ça˘ ırdı˘ ımız programın çalı¸tırılabilir dosyası bu dizinlerden herhangi g g g s birinin içinde ise o programı ismiyle ça˘ ırabiliyoruz./deneme komutuyla da programımızı çalı¸tırabiliriz. çalı¸tırılabilir dosyaların (. bir programın veya dosyanın yolu. g ¸ Hemen bir konsol ekranı açıp su komutu veriyoruz: ¸ echo $PATH Bu komutun çıktısı suna benzer bir sey olacaktır: ¸ ¸ /usr/local/sbin:/usr/local/bin:/usr/sbin: /usr/bin:/sbin:/bin:/usr/games Bu çıktı bize YOL de˘ i¸keni (˙ gs Ingilizce’de PATH variable) dedi˘ imiz seyi gösteriyor. Bu “yol” kelimesinin bir de daha özel bir anlamı bulunur. Gedit programı YOL üstündedir. Ba¸ka bir örnek vermek gerekirse. programın YOL üstünde olması gerekir. söz konusu programı çalı¸tırabilmek için bazı I¸ g g s özel dizinlerin içine bakar. Bilgisayar dilinde. yani Türkçe ifade etmek gs gerekirse. gs Dolayısıyla. Hemen yukarıda echo $PATH komug tunun çıktısını kontrol ediyoruz ve görüyoruz ki /usr/bin/ dizini YOL de˘ i¸kenleri arasında var. Zaten Gedit programının YOL üstünde olması sayesinde.

3. s IDLE’a ula¸mak için s Ba¸lat/Programlar/Python/IDLE (Python GUI) yolunu takip ediyoruz. Bu g sayede artık masaüstünde bulunan çalı¸tırılabilir dosyalar da kendi adlarıyla ça˘ rılabileceks g ler. ne de sıkılın.deneme yazınca programımızın çalı¸tı˘ ını görmemiz lazım. mevg cut konsol oturumu kapatılınca her sey yine eski haline dönecektir. E˘ er GNU/Linux altında herg s g hangi bir programlama faaliyetinde bulunmak istiyorsanız yukarıda verdi˘ imiz bilgileri özümseg meniz gerekir. Söyle ki: g ¸ PATH=$PATH:$HOME/Desktop Bu sekilde masaüstü dizinini YOL’a eklemi¸ olduk.. Çünkü bu bölümde verdi˘ imiz bilgiler. masaüstünüz hep YOL üstünde kalmayacak. dosyamızın içinde bulundu˘ u dizini YOL’a eklemek de mümkün.. E˘ er herhangi bir dizini ¸ g kalıcı olarak YOL’a eklemek isterseniz. IDLE ilk ba¸latıldı˘ ında s s g söyle bir görünüme sahip olacaktır: ¸ . Mesela gs masaüstünü YOL’a eklemek için /home/kullanici_adi/.profile dosyanızda de˘ i¸iklik yapmanız gerekir.. Python’la bir program yazıp bu programı..profile dosyanızın en sonuna su satırı ek¸ lemelisiniz: export PATH=$PATH:$HOME/Desktop Yoruldunuz mu? Yoksa sıkıldınız mı? Bence ne yorulun. s g Program dosyamızı YOL üstünde bulunan dizinlerden birine eklemek yerine. Ancak masaüstünü YOL’a ekledi˘ inizde.2 Windows Sistemi Windows kullanıcıları IDLE adlı metin düzenleyici ile çalı¸abilirler. ˙ ¸ s Isterseniz. echo $PATH komutuyla masaüstünüzün YOL üstünde görünüp görünmedi˘ ini kontrol edebilirsiniz. Gelelim Windows kullanıcılarına. kullandı˘ ınız da˘ ıtımın KDE veya g g g GNOME menüsüne eklemek istedi˘ inizde i¸inize çok yarayacaktır. .

Burada gördü˘ ümüz >>> i¸aretinden de anlayabilece˘ imiz gibi.. Dilerseniz. g Burada File menüsü içindeki New Window dü˘ mesine tıklayarak a¸a˘ ıdaki ekrana ula¸ıyoruz: g s g s . Biz ¸ s g Python programlarımızı yazabilece˘ imiz bir metin düzenleyici arıyoruz. etkile¸imli kabukta yapaca˘ ınız i¸lemleri bu s g s g s ekranda da yapabilirsiniz.. Ama su anda bizim amacımız etkile¸imli kabukla oynamak de˘ il. bu ekran aslında Python’ın g s g etkile¸imli kabu˘ unun ta kendisidir.

c. "almak istiyorum" Kodlarımızı yazdıktan sonra yapmamız gereken sey dosyayı bir yere kaydetmek olacaktır. Simdi bu bo¸ sayfaya su kodları ekliyoruz: I¸ g ¸ s ¸ a = "elma" b = "armut" c = "muz" print "bir".˙ste Python kodlarını yazaca˘ ımız yer burası. Dosyayı kaydettikten sonra Run/Run Module yolunu takip ederek veya do˘ rudan F5 g tu¸una basarak yazdı˘ ımız programı çalı¸tırabiliriz. b. "bir". ¸ Bunun için File/Save as yolunu takip ederek dosyayı deneme. Bu durumda söyle bir görüntü elde ederiz: s g s ¸ .py adıyla masaüstüne kaydediyoruz. a. "bir de".

E˘ er programınızı do˘ rudan komut satırını kullanarak çalı¸tırmak isterseniz su i¸lemleri yapın: g g s ¸ s 1. Zira ileride bir Python programı yazıp bu programı kullanıcılarınıza sunmak istedi˘ inizde bu bilgiler çok i¸inize yarayacak: g s .py E˘ er her sey yolunda gitmi¸se su çıktıyı almamız lazım: g ¸ s ¸ bir elma bir armut bir de muz almak istiyorum Gördü˘ ünüz gibi gayet basit. Dolayısıyla yukarıda gösterdi˘ imiz cd Desktop komutu sizi masaüstünün g oldu˘ u dizine götürecektir. Hatta geçen bölümde Python’ı ¸ nasıl YOL’a ekleyece˘ imizi de ö˘ rendik. E˘ er Python’ı YOL’a eklemediyseniz programınızı çalı¸tırmak için su yöntemi de kullang s ¸ abilirsiniz: c:/python26/python deneme. Peki ama nedir bu YOL denen sey? Dilerseniz biraz g g ¸ bu konuyu inceleyelim. Tabii e˘ er siz komut satırını farklı bir dizin içinde açmı¸sanız tek g g s ba¸ına yukarıdaki komutu vermeniz sizi masaüstüne götürmez. Ba¸lat/Çalı¸tır yolunu takip edip. masaüstüne. açılan pencereye “cmd” yazın ve ENTER tu¸una basın. g Bu arada birkaç defadır “YOL” diye bir seyden söz ediyoruz. s s s 2. yani dosyayı kaydetti˘ iniz yere gelin: ¸ g cd Desktop Windows’ta komut satırı ilk açıldı˘ ında C:\Documents and Settings\kullanici_adi gibi bir dizinin g içinde olacaksınız. Su komutu vererek.py Tabii ben burada sizin daha önce anlattı˘ ımız sekilde Python’ı YOL’a ekledi˘ inizi varsayg ¸ g dım. Öyle bir durumda suna benzer s ¸ bir komut vermeniz gerekir: cd C:/Documents and Settings/Kullanici_adi/Desktop Masaüstüne geldikten sonra su komutu vererek programınızı çalı¸tırabilirsiniz: ¸ s python deneme.

˙sletim sisg ¸ I¸ temimiz. g ¸ Ba¸lat/Çalı¸tır yolunu takip edip.C:\WINDOWS\System32\Wbem.exe C:\Windows dizini altında bulunan bir programdır. g ˙sletim sistemleri. Simdi komut satırında: ¸ deneme. Komut satırında g g g notepad komutunu vererek bunu kendiniz de test edebilirsiniz. s g . Böylece biz de bu programları do˘ rudan s g g isimleriyle ça˘ ırabiliriz. E˘ er ça˘ ırdı˘ ımız programın çalı¸tırılabilir dosyası bu dizinlerden herhangi g g g s birinin içinde ise o programı ismiyle ça˘ ırabiliyoruz.exe Bu “yol” kelimesinin bir de daha özel bir anlamı bulunur.exe dosyaları çalı¸tırılabilir dosyalardır) içinde yer aldı˘ ı dizinlere de özel olarak s g YOL adı verilir ve bu anlamda kullanıldı˘ ında “yol” kelimesi genellikle büyük harfle yazılır. Çalı¸tırılabilir dosyalar e˘ er bu özel dizinler içinde iseler. i¸letim s g s sistemi bu dosyaları bulur ve çalı¸tırılmalarını sa˘ lar. söz konusu programı çalı¸tırabilmek için bazı I¸ g g s özel dizinlerin içine bakar. Bu klasör de YOL üstünde oldu˘ u için. Calc programını do˘ rudan ismiyle ça˘ ırabiliyoruz. g Dolayısıyla su komutu vererek IE’yi komut satırından ba¸latabilirsiniz: ¸ s "C:\Program Files\Internet Explorer\iexplore.. Dolayısıyla Python’ı çalı¸tırmak için su komutu s ¸ verebiliyoruz: C:\Python26\python.exe‘dir. bir programı ça˘ ırmak istedi˘ imizde öncelikle yukarıda adı verilen dizinlerin içini g g kontrol edecektir. açılan pencerede cmd komutunu vererek MS-DOS’u ba¸latalım s s s ve orada söyle bir komut yazalım: ¸ echo %PATH% Bu komutun çıktısı suna benzer bir sey olacaktır: ¸ ¸ C:\WINDOWS\system32. Simdi bu konuyu daha iyi anlayabilmek için birkaç deneme yapalım.exe de ¸ C:\Windows\System32 klasörü altında bulunan bir programdır. kabaca o programın veya dosyanın içinde yer aldı˘ ı dizindir. sizin de bu dizini önceki dizinden noktalı virgül ile ayırmanız gerekir.exe" Ba¸ka s bir örnek vermek gerekirse. bir programı ça˘ ırdı˘ ımızda.C:\WINDOWS. g g g Simdi e˘ er biz de yazdı˘ ımız programı do˘ rudan ismiyle ça˘ ırabilmek istiyorsak programımızı ¸ g g g g echo %PATH% çıktısında verilen dizinlerden birinin içine kopyalamamız gerekiyor.. hosts dosyasının yolu C:\WINDOWS\system32\drivers\etc\hosts‘tur.exe‘dir.py yazınca programımızın çalı¸tı˘ ını görmemiz lazım. YOL g üstünde yer aldı˘ ı için. Bilgisayar dilinde.Bir programın veya dosyanın yolu. Bu dizin. çalı¸tırılabilir s dosyaların (. Mesela programımızı C:\Windows dizini içine kopyalayalım. Notepad programını do˘ rudan ismiyle ça˘ ırabiliriz. Bu çıktı bize YOL de˘ i¸keni (˙ gs Ingilizce’de PATH variable) dedi˘ imiz seyi gösteriyor. g Örne˘ in Internet Explorer programının yolu C:\Program Files\Internet Explorer\iexplore. Dolayısıyla bu dosyanın içeri˘ ini görüntüleg mek için su komutu verebilirsiniz: ¸ notepad "C:\WINDOWS\system32\drivers\etc\hosts" Python’ın yolu ise C:\Python26\python. YOL’a g yeni bir dizin eklemek isterseniz. g Not: YOL dizinlerinin birbirlerinden noktalı virgül ile ayrıldı˘ ına dikkat edin! Dolayısıyla. Aynı sekilde calc. Örne˘ in notepad.

“Geli¸mi¸” sekmesine girin ve “Ortam De˘ i¸kenleri” dü˘ mesine basın. Peki bu durumun nedeni nedir? s Windows’ta PATHEXT adlı özel bir de˘ i¸ken vardır. uzantısını belirtmeden de ça˘ ırabiliyoruz. . “Sistem De˘ i¸kenleri” bölümünde “PATHEXT” ö˘ esini bulup buna çift tıklayın.WSF. Bu g sayede artık masaüstünde bulunan çalı¸tırılabilir dosyalar da kendi adlarıyla ça˘ rılabilecekler.exe uzan¸ tısını belirtmeden do˘ rudan isimleriyle ça˘ ırabildik. programın bulundugu dizin içinde sadece ismini kullanarak çalı¸tırs mamız da mümkündür.WSH‘den sonra ”.JS. uzantı belirtmeden çalı¸tırabilirsiniz. Bunun için su i¸lemleri yapabilirsiniz: ¸ s 1.COM. s g Ancak masaüstünü YOL’a ekledi˘ inizde.. Burada hemen söyle bir soru akla geliyor: Notepad ve Calc gibi programları. ˙ ¸ s Isterseniz. Su komutu verelim: g ¸ echo %PATHEXT% Buradan su çıktıyı alıyoruz: ¸ . s Simdiye kadar bir Python programını nasıl yazaca˘ ımızı ve IDLE’ı ya da MS-DOS’u kullanarak bu ¸ g programı nasıl çalı¸tıraca˘ ımızı ö˘ rendik.. masaüstünüz hep YOL üstünde kalmayacak. Peki yazdı˘ ımız bir programı çift tıklayarak çalı¸tıras g g g s maz mıyız? Elbette çalı¸tırabiliriz.EXE.. daha önce gösterdi˘ imiz sekilde... E˘ er masaüstü dizinini kalıcı ¸ g olarak YOL’a eklemek isterseniz. Bu de˘ i¸ken. bu dizini Sistem De˘ i¸keng ¸ gs leri içindeki PATH listesine yazmanız gerekir.py adlı programımızı g g çalı¸tırabilmek için .. hiç . Gördü˘ ünüz gibi.BAT.exe de bu uzantılardan biri. Denetim Masasında “Sistem” simgesine çift tıklayın. 5. echo %PATH% komutuyla masaüstünüzün YOL üstünde görünüp görünmedi˘ ini kontrol edebilirsiniz. 2..VBS.. dosyamızın içinde bulundu˘ u dizini YOL’a eklemek de mümkün..Program dosyamızı YOL üstünde bulunan dizinlerden birine eklemek yerine.VBE. mevcut g MS-DOS oturumu kapatılınca her sey yine eski haline dönecektir. Yani yazdı˘ ımız programı masaüstüne kaydetti˘ imizi varsayarsak ve g g su komutla da masaüstüne geldi˘ imizi dü¸ünürsek: ¸ g s cd C:/Documents and Settings/Kullanici_adi/Desktop Masaüstüne geldikten sonra su komutu vererek programınızı çalı¸tırma imkanına sahibiz: ¸ s .py uzantılı dosyaları da. s s gs g 3. TAMAM’a basıp çıkın.py uzantısını g g da ekleyebilirsiniz.. Dolayısıyla bu uzantıya sahip g bir dosyayı. E˘ er isterseniz bu listeye .PY” girdisini ekleyin. Hatta bu sayede Windows üzerinde yazdı˘ ımız s g g ˘ Python programlarını. s Python Windows’a kurulurken kendini kütü˘ e (Registry) kaydeder.py uzantısını da belirtmemiz gerekti.. Böylece artık .CMD.%USERPROFILE%\Desktop Bu sekilde masaüstü dizinini YOL’a eklemi¸ olduk.WSH Windows’ta e˘ er bir program yukarıda görülen uzantılardan birine sahipse çalı¸tırılabilir olarak g s kabul edilecektir.JSE.. gs g 4. Ama mesela deneme. sistemin çalı¸tırılabilir kabul gs gs s etti˘ i uzantıları tutar. En son girdi olan . Dolayısıyla Windows Python g programlarını nasıl çalı¸tırması gerekti˘ ini bilir. Bunun için MS-DOS’ta söyle bir komut vermemiz g ¸ gerekiyor: PATH=%PATH%.

Pros s gramlarınızı her zaman komut satırından çalı¸tırın.. MS-DOS’un kapanmasını eng ¸ gelledi˘ ini bilin. Yani e˘ er programınız Belgelerim dizini içinde ise ve siz de MS-DOS’ta g C:/Documents and Settings/Kullanici_adi/Desktop dizini altındaysanız bu komut bir i¸e yaras mayacaktır. Böylece. Programımızın çalı¸tı˘ ını görebilmemiz için o siyah kos g s g mut satırının kapanmasına engel olmamız gerekir. Python’la bir program geli¸tirirken. Aslında programımız çalı¸ıyor. MS-DOS’ta o anda programın bulundu˘ u dizin s g içinde olmamız gerek. "almak istiyorum" raw_input() Son satıra ekledi˘ imiz bu raw_input() ifadesinin ne oldu˘ unu ve tam olarak ne i¸e yaradı˘ ını g g s g birkaç bölüm sonra inceleyece˘ iz..py Ancak bu komutun i¸e yarayabilmesi için. programlarınızı çalı¸tırmak için asla bu çift tıklama yöntemini kullanmayın. Bu de˘ i¸kenin de˘ eri 4 gs gs g . g g programınızı biraz önce anlattı˘ ımız sekilde YOL’a eklemelisiniz. Ancak burada söyle bir problem g s ¸ var. c. Python Windows’a kurulurken kendini kütü˘ e kaydetti˘ i için.py uzang g g tılı dosyaya çift tıkladı˘ ımızda programımız çalı¸acaktır. Ama e˘ er programınızı çift tıklayarak g g çalı¸tırırsanız hatayı görme sansınız olmaz. ama bu i¸lem o kadar g s s s hızlı olup biter ki. Bir üçgenin alan formülü sudur: ¸ alan = taban x (yukseklik / 2) Kodlarımız söyle olmalı: ¸ yukseklik = 4 taban = 6 alan = taban * (yukseklik / 2) print alan Burada yaptı˘ ımız sey su: g ¸ ¸ 1. Simdilik siz sadece bu satırın.. yazdı˘ ımız . Buna bir örnek verelim. "bir". "bir de". Yazdı˘ ınız programı konum farketmeksizin her yerden ça˘ ırabilmek istiyorsanız. Öncelikle yukseklik adlı bir de˘ i¸ken tanımladık. e˘ er programınızda bir hata varsa. Biz simdi tekrar g ¸ ¸ konumuza dönelim. programımızın en son satırına su ¸ ilaveyi yaparak hallediyoruz: raw_input() Yani kodlarımız söyle görünmeli: ¸ a = "elma" b = "armut" c = "muz" print "bir". yazdı˘ ımız programları çift tıklayarak çalı¸tıramaz mıyız? Tabii ki çalı¸tırag s s biliriz. Bu komut sayesinde MS-DOS siz ENTER tu¸una basana kadar açık kalacaktır. b.. ama çok hızlı bir sekilde çalı¸ıp sona erdi˘ i için biz s ¸ s g programımızın çalı¸tı˘ ını göremiyoruz. a. biz sadece arkada son hızla siyah bir komut satırının açılıp kapandı˘ ını g görürüz... Dosyamıza çift tıkladı˘ ımızda programımız çalı¸ır çalı¸masına... Bunu da. Neyse. g s Ancak bu noktada çok önemli bir uyarı yapmamız gerekiyor. s ¸ Diyelim ki bir üçgenin alanını hesaplayan bir program yazacaksınız. s g bu hatanın nereden kaynaklandı˘ ını anlayabilirsiniz. Ne diyorduk? Evet.deneme.

hakikaten “alan” diye bir de˘ i¸ken tanımlamamı¸ız. Yalnız bu noktada su hatırlatmayı yapmadan geçmeyes ¸ lim... Çünkü Python kodları yukarıdan a¸a˘ ıya do˘ ru okur. fahrenhayt) s . Üstelik son satıra raw_input() eklemeniz de hiç bir i¸e yaramaz. Ardından taban adlı ba¸ka bir de˘ i¸ken daha tanımladık.0) + 32 print "%s santigrat derece %s fahrenhayta \ kar¸ılık gelir. s g g Simdi söyle bir dü¸ünün. Bu program söyle bir hata verecektir: g ¸ Traceback (most recent call last): File "deneme. Son olarak da alan adlı de˘ i¸kenin de˘ erini print komutu yardımıyla ekrana çıktı olarak gs g veriyoruz. üzerinde program geli¸tirece˘ i i¸letim sistemini yakından tanımalıdır. Çünkü MS-DOS ekranı son hızla açılıp kapanacaktır. Bu programı çalı¸tırdı˘ ımızda alaca˘ ımız sonuç 12 olacaktır. line 6. Bir hatayla s g s g g kar¸ıla¸tı˘ ında da kodların geri kalanını okumadan programdan çıkar. “alan” diye bir seyin tanımlanmadı˘ ını söylüyor. Diyelim ki biz bu programı yazarken ufak bir hata yaptık ve söyle bir ¸ ¸ s ¸ sey çıkardık ortaya: ¸ yukseklik = 4 taban = 6 ala = taban * (yukseklik / 2) print alan E˘ er bu programı çift tıklayarak çalı¸tırırsanız.. Bu satır sadece hatasız programların çift tıks lanarak çalı¸masını sa˘ lar.. Yukarıda verdi˘ imiz bilgiler son derece önemlidir. programdaki hatanın nereden kaynaklandı˘ ını g s g anlayamazsınız." %(santigrat. Sadece Python’la de˘ il.0/5. yukarıda anlattı˘ ımız seyleri özümsemi¸ olmalısınız. Üçgenin alanını hesaplamamızı sa˘ layan formülümüzü yazıyoruz: g (yukseklik / 2) alan = taban * 4.2. bu sebeple s MS-DOS satırının kapanmasını önleyen kod hiçbir zaman çalı¸mamı¸ olacaktır.py". hangi dille prog g gramlama yapıyor olursanız olun. s s Ama e˘ er aynı programı komut satırından çalı¸tırmayı denerseniz hatanın nereden kayg s naklandı˘ ı konusunda bir fikir edinebilirsiniz. Python bu satıra ula¸amadan programı kapatacak.3 Türkçe Karakter Kullanımı Simdiye dek Python hakkında epey bilgi edindik. 5. Çünkü formülde “alan” yazags s ca˘ ımıza yanlı¸lıkla “ala” yazmı¸ız! g s s Böylece bir bölümü daha bitirmi¸ olduk. raw_input() s s g satırından önce bir hata varsa. Bu de˘ i¸kenin de˘ eri ise 6 s gs gs g 3. in <module> print alan NameError: name ’alan’ is not defined Bu hata bize. ˙ bir g ¸ s Iyi programcı. Dolayısıyla. s g s 3. Dilerseniz elimizi alı¸tırmak için santigratı ¸ s fahrenhayta çeviren bir betik yazalım ve neler oldu˘ una bakalım: g santigrat = 22 fahrenhayt = santigrat * (9. Kodlarımıza dikkatli bakınca ¸ g görüyoruz ki.

Çünkü yukarıdaki s g g g s kodlar suna benzer bir hata mesajı almanıza sebep olacaktır: ¸ File "deneme.html for details Bu hata mesajını almamızın nedeni.Bu programı çalı¸tırdı˘ ınızda biraz hayal kırıklı˘ ına u˘ ramı¸ olabilirsiniz. Bu g ¸ arada isterseniz yukarıdaki kodları biraz inceleyelim: Burada öncelikle # -*.coding: cp1254 -*- Böylelikle kullandı˘ ımız karakter tipini Python’a tanıtmı¸ oluyoruz. ¸ s Son olarak da 22 santigrat derecenin kaç fahrenhayta kar¸ılık geldi˘ ini düzgün bir cümle s g halinde kullanıcıya gösterdik.py on line 6.python.coding: utf-8 -*- Windows kullanıcıları ise utf-8 yerine cp1254 adlı karakter kodlamasını kullanmayı tercih edebilir: # -*.0/5. ˙ g s Ilerde ascii. unicode ve Python konusunu i¸lerken Python’ın Türkçe karakterlere neden böyle davrandı˘ ını inceleyes g ce˘ iz. Ama siz simdilik bu konuyu çok fazla dert edinmeyin. programımız içinde kullandı˘ ımız “ı.coding: cp1254 -*. Formülde 9/5 yerine 9.satırını yazdık. Bu satırın Windows’ta -*. g IDLE üzerinde çalı¸an Windows kullanıcıları bu programı # -*. Böylece 9 sayısını 5 sayısına hassas bir g sekilde bölebilmi¸ olduk.org/peps/pep-0263.satırını s yazmadan kaydetmeye çalı¸tıklarında söyle bir uyarı penceresiyle kar¸ıla¸acaklar: s ¸ s s . Burada karakter dizisini nasıl biçimlendirdi˘ imize dikkat edin. Bu satır sayesinde kullanaca˘ ımız kodlama biçimini Python’a tanıtmı¸ olduk.coding: utf-8 -*. Python yazdı˘ ımız kodlar içindeki bu Türkçe karakterler nedeniyle bize bu hata mesajını g gösterecektir. s” gibi Türkçe karakg ¸ terler. Ardından santigrat adlı bir de˘ i¸ken tanımladık ve bu de˘ i¸kenin de˘ erini 22 olarak belirledik." %(santigrat.py". Böyle bir hata mesajı almamak için kodlarımızın arasına su satırı eklememiz ¸ gerekir: # -*.0) + 32 print "%s santigrat derece %s fahrenhayta \ kar¸ılık gelir.coding: utf-8 -*santigrat = 22 fahrenhayt = santigrat * (9. see http://www.coding: cp1254 -*. Aksi halde formülümüz sonucu hatalı hesaplayacaktır. g ¸ Programımızın en son hali söyle olacak: ¸ # -*.0 yazdı˘ ımıza dikkat edin. Böylece kodlarımız içinde Türkçe karakg s ter kullanabilece˘ iz. fahrenhayt) s Gördü˘ ünüz gibi bu defa programımız Türkçe karakterleri düzgün bir sekilde gösterebildi. gs gs g Daha sonra da fahrenhaytı santigrata çevirebilmek için gereken formülümüzü yazdık. line 6 SyntaxError: Non-ASCII character ’\xc5’ in file deneme.biçimini alaca˘ ını biliyg g orsunuz. but no encoding declared.0/5.

fahrenhayt)) s Python satır bölme konusunda pek çok alternatif sunar." s %(santigrat. fahrenhayt)) Yalnız bu yöntemi. O yüzden" " iki satıra bölünmem gerekir..") veya: print ("%s santigrat derece %s fahrenhayta kar¸ılık gelir.0/5. karakter kodlamasını belirtmeniz konusunda sizi uyarıyor. s g Daha önceki derslerimizde de bahsetti˘ imiz gibi Python’da kodların görünümü de önem ta¸ır.IDLE. Hatta söyle bir sey dahi yapmanıza ¸ ¸ izin verir.") ya da: print ("%s santigrat derece %s fahrenhayta" " kar¸ılık gelir.komutunu ekleyecektir. E˘ er burada “Edit My File” g dü˘ mesine basacak olursanız. g s Kodların çirkin bir sekilde sa˘ a do˘ ru uzamasını engellemek amacıyla “\” kaçı¸ dizisini kulla¸ g g s narak kodlarımızı alt satıra kaydırdık. O yüzden iki satıra bölünmem gerekir. Dikkatlice inceleyin: print ("Ben çok uzun bir karakter dizisiyim. fahrenhayt)) s .0) + 32 print ("%s santigrat derece %s fahrenhayta kar¸ılık gelir. Burada karakter dizisinin tamamını g parantez içine aldık: print ("%s santigrat derece %s fahrenhayta kar¸ılık gelir. fahrenhayt)) Burada kullandı˘ ımız bölme biçimine çok dikkat edin.. E˘ er arzu ederseniz. Yani su kullanımlar yanlı¸tır: s ¸ s print ("Ben çok uzun bir karakter dizisiyim. Yukarıdaki kodlarda dikkat etmemiz gereken ba¸ka bir nokta da kodları nasıl böldü˘ ümüzdür."%(santigrat." s %(santigrat.coding: cp1254 -*santigrat = 22 fahrenhayt = santigrat * (9."%(santigrat. Bu yöntemi kullanabilmeniz için “%s” i¸aretlerinin kullanıldı˘ ı bir kodla kar¸ı kar¸ıya olmanız ve satırı “%” s g s s i¸aretinden bölmeniz gerekir. yukarıdaki kodları su sekilde de g ¸ ¸ bölebilirsiniz: # -*. bir karakter dizisini ortadan bölmek için kullanamazsınız.coding: g cp1254 -*. IDLE programınızın ilk satırına sizin yerinize # -*.

0/5.. “özellikleri. o kadar.Aslında su son iki yöntemi biliyor olmanız lazım. Bu durumu düzeltmek için su adımları takip ediyoruz: ¸ • Önce MS-DOS ekranını açıyoruz.4 MS-DOS’ta Türkçe Karakter Problemi Yukarıda kodlama biçimi belirterek Türkçe karakterleri nasıl gösterece˘ imizi inceledik. aynı ba¸lıkla ileride olu¸turulacak pencereler için s s s kaydet” seçene˘ ini i¸aretliyoruz. s s 3.py komutunu vererek çalı¸tırmak istedi˘ imizde söyle s g ¸ bir çıktı alıyoruz: 22 santigrat derece 71. Türkçe g karakterlerin problem çıkardı˘ ı bir ba¸ka ortam da MS-DOS’tur. g s Simdi en ba¸ta verdi˘ imiz kodları çalı¸tırdı˘ ımızda su çıktıyı alıyoruz: ¸ s g s g ¸ .. s g g • Yazı Tipi sekmesi içinde yazı tipini “Lucida console” olarak de˘ i¸tiriyoruz. fahrenhayt)) Bu dosyayı MS-DOS’ta python deneme. • Kar¸ımıza çıkan pencerede. Biz simdiki örne˘ imizde alt satıra geçti˘ imiz g ¸ g g için bütün karakter dizilerini parantez içine aldık. Hatırlarsanız ilk derslerimizde karakter ¸ dizilerini birle¸tirmeyi ö˘ renirken söyle bir örnek vermi¸tik: s g ¸ s ˙ >>> print "Istanbul " "Çeliktepe" Yukarıdaki örne˘ in de bundan hiçbir farkı yoktur.6 fahrenhayta kar?²l²k gelir.. gs • Tamam’a basıyoruz." s %(santigrat. g g Mesela su kodları deneme. • Ardından su komutu veriyoruz: ¸ chcp 1254 • Daha sonra pencere ba¸lı˘ ına sa˘ tıklayıp “özellikler”e giriyoruz.py adlı bir dosyaya kaydetti˘ imizi varsayalım: ¸ g # -*. Yani önceki derste gördü˘ ümüz g örne˘ i iki satıra bölmek isteseydik söyle bir kod yazacaktık: g ¸ ˙ >>> print ("Istanbul " .. Gördü˘ ünüz gibi bütün Türkçe karakterler birbirine girmi¸ durumda. Bunun temel sebebi Wing s dows’ta komut satırının öntanımlı yazı tipinin Türkçe karakterleri düzgün gösterememesi.coding: cp1254 -*santigrat = 22 fahrenhayt = santigrat * (9..0) + 32 print ("%s santigrat derece %s fahrenhayta kar¸ılık gelir. "Çeliktepe") Bu yöntemlerden herhangi birini tercih edebilirsiniz. Bu bölümde bu sorunu nasıl a¸abiles ce˘ imizi inceleyece˘ iz... Ama etrafta görece˘ iniz programlarda g hepsiyle kar¸ıla¸ma ihtimaliniz var. Windows’un komut satırı g s Türkçe karakterleri düzgün göstermekte zorlanabiliyor..

Yani beti˘ e hesaplayici. önce http://www. Üstelik bu noktaya kadar Python’la s ilgili epey bilgi de edindik." 7. vlc komutu ile programı MS-DOS’tan çalı¸tırın.exe‘yi YOL’a (PATH) ekleyin.. s Böylece çok önemli bir konuyu daha geride bırakmı¸ olduk.videolan. Bu s defa nasıl bir hata mesajı alıyorsunuz? Sizce bu hata mesajlarını almanızın sebebi nedir? .org/vlc/ adresini ziyaret edin ve g oradan VLC adlı programı indirin.py adını verdi˘ inizi varsayarsak. Buradaki uzun karakter dizisini s g yazdırırken. ünvan: ˙¸ Geli¸tirme Uzmanı.22 santigrat derece 71. Ne tür bir hata mesajı alıyorsunuz? Aynı programı bir de #!/usr/bin/env python gibi bir satır yazmadan çalı¸tırmayı deneyin. Hem Windows’ta hem de GNU/Linux’ta su beti˘ i herhangi bir konumdan sadece ismi ile ¸ g ça˘ rılabilecek hale getirin. Mesela sunu: ¸ ¸ #!/usr/python Simdi bu programı chmod komutuyla çalı¸tırılabilir hale getirin ve programı adıyla ça˘ ırmayı ¸ s g deneyin. s 4.. yıldır bu görevde bulunmaktadır.. Dilerseniz simdi bölüm sorularımıza bir göz atalım ve ondan sonra ¸ yeni ve yine çok önemli bir konuya geçelim. bilgisayarınızda VLC klasörünü bulup.5 Bölüm Soruları 1.’dır. 3. Komut satırında masaüstünün bulundu˘ u konuma gelebilmek için hangi komutu kullang manız gerekiyor? 2. farklı yöntemler kullanarak karakter dizisini uygun yerinden bölmeye dikkat edin: maa¸: 3500 TL. 4. komut g g g satırından sadece hesaplayici komutu girilerek programınız çalı¸tırılabilmeli: s yukseklik = 4 taban = 6 alan = taban * (yukseklik / 2) print alan 5. soruda yazdı˘ ınız Python programının çift tıklamayla g g çalı¸masını sa˘ layın.6 fahrenhayta kar¸ılık gelir. s s Kendisi . bu klasör içindeki vlc. s g 6. E˘ er Windows kullanıyorsanız C:\Program Files dizini altında.. Simdi indirdi˘ iniz bu programı normal bir sekilde kurun. TL maa¸la çalı¸an bir . GNU/Linux kullanıyorsanız g /usr/bin dizini altında bir komut ekranı açın. s Is s çalı¸tı˘ı süre: 5 s g "Ahmet Bey . ¸ g ¸ Ardından. yazdı˘ ınız bir Python programının ilk satırına g g #!/usr/bin/env python yerine farklı bir sey yazın. E˘ er Windows kullanıyorsanız. 3.. A¸a˘ ıdaki bilgileri kullanarak bir Python programı yazın. E˘ er Windows kullanıyorsanız. E˘ er GNU/Linux kullanıyorsanız.. Son olarak.

fahrenhayt)) Dikkat ederseniz burada santigrat de˘ i¸kenini kendimiz kod içinde elle belirledik. kullanıcıyla nasıl ileti¸im kurabilece˘ imizi de ö˘ ren¸ g g s g g memizin vakti geldi.0) + 32 print ("%s santigrat derece %s fahrenhayta kar¸ılık gelir. s Dikkat ettiyseniz.. Ama artık. g Hatırlarsanız geçen bölümde söyle bir örnek vermi¸tik: ¸ s #!/usr/bin/env python # -*. simdiye dek sadece tek yönlü bir programlama faaliyeti içinde bulunduk." s %(santigrat.coding: utf-8 -*santigrat = 22 fahrenhayt = santigrat * (9. de˘ il mi? Böylece her defasında farklı bir de˘ er alıp g g bunu hesaplayabilen esnek bir programımız olurdu.0/5. Birkaç bölüm sonra fonksiyonun ne demek oldu˘ unu inceleyece˘ iz.) Bu iki fonksiyon birbirg g lerinden bazı farklılıklar gösterir. Böyle bir kod yazımının ne kadar sıkıcı oldu˘ u ortada. yani kullanıcıyla ileti¸ime geçebilmek için iki s tane fonksiyondan faydalanılır: raw_input() ve input() (Bu “fonksiyon” kelimesine takılmayın. g g g Python’da kullanıcıdan birtakım veriler alabilmek. Bu santigrat de˘ i¸kenini g gs kendimiz elle yazmak yerine. Bu defaki konumuz g “kullanıcıyla ileti¸im”. ¸ Yani yazdı˘ ımız kodlar kullanıcıyla herhangi bir etkile¸im içermiyordu. 43 . Dolayısıyla gs formüle giren bütün sayılar zaten belli oldu˘ u için bu kodların nasıl bir çıktı verece˘ ini de g g biliyoruz.. Bunlardan öncelikle ilkine bakalım. kullanıcıya sorabilsek ve kullanıcının girdi˘ i miktara göre g hesaplama yapabilsek ne güzel olurdu. ˙ste bu bölümde böyle bir programı nasıl I¸ yazabilece˘ imizi ö˘ renece˘ iz.BÖLÜM 4 Kullanıcıyla ˙leti¸ im: Veri I s Alı¸ -Veri¸ i s s Bu bölümde de Python’daki önemli konulara de˘ inmeye devam ediyoruz. Bu bölümde kullanıcılarımızla nasıl veri alı¸-veri¸inde bulunaca˘ ımızı s s g görece˘ iz. Python’da g s bazı temel seyleri ö˘ rendi˘ imize göre.

Daha sonra bir konsol ekranı açıp. Windows kullanıcıları bu satırı yazmasalar da olur. Her zaman yaptı˘ ımız gibi. Simdi raw_input() fonksiyonuyla kullanıcıdan bazı bilgiler alaca˘ ız. "almak istiyorum" raw_input("Programdan çıkmak için ENTER tu¸una basın. Bu sizin terg g cihinize kalmı¸. a. kullanıcıdan ne bekledi˘ imizi göstermemizi sa˘ lıyor. pro¸ gramımızın kayıtlı oldu˘ u dizine geçerek su komutla programımızı çalı¸tırıyoruz: g ¸ s python deneme. Buna göre biz bu kodlarla g g kullanıcıdan parolasını girmesini isteyece˘ iz. "bir de". ˙ g g g Isterseniz bu fonksiyonu tarif etmeye çalı¸mak yerine hemen bununla ilgili bir örnek verelim.py Elbette siz isterseniz daha önce anlattı˘ ımız sekilde dosyaya çalı¸tırma yetkisi vererek ve g ¸ s gerekli düzenlemeleri yaparak programınızı do˘ rudan ismiyle de ça˘ ırabilirsiniz. Bu satırın Windows’ta hiçbir etkisi yoktur.coding: cp1254 -*a = "elma" b = "armut" c = "muz" print "bir".4. c. s #!/usr/bin/env python # -*.1 raw_input() fonksiyonu raw_input() fonksiyonu kullanıcılarımızın klavye aracılı˘ ıyla girdi˘ i verileri almamızı sa˘ lar. ¸ g parola sorup kendisine te¸ekkür edelim. Bu fonksiyonu Windows’ta çift tıklayarak çalı¸tırmak istedi˘ imiz programlarda MS-DOS ekranının program s g sonunda kapanmasını önlemek için kullanmı¸tık.. s Program çalı¸tı˘ ında. ilk s g satırımızı ekleyelim belgeye: #!/usr/bin/env python Not: Bu satır sadece GNU/Linux kullanıcılarını ilgilendirir. b.") s . Parantez içinde yazdı˘ ımız g g karakter dizisi.coding: utf-8 -*raw_input("Lütfen parolanızı girin:") print "Te¸ekkürler!" s Mesela kullanıcıya bir raw_input() fonksiyonunu nasıl kullandı˘ ımıza çok dikkat edin. Ancak ço˘ u zaman. O örnekte gösterdi˘ imiz programı su sekilde s g ¸ ¸ yazarsak herhalde raw_input() fonksiyonunun oradaki görevi daha belirgin bir sekilde ortaya ¸ çıkacaktır: # -*. g ¸ Çünkü aksi halde programınız çalı¸tı˘ ında kullanıcınız ne yapması gerekti˘ ini anlayamayacaks g g tır. kullanıcı “Lütfen parolanızı girin: ” cümlesini görecek ve böylece kens g disinden ne beklendi˘ ini anlayacak. s Öncelikle bo¸ bir Kwrite (veya Gedit ya da IDLE) belgesi açalım.py ismiyle kaydediyoruz. "bir". g Simdi bu belgeyi deneme. Elbette raw_input() fonksiyonundaki parantezi bo¸ da g s bırakabilirsiniz. parantez içine açıklayıcı bir seyler yazmak isteyeceksiniz. Windows kullanıcıları esasında bu fonksiyonu önceki derslerimizden hatırlayacaktır..

Kullanıcı parolasını girdikten sonra programımız kullanıcıya te¸ekkür etsin. Öncelikle yazaca˘ ımız kodlardan ba˘ ımsız olarak ¸ s g g girmemiz gereken bilgileri ekleyelim: #!/usr/bin/env python # -*.Biz o dersteki örnekte parantez içini bo¸ bırakmı¸tık. "de˘il. Kullanıcı daha sonraki satırda parolanın yanlı¸ oldu˘ u konusunda uyarılsın. parola. s s Dilerseniz biraz önce yazdı˘ ımız parola soran programı biraz geli¸tirelim. Mesela programımız g s su i¸lemleri yapsın: ¸ s 1. Simdi de kullanıcıya parolasının yanlı¸ oldu˘ unu bildirece˘ iz: ¸ s g g print "Ne yazık ki do˘ru parola bu de˘il" g g Programımızın son hali söyle olacak: ¸ #!/usr/bin/env python # -*. yani kullanıcının yazdı˘ ı parolayı cümlemizin içine (ya da gs g Pythonca ifade etmek gerekirse: “karakter dizisi içine”) eklemi¸ olduk. s g Simdi kodlarımızı yazmaya ba¸layabiliriz. Bir sonraki satırda kullanıcı tarafından girilen bu parola ekrana yazdırılsın. 4.. parola de˘ i¸kenini.coding: utf-8 -*- Simdi raw_input() fonksiyonuyla kullanıcıya parolasını soraca˘ ız. s 3. Ama isterseniz bu raw_input() ¸ g fonksiyonunu bir de˘ i¸kene atayalım: gs parola = raw_input("Parolanızı girin:") Simdi kullanıcıya te¸ekkür ediyoruz: ¸ s print "Te¸ekkürler!" s Kullanıcı tarafından girilen parolayı ekrana yazdırmak için su satırı ekliyoruz: ¸ print parola Biraz önce raw_input() fonksiyonunu neden bir de˘ i¸kene atadı˘ ımızı anladınız sanırım." g g ˙ Isterseniz son satırda su de˘ i¸ikli˘ i yapabiliriz: ¸ gs g print "Ne yazık ki do˘ru parola".." g g Böylelikle.coding: utf-8 -*parola = raw_input("Parolanızı girin:") print "Te¸ekkürler!" s print parola print "Ne yazık ki do˘ru parola bu de˘il. Bu gs g sayede do˘ rudan parola de˘ i¸kenini ça˘ ırarak kullanıcının yazdı˘ ı parolayı ekrana dökebiliyg gs g g oruz. s Bu parola de˘ i¸kenini karakter dizisi içine eklemenin ba¸ka bir yolu da kodu su sekilde yazgs s ¸ ¸ maktır: . s g 2. Program ilk çalı¸tırıldı˘ ında kullanıcıya parola sorsun.

Ama bunların arasında çok önemli bir fark vardır. YukarıI¸ daki örneklerde. kullanıcı tarafından girilen sayılar birbirleriyle toplanacaktır. Python’ın sayılara ve karakter dizilerine nasıl davrandı˘ ını görüyoruz. input() fonksiyonuyla da kullanıcılardan bazı bilg gileri alabiliyoruz. raw_input() ve input() fonksiyonları birbirlerine çok beng zer. kullanıcıdan bilgi almak için kullanabilece˘ imiz ¸ g ikinci fonksiyondan biraz bahsedelim. E˘ er g g . O zaman su ¸ s s s s ¸ örnekleri vermi¸tik: s >>> print 25 + 50 75 >>> print "25" + "50" 2550 ˙ste raw_input() ile input() arasındaki fark. Programın sonunda elde edece˘ imiz sayı 65 olacaktır. Diyelim ki ilk girilen sayı 25.coding: utf-8 -*a = raw_input("Lütfen bir sayı girin:") b = raw_input("Lütfen ba¸ka bir sayı daha girin:") s print a + b Bu kodları yazarken input() fonksiyonunu kullanırsak. yukarıdaki iki örnek arasındaki farka benzer. görüldü˘ ü gibi.coding: utf-8 -*a = input("Lütfen bir sayı girin:") b = input("Lütfen ba¸ka bir sayı daha girin:") s print a + b Kullanım açısından. ikinci sayı ise 40 olsun. g 4. Mesela kullanıcıdan g g gelen parolayı tırnak içine alarak cümle içinde daha belirgin durmasını sa˘ layabilirsiniz: g print "Ne yazık ki do˘ru parola ’%s’ de˘il" %(parola) g g Simdi raw_input() fonksiyonuna bir ara verip. Az sonra raw_input() fonksiyonuna geri dönece˘ iz. g Ancak bu kodları yazarken e˘ er raw_input() fonksiyonunu kullanırsak. Yani elde edece˘ imiz sey 2540 olag ¸ caktır. sadece yan yana yazılacaklardır. Hatırlarsanız buna benzer bir seyle “sayılar” konusunu i¸lerken de kar¸ıla¸mı¸tık. Su basit örne˘ e bir bakalım: ¸ g #!/usr/bin/env python # -*. Hemen yukarıda verilen kodları bir de raw_input() fonksiyonuyla yazmayı denersek bu fark çok açık bir sekilde ortaya çıkacaktır: ¸ #!/usr/bin/env python # -*.2 input() fonksiyonu Tıpkı raw_input() fonksiyonunda oldu˘ u gibi. girilen sayılar birbirg leriyle toplanmayacak.print "Ne yazık ki do˘ru parola %s de˘il" %(parola) g g Bu sayede kullanıcının girdi˘ i parolayı istedi˘ iniz gibi biçimlendirebilirsiniz.

Bu yüzden. Ama e˘ er iki adet karakter s s g dizisiyle kar¸ıla¸ırsa. e˘ er kullanıcı bir sayı s g . yukarıda hata veren kodlarımızın da düzgün çalı¸abilmesi için o kodları söyle yazs ¸ mamız gerek: #!/usr/bin/env python # -*.py". Karakter dizileri ile aritmetik i¸lem yapılmaz. Ben size o \ sayının karesini söyleyeyim:\n") print "girdi˘iniz sayı\t\t: %s" %(sayi) g print "girdi˘iniz sayının karesi: %s" % (sayi * sayi) g Bu kodları çalı¸tırdı˘ ınızda sayıyı girip ENTER tu¸una bastıktan sonra söyle bir hata mesajı s g s ¸ alacaksınız: File "deneme. bu karakter dizilerini yanyana yazmakla yetiniyor. Çünkü aritmetik i¸lemler ancak s sayılar arasında olur. Burada tam olarak ne döndü˘ ünü anlayabilmek için etkile¸imli kabukta s g s verdi˘ imiz su örneklere bakalabilirsiniz: g ¸ >>> a = "12" >>> b = "12" >>> print a * b TypeError: can’t multiply sequence by non-int of type ’str’ Gördü˘ ünüz gibi biraz öncekiyle aynı hatayı aldık. Karakter dizileri ile aritmetik i¸lem yapılamayaca˘ ı için de hata vermekten s g ba¸ka çaresi kalmıyor..coding: utf-8 -*sayi = input("Bir sayı girin.. g Iki bölemez ve bu karakter dizilerini birbirinden çıkaramazsınız. line 8. raw_input() fonksiyonunun kullanıcı verilerini karakter dizisi olarak almasından kaynaklanıyor.coding: utf-8 -*sayi = raw_input("Bir sayı girin.. ˙ karakter dizisini birbiriyle çarpamaz. Bu durumu daha net görebilmek için dilerseniz söyle bir örnek veres ¸ lim: #!/usr/bin/env python # -*.Python iki adet sayıyla kar¸ıla¸ırsa bu sayıları birbiriyle topluyor. Yukarıdaki örneklerin s düzgün çıktı verebilmesi için o örnekleri söyle yazmamız gerekir: ¸ >>> a = 12 >>> b = 12 >>> print a * b 144 Dolayısıyla.. in <module> print "girdi˘iniz sayının karesi: %s" % (sayi * sayi) g TypeError: can’t multiply sequence by non-int of type ’str’ Bu durum. s s Bütün bu açıklamalardan anlıyoruz ki raw_input() fonksiyonu kullanıcının girdi˘ i verileri karakg ter dizisine dönü¸türüyor. Yani bu verileri karakter dizisine dönü¸türmez. Ben size o \ sayının karesini söyleyeyim:\n") print "girdi˘iniz sayı\t\t: %s" %(sayi) g print "girdi˘iniz sayının karesi: %s" % (sayi * sayi) g raw_input() fonksiyonundan farklı olarak input() fonksiyonu kullanıcıdan gelen verileri oldu˘ u g gibi alır.

Ama tabii ki normal sartlarda kimseden ¸ ismini ve soyismini tırnak içinde yazmasını bekleyemezsiniz. Python’ın ilk veri giri¸inden sonra g s söyle bir hata verdi˘ ini görmü¸sünüzdür: ¸ g s SyntaxError: invalid syntax Etkile¸imli kabukta su komutu verdi˘ inizde de aynı hatayı aldı˘ ınızı göreceksiniz: s ¸ g g >>> Ahmet SyntaxError: invalid syntax Burada hata almamak için söyle yapmak gerek: ¸ >>> "Ahmet" ’Ahmet’ Dolayısıyla Python’ın input() fonksiyonuyla bu hatayı vermemesi için de tek yol." s %(santigrat.girmi¸se.coding: utf-8 -*santigrat = input("Santigrat cinsinden bir de˘er girin: ") g fahrenhayt = santigrat * (9. fahrenhayt)) Böylece elimizde gayet sık bir derece dönü¸türme programı olmu¸ oldu. kullanıcının geçerli bir Python komutu girmesini bekler. Yani e˘ er kulg lanıcının girdi˘ i sey Python’ın etkile¸imli kabu˘ unda hata verecek bir ifade ise. s . toplama. Ama e˘ er biz kullanıcılardan sayı de˘ il de karakter dizisi girmesini istiyorsak g g raw_input() fonksiyonunu kullanaca˘ ız. input()‘lu kog ¸ s g dunuz da hata verecektir.) input() fonksiyonunu ters cih edebiliriz.. bizim bu sayıyla aritmetik i¸lem s g g s yapmamıza müsaade eder. input() fonksiyonu bu sayıyı oldu˘ u gibi alaca˘ ı için. Bu durumu daha iyi anlayabilmek için mesela a¸a˘ ıda raw_input() s g fonksiyonuyla yazdı˘ ımız kodları siz bir de input() fonksiyonuyla yazmayı deneyin: g #!/usr/bin/env python # -*. g Simdi dilerseniz bu bölümün en ba¸ında verdi˘ imiz fahrenhayta dönü¸türme programını. Bütün bunlardan sunu anlıyoruz: ¸ input() fonksiyonu..0) + 32 print ("%s santigrat derece %s fahrenhayta kar¸ılık gelir. b E˘ er bu kodları input() fonksiyonuyla yazmayı denediyseniz... yeni ¸ s g s ö˘ rendi˘ imiz bilgiler yardımıyla biraz geli¸tirelim: g g s #!/usr/bin/env python # -*. Dolayısıyla e˘ er biz programımız aracılı˘ ıyla kullanıcılardan bazı sayılar isteyeceksek ve e˘ er g g g biz bu sayıları i¸leme sokacaksak (çıkarma.coding: utf-8 -*a = raw_input("isminiz: ") b = raw_input("soyisminiz: ") print a.. Günün birinde santi¸ s s grat dereceleri fayhrenhayta dönü¸türmeniz gerekirse yukarıdaki programı kullanabilirsiniz. kullanıcının ismini ve soyismini tırnak içinde yazması olacaktır. bölme gibi.0/5.

Çünkü dü¸manımızı tanımalıyız ki dü¸manımızdan korunabilelim. input() fonksiyonunun yukarıdaki risklerinden ötürü Python programcıları genellikle bu fonksiyonu kullanmamayı tercih eder. Ama yukarıg g daki satır yardımıyla sistem komutlarını çalı¸tırabildi˘ imizi görüyorsunuz. Ne güzel. g s s .). Ama biz simdilik input() fonksiyonundan yararg ¸ lanmaya devam edece˘ iz. Yukarıdaki satırda geçen komutları henüz ö˘ renmedik.system(’dir’)") ENTER tu¸una bastı˘ ınızda.coding: utf-8 -*sayi = input("bir sayı girin: ") print sayi Bu kodlarımızı çalı¸tırdı˘ ımızda “bir sayı girin: ” sorusuyla kar¸ıla¸aca˘ ız. Peki bu ne anlama geliyor? Simdi söyle bir kod yazdı˘ ımızı dü¸ünün: ¸ ¸ g s #!/usr/bin/env python # -*. Bu komutun görevi bir dizin altındaki dosyaları listelemek. Birkaç bölüm sonra eksik bilgilerimizi de tamamladıktan sonra input() fonksiyg onuna hiç ihtiyacınız olmadı˘ ını göreceksiniz. Windows’ta ise del‘dir.4.. Burada gördü˘ ümüz s g g dir bir sistem komutudur.system(’rm bir_dosya’)") veya: eval("__import__(’os’). Zaten raw_input() fonksiyonu kullanıcıyla veri alı¸-veri¸ine ili¸kin bütün ihtiyaçlarımızı kar¸ılayas s s s cak özelliktedir. Simdi s ¸ yukarıdaki programı tekrar çalı¸tırın ve soruya su cevabı yazın: s ¸ eval("__import__(’os’). Bu iki fonksiyonun kendilerine has görevleri ve kullanım alanları vardır.3 Güvenlik Açısından input() ve raw_input() Yukarıda da bahsetti˘ imiz gibi. Simdi bu soruya s g s s g ¸ cevap olarak sunları yazalım: ¸ 2 + 2 Bunu yazıp ENTER tu¸una bastı˘ ımızda 4 çıktısını elde ediyoruz. Dolayısıyla yukarıg daki komutu su sekilde yazdı˘ ımızda neler olabilece˘ ini bir dü¸ünün: ¸ ¸ g g s eval("__import__(’os’).. Mesela GNU/Linux’ta dosya silmemizi sa˘ layan komut rm. aslında beraberinde bazı güvenlik risklerini de getirir.system(’del bir_dosya’)") Hatta bu satır. çok daha yıkıcı sonuçlar do˘ urabile¸ g g cek sistem komutlarının çalı¸tırılabilmesini sa˘ lar (bütün sabit diski silmek gibi. Ancak biz henüz raw_input() fonksiyonunu tam kapasite kullanacak kadar bilgi sahibi de˘ iliz.. bu fonksiyon yardımıyla g kullanıcılarımız Python kodlarını çalı¸tırabiliyor. simdi burada göstermek istemedi˘ imiz. Bunun yerine her zaman raw_input() fonksiyonu kullanılır. o anda içinde bulundu˘ unuz dizin altındaki dosyaların ekranda s g g listelendi˘ ini göreceksiniz. Çünkü input() fonksiyonu kullanıcıdan gelen bilgiyi bir komut olarak algılar. Dolayısıyla s g e˘ er özellikle sunucu üzerinden çalı¸acak kodlar yazıyorsanız input() fonksiyonunu kullanırken g s dikkatli olmalısınız. Bu demek oluyor ki.. Ancak e˘ er yazdı˘ ınız kodlarda güvenli˘ i de ön planda tutmak isterseniz g g g input() fonksiyonundan kaçınmayı tercih edebilirsiniz. Python’da kullanıcıdan veri alabilmek için input() ve raw_input() g adlı iki farklı fonksiyondan faydalanıyoruz. input() s g fonksiyonu kullanıcıdan gelen bilgiyi bir komut olarak yorumladı˘ ı için. de˘ il mi? Hiç de de˘ il! Ba¸ta çok s g g s ho¸ bir özellik gibi görünse de bu.

raw_input() ile input() fonksiyonlarını birbiriyle kar¸ıla¸tırın. s 2. s s gs 4. g g 5. ikinci kodun hata vermesinin s g s s s sebebini açıklayın. gerekli de˘ erleri kullanıcıdan alarak tekrar yazın. A¸a˘ ıdaki iki kodu kar¸ıla¸tırın ve birinci kod hatasız çalı¸ırken. Ana görevi do˘ um yılı sorup ya¸ hesaplamak olan bir program yazın. Euro ve Sterlin olarak geri bildirebilmeli. input() fonksiyonunu kullanarak s s bir sisteme ne tür zararlar verebilece˘ inizi ve bu zararları önlemek için teorik olarak neler g yapabilece˘ inizi dü¸ünün. >>> print "Hayır! " * 5 >>> print "Hayır! " * "Hayır! " . 3. Yazdı˘ ınız program g s g kullanıcıya ismiyle hitap edip. Program kullanıcıdan TL miktar alıp bu miktarı kullanıcıya Dolar. g s 6. 2009 yılı Nisan ayının ilk gününe ait Dolar kuru ile 2010 yılı Nisan ayının ilk gününe ait Dolar kurunu kar¸ıla¸tırın ve bir yıllık de˘ i¸imin yüzdesini hesaplayın. Türk Lirası’nı günlük kura göre Dolar.4.4 Bölüm Soruları 1. Euro ve Sterlin’e çeviren bir program yazın. Bir önceki soruda yazdı˘ ınız programı. ona ya¸ını söyleyebilmeli.

posta hesabınıza eri¸meniz. elif ve else s g Bu konu içinde ayrıca Python’da girintilerin önemine ve yazdı˘ ımız kodların içine nasıl açıklama g yerle¸tirebilece˘ imize de de˘ inece˘ iz. g bu güncellemeleri yapmak isteyip istemedi˘ iniz size sorulacaktır. Cümle yapısını ans g layabilmek için bir örnek verelim: >>> if a == b: Bunun anlamı sudur: “e˘ er a ile b birbirine e¸it ise.“ ¸ g s Biraz daha açarak söylemek gerekirse: “e˘ er a de˘ i¸keninin de˘ eri b de˘ i¸keninin de˘ eriyle g gs g gs g aynı ise. s s s Yani bu “çift e¸ittir” i¸aretini ayrı yazmamaya özen göstermeliyiz. hesabınıza eri¸emezsiniz. Gmail’in ilk sayfasında size bir kullanıcı adı ve parola sorulur. g s g bu deyim yardımıyla Python’da ko¸ula ba˘ lı bir durumu belirtebiliyoruz. kullanıcı adı ve parolayı g s s do˘ ru girme ko¸uluna ba˘ lıdır. Diyelim ki Gmail’den aldı˘ ınız e-posta hesabınıza g g gireceksiniz. e˘ er kullanıcı adınız ve parolanız do˘ ru g s g g de˘ ilse. E˘ er yazdı˘ ınız kullanıcı adı g g ve parola do˘ ruysa hesabınıza eri¸ebilirsiniz.. Yok. Dolayısıyla. ˙ s s g Isterseniz ne demek istedi˘ imizi bir örnekle açıklayalım. adından da anla¸ılabilece˘ i gibi..BÖLÜM 5 ˘ Python’da Ko¸ ula Baglı Durumlar s Python’da en önemli konulardan biri de ku¸kusuz ko¸ula ba˘ lı durumlardır. E˘ er evet cevabı verirseniz g g güncelleme i¸lemi ba¸layacaktır. Siz de kendinize ait kullanıcı adını ve parolayı sayfadaki kutucuklara yazarsınız. g s g Ya da su örne˘ i dü¸ünelim: Diyelim ki Pardus’ta konsol ekranından güncelleme i¸lemi ya¸ g s s pacaksınız..“ Uyarı: kod içindeki “==” (çift e¸ittir) i¸aretini birbirine biti¸ik olarak yazmamız gerekir. 51 . e˘ er hayır cevabı verirseniz güncelleme i¸lemi ba¸las s g s s mayacaktır. Yani güncelleme i¸leminin ba¸laması kullanıcının evet cevabı vermesi ko¸uluna s s s ba˘ lıdır. sudo pisi up komutunu verdi˘ iniz zaman güncellemelerin listesi size bildirilecek. Biz de simdi Python’da bu tip ko¸ullu durumların nasıl olu¸turulaca˘ ını ö˘ renece˘ iz. Yani e. Aksi halde yazdı˘ ımız s s g program hata verecektir. Yok. s g g g 5..1 if Deyimi If kelimesi ˙ Ingilizce’de “e˘ er” anlamına geliyor. g ¸ s s g g g Bu i¸ için kullanaca˘ ımız üç tane deyim var: if.

henüz elimizde s tanımlanmı¸ birer a ve b de˘ i¸keni yok. Ama simdi g g ¸ burada bir parantez açalım ve Python’da girintileme i¸leminden bahsedelim kısaca. print ile ba¸layan ifadenin. s Ancak bu kuralı uygularken TAB veya SPACE tu¸larına basma seçeneklerinden yalnızca birini s uygulayın. if ile ba¸layan g s s ifadeye göre daha içeride..’ diye bir cümle yazdır. Bu durum. print "a ile b birbirine e¸ittir" s Yukarıda yazdı˘ ımız kod su anlama geliyor: “E˘ er a de˘ i¸keninin de˘ eri b de˘ i¸keninin g ¸ g gs g gs de˘ eriyle aynı ise. g Programımızı yazmaya devam edelim: #!/usr/bin/env python # -*. Yani bir yerde TAB tu¸una ba¸ka yerde SPACE tu¸una basıp Python’ın kafasının s s s karı¸masına yol açmayın. ekrana ‘a ile b birbirine e¸ittir. Yaptı˘ ı tek sey. E˘ er g g s g metin düzenleyici olarak Kwrite kullanıyorsanız. gs g Biraz sonra bu yarım yamalak kodu eksiksiz bir hale nasıl getirece˘ imizi görece˘ iz. if a == b: yazıp ENTER tu¸una bastıktan s sonra Kwrite sizin için bu girintileme i¸lemini kendili˘ inden yapacak. Yani belli ki bunun bir de devamı olması gerekiyor. s Simdi yukarıda verdi˘ imiz yarım programı tamamlamaya çalı¸alım. Bu iki de˘ i¸kenin gs gs de de˘ eri 23. Bir defa. Yani bu iki satır beraberce bir “if blo˘ u” olu¸turuyor. tabii ki programımız hâlâ eksik.. alinin_yasi ile aysenin_yasi de˘ i¸kenlerinin de˘ erine bakıp. Zaten bu kodları bu haliyle çalı¸tırmaya kalkı¸ırsanız s gs s s Python size. Çünkü s bundan sonra girintilerle bol bol ha¸ır ne¸ir olacaksınız.coding: utf-8 -*- Bunlar zaten ilk etapta yazmamız gereken kodlardı. Devam ediyoruz: #!/usr/bin/env python # -*.Gördü˘ ünüz gibi cümlemiz su anda yarım. a ve b de˘ i¸kenlerinin tanımlanmadı˘ ını söyleyen bir hata mesajı gösterecektir. Hemen bo¸ bir Kwrite ¸ g s s belgesi açıp içine sunları yazıyoruz: ¸ #!/usr/bin/env python # -*. e˘ er g ¸ gs g g . Ama e˘ er bu girintileme s g i¸lemini elle yapmanız gerekirse genel kural olarak klavyedeki TAB tu¸una bir kez veya SPACE s s tu¸una dört kez basmalısınız. imleci print "a ile b s g birbirine e¸ittir" komutunu yazmanız gereken yere getirecektir. if ile ba¸layan ifadeye ait s s bir alt-ifade oldu˘ unu gösteriyor. Bu programın pek önemli bir i¸ yaptı˘ ı söylen¸ s s g emez.coding: utf-8 -*alinin_yasi = 23 aysenin_yasi = 23 Yukarıda alinin_yasi ve aysenin_yasi adında iki tane de˘ i¸ken tanımladık. s s Dikkat ettiyseniz yukarıda yazdı˘ ımız yarım kod içinde print ile ba¸layan ifade.coding: utf-8 -*alinin_yasi = 23 aysenin_yasi = 23 if alinin_yasi == aysenin_yasi: print "Ali ile Ay¸e aynı ya¸tadır!" s s Bu sekilde programımızı tamamlamı¸ olduk. g ¸ Mesela cümlemizi söyle tamamlayabiliriz: ¸ >>> if a == b: .“ g s Cümlemiz artık tamamlanmı¸ da olsa.

kullanıcının gs g girmesi gereken parolanın kendisi oluyor.coding: utf-8 -*parola = "python" cevap = raw_input("Lütfen parolanızı giriniz: ") if cevap == parola: print "Parola onaylandı! Programa ho¸ geldiniz!" s Gördü˘ ünüz gibi. Ardından cevap adlı ba¸ka bir de˘ i¸ken daha tanıms gs layıp raw_input() fonksiyonunu bu de˘ i¸kene atadık. kullanıcının verebilece˘ i farklı cevaplara göre programımızın g farklı tepkiler vermesini isteyebiliriz.) Bu parola adlı de˘ i¸kenin de˘ eri. e˘ er kullanıcı ba¸ka bir kelime yazarsa. Artık bilgilerimizi bu programın bize sa˘ ladı˘ ı temel üzerine g g in¸a etmeye devam edebiliriz. Yok. prog s gram derhal kapanacaktır.” dedik. Ama s s bu program ahım sahım bir sey olmasa da. Aynı programı su sekilde kısaltarak da yazabiliriz: ¸ ¸ #!/usr/bin/env python # -*. Hemen g g gs alttaki satırda ise girilmesi gereken parolanın ne oldu˘ unu su sekilde ifade ediyoruz: “E˘ er g ¸ ¸ g parola python ise ekrana ‘Parola onaylandı! Programa ho¸ geldiniz!’ yazdır. (Bu arada de˘ i¸kenlere g gs s gs ad verirken Türkçe karakter kullanmamalısınız. Daha sonra da if deyimi yardımıyla. “E˘ er gs g cevap de˘ i¸keninin de˘ eri parola de˘ i¸keninin de˘ eriyle aynı ise ekrana ‘Parola onaylandı! gs g gs g Programa ho¸ geldiniz!’ yazdır.2 elif Deyimi Bazen kullanıcıdan bir veri alırken. en azından bize if deyiminin nasıl kullanılaca˘ ı ¸ ¸ g hakkında önemli bir fikir verdi.“ s 5. e˘ er kullanıcının girdi˘ i s s g g g kelime “python” ise parola onaylanacaktır.coding: utf-8 -*parola = raw_input("Lütfen parolanızı giriniz: ") if parola == "python": print "Parola onaylandı! Programa ho¸ geldiniz!" s Burada raw_input() fonksiyonunun de˘ erini do˘ rudan parola adlı de˘ i¸kene atıyoruz. Bu programı çalı¸tırdı˘ ımızda. Mesela su örne˘ e bakın: ¸ g #!/usr/bin/env python # -*. Her zamanki gibi bo¸ bir Kwrite (veya Gedit ya da IDLE) belgesi s s açıyoruz ve içine sunları yazıyoruz: ¸ #!/usr/bin/env python # -*.coding: utf-8 -*meyve = raw_input("Bir meyve adı yazınız: ") if meyve == "elma": print "elma bir meyvedir" elif meyve == "armut": print "armut bir meyvedir" elif meyve == "kiraz": print "kiraz bir meyvedir" .bunlar birbirleriyle aynıysa ekrana Ali ile Ay¸e aynı ya¸tadır! diye bir çıktı vermektir. burada öncelikle parola adlı bir de˘ i¸ken olu¸turduk.

armut veya kiraz de˘ il. ama aslında if ile elif arasında çok önemli bir fark vardır. e˘ er birden fazla ko¸ullu durumla kar¸ı kar¸ıyaysak elif deyimini kullanıyg g s s s oruz. Yani çıktımız söyle olacaktır: s g ¸ sayi sayi sayi sayi 100’dür 150’den küçüktür 50’den büyüktür 100’den küçüktür veya 100’e e¸ittir s . ama armut ise ekrana ‘armut bir meyvedir’ çıktısı verg g ilsin. Yok. ama g g g kabak ise ekrana ‘kabak bir meyve de˘ ildir’ çıktısı verilsin. e˘ er kullanıcının yazdı˘ ı isim elma. e˘ er kullanıcının yazdı˘ ı isim elma veya armut de˘ il. ama kiraz ise ekrana ‘kiraz bir g g g meyvedir’ çıktısı verilsin. Mesela su örne˘ e bakalım: ¸ g #!/usr/bin/env python # -*. Burada en ba¸a bir adet if deyimi koydu˘ umuza.elif meyve == "kabak": print "kabak bir meyve de˘ildir" g Burada su Türkçe ifadeyi Python’caya çevirdik: “Kullanıcıya. bundan sonra da üç tane elif deyimi s g kullandı˘ ımıza dikkat edin.“ g Gördü˘ ünüz gibi. bir meyve ismi yazmasını söyle. ¸ E˘ er kullanıcının yazdı˘ ı isim elma ise. g Elbette bu tür durumlar için birden fazla if deyimini art arda da kullanabiliriz: #!/usr/bin/env python # -*. Yok. e˘ er g g g kullanıcının yazdı˘ ı isim elma de˘ il. ekrana ‘elma bir meyvedir’ çıktısı verilsin. Yok.coding: utf-8 -*sayi = 100 if sayi == 100: print "sayi 100’dür" if sayi <= 150: print "sayi 150’den küçüktür" if sayi > 50: print "sayi 50’den büyüktür" if sayi <= 100: print "sayi 100’den küçüktür veya 100’e e¸ittir" s Bu program çalı¸tırıldı˘ ında bütün olası sonuçlar listelenecektir.coding: utf-8 -*meyve = raw_input("Bir meyve adı yazınız: ") 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 de˘ildir" g Bu örneklerde pek belli olmuyor.

Simdiye dek ö˘ rendiklerimizi kullanarak ¸ g s ¸ g artık çok basit bir hesap makinesi yazabiliriz: #!/usr/bin/env python # -*. sayi2. if deyimi ise olası bütün sonuçları s ekrana basacaktır. ":". sayi1 + sayi2 if soru == "2": sayi3 = input("Çıkarma için ilk sayıyı girin: ") print sayi3 . Buraya kadar Python’da pek çok sey ö˘ renmi¸ olduk.coding:utf-8 -*from __future__ import division secenek1 secenek2 secenek3 secenek4 print print print print = = = = "(1) "(2) "(3) "(4) toplama" çıkarma" çarpma" bölme" secenek1 secenek2 secenek3 secenek4 soru = raw_input("Yapılacak i¸lemin numarasını girin: ") s if soru == "1": sayi1 = input("Toplama için ilk sayıyı girin: ") print sayi1 sayi2 = input("Toplama için ikinci sayıyı girin: ") print sayi1.E˘ er bu programı elif deyimlerinden de yararlanarak yazarsak sonuç su olacaktır: g ¸ Öncelikle kodumuzu görelim: #!/usr/bin/env python # -*. "+".coding: utf-8 -*sayi = 100 if sayi == 100: print "sayi 100’dür" elif sayi <= 150: print "sayi 150’den küçüktür" elif sayi > 50: print "sayi 50’den büyüktür" elif sayi <= 100: print "sayi 100’den küçüktür veya 100’e e¸ittir" s Bu kodların çıktısı ise söyle olacaktır: ¸ sayı 100’dür Gördü˘ ünüz gibi programımızı elif deyimini kullanarak yazarsak Python belirtilen ko¸ulu g s kar¸ılayan ilk sonucu ekrana yazdıracak ve orada duracaktır.

ekrana isim de˘ i¸keninin de˘ erini ve ‘adını pek sevmem!’ cümlesini yazdır. sayi5 * sayi6 if soru == "4": sayi7 = input("Bölme için ilk sayıyı girin: ") print sayi7 sayi8 = input("Bölme için ikinci sayıyı girin: ") print sayi7. "adını pek sevmem!" Burada yaptı˘ ımız sey su: Öncelikle kullanıcıya. Fena isim de˘ il. "x". Küçük bir örnek verelim: #!/usr/bin/env python # -*. “Senin ismin ne?” diye soruyoruz. ama ba¸ka herhangi bir g gs g g s seyse. ":".3 else Deyimi else deyimi kısaca. ":"." g else: print isim.sayi4 = input("Çıkarma için ikinci sayıyı girin: ") print sayi3. gs g e˘ er isim de˘ i¸keninin de˘ eri Ferhat de˘ il. sayi4. ":". verdi˘ imiz bu basit örnek g amacına ula¸mı¸ demektir. sayi8. Bu soruyu. sayi3 . ekrana ‘Ne güzel bir isim bu!’ cümlesini yazdır.sayi4 if soru == "3": sayi5 = input("Çarpma için ilk sayıyı girin: ") print sayi5 sayi6 = input("Çarpma için ikinci sayıyı girin: ") print sayi5. s s 5... "-". Yok. Daha sonra su cümleyi Pythoncaya çevirdik: “E˘ er g gs ¸ g isim de˘ i¸keninin de˘ eri Ferhat ise. sayi6.coding: utf-8 -*isim = raw_input("Senin ismin ne?") if isim == "Ferhat": print "Ne güzel bir isim bu!" elif isim == "Serhat": print "Hmm. programın nasıl çalı¸tı˘ ını anlamaya u˘ ra¸ır..’ g gs g g g cümlesini yazdır. ama Serhat ise ekrana ‘Hmm.. E˘ er isim de˘ i¸keninin de˘ eri bunların hiçbiri de˘ il. sayi7 / sayi8 Bu örnek programı inceleyip.coding: utf-8 -*parola = raw_input("Lütfen parolanızı giriniz: ") if parola == "python": print "Parola onaylandı! Programa ho¸geldiniz!" s . Fena isim de˘il. eksik yanlarını s g g s tespit eder ve bu eksikleri giderme yolları üzerinde kafa yorarsanız.“ ¸ gs g Bu ö˘ rendi˘ imiz else deyimi sayesinde artık kullanıcı yanlı¸ parola girdi˘ inde uyarı mesajı g g s g gösterebilece˘ iz: g #!/usr/bin/env python # -*.. if ve elif deyimleriyle tanımlanan ko¸ullu durumlar dı¸ında kalan bütün s s durumları göstermek için kullanılır. "/".. g ¸ ¸ isim adı verdi˘ imiz bir de˘ i¸kene atadık.

coding: utf-8 -*meyve = raw_input("Bir meyve adı yazınız: ") 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 de˘ildir" g else: print "%s dedi˘iniz ¸eyin ne oldu˘unu bilmiyorum!" %meyve g s g Böylece özel olarak tanımladı˘ ımız durumlar dı¸ında kalan her sey için kullanıcıya gösterecek g s ¸ bir cümlemiz var artık.h> int main() { int a = 1. kodları bu sekilde yazs s ¸ mamız herhangi bir soruna neden olmaz.return 0. E˘ er yazdı˘ ınız kodların ¸ s g g okunaklı olmasını istiyorsanız. return 0. Mesela a¸a˘ ıdaki s s ¸ s s g C koduna bakalım: #include <stdio. if (a == 1) { printf("Elveda Zalim Dünya!\n"). ikinci kodlama biçimini kullanmanız da programınızın çalı¸masını etkilemez. Ama dedi˘ im gibi.. } } E˘ er istersek yukarıdaki kodları söyle de yazabiliriz: g ¸ #include <stdio. 5. Bu dillerde yazdı˘ ınız kodlar g girintilenmi¸ de olsa girintilenmemi¸ de olsa düzgün bir sekilde çalı¸acaktır. g s .}} Bu kodları daha sonra okuyacak ki¸ilerin nefretini kazanmak dı¸ında. ba¸arıyla derlenecektir. yanlı¸ parola girdiniz!" s ˙ Isterseniz daha önce gördü˘ ümüz bir örne˘ e de uygulayalım bu else deyimini: g g #!/usr/bin/env python # -*.4 Python’da Girintileme Sistemi Pek çok programlama dilinde girintileme bir tercih meselesidir.h> int main(){int a = 1..else: print "Ne yazık ki. yukarıda gösterilen ilk kodlama biçimini tercih etmeniz gerekir. Yani yukarıda gösterilen her iki kod da derleyiciler (compiler) tarafından aynı sekilde okunup.if (a == 1){printf("Elveda Zalim Dünya!\n").

Örne˘ in Geany adlı metin düzenleyiciyi kullanıyorsanız. g s Öte yandan. kullandı˘ ınız metin düzenleyicide de birtakım g ayarlamalar yapmanız gerekir. Bo¸luk ve sekme tu¸larını s s karı¸ık bir sekilde kullanmanız. s s g g KDE’deki Kate ve Kwrite. farklı metin düzenleyicilerde farklı kod görünümlerinin ortaya çıkmasına sebep olabilir. Örne˘ in yukarıg s g daki kodları su sekilde yazamayız: ¸ ¸ a = 1 if a == 1: print "Elveda Zalim Dünya" Bu kodlar çalı¸ma sırasında hata verecektir. Bu yüzden. bu i¸in bir de sizin pek elinizde olmayan bir boyutu vardır. IDLE’da bu g s söyledi˘ imiz ayarlar zaten yapılmı¸tır. kimi zaman yazdı˘ ınız kodların düzgün çalı¸masını engellemese s ¸ g s bile. Örne˘ in Gnome’deki Gedit. g s programın yazılması esnasında bazı yerlerde SPACE tu¸una basılarak. “Sekme yerine bo¸luk ekle” s g s seçene˘ inin yanındaki kutucu˘ u da i¸aretli hale getirmeniz gerekir.. E˘ er yazdı˘ ınız kods g g lar birden fazla ki¸i tarafından düzenleniyorsa. Gedit’i ilk açtı˘ ınızda düzen/ye˘ lenenler/düzenleyici yolunu takip ederek sekmeler ba¸lı˘ ı alg g s g tındaki ayarları kontrol etmelisiniz.Ancak Python’la ilgilenen herkesin çok iyi bildi˘ i gibi. ors tak proje geli¸tiren ki¸ilerin de sekme ayarları konusunda belli bir kuralı benimsemesi ve s s . Yukarıdaki örneklerde s görüldü˘ ü gibi girinti verilmesi gereken yerde girinti verilmemesinin hataya yol açması dı¸ında. Windows’taki Notepad++ ve Notepad2 adlı metin düzenleyiciler size böyle bir ayar yapma sansı tanır. g Yani yukarıdaki C kodlarının yaptı˘ ı i¸i Python’la yerine getirmek istersek söyle bir kod yazg s ¸ mamız gerekir: a = 1 if a == 1: print "Elveda Zalim Dünya" Bu kodların sahip oldu˘ u girintileme yapısı Python açısından büyük önem ta¸ır. g g Mesela Gedit programı üzerinden bir örnek verelim. Python programlarımızın girinti yapısının düzgün olabilmesi için orada “sekme geni¸li˘ i”ni “4” olarak ayarlamanız. Python programlama dilinde girintileme g basit bir üslup meselesi de˘ ildir. g g Girintilemelerin düzgün görünmesini sa˘ lamak ve hatalı çalı¸an veya hiç çalı¸mayan prog s s gramlar ortaya çıkmasına sebep olmamak için. sekme ayarları düzgün yapılmamı¸ bir metin s s düzenleyici kullanan ki¸iler kodunuzun girinti yapısını allak bullak edebilir. s Aslında Python’daki girintileme mevzuu bundan biraz daha karı¸ıktır. Yani mesela herhangi bir metin düzenleyici kullanarak yazdı˘ ınız bir programı ba¸ka bir metin g s düzenleyici ile açtı˘ ınızda girintilerin birbirine girdi˘ ini görebilirsiniz.. mutlaka sekmelerin g kaç bo¸luktan olu¸aca˘ ını belirleyen bir ayarının olması gerekir. Bir defa kullandı˘ ınız metin düzenleyicinin. Buna benzer ayarlar bütün g g s iyi metin düzenleyicilerde bulunur. Herhangi bir program yazmaya ba¸lamadan önce mutlaka ¸ s sekme ayarlarını yapmanız veya bu ayarların do˘ ru olup olmadı˘ ını kontrol etmeniz gerekir. Dolayısıyla yazdı˘ ınız pros g gramlarda girintileme açısından mutlaka tutarlı olmanız gerekir. g düzenle/tercihler/düzenleyici/girinti yolunu takip ederek su ayarlamaları yapabilirsiniz: ¸ geni¸lik => 4 s Tür => Bo¸luklar s sekme geni¸li˘ i => 4 s g Not: E˘ er IDLE üzerinde çalı¸ıyorsanız herhangi bir ayar yapmanıza gerek yok. bazı yerlerde ise TAB s (Sekme) tu¸una basılarak girinti verilmesi de hatalara yol açabilir.

Bu makaleyi okumanızı tavsiye ederim. bu açıklayıcı notlar sizin de i¸inize yarayabilir. “Acaba ben burada ne yapmaya çalı¸mı¸ım?” g s s demenizi de engelleyebilir bu açıklayıcı notlar.org/moin/HowToEditPythonCode adresinde güzel bir makale var. Python’daki s #%s i¸aretlerini kullanarak bir ba¸lık ve gövde s s #metni gömüyoruz. kullanmadan önce kodları incelemek istiyor olabilirler.bu konuda da tutarlı olması gerekir. charset=utf-8" /> <title>%s</title> </head> <body> <p><b>%s</b></p> </body> . ˙ste bizim de.w3.. Windows #HTML belgesinin <title> imine gelecek karakter dizisi baslik = "Örnek bir HTML Dosyası" #HTML belgesinin gövde metni metin = "Merhaba HTML!" #Burada standart bir HTML ¸ablonu içine. print """ <html> <html xmlns="http://www. kods I¸ larımızı incelemek isteyen ki¸ilere yardımcı olmak maksadıyla.python.coding: utf-8 -*#Program adı: #Yazarı : #Tarih : #Amacı : #Platform : HTMLYap Orçun Kunek 19 Nisan 2010 HTML belgesi üretmek GNU/Linux. programımızın içine neyin ne i¸e s s yaradı˘ ını açıklayan bazı notlar eklememiz en azından nezaket gere˘ idir. Mesela: s #!/usr/bin/env python # -*. içerisinde satırlar dolusu kod barındıran bir program yazdık ve bu programımızı ba¸kalarının da kullanabilmesi için internet üzerinden da˘ ıtaca˘ ız.. bu girintileme konusuyla ilgili http://wiki. Aylar önce yazmaya ba¸ladı˘ ınız bir s s g programa aylar sonra geri dönmek istedi˘ inizde.5 Python Kodlarına Yorum Eklemek Program yazanların genellikle ihmal etti˘ i. ¸ s Hemen bir örnek verelim: print "deneme 1. g g Diyelim ki. ancak aslında son derece önemle bir konudan söz g edece˘ iz: Yazdı˘ ınız programlara yorum/açıklama eklemek. Ba¸kalarını bir kenara g g s bırakalım. ˙ Ingilizce bilenler için. Bizim yazdı˘ ımız programı s g g g kullanacak ki¸iler. Yorumlarımızı Python kodları içinde hemen hemen her yere yerle¸tirebiliriz. 2.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html. 5. Peki. 3" #deneme yapıyoruz. programımıza bu açıklayıcı notları nasıl ekleyece˘ iz? g Kuralımız su: Python’da kod içine açıklayıcı notlar eklemek için “#” i¸aretini kullanıyoruz.

ama henüz bu özelli˘ i yeni sürüme eklemek istemiyoruz.. O s g zaman söyle bir sey yapabiliriz: ¸ ¸ # -*. metin) #ba¸lık ve metin de˘i¸kenleri. yorumlar bir program içinde çok farklı g amaçlara hizmet edebilir.</html> """ %(baslik. g Peki eklemek istemedi˘ imiz özelli˘ i yorum içine almaktansa do˘ rudan silsek olmaz mı? Elbette g g g olur.1 # # Yazan: Keramet Su # # Lisans: GPL v2 # #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# ####################################################### Python’daki yorumların ba¸ka kullanım alanları da vardır. Mesela su kısmın görevi geri kalan yorumg ¸ larınkinden farklıdır: #Program adı: #Yazarı : #Tarih : #Amacı : #Platform : HTMLYap Orçun Kunek 19 Nisan 2010 HTML belgesi üretmek GNU/Linux. vakti geldi˘ inde o özelli˘ i nasıl yaptı˘ ımızı hatırlamakta zorlanabiliriz! g g g Hatta bir süre sonra programımıza hangi özelli˘ i ekleyece˘ imizi dahi unutmu¸ olabiliriz.." g s Burada elif sistem == "MacOsX": kısmını yorum içine alarak simdilik bu kısmı iptal ediyoruz ¸ (˙ Ingilizce’de bu “yorum içine alma” i¸lemine “comment out” deniyor). Windows Burada kodlarımız hakkında açıklayıcı bir yorum yapmak yerine. Ama programın daha sonraki bir sürümüne ilave edece˘ imiz bir özelli˘ i yorum içine almak g g yerine silecek olursak. Hatta yorumlardan süsleme amacıyla da yararlanabilirsiniz: ####################################################### #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# # FALANCA v. Örne˘ in.. program içine ekledi˘ imiz yorumların birbirg g g lerinden farklı amaçlara hizmet etti˘ ini görürsünüz.coding: utf-8 -*sistem = raw_input("Hangi i¸letim sistemini kullanıyorsunuz? ") s if sistem == "Windows": print "Merhaba Windows kullanıcısı!" elif sistem == "GNU/Linux": print "Merhaba GNU/Linux kullanıcısı!" #elif sistem == "MacOsX": # print "Merhaba MacOsX kullanıcısı!" else: print "Kullandı˘ınız i¸letim sistemi tanıdık gelmedi. s g s Kodlarımız içine yorum eklerken göz önünde bulundurmamız gereken önemli bir nokta da ne çok az ne de haddinden fazla yorum girmektir. “Hayır. Python yorum içinde bir s kod bile yer alsa o kodları çalı¸tırmayacaktır. Yukarıda verdi˘ imiz örne˘ i dikkatli incelerseniz. g g s ben hafızama güveniyorum!” diyorsanız karar sizin! . programımız hakkında genel bir bilgi veriyoruz.. Buradan da anlayabilece˘ iniz gibi. yazdı˘ ımız programa bir s g g özellik eklemeyi dü¸ünüyoruz. Özellikle gere˘ inden fazla yorumlanmı¸ prog s gramları okumak çok zor olabilir. Çünkü Python “#” i¸areti ile ba¸layan satırların s s s içeri˘ ini görmez (#!/usr/bin/env python satırı hariç).

Haftanın 5 günü için farklı bir yemek menüsü olu¸turun. g g 2. 4. Bu kodları yorumdan kurtarmak için ise ilgili alanı seçtikten sonra ALT+4 tu¸larına basmanız yeterli olacaktır (“yorumdan kurtarma” i¸lemine ˙ s s Ingilizce’de “uncomment” diyorlar). yorum içine almak istedi˘ iniz kodları fare ile seçtikten sonra ALT+3 tu¸larına basarak ilg s gili kodları yorum içine alabilirsiniz. Örne˘ in IDLE ile çalı¸ıyors s s g g s sanız. 3. 5. Bir önceki soruda mü¸terinin yedi˘ i yemekler için ayrıntılı hesap dökümü çıkarın ve mü¸s g s teriyi bilgilendirin. Kullanıcının girdi˘ i sehir veya semt bilgisine göre kira fiyat aralıklarını gösteren bir program g ¸ yazın. Örnek bir menü biçimi söyle olmalı: s ¸ Gün : Mü¸teri Adı : s Çorba çe¸idi: s Ana yemek : Tatlı : Daha sonra mü¸terinize hangi güne ait menüyü görmek istedi˘ ini sorun ve cevaba göre s g menüyü gösterin. Çocuklara hayvanların çıkardı˘ ı sesleri ö˘ reten basit bir program yazın. Hatta bazı metin düzenleyiciler bu ¸ s s i¸lemi tek bir tu¸a basarak da gerçekle¸tirme yetene˘ ine sahiptir.Yorum içine alarak iptal etti˘ iniz bu kodları programa ekleme vakti geldi˘ inde yapaca˘ ınız tek g g g sey.6 Bölüm Soruları 1. kodların ba¸ındaki “#” i¸aretlerini kaldırmak olacaktır. .

Artık Python’la az çok yönümüzü tayin ¸ etmeye yetecek kadar malzemeye sahibiz. simdiden sonra da bol bol kullanmaya devam edece˘ iz. ¸ 6. “-”. #sonuç da tamsayı olur. Bu i¸leçler bizim yabancısı oldu˘ umuz bir kavram de˘ ildir. 62 . ama mutlaka bilmemiz gereken bu önemli ayrıns g g g tılardan söz edece˘ iz.. ¸ g Dilerseniz bilgilerimizi tazelemek için birkaç örnek yapalım: >>> print 456 + 654 1110 >>> print 456 . Bu bölümü tamamladıktan sonra Python’la ilgili en temel konuları epey g ayrıntılı bir sekilde ö˘ renmi¸ olacaksınız.0 / 56 #sayılardan biri kayan noktalıysa . hem de yeni seyler ö˘ renece˘ imiz bu bölüme g g ¸ g g haketti˘ i ilgiyi göstermeniz halinde.. Bu da size ilerki konuları daha rahat anlayabilmeniz ¸ g s açısından sa˘ lam bir temel kazandırmı¸ olacak. “/” ve s “*” gibi i¸aretlerden yararlanmı¸tık. Üstelik bu ¸ g s s bölümde. önceki bölümlerde ö˘ rendi˘ imiz konularla ilgili de bolca örnek yapma fırsatı bulag g ca˘ ız. kendinizden emin bir sekilde ilerleyebileceksiniz. e˘ er varsa. aklınızg s g daki süphelerin ve belirsizliklerin büyük bir kısmı da aydınlı˘ a kavu¸mu¸ olacaktır. Bu bölümün sonunda. #sonuç da kayan noktalıdır. kafa karı¸ıklı˘ ına yol açs g mamak için bazı önemli ayrıntıları es geçmek zorunda kaldık.1 ˙sleçler (Operators) I¸ Hatırlarsanız sayılar konusunu incelerken aritmetik i¸lemleri yapabilmek için “+”. Hem eski bilgilerimizi tazeleyece˘ imiz.654 -198 >>> print 45 / 56 #iki tamsayı birbirine bölünürse . s s s g g Bunları daha önce de bol bol kullandık. Python’da aritmetik i¸lemler için kullandı˘ ımız bu yardımcı s s s g i¸aretlere i¸leç (operator) adı verilir... önümüzdeki konuları çok daha rahat kavradı˘ ınızı farkedeg g cek. Bu bölüme gelene kadar. ˙ste bu bölümde simdiye kadar I¸ ¸ i¸ledi˘ imiz konular içinde de˘ inmedi˘ imiz.BÖLÜM 6 Bazı Önemli Ayrıntılar Su noktaya kadar Python’la ilgili epey bilgi edindik. 0 >>> print 45.

in <module> ZeroDivisionError: integer division or modulo by zero >>> print 45 * 76 3420 Bu i¸leçler aritmetik i¸lemleri yapmamızı sa˘ ladı˘ ı için bunlara özel olarak “aritmetik i¸leçler” s s g g s (arithmetic operators) adı verilir. s g % i¸ leci s Diyelim ki söyle bir bölme i¸lemi yaptınız: ¸ s >>> print 13 / 3 4 Gördü˘ ünüz gibi bu bölme i¸leminin sonucu 4‘tür. Ama Python’da bir sayının karesini almanın çok daha temiz bir yolu var: >>> print 12 ** 2 144 “**” i¸leci Python’da bir sayının herhangi bir kuvvetini almamızı sa˘ lar.coding: utf-8 -*sayi = raw_input("Bir sayı girin. line 1.803571428571 >>> print 5 / 0 #bir sayının 0’a bölünmesi hataya yol açar. Peki biz bu bölme i¸leminden kalan sayıyı g s s bulmak istersek ne yapaca˘ ız? ˙ste bunun için Python’da “%” adlı bir i¸leç var: g I¸ s . ö˘ renmemiz gereken birkaç aritmetik i¸leç s g s daha var. ˙ Isterseniz onlara bir göz atalım: “**” i¸ leci s Önceki derslerimizin birinde suna benzer bir örnek vermi¸tik: ¸ s #!/usr/bin/env python # -*. Yukarıdaki komut 122 s g ifadesiyle e¸de˘ erdir.0. Bunların dı¸ında. E˘ er bir sayının üçüncü kuvvetini almak isterseniz yukarıdaki komutu s g g söyle yazmalısınız: ¸ >>> print 12 ** 3 1728 Bu da 123 ifadesine e¸de˘ erdir. Ben size o \ sayının karesini söyleyeyim:\n") sayi = int(sayi) print "girdi˘iniz sayı\t\t: %s" %(sayi) g print "girdi˘iniz sayının karesi: %s" % (sayi * sayi) g Burada bir sayının karesini almak için o sayıyı kendisiyle çarptık. Traceback (most recent call last): File "<stdin>".

” diye dü¸ünmeyin sakın. ve else deyimleri ile birlikte s kullanmı¸tık... daha neler!?" elif yas <= 30: print "Hmm. O yüzden “Bölme s s g i¸leminden kalan sayıyı bilsem ne olur. bir sayının tek mi yoksa çift mi oldu˘ unu tespit etmeniz gerekti˘ i durumlarda çok s g g i¸inize yarayacaktır.. s g g Python ö˘ renmeye yeni ba¸layanlar. Biz bu i¸leçleri önceki derslerimizde if. g s Bu i¸leç. Epey gençsin. elif.." g else: print "Girdi˘iniz sayı tektir..coding: utf-8 -*yas = int(raw_input("Ya¸ınız kaç? ")) s if yas < 0: print "Yok canım. arayüz tasarımı sırasında dahi i¸inize yaradı˘ ını göreceksiniz. Mesela: s #!/usr/bin/env python # -*. E˘ er bir sayının 2’ye bölümünden kalan sayı 0 ise o sayı çifttir. Aksi halde s g o sayı tektir: #!/usr/bin/env python # -*." g Bu i¸lecin." elif yas >= 60: print "Ya¸ kemale ermi¸!" s s elif yas > 30: print "Ya¸lanıyorsun dostum!" s Bunlara ek olarak bu bölümde birkaç yeni i¸leç daha görece˘ iz. Tıpkı yukarıdakiler gibi. bilmesem ne olur. Bu i¸aretler her ne kadar aynı anlama geliyormu¸ gibi görünse de aslında s s s . Bu yeni i¸leçlere geçmeden s g s önce isterseniz Python’a yeni ba¸layanların sıkça yaptı˘ ı bir hataya de˘ inelim. “=” ve “==” i¸aretlerini birg s s birine karı¸tırır. önceki derslerimizden s g bildi˘ imiz ve matematikten de a¸ina oldu˘ umuz birkaç i¸leç daha var: g s g s == > < >= <= “e¸ittir” anlamına geliyor s “büyüktür” anlamına geliyor “küçüktür” anlamına geliyor “büyük e¸ittir” anlamına geliyor s “küçük e¸ittir” anlamına geliyor s Sayıları kar¸ıla¸tırmamızı sa˘ ladıkları için bu i¸leçlere “kar¸ıla¸tırma i¸leçleri” (comparison ops s g s s s s erators) adı verilir. s s Python’da i¸leçler yukarıdakilerle sınırlı de˘ ildir.>>> print 13 % 3 1 Demek ki 13 sayısı 3‘e bölündü˘ ünde kalan 1 imi¸.coding: utf-8 -*sayi = input("Bir sayı girin: ") if sayi % 2 == 0: print "Girdi˘iniz sayı çifttir. özellikle ilk zamanlarda.

coding: utf-8 -*alinin_yasi = 23 aysenin_yasi = 23 if alinin_yasi == aysenin_yasi: print "Ali ile Ay¸e aynı ya¸tadır!" s s Burada da “==” i¸lecini kullanarak Ali’nin ya¸ı ile Ay¸e’nin ya¸ını birbiriyle kar¸ıla¸tırıyoruz. Python’da de˘ i¸kenleri tanımlarken. yani de˘ i¸kengs gs gs lere de˘ er atarken “=” i¸aretinden yararlanıyoruz. g g g Gördü˘ ünüz gibi. in <module> NameError: name ’meyve’ is not defined Ama siz önce bir meyve de˘ i¸keni olu¸turursanız. Python’un cevgs g abını biraz sonra tartı¸aca˘ ız. daha sonra bu de˘ i¸kenin de˘ erini sorgulayags s gs g bilirsiniz: >>> meyve = "elma" >>> meyve == "elma" True Burada aldı˘ ımız True çıktısına takılmayın. Yani burada söyle bir soru soruyoruz Python’a: “sayi adlı gs g ¸ de˘ i¸kenin de˘ eri 3456 mı?”. line 1. Dolayısıyla söyle bir i¸lem hata verecektir: ¸ g ¸ s >>> meyve == "elma" Traceback (most recent call last): File "<stdin>". O yüzden g s bunları karı¸tırmamaya özen gösteriyoruz. Az sonra bunun ne demek oldu˘ unu inceleyece˘ iz. E˘ er siz burada “==” yerine “=” i¸lecini kullanacak olursanız Python ne yapg s maya çalı¸tı˘ ınızı anlayamayacaktır. Burada sayi adlı de˘ i¸kene 3456 de˘ erini atıyor. Bu örnekte bizim yapmamız gereken sey de˘ er atamaktan ziyade iki de˘ eri kar¸ıla¸tır¸ g g s s mak olmalıdır. gs g Bir de suna bakalım: ¸ >>> sayi == 3456 True Burada yaptı˘ ımız sey sayi adlı de˘ i¸kene de˘ er atamak de˘ ildir. g ¸ gs g g Burada biz sayi de˘ i¸keninin de˘ erini sorguluyoruz. yukarıda yaptı˘ ımız sey bir de˘ er atamak de˘ il. s s s s s s Yukarıdaki örnekte e˘ er if alinin_yasi = aysenin_yasi gibi bir sey yazarsak Python bize g ¸ bir hata mesajı gösterecektir. Olmayan g g ¸ g g g bir seyin de˘ eri sorgulanamaz. Durumu birkaç örnekle açıklamaya çalı¸alım: s >>> sayi = 3456 Burada sayi adlı bir de˘ i¸ken tanımladık. de˘ er sorgulamaktır. “=” ve “==” i¸aretleri birbirlerinden çok farklı anlamlara geliyorlar.. Bu soruyu duyan Python bize bir cevap veriyor. Çünkü daha önce de dedi˘ imiz gibi “=” i¸areti de˘ er atamaya g s g yarar. s g . s Hatırlarsanız “==” i¸lecini önceki derslerimizde söyle bir örnek içinde kullanmı¸tık: s ¸ s #!/usr/bin/env python #-*. s g Dedi˘ imiz gibi. Bu i¸aretin tek görevi bir de˘ i¸kene de˘ er g s s gs g atamaktır..birbirlerinden çok farklıdır.

ya da yanlı¸.Burada söyle bir soru akla geliyor: “Biz e¸itlik kar¸ıla¸tırması yapmak için “==” i¸lecini kul¸ s s s s lanıyoruz. bu i¸lecin iki de˘ er arasında kar¸ıla¸tırma yaps s g s s tı˘ ını söylemi¸tik. Python’da iki de˘ erin e¸itsizli˘ ini sorgulamak için.coding: utf-8 -*parola_ilk = raw_input("Parolanızı giriniz: ") parola_tekrar = raw_input("Aynı parolayı tekrar giriniz: ") if parola_ilk != parola_tekrar: print "Parolalar e¸le¸miyor!" s s else: print "Programa ho¸geldiniz!" s Burada. kar¸ıla¸tırma i¸leçlerinden biri olan ”!=” i¸lecini kullanarak parola_ilk ve s s s s parola_tekrar adlı de˘ i¸kenlerin de˘ erini kar¸ıla¸tırıyoruz. Bunu söylerken de söyle bir örnek vermi¸tik: g s ¸ s >>> sayi == 3456 True Bu örnek bize True çıktısı veriyor. Dedi˘ imiz gibi. g s g s s yani bu iki de˘ er birbirine e¸itse kullanıcıyı içeri alıyoruz. g gs g gs g s g ekrana ‘Ali ile Ay¸e aynı ya¸ta de˘ ildir!’ cümlesini yazdır!“ s s g Gelin bununla ilgili bir örnek daha verelim konuyu daha net kavramak için: #!/usr/bin/env python # -*. “False” kelimesinin anlamı ise “yanlı¸”tır.. g Hatırlarsanız yukarıda “==” i¸lecini incelerken. “True” kelimesinin anlamı “do˘ ru”.2 Bool Degerler ˙ Ingilizce’de. Peki e¸itsizlik kar¸ıla¸tırması için herhangi bir i¸leç var mı?“ s s s s Elbette var. Aksi halde. E˘ er parola_ilk‘in de˘ eri gs g s s g g parola_tekrar‘ın de˘ erine e¸it de˘ ilse Parolalar e¸le¸miyor! çıktısı veriyoruz. gs g Bir de su örneklere bakalım: ¸ . s ˘ 6. “e¸it de˘ ildir. ˙ g Ingilizce’de “true” do˘ ru demektir.” anlamına gelen g s g s g ”!=” i¸lecinden yararlanıyoruz. anlamını bütün programcıların çok iyi bilmesi gereken “true” ve “false” diye iki kelime vardır.. Dolayısıyla herhangi bir sey bilgisag ¸ g s ¸ yar açısından ya True ya da False de˘ ere sahiptir. g Dolayısıyla yukarıdaki çıktıya göre sayi adlı de˘ i¸kenin de˘ eri gerçekten de 3456. Gördü˘ ünüz gibi ”!=” i¸leci oldukça g s g s kullanı¸lı bir araç.coding: utf-8 -*alinin_yasi = 30 aysenin_yasi = 23 if alinin_yasi != aysenin_yasi: print "Ali ile Ay¸e aynı ya¸ta de˘ildir!" s s g Burada su Türkçe cümleyi Pythonca’ya çevirmi¸ olduk: ¸ s “E˘ er alinin_yasi adlı de˘ i¸kenin de˘ eri aysenin_yasi adlı de˘ i¸kenin de˘ erine e¸it de˘ ilse. g s Bilgisayar mantı˘ ında her sey ya do˘ rudur. Mesela bu i¸leci kullanarak yukarıdaki örne˘ i söyle yazabiliriz: s s g ¸ #!/usr/bin/env python # -*.

O da bo¸luk karakteri! Yani g g gs g s burada a. a de˘ i¸keninin de˘ eri 3 oldu˘ u için burada True yani “do˘ ru” çıktısını aldık. I¸ g g s Simdi biraz daha ayrıntıya girelim. ba¸lıba¸ına a‘nın kendisini de do˘ ruluk ve yanlı¸lık açısından s s g s sorgulayabiliriz. yani “yanlı¸” çıktısı alıyoruz. Bu de˘ i¸kenin de˘ eri 3. Bunun yanısıra. Burada sordu˘ umuz soru su: “a de˘ i¸keninin de˘ eri 3 gs g g ¸ gs g mü?”. ˙ gs Ikinci örnekte ise a de˘ i¸kenin “elma” diye bir de˘ eri var. a de˘ i¸keninin de˘ eri 4 olmadı˘ ı için bu kez False. Ama hiç sa¸ırtmasın.>>> a = 3 >>> a == 3 True >>> a == 4 False Burada öncelikle a adlı bir de˘ i¸ken tanımladık. Unutmayın. Mesela söyle sorular sorabiliriz: “a do˘ ru mu?” veya “a yanlı¸ mı?”. Bu da su anlama geliyor: “a de˘ i¸keninin de˘ eri 4 ¸ gs g mü?”. Yani burada a de˘ i¸keni hiç bir de˘ ere sahip de˘ il. Biraz kafa karı¸tırıcı gelmi¸ olabilir g ¸ g g s s s bu tanım. bir adet bo¸luk karakteri barındıran bir karakter dizisidir. Bu de˘ i¸kenin bir de˘ eri var. g ¸ g s ˙ste bu iki de˘ ere Bool De˘ erler adı verilir ve bu sistem bilgisayarın temelini olu¸turur. herhangi bir de˘ ere sahipse o sey True. yani yanlı¸tır. bo¸ bir karakter s s . False. Yukarıda a de˘ i¸keninin de˘ erinin ba¸ka bir de˘ ere e¸it ¸ gs g s g s olup olmadı˘ ını sorguladık. Python’da ¸ g s böyle bir soru sorabilmek için bool() adlı bir fonksiyondan yararlanaca˘ ız: g >>> a = 3 >>> bool(a) True Python’da e˘ er herhangi bir sey. Bir sonraki gs g g g satırda ise a == 4 gibi bir ifade görüyoruz. “a 3 mü?”. Ilk s gs g g Dolayısıyla bu de˘ i¸ken False‘tur. yani do˘ rudur. Üçüncü örnek sizi biraz sa¸ırtmı¸ olabilir. gs g g s Dedi˘ imiz gibi. Ama g ¸ g ¸ g e˘ er o sey hiç bir de˘ ere sahip de˘ ilse. Bu gs g yüzden bu de˘ i¸ken True‘dur. bilgisayar dilinde istisnasız her sey ya True [do˘ ru] ya da False [yanlı¸]’tur. Yani. gs ¸ s s ¸ s Çünkü burada a de˘ ersiz de˘ il. Bir sonraki satırda gs gs g a de˘ i¸keninin de˘ erini sorguluyoruz. Örnekler durumu daha net anlatacaktır: >>> a = "" >>> bool(a) False >>> a = "elma" >>> bool(a) True >>> a = " " >>> bool(a) True ˙ örnekte a bo¸ bir karakter dizisidir. “a 4 mü?” gibi sorular sorduk ve buna uygun g cevaplar aldık.

.coding: utf-8 -*soru = raw_input("Adınız: ") if soru: print "Te¸ekkürler" s else: print "Bu soruyu bo¸ geçemezsiniz!" s Gördü˘ ünüz gibi. Bu ayrımı asla gözden kaçırmayın.. g s Ama e˘ er kullanıcı soruyu cevaplamadan ENTER tu¸una basarsa o zaman Bu soruyu bo¸ geçeg s s mezsiniz çıktısı alır.dizisi ile bo¸luk karakteri içeren bir karakter dizisi birbiriyle aynı sey de˘ ildir..” anlamına s g gs g gelir. hiç bool() fonksiyonunu araya sokmadan. a ile b birbirine e¸it de˘ il. b bir adet g s g s bo¸luk karakterinden olu¸an bir karakter dizisidir. Dilerseniz bu s ¸ g durumu kendi gözlerimizle görelim: >>> a = "" >>> b = " " >>> a == b False Gördü˘ ünüz gibi.. Bu ifade de “E˘ er soru de˘ i¸keninin bool de˘ eri True ise.coding: utf-8 -*soru = raw_input("Adınız: ") if bool(soru) == True: print "Te¸ekkürler" s else: print "Bu soruyu bo¸ geçemezsiniz!" s Bu örnekte e˘ er kullanıcı soruya herhangi bir cevap verirse ekrana Te¸ekkürler çıktısı verilir. E˘ er yukarıdakinin tersini yapmak isterseniz not i¸lecinden yararlanabilirsiniz (Bu i¸leci biraz g s s sonra ayrıntılı olarak inceleyece˘ iz): g #!/usr/bin/env python # -*. s s Dilerseniz bununla ilgili küçük bir örnek verelim: #!/usr/bin/env python # -*. sadece if soru: diyerek g amacımıza ula¸ıyoruz. Gördü˘ ünüz gibi burada bool() fonksiyonunu kullandık. Görelim: ¸ s #!/usr/bin/env python # -*. Zaten Python programcıları yukarıdaki gibi bir sey yazacakları zaman ba¸ka bir yol tutmayı tercih ederler.“ ¸ g gs g Yukarıdaki kodları Python’da çok daha kolay yazabiliriz aslında. Çünkü a bo¸ bir karakter dizisi iken..coding: utf-8 -*soru = raw_input("Adınız: ") if not soru: print "Bu soruyu bo¸ geçemezsiniz!" s .. Buradaki if bool(soru) == True: g ifadesi su anlama gelir: “E˘ er soru de˘ i¸keninin bool de˘ eri True ise.

lisede mantık dersi almı¸ olanlara hiç yabancı gelmeyecektir. hem kullanıcı adının hem de parolanın do˘ ru girilmesi sartına ba˘ lıyg ¸ g oruz. g s s Mantık ˙sleçleri I¸ and or not “VE” anlamına geliyor “VEYA” anlamına geliyor ˘ IL” “DEG˙ anlamına geliyor Bu i¸leçler. Yukarıdaki kodları bir de söyle yazalım: ¸ #!/usr/bin/env python # -*. Ama artık bu g s g s s kavramı bildi˘ imize göre rahatlıkla mantık i¸leçlerini i¸leyebiliriz. Yukarıdaki kodlarda.coding: utf-8 -*kullanici_adi = raw_input("Kullanıcı adınız: ") ..“ ¸ s g gs g g Bir önceki bölümde su i¸leçleri görmü¸tük: ¸ s s Aritmetik ˙sleçler I¸ + / * Toplama i¸lemi yapar s Çıkarma i¸lemi yapar s Bölme i¸lemi yapar s Çarpma i¸lemi yapar s Kar¸ ıla¸ tırma ˙sleçleri s s I¸ == != > < >= <= “e¸ittir” anlamına geliyor s “e¸it de˘ ildir” anlamına geliyor s g “büyüktür” anlamına geliyor “küçüktür” anlamına geliyor “büyük e¸ittir” anlamına geliyor s “küçük e¸ittir” anlamına geliyor s Simdi de mantık i¸leçlerini (logical operators) inceleyece˘ iz.coding: utf-8 -*kullanici_adi = raw_input("Kullanıcı adınız: ") parola = raw_input("Parola: ") if kullanici_adi == "ahmet" and parola == "ah12345678": print "Programa ho¸geldiniz!" s else: print "Kullanıcı adınız ya da parolanız yanlı¸" s Burada “and” i¸lecinin ne i¸e yaradı˘ ı apaçık anla¸ılıyor. E˘ er kullanıcı adı ve paroladan herhangi biri yanlı¸sa kullanıcı programa giri¸ izni elde g s s edemez.. kullanıcının pros s g s grama kabul edilmesini.else: print "Te¸ekkürler" s Burada söyle demi¸ oluyoruz: “E˘ er soru de˘ i¸keninin bool de˘ eri True de˘ il ise. Bir önceki bölümde henüz Bool ¸ s g kavramını ö˘ renmemi¸ oldu˘ umuz için mantık i¸leçlerinden bahsedememi¸tik. s s Peki ne i¸e yarar bu mantık i¸leçleri? s s ˙ Isterseniz uzun uzun açıklama yapmak yerine bir örnek verelim: #!/usr/bin/env python # -*.

. Bu i¸leç “de˘ il” anlamına gelir. g g g >>> True and False False E˘ er de˘ erlerden biri bile False ise sonuç da False olacaktır. g Gelelim “not” i¸lecine. g g >>> True or False True E˘ er iki de˘ er birbirine “or” ile ba˘ lanırsa ve e˘ er bu de˘ erlerden sadece biri bile True ise g g g g g sonuç da True olacaktır. >>> False or False False “or” ile birbirine ba˘ lanmı¸ iki de˘ erin ikisi de False ise sonuç da False‘tur. Bu sekilde kullanıcının programa giri¸ g ¸ s yapabilmesi için kullanıcı adı veya paroladan birini do˘ ru girmesi yeterli olacaktır. g g >>> False and False False Elbette her iki de˘ erin de False oldu˘ u durumda sonuç da False‘tur.. iki True de˘ er birbirine “and” ile ba˘ lanırsa sonuç True olacaktır. Birkaç örnek verelim: >>> kullanici_adi = "ahmet" >>> not kullanici_adi False Burada Python’a söyle bir sey söylemi¸ olduk: ¸ ¸ s “kullanici_adi de˘ i¸keninin bool de˘ eri True de˘ ildir“ gs g g . Yani bu i¸leç cümleye olumsuz bir s s g s anlam katar. g s g >>> True or True True Elbette her iki de˘ er de True ise sonuç da True olacaktır.parola = raw_input("Parola: ") if kullanici_adi == "ahmet" or parola == "ah12345678": print "Programa ho¸geldiniz!" s else: print "Kullanıcı adınız ya da parolanız yanlı¸" s Burada “and” yerine “or” kullandı˘ ımıza dikkat edin. g Dilerseniz etkile¸imli kabukta birkaç ufak örnekle durumu daha net anlamaya çalı¸alım: s s >>> True and True True Dedi˘ imiz gibi.

. Bunu önlemek için.coding: utf-8 -*bolen = input("Bölme i¸lemi için ilk sayıyı girin: ") s bolunen = input("Bölme i¸lemi için ikinci sayıyı girin: ") s .. Simdi dilerseniz bu duruma çok s ¸ basit bir örnek verelim: Bildi˘ iniz gibi. i¸leme giren sayılardan birini kayan noktalı sayı olarak s tanımlamamız yeterlidir: >>> print 23.0 / 3 7. Yani: >>> print 23 / 3 7 Burada iki adet tamsayı oldu˘ u için Python bize sonucu da tamsayı olarak gösterir.3 Dönü¸ türme ˙slemleri s I¸ Programcılık maceramız sırasında. Burada Python’a sunu diyoruz: ¸ “E˘ er soru de˘ i¸keninin bool de˘ eri True de˘ il ise. True’dur..“ Yanılıyorsun! Çünkü kullanıcı_adi de˘ i¸keni bir de˘ ere sahip oldu˘ u için gs g g Hatırlarsanız yukarıda söyle bir örnek vermi¸tik: ¸ s #!/usr/bin/env python # -*. Mesela pek çok durumda bir sayıyı karakter dizisine ve e˘ er mümkünse bir s s g g karakter dizisini de sayıya dönü¸türmek zorunda kalacaksınız. dostum. verileri birbirine dönü¸türmemiz gereken durumlarla sıkça s kar¸ıla¸aca˘ ız. Yani ong dalık kısmı atar.“ g gs g g Yukarıdaki örnekte e˘ er kullanıcı “Adınız” sorusunu bo¸ geçerse soru de˘ i¸keninin de˘ eri söyle g s gs g ¸ olacaktır: soru = "" Python’da bo¸ karakter dizilerinin False oldu˘ unu biliyoruz..coding: utf-8 -*soru = raw_input("Adınız: ") if not soru: print "Bu soruyu bo¸ geçemezsiniz!" s else: print "Te¸ekkürler" s Burada if not soru ifadesine dikkat edin. Dolayısıyla e˘ er kullanıcı soruyu s g g bo¸ geçerse if not soru: satırı i¸letilecektir. Python’da iki tamsayıyı birbirine bölersek elde edece˘ imiz çıktı da tamsayı olag g caktır. s s 6.66666666667 Peki buna benzer bir seyi a¸a˘ ıdaki programda nasıl yaparız? ¸ s g #!/usr/bin/env python # -*.O da bize su cevabı verdi: ¸ “Hayır.

. bunların sa˘ ına birer ”. bolen / bolunen s Biraz önce.print "Bölme i¸leminin sonucu:". Simdi suna bakın: s ¸ ¸ >>> a = 23 >>> b = 3 >>> a / b 7 >>> float(a) / b 7.0 Gördü˘ ünüz gibi. Gelin simdi bu i¸lemi yukarıdaki programa ¸ s uygulayalım: #!/usr/bin/env python # -*.666666666666667 Gördü˘ ünüz gibi. input() ve raw_input() fonksiyonlarını incelerken.0” i¸areti koyarak sorunu g g s çözüyorduk. Dolayısıyla yukarıdaki programın hassas ¸ bir sonuç verebilmesi için burada bir dönü¸türme i¸lemi yapmamız gerekiyor. Bu dönü¸türme s s s i¸lemi için float() adlı bir fonksiyondan yararlanaca˘ ız: s g >>> a = 23 >>> float(a) 23. input() fonksiyonuyla yapabilece˘ imiz her seyi aslında raw_input() fonksiyonuyla da yapabilece˘ imizi söylemi¸tik. Mesela int() fonksiyonu bunlardan s biridir. sayıları kendimiz girdi˘ imiz için. ˙ste bu g ¸ g s I¸ int() fonksiyonu bize bu konuda yardımcı olacak.0 seklinde bir kayan noktalı sayıya g ¸ dönü¸türdü. bölme i¸lemine giren sayılardan birini bu float() fonksiyonu ile kayan nokg s talı sayıya döndürerek hassas bir çıktı alabildik. float() fonksiyonu 23 sayısını 23.coding: utf-8 -*bolen = input("Bölme i¸lemi için ilk sayıyı girin: ") s bolunen = input("Bölme i¸lemi için ikinci sayıyı girin: ") s print "Bölme i¸leminin sonucu:". s ¸ g Elbette Python’da float() gibi ba¸ka fonksiyonlar da vardır. Ama simdi sayıları kullanıcıdan alıyoruz... Hatırlarsanız. float(bolen) / bolunen s Artık bölme i¸leminin sonucunu hassas bir sekilde alabilece˘ iz.. Dilerseniz önce bu fonksiyonu etkile¸imli s kabukta biraz inceleyelim: >>> a = "23" Bildi˘ iniz gibi yukarıdaki a de˘ i¸keni bir karakter dizisidir. Simdi bunu sayıya çevirelim: g gs ¸ >>> int(a) 23 .

Böylece “23” karakter dizisini sayıya çevirmi¸ olduk.. line 1. sayi ** kuvvet) Burada. Daha önce de dedi˘ im g g g gibi. s Peki yukarıda yaptı˘ ımız seyin tersi mümkün mü? Yani acaba bir sayıyı karakter dizisine çevireg ¸ bilir miyiz? Bu sorunun yanıtı evettir. Bu i¸lem için de str() adlı fonksiyondan yararlanaca˘ ız: s g .. kodları görünü¸ açısından g s g s nasıl düzenledi˘ imize ve satırları nasıl böldü˘ ümüze de dikkat edin. “elma” karakter dizisi sayı olarak temsil edilemeyece˘ i için Python bize bir g g hata mesajı gösteriyor. Ancak tahmin edebilece˘ iniz gibi her s g karakter dizisi sayıya çevrilemez. Ama “23” gibi bir karakter disini sayı olmaktan çıkaran tek sey tırnak ¸ i¸aretleri oldu˘ u için. Python görünü¸e de önem veren zarif bir dildir. burada yaptı˘ ımız sey çok basit. bu karakter dizisi sayı olarak temsil edilebiliyor. in <module> ValueError: invalid literal for int() with base 10: ’elma’ Gördü˘ ünüz gibi.coding: utf-8 -*ilk_sayi = int(raw_input("˙lk sayıyı girin: ")) I ikinci_sayi = int(raw_input("˙kinci sayıyı girin: ")) I toplam = ilk_sayi + ikinci_sayi print "Bu iki sayının toplamı: ".coding: utf-8 -*sayi = int(raw_input("Bir sayı girin. Nihayet input() gibi tehlikeli bir fonksiyondan yakayı s sıyırdı˘ ımıza göre bu durumu bir örnekle kutlayabiliriz: g #!/usr/bin/env python # -*. Gelin isterseniz bu s g bilgiyi su örne˘ e uygulayalım: ¸ g #!/usr/bin/env python # -*. kuvveti %s olur." %(sayi. kuvvet. raw_input() fonksiyonunu tümden int() g g ¸ fonksiyonu içine aldık: int(raw_input("˙lk sayıyı girin: ")) I Burada özellikle kapanı¸ tırnaklarını eksik yazmamaya özen gösteriyoruz. toplam Gördü˘ ünüz gibi. yazdı˘ ımız kodların nasıl i¸ledi˘ ine dikkat etmenin yanısıra. Ben size bu sayının " "istedi˘iniz kuvvetini hesaplayayım: ")) g kuvvet = int(raw_input("¸imdi de %s sayısının kaçıncı kuvvetini " S "hesaplamak istedi˘inizi söyleyin: " g %sayi)) print "%s sayısının %s. Python’a yeni s ba¸layanların en sık yaptı˘ ı hatalardan biri de açılmı¸ tırnakları kapatmayı unutmaktır. int() fonksiyonu yalnızca sayı de˘ erli karakter dizilerini g sayıya dönü¸türebilir: s >>> kardiz = "elma" >>> int(kardiz) Traceback (most recent call last): File "<stdin>". s g s Böylece input() fonksiyonunun prangasından kurtulmu¸ olduk! Artık raw_input() fonksiyonuyla s da aritmetik i¸lemler yapabiliyoruz.

A¸a˘ ıdaki örnekte if ve elif deyimlerini farklı sıralarda yerle¸tirdi˘ inizde nasıl bir sonuç elde s g s g edece˘ inizi dü¸ünün. Söyle bir kod yazımı ne tür sorunların ortaya çıkmasına yol açar? Mesela g s ¸ a¸a˘ ıdaki kodları çalı¸tıran bir kullanıcı cevap olarak 60 üzeri bir sayı girerse nasıl bir çıktı alır? s g s Çıktının bekledi˘ imiz gibi olmamasının nedeni nedir? g . Dolayısıyla s de˘ i¸keni bir karakter gs dizisidir. type() fonksiyonu. Bu konuyu da bitirdi˘ imize göre artık bölüm sorularına geçebiliriz.3 >>> type(f) <type ’float’> “float”.>>> a = 23 >>> str(a) ’23’ Gelin isterseniz simdiye kadar gördü˘ ümüz dönü¸türme fonksiyonlarını topluca görelim: ¸ g s float() int() str() Herhangi bir sayıyı veya sayı de˘ erli karakter dizisini kayan noktalı sayıya dönü¸türür. g s Herhangi bir sayıyı veya sayı de˘ erli karakter dizisini tamsayıya dönü¸türür. çünkü Python maceranızda bunlar bol bol kar¸ınıza çıkag s cak.. g 6.. herhangi bir de˘ erin hangi tipte oldu˘ unu sorgulamamızı sa˘ lar. Örne˘ in: g g g g >>> i = 23 >>> type(i) <type ’int’> “int”. yani tamgs sayı imi¸. g s Herhangi bir sayıyı karakter dizisine dönü¸türür. Yani f de˘ i¸keni gs bir kayan noktalı sayıdır. Bir de suna bakalım: s ¸ >>> s = "elma" >>> type(s) <type ’str’> “str” de string (karakter dizisi) kelimesinin kısaltmasıdır. floating point number (kayan noktalı sayı) kelimesinin kısaltmasıdır. integer (tamsayı) kelimesinin kısaltmasıdır. Bu bölümü kapatmadan önce dilerseniz Python’daki küçük ama önemli bir fonksiyondan daha söz edelim: type() fonksiyonu. >>> f = 14.. Demek ki i de˘ i¸keni bir integer..4 Bölüm Soruları 1. s Bu fonksiyonları iyi ö˘ renmelisiniz.

A¸a˘ ıdaki i¸lemlerin 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.#!/usr/bin/env python # -*. Geçen bölümde yaptı˘ ımız basit hesap makinesinde input() fonksiyonunu kullanmı¸tık. Siz g s o hesap makinesini raw_input() fonksiyonunu kullanarak yeniden yazın. . Epey gençsin.." elif yas > 30: print "Ya¸lanıyorsun dostum!" s elif yas >= 60: print "Ya¸ kemale ermi¸!" s s 2.coding: utf-8 -*yas = int(raw_input("Ya¸ınız kaç? ")) s if yas < 0: print "Yok canım. daha neler!?" elif yas <= 30: print "Hmm.

g g g Kodlarımızı sürekli döndürmemizi sa˘ lamada bize yardımcı olacak parçacıklara Python’da g döngü (˙ Ingilizce: Loop) adı veriliyor. Dolayısıyla bu kod g g parçasının verece˘ i çıktı da 1 olacaktır. Böylece ilerleyen bölümlerde i¸leyece˘ imiz daha karg g s g ma¸ık konuları biraz daha kolay anlamamızı sa˘ layacak temeli edinece˘ iz. ba¸ka bir i¸lem g s g s s yapmak istedi˘ imizde ise programı yeniden ba¸latmamız gerekiyordu. o hesap makinesi programında toplama.1 while Döngüsü Yazdı˘ ımız kodları tekrar tekrar döndürmemizi sa˘ layan. çarpma veya bölme i¸lemlerinden s birini seçip. g 76 . üçüncü satırda da bu yeni de˘ eri ekrana yazdırmaktır. programı yeniden ba¸latmamız gerekir. programımıza bir süreklilik katan g g ö˘ elere döngü adı verilir. Bu bölümde iki tane döngüden bahsedece˘ iz: while g ve for döngüleri. tekrar tekrar döndürmeyi ö˘ renece˘ iz. Ne demek istedi˘ imizi anlatmanın en iyi yolu bununla s g g ilgili bir örnek vermek olacaktır.. yukarıda verilen tanıma tam olarak uyar. birinci satırda a de˘ i¸keninin de˘ erine bakıp ikinci satırda bu g s gs g de˘ ere 1 eklemek. s s 7. Bu çıktıyı verdikten sonra ise program sona erecektir. ˙ste bu bölümde s I¸ Python’da yazdı˘ ımız kodları sürekli hale getirmeyi. su anki bilgilerimizle her defasında programı yeniden ¸ ba¸latmak zorunda kalırız.. O halde su küçücük örne˘ i bir inceleyelim bakalım: ¸ g #!/usr/bin/ env python #-*.coding: utf-8 -*a = 0 a = a + 1 print a Bu minicik kodun yaptı˘ ı i¸. Ayrıca bu bölümde döngüler dı¸ında break ve continue deyimleri ile range() s ve len() fonksiyonlarına da de˘ inece˘ iz. Aynı sekilde kullanıcı g s ¸ adı ve parola soran bir program yazsak. Yani g yazdı˘ ımız bir programdaki kodların tamamı i¸letilince programın kapanmasına engel olur ve g s kod dizisinin en ba¸a dönmesini sa˘ lar. Yani kullanıcı adı ve parola yanlı¸ girildi˘ inde bu kullanıcı adı ve s s g parolayı tekrar tekrar soramayız. çıkarma. daha sonra o seçti˘ imiz i¸lemi bitirdi˘ imizde program kapanıyor. ˙ s g g Isterseniz lafı daha fazla uzatmadan yola koyulalım ve ilk olarak while döngüsüyle i¸e ba¸layalım.BÖLÜM 7 Python’da Döngüler Hatırlarsanız geçen bölümlerden birinde basit bir hesap makinesi yapmı¸tık. while döngüsü. Ancak dikkat s ettiyseniz.

gs g • a de˘ erinin 0 oldu˘ unu görüyor. g • Bu de˘ eri ekrana yazdırıyor (1).” cümlesini Pythonca’ya çevirdik. 1’den 100’e kadar olan sayıların ekrana yazdırıldı˘ ını görürüz. Ilk g gs ˙ Ikinci ve üçüncü satırlarda. gs g Son satırda ise. s g g Konuyu anlayabilmek için simdi de satırları teker teker inceleyelim: ¸ ˙ satırda.1 gibi bir sey yazmı¸ olsaydık. g • Ba¸a dönüp tekrar a de˘ i¸keninin de˘ erini kontrol ediyor. bu yeni a de˘ erini ekrana yazdırdık. “a de˘ i¸keninin de˘ eri 100 sayısından küçük oldu˘ u müddetçe a gs g g de˘ i¸keninin de˘ erine 1 ekle. s gs g • a de˘ erinin su anda 1 oldu˘ unu görüyor.coding: utf-8 -*a = 0 while a < 100: a += 1 print a Bu kodu çalı¸tırdı˘ ımızda. s Simdi yukarıdaki koda bazı eklemeler yapalım: ¸ #!/usr/bin/env python #-*. g g • a de˘ erinin 100’den küçük oldu˘ unu idrak ediyor. Python yukarıda gördü˘ ünüz a = a + 1 satırını su sekilde g ¸ ¸ yazmanıza da izin verir: a += 1 E˘ er a = a . 0 de˘ erine sahip bir a de˘ i¸keni tanımladık. bunu da su sekilde kısaltabilirdik: g ¸ s ¸ ¸ a -= 1 a = a * 2 veya a = a / 2 gibi ifadeler de söyle kısaltılabilir: ¸ a *= 2 ve: a /= 2 Bu kısaltmalar son derece önemlidir. g • Bu de˘ eri ekrana yazdırıyor (2). g ¸ g • a de˘ erinin hâlâ 100’den küçük oldu˘ unu anlıyor. Bu döngü sayesinde programımız I¸ son satıra her geli¸inde ba¸a dönüyor. g g • a de˘ erine 1 ekliyor (0 + 1 = 1). O yüzden kodlarınızda mümkün oldu˘ unca bu kısaltmaları kullanmaya g çalı¸ın. g . Yani: s s • a de˘ i¸keninin de˘ erini kontrol ediyor. g g • a de˘ erine 1 ekliyor (1 + 1 = 2).Bu arada ufak bir ipucu verelim size. çünkü yazdı˘ ınız Python programlarının performansını g artırıcı etkileri vardır. g ˙ste bu noktada while döngüsünün faziletlerini görüyoruz.

Bu ifade ile. Burada söyle bir sey demi¸ olduk: g ¸ ¸ s “E˘ er kull_ad de˘ i¸keninin de˘ eri kullanici_adi de˘ i¸keninin de˘ eriyle VE par de˘ i¸keninin g gs g gs g gs de˘ eri parola de˘ i¸keninin de˘ eriyle aynıysa. en g ba¸ta belirledi˘ imiz a de˘ i¸keninin 1 olan de˘ erini 2‘ye getiriyoruz.coding: utf-8 -*a = 1 kullanici_adi = "ahmet_hamdi" parola = "Saatleri_Ayarlama_Enstitüsü" while a == 1: kull_ad = raw_input("Kullanıcı adı: ") par = raw_input("Parola: ") if kull_ad == kullanici_adi and par == parola: print "Programa ho¸geldiniz!" s a = 2 elif not kull_ad or not par: print "Bu alanları bo¸ bırakamazsınız!" s else: print "Kullanıcı adı veya parolanız hatalı. E˘ er kullanıcımız. Sonraki satırda gördü˘ ümüz elif blo˘ unda ise kullanıcı adı ve parola alanlarının bo¸ bırakılıp g g s bırakılmadı˘ ını denetliyoruz. Ardından gelen if deyimini nasıl yazdı˘ ımıza dikkat edin..• Bu i¸lemi 99 sayısına ula¸ana dek tekrarlıyor ve en sonunda bu sayıya da 1 ekleyerek s s vuslata eriyor. buradaki if blo˘ unun içinde görünen a = 2 ifadesi de çok önemli. while a g ¸ == 1 ifadesi ile Python’a sunu söylemi¸ oluyoruz: ¸ s “a de˘ i¸keninin de˘ eri 1 oldu˘ u müddetçe a¸a˘ ıdaki kodları çalı¸tırmaya devam et!“ gs g g s g s Bu satırın ardından normal bir sekilde raw_input() fonksiyonlarımız yardımıyla kullanıcıdan kul¸ lanıcı adı ve parola bilgilerini istiyoruz. bu de˘ i¸kenlerin de˘ erini do˘ ru girerse sisteme giri¸ yapabilecek. Burada yaptı˘ ımız seye dikkat edin. ˙ g g Isterseniz alı¸tırma s olması bakımından bir örnek daha verelim: #!/usr/bin/env python # -*. while döngüsünü anlamak ve kullanmak hiç de zor de˘ il. Böylece kullanıcımız kullanıcı adı ve parola bilgilerini do˘ ru g s g girdi˘ inde while döngüsü sona eriyor. Gördü˘ ünüz gibi.“ g gs g Buradaki and (VE) i¸lecinin görevini biliyorsunuz. E˘ er burada a de˘ i¸keninin de˘ erini 1 dı¸ında bir de˘ ere g g gs g s g ayarlamazsak. Bu sayede kullanıcının hem kullanıcı adı hem s de parola bilgisini do˘ ru girmesini isteyebiliyoruz. s s . kullanıcı adı ve parola do˘ ru girildi˘ i halde programımız kullanıcı adı ve parola g g sormaya devam edecektir.." Burada öncelikle de˘ eri 1 olan a adlı bir de˘ i¸ken tanımladık. s Bir sonraki satırda kullanici_adi ve parola adlı iki de˘ i¸ken daha tanımlıyoruz. g Bu arada. Böylece a de˘ i¸keninin s g gs g gs de˘ eri artık 1 olmamı¸ oluyor. Bu de˘ i¸kenin de˘ eri 1 oldu˘ u g gs gs g g müddetçe programımız çalı¸maya devam edecek. gs g g s Daha sonra da while döngümüzü tanımlıyoruz. kullanıcı adı VEYA (or) parola bilgilerinden herg g hangi birini bo¸ bırakırsa kendisine Bu alanları bo¸ bırakamazsınız! uyarısı gösteriyoruz. E˘ er kulgs g lanıcı.

döngüyü sona erdirecek bir g g ko¸ul belirtmeyi unutmaktır.coding: utf-8 -*kullanici_adi = "ahmet_hamdi" parola = "Saatleri_Ayarlama_Enstitüsü" while True: kull_ad = raw_input("Kullanıcı adı: ") par = raw_input("Parola: ") if kull_ad == kullanici_adi and par == parola: print "Programa ho¸geldiniz!" s quit() elif not kull_ad or not par: print "Bu alanları bo¸ bırakamazsınız!" s else: print "Kullanıcı adı veya parolanız hatalı. Ancak e˘ er istersek yukarıdaki kodg g ları biraz sadele¸tirme ve profesyonel bir görünüm kazandırma imkanına da sahibiz. Yani bir nevi. “aksi belirtilmedi˘ i sürece a¸a˘ ıdaki komutları ¸ g g s g çalı¸tırmaya devam et!” emrini yerine getiriyor.else blo˘ unda ise kullanıcı adı ve parolanın yanlı¸ girilmesi halinde kullanıcıya nasıl bir uyarı g s gösterece˘ imizi belirliyoruz.. Çünkü bu de˘ i¸kene ihtiyacımız kalmadı. s Su örne˘ e bir bakalım: ¸ g #!/usr/bin/env python # -*. Bu açıdan yukarıdaki g s g kodlar tamamen do˘ ru ve geçerli bir Python programıdır. Onun yerine. Dolayısıyla burada gördü˘ ümüz while True ifadesi su anlama geliyor: g s g ¸ “Do˘ ru oldu˘ u müddetçe a¸a˘ ıdaki kodları çalı¸tırmaya devam et!“ g g s g s Peki ne do˘ ru oldu˘ u müddetçe? Neyin do˘ ru oldu˘ unu açıkça belirtmedi˘ imiz için Python bug g g g g rada her seyi do˘ ru kabul ediyor. Bunun gs gs yerine while döngümüzü su sekilde yazdık: ¸ ¸ while True: Hatırlarsanız geçen bölümde Bool de˘ erleri incelerken True kelimesinin “do˘ ru” anlamına g g geldi˘ ini söylemi¸tik. g Yukarıdaki kodlar istedi˘ imiz i¸lemi rahatlıkla yerine getirmemizi sa˘ lar.. s Bunun dı¸ında farklı olarak ilk if blo˘ u içindeki a = 2 satırını da kaldırdık. s g g while döngüsünü yeni ö˘ renenlerin en sık yaptı˘ ı hatalardan biri. Siz bu fonksiyonu ilk derslerimizden hatırlıyor olmalısınız. Bu fonksiyon Python’un etkile¸imli kabu˘ undan çıkmamızı sa˘ lıyordu. Mesela önceki kodlarda yer alan a de˘ i¸kenini burada artık kullanmıyoruz. s Su kodlara bir bakın: ¸ #!/usr/bin/env python # -*.coding: utf-8 -*soru = raw_input("Python mu Ruby mi?") while soru != "Python": print "Yanlı¸ cevap!" s ." Burada önceki kodlara göre bazı farklılıklar dikkatimizi çekiyor. Programın en ba¸ıns g s daki a de˘ i¸kenini kaldırdı˘ ımız için artık bu satıra da ihtiyacımız yok. quit() gs g adlı bir fonksiyon kullanıyoruz.

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.. print harf . Bu tanım big raz kafa karı¸tırıcı gelmi¸ olabilir. e˘ er kullanıcının verdi˘ i cevap “Python” de˘ ilse. bu nedenle de döngümüz sürekli çalı¸maya devam edecektir.2 for Döngüsü Python’da en sık kullanılan döngü for döngüsüdür desek abartmı¸ olmayız. s yazdı˘ ınız programlarda bu döngüyü bolca kullanacaksınız.Dikkat ederseniz burada da i¸leçlerimizden birini kullandık. i s t i h z a “istihza” bir karakter dizisidir. while döngüsünün her ba¸a dönü¸ünde olcut de˘ i¸keninin de˘ erini 1 artırarak 10’a yaks s gs g la¸tırıyor. for döngüsü. g Siz de kendi for döngüsünün görevi bir dizi içindeki ö˘ elerin üzerinden tek tek geçmektir. Bu kodlar içindeki en önemli satır olcut += 1‘dir. Burada yaptı˘ ımız sey su: g g ¸ ¸ . s Simdilik while döngüsüne ara verip bu konuda incelememiz gereken ikinci döngümüze geçiy¸ oruz.. yani sonsuz bir döngüye s girecektir.. olcut de˘ i¸keninin de˘ eri her zaman 0 olmaya devam s g gs g edecek.... program biz müdahale s g edene kadar ekrana Yanlı¸ cevap! çıktısını vermeye devam edecek. 7. Çünkü bu s kod. Çünkü biz Python’a su komutu vermi¸ olduk bu kodla: ¸ s “soru de˘ i¸keninin cevabı Python olmadı˘ ı müddetçe ekrana ‘Yanlı¸ cevap!’ çıktısını vermeye gs g s devam et!“ E˘ er bu programı durdurmak istiyorsak CTRL+C tu¸larına basmamız gerekir. s s Bu programı çalı¸tırdı˘ ımızda sorulan soruya Python cevabı vermezsek. O yüzden isterseniz ne demek istedi˘ imizi basit bir örnek s s g üzerinde anlatalım: >>> for harf in "istihza": . Ancak burada döngüyü sona erdirecek bir ko¸ul belirlemedik. g s Yukarıdaki kodların i¸letili¸ini sınırlamak için söyle bir sey yazabiliriz: s s ¸ ¸ #!/usr/bin/env python # -*. ekrana on kez “Yang g g lı¸ cevap!” çıktısı verilecektir. Kullandı˘ ımız i¸leç “e¸it de˘ ildir” s g s s g anlamına gelen ”!=” i¸leci. bu dizi içindeki ö˘ elerin üzerinden tek tek geçmemg izi sa˘ lıyor. E˘ er bu satırı yazmazsak.

coding: utf-8 -*for i in range(1.coding: utf-8 -*for i in range(1. bir dizi içinde bulunan bütün ö˘ elerin üzerinden tek tek g g geçilmesini sa˘ lar. 100): . Daha sonra da bu harf de˘ i¸kenlerini tek tek ekrana yazdırıyoruz. Yukarıdaki kodları Türkçe’ye söyle çevirebiliriz: g ¸ ¸ #!/usr/bin/env python # -*. (print harf) gs for döngüsü bazı durumlarda while döngüsü ile benzer bir i¸levi yerine getirir. Mesela 1-100 g ¸ arasındaki çift sayıları listelemek istiyor olabilirsiniz: #!/usr/bin/env python # -*. siz isterseniz ba¸ka bir harf veya kelime gs s de kullanabilirsiniz.coding: utf-8 -*a = 0 while a < 100: a += 1 print a Bu kod yardımıyla ekrana 1’den 100’e kadar olan sayıları yazdırabiliyorduk. Aynı i¸lemi daha s basit bir sekilde for döngüsü (ve range() fonksiyonu) yardımıyla da yapabiliriz: ¸ #!/usr/bin/env python # -*.coding: utf-8 -*1-100 aralı˘ındaki sayılara i dersek: g bu i’ler içinde 2’ye tam bölünenleri: ekrana bas! Aynı sekilde tek sayıları listelemek de mümkün: ¸ #!/usr/bin/env python # -*. g for döngüsünün bu özelli˘ inden yararlanarak bazı ilginç seyler yapabilirsiniz. 100): if i % 2 == 0: print i Burada yaptı˘ ımız sey aslında çok basit. Öncelikle “istihza” karakter dizisinin her bir ö˘ esine “harf” adı veriyoruz. (for harf in g "istihza") 2.100 aralı˘ ındaki sayıların s g ¸ g her birine i adını verdikten sonra ekrana i’nin de˘ erini yazdır!“ g Dedi˘ imiz gibi. Mesela yukarıda s while döngüsünü anlatırken yazdı˘ ımız su kodu hatırlıyorsunuz: g ¸ #!/usr/bin/env python # -*. 100): print i Ben burada de˘ i¸ken adı olarak “i” harfini kullandım.1. Yukarıdaki Pythonca kod Türkçe’de a¸a˘ ı yukarı su anlama gelir: “1.coding: utf-8 -*for i in range(1. Yukarıdaki örnekte de bu döngü 1-100 aralı˘ ındaki sayıların her biri üzg g erinden tek tek geçiyor ve bu ö˘ elerin her birini sırayla “i” olarak adlandırıyor. for döngüsü.

3 range() fonksiyonu Önceki bölümde bu fonksiyonla ilgili epey örnek yaptı˘ ımız için. Mesela: g #!/usr/bin/env python #-*. 100. 2) Bu komut ise 1 ile 100 arasındaki sayıları 2’¸er 2’¸er atlayarak yazdırmamızı sa˘ lar.coding: utf-8 -*for sarki in range (1. 1.4 len() fonksiyonu Bu fonksiyon. s Ba¸ka bir örnek daha verelim: s print range(100.” kuralından yararlanarak 1-100 g g arası sayıları süzgeçten geçiriyoruz. Mesela: aralıklarını belirtmemizi sa˘ lar. ˙ g Isterseniz bu vesileyle biraz da hem döngülerde hem ko¸ullu ifadelerde hem de ba¸ka yerlerde kar¸ımıza s s s çıkabilecek faydalı fonksiyonlara ve ifadelere de˘ inelim: g 7. Böylelikle Python’da while ve for döngülerini de ö˘ renmi¸ olduk. Bu fonksiyonun ne i¸e yaradı˘ ını gayet iyi biliyoruz. g s for döngüsü için verdi˘ imiz ilk örnekte döngü içinde yeni bir fonksiyon kullandık. -1) Hemen for döngüsüyle range() fonksiyonunun birlikte kullanıldı˘ ı bir örnek verip ba¸ka bir g s fonksiyonu anlatmaya ba¸layalım: s #!/usr/bin/env python #-*. 15): print sarki. Dedi˘ imiz gibi. Bir örnek daha: print range(1. karakter dizilerinin uzunlu˘ unu gösterir. artık bu fonksiyonun yabancısı g sayılmayız. "mumdur" 7. s s g Su ise 100’den 1’e kadar olan sayıları tersten sıralar: ¸ print range(100. Bu arada dikkat ettiyseniz. 200) komutu 100 ile 200 arasındaki sayıları döker.coding: utf-8 -*- . Bu fonksiyon Python’da sayı s g Ingilizce’de de bu kelime “aralık” anlamına gelir.if i % 2 == 1: print i “E˘ er bir sayı ikiye bölündü˘ ünde kalan 1 ise o sayı tektir. bu range() fonksiyg g onunu bir önceki bölümde birkaç örnekte kullanmı¸tık. Zaten ˙ g print range(100) komutu 0 ile 100 arasındaki sayıları yazdırmamızı sa˘ lar.

a = "Afyonkarahisar" print len(a) Bu kod.5 break deyimi break deyimi program içinde bir noktada programı sona erdirmek gerekti˘ i zaman kullanılır. Ama söyle yaparsak olur: g ¸ >>> kardiz = "123456" >>> len(kardiz) 6 123456 sayısını tırnak içine alarak bunu bir karakter dizisi haline getirdi˘ imiz için len() fonksiyg onu görevini yerine getirecektir. ama ¸ g sayılarla birlikte kullanılamadı˘ ını bilmemiz yeterli olacaktır. Hemen örnek bir kod yazalım: #!/usr/bin/env python #-*. Bu fonksiyonu nerelerde kullanabiliriz? Mesela yazdı˘ ınız bir programa kullanıcıların giri¸ yag s pabilmesi için parola belirlemelerini istiyorsunuz. Ancak henüz o veri tiplerini s g g görmedik. Seçilecek parolaların uzunlu˘ unu sınırlamak g istiyorsanız bu fonksiyondan yararlanabilirsiniz. g A¸a˘ ıdaki örnek break deyiminin ne i¸e yaradı˘ ını açıkça gösteriyor: s g s g #!/usr/bin/env python #-*. ˙ g Ilerde bu fonksiyonu ba¸ka veri tipleri ile birlikte kullanmayı da ö˘ renece˘ iz. tamsayı veri tipinin len() fonksiyonu ile birlikte kulg lanılamayaca˘ ını söylüyor. Dolayısıyla simdilik bu fonksiyonun karakter dizileriyle birlikte kullanılabildi˘ ini. line 1.coding:utf-8 -*kullanici_adi = "kullanici" parola = "parola" while True: . 7. Afyonkarahisar karakter dizisi içindeki harflerin sayısını ekrana dökecektir. in <module> TypeError: object of type ’int’ has no len() Burada gördü˘ ümüz hata mesajı bize.coding: utf-8 -*a = raw_input("Lütfen bir parola belirleyin: ") if len(a) >= 6: print "Parola 5 karakteri geçmemeli!" else: print "Parolanız etkinle¸tirilmi¸tir." s s len() fonksiyonunu yalnızca karakter dizileri ile birlikte kullandı˘ ımıza dikkat edin. Yani söyle bir örnek bizi hüsrana g ¸ u˘ ratır: g >>> sayi = 123456 >>> len(sayi) Traceback (most recent call last): File "<stdin>".

g s . Yani gs g kullanıcı adı ve paroladan biri yanlı¸sa if deyiminin gerektirdi˘ i ko¸ul yerine gelmemi¸ olacaks g s s tır.6 continue deyimi Bu deyim ise döngü içinde kendisinden sonra gelen her seyin es geçilip döngünün en ba¸ına ¸ s dönülmesini sa˘ lar.’ cümlesini yazdır!“ Burada dikkat edilmesi gereken nokta su: and i¸lecinin birbirine ba˘ ladı˘ ı soru1 ve soru2 ¸ s g g de˘ i¸kenlerinin ancak ikisi birden do˘ ruysa o bahsedilen cümle ekrana yazdırılacaktır. burada hem a hem de b do˘ ru olmalıdır. Yukarıdaki kodlar arasında. bu a veya b ifadelerinden birinin do˘ ru olması yetecektir. Kullandı˘ ımız bu i¸leç. Sayet “a ve b do˘ ru g g ¸ g ise” derseniz. Bu i¸lecin geçti˘ i satıra tekrar bakalım: s s g if soru1 == kullanici_adi and soru2 == parola: print "Kullanıcı adı ve parolanız onaylandı. dikkat ederseniz." break else: print "Kullanıcı adınız veya parolanız yanlı¸. Bunu. Bu i¸leç Türkçe’de “veya” anlamına gelir." Burada su Türkçe ifadeyi Python’caya çevirmi¸ olduk: “E˘ er soru1 de˘ i¸keninin de˘ eri kul¸ s g gs g lanici_adi de˘ i¸keniyle.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. daha önce s g bahsetti˘ imiz i¸leçlerden birini daha kullandık. g 7. g if s == "iptal": break satırıyla sa˘ lamayı ba¸ardık. and i¸lecinin s s s kar¸ıtı or i¸lecidir.soru1 = raw_input("Kullanıcı adı: ") soru2 = raw_input("Parola: ") if soru1 == kullanici_adi and soru2 == parola: print "Kullanıcı adı ve parolanız onaylandı. “ve” anlamına gelen g s g s and i¸leci. kullanıcı adı ve parola do˘ ru girildi˘ inde parola sorma g g i¸leminin durdurulması sa˘ lanıyor. soru2 de˘ i¸keninin de˘ eri de parola de˘ i¸keniyle aynı ise ekrana ‘Kulgs gs g gs lanıcı adı ve parolanız onaylandı. Buna göre." Burada e˘ er kullanıcı klavyede iptal yazarsa programdan çıkılacaktır. “a veya b do˘ ru ise” s s s g dedi˘ iniz zaman. Çok bilindik bir örnek verelim: g #!/usr/bin/env python #-*. Okulda mantık dersi almı¸ olanlar bu and i¸lecini yakından tanıyor olmalılar." s print "Lütfen tekrar deneyiniz!" Bu programda break deyimi yardımıyla.

Aldı˘ ınız cevaplara göre. 7. Yazdı˘ ınız programda kullanıcıya hız. Aldı˘ ınız cevaplara göre kullanıcıyı yönlendirin." satırı es geçilecek ve döngünün en ba¸ına dönülecektir. s E˘ er kullanıcının girdi˘ i sayıdaki hane üçten fazlaysa ekrana En fazla üç haneli bir sayı girin.7 Bölüm Soruları 1.E˘ er kullanıcı tarafından girilen sayı üç haneli veya daha az haneli bir sayı ise. Mesela “Bilgisayarınızın RAM miktarı nedir?”. Kullanıcının girdi˘ i sayılara göre. E˘ er siz bir Windows kullanıcısıysanız. “Depolardaki program sayısı sizin için önem ta¸ır mı?” s gibi. Örne˘ in ba¸langıç olarak kullanıcıya nereli oldu˘ unu sorabilir. yenilik gibi konug larla ilgili sorular sorun. g s 7. 4. Yazdı˘ ınız bu program kullanıcının verdi˘ i cevapg g lara göre tavır de˘ i¸tirebilmeli. “Hangi da˘ ıtım benim ihtiyaçlarıma uygun?” g g sorusuna cevap veren bir program yazın. g 6. E˘ er siz bir GNU/Linux kullanıcısıysanız. g kullanıcıdan aldı˘ ı cevaplara göre. Alternatif olarak. g g cümlesi yazdırılacaktır. 1-10 arası bütün çift sayıların karesini hesaplayan bir program yazın. Daha önce yazdı˘ ımız basit hesap makinesini. kullanıcıya önerilerde bulunun. Kullanıcıyla sohbet eden bir program yazın. while döngüsü yardımıyla sürekli çalı¸abileg s cek hale getirin. Kullanıcıyla sayı tahmin oyunu oynayan bir Python programı yazın.. gs g s g verece˘ i cevaba göre sohbeti ilerletebilirsiniz. herhangi ba¸ka bir konuda öneride bulunan bir program da yazabilirsiniz. bir adet aritmetik i¸leç (+) ve bir g s s s adet de atama i¸lecinden (=) olu¸uyor. Birle¸ik i¸leçlerde aritmetik i¸leç atama i¸lecinden önce s s s s s s geliyor. Peki sizce i¸leçler neden böyle sıralanmı¸. s g g 5.. Programda sabit bir sayı belirleyin ve kullanıcıdan bu sayıyı tahmin etmesini isteyin. kullanıcıdan g aldı˘ ı cevaplara göre. continue g deyiminin etkisiyle: print "En fazla üç haneli bir sayı girin. Gördü˘ ünüz gibi. . birle¸ik i¸leçler. Mesela a += 1 ifadesinde bu birle¸ik i¸leçlerden s s g s s biri olan +=‘i kullandık. Yani neden a =+ 1 denmemi¸? s s s 3. herhangi ba¸ka bir konuda öneride bulunan bir program da g s yazabilirsiniz. Bunun için kullanıcıya bazı sorular sorun. Alternatif olarak. 2. “Windows 7’ye mi geçmeliyim?” sorusuna cevap g veren bir program yazın. g “yukarı” ve “a¸a˘ ı” gibi ifadelerle kullanıcıyı do˘ ru sayıya yöneltin. uyumluluk. Bu bölümde birle¸ik i¸leçlere de de˘ indik.

Dilerseniz ne demek istedi˘ imizi anlatmak için söyle bir örnek verelim: g ¸ #!/usr/bin/env python # -*.py". Peki ya su? g s ¸ 86 . Biz yukarıdaki programda int() fonksiyonunu kullanarak kullanıcıdan aldı˘ ımız karakg ter dizilerini sayıya dönü¸türmeye çalı¸ıyoruz. sayi g print "Te¸ekkürler. programınızı çalı¸tıran kullanıcıların sebep oldu˘ u g g g ¸ s g ve programınızın çökmesine yol açan kusurlar.BÖLÜM 8 Hata Yakalama Hatalar programcılık deneyiminizin bir parçasıdır. programı yazarken sizin yag paca˘ ınız hatalar de˘ il. Yani g programımız hata yüzünden çöktü˘ ü için i¸lem yarıda kaldı. g s Burada böyle bir hata almamızın nedeni. Ho¸çakalın!" s s Gayet basit bir program bu. Kastetti˘ imiz sey. de˘ il mi? Bu program görünü¸te herhangi bir kusur ta¸ımıyor. Peki ama ya kullanıcı sayı yerine harf girerse ne s olacak? Mesela kullanıcı yukarıdaki programı çalı¸tırıp “a” harfine basarsa ne olur? s Böyle bir durumda programımız söyle bir hata mesajı verir: ¸ Traceback (most recent call last): File "deneme.coding: utf-8 -*sayi = int(raw_input("Lütfen bir sayı girin: ")) print "Girdi˘iniz sayı". kullanıcıdan sayı bekledi˘ imiz halde kullanıcının harf g girmesi. Dilerseniz bunu etkile¸imli kabukta test edelim: s s >>> int("23") 23 Gördü˘ ünüz gibi “23” adlı karakter dizisi rahatlıkla sayıya dönü¸türülebiliyor. line 4. in <module> sayi = int(raw_input("Lütfen bir sayı girin: ")) ValueError: invalid literal for int() with base 10: ’a’ Gördü˘ ünüz gibi. Programcılık hayatınız boyunca hatalarla sürekli muhatab olacaksınız. g Programımız görevini ba¸arıyla yerine getirir. Ancak bizim burada kastetti˘ imiz. Mesela kullanıcı “23” de˘ erini girerse bu karaks s g ter dizisi rahatlıkla sayıya dönü¸türülebilir. E˘ er g s s g kullanıcımız burada bizim istedi˘ imiz gibi bir sayı girerse bu programda hiçbir sorun çıkmaz. ortaya çıkan hata nedeniyle programın son satırı ekrana basılamadı.

line 4. yazılan kodları i¸letecek kullanıcıları her zaman göz önünde bulundurmanız s gerekti˘ ini asla unutmayın. ˙ste biz de bu bölümde bu tür ifadelerin ne I¸ zaman ve nasıl kullanılaca˘ ını anlamaya çalı¸aca˘ ız. Gelin g isterseniz bunun nasıl kullanılaca˘ ına bakalım.. Çünkü kullanıcılar her zaman sizin istedi˘ iniz gibi davranmayabilir..>>> int("a") Traceback (most recent call last): File "<stdin>". except bloklarından yararlanılır. g s g 8. kodlarınızı tanıdı˘ ınız için programınızı nasıl kullanmanız gerekg ti˘ ini biliyorsunuzdur. Yani ne tür bir hata ortaya çıkabilece˘ ini tespit ettik. Bu tür durumlarda s Python gerekli hata mesajını ekrana yazdırarak kullanıcıyı uyaracaktır. kullanıcının yanlı¸ g s s veri giri¸i koskoca bir programın çökmesine veya durmasına yol açabilir. in <module> sayi = int(raw_input("Lütfen bir sayı girin: ")) ValueError: invalid literal for int() with base 10: ’a’ Burada önemli kısım ValueError‘dur. s Python’da hata yakalama i¸lemleri iki adımdan olu¸ur. ama son kullanıcı böyle de˘ ildir. Yani programımız kulI¸ s g ¸ lanıcıdan aldı˘ ı “a” harfini sayıya dönü¸türmeye çalı¸ıyor ve tabii ki ba¸arısız oluyor. sayi g print "Te¸ekkürler. Daha sonra bu hata meydana geldi˘ inde ne yapılaca˘ ına karar verilir. g s s s Bir kod yazarken. g g Yukarıdaki kodun. Hatayı yakalarken bu ifade i¸imize yarayacak... Önce ne tür bir hata ortaya çıkabilece˘ i s s g tespit edilir. sayı girin!” gibi bir uyarı mesajı gösterebiliriz..1 try. kullanıcının sayı yerine harf s g g girmesi durumunda hata veriyordu.py". Python’da hata yakalamak için try.. Simdi hata mesajına tekrar bakalım: ¸ Traceback (most recent call last): File "deneme. Böylesi durumlar g s için Python’da try. except.. ama tabii ki Python’un sundu˘ u karma¸ık hata mesajlarını kullanıcının anlamasını bekleyemeyiz. “Lütfen harf de˘ il.coding: utf-8 -*sayi = int(raw_input("Lütfen bir sayı girin: ")) print "Girdi˘iniz sayı". kullanıcı sayı yerine harf girerse ValueError denen bir hata meydana geliyormu¸.. g Buna göre. O örnek. Program çalı¸tırılırken kullanıcıların ne gibi hatalar yapabilecekg s lerini kestirmeye çalı¸ın. in <module> ValueError: invalid literal for int() with base 10: ’a’ ˙ste bizim programımızın yapmaya çalı¸tı˘ ı sey de tam olarak budur. line 1. Yukarıdaki g g örnekte biz birinci adımı uyguladık. Kodlarımızın ilk hali söyleydi: s ¸ #!/usr/bin/env python # -*. g Giri¸ bölümünde verdi˘ imiz örne˘ i hatırlıyorsunuz. s Simdi de böyle bir hata ortaya çıkarsa ne yapaca˘ ımıza karar vermemiz gerekiyor.. g Dilerseniz bu dediklerimizi somutla¸tıralım. Simdi suna bakın: g ¸ ¸ . Dedi˘ imiz gibi. çok uzun bir programın parçası oldu˘ unu dü¸ünürsek.. Ho¸çakalın!" s s Bu tarz bir kodlamanın hata verece˘ ini biliyoruz. except ifadeleri kullanılır. Mesela ¸ g öyle bir durumda kullanıcıya. s g Siz programın yazarı olarak.

line 7.coding: utf-8 -*s ilk = int(raw_input("Bölme i¸lemi için ilk sayıyı girin: ")) ikinci = int(raw_input("¸imdi de ikinci sayıyı girin: ")) S try: sonuc = float(ilk) / ikinci print sonuc . Ho¸çakalın!" s s Burada. Buna göre.#!/usr/bin/env python # -*. Yani kuls s s lanıcı do˘ ru olarak sayı da girse. hata verece˘ ini bildi˘ imiz kodları bir try. Buna göre alaca˘ ımız hatanın türü ZeroDivisionError. Simdi söyle bir program yazdı˘ ımızı dü¸ünün: g s ¸ ¸ g s #!/usr/bin/env python # -*. g g Son olarak da hata durumunda kullanıcıya gösterece˘ imiz mesajı yazdık. Dikkat s ederseniz print "Te¸ekkürler. sayi g except ValueError: print "Lütfen harf de˘il. Kodlarımızı yazıyoruz: #!/usr/bin/env python # -*. bekledi˘ imiz hata türü ValueError.py". yanlı¸lıkla sayı yerine harf de girse programımımız yapması g s gereken i¸lemleri tamamlayıp yoluna devam edebiliyor. Hatırlarsanız bir sayıyı 0’a bölmenin hata oldu˘ unu söylemi¸tik. ne tür bir hata bekledi˘ imizi belirttik.coding: utf-8 -*try: sayi = int(raw_input("Lütfen bir sayı girin: ")) print "Girdi˘iniz sayı".. aksine çalı¸maya devam edecektir. Ardından bir except blo˘ u g g g g açarak. sayı girin!" g print "Te¸ekkürler. Ho¸çakalın!" satırı her ko¸ulda ekrana basılıyor. Simdi g g ¸ de böyle bir hata durumunda ne yapaca˘ ımıza karar vermemiz gerekiyor.coding: utf-8 -*ilk = int(raw_input("Bölme i¸lemi için ilk sayıyı girin: ")) s ikinci = int(raw_input("¸imdi de ikinci sayıyı girin: ")) S sonuc = float(ilk) / ikinci print sonuc E˘ er burada kullanıcı ikinci sayıya 0 cevabı verirse programımız söyle bir hata mesajı verip g ¸ çökecektir: Traceback (most recent call last): File "deneme. s Konuyu daha iyi anlayabilmek için bir örnek daha verelim. in <module> sonuc = float(ilk) / ikinci ZeroDivisionError: float division Böyle bir durumda hata alaca˘ ımızı bildi˘ imize göre ilk adım olarak ne tür bir hata mesajı g g alabilece˘ imizi tespit ediyoruz. Artık kullanıcılarımız g sayı yerine harfe basarsa programımız çökmeyecek.. blo˘ u içine aldık. ˙ g Isterseniz yine kullanıcıya bir uyarı mesajı gösterelim.

.. ValueError): print "Girdi˘iniz veri hatalı!" g Hata türlerini nasıl grupladı˘ ımıza dikkat edin... Ardından g g g g da verilecek hataları birer except blo˘ u içinde teker teker yakaladık. Böyle bir durumda alınacak hatanın ZeroDivisionError oldu˘ unu da bildi˘ imiz g g için except blo˘ unu da buna göre yazdık. Hataları birbirinden virgülle ayırıp parantez g . line 4.except ZeroDivisionError: print "Lütfen sayıyı 0’a bölmeye çalı¸mayın!" s Bir önceki örnekte de yaptı˘ ımız gibi burada da hata verece˘ ini bildi˘ imiz kodları try. g Su kodları dikkatlice inceleyin: ¸ #!/usr/bin/env python # -*.coding: utf-8 -*try: ilk = int(raw_input("Bölme i¸lemi için ilk sayıyı girin: ")) s ikinci = int(raw_input("¸imdi de ikinci sayıyı girin: ")) S sonuc = float(ilk) / ikinci print sonuc except ZeroDivisionError: print "Lütfen sayıyı 0’a bölmeye çalı¸mayın!" s except ValueError: print "Lütfen harf de˘il.. E˘ er yukarıdaki kodları çalı¸tıran bir kullanıcı sayı yerine harf girerse söyle g s ¸ bir hatayla kar¸ıla¸ır: s s Traceback (most recent call last): File "deneme. E˘ er her iki hata için de g g aynı mesajı göstermek isterseniz söyle bir sey yazabilirsiniz: ¸ ¸ #!/usr/bin/env python # -*. Biz yukarıdaki kodlarda.. kullanıcının bir s sayıyı 0’a bölmesi ihtimaline kar¸ı ZeroDivisionError hatasını yakaladık. in <module> ilk = int(raw_input("Bölme i¸lemi için ilk sayıyı girin: ")) s ValueError: invalid literal for int() with base 10: ’a’ Buradan anladı˘ ımıza göre hata veren satır su: ilk = int(raw_input("Bölme i¸lemi için g ¸ s ilk sayıyı girin: ")) Dolayısıyla bu satırı da try.. blo˘ u içine aldık. Son olarak da kullanıcıya gösterilecek uyarıyı beg lirledik. blo˘ u içine almamız gerekiyor. blo˘ u g g g g içine aldık. Böylece programımız hata kar¸ısında çökmeden yoluna devam edebildi. sayı girin!" g Gördü˘ ünüz gibi hata verece˘ ini bildi˘ imiz kodların hepsini bir try.py".. Ama ya kullanıcı s sayı yerine harf girerse ne olacak? ZeroDivisionError ile birlikte ValueError‘u da yakalamamız gerekiyor.coding: utf-8 -*try: ilk = int(raw_input("Bölme i¸lemi için ilk sayıyı girin: ")) s ikinci = int(raw_input("¸imdi de ikinci sayıyı girin: ")) S sonuc = float(ilk) / ikinci print sonuc except (ZeroDivisionError. s Burada önemli bir problem dikkatinizi çekmi¸ olmalı.

s s g ¸ s ˙ Isterseniz simdi bu konuyla ba˘ lantılı oldu˘ unu dü¸ündü˘ ümüz. Programın g g gidi¸atına göre..2 pass Deyimi pass kelimesi ˙ Ingilizce’de “geçmek” anlamına gelir. pass deyimini kodlarınız henüz taslak a¸amasında s s oldu˘ u zaman da kullanabilirsiniz. ValueError): pass Böylece programınız ZeroDivisionError veya ValueError ile kar¸ıla¸tı˘ ında sessizce yols s g una devam edecek. oraya bir pass g g s g koyarak durumu simdilik geçi¸tiriyorsunuz...: böyle yap elif .: s ¸öyle yap else: pass Burada henüz else blo˘ unda ne yapılaca˘ ına karar vermemi¸ oldu˘ unuz için. Böyle bir durumda pass deyiminden yararlanabilirsiniz. 8. Program son haline gelene kadar oraya bir seyler ¸ s ¸ yazmı¸ olaca˘ ız. Yazdı˘ ınız programlarda bunun iyi bir sey mi yoksa kötü bir sey mi oldu˘ una g ¸ ¸ g programcı olarak sizin karar vermeniz gerekiyor.coding: utf-8 -*try: ilk = int(raw_input("Bölme i¸lemi için ilk sayıyı girin: ")) s ikinci = int(raw_input("¸imdi de ikinci sayıyı girin: ")) S sonuc = float(ilk) / ikinci print sonuc except (ZeroDivisionError. bu hatayı g s pass ile geçi¸tirmek yerine. hata yakalama konusuna iyi bir giri¸ yapmamızı sa˘ ladı... s g Sözün özü.. pass deyimlerini. ˙ s g Ilerde çok daha farklı hata türleriyle kar¸ıla¸tı˘ ınızda bu konuyu çok daha net bir sekilde içinize sindirmi¸ olacaksınız. Bu deyimin Python programlama dilindeki anlamı da buna çok yakındır. bir noktada yapmanız gereken bir i¸lem var. Bu deyimi Pyhon’da “görmezden gel. s Yukarıda anlatılan durumların dı¸ında. diyelim ki bir kod yazıyorsunuz. ama e˘ er verilen hata önemli bir g s g hataysa ve kullanıcının bu durumdan haberdar olması gerekti˘ ini dü¸ünüyorsanız... önemli bir deyim olan pass‘i ¸ g g s g inceleyelim. Böylece programımız her iki hata türü için de aynı uyarıyı gösterecek kullanıcıya..içine alıyoruz. Bu bölüm. ama henüz ne yapaca˘ ınıza s s g karar vermediniz. E˘ er bir hatanın kullanıcıya gösterilmesinin g gerekmedi˘ ini dü¸ünüyorsanız yukarıdaki kodları kullanın. Örne˘ in. böylece kullanıcımız programda ters giden bir seyler oldu˘ unu dahi an¸ g lamayacaktır. Mesela bir hata ile kar¸ıla¸an programınızın hiçbir sey yapmadan g s s ¸ yoluna devam etmesini isterseniz bu deyimi kullanabilirsiniz: #!/usr/bin/env python # -*. kullanıcıya hatayla ilgili makul ve anla¸ılır bir mesaj göstermeyi s s dü¸ünebilirsiniz. hiçbir sey yapma” ¸ anlamında kullanaca˘ ız. herhangi bir i¸lem yapılmasının gerekli olmadı˘ ı durumlar için s g .. Mesela birtakım if deyimleri yazmayı dü¸ünüyor olun: s if .

ortaya çıkan bütün hatalar yakalanacak.3 Bölüm Soruları 1. s 3. bu pass deyiminin göründü˘ ünden daha s g g faydalı bir araç oldu˘ unu anlayacaksınız. ˙ bakı¸ta gayet güzel bir özellik gibi görünen bu durumun sizce ne gibi Ilk s sakıncaları olabilir? . Python’da söyle bir sey yazmak mümkündür: ¸ ¸ try: bir takım i¸ler s except: print "bir hata olu¸tu!" s Burada dikkat ederseniz herhangi bir hata türü belirtmedik. g 8. Bu tür bir kod yazımında. kullanıcının yapabilece˘ i olası hataları önceden kestirip g g g bunları yakalamazsanız ne gibi sonuçlarla kar¸ıla¸ırsınız? s s 2. E˘ er yazdı˘ ınız bir programda.kullanıyoruz. programı kullanan ki¸ilerin yapabilece˘ i g s g hatalara kar¸ı önlem alarak yeniden yazın. böylece kullanıcıya bütün hatalar için tek bir mesaj gösterilebilecektir. Daha önce yazdı˘ ımız basit hesap makinesini. ˙ Ilerde i¸e yarar programlar yazdı˘ ınızda.

˙ g Ikincisi. Sözlük (dictionary) 4. Böylece soyut kavramlarla kafa karı¸tırmadan ilerlememiz mümkün olabilir. Küme (set) Bu veri tipleri arasında özellikle listeler. Gördü˘ ünüz gibi. ardından da kö¸eli parantezler içinde bu s s listenin ö˘ elerini belirlemeliyiz. Yani Python’da bir liste olu¸turmak için söyle bir g s g s ¸ yol izleyece˘ iz: g >>> liste = [] Böylece ilk listemizi ba¸arıyla olu¸turmu¸ olduk. listemizi olu¸turan s ö˘ eleri kö¸eli parantezler içinde yazaca˘ ız. Python’da herhangi bir s liste olu¸turmak için önce listemize bir ad vermeli. s Zaten ilk liste örne˘ ini görür görmez bu veri tipinin nasıl bir sey oldu˘ unu hemen anlayacakg ¸ g sınız. 23] 92 . O yüzden ilk önce listeleri inceleyece˘ iz. Yani listemiz su anda bo¸.1 Liste Olu¸ turmak s Listeleri kullanabilmek için öncelikle bir liste olu¸turmamız gerekiyor. Gelin g ¸ s isterseniz ö˘ eleri de olan bir liste olu¸turmayı deneyelim: g s >>> liste = ["Hale". 9. 12. Yani liste olu¸tururken dikkat etmemiz gereken iki temel nokta g s var: Birincisi tıpkı de˘ i¸kenlere isim veriyormu¸uz gibi listelerimize de isim verece˘ iz. Python’un en güçlü oldu˘ u alanlardan biri olması g bakımından ayrı bir yere ve öneme sahiptir. Tabii gs s g listelerimizi isimlendirirken Türkçe karakterler kullanmayaca˘ ız. Burada ins g celeyece˘ imiz veri tipleri sırasıyla sunlardır: g ¸ 1. "Lale". bir liste olu¸turmak son s s s g s derece kolay. Burada listemizin henüz herhangi bir ö˘ esi yok. Demet (tuple) 3. g Dilerseniz listenin ne demek oldu˘ unu anlatmaya çalı¸makla vakit kaybetmek yerine do˘ rudan g s g konuya girelim. "Jale". Liste (list) 2. Yapaca˘ ımız tek sey liste için bir ad belirlemek ve liste ö˘ elerini kö¸eli parantez g ¸ g s içine almak.BÖLÜM 9 Listeler Bu bölümden itibaren Python’daki önemli veri tiplerini incelemeye ba¸layaca˘ ız.

Diyelim ki elinizde birkaç tane karakter dizisi var ve siz bunları bir liste s haline getirmek istiyorsunuz. listeleri parantez i¸aretlerinden s s ayırt eder. liste ö˘ elerini olu¸tug g s rurken kö¸eli parantezler kullanıyor olmamız. ¸ ˘ 9. Su s s ¸ örne˘ e bir bakalım: g >>> meyve = "elma" >>> list(meyve) [’e’. g g s g Böylece Python’da bir listenin nasıl olu¸turulaca˘ ını ö˘ renmi¸ olduk. ˙ g s s Isterseniz olu¸turdu˘ us g muz seyin bir liste oldu˘ unu teyit edelim: ¸ g >>> type(liste) <type ’list’> Tahmin edece˘ iniz gibi.2 Liste Ögelerine Eri¸ mek s Yukarıdaki örneklerden de gördü˘ ümüz gibi Python’daki listeler tıpkı birer de˘ i¸ken gibi tanımg gs lanıyor: . Gördü˘ ünüz gibi. eksiksiz bir liste olu¸turmu¸ olduk. ’a’] Gördü˘ ünüz gibi. Liste içindeki karakter dizilerini her zag g g manki gibi tırnak içinde belirtmeyi unutmuyoruz. Tabii ki sayıları yazarken bu tırnak i¸aretlerini s kullanmayaca˘ ız. c)) list() fonksiyonunda parantez içine sadece tek bir ö˘ e yazabiliriz. Çünkü Python. bu list() fonksiyonunu kullanarak karakter dizisi içindeki karakterlerden bir g liste olu¸turabiliyoruz.Böylece içinde ö˘ e de barındıran. s s Daha önce de söyledi˘ imiz gibi.coding: utf-8 -*a = "elma" b = "armut" c = "kiraz" print list((a. Demek ki gerçekten de bir liste g olu¸turmu¸uz. olu¸turdu˘ umuz bu liste adlı listenin ö˘ eleri ekrana yazdırılacaktır. Böyle bir durumda bu fonksiyon i¸inize yarayabilir: s #!/usr/bin/env python # -*. b. ’m’. g s g g Python’da liste olu¸turmanın bir ba¸ka yolu da list() adlı bir fonksiyondan yararlanmaktır. liste içine ö˘ e eklemek de zor de˘ il. Simdi isterseniz Python s g g s ¸ listelerini biraz daha ayrıntılı bir sekilde inceleyelim. burada dikkat etmemiz gereken nokta. ’l’. list kelimesi liste anlamına geliyor. Simdi komut satırında: g ¸ s ¸ >>> print liste komutunu verdi˘ imizde. Böylece Python bu g ö˘ eleri tek bir ö˘ eymi¸ gibi algılayacak ve size istedi˘ iniz çıktıyı verecektir... g Olması gerekti˘ i sekilde listemizi olu¸turduk. E˘ er birden fazla ö˘ e kulg g g lanmak istiyorsanız bu ö˘ eleri ayrı bir parantez içinde belirtmeniz gerekir.

’Mandriva’. "Arch". formülümüz söyle: g ¸ >>> liste_adı[ö˘e_sırası] g Yalnız burada dikkat ettiyseniz print dagitimlar[1] komutu Debian çıktısı verdi. "Nexenta". ’GNewSense’. ’PCLinuxOs’. "Ahmet".. "GNewSense". "Sabayon". "Puppy". "Mehmet". ö˘ eleri birbirinden virgül ile ayırıyoruz: g g g >>> spor = ["futbol". "CentOS". "Elive". ’Gentoo’. ’Mint’. "SuSe". ’Fedora’. "Slackware". ’Ututo’. ’CentOS’. "Truva". "tenis". dagitimlar = ["Ubuntu". ’Pardus’. Bu arada uzun bir listeyi nasıl böldü˘ ümüze ve alt g s s g satıra geçti˘ imize dikkat edin. ’Mepis’.. ’RedHat’. "Mepis". Python’da liste g g ö˘ eleri 0’dan ba¸lar. "golf"] Peki bir listedeki ö˘ e sayısını nasıl ö˘ renebiliriz? Elbette elle sayarak de˘ il. "PCLinuxOs". "Gelecek". "Mandriva". mesela sadece birinci ö˘ esini almak istersek ne yapaca˘ ız? g g g g Bunun için söyle bir yöntemimiz var: ¸ >>> print dagitimlar[1] Debian Gördü˘ ünüz gibi. "Fedora". "Gentoo". "Sidux". ’Arch’. bir önceki bölümde ö˘ rendi˘ imiz len() fonksiyonu g g g g yardımıyla elde edebiliriz: >>> len(dagitimlar) 26 Demek ki listemiz 26 ö˘ eden olu¸uyormu¸.. ’Sidux’. "basketbol".>>> liste = [] Bir liste içine ö˘ e eklemek istedi˘ imiz zaman. ’Vector’] Bu sekilde listenin bütün ö˘ elerini ekrana döktük. . ’SuSe’. ’Knoppix’. ’Truva’.. "Ututo". "RedHat". Dolayısıyla yukarıdaki g s g listede Ubuntu ö˘ esini elde etmek istiyorsak su komutu yazmalıyız: g ¸ >>> print dagitimlar[0] Ubuntu Bu yöntem bize çok daha ilginç seyler yapma imkanı da verir. "Debian". Mesela su listg g g ¸ edeki ö˘ e sayısını elle sayarak bulmak bir Python programcısına hiç yakı¸maz: g s >>> . ’Puppy’. Mesela bu yöntemi kullanarak ¸ bir listenin belli bir aralıktaki ö˘ elerini alabiliriz: g >>> liste = ["Hale". "Vector"] Tanımladı˘ ımız bir listenin ö˘ e sayısını. ’Nexenta’.. ’Debian’. ’Sabayon’. Yani bir listenin ilk ö˘ esinin sırası her zaman 0’dır. "Kezban"] . ’Zenwalk’. "Lale".. "Zenwalk". "Mint". ’Gelecek’. Peki ya biz bu 26 ö˘ eli listenin bütün ¸ g g ö˘ elerini de˘ il de. Halbuki listenin ilk ö˘ esi Ubuntu. ’Elive’.. Bu durum Python listelerinin çok önemli bir özelli˘ idir. "Jale".. ’Slackware’. . "Pardus". "Knoppix". g Bu listeyi ekrana yazdırmak için söyle bir sey yapmamız gerekti˘ ini de biliyoruz: ¸ ¸ g >>> print dagitimlar [’Ubuntu’.

’Kezban’] >>> print liste [’Hale’. Yalnız bu iki listenin birbirinden g g s farklı oldu˘ unu unutmayın. ’Jale’] Gördü˘ ünüz gibi. ’Ahmet’. ’Lale’. Elimiz alı¸sın diye birkaç örnek yapalım bununla ilgili: s >>> print liste[2:5] [’Lale’. ’Kezban’] E˘ er iki nokta üst üste i¸aretinin sa˘ ındaki sayıyı yazmazsak Python oraya listenin son ö˘ esinin g s g g sırasını yazmı¸ız gibi davranacaktır. ’Mehmet’. ’Ahmet’. ’Jale’. ’Lale’. ’Jale’. s E˘ er 0’dan ba¸layarak bir listenin bütün ö˘ elerini almak istersek de söyle bir sey yazabiliriz: g s g ¸ ¸ >>> print liste[:] [’Hale’. sıraya kadar olan ö˘ eleri iki¸er iki¸er atlayarak ekrana s g s s bastık. ’Lale’. ’Ahmet’. Yani bir liste üzerinde yaptı˘ ınız de˘ i¸iklik öteki listeyi etkilemeyeg g gs cektir. g ¸ g E˘ er alaca˘ ınız ilk ö˘ enin sırası 0 ise yukarıdaki komutu söyle de yazabilirsiniz: g g g ¸ >>> print liste[:2] E˘ er iki nokta üst üste i¸aretinin sol tarafındaki sayıyı yazmazsanız Python oraya 0 yazmı¸sınız g s s gibi davranacaktır. ’Kezban’] Son örnekte alaca˘ ımız son ö˘ e listenin de son ö˘ esi. ’Ahmet’. ’Ahmet’. Burada 0’dan ba¸layarak 6. ’Mehmet’. ’Mehmet’] >>> print liste[2:6] [’Lale’.>>> print liste[0:2] [’Hale’. ’Ahmet’. ’Mehmet’] Gördü˘ ünüz gibi. ’Kezban’] Bu yöntem. ’Mehmet’. ’Kezban’] Gördü˘ ünüz gibi. Listelere yukarıdaki gibi eri¸irken üçüncü bir sayı daha verebiliriz: s >>> liste[0:6:2] [’Hale’. üçüncü sayı liste ö˘ elerinin kaçar kaçar atlanarak ekrana basılaca˘ ını gösg g g teriyor. aynı ö˘ elere sahip iki farklı liste olu¸turduk. . O yüzden o komutu söyle de yazabiliriz: g g g ¸ >>> print liste[2:] [’Lale’. ’Mehmet’. ’Mehmet’. ’Lale’. ’Jale’. bir listeyi tamamen kopyalamanın iyi bir yoludur: >>> liste2 = liste[:] >>> print liste2 [’Hale’. bu sekilde listenin birinci ve ikinci ö˘ elerini ayrı bir liste olarak alabiliyoruz.

Listelerle birlikte hangi metotları kullanabilece˘ imizi ö˘ reng g mek için dir() adlı bir fonksiyondan yararlanabiliriz. ’__delitem__’. ’__ne__’. Bu i¸i Python’da bazı parçacıklar (ya da daha teknik bir dille söylemek gerekirse g s “metotlar”. ’__len__’. ’__mul__’. ’__ge__’. ’__class__’. ’__getitem__’. ’count’. ’__contains__’. ’__setattr__’. ’__doc__’. ’Lale’. Python’da bir veri tipinin özelliklerini de˘ i¸tirmemizi veya sorgulamamızı sa˘ layan gs g oldukça yetenekli parçacıklardır. ’__delslice__’. ’__eq__’. ’__getattribute__’. ’__delattr__’.) yardımıyla yapıyoruz. 9. ’__subclasshook__’. Bu fonksiyonu listeler üzerine su sekilde ¸ ¸ uyguluyoruz: >>> liste = [] >>> dir(liste) Dilerseniz bo¸ bir liste tanımlamakla hiç u˘ ra¸madan.. ’__gt__’. ’Lale’. ’__reversed__’. ’Mehmet’] Üçüncü sayı eksi de˘ erli de olabilir. ’__hash__’. ’__le__’. ’__iter__’. s Bu komutlardan herhangi birini verdi˘ imizde söyle bir cevap alırız: g ¸ [’__add__’. ’extend’. ’Jale’. ’Ahmet’. ’Ahmet’. listelerin ayırt edici özelli˘ i olan kö¸eli s g s g s parantezleri de kullanabilirsiniz: >>> dir([]) Hatta listelerin Python’daki adı olan list kelimesini dahi kullanabilirsiniz: >>> dir(list) Tercih tamamen size kalmı¸. ’__new__’. ’append’.. Python’daki listeleri yönetebilmek için “metot” denen bazı araçlardan yararg lanmamız gerekiyor. ’__reduce_ex__’. O zaman liste ö˘ eleri geriye do˘ ru sıralanacaktır: g g g >>> liste[::-2] [’Kezban’. ’__lt__’. ’__imul__’. listeden ö˘ e çıkarma gibi i¸lemleri nasıl yapaca˘ ımızı g g s g ö˘ renebiliriz.Yukarıdaki komutu söyle de yazabilirdik: ¸ >>> liste[::2] [’Hale’. ’Jale’] Bütün ö˘ eleri tersten sıralamak istersek söyle bir sey yazabiliriz: g ¸ ¸ >>> liste[::-1] [’Kezban’. ’__format__’. ’__repr__’. ’__sizeof__’. ’__setitem__’. ’__iadd__’. ’__init__’. ’Mehmet’. ˙ Isterseniz gelin simdi bu metotların neler oldu˘ una ve ¸ g nasıl kullanıldıklarına bakalım.3 Liste Metotları Dedi˘ imiz gibi. ’__reduce__’.. ’__rmul__’. yani listeye ö˘ e ekleme. ’__getslice__’. ’__str__’. .. ’__setslice__’. ’Hale’] Python’da liste olu¸turmayı ve bu listenin ö˘ elerine eri¸meyi ö˘ rendi˘ imize göre simdi listeleri s g s g g ¸ yönetmeyi. Peki nedir bu metot denen sey? ¸ Metotlar.

Python liste çıktılarında Türkçe g g . ’Perl’. ’insert’. ’pop’.metot() Alı¸tırma olması için bir örnek daha yapalım: s >>> alisveris_listesi = [] >>> alisveris_listesi. ’remove’.1 Listeye Öge Eklemek Python’da herhangi bir listeye ö˘ e eklemek için append() metodundan yararlanabiliriz.append("C++") Simdi listeyi ekrana yazdırdı˘ ımızda ö˘ eler arasında C++‘ı da görece˘ iz: ¸ g g g >>> print programlama_dilleri [’Python’. ’C++’] Burada append() metodunu nasıl kullandı˘ ımıza dikkat edin. g s g Burada dikkatimizi çeken ba¸ka bir sey daha var. Yani sunlar: s s s ¸ append count extend index insert pop remove reverse sort Biz bu bölümde bu metotları i¸levlerine göre gruplayarak inceleyece˘ iz. Öncelikle bir liste olu¸turalım: s >>> programlama_dilleri = ["Python". Simdi bu listeye C++ ö˘ esini s ¸ g ekleyelim: >>> programlama_dilleri. Formülümüz söyle: g ¸ liste_adı. append() metoduyla bo¸ bir listeye de ö˘ e ekleyebiliyoruz.’index’. ˘ 9. ˙ s g Isterseniz hemen yola koyulalım. "Ruby".append("so˘an") g >>> print alisveris_listesi [’so\xa7an’] Gördü˘ ünüz gibi. Bu metodun yaptı˘ ı sey de tam olarak budur g ¸ zaten.3. Listeyi ekrana yazdırdı˘ ımızda Türkçe karaks ¸ g ter içeren so˘ an ö˘ esi düzgün görünmüyor. "Perl"] Böylece elimizde programlama_dilleri adlı bir liste olmu¸ oldu. Bu durum normal. Burada bizi ilgilendiren metotlar I¸ g g ba¸ında ve sonunda “__” i¸aretini ta¸ımayanlar. ’reverse’. append g kelimesi Türkçe’de “eklemek” anlamına gelir. ’sort’ ] ˙ste bu gördü˘ ümüz çıktıdaki ö˘ eler listelerin metotları oluyor. ’Ruby’.

g s Demek ki bu metodu kullanarak bir listeye sadece tek bir ö˘ e ekleyebiliyoruz.. Biz burada iki ö˘ e vermi¸iz. Bu sırada da Türkçe g karakterler. in <module> TypeError: append() takes exactly one argument (2 given) Burada Python bize bir hata mesajı verir.. ancak istedi˘ iniz tam olarak bu olmayabilir: ¸ ¸ g >>> iller.. ’Mersin’]] Burada iç içe geçmi¸ iki tane liste görüyoruz. Simdi suna bakalım: ¸ ¸ >>> print iller [[’Adana’. g g ¸ Peki bir listeye birden fazla ö˘ e eklemek istersek elimizde hiç bir imkan yok mu? Elbette var. g metodu ile söyle bir sey yapabilirsiniz. so˘an g sarımsak çilek üzüm Gördü˘ ünüz gibi Python’da çareler tükenmiyor. “Mersin”]) ve do˘ rudan bu s g listeyi iller adlı listeye ekledik. g Mesela for döngülerinden yararlanabilirsiniz: . print i .karakterleri gösteremez.append("Adana". "çilek".. "sarımsak". Ama liste içindeki Türkçe karakterli ö˘ eleri düzgün göstermenin bir g yolu var: >>> for oge in alisveris_listesi: .. so˘an g for döngüsünden yararlanarak liste ö˘ elerini tek tek ekrana dökebiliriz. "Mersin") Traceback (most recent call last): File "<stdin>". O yüzden her zaman istedi˘ iniz sey bu olmayabilir. g append() metodunu kullanarak bir listeye tek tek ö˘ e ekleyebiliyoruz. çünkü append() metodu yalnızca tek bir ö˘ e kabul g eder. Bir örnek daha yapalım: g >>> alisveris_listesi = ["so˘an".. olması gerekti˘ i gibi görünecektir. print oge .. line 1. "Mersin"]) append() Burada append() metodu içinde bir liste olu¸turduk ([”Adana”. ’\x87ilek’. Peki aynı metodu kullag narak listeye birden fazla ö˘ e ekleyebilir miyiz? Deneyelim: g >>> iller = [] >>> iller. Demek ki yukarıdaki sekilde ö˘ e ekledi˘ imizde s ¸ g g Python bunu yine tek bir ö˘ e olarak ekliyor..append(["Adana".. "üzüm"] g >>> print alisveris_listesi [’so\xa7an’.. ’\x81z\x81m’] >>> for i in alisveris_listesi: . ’sar\x8dmsak’.

Daha do˘ rusu aldı˘ ınız g g g sonuç bekledi˘ iniz gibi olmayabilir. ’L’. ’Mersin’] extend kelimesi Türkçe’de “geni¸letmek. Örne˘ in: g s g g . extend metodu “GNU/Linux” içindeki her bir karakteri tek tek listeye ekledi. ’L’. ’U’.. O metodun adı extend. Bu metodu kullas narak bir ö˘ eyi bir listenin belli bir sırasına yerle¸tirece˘ iz. os. iller.append(harf) >>> print os [’Windows’. hem de extend() metotları ö˘ eyi hep listenin en sonuna ekg liyor. Bunun için ba¸ka bir metottan yararlanaca˘ ız. "Mersin"] >>> iller = [] >>> for i in lst: .. I¸ g s Kelime olarak insert.extend(["Adana". ’G’. extend metodunu kullanarak bir listeye tek bir ö˘ e ekleyemezsiniz. ’/’.>>> lst = ["Adana". ’n’. Türkçe’de “yerle¸tirmek. g s g Yukarıdaki örne˘ i extend metodunu kullanarak yazalım: g >>> iller = [] >>> iller. ’i’. g g s ˙ste bunun için kullanabilece˘ imiz ba¸ka bir metot daha var Python’da: insert() metodu. Ama biz yazdı˘ ımız programlarda bazen ö˘ eyi belli bir sıraya yerle¸tirmek isteyebiliriz.append(i) >>> print iller [’Adana’. ’x’] Dikkat ederseniz hem append()..extend("GNU/Linux") >>> print os [’Windows’. ’N’. g Aynı etkiyi append() metodu ile elde etmek istersek yine for döngüsünden yararlanabiliriz: >>> os = ["Windows". anlamına s uygun olarak bir listeyi ba¸ka bir liste ile geni¸letir. sokmak” gibi anlamlara gelir. ’U’.. ’x’] Gördü˘ ünüz gibi. ’u’. "Mac"] >>> os. ’N’. ’/’.. ’Mac’. Ama Python bize aynı seyi çok daha temiz bir sekilde g s ¸ ¸ yapma imkanı da sa˘ lar. "Mac"] >>> for harf in "GNU/Linux": . ’i’. ’Mac’. Yani bir listenin ö˘ elerini ba¸ka bir listeye s s g s tek tek ekler.. uzatmak” gibi anlamlara gelir. ’n’. ’u’. "Mersin"]) >>> print iller [’Adana’. Bu metot. ’G’. Mesela: g >>> os = ["Windows". ’Mersin’] Böylece istedi˘ imizi elde etmi¸ olduk.

’K\x8d\x9f’] Gördü˘ ünüz gibi. "Salı". g s ˘ 9. "Kı¸"] I s >>> mevsimler. ’Mehmet’.. s >>> mevsimler = ["˙lkbahar".remove("˙lkbahar") I >>> print mevsimler [’Yaz’. "Yaz". "Salih"] >>> lst. ’Ahmet’. Burada ö˘ eyi listeden çıkarabilmek için ö˘ enin adını yazmamız gerekti. ’Sonbahar’. "Cuma".. "Ali") >>> print lst [’Ali’.3.2 Listeden Öge Silmek Bir önceki bölümde gördü˘ ümüz metotlar yardımıyla listeye ö˘ e ekleyebiliyoruz. ’Salih’] Burada insert() metodunu nasıl kullandı˘ ımıza dikkat edin. Mesela remove() metodu.. Burada biz g g listenin sıfırıncı. Metodun parantezi içindeki ilk sayı. in <module> NameError: name ’mevsimler’ is not defined remove() metodu ve del deyimi dı¸ında. mevsimler adlı listenin ilk ö˘ esini siler.>>> lst = ["Ahmet". ö˘ eyi çıkarmak istiyoruz diyelim. g silebilirsiniz: >>> del mevsimler Aynı deyimle listenin tamamını da Böylece mevsimler adlı listeyi tamamen silmi¸ olduk: s >>> print mevsimler Traceback (most recent call last): File "<stdin>". line 1. "Cumartesi". "Per¸embe". "Çar¸amba". listelerden ö˘ e silmenin bir ba¸ka yolu daha vardır: s g s pop() metodu. Peki ya listeg g den ö˘ e silmek istersek ne yapaca˘ ız? g g Bu i¸lem için de bazı metotlarımız var.insert(0. yani ilk sırasına Ali adlı bir ö˘ e yerle¸tirdik. "Mehmet". Peki g g ya biz ö˘ eyi adına göre de˘ il de listedeki sırasına göre çıkarmak istersek ne yapaca˘ ız? Yani g g g mesela listedeki 1. "Pazar"] >>> gunler.pop() ’Pazar’ . g yeni ö˘ enin yerle¸tirilece˘ i konumu gösteriyor. g del adlı özel bir deyimi kullanarak bu amacımızı gerçekle¸tirebiliriz: s >>> del mevsimler[0] Bu komut.. s s . "Sonbahar". remove() metodunu kullanarak liste içindeki istedi˘ imiz bir ö˘ eyi listeden g g g çıkarabiliyoruz. ˙ g s g Ikinci ö˘ enin ne oldu˘ u ise belli. >>> gunler = ["Pazartesi".

˙ g Isterseniz bu metodun kaçıncı sıradaki ö˘ eyi g silece˘ ini belirleyebilirsiniz: g >>> gunler.sort() >>> print isimler [’Ahmet’. ’Mehmet’. "Fırat"] s s >>> isimler. "Selami". 6. ’\x99kke\x9f’] ˙ Isimlerde Türkçe karakter oldu˘ u için alfabe sırasına dizme i¸lemi ba¸arısız oldu.pop() metodunun öteki metotlardan farkı. liste ö˘ elerini ters çevirebiliriz. ’Doruk’. 8. 0] Liste ö˘ elerini alfabe sırasına dizmek için ise sort() adlı bir metottan yararlanaca˘ ız: g g >>> isimler = ["Ahmet". 7. 3. 4. g ¸ g ˙ Ikincisi. "Mehmet". 1. 2. g Liste ö˘ elerini ters çevirmek için reverse() adlı bir metottan yararlanaca˘ ız: g g >>> sayilar = range(10) >>> print sayilar [0.3 Liste Ögelerini Sıralamak Python’da liste ö˘ elerini iki sekilde sıralayabiliriz: Birincisi. Yalnız bu metot Türkçe karakter g içeren kelimelerde sorun yaratabilir: >>> isimler = ["Kür¸at".3. Bu metot g g bir listedeki en son ö˘ eyi siler ve ekrana basar. 5. 6. 1. liste ö˘ elerini alfabe sırasına dizebiliriz. ’K\x81r\x9fat’.coding: utf-8 -*import locale . ö˘ eyi silip ekrana basacaktır. ’Ege’. ’\x80etin’. "Doruk". "Çetin".pop(0) ’Pazartesi’ Bu komut listedeki 0. "Ökke¸". g s s Bu sorunun üstesinden gelmek için söyle bir kod yazabilirsiniz: ¸ #!/usr/bin/env python # -*. g ˘ 9. 7. ’Selami’] Gördü˘ ünüz gibi liste içindeki isimler alfabe sırasına dizildi.sort() >>> print isimler [’F\x8drat’. 9] >>> sayilar. 2. 8.reverse() >>> print sayilar [9. 4. "Ege"] >>> isimler. 3. 5. sildi˘ i ö˘ eyi bir de ekrana basmasıdır.

"erik". "çilek". Su örne˘ e bakalım: g ¸ g >>> meyveler = ["elma".3.index("elma"..index("çilek") 1 E˘ er bir liste içinde aynı ö˘ eden birden fazla sayıda varsa. "Çetin". "karpuz". "su". 3) . "elma"] >>> meyveler. bu metot yalnızca ilk rastladı˘ ı g g g ö˘ eyi bulacaktır.index("elma". "kavun".setlocale(locale. "su".index("elma") 0 Gördü˘ ünüz gibi.sort(key = locale. "elma". Mesela: g >>> meyveler = ["elma". Ancak bu metodun liste içinde geçen aynı ö˘ elerin g g tamamını bulmasını sa˘ lamak da mümkün. "elma".locale. 1) 2 >>> meyveler. parantez içinde ikinci bir de˘ er daha alır. "kavun"] >>> lst.. .index("elma") 0 >>> meyveler. Peki ama nasıl? g index() metodu. elma ö˘ esi liste içinde birkaç farklı konumda geçti˘ i halde index() metodu g g g yalnızca 0. 2) 2 >>> meyveler.index("elma". konumdaki ö˘ eyi buldu. Bu metot bir ö˘ enin liste içinde hangi sırada yer aldı˘ ını bildirir: g g >>> lst = ["erik".LC_ALL. "çilek". Benim amacım sadece sort() metoduyla Türkçe ¸ g karakter içeren kelimelerin de alfabe sırasına dizilebilece˘ ini göstermek.. "erik". "karpuz".4 Liste Ögelerinin Sırasını Bulmak Python’da bir liste içindeki ö˘ elerin sırasını bulmak için index() adlı bir metottan yararlanıyg oruz. Yukarıdaki kodlarda g gördü˘ ümüz her seyi birkaç bölüm sonra ö˘ renmi¸ olaca˘ ız. "elma"] >>> meyveler. "kavun". "Ökke¸". "") isimler = ["Kür¸at".strxfrm) for i in isimler: print i Bu kodlardaki pek çok seyi henüz ö˘ renmedik. "karpuz".. "çilek". "Fırat"] s s isimler. g ¸ g s g ˘ 9. .

E˘ er bu de˘ eri 3 yaparsak. bir ö˘ eyi liste içinde hangi g g g konumdan itibaren aramaya ba¸layaca˘ ını gösteriyor.. 0. sıradan ba¸layacak ve g g s böylece.7 Burada parantez içine yazdı˘ ımız ikinci de˘ er. while sira < len(meyveler): #Bu try. aranan ö˘enin listede bulundu˘u g g #konumları tutuyor. "karpuz". Python siz oraya 0 yazmı¸sınız gibi davranacak g s ve aramaya 0. if not oge in liste: liste. E˘ er bu de˘ er 1 yaparsanız Python listeyi taramaya 1. bloklarını kaldırın. blo˘unun görevini anlamak g #için "elma" yerine ba¸ka bir ö˘e koyun ve try. Bunun öntanımlı de˘ eri 0’dır.. "kavun". "su". index() metodunun. "erik". Böylece index() metodu listenin #her noktasını tarayabiliyor. Bunu tam olarak ne i¸e yaradı˘ını s g #anlamak için de "if not oge in liste:" satırını #kaldırmayı deneyebilirsiniz. sıradaki elma ö˘ esini bulabilecektir... s g g ö˘ eden ba¸layacak ve böylece. g sira = 0 #Bu liste.append(oge) #listedeki de˘erleri bir karakter dizisi içine g #alıp ekrana basıyoruz. sira) except ValueError: pass #sıra de˘i¸keninin de˘erini birer birer g s g #arttırıyoruz. s g #except.. Yani e˘ er s g g g parantez içindeki ikinci de˘ eri belirtmezseniz.. sıradaki ö˘ eleri atladı˘ ı için 7.index("elma". bir liste içindeki ö˘ elerin hangi konumlarda yer aldı˘ ını gösteren bir prog g gram yazabiliriz: #!/usr/bin/env python # -*. Python bu kez listeyi taramaya 3. sırayı atladı˘ ı için 2. g g g Bu bilgiyi kullanarak... "elma". try: oge = meyveler. for nmr in liste: print "aranan ö˘e %s konumunda bulundu!"%nmr g . sira += 1 #Burada amacımız aynı sayının listeye eklenmesini #engellemek..coding: utf-8 -*#meyve listesini tanımlayalım. except. ve 2. "çilek". meyveler = ["elma". "elma"] #Bu sayı index() metodunun parantezi içindeki #ikinci de˘er olacak. Bu de˘eri bir while g g #döngüsü içinde birer birer arttıraca˘ız. liste = [] #while döngümüzü yazıyoruz. 0.. sırada ba¸layacaktır. sırada yer alan elma ö˘ esini bulabileg s g g cektir.

4 sum() Fonksiyonu Diyelim ki kullanıcıdan aldı˘ ı sayıları birbiriyle toplayan bir program yazmak istiyorsunuz. Böylece kullanıcının girdi˘ i bütün sayıların toplam de˘ eri bu a gs g g de˘ i¸keninin de de˘ eri olacak. g Bunun için söyle bir sey yapabilirsiniz: ¸ ¸ #!/usr/bin/env python # -*. 3. a g Bu programın mantı˘ ı sudur: Öncelikle a adlı bir de˘ i¸ken olu¸turuyoruz. "erik". Dolayısıyla kullanıcının girdi˘ i sayıların toplamını bulmak için gs g g programın sonunda a de˘ i¸kenini ekrana yazdırmamız yeterli olacaktır. kullanıcıdan aldı˘ ımız s g g sayıyı int’e. Bu de˘ i¸kenin de˘ eri g ¸ gs s gs g bir sayıdır. "çilek"] >>> lst. bir dizi içindeki sayıların birbiriyle kolayca toplanmasını sa˘ lar.3. "karpuz". yani tamsayıya dönü¸türdü˘ ümüze dikkat edin.5 Liste Ögelerinin Sayısını Bulmak Python’da bir liste içindeki ö˘ elerin sayısını bulmak için count() adlı bir metottan yararlanıyg oruz.˘ 9.count("erik") 2 9. Bu metot bir ö˘ enin liste içinde kaç kez geçti˘ ini bildirir: g g >>> lst = ["erik". Ayrıca else blo˘ u içinde. E˘ er kullanıcı sayı girmek s g yerine bu tu¸a basarsa program sona erecektir. "karpuz". Kullanıcının girdi˘ i her sayı bu de˘ i¸kenin mevcut de˘ eriyle toplandıktan sonra g gs g yine bu de˘ i¸kene atanacak. "çilek". s g Yukarıdakine benzer bir i¸lemi Python’da özel bir fonksiyon olan sum() yardımıyla da gerçeks le¸tirebiliriz. 4] >>> print sum(sayilar) 9 . "kavun". gs Kullanıcının programı sona erdirebilmesi için “q” tu¸unu belirliyoruz. Bu fonksiyon. s g Bununla ilgili bir örnek söyle olabilir: ¸ >>> sayilar = [2.coding: utf-8 -*a = 0 print """ Toplama i¸lemi için sayı girin: s (Programdan çıkmak için ’q’ tu¸una basın) s """ while True: sayi = raw_input("sayı: ") if sayi == "q": print "ho¸çakalın!" s break else: a += int(sayi) print "girdi˘iniz sayıların toplamı: ".

sum(sayilar) g Bu defa öncelikle sayilar adlı bir liste olu¸turduk.append(int(sayi)) print "girdi˘iniz sayıların toplamı: ". Dilerseniz bu bölümün ba¸ında verdi˘ imiz örne˘ i sum() fonksiyonunu kullanarak s g g tekrar yazalım: #!/usr/bin/env python # -*. sum() fonksiyonu. Kullanıcıdan gelen sayıları bu listeye eklemek için append() metodundan yararg landı˘ ımıza dikkat edin.veya: >>> print sum([2. Kullanıcıdan gelen sayıları bu listede s tutaca˘ ız. kendisine verilen bir dizi sayıyı alıp bu sayıları birbiriyle g topluyor. 3.5 enumerate() Fonksiyonu Hatırlarsanız. dir() adlı bir fonksiyon yardımıyla liste metotlarını topluca ekrana yazdırabilece˘ imizi ö˘ renmi¸tik: g g s >>> dir(list) E˘ er burada toplam kaç metot oldu˘ unu ö˘ renmek istersek len() fonksiyonu i¸imizi görüyor: g g g s >>> len(dir(list)) 45 Peki ya dir(list) çıktısında görünen metotları numaralandırmak istersek ne yapaca˘ ız? g ˙ste bunun için enumerate() adlı bir fonksiyonumuz var. 9. 4]) 9 Gördü˘ ünüz gibi.coding: utf-8 -*sayilar = [] print """ Toplama i¸lemi için sayı girin: s (Programdan çıkmak için ’q’ tu¸una basın) s """ while True: sayi = raw_input("sayı: ") if sayi == "q": print "ho¸çakalın!" s break else: sayilar. Bakalım bu fonksiyonu nasıl kullanıyI¸ oruz: >>> liste = dir(list) >>> for i in enumerate(liste): . sayilar adlı liste içinde biriken sayıları toplamak için de sum() g fonksiyonundan yararlandık.

g g metot_adi in enumerate(liste): satırına özellikle dikkat edin... Simdi suna bakın: g ¸ ¸ ¸ >>> for sira_no.. ˙ste g ¸ g s I¸ biz for sira_no. __delitem__ 5... __format__ 9... ‘metot_adı’) seklinde ekrana dökülüyor. __eq__ 8. dir(list) komutunun g verdi˘ i bütün çıktılar (sıra_no. __ge__ Bu kodlarla çıktıyı nasıl istedi˘ imiz kıvama getirdi˘ imizi görüyorsunuz. (4. __add__ 1... print sira_no . print metot_adi . __doc__ 7. (9. ’metot_adi’) seklinde oldu˘ unu görmü¸tük. 0.. metot_adi in enumerate(liste): . __delslice__ 6.. (5. Yukarıdaki kodu söyle yazacak olursanız gs ¸ durum daha da netle¸ecektir: s >>> for sira_no. (2. . __add__ __class__ __contains__ __delattr__ . __delattr__ 4.. 0 1 2 3 4 5 6 7 8 9 >>> for sira_no.. (6. metot_adi) . metot_adi in enumerate(liste): . __contains__ 3. (0. __class__ 2.. print "%s. print i ’__add__’) ’__class__’) ’__contains__’) ’__delattr__’) ’__delitem__’) ’__delslice__’) ’__doc__’) ’__eq__’) ’__format__’) ’__ge__’) Biz burada çıktının tamamını göstermiyoruz. (1. ancak gördü˘ ünüz gibi.. (8. (7.. Bir önceki örnekte enumerate(liste) içeri˘ inin (sira_no. %s" %(sira_no.. (3. metot_adi in enumerate(liste): . çıktıdaki sıra numaralarını sira_no adlı de˘ i¸kene. metot_adi satırı ile. gs metot adlarını ise metot_adi adlı de˘ i¸kene atıyoruz. Burada for sira_no.

"muz"] >>> "elma" in liste True Burada tam olarak söyle dedik: “liste içinde ‘elma’ var mı?“ ¸ elma ö˘ esi liste içinde bulundu˘ u için Python bize True cevabını verdi.__delitem__ __delslice__ __doc__ __eq__ __format__ __ge__ Gördü˘ ünüz gibi. %s" %(sira_no. %s" %(sira_no.. g 9... metot_adi de˘ i¸keni ise metot adg gs gs larını tutuyor. Bu deyimi kullanarak bir seyin ¸ ba¸ka bir seyin içinde olup olmadı˘ ını sorgulayabiliriz: s ¸ g >>> liste = ["elma".. E˘ er ilk g s g sayının 0 yerine 1 olmasını isterseniz yukarıdaki kodu söyle yazabilirsiniz: ¸ >>> for sira_no. in deyimi bir ifadeye temel olarak “-de/-da. print "%s..6 in Deyimi Aslında biz bu in deyimini biliyoruz. Mesela: >>> for i in range(10): . 1): . "çilek". ¸ Bu arada dikkat ederseniz enumerate() ile verdi˘ imiz numaralar sıfırdan ba¸lıyor. metot_adi in enumerate(liste. "erik". içinde” anlamı katar. Bir de suna bakalım: g g ¸ >>> "karpuz" in liste False Liste içinde “karpuz” diye bir ö˘ e olmadı˘ ı için Python bize False cevabı verdi. print i Biz bu deyimi for döngüsüyle birlikte kullanıyorduk. metot_adi) satırıyla yaptı˘ ımız sey g ¸ ise enumerate() fonksiyonundan gelen bu sıra numaralarını ve metot adlarını “%s” i¸aretlerini s kullanarak düzgün bir sekilde biçimlendirmekten ibarettir. Yukarıda print "%s.. metot_adi) Burada 1 yerine istedi˘ iniz sayıyı yerle¸tirerek.coding: utf-8 -*turkce_harfler = "ı¸˘çüö˙¸˘ÇÜÖ" sg ISG kontrol_listesi = [] dosya = raw_input("Dosya için bir ad seçin: ") . sira_no de˘ i¸keni sıra numaralarını. g g Gelin isterseniz bununla ilgili söyle bir örnek verelim: ¸ #!/usr/bin/env python # -*. sıralamaya istedi˘ iniz sayıdan ba¸lanmasını g s g s sa˘ layabilirsiniz. "armut".

35. 96. 42. 64. 31. 33. 94.. 53. ¸ s g g s g #!/usr/bin/env python # -*. 73. 27. 97. 77. 97. 52. 61. 46. 97. 77.for hrf in dosya: if hrf in turkce_harfler: kontrol_listesi. 39.. 9.8 Bölüm Soruları 1. Önce Türkçe harflerin tanımlandı˘ ı bir liste olu¸tug ¸ g s ruyoruz. 73. 92.. 90. 54. 90. 26. 37. 32. 75. 77. 40. 99.. 34. . 57. 88. 65. 63. 78. 48. 39.append(hrf) if kontrol_listesi: print "Dosya adında Türkçe harf olmamalı!" elif len(dosya) > 8: print "Dosya adı en fazla 8 karakter içerebilir!" else: print "Dosya ’%s’ adıyla kaydedildi!" %dosya Burada yaptı˘ ımız sey aslında çok basit. 99. 52. 98. 73. 62. 50. 30] >>> min(lst) #listedeki en küçük sayı 24 >>> max(lst) #listedeki en büyük sayı 100 9. 78. 74. >>> . 82.. 39. 71. 54.. 34. 41.. 30. 33. Daha sonra kullanıcıdan gelen dosya adına bakıp bunun içinde Türkçe karakter olup olmadı˘ ını denetliyoruz. 25. 41. 24. 43. 58. 99. 61. 94. E˘ er dosya adında Türkçe karakter varsa bunları kontrol listesine ekg g liyoruz. 64. 27.. 42. = [45. Su örnekte. 76. 25. 35. 58.coding: utf-8 -*a = 0 print """ Toplama i¸lemi için sayı girin: s (Programdan çıkmak için ’q’ tu¸una basın) s """ .7 min() ve max() Fonksiyonları Bir sayı dizisi içinde yer alan sayıların en büyü˘ ünü veya en küçü˘ ünü ö˘ renmeniz gerekirse g g g ne yaparsınız? Elbette min() ve max() fonksiyonlarından yararlanırsınız. 75. 64. . 28. E˘ er kontrol listesinde en az bir tane ö˘ e varsa dosya adı Türkçe karakter içeriyor g g demektir. 66. 62. 75. 92. 62. 27. 100. 49. . 80. lst 80. . kullanıcıdan aldı˘ ımız karakter dizisini neden int(raw_input("sayı: ")) ¸ g seklinde en ba¸ta de˘ il de else blo˘ u içinde sayıya dönü¸türmeyi tercih etti˘ imizi açıklayın.. 59. 96. 56. 33. 73. 40. 42. 50.. 100. 66. 93. 73. 72. 63. 83.

"karpuz". a g 2. "elma"] sira = 0 liste = [] while sira < len(meyveler): try: oge = meyveler. "çilek". sira) except ValueError: pass sira += 1 if not oge in liste: liste. "su".ubuntu-tr.php/Ubuntu’da_S%C3%BCr%C3%BCm_%C4%B0simleri_ve_Anlamlar%C4%B adresinde bulunan Ubuntu sürüm isimlerini bir liste haline getirin ve ekrana suna benzer bir ¸ çıktı verin: 1) Warty Warthog 2) Hoary Hedgehog . http://wiki. Liste metotları içinde sadece bizi ilgilendiren su metotları ekrana döken bir program yazın: ¸ append count extend index insert pop remove reverse sort . Kullanıcının aynı sayıyı birden fazla girmesine izin vermeyin. 3.coding: utf-8 -*meyveler = ["elma". Bir program yazarak kullanıcıdan 10 adet sayı girmesini isteyin. kullanıcının girdi˘ i sayıları tek ve g çift sayılar olarak ikiye ayırın ve her bir sayı grubunu ayrı ayrı ekrana basın. "kavun".while True: sayi = raw_input("sayı: ") if sayi == "q": print "ho¸çakalın!" s break else: a += int(sayi) print "girdi˘iniz sayıların toplamı: ".index("elma". A¸a˘ ıdaki programı. "elma"...append(oge) for nmr in liste: print "aranan ö˘e %s konumunda bulundu!"%nmr g 5. Programın sonunda. liste ö˘ esini kullanıcıdan alacak sekilde yeniden yazın.net/index. 4. "erik". E˘ er kullanıcının s g g ¸ g aradı˘ ı ö˘ e listede yoksa kendisine bir uyarı mesajı gösterin ve ba¸ka bir ö˘ e arayabilme sansı g g s g ¸ verin: #!/usr/bin/env python # -*.

.) Gördü˘ ünüz gibi.BÖLÜM 10 Demetler Demetler. Aslında basit ama biraz tuhaf: g s g >>> demet = ("su". 49. Yani ö˘ e ekleyebilir. Listeler üzerinde oynamalar yapabiliriz. yaptı˘ ımız bu i¸ de˘ i¸ken tanımlamaya çok benziyor. ˙ Isterseniz bu durumu teyit edelim: >>> type(demet) <type ’tuple’> >>> type(demet2) <type ’tuple’> tuple kelimesi Türkçe’de demet anlamına gelir. Ama listeler ile aralarında g çok temel bir fark vardır. "Veli".. Peki bo¸ bir demet nasıl olu¸turulur? Çok basit: s s >>> demet = () Peki tek ö˘ eli bir demet nasıl olu¸turulur? O kadar basit de˘ il. "Veli". bir önceki bölümde inceledi˘ imiz listelere çok benzer. 49. ö˘ e g g çıkarabiliriz. 50 Gördü˘ ünüz gibi. ˙ g g s gs Istersek demetin ö˘ elerini parantez içinde de gösterebiliriz: g >>> demet2 = ("Ali". ¸ Demeti su sekilde tanımlıyoruz: ¸ ¸ >>> demet = "Ali". 50) Parantezli de olsa parantezsiz de olsa yukarıda tanımladıklarımızın ikisi de “demet” sınıfına giriyor. tek ö˘ eli bir demet olu¸turabilmek için ö˘ enin yanına bir virgül koyuyoruz! g g s g Hemen teyit edelim: >>> type(demet) <type ’tuple’> 110 . Demetlerde ise böyle bir sey yoktur.

Ayrıca demetler listelere göre daha hızlı çalı¸ır. Dolayısıyla print a dedi˘ imiz zaman bu g g ¸ g demetin ilk ö˘ esini. Bu fonksiyonu söyle g ¸ bir örnek içinde kullanabilece˘ imizi de biliyorsunuz: g >>> liste = dir(list) >>> for a. b.. Anne ö˘ esi. "Baba". Yani yanlı¸lıkla de˘ i¸tirmek istemedi˘ iniz veriler içeren bir liste hazırlas gs g mak istiyorsanız demetleri kullanabilirsiniz. s g Bir defa. listeler varken bu demetler s g ne i¸e yarar?” diye sordu˘ unuzu duyar gibiyim. print b dedi˘ imiz zaman da ikinci ö˘ esini ekrana yazdırmı¸ oluyoruz. g s s Yukarıda anlattı˘ ımız sekilde bir demet olu¸turma i¸ine demetleme (packing) adı veriliyor. Buna da demet çözme deniyor (unpacking).. e¸ittir i¸aretinin sol tarafında demetteki ö˘ e sayısı kadar de˘ i¸ken adı belirs s g gs lememiz gerekti˘ idir. Demet çözme i¸leminde dikkat etmemiz g s gereken nokta. b in enumerate(liste): . virgülü koymazsak demet de˘ il.. s Dolayısıyla bir program içinde sonradan de˘ i¸tirmeniz gerekmeyecek verileri gruplamak için gs liste yerine demet kullanmak daha mantıklıdır. g g g s En ba¸ta da dedi˘ imiz gibi. <type ’tuple’> Gördü˘ ünüz gibi elde etti˘ imiz sey bir demet. print type(i) .. print ¸ g g c yazarsak Kardesler ö˘ esi ekrana yazdırılacaktır. “Peki. g Önceki bölümde gördü˘ ümüz enumerate() fonksiyonunu hatırlıyorsunuz. Bunu hemen teyit edelim: >>> liste = dir(list) >>> for i in enumerate(liste): . c = aile Bu sekilde komut satırına print a yazarsak. print b yazarsak Baba ö˘ esi. Önce demetleyelim: >>> aile = "Anne". alelade bir karakter dizisi olu¸turmu¸ oluyoruz. "Kardesler" Simdi demeti çözelim: ¸ >>> a. print a..O virgülü koymazsak ne olur? >>> demet2 = ("su") demet2’nin tipini kontrol edelim: >>> type(demet2) <type ’str’> Demek ki. demetler listelere çok benzer.. g ¸ s s Bunun tersini de yapabiliriz. b Bu da aslında bir demet çözme i¸lemidir. demetler listelerin aksine de˘ i¸iklik yapmaya müsait olmadıklarından listelere göre gs daha güvenlidirler. . Bildi˘ iniz gibi enumerate() fonksiyonu bir demet s g üretir.

’__le__’. "kavun".2 Demet Ögelerinin Sayısını Bulmak Python’da bir demet içindeki ö˘ elerin sayısını bulmak için. ’index’] Burada bizi ilgilendirenler ba¸ında ve sonunda “_” i¸areti barındırmayanlar. Yine tıpkı listelerde oldu˘ u gibi bu metot g s g sadece ilk buldu˘ u ö˘ eyi dikkate alır. ’__contains__’. "erik". ’__rmul__’. "çilek") >>> demet. ’__init__’. demetlerde de sıra bulma i¸lemleri için index() metodunu kullanıyg s oruz.10. tıpkı listelerde oldu˘ u gibi. Su komutlardan herhangi biri yardımıyla demetlerin metotlarını görebile¸ ce˘ imizi biliyoruz: g >>> demet = () >>> dir(demet) >>> dir(tuple) >>> dir(()) Bu komutlar bize su çıktıyı verir: ¸ [’__add__’. ’__ge__’.1 Demet Ögelerinin Sırasını Bulmak Tıpkı listelerde oldu˘ u gibi. Bu metot bir ö˘ enin demet içinde kaç kez geçti˘ ini bildirir: g g >>> demet = ("erik".. 2) ˘ 10. ’__format__’. ’__doc__’. ’__hash__’. ’__subclasshook__’. ’__mul__’. ’__getattribute__’. Örne˘ in: g >>> demet = ("gül". ’__ne__’. ’__len__’. Yani sunlar: s s ¸ count index ˘ 10. ’__setattr__’. ’__iter__’. ’__eq__’. ’__str__’. ’__delattr__’. ’__new__’.1. ’__sizeof__’..index("gül") 0 Demek ki gül adlı ö˘ e demetin 0. ’__lt__’. "erguvan") >>> demet. ’__reduce_ex__’. "karpuz". ’__reduce__’. "kasımpatı".1 Demetlerin Metotları Demetler üzerinde de˘ i¸iklik yapmak mümkün olmadı˘ ı için bu veri tipi metot bakımından gs g da bir hayli fakirdir. ’__getitem__’. ’__class__’. ’__repr__’. ’__gt__’. "papatya". Burada da parantez içinde ikinci bir de˘ er kullang g g abilirsiniz: >>> demet.1. "karpuz". "çilek". ’__getnewargs__’.index("gül". sırasında imi¸. ’__getslice__’. ’count’. count() g g adlı bir metottan yararlanıyoruz.count("erik") 2 .

numaralandırmayı 0 yerine 1’den ba¸latmak için ne yapmanız gerekir? s 4. Programınız söyle bir çıktı vermeli: ¸ No 0 1 2 3 4 5 Metot Adı __add__ __class__ __contains__ __delattr__ __doc__ __eq__ Metot Uzunlu˘u g 7 9 12 11 7 6 3.2 Bölüm Soruları 1.10. "elma". Demetlerin bütün metotlarını numaralandıran ve her metottaki karakter sayısını gösteren bir program yazın. Listelerin aksine demetler üzerinde de˘ i¸iklik yapılamamamasının ne gibi avantajları olags bilece˘ i üzerinde dü¸ünün. Diyelim ki elimizde söyle bir liste var: ¸ liste = ["elma". "elma". "kiraz". Programınız g g tam olarak söyle bir çıktı vermeli: ¸ elma ö˘esi listede 3 kez geçiyor! g armut ö˘esi listede 1 kez geçiyor! g kiraz ö˘esi listede 2 kez geçiyor! g çilek ö˘esi listede 1 kez geçiyor! g kebap ö˘esi listede 1 kez geçiyor! g . "armut". Bir önceki soruda. listede kaç kez geçti˘ ini söyleyen bir program yazın. "çilek". "kiraz". "kebap"] Bu listedeki her bir ö˘ enin. g s 2.

“anahtar” ve “de˘ er” g g arasında ba˘ kuran bir veri tipidir diyoruz. Burada mesela.1 Sözlük Olu¸ turmak s Sözlükleri kullanabilmek için yapmamız gereken ilk i¸ sözlü˘ ü olu¸turmak olacaktır. g ¸ g ufkunuzun geni¸ledi˘ ini hissedeceksiniz. Yukarıda bo¸ bir sözlük g s s olu¸turduk. Python’da s g s sözlükleri söyle olu¸turuyoruz: ¸ s >>> sozluk = {} Gördü˘ ünüz gibi. 11. meyve ise bu anahtarın “de˘ eri”dir. 1: "sayi"} Sözlükler görünü¸ açısından öteki veri tiplerinden biraz farklıdır. Gelin isterseniz bunu test edelim: s >>> type(sozluk) <type ’dict’> Hatırlarsanız.BÖLÜM 11 Sözlükler Su ana kadar Python’da iki önemli veri tipinden bahsettik. g g Yukarıda bo¸ bir sözlük olu¸turduk... Ama gördü˘ ünüz gibi. ö˘ elerin g g g biçiminde bazı farklılıklar var. sayi de˘ erinin anahtarı ise 1‘dir. Aslında sözlüklerde de durum böyledir. Aynı sekilde sebze de˘ erinin anahtarı dog ¸ g mates. sözlüklerin ayırt edici i¸areti küme parantezleridir. listeleri tanımlayan sözcük “list”. Dilerseniz simdi de ö˘ eleri olan bir sözlük olu¸turalım: s s ¸ g s >>> sozluk = {"elma": "meyve". Sözlükler Python’un en önemli veri tiplerinden ¸ g bir tanesidir. demetleri tanımlayan sözcük ise “tuple” idi. Liste ve demet gibi veri tips lerinde her bir ö˘ eyi birbirinden virgül ile ayırıyorduk. "domates": "sebze". Dolayısıyla Python’da sözlük. s g O halde lafı daha fazla uzatmadan yola koyulalım. Gördü˘ ünüz gibi sözlükleri tanımlayan sözcü˘ ümüz de “dict”. ¸ Simdi de sözlük adlı veri tipinden söz edece˘ iz. anahtar-deger çiftlerinden olu¸an bir veri tipidir. elma bir s “anahtar”. Bu veri tipini ö˘ rendikten sonra pek çok seyi rahatlıkla yapabildi˘ inizi görecek. ˘ Sözlükler. Bunlar listeler ve demetler idi. g 114 . g Yani sözlüklerde de ö˘ eleri birbirlerinden virgül ile ayırıyoruz.

Unutmayın. tabii ki bu sözlü˘ ün ö˘ elerine eri¸mek isteyeceksiniz. "Salih": "0532 321 54 76". Bir sös g g s zlü˘ ün tamamını ekrana dökmek için yapmamız gereken sey belli: g ¸ >>> sozluk = {"Python": "programlama dili". Neyse. kod bir kez yazılır bin kez okunur.. s ˙ Isterseniz bir de yukarıdaki kodların metin düzenleyici içinde nasıl görünece˘ ine bakalım: g #!/usr/bin/env python # -*.. Bunlardan birincisi ö˘ eleri belirg lerken küme parantezlerini kullanıyor olmamız. Bunu su sekilde teyit edebilirsiniz: g s ¸ ¸ >>> len(sozluk) 3 Bu sözlü˘ ün her ö˘ esi bir “anahtar-de˘ er” çiftidir.. Sözlükleri nasıl olu¸turaca˘ ımızı ö˘ rendik. "Istanbul": "34". Ancak e˘ er girece˘ iniz sayı bo¸luklu de˘ ilse ve 0 ile ba¸lamıyorsa bu sayıyı g g s g s tırnaksız da yazabilirsiniz. "˙ngilizce": "dil". Mesela sözlükleri kullanarak bir telefon defteri yazalım: >>> telefon_defteri = {"Ahmet": "0533 123 45 67".. g Bir örnek daha verelim. s g g ¸ g ˘ 11. nasıl kullanıldı˘ ına g da dikkat etmeliyiz. "Salih": "0532 321 54 76".. hem de görü¸ alanını da˘ ıttı˘ ı için okumayı s s g s g g zorla¸tırır. Simdi gelelim bu sözlükleri nasıl kullanaca˘ ımıza.coding: utf-8 -*telefon_defteri = {"Ahmet": "0533 123 45 67". Mesela Adana anahtar. biz konumuza dönelim... Okunaklı ve anla¸ılır kodlar yazmak s herkesin hayrınadır. Sa˘ a do˘ ru çok fazla uzas g g g g mı¸ olan kodlar hem görüntü açısından ho¸ de˘ ildir. Üçüncüsü iki nokta üst üste ve virgüllerin nerede.Bu durumu daha net anlayabilmek için bir örnek daha verelim: ˙ >>> sozluk = {"Adana": "01". "Selin": "0533 333 33 33"} Burada kodlarımızın sa˘ a do˘ ru biçimsiz bir biçimde uzamaması için virgülden sonra ENTER g g tu¸una basarak ö˘ eleri tanımlamaya devam etti˘ imize dikkat edin. Sözlük tanımlarken dikkat etmemiz gereken birkaç nokta var. "elma": "meyve"} I >>> print sozluk . . .. 01 ise bu anahtarın g g g de˘ eridir. "Selin": "0533 333 33 33"} print telefon_defteri Kodlarımızı daha okunaklı bir hale getirmek için sözlü˘ ü uygun yerlerinden bölerek alt satıra g geçiyoruz. "˙zmir": "35"} I Bu sözlük üç ö˘ eden olu¸uyor. ˙ Isterseniz sayıları tırnaksız kullanırsanız ne olaca˘ ını deneyg erek görebilirsiniz. ˙ Ikincisi karakter dizilerinin yanısıra sayıları da tırnak içinde gösteriyor olmamız.2 Sözlük Ögelerine Eri¸ mek s Bir sözlük olu¸turduktan sonra. .

line 1.. isimlerine göre g g g ça˘ ırıyoruz. "Mehmet") >>> demet[1] ’Ahmet’ Liste ve demetlerde ö˘ eleri sıralarına göre ça˘ ırabiliyoruz. Peki ya biz bu sög zlü˘ ün ö˘ elerine tek tek eri¸mek istersek ne yapaca˘ ız? g g s g Hatırlarsanız liste ve demetlerin ö˘ elerine tek tek su sekilde eri¸iyorduk: g ¸ ¸ s >>> liste = ["Ali". sözlük içindeki ö˘ eleri anahtara göre g ça˘ ırıyoruz. ’c’: 3. sözlükten ö˘ e ça˘ ırırken küme parantezlerini de˘ il.. ... Ancak sözlükler öyle g de˘ ildir. "c": 3} >>> print a {’a’: 1. sözlük ö˘ elerini sıralarına göre de˘ il.print komutunu kullanarak bir sözlü˘ ün tamamını ekrana dökebiliyoruz. g g g g . "Mehmet"] >>> liste[0] ’Ali’ >>> demet = ("Ali". de˘ ere göre de˘ il. bu komutlar Ahmet ve Salih adlı anahtarların kar¸ısında hangi de˘ er varsa g s g onu ekrana yazdırıyor. "Selin": "0533 333 33 33"} >>> telefon_defteri["Ahmet"] ’0533 123 45 67’ >>> telefon_defteri["Salih"] ’0532 321 54 76’ Gördü˘ ünüz gibi. sa˘ ındakileri de˘ il. ’b’: 2} Gördü˘ ünüz gibi. . Yani liste ve demetlerdeki ö˘ elerin her birinin bir sırası vardır. kö¸eli g g g s parantezleri kullanıyoruz. in <module> KeyError: 0 Sözlükler sırasız bir veri tipi oldu˘ u için. Sözlüklerde herhangi bir sıra kavramı bulunmaz. Mesela su örne˘ e bakalım: g ¸ g >>> a = {"a": 1. "Ahmet". Çünkü liste ve demetler sıralı veri g g tipleridir. "Ahmet". ö˘ eler tanımladı˘ ımız sırada görünmüyor. g Suna bir bakalım: ¸ >>> telefon_defteri = {"Ahmet": "0533 123 45 67".. Bu arada aklınızda bulunsun.. "b": 2. "Salih": "0532 321 54 76". Yani iki nokta üst üste i¸aretinin solundaki ifadeleri kullanıyoruz g g g s ö˘ eleri ça˘ ırırken. Dikkat edin. Sözlüklerde herhangi bir sıra g g g kavramı olmadı˘ ı için söyle bir giri¸im ba¸arısızlı˘ a u˘ rayacaktır: g ¸ s s g g >>> a[0] Traceback (most recent call last): File "<stdin>".

. 5: ’__delslice__’. g g g Böylece artık liste metotlarını numara vererek ça˘ ırabiliriz: g >>> sozluk[1] ’__class__’ >>> sozluk[10] . 6: ’__doc__’. 13: ’__gt__’.2. 2: ’__contains__’. 24: ’__new__’. 31: ’__setitem__’. 12: ’__getslice__’. 9: ’__ge__’. Diyelim ki elimizde söyle bo¸ bir sözlük g s ¸ s var: >>> sozluk = {} Bu sözlü˘ e ö˘ e eklemek için su yapıyı kullanıyoruz: g g ¸ >>> sozluk[anahtar] = deger Dilerseniz bu yapıyı somutla¸tıracak bir örnek verelim: s >>> sozluk["Ad"] = "Ahmet" Burada “Ad” bir anahtar. 32: ’__setslice__’.1 Sözlüklere Öge Eklemek Sözlüklere ö˘ e eklemek son derece kolay bir i¸lemdir. 25: ’__reduce__’. Bu yapıyı ve for döngüsünü kullanarak sözlükg g g s lere birden fazla ö˘ eyi bir çırpıda ekleyebilirsiniz: g >>> liste = dir(list) >>> sozluk = {} >>> for anahtar. 16: ’__imul__’. 41: ’pop’.˘ 11. 10: ’__getattribute__’. 33: ’__sizeof__’. sozluk[anahtar] = deger >>> print sozluk {0: ’__add__’. 18: ’__iter__’. 37: ’count’. 1: ’__class__’. 26: ’__reduce_ex__’. Mesela bu sözlü˘ e bir ö˘ e daha ekleyelim: g g g >>> sozluk["Soyad"] = "Su" Simdi sözlü˘ ümüzü yazdıralım: ¸ g >>> print sozluk {’Ad’: ’Ahmet’. 29: ’__rmul__’. 15: ’__iadd__’. 44: ’sort’} Gördü˘ ünüz gibi dir(list) çıktısındaki ö˘ eleri tek tek numaralandırıp bunları sözlü˘ e ekledik. 43: ’reverse’. 14: ’__hash__’. 20: ’__len__’. 38: ’extend’. 36: ’append’. 40: ’insert’. hem de bir de˘ er belirtmemiz gerekiyor. 21: ’__lt__’. 28: ’__reversed__’. 4: ’__delitem__’. 19: ’__le__’. Yani sözlüklere ö˘ e eklemek için hem bir g g anahtar. ’Soyad’: ’Su’} Gördü˘ ünüz gibi ö˘ elerimiz sözlü˘ e eklenmi¸.. 30: ’__setattr__’. 3: ’__delattr__’. deger in enumerate(liste): . 39: ’index’. 34: ’__str__’. 7: ’__eq__’. 35: ’__subclasshook__’. 8: ’__format__’. 42: ’remove’. 23: ’__ne__’. 11: ’__getitem__’. “Ahmet” ise bir de˘ erdir. 27: ’__repr__’. 22: ’__mul__’. 17: ’__init__’.

. ’Meslek’: ’Mimar’} Gördü˘ ünüz gibi.’__getattribute__’ >>> sozluk[20] ’__len__’ >>> sozluk[36] ’append’ >>> sozluk[40] ’insert’ Yukarıdaki örnekte. sözlüklerin Türkçe karakterleri düzgün g s gösteremedi˘ ini farketmi¸sinizdir. ö˘ e sıralaması bozulmu¸... "¸eker": "5 kilo". sözlüklerde sıra kavramına güvenerek i¸ yapmamak gerekir. Simdi bu sözlü˘ ü ekrana dökelim: g g s ¸ g >>> kayitlar {’Soyad’: ’Okan’. ’Ad’: ’Ahmet’. print i Çay S ¸eker Ka¸ık s Çilek . Bu sözlü˘ e tek tek ö˘ e ekleyece˘ iz: s s g g g >>> kayitlar["Ad"] = "Ahmet" >>> kayitlar["Soyad"] = "Okan" >>> kayitlar["Meslek"] = "Mimar" Böylece sözlü˘ ümüze üç farklı ö˘ e eklemi¸ olduk. Python’daki sözlüklerin iç tasarımından kaynaklanan tesadüfi bir durumdur.. Bu. e˘ er kendi kendinize denemeler yapmı¸sanız. .. sözlük anahtarları birer sayı oldu˘ u için çıktıda ö˘ eler sıralı olarak g g görünüyor. Ne olursa olsun. Mesela su örne˘ e s ¸ g bakın: >>> kayitlar = {} Burada öncelikle bo¸ bir sözlük olu¸turduk.. stok = {"Çilek": "100 kilo".. Türkçe karakterlerin hiçbiri düzgün görüntülenemiyor. ’\x9eeker’: ’5 kilo’. Orada bu sorunu çözmek için for döngüsünden s s s yaralanmı¸tık.. Örne˘ in: g s g >>> . Hatırlarsanız buna g benzer durumlarla listelerde de kar¸ıla¸mı¸tık. Sözlükler için de aynı yöntemi kullanabiliriz: s >>> for i in stok: . "Ka¸ık": "100 adet"} s >>> print stok {’\x80ay’: ’10 kilo’.. . ’\x80ilek’: ’100 kilo’} Gördü˘ ünüz gibi.. ’Ka\x9f\x8dk’: ’100 adet’. g g s Bu arada. S "Çay": "10 kilo".

silip g gs g gs yerine yenisini koyuyoruz. sözlük ö˘ elerinde büyük-küçük harfin önemli oldu˘ una dikkat edin: g g >>> telefon_defteri["zekiye"] = "0555 555 55 55" >>> telefon_defteri {’zekiye’: ’0555 555 55 55’. g gs s Buradan anladı˘ ımız su: Bir sözlü˘ e yeni bir ö˘ e eklerken de..clear() Böylece bo¸ bir sözlük elde etmi¸ olduk. herhangi bir Türkçe karakter sorunu ya¸amadan. ˘ 11.3 Sözlük Ögelerini Degi¸ tirmek Bir önceki bölümde sözlüklere nasıl ö˘ e ekleyece˘ imizi gördük.4 Sözlük Ögelerini Silmek E˘ er bir ö˘ eyi sözlükten silmek istersek su komutu kullanıyoruz: g g ¸ >>> del telefon_defteri["Salih"] E˘ er biz sözlükteki bütün ö˘ eleri silmek istersek su komut kullanılıyor: g g ¸ >>> telefon_defteri. E˘ er sözlü˘ ü tamamen ortadan kaldırmak isterseniz s s g g yine del komutundan yararlanabilirsiniz: . varolan bir ö˘ eyi de˘ i¸tirirken g ¸ g g g gs de aynı komutu kullanıyoruz. Buna göre söyle bir örnek g g ¸ verebiliyoruz: >>> telefon_defteri = {} >>> telefon_defteri["Zekiye"] = "0544 444 01 00" >>> print telefon_defteri {’Zekiye’: ’0544 444 01 00’} Peki sözlü˘ ümüzdeki bir ö˘ enin de˘ erini de˘ i¸tirmek istersek ne yapaca˘ ız? Onu da söyle g g g gs g ¸ yapıyoruz >>> telefon_defteri["Zekiye"] = "0555 555 55 55" Böylece sözlükteki Zekiye anahtarının de˘ erini de˘ i¸tirmi¸ olduk.. ’Zekiye’: ’0555 555 55 55’} “Zekiye” ve “zekiye” aynı görünse de aslında Python açısından bunların ikisi tamamen birbirinden farklıdır.Bu sözlükteki ö˘ elere. normal bir sekilde g s ¸ eri¸ebiliyoruz: s >>> print stok["Çay"] >>> print stok["¸eker"] S ˘ ˘ s 11. Bu arada. Demek ki bir ö˘ eyi de˘ i¸tirirken aslında ö˘ eyi de˘ i¸tirmiyor.

’__ge__’. ’fromkeys’. ’__new__’. ’__le__’. ’setdefault’. ’__cmp__’. ’keys’. print i clear copy fromkeys get has_key items iteritems iterkeys itervalues keys pop popitem setdefault update values Simdi bu metotların en önemlilerini inceleyece˘ iz.. ’__delattr__’. ’values’] Burada bizi ilgilendirenler. ’itervalues’.. ’__format__’. Dolayısıyla sözlükler de. ’update’. ’__setitem__’.. ’__init__’. ’__hash__’. ’items’. tıpkı lisgs teler gibi. Python sözlüklerinin metotlarıng dan biridir. ’__reduce__’. metot bakımından zengin bir veri tipidir. sözlükler üzerinde de˘ i¸iklik yapabiliriz. ’__ne__’.. 11. ’iterkeys’.>>> del telefon_defteri Yukarıdaki örneklerden birinde gördü˘ ümüz clear() ifadesi. ’pop’. ’__reduce_ex__’. ’__contains__’. ’iteritems’. ’clear’. ’popitem’.5 Sözlüklerin Metotları Demetlerin aksine. ’__str__’. ’__getattribute__’. ’__delitem__’. Sözlüklerin metotlarını listelemek için su ¸ yöntemlerden herhangi birini izleyebilirsiniz: >>> dir(dict) >>> dir({}) >>> d = {} >>> dir(d) Bu yöntemlerin herhangi birini takip etti˘ inizde söyle bir çıktı elde edeceksiniz: g ¸ [’__class__’. ’get’. Dilerseniz simdi bu metotları s s ¸ inceleyelim. ’__subclasshook__’. ’has_key’. ’__gt__’. ’__doc__’. ’__lt__’. ’__sizeof__’. ’__repr__’. ’__getitem__’. if "_" not in i[0]: . ¸ g . ’__iter__’. ’__eq__’. ’copy’. ’__len__’. her zamanki gibi sunlar olacaktır: ¸ >>> for i in dir(dict): . ’__setattr__’. Sözlüklerin bunun dı¸ında ba¸ka metotları da vardır.

..5. "Salih": "0532 321 54 76".. ¸ g g .keys() [’Ahmet’. .2 clear(). sözlükteki Ahmet anahtarını sildik. pop() ve popitem() clear() metodu bir sözlü˘ ün bütün ö˘ elerini siler: g g >>> telefon_defteri = {"Ahmet": "0533 123 45 67". g s pop() metodu bir sözlükteki ö˘ eleri adlarına göre siler ve ekrana basar: g >>> telefon_defteri = {"Ahmet": "0533 123 45 67".values() [’0533 123 45 67’.clear() >>> telefon_defteri {} Gördü˘ ünüz gibi. ’0532 321 54 76’. . bunun de˘ eri de g g ekrana basıldı. "Selin": "0533 333 33 33"} >>> telefon_defteri.pop("Ahmet") ’0533 123 45 67’ Gördü˘ ünüz gibi.1 keys() ve values() Sözlük metotları arasında en önemlileri bu keys() ve values() adlı metotlardır. ’0533 333 33 33’) Bu silme sekli tamamen tesadüfidir. ’0533 333 33 33’] 11. . "Salih": "0532 321 54 76".. Bu anahtar silinirken. "Selin": "0533 333 33 33"} >>> telefon_defteri. ’Salih’.5. Hangi ö˘ enin silinece˘ ini kontrol edemezsiniz. sözlük tamamen bo¸aldı. Kabaca söylemek gerekirse keys() metodu bir sözlükteki anahtarları. values() metodu ise sözlükteki de˘ erg leri verir.11. Mesela: >>> telefon_defteri = {"Ahmet": "0533 123 45 67". ’Selin’] >>> print telefon_defteri..popitem() (’Selin’. "Selin": "0533 333 33 33"} >>> print telefon_defteri.. "Salih": "0532 321 54 76". popitem() metodu ise bir sözlükteki rastgele bir anahtarı siler ve silinen anahtarın de˘ erini g ekrana basar: >>> telefon_defteri.

5. v Selin 0533 333 33 33 Ahmet 0533 123 45 67 Salih 0532 321 54 76 iteritems() metodu da bir sözlük içindeki anahtar ve de˘ erleri listeler..5.items() [(’Selin’. (’Ahmet’.3 items() ve iteritems() items() metodu bir sözlük içindeki anahtar ve de˘ erleri listeler: g >>> telefon_defteri. ’0533 333 33 33’).11. items() ve iteritems() metotları arasındaki fark gibidir.. ’0532 321 54 76’)] Gördü˘ ünüz gibi.. 11. deger in telefon_defteri. Selin 0533 333 33 33 Ahmet 0533 123 45 67 Salih 0532 321 54 76 iteritems() metodu. deger . v in telefon_defteri. iteritems() metodu listeyi çıktı olarak vermedi. items() metodu. ’0533 123 45 67’). 11.5 copy() Bu metot bir sözlü˘ ü kopyalamamızı sa˘ lar: g g >>> yeni_rehber = telefon_defteri. bu özelli˘ i sayesinde çok büyük listeler üzerinde daha performanslı çalı¸ag s caktır. print anahtar. iteritems() metodu ile olu¸turdu˘ unuz g s g listeyi siz istedi˘ iniz zaman ekrana dökebilirsiniz: g >>> for anahtar.items(): . Ancak items() metodu g ile iteritems() metodu arasında bazı kullanım farkları vardır. anahtar-de˘ er çiftlerinden olu¸an listeyi derg g s hal meydana getirip ekrana basar. bu demetleri su sekilde çözebiliriz (Bu i¸leme g ¸ ¸ s ˙ Ingilizce’de “unpacking” adı veriliyor): >>> for k. biraz önce gördü˘ ümüz keys() ve values() metotlarıyla aynı i¸i yapar.5.. (’Salih’. Bu metot g s çifti arasındaki fark. Örne˘ in: g >>> telefon_defteri.iteritems() <dictionary-itemiterator object at 0x00EC2AB0> Gördü˘ ünüz gibi. burada sözlük içindeki bütün anahtar ve de˘ erleri bir liste içinde yer alıyor.4 iterkeys() ve itervalues() Bu iki metot. g Yukarıda bir demet dizisi elde etti˘ imize göre. g g Her anahtar ve de˘ er çifti de birer demet biçiminde.. print k. iteritems() metodu ise anahtar-de˘ er çiftlerinden olu¸an g s listeyi meydana getirdi˘ ini bildiren bir “nesne” üretir.copy() . Bu durum iteritems() metog dunun çok önemli bir özelli˘ idir.items(): ..

daha önceki bilgilerimizi de kullanarak söyle bir sey yazabiliriz: ¸ ¸ #!/usr/bin/env python # -*.has_key("Selin") True Buna benzer bir seyi söyle de yapabilece˘ imizi görmü¸tük: ¸ ¸ g s >>> telefon_defteri["Selin"] ’0533 333 33 33’ >>> telefon_defteri["Veli"] Traceback (most recent call last): File "<stdin>".. Normalde bu hata mesajını alg mamak için try.. except KeyError: . Simdi su senaryoyu inceleyin: ¸ ¸ Diyelim ki bir hava durumu programı yazmak istiyoruz.. in <module> KeyError: ’Veli’ Gördü˘ ünüz gibi. telefon_defteri["Veli"] . print "Aranan ö˘e sözlükte yok!" g .11. Tasarımıza göre kullanıcı bir sehir ¸ adı girecek...coding: utf-8 -*soru = raw_input("¸ehrinizin adını tamamı küçük " S "harf olacak ¸ekilde yazınız: ") s if soru == "istanbul": print "gök gürültülü ve sa˘anak ya˘ı¸lı" g g s elif soru == "ankara": print "açık ve güne¸li" s elif soru == "izmir": print "bulutlu" else: .. except: bloklarından yararlanabiliriz: >>> try: . Bunu ¸ yapabilmek için. Ama g g g e˘ er aranan anahtar sözlükte yoksa bir hata mesajı alıyoruz.. Program da girilen sehre özgü hava durumu bilgilerini ekrana yazdıracak...has_key("Veli") False >>> telefon_defteri.5. e˘ er aranan anahtar sözlükte varsa o anahtarın de˘ eri ekrana basılıyor. line 1.6 get() ve has_key() E˘ er amacınız bir anahtarın sözlük içinde varolup olmadı˘ ını denetlemekse has_key() metog g dundan yararlanabilirsiniz: >>> telefon_defteri.. Aranan ö˘e sözlükte yok! g Ancak Python’da bunu yapmanın çok daha kolay bir yolu var.

Basit bir Türkçe-˙ Ingilizce sözlük programı yazın. g g s "ankara": "açık ve güne¸li". g s 11. Yazdı˘ ınız programda kullanıcı Türkçe bir g kelime sorup. kullanıcıya sorumuzu soruyoruz. Sözlük programcının elle olu¸turaca˘ ı “if-elif-else” bloklarından daha performanslıdır ve s g bize çok hızlı bir sekilde veri sorgulama imkânı sa˘ lar. Python sözlüklerinde bulunan bu get() metodu bizi else veya g try-except blokları kullanarak hata yakalamaya u˘ ra¸ma zahmetinden de kurtarır. "Bu ¸ehre ili¸kin havadurumu " s s "bilgisi bulunmamaktadır. ˙ste bu noktada programcının imdadına Python’daki sözlük veri tipi ve bu I¸ veri tipinin get() adlı metodu yeti¸ecektir. Yukarıdaki kodların yerine getirdi˘ i i¸levi. Sadece üç sehir için hava durumu s g ¸ bilgilerini sorgulayacak olsak mesele de˘ il. E˘ er kullanıcının girdi˘ i s g g g sehir adı sözlü˘ ümüz içinde bulunmuyorsa. biçiminde bir mesaj gösterilecektir.") Ama yukarıdaki yöntemin. adı geçen de˘ erin sözlük içinde varolmaması durumunda kullanıcıya gösterilecek bir g mesaj seçme olana˘ ı da sunar. Ardından da g “anahtar-de˘ er” çiftleri seklinde sehir adlarını ve bunlara kar¸ılık gelen hava durumu bilgilerini g ¸ ¸ s bir sözlük içinde depoluyoruz.6 Bölüm Soruları 1. ¸ g 3. bu defa kullanıcıya Bu sehre ili¸kin hava durumu ¸ g ¸ s bilgisi bulunmamaktadır.get(soru. "izmir": "bulutlu"} s print cevap.print ("Bu ¸ehre ili¸kin havadurumu " s s "bilgisi bulunmamaktadır. s g g 2. bu kelimenin ˙ Ingilizce kar¸ılı˘ ını alabilmeli. Öncelikle sözü geçen senaryo için sözlükleri kullanmak programcıya daha az kodla daha çok i¸ yapma olana˘ ı sa˘ lar. Kodların daha az yer kaplaması sayesinde programın bakımı da kolayla¸acaktır. yukarıdaki yöntem yerine daha pratik bir yöntem uygulamak gayet yerinde bir tercih olacaktır. s 4. Bu metot bize sözlük içinde bir de˘ erin varolup olmadı˘ ını denetleme imkânının g g yanısıra.coding: utf-8 -*soru = raw_input("¸ehrinizin adını tamamı küçük " S "harf olacak ¸ekilde yazınız: ") s cevap = {"istanbul": "gök gürültülü ve sa˘anak ya˘ı¸lı". su kodlarla s g s ¸ da gerçekle¸tirebiliriz: s #!/usr/bin/env python # -*. biraz me¸akkatli olaca˘ ı açık. Daha sonra. sözlük metotlarından biri olan get() metodunu seçiyoruz. Tek tek “if-elif-else” blokları içinde sehir adı ve buna ili¸kin hava durumu bilgileri tanımla¸ s maya kıyasla sözlük içinde yeni anahtar-de˘ er çiftleri olu¸turmak daha pratiktir. ancak onlarca sehri kapsayacak bir program üretg ¸ mekse amacımız. bu anahtarın de˘ eri ekrana yazdırılacaktır. s g . if deyimleri yerine sözlüklerden yararlanmanın. g s Burada print cevap. ilk önce normal biçimde. E˘ er kullanıcının girdi˘ i sehir adı sözlü˘ ümüz içinde bir anahtar g g g ¸ g olarak tanımlanmı¸sa. "Bu ¸ehre ili¸kin hava durumu bilgisi s s bulunmamaktadır. yukarıda bahsedilen faydalarının dı¸ında bir s de su yararları vardır: ¸ 1.get(soru.") Gördü˘ ünüz gibi.") satırı yardımıyla soru adlı de˘ i¸kenin de˘ erinin sözlük içinde varolup gs g varolmadı˘ ını sorguluyoruz.

2: "iki". Python’un sayı de˘ erli anahtarlara neden böyle davrandı˘ ını ara¸tırın. 5 kilo ’¸eker’ mevcuttur.. "Ka¸ık": "100 adet"} s Burada her anahtar ve de˘ er su biçimde görünmeli: g ¸ Depoda Depoda Depoda Depoda 10 kilo ’Çay’ mevcuttur.. if "_" not in i[0]: .2. s 7: "yedi". 10: "on"} b = {3: "üç". "Bu ¸ehre ili¸kin havadurumu " s s "bilgisi bulunmamaktadır. Anahtarg g s ların birer sayı oldu˘ u sözlüklerle bazı denemeler yaparak. Mesela su iki sözlü˘ ün çıktılarını ö˘ e sıralaması g s ¸ g g açısından kar¸ıla¸tırın: s s a = {3: "üç".") Kullanıcı “q” tu¸una basarak programdan çıkabilmeli. S "Çay": "10 kilo".. 6:"altı".. 9: "dokuz". 7: "yedi". . S 100 adet ’Ka¸ık’ mevcuttur. s 6. Rakamla girilen sayıları yazıyla gösteren bir program yazın. s 100 kilo ’Çilek’ mevcuttur. . Yani bir sözlü˘ e girdi˘ iniz de˘ erler çıktıda sıralı g g g olarak görünmeyebilir. A¸a˘ ıdaki sözlü˘ ün hem anahtarlarını hem de de˘ erlerini ekrana basın: s g g g >>> . "izmir": "bulutlu"} s print cevap.. Su programı.. stok = {"Çilek": "100 kilo".get(soru. print i 5. 1: "bir". 10: "on"} 4. g s 3.. 4: "dört".... . Ancak bir sözlükte anahtarlar sayı oldu˘ unda Python bu sayıları sıraya g dizmektedir. çıktıda görünen ö˘ e sırasının hangi g g durumlarda bozuldu˘ unu bulmaya çalı¸ın. g g s "ankara": "açık ve güne¸li".coding: utf-8 -*soru = raw_input("¸ehrinizin adını tamamı küçük " S "harf olacak ¸ekilde yazınız: ") s cevap = {"istanbul": "gök gürültülü ve sa˘anak ya˘ı¸lı". Mesela kullanıcı “5” sayısını girdi˘ inde programımız “be¸” cevabını vermeli. "¸eker": "5 kilo". 2: "iki". 8:"sekiz". Su örnekte neden i yerine i[0] yazdı˘ ımızı açıklayın: ¸ g >>> for i in dir(dict): . Python sözlüklerinde sıra kavramı yoktur. 5: "be¸". tekrar tekrar çalı¸acak sekilde yeniden yazın: ¸ s ¸ #!/usr/bin/env python # -*.

˙ Ingilizce’de kümeye “set” diyorlar. Küme olu¸turmak çok kolay bir i¸lemdir. Gördü˘ ünüz gibi set() fonksiyonu içindeki ö˘ eler bir liste s g g içinde yer alıyor. Normalde uzun uzun kod yazmayı gerektiren durumlarda s g g kümeleri kullanmak. birle¸im ve fark gibi özellikler Python’daki setler için de geçerlidir. Yukarıda bo¸ bir küme olu¸turduk.BÖLÜM 12 Kümeler Bu bölümde. ˙ s s Içinde ö˘ e de barındıran kümeleri ise su sekilde olu¸turuyg ¸ ¸ s oruz: >>> kume = set(["elma". s Kümeleri ö˘ rendi˘ imizde. "kebap"]) Böylelikle. bir-iki satırla i¸lerimizi halletmemizi sa˘ layabilir. bir dizi halinde inceledi˘ imiz veri tiplerinin sonuncusu olan kümeleri inceleyeg ce˘ iz. matematikten bildi˘ imiz “küme” kavramının sahip oldu˘ u bütün özellikleri ta¸ır. küme g s s olu¸tururken listelerden faydalandık. "armut". Yani g g s kesi¸im. Dikkat ederseniz. "armut". Bu bölümün sonunda küme denen seyin ne oldu˘ unu ve ne i¸e yaradı˘ ını ö˘ reneceksg ¸ g s g g eniz. hem de epey i¸e yarar. bunların kimi zaman hiç tahmin bile edemeyece˘ imiz yerlerde g g g i¸imize yaradı˘ ını görece˘ iz. Örne˘ in bo¸ bir kümeyi söyle olu¸turuyoruz: s s g s ¸ s >>> bos_kume = set() Listeler. Küme olu¸turs s mak için set() fonksiyonundan yararlanıyoruz.1 Küme Olu¸ turmak s Kümelerin bize sunduklarından faydalanabilmek için elbette öncelikle bir küme olu¸turmamız s gerekiyor. Dolayısıyla yukarıdaki tanımlamayı söyle de yapabiliriz: ¸ >>> liste = ["elma". "kebap"] >>> kume = set(liste) 126 . demetler ve sözlüklerin aksine kümelerin ayırt edici bir i¸areti yoktur. s s 12. içinde ö˘ e barındıran ilk kümemizi ba¸arıyla olu¸turduk. s g Kümeler. Python’da nispeten yeni sayılabilecek bir araç olan kümeler hem çok hızlıdır.

E˘ er olu¸turdu˘ unuz kümeyi ekrana yazdırs g g g s g mak isterseniz. ˙ g Istersek demetleri de küme haline getirebiliriz: >>> demet = ("elma". "armut". Elbette küme tanımlamak için mutlaka liste kullanmak zorunda de˘ iliz. ’t’. ’ ’.. ne yapaca˘ ınızı biliyorsunuz. Buradan anlıyoruz ki. neden olmasın? s >>> bilgi = {"i¸letim sistemi": "GNU". Yani mesela “Python Programlama Dili” içinde iki adet “P” karakteri var. "da˘ıtım": "Ubuntu GNU/Linux"} g >>> kume = set(bilgi) Böylece kümeleri nasıl olu¸turaca˘ ımızı ö˘ rendik. Burada tanımladı˘ ınız küme de˘ i¸kenini kullang g gs manız yeterli olacaktır: >>> kume {’i¸letim sistemi’. ama çıktıda bu iki “P” karakterinin yalnızca biri görünüyor. Bir karakter dizisini küme olarak tanımlayıp ekrana ¸ s yazdırdı˘ ımızda elde etti˘ imiz çıktı. ’r’. ’da˘ıtım’} s g g Bir de suna bakalım: ¸ >>> kardiz = "Python Programlama Dili" >>> kume = set(kardiz) >>> print kume set([’a’. ’l’. Bu çok önemli bir özelliktir ve pek çok yerde i¸imize yarar. ’m’. ’h’. Aynı dus rum karakter dizisi dı¸ında kalan öteki veri tipleri için de geçerlidir. ’P’. ’n’. ’i’. Tek karakterlik dizilerden g bile küme olu¸turabiliriz: s >>> kardiz = "a" >>> kume = set(kardiz) Ama sayılardan küme olu¸turamayız: s >>> n = 10 >>> kume = set(n) TypeError: ’int’ object is not iterable Peki sözlükleri kullanarak küme olu¸turabilir miyiz? Evet. s g . ’y’]) Burada bir sey dikkatinizi çekmi¸ olmalı. ’sistem çekirde˘i’. ’D’.Bu daha temiz bir görüntü oldu. kümeler aynı ö˘ eyi g birden fazla tekrar etmez. ’g’. "sistem çekirde˘i": "Linux". o karakter dizisi içindeki her bir karakteri tek bir kez g g içeriyor.. "kebap") >>> kume = set(demet) Hatta ve hatta karakter dizilerinden dahi küme yapabiliriz: >>> kardiz = "Python Programlama Dili için Türkçe Kaynak" >>> kume = set(kardiz) Kullandı˘ ımız karakter dizisinin böyle uzun olmasına da gerek yok. Yani mesela e˘ er bir listeyi s g . ’o’.

"armut". ’__reduce_ex__’. O halde hiç vakit kaybetmeden yolumuza devam edelim.. ba¸ka kümelerle kar¸ıla¸tırılas g s s s bilme kabiliyetidir. g s¸ Esasında tek bir küme pek bir i¸e yaramaz. ’__eq__’. ’__isub__’. "a˘aç". "¸eker"] g s s >>> for i in set(liste): .. ’__or__’. ’__delattr__’. ’__hash__’. ’__gt__’.. "armut". ’__repr__’. ’__ior__’. . ’__le__’. demet için tuple(). Yani mesela kümelerin kesi¸imini. "kiraz". ’__doc__’. "kiraz". ’__len__’. g sözlük için de dict() fonksiyonlarını kullanıyorsak. kümemiz bu ö˘ eleri teke indirecektir.. "¸eker". "kebap". Kümeler ancak birden fazla oldu˘ unda bunlarla s g yararlı i¸ler yapabiliriz. liste.. ’__format__’. Ö˘ rendi˘ imiz bu bilgi sayesinde. ˙ste biz de simdi bu tür i¸lemleri nasıl I¸ ¸ s yapaca˘ ımızı ö˘ renece˘ iz. ’__contains__’. ’__lt__’. Nasıl liste için list(). ’__getattribute__’. o listedeki ö˘ eler küme içinde yalnızca bir kez geçecektir. ’__ge__’. liste ö˘ elerini e¸siz ve benzersiz bir hale getirdik. birle¸imini veya farkını bulabilmek için s s öncelikle elimizde birden fazla küme olması gerekiyor. daha önce gördü˘ ümüz count() metodunu da kullanarak. "kebap"] >>> for i in set(liste): . print i .. ’__ixor__’. "çilek". "armut". ’__ne__’. ’__rand__’. ’__iter__’. ’__class__’. Çünkü kümelerin en önemli özelli˘ i. Artık biz bir veri tipinin g metotlarını nasıl listeleyece˘ imizi çok iyi biliyoruz. a˘aç g elma s ¸eker kebap çilek armut Gördü˘ ünüz gibi.küme haline getiriyorsak. ’__new__’. ’__iand__’.. "¸eker". Python’daki kümeler yardımıyla teke g g indirilebiliyor. "kebap". kümelerin de metotları vardır.count(i)) elma listede 3 kez geçiyor! kiraz listede 2 kez geçiyor! armut listede 1 kez geçiyor! kebap listede 1 kez geçiyor! çilek listede 1 kez geçiyor! Burada set(liste) ifadesini kullanarak. "elma".. "çilek". kümeler için de set() adlı fonksiyondan yararlanaca˘ ız: g >>> dir(set) [’__and__’. "elma"..2 Kümelerin Metotları Daha önceki veri tiplerinde oldu˘ u gibi. print "%s listede %s kez geçiyor!"%(i. g g g 12. ’__init__’. ’__reduce__’. Listede g aynı ö˘ eden iki-üç tane bulunsa bile. g g g söyle bir kod yazabiliriz: ¸ >>> liste = ["elma". liste içinde birden fazla bulunan ö˘ eler. "elma". s .. g g >>> liste = ["elma". .

print i . ’add’. if "__" not in i: ... add clear copy difference difference_update discard intersection intersection_update isdisjoint issubset issuperset pop remove symmetric_difference symmetric_difference_update union update Gördü˘ ünüz gibi kümelerin epey metodu var. Unutmadan söyleyelim: Kümeler de. Bu metodu daha önce sözlükleri g çalı¸ırken de görmü¸tük. ’intersection_update’.. ’issubset’. ’__rsub__’.. print i . ’isdisjoint’. ’__setattr__’. ’__sub__’.. ’intersection’. Neden? Çünkü e˘ er sadece “_” kullanırsak symmetg g ric_difference ve symmetric_difference_update metotları çıktımızda yer almayacaktır. tıpkı listeler ve sözlükler gibi. ’union’.1 clear metodu Kümelerle ilgili olarak inceleyece˘ imiz ilk metot clear(). ’__sizeof__’.. Bu arada if "__" not in i satırında “_” yerg ine “__” kullandı˘ ımıza dikkat edin. ’difference_update’. ’clear’. ’__xor__’. ’update’] Hemen i¸imize yarayacak metotları alalım: s >>> for i in dir(set): .clear() >>> km set([]) .2. ’remove’.. ’issuperset’. ’pop’. ’discard’.’__ror__’. gs 12. ’__subclasshook__’. a d n >>> km. de˘ i¸tirilebilir bir veri tipidir. ’symmetric_difference’.. Burada s s g s da aynı vazifeyi görür: >>> km = set("adana") >>> for i in km: ..’copy’. ’__str__’. ’__rxor__’.. ’difference’. Sözlüklerde bu metodun görevi sözlü˘ ün içini bo¸altmak idi. ’symmetric_difference_update’.

Aynen sözlüklerde oldu˘ u gibi. “km” adlı kümeyi “yedek” adıyla kopyaladık. g s g g Dolayısıyla ö˘ elere sıralarına göre eri¸emiyoruz. ’armut’. . tıpkı sözlüklerde oldu˘ u gibi. Örne˘ in add() gs g bu tür metotlardan biridir. ’m’. Bu metot aynı zamanda g s kümelerle birlikte de kullanılabilir. "armut". Dolayısıyla gs g s kümeler. Bu da bize kümelerle ilgili çok önemli bir bilgi daha veriyor. ’k’. bunların de˘ i¸tirilebilir bir veri tipi oldu˘ unu söylemi¸tik.add("çilek") >>> print kume set([’elma’.3] >>> for i in yeni: .copy() >>> yedek set([’a’. ’r’. kümeler de sırasız veri tipleriymi¸. g g E˘ er bir kümeye birden fazla ö˘ eyi aynı anda eklemek isterseniz for döngüsünden yararlang g abilirsiniz: >>> yeni = [1. kümemize çilek adlı yeni bir ö˘ e ekledik. Demek ki. Çünkü. ’m’. ’\x9f’.add(i) . üzerlerinde de˘ i¸iklik yapmamıza müsaade eden metotlar da içerir.2.. Daha sonra da clear() metodunu kullanarak bu s kümenin bütün ö˘ elerini sildik. bu metot yardımıyla kümelerimize yeni ö˘ eler ilave edebilece˘ iz. ’kebap’. Elde etti˘ imiz çıktıda ö˘ eler rastgele diziliyor. Adından da anla¸ılaca˘ ı gibi. ’n’. kümeler her bir ö˘ eyi tek bir sayıda barındırır. ama bu ¸ s iki kümenin çıktılarına baktı˘ ımız zaman ö˘ e sıralamasının birbirinden farklı oldu˘ unu görüyg g g oruz.2 copy metodu Listeler ve sözlükleri incelerken copy() adlı bir metot ö˘ renmi¸tik. ’h’.. ’n’]) >>> km set([’a’... Üstelik i¸levi de aynıdır: s >>> km = set("kahramanmara¸") s >>> yedek = km.2.2. kume. ’\x87ilek’]) Gördü˘ ünüz gibi.Burada önce “km” adlı bir küme olu¸turduk. Hemen s g g g bunun nasıl kullanıldı˘ ına bakalım: g >>> kume = set(["elma". g s g 12.. ’h’. "kebap"]) >>> kume. add() metodunu kullanarak. g s 12.3 add metodu Kümelerden bahsederken. ’r’. daha önce de söyledi˘ imiz gibi.. ’\x9f’]) Burada bir sey dikkatinizi çekmi¸ olmalı. ’k’. Artık elimizde bo¸ bir sözlük var. E˘ er g g g kümede zaten varolan bir ö˘ e eklemeye çalı¸ırsak kümede herhangi bir de˘ i¸iklik olmayacakg s gs tır. Add kelimesi Türkçe’de “eklemek” anlamına gelir.

g ˙ Isterseniz uzun uzun difference() metodunu kullanmak yerine sadece eksi (-) i¸aretini kullas narak da aynı sonucu elde edebilirsiniz: >>> k1 .. 5]) Demek ki k1’in k2’den farkı buymu¸. 3. ’kebap’. “madem eksi i¸aretini kullanabiliyoruz. Yani? g Hemen bir örnek verelim: >>> k1 = set([1. Yani ikinci kullanımda k2’de bulunup k1’de bulunmayan ö˘ eleri alıyoruz. ’elma’. Bu metodun adı update() s metodudur. Ama bu i¸lemi yapmanın ba¸ka bir s s yolu daha vardır. ’\x87ilek’.k1 Hayır. 4.k2 .5 difference_update metodu Bu metot. ’armut’]) Burada yeni adlı listeyi kümeye for döngüsü ile ekledik.4 difference metodu Bu metot iki kümenin farkını almamızı sa˘ lar.difference(k2) set([1. 2. 5]) >>> k1.>>> kume set([1... difference() metodundan elde edilen sonuca göre bir kümenin güncellenmesini sa˘ lar. Örne˘ in: g g >>> k1 = set([1. o halde artı i¸aretini de kullanabiliriz!” gibi bir s s fikir do˘ ru de˘ ildir. 2. 2.. g 12.difference(k1) set([10. 2. 5]) >>> k2 = set([3. 3.2.veya. 4]) Gördü˘ ünüz gibi. k1’de bulunup k2’de bulunmayan ö˘ eleri elde ediyoruz.2. g g 12.difference_update(k2) set([2]) >>> print k1 . 3]) >>> k2 = set([1. Peki k2’nin k1’den farkını bulmak istersek ne yapaca˘ ız? s g >>> k2. birinci kullanımda. Bu i¸lem için Python’da ayrı bir metot bulunur. 10]) >>> k1. 3. >>> k2 . Sırası gelince bu metodu da görece˘ iz. g g ˙ Ikinci kullanımda ise bunun tam tersi.

g s g 12. k1 ile k2 arasındaki tek fark 2 adlı ö˘ e idi. kümede olmayan bir ö˘ eyi silmeye çalı¸ırsak herhangi bir hata mesajı alg s mayaca˘ ımızı söylemi¸tik. ’at’]) E˘ er küme içinde bulunmayan bir ö˘ e silmeye çalı¸ırsak hiç bir sey olmaz. Bu metodun en önemli özelli˘ i s g budur. E˘ er remove() metodunu kullanarak. Bu bölümde ö˘ renece˘ imiz discard() metodu ise kümeden g g g ö˘ e silmemizi sa˘ layacak: g g >>> hayvanlar = set(["kedi".remove("köpek") Peki discard() varken remove() metoduna ne gerek var? Ya da tersi. hata mesajı alırız: s >>> hayvanlar. "köpek". "at". duruma g göre her iki özelli˘ e de ihtiyacımız olabilir. in <module> KeyError: ’fare’ Bu iki metot arasındaki bu fark önemli bir farktır. g s E˘ er bir kümeden ö˘ e silmek istersek remove() metodunu da kullanabiliriz: g g >>> hayvanlar. g .7 remove metodu Bu metot da bir önceki bölümde gördü˘ ümüz discard() metoduyla aynı i¸levi yerine getirir. önceden olu¸turdu˘ umuz bir kümg g s g eye yeni ö˘ eler ekleyebiliyorduk.2. 3.2. "deve"]) s >>> hayvanlar.set([2]) >>> print k2 set([1. discard() metodunun aksine. ’inek’. ’k\x94pek’.6 discard metodu Bir önceki bölümde ö˘ rendi˘ imiz add() metodu yardımıyla. "ku¸". "inek". Hatırlarsanız diss card() metoduyla. Bu iki metot aynı i¸levi yerine getirse de aralarında önemli bir fark vardır. Yani hata mesajı g g s ¸ almayız: >>> hayvanlar. line 1. Dolayısıyla difference_update() metodunu g uyguladı˘ ımızda k1’in ö˘ elerinin silinip yerlerine 2 adlı ö˘ enin geldi˘ ini görüyoruz.discard("yılan") Burada etkile¸imli kabuk sessizce bir alt satıra geçecektir. 5]) Gördü˘ ünüz gibi. kümede olmayan bir ö˘ eyi g s g g silmeye çalı¸ırsak. Yani olmayan bir ö˘ eyi silmeye çalı¸tı˘ ımızda hata vermemesi.remove("fare") Traceback (most recent call last): File "<stdin>". g g g g 12.discard("kedi") >>> print hayvanlar set([’ku\x9f’. Bazen yazdı˘ ımız programlarda. bu metot k1’in k2’den farkını aldı ve bu farkı kullanarak k1’i yeniden olu¸g s turdu. ’deve’.

Benzer bir durum intersection() metodu için de geçerlidir. difference() kelimesi yerine “-” i¸aretini de s kullanabilece˘ imiz. E˘ er kullanıcı gs gs g g herhangi bir Türkçe harf içermeyen bir kelime girerse set(tr) ve set(parola) kümelerinin kesi¸im kümesi bo¸ olacaktır. 3]) Gördü˘ ünüz gibi. tr de˘ i¸keni ile parola de˘ i¸keni arasındaki ortak ö˘ eleri sorguluyoruz. 3]) Python programcıları genellikle uzun uzun intersection yazmak yerine “&” i¸aretini kullanırlar. 2.intersection(k2) set([1. inters g section() metodu bize iki kümenin kesi¸im kümesini verecektir: s >>> k1 = set([1. s ˙ Isterseniz bu metot için örnek bir program verelim. 4]) >>> k2 = set([1.2. Programda asıl i¸i yapan kısım su satırdır: g s ¸ if set(tr) & set(parola): print "Parolanızda Türkçe harfler kullanmayın!" Burada aslında söyle bir sey demi¸ oluyoruz: ¸ ¸ s E˘ er set(tr) ve set(parola) kümelerinin kesi¸im kümesi bo¸ de˘ ilse. Bu kodlarda kümeleri nasıl kullandı˘ ımıza dikkat edin.coding: utf-8 -*tr = "¸çö˘üı¸ÇÖ˘Ü˙" s g S G I parola = raw_input("Sisteme giri¸ için bir parola belirleyin: ") s if set(tr) & set(parola): print "Parolanızda Türkçe harfler kullanmayın!" else: print "Parolanız kabul edildi!" Burada e˘ er kullanıcı. s Hatırlarsanız. ˙ g s Iki kümenin kesi¸imini bulmak için “&” i¸aretinden yararlanabiliriz: s s >>> k1 & k2 set([1.8 intersection metodu intersection kelimesi Türkçe’de “kesi¸im” anlamına gelir. Adından da anladı˘ ımız gibi. Böylece gerçek hayatta bu metodu nasıl kullanabilece˘ imizi görmü¸ oluruz: g s # -*. Dolayısıyla bu iki küme g s arasındaki ortak elemanları bulmu¸ oluyoruz. parola belirlerken içinde Türkçe bir harf geçen bir kelime yazarsa prog gramımız kendisini Türkçe harf kullanmaması konusunda uyaracaktır. 5. kullanıcının girdi˘ i s s g kelime içindeki harflerden en az birinin tr adlı de˘ i¸ken içinde geçti˘ i anlamına gelir. bu metot bize k1 ve k2’nin kesi¸im kümesini veriyor. 7]) >>> k1.. söylemi¸tik. Burada gs g basitçe.12. kullanıcıya g s s g “Parolanızda Türkçe harfler kullanmayın!” uyarısını göster! set(tr) ve set(parola) kümelerinin kesi¸im kümesinin bo¸ olmaması. 3.. 3. ˙ s s Isterseniz küçük bir deneme yapalım: . difference() metodunu anlatırken.

Böyle bir durumda set(tr) g ve set(parola) kümelerinin kesi¸im kümesi “ç” harfini içerecek. intersection() metodundan elde edilen sonuca göre bir kümenin güncellenmesini sa˘ lag maktır: >>> k1 = set([1. 3]) >>> print k1 set([1. 5]) >>> k1. 2.2. Bu metodun I¸ s görevi. intersection() metodunu pek çok yerde kullanabilirsiniz. elde etti˘ imiz küme bo¸.9 intersection_update metodu Hatırlarsanız difference_update() metodunu i¸lerken söyle bir sey demi¸tik: s ¸ ¸ s Bu metot. dolayısıyla da programımız s kullanıcıya uyarı mesajı gösterecektir. Hatta iki dosya arasındaki benzerlikleri bulmak için dahi bu metottan yararlanabilirsiniz. g g 12. ˙ Ilerde dosya i¸lemleri konusunu i¸lerken bu s s metottan nasıl yararlanabilece˘ imizi de anlataca˘ ız. difference() metodundan elde edilen sonuca göre bir kümenin güncellenmesini sa˘ lar. Dolayısıyla böyle bir durumda programımız kulg g s lanıcıya herhangi bir uyarı mesajı göstermeyecektir. 3. 3]) >>> k2 = set([1. 3]) >>> print k2 set([1. g ˙ste intersection_update metodu da buna çok benzer bir i¸levi yerine getirir. 5]) Gördü˘ ünüz gibi.intersection_update(k2) set([1. intersection_update() metodu k1’in bütün ö˘ elerini sildi ve yerlerine k1 ve g g k2’nin kesi¸im kümesinin elemanlarını koydu.>>> tr = "¸çö˘üı¸ÇÖ˘Ü˙" s g S G I >>> parola = "çilek" >>> set(tr) & set(parola) set([’ç’]) Burada kullanıcının “çilek” adlı kelimeyi girdi˘ ini varsayıyoruz. s . 3. E˘ er kullanıcımız “kalem” gibi Türkçe harf içermeyen bir g kelime girerse: >>> tr = "¸çö˘üı¸ÇÖ˘Ü˙" s g S G I >>> parola = "kalem" >>> set(tr) & set(parola) set([]) Gördü˘ ünüz gibi.

. 1.isdisjoint(b) True Burada a ve b kümeleri ortak hiç bir elemana sahip olmadı˘ ı için “Do˘ ru” anlamına gelen True g g çıktısını elde ediyoruz. 6]) >>> a. 3]) >>> b = set([2. a ve b kümesinin kesi¸imi bo¸ olmadı˘ ı için. 4.12 issuperset metodu Bu metot. Burada temel olarak su soruyu g g ¸ sormu¸ oluyoruz: s a ve b ayrık kümeler mi? Python da bize cevap olarak. 4. 6]) >>> a.12. b‘nin alt kümesidir. 5]) >>> a.issubset(b) True Bu örnekte True çıktısını aldık..” anlamına gelen False çıktısını veriyor. 3. 3]) >>> b = set([0. e˘ er de˘ ilse False çıktısını verecektir: g g g >>> a = set([1. Yani bir kümenin. 2.2.11 issubset metodu Bu metot yardımıyla.10 isdisjoint metodu Bu metodun çok basit bir görevi vardır. 2. 2. Matematik derg slerinde gördü˘ ümüz “kümeler” konusunda hatırladı˘ ınız “b kümesi a kümesini kapsar” g g . 3. yani bu iki kümenin ortak eles s g man içerip içermedi˘ ini ö˘ renmekse.isdisjoint(b) False Gördü˘ ünüz gibi.2. g Yani a. Hatırlarsanız aynı i¸i bir önceki bölümde s g s gördü˘ ümüz intersection() metodunu kullanarak da yapabiliyorduk. isdisjoint() metodu False çıktısı veriyor. ba¸ka bir kümenin alt kümesi olup olmadı˘ ını bu g s g metot yardımıyla ö˘ renebiliriz. bir önceki bölümde gördü˘ ümüz issubset() metoduna benzer. E˘ er bir küme ba¸ka bir kümenin alt kümesi ise bu metot bize g g s True de˘ erini verecek. 5]) >>> b = set([2. 12. yani bu iki küme ortak en az bir g s s g ö˘ e barındırdı˘ ı için.2. çünkü a kümesinin bütün ö˘ eleri b kümesi içinde yer alıyor. Çünkü a g ve b kümelerinin ortak bir elemanı var (2). 12. “Hayır de˘ il. basitçe isdisjoint() metodundan yararlanabilirsiniz: g g >>> a = set([1. isdisjoint() metodunu kullanarak iki kümenin kesi¸im s kümesinin bo¸ olup olmadı˘ ı sorgulayabilirsiniz. 4. Bir de suna bakalım: ¸ >>> a = set([1. Ama e˘ er hayattan tek g g beklentiniz iki kümenin kesi¸im kümesinin bo¸ olup olmadı˘ ını. bir kümenin bütün elemanlarının ba¸ka bir küme içinde yer alıp yer als madı˘ ını sorgulayabiliriz.

bu metodun kısayolu olan “|” i¸areti Python programcıları tarafından s daha sık kullanılır. 3.union(b) {1.ifadesini bu metotla gösteriyoruz.. 3]) >>> b = set([0. 3] >>> for i in yeni: . “b kümesi a kümesini kapsar. 4. 3.” sonucunu elde ediyoruz.issubset(b) True Buradan. 3. ’elma’.2. 5. union() metodu yerine “|” i¸aretini de kullanabiliriz: s >>> a | b union() metodu yerine. 8} Önceki bölümlerde gördü˘ ümüz bazı metotlarda oldu˘ u gibi. 4. 1. 8]) >>> b = set([1.. 2. 1. "armut". 2.13 union metodu union() metodu iki kümenin birle¸imini almamızı sa˘ lar. 12. 2. set([1. Önce bir önceki derste gördü˘ ümüz örne˘ e bakalım: g g >>> a = set([1. 7]) >>> a. 6.” sonucuna ula¸ıyoruz. 7. "kebap"]) >>> yeni = [1.issuperset(a) True Burada ise. 4. union() metodu da bir kısayola g g sahiptir.. 3]) >>> b = set([0. 2. 5]) >>> a.add(i) .. 6.14 update metodu Hatırlarsanız add() metodunu anlatırken söyle bir örnek vermi¸tik: ¸ s >>> kume = set(["elma". 5]) >>> b. ’armut’]) Bu örne˘ i verdikten sonra da söyle bir sey demi¸tik: g ¸ ¸ s . 2. “a kümesi b kümesinin alt kümesidir. 5.2. 4. Bir de suna bakalım: s ¸ >>> a = set([1. ’\x87ilek’. 12. ’kebap’. 3. 2. 2. 3. kume. Hemen bir örnek verelim: s g >>> a = set([2. Yani b kümesi a kümesinin bütün elemanlarını içinde barındırıyor.

’kebap’. g s 12. "kebap"]) >>> yeni = [1. g s ric_difference_update() metodu da bunlara benzer bir i¸levi yerine getirir: s symmet- .symmetric_difference(b) set([2. 2.2.difference(b) set([2]) Demek ki a kümesinde bulunup b kümesinde bulunmayan ö˘ e 2 imi¸. 5]) E˘ er a kümesinin b kümesinden farkını bulmak istersek söyle yapıyoruz: g ¸ >>> a.“Burada yeni adlı listeyi kümeye for döngüsü ile ekledik. for döngüsünü kullanmaya gerek kalmadan aynı sonucu elde edebildik. bu metodu kullanarak tekrar yazalım: g >>> kume = set(["elma". Bu metot. g 12. Metodumuzun adı update(). bir kümeyi I¸ g güncellememizi sa˘ lar.16 symmetric_difference_update metodu Daha önce difference_update ve intersection_update gibi metotları ö˘ renmi¸tik. ama a kümesinde g bulunmuyormu¸. ’elma’. 2. Demek ki bu ö˘ e b kümesinde bulunuyor. 3. g s Bir de b kümesinde bulunup a kümesinde bulunmayan ö˘ elere bakalım: g >>> b. ˙ g Isterseniz yukarıdaki örne˘ i. Bu i¸lem için Python’da ayrı bir metot bulunur. 4]) Böylece iki kümede de bulunmayan ö˘ eleri aynı anda almı¸ olduk. ’armut’} Gördü˘ ünüz gibi. 2.15 symmetric_difference metodu Daha önceki bölümlerde difference() metodunu kullanarak iki küme arasındaki farklı ö˘ eleri g bulmayı ö˘ renmi¸tik.” s ˙ste bu metodu ö˘ renmenin vakti geldi. 4.difference(a) set([4]) Bu da bize “4” çıktısını verdi. "armut".update(yeni) >>> print kume {1.2. Peki ya kümelerin ikisinde de bulunmayan ö˘ eleri aynı anda nasıl alaca˘ ız? s g g i¸te bu noktada yardımımıza symmetric_difference() adlı metot yeti¸ecek: s s >>> a. 3] >>> kume. Örne˘ in elimizde söyle iki küme var diyelim: g s g ¸ >>> a = set([1. Ama bu i¸lemi yapmanın ba¸ka bir s s yolu daha vardır. 5]) >>> b = set([1.

Burada da g g kümelerin ö˘ elerini silip ekrana basıyor: g >>> a = set(["elma". Ancak kimi durumlarda. ö˘ eleri üzerinde de˘ i¸iklik yapılamayan kümelere de ihtiyaç duyabilirsiniz. hiç olmazsa arada sırada göz gezdirmek bazı seylerin zihnimizde ¸ yer etmesi açısından oldukça önemlidir. Demetler ço˘ u zaman. 5]) >>> b = set([1.3 Dondurulmu¸ Kümeler (Frozenset) s Daha önce de söyledi˘ imiz gibi. Bu s konuları sık sık tekrar etmek. Gerçi bu metot bize hiç yabancı de˘ il. ’__lt__’. ’__eq__’. bu metot listenin g g bir ö˘ esini silip ekrana basıyordu. "armut". ’__len__’. g g Bu metodu listeler konusundan hatırlıyoruz. g Böylelikle Python’da Listeler. Zaten kümelerin g gs add() ve remove() gibi metotlarının olması bu durumu teyit ediyor. ’__contains__’. s 12. 5]) >>> a.pop() ’elma’ Peki bu metot hangi ölçüte göre kümeden ö˘ e siliyor? Herhangi bir ölçüt yok. "armut". ’__class__’. ’__format__’. Bu metot. "kebap"]) >>> a. ’__hash__’. ’__or__’. Dilerseniz hemen bununla ilgili bir örnek verelim: >>> dondurulmus = frozenset(["elma". kümeler üzerinde de˘ i¸iklik yapabiliyoruz. ’__le__’.>>> a = set([1. a kümesinin eski ö˘ eleri gitti.2.17 pop metodu ˙ Inceleyece˘ imiz son metot pop() metodu olacak. 4]) Gördü˘ ünüz gibi. ’__ge__’. Hatırlarsanız lisg gs teler ve demetler arasında da buna benzer bir ili¸ki var. Aslında buradaki fonksiyonu da farklı de˘ il. ’__iter__’. yerlerine symmetric_difference() metoduyla g g elde edilen çıktı geldi. ˙ste Python aynı imkanı bize kümelerde de gs I¸ sa˘ lar. ’__init__’.4. Sözlükler ve Kümeler konusunu bitirmi¸ olduk. üzerinde s g de˘ i¸iklik yapılamayan bir liste gibi davranır. E˘ er ö˘ eleri üzerinde de˘ i¸iklik yapılamayan bir küme olu¸turmak isterseniz set() yerg g g gs s ine frozenset() fonksiyonunu kullanabilirsiniz. "ayva"]) Dondurulmu¸ kümeleri bu sekilde olu¸turuyoruz. Yani a kümesi. ’__ne__’. Demetler.2. ’__new__’. ’__doc__’.. symmetric_difference() metodunun sonucuna göre güncellenmi¸ oldu.symmetric_difference_update(b) >>> print a set([2. . ’__gt__’. küme g ö˘ elerini tamamen rastgele siliyor. Orada ö˘ rendi˘ imize göre. ’__getattribute__’. Simdi bu dondurulmu¸ kümenin metotlarına s ¸ s ¸ s bakalım: >>> dir(dondurulmus) [’__and__’.. 12. ’__delattr__’.

Sayılardan küme olu¸turmak istedi˘ imizde söyle bir hata ¸ s g ¸ mesajı veriyor bize Python: >>> a = 10 >>> set(a) Traceback (most recent call last): File "<stdin>". line 1. Ancak kullanıcının girdi˘ i her renk adı kendisine bir kez bildirilmeli. ’__str__’. Demetler bölümünde söyle bir soru sormu¸tuk: ¸ s Diyelim ki elimizde söyle bir liste var: ¸ liste = ["elma".4 Bölüm Soruları 1. ’symmetric_difference’. ’__repr__’. ’__subclasshook__’. Bu ikisi s s arasındaki fark. Ancak aynı s seyi sayıları kullanarak yapamıyoruz. ’issubset’. "elma". ’__xor__’. ’__setattr__’. add(). 12. demet. Kullanıcıya renk adları soran bir program yazın. ’__ror__’. Dondurulmu¸ kümeler ile normal kümeler arasında i¸lev olarak hiçbir fark yoktur.’__rand__’. ’copy’. "kiraz". Karakter dizilerini. g g . sözlük ve kümeleri kar¸ıla¸tırdı˘ ınızda. ’__sizeof__’. Bu hatayı ba¸ka hangi durumg s s larda alırsınız? 4. Liste. ’isdisjoint’. ’issuperset’. Kullanıcıdan gelen renk adlarını programın sonunda kullanıcıya bildirin. demetleri ve listeleri kullanarak küme olu¸turabiliyoruz. ’difference’. Bir küme içinde herhangi bir ö˘ enin bulunup bulunmadı˘ ını nasıl sorgulayabilece˘ imizi g g g gösteren bir örnek kod yazın. ’intersection’. in <module> TypeError: ’int’ object is not iterable Burada Python bize kabaca söyle bir sey söylemi¸ oluyor: “Sayılar üzerinde döngü kurula¸ ¸ s maz!”. de˘ i¸iklik yapmaya yönelik metotlar listede g gs yok. listede kaç kez geçti˘ ini söyleyen bir program yazın. "kebap"] Bu listedeki her bir ö˘ enin. Aldı˘ ınız bu hata mesajının anlamı üzerinde dü¸ünün. bu veri tiplerini olu¸turma bakımından s s g s kümelerle öteki veri tipleri arasında nasıl bir fark görüyorsunuz? 2. g yani renk adları tekrar etmemeli. ’union’] Gördü˘ ünüz gibi. 3. "elma". ’__rxor__’. ’__sub__’. ’__reduce__’. Programınız g g tam olarak söyle bir çıktı vermeli: ¸ elma ö˘esi listede 3 kez geçiyor! g armut ö˘esi listede 1 kez geçiyor! g kiraz ö˘esi listede 2 kez geçiyor! g çilek ö˘esi listede 1 kez geçiyor! g kebap ö˘esi listede 1 kez geçiyor! g Kümeler bölümünde ö˘ rendi˘ iniz bilgileri de dikkate alarak bu programı yeniden yazın. "kiraz". ’__reduce_ex__’. "çilek". remove(). update() gibi. ’__rsub__’. listeler ile demetler arasındaki fark gibidir. 5. "armut".

Saygılarımızla.2009 tariginde yaptı˘ımız ba¸vurunun sonuçlandırılması g s hususunda yardımlarınızı rica ederiz. g gs Bu kodları bu sekilde yazmak oldukça verimsiz bir yoldur.coding: utf-8 -*print """Sayın Mehmet Bey.2010 tariginde yaptı˘ımız ba¸vurunun sonuçlandırılması g s hususunda yardımlarınızı rica ederiz. Orçun Kunek""" Burada dikkat ederseniz iki dilekçenin metin içeri˘ i aslında aynı.. Yani mesela yukarıdaki iki dilekçenin aynı program içinde oldu˘ unu varsayarsak.. yukarıdaki gibi bir durumda elinde bir dilekçe tasla˘ ı bulundurur ve sadece de˘ i¸tirmesi gereken kısımları g gs de˘ i¸tirip dilekçeyi hazır hale getirir. Ayrıca tabii dilekçe g üzerindeki tarih bilgilerini de güne göre düzenliyorsunuz. Ahg met Bey’e gönderece˘ iniz zaman ise Ahmet Bey’in adını yazıyorsunuz. ˙ Isterseniz bir tane de Ahmet Bey’e yazalım. 15.01.BÖLÜM 13 Fonksiyonlar Simdi söyle bir dü¸ünün: Diyelim ki çalı¸tı˘ ınız i¸yerinde her gün bir yerlere dilekçe gönderiy¸ ¸ s s g s orsunuz. dilekçe metnindeki bir hatayı düzeltmek g 140 . hem de bu kodların s s bakımını yapmak çok zordur. Sadece bir-iki yer de˘ i¸iyor. hem fazlasıyla kopyala-yapı¸tır i¸lemi gerektirir. 19.12. Her defasında aynı bilgileri en ba¸tan yazmaz. E˘ er dilekçe metni üzerinde bir de˘ i¸iklik yapmak isterseniz g gs program içindeki ilgili kodları tek tek bulup düzeltmeniz gerekir. Çünkü bu sistem hem program¸ cıya çok vakit kaybettirir. Dilerseniz gs s anlattı˘ ımız bu durumu Python programlama dili ile temsil etmeye çalı¸alım: g s #!/usr/bin/env python # -*. Aslında farklı yerlere gönderdi˘ iniz bu dilekçeler temel olarak aynı içeri˘ e sahip. Mantıklı bir insan. Saygılarımızla. #!/usr/bin/env python # -*.coding: utf-8 -*print """Sayın Ahmet Bey. g g Yani mesela dilekçeyi Mehmet Bey’e gönderece˘ iniz zaman yazıya Mehmet Bey’in adını. Orçun Kunek""" Bu dilekçe Mehmet Bey’e gidiyor.

.. Ayrıca fonksiyonları tanımlarken en sona parantez ve iki nokta üst üste i¸arets lerini de koymayı unutmuyoruz. Python’da fonksiyonları g söyle tanımlıyoruz: ¸ def fonksiyon_adi(): . Fonksiyon tanımının iki nokta s üst üste i¸areti ile bitmesinden. Hele bir de dilekçe sayısı çok fazlaysa bu i¸lemin ne kadar zor olas ca˘ ını bir dü¸ünün. Bu fonksiyonun s s bir i¸e yarayabilmesi için bunun altını doldurmamız gerekiyor. bütün dilekçe metinlerini tek tek gözden ¸ g geçirmemiz gerekecektir. def fonksiyon_adi(): satırından sonra gelen kısmın girintili yazılmasıdır. her metin düzenleyicide bulunan “bul-de˘ i¸tir” g s gs özelli˘ ini kullanabiliriz. Henüz bu fonksiyonun i¸letilmesini s sa˘ layacak kodu yazmadık. Ancak fonksiyon adı belirlerken. ¸ Simdi isterseniz bu fonksiyonu nasıl kullanabilece˘ imizi görelim: ¸ g #!/usr/bin/env python # -*. Ama henüz i¸imiz bitmedi.coding: utf-8 -*def fonksiyon_adi(): print "merhaba fonksiyon!" Bu kodları bir metin düzenleyiciye kaydedip çalı¸tırdı˘ ımızda hiç bir çıktı elde edemeyiz. g ¸ s g 13. ardından da fonksiyonumuzun adını yazıyoruz. Böylece ilk fonksiyonumuzu tanımlamı¸ olduk. Tabii bu basit durum için. Gördü˘ ünüz gibi. Çünkü s g biz burada fonksiyonumuzu sadece tanımlamakla yetindik. önce def parçacı˘ ını.. Simdi bu fonksiyonun hayat kazanmasını sa˘ layacak kodları gireg ¸ g biliriz: #!/usr/bin/env python # -*. Örne˘ in yukarıdaki dilekçe g g metninde bir yazım hatası var. de˘ il mi? ˙ste Python buna benzer durumlar için bize “fonksiyon” denen g I¸ bir araç sunar. Ama i¸ler her zaman bu kadar kolay olmayabilir. ˙ satırda “tarihinde” yazaca˘ ımıza “tariginde” yazmı¸ız. Burada dikkat etmemiz gereken en önemli s sey. Yalnız fonksiyon adlarında Türkçe karakter kullanmas s s manız gerekiyor. Biz de bu bölümde bu faydalı aracı nasıl kullanaca˘ ımızı ö˘ renecek ve bu aracı g g olabildi˘ ince ayrıntılı bir sekilde incelemeye çalı¸aca˘ ız. sonraki satırın girintili olması gerekti˘ ini tahmin etmi¸sinizdir. Bu bakım ve taslakg s lama i¸ini kolayla¸tıracak bir çözüm olsa ve bizi aynı seyleri tekrar tekrar yazmaktan kurtarsa s s ¸ ne kadar güzel olurdu.istedi˘ imizde aynı düzeltmeyi birkaç farklı yerde yapmamız gerekir.. g g Fonksiyon adı olarak istedi˘ iniz her seyi yazabilirsiniz. s g s Gelin isterseniz biz bu fonksiyonun altını çok basit bir sekilde dolduralım: ¸ def fonksiyon_adi(): print "merhaba fonksiyon!" Böylece eksiksiz bir fonksiyon tanımlamı¸ olduk. fonksiyg ¸ onun ne i¸e yaradı˘ ını anlatan kısa bir isim belirlemeniz hem sizin hem de kodlarınızı okuyan s g ki¸ilerin i¸ini bir hayli kolayla¸tıracaktır.coding: utf-8 -*- . s g Simdi biz bu yazım hatasını düzeltmek istedi˘ imizde. Ilk g s Tabii biz Mehmet Bey’e yazdı˘ ımız dilekçenin metnini Ahmet Bey’e yazaca˘ ımız dilekçeyi g g hazırlarken kopyala-yapı¸tır yaptı˘ ımız için aynı hata Mehmet Bey’e gidecek dilekçede de var. Fonksiyon tanımlamak için def adlı bir parçacıktan yararlanaca˘ ız.1 Fonksiyonları Tanımlamak Python’da fonksiyonları kullanabilmek için öncelikle fonksiyonları tanımlamamız gerekiyor.

daha önce tanımladı˘ ımız fonksiyonu ça˘ ırmı¸ oluyoruz. bu konunun en ba¸ında verdi˘ imiz dilekçe örne˘ ini de bir fonksiyon haline getirelim: s g g #!/usr/bin/env python # -*. ˙ kısım s Ilk fonksiyonun tanımlandı˘ ı ba¸lık kısmı. en son satırdaki fonksiyon_adi() kodudur. Ayrıca tanıms ladı˘ ımız fonksiyonun bir de gövdesinin olması gerekir. 4. s g s Dilerseniz. Üstelik bu fonksiyon. Saygılarımızla.2009 tarihinde yaptı˘ımız ba¸vurunun sonuçlandırılması g s hususunda yardımlarınızı rica ederiz. g s g Yeni bir bölüme geçmeden önce isterseniz fonksiyonlarla ilgili olarak buraya kadar ö˘ rendi˘ imiz kısmı biraz irdeleyelim: g g 1. Biraz sonra ¸ g ö˘ reneceklerimiz sayesinde fonksiyonlarla çok daha faydalı ve manalı i¸ler yapabilece˘ iz. s s ¸ s 7. g Tebrikler! Böylece ilk eksiksiz fonksiyonunuzu hem tanımlamı¸. Biraz sonra verece˘ imiz örneklerde g bu durumu daha net olarak görece˘ iz. g 3. Orçun Kunek""" dilekce_gonder() Elbette bu örnek Python’daki fonksiyonların bütün yeteneklerini ortaya koymaktan aciz. Bu s g ¸ satırı ekleyerek. Örne˘ in su bir fonksiyondur: g g ¸ . ¸ 2.def fonksiyon_adi(): print "merhaba fonksiyon!" fonksiyon_adi() Burada fonksiyonun çalı¸masını sa˘ layan sey. g g 6. Fonksiyon adlarını belirlerken Türkçe karakter kullanmıyoruz.coding: utf-8 -*def dilekce_gonder(): print """\ Sayın Mehmet Bey.. s g Su ana kadar ö˘ rendiklerimiz ancak bu kadarını yapmamıza müsaade ediyor.. Python’da fonksiyonları kullanabilmek için öncelikle fonksiyonu tanımlamamız gerekir. en ba¸ta bahsetti˘ imiz sorunları da çözemiyor henüz. hem de ça˘ ırmı¸ oldunuz. Python’da bir fonksiyon tanımı söyle bir yapıya sahiptir: ¸ def fonksiyon_adi(): . 19. Ama ne yapalım. Dolayısıyla Python’da bir fonksiyon temel olarak iki kısımdan olu¸ur. 5. Fonksiyonlar bir bakıma bir taslaklama sistemi gibidir. Python’da fonksiyonlar bizi aynı seyleri tekrar tekrar yazma zahmetinden kurtarır. gövdedeki girintili kısmın bitti˘ i yerde biter. Elbette bir fonksiyonun i¸levli olabilmesi için sadece tanımlanması yetmez.. Bu satıra teknik g g s olarak fonksiyon ça˘ rısı (function call) adı verilir. Bir fonksiyonu tanımlamak için def adlı parçacıktan yararlanıyoruz. Fonksiyon gövdesini girintili olarak g yazıyoruz. ikinci kısım ise fonksiyonun içeri˘ ini olu¸turan g s g s gövde kısmıdır. Ba¸lık ve gövde dı¸ında kalan her sey fonksiyonun da dı¸ındadır. Fonksiyonlarımıza verece˘ imiz adların olabildi˘ ince betimleyici olması herkesin hayrınadır.. Bir fonksiyon. g Yukarıdaki kodları çalı¸tırdı˘ ımızda ekrana merhaba fonksiyon! satırının yazdırıldı˘ ını göres g g ce˘ iz.12.

daha önce tanımladı˘ ımız cift() adlı g fonksiyon devreye girecektir. bu fonksiyon def selamla(): satırıyla ba¸lar. Mesela s s . Yok. Tam g s s s olarak ne demek istedi˘ imizi biraz sonra gayet net bir sekilde anlamanızı sa˘ layacak örnekler g ¸ g verece˘ iz. hiç endi¸e etmenize gerek yok. Fonksiyonların i¸levli olabilmesi için bu fonksiyonlar tanımlandıktan sonra ça˘ rılmalıdır. Daha sonra Python’un raw_input() fonksiyonunu kullanarak kullanıcıdan bir sayı girmesini istiyoruz. s 8. g Burada cift() ve tek() adlı fonksiyonları nasıl ça˘ ırdı˘ ımıza dikkat edin. print "nasılsın?" satırıyla biter. E˘ er sayı 2’ye tam olarak bölünüyorsa çifttir. yani bu sayı çiftse. Ardından da kullanıcı tarafından girilen bu sayının tek mi yoksa çift mi oldu˘ unu denetliyg oruz. print "nasılsın?" satırıyla g s biter.coding: utf-8 -*def tek(): print "Girdi˘iniz sayı bir tek sayıdır!" g def cift(): print "Girdi˘iniz sayı bir çift sayıdır!" g sayi = raw_input("Lütfen bir sayı giriniz: ") if int(sayi) % 2 == 0: cift() else: tek() Burada tek() ve cift() adlı iki fonksiyon tanımladık.def selamla(): print "merhaba!" print "nasılsın?" Bu fonksiyon def selamla(): satırıyla ba¸lar. cift() adlı fonksiyonun görevi ise Girdi˘ iniz sayı bir çift g g sayıdır! çıktısı vermek. Fonksiyon ça˘ rısı dedi˘ imiz selamla() satırı bu fonksiyonun dı¸ındadır. Daha önce s g de dedi˘ imiz gibi. s s E˘ er bu söylediklerimiz size biraz kafa karı¸tırıcı gelmi¸se. tek() adlı fonksiyonun görevi ekrana Girdi˘ iniz sayı bir tek sayıdır! çıktısı. Bu kodlarda özellikle fonksiyonların nerede ba¸layıp nerede bitti˘ ine dikkat edin. gövdesindeki girintili alanın sonuna g g s kadar devam eder. e˘ er kullanıcının verdi˘ i sayı 2’ye tam olarak bölünmüyorsa g g o zaman da tek() adlı fonksiyon devreye girer. g Dilerseniz bu bölümü kapatmadan önce fonksiyonlarla ilgili birkaç basit örnek daha yaparak bu konuya ısınmanızı sa˘ layalım: g #!/usr/bin/env python # -*. Aksi halde bu sayı tektir. Girintili alanın dı¸ında kalan bütün kodlar o fonksiyonun dı¸ındadır. s g Örne˘ in yukarıdaki fonksiyonu söyle ça˘ ırıyoruz: g ¸ g def selamla(): print "merhaba!" print "nasılsın?" selamla() Dedi˘ imiz gibi. bir fonksiyon def parçacı˘ ıyla ba¸lar. E˘ er kullanıcının girdi˘ i g g g g sayı 2’ye tam olarak bölünüyorsa. Çünkü bu satır g g s selamla() fonksiyonunun gövdesini olu¸turan girintili kısmın dı¸ında yer alıyor.

coding: utf-8 -*def selamla(isim): print "merhaba. emin olun fonksiyonlar hiçbir i¸imize yaramazdı. benim adım istihza! . Ancak yapaca˘ ımız i¸in niteli˘ ine s g s g göre bu parantezlerin içine birtakım bilgiler yerle¸tirmemiz gerekebilir. g g g Ancak yukarıda tanımladı˘ ımız fonksiyon oldukça kısıtlı bir kullanım alanına sahiptir. benim adım istihza! çıktısını verebilir.yukarıdaki örnekte tek() ve cift() birbirinden ba˘ ımsız iki fonksiyondur. bir fonksiyon tanımlarken. ama burada aslında çok önemli bir sey yap¸ tık.2 Fonksiyonlarda Parametre Kullanımı Yukarıdaki örneklerde gördü˘ ünüz gibi. Gelin isterseniz çok basit bir örnekle ba¸layalım: g s def selamla(isim): print "merhaba. Bu g fonksiyon ekrana yalnızca merhaba. benim adım %s!" %isim selamla("istihza") Bu kodları çalı¸tırdı˘ ımızda söyle bir çıktı alırız: s g ¸ merhaba. ˙ Isterseniz simdi tanım¸ ladı˘ ımız bu fonksiyonun bir i¸e yarayabilmesi için fonksiyonumuzu ça˘ ıralım: g s g selamla("istihza") Kodları bir arada görelim: #!/usr/bin/env python # -*. Ama g ¸ s simdi ö˘ renece˘ imiz parametre kavramı sayesinde fonksiyonlarımıza takla atmayı ö˘ rete¸ g g g ce˘ iz. benim adım %s!" %isim Belki fark ettiniz. Fonksiyonumuza bir parametre verdik! Simdiye kadar tanımladı˘ ımız fonksiyonlarda. Bu parantez i¸aretleri. örneklerde de gördü˘ ümüz gibi s s g hiçbir bilgi içermeyebilir. ˙ste bu bilgilere s I¸ parametre adı verilir. Bu de˘ i¸kenin adı isim. Bu fonksiyonlardan g sonra gelen sayı de˘ i¸keni de fonksiyon alanının dı¸ında yer alır. Zaten Python fonksiyonları da asıl gücünü bu parametrelerden alır. Simdi ¸ söyle bir örnek verdi˘ imizi dü¸ünelim: ¸ g s #!/usr/bin/env python # -*. parangs gs g tez içindeki bu de˘ i¸kenlere parametre adı verilir. benim adım istihza!" selamla() Burada fonksiyonumuzu tanımladıktan sonra en sondaki selamla() satırı yardımıyla fonksiyonumuzu ça˘ ırdık. Yani bu parantezler bo¸ olabilir. gs s 13. Ancak bu defa parantezimizin içinde bir s s de˘ i¸ken adı görüyoruz. fonksiyon adını belirledikten g sonra bir parantez i¸areti kullanıyoruz. ¸ g fonksiyon tanımı hep bo¸ bir parantezden olu¸uyordu. E˘ er fonksiyonların g yapabildi˘ i sey bundan ibaret olsaydı.coding: utf-8 -*def selamla(): print "merhaba. Fonksiyonlar söz konusu oldu˘ unda. Fonksiyonumuzu tanımlarken bir parametre gs belirttikten sonra bu parametreyi fonksiyonun gövdesinde de kullandık. Yani tanımladı˘ ımız fonksiyona hayat öpücü˘ ü verdik. belki de fark etmediniz.

Neyse. "Mehmet") veya: selamla() Sanırım bu örnekler fonksiyonlardaki parametre kavramının ne oldu˘ unu net bir biçimde org taya koyuyor. 43] Soru su: Acaba bu listedeki sayıları birbiriyle nasıl çarparız? Bunu yapmanın en kolay yolu. 90. E˘ er selamla() adlı fonksiyonu farklı bir argüman ile ça˘ ırırsak elbette alaca˘ ımız çıktı da farklı g g g olacaktır: selamla("Ahmet Efendi") Bu defa çıktımız söyle: ¸ merhaba. bu de˘ eri yine a de˘ i¸kegs g g gs nine atayaca˘ ız: g . böyle bir durumda kendi yöntemimizi s g kendimiz icat etmek zorundayız. Python bize bu g i¸lem için herhangi bir hazır fonksiyon sunmadı˘ ından.. 43] >>> sum(sayilar) 178 sum() fonksiyonu. kendisine argüman olarak verilen bir sayı listesinin ö˘ elerini birbiriyle g toplayıp sonucu bize bildiriyor.Burada selamla() adlı fonksiyonu istihza argümanı ile birlikte ça˘ ırdık.. ö˘ elerini birbiriyle çarpan hazır bir fonksiyon bulunmuyor.. benim adım Ahmet Efendi! Burada önemli olan nokta. E˘ er bu temeli iyi kavrarsanız ba¸ka yerlerde görece˘ iniz daha karma¸ık g g s g s örnekleri anlamakta zorlanmazsınız. Biz bu terminoloji i¸ini bir kenara g s bırakıp yolumuza devam edelim. Bu fonksiyonu söyle kullanıyorduk: g s ¸ >>> sayilar = [45. i¸in temeli aynen yukarıda ang s s lattı˘ ımız gibidir. selamla() fonksiyonunun bir adet parametreye sahip olmasıdır. Böylece çıktıda istihza g de˘ erini aldık. Burada terminolojiyle ilgili ufak bir not dü¸elim: Fonksiyonlar tanımlanırken g s ˘ parantez içinde belirtilen de˘ erlere “parametre” adı verilir. Aynı fonksiyon çagrılırken parang tez içinde belirtilen de˘ erlere ise “argüman” adı verilir.. 90. Yani g fonksiyonu su sekillerde ça˘ ırmak hata almamıza yol açacaktır: ¸ ¸ g selamla("Ahmet". Diyelim ki elimizde söyle bir sayı s ¸ listesi var: >>> sayilar = [45. s Python’da. O halde hemen ba¸layalım.. Dolayısıyla bu fonksiyonu argümansız olarak veya birden fazla argümanla ça˘ ıramayız. g ˙ Ilerde görece˘ imiz örnekler ne kadar karma¸ık olursa olsun. ¸ listedeki bütün sayıları 1’le çarpıp. verilen sayıları toplayan sum() adlı bir fonksiyon oldu˘ unu önceki derslerimizde g ö˘ renmi¸tik. Ama her iki durum için de “parametre” g adının kullanıldı˘ ını da görebilirsiniz bazı yerlerde. Daha sonraki bölümlerde bu parametre kavramından bolca yararlanaca˘ ız. Ancak Python’da bu sum() fonksiyonuna benzer bir sekilde ¸ bir sayı listesini alıp.. bütün de˘ erleri tek bir de˘ i¸ken içinde toplamaktır. Dilerseniz bu anlattıklarımızla ilgili ufak bir örnek daha yapıp ba¸ka bir konuya geçelim. Yani g gs öncelikle de˘ eri 1 olan bir de˘ i¸ken belirlememiz gerekiyor: g gs >>> a = 1 Daha sonra listedeki bütün sayıları a de˘ i¸keninin de˘ eriyle çarpıp.

>>> sayilar = [45. Daha sonra. Bunun için söyle bir yol takip ¸ edebilirsiniz: 1. yukarıdaki gibi her defasında tekerle˘ i yeniden icat etmek yerine. Bunun için yapmamız gereken tek sey carp() adlı ¸ fonksiyonu ça˘ ırmak: g .. listedeki bütün sayıların çarpımı a de˘ i¸keninde tutuluyor. s Bu yöntem... Program içinde.. de˘ eri 1 olan bir de˘ i¸ken tanımlarsınız.. 90. .coding: utf-8 -*def carp(liste): a = 1 for i in liste: a *= i print a Böylece tasla˘ ımızı olu¸turmu¸ olduk.. Artık bu fonksiyonu kullanarak istedi˘ imiz bir sayı g s s g grubunu birbiriyle rahatlıkla çarpabiliriz. gs 4.>>> for i in sayilar: . Simdi gelin yukarıdaki i¸lemleri içeren fonksiyonumuzu tanımlayalım: g g ¸ s #!/usr/bin/env python # -*. a *= i Böylece listedeki bütün sayıların çarpımını gösteren de˘ er a de˘ i¸kenine atanmı¸ oldu. 2.. a = a * i Yukarıdaki kodları söyle de yazabilece˘ imizi biliyorsunuz: ¸ g >>> for i in sayilar: . Biz de yukarıdaki i¸lemleri içeren g g s bir fonksiyonu tek bir kez tanımlayaca˘ ız ve program içinde gereken yerlerde bu fonksiyonu g ça˘ ıraca˘ ız. bir liste içindeki sayıları birbiriyle çarpmanız gerekiyor.. elde etti˘ iniz de˘ eri gs g g g tekrar bu de˘ i¸kene atarsınız. ˙ g gs s Isterseniz bu a de˘ i¸keninin de˘ erini yazdırıp sonucu kendi gözlerinizle görebilirsiniz: gs g >>> print a 174150 Gördü˘ ünüz gibi. tekerle˘ i bir kez icat g g eder... Son olarak da listedeki bütün sayıları bu de˘ i¸kenin de˘ eriyle çarpıp. gereken her yerde bu i¸lemleri tekrar edersiniz. sonra gereken yerlerde icat etti˘ i bu tekerle˘ i kullanır. sizi aynı seyleri sürekli tekrar etmek zorunda bıraktı˘ ı için oldukça verimsiz bir ¸ g yoldur. g gs Kodları topluca görelim: >>> >>> >>> . Mantıklı bir proI¸ gramcı. g gs 3. 43] a = 1 for i in sayilar: a *= i print a 174150 Simdi söyle bir dü¸ünün: Diyelim ki bir program yazıyorsunuz ve bu programın de˘ i¸ik yer¸ ¸ s gs lerinde. Önce bir sayı listesi tanımlarsınız. ˙ste Python’daki fonksiyonlar böyle bir durumda hemen devreye girer.

. 7] carp(sayilar) Bu kodları çalı¸tırdı˘ ınızda 105 sonucunu alırsınız. E˘ er bu fonksiyonu su sekilde ça˘ ırırg ¸ ¸ g sanız hata alırsınız: carp(3. Çünkü carp() fonksiyonu tek bir parametre alıyor. 7] carp(sayilar) Simdi kodları topluca görelim: ¸ #!/usr/bin/env python # -*. yukarıdaki kodlarda carp() fonksiyonuna ait liste adlı parametrenin yalnızca temsili bir isimlendirme oldu˘ una dikkat edin. ardından da bu listeyi fonksiyona argüman olarak verebilirsiniz: sayilar = [3.carp([3. Elbette dilerseniz önce bir sayı listesi tanımlayabilir. carp() fonksiyonuna argüman olarak verdi˘ imiz sayıları bir liste içine g aldık. E˘ er fonksiyonlar olmasaydı. 5. Halbuki fonksiyonumuz sadece tek bir argüman alıyor. fonksiyon içinde tek bir kez tanımg ladı˘ ımız i¸lemi programın farklı yerlerinde defalarca tekrar etmemiz gerekecekti. 5. 5. Yani yukarıdaki fonksiyonu g g söyle de yazabilirdik: ¸ #!/usr/bin/env python # -*. g Fonksiyonların i¸imizi ne kadar kolayla¸tırdı˘ ını görüyorsunuz. 7) Çünkü burada carp() fonksiyonuna birden fazla argüman verdik.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 sayılar = [3.coding: utf-8 -*def carp(liste): a = 1 for i in liste: a = a * i print a sayilar = [3. Mesela bizim g g s g örne˘ imizde carp() fonksiyonunu “sayilar” adlı bir liste ile ça˘ ırdık. g g s E˘ er i¸lemlerde bir de˘ i¸iklik yapmak gerekirse. Üstelik g s . 5. Yapmak istedi˘ imiz i¸lemleri bir s s g g s fonksiyon olarak tanımlıyoruz ve gerekti˘ i yerde bu fonksiyonu ça˘ ırarak i¸imizi hallediyoruz. Program içinde daha sonra fonksiyonu ça˘ ırırken g g argüman olarak kullanaca˘ ınız de˘ erin “liste” adını ta¸ıma zorunlulu˘ u yoktur.. 5. s g Bu arada. 7]) Burada dikkat ederseniz. 7] carp(sayilar) Elbette fonksiyon içinde belirtti˘ iniz parametrelerin anlamlı bir ada sahip olması herkes için en g do˘ rusudur. tanımladı˘ ımız fonksiyonu yeniden düzeng s gs g lememiz yeterli olacaktır.

tel.01. "¸arkıcı". Burada fonksiyonumuzu g s s sadece bir kez olu¸turuyoruz. "19. soyisim. "Orçun Kunek") Gördü˘ ünüz gibi. "Baraj Yolu") .items(): print k print "-"*len(k) for i in v: print i kayit_ekle("Orçun". Saygılarımızla. sehir.12.2009". adres] print "Ba˘lantı bilgileri kayıtlara eklendi!\n" g for k. uygun bilgileri kuls lanarak yeni bir fonksiyon ça˘ rısı yapabiliriz. tarih. "21. meslek. %s""" %(kime. yukarıdaki fonksiyon i¸imizi bir hayli kolayla¸tırıyor. "Adana". bütün programı ba¸tan sona tarayıp de˘ i¸iks gs g s gs likleri tek tek elle uygulamak zorunda kalacaktık.i¸lemlerde bir de˘ i¸iklik yapmak istedi˘ imizde de. %s tarihinde yaptı˘ımız ba¸vurunun sonuçlandırılması g s hususunda yardımlarınızı rica ederiz.2010". Mesela dilekçeyi Ahmet Bey’e göndereceksek g söyle bir satır yazmamız yeterli olacaktır: ¸ dilekce_gonder("Ahmet Bey".3 ˙simli ve Sıralı Argümanlar I Bir önceki bölümde fonksiyon parametrelerini nasıl kullanaca˘ ımızı ö˘ rendik. kimden) dilekce_gonder("Mehmet Bey". meslek. Ardından dilekçeyi kime göndereceksek. soyisim)] = [sehir. "Erdener Topçu") Ayrıca dilekçe metninde bir de˘ i¸iklik yapmak istedi˘ imizde sadece fonksiyon gövdesini düzengs g lememiz yeterli olacaktır.coding: utf-8 -*def kayit_ekle(isim. tel. v in kayit. Dilerseniz en ba¸ta verdi˘ imiz dilekçe örne˘ ine tekrar dönelim ve o durumu fonksiyonlara s g g uyarlayalım: #!/usr/bin/env python # -*. Python’da g g fonksiyonlara istedi˘ iniz sayıda parametre verebilirsiniz.coding: utf-8 -*def dilekce_gonder(kime. tarih. 13. "Kunek". Mesela söyle bir fonksiyon tanımg ¸ layabilirsiniz: #!/usr/bin/env python # -*. adres): kayit = {} kayit["%s %s" %(isim. S "0322 123 45 67". kimden): print """\ Sayın %s.

isim. Buna göre. . Bu sög s zlük. ’Python’). öncelikle k de˘ i¸kenini ekrana yazdırıyoruz. Böylece sözlükteki anahtar ve de˘ er çiftlerini birbirinden g g ayırmı¸ olduk. v in sozluk. Simdi söyle bir sey yazalım: ¸ ¸ ¸ >>> for k. bir önceki satırda ekrana yazdırdı˘ ımız g g . print "-"*len(k) satırı ise. sehir. Diyelim ki elimizde söyle bir sözlük var: ¸ >>> sozluk = {"programlama dili": "Python". v Buradan söyle bir çıktı alırız: ¸ programlama dili Python metin düzenleyici Kwrite Bu sekilde bir çıktı elde ettikten sonra artık bu çıktıyı istedi˘ imiz sekilde biçimlendirebile¸ g ¸ ce˘ imizi biliyoruz. soyisim. meslek.. sehir. fonksiyon parametrelerinden olan isim ve soyisim. Dilerseniz buna bir örnek vererek bu metodu g tekrar hatırlayalım. tel ve adres. g Sözlü˘ ü olu¸turduktan sonra ekrana Ba˘ lantı bilgileri kayıtlara eklendi! biçiminde bir mesaj g s g yazdırıyoruz.items(): satırında k de˘ i¸keni kayit adlı sözlükteki anahtarları. Python sözlüklerinde items() adlı bir metot oldu˘ unu s g g sözlükler konusunu i¸lerken ö˘ renmi¸tik. g items() metodunu hatırlattı˘ ımıza göre biz tekrar kayit_ekle() fonksiyonumuzu incelemeye g devam edebiliriz. v in g kayit. olu¸turdu˘ umuz bu sözlü˘ e g g s g g ö˘ e ekliyoruz. Bu kısım. v de˘ i¸keni ise aynı gs gs sözlükteki de˘ erleri temsil ediyor. tel ve adres de˘ erleri ise kayit adlı s g sözlükteki “de˘ er” kısmını meydana getirecek.items(): . Bu fonksiyon toplam altı adet parametre alıyor. Bu metot yardımıyla bir sözlük içinde bulunan bütün s g s anahtar ve de˘ er çiftlerini elde edebiliyorduk..Yine burada. ’Kwrite’)] Gördü˘ ünüz gibi. s Bu kodlarda öncelikle kayit_ekle() adlı bir fonksiyon tanımladık. kayit adlı sög zlükteki “anahtar” kısmını olu¸turacak. Daha sonra da kayıt adlı sözlü˘ ün ö˘ elerini belli bir düzen çerçevesinde ekrana g g yazdırıyoruz. meslek. Tanımladı˘ ımız bu fonksiyonun gövdesinde ilk olarak kayit adlı bir sözlük olu¸turduk.items() [(’programlama dili’. E˘ er Python kodlarına duyarlı bir metin düzenleyici kullanıyorg g sanız (mesela IDLE) virgül i¸aretlerinden sonra ENTER tu¸una bastı˘ ınızda düzgün girinti yapısı s s g otomatik olarak olu¸turulacaktır. "metin duzenleyici": "Kwrite"} Simdi items() metodunu bu sözlük üzerine uygulayalım: ¸ >>> print sozluk. s Bu i¸lemi yaptıktan sonra. fonksiyondaki isim ve soyisim parametrelerinin s de˘ erini gösteriyor. sozluk adlı sözlü˘ e ait bütün anahtar ve de˘ erler bir liste içinde demetler g g g halinde toplandı.. ekleyece˘ imiz ba˘ lantıya dair bilgileri tutacak. kayit_ekle() fonksiyonu içindeki for k... (’metin duzenleyici’. Bunlar. Daha sonra. Bu i¸lemi nasıl yaptı˘ ımıza dikkat edin. Biraz önce anlattı˘ ımız gibi. kodlarımızın çirkin bir görüntü olu¸turmaması için ö˘ eleri nasıl alt satıra s g geçirdi˘ imize dikkat edin. Yani kayit adlı sözlüks gs teki anahtar kısmını almı¸ oluyoruz. print k..

üçüncüsünün g sehir. meslek. g g g Fonksiyonumuzu ba¸arıyla tanımladıktan sonra sıra geldi bu fonksiyonu ça˘ ırmaya. Mesela söyle bir sey yazabilirsiniz: ¸ ¸ #!/usr/bin/env python # -*. s En son olarak da kayit adlı sözlü˘ ün “de˘ er” kısmındaki ö˘ eleri tek tek ekrana yazdırıyoruz. meslek. soyisim. mes. be¸incisinin telefon. 0322 123 45 67 ve Baraj Yolu argü¸ manlarıyla birlikte ça˘ ırıyoruz. seh. Sarkıcı. bizim yukarıda verdi˘ imiz örnekte çok belli olmasa da. Kunek.. Yani bu de˘ erleri. kayit_ekle() adlı fonksiyonu kullanırken argüman olarak verece˘ imiz de˘ erlerin sırası büyük g g önem ta¸ıyor. ˙ste bu noktada Python’daki isimli argümanlar s g I¸ (keyword arguments) devreye girer ve bizi büyük bir dertten kurtarır. soy. fonksiyon tanımındaki sıraya göre yazmamız gerek. soyisim)] = [sehir. Orçun.. s g Fonksiyonumuzu sırasıyla. altıncısının ise adres olması gerekiyor. adres): kayit = {} kayit["%s %s" %(isim. ikincisinin soyisim. Aksi ¸ s halde. tel. Buna göre s g kayit_ekle() fonksiyonunu ça˘ ırırken. tel. adres] print "\nBa˘lantı bilgileri kayıtlara eklendi!\n" g for k. Böylece bu kodları çalı¸tırdı˘ ımızda söyle bir çıktı elde ediyoruz: g s g ¸ Ba˘lantı bilgileri kayıtlara eklendi! g Orçun Kunek ----------Adana S ¸arkıcı 0322 123 45 67 Baraj Yolu ˙ Isterseniz. g g g Böylece isim ve soyismi. fonksiyondan alaca˘ ımız çıktı hiç g g de bekledi˘ imiz gibi olmayabilir.coding: utf-8 -*def kayit_ekle(isim. ilk argümanımızın isim. v in kayit. Adana. dördüncüsünün meslek. isim ve soyisim de˘ erlerinin uzunlu˘ u kadar çizgi çekmemizi sa˘ lıyor.isim ve soyismin altına. Ancak takdir edersiniz ki. bu kadar fazla sayıda parametrenin g sırasını akılda tutmak hiç de kolay bir i¸ de˘ il. Nasıl mı? ˙ Isterseniz yukarıda verdi˘ imiz örnekten yararlanalım: g .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. fonksiyondaki öteki bilgilerden görsel olarak ayırmı¸ oluyoruz. adr) Yukarıdaki fonksiyonları kullanırken dikkat etmemiz gereken çok önemli bir nokta var. tel. kayit_ekle() fonksiyonundaki parametreleri kendiniz yazmak yerine kullanıcıdan almayı da tercih edebilirsiniz. sehir.

z_orani): print ("%s. Bizim örne˘ imizde g bütün parametreler karakter dizilerinden olu¸tu˘ u için. s Bu arada yukarıdaki fonksiyonun sa˘ a do˘ ru çok fazla yayılarak çirkin bir kod görüntüsü verg g memesi için satırları nasıl alta kaydırdı˘ ımıza dikkat edin. meslek. 25) ˙ste bu örnekte. Çünkü bu fonksiyonda biz 3500 sayısını kullanarak aritmetik bir i¸lem yapıyoruz. e_maas. sehir = "˙stanbul". meslek. e_poz. soyisim)] = [sehir. tel. E˘ er s g 3500’ün olması gereken yerde bir sayı yerine karakter dizisi olursa aritmetik i¸lem yapılamaz.. isimli argümanları kullanarak yazarsak sıralama meselesini dert etmemize g gerek kalmaz: . kayit_ekle() adlı fonksiyonumuzun argümanlarını isimleriyle birlikte ça˘ ırıyg g oruz. Is s 3500. parametre/argüman sıralamasının önemi ortaya çıkar. Is s "˙¸ Geli¸tirme Müdürü".coding: utf-8 -*def terfi_ettir(kisi. soyisim. meslek = "Ö˘retmen".coding: utf-8 -*def kayit_ekle(isim. y_poz. Mesela su örne˘ e bakalım: ¸ g #!/usr/bin/env python # -*. E˘ er burada mesela I¸ g Ahmet Öncel argümanıyla 3500 argümanının yerini de˘ i¸tirirseniz programınız hata verecekgs tir. adres] print "\nBa˘lantı bilgileri kayıtlara eklendi!\n" g for k. y_poz)) s print ("Bu ki¸inin %s TL olan maa¸ı %s TL’ye " s s "yükseltilmi¸tir!" %(e_maas.#!/usr/bin/env python # -*. Böylece argümanları sıra gözetmeden kullanma imkânımız oluyor. v in kayit. g tel = "0212 123 45 67". e_poz. "˙¸ Geli¸tirme Uzmanı". soyisim = "Çelebi". I adres = "Çeliktepe") Gördü˘ ünüz gibi. g Yukarıdaki örne˘ i.. Ama özellikle sayılar ve karakter dizilerini karı¸ık olarak içeren s s fonksiyonlarda yukarıdaki yöntemin faydası daha belirgindir. sehir. adres): kayit = {} kayit["%s %s" %(isim. %s pozisyonundan %s pozisyonuna " "terfi etmi¸tir!" %(kisi. isimli parametre kullanmanın faydası s g ilk bakı¸ta pek belli olmuyor. tel.items(): print k print "-"*len(k) for i in v: print i kayit_ekle(isim = "Abdurrahman". e_maas + s (e_maas * z_orani / 100))) terfi_ettir("Ahmet Öncel".

range() fonksiyonunun sayıları atlayarak göstermesini sa˘ lıyor. Dikkat ederseniz. 9] Bu sekilde de 4’ten 10’a kadar olan sayıların listesini elde ediyoruz. y_poz)) s print ("Bu ki¸inin %s TL olan maa¸ı %s TL’ye " s s "yükseltilmi¸tir!" %(e_maas. y_poz = "˙¸ Geli¸tirme Müdürü".4 Varsayılan Degerli Argümanlar Önceki derslerimizden range() fonksiyonunu biliyorsunuz. biti¸_de˘eri. 7. 9] Bu kullanım bize 0’dan 10’a kadar olan sayıların listesini veriyor. Is s z_orani = 25) Teknik olarak söylemek gerekirse Python fonksiyonlarında ö˘ e sıralamasının önem ta¸ıdı˘ ı g s g argümanlara sıralı argüman (positional argument) adı verilir. 5. Ancak argüman sayısının çok fazla oldu˘ u durumlarda isimli g argümanları kullanmak da i¸inizi bir hayli kolayla¸tırabilir. 5. biz yukarıda range() fonksiyonunu tek bir argüman ile ça˘ ırdık. Hatırlarsanız range() fonksiyonunu söyle kullanıyorduk: ¸ >>> range(10) [0. z_orani): print ("%s. 8. Python fonksiyonlarında sıralı argümanlardan bolca yararlanılır. 7. 4.coding: utf-8 -*def terfi_ettir(kisi. 2. e_maas + s (e_maas * z_orani / 100))) terfi_ettir(e_maas = 3500. 10) [4. 1. 10. 8] Bu üçüncü argüman. e_poz. e_poz = "˙¸ Geli¸tirme Uzmanı". Is s kisi = "Ahmet Öncel".#!/usr/bin/env python # -*. Gelin isterseniz bu fonksiyona simdi ¸ biraz daha yakından bakalım. atlama_de˘eri) s g s g g range() fonksiyonunu kullanabilmek için bu parametreler içinde sadece “biti¸_de˘ eri” adlı s g parametreye bir argüman vermemiz yeterli olacaktır: . %s pozisyonundan %s pozisyonuna " "terfi etmi¸tir!" %(kisi. 6. 6. 3. e_maas. 8. Ancak biz dilersek yukarıdaki fonksiyonu g ikinci bir argümanla daha ça˘ ırabiliriz: g >>> range(4. g Gördü˘ ünüz gibi range() fonksiyonu su parametrelerden olu¸uyor: g ¸ s range(ba¸langıç_de˘eri. range() fonksiyonu bun¸ ların dı¸ında üçüncü bir argüman daha alır: s >>> range(4. 2) [4. 6. e_poz. y_poz. s s ˘ 13.

s Gördü˘ ünüz gibi. s Peki varsayılan de˘ erli argümanların bize ne gibi bir faydası var? Varsayılan de˘ erli argüg g manları suna benzetebiliriz: Diyelim ki bilgisayarınıza bir program kuruyorsunuz. Örne˘ in range() fonksiyonunu yazan s g g s g Python geli¸tiricileri bu fonksiyona bazı varsayılan de˘ erler atayarak bizim için bu fonksiyonun s g kullanımını kolayla¸tırmı¸lardır. çünkü o parametrelerin birer varsayılan de˘ eri var. Veya programla ilgili. Çünkü bunun varsayılan bir de˘ eri var. s ˙ste biz de kendi yazdı˘ ımız fonksiyonlarda böyle varsayılan de˘ erler belirleyebiliriz. Örne˘ in kullanıcı programı kurarken herhangi bir kurulum dizini belirtg g mezse program otomatik olarak varsayılan bir dizine kurulabilir. ˙ste biz de yazdı˘ ımız pros I¸ g gramlarda kullanaca˘ ımız fonksiyonlara bu sekilde varsayılan de˘ erler atarsak programımızı g ¸ g kullanacak ki¸ilere kullanım kolaylı˘ ı sa˘ lamı¸ oluruz. s g Bu yüzden o parametreleri belirtmesek de oluyor. Dolayısıyla biz fonksiyonu tek g argümanla ça˘ ırdı˘ ımızda Python kvt parametresinin de˘ erini 2 kabul edecektir. Bu sayede range() fonksiyonunu her defasında üç argüman s s vermek yerine tek argüman ile çalı¸tırabiliyoruz. O parametrelerin varsayılan de˘ erlerinin g söyle oldu˘ unu biliyorsunuz: ¸ g ba¸langıç_de˘eri = 0 s g atlama_de˘eri = 1 g Dolayısıyla. Ama e˘ er biz 12 sayısının farklı bir kuvvetini g g hesaplamak istersek aynı fonksiyonu su sekilde ça˘ ırabiliriz: ¸ ¸ g kuvvet(12. Bu fonksiyonun varsayılan de˘ erli bir parametresi var (kvt). Gelin isterseniz bununla ilgili bir ba¸ka örnek daha verelim: s . kullanıcının g en az seçimle programı kullanılabilir hale getirmesine müsaade etmelidir. kvt=2): print sayi ** kvt Burada. biz range(10) yazdı˘ ımızda Python bunu range(0. E˘ er bizim g g g g istedi˘ imiz sey herhangi bir sayının farklı bir kuvvetini hesaplamaksa bizim bunu açık açık g ¸ belirtmemiz gerekiyor. kuvveti hesaplanacaktır. kuvvet() adlı fonksiyon toplam 2 parametreden olu¸uyor. kurulumla ilgili bütün seçeneklerin ne i¸e yaradı˘ ını bilmiyor s g olabilirsiniz. Dolayısıyla e˘ er program size kurulumun her a¸amasında bir soru sorarsa her g s soruya ne cevap verece˘ inizi kestiremeyebilirsiniz. kvt parametresini belirtmesek de olur. 10. Mesela I¸ g g su örne˘ e bir bakalım: ¸ g #!/usr/bin/env python # -*. 1) seklinde algılayacak g ¸ ve ona göre i¸lem yapacaktır. Bu fonksiyonu g s kullanabilmek için sayi parametresini mutlaka belirtmemiz gerekiyor. Yani bir programın kurulumu esnasında bazı seçeneklere programı yazan ki¸i tarafından bazı mantıklı varsayılan s de˘ erler atanabilir. 3) Böylece 12 sayısının 3. g g Çünkü kvt parametresinin varsayılan de˘ eri 2’dir. E˘ er bu ¸ g programı ilk defa kuruyorsanız. makul bir program.range(10) Öteki iki parametreyi ise bo¸ geçebiliyoruz. Fonksiyonu su sekilde ça˘ ırıyoruz: g ¸ ¸ g kuvvet(12) Fonksiyonu böyle ça˘ ırdı˘ ımızda otomatik olarak 12 sayısının 2. kuvvetini hesaplamı¸ olduk. O yüzden.coding: utf-8 -*def kuvvet(sayi. kullanıcının i¸ine yarayacak bir özellik varsayılan olarak açık gelebilir. kendisine verilen bir sayının kuvvetini hesaplayan bir fonksiyon yazdık.

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 e¸anlamlıdır. Ama sonuncu parametreye varsayılan bir de˘ er atadı˘ ımız için. bu parametrenin de˘ eri True varsayılacaktır.33333333333 Gördü˘ ünüz gibi. if not hassas: ise if s hassas == False ile aynı anlama gelir. g Yani söyle bir sey yazamayız: ¸ ¸ def bol(hassas = True. E˘ er tamsayı seklinde bir sonuç g g ¸ elde etmek istersek fonksiyonumuzu söyle ça˘ ıraca˘ ız: ¸ g g bol(10. yukarıdaki fonksiyonu su sekilde tanımlayabilece˘ imizi de biliyoruz: ¸ ¸ g def bol(bolen.. Bu g tür fonksiyonlarda varsayılan de˘ erin. parametre sıralamasında en sonda gelmesi gerekiyor. bolunen. bolunen. 3. bolen. E˘ er üçüncü parametreyi g belirtmezsek.. bol() fonksiyonunun üç adet parametre g g aldı˘ ını görüyoruz. Bu üç parametreden sonuncusu varsayılan bir de˘ ere sahip. False) Bu sekilde söyle bir sonuç alırız: ¸ ¸ 3 Dedi˘ imiz gibi. fonksiyonumuza baktı˘ ımız zaman. g g Bu arada. Varsayılan de˘ erli fonksiyonlar tanımlarken dikkat etmemiz gereken önemli bir kural var. E˘ er varsayılan de˘ erli argümanı en sona de˘ il de ba¸a veya ortaya alırsak Python bize söyle g g g s ¸ bir hata verir: . 3) Bu programı çalı¸tırdı˘ ımızda su sonucu alırız: s g ¸ 3. Parametrenin de˘ eri True kabul g g edildi˘ i için de fonksiyonumuz hesaplamada hassas bir sonuç verir. fonksiyg g g onumuzu kullanırken sadece iki argüman vermemiz yeterli oluyor. bolunen ve hassas. E˘ er biz bu tür bir hasg g sasiyet istemezsek üçüncü parametre olan hassas‘ı False de˘ eri ile ça˘ ırıyoruz. sonuç içinde ondalık kısım da görünüyor. hassas=True): sonuc = bolen / float(bolunen) if hassas == True: print float(sonuc) if hassas == False: print int(sonuc) Burada bol() adlı bir fonksiyon tanımladık. Dolayısıyla g bizim bu fonksiyonu en az iki argüman ile ça˘ ırmamız gerekiyor: g bol(10. bolunen): . Bu fonksiyon toplam 3 parametre alıyor: bolen.def bol(bolen.

soyisim Bu fonksiyonu su sekilde ça˘ ırıyoruz: ¸ ¸ g selamla("Fırat". soyisim. kendisine argüman olarak verilen herhangi bir ismi. arg3. isim..) Elbette yapabiliriz.. ben ". . varsayılan de˘ ere sahip argümanları parametre listesinin en sonuna g yerle¸tirmeye özen göstermemiz gerekiyor. dog_tarihi. benim adım Ahmet! seklinde ekrana döküyordu. Bu parametreler böyle uzayıp gider.SyntaxError: non-default argument follows default argument Yani: SözdizimiHatası: varsayılan de˘ersiz argüman. merhaba...5 ˙stenen Sayıda Sıralı Argüman Kullanımı I Fonksiyonları anlatırken söyle bir örnek vermi¸tik: ¸ s def selamla(isim): print "merhaba. Aksi halde g Python bize hata mesajı gösterir. dog_yeri. s 13. Simdi su kodları dikkatlice inceleyin: ¸ ¸ #!/usr/bin/env python # -*. E˘ er biz hem ismin hem de soyismin ekrana ¸ g dökülmesini istersek söyle bir sey yazabiliriz: ¸ ¸ def selamla(isim. benim adım %s!" %isim Bu fonksiyon.. g Dolayısıyla biz bu fonksiyonu 6’dan az veya fazla sayıda argüman ile ça˘ ıramayız. adres): . Örne˘ in yukarıdaki fonksiyon 6 adet parametre alıyor.coding: utf-8 -*def birlestir(*argumanlar): a = "" for i in argumanlar: a += i + " " print a . arg4. arg5. mesela Ahmet’i. Peki ya biz kendimizi herhangi bir sayıyla sınırlamak istemezsek ne olacak? Yani mesela biz bir fonksiyon tanımlarken parametre sayısını önceden belirtmesek de istedi˘ imiz kadar argümanla fonksiyonumuzu ça˘ ırabilsek olmaz mı? Örne˘ in g g g söyle bir sey yapamaz mıyız? ¸ ¸ fonksiyon_adi(arg1. "Özgül") Bu kodları çalı¸tırdı˘ ımızda söyle bir çıktı alırız: s g ¸ merhaba. varsayılan de˘erli argümandan sonra geliyor g g Dolayısıyla kural olarak. Mesela: g g g def sicile_ekle(isim. arg2.. soyisim): print "merhaba. tc_kimlik. ben Fırat Özgül Yazdı˘ ımız bu fonksiyona istedi˘ imiz sayıda parametre ekleyebilece˘ imizi biliyoruz.

Biz bu sınırlamayı a¸mak için Python’daki listelerden yararlandık. 8) Fonksiyonumuz. Gelin isterseniz bir örnek daha yaparak durumu biraz daha netle¸tirelim.. "Mehmet". Bu fonksiyonun özelli˘ i yalnızca g tek bir parametre almasıdır. 4. “*arg” g g gibi özel bir yapıdan faydalanarak bu fonksiyonun sınırsız sayıda argüman ile ça˘ rılmasına g olanak tanıdık. Hatırlarsanız yukarıda s söyle bir fonksiyon yazmı¸tık: ¸ s #!/usr/bin/env python # -*. 3. 5. Simdi söyle bir sey yazdı˘ ımızı ¸ ¸ ¸ g dü¸ünün: s def fonk(*arg): print arg Bu fonksiyonu istedi˘ iniz sayıda argümanla ça˘ ırabilirsiniz: g g fonk("Ahmet". kendisine argüman olarak verilen bütün de˘ erleri birbiriyle çarpacaktır. 4] carp(liste) Böylece liste içindeki bütün sayıları birbiriyle çarpabiliyorduk.coding: utf-8 -*def carp(liste): a = 1 for i in liste: a *= i print a Bu fonksiyonu su sekilde ça˘ ırıyorduk: ¸ ¸ g liste = [2. "Mersin". 6. "Veli". s Biraz önce ö˘ rendi˘ imiz “*arg” yapısını kullanarak aynı fonksiyonu söyle de yazabiliriz: g g ¸ #!/usr/bin/env python # -*. "0533 123 45 67") Gördü˘ ünüz gibi. "Öz". "O˘uz".. Dolayısıyla bu fonksiyonu ça˘ ırırken 1’den az veya çok sayıda g argüman kullanamıyoruz. bu fonksiyonun tam olarak kaç adet parametre aldı˘ ını belirtmedik. 7.coding: utf-8 -*def carp(*liste): a = 1 for i in liste: a *= i print a Burada parametre sayısını kısıtlamadı˘ ımız için artık fonksiyonumuzu rahatlıkla söyle ça˘ ırag ¸ g biliriz: carp(2. "Ozan") g Bu fonksiyonu çalı¸tırdı˘ ınızda söyle bir çıktı alırsınız: s g ¸ . "Mühendis". g Dilerseniz bu “*arg” yapısına biraz daha yakından bakalım.birlestir("Ahmet". 3.

"Mehmet". vb. isim) fonk("Ahmet". "Ali") E˘ er istersek bu fonksiyonu. adres] print "Ba˘lantı bilgileri kayıtlara eklendi!\n" g for k. meslek. sehir.) bütün ö˘ eleri tek tek fonksiyona uygular. s g g Yukarıda söyle bir örnek verdi˘ imizi hatırlıyorsunuz: ¸ g #!/usr/bin/env python # -*. "Ozan") g Bu fonksiyonu çalı¸tırdı˘ ımızda söyle bir çıktı elde ediyoruz: s g ¸ 0 1 2 3 4 --> --> --> --> --> Ahmet Mehmet Veli O˘uz g Ozan Python’daki bu “*” i¸areti özel görevi olan bir araçtır.coding: utf-8 -*def kayit_ekle(isim. Bu i¸aret. arg2. çıktımız bir demet. "O˘uz". "Mehmet". arg3 Bu basit fonksiyonu su sekilde ça˘ ırabiliriz: ¸ ¸ g fonk("Ahmet". “*” i¸aretini de kullanarak su sekilde de ça˘ ırabiliriz: g s ¸ ¸ g ls = ["Ahmet". "Ali"] fonk(ls) Burada “*” i¸areti. Fonksiyon çıktısını bu sekilde elde edece˘ inizi bildikten g ¸ g sonra bu çıktıyı istedi˘ iniz sekilde biçimlendirebilirsiniz. tel. ’O˘uz’. "Ali"] fonk(*ls) E˘ er aynı fonksiyonu su sekilde ça˘ ırırsanız hata alırsınız: g ¸ ¸ g ls = ["Ahmet". adres): kayit = {} kayit["%s %s" %(isim. arg2. ’Ozan’) g Gördü˘ ünüz gibi.items(): print k print "-"*len(k) . isim in enumerate(arg): print "%s --> %s" %(sira. "Veli". soyisim)] = [sehir. ’Veli’. bir dizi içindeki (bu demet s s olabilir.(’Ahmet’. v in kayit. meslek. "Mehmet". arg3): print arg1. liste olabilir. Mesela: g ¸ def fonk(*arg): for sira. soyisim. ’Mehmet’. Bu dedi˘ imiz seyi daha iyi g g ¸ anlayabilmek için söyle bir örnek verelim: ¸ def fonk(arg1. listenin her bir ö˘ esinin tek tek fonksiyona uygulanmasını sa˘ lıyor. tel. "Mehmet".

coding: utf-8 -*def kayit_ekle(isim. meslek. Bunu yapmamızı sa˘ layan sey de g g ¸ i¸te biraz önce ö˘ rendi˘ imiz “*” i¸aretidir. soyisim)] = [sehir. adres): kayit = {} kayit["%s %s" %(isim.coding: utf-8 -*def kayit_ekle(isim. "Kunek".. Biz burada bütün bu argümanları içeren bir listenin bütün ö˘ elerini tek tek fonksiyona uyguluyoruz. soyisim)] = [sehir.for i in v: print i kayit_ekle("Orçun". tel. tel. v in kayit.items(): print k print "-"*len(k) for i in v: print i isimler = ["Orçun".. adres] print "Ba˘lantı bilgileri kayıtlara eklendi!\n" g for k. tel. sehir. "Baraj Yolu") Biraz önce ö˘ rendi˘ imiz bilgiyi kullanarak aynı fonksiyonu su sekilde de yazabiliriz: g g ¸ ¸ #!/usr/bin/env python # -*. soyisim. meslek. s g g Hatta bunun için daha önce söyle bir kod da yazmı¸tık: ¸ s #!/usr/bin/env python # -*. v in kayit. S "0322 123 45 67". soyisim. "¸arkıcı". "Adana". adres] print "\nBa˘lantı bilgileri kayıtlara eklendi!\n" g for k. tel. S "0322 123 45 67". "Adana". "Baraj Yolu"] kayit_ekle(*isimler) Normalde kayit_ekle() fonksiyonu 6 argüman alıyor. adres): kayit = {} kayit["%s %s" %(isim. "Kunek". "¸arkıcı". s g g s Yukarıdaki örnekte.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: ") . meslek. sehir. isimler listesini olu¸turan ö˘ eleri kullanıcıdan da alabilece˘ imizi biliyoruz. meslek.

istedi˘ imiz sayıda isimsiz argümanı nasıl vereg bilece˘ imizi ö˘ renmi¸tik. soyisim. Daha sonra ise raw_input() fonksiyonunu bir for g döngüsü içine sokarak. 13. v in kayit. Bu liste. tel. tel.items(): print k print "-"*len(k) for i in v: print i ls = [] sorular = ["isim: ". adres): kayit = {} kayit["%s %s" %(isim. Son olarak da bu ls listesindeki bütün ö˘ eleri tek tek kayit_ekle() adlı fonksiyona g uyguluyoruz. kullanıcıya sordu˘ umuz bütün soruların cevabını tek tek ls adlı listeye g ekliyoruz. Ardından da sorular adlı ba¸ka bir liste olu¸turduk.coding: utf-8 -*def adres_defteri(isim. g Bildi˘ iniz gibi isimli argümanlar.6 ˙stenen Sayıda ˙simli Argüman Kullanımı I I Bir önceki bölümde fonksiyonları kullanarak. Bu s s da kullanıcıya soraca˘ ımız soruları tutuyor. kullanıcıdan raw_input() fonksiyonu s s yardımıyla alınan cevapları tutacak. s "meslek: ". biraz önce ö˘ rendi˘ imiz bilgileri kullanarak bu kodları su sekilde de kısaltabiliriz: g g g ¸ ¸ #!/usr/bin/env python # -*. "soyisim: ".coding: utf-8 -*def kayit_ekle(isim. "¸ehir: ". telefon): defter = {} defter["isim"] = isim . sehir. meslek. bir isimle birlikte kullanılan argüg s g manlardır. mes. soy. soyisim. adres] print "\nBa˘lantı bilgileri kayıtlara eklendi!\n" g for k. soyisim)] = [sehir. Örne˘ in su fonksiyonda isimli argümanlar kullanılmı¸tır: g ¸ s #!/usr/bin/env python # -*. meslek. "adr: "] for i in sorular: ls. adından da anla¸ılaca˘ ı gibi.tel = raw_input("telefon: ") adr = raw_input("adres: ") kayit_ekle(isi. tel. seh. adr) E˘ er istersek.append(raw_input(i)) kayit_ekle(*ls) Burada önce ls adlı bo¸ bir liste olu¸turduk. Bu bölümde ise istedi˘ imiz sayıda isimli argüman verme konusunu g g s g inceleyece˘ iz. "tel: ".

“k” ve g ¸ “v” ile temsil edilen ö˘ eleri biraz biçimlendirerek ekrana basmaktan ibaret. **arglar): defter = {} defter["isim"] = isim defter["soyisim"] = soyisim defter["telefon"] = telefon for i in arglar. g s Daha sonra gelen satırda söyle bir kod görüyoruz: ¸ for k. defter adlı sözlükteki ilgili alanlara yerle¸tirilecek. ’05994443322’) (’isim’. v)) kodu yardımıyla yaptı˘ ımız sey. ’˙stanbul’) I (’telefon’.items(): print ogeler (’soyisim’. v)) adres_defteri(isim="Fırat". v in defter. sözlük içindeki “anahtar” ve “de˘ er” g g çiftlerini birer demet halinde alıyoruz.coding: utf-8 -*def adres_defteri(isim. E˘ er yukarıdaki kodu söyle yazacak olursanız neler olup g ¸ bitti˘ i biraz daha netle¸ecektir: g s for ogeler in defter. ’Özgül’) (’adres’. “isim”. soyisim="Özgül". Adres bilgilerini bu sözlük içine kaydece˘ iz. Burada “k” harfi. for k. Bunlar karakter dizileri içine sekme g s g (TAB) eklemek için kullanılan kaçı¸ dizileridir.items() satırı ile bu demetlerdeki ö˘ elere tek tek g eri¸ebiliyoruz. Bu satır içinde g gördü˘ ümüz “\t” harflerinin ne i¸e yaradı˘ ını biliyoruz.com’) (’cep’. Fonksiyon parametresi olarak belirledi˘ imiz isim. demetlerin ilk ö˘ elerini.items(): print("%s\t:\t%s" %(k. v in defter. soyisim ve telefon olmak üzere üç farklı alan bulunacak. s Bu fonksiyona göre. Yazdı˘ ımız kodlara g göre defter adlı sözlük içinde isim.keys(): defter[i] = arglar[i] .items(): print("%s\t:\t%s" %(k. v in defter.. soyisim ve telefon ö˘ elerine kar¸ılık gelen g g s de˘ erler. telefon="02122121212") Burada öncelikle defter adlı bir sözlük tanımladık. “v” harfi ise ikinci ö˘ elerini temsil s g g ediyor. v)) Burada defter sözlü˘ ünün items() metodunu kullanarak. g Daha sonra bu defter adlı sözlük içinde yer alacak alanları belirliyoruz. ’firatozgul@frtzgl. ’Fırat’) Gördü˘ ünüz gibi. telefon. Simdi yukarıdaki fonksiyona söyle bir ekleme yapalım: ¸ ¸ #!/usr/bin/env python # -*. Alt satırdaki print("%s\t:\t%s" %(k. ’02122121212’) (’eposta’. yukarıdaki kod bize defter adlı sözlü˘ ün “anahtar” ve “de˘ er” çiflerini içeren g g g birer demet veriyor..defter["soyisim"] = soyisim defter["telefon"] = telefon for k. “soyisim” ve “telefon” alanlarını doldurarak fonksiyonu çalı¸ır hale s getirebiliyoruz. soyisim.

com". sözlüklerin bütün özelliklerine de do˘ al olarak sahipg g tir. soyisim ve g telefon parametrelerini yerle¸tirdikten sonra istedi˘ imiz sayıda ba¸ka isimli argümanlar da bes g s lirtebiliyoruz. soyisim print "telefon:\n\t".for k. soyisim="Özgül". v) adres_defteri(isim="Fırat". I cep="05994443322") Bu kodları çalı¸tırdı˘ ımızda suna benzer bir çıktı alaca˘ ız: s g ¸ g isim: Fırat soyisim: Özgül telefon: 02122121212 öteki argümanlar: {’adres’: ’˙stanbul’.coding: utf-8 -*def adres_defteri(isim. Aslında yaptı˘ ımız sey çok basit. Yukarıdaki kodları su sekilde yazarak. telefon="02122121212". adres="˙stanbul". Bu parametre bir sözlük oldu˘ u için. arglar adres_defteri(isim="Fırat". soyisim="Özgül". I cep="05994443322") Burada yaptı˘ ımız eklemeler sayesinde adres_defteri() adlı fonksiyona isim.com". arglar parametresi bize bir sözlük veriyor. v in defter. telefon="02122121212". I ’eposta’: ’firatozgul@frtzgl. telefon print "öteki argümanlar:\n\t". Sözlükler konusunu s g ¸ anlatırken sözlüklere nasıl ö˘ e ekleyebilece˘ imizi anlattı˘ ımızı hatırlıyorsunuz: g g g .com’.items(): print "%s\t:\t%s" %(k. telefon. eposta="firatozgul@frtzgl. ’cep’: ’05994443322’} Gördü˘ ünüz gibi. Bu yapının g g g kafanızı karı¸tırmasına izin vermeyin. arka planda neler olup bitti˘ ini daha açık bir sekilde ¸ ¸ g ¸ görebiliriz: #!/usr/bin/env python # -*. soyisim. isim print "soyisim:\n\t". adres="˙stanbul". Burada **arglar parametresinin bir sözlük (dictionary) oldu˘ una özellikle dikkat g edin. Dolayısıyla söyle bir kod yazmamız g ¸ mümkün olabiliyor: for i in arglar.keys(): defter[i] = arglar[i] Bu kodlar yardımıyla arglar adlı sözlü˘ ün ö˘ elerini defter adlı sözlü˘ e ekliyoruz. **arglar): print "isim:\n\t". eposta="firatozgul@frtzgl.

elbise ve gömlek adlı ö˘ eler ekliyoruz. Ayrıca sozluk argümanını fonksiyona yazarken yine çift yıldızlı g yapıyı kullanmayı da unutmuyoruz. yukarıdaki örnek for i in g g arglar... adres. arglar[i] dedi˘ imiz sey ise ˙stang ¸ g g ¸ I bul. v) sozluk = {"eposta": "firatozgul@frtzgl. . firatozgul@frtzgl. 13. bir fonksiyonun gömülü olması ne anlama gelir? “gömülü” demek. Bu ö˘ elerin g g g de˘ erini sırasıyla 2.com ve 05994443322 ö˘ elerine kar¸ılık geliyor. **arglar): defter = {} defter["isim"] = isim defter["soyisim"] = soyisim defter["telefon"] = telefon for i in arglar... Söyle dü¸ünün: g ¸ g ¸ s defter = {} defter["adres"] = "˙stanbul" I defter["eposta"] = "firatozgul@frtzgl. Dedi˘ im gibi. 1 ve 4 olarak ayarlıyoruz. Dedi˘ im gibi. telefon. telefon="02122121212".sozluk = {} sozluk["ayakkabı"] = 2 sozluk["elbise"] = 1 sozluk["gömlek"] = 4 Bu örnekte sozluk adlı sözlü˘ e ayakkabı.com" defter["cep"] = "05994443322" defter[i] dedi˘ imiz sey.com". **sozluk) Burada sözlü˘ ü önceden tanımladı˘ ımıza ve bunu fonksiyonu ça˘ ırırken do˘ rudan argüman g g g g olarak ekledi˘ imize dikkat edin. soyisim.coding: utf-8 -*def adres_defteri(isim. I "cep": "05994443322"} adres_defteri(isim="Fırat".7 Gömülü Fonksiyonlar (Built-in Functions) Python’da en büyük nimetlerden biri de bu dilin yapısında bulunan gömülü fonksiyonlardır (built-in functions). v in defter. satırıyla yaptı˘ ımız seyden farklı de˘ ildir.keys(): defter[i] = arglar[i] for k.items(): print "%s\t:\t%s" %(k.keys(). çift yıldızlı parametreler fonksiyonlara istedi˘ imiz sayıda isimli argüman ekg g leme imkanı tanıyor bize. eposta ve cep ö˘ elerine. "adres": "˙stanbul". bu parametreler bir sözlük oldu˘ u için yukarıdaki g g örne˘ i su sekilde de yazabilirsiniz: g ¸ ¸ #!/usr/bin/env python # -*. soyisim="Özgül". Peki. g s Gördü˘ ünüz gibi.

Yani gömülü fonksiyonlar. Python geli¸tiricileri bu fonksiyonu tanımlamı¸ ve dilin içine “gömmü¸lerdir”. Bu fonksiyonun i¸levini yerine getirebilmesi için tanımlanmasına gerek ¸ s yoktur. fonksiyon içinde a adlı bir de˘ i¸kenimiz var.coding: utf-8 -*def fonk(): a = 5 print a fonk() Burada her zamanki gibi fonk() adlı bir fonksiyon tanımladık ve daha sonra bu fonksiyonu ça˘ ırdık. Yani bu fonksiyonları kullanabilmek için özel bir sey yapmanıza gerek yoktur.org/library/functions. Peki. enumerate() ve sum() fonksiyonları da birer gömülü fonksiyondur. Python’daki gömülü fonksiyonların listesine http://docs. bu fonksiyonu g g içeren modülü öncelikle içe aktarmamız (import) gerekir.8 global Deyimi Bu bölümde global adlı bir deyimden söz edece˘ iz. hazır fonksiyonlardır. Yukarıdaki s adreste bunun gibi onlarca gömülü fonksiyon göreceksiniz. Mesela s s s len(). ˙ ¸ Istedi˘ inizde veya bu fonksiyg onlar lazım oldu˘ unda do˘ rudan kullanabilirsiniz bu fonksiyonları. kullanılmaya hazır bir sekilde bekler. bizim kendi yazdı˘ ımız fonksiyonlar arasında tam olarak ne fark g vardır? Bir defa.coding: utf-8 -*def fonk(): a = 5 print a fonk() print "a’nın de˘eri: ". gömülü fonksiyonlarla. gömülü fonksiyonlar oldukça hızlı ve verimlidir. Su son söyledi˘ im seyin kafanızı ¸ g ¸ karı¸tırmasına izin vermeyin.python. Simdi söyle bir sey yazarak bu a g gs ¸ ¸ ¸ de˘ i¸kenine ula¸maya çalı¸alım: gs s s #!/usr/bin/env python # -*. g 13. Bir program yazarken. Python programlama dilinin içinde yer alan.“Python’un içinde yer alan” demektir. özel bir i¸levi yerine getirmeniz gerekti˘ inde s s g yukarıdaki adresi mutlaka kontrol edin. ˙ g Isterseniz global‘in ne oldu˘ unu anlatmaya g çalı¸mak yerine do˘ rudan bir örnekle i¸e ba¸layalım. Sonuç olarak bu fonksiyonu çalı¸tırdı˘ ımızda 5 çıktısını aldık. Bu fonksiyon Python’un içinde. g s g Gördü˘ ünüz gibi. bu fonksiyonlar her an hazır ve nazırdır. Mesela daha önce ö˘ rendi˘ imiz ve sık sık kullandı˘ ımız g g g range() fonksiyonu gömülü bir fonksiyondur.html adresinden eri¸ebilirsiniz. Kendi yazdı˘ ımız fonksiyonları kullanabilmek için. Bunun yerine halis s s hazırda tanımlanıp dilin içine gömülmü¸ olan bin() fonksiyonunu kullanabilirsiniz. Ama bizim tanımladı˘ ımız g g g fonksiyonlar böyle de˘ ildir. a g . oturup s g bu i¸lemi yapan bir fonksiyon tanımlamaya çalı¸manız bo¸ bir çaba olur. Çünkü bu fonksiyonlar Python geli¸tiricileri tarafından özel olarak optimize edilmi¸tir. Bakın bakalım sizden önce birisi tekerle˘ i zaten icat g etmi¸ mi? Örne˘ in tamsayıları (integer) ikili sayılara (binary) çevirmeniz gerekiyorsa. Diyelim ki söyle bir sey yazdık: s g s s ¸ ¸ #!/usr/bin/env python # -*. Yeri ve zamanı geldi˘ inde “modül” ve “içe aktarmak” kavrams g larından söz edece˘ iz. s s ˙ Ikincisi (ve belki de en önemlisi).

coding: utf-8 -*def fonk(): a = 5 print a fonk() a = 10 print "a’nın de˘eri: ". a de˘ i¸kenini fonksiyon dı¸ında s g g gs s da kullanabilmek için bu de˘ i¸keni dı¸arıda tekrar tanımlamamız gerekiyor.coding: utf-8 -*- . ˙ gs Isterseniz bu durumu daha iyi anlayabilmek için yukarıdaki örne˘ i g söyle de˘ i¸tirelim: ¸ gs #!/usr/bin/env python # -*. in <module> print a NameError: name ’a’ is not defined Bu hata mesajı bize a diye bir de˘ i¸ken olmadı˘ ını söylüyor. Bu fonksiyonun etkisi bu alanla sınırlıdır. Gördü˘ ünüz gibi. Peki. Buna göre yukarıdaki fonk() adlı fonksiyon def fonk(): ifadesiyle g s ba¸lıyor. Bu alanın dı¸ına çıkıldı˘ ında a de˘ i¸keninin s g gs herhangi bir geçerlili˘ i yoktur. Ama bunun gs s s s için global adlı bir deyimden yararlanmamız gerekir. line 7. de˘ il mi? O halde neden Python a de˘ i¸kenini bulags s g gs madı˘ ından yakınıyor? Hatırlarsanız bu bölümün en ba¸ında. Yani mesela yukarıdaki fonksiyon içinde tanımladı˘ ımız a de˘ i¸keni g gs yalnızca bu fonksiyon sınırları dâhilinde geçerlidir.py". a g Kodları bu sekilde yazdı˘ ımızda Python’un bize bir hata mesajı gösterece˘ ini biliyoruz. Alt satırdaki 10 de˘ eri ise g g a‘nın fonksiyon sınırları dı¸ındaki de˘ erini.Bu kodları çalı¸tırdı˘ ımızda söyle bir hata alırız: s g ¸ Traceback (most recent call last): File "deneme. Dilerseniz yukarıda ilk verdi˘ imiz örnek g üzerinden giderek bu global deyimini anlamaya çalı¸alım: s #!/usr/bin/env python # -*. Herhangi bir fonksiyon içinde tanımlanan her sey o fonksiy¸ onun isim alanıyla sınırlıdır. Simdi ¸ g g ¸ bu kodlara söyle bir ekleme yapalım: ¸ #!/usr/bin/env python # -*. a g Bu kodları çalı¸tırdı˘ ımızda ise söyle bir çıktı alırız: s g ¸ 5 a’nın de˘eri: 10 g Buradaki ilk 5 sayısı fonksiyon içindeki a‘nın de˘ erini gösteriyor.coding: utf-8 -*def fonk(): a = 5 print a fonk() print "a’nın de˘eri: ". print a ifadesiyle bitiyor. bir fonksiyonun sınırlarının ne g s oldu˘ undan söz etmi¸tik.. Python’da buna s isim alanı (namespace) adı verilir. Halbuki biz fonk() adlı fonksiyon gs g içinde bu a de˘ i¸kenini tanımlamı¸tık. O yüzden Python yukarıdaki gibi bir kod yazdı˘ ımızda a g g de˘ i¸kenini bulamayacaktır. biz fonksiyon gs s içindeki a de˘ i¸kenine fonksiyon dı¸ından da eri¸emez miyiz? Elbette eri¸ebiliriz..

Ardından fonk() adlı gs gs g bir fonksiyon olu¸turduk. Python’daki s gs g “isim alanı” kavramı sayesinde bu iki de˘ i¸kenin de˘ eri birbirine karı¸mıyor. iki adet çıktı veriyoruz.. Bu fonksiyon içinde de˘ eri 5 olan bir a de˘ i¸keni daha tanımladık. global deyimi bir fonksiyon içindeki de˘ erlere fonksiyon dı¸ından da erg g s i¸memize yardımcı oluyor.coding: utf-8 -*a = 10 def fonk(): a = 5 return a print "a’nın fonksiyon içindeki de˘eri".. a s g Buradaki return deyimine takılmayın biraz sonra bunun tam olarak ne i¸e yaradı˘ ını görece˘ iz.. Burada öncelikle bir a de˘ i¸keni tanımladık.. yani fonksiyonun kendi sınırları dı¸ında da geçerli bir de˘ er oldu˘ unu söylüyor. Bu g s g g kodları çalı¸tırdı˘ ımızda söyle bir çıktı alıyoruz: s g ¸ 5 a’nın de˘eri: g 5 Gördü˘ ünüz gibi. ˙ g Ikincisi ise fonksiyon dı¸ındaki a de˘ i¸keninin de˘ erini. s g g Biz yalnızca yukarıdaki kodların çıktısına odaklanalım. Ama bir de su gs g s ¸ kodlara bakın: #!/usr/bin/env python # -*. Bunlardan ilki fonksiyon içindeki a de˘ i¸keninin s gs de˘ erini gösteriyor. fonk() g print "a’nın fonksiyon dı¸ındaki de˘eri: ". Bu ifade fonksiyon içindeki a adlı de˘ i¸kenin “global” ¸ gs oldu˘ unu. a g Burada yaptı˘ ımız sey. Yani bu kodları s gs g çalı¸tırdı˘ ımızda söyle bir çıktı elde ediyoruz: s g ¸ a’nın fonksiyon içindeki de˘eri 5 g a’nın fonksiyon dı¸ındaki de˘eri: s g 10 Burada fonksiyon içinde ve dı¸ında aynı adda iki de˘ i¸ken tanımlamamıza ra˘ men.def fonk(): global a a = 5 print a fonk() print "a’nın de˘eri: ". s Simdi söyle bir sey yazdı˘ ımızı dü¸ünün: ¸ ¸ ¸ g s #!/usr/bin/env python # -*. s g gs Fonksiyon dı¸ında ise.coding: utf-8 -*a = 10 def fonk(): global a a = 5 return a . fonksiyonu tanımladıktan sonra fonksiyon gövdesinin ilk satırına g ¸ global a diye bir sey eklemekten ibaret. Bu de˘ i¸kenin de˘ eri 10.

bu fonksiyonun g g ¸ i¸letilmesi sonucu ortaya çıkan de˘ erin bir karakter dizisi oldu˘ udur. her ne kadar gs g s I¸ faydalı bir araçmı¸ gibi görünse de. ¸ döndürmek. Yani Python’daki bütün fonksiyonlar bir s g de˘ er döndürür. Bu kelime Türkçe’de “vermek.print "a’nın fonksiyon içindeki de˘eri". a s g Burada bir önceki kodlara ilave olarak global a satırını yazdık. print g g ¸ gs deyimini kullanarak bunu ekrana bastırmaktan ibaret.. Örne˘ in yukarıdaki s g g g fonksiyon a adlı de˘ i¸keni döndürüyor ve bu a de˘ i¸keni bir tamsayı oldu˘ u için. Bu arada sunu da belirtelim: Her ne ¸ kadar biz bir fonksiyonda açık açık bir de˘ er döndürmesek de o fonksiyon otomatik olarak bir g de˘ er döndürecektir. iade etmek” gibi anlamlara gelir. fonksiyonlar bir de˘ er döndürüyor da ne oluyor? s g g Yani bir fonksiyonun herhangi bir de˘ er döndürmesinin kime ne faydası var? ˙ g Isterseniz bunu daha iyi anlayabilmek için yukarıdaki örne˘ i bir de söyle yazalım: g ¸ def fonk(): a = 5 print a Burada herhangi bir de˘ er döndürmüyoruz. Bu defa çıktımız söyle oldu: ¸ a’nın fonksiyon içindeki de˘eri 5 g a’nın fonksiyon dı¸ındaki de˘eri: s g 5 Gördü˘ ünüz gibi. ˙ste bu tür sıkıntılardan ötürü. fonk() g print "a’nın fonksiyon dı¸ındaki de˘eri: ". Yaptı˘ ımız sey bir a de˘ i¸keni belirleyip. 13.” veya “Bu g s g fonksiyon bir karakter dizisi döndürür. Siz programın bir yerine bir de˘ i¸ken tanımlamaya çalı¸ırken. fonksiyongs gs g umuzun dönü¸ de˘ eri bir tamsayıdır. g g gs s ba¸ka bir geli¸tirici bir fonksiyon içinde global deyimini kullanarak fonksiyon dı¸ındaki aynı adlı s s s de˘ i¸kenlerin de˘ erini birbirine katmı¸ olabilir. Mesela. Burada “döndürmek”ten kastımız bir i¸lemin sonucu olarak ortaya çıkan g s de˘ eri vermektir. Peki bu ne demek? Açıklayalım: Python’da her fonksiyonun bir “dönü¸ de˘ eri” vardır. Peki.9 return Deyimi Hatırlarsanız bir önceki bölümde söyle bir fonksiyon tanımlamı¸tık: ¸ s def fonk(): a = 5 return a Dikkat ederseniz burada return diye bir sey kullandık. Herhangi bir de˘ er döndürmedi˘ imiz fonksiyonlar otomatik olarak None g g g diye bir de˘ er döndürür. O yüzs den yazdı˘ ınız programlarda global deyiminden mümkün oldu˘ unca uzak durmanızda fayda g g var. Bunu su sekilde test edebiliriz: g ¸ ¸ print fonk() .” dedi˘ imiz zaman kastetti˘ imiz sey. Buna göre yukarıdaki fonksiyon a de˘ i¸kenini gs “döndürüyor”. global deyimi fonksiyon dı¸ındaki a de˘ i¸kenini sildi. “Bu fonksiyonun dönü¸ de˘ eri bir karakter dizisidir. Simdi bu noktada g s gs ¸ kendimize su soruyu sormamız lazım: Acaba bizim istedi˘ imiz sey bu mu? Özellikle üzerinde ¸ g ¸ birkaç farklı ki¸inin çalı¸tı˘ ı büyük projelerde böyle bir özellik ne tür sorunlara yol açabilir? s s g Üzerinde pek çok farklı ki¸inin çalı¸tı˘ ı büyük projelerde global deyiminin büyük sıkıntılar s s g do˘ urabilece˘ i apaçık ortada.. global deyiminin sakıncaları faydalarından çoktur.

bir fonksiyondan herhangi bir de˘ er döndürmedi˘ imizde g g g otomatik olarak None de˘ eri döndürüldü˘ ü için çıktıda bu de˘ eri görüyoruz. fonksiyonu hem g g ekranda bir mesaj göstermek için hem de ba¸ka i¸ler için kullanabilirsiniz.. Halbuki biz a de˘ i¸keninin de˘ eri: 5 gibi s g gs g bir çıktı alaca˘ ımızı zannediyorduk.coding: utf-8 -*def ekrana_bas(): a = 5 print a print "a de˘i¸keninin de˘eri: %s" %ekrana_bas() g s g Bu kodları çalı¸tırdı˘ ımızda söyle bir çıktı alırız: s g ¸ 5 a de˘i¸keninin de˘eri: None g s g Görüyorsunuz. E˘ er tanımladı˘ ınız bir fonksiyonda bir de˘ er döndürmek yerine o de˘ eri s g g g g ekrana basarsanız (yani print deyimini kullanırsanız) fonksiyonun i¸levini bir bakıma kısıtlamı¸ s s olursunuz. print deyimi bir mesajın ¸ ¸ g ekrana basılmasını sa˘ lar. Ama e˘ er yukarıg g g g daki fonksiyonu su sekilde tanımlasaydık i¸imiz daha kolay olurdu: ¸ ¸ s .Fonksiyonu bu sekilde ça˘ ırdı˘ ımızda söyle bir çıktı aldı˘ ımızı göreceksiniz: ¸ g g ¸ g 5 None ˙ste burada gördü˘ ümüz None de˘ eri. bütün bu anlattıkların ne i¸e yarar?” diye sordu˘ unuzu duyar gibiyim. fonk() adlı fonksiyonumuzun otomatik olarak I¸ g g döndürdü˘ ü de˘ erdir. Çünkü tanımladı˘ ınız bu fonksiyonun tek görevi bir de˘ eri ekrana basmak olacakg g tır. Siz bir fonksiyondan bir de˘ er döndürdükten sonra o de˘ erle ne yapaca˘ ınız tamag g g men size kalmı¸. bu fonksiyonda herhangi bir “print” i¸lemi yapmıyor olmamızdır. g Daha önce de dedi˘ imiz gibi.. Bunun nedeni. Bunu anlayabilmek s s için söyle bir örnek verelim: ¸ #!/usr/bin/env python # -*. Bu fonksiyondan çıktı alabilmek için fonksiyonu söyle ¸ ça˘ ırmamız gerekir: g print fonk() “Peki. s g Bir defa sunu anlamamız lazım: print ve return aynı seyler de˘ ildir. Simdi gs g g g ¸ su fonksiyona bakalım: ¸ def fonk(): a = 5 return a fonk() Burada ise ekranda herhangi bir çıktı göremeyiz. return deyimi ise herhangi bir de˘ erin döndürülmesinden sorumg g ludur. Ama e˘ er o de˘ eri ekrana basmak yerine döndürmeyi tercih ederseniz. Yukarıdaki fonksiyonu print olmadan da ça˘ ırabilece˘ imizi biliyorsunuz: g g g g fonk() Bu defa a de˘ i¸keninin de˘ eri ekrana dökülecek. s gs Yani ekrana herhangi bir çıktı vermiyoruz. ancak None de˘ erini göremeyece˘ iz. i¸ler hiç de istedi˘ imiz gibi gitmedi. Biz burada sadece a de˘ i¸kenini döndürmekle yetiniyoruz.

coding: utf-8 -*def ekrana_bas(): a = 5 return a print "a de˘i¸keninin de˘eri: %s" %ekrana_bas() g s g Gördü˘ ünüz gibi.coding: utf-8 -*def sayi_isle(): sor = input("bir sayı girin: ") return sor sayi = sayi_isle() print "girdi˘iniz sayı: %s" %sayi g if sayi % 2 == 0: print "girdi˘iniz sayı çifttir" g else: print "girdi˘iniz sayı tektir" g print "girdi˘iniz sayının karesi: %s" %sayi ** 2 g print "girdi˘iniz sayının küpü: %s" %sayi ** 3 g Burada sayi_isle() adlı fonksiyonda kullanıcıya bir sayı sorup bu sayıyı döndürüyoruz. bu ne demek? s g Su örne˘ e bir bakalım: ¸ g #!/usr/bin/env python # -*. O zaman ne demek istedi˘ imi gayet net bir biçimde anlayacaksınız.#!/usr/bin/env python # -*. g 13. “Pass” kelimesi Türkçe’de “geçmek. a¸mak” gibi anlamlara gelir. ˙ g g g s Isterseniz bu fonksiyonu bir de return yerine print ile tanımlamayı deneyin.coding: utf-8 -*def deneme(): liste = [] while True: a = raw_input("Giriniz: ") if a == "0": pass else: liste. bu defa istedi˘ imiz çıktıyı aldık. Bir de su örne˘ e bakın: g g ¸ g #!/usr/bin/env python # -*. Peki. ˙ s s Isterseniz o deyimi tekrar hatırlayalım. Python’da ise bu deyim hers hangi bir i¸lem yapmadan geçece˘ imiz durumlarda kullanılır.append(a) .10 Fonksiyonlarda pass Deyimi Hatırlarsanız hata yakalama konusunu i¸lerken pass adlı bir deyimden söz etmi¸tik. Daha sonra fonksiyonu ça˘ ırırken. bu döndürdümüz de˘ erle istedi˘ imiz i¸lemi yapabiliyoruz.

.""" s pass Gördü˘ ünüz gibi. g g 13. Böyle bir durumda.. yukarıda gösterdi˘ imiz gibi s s g fonksiyonu tanımlayıp gövde kısmına da bir pass deyimi yerle¸tirebilirsiniz.__doc__ sum(sequence[. Bu deyimi kullanarak söyle bir sey yazabilirsiniz: s ¸ ¸ def bir_fonksiyon(): pass Fonksiyon tanımlarken fonksiyon gövdesini bo¸ bırakamazsınız. g Python programcılarının. Bu programda bir fonksiyon tanımlayacaksınız. pass deyimini yukarıdaki g g s durumlar dı¸ında bir de söyle bir durumda kullanabilirsiniz: Diyelim ki bir program yazıyors ¸ sunuz. kod bir kez yazılır. ˙ste böyle s I¸ bir durumda pass deyimi imdadınıza yeti¸ir.coding: utf-8 -*def fonk(): """bo¸ bir fonksiyondur. Belg gelendirme dizilerinde üç tırnak kullanmak adettendir. E˘ er program içinde sadece g g s g fonksiyonun ismini yazıp bırakırsanız programınız çalı¸ma sırasında hata verecektir. When the sequence is empty. Bir fonksiyona ait belgelendirme dizisine eri¸mek için su yöntemi kullanıyoruz: s ¸ Mesela sum() fonksiyonunun belgelendirme dizisine ula¸alım: s >>> print sum. Çünkü dedi˘ imiz gibi. Program yazarları. start]) -> value Returns the sum of a sequence of numbers (NOT strings) plus the value of parameter ’start’ (which defaults to 0). yazdı˘ ınız kodların i¸levinin yanısıra s ¸ g s anla¸ılır olmasına da dikkat etmeniz gerekir. e˘ er s g g gövdeyi bo¸ bırakırsanız programınız çalı¸maz. Daha sonra gövde s kısmına ne yazaca˘ ınıza karar verdi˘ inizde bu pass deyimini silebilirsiniz. bu de˘ er listeye eklenmeyecek. Hiçbir s i¸e yaramaz. e˘ er kullanıcı 0 de˘ erini girerse. pass deyiminin bu görevlerini daha önce ö˘ renmi¸tik. g g g g Python hiçbir sey yapmadan bu satırı atlayacaktır.11 Fonksiyonların Belgelendirilmesi Her zaman söyledi˘ imiz gibi. ama fonksiyon içeri˘ ini nasıl yazaca˘ ınızı dü¸ünmediniz.print liste deneme() Burada gördü˘ ümüz gibi. Program yazarken. Fonksiyonun isminin ne olaca˘ ına karar g verdiniz. bin kez okunur. belgelendirme dizisini fonksiyon tanımının hemen ardından getiriyoruz. ˙ste pass buna benzer durumlarda. Bu yüzden yazdı˘ ınız kodların g g anla¸ılır olması her seyden önemlidir. returns start. okunaklılı˘ ı artırmak için kullanabilece˘ i bir ba¸ka yardımcı araç da g g s belgelendirme dizileridir (docstring). yazdıkları kodların daha kolay s anla¸ılmasını sa˘ lamak için bazı yardımcı araçlardan da faydalanır. “hiçbir ¸ I¸ sey yapmadan yola devam et!” anlamı katar kodlarımıza. . Mesela önceki derslerims g izde gördü˘ ümüz yorum (comment) kavramı bu yardımcı araçlardan biridir. ¸ Dedi˘ imiz gibi. Dilerseniz hemen bununla ilgili küçük bir örnek verelim: #!/usr/bin/env python # -*.

." % deneme g print ("Bu ö˘rencilerin not ortalaması: %s" g %(sum(toplam)/deneme)) not_ortalamasi_hesapla() Gördü˘ ünüz gibi... s g Yukarıdaki kodlarda yer alan belgelendirme dizisini ekrana basmak için kodlarınıza söyle bir ¸ satır eklemelisiniz: print not_ortalamasi_hesapla. Artık yeni ve çok önemli bir konu olan s “Modüllere” ba¸layabiliriz... Ama tabii ki önce bölüm sorularımız.__doc__ Bu arada.append(int(raw_input("%s.coding: utf-8 -*def not_ortalamasi_hesapla(ogrenci_sayisi=5): """Not ortalaması hesaplayan bir fonksiyon. s . g Böylece fonksiyonlar konusunu tamamlamı¸ olduk. pass Simdi de fonksiyonumuzun belgelendirme dizisine ula¸alım: ¸ s >>> print fonk.. Hiçbir s i¸e yaramaz. """bo¸ bir fonksiyondur..Kendi yazdı˘ ımız fonksiyonların belgelendirme dizilerine de aynı sekilde ula¸abiliriz. yazdı˘ ınız belgelendirme dizilerinin de Python’un girintileme kurallarına uygun olg ması gerekti˘ ine dikkat edin.""" deneme = 0 toplam = [] while deneme < ogrenci_sayisi: deneme += 1 toplam. i¸e yaramaz.. yazdı˘ ımız seyin g g ¸ ne i¸e yaradı˘ ı hakkında fikir sahibi olacaktır. Belgelendirme dizileri sayesinde. s Gelin isterseniz biraz daha anlamlı bir örnek verelim: #!/usr/bin/env python # -*..__doc__ bo¸ bir fonksiyondur.. Bu fonksiyonun aldı˘ı tek argüman g kullanıcıya kaç kez not bilgisi sorulaca˘ını g gösterir. Belgelendirme dizileri özellikle yazdı˘ ımız kodları okuyan ba¸kaları için g g s kıymetlidir. belgelendirme dizileri bize yazdı˘ ımız bir fonksiyonun ne i¸e yaradı˘ ını ang g s g latma imkanı sa˘ lıyor. Hiçbir s .. yazdı˘ ımız kodları okuyanlar. Önce g ¸ s fonksiyonumuzu tanımlayalım: >>> def fonk(): .""" s .. ö˘rencinin notu: " g % deneme))) print "Toplam %s ö˘renci var.

13.12 Bölüm Soruları
1. Esasında siz, bu bölümde inceledi˘ imiz fonksiyon konusuna hiç de yabancı sayılmazsınız. g Bu bölüme gelinceye kadar pek çok fonksiyon ö˘ renmi¸tik. Mesela daha önceki derslerimizden g s hangi fonksiyonları hatırlıyorsunuz? 2. Python’daki sum() fonksiyonunun yaptı˘ ı i¸i yapan bir fonksiyon yazın. Yazdı˘ ınız fonksiyon g s g bir liste içindeki sayıların toplamını verebilmeli. 3. Kullanıcıya isim soran bir program yazın. Bu program kullanıcının ismini ekrana dökebilmeli. Ancak e˘ er kullanıcının girdi˘ i isim 5 karakterden uzunsa, 5 karakterden uzun olan g g kısım ekrana basılmamalı, onun yerine ”...” i¸areti gösterilmelidir. Örne˘ in kullanıcıdan alınan s g isim Abdullah ise programınız “Abdul...” çıktısını vermeli. 4. Bir önceki soruda yazdı˘ ınız programda kullanıcı, içinde Türkçe karakterler bulunan bir isim g girdi˘ inde programınızda nasıl bir durum ortaya çıkıyor? Örne˘ in programınız “I¸ıl” ismine g g s nasıl bir tepki veriyor? Sizce bunun sebebi nedir? 5. Yukarıdaki fonksiyonlarla ilgili söyle bir örnek vermi¸tik: ¸ s
#!/usr/bin/env python # -*- coding: utf-8 -*def tek(): print "Girdi˘iniz sayı bir tek sayıdır!" g def cift(): print "Girdi˘iniz sayı bir çift sayıdır!" g sayi = raw_input("Lütfen bir sayı giriniz: ") if int(sayi) % 2 == 0: cift() else: tek()

Bu kodlara söyle bir baktı˘ ınızda, aslında bu kodları su sekilde de yazabilece˘ imizi farket¸ g ¸ ¸ g mi¸sinizdir: s
#!/usr/bin/env python # -*- coding: utf-8 -*sayi = raw_input("Lütfen bir sayı giriniz: ") if int(sayi) % 2 == 0: print "Girdi˘iniz sayı bir çift sayıdır!" g else: print "Girdi˘iniz sayı bir tek sayıdır!" g

Bu kodları böyle de˘ il de fonksiyon içinde yazmamızın sizce ne gibi avantajları vardır? g 6. Argüman ile parametre arasındaki farkı açıklayın. 7. Standart bir kurulum beti˘ ini taklit eden bir program yazın. Örne˘ in programınız su a¸ag g ¸ s maları gerçekle¸tirebilmeli: s • Kullanıcıya, “Kuruluma ho¸geldiniz!” mesajı göstermeli, s

• Kullanıcıya bir lisans anla¸ması sunmalı ve bu anla¸manın sartlarını kabul edip etmedi˘ ini s s ¸ g sormalı, • E˘ er kullanıcı lisans anla¸masının sartlarını kabul ederse kuruluma devam etmeli, aksi g s ¸ halde kurulumdan çıkmalı, • Kullanıcıya, “standart paket”, “minimum kurulum” ve “özel kurulum” olmak üzere üç farklı kurulum seçene˘ i sunmalı, g • Kullanıcının seçimine göre, programda kurulu gelecek özelliklerin bazılarını etkinle¸tirmeli s veya devre dı¸ı bırakmalı, s • Programın sistem üzerinde hangi dizine kurulaca˘ ını kullanıcıya sorabilmeli, g • Kurulumdan hemen önce, programın hangi özelliklerle kurulmak üzere oldu˘ unu kulg lanıcıya son kez bildirmeli ve bu a¸amada kullanıcıya kurulumdan vazgeçme veya kus rulum özelliklerini de˘ i¸tirme imkanı vermeli, gs • E˘ er kullanıcı kurulum özelliklerini de˘ i¸tirmek isterse önceki a¸amaya geri dönebilmeli, g gs s • E˘ er kullanıcı, seçti˘ i özelliklerle kurulumu gerçekle¸tirmek isterse program kullanıcının g g s belirledi˘ i sekilde sisteme kurulabilmeli, g ¸ • Son olarak kullanıcıya kurulumun ba¸arıyla gerçekle¸tirildi˘ ini bildiren bir mesaj gösters s g meli. Not: Bu adımları kendi hayal gücünüze göre de˘ i¸tirebilir, bunlara yeni basamaklar ekleyegs bilirsiniz. 8. Fonksiyonlar konusunu anlatırken söyle bir örnek vermi¸tik: ¸ s
#!/usr/bin/env python # -*- coding: utf-8 -*def tek(): print "Girdi˘iniz sayı bir tek sayıdır!" g def cift(): print "Girdi˘iniz sayı bir çift sayıdır!" g sayi = raw_input("Lütfen bir sayı giriniz: ") if int(sayi) % 2 == 0: cift() else: tek()

Bu programın zayıf yönlerini bulmaya çalı¸ın. Sizce bu program hangi durumlarda çöker? Bu s programın çökmesini engellemek için ne yapmak gerekir?

BÖLÜM

14

Modüller

Bu bölümde Python’daki en önemli konulardan biri olan modüllerden söz edece˘ iz. Ancak g modülleri kullanabilmek için tabii ki öncelikle “modül” denen seyin ne oldu˘ unu anlamamız ¸ g gerekiyor. Söyle dü¸ünün: Diyelim ki bir program yazıyorsunuz. Yazdı˘ ınız bu programın içinde karakter ¸ s g dizileri, sayılar, de˘ i¸kenler, listeler, demetler, sözlükler, kümeler ve fonksiyonlar var. Progs gramınız da .py uzantılı bir metin dosyası içinde yer alıyor. ˙ste bütün bu ö˘ eleri ve veri tipI¸ g lerini içeren .py uzantılı dosyaya modül adı verilir. Bu bilgiye göre, simdiye kadar yazdı˘ ınız ve ¸ g bundan sonra yazaca˘ ınız bütün Python programları aynı zamanda birer modüldür. g Peki, bu bilginin bize ne faydası var? Ya da söyle soralım: Yazdı˘ ımız bir Python programının ¸ g modül olması neden bu kadar önemli? Hatırlarsanız bir önceki bölümde Python’daki fonksiyonlardan bahsetmi¸tik. Yine hatırlarsanız s o bölümde carp() adlı bir fonksiyon da tanımlamı¸tık. Bu fonksiyonu kullanabilmek için ne s yapmamız gerekti˘ ini biliyorsunuz. carp() fonksiyonuna ihtiyacımız oldu˘ unda bu fonksiyonu g g ça˘ ırmamız yeterli oluyor. Simdi söyle bir dü¸ünelim: Biz bu carp() fonksiyonuna ihtiyacımız g ¸ ¸ s oldu˘ unda fonksiyonu ça˘ ırmak yoluyla aynı program içinde kullanabiliyoruz. Peki ya aynı g g fonksiyona ba¸ka bir Python programında da ihtiyacımız olursa ne yapaca˘ ız? O fonksiyonu s g kopyalayıp öbür Python programına yapı¸tıracak mıyız? Tabii ki hayır! Kodları alıp oradan s oraya kopyalamak programcılık tecrübeniz açısından hiç de verimli bir yöntem de˘ ildir. Üsteg lik do˘ ası gere˘ i “kopyala-yapı¸tır” tekni˘ i hatalara oldukça açık bir yoldur. Biz herhangi bir g g s g Python programında bulunan herhangi bir fonksiyona (veya niteli˘ e) ihtiyaç duydu˘ umuzda o g g fonksiyonu (veya niteli˘ i) programımıza “aktaraca˘ ız”. Peki, bunu nasıl yapaca˘ ız? g g g Dedi˘ imiz gibi bütün Python programları aynı zamanda birer modüldür. Bu özellik sayesinde g Python programlarında bulunan fonksiyon ve nitelikler ba¸ka Python programları içine aktarılas bilirler. Böylece bir Python programındaki i¸levsellikten, ba¸ka bir Python programında da s s yararlanabilirsiniz. ˙ste bu bölümde, bütün bu i¸lemleri nasıl yapaca˘ ımızı ö˘ renece˘ iz. Dilerseniz lafı daha fazla I¸ s g g g dolandırmadan modüller konusuna hızlı bir giri¸ yapalım. s

14.1 Modüllerin Çe¸ itleri s
Python’da modüller çe¸it çe¸ittir. Temel olarak Python’da üç çe¸it modülden söz edilebilir: s s s 1. Kendi Yazdı˘ ınız Modüller g 173

2. Geli¸tiricilerin Yazdı˘ ı Modüller s g 3. Üçüncü Sahısların Yazdı˘ ı Modüller ¸ g ˘ Kendi yazdıgınız modüller, adından da anla¸ılaca˘ ı gibi, bir Python programcısı olarak otus g rup sizin yazdı˘ ınız modüllerdir. g ˘ Geli¸ tiricilerin yazdıgı modüller, sizin modüllerinizin aksine Python geli¸tiricileri tarafından s s yazılıp Python programlama diline entegre edilmi¸ olan ve bu bakımdan dilin bir parçası olan s modüllerdir. ˘ Üçüncü sahısların yazdıgı modüller, genellikle internet üzerindeki kaynaklardan edinebile¸ ce˘ iniz, Python programcıları tarafından hazırlanıp herkesin kullanımına sunulmu¸ olan modg s üllerdir. Biz bu bölümde, yukarıda saydı˘ ımız üç modül türünü de olabildi˘ ince ayrıntılı bir sekilde g g ¸ incelemeye çalı¸aca˘ ız. Dilerseniz öncelikle kendi yazdı˘ ımız modüllerden ba¸layalım... s g g s

˘ 14.2 Kendi Yazdıgınız Modüller
Yukarıda da tanımladı˘ ımız gibi, kendi yazdı˘ ınız modüller, birer Python programcısı olarak otug g rup sizin yazdı˘ ınız Python programlarıdır. Mesela bir program yazdınız ve adını da deneme.py g koydunuz. Bu programın içeri˘ i söyle 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 modüldür ve bu modül, carp() adlı tek bir I¸ fonksiyondan olu¸ur. Elbette modüller tek bir fonksiyondan ibaret olmak zorunda de˘ ildir. s g Bir modül pek çok farklı fonksiyondan olu¸abilir. Ö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 dört farklı fonksiyona sahip bir modül tanımladık. Dilerseniz bu modülü masaüstüne aritmetik.py adıyla kaydedelim. Bu noktada Modül nedir? sorusunu tekrar sormakta fayda var. Bu bölümün en ba¸ında s yaptı˘ ımız tanıma göre, carp(), bol(), topla() ve cikar() fonksiyonlarını içeren yukarıdaki arg itmetik.py adlı program bir modüldür. Bu modülün adı da aritmetik‘tir. Python’da modüller (genellikle) .py uzantısına sahiptir. Ancak bir modülün adı söylenirken bu .py uzantısı es geçilir ve sadece isim kısmı dikkate alınır. Bu yüzden elinizdeki aritmetik.py adlı program aritmetik modülü olarak adlandırılacaktır. Dedi˘ imiz gibi, bu modül içinde toplam dört adet fonksiyon var. Biz bu fonksiyonları aynı modül g içinde rahatlıkla kullanabiliriz. Mesela cikar() fonksiyonuna ihtiyacımız oldu˘ unda yapmamız g gereken tek sey bu fonksiyonu ça˘ ırmaktır: ¸ g
print cikar(1545, 1432)

Veya topla() fonksiyonuna gereksinim duyarsak, yine bu fonksiyonu ça˘ ırmak çok kolaydır: g
print topla(3, 15, 43, 23, 88)

Peki ya bu fonksiyonlara ba¸ka bir programda da ihtiyaç duyarsak ne olacak? Böyle bir dus rumda yapaca˘ ımız sey bu fonksiyonu o program içinden ça˘ ırmak olacak. Ancak bunu yapg ¸ g manın belli kuralları var. Peki, nedir bu kurallar? ˙ste simdi bu kuralların ne oldu˘ unu inceleyeI¸ ¸ g ce˘ iz... g

14.3 Modülleri ˙çe Aktarmak I
Bu bölümün ba¸ında söyle bir cümle sarfetmi¸tik: s ¸ s “Herhangi bir Python programında bulunan herhangi bir fonksiyona (veya niteli˘ e) g ihtiyaç duydu˘ umuzda o fonksiyonu (veya niteli˘ i) programımıza aktarabiliriz.“ g g Python’da bir modülü ba¸ka bir programa ta¸ıma i¸lemine içe aktarma adı verilir. ˙ s s s Ingilizce’de ise bu i¸leme import deniyor. s Simdi yukarıda aritmetik.py adıyla kaydetti˘ imiz dosyanın bulundu˘ u dizin içinde bir ko¸ g g mut satırı açıp Python’un etkile¸imli kabu˘ unu çalı¸tırın. Mesela e˘ er aritmetik.py dosyasını s g s g masaüstüne kaydettiyseniz bir komut satırı açın, cd Desktop komutuyla masaüstüne gelin ve orada python komutunu vererek etkile¸imli kabu˘ u ba¸latın. Simdi su komutu verin: s g s ¸ ¸
>>> import aritmetik

E˘ er hiçbir sey olmadan bir alt satıra geçildiyse modülünüzü ba¸arıyla içe aktardınız demektir. g ¸ s E˘ er söyle bir hata çıktısıyla kar¸ıla¸ıyorsanız, muhtemelen Python’u masaüstünün oldu˘ u g ¸ s s g dizinde ba¸latamamı¸sınızdır: s s
>>> import aritmetik Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named aritmetik

import aritmetik komutunun ba¸arılı oldu˘ unu varsayarak yolumuza devam edelim... s g Modülü içe aktardıktan sonra dir() adlı özel bir fonksiyondan yararlanarak, içe aktardı˘ ımız bu g modül içindeki kullanılabilir fonksiyon ve nitelikleri görebilece˘ imizi biliyorsunuz: g
>>> dir(aritmetik)

Bu komut bize söyle bir çıktı verir: ¸
[’__builtins__’, ’__doc__’, ’__file__’, ’__name__’, ’__package__’, ’bol’, ’carp’, ’cikar’, ’topla’]

Burada bizi ilgilendiren kısım bol, carp, cikar ve topla adlı ö˘ eler. Bu çıktıdan anlıyoruz ki, aritg metik adlı modülün içinde bol, carp, cikar ve topla adlı fonksiyonlar var ve biz bu fonksiyonları kullanma imkânına sahibiz. O halde gelin mesela bu modül içindeki carp() adlı fonksiyonu kullanabilmek için sırasıyla söyle bir seyler yazalım: ¸ ¸
>>> liste = [45, 66, 76, 12] >>> aritmetik.carp(liste)

Bu komutlar söyle bir çıktı verir: ¸
2708640

Gördü˘ ünüz gibi, aritmetik modülü içindeki carp() adlı fonksiyonu kullanarak “liste” içindeki g sayıları birbiriyle çarptık. aritmetik modülünü nasıl içe aktardı˘ ımıza ve bu modülün içindeki bir g fonksiyon olan carp() fonksiyonunu nasıl kullandı˘ ımıza çok dikkat edin. Önce modülümüzün g adı olan “aritmetik”i yazıyoruz. Ardından bir nokta i¸areti koyup, ihtiyacımız olan fonksiyonun s adını belirtiyoruz. Yani söyle bir formül takip ediyoruz: ¸
modül_adı.fonksiyon

Böylece modül içindeki fonksiyona eri¸mi¸ olduk. Yalnız burada asla unutmamamız gereken s s sey öncelikle kullanaca˘ ımız modülü import modül_adı komutuyla içe aktarmak olacaktır. ¸ g Modülü içe aktarmazsak tabii ki o modüldeki fonksiyon veya niteliklere eri¸emeyiz. s Simdi aritmetik.py adlı dosyanızı açıp dosyanın en ba¸ına su kodu ekleyin: ¸ s ¸
pi_sayisi = 22/7.0

Yani aritmetik.py dosyasının son hali söyle 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 satırına dönüp su komutu verin: ¸ ¸
dir(aritmetik)

Bu komut biraz öncekiyle aynı çıktıyı verecektir. Halbuki biz modülümüze pi_sayisi adlı bir de˘ i¸ken daha ekledik. O halde neden bu de˘ i¸ken listede görünmüyor? gs gs Python’da bir modülü komut satırında içe aktardıktan sonra e˘ er o modülde bir de˘ i¸iklik yag gs parsanız, o de˘ i¸ikli˘ in etkili olabilmesi için modülü yeniden yüklemeniz gerekir. Bu i¸lemi gs g s reload() adlı özel bir fonksiyon yardımıyla yapıyoruz:
>>> reload(aritmetik)

Bu komut söyle bir çıktı verir: ¸
<module ’aritmetik’ from ’aritmetik.py’>

Bu çıktı modülün ba¸arıyla yeniden yüklendi˘ ini gösteriyor. Simdi dir(aritmetik) komutunu s g ¸ tekrar verelim:
>>> dir(aritmetik)

Bu defa listede bol, carp, cikar ve topla ö˘ eleriyle birlikte pi_sayisi ö˘ esini de göreceksiniz. g g Dolayısıyla artık bu ö˘ eye de eri¸ebilirsiniz: g s
>>> aritmetik.pi_sayisi 3.1428571428571428

Eh, yarım yamalak da olsa pi sayısını elde etmi¸ olduk!.. s Buraya kadar modülleri hep etkile¸imli kabukta içe aktardık. Ama tabii ki önemli olan bir s modülü ba¸ka bir python programı içinden ça˘ ırabilmektir. ˙ s g Isterseniz simdi bir modülü ba¸ka ¸ s bir Python programı içinden nasıl ça˘ ırabilece˘ imizi ö˘ renelim. g g g Simdi masaüstünde test.py adlı bir dosya olu¸turun ve Kwrite, Kate, Gedit veya IDLE adlı metin ¸ s düzenleyicilerden birini kullanarak bu dosyayı açın. Dosyaya su satırları yazın: ¸
#!/usr/bin/env python # -*- coding: utf-8 -*import aritmetik

˙ iki satır zaten demirba¸. Burada önemli olan satır import aritmetik. Bu satırla, yine Ilk s masaüstünde kayıtlı bulunan aritmetik.py adlı programı, yani aritmetik modülünü içe aktardık. Bu modülü içe aktardı˘ ımıza göre, artık bu modülün içindeki bütün 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ı˘ ımız son satırda, aritmetik modülünün içinde yer alan cikar() adlı fonksiyonu kullanmı¸ g s olduk. Böylece daha önce bir kez tanımladı˘ ımız cikar() adlı fonksiyona ba¸ka bir Python prog s gramında da ihtiyaç duydu˘ umuzda, bu fonksiyonu tekrar yazmak zorunda kalmadan, gerekli g fonksiyonu barındıran modülü programımız içine aktararak (import) i¸imizi hallettik. Aynı seks ¸ ilde aritmetik modülü içindeki öbür fonksiyonları ve nitelikleri de kullanabilirsiniz. Mesela modül içinde 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 sayısının de˘eri: %s" %aritmetik.pi_sayisi g

Simdi bu test.py adlı programı çalı¸tırın ve nasıl bir sonuç aldı˘ ınızı inceleyin. ¸ s g

14.4 Modülleri ˙çe Aktarma Yöntemleri I
Python’da programımız içinde kullanaca˘ ımız modülleri birkaç farklı yöntemle içe aktarabiliriz. g Biz simdiye kadar sadece import modül_adı yöntemini ö˘ rendik. Hemen kısaca bu yöntem¸ g leri inceleyelim: import modül_adı Bu yöntemle bir modülü, bütün içeri˘ iyle birlikte içe aktarabiliriz. Ba¸ka bir deyi¸le bir modülün g s s içinde ne var ne yoksa programımız içine davet edebiliriz. Yukarıda kullandı˘ ımız da zaten bu g yöntemdir. from modül_adı import * Bu yöntemle bir modül içinde adı “__” ile ba¸layanlar hariç bütün fonksiyonları programımız s içine aktarabiliriz. Yani bu yöntem de tıpkı yukarıda anlatılan yöntemde oldu˘ u gibi, bütün g fonksiyonları alacaktır. Yalnız “__” ile ba¸layan fonksiyonlar hariç... s E˘ er bir modülü bu yöntemi kullanarak içe aktarmı¸sanız, içe aktardı˘ ımız modülün nitelik g s g ve fonksiyonlarına do˘ rudan nitelik veya fonksiyon adını kullanarak eri¸ebilirsiniz. Örne˘ in g s g import modül_adı yöntemiyle içe aktardı˘ ımız modüllerin nitelik ve fonksiyonlarını söyle kulg ¸ lanıyorduk:
>>> modül_adı.fonksiyon

from modül_adı import * yöntemiyle içe aktardı˘ ımız modüllerin nitelik ve fonksiyonlarını g ise söyle kullanıyoruz: ¸
>>> fonksiyon

Mesela yukarıda bahsetti˘ imiz aritmetik modülünü örnek alalım: g

>>> from aritmetik import * >>> liste = [2, 3, 4] >>> print carp(liste) 24

Gördü˘ ünüz gibi, bu defa aritmetik.carp(liste) gibi bir komut vermedik. carp() fonksiyg onunu do˘ rudan kullanabildik. Bu yöntem oldukça pratiktir. Programcıya aynı i¸i daha az g s kodla yapma imkânı sa˘ lar. Ancak bu yöntemin bazı sakıncaları vardır. Bunlara biraz sonra g de˘ inece˘ iz. g g from modül_adı import falanca, filanca Bu yöntem ise bir modülden falanca ve filanca adlı fonksiyonları ça˘ ırmamızı sa˘ layacaktır. g g Yani bütün içeri˘ i de˘ il, bizim istedi˘ imiz fonksiyonları içe aktarmakla yetinecektir. Örne˘ in: g g g g
>>> from aritmetik import carp

Bu sekilde aritmetik modülünün yalnızca carp() fonksiyonunu içe aktarmı¸ olduk. Bu sekilde ¸ s ¸ carp() fonksiyonuna eri¸ebiliriz: s
>>> liste = [2, 3, 4] >>> print carp(liste) 24

Ama pi_sayisi niteli˘ ine eri¸emeyiz. Çünkü biz burada sadece carp() fonksiyonunu içe akg s tardık. E˘ er pi_sayisi niteli˘ ine de eri¸ebilmek istersek modülümüzü su sekilde içe aktarg g s ¸ ¸ mamız gerekir:
>>> from deneme import carp, pi_sayisi

Bu sekilde hem carp() fonksiyonunu, hem de pi_sayisi niteli˘ ini içe aktarmı¸ olduk. ¸ g s import modül_adı as yeni_isim Diyelim ki herhangi bir sebepten, modülün adını programınız içinde do˘ rudan kullanmak isg temiyorsunuz. O zaman bu yöntemi kullanarak modüle farklı bir ad verebilirsiniz:
>>> import aritmetik as arit >>> liste = [2, 3, 4] >>> arit.carp(liste)

Mesela içe aktaraca˘ ınız modül adı çok uzunsa ve her defasında bu uzun ismi yazmak size g zor geliyorsa bu yöntemi kullanarak modül adını kısaltabilirsiniz. Ayrıca programınızda zaten aritmetik adlı ba¸ka bir nitelik veya fonksiyon varsa bu ikisinin birbirine karı¸masını engelles s mek için de bu yöntemi kullanmayı tercih edebilirsiniz. Peki bu yöntemlerden hangisini kullanmak daha iyidir? E˘ er ne yaptı˘ ınızdan tam olarak g g emin de˘ ilseniz veya o modülle ilgili bir belgede farklı bir yöntem kullanmanız önerilmiyg orsa, anlatılan birinci yöntemi kullanmak her zaman daha güvenlidir (import modül_adı). Çünkü bu sekilde bir fonksiyonun nereden geldi˘ ini karı¸tırma ihtimaliniz ortadan kalkar. ¸ g s Mesela aritmetik.carp(liste) gibi bir komuta baktı˘ ınızda carp() fonksiyonunun aritmetik g adlı bir modül içinde oldu˘ unu anlayabilirsiniz. Ama sadece carp(liste) gibi bir komutla g

GNU/Linux sistemlerinde bu modül ço˘ unlukla /usr/lib/python2.5. Bir de hazır yazılmı¸ modüller s vardır. O gs ¸ s yüzden içeri˘ ini bilmedi˘ iniz modülleri içe aktarırken import modül_adı yöntemini kullanmak g g sizi büyük ba¸ a˘ rılarından kurtarabilir. Ama modül çe¸itlerinden bahsederken de söyledi˘ imiz gibi.org/library/os. yoksa ba¸ka bir modülden s s g g s mi içe aktarıldı˘ ını anlayamazsınız.python. os. Ayrıca mesela programınız içinde zaten carp() adlı bir g fonksiyon varsa. Python programlama dili içinde çok sayıda modül kullanıma hazır bir sekilde bizi bekler.1428571428571428 Gördü˘ ünüz gibi. s Modülün kendi belgelerinde belirtildi˘ ine göre. Bu dosyanın sizin yazdı˘ ınız Python s g g programlarından hiç bir farkı yoktur.py adlı bir Python programıdır.org/modindex. s g 14.html adresinden eri¸ebilirsiniz. Herhalde böyle bir seyin ba¸ınıza gelmesini istemezsiniz. Bu modüle ili¸kin s s g s resmi (˙ Ingilizce) belgelere http://docs. modülü g içe aktarmak suretiyle nasıl kullanıyorsanız.py dosyasını açıp içine baktı˘ ınızda. aritmetik modülündeki pi_sayisi niteli˘ i sizin kendi programınızdaki g g pi_sayisi de˘ i¸kenini silip attı.kar¸ıla¸tı˘ ınızda bu fonksiyonun program içinde mi yer aldı˘ ını.6/ dizini içinde bulunur. ¸ Python modüllerinin listesine http://docs.5 Geli¸ tiricilerin Yazdıgı Modüller s Buraya kadar kendi kendimize nasıl Python modülü yazaca˘ ımızı ve yazdı˘ ımız bu modülg g leri nasıl kullanaca˘ ımızı gördük. i¸letim sistemleriyle ilgili i¸lemler yapma olana˘ ı sunar. s Biz bu bölümde. aslında bu dosyanın birtakım fonksiyon ve niteliklerden g olu¸an alelade bir Python programı oldu˘ unu göreceksiniz. Bu bölümün en ba¸ında yaptı˘ ımız s g modül tanımını dikkate alacak olursak. os adlı bir modül üzerinden. Peki biz bu os. Bu modülü. os modülünü de aynen öyle içe aktarıp bunun içindeki fonksiyon ve nitelikleri kullanacaksınız.html adresinden eri¸ebilirsiniz. Buna bir örnek verelim.py programını nereden bulabiliriz. os modülü bize. bilgisayarımızda bulunan os. Komut satırında g s s söyle bir kod yazın: ¸ >>> pi_sayisi = 46 Simdi aritmetik adlı modülü su yöntemle içe aktarın: ¸ ¸ >>> from aritmetik import * Bakın bakalım pi_sayisi de˘ i¸keninin de˘ eri ne olmu¸? gs g s >>> print pi_sayisi 3. Windows sistemlerinde g ise bu modülü bulmak için C:/Python26/Lib adlı dizinin içine bakabilirsiniz. aritmetik adlı modülden carp() fonksiyonunu aldı˘ ınızda isim çakı¸ması neg s deniyle hiç istemedi˘ iniz sonuçlarla kar¸ıla¸abilirsiniz.python. bu modülü kullanan programların farklı i¸leg s tim sistemleri üzerinde çalı¸ma sansı daha fazladır. s g ˘ 14. Bunun neden böyle oldu˘ unu biraz sonra s ¸ g daha iyi anlayacaksınız. g s g Python sadece kendi modüllerimizi yazmamıza izin vermez. size geli¸tiricilerin yazdı˘ ı modülleri tanıtmaya s g çalı¸aca˘ ız.1 os Modülü os adlı modül Python’daki en önemli modüllerden biridir. tıpkı kendi yazdı˘ ımız modülleri içe aktarıyormu¸uz gibi aktaraca˘ ız: g s g . aslında os modülü. Kendi yazdı˘ ınız modüller içindeki fonksiyonları.

. içeri˘ i dı¸ında. isterseniz bu modül içinde neler var neler yok söyle bir listeleyelim. biz konumuza dönelim. kullandı˘ ınız i¸letim sisteminin ne oldu˘ u hakkında bilgi verir.. Bunun neden böyle oldu˘ unu biraz sonra açıklayaca˘ ız. Simdi biz bu fonksiyonlar g g ¸ ve niteliklerden önemli olanlarını incelemeye çalı¸alım. Bu nitelik. s g os modülünde i¸letim sistemi isimleri için öntanımlı olarak su ifadeler bulunur: s ¸ GNU/Linux için “posix”. Neyse. ¸ Python komut satırında “>>>” i¸aretinden hemen sonra: s >>> import os komutuyla os modülünü içe aktarıyoruz.. Tabii bu modülün sizin s s yazdı˘ ınız modülden önemli bir farkı.>>> import os Gördü˘ ünüz gibi. komut satırını hangi dizin altında açmı¸ olursanız olun g s os modülünü içe aktarabilmenizdir. Windows için “nt”. s ˘ name Niteligi dir(os) komutuyla os modülünün içeri˘ ini inceledi˘ inizde orada name adlı bir nitelik oldu˘ unu g g g göreceksiniz. “ce” Macintosh için “mac” OS/2 için “os2” Risc Os için “riscos” .. “dos”. os modülü içindeki g g g fonksiyonlardan ve niteliklerden söz edebiliriz. s g g g Mesela ben bu komutu GNU/Linux i¸letim sistemi üzerinde verdi˘ im için ‘posix’ çıktısı aldım. bu modül içinde bir yı˘ ın fonksiyon ve nitelik var. print icerik Gördü˘ ünüz gibi. Öncelikle. O g g g yüzden bunu simdilik dert etmeyin. bu modülü içe aktarmaktır. kullanım olarak kendi yazdı˘ ımız bir modülü nasıl içe aktarıyorsak os g g modülünü de aynen öyle içe aktarıyoruz. ¸ Burada en önemli konu. bu modülle ilgili kodlarımızı çalı¸tırmak istedi˘ imizde Python bize bir hata s g mesajı gösterecektir. Daha sonra su komutu veriyoruz: ¸ >>> dir(os) ˙ Isterseniz daha anla¸ılır bir çıktı elde edebilmek için bu komutu su sekilde de verebilirsiniz: s ¸ ¸ >>> for icerik in dir(os): . Bu modülün içindeki herhangi bir fonksiyonu ya da niteli˘ i kullanabilmek için öncelikle modülü içe aktarmalıyız. Yani bu modülü kullanabilmek için os.name Bu komutu hangi i¸letim sisteminde verdi˘ inize ba˘ lı olarak aldı˘ ınız çıktı da farklı olacaktır. bu modülün sizin yazdı˘ ınız herhangi bir Python programından g s g (ba¸ka bir söyleyi¸le “Python modülünden”) hiç bir farkı yoktur. s Dolayısıyla. g s g Basit bir örnekle ba¸layalım: s >>> print os.py dosyasının bulundu˘ u dizine gitmenize gerek yok. Neticede bu modülü siz de yazmı¸ olabilirdiniz. Bu modülü programımız içine nasıl davet edece˘ imizi ö˘ rendi˘ imize göre. E˘ er bu sekilde modülü g g ¸ “import” etmezsek.

kullanılan i¸letim sistemini sorguladık. os. s s g system() Fonksiyonu Bu fonksiyon.E˘ er mesela siz bu komutu Windows XP üzerinde verdiyseniz ‘nt’ çıktısı almı¸ olmalısınız. üzerinde çalı¸tı˘ ımız i¸letim sisteminin bir parçası s g s olan ve bu i¸letim sistemine ili¸kin i¸lemleri yerine getirmemizi sa˘ layan komutlardır.coding:utf-8 -*from os import name if name == "posix": a = raw_input("Linus Torvalds’a mesajınızı yazın:") if name == "nt": a = raw_input("Bill Gates’e mesajınızı yazın:") Dikkat ederseniz burada from os import name komutuyla..system("ls") veya: . kullanıcıs g g s dan “Linus Torvalds’a mesajını yazması” istenecektir. “Bill Gates’e mesaj yazılması istenecektir. g s Ö˘ rendi˘ imiz bu bilgiyi kullanarak söyle basit bir sey yazabiliriz: g g ¸ ¸ #!/usr/bin/env python # -*.name == "nt": a = raw_input("Bill Gates’e mesajınızı yazın:") Bu basit örnekte öncelikle os adlı modülü bütün içeri˘ iyle birlikte programımıza aktardık. Örne˘ in s s s g g GNU/Linux’ta ls bir sistem komutudur ve bu komutun görevi o anda içinde bulundu˘ unuz g dizindeki dosya ve klasörleri listelemektir. e˘ er kullanılan i¸letim sistemi GNU/Linux ise.name yapısını kullanırsak Python bize “os” isminin g tanımlanmadı˘ ını söyleyecektir. s s kullanılan i¸letim sistemine göre i¸lem yapmasını sa˘ layabilirsiniz. s g g aslında os modülünü çekmedi˘ imiz için. os modülü içindeki name niteli˘ ini g aldık yalnızca.name ifadesini de name sekline g ¸ dönü¸türdük. g s Buna göre bu program çalı¸tırıldı˘ ında. E˘ er yazdı˘ ınız bir prog ¸ g g g gramda name niteli˘ ini kullanarak i¸letim sistemi sorgulaması yaparsanız. g Bu name niteli˘ inin ne kadar faydalı bir sey oldu˘ unu tahmin edersiniz.coding: utf-8 -*import os if os. Aynı komutları su sekilde de yazabiliriz: ¸ ¸ #!/usr/bin/env python #-*. yazdı˘ ınız programın g s g birden fazla i¸letim sistemi üzerinde çalı¸ma imkânı olacaktır. Ayrıca program içinde kullandı˘ ımız os. Örne˘ in: g g g >>> os. Bu komutun Windows’taki kar¸ılı˘ ı ise dir komus g tudur. Çünkü from os import name komutuyla yalnızca name niteli˘ ini çekti˘ imiz. ˙ste buna benzer sistem komutlarını Python yardımıyla çalı¸tırabilmek için os modülünün bize I¸ s sundu˘ u system() adlı fonksiyondan yararlanaca˘ ız. Çünkü bu sayede programınızın.name == "posix": a = raw_input("Linus Torvalds’a mesajınızı yazın:") if os. Daha g sonra bu modül içindeki name niteli˘ inden yararlanarak. Peki g s s g “sistem komutu” ne demek? Sistem komutu.. E˘ er kullanılan i¸letim sistemi Windows g s ise. kullandı˘ ımız i¸letim sistemine ait sistem komutlarını çalı¸tırmamızı sa˘ lar.

..txt") Burada kullandı˘ ımız xdg-open komutu bütün GNU/Linux sistemlerinde çalı¸an bir sistem kog s mutudur. xdg-open komutu bu g noktada size yardımcı olacaktır.system("kwrite dosyaadı. Bu komutun görevi herhangi bir dosya veya klasörü sistemdeki varsayılan uygulamayla açmaktır. Bunu söyle kullanabiliriz: ¸ >>> os. E˘ er metin dosyalarını açan öntanımlı program ba¸ka bir g s seyse (mesela Gedit). diye endi¸e etmenize gerek kalmaz... Çünkü GNU/Linux sistemlerinde dizin görüntüleyici uygulas s manın hangisi oldu˘ unu kestirmek çok güçtür.coding: cp1254 -*import os dosya = "falancadosya" os. Bu fonksiyon yalnızca Windows’ta geçerlidir ve GNU/Linux’taki xdg-open komutunun yaptı˘ ı seye benzer bir i¸levi vardır.system("xdg-open dosyaadı. Thunar ve benzg eri dizin görüntüleyicilerden hangisinin bulundu˘ una emin olamazsınız.coding: utf-8 -*- . Dolphin. xdg-open komutu özellikle bir dizini ¸ açtırmaya çalı¸ırken çok i¸e yarar.system("dir") Gördü˘ ünüz gibi. Örne˘ in: g # -*. xdg-open komutu. g ¸ s Yukarıdaki bilgileri kullanarak örne˘ in su basit programı yazabiliriz: g ¸ #!/usr/bin/env python # -*.>>> os. çalı¸tırılmasını istedi˘ imiz sistem komutunu belirtmek. GNU/Linux’taki xdg-open yerine os modülünün startfile() adlı fonksiyg onundan yararlanabilirsiniz.system("notepad dosyaadı.txt") Ancak bir dosyayı açtırırken. s g Bir örnek daha verelim. o dosyayı açacak programı do˘ rudan belirtmek pek do˘ ru bir yol g g de˘ ildir. Bu yüzden Python’da herhangi bir dosya veya klasörü açtırmak için en güvenilir yol xdg-open adlı sistem komutundan yararlanmak olacaktır. Çünkü mesela Kwrite her GNU/Linux kullanıcısının bilgisayarında kurulu olmayabilir. Yapmamız gereken tek sey parang ¸ tez içinde. Yani mesela bir sistemde metin dosyalarını açan öntanımlı program Kwrite ise dosya Kwrite ile açılacaktır. Windows’ta da bir i¸lemi yapacak uygulamayı do˘ rudan belirtg s g mek iyi bir fikir de˘ ildir.startfile(dosya) startfile() fonksiyonu GNU/Linux’ta bulunmaz.txt") Tıpkı GNU/Linux’ta oldu˘ u gibi. Sistemde Konqueror. acaba kullanıcının bilgisayarında hangi dizin görüntüleyici uygulama kurulu. Yukarıda Kwrite ile yaptı˘ ımız i¸lemi bir de Windows’ta Notepad programıyla yapalım: g s >>> os. sistemde hangi görüntüleyici varsa s /usr/share dizinini onunla açacaktır.system("xdg-open /usr/share") Böylece. dosya o programla açılacaktır. Diyelim ki GNU/Linux’taki Kwrite programını kullanarak bir dosya açmak istiyoruz: >>> os. g Kwrite yerine mesela Gedit olabilir. system() komutunu kullanmak çok basit. Örne˘ in /usr/share dizinini görüntülemek için söyle bir kod g ¸ yazabilirsiniz: >>> os.

com sitesini görüntüledik.system("xdg-open %s" %dosya)) Dedi˘ imiz gibi. g kullanıcıya falanca.. bize os modülüyle g ilgili çok önemli bilgiler veriyor. 4. system() fonksiyonundan yardım alabilece˘ imizi biliyoruz.name == "nt":) os modülünün g s startfile() adlı fonksiyonunu kullanarak dosyayı açıyoruz (os.name == "nt": os. system() fonksiyonu her türlü sistem komutunu çalı¸tırmanıza izin verir. listdir() Fonksiyonu Python yardımıyla bir dizin içindeki dosyaları görüntülemek istersek." %dosya if os.txt” adlı bir dosya tanımladık.system("xdg-open %s" %dosya) Bu program oldukça küçük bir kod parçasından ibaret olmasına ra˘ men. Artık siz bu satırların ne oldu˘ unu Ilk s g g adınız gibi biliyorsunuz. 2.system("start iexplore. Sonraki satırda “falanca. g 3.istihza..startfile(dosya) elif os. Mesela g s Windows’ta Python yardımıyla Program Files dizinini görüntüleyelim: >>> os. ˙ iki satırın ne i¸ yaptı˘ ını söylememize gerek yok..txt 5.import os dosya = "falanca.com") Burada da Windows’un start adlı sistem komutunu kullanarak IE ile istihza.system("ls") Windows kullanıcıları ise sunu: ¸ .name == "posix": os.startfile(dosya)) 6. bilgisags yarınızda bulunan herhangi bir dosyanın adını yazabilirsiniz.exe http://www. Üçüncü satır da artık bizim için oldukça tanıdık bir koddan olu¸uyor. Bu de˘ i¸kenin yerine. print "%s adlı dosya açılıyor. E˘ er kullanıcının i¸letim sistemi GNU/Linux ise (if os. E˘ er kullanıcının i¸letim sistemi Windows XP ise (if os.. Bu komutla os mods ülünü bütün içeri˘ iyle birlikte programımızın içine aktarıyoruz. Gelin isterseniz yukarıdaki kod parçasının ne i¸ler çevirdi˘ ini s g adım adım inceleyelim: 1.txt" print "%s adlı dosya açılıyor. g s g Aynı sekilde.name == "posix":) os modg s ülünün system() adlı fonksiyonunu kullanarak dosyayı açıyoruz (os. Bunun için GNU/Linux kullanıcıları sunu yazabilir: g ¸ >>> os." %dosya satırıyla dosyasının açılmak üzere oldu˘ una dair bilgi veriyoruz. Internet Explorer programı ile bir web sitesini açmak için de system() fonksiy¸ onundan yararlanabilirsiniz: >>> os.system("explorer C:\\Program Files") Burada kullandı˘ ımız bölü i¸aretinin iki adet ters bölü (\\) oldu˘ una dikkat ediyoruz.

Ardından kullanım kolaylı˘ ı açısından listdir() fonksiyonunu a adlı bir de˘ i¸kene g gs atadık. elimizde olan sey. 1): print numara. g g ¸ ö˘ eleri yan yana dizilmi¸ bir liste. kodlarımızı su biçime sokabiliriz: g ¸ g s ¸ import os a = os. Burada parantez içinde tırnak i¸aretlerini ve s yatık çizgileri nasıl kullandı˘ ımıza dikkat edin.listdir("/usr/bin") for numara.system("dir") Ancak bu i¸lemi Python’da çok daha kolay ve esnek bir biçimde yapmanın bir yolu daha var. modülümüzü import os komutuyla programımıza aktardık ilk önce. o anda içinde bulundu˘ unuz dizindeki dosyaları listelemekse listdir() fonksiyg g onunu su sekilde kullanabilirsiniz: ¸ ¸ >>> os.listdir("/usr/bin") c = 0 for dosyalar in a: if c < len(a): c = c+1 print c. Örne˘ imizde /usr/bin g g dizini altındaki dosya ve klasörleri listeliyoruz.listdir("/usr/bin") >>> print a Yukarıdaki örnekte her zamanki gibi.>>> os.listdir("/usr/bin") for dosyalar in a: print dosyalar E˘ er dosyalarımıza numara da vermek istersek söyle bir sey yazabiliriz: g ¸ ¸ import os a = os. dosya E˘ er amacınız. Örnekte listdir() fonksiyonunun nasıl kullanıldı˘ ını görüyorsunuz. s os modülü içinde yer alan listdir() adlı fonksiyon bize bir dizin içindeki dosyaları veya klasörleri listeleme imkânı veriyor. Mesela /usr/bin dizini içindeki bütün dosyaları listelemek için söyle ¸ bir sey yazabiliriz: ¸ >>> import os >>> a = os. Çıktının tipinden anladı˘ ımız gibi. En son da print a komutuyla /usr/bin dizininin g içeri˘ ini liste olarak ekrana yazdırıyoruz.” argümanı.") Buradaki ”. dosyalar Hatta daha önce ö˘ rendi˘ imiz enumerate() fonksiyonunu kullanarak bu i¸lemi çok daha kısa g g s bir yoldan halledebilirsiniz: import os a = os. o anda içinde bulunulan dizini temsil eder. E˘ er biz dizin içeri˘ inin böyle yan yana de˘ il de alt alta g s g g g dizildi˘ inde daha sık görünece˘ ini dü¸ünüyorsak.listdir(". E˘ er bir üst dizinin içeri˘ ini g g listelemek isterseniz tek nokta yerine iki nokta i¸aretini kullanabilirsiniz: s . dosya in enumerate(a.

E˘ er böyle bir kaygımız olmasaydı. “e˘ er mevcut_dizin /home/istihza/Desktop ise bu dizin içindeki dosyaları bize listele g ve sonucu ekrana yazdır.. gs gs g Ardından. Yani kabaca “mevcut çalı¸ma dizini”.name == "nt": for i in os.. ˙ Isterseniz bu fonksiyonun tam olarak ne i¸e yaradı˘ ını bir örnek üzerinde görelim: s g >>> os..listdir("C:\\Program Files"): os.getcwd() if mevcut_dizin == "/home/istihza/Desktop": for i in os. bir dizin içing g deki bütün dosyaları açan ve bu sebeple bilgisayarınızın bir süre yanıt vermemesine bile yol açabilecek korkunç bir program yazabilirsiniz! (Denemeyin!) #!/usr/bin/env python # -*. getcwd() Fonksiyonu os modülü içinde yer alan bu fonksiyon bize o anda hangi dizin içinde bulundu˘ umuza dair g bilgi verir.coding: utf-8 -*import os mevcut_dizin = os.listdir(".getcwd() Gördü˘ ünüz gibi bu komut bize o anda hangi dizin içinde bulundu˘ umuzu söylüyor.") Bu komut o anda içinde bulundu˘ unuz dizine göre bir üst dizinin içeri˘ ini ekrana liste olarak g g verecektir.system("xdg-open %s%s" %("/usr/bin/".listdir("/usr/bin"): os. i)) elif os. Burada g dikkat ederseniz if deyiminden sonra for döngüsünü kullandık. g . yok e˘ er mevcut_dizin /home/istihza/Desktop de˘ il ise. Söyle bir örnek vererek konuyu biraz açalım: ¸ #!/usr/bin/env python # -*.name == "posix": for i in os. Bu i¸lemi.’ cümlesini göster” dedik. Bu arada g g ˙ Ingilizce bilenler için söyleyelim.startfile("%s%s" %("C:\\Program Files\\".coding: utf-8 -*if os... ‘bu program g g yalnızca /home/istihza/Desktop dizininin içeri˘ ini gösterebilir.listdir(mevcut_dizin): print i else: print ("Bu program yalnızca /home/istihza/Desktop " "dizininin içeri˘ini gösterebilir!") g Yukarıdaki örnekte öncelikle os modülünü içe aktardık. g Bu fonksiyonu ve daha önce ö˘ rendi˘ imiz system() fonksiyonunu kullanarak. Daha sonra mevcut_dizin adında bir de˘ i¸ken tanımlayıp getcwd() fonksiyonunun kendisini bu de˘ i¸kenin de˘ eri olarak atadık. i)) Sırada yine önemli bir fonksiyon var. ekran çıktısı daha s düzgün olsun diye yaptık. Yani mesela o anda /usr/local/bin dizini içindeyseniz yukarıdaki komut /usr/local dizininin içeri˘ ini listeleyecektir. Daha açık ifade etmek gerekirse: “O anda içinde bulundu˘ us g muz dizin”.>>> os. buradaki “cwd”nin açılımı “current working directory”.

Tıpkı ”.if mevcut_dizin == "/home/istihza/Desktop": satırının hemen altına: print mevcut_dizin yazıp i¸i bitirirdik.pardir) >>> print os.chdir("/var/tmp") Böylece do˘ rudan /var/tmp dizinine ula¸mı¸ olduk. ama eminim siz yaratıcılı˘ ınızla çok g daha farklı ve kullanı¸lı kodlar yazabilirsiniz. Buradaki pardir niteli˘ i.listdir(os...getwd() ’/var/tmp’ mkdir() ve makedirs() Fonksiyonları Bu iki fonksiyon yardımıyla dizin veya dizinler olu¸turaca˘ ız. yani /usr/share/ dizinine geçmek istiyg orsak. ˙ste pardir de s I¸ bu i¸aretin yaptı˘ ı i¸i yapar. bir de curdir niteli˘ i vardır.chdir(os.” i¸aretinden yararlanıyorduk. ˙ s g s g Ingilizce “parent directory” (bir üst dizin) ifadesinin kısaltması oluyor. E˘ er bu g g g fonksiyonun verdi˘ i çıktı.: s s g >>> import os >>> os. istersek g g s gitmek istedi˘ imiz dizini kendimiz elle de belirtebiliriz: g >>> import os >>> os.” i¸aretinde oldu˘ u gibi. pardir niteli˘ i dı¸ında.getcwd() Hatırlarsanız bir üst dizini temsil etmek için ”. Mesela kendi yazdı˘ ınız bir modülü içe aktarmak s g istedi˘ inizde neden hata verdi˘ ini anlamak için bu fonksiyondan yararlanabilirsiniz. içe aktarmaya çalı¸tı˘ ınız modülün bulundu˘ u dizinden farklıysa o g s g g modülü bo¸una içe aktarmaya çalı¸ıyorsunuz demektir! s s Simdi de os modülü içindeki ba¸ka bir fonksiyona de˘ inelim. Yukarıdaki komutun ardından su komutu g s s ¸ verirseniz bu durumu teyit edebilirsiniz: >>> os. Bu sabiti g s g kullanarak “mevcut dizin” üzerinde i¸lemler yapabiliriz. s Biz burada getcwd() fonksiyonu için basit örnekler verdik. E˘ er bir üst dizine. ¸ s g chdir() Fonksiyonu Bu fonksiyon yardımıyla içinde bulundu˘ umuz dizini de˘ i¸tirebiliriz. Diyelim ki o anda g gs /usr/share/apps dizini içindeyiz.curdir) Gördü˘ ünüz gibi bu curdir niteli˘ i getcwd() fonksiyonuna benziyor. Bunun dı¸ında. Mesela: s g .. su komutu verebiliriz: ¸ >>> import os >>> os.

mkdir("test") Bundan ba¸ka.>>> import os >>> os. Hemen deneyelim yine: >>> import os >>> os. s s Hemen deneyelim: >>> import os >>> os. onun altında da “Python” adlı yeni ba¸ka bir dizin daha olu¸turmak istiyoruz. /home/kullanıcı_adımız/ dizini altında yeni bir “Programlar” dizini ve onun g altında da yeni bir “Python” dizini olu¸tu. demek ki mkdir() fonksiyonu s bize yalnızca bir adet dizin olu¸turma izni veriyor. s Yani mesela /home/kullanıcı_adınız dizini altında yeni bir “Programlar” dizini. de˘ il mi? ¸ g >>> os. ˙ste bu amaç için elimizde makedirs() fonksiy¸ s I¸ onu var. E˘ er biz birden fazla.makedirs("/home/istihza/Programlar/Python") Gördü˘ ünüz gibi.mkdir("/test") Bu kod / dizini altında “test” adlı bo¸ bir klasör olu¸turacaktır. Buradan çıkan sonuç. e˘ er isterseniz mevcut bir dizin yapısı içinde ba¸ka bir dizin de olu¸turas g s s bilirsiniz.mkdir("/home/istihza/Programlar/Python") Traceback (most recent call last): File "<stdin>".getcwd() >>> os.mkdir("/home/istihza/deneme") Peki diyelim ki iç içe birkaç tane yeni klasör olu¸turmak istiyoruz. E˘ er bu kodu su sekilde yazarsak.mkdir("/home/istihza/Programlar/Python") Ne oldu? Söyle bir hata çıktısı elde ettik. yani çoklu yeni dizin s g olu¸turmak istiyorsak makedirs() fonksiyonunu kullanmamız gerekiyor. Yani mesela /home/kullanıcı_adınız/ dizini içinde “deneme” adlı bo¸ bir dizin olu¸s s turabilirsiniz: >>> import os >>> os.mkdir("test") Yani. line 1. in <module> OSError: [Errno 2] No such file or directory: ’/home/istihza/Programlar/Python’ Demek ki bu sekilde çoklu dizin olu¸turamıyoruz. mesela mevcut çalı¸ma dizini masaüstü ise bu “test” adlı dizin masaüstünde olu¸acaks s tır. s s g ¸ ¸ mevcut çalı¸ma dizini içinde yeni bir dizin olu¸acaktır: s s >>> import os >>> os. s . ˙ Isterseniz bu kodları su sekle getirerek yeni olu¸turulan dizinin nerede oldu˘ unu da göre¸ ¸ s g bilirsiniz: >>> import os >>> print os.

makedirs("test1/test3") .makedirs("test1/test2") >>> os. “test2” ve g s “test3” adlı dizinler olu¸turdu.rmdir("/home/istihza/TEST") Bu kod ise /home/kullanıcı_adı dizini altındaki bo¸ “TEST” dizinini silecektir. s Tıpkı mkdir() ve makedirs() fonksiyonlarında oldu˘ u gibi. bu bo¸ s g s s dizinler kök dizini altında olu¸acaktır. neyi sildi˘ inizg g den emin de˘ ilseniz bu fonksiyonları kullanmayın! Çünkü Python bu komutu verdi˘ inizde tek g g bir soru bile sormadan silecektir belirtti˘ iniz dizini. Ne yaptı˘ ınızdan.getcwd() >>> os. Peki. Yalnız. ama yine de uyaralım. g Python’da dizinleri nasıl yönetece˘ imizi. “test1”. Bir de su örne˘ e bakın: ¸ g >>> import os >>> os. iç içe birden fazla bo¸ dizini silmek g s istedi˘ imizde ise removedirs() fonksiyonundan yararlanıyoruz: g >>> import os >>> os. E˘ er “test” ifadesinin soluna “/” i¸aretini eklerseniz. nasıl dizin olu¸turup silece˘ imizi basitçe gördük. burada hemen bir uyarı g yapalım: Bu fonksiyonları çok dikkatli kullanmamız gerekiyor. onun altında da ba¸ka bir dizini nasıl olu¸turaca˘ ımızı çalı¸tık. Diyelim ki mevcut çalı¸ma dizinimiz olan masaüstünde “TEST” adlı s bo¸ bir dizin var ve biz bu dizini silmek istiyoruz: s >>> import os >>> os. Simdiye kadar hep bir dizin. Hemen bir örnek verelim.Küçük bir örnek daha verip bu bahsi kapatalım: >>> import os >>> print os. bu komutlar yalnızca içi bo¸ dizinleri g s silecektir. s s s g s aynı dizin altında birden fazla dizin olu¸turmak istersek ne yapaca˘ ız? Bu i¸lemi çok kolay bir s g s sekilde söyle yapabiliriz: ¸ ¸ >>> import os >>> os. g s g Simdi de bu “dizinleri yönetme” i¸ini biraz irdeleyelim.makedirs("test/test1/test2/test3") Tahmin etti˘ iniz gibi bu kod mevcut çalı¸ma dizini altında iç içe “test”. s rmdir() ve removedirs() fonksiyonları Bu fonksiyonlar bize mevcut dizinleri silme olana˘ ı tanıyor...rmdir("TEST") Böylece “TEST” dizini silindi. Gerçi.. onun ¸ s ¸ altında ba¸ka bir dizin.removedirs("test1/test2") Yine hatırlatmakta fayda var: Neyi sildi˘ inize mutlaka dikkat edin..

neden böyle oldu ve bu hata ne anlama geliyor? Kod yazarken bazı durumlarda “/” i¸areti programcıları sıkıntıya sokabilir.makedirs(test1/test2) >>> os. bu “test1”.makedirs() fonksiyonunu da gördü˘ ü için ne yapmaya çalı¸tı˘ ımızı anlayamadı ve kafası g s g karı¸tı. Çünkü her i¸letim sisteminin dizin ayracı birbiriyle aynı de˘ il. i¸letim sistemlerinin dizin ayraçları hakkında bize bilgi veriyor.. s ˘ sep niteligi Bu nitelik. in <module> TypeError: unsupported operand type(s) for /: ’str’ and ’str’ Peki.sep ’\\’ Peki bu sep niteli˘ i ne i¸e yarar? Yazdı˘ ımız kodlarda do˘ rudan dizin ayracı vermek yerine g s g g bu niteli˘ i kullanırsak. programımızı farklı i¸letim sistemlerinde çalı¸tırırken. Ayrıca kullandı˘ ımız s g os. Söyle bir sey deneyelim: g gs g ¸ ¸ >>> import os >>> test1 = "Belgelerim" >>> test2 = "Hesaplamalar" >>> test3 = "Resimler" >>> os.makedirs(test1/test3) Traceback (most recent call last): File "<stdin>".. bu meseleyi nasıl halledece˘ iz? s g Bu meseleyi halletmek için kullanmamız gereken ba¸ka bir nitelik var Python’da. Peki.sep ’/’ Bu komutu GNU/Linux’ta verdi˘ imiz için komutun çıktısı “/” seklinde oldu. sistemin kendine g s s özgü dizin ayracının kullanılmasını sa˘ lamı¸ oluruz. line 1.Bu kodlar mevcut çalı¸ma dizini altında “test1” adlı bir dizin ile bunun altında “test2” ve “test3” s adlı ba¸ka iki adet dizin daha olu¸turacaktır. Bunu su örnekle s g ¸ gösterebiliriz: Hemen bir Python komut satırı açıp su komutları verelim: ¸ >>> import os >>> os. E˘ er yazdı˘ ımız bir s g g programın farklı i¸letim sistemleri üzerinde çalı¸masını istiyorsak bu fonksiyon epey i¸imize s s s yarayacaktır. Yani mesela: g s . E˘ er aynı komutu g ¸ g Windows’ta verirsek sonuç söyle olacaktır: ¸ >>> import os >>> os.makedirs(test1/test3) Bu kodları çalı¸tırdı˘ ımızda Python bize söyle bir sey söyler: s g ¸ ¸ >>> os. Çünkü bu i¸aret s s Python’da hem “bölme” i¸leci hem de “dizin ayracı” olarak kullanılıyor. Biraz önce yazdı˘ ımız s g kodda Python bu i¸areti “dizin ayracı” olarak de˘ il “bölme i¸leci” olarak algıladı ve sanki s g s “test1” ifadesini “test2” ifadesine bölmek istiyormu¸uz gibi davrandı bize. Peki. “test2” ve “test3” ifadelerinin s s sabit de˘ il de de˘ i¸ken olmasını istersek ne yapaca˘ ız.

Yukarıdaki kod ¸ g sayesinde do˘ rudan “/” i¸aretine bula¸madan. Söyle ki: ¸ >>> import os >>> test1 = "Belgelerim" >>> test2 = "Hesaplamalar" >>> test3 = "Resimler" >>> os.makedirs(test1) >>> os. s g Bu sep niteli˘ i ayrıca dizin adlarını “de˘ i¸ken” yapmak istedi˘ imizde de bize yardımcı olacaktır. Tabii gs g e˘ er istersek raw_input() fonksiyonuyla dizin adlarını kullanıcıya seçtirebilece˘ imiz gibi. Çünkü Python burada “/” s g s i¸aretini bölme i¸leci olarak algılamı¸tı. g gs g Hatırlarsanız yukarıda söyle bir kod yazmı¸tık: ¸ s >>> import os >>> test1 = "Belgelerim" >>> test2 = "Hesaplamalar" >>> test3 = "Resimler" >>> os. “test2” ve “test3” de˘ i¸kenlerinin adlarını do˘ rudan kod içinde verdik. Yukarıda “test1”.makedirs("test" + os. Çünkü burada sep niteli˘ i.makedirs(test1/test2) >>> os.makedirs(os. test2])) >>> os.sep. ilgili i¸letim sistemi hangisiyse ona ait s g s olan dizin ayracının otomatik olarak yerle¸tirilmesini sa˘ layacaktır.sep.makedirs(os. ˙ste bu hatayı almamak için sep niteli˘ inden faydalans s s I¸ g abiliriz.>>> import os >>> os. >>> import os >>> os. ba¸ımızı derde sokmadan i¸imizi halledebiliyg s s s s oruz.join([test1.makedirs("test/test2") komutu yerine. (join() g fonksiyonunu birkaç ders sonra daha ayrıntılı bir sekilde inceleyece˘ iz). söyle g g ¸ bir sey de yapabiliriz: ¸ . burada sep niteli˘ ini join() adlı bir fonksiyon ile birlikte kullandık.sep + "test2") komutunu kullanırsak programımızı farklı i¸letim sistemlerinde çalı¸tırırken herhangi bir aksaks s lık olmasını önlemi¸ oluruz.makedirs(test1/test3) Yine hatırlarsanız bu kodu çalı¸tırdı˘ ımızda Python hata vermi¸ti. Ayrıca burada parantez ve kö¸eli parantezlerin nasıl kullanıldı˘ ına da dikkat etmemiz s g gerekiyor.join([test1. test3])) Dikkat ederseniz.

"Videolar". yazdı˘ ımız programların “ta¸ınabilirli˘ i” (portability). Simdi Python komut satırını açalım ve su komutları verelim: s ¸ ¸ >>> import deneme >>> deneme.import os def dizinler(test1. yani “farklı i¸letim sistemg g s g s leri üzerinde çalı¸abilme kabiliyeti” açısından ne kadar önemli olabilece˘ ini gösteriyor.dizinler("Belgelerim". Daha sonra g deneme.sep. yazarlarının internet sitelerinden indirip bilgisayarınıza s kurabilir. bu komutların çıktısı söyle olur: s g ¸ ’Dizin1/Dizin2’ Aynı kodları Windows üzerinde verirsek de su çıktıyı alırız: ¸ ’Dizin1\\Dizin2’ Gördü˘ ünüz gibi farklı platformlar üzerinde. Bu os. Ardından os.makedirs(os. Böylelikle kendimize bir ¸ modül yapmı¸ olduk.sep. bu modülleri de herhangi bir Python modülü gibi kullanabilirsiniz. s g ˘ 14. test2])) os. "Dizin2"]) ENTER tu¸una bastı˘ ımızda.join() komutları yardımıyla. Alttaki satırda ise gs g g os. Simdi Python komut satırını açarak su kodları yazalım: ¸ ¸ >>> import os >>> os.join([test1.sep. g sep niteli˘ inin. Hemen alttaki s g s s g satırda da benzer bir i¸lem yapıp kodlarımızı bitiriyoruz. Dolayısıyla bu modülleri.sep.makedirs(os. Böylece bir fonksiyon tanımlamı¸ s s olduk. test3])) Dikkat ederseniz.py adıyla masaüstüne kaydedelim. Piyasada pek çok üçüncü sahıs modülü bulunur. Tabii s bu “test1” bir de˘ i¸ken oldu˘ u için adını daha sonradan biz belirleyece˘ iz. Burada os.join() ifadesi ile ilgili son bir sey daha söyleyip bu konuya bir nokta s ¸ koyalım. çok zor bazı i¸leri çok kolay bir sekilde ¸ s ¸ . “test2” ve “test3” adlı de˘ i¸kenler belirliys gs oruz.join([test1. Daha sonra dizinler() adlı bir g fonksiyon olu¸turup parametre olarak “test1”.makedirs() ve os. Böylelikle g masaüstünde “Belgelerim” adlı bir klasörün içinde “Videolar” ve “Resimler” adlı iki klasör olu¸s turmu¸ olduk. os.sep. burada öncelikle os modülünü ça˘ ırıyoruz.6 Üçüncü Sahısların Yazdıgı Modüller ¸ Buraya kadar kendi yazdı˘ ımız modülleri ve geli¸tiriciler tarafından yazılıp dilin içine enteg s gre edilen modülleri ayrı ayrı gördük. test2. bir önceki satırda olu¸turdu˘ umuz s g “test1” adlı dizinin içinde “test2” adlı bir dizin daha olu¸turuyoruz. Bu modüller.join(["Dizin1".sep. Bu örnek. test3): os. Simdi bu dosyayı deneme.makedirs(test1) os. yazarları tarafından genellikle internet üzerinden eri¸ime s sunulmu¸tur.join() s fonksiyonu “/” i¸aretiyle u˘ ra¸madan dizinleri birle¸tirme imkânı sa˘ lıyor bize. "Resimler") Burada öncelikle import deneme satırıyla deneme adlı modülümüzü ça˘ ırdık.makedirs(test1) komutuyla “test1” adlı bir dizin olu¸turuyoruz. Bunların dı¸ında bir de üçüncü sahıslar tarafından s ¸ yazılan modüller vardır.sep çıktısı birbirinden farklı oluyor. Bu modüller sayesinde.dizinler satırıyla bu modül içindeki dizinler() adlı fonksiyonu ça˘ ırdık.

E˘ er Ubuntu kullanıyorsanız.py install E˘ er herhangi bir aksilik olmadıysa pyPdf modülü bu komutun ardından sistemimize kurulag caktır.net/pyPdf/ adresinden ula¸abilirsiniz. in <module> ImportError: No module named pyPdf Gördü˘ ünüz gibi. bunu kullanabilmek için öncelikle bu ¸ g modülü bilgisayarımıza kurmamız gerekiyor. Mathieu Fenniak tarafından yazılmı¸ olan bu üçüncü s g s sahıs modülünün anasayfasına http://pybrary. g g pyPdf modülünü su komut yardımıyla sisteminize kurabilirsiniz: ¸ sudo apt-get install python-pypdf E˘ er Ubuntu dı¸ında bir GNU/Linux da˘ ıtımı kullanıyorsanız.net/pyPdf/ Gelin isterseniz biraz önce içe aktarırken hata aldı˘ ımız komutu tekrar vererek pyPdf modülünü g do˘ ru bir sekilde kurup kuramadı˘ ımızı denetleyelim: g ¸ g >>> import pyPdf Bu komutu verdi˘ inizde söyle bir uyarı mesajı almı¸ olabilirsiniz: g ¸ s .gz dosyasını indirerek kaynaktan kurulum yapmayı tercih edebilirler: http://pybrary. g 14. paket yöneticiniz yardımıyla g s g “pypdf” seklinde bir arama yapmanızı öneririm. Python’da üçüncü sahıs modüllerinin neye benzedi˘ i ve bung ¸ g ların nasıl kullanılaca˘ ı hakkında yalnızca bir fikir vermekten ibarettir. g Bu modül GNU/Linux da˘ ıtımlarının paket depolarında bulunur. ¸ Kullandıkları da˘ ıtımın paket depolarında pyPdf modülünü bulamayan arkada¸larım su g s ¸ adresten ilgili tar. ¸ s pyPdf modülü bir üçüncü sahıs modülü oldu˘ undan. s g Ancak bu noktada küçük bir uyarı yapalım. A¸a˘ ıda inceleyece˘ imiz PyPdf modülünü ans g g latırken. Zira bütün o ayrıntıları sonraki derslerimizde inceleyece˘ iz.exe dosyasını indirip çift tıklayarak modülü bilgisa¸ yarlarına kurabilir: http://pybrary. E˘ er bu modülü kurmazsak elbette kullanmamız g mümkün olmaz.1 pyPdf Modülü Bu bölümde inceleyece˘ imiz örnek modülün adı pyPdf.net/pyPdf/ Bu sıkı¸tırılmı¸ dosyayı bilgisayarımıza indirdikten sonra dosyayı açıp. bilgisayarımızda pyPdf modülü olmadı˘ ı için import pyPdf komutu hata g g veriyor. Python’da pdf dosyaları ile g ilgili temel i¸lemleri yapmamızı sa˘ lıyor. Anlayamadı˘ ınız noktalar g g ¸ s s g olursa bunlara çok fazla takılmayın. line 1. Bizim burada amacımız. Biz bu bölümde pyPdf adlı bir örnek modül üzerinden.halledebiliriz. henüz ö˘ renmedi˘ imiz bazı seylerle de kar¸ıla¸acaksınız.6. üçüncü sahıs modüllerini ¸ tanımaya çalı¸aca˘ ız. O yüzden öncelikle bu modülü bilgisayarımıza kuraca˘ ız. orada su komutu veriys s ¸ oruz: sudo python setup. Bu modül. Gelin bir deneme yapalım: >>> import pyPdf Traceback (most recent call last): File "<stdin>". Windows kullanıcıları ise su adresten .

Bu bilgiler neler olabilir? Mesela belgenin ba¸lı˘ ı. Ama bunları çok fazla dert edinmeyin. Yukarıdaki uyarı mesajı modülümüzün çalı¸s masını engellemez. Siz elbette ba¸ka bir s dosya ile çalı¸abilirsiniz. Python’un s 3. pyPdf modülünün tamamına g g de˘ il de. Bu modül Python’un 2. Birkaç örnek verelim.x sürümünde kullanımdan kaldırılacak özelliklere ili¸kindir.. Ancak bu uyarılara ra˘ men bu s g modül Python 2. g ˙ Isterseniz yazdı˘ ımız kodları topluca görelim: g . bu konuyu anlatırken henüz yabancısı oldu˘ umuz kavramlarla g g kar¸ıla¸ıyoruz.title)) Burada. Biz incelememize devam edelim.pdf adlı bir pdf dosyası seçtim.getDocumentInfo().x sürümlerine uyumlu hale getirilmesi için çalı¸malar da sürdürülmektedir.. s Yukarıda tanımladı˘ ımız belge adlı pdf dosyasını okumak üzere açıyoruz: g kaynak = PdfFileReader(open(belge. pyPdf modülünün Python3. s s “u” harfini kullanarak karakter dizimizi “unicode” haline getiriyoruz. PdfFileReader import komutunu nasıl verdi˘ imize dikkat edin. pdf dosyaları ikili (binary) g düzende oldukları için.. ancak program çıktısında bazı uyarılar alıyoruz. belge adlı pdf dosyamızın ba¸lı˘ ını alalım: s g print (u"%s adlı dosyanın ba¸lı˘ı ¸udur: %s" s g s %(belge.6 g sürümünde de çalı¸ıyor.pdf" Ben örnek olarak kendime diveintopython.6 sürümünde de kullanılabilir. Türkçe karakterlerin düzgün görüntülenememesi gibi bir sorunla kar¸ıla¸mamak için. belgenin hangi s g yazılım ile olu¸turuldu˘ u. g g s s Simdi de pyPdf modülü içinde bulunan getDocumentInfo() fonksiyonunun title adlı niteli˘ ini ¸ g kullanarak. Bu uyarılar.. bunun içindeki sadece iki fonksiyona ihtiyaç duydu˘ umuz için yalnızca o iki fonksiyg g onu içe aktarıyoruz... "rb")) Burada belge adlı pdf dosyasını “rb” kipinde açtı˘ ımıza dikkat edin. “unicode” kavramından birkaç ders sonra daha ayrıntılı olarak bahsedece˘ iz. Siz simdilik sadece üçüncü sahıs modüls s ¸ ¸ lerin neye benzedi˘ i üzerine yo˘ unla¸maya çalı¸ın. s Bu arada pyPdf modülünü içe aktarırken büyük-küçük harfe dikkat etmelisiniz. vb. Daha önce de dedi˘ imiz gibi. g s pdf Bilgilerine Ula¸ mak s Ba¸ta da söyledi˘ imiz gibi pyPdf modülünü kullanarak pdf belgelerine ait bazı bilgileri toplayas g bilirsiniz. bunları okurken “rb” kipini kullanmamız gerekir.5’tir. pyPdf modülünü kurdu˘ umuza göre artık bu modülü incelemeye ba¸layabiliriz. s g Öncelikle pyPdf modülünden bazı fonksiyonları içe aktarıyoruz: from pyPdf import PdfFileWriter. Daha önce modüllerin içe aktarılma yöntemg lerini incelerken bu biçimi ö˘ rendi˘ imizi hatırlıyor olmalısınız.>>> import pyPdf DeprecationWarning: the sets module is deprecated from sets import ImmutableSet pyPdf modülünün uyumlu oldu˘ u son Python sürümü 2. Simdi de okuyaca˘ ımız pdf dosyasını tanımlıyoruz: ¸ g belge = "diveintopython. belgenin yazarı. Neyse. kaynak.

kaynak. Bu modül geli¸tiricilerin s g s yazdı˘ ı modüllerden biridir.#!/usr/bin/env python # -*. Çünkü bunlar birer hata de˘ il. pyPdf kütüphanesi içinde kullanılmı¸ olan bazı modüller. sadece s g uyarıdır. yazarının kim oldu˘ unu da ö˘ renebiliriz.coding: utf-8 -*from pyPdf import PdfFileWriter.title)) Daha önce de dedi˘ imiz gibi. Dolayısıyla e˘ er sizin çalı¸tı˘ ınız belgenin bir ba¸lı˘ ı s g g s g s g yoksa. DeprecationWarning) from pyPdf import PdfFileWriter.py DeprecationWarning: the sets module is deprecated from sets import ImmutableSet Bu uyarılar programımızın çalı¸masını engellemez. yukarıdaki kodları g g çalı¸tırdı˘ ınızda suna benzer uyarılar alabilirsiniz: s g ¸ istihza@istihza:~/Desktop$ python deneme. Bu uyarıya göre.getDocumentInfo().coding: utf-8 -*import warnings warnings.6 ise. Dolayısıyla bilgisayarımıza herhangi bir program kurmaya gerek g kalmadan do˘ rudan programlarımız içinde kullanılabilir.pdf" kaynak = PdfFileReader(open(belge. “tedavülden kalkacak özellikler” hakkındaki uyarıları etkisizle¸tiriyoruz. "rb")) print (u"%s adlı dosyanın ba¸lı˘ı ¸udur: %s" s g s %(belge. Bu kodları çalı¸tırdı˘ ımız zaman söyle bir çıktı elde s s g ¸ edece˘ iz: g diveintopython. Python’un s mevcut sürümünde çalı¸ıyor olsa bile.getDocumentInfo(). PdfFileReader belge = "diveintopython.simplefilter("ignore".coding: utf-8 -*- . bir üst sürümde artık kullanılmayacak. s g s g g Bunun için title yerine author niteli˘ ini kullanıyoruz: g #!/usr/bin/env python #-*. Bu modülün simplefilter() adlı fonksiyg onunu kullanarak “DeprecationWarning” olarak ifade edilen.pdf adlı dosyanın ba¸lı˘ı ¸udur: Dive Into Python s g s Her pdf belgesinin ba¸lı˘ ı olmayabilir. PdfFileReader belge = "diveintopython.title)) Burada warnings adlı bir ba¸ka modülü içe aktardı˘ ımıza dikkat edin. ba¸lık yerine None de˘ erini alacaksınız. s g pyPdf modülü yardımıyla bir belgenin ba¸lı˘ ı dı¸ında. E˘ er siz bu s g uyarıları almak istemiyorsanız.pdf" kaynak = PdfFileReader(open(belge. kaynak. "rb")) print (u"%s adlı dosyanın ba¸lı˘ı ¸udur: %s" s g s %(belge. programımızı söyle yazabilirsiniz: ¸ #!/usr/bin/env python # -*. e˘ er sisteminizdeki Python sürümü 2.

Mesela bir belge önce OpenOffice ile s yazılıp daha sonra OpenOffice kullanılarak pdf formatına dönü¸türülmü¸se çıktıda OpenOffice s s görünecektir. "rb")) print (u"%s adlı dosyanın yazarı ¸udur: %s" s %(belge. e˘ er pdf belgesinde yazar bilgisi geçmiyorsa. creator niteli˘ i ile “Scribus 1. producer niteli˘ i bize su g g s g ¸ çıktıyı verebilir: Scribus PDF Library 1. kaynak.creator)) Bu kodları çalı¸tırdı˘ ımızda suna benzer çıktılar alabiliriz: s g ¸ Scribus 1. DeprecationWarning) from pyPdf import PdfFileWriter.3.3. producer niteli˘ i suna g g ¸ benzer bir çıktı verebilir: Adobe PDF Library 8. elimizdeki pdf belgesinin hangi yazılımın hangi sürümü kullanılarak olu¸turuls du˘ unu gösterir.4) çıktısını verdiyse.12” çıktısını almı¸sak.3. pdf belgesini olu¸turan yazılımı görüntüleyen bir ba¸ka g ¸ s s metot da producer adlı niteliktir. Bu niteli˘ i su sekilde kullanıyoruz (Sadece ilgili kod parçasını g ¸ ¸ gösteriyoruz) kaynak. "rb")) print (u"%s adlı dosya ¸u yazılımla olu¸turulmu¸tur: %s" s s s %(belge.3.0 ..simplefilter("ignore". None de˘ erini g g g g alırız. kaynak.pdf" kaynak = PdfFileReader(open(belge.getDocumentInfo(). E˘ er belge ba¸ka bir formattan pdf formatına dönü¸türülmü¸se.getDocumentInfo(). Bu çıktılar.import warnings warnings.coding: utf-8 -*import warnings warnings.producer Örne˘ in.12. Adobe InDesign CS3 (5.author)) Tıpkı title niteli˘ inde oldu˘ u gibi. özgün forg g s s s matı olu¸turmak için kullanılan yazılım görünecektir.0. DeprecationWarning) from pyPdf import PdfFileWriter. vb.getDocumentInfo().) creator niteli˘ ine benzer bir sekilde.12 Veya creator niteli˘ i bize Adobe InDesign CS3 (5.4).simplefilter("ignore". (OpenOffice çıktıda “Writer” olarak görünür.pdf" kaynak = PdfFileReader(open(belge.3. PdfFileReader belge = "falanca.3.0. PdfFileReader belge = "falanca.. Bir pdf belgesinin hangi yazılım ile olu¸turuldu˘ unu ö˘ renmek için ise creator niteli˘ ini kuls g g g lanıyoruz: #!/usr/bin/env python # -*. Writer.

E˘ er yukarıdaki kodları su sekilde yazacak g ¸ ¸ olursanız: #!/usr/bin/env python # -*. PdfFileWriter .simplefilter("ignore". içeri˘ inin falanca. Böyle bir pdf belgesine s g title niteli˘ ini uyguladı˘ ımızda None çıktısı alırız.getPage(0)) nesne. Daha sonra. "wb") nesne..pdf dosyasından okudu˘ umuz verileri hedef g g g dosyaya yazmadan önce. Yani mesela her pdf belgesinin bir ba¸lı˘ ı (title) olmayabilir. bu kodları çalı¸tırdı˘ ınızda bazı zararsız uyarılar alacaksınız. çalı¸ma dizininiz içinde hedef..Ya da creator niteli˘ i ile “Writer” çıktısı elde etmi¸sek.pdf. Yukarıdaki programı bir g ¸ dosyaya kaydedip çalı¸tırdı˘ ınızda. Burada okuyaca˘ ımız kaynak pdf dosyamızın g adı falanca. s s Gelin isterseniz bu kodları biraz açıklayalım: Burada öncelikle pyPdf modülünden. "rb")) nesne = PdfFileWriter() hedef = open("hedef. Bu demek oluyor ki. producer niteli˘ iyle sunu elde edebilig s g ¸ riz: OpenOffice. Bu yeni pdf belgesini açıp baktı˘ ınızda.close() Daha önce bahsetti˘ imiz gibi.org 2.pdf adında bir pdf belgesi s g s olu¸acak.addPage(kaynak.coding: utf-8 -*from pyPdf import PdfFileReader.pdf.pdf". e˘ er g g g bir pdf belgesinin ilk sayfasını almak istiyorsak söyle bir i¸lem yapmamız gerekir: ¸ s #!/usr/bin/env python # -*. yazaca˘ ımız verileri bir g “pyPdf.3 Daha önce de belirtti˘ imiz gibi.pdf adlı belgenin ilk sayfası s g g oldu˘ unu göreceksiniz.. s g s pyPdf ile pdf Belgelerinden Sayfa Almak pyPdf modülünü kullanarak bir pdf belgesinden istedi˘ imiz sayfaları alabiliriz. Bu dosyayı “rb” kipiyle açıyoruz. kaynak = PdfFileReader(open("falanca. DeprecationWarning) from pyPdf import PdfFileReader. Örne˘ in.pdf". pdf dosyasını okumamıza yarayan PdfFileReader() fonksiyonunu ve pdf dosyasından okudu˘ umuz parçaları yazmamızı sa˘ layan PdfFileWriter() g g fonksiyonunu içe aktarıyoruz. PdfFileWriter() fonksiyonunu kullanarak. PdfFileWriter kaynak = PdfFileReader(open("falanca. g s g ˙ Isterseniz yukarıda gösterdi˘ imiz sekilde bu uyarıları kapatabilirsiniz. falanca. "rb")) satırıyla kaynak dosyamızı tanımlıyoruz. yukarıdaki kodlar yardımıyla bir pdf dosyasının ilk g sayfasını alıp ba¸ka bir pdf dosyası olu¸turabiliyoruz.pdf".PdfFileWriter nesnesi” haline getiriyoruz. g g getDocumentInfo() fonksiyonunun en önemli metotlarını gördü˘ ümüze göre..coding: utf-8 -*import warnings warnings.write(hedef) hedef. her pdf dosyası yukarıdaki özelliklerin hepsini barındırmayag bilir. (Bu kiplerin ne demek oldu˘ unu bir song raki bölümde ö˘ renece˘ iz) Ardından. pyPdf modülünün g ba¸ka bir özelli˘ ini incelemeye ba¸layabiliriz.

içini doldurdu˘ umuz bu nesneyi hedef adlı dosyaya yazdırıyoruz. Son satırımız g ise hedef dosyayı kapatmamızı sa˘ lıyor.kaynak = PdfFileReader(open("falanca. Bu i¸lemi yapmak için pyPdf modülünün getNumPages() fonksiyonundan yararlanaca˘ ız: s g #!/usr/bin/env python # -*. g ˘ Pdf Belgelerinin Sayfa Sayısını Ögrenmek pyPdf modülü yardımıyla.simplefilter("ignore". "rb")) print kaynak. g Böylelikle Python’la temel pdf i¸lemlerini yapmamızı sa˘ layan pyPdf modülünü kısaca tanımı¸ s g s olduk. "rb")) nesne = PdfFileWriter() print nesne Söyle bir çıktı alırsınız: ¸ <pyPdf.getPage(0)) nesne. Sondan bir önceki satır s g yardımıyla da.pdf".getNumPages() Gördü˘ ünüz gibi.getPage(0) satırı yardımıyla kaynak dosyasının sıfırıncı (yani ilk) sayfasını alıyoruz. getNumPages() fonksiyonunu kullanarak bir pdf belgesinin sayfa sayısını g ö˘ renmek son derece kolay.pdf". Bu programı ve s kaynak kodlarını incelemek için http://istihza. Tabii ki önce hedef dosyamızı tanımlamamız g g gerekiyor.close() Burada öncelikle. Ö˘ rendiklerimizin bir kısmı henüz bize çok fazla sey ¸ g g ¸ ifade etmemi¸ olabilir. "wb") Burada hedef. s g .pdf adlı dosyamızı yine “ikili” düzende (binary) açtı˘ ımıza dikkat edin.write(hedef) hedef. Bunu da yukarıdaki kodlardaki su satırla hallettik: ¸ hedef = open("hedef.pdf. elimizdeki pdf belgelerinin sayfa sayısını da rahatlıkla sorgulayabiliriz. DeprecationWarning) from pyPdf import PdfFileReader kaynak = PdfFileReader(open("python. Ama birkaç ders sonra burada anlatılan her seyin zihninizde berraks ¸ la¸tı˘ ını göreceksiniz.coding: utf-8 -*import warnings warnings. Bu i¸lemi yapan satırlarımız sunlar: s ¸ nesne. kaynak.PdfFileWriter object at 0xb7cdea0c> Demek ki. aslında kaynak de˘ i¸keni içinde depoladı˘ ımız “¸ey” bir nesnedir. pyPdf modülünün addPage() fonksiyonunu kullanarak.addPage(kaynak.PdfFileWriter nesnesini” hedef dosyamıza s g yazdırabiliriz.pdf". Bu bölümde pek çok yeni sey ö˘ rendik.pdf. aldı˘ ımız bu sıfırıncı g sayfayı bir önceki satırda olu¸turdu˘ umuz nesnenin içine ekliyoruz. Bu modül aynı zamanda HARMAN programında da kullanılmı¸tır.html adresini ziyaret edebilirsiniz. g Artık bir önceki adımda olu¸turdu˘ umuz “pyPdf. Biz bu nesgs g s neyi alıp do˘ ruca hedef dosyamıza yazaca˘ ız.com/harman/icindekiler_harman.

Gördü˘ ünüz gibi.. s g Python bir modülü içe aktarmaya çalı¸ırken belli dizinlerin içine bakar.6/dist-packages’] Elbette kullandı˘ ınız i¸letim sistemine ba˘ lı olarak sizde bu komutun çıktısı farklı olacaktır.egg’. ’/usr/local/lib/python2.6/lib-dynload’. ˙ste Python bir modg I¸ ülü ararken bu niteli˘ in gösterdi˘ i dizinlerin içine bakar. Dolayısıyla listeler üzg erinde yapabilece˘ iniz her seyi bu sys. sys. ’/usr/lib/python2.1-py2. Yani e˘ er içe aktarmaya çalı¸tı˘ ımız modül. Yani içe aktarmaya s çalı¸tı˘ ımız modülü ilk olarak.7 Modüllerin Yolu Kendi yazdı˘ ımız modülleri anlatırken söyle bir problemden söz etmi¸tik: Kendimiz bir modül g ¸ s yazdı˘ ımızda. ’/usr/lib/python2.6. Python’da sys adlı bir modül bulunur.1-py2. g .append("/herhangi/bir/dizin") Ancak unutmayın ki.4. g s g ˙ste Python bir modülü içe aktarmaya çalı¸tı˘ ımız zaman bu çıktıda görünen dizinlerin içini I¸ s g tek tek kontrol edecek ve aradı˘ ımız modülün bu dizinlerden herhangi birinin içinde olup g olmadı˘ ına bakacaktır. o anda g s g bulundu˘ umuz dizin içinde de˘ ilse ImportError adlı bir hata alıyoruz.0’.. her halükarda os modülünü rahatlıkla içe aktarabiliyoruz.path çıktısı üzerinde de yapabilirsiniz.) Bu modülün path adlı bir niteli˘ i vardır.6c11-py2.6/dist-packages/gst-0.6.path.path çıktısı aslında basit bir listeden ibarettir.path listesine sonradan ekledi˘ iniz dizinler kalıcı de˘ ildir. ’/usr/local/lib/python2.0b2-py2.6-py2. ’/usr/lib/python2. Peki ya s g g s aranan modül mevcut çalı¸ma dizini içinde yoksa? s Böyle bir durumda Python tabii ki hemen pes etmez.6/lib-old’. ˙ste bu bölümde biz bu durumun I¸ nedenini anlatmaya çalı¸aca˘ ız. E˘ er aradı˘ ımız modül bu dizinlerden herhangi birinin içindeyse ne g g g ala! Ama e˘ er modül bu dizinlerin hiç birinde yoksa i¸te o zaman biraz önce bahsetti˘ imiz o g s g ImportError hatasını alırız. (Bu modüle ili¸kin bilgiyi “Modül Dizini” ba¸lıklı s s bölümümüzde bulabilirsiniz. sys.6/lib-tk’. ’/usr/lib/pymodules/python2. ’/usr/local/lib/python2.path [’’. komut satırının açıldı˘ ı dizin içinde bulmaya çalı¸ır. ’/usr/lib/python2. Yazdı˘ ınız g g g program sona erdi˘ inde sys.6. ’/usr/lib/python2.6/dist-packages/PIL’.egg’. Mesela bu listg ¸ eye yeni dizinler ekleyebilirsiniz: >>> sys. ’/usr/lib/python2.0’.6/dist-packages/Sphinx-1.6/dist-packages/Pygments-1.6/gtk-2. bu modülü düzgün bir sekilde içe aktarabilmemiz için o modülün mevcut çalı¸ma g ¸ s dizini içinde yer alıyor olması gerekiyor. Yani: g g >>> import sys >>> sys.10’.6’.6/dist-packages/Jinja2-2.14. ’/usr/local/lib/python2. Biz o anda hangi dizin altında bulunursak bulunalım.6. mesela os modülünde bulunmuyor. E˘ er aranan modül o s g dizinlerin içinde yoksa Python yukarıda bahsetti˘ imiz ImportError hatasını verecektir.6/dist-packages’. Çünkü bakması gereken ba¸ka dizinler s de vardır.6/dist-packages/setuptools-0.path listesi de eski haline dönecektir.6’. ’/usr/lib/pymodules/python2. ’/usr/local/lib/python2. ’/usr/lib/python2.6. ’/usr/local/lib/python2. ’/usr/lib/python2.6/plat-linux2’. ’/usr/lib/python2.egg’. Ancak böyle bir probg g lem.egg’.6/dist-packages/gtk-2.3.6/dist-packages/docutils-0. Peki g Python bir modülü ararken hangi dizinlerin içine bakar? Python bir modülü ararken ilk olarak mevcut çalı¸ma dizinine bakar.egg’.

yanlı¸ s kullanıldı˘ ında nelere mal olabilece˘ i üzerinde dü¸ünün.8 Bölüm Soruları 1.14. 6.txt olanları listeleyin. Daha sonra birbirinden ayırdı˘ ınız bu modülleri içe aktars g mak suretiyle kullanabilirsiniz. s Mesela programınızda arayüzle ilgili olan kodları bir modül. Bu güçlü aracın. asıl i¸i yapan kodları ise ba¸ka bir s s modül olarak düzenleyebilirsiniz. yazaca˘ ınız programlar açısından ne gibi g g faydaları olabilece˘ ini tartı¸ın.pi_sayisi g Bu programda. Böylece kalabalık kod yı˘ ınlarını yönetmek ve bunların bakımını g yapmak çok daha kolay bir i¸ haline gelir. 8.cikar(1455. yazdı˘ ınız Python programlarını organize etmenizi sa˘ lar. g s g s Programlarınızı modüllere ayırmanın getirileri üzerinde dü¸ünün. sayfalarını ayrı bir pdf belgesi olarak kaydetmeyi deneyin. Bir dizin içinde yer alan bütün dosyalar içinde. 2. Ya da mesela programınızla ilgili ayarları kontrol eden kodları farklı bir modüle yerle¸tirebilirsiniz. Python modüllerini kaç farklı sekilde içe aktarabiliyoruz? Bu içe aktarma biçimleri arasındaki ¸ farklar nelerdir? Bunlar içinde sizce en mantıklısı ve en kullanı¸lısı hangisidir? s 4. g s 9. modülleri alelade Python programlarından ayıran özelliklerin neler olabilece˘ ini tartı¸ın.py dosyası yazmaktansa. Modüller konusunu anlatırken söylediklerimizi de dikkate alarak. os modülünü kullanarak. g g s . Modüller konusunu anlatırken söyle bir örnek vermi¸tik: ¸ s #!/usr/bin/env python # -*. Bu bilgiler ı¸ı˘ ında. s 5. Modüller. 5 ve 7. aritmetik modülünün içe aktarılması sırasında bir hata ortaya çıkabilece˘ ini g göz önüne alarak bu programı yeniden yazın. Python’da sys. 32) print "pi sayısının de˘eri: %s" %aritmetik. Bir Python programının gerçek anlamda bir modül olabilmesi ve ciddi g s olarak bir i¸e yarayabilmesi için modülü yazarken sizce hangi noktalara dikkat etmek gerekir? s 3. Dedi˘ imiz gibi. Ancak modül ve alelade g bir Python programı arasında bazı farklar da vardır. yalnızca GNU/Linux veya yalnızca Windows üzerinde çalı¸an bir s program yazın. yalnızca uzantısı . bütün Python programları temelde birer modüldür.coding: utf-8 -*import aritmetik print aritmetik. programınızı ayrı ayrı modüllere bölebilirsiniz.path gibi bir niteli˘ in olmasının. pyPdf modülünden yararlanarak bir pdf belgesinin 2. Örne˘ in binlerce satırg g g dan olu¸an tek bir . 7. su ana kadar Python programs sg ¸ lama dilini ö˘ renirken alı¸tırma olsun diye yazdı˘ ınız programları modüllere ayırmaya çalı¸ın. os modülündeki system() fonksiyonu son derece güçlü bir araçtır.

Bu ikisi arasındaki farkı g g biraz sonra daha net bir sekilde göreceksiniz. Anlaması daha kolay olsun s diye. ˙ste bu bölüm. s s g Bu fonksiyonu Modüller ba¸lı˘ ı altında pyPdf modülünü anlatırken de gördü˘ ümüzü hatırlıyors g g sunuz. bir dosyaya nasıl bir seyler yazabilece˘ imizi ve buna benzer s g ¸ g i¸lemleri ö˘ renece˘ iz.. Burada yapaca˘ ımız sey. ¸ Programcılık ya¸amınız boyunca dosyalarla bol bol ha¸ır ne¸ir olacaksınız. Biz burada g Python’u kullanarak sistemimizde yeni dosyalar olu¸turmanın yanısıra. Esasında biz bundan önceki bazı derslerimizde bu konuya üstünkörü de s g g olsa de˘ inmi¸tik. daha önce görüp de tam olarak anlayamadı˘ ımız bazı kod g s I¸ g parçalarını çok daha iyi anlayabilmemizi sa˘ layacak bilgileri edinece˘ imiz bir bölüm olacak. Mevcut çalı¸ma dizinimizi de ö˘ rendi˘ imize s g g göre artık yeni dosyamızı olu¸turabiliriz. ˙ Isterseniz lafı hiç uzatmadan konumuza geçelim.BÖLÜM 15 Dosya ˙slemleri I¸ Bu bölümde Python programlama dilini kullanarak dosyaları nasıl yönetece˘ imizi. sistemdeki varsayılan uygulama ile açabiliyorduk. Bu fonksiyonu kullanmak için s s os modülünün içe aktarılmasına gerek yok..1 Dosya Olu¸ turmak s Bu bölümde amacımız bilgisayarımızda yeni bir dosya olu¸turmak. ¸ g g ¸ sistemimizde bulunan herhangi bir dosyayı varsayılan uygulamayla açmak de˘ il. O yüzden bu bölümü s s s dikkatle takip etmenizi öneririm. bilgisas yarımızda bulunan dosyaları (ve programları). Python’la ilk dosyamızı mevcut çalı¸ma dizini altında olu¸turaca˘ ız. Bu i¸ için open() adlı bir fonksiyondan faydalanaca˘ ız. s herhangi bir aracı program kullanmadan do˘ rudan Python ile açaca˘ ız. Biraz önce os modülünü içe aktarmamızın nedeni 201 . Bu arada bir yanlı¸ anla¸ılma olmaması için hemen belirtelim.getcwd() Biraz sonra olu¸turaca˘ ımız dosya bu komutun çıktısı olarak görünen dizin içinde olu¸acaks g s tır. Bu araçlar yardımıyla. Hemen Python komut satırını açıyoruz ve su komuts g ¸ ları veriyoruz: >>> import os >>> os. g g Hatırlarsanız os modülünü anlatırken Windows için startfile() adlı bir fonksiyondan. 15. varolan dosyaları da. Ancak bu bölümde daha farklı bir seyden söz edece˘ iz. yani nasıl g yeni bir dosya olu¸turaca˘ ımızı. GNU/Linux için ise xdg-open adlı bir sistem komutundan söz etmi¸tik. Sayın ki bu dizin Masaüstü (Desktop) olsun. Öncelikle mevcut s s g çalı¸ma dizinimizin ne oldu˘ unu görelim.

txt adında. “r” kipi. Bir dosyayı g g açmaya yarıyor. aynı adda yepyeni bir dosya olu¸turacak. dedik.txt". "w") Bu arada dikkatli olun. Ayrıca bu kip yardımıyla yeni bir s dosya da olu¸turamayız. bu “w” ne oluyor? g Python’da dosyaları yönetirken.txt‘nin de ne oldu˘ u açık.txt’ . olu¸turulan veya s açılan bir dosyaya yalnızca “okuma” izni verildi˘ ini gösterir.txt") Traceback (most recent call last): File "<stdin>". Olu¸turas g s ca˘ ımız dosyanın adını tırnak içine almayı unutmuyoruz. "r") komutunu verdi˘ imizde e˘ er bilgisayarda deneme. Peki. “a” kipi önceden olu¸turdu˘ umuz bir dosyaya yeni veri ekles g mek için kullanılır.txt". Simdi s s ¸ verdi˘ imiz bu komutu biraz inceleyelim.txt". Bir de “a” kipi vardır. g g ¸ Biraz önce. open() fonksiyonunun ne oldu˘ u belli. Yani e˘ er biz bir dosyayı bu kipte açarsak g g dosya içine herhangi bir veri giri¸i yapma imkânımız olmaz.txt". Bu kip bize varolan bir dosyayı açma imkânı verir. Dolayısıyla dosya içindeki eski verileri koruyup bu dosyaya yeni veriler eklemek istiyorsak “a” kipini kullanmamız gerekecek. Çünkü “w” kipi. line 1. Yani bu dosya üzerinde herhangi g bir de˘ i¸iklik yapılamaz. Yani mesela: s >>> ikincidosyam = open("deneme. "w") komutuyla deneme_metni. bunun yerine Python bize bir hata mesajı gösterecektir: s >>> f = open("deneme. s ˙ Ingilizce’de “okuma” anlamına gelen “read” kelimesinin kısaltması. g s bunu yaparken de eski dosyayı silecektir.txt adlı bir g g dosya varsa. Bu kiplerin hepsini sırası geldi˘ inde görece˘ iz. "r") Dikkat ederseniz burada “w” kipi yerine “r” kipini kullandık.txt adlı bir dosya yoksa bu adla yeni bir g g dosya olu¸turulmayacak.txt".yalnızca getcwd() fonksiyonunu kullanmaktı. Simdi tekrar konumuza dönelim. De˘ i¸iklik yapabilmek için biraz önce gösterdi˘ imiz “w” kipini kulgs gs g lanmak gerekir. “r”. dosya izinlerini de belirtmemiz gerekir.txt adlı dosyayı “w” kipinde ¸ g olu¸turup içine bir seyler yazdıktan sonra tekrar bu kiple açıp içine bir seyler eklemek istersek s ¸ ¸ dosya içindeki eski verilerin kayboldu˘ unu görürüz. Yani mesela bir dosyaya yazabilmek için “w” kipini (mode) kullanıyoruz. >>> open("deneme_metni. Tabii ortada henüz bir dosya olmadı˘ ı için burada açmak yerine yeni bir dosya g olu¸turmaya yaradı. kullanım kolaylı˘ ı açısından epey faydalı gs g olacaktır. yazma yetkisi verilmi¸ bir dosya olu¸turduk s s masaüstünde.txt adlı bir metin dosyası olu¸turmu¸ olduk. Simdi ba¸ka bir örnek verelim: ¸ s >>> ilkdosyam = open("eski_dosya. Parantez içindeki deneme_metni. in <module> IOError: [Errno 2] No such file or directory: ’deneme. aynı dosyadan bilgisag yarınızda zaten var olup olmadı˘ ına bakmaksızın. Biz de simdi bu i¸lemi yapalım: ¸ s >>> ilkdosyam = open("deneme_metni. Bu komutu bir de˘ i¸kene atamak. e˘ er bilgisayarınızda önceden deneme_metni. Bu harf ˙ Ingilizce’de “yazma” anlamına gelen “write” kelimesinin kısaltmasıdır. Bu noktayı da belirttikten sonra komutumuzu veriyoruz: >>> open("deneme_metni. "w") Böylelikle masaüstünde deneme_metni. Bunun dı¸ında bir de “r” kipi ve “a” kipi bulunur. Bu su anlama geliyor. “a” da ˙ Ingilizce’de “eklemek” anlamına gelen “append” kelimesinden geliyor. dedi˘ imiz gibi. Örne˘ in deneme_metni. yukarıdaki komut size hiç bir uyarı vermeden eski dosyayı silip üzerine yazacaktır. Biraz önce de açıkladı˘ ımız gibi g bu kip dosyaya okuma yetkisi verildi˘ ini gösteriyor.

coding: cp1254 -*import sys def programdan_cik(): print "Programdan çıkılıyor!" print "Ho¸çakalın. E˘ er kuls g lanıcının verdi˘ i dosya adı geçerliyse. herg hangi bir dosyanın sistemde var olup olmadı˘ ını denetleyebiliriz. dosyanın bulunamaması durumunda o adla yeni bir dosya olu¸turulmasını da sa˘ layabilirsiniz: s g #!/usr/bin/env python # -*." s sys.Burada gördü˘ ümüz hata mesajı önemlidir.. except bloklarından yararlanıyoruz.. açılacak dosyanın adını alıyoruz. Elbette isterseniz.exit() while True: dosya_adi = raw_input("Açılacak dosyanın adını girin: ") if dosya_adi: try: f = open(dosya_adi..coding: cp1254 -*import sys def programdan_cik(): print "Programdan çıkılıyor!" print "Ho¸çakalın..exit() while True: dosya_adi = raw_input("Açılacak dosyanın adını 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 kullanıcıdan.. programımız dosya bulundu çıktısı vererek programı song landırıyor. IOError adlı bu hata mesajı yardımıyla. Mesela su basit programa g ¸ bir bakalım: #!/usr/bin/env python # -*.. sistemde var olmayan bir dosya adı belirtmesi ihtimaline kar¸ı da try. Ama e˘ er belirtilen dosya bulunamazsa kullanıcı dosyanın bulunamadı˘ ı konusunda g g uyarılıyor ve kendisinden yeni bir dosya adı girmesi isteniyor." s sys. Kullanıcının. "r") print "dosya bulundu" except IOError: .

html uzantılı bir dosya olu¸turarak internet tarayıcınızla açılabilecek g s bir dosya olu¸turabilirsiniz. En emin yol. Ya da . Bu kipi söyle kulI¸ g ¸ lanıyoruz: >>> dosya = open("deneme_metni. yani “w” veya “a” kips lerinden birini kullanmamız gerekir. Bu arada. kip belirtmemiz.txt". Ama sola yatık bölü problem g s s yaratabilir: >>> f = open("C:\Documents and Settings\fozgul\Desktop\filanca. yukarıdaki örneklerde biz dosyamızı mevcut çalı¸ma dizini içinde olu¸turduk."w") komutu /home/kullanıcı_adı/ dizini altında. Python belirtti˘ imiz addaki dosyayı sıfırdan g g olu¸turacak. yukarıda yaptı˘ ımız gibi dosya g yolunu sa˘ a yatık bölü i¸aretiyle ayırmaktır: g s >>> dosya = open("/home/kullanıcı_adı/deneme. s Yalnız burada küçük bir uyarı yapalım.txt uzantılı dosyalar de˘ il. "a") Python’da bir dosyayı “a” kipinde açtı˘ ımız zaman. e˘ er aynı adla ba¸ka bir dosya varsa o dosyanın üzerine yazacaktır.txt". Tabii “r” kipinin yukarıda bahsetti˘ imiz özelli˘ inden dolayı. ˙ste böyle durumlar için “a” adlı özel bir kipten yararlanaca˘ ız. Ayrıca sadece .odt uzantılı bir dosya olu¸turarak dosyanın OpenOffice ile açılmasını s sa˘ layabilirsiniz. E˘ er bir dosyayı “w” kipinde açarsak.txt".print "Dosya bulunamadı!" open(dosya_adi."w") Sa˘ a yatık bölü bütün i¸letim sistemlerinde sorunsuz çalı¸ır. "a") Traceback (most recent call last): File "<stdin>". in <module> IOError: [Errno 22] invalid mode (’a’) or filename: ’C:\\Documents and Settings\ x0cozgul\\Desktop\x0cilanca. Mesela . içeri˘ i dolu bir dosyayı açıp bu dosyaya eklemeler yapmamız da s g gerekebilir. s E˘ er yazdı˘ ımız kod içinde yukarıdaki üç kipten hiçbirini kullanmazsak. pek çok farklı dosya tipi de olu¸s g s turabilirsiniz. Bu kiple açtı˘ ımız bir dosya üzerinde herhangi bir de˘ i¸iklik g gs yapamayız. E˘ er sa˘ a yatık bölü kullanmak isterseniz “\” s g g i¸aretini çiftlemeniz gerekir: s ." %dosya_adi s programdan_cik() else: print "dosya adı belirtmediniz!" Yukarıdaki örneklerde. deneme..txt’ Burada sorun.. g Ayrıca “a” kipinin. Yazdı˘ ımız kodlarda yol adı belirtirken kullandı˘ ımız g g yatık çizgilerin yönüne dikkat etmemiz gerekir. yoktan bir dosya olu¸turmayı ve halihazırda sistemimizde bulunan bir s dosyayı açmayı ö˘ rendik. Python. Python’un “\” i¸aretini bir kaçı¸ dizisi olarak algılaması.txt adlı bir dosya s olu¸turacaktır. line 1. o dosyanın içine yeni veriler ekleyebiliriz. Python’da bir dosyayı “r” kipinde açtı˘ ımız zaman. Mesela: s >>> dosya = open("/home/kullanıcı_adı/deneme. Python’da s g s dosya i¸lemleri yaparken. Halbuki biz burada s s bu i¸areti yol ayracı olarak kullanmak istedik. "w") print "%s adlı yeni bir dosya olu¸turuldu.txt". o dosyayı yalg g nızca okuma hakkı elde ediyoruz. bilg g gisayarımızda yeni bir dosya olu¸turmak istiyorsak. “r” kipinin aksine bize yeni dosya olu¸turma imkânı da verdi˘ iniz aklımızın s g bir kö¸esine not edelim. yazma yetkisi verilmi¸. dosyanızı istedi˘ iniz s s g yerde olu¸turabilirsiniz. öntanımlı g g olarak “r” kipini kullanacaktır. Tabii ki siz isterseniz tam yolu belirterek.

txt dosyasının içine “Guido Van Rossum” yazdık. Ama özellikle Windows üzerinde çalı¸ırken. Ayrıca muhtemelen s Python’un ileriki sürümlerinde. eks lemelerin dosyaya i¸lenebilmesi için dosyanın kapatılması gerekiyor. Dosyamızı “a” kipiyle açtıktan sonra write() fonksiyonu yardımıyla “Monty Python” satırını eski dosyaya ekledik.2 Dosyaya Yazmak Su ana kadar ö˘ rendi˘ imiz sey. Ama bu kez komut satırında de˘ il de s g metin üzerinde yapalım bu i¸lemi. 15.close() satırını yazmasa da olur.write("Guido Van Rossum") dosya. "w") dosya.txt adında. Böylelikle deneme. "w") satırını belirledik. Python’da dosya açmak ve olu¸turmaktan ibarettir.txt".coding: utf-8 dosya = open("deneme.txt". Aslında GNU/Linux kullanıcıları bu son dosya. bütün platformlarda bu satırı yazmak zorunlu olacak. "a") Böylece dosya yolunu olu¸turan karakter dizisi içindeki kaçı¸ dizilerini i¸levsiz hale getirerek s s s Python’ın hata vermesini engelleyebilirsiniz.close() Gördü˘ ünüz gibi bu kez dosyamızı “a” kipiyle açtık. yazma yetkisi verilmi¸ bir dosya olu¸turduk. "a") Veya “r” adlı kaçı¸ dizisinden yararlanabilirsiniz: s >>> f = open(r"C:\Documents and Settings\fozgul\Desktop\filanca.txt".coding: utf-8 dosya = open("deneme.write("\nMonty Python") dosya. E˘ er s g g bunu kullanmazsak eklemek istedi˘ imiz satır bir önceki satırın hemen arkasına getirilecektir. g .txt". Hemen bo¸ bir sayfa açıp içine sunları yazıyoruz: s s ¸ #/usr/bin/env python # -*.close() ˙ iki satırın ne oldu˘ unu zaten bildi˘ imiz için geçiyoruz. Ancak ¸ g g ¸ s henüz açtı˘ ımız bir dosyaya nasıl müdahale edece˘ imizi veya nasıl veri giri¸i yapabilece˘ imizi g g s g bilmiyoruz. O yüzden Python’la programlama yaparken bu tür seylere çok dikkat etmek s ¸ gerekir. Daha sonra write() adlı bir fonksiyon yardımıyla s s deneme. Burada “\n” adlı kaçı¸ dizisinden yararlandı˘ ımıza da dikkat edin. Simdi de söyle bir sey yapalım: ¸ ¸ ¸ Biraz önce olu¸turdu˘ umuz ve içine “Guido Van Rossum” yazdı˘ ımız dosyamıza ikinci bir satır s g g ekleyelim: #!/usr/bin/env python #-*. "a") dosya. Ilk g g Aynen biraz önce gördü˘ ümüz sekilde dosya adlı bir de˘ i¸ken olu¸turup bu de˘ i¸kenin de˘ eri g ¸ gs s gs g olarak open("deneme. Zaten “w” kipiyle açarsak eski dosyayı g silmi¸ oluruz. ˙ste birazdan. O yüzden bu satırı da yazmak en iyisi. Mesela deneme.txt".>>> f = open("C:\\Documents and Settings\\fozgul\\Desktop\\filanca. bilgisayarımızda halihazırda var olan veya bizim sonradan olu¸turI¸ s du˘ umuz bir dosyaya nasıl veri giri¸i yapabilece˘ imizi görece˘ iz. En son da close() adlı ba¸ka s bir fonksiyondan yararlanarak dosyayı kapattık.txt adlı bir g s g g dosya olu¸turarak içine “Guido Van Rossum” yazalım.

Bütün bunlardan sonra da close() fonksiyonu yardımıyla dosyamızı kapattık. Bir de su örne˘ e ¸ g bakalım:
#!/usr/bin/env python #-*- coding: utf-8 dosya = open(u"¸iir.txt", "w") s dosya.write("Bütün güne¸ler batmadan,\nBi türkü daha \ s söyleyeyim bu yerde\n\t\t\t\t --Orhan Veli--") dosya.close()

Gördü˘ ünüz gibi, “¸iir” adlı bir metin dosyası olu¸turup bu dosyaya yazma yetkisi verdik. Bug s s rada bir sey dikkatinizi çekmi¸ olmalı. Dosya adını belirlerken (¸iir.txt) karakter dizisinin ba¸ına ¸ s s s bir adet “u” harfi getirdik. Siz bu harfi pyPdf modülünü i¸lerken de görmü¸tünüz. Bu “u” harfini s s kullanmamızın amacı, dosya adında geçen Türkçe karakterin düzgün görüntülenmesini sa˘ lag mak. Buradaki “u” harfi, “¸iir.txt” adlı karakter dizisini Unicode olarak tanımlamamızı sa˘ lıyor. s g Bu konuyu birkaç bölüm sonra çok daha ayrıntılı bir sekilde inceleyece˘ iz. Simdilik sadece ¸ g ¸ böyle bir seyin varoldu˘ unu bilmemiz yeterli olacaktır... ¸ g Bu dosyanın içine yazılan verilere ve burada kaçı¸ dizilerini nasıl kullandı˘ ımıza çok dikkat edin. s g ˙ Ikinci mısrayı bir alt satıra almak için “\n” kaçı¸ dizisini kullandık. Daha sonra “Orhan Veli” s satırını sayfanın sa˘ ına do˘ ru kaydırmak için “\t” kaçı¸ dizisinden yararlandık. Bu örnekte “\n” g g s ve “\t” kaçı¸ dizilerini yan yana kullandık. Böylece aynı cümleyi hem alt satıra almı¸, hem de s s sa˘ a do˘ ru kaydırmı¸ olduk. Ayrıca birkaç tane “\t” kaçı¸ dizisini yan yana kullanarak cümleyi g g s s sayfanın istedi˘ imiz noktasına getirdik. g Yukarıdaki write() fonksiyonu dı¸ında çok yaygın kullanılmayan bir de writelines() fonksiys onu vardır. Bu fonksiyon birden fazla satırı bir kerede dosyaya i¸lemek için kullanılır. Söyle s ¸ ki:
#!/usr/bin/env python #-*- coding: utf-8 dosya = open(u"¸iir2.txt", "w") s dosya.writelines(["Bilmezler yalnız ya¸amayanlar\n", s "Nasıl korku verir sessizlik insana\n", "˙nsan nasıl konu¸ur kendisiyle\n", I s "Nasıl ko¸ar aynalara bir cana hasret\n", s "Bilmezler...\n"]) dosya.close()

Burada parantez içindeki kö¸eli parantezlere dikkat edin. Aslında olu¸turdu˘ umuz sey bir liste. s s g ¸ Dolayısıyla bu fonksiyon bir listenin içeri˘ ini do˘ rudan bir dosyaya yazdırmak için faydalı olag g bilir. Aynı kodu write() fonksiyonuyla yazmaya kalkı¸ırsanız alaca˘ ınız sey bir hata mesajı s g ¸ olacaktır. E˘ er bir liste içinde yer alan ö˘ eleri write() fonksiyonunu kullanarak dosyaya yazdırg g mak isterseniz for döngüsünden 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 nasıl yeni bir dosya olu¸turaca˘ ımızı, bu dosyaya nasıl veri girece˘ imizi ve bu ¸ s g g dosyayı nasıl kapataca˘ ımızı ö˘ rendik. Simdi de olu¸turdu˘ umuz bir dosyadan nasıl veri okuyg g ¸ s g aca˘ ımızı ö˘ renece˘ iz. Bu i¸ için de read(), readlines() ve readline() fonksiyonlarından g g g s faydalanaca˘ ız. Su örne˘ e bir bakalım: g ¸ g
>>> >>> ... ... ... >>> >>> >>> yeni = open(u"¸iir.txt","w") s yeni.write("Sular çekilmeye ba¸ladı \ s köklerden...\nIsınmaz mı acaba ellerimde kan? \ \nAh,ne olur! Bütün güne¸ler batmadan\nBi türkü \ s daha söyleyeyim 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() satırına kadar olan kısmı zaten biliyoruz. Burada kullandı˘ ımız read() fonksiyonu g yeni adlı de˘ i¸kenin içeri˘ ini okumamızı sa˘ lıyor. yeni adlı de˘ i¸kenin de˘ eri siir.txt adlı bir gs g g gs g ¸ dosya oldu˘ u için, bu fonksiyon siir.txt adlı dosyanın içeri˘ ini bize gösterecektir. Gördü˘ ünüz g ¸ g g gibi bu komutun çıktısında Türkçe karakterler bozuk görünüyor. Ayrıca kullandı˘ ımız “\n” g ifadesi de çıktıda yer alıyor. Esasında bu komut bize Python’un yazdı˘ ımız kodları nasıl g gördü˘ ünü gösteriyor. E˘ er biz daha düzgün bir çıktı elde etmek istersek en son satırdaki g g komutu su sekilde vermemiz gerekir: ¸ ¸
>>> print yeni.read()

Ayrıca read() dı¸ında bir de readlines() adlı bir fonksiyon bulunur. E˘ er yukarıdaki komutu: s g
>>> yeni.readlines()

seklinde verecek olursak, çıktının bir liste oldu˘ unu görürüz. ¸ g Bir de, e˘ er bu readlines() fonksiyonunun sonundaki “s” harfini atıp; g
>>> yeni.readline()

seklinde bir kod yazarsak, dosya içeri˘ inin yalnızca ilk satırı okunacaktır. Python’un read¸ g line() fonksiyonunu de˘ erlendirirken kullandı˘ ı ölçüt sudur: “Dosyanın ba¸ından itibaren ilk g g ¸ s ‘\n’ ifadesini gördü˘ ün yere kadar oku”. Bunların dı¸ında, e˘ er istersek bir for döngüsü kug s g rarak da dosyamızı okuyabiliriz:
>>> yeni = open(u"¸iir.txt") s >>> for satir in yeni: ... print satir

Dikkat ettiyseniz:
>>> print yeni.readlines()

veya alternatif komutlarla dosya içeri˘ ini okurken söyle bir sey oluyor. Mesela içinde; g ¸ ¸

Birinci satır ˙kinci satır I Üçüncü satır

yazan bir dosyamız olsun:
>>> dosya.readline()

komutuyla bu dosyanın ilk satırını okuyalım. Daha sonra tekrar bu komutu verdi˘ imizde birinci g satırın de˘ il, ikinci satırın okundu˘ unu görürüz. Çünkü Python ilk okumadan sonra imleci (Evet, g g biz görmesek de aslında Python’un dosya içinde gezdirdi˘ i bir imleç var.) dosyada ikinci satırın g ba¸ına kaydırıyor. E˘ er bir daha verirsek bu komutu, üçüncü satır okunacaktır. Son bir kez daha s g bu komutu verirsek, artık dosyanın sonuna ula¸ıldı˘ ı için, ekrana hiç bir sey yazılmayacaktır. s g ¸ Böyle bir durumda dosyayı ba¸a sarmak için su fonksiyonu kullanıyoruz. (Dosyamızın adının s ¸ “dosya” oldu˘ unu varsayıyoruz): g
>>> dosya.seek(0)

Böylece imleci tekrar dosyanın en ba¸ına almı¸ olduk. Tabii siz isterseniz, bu imleci farklı s s noktalara da ta¸ıyabilirsiniz. Mesela: s
>>> dosya.seek(10)

komutu imleci 10. karakterin ba¸ına getirecektir (Saymaya her zamanki gibi 0’dan ba¸lıyoruz.) s s Bu seek() fonksiyonu aslında iki adet parametre alabiliyor. Söyle ki: ¸
>>> dosya.seek(5, 0)

komutu imleci dosyanın ba¸ından itibaren 5. karakterin bulundu˘ u noktaya getirir. Burada “5” s g sayısı imlecin kaydırılaca˘ ı noktayı, “0” sayısı ise bu i¸lemin dosyanın ba¸ından sonuna do˘ ru g s s g olaca˘ ını, yani saymaya dosyanın ba¸ından ba¸lanaca˘ ını gösteriyor: 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” sayısı yine imlecin kaydırılaca˘ ı noktayı, “1” sayısı ise imlecin o anda g g bulundu˘ u konumun ölçüt alınaca˘ ını gösteriyor. g g Son olarak:
>>> dosya.seek(-5,2)

komutu ise saymaya tersten ba¸lanaca˘ ını, yani dosyanın ba¸ından sonuna do˘ ru de˘ il de s g s g g sonundan ba¸ına do˘ ru ilerlenerek, imlecin sondan 5. karakterin oldu˘ u yere getirilece˘ ini s g g g gösterir. Bu ifadeler biraz karı¸ık gelmi¸ olabilir. Bu konuyu anlamanın en iyi yolu bol bol uygulama yaps s mak ve deneyerek görmektir. ˙ Isterseniz, yukarıdaki okuma fonksiyonlarına da belirli parametreler vererek dosya içinde okunacak satırları veya karakterleri belirleyebilirsiniz. Mesela:
>>> yeni.readlines(3)

komutu dosya içinde, imlecin o anda bulundu˘ u noktadan itibaren 3. karakterden sonrasını g okuyacaktır. Peki, o anda imlecin hangi noktada oldu˘ unu nereden bilece˘ iz? Python’da bu g g i¸lem için de bir fonksiyon bulunur: s
>>> dosya.tell()

komutu yardımıyla imlecin o anda hangi noktada bulundu˘ unu görebilirsiniz. Hatta dosyayı bir g kez:
>>> dosya.read()

komutuyla tamamen okuttuktan sonra:
>>> dosya.tell()

komutunu verirseniz imleç mevcut dosyanın en sonuna gelece˘ i için, ekranda gördü˘ ünüz sayı g g aynı zamanda mevcut dosyadaki karakter sayısına e¸it olacaktır. s Python’da dosya i¸lemleri yaparken bilmemiz gereken en önemli noktalardan biri de sudur: s ¸ Python ancak karakter dizilerini (strings) dosyaya yazdırabilir. Sayıları yazdıramaz. E˘ er biz g sayıları da yazdırmak istiyorsak önce bu sayıları karakter dizisine çevirmemiz gerekir. Bir örnek verelim:
>>> x = 50 >>> dosya = open("deneme.txt", "w") >>> dosya.write(x)

Bu kodlar bize su çıktıyı verir: ¸
Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: argument 1 must be string or read-only character buffer, not int

Gördü˘ ünüz gibi Python bize bir hata mesajı gösterdi. Çünkü x de˘ i¸keninin de˘ eri bir “sayı”. g gs g Halbuki karakter dizisi olması gerekiyor. Bu meseleyi çözmek için komutumuzu su sekilde ¸ ¸ veriyoruz. En ba¸tan alırsak: s
>>> x = 50 >>> dosya = open("deneme.txt", "w") >>> dosya.write(str(x))

Burada:
>>> str(x)

komutuyla, bir sayı olan x de˘ i¸kenini karakter dizisine çevirdik. Tabii ki bu i¸lemin tersi de gs s mümkün. E˘ er x bir karakter dizisi olsaydı, su komutla onu sayıya çevirebilirdik: g ¸
>>> int(x)

15.4 Dosya Silmek
Peki, olu¸turdu˘ umuz bu dosyaları nasıl silece˘ iz? Python’da herhangi bir sekilde olu¸turdu˘ us g g ¸ s g muz bir dosyayı silmenin en kestirme yolu sudur: ¸
>>> os.remove("dosya/yolu")

Mesela, masaüstündeki deneme.txt dosyasını söyle siliyoruz: ¸
>>> import os >>> os.remove("/home/kullanıcı_adı/Desktop/deneme.txt")

E˘ er masaüstü zaten sizin mevcut çalı¸ma dizininiz ise bu i¸lem çok daha basittir: g s s
>>> import os >>> os.remove("deneme.txt")

15.5 Dosyaya Rastgele Satır Eklemek
Simdiye kadar hep dosya sonuna satır ekledik. Peki ya bir dosyanın ortasına bir yere satır ¸ eklemek istersek ne yapaca˘ ız? Simdi: Diyelim ki elimizde deneme.txt adlı bir dosya var ve g ¸ içinde sunlar yazılı: ¸
Birinci Satır ˙kinci Satır I Üçüncü Satır Dördüncü Satır Be¸inci Satır s

Biz burada ˙kinci Satır ile Üçüncü Satır arasına Merhaba Python! yazmak istiyoruz. Önce bu I deneme.txt adlı dosyayı açalım:
>>> kaynak = open("deneme.txt")

Bu dosyayı “okuma” kipinde açtık, çünkü bu dosyaya herhangi bir yazma i¸lemi yapmayaca˘ ız. s g Yapaca˘ ımız sey, bu dosyadan veri okuyup ba¸ka bir hedef dosyaya yazmak olacak. O yüzden g ¸ s hemen bu hedef dosyamızı olu¸turalım: s
>>> hedef = open("test.txt", "w")

Bu dosyayı ise “yazma” modunda açtık. Çünkü kaynak dosyadan okudu˘ umuz verileri buraya g yazdıraca˘ ız. Simdi de, yapaca˘ ımız okuma i¸lemini tanımlayalım: g ¸ g s
>>> oku = kaynak.readlines()

Böylece “kaynak” dosya üzerinde yapaca˘ ımız satır okuma i¸lemini de tanımlamı¸ olduk... g s s Simdi kaynak dosyadaki birinci satır ve ikinci satır verilerini alıp hedef dosyaya yazdırıyoruz. ¸ Bu i¸ için bir for döngüsü olu¸turaca˘ ız: s s g
>>> for satirlar in oku[:2]: ... hedef.write(satirlar)

Burada biraz önce olu¸turdu˘ umuz “okuma i¸lemi” de˘ i¸keni yardımıyla “0” ve “1” no’lu satırs g s gs ları alıp hedef adlı dosyaya yazdırdık. Simdi eklemek istedi˘ imiz satır olan Merhaba Python! ¸ g satırını ekleyece˘ iz: g
>>> hedef.write("Merhaba Python!\n")

Sıra geldi kaynak dosyada kalan satırları hedef dosyasına eklemeye:
>>> for satirlar in oku[2:]: ... hedef.write(satirlar)

Artık i¸imiz bitti˘ ine göre hedef ve kaynak dosyaları kapatalım: s g
>>> kaynak.close() >>> hedef.close()

Bu noktadan sonra e˘ er istersek kaynak dosyayı silip adını da hedef dosyanın adıyla de˘ i¸tireg gs biliriz:
>>> os.remove("deneme.txt") >>> os.rename("test.txt","deneme.txt")

Tabii bu son i¸lemleri yapmadan önce os modülünü içe aktarmayı unutmuyoruz... s Yukarıdaki i¸lemleri yapmanın daha pratik bir yolu da var. Diyelim ki elimizde, içeri˘ 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 içeri˘ i http://www.python-forum.org/pythonforum/viewtopic.php?f=1&t=19641 g adresinden alınmı¸tır. s Biz bu dosyada, “Item2” ile “Item3” arasına yeni bir satır eklemek istiyoruz. Dilerseniz bu i¸lemi nasıl yapaca˘ ımızı gösteren 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") satırı yardımıyla falanca.xml adlı dosyayı okumak üzere açıyoruz. 2. Daha sonra, dosyaya eklemek istedi˘ imiz satırı bir de˘ i¸kene atıyoruz. g gs 3. Hemen ardından readlines() adlı metodu kullanarak falanca.xml adlı dosyanın tüm içeri˘ ini bir liste içinde topluyoruz. Böylece dosya içeri˘ ini yönetmek çok daha kolay olacak. g g Bildi˘ iniz gibi, readlines() metodu bize çıktı olarak bir liste veriyor... g 4. Bir sonraki satırda, dosyaya eklemek istedi˘ imiz metni, readlines() metodu ile olu¸turg s du˘ umuz listenin 4. sırasına yerle¸tiriyoruz. Burada listelerin insert() metodunu kulg s

landı˘ ımıza dikkat edin. g 5. Artık dosyayı okuma i¸lemi sona erdi˘ i için dosyamızı close() metodunu kullanarak kaps g atıyoruz. 6. Simdi yapmamız gereken sey, gerekli bilgileri dosyaya yazmak olacak. O yüzden bu defa ¸ ¸ falanca.xml adlı dosyayı yazma kipinde açıyoruz. (yaz = open("falanca.xml", "w")) 7. Sonra, yukarıda olu¸turdu˘ umuz içeri˘ i, yazmak üzere açtı˘ ımız dosyaya gönderiyoruz. s g g g Bunun için writelines() metodunu kullandık. Bildi˘ iniz gibi bu metot listeleri dosyaya g yazdırmak için kullanılıyor. 8. Son olarak, dosyayla i¸imizi bitirdi˘ imize göre dosyamızı kapatmayı unutmuyoruz. s g

15.6 Dosyadan Rastgele Satır Silmek
Bazen, üzerinde çalı¸tı˘ ımız bir dosyanın herhangi bir satırını silmemiz de gerekebilir. Bunun s g için yine bir önceki bölümde anlattı˘ ımız yöntemi kullanabiliriz. Dilerseniz gene yukarıda bahg setti˘ imiz .xml dosyasını örnek alalım: 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 dosyanın “Item2” satırını silmek istiyoruz. Bu i¸lemi 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, tıpkı bir önceki bölümde oldu˘ u gibi, öncelikle readlines() metodunu kullanarak g dosya içeri˘ ini bir listeye gönderdik. Daha sonra bu listede silmek istedi˘ imiz satıra kar¸ılık g g s gelen ö˘ enin sıra numarasını kullanarak del deyimi yardımıyla ilgili ö˘ eyi listeden kaldırdık. g g Son olarak da elimizdeki de˘ i¸tirilmi¸ listeyi bir dosyaya yazdırdık. gs s Gördü˘ ünüz gibi bir dosyaya veri girmek veya dosyadan veri çıkarmak son derecek kolay bir g i¸lem. Yapmamız gereken tek sey dosya içeri˘ ini bir listeye alıp, bu liste üzerinde gerekli s ¸ g

de˘ i¸iklikleri yapmak. Daha sonra da bu de˘ i¸tirilmi¸ listeyi dosyaya yazdırararak amacımıza gs gs s ula¸abiliyoruz. s

15.7 os Modülünde Dosya-Dizin ˙slemleri I¸
Hatırlarsanız geçen bölümde Modüller konusunu i¸lerken os modülünden de ayrıntılı olarak s bahsetmi¸tik. Ancak orada bu modülün bütün özelliklerini anlatmadım. os modülünün bazı s özelliklerini anlatabilmek için önce “Dosya ˙slemleri” konusunu ö˘ renmemizin daha do˘ ru I¸ g g olaca˘ ını dü¸ündüm. Dosya i¸lemleri konusunu ö˘ rendi˘ imize göre, geçen derste bahg s s g g setmedi˘ imiz bazı metot ve fonksiyonları incelemeye ba¸layabiliriz. g s

15.7.1 os.path.abspath()
Bu metot bir dosyanın, içinde yer aldı˘ ı dizin yolunu verir. Bunu bir örnek üzerinde görelim: g
>>> os.path.abspath("falanca.pdf") ’C:\\Documents and Settings\\fozgul\\falanca.pdf’

Gördü˘ ünüz gibi, os.path.abspath() fonksiyonuna argüman olarak bir dosya adı verdik. g O da bize bu dosyanın tam yolunu gösterdi. Ancak bu fonksiyonun önemli bir özelli˘ i g vardır. os.path.abspath(), bir dosyanın sistemde var olup olmadı˘ ını kontrol etmez. Yani g os.path.abspath("falanca.pdf") komutunu verebilmek için sisteminizde falanca.pdf adlı bir dosyanın olmasına gerek yok. Bu fonksiyonun yaptı˘ ı tek sey, os.getcwd() fonksiyonunun g ¸ çıktısıyla, verdi˘ iniz dosya adını birle¸tirmektir... Bu fonksiyonu bo¸ bir karakter dizisi ile g s s ça˘ ırdı˘ ınızda zaten bu fonksiyonun mevcut çalı¸ma dizinini döndürdü˘ ünü görürsünüz: g g s g
>>> os.path.abspath("") ’C:\\Documents and Settings\\fozgul’

15.7.2 os.path.basename()
Bu metot size bir yol içinde yer alan dosyanın adını verir. Örne˘ in: g
>>> os.path.basename("C:\\Documents and Settings\\fozgul\\falanca.pdf") ’falanca.pdf’

Gördü˘ ünüz gibi, bu metot yol ve dosya adını ayıklayarak, bize dosya adını veriyor. g

15.7.3 os.path.dirname()
Bu metot ise bir önceki metodun yaptı˘ ı i¸in tam tersini yapar: Dosya adını de˘ il, yol adını g s g döndürür:
>>> os.path.dirname("C:\\Documents and Settings\\fozgul\\falanca.pdf") ’C:\\Documents and Settings\\fozgul’

15.7.4 os.path.exists()
Bu metot bir dosyanın veya dizinin var olup olmadı˘ ını gösterir: 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ı˘ ı için False çıktısı aldık: g
>>> os.path.isdir("C:\\Documents and Settings\\fozgul") True

C:\Documents and Settings\fozgul ise bir dizin oldu˘ u için True çıktısı aldık. g os.path.isdir() metodu, aynı zamanda bir dizinin var olup olmadı˘ ını da kontrol eder: g
>>> os.path.isdir("C:\\falanca\\dizin") False

Bilgisayarımızda C:\falanca\dizin adlı bir dizin var olmadı˘ ı için False çıktısı alıyoruz... g

15.7.6 os.path.isfile()
Bu metot, verilen bir yolun dosya olup olmadı˘ ını kontrol eder: g
>>> os.path.file("C:\\Documents and Settings\\fozgul\\deneme.txt") True

Benim bilgisayarımda deneme.txt adlı bir dosya oldu˘ u için True çıktısı aldım. g Bir de suna bakalım: ¸
>>> os.path.file("C:\\Documents and Settings\\fozgul\\falanca.txt") False

Bilgisayarımda falanca.txt adlı bir dosya yer almadı˘ ı için bu kez False çıktısı aldım. g Bu metot dosya ve dizinler arasında da ayrım yapar:
>>> os.path.isfile("C:\\Documents and Settings\\fozgul") False

split() Bu metot. ’. içinde yer aldı˘ ı dizini gösterecektir: ¸ g >>> yol = os.pdf’) Dolayısıyla su komut size bir dosyanın.pdf") (’C:\\Documents and Settings\\fozgul’.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.path.pdf") (’falanca’.splitext() Bu metot.7. ama dizin adı oldu˘ u için isfile() metodu g g False çıktısı veriyor.. s s Hatırlarsanız. kümeleri i¸lerken birtakım metotlardan söz etmi¸tik. Biz kümeleri dosya i¸lemleri yaparken dahi kullanabiliriz.split("C:\\Documents and Settings\\fozgul\\falanca. Bildi˘ iniz gibi kümeler su s s g ¸ metotlara sahipti: add clear copy difference difference_update discard intersection intersection_update isdisjoint issubset . Kümeleri ilk gördü˘ ünüzde bunların s g tam olarak ne i¸e yarayaca˘ ını anlamamı¸ olabilirsiniz.. Ama aslında kümeler Python’un epey s g s kullanı¸lı araçlarından bir tanesidir.splitext("falanca.path. ’falanca.7. dosya ve dizin adını birbirinden ayırır: >>> os.pdf") >>> yol[0] ’C:\\Documents and Settings\\fozgul’ Su ise size dosya adını verecektir: ¸ >>> yol = os.7 os. 15.8 os.8 Kümeler ve Dosyalar Önceki bölümlerden birinde kümelerden bahsetmi¸tik.split("C:\\Documents and Settings\\fozgul\\falanca.C:\Documents and Settings\fozgul bir dosya de˘ il.path. g 15.path.path.pdf’) 15. bir dosya adıyla uzantısını birbirinden ayırır: >>> os.

.issuperset pop remove symmetric_difference symmetric_difference_update union update Bu metotlar içinde özellikle iki tanesi. Bir de dosya2. 2. Diyelim ki elimizde söyle iki adet dosya var: ¸ birinci satır ikinci satır üçüncü satır Yukarıdaki dosya1. intersection() metodunu kullanarak da iki dosyada ortak olan satırları bula¸ bilirsiniz: >>> for i in s1.. print i dördüncü satır Aynı sekilde. 3. Bu metodu dosyalara da uygulayag s biliriz...txt olsun. 4]) >>> b_kumesi.difference(s1): . 3]) >>> b_kumesi = set([1. print i birinci satır ikinci satır .. difference() metodu iki kümenin farkını alıyor.. 2.intersection(s2): .txt") >>> s1 = set(f1) >>> s2 = set(f2) >>> for i in s2. yani mesela ikinci dosyada bulunup birinci dosyada bulunmayan satırları göstermek için söyle bir kod yazabiliriz: ¸ >>> f1 = open("dosya1.txt adlı bir dosya olu¸turalım: s birinci satır ikinci satır üçüncü satır dördüncü satır Bu iki dosyanın farkını almak. Bahs s setti˘ imiz bu metotlar difference() ve intersection() adlı metotlardır. Bu metodu söyle kullanıyoruz: g ¸ >>> a_kumesi = set([1.difference(a_kumesi) set([4]) Demek ki b kümesinin a kümesinden farkı 4 adlı ö˘ e imi¸.txt") >>> f2 = open("dosya2. g Bildi˘ iniz gibi. dosyalarla çalı¸ırken bizim çok i¸imize yarayacak.

Ayrıca dosyayı kapatmak.write("bir takım ¸eyler. Böyle bir durumda Python bize bir hata mesajı gösteriyor. "w") as dosya: . Ancak bu hata mesajından sonra.write("bir takım ¸eyler. mode ’r’ at 0x00F5B650> Gördü˘ ünüz gibi. açık bir dosya üzerinde s yanlı¸lıkla de˘ i¸iklik yapma riskini de ortadan kaldırır. hem üzerinde gerekli de˘ i¸iklikleri yapmı¸. Çünkü e˘ er bir dosya üzerinde çalı¸tıktan sonra o dosyayı kapatmazsak.. I¸ Python’da bu döngüyü daha pratik bir sekilde yapmamızı sa˘ layan bir deyim bulunur. "w") >>> dosya.xml’. i¸imizi bitirdikten sonra dosyayı kapats ¸ s maktır. s with deyiminin en önemli özelli˘ i.. dosya.üçüncü satır 15..") s Traceback (most recent call last): File "<stdin>". Dosya açık oldu˘ u için üzerinde i¸lem yapmaya devam edebiliriz: g s >>> dosya. O yüzden bu tür durumları önlemek için açılan gs s dosyayı i¸lem sonunda kapatmamız gerekir... dosyayı yazma kipinde açmadı˘ ımız için dosyaya veri yazdırmamız mümkün g g olmuyor.9 with Deyimi Dosyalarla çalı¸ırken asla unutmamamız gereken sey. açılan dosyayı mutlaka kapatmasıdır. with deyimidir.. Dosya üzerinde gerekli de˘ i¸iklikleri yapıyoruz. s gs s hem de dosyayı kapatmı¸ olduk. with deyimini yukarıdaki söyle uygulayabiliriz: ¸ >>> with open("dosya_adı". Dosyayı açıyoruz. 2. yaptı˘ ımız g s g de˘ i¸ikliklerin hepsi dosyaya i¸lenmeyebilir. Bu durumu dosya de˘ i¸kenini g gs ekrana yazdırarak teyit ettik.. gs 3.") s Bu iki satırlık kod sayesinde dosyamızı hem açmı¸. s gs Normal sartlar altında bir dosya üzerinde çalı¸ma döngüsü söyle i¸ler: ¸ s ¸ s >>> dosya = open("dosya_adı". Yani dosya üzerinde g i¸lem yapılırken bir hata da olu¸sa o dosya ba¸arıyla kapatılacaktır. Bu ¸ g deyim.write("bir takım ¸eyler..read() ’varolan içerik.. ˙simiz bitince dosyayı kapatıyoruz. line 2.’ . dosyayı henüz kapatmadı˘ ımız için dosyamız hala açık. in <module> IOError: File not open for writing >>> dosya <open file ’write_it.close() Burada söyle bir yol izliyoruz: ¸ 1..") s >>> dosya. Bu durumu daha net s s s anlamak için söyle bir örnek verelim: ¸ >>> dosya = open("falanca") >>> dosya.

Artık dosya üzerinde herhangi bir i¸lem yapmamız mümkün de˘ il: s g >>> dosya. Burada aynı zamanda PyGTK adlı arayüz takımına ili¸kin Türkçe bilgi s s de verilmektedir..read() Traceback (most recent call last): File "<stdin>". kapalı bir dosya üzerinde i¸lem yapmaya çalı¸tı˘ ımız konusunda nazikçe uyarıyor. Mesela s yazdı˘ ınız program bir dosyaya bakıp içinde o satırın geçip geçmedi˘ ini tespit edebilmeli. bu siteye ili¸kin son geli¸meler ve duyurular s s hakkında ayrıntılı bilgiye de eri¸ebilirsiniz. os. dosya her seye ra˘ men g s g ¸ g kapanıyor. Python ile olu¸turdu˘ unuz veya açtı˘ ınız herhangi bir dosyayla i¸iniz bittikten sonra e˘ er s g g s g bu dosyayı close() fonksiyonu ile kapatmazsanız ne gibi sonuçlarla kar¸ıla¸ırsınız? Açtı˘ ınız s s g dosyayı kapatmadan. Python yardımıyla... line 2. içeri˘ i ve görünü¸ü a¸a˘ ıdaki gibi olan. varolan dosyayı sa˘ tık > sil yolunu takip ederek silmeye çalı¸tı˘ ınızda g s g i¸letim sisteminiz nasıl bir tepki veriyor? s 4. s s g 15. E˘ er g g g ilgili satır dosyada yoksa o satırı dosyaya eklemeli.write("bir takım ¸eyler.") s Traceback (most recent call last): File "<stdin>". aksi halde herhangi bir i¸lem yapmadan s programı sonlandırmalı.path.. dosyaya yazma i¸lemi sırasında hata aldı˘ ımız halde. Günlük ise konu çe¸itlili˘ i açısından daha esnek bir bölüm olarak s g tasarlandı.. Bir PDF belgesinin herhangi bir sayfasını kesip ayrı bir PDF belgesi olu¸turan bir program s yazın.html adlı bir belge olu¸g s s g s turun: istihza.. 6. programınız dosyanın PDF biçiminde olmadı˘ ı konusunda kullanıcıyı g uyarmalı. Olu¸turdu˘ unuz bu paragrafı daha sonra . Günlük bölümünden. . Bir dosyada belli bir satırın olup olmamasına göre i¸lem yapan bir program yazın. g s 5.com Hakkında istihza. Kullanıcıdan aldı˘ ı birtakım bilgiler do˘ rultusunda anlamlı bir paragraf olu¸turabilen bir prog g s gram yazın..xml’.. Python programlama dili ve Tkinter için bir Türkçe kaynak olu¸turma s çalı¸masıdır. istihza.abspath() fonksiyonunun yaptı˘ ı i¸i taklit eden bir fonksiyon yazın. Bu program sadece PDF belgeleri üzerinde i¸lem yapmalı. dosya.Bir de suna bakalım: ¸ >>> with open("falanca") as dosya: . in <module> IOError: File not open for writing >>> dosya <closed file ’write_it. mode ’r’ at 0x00F5B5A0> Gördü˘ ünüz gibi. s 2.10 Bölüm Soruları 1.com. 3. in <module> ValueError: I/O operation on closed file Python bizi. line 1. E˘ er kullanıcı PDF dı¸ı s g s bir dosya adı belirtirse.html uzantılı bir dosya halinde kaydedip. s g sistemdeki öntanımlı internet tarayıcısı yardımıyla kullanıcıya gösterin.

Zira karakter dizileri s s g Python’ın en önemli konularından biridir. Ancak karakter dizileri konusunda henüz görmedi˘ imiz. g 16. tırnak içinde gösterebilece˘ imiz her sey bir karakter dizisidir. Bu bölümde. Gerçi biz su ana kadar karakter dizilerine ili¸kin ¸ s epey sey ö˘ rendik. Bir de suna bakın: ¸ >>> type("elma") <type ’str’> 219 . ˙ Isterseniz bu durumu teyit edelim: >>> type(elma) Traceback (most recent call last): File "<stdin>". line 1. ama görmemiz ¸ g g gereken pek çok sey de var. Python’da bir karakter dizisi tanımlamak için çok özel bir i¸lem yapmanıza g s gerek yok.BÖLÜM 16 Karakter Dizileri Dikkat ettiyseniz ilk dersten bu yana sürekli olarak karakter dizileri ile ha¸ır ne¸ir oluyoruz. bir yandan da bu konu hakkında ö˘ renmemiz g s g gerekenleri ö˘ renmek. karakter dizilerini ve bunların metotlarını/fonksiyonlarını g derinlemesine inceleme fırsatı bulaca˘ ız. ˙ste bizim bu bölümde amacımız. in <module> NameError: name ’elma’ is not defined Gördü˘ ünüz gibi. “elma” kelimesini tırnak i¸aretleri içine almadı˘ ımızda (ve e˘ er daha önce g s g g elma adlı bir de˘ i¸ken de tanımlamamı¸sak) Python bize yukarıdaki gibi bir hata mesajı gs s gösterecektir. g ¸ Mesela su bir karakter dizisidir: ¸ >>> "elma" Gördü˘ ünüz gibi. s s Karakter dizileriyle bu kadar içli dı¸lı olmamız kesinlikle bo¸una de˘ il. karakter dizileri hakkında daha ¸ I¸ önce ö˘ rendiklerimizi bir yandan peki¸tirirken. Karakter dizisi olmasını istedi˘ iniz bir seyi tırnak içine aldı˘ ınız anda o artık bir g ¸ g karakter dizisidir.1 Karakter Dizisi Nedir? ˙ Isterseniz i¸e en ba¸ından ba¸layalım ve su soruyu soralım kendimize: “Karakter dizisi nedir?” s s s ¸ Kabaca tarif etmek gerekirse.

yazdı˘ ımız kodların düzgün çalı¸abilmesi açısından büyük önem ta¸ır. “Eee. Yani range() s fonksiyonundan gelen veri tipi sayıdır.txt". Burada elbette raw_input() fonksiyonundan gelen karakter dizisini dümdüz bir sekilde sayıya ¸ çevirmeye çalı¸mak iyi bir yöntem de˘ ildir. Peki bir veri tipinin karakter dizisi olup olmamasının ne önemi var? Python’da program yazarken elimizdeki herhangi bir verinin tipini bilmek son derece önemlidir.write(str(i)) Burada str() fonksiyonundan yararlanarak. Python’da karakter dizileri str kısaltmasıyla g gösteriliyor. "w") as f: for i in range(5): f. range() fonksiyonunun üretti˘ i sayıları birer karakg ter dizisine çevirdik ve ondan sonra bunları do˘ ruca dosyaya yazdırdık.txt". Belki bu bilgi su anda size pek fazla bir sey ifade etmemi¸ olag ¸ ¸ s bilir. sayi ** 2 g Bu kodlar çalı¸ma sırasında hata verecektir. g Aynı sekilde. ne olmu¸ yani?” s dedi˘ inizi duyar gibiyim. Ancak ileride nesne tabanlı programlama konusunu incelerken bunun ne kadar önemli bir özellik oldu˘ unu anlayacaksınız. Yani o anda elimizde olan seyin mesela bir sayı mı yoksa karakter dizisi mi oldu˘ unu ¸ g bilmek.write(i) Bu kodlar çalı¸ma sırasında hata verecektir. raw_input()‘tan gelen karakter dizisini sayıya çevirdik. Dolayısıyla bu veri tipini do˘ rudan bu sekilde dosyaya g ¸ yazdıramazsınız.. Bu fonksiyondan gelen veri tipinin dosyaya yazdırılabilmesi için öncelikle karakter dizisine çevrilmesi gerekir: # -*.coding: utf-8 -*with open("sayilar. raw_input() fonksiyonu bize s g bir karakter dizisi verir.coding: utf-8 -*sayi = raw_input("Bir sayı girin: ") print "Girdi˘iniz sayının karesi: ". s g .Ama e˘ er “elma” kelimesini tırnak içine alırsak her sey bir anda de˘ i¸ir. Mesela su g s s ¸ örne˘ e bakalım: g # -*.coding: utf-8 -*sayi = raw_input("Bir sayı girin: ") print "Girdi˘iniz sayının karesi: ". mesela raw_input() fonksiyonu ile kullanıcıdan aldı˘ ınız verilerin tipinin de birer ¸ g karakter dizisi oldu˘ unu bilmek çok önemlidir. Simdilik biz yolumuza devam edelim. Python’da herhangi bir dönü¸türme i¸lemi yas g s s parken. "w") as f: for i in range(5): f. int(sayi) ** 2 g Burada int() fonksiyonunu kullanarak. g ¸ Yukarıdaki komutun çıktısından da anladı˘ ımız gibi. Bu ifade ˙ Ingilizce string (karakter dizisi) kelimesinin kısaltmasıdır. E˘ er biz bu fonksiyonla sayı almak istiyorsak. Çünkü range() fonksiyonu sayı üretir. Çünkü dedi˘ imiz gibi.. bu i¸lem sırasında bazı hataların da ortaya çıkabilece˘ ini hesaba katmamız gerekir.coding: utf-8 -*with open("sayilar. E˘ er bunu bilmezseniz söyle bir kod yazma g g ¸ hatasına dü¸ebilirsiniz: s # -*. Bu i¸lemi yaptı˘ ımız g ¸ gs s g anda artık “elma” kelimesi Python açısından bir karakter dizisidir. buradan gelen karakter g dizisini sayıya çevirmemiz gerekir: # -*.

coding: utf-8 -*def deger_hatasi(): return "Harf yerine sayı girmeyi deneyin!" def sifir_uyarisi(): return "0 dı¸ında bir sayı girin!" s sayi = raw_input("Bir sayı girin: ") if sayi == "0": print sifir_uyarisi() quit() try: n = int(sayi) print "Girdi˘iniz sayının karesi: ". Ama siz isterseniz bu g karakter dizisini tek veya üç tırnak i¸aretlerini kullanarak da tanımlayabilece˘ inizi biliyorsunuz. kuvvetini hesapladık. Python. Bu yüzden yukarıdaki gibi bir kod yazmamız gerekti˘ inde bu tür hatalara kar¸ı önlem almamız g s gerekir: # -*. E˘ er 12’nin 3.Mesela yukarıdaki örnekte kullanıcı sayı yerine bir harf girerse kodlarımız hata verecektir. karakter dizisi tanımlarken kullanabilece˘ imiz tırnak g tipleri konusunda bize birkaç farklı seçenek sunar. 2) 144 pow() fonksiyonu bir sayının istedi˘ imiz bir kuvvetini hesaplamamızı sa˘ lar. g s tırnak içinde gösterilmeleridir. n ** 2 g except ValueError: print deger_hatasi() Bu arada. çift tırnak veya üç tırnak i¸aretlerinden yararlanabiliriz. Karakter dizilerini tanımlarken tek tırnak. s g Hemen bir kaç örnek verelim: >>> "C Programlama Dili" >>> ’Guido Van Rossum’ >>> """Monty Python""" . 3) 1728 Yukarıdaki iki örnek sırasıyla sununla e¸de˘ erdir: 122 ve 123 ¸ s g 16. Python’da karakter dizilerini ba¸ka veri tiplerinden ayıran en önemli özellik. Örne˘ in: s g >>> kardiz = "elma" Biz yukarıda tanımladı˘ ımız elma karakter dizisini çift tırnak ile gösterdik. bir sayının karesini almak için Python’daki pow() adlı bir fonksiyondan da yararlanabiliriz: >>> print pow(12. Mesela yukarıg g daki örnekte biz 12 sayısının 2.2 Tırnak Tipleri Dedi˘ imiz gibi. kuvvetini hesaplamak g isteseydik söyle bir sey yazardık: ¸ ¸ >>> print pow(12.

Mesela “Python’ın s 3.x sürümleri" Burada kesme i¸aretinin karakter dizisini ba¸latan ve bitiren tırnak i¸aretleriyle karı¸masını s s s s önlemek için karakter dizisini tek tırnak yerine çift tırnak içinde gösterdik. g Python camiasında özellikle tek ve çift tırnaklar oldukça yaygın bir sekilde kullanılır. Mesela: #!/usr/bin/env python # -*. Ancak daha önceki derslerimizden edindi˘ imiz tecrübg eye göre. Ancak ¸ tek tırnak i¸areti karakter dizisi içinde geçen kesme i¸aretleriyle karı¸abilece˘ i için. Bu tür hataları önlemek için g izleyebilece˘ imiz birkaç farklı yol var: g >>> print "Python’ın 3. Programı ¸u s s parametreleri kullanarak çalı¸tırabilirsiniz: s . Ama e˘ er mutlaka tek tırnak kullanmak istersek kaçı¸ g s dizilerinden faydalanmamız gerekti˘ ini önceki derslerimizde de söylemi¸tik: g s >>> print ’Python\’ın 3. “Python’ın” kelimesi s içinde geçen kesme i¸areti karı¸ıklı˘ a sebep olacaktır: s s g >>> print ’Python’ın 3..x sürümleri” ifadesini bir karakter dizisi olarak tanımlamak istedi˘ imizde. Çünkü üç tırnak.coding: utf-8 -*def bir_fonksiyon(parametre): """Bu fonksiyonun herhangi bir i¸levi s yoktur. tek tırnak yerine çift tırnak i¸aretlerini kullanmak daha g s s pratik olabilir.x sürümleri’ Peki bu tırnak tiplerinden hangisini kullanmak daha iyidir? Cevap: Hangisi i¸inize geliyorsa! s Teknik olarak bu tırnak tiplerinden hangisini kullandı˘ ınızın hiç bir önemi yok. Örne˘ in karakter dizisi içinde bir kesme i¸areti varsa.1’e ho¸geldiniz.Bunların hepsi birer karakter dizisidir. Yazdı˘ ınız g g karakter dizisini tanımlamada hata vermedi˘ i sürece herhangi bir tırnak tipini kullanabilirsiniz. Örnek olsun diye verilmi¸tir. karakter g s dizisini tek tırnak i¸aretleri içinde göstermemiz bazı sorunlara yol açabilir.""" s pass Gördü˘ ünüz gibi. öteki tırnak tiplerinden farklı olarak bize birden fazla satıra bölünmü¸ s karakter dizilerini kolayca gösterme imkanı verir. birden fazla satıra bölünecek karakter dizilerini daha rahat bir sekilde ¸ olu¸turmamızı sa˘ ladı˘ ı için üç tırnak i¸aretlerini ço˘ unlukla belgelendirme dizilerini tanıms g g s g larken kullanır. e˘ er kaçı¸ s s s g g s dizileriyle de u˘ ra¸mak istemiyorsanız. Üç tırnak i¸areti ise genellikle karakter dizisi tanımlamada pek kullanılmaz.x sürümleri’ Yukarıdaki gibi bir kullanımın hataya yol açaca˘ ını biliyorsunuz..x sürümleri""" Bu kullanım da geçerli bir yoldur.coding: utf-8 -*print """\ Falanca v0. Dilerseniz bununla ilgili söyle bir örnek daha ¸ verelim: #!/usr/bin/env python # -*. kullanaca˘ ımız tırg g nak tipini belirlerken ifade içinde geçen kesme i¸aretini de dikkate almamız gerekir. s Python programcıları. burada üç tırnak i¸aretlerini belgelendirme dizisi olu¸turmak maksadıyla kulg s s landık. bir karakter dizisini tanımlarken kullanaca˘ ımız tırnak tipi konusunda bazı noktalara g da dikkat etmemiz gerekiyor. Çift tırnak yerine üç tırnak da kullanabiliriz: >>> print """Python’ın 3. E˘ er bu s g ifadeyi karakter dizisi olarak tanımlarken tek tırnak i¸aretlerini kullanırsak.

Ama tabii siz bu bo¸lu˘ u kendiniz de s s g ekleyebilirsiniz: >>> bosluk = " " >>> print ad + bosluk + soyad Fırat Özgül Bu yöntemi kullanarak söyle bir sey yazabilirsiniz mesela: ¸ ¸ >>> a = "" >>> for i in range(10): . a += str(i) . olu¸turdu˘ umuz bir listeye append() metodunu kullanarak yeni bir ö˘ e g s g g ekleyebildik. Ama mesela listeler böyle de˘ ildir. "kiraz"] Gördü˘ ünüz gibi.3 Karakter Dizilerini Birle¸ tirmek s Python’la programlama maceranızda karakter dizileri ile en sık yapaca˘ ınız i¸lemlerden biri de g s karakter dizilerini birbiriyle birle¸tirmek olacaktır... Listeler de˘ i¸tirilebilir (mugs g gs table) veri tipleri oldukları için listeler üzerinde de˘ i¸iklik yapabiliyoruz.append("kiraz") >>> print lst ["elma". Aynı çıktıyı tek veya çift tırnakla elde etmek oldukça güçtür. Ancak gördü˘ ünüz s s g gibi. karakter dizisini nasıl yazdıysak çıktı da aynı sekilde g ¸ görünüyor. >>> print a 0123456789 Python’da karakter dizileri “de˘ i¸tirilemeyen” (immutable) veri tipleridir. "muz". burada iki karakter dizisi arasında bo¸luk yok.. Yani karakter dizileri gs üzerinde de˘ i¸iklik yapılamaz.. "armut".-v -h -c """ sürüm numarasını görüntüler yardım belgesini görüntüler program yazarları hakkında bilgi verir def bir_fonksiyon(parametre): pass Gördü˘ ünüz gibi. Örne˘ in: g g .. 16. "armut". Ama karakter dizileri böyle de˘ ildir. üç tırnak sayesinde.. "muz"] >>> lst. Bir örnek verelim: gs >>> lst = ["elma". Python’da karakter dizilerini birle¸tirmenin s s birden fazla yöntemi var: >>> >>> >>> >>> ad = "Fırat" soyad = "Özgül" ad_soyad = ad + soyad print ad_soyad FıratÖzgül Burada basitçe “+” i¸lecinden yararlanarak iki karakter dizisini birle¸tirdik.

Ancak tabii ki özgün karakter dizisi yerli s gs s yerinde duruyor: >>> print kardiz elma Dedi˘ imiz gibi. Özgün karakter dizisi g gs hala “elma”. ama aslında dugs s rum öyle de˘ il: g >>> print kardiz elma Gördü˘ ünüz gibi. mpnca rı¸göknogtk zg s¸ph¸co s s s hgnkuük¸og ty¸gdkök ijbncöfj¸octj kng ücöjöcö çv fkn s s s wköfpwt.. de˘ i¸iklikleri özgün karakter dizisinin üzerine de yazabiliriz: g gs >>> kardiz = kardiz + "armut" >>> print kardiz elmaarmut Burada kardiz adlı karakter dizisini silip. Yukarıdaki örne˘ i su sekilde kısaltabilece˘ imizi biliyorsunuz: s s g ¸ ¸ g >>> kardiz += "armut" >>> print kardiz elmaarmut Gösterdi˘ imiz bu özelli˘ i daha karma¸ık bir örnek içinde kullanalım. s g s s s s trb fkbkokökö tcfg pnoctj. özgün karakter g gs dizisinin üzerine yazmamız veya de˘ i¸iklikleri farklı bir karakter dizisi içinde depolamamız gs gerekir. fpncajtjanc ügm çk¸ s s s sncü˘p¸ofc hgnkuük¸fkıkökb çk¸ saüipö vahvncoctj. Diyelim ki elinizde söyle g g s ¸ bir metin var: saüipö 1990 ajnjöfcö çv acöc çyaym çk¸ s üpsnvnvm üc¸c˘jöfcö hgnkuük¸kngö mjz¸cm zg fköcokm çk¸ fknfk¸.. yine “kardiz” adını ta¸ıyan ba¸ka bir karakter dizisi s s olu¸turmu¸ olduk.>>> kardiz = "elma" >>> kardiz + "armut" ’elmaarmut’ Burada sanki karakter dizisi üzerinde de˘ i¸iklik yapabilmi¸iz gibi görünüyor. ybg¸köfg g s s s s ike çk¸ fgıkukmnkm acsocac hg¸gm pnocfcö zgac myeym s s fgıkukmnkmng¸ng çcumc sncü˘p¸onc¸fc fc ecnjucçkngdgmük¸. özgün karakter dizisinde herhangi bir de˘ i¸iklik olmadı. höv/nkövx zg ocdpt x hkçk sgm epm ˘c¸mnj kungüko g s tktügok ybg¸köfg ecnjucçknogmügfk¸. Örne˘ in de˘ i¸iklikleri farklı bir karakter dizisinde depolamak için söyle bir sey yazg gs ¸ ¸ abiliriz: >>> kardiz2 = kardiz + "armut" >>> print kardiz2 elmaarmut Bu sekilde “elma” de˘ erini ta¸ıyan kardiz adlı karakter dizisi ile “armut” karakter dizisini ¸ g s kardiz2 adlı ba¸ka bir de˘ i¸kene atamı¸ olduk. s g s s s . E˘ er bir karakter dizisi üzerinde de˘ i¸iklik yapmak istersek.

satır sonlarında bir sonraki satıra geçerken problem ya¸amamak için g s karakter dizisini tanımlarken üç tırnak i¸aretlerinden yararlandık. "˘". Bunun için söyle bir kod ¸ ¸ yazmamız yeterli olacaktır: #!/usr/bin/env python # -*. sifrelenmi¸ metin içinde gördü˘ ümüz her harfin alfabedeki kar¸ılı˘ ını gösteriyor. "d". höv/nkövx zg ocdpt x hkçk sgm epm ˘c¸mnj kungüko g s tktügok ybg¸köfg ecnjucçknogmügfk¸. "v"} "c": "e": "˘": g "i": "l": "o": "r": "t": "v": "a". "¸". "ç".coding: utf-8 -*sifreli_metin = """saüipö 1990 ajnjöfcö çv acöc çyaym çk¸ s üpsnvnvm üc¸c˘jöfcö hgnkuük¸kngö mjz¸cm zg fköcokm çk¸ fknfk¸. ybg¸köfg g s s s s ike çk¸ fgıkukmnkm acsocac hg¸gm pnocfcö zgac myeym s s fgıkukmnkmng¸ng çcumc sncü˘p¸onc¸fc fc ecnjucçkngdgmük¸. "c". yukarıdaki sifreli metni rahatlıkla çözebiliriz.""" s g s s s sozluk = {"a": "ç": "f": "h": "j": "m": "ö": "s": "u": "y": "y". s g s s s s trb fkbkokökö tcfg pnoctj. Önce sifreli metnimizi bir karakter dizisi olarak tanımladık. Bildi˘ iniz gibi. s "ü". Aslında bu kodlarda söyle bir sey s g ¸ ¸ yapmı¸ olduk: s 1. "j". Ardından. Bus s ¸ s rada hangi harfin hangi harfe kar¸ılık geldi˘ ini gösteren söyle 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. "f". harf) print sifresiz_metin Burada karakter dizilerini nasıl birle¸tirdi˘ imize dikkat edin.Anlamsız harflerden olu¸mu¸ gibi görünen bu metin. fpncajtjanc ügm çk¸ s s s sncü˘p¸ofc hgnkuük¸fkıkökb çk¸ saüipö vahvncoctj. "p". mpnca rı¸göknogtk zg s¸ph¸co s s s hgnkuük¸og ty¸gdkök ijbncöfj¸octj kng ücöjöcö çv fkn s s s wköfpwt. "u". Türkçe bir metnin sifrelenmi¸ halidir. 3. sifresiz_metin = "" for harf in sifreli_metin: sifresiz_metin += sozluk. 2. "n". "g". "t". Yani ¸ s g s g mesela sifrelenmi¸ metin içindeki “˘ ” harfini “f” harfiyle de˘ i¸tirece˘ iz. "s". ¸ s g gs g Bu bilgileri kullanarak.get(harf. "k". "m". g "i". "e". "ö". "ı". sifreli metnin çözülmü¸ halini tutacak olan sifresiz_metin adlı karakter diz¸ s . birden s g fazla satıra yayılmı¸ uzun karakter dizilerini tanımlamanın en kolay yolu üç tırnak kullans maktır. "o". "r". "b". Daha sonra hangi harfin hangi harfe kar¸ılık geldi˘ ini gösteren tablomuzu bir sözlük haline s g getiriyoruz. "b": "d": "g": "ı": "k": "n": "p": "¸": s "ü": "z": "z". Uzun bir metinle kar¸ı kar¸ıya ¸ s s oldu˘ umuzdan. "h". "l".

Bu sözlükteki bütün g s anahtar-de˘ er çiftlerini ekrana dökmek için söyle bir sey yazabilirsiniz: g ¸ ¸ >>> for k.html/ Dedi˘ imiz gibi. Is os. "˙¸lemci: Is ". Python’da karakter dizilerini birle¸tirmek için elimizde çe¸itli alternatifler var. Dolayısıyla bu sözlük birtakım anahtar-de˘ er çiftlerinden olu¸ur.environ["COMPUTERNAME"] os. "Bilgisayar adı: ".” i¸aretiyle birle¸tirdi˘ imizde Python karakter dizileri g s s g arasına otomatik olarak bir bo¸luk yerle¸tiriyor.environ["USERNAME"] os. g 4. Simdi de sifreli_metin adlı karakter dizisi içindeki her bir karakteri. "Ev dizini: ".: Benzer bir örnek: http://www. karakter dizilerini ”. os.” i¸aretlerinden yararlandı˘ ımıza s s g dikkat edin. v Bu komutların çıktısı. Örne˘ in g s g yukarıdaki betik Windows kurulu bir bilgisayar üzerinde yazılmı¸tır.imizi tanımlıyoruz.coding: cp1254 -*import os print print print print print print "Kullanıcı adı: ". elimizdeki karakter dizisinin sadece bir bölümünü kullanmak isteyebiliriz.com/blog/this-modulu-icindeki-sifreli-metin.environ. elimizdeki bir karakter dizisinin tamamına ihtiyacımız olmayabilir.istihza. kullandı˘ ınız i¸letim sistemine göre bazı farklılıklar gösterebilir. Son olarak da sifresiz_metin adlı karakter dizisini ekrana yazdırıyoruz. sözlükteki kar¸ılık¸ s larına göre tek tek sifresiz_metin adlı karakter dizisine gönderiyoruz. 16. Yazdı˘ ımız g program açısından. Ayrıca bkz. E˘ er bu metodun nasıl kullanıldı˘ ına g g g ili¸kin süpheleriniz varsa Sözlükler bölümündeki get() metoduna bakabilirsiniz.environ aslında bir g g sözlüktür. Burada s s os modülünün environ adlı niteli˘ inden yararlandı˘ ımıza dikkat edin. Karaks s g ter dizilerini ”. b birinci karakter dizisi ikinci karakter dizisi Gördü˘ ünüz gibi. Dolayısıyla bu beti˘ in çıktısı s g GNU/Linux i¸letim sistemlerinde farklı olacaktır. print k. "˙¸lemci sayısı: ".environ["OS"] Bu betik yardımıyla kullanıcının i¸letim sistemine ili¸kin bazı bilgileri ekrana döktük.” i¸aretleriyle de birle¸tirebiliriz: s s >>> a = "birinci karakter dizisi" >>> b = "ikinci karakter dizisi" >>> print a.environ["PROCESSOR_IDENTIFIER"] os. Gelin isterseniz bununla ilgili olarak az çok s s i¸e yarar bir örnek verelim: s # -*.environ["NUMBER_OF_PROCESSORS"] os.items(): . Burada sözlüklerin get() adlı metodunu kullandı˘ ımıza dikkat edin. Bir sonraki adımda her bir karakteri birbiriyle birle¸tirip bu bo¸ karakter s s dizisi içine gönderece˘ iz... .4 Karakter Dizilerini Dilimlemek Bazı durumlarda. g s s Biz yukarıda “+” i¸lecini kullanarak karakter dizilerini nasıl birle¸tirebilece˘ imizi gördük. s ¸ 5. Is "˙¸letim sistemi:". v in os. s Yukarıdaki iki örnekte de karakter dizilerini birle¸tirmek için ”.environ["HOMEPATH"] os.

bu de˘ eri yazmasak da olur.. "Perl"..com" Diyelim ki biz bu karakter dizisinin ba¸ındaki http:// kısmını atmak istiyoruz.Elimizde söyle bir karakter dizisi oldu˘ unu varsayalım: ¸ g >>> url = "http://www. "PHP"] >>> print lst[0] Python >>> print lst[-1] PHP Bu yöntemi kullanarak. ”:” i¸aretinden g s g g s önce herhangi bir de˘ er belirtmezsek Python saymaya en ba¸tan ba¸layacak. "Ruby". karakter dizilerini dilim dilim bölebiliriz. Mesela: >>> kardiz = "Python" >>> print kardiz[0:4] Pyth >>> print kardiz[2:5] tho Gördü˘ ünüz gibi.istihza. g s g Böyle bir kullanımı listelerde ve demetlerde de görmü¸tük: s >>> lst = ["Python". bu yöntemle karakter dizilerinin istedi˘ imiz bir parçasını alabiliyoruz. Gelin g g bununla ilgili bazı denemeler yapalım: >>> kardiz = "Kahramanmara¸lı Abdullah" s >>> print kardiz[0:5] Kahra >>> print kardiz[:5] Kahra E˘ er ”:” i¸aretinden önceki de˘ erimiz 0 ise. sanki oraya 0 g s s . ˙ste bunun s I¸ için karakter dizilerinin “dilimleme” (slicing) özelli˘ inden faydalanabiliriz. Yukarıdaki örne˘ i g g dilimlemeden önce dilerseniz bir iki temel örnek üzerinden dilimlemenin ne demek oldu˘ unu g anlamaya çalı¸alım: s >>> kardiz = "elma" >>> print kardiz[0] e >>> print kardiz[1] l >>> print kardiz[-1] a Burada kardiz adlı karakter dizisinin ö˘ elerine tek tek nasıl ula¸abildi˘ imizi görüyorsunuz.

istihza.google. ba¸taki http:// kısmını gayet sık bir sekilde attık.org". karakterinden 15.istihza.com".com"] for i in url_list: print i[7:] Karakter dizilerinin dilimlenme özelli˘ inden yararlanarak yapabilecekleriniz bunlarla sınırlı g de˘ ildir elbette.coding: utf-8 -*url_list = ["http://www.com" Biraz önce gösterdi˘ imiz dilimleme yöntemini kullanarak bu karakter dizisinin en ba¸ındaki g s http:// kısmını ataca˘ ız: g >>> print url[7:] www. Yani g g g yukarıdaki kodu aslında söyle de yazabilirdik: ¸ >>> print kardiz[0:len(kardiz):3] Ph oaa l . "http://www.yazmı¸sınız gibi davranacaktır.com". Mesela: g >>> kardiz = "Python Programlama Dili" >>> print kardiz[2:15:2] to rgal Burada. karakter dizisinin 2.python...com Gördü˘ ünüz gibi. Bunu söyle bir örnek g s ¸ ¸ ¸ içinde kullanabiliriz: # -*. Bir s s g g de suna bakalım: ¸ >>> print kardiz[3:] ramanmara¸lı Abdullah s ”:” i¸aretinden sonraki de˘ eri yazmadı˘ ımızda ise karakter dizisinin sonuna kadar gidiliyor. s g g Yukarıdaki komut sununla e¸de˘ erdir: ¸ s g >>> print kardiz[3:len(kardiz)] Simdi isterseniz bu bölümün en ba¸ında verdi˘ imiz örne˘ e dönelim: ¸ s g g >>> url = "http://www. "http://www..yahoo. "http://www. karakterine kadar olan kısmı iki¸er iki¸er ats s layarak ekrana yazdırdık. Aynı karakter dizisinin ba¸ından sonuna kadar üçer üçer atlayarak s ilerlemek isteseydik söyle bir sey yazabilirdik: ¸ ¸ >>> print kardiz[::3] Ph oaa l Burada dilimleme özelli˘ inin varsayılan de˘ erlerinden yararlandı˘ ımıza dikkat ediyoruz.. Yani ”:” i¸aretinden önceki ö˘ enin varsayılan de˘ eri 0’dır.istihza.

coding: utf-8 -*url_list = ["http://www. ’__getattribute__’. ’replace’. ’__delattr__’. if "_" not in i: .. ’islower’. Python’da karakter dizilerinin bir hayli metodu varmı¸.. ’__mul__’.com"] for i in url_list: print "ftp" + i[10:] Bu örnekte. ’lstrip’.python. ’ljust’. ’center’. ’rsplit’. ’strip’. ’split’. ’isspace’.. "http://www... elbette çıktıyı istedi˘ iniz gibi biçimlendirmek sizin s g elinizde.) . ’__len__’. ’__le__’. ’rindex’. ’partition’. ’capitalize’. ’__new__’. ’__mod__’. E˘ er bu listeleme g s g biçimi gözünüze biraz karı¸ık göründüyse.yahoo. ’istitle’.” diyenlere teessüflerimi iletiyorum. ’__gt__’. ’__rmod__’. url_list içinde bulunan adreslerin ba¸ındaki http://www kısmını atarak yerlerine s ftp ifadesini getirdik. ’translate’. ’upper’. ’isdigit’. ’__getnewargs__’. ’__ne__’. ’find’. ’decode’..com". ’isupper’. print i Hatta kaç adet metot oldu˘ unu da merak ediyorsanız söyle bir yol izleyebilirsiniz.. "http://www.. ’__doc__’. ’isalnum’.google. ’__setattr__’. ’startswith’. ’__getitem__’. ’__contains__’. ’rpartition’.5 Karakter Dizilerinin Metotları Bu bölümde Python’daki karakter dizilerinin metotlarından söz edece˘ iz. ’__ge__’. ’index’. ’swapcase’. ’__hash__’.istihza. ’endswith’. ’__reduce__’. ’rjust’. 16. ’encode’. ’__lt__’. ’__rmul__’. ’isalpha’. "http://www. Mesela önceki bilgilerinizi de kullanıp söyle bir sey yaparak çıktıyı biraz daha okunaklı hale ¸ ¸ getirebilirsiniz: >>> for i in dir(""): . ’__getslice__’. ’__reduce_ex__’. ’count’.. ’zfill’] Gördü˘ ünüz gibi. ’expandtabs’. ’splitlines’.com". ’rstrip’.org". ’title’.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 hakkında bir örnek daha vererek bu konuyu kapatalım: # -*. ’__init__’... ’__eq__’. (“Elle tek g ¸ tek sayarım. ’__repr__’. ’rfind’. ’lower’. ’__class__’.. ’join’. print i [’__add__’. ’__str__’. Su halde isterseniz g ¸ gelin Python’un bize hangi metotları sundu˘ unu topluca görelim: g >>> for i in dir(str): .

upper() metodu Küçük harflerden olu¸an bir karakter dizisi içindeki bütün harfleri büyütür. title() metodu Karakter dizisi içinde geçen her bir kelimenin ilk harfini büyütür.>>> print len(dir("")) Simdi sıra geldi bu metotları incelemeye. "armut". s s ˙ olarak capitalize() metoduyla ba¸layalım. Örne˘ in: g g >>> "adana". "salata"] >>> for i in a: .. ¸ ˘ s 16.... s swapcase() metodu Karakter dizisi içindeki büyük harfleri küçük. Ilk s capitalize() Dedi˘ imiz gibi. "kebap". Bu metotların tanımlarını verdi˘ imize göre. s lower() metodu Büyük harflerden olu¸an bir karakter dizisi içindeki bütün harfleri küçültür.5. artık bunlarla ilgili örnekler yaparak bu metotların g tam olarak ne i¸e yaradıklarını anlamaya çalı¸abiliriz..capitalize() ’Adana’ Yalnız burada dikkat etmemiz gereken bir nokta var: Bu metot yardımıyla birden fazla kelime içeren karakter dizilerinin sadece ilk kelimesinin ilk harfini büyütebiliyoruz: >>> a = "lütfen parolanızı giriniz" >>> print a..1 Büyük-Küçük Harf Degi¸ tirme Python’da karakter dizilerinin büyük-küçük harf durumlarını de˘ i¸tirmek için kullanabilegs ce˘ imiz be¸ farklı metot var.capitalize() Lütfen parolanızı giriniz Bu metodu kullanarak bir liste içindeki bütün karakter dizilerinin ilk harfini büyütebilirsiniz: >>> a = ["elma"..capitalize() ’Adana’ >>> kent = "adana" >>> kent. küçük harfleri büyük hale getirir. print i. capitalize() metodu bir karakter dizisinin ilk harfini büyütür. Elma Armut Kebap Salata .capitalize() .. Bu metotlar söyle sıralanabilir: g s ¸ capitalize() metodu Karakter dizilerinin ilk harfini büyütür.

anlatarak açıklamak zor oluyor. Sıra geldi upper() adlı metodu incelemeye. bir karaks g ter dizisinin o anda sahip oldu˘ u harflerin büyüklük ve küçüklük özellikleri arasında geçi¸ g s yapma imkanı sa˘ lıyor. e˘ er o anda bir harf büyükse.upper() ENFLASYON Gördü˘ ünüz gibi.title() Cumhurba¸kanlı˘ı Senfoni Orkestrası s g Burada dikkat ederseniz karakter dizisini tanımlarken karakter dizisinin en ba¸ına bir “u” harfi s getirdik. bu metodun ne yaptı˘ ını. bu metot yardımıyla tamamı küçük harflerg s g den olu¸an bir karakter dizisinin bütün harflerini büyütebiliyoruz. “enflasyon” kelimesinin bütün harflerini büyük harfe çevirdik. Bu metot bize. Bir-iki ders sonra bu harfin s tam olarak ne i¸e yaradı˘ ını gayet net bir sekilde ö˘ renece˘ iz. Gördü˘ ünüz g g gibi. O yüzden hemen birkaç örnek g yapalım: >>> a = "kebap" >>> a.swapcase() KEBAP >>> b = "KEBAP" >>> b. bu metot o harfi büyük harfe çeviriyor...swapcase() . Dilg g erseniz karakter dizisini “u” harfi olmadan tanımlamayı deneyip sonucun ne oldu˘ unu kendi g gözlerinizle görebilirsiniz. lower() metodu büyük harflerden olu¸an karakter dizilerini küçük harfli karakter dizilerine dönü¸türüyor: s s >>> a = "ARMUT" >>> a. e˘ er bu harf o anda küçükse. Hemen bir örnek verelim: s >>> "enflasyon". upper() Yukarıda yaptı˘ ımız tanımdan da anla¸ılaca˘ ı gibi.lower() armut swapcase() Bu ba¸lıkta inceleyece˘ imiz son metodumuzun adı swapcase(). title() metodu ise bir karakter dizisi içindeki bütün kelimelerin ilk harflerini büyütüyor: >>> a = u"cumhurba¸kanlı˘ı senfoni orkestrası" s g >>> print a. bu metodu kullandı˘ ımızda o harf g g g küçülüyor. Simdilik biz sadece bunun s g ¸ g g ¸ karakter dizisi içindeki Türkçe harflerin düzgün çıktı vermesini sa˘ ladı˘ ını bilelim yeter. g upper() metodunun bir de tersi vardır: lower() metodu. Esasında biz bu harfi önceki derslerimizde de görmü¸tük.title() capitalize() metoduna çok benzeyen bir ba¸ka metot ise title() adlı metottur. Yani. capitalize() s metodu bir karakter dizisi içinde geçen yalnızca ilk kelimenin ilk harfini büyütüyordu.

Bu s metotları söyle sıralayabiliriz: ¸ islower() Karakter dizisinin tamamen küçük harflerden olu¸up olu¸madı˘ ını sorgular s s g isupper() Karakter dizisinin tamamen büyük harflerden olu¸up olu¸madı˘ ını sorgular s s g istitle() Karakter dizisi içindeki kelimelerin ilk harflerinin büyük olup olmadı˘ ını sorgular g isspace() Karakter dizisinin tamamen bo¸luk karakterlerinden olu¸up olu¸madı˘ ını sorgular s s s g ˙ metodumuz olan islower() ile ba¸layalım.. Ilk s islower() Bir karakter dizisinin tamamen küçük harflerden olu¸up olu¸madı˘ ını sorgulamak için islower() s s g metodundan yararlanaca˘ ız.5. s A¸a˘ ıdaki örnekler ise False (yanlı¸) çıktısı verecektir: s g s ˙ >>> a = "Istanbul" >>> a.islower() False >>> b = "ADANA" >>> b.kebap >>> c = "KeBaP" >>> c.islower() False isupper() Bir karakter dizisinin tamamen büyük harflerden olu¸up olu¸madı˘ ını denetlemek için ise isups s g per() adlı ba¸ka bir metottan faydalanıyoruz: s . Mesela: g >>> kent = "istanbul" >>> kent.swapcase() kEbAp 16.2 Büyük-Küçük Harf ve Bo¸ luk Sorgulama s Yukarıda gösterdi˘ imiz sekilde karakter dizilerinin büyük-küçük harf durumlarını de˘ i¸tirebiliyg ¸ gs oruz.islower() True Demek ki kent de˘ i¸keninin de˘ eri olan karakter dizisi tamamen küçük harflerden olu¸uyorgs g s mu¸. Python bize aynı zamanda karakter dizilerinin büyük-küçük harf durumlarını sorgulama imkanı da veriyor. Bu sorgulama i¸lemleri için yine birtakım metotlardan yararlanıyoruz..

Aksi halde. aksi halde g g False çıktısı veriyor. Bu metot g g yardımıyla tamamı küçük harflerden olu¸an bir karakter dizisinin ilk harflerini büyütebiliyorduk.istitle() False Gördü˘ ünüz gibi.isspace() False >>> a = "" >>> a. bu metot True çıktısı verecektir.isupper() True >>> "istanbul".>>> a = "ADANA" >>> a. bir karakter dizisinin tamag men bo¸luk karakterlerinden olu¸up olu¸madı˘ ını kontrol ediyoruz.isspace() True >>> a = "selam!" >>> a. e˘ er karakter dizisinin ilk harfleri büyükse bu metot True çıktısı. isspace() Son olarak isspace() adlı bir metottan söz edece˘ iz. s ˙ste simdi ö˘ renece˘ imiz istitle() metodu da bir karakter dizisinin ilk harflerinin büyük olup I¸ ¸ g g olmadı˘ ını sorgulamamızı sa˘ layacak: g g >>> a = "Karakter Dizisi" >>> a.isspace() False " Son örnekten de gördü˘ ümüz gibi.istitle() True >>> b = "karakter dizisi" >>> b. E˘ er bir karakter dizisi s s s g g tamamen bo¸luk karakterinden olu¸uyorsa. bu metodun True çıktısı verebilmesi için karakter dizisi g içinde en az bir adet bo¸luk karakteri olması gerekiyor. s . alas s ca˘ ımız çıktı False olacaktır: g >>> a = " >>> a. Bu metot ile.isupper() False istitle() Hatırlarsanız daha önce ö˘ rendi˘ imiz metotlar arasında title() adlı bir metot vardı.

lower(). “¸ekerli çay” karakter dizisinin ilk harfi olan “¸”de herhangi bir de˘ i¸iklik olg s s gs madı.swapcase() #"¸eKeRlI ÇaY" vermeli. capitalize() ve swapcase() adlı metotları. içinde Türkçe karakterler geçen karakter dizilerini dönü¸türmede sorun çıkarabiliyor. S s ¸Ekerli çAy >>> a = "¸EkErLi çAy" s ˙ >>> print a. Bu problemi su sekilde ¸ ¸ a¸abiliriz: s >>> a = u"¸ekerli çay" s >>> print a. Halbuki capitalize() metodunun bu harfi büyütmesi gerekiyordu. g ¸ Aynı sorun öteki metotlar için de geçerlidir: >>> a = "¸ekerli çay" s ˙ >>> print a.capitalize() s ¸ekerli çay Gördü˘ ünüz gibi. S s ¸EKERLI çAY >>> print a.5. ilgili karakter dizisini unicode olarak tanımlayarak giderebiliriz: g >>> a = u"¸ekerli çay" s >>> print a.upper() #"¸EKERLI ÇAY" vermeli.title() S ¸ekerli Çay . title().capitalize() S ¸ekerli çay Burada “¸ekerli çay” karakter dizisini “unicode” olarak tanımladık. S s ¸eKeRlI çaY >>> a = "¸EKERL˙ ÇAY" S I >>> print a. Karakter g s ¸ s dizilerinin upper(). Böylece capitalize() metodu s bu karakter dizisinin ilk harfini do˘ ru bir sekilde büyütebildi. s S ¸ekerl˙ Çay I Yukarıdaki sorunların ço˘ unu.16.3 Metotlarda Türkçe Karakter Sorunu Yukarıda anlattı˘ ımız be¸ metodu kullanırken bir sey dikkatinizi çekmi¸ olmalı.title() #"¸ekerli Çay" vermeli. Mesela su örneklere s ¸ bir bakalım: >>> a = "¸ekerli çay" s >>> print a.lower() #"¸ekerli çay" vermeli.

de˘ il mi? Peki sizce neden böyle oldu? Evet.upper() S ¸EKERLI ÇAY >>> a = "¸EkErLi çAy" s >>> print a. kısa deg vre yapmasına yol açtı!.. Türkçe’deki “i” harfi hiçbir dönü¸ümde “˙ sonucunu vermez. s g Gelin isterseniz bu Türkçe sorunu ile ilgili bir örnek daha gösterelim: >>> c = "Gün Bugündür" >>> c. Simdi bunu düzeltmeyi ö˘ renece˘ iz. karakter dizisinin içinde Türkçe’ye özgü harfler oldu˘ u için metodumuz yanlı¸ g g s sonuç verdi. “i” harfini verecektir: g g >>> a = u"ISLIK" >>> print a.Ancak karakter dizisini unicode olarak tanımlamanın dahi i¸e yaramayaca˘ ı bir durum da s g vardır..istitle() False Halbuki sonucun True olması gerekiyordu. Örne˘ in Türkçe g karakterleri düzgün bir sekilde büyütebilen bir tr_upper() fonksiyonu tanımlayabilirsiniz: ¸ # -*. Ama önce isterseniz Türkçe karakterlerin ¸ g g bazen nasıl sonuçlar do˘ urabilece˘ ine bir örnek verelim: g g >>> d = "gün bugündür" >>> print d. Örne˘ in: s I” g >>> a = u"¸ekerli çay" s >>> print a. “i” harfinin büyük hali yanlı¸ bir sekilde “I” oluyor.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.upper() return kardiz.replace(i. Normalde title() metodunun ne yapması gerekti˘ ini biliyoruz: g .swapcase() S ¸eKeRlI ÇaY Gördü˘ ünüz gibi. title metodunun tamamen kontrolden çıkmasına.title() GüN BugüNdüR Gördü˘ ünüz gibi Türkçe karakterler. tahmin g etti˘ iniz gibi. lst[i])..lower() islik Bu sorunları çözebilmek için. kendi metotlarınızı icat etmeyi deneyebilirsiniz. Aynı biçimde “I” harfi de g s ¸ küçültüldü˘ ünde “ı” harfini de˘ il.upper() Buradaki replace() metodunu biraz sonra i¸leyece˘ iz....

programcının belirledi˘ i sayıda g g bo¸luk bırakarak karakter dizisini iki yana yaslar. Bunları söyle sıralayabiliriz: ¸ center() metodu Karakter dizilerinin sa˘ ında ve solunda. g Gelelim bu metotların tam olarak ne i¸e yaradı˘ ını ö˘ renmeye. Yani “istanbul” karakter dizisi bu 5 karakterlik bo¸lu˘ un tamamını s g . karakter dizisinin sola yaslang s masını sa˘ lar.istitle() True Burada karakter dizisini unicode olarak tanımladı˘ ımıza dikkat edin. bu metodun parantezi içine yazdı˘ ımız sayı karakter dizisinin sa˘ ında ve solg g g unda toplam ne kadar bo¸luk bırakılaca˘ ını gösteriyor. Yalnız burada önemli bir ayrıntıya dikkas g tinizi çekmek isterim. s center() Tanımında da söyledi˘ imiz gibi. s g ˘ 16.. g rjust() metodu Karakter dizilerinin solunda bo¸luk bırakarak. karakter dizisinin sa˘ a yaslans g masını sa˘ lar. s ljust() metodu Karakter dizilerinin sa˘ ında bo¸luk bırakarak. kimi harfleri ise küçük bıraktı! Bu durumu nasıl düzeltece˘ imizi biliyorsunuz: g >>> c = u"Gün Bugündür" >>> c. Bu defa metotların sorung suz i¸ledi˘ ini göreceksiniz.center(5) ’istanbul’ Gördü˘ ünüz gibi. Bunun g g s s nedeni. Öncelikle center() metoduns g g dan ba¸layalım. Gelin isterseniz buna küçük bir örnek verelim: >>> "a". Parantez içinde gösterilen 15 karakterlik bo¸lu˘ a karakter dizisinin kens g disi de dahildir. Peki bu ne anlama geliyor? Durumu hemen bir örnekle açıklamaya çalı¸alım: s >>> kardiz = "istanbul" >>> kardiz..>>> e = "armut bir meyvedir" >>> e. center() metodu bir karakter dizisini iki yana yaslamak için g kullanılır. Türkçe karakterler barındıran örnekte ise title() metodu karakter dizisi g içindeki kimi harfleri büyüttü.center(15) ’ a ’ Gördü˘ ünüz gibi. parantez içinde belirtti˘ imiz 5 sayısının “istanbul” karakter dizisi içindeki karakter g sayısından az olmasıdır. karakter dizisinin sa˘ ında ve solunda herhangi bir bo¸luk olu¸madı.5.title() ’Armut Bir Meyvedir’ Yukarıda gördü˘ ümüz.4 Saga-Sola Yaslama ˙slemleri I¸ Python’da karakter dizilerini sa˘ a-sola yaslama i¸lemleri için kullanabilece˘ imiz üç farklı metot g s g bulunur.

s g ¸ Dikkat ederseniz çıktıda toplam 15 karakter var. 8 tanesi “istanbul” karakter dizisini olu¸turan karakterler. "#") ’istanbul#######’ Son olarak rjust() metodunu inceleyelim. E˘ er karakter dizimiz.ljust(15) ’istanbul ’ Tıpkı center() metodunda oldu˘ u gibi. 15 harften olu¸saydı. Yani karakter dizilerini sa˘ a yaslar: g . g Gördü˘ ünüz gibi. rjust() Bu metot ljust()‘ın tersidir. Yani: g >>> kardiz.. ljust() Tanımında da belirtti˘ imiz gibi bu metot. “#” i¸aretini çıktıda gösterebilmek için s s parantez içinde en az 16 sayısını kullanmamız gerekirdi. Dolayısıyla karakter dizisinin sa˘ ında ve solunda bo¸luk olabilmesi g s için en az.ljust(15. Böyle bir durumda. “istanbul” karakter dizisi içinde 8 karakter bulundu˘ u için bizim en az 9 sayısını g kullanmamız gerekiyor: >>> kardiz. karakter g g s dizisinin sola yaslanmasını sa˘ lar: g >>> "istanbul". parantez içinde verdi˘ imiz s g g s g 15 sayısı hiç bir i¸e yaramayacaktı.zaten kendisi dolduruyor.center(9) ’ istanbul’ center() metodu bize.center(15. karakter dizisinin uzunlu˘ unun bir fazlasını vermemiz gerekiyor. asıl karakter dizisi (“istanbul”) + 7 adet “#” i¸areti = 15 adet karakter dizisinin yers le¸tirildi˘ ini görüyoruz. "#") ’####istanbul###’ Bu çıktı aslında center() metodunun nasıl çalı¸tı˘ ını çok daha net bir sekilde ortaya koyuyor.. Bunlardan dört tanesi bizim belirledi˘ imiz g “#” karakteri. bo¸luk yerine kendi belirledi˘ imiz bir karakteri yerle¸tirme imkanı da s g s verir: >>> "istanbul".center(len("istanbul") + 1) ’ istanbul’ Buna göre. 3 tanesi ise yine bizim s belirledi˘ imiz “#” karakteri.. parantez içinde belirtti˘ imiz sayı bırakılacak bo¸luktan ziyade.. karakter dizilerinin sa˘ ında bo¸luk bırakarak. Gelelim ljust() metoduna. bunun parametrelerini de istedi˘ imiz gibi düzenleyeg g biliriz: >>> "istanbul". Yani mesela yukarıdaki örne˘ i göz önüne g g alırsak. bir karakg g s ter dizisinin ne kadar yer kaplayaca˘ ını gösteriyor.

"Hadron". "Kongoni". "CentOS". "Puppy". "Mint".rjust(15. "Pardus". "Fedora".ljust(15)). "Arch". "Slackware". "Sabayon". "Debian". "Mepis". Bu sekilde söyle 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~~~~~ .>>> "istanbul". "PCLinuxOS". "Gentoo". "Mandriva". "Karoshi". Bu ö˘ eleri ekrana ortalamak için ise g g g g center() metodunu kullanabilece˘ imizi biliyorsunuz. "Truva".coding: utf-8 -*distro = ["Ubuntu". Bu kodları çalı¸tırdı˘ ımızda söyle 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 satırdaki ljust() metodu yerine rjust() metodunu kullanırsak aynı kodlar söyle 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 Gördü˘ ünüz gibi. "Yoper". "BackTrack". "Ututo". "DreamLinux". bu defa tablo ö˘ eleri sa˘ a yaslandı.center(15. "Knoppix". "#") ’#######istanbul’ Sa˘ a-sola yaslama i¸lemleri için kullanılan bu metotlar içinde özellikle ljust() ve rjust() epey g s i¸inize yarayacak. v in enumerate(distro): if k % 4 == 0: print print "%s"%(v. Mesela bu metotları kullanarak “tablovari” görünümler elde edebilirsiniz: s #!/usr/bin/env python # -*. "Gelecek". "Red Hat". "GnewSense". "Slax"] for k. "SuSe". Mesela son satırı söyle yazalım: g ¸ print "%s"%(v. "~")).

“replace” kelimesi ˙ Ingilizce’de “de˘ i¸tirmek.16. Bu metodu.replace("eski_karakter". O zaman söyle bir sey ¸ ¸ yapmamız gerekir: >>> karakter = "Adanalı istihza" >>> karakter_dgs = karakter. e˘ er :keyword‘print‘ deyimini g g kullanmazsak çıktıda bu harfler bozuk görünecektir.replace("a". Dolayısıyla anlamından da anla¸ılaca˘ ı gibi bu metot yardımıyla bir karakter s g dizisi içindeki karakterleri ba¸ka karakterlerle de˘ i¸tiriyoruz.5. "o") Kohromonmoro¸lı Abdulloh s Gördü˘ ünüz gibi. "") >>> print karakter_dgs Adnlı istihz . Burada normalde print deyimini kullanmasak da olur. rjust() gibi metotlar yardımıyla karakter dizilerinin sa˘ ını-solunu g g istedi˘ imiz karakterlerle doldurabiliyorduk.zfill(4) 0008 zfill() metodunun kullanımıyla ilgili söyle bir örnek verebiliriz: ¸ import time while True: for i in range(21): time. Karakter dizilerinin metotları arasında yer alan g zfill() adlı bir metot yardımıyla da bir karakter dizisinin soluna istedi˘ imiz sayıda “0” yerle¸tireg s biliriz: >>> a = "8" >>> a.replace("a".sleep(1) print str(i). ama karakter dizisi içinde Türkçe’ye özgü harfler oldu˘ u için.zfill(2) while i > 20: continue ˘ s 16. Metot su formül üzerine i¸ler: s gs ¸ s karakter_dizisi.6 Karakter Degi¸ tirme replace() Python’daki karakter dizisi metotları içinde belki de en çok i¸imize yarayacak metotlardan birisi s de bu replace() metodudur.5 Sıfırla Doldurma zfill() Yukarıda bahsetti˘ imiz ljust(). "yeni_karakter") Hemen bir örnek vererek durumu somutla¸tıralım: s >>> karakter = "Kahramanmara¸lı Abdullah" s >>> print karakter. replace() metodu yardımıyla karakter dizisi içindeki bütün “a” harflerini g kaldırıp yerlerine “o” harfini koyduk. yerine koymak” gibi gs anlamlara gelir. isterseniz bir karakteri silmek için de kullanabilirsiniz.5.

karakter dizisi içinde s g geçen harflerin kaç tanesinin de˘ i¸tirilece˘ ini belirleyebiliyoruz: gs g >>> karakter = "Adanalı istihza" >>> karakter_dgs = karakter.replace("a".. Bunlardan birincisi startswith() metodudur.5. Bahsetti˘ imiz üçüncü parametre yardımıyla.Burada bir karakteri silmek için içi bo¸ bir karakter dizisi olu¸turdu˘ umuza dikkat edin.. “Adanalı istihza” karakter dizisi içinde geçen “a” harflerinden 2 tanesini siliyoruz.. "c") g gs g dedi˘ imizde. "erik".startswith("e"): .startswith("c") False Görüldü˘ ü gibi e˘ er bir karakter dizisi parantez içinde belirtilen harf veya karakterle ba¸lıyorsa.. ’ilma’ ’irik’ ’iv’ ’ilbisi’ . Yani örne˘ in a. if i. a de˘ i¸keninin sakladı˘ ı karakter dizisi içinde ne kadar “b” harfi varsa bunların g gs g hepsi “c”ye dönü¸üyor. “a” harfi ile “A” harfinin Python’un gözünde birbirlerinden farklı iki karakterler oldu˘ unu unutg mayın. ˘ 16.. "ev".. 2) >>> print karakter_dgs Adnlı istihza Burada. "".7 Karakter Dizilerinin Ba¸ langıç ve Biti¸ Degerlerini Sorgulama s s Python’da karakter dizilerinin en ba¸ındaki ve en sonundaki karakterler üzerinde i¸lem yapas s bilmemizi sa˘ layan iki farklı metot bulunur. aksi halde ise “yanlı¸” anlamına gelen False çıktısını g s elde ediyoruz. "elbise". i. g startswith() Bu metot yardımıyla bir karakter dizisinin belirli bir harf veya karakterle ba¸layıp ba¸lamadı˘ ını s s g denetleyebiliyoruz. "karpuz". Bu metot sayesinde karakter dizilerini ilk harflerine göre sorgulayıp sonuca göre istedi˘ imiz g i¸lemleri yaptırabiliyoruz: s >>> liste = ["elma".. dizi içinde geçti˘ i her yerde de˘ i¸tiriyordu. g Dikkat ettiyseniz.replace("e". "armut". g g s yani bir karakter dizisinin ilk harfi veya karakteri parantez içinde belirtilen harf veya karakterse “do˘ ru” anlamına gelen True çıktısını. yukarıdaki formülde belirtmedi˘ imiz üçüncü bir parametresi daha vardır.startswith("e") True >>> b = "armut" >>> a. Örne˘ in: g >>> a = "elma" >>> a. yukarıdaki kod örneklerinde replace metodu karakter dizisi içindeki bir karakteri.. "kebap"] >>> for i in liste: . "i") .replace("b". s s g replace() metodunun.

endswith("a") True >>> b = "armut" >>> a.. I¸ g g Kullanımı startswith() metoduna çok benzer: >>> a = "elma" >>> a.. kd3.. s soru = raw_input("Bir karakter dizisi giriniz: ").. kd4: .endswith("!"): ..replace(" "..endswith("a") False Bu metot yardımıyla.count("a") 5 Demek ki “Sinan Pa¸a Pasajı” karakter dizisi içinde 5 adet “a” harfi varmı¸. cümle sonlarında bulunan istemedi˘ iniz karakterleri ayıklayabilirsiniz: g >>> >>> >>> >>> kd1 kd2 kd3 kd4 = = = = "ekmek elden su gölden!" "sakla samanı gelir zamanı!" "karga karga gak dedi. kd2.. s s Simdi bu metodun nerelerde kullanılabilece˘ ine ili¸kin bir örnek verelim: ¸ g s # -*-coding: utf-8 -*while True: #replace metodu ile karakter dizisi içindeki #bo¸lukları siliyoruz...5.." >>> for i in kd1.. print i..8 Karakter Dizilerini Sayma count() count() metodu bize bir karakter dizisi içinde bir karakterden kaç adet bulundu˘ unu g denetleme imkanı verecek.. bir karakter dizisinin hangi harfle ba¸ladı˘ ını denetliyors g duk. ˙ste bu endswith() metodu ile ise karakter dizisinin hangi harfle bitti˘ ini denetleyece˘ iz. if i. yukarıda anlattı˘ ımız startswith() metodunun yaptı˘ ı i¸in tam tersini yapıyor. ekmek elden su gölden sakla samanı gelir zamanı 16." "Vay vicdansızlar. g g s Hatırlarsanız startswith() metodu ile.. Lafı uzatmadan bir örnek verelim: >>> besiktas = "Sinan Pa¸a Pasajı" s >>> besiktas. g endswith() endswith(). "") .replace("!".Sizin bu metodu kullanarak daha faydalı kodlar yazaca˘ ınıza inanıyorum. "") .

g isalpha() Bir karakterin alfabetik olup olmadı˘ ını anlamak için Python’da isalpha() adlı bir metottan g yararlanabiliriz: >>> "a".9 Karakter Dizilerinin Niteligini Sorgulama Karakterleri üçe ayırarak inceleyebiliriz: 1. g s Söyle bir örnek vererek durumu biraz daha netle¸tirelim: ¸ s >>> for i in "abc234_?=*jkl": . b alfabetik bir karakter dizisidir... “j”. g 4 alfabetik bir karakter dizisi de˘ildir. “b”. g for i in ortak: print "%s harfinden = => %s tane" %(i. alfabetik karakterler 2. Sayılar ve “_?=*” gibi simgeler alfabetik de˘ ildir.. g g ˘ 16..#Kümeleri kullanarak.. nümerik karakterler 3. c alfabetik bir karakter dizisidir. kullanıcının girdi˘ i karakter dizisi içinde her bir harften kaç tane oldu˘ unu söylüyor.isalpha() False Demek ki 1 alfabetik bir karakter de˘ ilmi¸. if i. else: . Kodlarımız s bize.isalpha(): .. “e”.. 2 alfabetik bir karakter dizisi de˘ildir. Bir de suna bakalım: s ¸ >>> "1".5. g 3 alfabetik bir karakter dizisi de˘ildir.. alfabedeki harflerin ta kendisidir. vb. a alfabetik bir karakter dizisidir. print "%s alfabetik bir karakter dizisi de˘ildir"%i g .. adından da az çok anla¸ılaca˘ ı gibi. alfanümerik karakterler Alfabetik karakterler.count(i)) Yukarıdaki çalı¸mada kullanıcıdan herhangi bir karakter dizisi girmesini istiyoruz.. s g Mesela “a”. alfabetik bir karakter dizisi imi¸. soru. karakter dizisi içindeki #çift ö˘eleri teke indiriyoruz g ortak = set(soru) #ortak kümesi içindeki ö˘eleri karakter dizisi g #içinde kaçar adet geçti˘ini buluyoruz. print "%s alfabetik bir karakter dizisidir"%i ...isalpha() True Demek ki “a”. g .

” karakg teri). Mesela su örne˘ e bir bakalım: ¸ g >>> "˘". g dizisi de˘ildir. . birden fazla karakterden olu¸an dizilerin alfabetik olup olg s madı˘ ını da denetleyebiliriz.. “istihza kes g limesi alfabetiktir.isalpha() s True Gelelim “nümerik” karakterlere.” diyoruz.com".isalpha() g False Gördü˘ ünüz gibi._ ? = * 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 de˘ildir. Ancak burada dikkat edilmesi gereken bir nokta var. g dizisi de˘ildir. g dizisi de˘ildir. içinde Türkçe karakterler geçen bir karakter dizisinin alfabetik olup olmadı˘ ını g denetlerken bu karakter dizisini unicode olarak tanımlamayı unutmuyoruz: >>> "ı¸ık".isalpha() False “istihza.isalpha() s False Do˘ rusu söyle olacak: g ¸ >>> u"ı¸ık". isalpha() metodu Türkçe karakterleri do˘ ru de˘ erlendiremiyor. Bu sorunun g g g üstesinden gelmek için Türkçe karakter dizilerini unicode olarak tanımlamanız gerekir: >>> u"˘". o karakter dizisini olu¸turan bütün karakterlerin alfabetik olması gerekir. dizisidir. Örne˘ in: g g >>> "istihza". g dizisidir. Bir de suna bakalım: ¸ >>> "istihza.isalpha() g True Sadece tek bir karakterin de˘ il. . bu karakter dizisi alfabetik de˘ ildir. s Bu arada. dizisidir. . Tek bir alfabetik s olmayan karakter dizisi dahi i¸i bozar.isalpha() True Burada “istihza” karakter dizisi tamamen alfabetik karakterlerden olu¸tu˘ u için. Dolayısıyla bir karakter dizisinin alfabetik olabilmesi g için..com” karakter dizisi içinde alfabetik olmayan bir karakter bulundu˘ u için (”.

. . Örne˘ in 1.. . Yani bir karakter dizisinin nümerik olabilmesi için. . . isalnum() Alfanümerik karakterler. o karakter dizisinin nümerik olmamasına yol açacaktır.isdigit() False Alfabetik karakter dizilerindeki “ya hep ya hiç” kuralı nümerik karakter dizileri için de geçerlidir.isalnum() True Demek ki “a”. Buna göre. Tek bir nümerik olmayan karakter dahi. • Bütün nümerik karakterler de aynı zamanda birer alfanümerik karakterdir. s Buradan su sonuçları çıkarabiliriz: ¸ • Bütün alfabetik karakterler aynı zamanda birer alfanümerik karakterdir. Birden fazla karakterden olu¸an dizilerin durumuna da bakalım isterseniz: s . g Bir karakterin nümerik olup olmadı˘ ını isdigit() metodunu kullanarak denetleyebiliriz: g >>> "1". 5. Sıra geldi “alfanümerik” karakterlere. Bir karakterin alfanümerik olup olmadı˘ ını Python’daki isalnum() adlı metot yardımıyla g denetleyebiliriz. o karakter dizisini olu¸turan bütün karaks terlerin nümerik olması gerekir.isdigit() Nümerik karakterler alfabetik karakterlerin tersidir. alfanümerik bir karaktermi¸. . . sayıları temsil eden karakterlere nümerik adı verilir. s >>> "1". Dilerseniz bu açıklamaları birkaç örnekle taçlandıralım: >>> "a". alfabetik veya nümerik olan karakterlere alfanümerik s adı verilir. Tabii sadece alfabetik ve sadece nümerik karakterler barındıran diziler de aynı zamanda birer alfanümerik karakter dizisidir. 10. 2.isdigit True Ama: >>> "a". Tek bir karakter için konu¸mak gerekirse. 20 sayıları nümerik karakterlerdir. g s Yani içinde hem alfabetik hem de nümerik karakterler barındıran dizilere alfanümerik karakter dizileri adı verilir. yukarıda anlattı˘ ımız alfabetik ve nümerik karakterlerinin birle¸imidir. • Bütün alfanümerik karakterler aynı zamanda birer alfabetik karakter OLMAYAB˙ ˙ ILIR. • Bütün alfanümerik karakterler aynı zamanda birer nümerik karakter de OLMAYAB˙ ˙ ILIR.isalnum() True Demek ki 1 de alfanümerik bir karaktermi¸.

com".find("a") 0 Gördü˘ ünüz gibi.11 Karakter Konumu Bulma Python’da bir karakterin karakter dizisi içinde hangi konumda yer aldı˘ ını bulabilmek için dört g farklı metottan yararlanıyoruz. karakter dizisi içinde hangi konumda yer aldı˘ ını söylüyor bize: g >>> a = "armut" >>> a. s find() Bu metot. find() metodu yalnızca ilk “a” harfini gösterdi. . g s barındırdı˘ ı bütün karakterlerin alfanümerik olması gerekir. Bunlar find(). .isalnum() True >>> "istihza. “istihza. çıktıda yalnızca en soldaki karakter görünecektir: >>> b = "adana" >>> a. Bir karakter dizisinin alfanümerik olabilmesi için.>>> "abc124".find("a") 0 find() metodu karakter dizilerini soldan sa˘ a do˘ ru okur.expandtabs(10) elma bir meyvedir 16. çıktıda “-1” sonucu g g görünecektir: .com” karakter dizisi içindeki ”.5. Dolayısıyla e˘ er aradı˘ ımız karakter g g g g birden fazla sayıda bulunuyorsa. index() ve rindex() metotlarıdır.5.10 Sekme Bo¸ luklarını Geni¸ letme s s expandtabs() expandtabs() adlı bir metot yardımıyla karakter dizileri içindeki sekme bo¸luklarını geni¸letes s biliyoruz: Örne˘ in: g >>> a = "elma\tbir\tmeyvedir" >>> print a. g E˘ er aradı˘ ımız karakter. o karakter dizisi içinde bulunmuyorsa.isalnum() False Gördü˘ ünüz gibi. g 16.” karakterinden ötürü karakter dizg imiz alfanümerik olma özelli˘ i ta¸ıyamıyor. Öncelikle find() metodundan ba¸layalım. rfind(). bir karakterin.

“a” harfini. 1.biti¸_noktası) s s Bir örnek verelim: >>> a = "adana" Burada normal bir sekilde “a” harfini arayalım: ¸ >>> a.find("aranacak_karakter". "a") s . 3) Bu arama yöntemi su sonucu verecektir: ¸ 2 Bu yöntemle. karakter dizisinin 1 ve 3. Bunun için söyle bir sey yazabilirsiniz: ¸ ¸ # -*. i)) final = set(lst) for o in final: if int(o) > -1: print o.find(harf. s ˙ Istersek söyle bir arama yöntemi de kullanabiliriz: ¸ >>> a.append(kardiz. Bu biçimin i¸leyi¸i.>>> c = "mersin" >>> c. Bunun için söyle bir sözdizimini kullanabiliriz: ¸ >>> "karakter_dizisi". harf): lst = [] for i in range(len(kardiz)): lst.coding: utf-8 -*def nerede(kardiz. Bizim örne˘ imizde “a” harfi kelimenin ba¸ında geçti˘ i için çıktıda “0” ifadesini görüyg s g oruz. o karakter dizisi içinde geçti˘ i g bütün konumları bulmanın bir yolu var mı? Elbette var.find("a") 0 Do˘ al olarak find() metodu karakter dizisi içinde ilk buldu˘ u “a” harfinin konumunu söyleyeg g cektir. konumlarında arıyoruz.ba¸langıç_noktası.find("t") -1 find() metodu bize aynı zamanda bir karakter dizisinin belli noktalarında arama yapma imkanı da sunar. s s daha önceki derslerimizde gördü˘ ümüz dilimleme i¸lemine benzer: g s >>> a[1:3] "da" Peki bir karakter dizisi içinde geçen herhangi bir karakterin. Demek ki bu karakter dizisi içinedeki ilk “a” harfi “0’ıncı” konumdaymı¸. Bu fonksiyonu söyle kullanıyoruz: ¸ nerede(u"kahramanmara¸".find("a".

s Peki bu index() metodunun find() metodundan farkı nedir? Hatırlarsanız find() metodu aradı˘ ımız karakteri bulamadı˘ ı zaman “-1” sonucunu veriyordu. g g index() metodu ise aranan karakteri bulamadı˘ ı zaman bir hata mesajı gösterir bize. 10) 9 Demek ki. rfind() metodu karakter dizisini sa˘ dan sola do˘ ru okudu˘ u için öncelikle en g g g g sondaki “a” harfini döndürdü. Bu metot yukarıda anlattı˘ ımız find() metodu ile aynı i¸i g s yapar. Mesela: g g >>> a. Tek farklı karakter dizilerini sa˘ dan sola do˘ ru okumasıdır. sırada yer alıyormu¸. i¸leyi¸i tam anlamıyla kavrayabilirsiniz. Mesela: g g >>> a = "adana" >>> a.. tıpkı find() metodunda oldu˘ u gibi. konuma göre arama olana˘ ı sunar: g g >>> b = "kahramanmara¸" s >>> b. index() Konum bulma i¸lemleri için kullanabilece˘ imiz üçüncü metodumuz olan index() metodu da s g yukarıda anlattı˘ ımız find() metoduna çok benzer.find("a") 0 rfind() metodu ise karakter dizilerini sa˘ dan sola do˘ ru okur. b de˘ i¸keninin tuttu˘ u karakter dizisinin 8 ve 10 numaralı konumları arasında “a” gs g harfi 9.. 8. "i") Bununla ilgili kendi kendinize bazı denemeler yaparak. s s rfind() Python’da karakter dizisi içindeki karakterlerin konumunu bulmak için kullanabilece˘ imiz ikinci g fonksiyonumuz rfind() fonksiyonudur.. Aynı sekilde “izmir” karakter dizisi içindeki “i” harflerinin konumunu sorgulays ¸ alım: nerede(u"izmir". g g find() metodu karakter dizilerini soldan sa˘ a do˘ ru okur..index("a". Örne˘ in: g g >>> c = "istanbul" >>> c.rfind("a") 4 Gördü˘ ünüz gibi.index("t") 2 Bu metot da bize. ˙ metot da aynı i¸i yapar: g Iki s >>> a = "istanbul" >>> a.index("m") .Böylece “kahramanmara¸” karakter dizisi içindeki “a” harflerinin hangi konumlarda yer aldı˘ ını s g bulmu¸ olduk..

Bu metot.rindex("a") 4 16. g Bu metodu açıklamak biraz zor ve kafa karı¸tırıcı olabilir.i. Mesela elimizde söyle bir ¸ liste olsun: >>> a = ["python". bu metodun ne i¸e yaradı˘ ını göstermeye çalı¸alım.join(a) Elde edece˘ imiz çıktı söyle olur: g ¸ L. “Linux” karakter dizisi içindeki bütün s g s karakterlerin arasına birer tane ”. in <module> ValueError: substring not found rindex() Konum bulma i¸lemlerinde kullanaca˘ ımız son metodumuz ise rindex() metodudur.n. O yüzden bu metodu hakkıyla ö˘ renmenizde büyük yarar var. O yüzden açıklama yerine do˘ rudan s g bir örnekle..".index("a") 0 >>> c. "php". Yani a. s g index() metodu ile aynıdır. s g s Söyle bir karakter dizimiz olsun: ¸ >>> a = "Linux" Simdi söyle bir i¸lem yapalım: ¸ ¸ s >>> ".Bu kodlar su çıktıyı verir: ¸ Traceback (most recent call last): File "<stdin>". Tabii ki.. Farkları.x Sanırım burada join() metodunun ne i¸ yaptı˘ ı anla¸ılıyor. line 1. "perl". g g index() metodunun ise soldan sa˘ a do˘ ru okumasıdır: g g >>> c = "adana" >>> c.” (nokta) koydu. rindex() metodunun karakter dizisini sa˘ dan sola do˘ ru. karakter dizisi metotları arasında bulunan en önemli ve en yaygın kullanılan metotlardan biridir. "Java"] Bu listenin ö˘ elerini tek bir karakter dizisine dönü¸türmek için su kodu kullanıyoruz: g s ¸ .u.join(a) L*i*n*u*x Dikkat ederseniz join() metodunun sözdizimi öteki metotlarınkinden biraz farklı.5.12 join() metodu join() metodu. "C++". nokta yerine ba¸ka karakterler de s kullanabiliriz: >>> "*". g gs ¸ Bu metot yardımıyla ayrıca listeleri de karakter dizisine çevirebiliriz.join("*") gibi bir sey yazmıyoruz. Bu metotta parantez içine do˘ rudan de˘ i¸kenin kendisi yazdık.

"istihza".join(yol) ’C:\\Program Files\\Python26’ Hatırlarsanız bu bölümün ba¸ında söyle bir örnek vermi¸tik: s ¸ s >>> a = "" >>> for i in range(10): ..sep. php. "Desktop"] >>> "/".join(yol) ’/home/istihza/Desktop/ >>> yol = ["C:".sep. "Desktop"] >>> os. php. ’C++’.. Mesela “Mods üller” konusunu anlatırken de görmü¸tük bu join() adlı metodu. a += str(i) .join(a) ’python. "Python26"] >>> os.>>> ". ’Java’] Hatırlarsanız biz bu metodu aslında daha önce de farklı yerlerde kullanmı¸tık.join(yol) ’C:\\Program Files\\Python26’ Bu kodları sırasıyla söyle de yazabilirdik: ¸ >>> yol = ["home".. "Python26"] >>> "\\".join(a) >>> print b python. C++. ’perl’. Orada bunu os. "Program Files".sep. perl. Java’ ˙ Istersek bu kodu bir de˘ i¸ken içinde depolayıp kalıcı hale de getirebiliriz: gs >>> b = ". ’php’. ". >>> print a . ¸ s >>> import os >>> yol = ["home". perl.join(yol) ’home/istihza/Desktop’ Veya: >>> yol = ["C:".. "istihza".. "Program Files".. ". Java En ba¸taki a adlı liste de böylece bozulmadan kalmı¸ olur: s s >>> print a [’python’.join() s seklinde kullanmı¸tık. C++.

s translate() metodu yardımıyla mesela sifreli mesajları çözebiliriz. m) Bu çıkarımın bizi bir yere götürmeyece˘ i açık.Bu örnek. s) “j” harfi “m” harfine göre 4 harf geride kalıyor (j. Bir örnek verelim. “p” harfine göre. s. t) ¸ “s” harfi “o” harfine göre 5 harf geride kalıyor (o.join([str(i) for i in range(10)]) ’0123456789’ Aynı seyi join() metodu ¸ Gördü˘ ünüz gibi.5. s) “j” harfi “m” harfine göre 4 harf geride kalıyor (j. 4 harf geride kalıyor (p. p. Ama hiç endi¸e etmeyin. k. m) Böylece karakterler arasındaki ili¸kiyi tespit etmi¸ olduk. “p” harfine göre. l. r. ö. 5 harf geride kalıyor (p.13 translate metodu Bu metot. Bu örnekteki söz dizimi size biraz tuhaf görünmü¸ g s s olabilir. r. k. s. zor s i¸leri halletmekte kullanılabilecek olması açısından da bir hayli faydalı bir metottur. g Elimizde söyle bir karakter dizisi olsun: ¸ "tbyksr çsn jücho elu gloglu" Bu sifreli mesajı çözmek için de söyle bir ipucumuz var diyelim: ¸ ¸ t = => p s = => o m = => j Elimizdeki ipucuna göre sifreli mesajdaki “t” harfinin kar¸ılı˘ ı “p” olacak. t) “s” harfi “o” harfine göre 4 harf geride kalıyor (o. p. Ne oldu˘ unu biliyoruz: g import string Python modülleri arasından string modülünü içe aktarıyoruz (import): metin = "tbyksr çsn jücho elu gloglu" Sifreli metnimizi bir de˘ i¸kene atayarak sabitliyoruz: ¸ gs kaynak= "defghijklmnoprstuvyzabc" hedef = "abcdefghijklmnoprstuvyz" . karakter dizisi metotları içindeki en karma¸ık metotlardan birisi olmakla birlikte. r. r. Yalnız bu metodu string mod¸ ülündeki maketrans() adlı fonksiyonla birlikte kullanaca˘ ız. s g yardımıyla çok daha verimli bir biçimde de yapabiliriz: >>> "". Liste Üreteçleri konusunu i¸lerken bu söz dizimini çok daha s s ayrıntılı bir sekilde inceleyece˘ iz. s. Simdi hemen bir metin düzenleyici s s ¸ açıp kodlarımızı yazmaya ba¸layabiliriz: s # -*. g s Peki ya alfabedeki Türkçe karakterleri yok sayarsak? Bir de öyle deneyelim: “t” harfi. l. ¸ g 16. Alfabetik olarak ¸ s g dü¸ünürsek: s “t” harfi.coding: utf8 -*- Bu satırı açıklamaya gerek yok. i¸imizi tek satırda hallettik. karakter dizilerinin nasıl birle¸tirilece˘ ini gösteriyordu. Çünkü harfler arasında ortak bir ili¸ki bulamadık.

Dikkat ederseniz.hedef) Burada ise.partition("an") (’ist’.maketrans(kaynak.coding: utf8 -*import string metin = "tbyksr çsn jücho elu gloglu" kaynak= "defghijklmnoprstuvyzabc" hedef = "abcdefghijklmnoprstuvyz" cevir = string..translate(cevir) Bu komut yardımıyla.) Dikkat edece˘ imiz bir ba¸ka ¸ g s nokta ise bunları yazarken Türkçe karakter kullanmamamız gerekti˘ idir: g cevir = string. Bu komut. yukarıda tanımladı˘ ımız harf kümeleri arasında bir çevrim i¸lemi ba¸latabilmek g s s için string modülünün maketrans() adlı fonksiyonundan yararlanıyoruz.Burada “kaynak”. “kaynak”taki harflere göre. parantez içinde gösterdi˘ imiz kaynak de˘ i¸kenini hedef de˘ i¸kenine çeviriyor.maketrans(kaynak.14 Karakter Dizilerini Parçalarına Ayırma Python’da karakter dizilerini parçalarına ayırmak için iki metottan yararlanaca˘ ız.hedef) soncevir = metin. yukarıda “cevir” olarak belirledi˘ imiz formülü. gibi.translate(cevir) print soncevir Bu programı komut satırından çalı¸tırdı˘ ınızda ne elde ettiniz? s g 16. “metin” adlı karakter dizig sine uyguluyoruz: print soncevir Bu komutla da son darbeyi vuruyoruz.. (d -> a. Önce partition() metoduna bakalım. her bir harf s dört sıra geride kalacak sekilde yazdık. Örne˘ in: g >>> a = "istanbul" >>> a. “hedef” ise alfabenin normal yapısını temsil ediyor. ’an’. aslında bu iki harf kümesi g gs gs arasında bir ili¸ki kuruyor. “hedef”teki harfleri. partition() Bu metot yardımıyla bir karakter dizisini belli bir ölçüte göre üçe bölüyoruz. Bunlar parg tition() ve rpartition() adlı metotlar. Bu i¸lem sonucunda kaynak ve hedef de˘ i¸kenleri arasındaki ili¸kiyi s s gs s gösteren bir formül elde etmi¸ olaca˘ ız: s g soncevir = metin. ’bul’) E˘ er partition() metoduna parantez içinde verdi˘ imiz ölçüt karakter dizisi içinde bulunmuyorsa g g su sonuçla kar¸ıla¸ırız: ¸ s s . sifreli metnin yapısını.5. e ->b. ¸ “kaynak” adlı de˘ i¸kende “d” harfinden ba¸lamamızın nedeni yukarıda ke¸fetti˘ imiz harflergs s s g arası ili¸kidir. Simdi bu komutlara topluca bir bakalım: ¸ # -*.

.rpartition("i") (’ist’. ’’) >>> b. g strip() Bu metot bir karakter dizisinin ba¸ında (solunda) ve sonunda (sa˘ ında) yer alan bo¸luk ve yeni s g s satır (\n) gibi karakterleri siler: >>> a = " bo¸luk " s >>> a. g g g g son “i” harfinden böldü karakter dizisini.partition("i") (’’. ölçütün karakter dizisi içinde bulunmadı˘ ı durumlarda da g farklı tepkiler verir: >>> b. Peki bu durumun ne gibi bir sonucu vardır? Hemen görelim: g >>> b = "istihza" >>> b. partition() metodu bo¸ karakter dizilerini sa˘ a do˘ ru yaslarken. rpartition() g s g g metodu sola do˘ ru yasladı. ’i’. ’hza’) rpartition() metodu ise. Simdi aynı i¸lemi g ¸ s rpartition() metodu ile yapalım: >>> b. ˙ Inceleyece˘ imiz ilk metot strip().partition("h") (’istanbul’. ’’. ’’.partition("g") (’istihza’. karakter dizisini sa˘ dan sola do˘ ru okudu˘ u için ilk “i” harfinden de˘ il.. ’stihza’) Gördü˘ ünüz gibi. partis tion() metodu karakter dizilerini soldan sa˘ a do˘ ru okur.15 Karakter Dizilerini Kırpma Python’da karakter dizilerini kırpmak için üç farklı metottan yararlanaca˘ ız. ’’.. partition() metodu karakter dizisini ilk “i” harfinden böldü. g rstrip() ve lstrip().>>> a = "istanbul" >>> a.rpartition("g") (’’. ’’) rpartition() rpartition() metodu da partition() metodu ile aynı i¸i yapar. rpartition() metodu ise sa˘ dan sola g g g do˘ ru. partition() ve rpartition() metotları. g 16. ’i’.5.strip() . ama yöntemi biraz farklıdır. ’istihza’) Gördü˘ ünüz gibi. Bunlar strip().

strip() ’bo¸luk’ s rstrip() rstrip() metodu bir karakter dizisinin sadece sonunda (sa˘ ında) yer alan bo¸luk ve yeni satır g s (\n) gibi karakterleri siler: >>> a = "bo¸luk " s >>> a. s split() Bu metot biraz join() metodunun yaptı˘ ı i¸i tersine çevirmeye benzer. karakter dizilerini bölmeye yarayan üç farklı metottan söz edece˘ iz. Hatırlarsanız join() g s metodu yardımıyla bir listenin ö˘ elerini karakter dizisi halinde sıralayabiliyorduk: g .lstrip() ’bo¸luk’ s 16.rstrip() ’bo¸luk’ s lstrip() lstrip() metodu ise bir karakter dizisinin sadece ba¸ında (solunda) yer alan bo¸luk ve yeni satır s s (\n) gibi karakterleri siler: >>> a = " bo¸luk" s >>> a. g g splitlines() Karakter dizisini satır sonlarından bölerek liste haline getirir.16 Karakter Dizilerini Bölme Bu bölümde. g g rsplit() Karakter dizisini sa˘ dan sola do˘ ru okuyarak liste haline getirir. Bunlar g split().’bo¸luk’ s >>> b = "bo¸luk\n" s >>> b. rsplit() ve splitlines(). split() Karakter dizisini soldan sa˘ a do˘ ru okuyarak liste haline getirir. Anlatmaya önce split() metodundan ba¸layalım.rstrip() ’bo¸luk’ s >>> b = "bo¸luk\n" s >>> b.lstrip() ’bo¸luk’ s >>> b = "\nbo¸luk" s >>> b.5.

split(". ’ SuSe’] Burada karakter dizisini. Pardus. Ubuntu.split(". "Pardus".split("P") [’’. virgüllerin oldu˘ u kısımlardan böldük. ’ Ubuntu’. ’rogramlama Dili’] Bu metotta ayrıca isterseniz ölçütün yanısıra ikinci bir parametre daha kullanabilirsiniz: >>> b = "Debian. ". 1) .". SuSe ˙ste split() metoduyla bu i¸lemi tersine çevirebiliriz: I¸ s >>> yeni = b. Ubuntu. ’ Pardus’. "Ubuntu". ’Programlama’. bo¸lukların oldu˘ u kısımlardan bölmeniz gerekir: g g s g >>> kardiz = "Python Programlama Dili" >>> kardiz.>>> a = ["Debian". Böylece 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 içinde virgül yoksa.") [’Python Programlama Dili’] Yukarıdaki gibi bir karakter dizisi ile kar¸ı kar¸ıya oldu˘ unuzda.split(" ") [’Python’.join(a) >>> print b Debian. SuSe" >>> c = b. ’ython ’. ’Dili’] Hatta e˘ er isterseniz karakter dizilerini belli harflerin oldu˘ u kısımlardan da bölebilirsiniz: g g >>> kardiz = "Python Programlama Dili" >>> kardiz. Pardus.") >>> print yeni [’Debian’. bu karakter dizisini virgüllerin s s g oldu˘ u kısımlardan de˘ il.split(". elbette split() metodunu yukarıdaki sekilde kullanmak g ¸ istedi˘ iniz seyi yerine getirmeyecektir: g ¸ >>> kardiz = "Python Programlama Dili" >>> kardiz. "SuSe"] >>> b = ".

¸ s Yukarıda tanımladı˘ ımız yeni adlı listeyle c adlı listenin uzunluklarını kar¸ıla¸tırarak durumu g s s daha net görebiliriz: >>> len(yeni) 4 >>> len(c) 2 Parantez içindeki “1” parametresini de˘ i¸tirerek kendi kendinize denemeler yapmanız metodu gs daha iyi anlamanıza yardımcı olacaktır. rsplit() metodu sa˘ dan sola do˘ ru okur. Bu örnekte ikisi arasındaki fark pek belli olmasa da. Bu metot yukarıda anlattı˘ ımız g g split() metoduna çok benzer. parantez içinde ”.". ’ Pardus.python. Ubuntu. SuSe’] Gördü˘ ünüz gibi.") [’www’. 1) >>> print orneksplit . Bunu su sekilde daha açık görebiliriz: ¸ ¸ >>> c[0] ’Debian’ >>> c[1] ’ Pardus. rsplit() Bu bölümde inceleyece˘ imiz ikinci metodumuzun adı rsplit().com" >>> a. g g rsplit() metodu sa˘ dan sola do˘ ru okuyor. Yani olu¸an listenin bir ö˘ esi Debian. ö˘ esi Pardus.>>> print c [’Debian’.split(". Çıktıyı dikkag tle inceledi˘ imizde split() metodunun bu parametre yardımıyla karakter dizisi içinde sadece bir g adet bölme i¸lemi yaptı˘ ını görüyoruz. Ubuntu. ’python’. ’quotaless’.rsplit(". Ubuntu. ’python’. SuSe’ Gördü˘ ünüz gibi listenin 0. Daha açık bir örnek verelim: g g >>> orneksplit = a. listenin 1.") [’www’. Tek bir farkla: split() metodu s karakter dizilerini soldan sa˘ a do˘ ru okurken. g g g Yani bu üçlü tek bir karakter dizisi seklinde tanımlanmı¸. ’com’] Burada “www. Suse üçlüsü. ö˘ esi Debian iken.quotaless. split() metodu soldan sa˘ a do˘ ru okurken. ’quotaless’.quotaless. öteki ö˘ esi de Pars g s g g dus.python. SuSe oldu.com” adlı karakter dizisini noktaların oldu˘ u kısımlardan g böldük. ’com’] >>> a. Önce g g g g söyle bir örnek verip bu iki metodun birbirine ne kadar benzedi˘ ini görelim: ¸ g >>> a = "www.split(". Hatta tamamen aynı i¸i yapar.” ölçütünün yanına bir adet “1” sayısı koyduk. Ubuntu.

com’.".org’. bölünen ö˘ eleri liste haline getirebiliyoruz: g >>> satir = "Tahir olmak da ayıp de˘il\nZühre olmak da" g >>> print satir.org’.google.python.quotaless’ splitlines() Bu bölümün son metodunun adı splitlines(). bu konuyu arada sırada tekrar etmenizi öneririm.istihza. 16.python.splitlines() ["Tahir olmak da ayıp de˘il"..yahoo. 1) >>> print ornekrsplit [’www..com’] . Bunlar encode ve decode metotları. splitlines() metodu karakter dizisini “\n” kaçı¸ dizisinin oldu˘ u yerden ikiye g s g böldü. Öyle de˘ il diyorsanız bir de suna ¸ g ¸ bakın: >>> orneksplit[0] ’www’ >>> ornekrsplit[0] ’www.com’.rsplit(".quotaless’. ’http://www.[’www’. Böylece karakter dizisi metotlarını bitirmi¸ olduk. ’http://www. ’http://www.com’] >>> ornekrsplit = a. ’python. ’https://google. Dikkat ederseniz metot listesi içindeki iki s metodu anlatmadık.com’] Bu listedeki ö˘ elerin ba¸ında bulunan http://www kısmını https:// ile de˘ i¸tirerek söyle bir g s gs ¸ liste elde edin: url_list = [’https://python. ’com’] Sanırım bu sekilde ikisi arasındaki fark daha belirgin oldu.com’. ’https://istihza.python.quotaless.6 Bölüm Soruları 1. Bunları unicode konusunu i¸lerken s anlatmak üzere simdilik bir kenara bırakıyoruz. ’Zühre olmak da’] g Gördü˘ ünüz gibi. bir karakter dizisini satır kesme noktalarından bölerek. Elinizde söyle bir liste var: ¸ url_list = [’http://www...com’. ¸ Bu konuyu iyice sindirebilmek için kendi kendinize bolca örnek ve denemeler yapmanızı. Bu metot yardımıyla. ’https://yahoo.

"Kongoni". "PCLinuxOS". v in enumerate(distro): if k % 4 == 0: print print "%s"%(v.Ancak beti˘ in yazımı sırasında hiç bir a¸amada ikinci bir liste olu¸turmayın. fpncajtjanc ügm çk¸ s s s sncü˘p¸ofc hgnkuük¸fkıkökb çk¸ saüipö vahvncoctj. "BackTrack". "C++"] >>> lst[3] = "C" >>> print lst ["Python". "˘". "Perl". "Perl". "Ruby". "Puppy". Siz de aynı sekilde Türkçe karakterleri s ¸ düzgün bir sekilde küçülten tr_lower() adlı bir fonksiyon tanımlayın. "g". "Yoper". Kullanıcı.ljust(15)). Bu bölümde söyle bir örnek verdi˘ imizi hatırlıyorsunuz: ¸ g #!/usr/bin/env python # -*. Konu anlatımı sırasında söyle bir örnek vermi¸tik: ¸ s #!/usr/bin/env python # -*. "c". "GnewSense". "Pardus". höv/nkövx zg ocdpt x hkçk sgm epm ˘c¸mnj kungüko g s tktügok ybg¸köfg ecnjucçknogmügfk¸. "Hadron". "b". "CentOS". "Sabayon". ˙slemlerinizi do˘ rug s s I¸ g dan url_list adlı liste üzerinde gerçekle¸tirin. "ç". s g s s s s trb fkbkokökö tcfg pnoctj. belirledi˘ i parolada karakg terler arasında bo¸luk bırakamamalı. "e". "Ruby". g 4. Bu ikisi arasındaki farkların ne oldu˘ unu açıklayın. "Mepis". "d".stdout. "Mandriva". "DreamLinux". g "i". "j". Türkçe karakterleri düzgün bir sekilde s g ¸ büyüten tr_upper() adlı bir fonksiyon tanımlamı¸tık. "f". "ı". sys modülünde anlattı˘ ımız sys. "Debian".""" s g s s s sozluk = {"a": "ç": "f": "h": "j": "m": "y". "Gentoo". "k". "Karoshi". "Ututo". Kullanıcıdan parola belirlemesini isteyen bir betik yazın. "Fedora". s Hatırlatma: Bir listenin ö˘ eleri üzerinde de˘ i¸iklik yapmak için su yolu izliyorduk: g gs ¸ >>> lst = ["Python".write() fonksiyonunu g g kullanarak yazın. "Slackware". "C"] 2. "Arch". "h". "Red Hat". "SuSe". “Metotlarda Türkçe Karakter Sorunu” ba¸lı˘ ı altında. "Knoppix". "Truva". ybg¸köfg g s s s s ike çk¸ fgıkukmnkm acsocac hg¸gm pnocfcö zgac myeym s s fgıkukmnkmng¸ng çcumc sncü˘p¸onc¸fc fc ecnjucçkngdgmük¸.coding: utf-8 -*distro = ["Ubuntu". "b": "d": "g": "ı": "k": "n": "z". "Slax"] for k. "c": "e": "˘": g "i": "l": "o": "a". s 5. ¸ 3. "l". Siz bu örne˘ i print yerine. . "Gelecek". "Mint".coding: utf-8 -*sifreli_metin = """saüipö 1990 ajnjöfcö çv acöc çyaym çk¸ s üpsnvnvm üc¸c˘jöfcö hgnkuük¸kngö mjz¸cm zg fköcokm çk¸ fknfk¸. "m". mpnca rı¸göknogtk zg s¸ph¸co s s s hgnkuük¸og ty¸gdkök ijbncöfj¸octj kng ücöjöcö çv fkn s s s wköfpwt.

"p". harf) print sifresiz_metin Siz simdi bu örne˘ i bir de join() metodunu kullanarak yazmayı deneyin. "¸". "v": "u". bu örne˘ i join() metodunu kullanarak s g g rahatlıkla yazmanızı sa˘ layacak bilgiyi birkaç bölüm sonra daha ayrıntılı bir sekilde edinece˘ iz. "r": "ö". çünkü. "p": "¸": s "ü": "z": "o". "t". g ¸ g ."ö": "s": "u": "y": "n". E˘ er yazamazsanız ¸ g g endi¸e etmeyin.get(harf. "r". "t": "s". daha önce de söyledi˘ imiz gibi. s "ü". "v"} sifresiz_metin = "" for harf in sifreli_metin: sifresiz_metin += sozluk.

. Konumuz “karakter dizilerinde biçim düzenleyiciler”.%s. daha önce sık sık kullandı˘ ımız. Yabancılar buna g “format modifiers” adı veriyor. s s g Bu arada. karakter dizisinin dı¸ında tek bir de˘ er var (“istihza”). yani “karakter dizisi” ifadesinin kısaltmasıdır. karakter dizisi içinde kullandı˘ ımız biçimlendirici sayısıyla. Biz s bunu daha önceki derslerimizde su sekilde kullanabilece˘ imizi görmü¸tük: ¸ ¸ g s >>> print "Benim adım %s" %"istihza" Burada “%” adlı biçim düzenleyiciyi “s” karakteriyle birlikte kullandık. biz daha önceki konularımızda biçim düzenleyicilerden yararlanmı¸tık. Çünkü bu kodlarda. karakter dizisinin dı¸ında bu biçimlendirig s cilere kar¸ılık gelen de˘ erlerin sayısının aynı olmasıdır. Dikkat ettiyseniz.com adresidir. soyadım %s" %"istihza" Traceback (most recent call last): File "<stdin>". Çünkü karakter dizisi içindeki iki adet “%s” ifadesine g kar¸ılık. Ama e˘ er de˘ er sayısı birden fazlaysa bu de˘ erleri bir “demet” (tuple) g g g 259 . karakter dizisi dı¸ında tek bir de˘ er varsa bunu parantez içinde belirts g memize gerek yok. olması gerekti˘ i gibi.. Python’da biçim düzenleyicileri kullanırken dikkat etmemiz gereken en önemli nokta. g s Dolayısıyla yabancısı oldu˘ umuz bir konu de˘ il bu." %(isim. dı¸arıda iki adet de˘ er var. Bu simge “%”dir. isim) s Bu defa herhangi bir hata mesajı almadık.BÖLÜM 17 Biçim Düzenleyiciler Bu bölümde. karakter g dizisi içindeki iki adet “%s” ifadesine kar¸ılık.. Bu ne demek oluyor? Hemen su örne˘ e s g ¸ g bakalım: >>> print "Benim adım %s. g g Python’da her türlü biçim düzenleme i¸lemi için tek bir simge bulunur. line 1. ancak ayrıntılı bir sekilde hiç incelemedi˘ imiz bir g ¸ g konudan söz edece˘ iz. Halbuki bizim söyle bir kod s s g ¸ yazmamız gerekiyordu: >>> isim = "istihza" >>> print "%s adlı ki¸inin mekanı www. Bu kodlardaki “s” karakteri ˙ Ingilizce “string”. Dedi˘ imiz gibi. in <module> TypeError: not enough arguments for format string Gördü˘ ünüz gibi bu kodlar hata verdi.. yukarıdaki örnek biçim düzenleyiciler hakkında bize önemli bir bilgi daha veriyor.

s s %15.” diyerek yolumuza devam edelim. Python’da farklı amaçlara hizmet eden... 17. Sayıların ba¸ında “%” i¸aretini göremeyece˘ iz. Daha önce de dedi˘ imiz gibi. print "%%s" %i . yani “karakter dizisi” kelimesinin g g kısaltmasıdır..1 Biçim Düzenlemede Kullanılan Karakterler Daha önce de dedi˘ imiz gibi... print "%%%s" %i .. Python’da biçim düzenleyici olarak kullanılan simge aynı zamanda “yüzde” g (%) anlamına da geliyor.... bunun gibi ba¸ka harfler de bulunur.. s s g Bir de söyle bir sey deneyelim: ¸ ¸ >>> for i in range(100): . %1. Gördü˘ ünüz gibi.. karakter dizilerini ya da karakter dizisine dönü¸türülebilen de˘ erleri tems g sil eder.. Aksi halde g yazdı˘ ımız kodlar hata verecektir.. “s” karakteri “string”. Yani aslında “%s” yapısı Python’da özel olarak karakter dizilerini temsil eder.. %10. Önce söyle bir sey deneyelim: ¸ ¸ >>> for i in range(100): . dı¸arıda buna g s kar¸ılık gelen de˘ erin bir karakter dizisi veya karakter dizisine çevrilebilecek bir de˘ er olması s g g gerek. Yani etraftaki Python programlarında yaygın olarak “%s” yapısını görürüz.. line 2.. Do˘ ru cevap su olmalıydı: g ¸ >>> for i in range(100): .... biçim düzenleyici karakterler içinde en yaygın kullanılanı “s” g harfidir ve bu harf. in <module> TypeError: not all arguments converted during string formatting Bu defa da hata mesajı aldık.. Burada “%” i¸aretini arka arkaya iki kez kullanarak bir adet “%” i¸areti elde ettik. g Yukarıdaki örneklerde “%” adlı biçim düzenleyiciyi “s” karakteriyle birlikte kullandık.. g ¸ g “Biraz sabır. Peki bu ne demek oluyor? Bir karakter dizisi içinde “%s” yapısını kullandı˘ ımızda. Traceback (most recent call last): File "<stdin>".. Ancak Python’da “%” adlı biçim düzenleyici ile birlikte kullanılabilecek tek harf “s” de˘ ildir... Yani bu de˘ erleri parantez içinde göstermeliyiz. gibi..olarak tanımlamamız gerekiyor. Bunun tam olarak ne demek oldu˘ unu biraz sonra daha net bir sekilde anlayaca˘ ız. g s g g . Yani üç adet “%” i¸aretini yan yana getirmi¸ ¸ s s olduk. Ancak Python’da “%” biçim düzenleyicisiyle birlikte kullanılabilecek tek karakter “s” de˘ ildir. O halde size söyle bir soru sorayım: Acaba 0’dan 100’e kadar olan ¸ sayıların ba¸ına birer “yüzde” i¸areti koyarak bu sayıları nasıl gösterirsiniz? %0. print "%s" %i . Daha sonra s s da normal bir sekilde “%s” biçimini kullandık.. Bu kodlar tabii ki sadece 0’dan 100’e kadar olan sayıları ekrana dökmekle yetinecektir. ˙ste bu g s I¸ kısımda bu harflerin neler oldu˘ unu ve bunların ne i¸e yaradı˘ ını inceleyece˘ iz. Esasında en yaygın çift de budur.

Python’da sayılar karakter dizisine çevrilebildi˘ i için “%s” gibi bir yapıyı hata almadan kullang abiliyoruz.5” sayısının ondalık kısmını çıktıda göstermiyor. line 1. not str Gördü˘ ünüz gibi bu defa hata aldık. “d” s harfinden hiç bir farkı yoktur. Çünkü “d” g harfi sadece tamsayıları temsil etme i¸levi görüyor.. Bu g g harfle birlikte karakter dizilerini kullanamayız. s g .17. Ama mesela söyle bir sey yapamayız: ¸ ¸ >>> print "¸ubat ayı bu yıl %d gün çekiyor" %"yirmi sekiz" S Traceback (most recent call last): File "<stdin>". 17. “d” harfi de sayıları g temsil eder. s 17. E˘ er g g g bu harfin kullanıldı˘ ı bir karakter dizisinde de˘ er olarak mesela bir kayan noktalı sayı (float) g g verirsek. “%d” ifadesi.1 “d” Harfi Yukarıda gördü˘ ümüz “s” harfi nasıl karakter dizilerini temsil ediyorsa." %(10. Peki yukarıdaki ifadeyi söyle de yazamaz s ¸ mıyız? >>> print "¸ubat ayı bu yıl %s gün çekiyor" %28 S Elbette yazabiliriz. ˙ Isterseniz küçük bir örnekle açıklamaya çalı¸alım durumu: s >>> print "¸ubat ayı bu yıl %d gün çekiyor" %28 S S ¸ubat ayı bu yıl 28 gün çekiyor. Bunun ne demek oldu˘ unu hemen bir örnekle g g görelim: >>> print "%d" %13. “d” harfi aslında tamsayı (integer) de˘ erleri temsil eder. in <module> TypeError: %d format: a number is required. 10) s g 10 sayısının sekizlik düzendeki kar¸ılı˘ı 12 sayısıdır. “13. Buna g ¸ uygun olarak da dı¸ tarafta “28” sayısını kullandık.3 “o” Harfi Bu harf “octal” (sekizlik) kelimesinin kısaltmasıdır. karakter dizisi içinde “%s” yerine bu defa “%d” gibi bir sey kullandık. bu de˘ er tamsayıya çevrilecektir.. Do˘ rusunu söylemek gerekirse. Örne˘ in: g >>> print "%i sayısının sekizlik düzendeki kar¸ılı˘ı %o sayısıdır. Bu kod da bize do˘ ru çıktı verecektir. Çünkü “d” harfi yalnızca sayı de˘ erleri temsil edebilir.2 “i” Harfi Bu harf de “integer”. yani “tamsayı” kelimesinin kısaltmasıdır.1. sekizlik düzens g deki sayıları temsil eder.5 13 Gördü˘ ünüz gibi. Adından da anla¸ılaca˘ ı gibi.1.1. Gördü˘ ünüz gibi. Kullanım ve i¸lev olarak. “s” harfi karakter dizilerini ve karakter dizisine çevrilebilen degerleri temsil eder. Çünkü daha önce de dedi˘ imiz g g ˘ gibi.

4 “x” Harfi Bu harf “hexadecimal”.7 “c” Harfi Bu harf de Python’daki önemli karakter dizisi biçimlendiricilerinden biridir.6 “f” Harfi Python’da karakter dizilerini biçimlendirirken “s” harfinden sonra en çok kullanılan harf “f” harfidir.1. s g Buradaki “x” küçük harf olarak kullanıldı˘ ında." %1. s E˘ er yukarıdaki komutun çıktısı sizi sa¸ırttıysa okumaya devam edin.." %(20. Bu harf ˙ Ingilizce’deki “float”. onaltılık düzende harfle gösterilen sayılar da g küçük harfle temsil edilecektir: >>> print "%i sayısının onaltılık düzendeki kar¸ılı˘ı %x sayısıdır...471000 TL olmu¸.4710 s Dolar 1. yani “kayan noktalı sayı” kelimesinin kısaltmasıdır. >>> print "Dolar %f TL olmu¸.1.. line 1..17. g g g 17. karakter dizileri içindeki kayan noktalı sayıları temsil etmek için kuls g lanılır. Biraz sonra bu çıktıyı g ¸ s istedi˘ imiz kıvama nasıl getirebilece˘ imizi inceleyece˘ iz.5 “X” Harfi Bu da tıpkı “x” harfinde oldu˘ u gibi. in <module> TypeError: %c requires int or char ." %(10.. Bu harf tek bir karakteri temsil eder: >>> print "%c" %"a" a Ama: >>> print "%c" %"istihza" Traceback (most recent call last): File "<stdin>"." %(10. onaltılık düzendeki sayıları temsil eder.1. Adından da anla¸ılaca˘ ı gibi. g harfle gösterilen onaltılık sayıları büyük harfle temsil etmesidir: >>> print "%i sayısının onaltılık düzendeki kar¸ılı˘ı %X sayısıdır. s g 17. Ancak bunun farkı. 10) s g 10 sayısının onaltılık düzendeki kar¸ılı˘ı a sayısıdır.1... 10) s g 10 sayısının onaltılık düzendeki kar¸ılı˘ı A sayısıdır. yani onaltılık düzendeki sayıları temsil eder: >>> print "%i sayısının onaltılık düzendeki kar¸ılı˘ı %x sayısıdır. 20) s g 20 sayısının onaltılık düzendeki kar¸ılı˘ı 14 sayısıdır. s g 17.

i) for i in range(32. ö˘ ede bir alt satıra geçecek sekilde ayarlamı¸ oluyoruz. g s ki tablo ekrana basıldıktan sonra bir satır fazladan bo¸luk olsun. ö˘ eyi bulurken liste sonuna kadar ula¸abilmek.. E˘ er isterseniz “c” harfini kullanarak bütün ASCII tablosunu ekrana dökebilirsiniz: g >>> for i in range(128): .rjust(8). ’37 = %’. "\n") satırının listenin hangi noktalarına “\n” karak¸ ¸ teri yerle¸tirdi˘ ini inceleyebilirsiniz: s g a = ["%s = %c" %(i.insert(i.. ’38 = &’.insert(i. 120. 128)] for i in range(0. 120. Ancak formül üretmeye ü¸enenler için deneme yanılma yöntemi daha cazip gelecektir! Burada amacımız listedeki her s 7. s g tabloya girecek karakterleri 8 karakterlik bir alan içinde sa˘ a yaslayarak ekrana döktük. ’35 = #’.. Karakter sayısı birden fazla g oldu˘ unda bu komut hata veriyor. g . "\n") for v in a: print v. ’33 = !’. ’34 = "’. "\n") print a Ayrıca 120 yerine farklı sayılar koyarak hangi sayının yetersiz kaldı˘ ını.. Burada yaptı˘ ımız sey su: g ¸ ¸ Öncelikle bir liste üreteci (list comprehension) kullanarak 32 ile 128 arasındaki sayılara kar¸ılık s gelen harfleri bir liste haline getiriyoruz.. g Son olarak da. Bu sayede listeyi her 7. ö˘ esinden sonra (yani 7. Ben burada bu sayıyı biraz yüksek tuttum.] Bu 127’ye kadar devam eder.. 7): a. karakter dizisi metotlarını i¸lerken gördü˘ ümüz “rjust()” adlı metot yardımıyla.. Ardından bu listenin her 6. "%s ==> %c" %(i.. 128)] for i in range(0. i) E˘ er bu ASCII tablosuna tam anlamıyla “tablovari” bir görünüm vermek isterseniz söyle bir sey g ¸ ¸ yazabilirsiniz: a = ["%s = %c" %(i. E˘ er olu¸an bu “a” adlı listeyi ekrana yazdırırsanız. E˘ er isterseniz yukarıdaki s g kodları su sekilde yazarak a...insert(i..Gördü˘ ünüz gibi. hangi sayının fazla g geldi˘ ini de inceleyebilirsiniz. “c” harfi sadece tek bir karakteri kabul ediyor. 120. for i g ¸ s in range(0. ’36 = $’. 7) satırı içindeki 120 sayısını deneme yanılma yoluyla bulabilirsiniz veya bu sayıyı tespit edebilmek için kendinizce bir formül de üretebilirsiniz. i) for i in range(32... g s liste ö˘ elerinin söyle bir biçime sahip oldu˘ unu görürsünüz: g ¸ g [’32 = ’. sıraya) bir adet “\n” karakteri yerle¸tiriyg s oruz. 7): a. g “c” harfinin bir ba¸ka özelli˘ i de ASCII tablosunda sayılara kar¸ılık gelen karakterleri de s g s gösterebilmesidir: >>> print "%c" %65 A ASCII tablosunda 65 sayısı “A” harfine kar¸ılık geldi˘ i için yukarıdaki komutun çıktısı “A” harfini s g gösteriyor.

v in stok.items() g satırı ile. "patates": 40} print "stok durumu:" for k. çıktıyı biraz biçimlendirerek kullanıcıya daha “temiz” bir bilgi sunmaktır: >>> mal = "elma" >>> print "Stokta %d KG %s kaldı!" %(stok["elma"]. g g gs Böylece sözlük içindeki anahtarlar “k” de˘ i¸kenine. Ancak aslında oldukça basittir. Son olarak da print "%s\t=\t%s KG"%(k. g Yukarıdaki örnekler. “%s” adlı karakter dizisi biçimlendiricisindeki “%” ve “%s” karakterleri arasına g ¸ .2. v) Burada öncelikle stok sözlü˘ ümüzü tanımladık. "patates": 40} Stokta kaç kilo elma kaldı˘ ını ö˘ renmek isteyen kullanıcıya bu bilgiyi su sekilde verebiliriz: g g ¸ ¸ >>> mal = "elma" >>> print stok[mal] 10 Ancak bundan daha iyisi... Örne˘ in söyle bir sözlük olsun elimizde: g ¸ >>> stok = {"elma": 10. "armut": 20. s 17.2 ˙leri Düzeyde Karakter Dizisi Biçimlendirme I Python’da karakter biçimlendirmenin amacı birtakım kodlar yardımıyla elde edilen verilerin istedi˘ imiz bir biçimde kullanıcıya sunulabilmesini sa˘ lamaktır. Mesela su örne˘ e bir bakalım: s ¸ g >>> print "Ben %(isim)s %(soyisim)s" %{"isim": "Fırat". Ancak isterseniz Python’daki karakter dizisi biçimlendiricilerini kullanarak daha karma¸ık s i¸lemler de yapabilirsiniz. "soyisim": "Özgül"} Buradaki yapı ilk anda gözünüze karma¸ık gelmi¸ olabilir. Burada meyve g ¸ adlarıyla meyve miktarları arasındaki mesafeyi biraz açmak için “\t” adlı kaçı¸ dizisinden yarars landı˘ ımıza dikkat edin. Üstes s lik bu yapı epey kullanı¸lıdır ve bazı durumlarda i¸lerinizi bir hayli kolayla¸tırabilir. yukarıda verdi˘ imiz örneklerde görüg nenden daha karma¸ık bir sözdizimi vardır. Burada s s s yaptı˘ ımız sey. mal) Stokta 10 KG elma kaldı! Ya da mevcut stokların genel durumu hakkında bilgi vermek için söyle bir yol tercih ede¸ bilirsiniz: stok = {"elma": 10. Daha sonra for k. "armut": 20. stok sözlü˘ ünün bütün ö˘ elerini teker teker “k” ve “v” adlı iki de˘ i¸kene atadık. karakter dizisi biçimlendirme kavramının en temel kullanımını göstermektedir. de˘ erler ise “v” de˘ i¸kenine atanmı¸ gs g gs s oldu.17. v in stok.1 Karakter Dizisi Biçimlendirmede Sözlükleri Kullanmak Aslında Python’daki karakter dizisi biçimlendiricilerinin...items(): print "%s\t=\t%s KG"%(k. Karakter biçimlendirme genel g g olarak karma¸ık verilerin son kullanıcı tarafından en kolay sekilde anla¸ılabilmesini sa˘ lamak s ¸ s g için kullanılır. v) satırıyla bu “k” ve “v” de˘ i¸kenlerini gs örne˘ in “elma = 10 KG” çıktısını verecek sekilde biçimlendirip ekrana yazdırdık.

.4710 s Dolar 1. "gun": u"Çar¸amba".40’ Burada yaptı˘ ımız sey. s "saat": "17:00"} print u"%(gun_sayi)s %(ay)s %(gun)s %(saat)s’da bulu¸alım!" %randevu s Tabii e˘ er isterseniz sözlü˘ ünüzü do˘ rudan karakter dizisini yazarken de tanımlayabilirsiniz: g g g #-*. Diyelim ki g g biz noktadan sonra sadece 2 basamak olsun istiyoruz: >>> "%. s 17." %1..400000’ Gördü˘ ünüz gibi.. Gördü˘ ünüz gibi.4710 oldu˘ u halde çıktıda elde etti˘ imiz s g g g sayı 1.4 ’1. "ay": "Ocak".. g Python’un bize sundu˘ u bu yapı karakter dizisi içindeki de˘ i¸kenlerin neler oldu˘ unu takip g gs g edebilmek açısından epey kullanı¸lı bir araçtır. Bir de su örne˘ e bakalım: s ¸ g . "gun": u"Çar¸amba".coding: utf-8 -*print u"%(gun_sayi)s %(ay)s %(gun)s %(saat)s’da bulu¸alım!" %{"gun_sayi": 13. s Bir de su örne˘ e bakalım: ¸ g #-*.2 Sayılarda Hassas Biçimlendirme Yukarıda “f” adlı biçimlendiriciden bahsederken hatırlarsanız söyle bir örnek vermi¸tik: ¸ s >>> print "Dolar %f TL olmu¸. Küçük bir örnekle ba¸layg g s alım: >>> "%f" %1.de˘ i¸ken adları yerle¸tirmekten ibarettir.coding: utf-8 -*randevu = {"gun_sayi": 13. noktadan sonra istedi˘ imizden daha fazla sayıda basamak var. Burada belirtti˘ imiz de˘ i¸ken adlarını daha sonra gs s g gs karakter dizisi dı¸ında bir sözlük olarak tanımlıyoruz.471000.4 ’1. Bu bölümde..2f" %1. s "ay": "Ocak".) ve istedi˘ imiz g ¸ s g basamak sayısını yerle¸tirmekten ibaret.2.. s "saat": "17:00"} Kodları bu sekilde yazdı˘ ımızda karakter dizisi dı¸ında “%” i¸aretinden sonra demet yerine ¸ g s s sözlük kullandı˘ ımıza dikkat edin.. s Burada karakter dizisinin dı¸ında belirtti˘ imiz sayı 1.471000 TL olmu¸. Ama e˘ er g g g g g arzu edersek bu çıktıyı ihtiyaçlarımıza göre biçimlendirme imkanına sahibiz.. Python’daki sayıları nasıl hassas biçimlendirece˘ imizi inceleyece˘ iz. “%” i¸areti ile “f” karakteri arasına bir adet nokta (. elde etti˘ imiz sayı tam istedi˘ imiz gibi de˘ il.

. bu özelli˘ i kayan noktalı sayıların yanısıra tamsayılara (integer) da uygulayag g biliyoruz. sayıların sol g g tarafını sıfırlarla dolduruyor..>>> "%. Bu yapının tam olarak ne i¸e yaradı˘ ını anlamak için farklı sayılarla denemeler s g yapmanızı tavsiye ederim. ”.3d" %i .3” ifadesinin yaptı˘ ı sey.3” ifadesi. “f” yerine “d” karakterini kullandı˘ ımızda ”....3 Sayıların Soluna Sıfır Eklemek Bir önceki bölümde “%s” i¸areti ile “f” harfi arasına özel ö˘ eler yerle¸tirerek yaptı˘ ımız sey s g s g ¸ “f” harfi dı¸ındaki karakterler üzerinde farklı bir etki do˘ urur.49876 Bugünkü dolar kuru: 001 Gördü˘ ünüz gibi.2. noktadan sonra sadece 3 basamaklık bir hassasiyet istedi˘ imizi g g gösteriyor.. daha önce karakter dizisi metotlarını i¸lerken ö˘ rendi˘ imiz zfill() metog s g g duna benzedi˘ ini farketmi¸sinizdir. çıktıda üç adet 0 yok. 000 001 .. Hatırlarsanız “f” harfi ile söyle bir sey yazabiliyorduk: ¸ ¸ >>> print "Bugünkü dolar kuru: %.zfill(3) .00’ Gördü˘ ünüz gibi.3d" %1. print "%.49876 Bugünkü dolar kuru: 1... 000 001 002 003 004 005 006 007 008 009 010 Yukarıdaki özelli˘ in.3” ifadesinin herhangi bir etkg s isi olmaz. ”. E˘ er sayı 3 veya daha fazla sayıda basamaktan olu¸uyorsa. E˘ er tamsayı normalde tek basamaklı g ¸ s g ise.2f" %5 ’5. bu ifade o tek basamaklı sayının soluna iki sıfır koyarak basamak sayısını 3’e tamamlar. toplam üç basamaklı bir tamsayı olu¸turmaktır. Aynı seyi zfill() metodunu kullanarak söyle yapıyorduk: g s ¸ ¸ >>> for i in range(11): .3f" %1. Burada dikkat ederseniz. Ama bir de su örne˘ e bakın: ¸ g >>> print "Bugünkü dolar kuru: %.499 Burada yazdı˘ ımız ”.3” gibi bir ifade.. Bu özelli˘ i söyle bir i¸ için kullanabilirsiniz: g ¸ s >>> for i in range(11): . Lafı dolandırıp kafa karı¸tırmak s g s yerine isterseniz basit bir örnek verelim. 17. print str(i).

"\n") for v in a: print "%8s" %v.. 128)] for i in range(0. satırı.rjust(8). 7): a.rjust(8). biçim düzenleyiciler yardımıyla da sa˘ layabiliriz: g s g a = ["%s = %c" %(i.. ˙ Isterseniz konuyu daha iyi anlayabilmek için daha basit bir örnek verelim: >>> for i in range(20): .insert(i. Aslında aynı etkiyi. 120. Daha önce bu metodu kullandı˘ ımız g g g söyle bir örnek vermi¸tik: ¸ s a = ["%s = %c" %(i. s Bu metot karakter dizilerini sa˘ a yaslamamızı sa˘ lıyordu.4 Karakter Dizilerini Hizalamak Hatırlarsanız karakter dizilerinin metotlarını incelerken rjust() adlı bir metottan bahsetmi¸tik. print "%2d" %i . Burada print v. i) for i in range(32...2.002 003 004 005 006 007 008 009 010 17. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 . 128)] for i in range(0. 120. "\n") for v in a: print v.. 7): a.insert(i.. i) for i in range(32. olu¸turdu˘ umuz tablodaki ö˘ elerin sa˘ a yaslanmasını s g g g sa˘ lamı¸tı.

Esasında Python’daki biçim düzenleyiciler bize bu i¸lemlerin her ikisini birlikte s yapma imkanı da tanır... Mesela: >>> print "merhaba %10s dünya" %"" merhaba dünya Buna benzer bir seyi kaçı¸ dizilerinden biri olan “\t” ile de yapabiliyoruz. print i ... print "%3. Bu defa sayılar normal bir sekilde sola yaslanmı¸ durumda.. ¸ s Yine bu biçimlendiricileri kullanarak karakter dizileri arasında belli sayıda bo¸luklar da bırakas bilirsiniz.. 17.17 18 19 Dikkat ederseniz burada 10’dan önceki sayılar sa˘ a yaslanmı¸ durumda..2d"%i . ¸ ¸ >>> for i in range(20): . 0 1 2 3 4 5 6 7 8 9 10 Farkı görüyorsunuz...3d" %i Karakter dizilerini hizalamak için ise söyle bir sey. Ancak “\t”yi kul¸ s landı˘ ımızda bo¸luk miktarının tam olarak ne kadar olaca˘ ını kestiremeyiz..5 Karakter Dizilerini Hem Hizalamak Hem de Sola Sıfır Eklemek Yukarıda karakter dizilerini nasıl hizalayaca˘ ımızı ve sol taraflarına nasıl sıfır ekleyebilece˘ imizi g g ayrı ayrı gördük. Hatırlarsanız bir karakter dizisinin sol tarafına sıfır eklemek için söyle ¸ bir sey yapıyorduk: ¸ >>> for i in range(11): .. Yukarıdaki kodları g s herhangi bir biçimlendirici içermeyecek sekilde yazarsanız farkı daha net görebilirsiniz: ¸ >>> for i in range(11): . print "%..2. Karakter dizisi g s g biçimlendiricileri ise bize bu konuda çok daha fazla kontrol imkanı verir. print "%2d" %i Karakter dizilerini hem hizalamak hem de sol taraflarına sıfır eklemek için de söyle bir sey ¸ ¸ yapıyoruz: >>> for i in range(11): ..

kiraz 2. Aslında burada söylenecek s birkaç sey daha olsa da yukarıdakilerin Python programları yazarken en çok ihtiyacınız olacak ¸ bilgiler oldu˘ unu gönül rahatlı˘ ıyla söyleyebiliriz. Böylece Python’daki önemli bir konuyu daha geride bırakmı¸ olduk. g Örne˘ in kullanıcının banka hesabında 1000 TL varsa.200 Bu i¸aret ve karakterlerin tam olarak nasıl bir etki olu¸turdu˘ unu daha iyi anlayabilmek için s s g kendi kendinize örnekler yapmanızı tavsiye ederim.. banka hesabında kaç TL’si oldu˘ unu soran bir program yazın. sonuç biraz farklı g olacaktır: >>> print "kur: %8..Gördü˘ ünüz gibi nokta i¸aretinden önce getirdi˘ imiz sayı karakter dizisinin hizalanma miktarını g s g gösterirken..3 Bölüm Soruları 1. Elimizde söyle bir liste var: ¸ stok = ["elma".. Bu program. E˘ er yukarıdaki örneklerde “f” adlı biçimlendirme karakterini kullanırsanız. programınız ekrana su bilgiyi basmalı: g ¸ bankada 001000 TL’niz var! (000657 $) . Kullanıcıya. g kullanıcıdan aldı˘ ı TL bilgisini dolara çevirerek 6 haneli bir sayı biçiminde ekrana basabilmeli. noktadan sonra getirdi˘ imiz sayı karakter dizisinin sol tarafına eklenecek sıfırların g sayısını gösteriyor. "kiraz"] Bu listede bulunan ö˘ eleri kullanarak su cümleyi kurun: g ¸ Stokta bulunan ürünler: elma. "armut". g g 17. armut.2 kur: 1.3f" %1.

Bu belge ve oradaki makale birbirini tamamlayıcı bilgiler g içermektedir. burada ise konunun ayrıntılarına inilmektedir. Bu liste içinde dünyadaki (hemen hemen) bütün dillere ait karakterler. unicode yüz binlerce karakteri temsil edebilir. simgeler.. s ˙ste biz bu makalede. Ancak ascii listesi sadece 128 karakterden ¸ olu¸urken. her yerde kar¸ımıza çıkan bu “ascii” ve “unicode” kavramlarını anlaI¸ s maya. “ü” ve “ı” gibi harfleri tanımayan bir karaks g ter kodlama biçimidir. Türkçe’ye özgü “¸”. len() Fonksiyonu ve ascii’nin Laneti adlı makalede anlatılanlarla birlikte de˘ erlendirilmelidir. s 270 .. bu kavramların Python’daki yerini ve Python’da ne sekilde kullanıldı˘ ını ö˘ renmeye ¸ g g çalı¸aca˘ ız. “˘ ”. karakter kodlarını gösteren büyük bir listeden ibarettir. hem de “unicode” ile ilgili ¸ s s çok kaba bir tarif verece˘ im: g “ascii”. s s Esasında “unicode”. vb. “unicode” ise Türkçe’ye özgü harflerle birlikte dünya üzerindeki pek çok dile ait harfleri de tanıyabilen karakter kodlama biçimlerini içeren. g g s O halde bu “ascii” ve “unicode” denen seylerin ne oldu˘ unu da merak etmi¸sinizdir. Söz konusu makalede temel düzeyde bilgiler verilmekte. yer alır. 18. harfler. s Yine sa˘ da solda Python’un unicode’yi destekledi˘ ine dair bir cümle de duymu¸ olmalısınız. unicode ve Python Not: Burada verilen bilgiler. ¸ g s Ben simdi size burada i¸in teknik kısmına bula¸madan hem “ascii”. “ç”. geli¸mi¸ bir sistemdir.BÖLÜM 18 ascii. “ö”. Aynı sekilde ascii de karakter kodlarını içeren bir listedir.1 Giri¸ s Orada burada mutlaka Python’un varsayılan kod çözücüsünün ascii oldu˘ una dair bir cümle g duymu¸sunuzdur. s g Önce ascii’den ba¸layalım.

bu karakterleri ve bunların kar¸ılı˘ ı olan sayıları bir araya s ¸ s g toplayan sistematik yapıya ise “karakter kümesi” (charset – character set) denir.. Dolayısıyla her üretici kendi ihtiyaçlarına g s g uygun olarak farklı bir karakter kümesi kullanıyordu. Burada chr() g g fonksiyonu ascii tablosundaki sayıların karakter kar¸ılıklarını görmemizi ve kullanabilmemizi s sa˘ lıyor.) g Bu bahsetti˘ imiz 128 karakteri içeren ascii tablosuna (yani “ascii karakter kümesine”) g http://www.. Bu ilk 33 sayı. “yeni satır” ve benzeri s s karakterleri temsil eder. Bu kelime “askii” seklinde telaffuz edilir. Biraz sonra bu g kavramı açıklayaca˘ ız. s g toplam 128 sayının (0’dan ba¸layarak) ilk 33 tanesi ekranda görünmeyen karakterlere s ayrılmı¸tır. Bu yüzden bu tablodaki karakterleri modern sistemler de kabul edecektir.. ¸ g g 1960’lı yıllara gelininceye kadar. Buradaki tablodan da görece˘ iniz gibi. ¸ ˙ sürümü 1963 yılında yayımlanan ascii 7-bitlik bir karakter kümesidir. “karakter kümesi” denen sey. Çünkü bunlar her biri bir sayıya kar¸ılık gelen s karakterleri bir arada sunan sistematik yapılardır. chr() fonksiyonundan da yararlanarak söyle bir sey yazabiliriz: ¸ ¸ >>> print "Merhaba" + chr(10) + "dünya" Merhaba dünya Gördü˘ ünüz gibi. g ba¸ka bir makinede filanca sayı ile temsil ediliyordu. ISO-8859. Ayrıca gördü˘ ünüz gibi. (E˘ er “7-bit” kavramı size yabancı ise okumaya devam edin. Dolayısıyla bu küme Ilk içinde toplam 27 = 128 adet karakter yer alabilir. ascii tablosu bugün için de geçerlidir. bir metnin “akı¸ını” belirleyen “sekme”. ekranda gördü˘ ümüz ¸ g g bütün harfler ve simgeler makine dilinde bir sayı ile temsil edilir. temelde belli g ¸ karakterlerle belli sayıları e¸le¸tiren bir tablodan ibarettir.. Her bir karaks ter bir sayıya kar¸ılık gelecek sekilde. gerçekten de “10” sayısı yeni bir satıra geçmemizi sa˘ ladı. “yazı yazmaya yarayan makineler” üreten her firma.. ˙ste bu her karakteri bir I¸ sayıyla temsil etme i¸lemine “karakter kodlama” (character encoding) adı verilir. herhangi bir makinede olu¸turulan bir metin ba¸ka bir makinede aynı sekilde s s ¸ görüntülenemiyordu. yani bu sistemle sadece 128 adet karakter kodlanabilir. vb. g Aynı tabloda “9” sayısının ise “sekme” karakterini temsil etti˘ ini görüyoruz. Çünkü örne˘ in “a” harfi bir makinede falanca sayı ile temsil edilirken. ¸ g g Bilgisayar bunu “a” harfi seklinde de˘ il. birer karakter kümesidir. “harf” ve “kelime” gibi kavramlar bir bilgisayar için hiçbir sey ifade etmez. Biraz sonra bu sistemleri daha detaylı bir sekilde inceledi˘ imizde tam olarak ne demek istedi˘ imizi gayet net anlayacaksınız. Örne˘ in ascii.asciitable. bugün kullandı˘ ımız bilgisayarların anladı˘ ı tek sey s s g g ¸ sayılardır. farklı karakterlerin farklı sayılarla temsil edildi˘ i karakter kümeleri kullanıyordu.com/ adresinden eri¸ebilirsiniz. g Python’da söyle bir sey yazma olana˘ ı sa˘ lıyor: ¸ ¸ g g Bu da bize . Hatta aynı üreticinin farklı model s makinelerinde dahi bir bütünlük sa˘ lanmı¸ de˘ ildi. Mesela Python’da.2 ascii Ne kadar geli¸mi¸ olurlarsa olsunlar. s s Mesela ascii tablosunda “10” sayısının “yeni satır” karakterini temsil etti˘ ini görüyoruz (O g tabloda “dec” sütununa bakın). ˙ste “ascii” bu “American Standard Code for Information I¸ Interchange” ifadesinin kısaltmasıdır. bir sayı olarak görür.... Örne˘ in ekranda gördü˘ ümüz “a” harfi özünde sadece bir sayıdan ibarettir. Dolayısıyla.. Yani mesela “karakter”. Bu da˘ ınıklı˘ ı önlemek ve “yazı makinelerinde” bir birlik sa˘ lamak için American Standards g g g Association (Amerikan Standartları Birli˘ i) tarafından American Standard Code for Information g Interchange (Bilgi Alı¸veri¸i için Amerikan Standart Kodu) adı altında bir standartla¸ma çalı¸s s s s ması yürütülmesine karar verildi. Bu karma¸ıklı˘ ın bir g s g sonucu olarak.18. g unicode..

E˘ er bu sütung daki sayılar size daha sevimli geliyorsa söyle bir yazım tarzı benimseyebilirsiniz: ¸ >>> print "Merhab\x61 dünya" .>>> print "Merhaba" + chr(9) + "dünya" Merhaba dünya Yukarıda yazdı˘ ımız kodları i¸leten Python. Python’un ekrana “141” yazdırg g mak istedi˘ imizi zannetmemesi için “\” kaçı¸ dizisini kullanarak.. 33’ten 128’e kadar olan kısımda ekrana basılabilen karakterler yer alıyor. Bunu elbette su sekilde yapabilece˘ inizi biliyorsunuz: g ¸ ¸ g >>> print "Merhab%s dünya" %chr(97) Dikkat ederseniz. Elbette bunu Python’da “\t” kaçı¸ g s s dizisini kullanarak da yapabilece˘ inizi biliyorsunuz... O g s g halde söyle bir kod yazmamız mümkün: ¸ >>> print "Merhab\141 dünya" Merhaba dünya Burada “141” sayısını do˘ rudan kullanmadı˘ ımıza dikkat edin. Tablodan g gördü˘ ümüz gibi. “Merhaba” ve “dünya” kelimeleri arasında bir sekg s melik bo¸luk bıraktı.. Tablodaki “oct” sütununu kontrol etti˘ imizde “a” harfinin “141” sayısına kar¸ılık geldi˘ ini görüyoruz.. g E˘ er ascii sisteminden yararlanıp bilgisayarınızın bir “bip” sesi çıkarmasını isterseniz sadece g söyle bir sey yazmanız yeterli olacaktır: ¸ ¸ >>> print chr(7) !bip! Ancak bu biplemeyi (e˘ er kernel modüllerinden biri olan “pcspkr” yüklü de˘ ilse) GNU/Linux g g sistemlerinde duyamayabilirsiniz. Python’a “o 141 bildi˘ in 141 g s g de˘ il. Ama e˘ er ascii kodlarını do˘ rudan karakter dizilerinin içinde kullanmak isterseniz... Dolayısıyla Python’da söyle bir sey yazabiliyoruz: ¸ ¸ >>> print "Merhab" + chr(97) + dünya" Merhabadünya Burada iki kelime arasında tabii ki bo¸luk yer almıyor..” gibi bir mesaj vermi¸ oluyoruz. Elbette ascii tablosu sadece yukarıdaki görünmez karakterlerden ibaret de˘ ildir. karakter dizileri s g arasında istedi˘ iniz boyutta sekmeler olu¸turabilirsiniz. g Mesela “a” harfi “97” sayısı ile gösteriliyor.. g s “Yok. ben illa dec sütunundaki ondalık sayıları kullanmak istiyorum.. Bo¸luk karakterini kendiniz yerle¸tires s s bilirsiniz. g g ascii tablosunda “dec” sütunu yerine “oct” sütunundaki sayıları da kullanabilirsiniz. E˘ er buradaki sekme bo¸lu˘ unun az oldu˘ unu dü¸ünüyorsanız kos g s g g s dunuzu söyle de yazabilirsiniz: ¸ >>> print "Merhaba" + chr(9) * 2 + "dünya" Merhaba dünya chr(9)‘a kar¸ılık gelen sekme karakterini istedi˘ iniz kadar tekrar ederek.” diyorsanız sizi kıracak de˘ iliz. ascii tablosunda “Hx” (Hexadecimal) adlı bir sütun daha var.

Peki “7-bitlik” ne demek? Hemen g s kısaca onu da açıklayalım: Bildi˘ iniz gibi bilgisayarların temelinde 1’ler ve 0’lar yatar.. Ba¸ka bir örnek verelim: ascii tablosunda g s “r” harfi “114” sayısına kar¸ılık geliyor.getdefaultencoding() ’ascii’ Demek ki Python’daki varsayılan kodlama biçimi hakikaten “ascii” imi¸. Burada aldı˘ ınız çıktıların her ortamda aynı g g çıktıyı verece˘ inden emin olamazsınız. O ¸ ¸ yüzden bu sayıda bizi ilgilendiren kısım “1000110”. Çünkü dedi˘ imiz ve gördü˘ ümüz gibi. Etkile¸imli kabuk pratik bir araçtır. Mesela “F” harfinin ascii kar¸ılı˘ ı s g olan “70” sayısı ondalık bir sayıdır. g Bu arada. ˙ g Ingilizce dı¸ındaki hiç bir dilin özel karakterlerini tanımaz. Python “ascii olmayan” karakterler kullandı˘ ımızdan yakınıyor. Bu araç Python’a bir seyler ifade ediyor olabilir... but no encoding declared.ascii tablosunu inceledi˘ inizde. bu tabloda bazı seylerin eksik oldu˘ u gözünüze çarpmı¸ olmalı. Bu 1 ve 0’ların 7 s tanesi yan yana gelince 7-bitlik bir sayı olu¸turur! Gayet mantıklı. s Python varsayılan olarak ascii kodlamasını kullanır... Python “ascii” tablosunda yer almayan bir karakterle kar¸ıla¸tı˘ ı zaman do˘ al olarak s s g g hata mesajında gördü˘ ümüz çıktıyı veriyor. Bu 1 ve 0’ların her birine “bit” adı verilir. s g Simdi Python’da söyle bir kod yazdı˘ ımızı dü¸ünelim: ¸ ¸ g s print "Türkçe karakterler: ¸çö˘üı˙" s g I E˘ er bu kodları do˘ rudan etkile¸imli kabuk üzerinde çalı¸tırmı¸sanız Python size düzgün bir g g s s s çıktı vermi¸ olabilir. Gördü˘ ünüz gibi burada toplam 7 adet 1 ve 0 var. “ascii” Türkçe karakters g leri tanımayan bir karakter kodlama biçimidir. Bu kodu bir metin dosyasına yazıp kaydettikten sonra programı çalı¸tırmak istedi˘ imizde söyle s g ¸ bir çıktı alırız: SyntaxError: Non-ascii character ’\xfc’ in file deneme..py on line 1. “¸çö˘ üı˙ harfleri ascii tablosunda g g g s g I” yer almıyor.. Ancak bu sizi yanıltmasın. Bu yazının “Giri¸” bölümündeki kaba tarifte de ifade etti˘ imiz gibi. de˘ il mi? s g ˙ste ascii sisteminde tanımlanan bütün karakterler 7-bitlik bir sayı içine sı˘ dırılabiliyor. O yüzden asıl programlarınızda do˘ rudan yukarıdaki g g gibi bir kod yazamazsınız. ama her s s zaman güvenilir bir araç oldu˘ u söylenemez. Yani 7 I¸ g adet 1 ve 0 bütün ascii karakterleri temsil etmeye yetiyor. Aslında ascii sadece Türkçe’yi de˘ il.. see http://www.. s Python’da herhangi bir ondalık sayının ikili düzende hangi sayıya kar¸ılık geldi˘ ini bulmak için s g bin() adlı fonksiyondan yararlanabilirsiniz: >>> bin(70) ’0b1000110’ Bu sayının ba¸ındaki “0b” karakterleri Python’un ikili sayıları göstermek için kullandı˘ ı bir s g araçtır. Hemen bunu teyit edelim: >>> import sys >>> sys. Bu ondalık sayı ikili düzende 1000110 sayısına kar¸ılık gelir.python..html for details Burada gördü˘ ünüz gibi.. g g Aslında bu çok do˘ al. ama bize bir sey ifade etmez. g ¸ g s Mesela bu tabloda “ç¸ö˘ üı” gibi harfleri göremiyoruz. Bilgisayarlar yalnızca bu sayıları g anlayıp bu sayılarla i¸lem yapabilir. Yukarıdaki durum nes deniyle. ascii’nin 7-bitlik bir sistem oldu˘ unu söylemi¸tik.org/peps/pep-0263.. Bu ondalık sayının ikili düzendeki kar¸ılı˘ ı 1110010 s s g sayısıdır: .

Sonraki 128’lik kısım ise farklı kod sayfalarında farklı karakterlere kar¸ılık gelir. g s s Bu fonksiyonun adı ord()‘dur. Örne˘ in Microsoft firmasının Türkiye’ye s g gönderdi˘ i bilgisayarlarda kullandı˘ ı. Dolayısıyla bu da 7-bitlik bir g s sayıdır. 857 numaralı bir kod sayfası vardır. 128 sayısı ikili düzende 10000000 olarak gösterilir. s Hatırlarsanız yukarıda chr() adlı bir fonksiyondan bahsetmi¸tik. ascii tablosunun ilk 32 g s sayısı ekranda görünmeyen karakterleri temsil etti˘ i için Microsoft bunları gösterme gere˘ i g g duymamı¸. Örne˘ in “ISO” karaks s g ter kümeleri de kod sayfalarına benzer bir biçimde 8. sayılar 32’den ba¸lıyor. bu ikili sayı da 7 adet 1 ve 0’dan olu¸uyor. Gördü˘ ünüz gibi 128’in ikili g düzendeki kar¸ılı˘ ı olan sayı 7-bit de˘ il. 129. bitin geli¸iyle birlikte. Özellikle IBM ve Microsoft gibi büyük sirketlerin. ord() fonksiyonunu söyle kullanıyoruz: ¸ >>> ord("g") 103 Demek ki “g” karakterinin ascii tablosundaki kar¸ılı˘ ı 103’mü¸.microsoft.com/en-us/library/cc195068. Örne˘ in buradaki 857 numaralı kod sayfasında ikinci 128’lik s g kısım özel karakterlere ayrılmı¸tır. Ancak 90’lu yılların ortalarından itibaren bütün bilgisayar sistemleri 8 bitlik verileri de depolayabilmeye ba¸ladı. 8.. ISO-8859-9 karakter kümesine http://czyborra. Böylece ortaya “kod sayfası” (codepage) denen bir kavram çıktı.. yani “Geni¸letilmi¸ ascii” denen sistem standart bir yapıya hiç bir zaman kavu¸amadı. Bu tabloda 128’e kadar olan kısım zaten standart ascii’dir ve bütün kod says falarında ilk 128’lik kısım aynıdır. Bu kod sayg g fasına http://msdn. kendi ihtiyaçlarına ve farklı ülkelere göre ¸ düzenlenmi¸ farklı farklı kod sayfaları bulunur.aspx adresindeki 851 numaralı g kod sayfasına bakacak olursanız..aspx adresinden ula¸abilirsiniz. Bunlar içinde s s Türkçe’ye ayrılan küme ISO-8859-9 adlı karakter kümesidir. Çünkü burada 7 adet 1 ve 0 yerine 8 adet 1 ve 0 var.com/charsets/iso8859. Bunun da ikili düzendeki kar¸ılı˘ ı 1111111 s g sayısıdır. “ö”. biti kendi ihtiyaçlarına göre doldurma yolunu seçtiler. Bu fonksiyon kendisine argüs man olarak verilen ondalık bir sayının ascii tablosundaki kar¸ılı˘ ını gösteriyordu.. Bu s adresteki kod sayfasında görece˘ iniz gibi.com/en-us/library/cc195065. s Kod sayfaları dı¸ında.>>> bin(114) ’0b1110010’ Yine gördü˘ ünüz gibi. 7-bitle gösterilebilecek son sayı 127’dir. biti olabildi˘ ince standartla¸tırmaya g s çalı¸an giri¸imlerdi. ISO-8859 karakter kümeleri bunların en bilinenlerindendir. Ancak ilk 128 karakterden sonra gelen 128 karakterin hangi karakterleri temsil edece˘ i g konusu. “ı” ve “˙ gibi harfleri görebiliyoruz. Çünkü 851 numaralı kod sayfası Yunan g alfabesindeki harfleri gösterebilmek için tasarlanmı¸tır. “ç”. “˘ ”. bu listede ikinci 128’lik kısmın 857 numaralı kod sayfasındakilerden farklı karakterlere ayrıldı˘ ını görürsünüz.html#ISO-8859-9 adresinden ula¸abilirsiniz. az çok standartla¸mı¸ karakter kümeleri de bu dönemde ˙ s s s Ingilizce dı¸ındaki dillerin karakter ihtiyaçlarını kar¸ılamak için kullanılıyordu. s g g Dolayısıyla 7 bit kullanarak 0 sayısı ile birlikte 128 adet ondalık sayıyı gösterebiliyoruz.. bitin sa˘ ladı˘ ı olanaklar göz önünde bulundurularak ortaya “Geni¸letilmi¸ ascii” diye bir sey g g s s ¸ çıktı. 128 karakteri destekleyen standart ascii’nin ˙ Ingilizce dı¸ındaki karakterleri gösterememesi ve s 8. Örne˘ in: g .. Çünkü 8-bitlik sistemler 28 = g g 256 adet karakterin kodlanmasına imkan tanır.. Bu kod sayfası Türkçe’deki karakterleri düzgün gösteres bilmek için üretildi˘ inden bu listede “¸”. sayı ancak 8 bit kullanılarak gösterilebiliyor.microsoft. s s s Bilgisayar üreticileri bu 8.. 1990’lı yılların ortalarına kadar bilgisayar sistemleri sadece bu 7-bitlik veriler ile i¸lem yapıys ordu. 7-bitlik sistemin sundu˘ u 128 karaktere ek s s g olarak bir 128 karakteri daha temsil edebilme olana˘ ı do˘ du... s g s Bu chr() ve ord() fonksiyonları farklı platformlarda farklı davranabilir. g s g I” Ama e˘ er http://msdn. Python’da bir s g de bu chr() fonksiyonunun yaptı˘ ı i¸in tam tersini yapan ba¸ka bir fonksiyon daha bulunur.

O halde gelelim bu “unicode” I¸ ¸ mevzuuna. s ¸ 159 ç 135 ö 148 ˘ 167 g ü 129 ı 141 ˙ 152 I Gördü˘ ünüz gibi bütün Türkçe karakterler 128’den büyük. Ayrıca mesela tek bir metin içinde hem Türkçe hem de Yunanca s . bitin sa˘ ladı˘ ı 128 karakterlik alandan ve üreticilerin kendi kod sayfalarından yararg g lanıldı.. yukarıdaki çıktı güvenilir de˘ ildir. 135 sayısına kar¸ılık gelen karakter g s standart ascii’nin dı¸ında kalır. Simdilik biz konumuza g g ¸ devam edelim. yukarıs g daki sonuç epey yanıltıcıdır. Bunun ne oldu˘ unu biraz sonra görece˘ iz. standart ascii tablosu ˙ s g Ingilizce dı¸ındaki s dillere özgü karakter ve simgeleri göstermek konusunda yetersizdir. Bu yüzden geni¸letilmi¸ ascii’ye s s güvenip herhangi bir i¸ yapamazsınız. Bir defa 7 bit bir kenara.. s g g Bu komutu ben Windows kurulu bir bilgisayarda verdim. Geni¸letilmi¸ ascii ise toplam 256 karakterden olu¸ur. Aynı komutu GNU/Linux i¸letim siss teminde verdi˘ inizde hiç beklemedi˘ iniz sonuçlar elde edersiniz. 18..... Dolayısıyla “ç” karakteri ikinci 128’lik kısımda yer alır. O yüzden bunlar standart ascii g tablosuna girmiyor.3 unicode Her ne kadar ascii kodlama sistemi ˙ Ingilizce dı¸ındaki karakterleri temsil etmek konusunda s yetersiz kalsa da insanlar uzun süre ascii’yi temel alarak çalı¸tılar. Standart ascii 128 karakterden ibarettir. Ancak dedi˘ im gibi. Ancak bu yakla¸ımın yetersizli˘ i gün gibi ortadadır. ord(i) . Her üretici bu ikinci g 128’lik kısmı kendi “kod sayfası”ndaki karakterlerle doldurur.>>> print ord("ç") 135 >>> print chr(135) ç Gördü˘ ünüz gibi. ord("ç") çıktısı 135 sonucunu veriyor. s ˙ste tam da bu noktada “unicode” denen sey devreye girer. Microsoft firması ikinci 128’lik kısım için kendine özgü bir kod sayfası kullanıyor ve 135 sayısı bu özel kod sayfasında “ç” karakterine kar¸ılık s geliyor. Çünkü elbette GNU/Linux g g i¸letim sistemleri Microsoft’un 857 numaralı kod sayfasını kullanmıyor. 8 bit dahi s g dünya üzerindeki bütün dillerin karakter ve simgelerini göstermeye yetmez. Ama Microsoft’un kullandı˘ ı 857 numaralı kod sayfası sayesinde bu karakg terler ikinci 128’lik kısma girebilmi¸. Çünkü bu çıktıyı yalnızca Windows’ta elde edebilirsiniz... Yerel ihtiyaçları gidermek s için ise 8. Ancak dedi˘ imiz gibi... Örne˘ in Asya dilg lerinin alfabelerindeki harf sayısını temsil etmek için 256 karakterlik alan kesinlikle yetmeyecektir ve yetmemi¸tir de. Buraya kadar anlattıklarımızdan anla¸ılaca˘ ı gibi.. GNU/Linux farklı bir s kodlama sistemini kullanır. ˙ Isterseniz bir de öteki Türkçe karakterlerin durumunu kontrol edelim: >>> for i in "¸çö˘üı˙": s g I . Çünkü dedi˘ imiz gibi standart ascii sadece 128 karakterden s g olu¸ur... Aynı komut GNU/Linux üzerinde hata verecektir. Ancak ilk 128 karaks s s terden sonra gelen ikinci 128’lik kısım standart bir yapıya sahip de˘ ildir. print i..

Unicode ve s s bunun tarihi konusunda en ayrıntılı bilgiyi http://www. 1987 yılında Xerox firmasından Joseph D. Ancak unicode için aynı seyi söylemek mümkün s ¸ de˘ il. Becker bu kelimeyi “benzersiz s s (unique). Buna s göre her sayı bir karaktere kar¸ılık gelir. s s Joseph Becker’in 29 A˘ ustos 1988 tarihinde yazdı˘ ı Unicode 88 ba¸lıklı makale. Türkçe için 857 numaralı kod sayfasını (veya iso-8859-9 karakter kümesini) kullanabilirsiniz. Unicode sisteminde karakterler yerine “kod konumları” (code points) bulunur.. ama artık böyle bir sınırlama g g g yok. birle¸ik (unified) ve evrensel (universal) bir kodlama biçimi” anlamında kullanmı¸tır. ascii’ye göre farklı bir bakı¸ açısına sahiptir.pdf adresinden g ula¸abilirsiniz. Bunun üzerine unicode g s 2. “unicode” kelimesini ortaya atan ki¸i Joe Becker’dir. Bu sayfada yer alan tabloda her karakterin bir kod konumu bulundu˘ unu görüyoruz.pdf adresindeki “Latin Extended A” adlı g unicode tablosuna bakalım. Ancak bu iki kod sayfasını aynı metin içinde kullanmanız mümkün de˘ il. Bu tablo Türkçe ve Azerice’nin de dahil oldu˘ u bazı dillere özgü g karakterleri barındırır. Onun için 851 numaralı kod sayfasını veya iso-8859-7 karakter kümesini kullanmanız gerekir... dünya üzerinde konu¸ulan dillere ilaveten arkaik s dillerdeki karakterler de temsil edilebilme olana˘ ına kavu¸tu.. s chr() fonksiyonu bir sayının ascii tablosunda hangi karaktere kar¸ılık geldi˘ ini gösteriyordu. Mesela “˘ ” harfinin kod konumu “U+011F”dir. unicode g g s hakkındaki ilk taslak metin olması bakımından önem ta¸ır.. Bunun ondalık sayı olarak kar¸ılı˘ ını bulmak için int() s g fonksiyonundan yararlanabilirsiniz: >>> int("011F". Becker ve Lee Collins ile Apple firmasından Mark Davis böyle bir “evrensel karakter kümesi” olu¸turabilmenin altyapısı üzerinde çalı¸maya s s ba¸ladı. Mesela “˘ ” harfinin kod konumu 011F’dir. ˙ unicode standardı 16-bit temel alınarak hazırlanmı¸tır. Ama bu kod sayfasında Yunanca harfler yer almaz.unicode.org/charts/PDF/U0100. Bu makaleye http://unicode. ascii’de sistem oldukça basittir.org/history/unicode88. s 1987 yılından itibaren unicode üzerine yapılan yo˘ un çalı¸maların ardından 1991 yılında hem g s “Unicode Konsorsiyum” kurulmu¸ hem de ilk unicode standardı yayımlanmı¸tır. Dolayısıyla “unicode 16-bitlik bir g s sistemdir. Ne de olsa. s g unichr() fonksiyonu ise bir sayının unicode tablosunda hangi kod konumuna kar¸ılık geldi˘ ini s g .org/ adresinden edinebilirsiniz. Unicode. Unicode dilinde kod konumları g g geleneksel olarak “U+xxxx” seklinde gösterilir.. Unicode kavramı ilk ortaya çıktı˘ ında Ilk s g Joe Becker 16 bit’in dünyadaki bütün dillere ait karakterleri temsil etmeye yetece˘ ini dü¸ünüyg s ordu. Unicode ilk çıktı˘ ında 16-bitlikti. 27 = 128 28 = 256 216 = 65536 Ancak zamanla 16 bit’in dahi tüm dilleri kapsayamayaca˘ ı anla¸ıldı.. g ˙ste bütün bu yetersizlikler “evrensel bir karakter kümesi” olu¸turmanın gereklili˘ ini ortaya I¸ s g çıkardı. ascii’nin ˙ g Ingilizce dı¸ındaki dillere ait karakterleri s göstermekteki yetersizli˘ ini ve herkesin ihtiyacına cevap verebilecek bir sistemin nasıl ortaya g çıkarılabilece˘ ini anlatır. O yüzden g unicode sisteminde “baytlar” üzerinden dü¸ünmek yanıltıcı olacaktır. 16) 287 Python’da chr() fonksiyonuna çok benzeyen unichr() adlı ba¸ka bir fonksiyon daha bulunur.karakterler kullanmak isterseniz ascii sizi yarı yolda bırakacaktır.unicode..0’dan itibaren 16-bit sınırlaması kaldırılarak..” yargısı do˘ ru de˘ ildir. Becker bu makalede neden unis code gibi bir sisteme ihtiyaç duyuldu˘ unu. ¸ g Esasında bu “011F” bir onaltılık sayıdır.. s Örne˘ in http://www.

. Ancak bildi˘ iniz gibi bu ondalık bir s g de˘ erdir. >>> ord(u"ı") 305 Demek ki “ı” harfinin unicode kod konumu 305 imi¸.. Unicode kod konumları ise onaltılık sisteme göre gösterilir. g s g g ¸ söyle bir hata alırsınız: ¸ >>> ord("˘") g ValueError: chr() arg not in range(256) “˘ ”nin de˘ eri “287” oldu˘ u ve bu sayı da 256’dan büyük oldu˘ u için ord() fonksiyonu normal g g g g olarak bu karakteri gösteremeyecektir.. ˙ Isterseniz elimiz alı¸sın diye “˘ ” dı¸ındaki bir Türkçe karakteri de inceleyelim. karakter vererek o karakterin unicode kod konumunu g g bulmak mümkün mü? Elbette.gösterir. Sadece ord("˘") yazg g mak Python’un hata vermesine sebep olacaktır. Çünkü özünde ord() fonksiyonu sadece 0256 aralı˘ ındaki ascii karakterlerle çalı¸ır.. Ama e˘ er siz bu kodu ord(u"˘") seklinde ba¸ına bir g g ¸ s “u” harfi getirerek yaparsanız mutlu mesut ya¸amaya devam edebilirsiniz. Biraz sonra bu “u” s harfinin tam olarak ne i¸e yaradı˘ ını görece˘ iz. Yukarıdaki kodu söyle yazarak do˘ rus ¸ ¸ g dan “˘ ” harfini elde edebilirsiniz: g >>> print unichr(287) ’˘’ g Peki do˘ rudan bir sayı vererek de˘ il de. Simdilik biz yine yolumuza kaldı˘ ımız yerden s g g ¸ g devam edelim.. Bunun için yine ord() fonksiyonundan yararlanabiliriz: >>> ord(u"˘") g 287 ord() fonksiyonu bir karakterin kod konumunu ondalık sayı olarak verecektir. Bu da yalnızca Türk alfabesinde bulunan bir harftir. O halde kodumuzu yazag lım: >>> unichr(305) u’\u0131’ . Burada Python kendi iç i¸g g s leyi¸i açısından “011F”yi “u’\u011F” seklinde gösteriyor.. Mesela yukarıda gördü˘ ümüz “287” sayısının hangi kod konumuna kar¸ılık geldi˘ ine g s g bakalım: >>> unichr(287) u’\u011f’ Gördü˘ ünüz gibi “˘ ” harfinin kod konumu olan “011F”yi elde ettik. E˘ er yukarıdaki kodu ord("˘") seklinde yazarsanız. Elde etti˘ iniz g bu ondalık sayıyı unichr() fonksiyonuna vererek onaltılık halini ve dolayısıyla unicode kod konumunu elde edebilirsiniz: >>> unichr(287) u’\u011f’ Bu arada ord() fonksiyonunu burada nasıl kullandı˘ ımıza dikkat edin. Mesela “ı” harfini s g s alalım.

x sürümlerinde bu komutun çıktısı ‘ascii’ idi. bu kod çözücüler içinde en gözde olanı utf-8’dir ve bu çözücü g GNU/Linux’ta da standarttır.encode(u"˘".x sürümünde söyle bir komut verelim: ¸ >>> import sys >>> sys. Ufak bir örnek yapalım: >>> unicode.encode(u"˘".unicode. Çünkü unicode sistemindeki kod konumlarının bilgisas yarlarda do˘ rudan depolanması mümkün de˘ ildir. Python programlama dili de 3..org/charts/PDF/U0100.org/charts adresinden ula¸abilirsiniz. Python 3. Hemen bunu teyit edelim. "utf-16") g ’\xff\xfe\x1f\x01’ >>> unicode.x sürümlerinden itibaren varsayılan kodlama biçimi olarak UTF-8’i kullanır. Burada benim amacım sadece farklı kod çözücülerin karakterleri nasıl kodladı˘ ını g g göstermek. "utf-32") g ’\xff\xfe\x00\x00\x1f\x01\x00\x00’ Buradaki unicode. Do˘ rudan “ı” harfini elde etmek isterseniz söyle bir sey de yazabilirsiniz: g ¸ ¸ >>> print u’\u0131’ ı Unicode sistemi bu kod konumlarından olu¸an devasa bir tablodur.Burada Python’un kendi ekledi˘ i “u’\u” kısmını atarsak “0131” sayısını elde ederiz. 16) 305 Simdi e˘ er http://www.. Dedi˘ im gibi. UTF-16 ve UTF-32 gibi kod çözücüler vardır. "utf-8") g ’\xc4\x9f’ >>> unicode..pdf adresindeki unicode tablosuna baka¸ g cak olursanız “ı” harfinin kod konumunun gerçekten de “0131” oldu˘ unu göreceksiniz..encode() yapısına kafanızı takmayın. Bunlar arasında en yaygın kullanılanı UTF-8’dir ve bu kodlama sistemi GNU/Linux sistemlerinde de standart olarak kabul edilir. s Unicode sistemi içinde UTF-8. Test etmek g amacıyla bu “0131” sayısının ondalık kar¸ılı˘ ını kontrol edebilece˘ inizi biliyorsunuz: s g g >>> int("0131". Kod g çözücüler her kod konumunu alıp farklı bir biçimde kodlarlar.encode(u"˘". Biraz sonra bunları iyice inceleyece˘ iz. Zaten unicode sistemi sadece bu kod konumlarından g ibaret olsaydı pek bir i¸e yaramazdı. Python’un 2.. Ancak unicode sadece bu kod kons umlarından ibaret bir sistem de˘ ildir.. ˙ g Isterseniz bakın. . Bilgisayarların bu kod konumlarını i¸leyeg g s bilmesi için bunların bayt olarak temsil edilebilmesi gerekir.unicode. Unicode tablosuna s http://www.getdefaultencoding() ’utf-8’ Yukarıda da gösterdi˘ imiz gibi. ˙ste unicode denen sistem bir de I¸ bu kod konumlarını bilgisayarların i¸leyebilmesi için bayta çeviren “kod çözücülere” sahiptir.

. Örne˘ in unichr() fonksiyonunu kullanarak bir kod konumunun hangi karakg g tere kar¸ılık geldi˘ ini bulabilece˘ imizi ö˘ rendik: s g g g >>> print unichr(351) s ¸ Ancak daha önce söyledi˘ imiz seyler parça parça bilgiler içeriyordu. s Simdi sıra geldi Python’daki unicode deste˘ i ¸ g Esasında unicode konusundan bahsederken bunun Python’a yansımasının bir kısmını da görmedik de˘ il. karakter dizilerinin ba¸ına bir “u” harfi getirilerek kolayca g s elde edilebiliyor.4 Python’da unicode Destegi ascii ve unicode’nin ne oldu˘ unu ö˘ rendik..˘ 18. O yüzden isterseniz derdimizi bir örnekle anlatmaya çalı¸alım.. Peki bir karakter dizisini “unicode” olarak tanımlamanın bize ne faydası var? Bir örnek bin söze bedeldir!. g g konusunu i¸lemeye. g s g s g Python’da karakterlere ili¸kin iki farklı tip bulunur: “karakter dizileri” (strings) ve “unicode s dizileri” (unicode strings). Bu bölümün en ba¸ında bahsetti˘ imiz makalede de söyledi˘ imiz gibi s g g len() fonksiyonu aslında bir karakter dizisinde kaç karakter oldu˘ una bakmaz. 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’> Gördü˘ ünüz gibi. unicode dizileri. “ı¸ık” kelimesini etkile¸imli kabukta g ¸ g s s yazacak olursanız sorunun nerede oldu˘ unu görebilirsiniz: g >>> "ı¸ık" s ’\xc4\xb1\xc5\x9f\xc4\xb1k’ .. “ı¸ık” kelimesinde sadece dört karakter bulundu˘ u halde len() fonksiyonu g s g “7” sonucunu veriyor. Bu fonksiyonun g ilgilendi˘ i sey o karakter dizisinin içerdi˘ i bayt sayısıdır. Suna bir bakın: s ¸ >>> kardiz = "ı¸ık" s >>> len(kardiz) 7 Gördü˘ ünüz gibi. Bu bölümde ise “gerçek g ¸ hayatta” unicode ve Python’u nasıl ba˘ da¸tıraca˘ ımızı anlamaya çalı¸aca˘ ız..

“xc5”. Geri kalan harfleri ise oldu˘ u gibi bıraktı. “ı¸ık” karakter dizisini unicode olarak tanımladı˘ ımızda Python bu dizideki g s g gerçek karakter sayısını verecektir. Ama artık siz bu sorunun g üstesinden nasıl gelebilece˘ imizi az çok tahmin ediyorsunuzdur: g >>> unidiz = u"ı¸ık" s >>> print unidiz.. “xb1”.upper() I¸IK S . Ama tabii bu daha i¸in ufak bir boyutu. bu kod konumlarının s g hangi harflere kar¸ılık geldi˘ ini görebilirsiniz. Veya daha önce söyledi˘ imiz gibi.. E˘ er unicode tablosunu açıp bakarsanız.Burada “xc4”. su yolu da s g g ¸ kullanabilirsiniz: >>> ord(u"\u0131") 305 >>> unichr(305) u’\u0131’ >>> print unichr(305) ı Ya da bu üç a¸amayı tek adımda halletmek de isteyebilirsiniz: s >>> print unichr(ord(u"\u0131")) ı Demek ki karakter dizilerini “unicode” olarak tanımlamak programlarımızın çalı¸ması açısından s hayati önem ta¸ıyabiliyormu¸. ˙ Isterseniz biraz önce yaptı˘ ımız gibi u”ı¸ık” adlı unicode g s dizisini etkile¸imli kabukta yazarak durumu daha net görmeyi tercih edebilirsiniz: s >>> u"ı¸ık" s u’\u0131\u015f\u0131k’ Bu çıktıda görünen “unicode kod konumları”na özellikle dikkat edin. “xc4”. Dolayısıyla burada len() fonksiyonunun “4” çıktısı vermesini bo¸una beklememek s lazım.upper() ı¸ıK s Gayet ba¸arısız bir sonuç! Karakter dizilerinin metotlarından biri olan upper() metodu sadece s “k” harfini büyütebildi. “xb1” ve “k” seklinde gösterilen toplam 7 baytlık bir ¸ veri var. “x9f”. Bir de suna bakın: s s s ¸ >>> kardiz = "ı¸ık" s >>> print kardiz. Python bu kod konumlarını birer baytmı¸ gibi görecektir. Bir de suna bakın: ¸ >>> unidiz = u"ı¸ık" s >>> len(unidiz) 4 Gördü˘ ünüz gibi...

write(uni_diz) Bu kodlar söyle bir hata verecektir: ¸ .. "w") >>> f.html for details Esasında biz bu hatanın üstesinden nasıl gelebilece˘ imizi daha önceki derslerimizde g edindi˘ imiz bilgiler sayesinde çok iyi biliyoruz. “utf-8” de bu kod çözücülerden biri ve en gözde g s g olanıdır. karakter dizilerinin ba¸ına s s bir adet “u” harfi eklemektir: >>> uni_diz = u"ı¸ık" s Bu unicode dizisini etkile¸imli kabukta yazdırdı˘ ımız zaman söyle bir çıktı elde ediyoruz: s g ¸ >>> uni_diz u’\u0131\u015f\u0131k’ Burada gördü˘ ünüz sey bir bayt dizisi de˘ ildir. e˘ er bu satırı bir metin dosyasına yazıp kaydeder ve ardından bu programı çalı¸tırırg s sanız söyle bir hata mesajı alırsınız: ¸ SyntaxError: Non-ascii character ’\xfc’ in file deneme. söyle bir örnek vermi¸tik: s ¸ s print "Türkçe karakterler: ¸çö˘üıI" s g Dedik ki.python. sizin belirledi˘ iniz g kod çözücü olan utf-8’i (veya cp-1254’ü) kullanarak programlarınızın içinde rahatlıkla ˙ Ingilizce dı¸ındaki karakterleri de kullanmanıza müsaade edecektir.py on line 1. bunların bilgisayarlarda depolanabilmesi için öncelikle uygun bir kod çözücü g yardımı ile bilgisayarın anlayabilece˘ i baytlara dönü¸türülmesi gerekti˘ ini söylemi¸tik. Python’da unicode dizileri olu¸turmanın en kolay yolu. ˙ g s g s Isterseniz biraz da bunun ne demek oldu˘ unu anlamamıza yardımcı olacak birkaç örnek yapalım.. Yukarıdaki satır yardımıyla. programlarınıza unicode g s deste˘ i vermi¸ oluyorsunuz. Dolayısıyla bu unicode dizisi bu haliyle bilgisayarda depolanamaz. unicode sistemleri içindeki kod konumlarının bilgisayarlar açısından pek bir sey ¸ ifade etmedi˘ ini.4.txt". g Biliyoruz ki.1 Python Betiklerinde unicode Destegi Bu bölümün ba¸ında ascii konusundan bahsederken. s Hatırlarsanız. Python derslerinin ta en ba¸ından beri g s yazdı˘ ımız bir satır.˘ 18.org/peps/pep-0263. Ancak Windows’ta utfs 8 yerine “cp1254” adlı özel bir kod çözücü kullanmanız gerekebilir. Yazdı˘ ınız o satır sayesinde Python kendi varsayılan kod çözücüsü g s g olan “ascii”yi kullanarak programınızın çökmesine sebep olmak yerine. g g Böylelikle programımız içinde geçen ascii dı¸ı karakterler çıktıda düzgün gösterilebilecektir. Dolayısıyla e˘ er Windows g kullanıyorsanız yukarıdaki satırı söyle yazmanız gerekebilir: ¸ #-*-coding: cp1254-*- Yazaca˘ ınız betiklerin en ba¸ına yukarıdaki gibi bir satır koyarak. bizim yukarıdaki gibi bir hata almamızı engelleyecektir: g #-*-coding: utf-8-*- Hatırlarsanız. see http://www. s GNU/Linux sistemlerinde “utf-8” kodlaması her zaman i¸e yarayacaktır. ˙ Isterseniz deneyelim: >>> f = open("deneme. Burada gördü˘ ümüz sey bir dizi unicode kod g ¸ g g ¸ konumudur. yazdı˘ ımız programın “utf-8” ile kodlanmasını sa˘ lıyoruz. Orada da dedi˘ imiz gibi. but no encoding declared. unicode konusundan söz ederken unicode sistemi içinde bazı kod çözücülerin yer aldı˘ ını söylemi¸tik.

"utf-8") Burada “elma” adlı karakter dizisini “utf-8” adlı kod çözücüyü kullanarak bir unicode dizisi haline getirdik.Traceback (most recent call last): File "<stdin>". unicode dizilerini ¸ depolayabilmek için öncelikle bunları uygun bir kod çözücü yardımıyla bilgisayarın anlayabilece˘ i bir biçime getirmektir.2 unicode() Fonksiyonu Hatırlarsanız Python’da bir unicode dizisi olu¸turmak için karakter dizisinin ba¸ına bir adet s s “u” harfi getirmemizin yeterli olaca˘ ını söylemi¸tik. E˘ er s g “uni_diz” adlı de˘ i¸kende sadece ˙ gs Ingilizce karakterler olsaydı. Ama biz simdilik g g g ¸ yine yolumuza devam edelim. Bu yüzden bizim yapmamız gereken sey. “ascii” tablosunda bulunan karakterler unicode sisteminde de aynı sekilde yer aldı˘ ı için. in <module> UnicodeEncodeError: ’ascii’ codec can’t encode characters in position 0-2: ordinal not in range(128) Python. line 1.4. “unicode()” adlı fonksiyon ikinci (ve hatta üçüncü) bir parametre daha alır. 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.. Önce ikinci parametrenin ne oldu˘ una bakalım: g >>> unicode("elma". ascii. Biraz sonra bunu nasıl yapaca˘ ımızı görece˘ iz. Python bunları ascii yardımıyla bilgisayarın anlayabilece˘ i bir biçime çevirir ve rahatlıkla dosyaya yazdırabilirdi. “ascii”nin kendisi unicode sistemi içinde yer almasa da. Bunu yaparken de tabii ki varsayılan kod çözücüsü olan “ascii”yi kullanmayı dener. 18. unicode kod konumlarından olu¸mu¸ bir diziyi bilgisayara kaydetmek istedi˘ imizde s s g olanca iyi niyetiyle bu kod konumlarını bilgisayarın anlayabilece˘ i bir biçime dönü¸türmeye g s çalı¸ır. "ascii") Esasında e˘ er unicode() fonksiyonunun ikinci parametresini belirtmezseniz Python otomatik g olarak sizin “ascii”yi kullanmak istedi˘ inizi varsayacaktır: g >>> unicode("elma") Peki karakter dizilerini bu sekilde kodlamak ne i¸imize yarar? Bunu anlamak için söyle bir ¸ s ¸ örnek verelim: >>> a = "¸ırınga" s >>> print a.. Bunun için isg s terseniz öncelikle unicode ile ilgili metotlara bir göz atalım.upper() s ¸ıRıNGA . unicode ve bunların Python’la ili¸kisi konusunda temel bilgileri edindi˘ imize göre s g Python’daki unicode deste˘ inin biraz daha derinlerine inmeye ba¸layabiliriz. burada kullandı˘ ımız ¸ g g “unicode()” fonksiyonu bir karakter dizisini “ascii” ile kodlamamıza da müsaade eder: >>> unicode("elma". Ancak bug rada bulunan Türkçe karakterler nedeniyle ascii kod çözücüsü bu karakterleri çözemez ve programın çökmesine yol açar.

upper() S ¸IRINGA unicode() fonksiyonu karakterleri daha esnek bir biçimde kodlamamızı sa˘ lar. “¸” ve “ı” harflerini düzgün görüntüleyebilmek için bizim s “utf-8” adlı kod çözücüsünü kullanmamız gerekiyor. Hemen bir g g örnek verelim: >>> b = unicode(a.upper() S ¸IRINGA Burada daha en ba¸tan “¸ırınga” karakter dizisini unicode olarak tanımladık. Python’un herhangi bir ters durumda. "utf-8") >>> print b.. karaks s s ter dizisinin ba¸ına sadece bir “u” harfi getirerek yaptık. Bu parametre “strict” dı¸ında s “ignore” ve “replace” adlı iki de˘ er daha alabilir. Peki “strict” ne anlama geliyor? E˘ er g g “errors” adlı parametreye de˘ er olarak “strict” verirsek. Dolayısıyla e˘ er “errors” parametresini hiç kullang g mazsanız. g Peki “replace” de˘ eri ne i¸e yarıyor? Hemen bakalım: g s . E˘ er burada g g unicode() fonksiyonunu ikinci parametre olmadan ça˘ ırırsanız hata mesajı alırsınız: g >>> b = unicode(a) UnicodeDecodeError: ’ascii’ codec can’t decode byte 0xc5 in position 0: ordinal not in range(128) Daha önce de dedi˘ imiz gibi. Önce basit olanını görelim: >>> a = u"¸ırınga" s >>> print a. unicode() adlı fonksiyon üçüncü bir parametre daha alır.. Bu parametre üç farklı de˘ er alır: “strict”. karakter dizilerinin metotlarından biri olan upper(). ikinci parametrenin belirtilmemesi durumunda Python “ascii” kod g çözücüsünü kullanacaktır. Dedi˘ imiz g s s g g gibi.. kullanılan kod çözücünün düzgün kodg layamadı˘ ı karakterlerle kar¸ıla¸ıldı˘ ında Python bize bir hata mesajı gösterecektir. Bu sebeple Python çözülemeyen karakterleri tamamen ortadan kaldırıyor. içindeki Türkçe karakg terlerden ötürü “¸ırınga” kelimesini büyütemedi. çözülemeyen karakteri es g geçmesini sa˘ lıyor. "ascii".. kullanılan kod çözücünün. Peki ya ba¸taki karakter dizisini s s de˘ i¸tirme imkanımız yoksa ne olacak? ˙ste bu durumda ikinci yolu tercih edebiliriz: gs I¸ >>> a = "¸ırınga" s >>> b = unicode(a. errors = "ignore") >>> print b. Bu parametre. errors = "strict") UnicodeDecodeError: ’ascii’ codec can’t decode byte 0xc5 in position 0: ordinal not in range(128) Gördü˘ ünüz gibi. biraz önce aldı˘ ımız hatanın aynısını almamıza sebep oldu bu kod. "ascii". Bu kelimeyi düzgün bir sekilde büyütebilmek s ¸ için iki yöntem kullanabilirsiniz. ters durumlarda Python size bir hata mesajı gösterir. bazı karakterleri düzgün kodlayamaması durumunda Python’un ne yapması gerekti˘ ini belirler. Önce “ignore”nin ne yaptı˘ ına bakalım: g g >>> b = unicode(a. Bu i¸lemi.upper() RNGA Burada “ignore” de˘ eri. Çünkü g g “errors” adlı parametrenin varsayılan de˘ eri “strict”tir.Gördü˘ ünüz gibi... “errors”un varsayılan de˘ eri “strict”tir. O yüzden. “ignore” ve “replace”.

ya da söyle bir kod yazacaksınız: ¸ #-*-coding:utf-8-*a = raw_input("Bir parola belirleyiniz: ") print "Parolanız %s karakter içeriyor!"%len(unicode(a. e˘ er kullanıcılarınızın girdi˘ i karakterlerin sayısına göre g ¸ g g i¸lem yapan bir uygulama yazıyorsanız ya kullanıcılarınızı “ascii” dı¸ında karakter girmemeye s s zorlayacaksınız.>>> b = unicode(a. E˘ er Python’un s s g her karakter yerine neden iki soru i¸areti koydu˘ unu merak ediyorsanız. errors="replace")) E˘ er burada bir unicode dizisi olu¸turmazsanız ölçmeye çalı¸tı˘ ınız karakter uzunlu˘ u bekg s s g g ledi˘ iniz gibi çıkmayacaktır.. "w") f. line 1. "utf-8") f = open("deneme. "utf-8". "utf-8". Yukarıdaki kodların çalı¸g ¸ s ması için söyle bir sey yazmalıyız: ¸ ¸ #-*-coding:utf-8-*a = raw_input("herhangi bir karakter yazınız: ") print unicode(a.upper() ????R??NGA Burada da Python çözülemeyen karakterlerin yerine soru i¸aretleri yerle¸tirdi. Yukarıdaki örne˘ e benzer sekilde.) s g Bu anlattı˘ ımız konu ile ilgili olarak söyle basit bir örnek verebiliriz: g ¸ #-*-coding:utf-8-*a = raw_input("herhangi bir karakter yazınız: ") print a. bu bölümün en s g ba¸ında ba˘ lantısını verdi˘ imiz makaleyi inceleyebilirsiniz (ipucu: len() fonksiyonunu kullas g g narak “¸ırınga” kelimesindeki Türkçe karakterlerin uzunlu˘ una bakın.. "ascii". errors = "replace").. Kullanıcının. tanıns s mayan bir karakter girmesi ihtimaline kar¸ılık da “errors” parametresine “replace” de˘ erini s g verdik.write(unikod) Bu kodlar su hatayı verir: ¸ Traceback (most recent call last): File "<stdin>". Python ekranda g ¸ g girdi˘ imiz Türkçe karakterleri bu sekilde düzgün büyütemeyecektir.txt". Artık kullanıcılarımız ˙ s Ingiliz alfabesindeki harflerin dı¸ında bir harf girdiklerinde de programımız düzgün çalı¸acaktır. errors = "replace") >>> print b. g Simdi tekrar unicode kod konumlarını dosyaya kaydetme meselesine dönelim.. in <module> UnicodeEncodeError: ’ascii’ codec can’t encode characters in position 0-2: ordinal not in range(128) ..upper() Böylece unicode’ye duyarlı bir program yazmı¸ olduk.. Bu kısımda ¸ ö˘ rendi˘ imiz unicode() fonksiyonu da kod konumlarını dosyaya kaydetmemizi sa˘ lamaya g g g yetmeyecektir: >>> >>> >>> >>> kardiz = "ı¸ık" s unikod = unicode(kardiz.upper() E˘ er kodlarımızı bu sekilde yazarsak istedi˘ imiz sonucu elde edemeyiz.

. E˘ er “utf-8” g g veya ba¸ka bir kod çözücü kullanarak ikinci parametreyi de girersek Python burada bize bir s hata mesajı gösterecektir. Tekrar tekrar söyledi˘ imiz gibi. unicode sisteminde her bir karakterin bir kod konumuna sahip oldu˘ unu g söylemi¸tik.. "w") . ¸ Mesela bu kod konumunu “utf-8” ile kodlamayı tercih edebilirsiniz: >>> kod_konumu = unicode(u"¸") s >>> utfsekiz = kod_konumu.4. Bunu su sekilde ¸ ¸ ¸ ¸ teyit edebilirsiniz: >>> kardiz = "ı¸ık" s >>> unikod = unicode(kardiz.Çünkü unicode() fonksiyonu da aslında bir dönü¸türme i¸lemi yapmaz. 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ı˘ ımıza dikkat edin. Karakterlerin kod konumlarını ya unicode tablolarına bakarak..txt". E˘ er özgün kod s g konumunu tekrar elde etmek isterseniz bu kez decode() adlı ba¸ka bir metottan yararlans abilirsiniz: >>> utfsekiz.3 encode() ve decode() Metotları Hatırlarsanız. unicode() fonksiyonu içinde g ¸ g kullandı˘ ımız utf-8 çözücüsünün görevi ise “ı¸ık” kelimesini Python’un do˘ ru okumasını sa˘ lag s g g maktır.encode("utf-8") Burada encode() adlı bir metottan yararlandı˘ ımıza dikkat edin.. Bunların bir sey ifade edebilmesi için bir kod çözücü vasıtasıyla kodlanması gerekir.decode("utf-8") u’\u015f’ ˙ste Python’da asıl dönü¸türme i¸lemlerini yapanlar bu encode() ve decode() adlı metotlardır. "utf-8") unibayt = unicode. 18. I¸ s s Dolayısıyla artık söyle bir sey yazabilirsiniz: ¸ ¸ >>> >>> >>> >>> kardiz = "ı¸ık" s unikod = unicode(kardiz. Bu fonksiyonun yaptı˘ ı s s g sey bir karakter dizisini kod konumları seklinde temsil etmekten ibarettir.. bu kod konumu esasında bilgisayarlar için çok fazla sey ifade g ¸ etmez.. ya da Python’daki s ord() ve unichr() fonksiyonlarını kullanarak bulabilece˘ inizi biliyorsunuz. "utf-8") f = open("deneme. "utf-8") >>> unikod u’\u0131\u015f\u0131k’ Burada gördü˘ ümüz sey bayt de˘ il unicode kod konumlarıdır.encode(unikod. g Böylece unicode kod konumunu “utf-8” kod çözücüsü ile kodlamı¸ oldunuz.

Yapmamız gereken tek g s sey karakter dizisinin ba¸ına bir “u” harfi getirmek.>>> f. ¸ s Su da bir unicode dizisidir: ¸ >>> unidiz = u"ı¸ık" s Bu unicode dizisi. len() fonksiyonu g her bir kod konumunu bir baytmı¸ gibi de˘ erlendirecektir: s g . “kardiz” adlı de˘ i¸keni etkile¸imli kabukta yazdırırsak baytları temsil eden karakterleri tek tek gs s görebiliriz: >>> kardiz ’\xc4\xb1\xc5\x9f\xc4\xb1k’ Su ise bir unicode dizisidir: ¸ >>> unidiz = u"elma" Gördü˘ ünüz gibi.close() Bu kısmı kısaca özetleyecek olursak söyle söyleyebiliriz: ¸ Python’da karakterlere ili¸kin iki farklı tip bulunur: karakter dizileri ve unicode dizileri s Mesela su bir karakter dizisidir: ¸ >>> kardiz = "elma" Bu karakter dizisi 4 baytlık bir veri içerir: >>> len(kardiz) 4 Su da bir karakter dizisidir: ¸ >>> kardiz = "ı¸ık" s Bu karakter dizisi ise 7 baytlık bir veri içerir: >>> len(kardiz) 7 Buradan çıkan sonuca bakarak karakter dizisi ile bayt sayısının aynı sey olmadı˘ ını anlamı¸ ¸ g s oluyoruz. Python’da unicode dizisi olu¸turmak oldukça kolay.write(unibayt) >>> f. E˘ er yukarıdaki unicode dizisini etkile¸imli kabukta yazdıracak olursanız bu unicode s g s kod konumlarını görebilirsiniz: >>> unidiz u’\u0131\u015f\u0131k’ E˘ er len() fonksiyonunu bu unicode dizisi üzerine uygulayacak olursanız. Ayrıca len() fonksiyonu da bir karakter dizisindeki karakter sayısını de˘ il bayt g sayısını veriyor. karakter dizilerinin aksine baytlardan de˘ il unicode kod konumlarından g olu¸ur.

4.name(u"˘") g ’LATIN SMALL LETTER G WITH BREVE’ “˘ ” harfinin unicode sistemindeki uzun adı “LATIN SMALL LETTER G WITH BREVE”dir.decode("utf-8") u’\u0131\u015f\u0131k’ Yukarıdaki i¸lem sununla aynıdır: s ¸ >>> unicode(kardiz. Bu kod çözücülerin her biri. bu veritabanındaki bilgileri kullanmamızı sa˘ lar.>>> len(unidiz) 4 Kod konumlarının bir i¸e yarayabilmesi için bunların uygun bir kod çözücü yardımıyla bayta s çevrilmeleri gerekir. UTF-16 ve UTF-32 gibi kod çözücüler vardır.encode("utf-8") ’\xc4\xb1\xc5\x9f\xc4\xb1k’ Unicode kod konumları bayta çevrildikten sonra artık bir unicode dizisi de˘ il. Bu kod çözücüleri içinde en esnek ve yaygın olanı utf-8 adlı kod çözücüdür.. karakter dizisi g olur: >>> type(unidiz. Python’da kod konumlarını bayta çevirmek için encode() adlı bir metottan yararlanabiliriz: >>> unidiz. s g Küçük bir örnek verelim: >>> import unicodedata >>> unicodedata.lookup("LATIN SMALL LETTER G WITH BREVE") u’\u011f’ Bir de suna bakalım: ¸ . kod konumlarını farklı bir biçimde ve boyutta bayta çevirir. "utf-8") u’\u0131\u015f\u0131k’ Böylece Python’daki “unicode” deste˘ ine ili¸kin en önemli metotları görmü¸ olduk.. s Artık 18. g s s Python’da “unicode”ye ili¸kin bazı önemli modülleri de incelemeye geçebiliriz. Unicode sistemi içinde UTF-8.4 unicodedata Modülü Bu modül unicode veritabanına eri¸erek.encode("utf-8") <type ’str’> E˘ er bir karakter dizisini unicode kod konumları ile temsil etmek isterseniz decode() metog dundan yararlanabilirsiniz: >>> kardiz. E˘ er g g isterseniz bu ismi ve lookup() metodunu kullanarak söz konusu karakterin unicode kod konumuna da ula¸abilirsiniz: s >>> unicodedata.

"r".4.txt". g Tıpkı o metotta oldu˘ u gibi g codecs.category(u"˘") g ’L1’ category() metodu ise bir unicode dizisinin unicode sistemindeki kategorisini gösteriyor. g g g 18. s g her türlü dosya i¸leminde kullanabilirsiniz.write(u"ı¸ık") s f.>>> unicodedata.open() metodunda da dosyaları “w”.5 codecs Modülü Bu modül Python’da bir dosyayı.open("deneme. Yukarıda verdi˘ imiz örne˘ e göre “˘ ” harfinin kategorisi “L1” yani “Latin-1”.. dosya i¸lemleri konusunu i¸lerken s s s gördü˘ ümüz open() metoduyla birbirine çok benzer.open("unicode. s g Ayrıca bu metot. “a” gibi kiplerde açabilirsiniz.txt". . "w".close() Elbette codecs modülünün open() metodunu sadece yeni dosya olu¸turmak için de˘ il.. kod çözücüyü de belirterek açmamızı sa˘ lar: g import codecs f = codecs. Bu metot. encoding="utf-8") for i in f: print i Böylece dosya içindeki ascii dı¸ı karakterleri do˘ ru görüntüleyebiliriz. yukarıdaki encode() metodunu kullanarak yaptı˘ ımız dosyaya yazma i¸lemini g s biraz daha kolayla¸tırabilir: s >>> >>> >>> >>> import codecs f = codecs. encoding="utf-8") f. “r”.

Ama bir noktadan sonra karakter dizilerini kullanarak yazdı˘ ınız kodlar iyice karma¸ıkla¸maya ba¸lamı¸sa. mesela. düzenli ifadeler ne kadar u˘ ra¸tırıcı olsa da programcının g s en önemli silahlarından biridir. hatta basit bir i¸lemi gerçekle¸tirmek için yazdı˘ ınız kod sayfa sınırlarını zorlamaya s s s g ba¸lamı¸sa.BÖLÜM 19 Düzenli ˙fadeler (Regular I Expressions) Düzenli ifadeler Python programlama dilindeki en çetrefilli konulardan biridir. bir sorunla ¸ kar¸ı kar¸ıya kaldıklarında söyle der: ‘Evet. bol bol alı¸tırma yapmanız durumunda düzenli ifadeleri kavramak o kadar da s zorlayıcı olmayacaktır.’ ˙ste onların s s ¸ I¸ bir sorunu daha vardır artık. Hem zaten biz de bu sayfalarda bu “sevimsiz” konuyu g olabildi˘ ince sevimli hale getirmek için elimizden gelen çabayı gösterece˘ iz. s s s Ama bu durumda Jamie Zawinski’nin su sözünü de aklınızdan çıkarmayın: “Bazıları. Emin olun yüzlerce dosya üzerinde tek tek elle de˘ i¸iklik yapmaktan daha zor de˘ ildir gs g düzenli ifadeleri ö˘ renip kullanmak. toplu halde görmek g istedi˘ imiz web adreslerinin bir listesi olabilir. E˘ er g g Python’daki karakter dizisi metotları. Örne˘ in bir web sitesinde g g da˘ ınık halde duran verileri bir çırpıda ayıklayabiliriz. s g Bütün zorluklarına ra˘ men programlama deneyimimizin bir noktasında mutlaka kar¸ımıza g s çıkacak olan bu yapıyı ö˘ renmemizde büyük fayda var. hem de çok daha hızlıdır. Düzenli ifadeleri ö˘ rendikten sonra. Tabii her güzel sey gibi.“ Ba¸ta da söyledi˘ im gibi.. i¸te o noktada artık düzenli ifadelerin dünyasına adım atmanız gerekiyor olabilir. çok sayıda belge üzg s g erinde tek hareketle istedi˘ imiz de˘ i¸iklikleri yapabiliriz. Çünkü karakter dizisi metotları. düzenli ifadelerden kaçabildi˘ imiz müddetçe kaçmamız gerekir. örne˘ in. Simdi lafı daha fazla uzatmadan i¸imize koyulalım.. g gs Genel bir kural olarak. g g elle yapılması saatler sürecek bir i¸lemi saliseler içinde yapabildi˘ inizi gördü˘ ünüzde eminim s g g düzenli ifadelerin ne büyük bir nimet oldu˘ unu anlayacaksınız. düzenli g ¸ ifadelerin nimetlerinden yararlanabilecek düzeye gelmek de biraz kan ve gözya¸ı istiyor. ¸ s 289 . Bu veriler. Hatta düzenli ifadeleri ö˘ rendikten sonra onsuz geçen yıllarınıza g acıyacaksınız. bu yapıyı kullanarak metinleri veya karakter dizilerini parma˘ ımızda oynatabiliriz.. kodların her tarafı if deyimleriyle dolg s s s s mu¸sa. Hatta düzenli ifadelerin Python içinde ayrı bir dil olarak dü¸ünülmesi gerekti˘ ini söyleyenler dahi vardır. düzenli ifadeler bize zorlukları unutturacak kadar büyük kolaylıklar s g sunar. o anda yapmak istedi˘ imiz sey için yeterli geliyorsa mutg ¸ laka o metotları kullanmalıyız.. düzenli ifadeleri kullanarak neler yapabiliriz? Çok genel bir ifadeyle. düzenli ifadelere kıyasla hem daha basit. s Peki. Bunun dı¸ında. Sizin de çaba g g göstermeniz. Unutmayın. düzenli ifadeleri kullanmam gerekiyor.

s Gördü˘ ünüz gibi.19. Yani bu yapının bize sundu˘ u araçları söyle ¸ g ¸ bir listeleyelim. su komutu kullanarak yukarıdaki metot¸ s g g ¸ lar/fonksiyonlar hakkında yardım da alabilirsiniz: >>> help(metot_veya_fonksiyon_adı) Bir örnek vermek gerekirse: >>> help(re. düzenli ifadeler bir programcının en önemli silahlarından g biridir. Tkinter modülünde ve öteki bütün modüllerde oldu˘ u g gibi.1 Düzenli ˙fadelerin Metotları I Python’daki düzenli ifadelere ili¸kin her sey bir modül içinde tutuluyor.match) Help on function match in module re: match(pattern. returning a match object. string. düzenli ifadeleri kullanabilmemiz için de öncelikle bu re modülünü içe aktarmamız gerekecek. 19.1. Bu i¸lemi nasıl yapaca˘ ımızı çok iyi biliyorsunuz: s g >>> import re Bir önceki bölümde söyledi˘ imiz gibi. Ve bunu da düzenli ifadeleri kullanarak yapmak istiyoruz. Python’un yardım dosyaları hep ˙ Ingilizce. Ne yazık ki. yukarıdaki metotların/fonksiyonların en sık kullanılanlarını size olabildi˘ ince yalın g bir sekilde anlatmaya çalı¸aca˘ ız. E˘ er isterseniz. Su halde silahımızın özelliklerine bakalım. daha ¸ s sonra bu kalıbı yukarıdaki karakter dizisi ile kar¸ıla¸tırmak. o halde match() metodu ile devam edelim. bu yardım dosyaları pek i¸inize yaramayacaktır. öncelikle bir düzenli ifade kalıbı olu¸turup. Biz bu sayfada ve ilerleyen g sayfalarda. sys modülünde. flags=0) Try to apply the pattern at the start of the string. s ¸ Tıpkı os modülünde." Varsayalım ki biz bu karakter dizisi içinde “python” kelimesi geçip geçmedi˘ ini ö˘ renmek isg g tiyoruz. Düzenli ifadeleri bu örne˘ e g uygulayabilmek için yapmamız gereken sey.1 match() Metodu Bir önceki bölümde metotlar hakkında yardım almaktan bahsederken ilk örne˘ imizi match() g metoduyla vermi¸tik. Diyelim ki elimizde söyle bir karakter dizisi var: g s ¸ >>> a = "python güçlü bir programlama dilidir. Biz bütün bu i¸lemleri match() s s s metodunu kullanarak yapabiliriz: . Etkile¸imli kabukta su kodu yazıyoruz: s ¸ >>> dir(re) Tabii yukarıdaki dir(re) fonksiyonunu yazmadan önce import re seklinde modülümüzü içe ¸ aktarmı¸ olmamız gerekiyor. Bu modülün adı re. or None if no match was found. re modülü içinde epey metot/fonksiyon var. Dolayısıyla e˘ er ˙ g Ingilizce bilmiyorsanız. s match() metodunu tarif etmek yerine. s Bu arada yukarıdaki yardım bölümünden çıkmak için klavyedeki q dü˘ mesine basmanız g gerekir. isterseniz bir örnek yardımıyla bu metodun ne i¸e s yaradı˘ ını anlamaya çalı¸alım.

s s g g ¸ karakter dizisi içinde bulunmu¸.match("Java". Bunu söyleme tarzı da yukarıdaki gibi. Aslında match() metodunun yaptı˘ ı bu i¸i.split()[0] == "python" True Demek ki a de˘ i¸keninin en ba¸ında “python” ifadesi varmı¸.. Yani re. aradı˘ ımız seyi buldu˘ u. karakter dizilerinin split() metodu yardımıyla da g s yapabiliriz: >>> a. ENTER tu¸una bastıktan sonra None çıktısı geldi. o zaman da None de˘ erini döndürüyor. Yani aradı˘ ımız sey.a) Burada ENTER tu¸una bastı˘ ımızda hiç bir çıktı almıyoruz. Düzenli ifade kalıpları match() ¸ s metodunun ilk argümanıdır (yani parantez içindeki ilk de˘ er). E˘ er yukarıdaki komutu söyle yazarsak None çıktısını biz de göreg ¸ biliriz: >>> print re. g s a de˘ i¸keninin tuttu˘ u karakter dizisi ile e¸le¸miyormu¸. E˘ er e¸le¸me yoksa. Aslında bu normal. hazırladı˘ ımız kalıbı kendisiyle e¸le¸tirece˘ imiz karakter dizisi g g s s g olacaktır.match("python".match("python". düzenli ifade kalıbının karakter dizisi ile e¸le¸ti˘ i anlamına geliyor.match("güçlü". match() metodu a de˘ i¸keninin g gs yalnızca en ba¸ına bakaca˘ ı için ve a de˘ i¸keninin en ba¸ında “güçlü” yerine “python” oldu˘ u s g gs s g için. Bize söyledi˘ i s g g tek sey. Buradan çıkardı˘ ımız sonuca göre. Yani Python güçlü bir dildir ifadesini tutan a de˘ i¸kenine s gs re. python seklinde bir düzenli ifade kalıbı olu¸turduk. match() metodu bize olumsuz yanıt veriyor.a) gibi bir fonksiyon uyguladı˘ ımızda. g s s g Biraz kafa karı¸tırmak için söyle bir örnek verelim: s ¸ >>> a = "Python güçlü bir dildir" >>> re. Yukarıdaki çık¸ g ¸ g tıda gördü˘ ümüz ifadeye Python’cada e¸le¸me nesnesi (match object) adı veriliyor.SRE_Match object at 0xb7d111e0> Bu çıktı. Bizim gs g s s s s g örne˘ imizde python a de˘ i¸keninin tuttu˘ u karakter dizisi ile e¸le¸ti˘ i için bize bir e¸le¸me g gs g s s g s s nesnesi döndürülüyor.a) None Gördü˘ ünüz gibi.a) ifadesi aracılı˘ ıyla python s s s s g g ifadesi ile a de˘ i¸keninin tuttu˘ u karakter dizisinin e¸le¸ip e¸le¸medi˘ ini sorguluyoruz. Bir de suna bakalım: gs s s ¸ . ˙ g Ikinci argümanımız ise (yani parantez içindeki ikinci de˘ er). Çünkü match() metodu bir karakter dizisinin sadece en ba¸ına bakar.a) Burada. Aslında biz görmesek de Python s g burada None çıktısı veriyor. Python bize burada ne buldu˘ unu söylemiyor. gs g s s s g Python match() metodu yardımıyla aradı˘ ımız seyi e¸le¸tirdi˘ i zaman bir e¸le¸me nesnesi g ¸ s s g s s (match object) döndürüyor. Çünkü g s s match() metodu yardımıyla yaptı˘ ımız sey aslında bir e¸le¸tirme i¸lemidir (match kelimesi ˙ g ¸ s s s Ingilizce’de e¸le¸mek anlamına geliyor).>>> re.. a) Burada a de˘ i¸keninde “güçlü” ifadesi geçti˘ i halde match() metodu bize bir e¸le¸me gs g s s nesnesi döndürmedi. Bir de su örne˘ e bakalım: ¸ g >>> re.match("güçlü". Demek ki Java ifadesi. Klavyede ENTER tu¸una bastıktan sonra kar¸ımıza söyle bir çıktı gelecek: s s ¸ <_sre.match("Java". Biz burada python düzenli ifadesinin a de˘ i¸keniyle s s gs e¸le¸ip e¸le¸medi˘ ine bakıyoruz.

Düzenli ifadeler Python’un çok güçlü araçlarından biridir.match("1". Ama istersek tabii ki bulunan seyi de ¸ g ¸ görme imkânımız var. s match() metodunu kullanarak bir kaç örnek daha yapalım: >>> sorgu = "1234567890" >>> re.SRE_Match object at 0xb7d111e0> >>> re.sorgu) None ˙ Isterseniz simdiye kadar ö˘ rendi˘ imiz seyleri söyle bir gözden geçirelim: ¸ g g ¸ ¸ 1.a) fonksiyonunu bir de˘ i¸kene atadık.match("perl". Dolayısıyla düzenli ifadeleri kullanabilmek için öncelikle bu re modülünü import re diyerek içe aktarmamız gerekir. e˘ er g s s s g g e¸le¸me varsa Python bize bir e¸le¸me nesnesi döndürecektir. split() veya startswith() metotlarını kullanmak daha mantıklıdır. bu fonksiygs onu komut satırına yazdı˘ ımızda bir e¸le¸me nesnesi elde ediyorduk. 6. s 7.a) >>> print b.match("perl". Ama biz bu çıktıdan. s 3. s s 8. ˙ste burada de˘ i¸kene g s s I¸ gs .split()[0] == "güçlü" False Veya aynı i¸i sadece startswith() metodunu kullanarak dahi yapabiliriz: s >>> a.match("124". Çünkü s split() ve startswith() metotları match() metodundan çok daha hızlı çalı¸acaktır. match() metodu None g g ¸ s de˘ eri döndürür.match("1234".sorgu) <_sre. E˘ er aradı˘ ımız sey karakter dizisinin en ba¸ında yer alıyorsa. Python’daki düzenli ifadelere ili¸kin bütün fonksiyonlar re adlı bir modül içinde yer alır. E˘ er aradı˘ ımız sey karakter dizisinin en ba¸ında yer almıyorsa. Hatırlarsanız. match() metodu ile bir e¸le¸tirme i¸lemi yaptı˘ ımızda. Bunun için group() metodunu kullanaca˘ ız: g >>> a = "perl. match() s s s s metodu ile bulunan seyin ne oldu˘ unu göremiyoruz.SRE_Match object at 0xb7d111e0> >>> re. match() metodu re modülü içindeki fonksiyonlardan biridir. python ve ruby yüksek seviyeli dillerdir. 4. 2." >>> b = re. match() metodu bir karakter dizisinin yalnızca en ba¸ına bakar.startswith("python") E˘ er düzenli ifadelerden tek beklentiniz bir karakter dizisinin en ba¸ındaki veriyle e¸le¸tirme g s s s i¸lemi yapmaksa. g 5.group() perl Burada.sorgu) <_sre. re. match() metodu bir g g ¸ s e¸le¸tirme nesnesi döndürür.>>> a. g Daha önce söyledi˘ imiz gibi. re modülünün içeri˘ ini dir(re) komutu yardımıyla listeleyebiliriz.

iddia) I >>> if nesne: . Hemen bakalım: >>> nesne = re. Ama her zaman istedi˘ imiz sey bununla sınırlı olmayacaktır. Bu durumu su sekilde teyit edeg ¸ s s ¸ ¸ bilirsiniz: >>> type(b) <type ’_sre. search() metodu karakter s s s s .1. match() metodunun. karakter dizilerinin sadece en ba¸ına bakıyg s ordu. e¸le¸me nesnelerinin bir metodudur. Simdi isterseniz bir örnek daha yapıp bu konuyu g g ¸ kapatalım: >>> iddia = "Adana memleketlerin en güzelidir!" >>> nesne = re.group() Peki. Önceki bölümde dir(re) seks ¸ linde gösterdi˘ imiz listeye tekrar bakarsanız. do˘ rug g dan do˘ ruya düzenli ifadelerin de˘ il.group() s s ..match("˙stanbul". iddia) >>> print nesne. line 1. ˙ g gs s s Isterseniz bu nesnenin metotlarına bir göz gezdirebiliriz: >>> dir(b) Dikkat ederseniz yukarıda kullandı˘ ımız group() metodu listede görünüyor..match("˙stanbul". ˙ste bu yazımızda inceleyece˘ imiz metot bu search() metodu olacakg I¸ g tır. print "e¸le¸me ba¸arısız!" s s s Simdi isterseniz bu match() metoduna bir ara verip ba¸ka bir metodu inceleyelim. else: . e¸le¸tirmek istedi˘ imiz düzenli ifade kalıbı bulunamazsa ne olur? Öyle bir durumda s s g yukarıdaki kodlar hata verecektir. Bu metot. iddia) I >>> print nesne.... search() metodu ile match() metodu arasında çok önemli bir fark vardır. match() metodu bir karakter dizisinin en ba¸ına bakıp bir e¸le¸tirme i¸lemi yaparken. print "e¸le¸en ifade: %s" %nesne. ¸ s 19. yazdı˘ ınız bir programın çökmesine neden olabilir.. in <module> AttributeError: ’NoneType’ object has no attribute ’group’ Böyle bir hata.atadı˘ ımız sey aslında bu e¸le¸me nesnesinin kendisi oluyor.SRE_Match’> Gördü˘ ünüz gibi. g ¸ karakter dizilerinin sadece ba¸ına bakmasını engellemenin yolları olmakla birlikte. Listedeki öbür g g s s metotları da sırası geldi˘ inde inceleyece˘ iz.group() Hata mesajımız: Traceback (most recent call last): File "<stdin>". bizim i¸imizi s s görecek çok daha kullanı¸lı bir metodu vardır düzenli ifadelerin. b de˘ i¸keninin tipi bir e¸le¸me nesnesi (match object).2 search() Metodu Bir önceki bölümde inceledi˘ imiz match() metodu.match("Adana". orada re modülünün search() adlı bir metodu g oldu˘ unu göreceksiniz. O yüzden kodlarımızı suna g ¸ benzer bir sekilde yazmamız daha mantıklı olacaktır: ¸ >>> nesne = re.

dizisinin genelinde bir arama i¸lemi yapar. Yani biri e¸le¸tirir, öbürü arar. Zaten search kelimesi s s s de ˙ Ingilizce’de aramak anlamına gelir... Hatırlarsanız, match() metodunu anlatırken söyle bir örnek vermi¸tik: ¸ s
>>> a = "Python güçlü bir dildir" >>> re.match("güçlü", a)

Yukarıdaki kod, karakter dizisinin ba¸ında bir e¸le¸me bulamadı˘ ı için bize None de˘ eri s s s g g döndürüyordu. Ama e˘ er aynı i¸lemi söyle yaparsak, daha farklı bir sonuç elde ederiz: g s ¸
>>> a = "Python güçlü bir dildir" >>> re.search("güçlü", a) <_sre.SRE_Match object at 0xb7704c98>

Gördü˘ ünüz gibi, search() metodu “güçlü” kelimesini buldu. Çünkü search() metodu, g match() metodunun aksine, bir karakter dizisinin sadece ba¸ tarafına bakmakla yetinmiyor, s karakter dizisinin geneli üzerinde bir arama i¸lemi gerçekle¸tiriyor. Tıpkı match() metodunda s s oldu˘ u gibi, search() metodunda da group() metodundan faydalanarak bulunan seyi görüng ¸ tüleyebiliriz:
>>> a = "Python güçlü bir dildir" >>> b = re.search("güçlü",a) >>> print b.group()

Simdiye kadar hep karakter dizileri üzerinde çalı¸tık. ˙ ¸ s Isterseniz biraz da listeler üzerinde örnekler verelim. Söyle bir listemiz olsun: ¸
>>> liste = ["elma", "armut", "kebap"] >>> re.search("kebap", liste)

Ne oldu? Hata aldınız, de˘ il mi? Bu normal. Çünkü düzenli ifadeler karakter dizileri üzg erinde i¸ler. Bunlar do˘ rudan listeler üzerinde i¸lem yapamaz. O yüzden bizim Python’a biraz s g s yardımcı olmamız gerekiyor:
>>> for i in liste: ... b = re.search("kebap", i) ... if b: ... print b.group() ... kebap

Hatta simdiye kadar ö˘ rendiklerimizle daha karma¸ık 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

Gördü˘ ünüz gibi, http://www.istihza.com sayfasında kaç adet “programlama” kelimesi geçiyg orsa hepsi ekrana dökülüyor. Siz isterseniz bu kodları biraz daha geli¸tirebilirsiniz: s
#-*-coding:utf-8-*import re import urllib kelime = raw_input("istihza.com’da aramak \ istedi˘iniz 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 artınca daha yetkin kodlar yazabilecek duruma gelece˘ iz. Ama simdilik elimg ¸ izde olanlar ancak yukarıdaki kodu yazmamıza müsaade ediyor. Unutmayın, düzenli ifadeler sahasında ısınma turları atıyoruz daha...

19.1.3 findall() Metodu
Python komut satırında, yani etkile¸imli kabukta, dir(re) yazdı˘ ımız zaman aldı˘ ımız listeye s g g tekrar bakarsak orada bir de findall() adlı bir metodun oldu˘ unu görürüz. ˙ste bu bölümde g I¸ findall() adlı bu önemli metodu incelemeye çalı¸aca˘ ız. s g Önce söyle bir metin alalım elimize: ¸
metin = """Guido Van Rossum Python’u geli¸tirmeye 1990 yılında ba¸lamı¸... s s s Yani aslında Python için nispeten yeni bir dil denebilir. Ancak Python’un çok uzun bir geçmi¸i olmasa da, bu dil öteki dillere kıyasla kolay olması, s hızlı olması, ayrı bir derleyici programa ihtiyaç duymaması ve bunun gibi pek çok nedenden ötürü ço˘u kimsenin gözdesi haline gelmi¸tir. Ayrıca g s Google’nin de Python’a özel bir önem ve de˘er verdi˘ini, çok iyi derecede g g Python bilenlere i¸ olana˘ı sundu˘unu da hemen söyleyelim. Mesela bundan s g g kısa bir süre önce Python’un yaratıcısı Guido Van Rossum Google’de i¸e ba¸ladı...""" s s

Bu metin içinde geçen bütün “Python” kelimelerini bulmak istiyoruz:
>>> print re.findall("Python",metin) [’Python’, ’Python’, ’Python’, ’Python’, ’Python’, ’Python’]

Gördü˘ ünüz gibi, metinde geçen bütün “Python” kelimelerini bir çırpıda liste olarak aldık. Aynı g i¸lemi search() metodunu kullanarak yapmak istersek yolu biraz uzatmamız 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

Gördü˘ ünüz gibi, metinde geçen bütün “Python” kelimelerini search() metodunu kullanarak g bulmak için öncelikle “metin” adlı karakter dizisini, daha önce karakter dizilerini i¸lerken s gördü˘ ümüz split() metodu yardımıyla bir liste haline getiriyoruz. Ardından bu liste üzerinde g bir for döngüsü kurduktan sonra search() ve group() metotlarını kullanarak bütün “Python” kelimelerini ayıklıyoruz. E˘ er karakter dizisini yukarıdaki sekilde listeye dönü¸türmezsek söyle g ¸ s ¸ bir netice alırız:
>>> nesne = re.search("Python",metin) >>> print nesne.group() Python

Bu sekilde metinde geçen sadece ilk “Python” kelimesini alabiliyoruz. E˘ er, do˘ rudan karakter ¸ g g dizisine, listeye dönü¸türmeksizin, for döngüsü uygulamaya kalkarsak söyle bir sey olur: s ¸ ¸
>>> for i in a: ... nesne = re.search("Python",metin) ... if nesne: ... print nesne.group()

Gördü˘ ünüz gibi, yukarıdaki kod ekranımızı “Python” çıktısıyla dolduruyor. E˘ er en sonda g g print nesne.group() yazmak yerine print i yazarsanız, Python’un ne yapmaya çalı¸tı˘ ını s g ve neden böyle bir çıktı verdi˘ ini anlayabilirsiniz. g

19.2 Metakarakterler
Simdiye kadar düzenli ifadelerle ilgili olarak verdi˘ imiz örnekler sizi biraz sa¸ırtmı¸ olabilir. ¸ g ¸ s s “Zor dedi˘ in bunlar mıydı?” diye dü¸ünmü¸ olabilirsiniz. Haklısınız, zira “zor” dedi˘ im, bug s s g raya kadar olan kısımda verdi˘ im örneklerden ibaret de˘ ildir. Buraya kadar olan bölümde g g verdi˘ im örnekler i¸in en temel kısmını gözler önüne sermek içindi. Simdiye kadar olan g s ¸ bölümde, mesela, python karakter dizisiyle e¸le¸tirme yapmak için “python” kelimesini kuls s landık. Esasında bu, düzenli ifadelerin en temel özelli˘ idir. Yani python karakter dizisini bir g düzenli ifade sayacak olursak (ki zaten öyledir), bu düzenli ifade en ba¸ta kendisiyle e¸le¸es s s cektir. Bu ne demek? Söyle ki: E˘ er aradı˘ ınız sey python karakter dizisi ise, kullanmanız ¸ g g ¸ gereken düzenli ifade de “python” olacaktır. Diyoruz ki: “Düzenli ifadeler en ba¸ta kendileriyle s e¸le¸irler”. Buradan su anlam çıkıyor: Demek ki bir de kendileriyle e¸le¸meyen düzenli ifadeler s s ¸ s s var. ˙ste bu durum, Python’daki düzenli ifadelere ki¸ili˘ ini kazandıran seydir. Biraz sonra ne I¸ s g ¸ demek istedi˘ imizi daha açık anlayacaksınız. Artık gerçek anlamıyla düzenli ifadelere giri¸ g s yapıyoruz! Öncelikle, elimizde a¸a˘ ıdaki gibi bir liste oldu˘ unu varsayalım: s g g
>>> liste = ["özcan", "mehmet", "süleyman", "selim", ... "kemal", "özkan", "esra", "dündar", "esin", ... "esma", "özhan", "özlem"]

Diyelim ki, biz bu liste içinden özcan, özkan ve özhan ö˘ elerini ayıklamak/almak istiyoruz. g Bunu yapabilmek için yeni bir bilgiye ihtiyacımız var: Metakarakterler.

Metakarakterler; kabaca, programlama dilleri için özel anlam ifade eden sembollerdir. Örne˘ in g daha önce gördü˘ ümüz “\n” bir bakıma bir metakarakterdir. Çünkü “\n” sembolü Python g için özel bir anlam ta¸ır. Python bu sembolü gördü˘ ü yerde yeni bir satıra geçer. Yukarıda s g “kendisiyle e¸le¸meyen karakterler” ifadesiyle kastetti˘ imiz sey de i¸te bu metakarakterlerdir. s s g ¸ s Örne˘ in, “a” harfi yalnızca kendisiyle e¸le¸ir. Tıpkı “istihza” kelimesinin yalnızca kendisiyle g s s e¸le¸ece˘ i gibi... Ama mesela “\t” ifadesi kendisiyle e¸le¸mez. Python bu i¸areti gördü˘ ü s s g s s s g yerde sekme (tab) dü˘ mesine basılmı¸ gibi tepki verecektir. ˙ste düzenli ifadelerde de buna g s I¸ benzer metakarakterlerden yararlanaca˘ ız. Düzenli ifadeler içinde de, özel anlam ifade eden g pek çok sembol, yani metakarakter vardır. Bu metakarakterlerden biri de “[ ]” sembolüdür. Simdi yukarıda verdi˘ imiz listeden özcan, özhan ve özkan ö˘ elerini bu sembolden yararla¸ g g narak nasıl ayıklayaca˘ ımızı görelim: g
>>> re.search("öz[chk]an",liste)

Bu kodu böyle yazmamamız gerekti˘ ini artık biliyoruz. Aksi halde hata alırız. Çünkü daha önce g de dedi˘ imiz gibi, düzenli ifadeler karakter dizileri üzerinde i¸lem yapabilir. Listeler üzerinde g s de˘ il. Dolayısıyla komutumuzu su sekilde vermemiz gerekiyor: g ¸ ¸
>>> for i in liste: ... nesne = re.search("öz[chk]an",i) ... if nesne: ... print nesne.group()

Aynı i¸lemi 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ı˘ ımız kod her zaman istedi˘ imiz sonucu g g vermez. Mesela listemiz söyle olsaydı: ¸
>>> liste = ["özcan demir", "mehmet", "süleyman", ... "selim", "kemal", "özkan nuri", "esra", "dündar", ... "esin", "esma", "özhan kamil", "özlem"]

Yukarıdaki kod bu liste üzerine uygulandı˘ ında, sadece almak istedi˘ imiz kısım de˘ il, ilgisiz g g g kısımlar da gelecektir. Gördü˘ ünüz gibi, uygun kodları kullanarak, özcan, özkan ve özhan g ö˘ elerini listeden kolayca ayıkladık. Bize bu imkânı veren sey ise “[ ]” adlı metakarakter oldu. g ¸ Aslında “[ ]” metakarakterinin ne i¸e yaradı˘ ını az çok anlamı¸ olmalısınız. Ama biz yine de s g s söyle bir bakalım bu metakaraktere. ¸ “[ ]” adlı metakarakter, yukarıda verdi˘ imiz listedeki “öz” ile ba¸layıp, “c”, “h” veya “k” g s harflerinden herhangi biri ile devam eden ve “an” ile biten bütün ö˘ eleri ayıklıyor. Gelin g bununla ilgili bir örnek daha yapalım:
>>> for i in liste: ... nesne = re.search("es[mr]a",i) ... if nesne: ... print nesne.group()

Gördü˘ ünüz gibi, “es” ile ba¸layıp, “m” veya “r” harflerinden herhangi biriyle devam eden g s ve sonunda da “a” harfi bulunan bütün ö˘ eleri ayıkladık. Bu da bize esma ve esra çıktılarını g verdi... Dedi˘ imiz gibi, metakarakterler programlama dilleri için özel anlam ifade eden sembollerdir. g “Normal” karakterlerden farklı olarak, metakarakterlerle kar¸ıla¸an bir bilgisayar normalden s s farklı bir tepki verecektir. Yukarıda metakarakterlere örnek olarak “\n” ve “\t” kaçı¸ dizilerini s

vermi¸tik. Örne˘ in Python’da print "\n" gibi bir komut verdi˘ imizde, Python ekrana “\n” s g g yazdırmak yerine bir alt satıra geçecektir. Çünkü “\n” Python için özel bir anlam ta¸ımaktadır. s Düzenli ifadelerde de birtakım metakarakterlerin kullanıldı˘ ını ö˘ rendik. Bu metakarakterler, g g düzenli ifadeleri düzenli ifade yapan seydir. Bunlar olmadan düzenli ifadelerle yararlı bir i¸ ¸ s yapmak mümkün olmaz. Bu giri¸ bölümünde düzenli ifadelerde kullanılan metakarakterlere s örnek olarak “[ ]” sembolünü verdik. Herhangi bir düzenli ifade içinde “[ ]” sembolünü gören Python, do˘ rudan do˘ ruya bu sembolle e¸le¸en bir karakter dizisi aramak yerine, özel bir i¸lem g g s s s gerçekle¸tirecektir. Yani “[ ]” sembolü kendisiyle e¸le¸meyecektir... s s s Python’da bulunan temel metakarakterleri topluca görelim: [].*+?{}^$|() Do˘ rudur, yukarıdaki karakterler, çizgi romanlardaki küfürlere benziyor. Endi¸elenmeyin, g s biz bu metakarakterleri olabildi˘ ince sindirilebilir hale getirmek için elimizden gelen çabayı g gösterece˘ iz. g Bu bölümde düzenli ifadelerin zor kısmı olan metakarakterlere, okurlarımızı ürkütmeden, yumu¸ak bir giri¸ yapmayı amaçladık. Simdi artık metakarakterlerin temelini attı˘ ımıza göre üste s s ¸ g kat çıkmaya ba¸layabiliriz. s

19.2.1 [ ] (Kö¸ eli Parantez) s
[ ] adlı metakaraktere önceki bölümde de˘ inmi¸tik. Orada verdi˘ imiz örnek suydu: g s g ¸
>>> for i in liste: ... nesne = re.search("öz[chk]an",i) ... if nesne: ... print nesne.group()

Yukarıdaki örnekte, bir liste içinde geçen özcan, özhan ve özkan ö˘ elerini ayıklıyoruz. Burada g bu üç ö˘ edeki farklı karakterleri (“c”, “h” ve “k”) kö¸eli parantez içinde nasıl belirtti˘ imize g s g dikkat edin. Python, kö¸eli parantez içinde gördü˘ ü bütün karakterleri tek tek liste ö˘ elerine s g g uyguluyor. Önce “öz” ile ba¸layan bütün ö˘ eleri alıyor, ardından “öz” hecesinden sonra “c” s g harfiyle devam eden ve “an” hecesi ile biten ö˘ eyi buluyor. Böylece özcan ö˘ esini bulmu¸ g g s oldu. Aynı i¸lemi, “öz” hecesinden sonra “h” harfini barındıran ve “an” hecesiyle biten ö˘ eye s g uyguluyor. Bu sekilde ise özhan ö˘ esini bulmu¸ oldu. En son hedef ise “öz” ile ba¸layıp “k” ¸ g s s harfi 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 bölümde yine [ ] metakarakteriyle ilgili olarak su örne˘ i de vermi¸tik: ¸ 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 kö¸eli parang g s tez içinde gördü˘ ü bütün karakterleri tek tek liste ö˘ elerine uygulayıp, esma ve esra ö˘ elerini g g g bize veriyor. Simdi bununla ilgili yeni bir örnek verelim. ¸ Diyelim ki elimizde söyle bir liste var: ¸
>>> a = ["23BH56","TY76Z","4Y7UZ","TYUDZ","34534"]

Mesela biz bu listedeki ö˘ eler içinde, sayıyla ba¸layanları ayıklayalım. g s dikkatlice inceleyin:
>>> for i in a: ... if re.match("[0-9]",i): ... print i ... 23BH56 4Y7UZ 34534

Simdi su kodları ¸ ¸

Burada parantez içinde kullandı˘ ımız ifadeye dikkat edin. “0” ile “9” arasındaki bütün ö˘ eleri g g içeren bir karakter dizisi tanımladık. Yani kısaca, içinde herhangi bir sayı barındıran ö˘ eleri g kapsama alanımıza aldık. Burada ayrıca search() yerine match() metodunu kullandı˘ ımıza g da dikkat edin. match() metodunu kullanmamızın nedeni, bu metodun bir karakter dizisinin sadece en ba¸ına bakması... Amacımız sayı ile ba¸layan bütün ö˘ eleri ayıklamak oldu˘ una s s g g göre, yukarıda yazdı˘ ımız kod, liste ö˘ eleri içinde yer alan ve sayı ile ba¸layan bütün ö˘ eleri g g s g ayıklayacaktır. Biz burada Python’a su emri vermi¸ oluyoruz: “Bana sayı ile ba¸layan bütün ¸ s s ö˘ eleri bul! Önemli olan bu ö˘ elerin sayıyla ba¸lamasıdır! Sayıyla ba¸layan bu ö˘ eler ister g g s s g harfle devam etsin, ister ba¸ka bir karakterle... Sen yeter ki bana sayı ile ba¸layan ö˘ eleri s s g bul!“ Bu emri alan Python, hemen liste ö˘ elerini gözden geçirecek ve bize 23BH56, 4Y7UZ ve 34534 g ö˘ elerini verecektir. Dikkat ederseniz, Python bize listedeki TY76Z ve TYUDZ ö˘ elerini verg g medi. Çünkü TY76Z içinde sayılar olsa da bunlar bizim ölçütümüze uyacak sekilde en ba¸ta ¸ s yer almıyor. TYUDZ ö˘ esinde ise tek bir sayı bile yok... g Simdi de isterseniz listedeki TY76Z ö˘ esini nasıl alabilece˘ imize bakalım: ¸ g g
>>> for i in a: ... if re.match("[A-Z][A-Z][0-9]",i): ... print i

Burada dikkat ederseniz düzenli ifademizin ba¸ında A-Z diye bir sey yazdık. Bu ifade “A” ile s ¸ “Z” harfleri arasındaki bütün karakterleri temsil ediyor. Biz burada yalnızca büyük harfleri sorguladık. E˘ er küçük harfleri sorgulamak isteseydik “A-Z” yerine “a-z” diyecektik. Düzenli g ifademiz içinde geçen birinci “A-Z” ifadesi aradı˘ ımız karakter dizisi olan “TY76Z” içindeki “T” g harfini, ikinci “A-Z” ifadesi “Y” harfini, “0-9” ifadesi ise “7” sayısını temsil ediyor. Karakter dizisi içindeki geri kalan harfler ve sayılar otomatik olarak e¸le¸tirilecektir. O yüzden ons s lar için ayrı bir sey yazmaya gerek yok. Yalnız bu söyledi˘ imiz son sey sizi aldatmasın. Bu ¸ g ¸ “otomatik e¸le¸tirme” i¸lemi bizim su anda kar¸ı kar¸ıya oldu˘ umuz karakter dizisi için geçers s s ¸ s s g lidir. Farklı nitelikteki karakter dizilerinin söz konusu oldu˘ u ba¸ka durumlarda i¸ler böyle g s s yürümeyebilir. Düzenli ifadeleri ba¸arılı bir sekilde kullanabilmenin ilk sartı, üzerinde i¸lem s ¸ ¸ s yapılacak karakter dizisini tanımaktır. Bizim örne˘ imizde yukarıdaki gibi bir düzenli ifade kalıbı g olu¸turmak i¸imizi görüyor. Ama ba¸ka durumlarda, duruma uygun ba¸ka kalıplar yazmak s s s s gerekebilir/gerekecektir. Dolayısıyla, tek bir düzenli ifade kalıbıyla hayatın geçmeyece˘ ini ung utmamalıyız. Simdi yukarıdaki kodu search() ve group() metotlarını kullanarak yazmayı deneyin. Elde ¸ etti˘ iniz sonuçları dikkatlice inceleyin. match() ve search() metotlarının ne gibi farklılıklara g sahip oldu˘ unu kavramaya çalı¸ın... Sorunuz olursa bana nasıl ula¸aca˘ ınızı biliyorsunuz... g s s g Bu arada, düzenli ifadelerle ilgili daha fazla sey ö˘ rendi˘ imizde yukarıdaki kodu çok daha sade ¸ g g bir biçimde yazabilece˘ iz. g

19.2.2 . (Nokta)
Bir önceki bölümde [ ] adlı metakarakteri incelemi¸tik. Bu bölümde ise farklı bir metakarakteri s inceleyece˘ iz. ˙ g Inceleyece˘ imiz metakarakter: ”.” g Bu metakarakter, yeni satır karakteri hariç bütün karakterleri temsil etmek için kullanılır. Mesela:
>>> for i in liste: ... nesne = re.match("es.a",i) ... if nesne: ... print nesne.group() ... esma esra

Gördü˘ ünüz gibi, daha önce [ ] metakarakterini kullanarak yazdı˘ ımız bir düzenli ifadeyi bu kez g g farklı sekilde yazıyoruz. Unutmayın, bir düzenli ifade birkaç farklı sekilde yazılabilir. Biz bunlar ¸ ¸ içinde en basit ve en anla¸ılır olanını seçmeliyiz. Ayrıca yukarıdaki kodu birkaç farklı sekilde de s ¸ yazabilirsiniz. Mesela su yazım da bizim durumumuzda geçerli bir seçenek olacaktır: ¸
>>> 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 seçene˘ i tercih g g etmeliyiz... Yalnız, unutmamamız gereken sey, bu ”.” adlı metakarakterin sadece tek bir ¸ karakterin yerini tutuyor olmasıdır. Yani söyle bir kullanım 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. ”.” sembolünün görevi sadece tek bir karakterin yerini tutmaktır (yeni satır karakteri hariç). Ama biraz sonra ö˘ renece˘ imiz g g metakarakter yardımıyla “ah” ve “meh” hecelerinin yerini de tutabilece˘ iz. g ”.” sembolünü kullanarak bir örnek daha yapalım. Bir önceki bölümde verdi˘ imiz a listesini g hatırlıyorsunuz:
>>> a = [’23BH56’, ’TY76Z’, ’4Y7UZ’, ’TYUDZ’, ’34534’]

Önce bu listeye bir ö˘ e daha ekleyelim: g
>>> a.append("1agAY54")

Artık elimizde söyle bir liste var: ¸
>>> a = [’23BH56’, ’TY76Z’, ’4Y7UZ’, ’TYUDZ’, ... ’34534’, "1agAY54"]

Simdi bu listeye söyle bir düzenli ifade uygulayalım: ¸ ¸
>>> for i in a: ... if re.match(".[0-9a-z]",i): ... print i ...

23BH56 34534 1agAY54

Burada yaptı˘ ımız sey çok basit. Su özelliklere sahip bir karakter dizisi arıyoruz: g ¸ ¸ 1. Herhangi bir karakter ile ba¸layacak. Bu karakter sayı, harf veya ba¸ka bir karakter olas s bilir. 2. Ardından bir sayı veya alfabedeki küçük harflerden herhangi birisi gelecek. 3. Bu ölçütleri kar¸ıladıktan sonra, aradı˘ ımız karakter dizisi herhangi bir karakter ile devam s g edebilir. Yukarıdaki ölçütlere uyan karakter dizilerimiz: 23BH56, 34534, 1agAY54 Yine burada da kendinize göre birtakım de˘ i¸iklikler yaparak, farklı yazım sekilleri ve farklı gs ¸ metotlar kullanarak ne olup ne bitti˘ ini daha iyi kavrayabilirsiniz. Düzenli ifadeleri gere˘ i gibi g g anlayabilmek için bol bol uygulama yapmamız gerekti˘ ini unutmamalıyız. g

19.2.3 * (Yıldız)
Bu metakarakter, kendinden önce gelen bir düzenli ifade kalıbını sıfır veya daha fazla sayıda e¸le¸tirir. Tanımı biraz karı¸ık olsa da örnek yardımıyla 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 sıfır veya daha fazla sayıda e¸le¸tiriyor. Yani mesela “st” içinde sıfır adet “a” karakteri var. Dolayısıyla bu karakter s s yazdı˘ ımız düzenli ifadeyle e¸le¸iyor. “sat” içinde bir adet “a” karakteri var. Dolayısıyla bu da g s s e¸le¸iyor. “saat” ve “saaat” karakter dizilerinde sırasıyla iki ve üç adet “a” karakteri var. Tabii s s ki bunlar da yazdı˘ ımız düzenli ifadeyle e¸le¸iyor. Listemizin en son ö˘ esi olan “falanca”da da g s s g ilk hecede bir adet “a” karakteri var. Ama bu ö˘ edeki sorun, bunun “s” harfiyle ba¸lamaması. g s Çünkü biz yazdı˘ ımız düzenli ifadede, aradı˘ ımız seyin “s” harfi ile ba¸lamasını, sıfır veya daha g g ¸ s fazla sayıda “a” karakteri ile devam etmesini ve ardından da “t” harfinin gelmesini istemi¸tik. s “falanca” ö˘ esi bu ko¸ulları kar¸ılamadı˘ ı için süzgecimizin dı¸ında kaldı. g s s g s Burada dikkat edece˘ imiz nokta, “*” metakarakterinin kendinden önce gelen yalnızca bir g karakterle ilgileniyor olması... Yani bizim örne˘ imizde “*” sembolü sadece “a” harfinin sıfır g veya daha fazla sayıda bulunup bulunmamasıyla ilgileniyor. Bu ilgi, en ba¸taki “s” harfini kaps samıyor. “s” harfinin de sıfır veya daha fazla sayıda e¸le¸mesini istersek düzenli ifademizi s s “s*a*t” veya “[sa]*t” biçiminde yazmamız gerekir... Bu iki seçenek içinde “[sa]*t” seklindeki ¸ yazımı tercih etmenizi tavsiye ederim. Burada, daha önce ö˘ rendi˘ imiz “[ ]” metakarakteri g g yardımıyla “sa” harflerini nasıl grupladı˘ ımıza dikkat edin... g Simdi ”.” metakarakterini anlatırken istedi˘ imiz sonucu alamadı˘ ımız listeye dönelim. Orada ¸ g g “ahmet” ve “mehmet” ö˘ elerini listeden ba¸arıyla ayıklayamamı¸tık. O durumda bizim g s s ba¸arısız olmamıza neden olan kullanım söyleydi: s ¸
>>> liste = ["ahmet", "kemal", "kamil", "mehmet"] >>> for i in liste: ... if re.match(".met",i): ... print i

Ama artık elimizde “*” gibi bir araç oldu˘ una göre simdi istedi˘ imiz seyi yapabiliriz. Yapmamız g ¸ g ¸ gereken tek sey ”.” sembolünden sonra “*” sembolünü getirmek: ¸
>>> for i in liste: ... if re.match(".*met",i): ... print i

Gördü˘ ünüz gibi “ahmet” ve “mehmet” ö˘ elerini bu kez ba¸arıyla ayıkladık. Bunu yapmamızı g g s sa˘ layan sey de “*” adlı metakarakter oldu... Burada Python’a su emri verdik: “Bana kelime g ¸ ¸ ba¸ında herhangi bir karakteri (”.” sembolü herhangi bir karakterin yerini tutuyor) sıfır veya s daha fazla sayıda içeren ve sonu da “met” ile biten bütün ö˘ eleri ver!” g Bir önceki örne˘ imizde “a” harfinin sıfır veya daha fazla sayıda bulunup bulunmamasıyla ilg gilenmi¸tik. Bu son örne˘ imizde ise herhangi bir harfin/karakterin sıfır veya daha fazla sayıda s g bulunup bulunmamasıyla ilgilendik. Dolayısıyla ”.*met” seklinde yazdı˘ ımız düzenli ifade, “ah¸ g met”, “mehmet”, “muhammet”, “ismet”, “kısmet” ve hatta tek ba¸ına “met” gibi bütün ö˘ eleri s g kapsayacaktır. Kısaca ifade etmek gerekirse, sonu “met” ile biten her sey (“met” ifadesinin ¸ kendisi de dâhil olmak üzere) kapsama alanımıza girecektir. Bunu günlük hayatta nerede kullanabilece˘ inizi hemen anlamı¸ olmalısınız. Mesela bir dizin içindeki bütün “mp3” dosyalarını g s bu düzenli ifade yardımıyla listeleyebiliriz:
>>> import os >>> import re >>> dizin = os.listdir(os.getcwd()) >>> for i in dizin: ... if re.match(".*mp3",i): ... print i

match() metodunu anlattı˘ ımız bölümde bu metodun bir karakter dizisinin yalnızca g ba¸langıcıyla ilgilendi˘ ini söylemi¸tik. Mesela o bölümde verdi˘ imiz su örne˘ i hatırlıyorsunuzs g s g ¸ g dur:
>>> a = "python güçlü bir dildir" >>> re.match("güçlü", a)

Bu örnekte Python bize çıktı olarak “None” de˘ erini vermi¸ti. Yani herhangi bir e¸le¸me bug s s s lamamı¸tı. Çünkü dedi˘ imiz gibi, match() metodu bir karakter dizisinin yalnızca en ba¸ına s g s bakar. Ama geldi˘ imiz su noktada artık bu kısıtlamayı nasıl kaldıraca˘ ınızı biliyorsunuz: g ¸ g
>>> re.match(".*güçlü",a)

Ama match() metodunu bu sekilde zorlamak yerine performans açısından en do˘ ru yol bu tür ¸ g i¸ler için search() metodunu kullanmak olacaktır. s Bunu da geçti˘ imize göre artık yeni bir metakarakteri incelemeye ba¸layabiliriz. g s

19.2.4 + (Artı)
Bu metakarakter, bir önceki metakarakterimiz olan “*” ile benzerdir. Hatırlarsanız, “*” metakarakteri kendisinden önceki sıfır veya daha fazla sayıda tekrar eden karakterleri ayıklıyordu. “+” metakarakteri ise kendisinden önceki bir veya daha fazla sayıda tekrar eden karakterleri ayıklar. Bildi˘ iniz gibi, önceki örneklerimizden birinde “ahmet” ve “mehmet” ö˘ elerini g g su sekilde ayıklamı¸tık: ¸ ¸ s

>>> for i in liste: ... if re.match(".*met",i): ... print i

Burada “ahmet” ve “mehmet” dı¸ında “met” seklinde bir ö˘ e de bu düzenli ifadenin kapsamına s ¸ g girecektir. Mesela listemiz söyle olsa idi: ¸
>>> liste = ["ahmet","mehmet","met","kezban"]

Yukarıdaki düzenli ifade bu listedeki “met” ö˘ esini de içine alacaktı. Çünkü “*” adlı metakarakg ter sıfır sayıda tekrar eden karakterleri de ayıklıyor. Ama bizim istedi˘ imiz her zaman bu g olmayabilir. Bazen de, ilgili karakterin en az bir kez tekrar etmesini isteriz. Bu durumda yukarıdaki düzenli ifadeyi su sekilde yazmamız gerekir: ¸ ¸
>>> for i in liste: ... if re.match(".+met",i): ... print i

Burada su komutu vermi¸ olduk: ” Bana sonu ‘met’ ile biten bütün ö˘ eleri ver! Ama bana ‘met’ ¸ s g ö˘ esini yalnız ba¸ına verme!” Aynı i¸lemi 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 bakalım: g ¸ g
>>> yeniliste = ["st", "sat", "saat", "saaat", "falanca"] >>> for i in yeniliste: ... if re.match("sa*t",i): ... print i

Burada yazdı˘ ımız düzenli ifadenin özelli˘ i nedeniyle “st” de kapsama alanı içine giriyordu. g g Çünkü burada “*” sembolü “a” karakterinin hiç bulunmadı˘ ı durumları da içine alıyor. Ama g e˘ er biz “a” karakteri en az bir kez geçsin istiyorsak, düzenli ifademizi su sekilde yazmalıyız: g ¸ ¸
>>> for i in yeniliste: ... if re.match("sa+t",i): ... print i

Hatırlarsanız önceki derslerimizden birinde kö¸eli parantezi anlatırken söyle bir örnek vers ¸ mi¸tik: s
>>> a = ["23BH56","TY76Z","4Y7UZ","TYUDZ","34534"] >>> for i in a: ... if re.match("[A-Z][A-Z][0-9]",i): ... print i

Burada amacımız sadece TY76Z ö˘ esini almaktı. Dikkat ederseniz, ö˘ enin ba¸ındaki “T” ve g g s “Y” harflerini bulmak için iki kez “[A-Z]” yazdık. Ama artık “+” metakarakterini ö˘ rendi˘ imize g g göre aynı i¸i daha basit bir sekilde yapabiliriz: s ¸

>>> for i in a: ... if re.match("[A-Z]+[0-9]",i): ... print i ... TY76Z

Burada “[A-Z]” düzenli ifade kalıbını iki kez yazmak yerine bir kez yazıp yanına da “+” sembolünü koyarak, bu ifade kalıbının bir veya daha fazla sayıda tekrar etmesini istedi˘ imizi beg lirttik... “+” sembolünün ne i¸ yaptı˘ ını da anladı˘ ımıza göre, artık yeni bir metakarakteri incelemeye s g g ba¸layabiliriz. s

19.2.5 ? (Soru ˙sareti) I¸
Hatırlarsanız, “*” karakteri sıfır ya da daha fazla sayıda e¸le¸meleri; “+” ise bir ya da daha s s fazla sayıda e¸le¸meleri kapsıyordu. ˙ste simdi görece˘ imiz ”?” sembolü de e¸le¸me sayısının s s I¸ ¸ g s s sıfır veya bir oldu˘ u durumları kapsıyor. Bunu daha iyi anlayabilmek için önceden verdi˘ imiz g g su örne˘ e bakalım: ¸ 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 ayıkladı˘ ını görüyoruz. Simdi de ”?” semg ¸ bolünün ne yaptı˘ ına bakalım: g
>>> for i in yeniliste: ... if re.match("sa?t",i): ... print i ... st sat

Gördü˘ ünüz gibi, ”?” adlı metakarakterimiz, kendisinden önce gelen karakterin hiç bulung madı˘ ı (yani sıfır sayıda oldu˘ u) ve bir adet bulundu˘ u durumları içine alıyor. Bu yüzden de g g g çıktı olarak bize sadece “st” ve “sat” ö˘ elerini veriyor. g Simdi bu metakarakteri kullanarak gerçek hayatta kar¸ımıza çıkabilecek bir örnek verelim. ¸ s Bu metakarakterin tanımına tekrar bakarsak, “olsa da olur olmasa da olur” diyebilece˘ imiz g durumlar için bu metakarakterin rahatlıkla kullanılabilece˘ ini görürüz. g

Söyle bir örnek verelim: Diyelim ki bir metin üzerinde arama yapacaksınız. Aradı˘ ınız kelime ¸ g “uluslararası”:

metin = """Uluslararası hukuk, uluslar arası ili¸kiler altında bir disiplindir. Uluslararası ili¸kile s s

Not: Bu metin http://tr.wikipedia.org/wiki/Uluslararas%C4%B1_hukuk adresinden alınıp üzerinde ufak de˘ i¸iklikler yapılmı¸tır. gs s Simdi yapmak istedi˘ imiz sey “uluslararası” kelimesini bulmak. Ama dikkat ederseniz metin ¸ g ¸ içinde “uluslararası” kelimesi aynı zamanda “uluslar arası” seklinde de geçiyor. Bizim bu iki ¸ kullanımı da kapsayacak bir düzenli ifade yazmamız gerekecek.
>>> nesne = re.findall("[Uu]luslar ?arası",metin) >>> for i in nesne: ... print i

Verdi˘ imiz düzenli ifade kalıbını dikkatlice inceleyin. Bildi˘ iniz gibi, ”?” metakarakteri, g g kendinden önce gelen karakterin (düzenli ifade kalıbını) sıfır veya bir kez geçti˘ i durumları g arıyor. Burada ”?” sembolünü ” ” karakterinden, yani “bo¸luk” karakterinden sonra kullandık. s Dolayısıyla, “bo¸luk karakterinin sıfır veya bir kez geçti˘ i durumları” hedefledik. Bu sekilde s g ¸ hem “uluslar arası” hem de “uluslararası” kelimesini ayıklamı¸ olduk. Düzenli ifademizde s ayrıca söyle bir sey daha yazdık: “[Uu]”. Bu da gerekiyor. Çünkü metnimiz içinde “ulus¸ ¸ lararası” kelimesinin büyük harfle ba¸ladı˘ ı yerler de var... Bildi˘ iniz gibi, “uluslar” ve “Uluslar” s g g kelimeleri asla aynı de˘ ildir. Dolayısıyla hem “u” harfini hem de “U” harfini bulmak için, daha g önce ö˘ rendi˘ imiz “[]” metakarakterini kullanıyoruz. g g

19.2.6 { } (Küme Parantezi)
{ } adlı metakarakterimiz yardımıyla bir e¸le¸meden 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 vardır. Küme içinde 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” harfinin en az sıfır kez, en çok da üç kez tekrar etmesini istedi˘ imiz g söyledik. Dolayısıyla, “a” harfinin sıfır, bir, iki ve üç kez tekrar etti˘ i durumlar ayıklanmı¸ oldu. g s Bu sayı çiftlerini de˘ i¸tirerek daha farklı sonuçlar elde edebilirsiniz. Ayrıca hangi sayı çiftinin gs daha önce ö˘ rendi˘ imiz ”?” metakarakteriyle aynı i¸i yaptı˘ ını bulmaya çalı¸ın... g g s g s

19.2.7 ^ (Sapka) ¸
^ sembolünün iki i¸levi var. Birinci i¸levi, bir karakter dizisinin en ba¸ındaki veriyi sorgulamaks s s tır. Yani aslında match() metodunun varsayılan olarak yerine getirdi˘ i i¸levi bu metakarakter g s yardımıyla açıkça belirterek yerine getirebiliyoruz. Su örne˘ e bakalım: ¸ 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 bakalım: ¸
>>> 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 oldukça hassas bir çıktı verdi bize. Çıktıdaki bütün ¸ g de˘ erler, aynen düzenli ifademizde belirtti˘ imiz gibi, yan yana bir veya daha fazla harf içeriyor g g ve sonra da bir sayı ile devam ediyor. Bu farklılı˘ ın nedeni, ilk kodlarda print i ifadesini kulg lanmamız. Bu durumun çıktılarımızı nasıl de˘ i¸tirdi˘ ine dikkat edin. Bir de su örne˘ e bakalım: gs g ¸ g
>>> for i in a: ... if re.match("[A-Z]+[0-9]",i): ... print i ... TY76Z

Burada sadece TY76Z çıktısını almamızın nedeni, match() metodunun karakter dizilerinin en ba¸ına bakıyor olması. Aynı etkiyi search() metoduyla da elde etmek için, ba¸lıkta geçen “^” s s (¸apka) sembolünden yararlanaca˘ ız: s g
>>> for i in a: ... nesne = re.search("^[A-Z]+[0-9]",i) ... if nesne: ... print nesne.group() ... TY7

Gördü˘ ünüz gibi, “^” (¸apka) metakarakteri search() metodunun, karakter dizilerinin sadece g s en ba¸ına bakmasını sa˘ ladı. O yüzden de bize sadece, TY7 çıktısını verdi. Hatırlarsanız aynı s g kodu, sapkasız olarak, su sekilde kullanmı¸tık yukarıda: ¸ ¸ ¸ s
>>> for i in a: ... nesne = re.search("[A-Z]+[0-9]",i) ... if nesne:

... ... BH5 TY7 Y7 AY5

print nesne.group()

Gördü˘ ünüz gibi, sapka sembolü olmadı˘ ında search() metodu karakter dizisinin ba¸ına bakg ¸ g s makla yetinmiyor, aynı zamanda karakter dizisinin tamamını tarıyor. Biz yukarıdaki koda bir “^” sembolü ekleyerek, metodumuzun sadece karakter dizisinin en ba¸ına bakmasını istes dik. O da emrimize sadakatle uydu. Burada dikkatimizi çekmesi gereken ba¸ka bir nokta s da search() metodundaki çıktının kırpılmı¸ olması. Dikkat ettiyseniz, search() metodu bize s ö˘ enin tamamını vermedi. Ö˘ elerin yalnızca “[A-Z]+[0-9]” kalıbına uyan kısımlarını kesip attı g g önümüze. Çünkü biz ona tersini söylemedik. E˘ er ö˘ elerin tamamını istiyorsak bunu açık açık 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 ba¸ına bakmasını istersek: s
>>> for i in a: ... nesne = re.search("^[A-Z]+[0-9].*",i) ... if nesne: ... print nesne.group() ... TY76Z

Bu kodlarda düzenli ifade kalıbının sonuna ”.*” sembolünü ekledi˘ imize dikkat edin. Böylelikle g metodumuzun sonu herhangi bir sekilde biten ö˘ eleri bize vermesini sa˘ ladık... ¸ g g Ba¸ta da söyledi˘ imiz gibi, “^” metakarakterinin, karakter dizilerinin en ba¸ına demir atmak s g s dı¸ında ba¸ka bir görevi daha vardır: “Hariç” anlamına gelmek... Bu görevini sadece “[]” s s metakarakterinin içinde kullanıldı˘ ı zaman yerine getirir. Bunu bir örnekle görelim. Yukarıg daki listemiz üzerinde öyle bir süzgeç uygulayalım ki, 1agAY54 ö˘ esi çıktılarımız arasında g görünmesin... Bu ö˘ eyi avlayabilmek için kullanmamız gereken düzenli ifade söyle olacaktır: 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 ölçütlere sahip bir ö˘ e arıyoruz: ¸ g 1. Aradı˘ ımız ö˘ e bir sayı veya büyük harf ile ba¸lamalı g g s 2. En ba¸taki sayı veya büyük harften sonra küçük harf GELMEMEL˙ (Bu ölçütü “^” i¸areti s I s sa˘ lıyor) g 3. Üstelik bu “küçük harf gelmeme durumu” bir veya daha fazla sayıda tekrar etmeli... Yani ba¸taki sayı veya büyük harften sonra kaç tane olursa olsun asla küçük harf gelmemeli s

search("^at$". "yat".i): .. "atkı"....search("^at".i): . if re.. print i . E˘ er biz “at” ile ba¸layan bütün ö˘ eleri ayıklamak isteseydik ne yapmamız gerekg s g ti˘ ini biliyorsunuz: g >>> for i in liste: . Unutmayalım. Verdi˘ imiz düzenli ifade kalıbı ile “at” ile ba¸layan ve g g s aynı sekilde biten karakter dizilerini ayıkladık. at atkı Gördü˘ ünüz gibi. Bu soyut açıkg s g lamaları somut bir örnekle ba˘ layalım: g >>> liste = ["at". “^” i¸areti bir karakter dizisinin nasıl ba¸layaca˘ ını belirlerken. if re.. print i .search("at$". Bu sembol bir bakıma karakter dizilerinin nasıl ba¸layaca˘ ını belirliyordu.. "sat".. Hatta istersek bu metakarakterleri birlikte de g kullanabiliriz: >>> for i in liste: . Dolayısıyla bu ö˘ e çıktıda görünmeyecek.. “at” hecesiyle biten g g kelimeleri ayıklamak istiyoruz: >>> for i in liste: .8 $ (Dolar) Bir önceki bölümde “^” i¸aretinin... Diyelim ki biz bu listeden... karakter dizilerinin en ba¸ına demir attı˘ ını söylemi¸tik.i): . elimizde on ö˘ elik bir liste var. "fakat". "katkı". ... at fakat rahat mat yat sat Burada “$” metakarakteri sayesinde aradı˘ ımız karakter dizisinin nasıl bitmesi gerekti˘ ini beg g lirleyebildik.(Bu ölçütü de “+” i¸areti sa˘ lıyor”) s g Bu ölçütlere uymayan tek ö˘ e “1agAY54” olacaktır. at Sonuç tam da bekledi˘ imiz gibi oldu. print i . bu “^” i¸aretinin “hariç” anlamı sadece “[]” metakarakterinin içinde kuls lanıldı˘ ı zaman geçerlidir. s s g s Yani bu sembol arama/e¸le¸tirme i¸leminin karakter dizisinin en ba¸ından ba¸lamasını sa˘ lıys s s s s g ordu... ¸ . if re. ˙ste simdi s g I¸ ¸ görece˘ imiz “dolar i¸areti” de ($) karakter dizilerinin nasıl bitece˘ ini belirliyor. Bu da bize “at” çıktısını verdi.. g g Burada.. "satılık". "mat".. g 19. "katılım"] Gördü˘ ünüz gibi.2. “$” i¸areti g s s g s aynı karakter dizisinin nasıl bitece˘ ini belirliyor... “^” i¸aretinin nasıl kullanıldı˘ ına ve küçük harfleri nasıl dı¸arıda bıraktı˘ ına dikkat s g s g edin. "rahat".

bunların ta¸ıdıkları özel anlam yüzünden bu sembolleri ayıklag s mak hemencecik mümkün olmayacaktır.2. if re. bunu Python’a nasıl anlataca˘ ız? Çünkü bu sembolü yazdı˘ ımız zaman Python bunu farklı algılıyor.. Python’daki düzenli ifadeler açısından özel anlam ta¸ıyan bir takım g s semboller/metakarakterler var. Hemen bakalım: >>> for i in liste: ... if re....9 \ (Ters Bölü) Bu i¸aret bildi˘ imiz “kaçı¸ dizisi”dir. Diyelim ki elimizde söyle bir liste var: ¸ >>> liste = ["10$"..i): .2...19.. Bu g s metakarakteri de kısaca anlattı˘ ımıza göre yeni bir metakarakterle yolumuza devam edebilig riz.. Peki biz ne yapaca˘ ız? ˙ste bu noktada “\” metakarakteri devreye g I¸ girecek..search("^at|at$". birden fazla düzenli ifade kalıbını birlikte e¸le¸tirmemizi sa˘ lar.i): . .. "satılık".. if re.. print i . "20$"... bizim sayıyla biten bir karakter dizisi aradı˘ ımızı s g zannedecek.. "rahat". "mat". "katkı". Yani bir karakter dizisi içinde s s bu sembolleri arıyorsak e˘ er. "25€". 19. "fakat". dolayısıyla da herhangi bir çıktı vermeyecektir. "10TL".. “\” sembolünü kullanarak “$” i¸aretinin özel anlamından kaçtık.match("[0-9]+\$". print i . at fakat atkı rahat mat yat sat .. g g Lafı dolandırmadan hemen bir örnek verelim.. "yat".10 | (Dik Çizgi) Bu metakarakter.. "sat".. Bunlar kendileriyle e¸le¸miyorlar.match("[0-9]+$".. "25£"] Amacımız bu listedeki dolarlı de˘ erleri ayıklamaksa ne yapaca˘ ız? Sunu deneyelim önce: g g ¸ >>> for i in liste: . Çünkü listemizde sayıyla biten bir karakter dizisi yok. Peki burada ne i¸i var? Simdiye kadar ö˘ rendi˘ imiz konus g s s ¸ g g lardan gördü˘ ünüz gibi.. Bu ne des s g mek? Hemen görelim: >>> liste = ["at". Yani mesela biz “$” sembolünü arıyor olsak....i): . print i Python “$” i¸aretinin özel anlamından dolayı. 10$ 20$ Gördü˘ ünüz gibi.. "katılım"] >>> for i in liste: . "atkı"..

g g Diyelim ki biz http://www.search(’<a href=". Dolayısıyla g ”. Burada “+” s s metakarakterinden önce gelen düzenli ifade.... .html adresindeki bütün ba¸lıkları s ve bu ba¸lıklara ait html dosyalarını bir liste halinde almak istiyoruz. mesela. Amacımız bu sayfadaki ba¸lıkları ve bu ba¸lıklara ait html dosyalarını s s listelemek 2. if re. (Firefox’ta CTRL+U’ya basarak g sayfa kayna˘ ını görebilirsiniz) g 4.com/py2/icindekiler_python.Gördü˘ ünüz gibi “|” metakarakterini kullanarak ba¸ta ve sonda “at” hecesini içeren kelimeleri g s ayıkladık.. 19.+</a>.group() Burada yaptı˘ ımız sey su: g ¸ ¸ 1..+html)” kısmında geçen “+” metakarakteri kendisinden önce gelen düzenli ifadenin bir veya daha fazla sayıda tekrar eden e¸le¸melerini buluyor. .istihza.com/py2/icindekiler_python. Bu sembol bildi˘ iniz gibi..html”>Temel Bilgiler</a> Dolayısıyla aslında düzenli ifade kalıbımızı yazarken yaptı˘ ımız sey.i): print i Sırada son metakarakterimiz olan “()” var.istihza. bütün sayfayı taramak için basit bir for döngüsü kurduk 3. Bunun için söyle bir sey s ¸ ¸ yazabiliriz: import re import urllib url = "http://www. Aynı sekilde. g ¸ ¸ . renkleri içeren bir listeden belli renkleri de ayıklayabiliriz bu ¸ metakarakter yardımıyla. “herhangi bir karakter” anlamına geliyor.i) if nesne: print nesne. düzenli ifademizi kaynakta görünen sablona uydurmak. web tarayıcınızda http://www.. Öncelikle “http://www.istihza. Çünkü bahsi geçen ¸ web sayfasındaki html uzantılı dosyalar “a href=” tag’ı içinde yer alıyor.html sayfasını açıp sayfa kayna˘ ını görüntüleyerek teyit edebilirsiniz. yazdı˘ ımız sey s g ¸ su anlama geliyor: “Bana ‘html’ ile biten bütün karakter dizilerini bul!“ ¸ 5. Bu durumu..istihza.com/py2/icindekiler_python.urlopen(url) for i in f: nesne = re.+” ifadesi su demek oluyor: “Bana bir veya daha fazla sayıda tekrar eden bütün karak¸ terleri bul!” Dolayısıyla burada “(..istihza.search("kırmızı|mavi|sarı".html” adresinin kayna˘ ına g baktı˘ ımız zaman aradı˘ ımız bilgilerin hep su sekilde oldu˘ unu görüyoruz: g g ¸ ¸ g <a href=”tbilgi_giris..” sembolü. Ardından.+html">.11 ( ) (Parantez) Bu metakarakter yardımıyla düzenli ifade kalıplarını gruplayaca˘ ız.html" f = urllib.com/py2/icindekiler_python. “http://www.2. Düzenli ifade kalıbımızı söyle yazdık: <a href=".+html">. kendisi de bir metakarakter olan ”.+html)” ifadesini birlikte dü¸ünürsek. Bu metakarakter bizim bir g karakter dizisinin istedi˘ imiz kısımlarını ayıklamamızda çok büyük kolaylıklar sa˘ layacak.html” sayfasını urllib modülü yardımıyla açtık.+</a>’.com/py2/icindekiler_python... Yazdı˘ ımız düzenli ifade kalıbı içinde dikkatimizi çekmesi gereken bazı noktalar var: g Kalıbın “(.

Dilerseniz en ba¸ta verdi˘ imiz kodlara tekrar dönelim: s g import re import urllib url = "http://www..+)</a>’. “( )” metakarakterini kullanarak düzenli ifadenin g bazı bölümlerini nasıl grupladı˘ ımıza dikkat edin.+html">.istihza.\nBa˘lantı: %s\n" \ s g %(nesne.search(’<a href=".group() Simdi bu kodlarda su de˘ i¸ikli˘ i yapıyoruz: ¸ ¸ gs g #-*-coding:utf-8-*import re import urllib url = "http://www.Yukarıda verdi˘ imiz kodları çalı¸tırdı˘ ımız zaman aldı˘ ımız çıktı su sekilde oluyor: g s g g ¸ ¸ <a href="index.i) if nesne: print nesne.nesne..com g g g sitesinin sayfa yapısıyla sıkı sıkıya ba˘ lantılıdır. Hemen hemen amacımıza ula¸tık sayılır..html s g ˙ste bu bölümde görece˘ imiz “( )” metakarakteri istedi˘ imiz seyi yapmada bize yardımcı olaI¸ g g ¸ cak. . g .html" f = urllib. .urlopen(url) for i in f: nesne = re.istihza. elbette www.search(’<a href="(. çünkü bir sonraki bölümde bütün karanlık noktaları s tek tek açıklayaca˘ ız.i) if nesne: print "Ba¸lık: %s. Ama gördü˘ ünüz gibi çıktımız biraz karma¸ık.. Bazı noktalar gözünüze g gs s karanlık göründüyse hiç endi¸e etmeyin.+</a>’..group(2).com/py2/icindekiler_python. de˘ il mi? Mesela bu çıktıları su sekilde düzenleyeg g ¸ ¸ bilmek ho¸ olurdu: s Ba¸lık: ANA SAYFA. Burada en azından.+html)">(.html" f = urllib.urlopen(url) for i in f: nesne = re.. Çünkü yazdı˘ ımız düzenli ifade istihza.com/py2/icindekiler_python.group(1)) Kodlarda yaptı˘ ımız de˘ i¸ikliklere dikkat edin ve anlamaya çalı¸ın.com sitesinde herhangi bir de˘ i¸iklik olursa yukarıdaki kodgs ların istedi˘ iniz çıktıyı vermeyece˘ ini bilmelisiniz.istihza. g Bu arada. Ba˘lantı: index. Bunları s g s istedi˘ imiz gibi düzenleyebilsek iyi olurdu.html">ANA SAYFA</a> .

˙ ¸ g Isterseniz ilk olarak söyle basit ¸ bir örnek verelim: >>> a = "python bir program:lama dilidir" >>> nesne = re. ˙ g g Isterseniz kullanabilece˘ imiz metotları tekrar listeleyelim: g >>> dir(nesne) Bu listede group() dı¸ında bir de groups() adlı bir metodun oldu˘ unu görüyoruz. Gerisinin nasıl olaca˘ ını tahmin edeg g bilirsiniz: >>> print nesne. Simdi bu grupladı˘ ımız bölümlere g s s ¸ g tek tek eri¸elim: s >>> print nesne.group(3) programlama >>> print nesne. g Daha önceki bölümlerden hatırlayaca˘ ınız gibi. Bir de suna bakalım: g s s ¸ >>> print nesne.19. Esasında biz bu s s g metodu önceki bölümlerde de kullanmı¸tık. bu metot düzenli ifadeleri kullanarak g e¸le¸tirdi˘ imiz karakter dizilerini görme imkanı sa˘ lıyordu.3.search("(python) (bir) (programlama) (dilidir)".a) >>> print nesne. “0” indeksi e¸le¸en karakter dizisinin tamamını veriyor.group(0) python bir programlama dilidir Gördü˘ ünüz gibi.group() python bir programlama dilidir Burada düzenli ifade kalıbımızı nasıl grupladı˘ ımıza dikkat edin. print nesne. Ama burada bu metoda biraz daha ayrıntılı olarak s bakaca˘ ız.group(2) bir >>> print nesne. s g . Simdi bunun s g ¸ ne i¸ yaptı˘ ına bakalım.group(1) python Burada 1 numaralı grubun ö˘ esi olan “python”u aldık.group(4) dilidir Bu metodun bize ilerde ne büyük kolaylıklar sa˘ layaca˘ ını az çok tahmin ediyorsunuzdur.group() komug tunu verdi˘ imizde e¸le¸en karakter dizileri ekrana döküldü. Bu bölümde bu metodu “()” s s g g metakarakteri yardımıyla daha verimli bir sekilde kullanaca˘ ız.1 group() metodu Bu bölümde do˘ rudan düzenli ifadelerin de˘ il.3 E¸ le¸ me Nesnelerinin Metotları s s 19. ama düzenli ifadeler kullanılarak üretilen g g e¸le¸me nesnelerinin bir metodu olan group() metodundan bahsedece˘ iz.

.urlopen(url) for i in f: nesne = re.. ’TKINTER’) (’makaleler.nesne.html" f = urllib.html" f = urllib.+html)">(. ’PYTHON’) (’icindekiler_tkinter.+)</a>’..html’.groups() (’python’.i) if nesne: print nesne. ’ANA SAYFA’) (’icindekiler_python..search(’<a href="(..istihza. bize kullanabilece˘ imiz bütün grupları bir demet halinde sunar: g >>> print nesne. O yüzden simdilik bu konuya ara verelim. .istihza.com/py2/icindekiler_python.3.19.urlopen(url) for i in f: nesne = re. Biz de bu demetin ö˘ elerine daha sonradan rahatlıkla g g eri¸ebiliyoruz..group(2).+html)">(.2 groups() metodu Bu metot.html’. ’dilidir’) Simdi isterseniz bir önceki bölümde yaptı˘ ımız örne˘ e geri dönelim: ¸ g g #-*-coding:utf-8-*import re import urllib url = "http://www. ’programlama’. g ¸ .\nBa˘lantı: %s\n" \ s g %(nesne. ’MAKALELER’) .group(1)) Bu kodlarda son satırı söyle de˘ i¸tirelim: ¸ gs #-*-coding:utf-8-*import re import urllib url = "http://www. ’bir’. .search(’<a href="(.. Bunları daha s s s sonraki örneklerimizde de bol bol kullanaca˘ ız.html’..+)</a>’.com/py2/icindekiler_python.i) if nesne: print "Ba¸lık: %s. s Böylece e¸le¸tirme nesnelerinin en sık kullanılan iki metodunu görmü¸ olduk.html’.groups() Gördü˘ ünüz gibi suna benzer çıktılar elde ediyoruz: g ¸ (’index.groups() komutu bize “()” metakarakteri ile daha önceden gruplamı¸ oldu˘ us g muz ö˘ eleri bir demet olarak veriyor. Demek ki nesne.

.3 Özel Diziler Düzenli ifadeler içinde metakarakterler dı¸ında..i) .group() abc123_ “\w” özel dizisinin hangi karakterleri e¸ledi˘ ine dikkat edin. print nesne. if nesne: . g 1... “\d” dizisi ile yerine getirebiliriz. bir sayı ile ba¸layan..search("\w*".. Ama bir de bunların büyük harfli versiyonları vardır ki..19. Bu özel dizi su ifadeyle aynı ans g ¸ lama gelir: [A-Za-z0-9_] Düzenli ifadeler içindeki özel diziler genel olarak bunlardan ibarettir.a).. "4 Ekim". ardından bir adet bo¸luk karakteri içeren. Simdi s ¸ artık aynı i¸levi daha kısa yoldan.. nesne = re. "27Mart".group() . 5 Ocak 4 Ekim Burada.. ˙ s Isterseniz yine yukarıdaki örnekten gidelim: >>> a = ["5 Ocak". önemli oldukları için onları da inceleyece˘ iz. Örne˘ in: s g >>> a = ["5 Ocak"... Burada bo¸luk karakterini s “s” simgesi ile gösterdi˘ imize dikkat edin. 5 Ocak 4 Ekim Yukarıdaki örnekte. özel anlamlar ta¸ıyan bazı ba¸ka ifadeler de s s s vardır. "27Mart". “[0-9]” yerine “\d” yerle¸tirerek daha kısa yoldan sonuca vardık. "4 Ekim". bir karakter dizisi içinde geçen ondalık sayıları e¸le¸tirmek için kullanılır. nesne = re. print nesne. s Alfanümerik Karakterlerin Yerini Tutan Özel Dizi: \w Bu sembol.. g Ondalık Sayıların Yerini Tutan Özel Dizi: \d Bu sembol. sonra da bir s s büyük veya küçük harfle devam eden karakter dizilerini ayıkladık. if nesne: . "Nisan 3"] >>> for i in a: .search("[0-9]\s[A-Za-z]+". Bu bölümde bu özel dizileri inceleyece˘ iz: Bo¸luk karakterinin yerini tutan özel dizi: \s g s Bu sembol.3. g Gördü˘ ünüz gibi. “\s” özel dizisi bo¸luk karakterlerini avlıyor s .i) . "Nisan 3"] >>> for i in a: ..search("\d\s[A-Za-z]+". bir karakter dizisi içinde geçen bo¸lukları yakalamak için kullanılır.. bir karakter dizisi içinde geçen alfanümerik karakterleri ve buna ek olarak “_” karakterini bulmak için kullanılır.group() . Su örne˘ e bakalım: ¸ g >>> a = "abc123_$%+" >>> print re. Buraya s s kadar olan örneklerde bu i¸levi yerine getirmek için “[0-9]” ifadesinden yararlanıyorduk..

group(3)) Burada formülümüz su sekilde: “Bir veya daha fazla karakter” + “bir veya daha fazla bo¸luk” ¸ ¸ s + “’:’ i¸areti” + “bir adet bo¸luk” + “bir veya daha fazla sayı” s s ˙ Isterseniz bu bölümü çok basit bir soruyla kapatalım..i) .group() . “\S” özel dizisi bo¸luk olmayan karakterleri avlar s 2.. 27Mart Burada “\S” özel dizisinin listede belirtilen konumda bo¸luk içermeyen ö˘ eyi nasıl buldu˘ una s g g dikkat edin. “\W” özel dizisi alfanümerik olmayan karakterleri ve “_” olmayan karakterleri avlar. "Nisan 3"] >>> for i in a: ..%--%%--%%--%%--#####%%%--%%--%%--#####%+m+$$$$%$.coding: utf-8 -*import re dosya = open("adres...search("\d+\S\w+". “\D” ve “\W” dizilerinin yeterince anla¸ılır oldu˘ unu zannediyos g s g rum.i) if nesne: print "%s > %s"%(nesne. Simdi bu özel diziler için genel bir örnek verip konuyu kapatalım. "27Mart". if nesne: . Burada sanırım sadece “\S” dizisi bir örnekle somutla¸tırılmayı hakediyor: s >>> a = ["5 Ocak"... Yani [^A-Z-a-z_] ile e¸de˘ erdir.readlines(): nesne = re.nesne.. print nesne. Yani “[^0-9]” ile e¸de˘ erdir.. Sorumuz su: ¸ Elimizde söyle bir yı˘ ın var: ¸ g +%01010101$-+$$$$%$.txt") for i in dosya. “\w” özel dizisi alfanümerik karakterleri ve “_” karakterini avlıyor Dedik ki. “\d” özel dizisi ondalık sayıları avlıyor 3.search("(\w+)\s+:\s(\w+)\s+(\d+)"..2.%--%%--%%--%%--#####%%%--%%--% . nesne = re. ¸ Bilgisayarımızda su bilgileri içeren “adres. s g 3. bir de bunların büyük harfli versiyonları vardır. ˙ste bu büyük harfli versiyonlar da I¸ yukarıdaki dizilerin yaptı˘ ı i¸in tam tersini yapar. Yani: g s 1.txt” adlı bir dosya oldu˘ unu varsayıyoruz: ¸ g esra : istinye 05331233445 esma : levent 05322134344 sevgi : dudullu 05354445434 kemal : sanayi 05425455555 osman : tahtakale 02124334444 metin : taksim 02124344332 kezban : caddebostan 02163222122 Amacımız bu dosyada yer alan isim ve telefon numaralarını “isim > telefon numarası” seklinde ¸ almak: # -*. "4 Ekim".group(1). “\D” özel dizisi ondalık sayı olmayan karakterleri avlar.

group() .. nesne = derli.5 Python2. print nesne. Bu yollardan biri s s de compile() metodunu kullanmaktır.gov.search(i) . tek ba¸ına ”.html adresini kullanaca˘ ız: s g #-*-coding:utf8-*import re import urllib f = urllib. "Java"] >>>derli = re....” ifadesini kullandık.search() seklinde bir ifade kullanıyoruz.0 Burada öncelikle düzenli ifade kalıbımızı derledik..search() demek yerine.read()) .0".Yapmanız gereken. Basit bir örnekle ba¸layalım: s >>> liste = ["Python2. Python2.gov.[0-9]") >>> for i in liste: . Dolayısıyla bu g s s özel anlamdan kaçmak için “\” i¸aretini de kullanmamız gerekiyor. Daha sonra search() metodunu kullanırken ise..tcmb. if nesne: . hem de düzenli ifade kalıbını yan yana kullanmamız gerekecektir.compile("[A-Za-z]+[0-9]\. "Python2. ˙ste biz de bu compile() metodu yardımıyla düzenli ifade kalıplarımızı kullanmadan I¸ önce derleyerek daha hızlı çalı¸malarını sa˘ layaca˘ ız.. s Simdi isterseniz küçük bir örnek daha verelim. Gördü˘ ünüz gibi. "Python2..4". Derlenecek düzenli ifade kalıbını compile() metodunda parantez içinde belirtiyoruz. düzenli ifadeler karakter dizilerine göre biraz daha yava¸ çalı¸ırs g s s lar. liste ö˘ elerinde ¸ g s g g bulunan ”. “compile” kelimesi ˙ Ingilizce’de “derlemek” anlamına gelir.compile("ABD\sDOLARI\s+[0-9]\.5".4 Python2.[0-9]+") nesne = derli. Ancak düzenli ifadelerin i¸leyi¸ini hızlandırmanın da bazı yolları vardır. Bu i¸ için http://www. 19. Nasıl bir sablon oturttu˘ umuzu anlamaya çalı¸ın. Ayrıca dikkat ederseniz derli.tcmb.4 Düzenli ˙fadelerin Derlenmesi I 19.. "Python3.1 compile() metodu En ba¸ta da söyledi˘ imiz gibi.” i¸aretinin Python açısından özel bir anlamı var. Küçük boyutlu projelerde compile() s g g metodu pek hissedilir bir fark yaratmasa da özellikle büyük çaplı programlarda bu metodu kullanmak oldukça faydalı olacaktır.tr/kurlar/today.search() kullanımında parantez ¸ içinde sadece e¸le¸ecek karakter dizisini kullandık (i).” i¸aretini e¸le¸tirmek için düzenli ifade kalıbı içinde “\.. Cevapg larınızı kistihza[at]yahoo[nokta]com adresine gönderebilirsiniz. s s g s s hem bu karakter dizisini.urlopen("http://www.6 Python3.tr/kurlar/today. Çünkü s s s bildi˘ iniz gibi. derli.4. Ama düzenli ifade kalıbımızı yukarıda derleme i¸lemi esnasında belirtti˘ imiz için. E˘ er derleme i¸lemi yapmamı¸ olsaydık.search(f. Diyelim ki amacımız günlük dolar kurunu almak ¸ olsun. Ayrıca burada kullandı˘ ımız düzenli ifade kalıbına da dikkat g edin. bu yı˘ ın içindeki gizli mesajı düzenli ifadeleri kullanarak bulmak. .6". re. Derleme i¸lemini nasıl yaptı˘ ımıza dikkat s g edin..html") derli = re.. bu kalıbı ikinci s g kez yazmamıza gerek kalmadı.

Python’da büyük-küçük harfler önemlidir.1 re. Java. Ayrıca yine “DOLARI” kelimesi ile 1 doların TL kar¸ılı˘ ı olan s g s g de˘ erin arasındaki bo¸lukların yerini de tutuyor. metinde geçen hem “programlama” kelimesini hem de “Programlama” g kelimesini ayıklayabildik. Çünkü “python” ve “Python” birg birlerinden farklı iki karakter dizisidir.print nesne. Basic. Bunlardan bazıları: Pascal.org/wiki/Programlama_dili adresinden alınmı¸tır. Aynı anlama gelecektir. Yani e˘ er “python” kelimesini arıyorg g sanız. Ayrıca burada da ”. Biz istersek g ¸ re.IGNORECASE yerine kısaca re.IGNORECASE) print derli. . g 19.IGNORECASE veya kısaca re. çıktıda yalnızca “programlama” keg g limesini görürdük. programcının bilgisayara hangi veri üzerinde i¸lem yapaca˘ını.” s s ifadesinden yararlandık.. ’Programlama’.5 compile() ile Derleme Seçenekleri Bir önceki bölümde compile() metodunun ne oldu˘ unu. programcının bir bilgisayara ne yapmasını istedi˘ini anlatmasının standartla¸tırılmı¸ bir yoludur.5. Cobol.. alaca˘ ınız çıktılar arasında “Python” olmayacaktır. s g verinin nasıl depolanıp iletilece˘ini. Fortran. Yalnız dikkat ederseniz “\s” ifadesi tek ba¸ına g s s sadece bir adet bo¸lu˘ un yerini tutar. Mesela bizim örne˘ imizde “ABD” ve “DOLARI” kelimeleri s g arasındaki bo¸lu˘ un yerini tutuyor. g E˘ er bu seçene˘ i kullanmasaydık.group() Burada kullandı˘ ımız “\s” adlı özel diziyi hatırlıyorsunuz.wikipedia.I Bildi˘ iniz gibi. Biz onun birden fazla bo¸lu˘ un yerini tutması için yanına s g s g bir adet “+” metakarakteri yerle¸tirdik.IGNORECASE adlı derleme g ¸ seçene˘ i oldu.compile("programlama". Delphi programlama dilleridir. Bunu yapmamızı sa˘ layan sey de re.I ifadesini de kullanabiliriz. ’programlama’. s C++.re. ne i¸e yaradı˘ ını ve nasıl kullanıldı˘ ını g s g g görmü¸tük. Hemen bir g örnek verelim: #-*-coding:utf8-*import re metin = """Programlama dili.” i¸aretinin yerini tutması için “\. hangi ko¸ullarda hangi i¸lemlerin g s s yapılaca˘ını tam olarak anlatmasını sa˘lar.IGNORECASE veya re. Bu özel dizinin görevi karakter dizileri g içindeki bo¸lukların yerini tutmaktı. s Gördü˘ ünüz gibi. Ada. ˙ste re. Bu bölümde ise “compile” (derleme) i¸lemi sırasında kullanılabilecek seçenekleri s s anlataca˘ ız. C#. Perl.I adlı derleme I¸ seçenekleri bize büyük-küçük harfe dikkat etmeden arama yapma imkanı sa˘ lar. 19. ¸u ana kadar 2500’den fazla g g S programlama dili yapılmı¸tır. Python. C.""" derli = re. Programlama g s s dilleri. Çünkü aradı˘ ımız sey aslında “programlama” kelimesi idi.findall(metin) [’Programlama’. ’programlama’] Not: Bu metin http://tr.

” metakarakterini anlatırken. nesne=re."") . print nesne. f kebap Burada alfanümerik karakterler içeren ö˘ eleri ayıklamaya çalı¸tık..2 re.DOTALL) >>> nesne = derle.search(a) >>> if nesne: . ”.*". Ne demek istedi˘ imizi tam olarak anlatabilmek için su örne˘ e bir bakalım: g ¸ g >>> liste = ["çilek".” sembolü herhangi bir karakterin yerini tug tuyordu. g ˙ste burada imdadımıza re.5.group() .search("Python. Bunun sebebi..DOTALL seçene˘ ini sadece re.. Ama simdi biz ona bu yetene˘ i s ¸ g de kazandıraca˘ ız: g >>> derle = re.group() Bu kod su çıktıyı verecektir: ¸ Python.” metakarakterinin “\n” (yeni satır) kaçı¸ dizisini dikkate almamasıdır.. Normalde çıktımız “çilek g s fıstık kebap” seklinde olmalıydı.. bu metakarakterin.U Bu derleme seçene˘ i. g ¸ 19. Bu metakarakter bütün karakterlerin yerini tutmak üzere kullanılabilir. ”.a).LC_ALL. I¸ g s Önce GNU/Linux kullanıcılarının bu seçene˘ i nasıl kullanabilece˘ ine bir örnek verelim: g g # -*. Türkçe programlar yazmak isteyenlerin en çok ihtiyaç duyaca˘ ı seçenekg g lerden biridir..search("\w*"..DOTALL veya re.*".5. Ama “çilek”teki “ç” ve “fıstık”taki “ı” harfleri Türkçe’ye özgü ¸ harfler oldu˘ u için düzenli ifade motoru bu harfleri tanımadı.S Bildi˘ iniz gibi.. "kebap"] >>> for i in liste: .\nMonty Python" Bu karakter dizisi içinde “Python” kelimesini temel alarak bir arama yapmak istiyorsak e˘ er. yeni satır karakterinin yerini tutmayaca˘ ını g söylemi¸tik. Hatırlarsanız.19. metakarakterler arasında yer alan ”..UNICODE veya re.re..compile("Python..UNICODE seçene˘ i yeti¸ecek. Bunu bir örnek yardımıyla görelim. Diyelim ki elimizde söyle bir karakter dizisi s ¸ var: >>> a = "Ben Python. print nesne.setlocale(locale. g kullanaca˘ ımız su kod istedi˘ imiz seyi yeterince yerine getiremeyecektir: g ¸ g ¸ >>> print re.coding: utf-8 -*import re import locale locale. if nesne: .i) .S seklinde de kısaltabilirsiniz..group() re. Bu s yüzden bu kaçı¸ dizisinin ötesine geçip orada arama yapmıyor.3 re."fıstık".

search(i) if nesne: print nesne. ˘ s 19.LC_ALL. kırmızı elma dolu sepetiyle \ s .group() Burada hangi i¸lemleri yaptı˘ ımıza çok dikkat edin. "kebap"] for i in liste: liste[liste. Bu i¸ için temel olarak iki metot gs s kullanılır.html).UNICODE) for i in liste: nesne = derle.6 Düzenli ˙fadelerle Metin/Karakter Dizisi Degi¸ tirme I ˙slemleri I¸ 19. Bunlardan ilki sub() metodudur.istihza..index(i)] = unicode(i.setlocale(locale. Bu araç g aynı zamanda bir karakter dizisini “de˘ i¸tirmeyi” de kapsar.1 sub() metodu Simdiye kadar hep düzenli ifadeler yoluyla bir karakter dizisini nasıl e¸le¸tirece˘ imizi inceledik. GNU/Linux ve Windows’taki kodlar arasında bazı ufak tefek farklılıklar var.liste = ["çilek".. Daha sonra liste ö˘ elerini nasıl “unicode” haline geg tirdi˘ imize bakın.search(i) if nesne: print nesne. Simdi aynı seyi Windows kullanıcılarının nasıl yapaca˘ ına bakalım: ¸ ¸ g #-*-coding:cp1254-*import locale locale.compile("\w*"."fıstık"."") import re liste = ["çilek".re. Liste ö˘ elerini unicode haline getirmezsek alaca˘ ımız çıktı yine istedi˘ imiz g g g g gibi olmayacaktır.. anneannesinin evine gidiyormu¸!" s ."utf8") derle = re. Ayrıca düzenli ifade kalıbımızı derlerken de."kebap"] derle = re. Bu bölümde sub() metodunu inceleyece˘ iz.UNICODE) for i in liste: nesne=derle. Yukarıdaki kodlarda geçen import locale s g ve ardından gelen satır özellikle önemli... çıktıyı düzgün alabilmek için re.group() Gördü˘ ünüz gibi. g Bu farklılıkların nedeni iki sistemde Türkçe karakterleri göstermek için takip edilen yolun farklı olması. ¸ s s g Ama tabii ki düzenli ifadeler yalnızca bir karakter dizisi “bulmak”la ilgili de˘ ildir.com/py2/lenascii.compile("\w*"."fıstık". (Benzer bir konu için bkz: http://www. En g basit sekliyle sub() metodunu su sekilde kullanabiliriz: ¸ ¸ ¸ >>> a = "Kırmızı ba¸lıklı kız.UNICODE seçene˘ ini kulg landık.re.6..

mesela. burada geçirdi˘i de˘i¸im sonucu g g g s tadına doyulmaz bir hal alır.tr/haber..a) s Burada karakter dizimiz içinde geçen bütün “kırmızı” kelimelerini “ye¸il” kelimesiyle s de˘ i¸tirdik. her de˘ i¸iklik için ayrı bir düzenli ifade olu¸turulabilir.IGNORECASE|re. Aynı sekilde bu metin de. Ayrıca ¸ g Türkçe kuralları gere˘ i bu “çilek” kelimesinin bazı yerlerde ünsüz yumu¸amasına u˘ rayarak g s g “çile˘ -” sekline dönü¸tü˘ ünü de unutmayalım. bu de˘ i¸ikli˘ in metin2 üzerinden yapılması gerekir. metin içinde “çilek” kelimesinin “Çilek” seklinde de geçti˘ ine dikkat edelim. 60 ya¸ındaki Özdemir.IGNORECASE ve re.sub("ye¸il"... g ¸ s g Bu metin içinde geçen “çilek” kelimelerini “erik”le de˘ i¸tirmek için birkaç yol kullanabilirsiniz. Bu ikisini yan yana kullanırken “|” adlı metakarakterden faydalandı˘ ımıza dikkat g edin. Ere˘li’nin havasından mı suyundan mı bilinmez. Ama tabii ki sub() metodu hem kendi ba¸ına replace() metodundan çok daha güçlüdür.). Bundan sonraki yeni bir de˘ i¸iklik de bu metin3 üz¸ gs erinden yapılacaktır. Çünkü ilk düzenli ifade olu¸turulup s buna göre metinde bir de˘ i¸iklik yapıldıktan sonra. çileklerinin sırrını s yo˘un ilgiye ve içten duydu˘u sevgiye ba˘lıyor: "Erkekler bahçemize giremez. Bu noktada söyle bir hatırlatma s s ¸ yapalım.. metnin de birkaç kez kopyalanmasını gerektirmesidir.UNICODE adlı derleme seçeneklerinden gs yararlandık. gs Birinci yolda. Ancak bu yolun dezavangs s tajı. Bu sub() metodu karakter dizilerinin replace() metoduna çok benzer. Bunu yaparken de re.com. gs g ¸ metin3 seklinde tekrar kopyalanmalıdır. s Bu yıl dokuzuncusu düzenlenen Uluslararası Osmanlı Çile˘i Kültür Festivali’nde g 36 üretici arasında yeti¸tirdi˘i çileklerle birinci olan Kocaali Köyü’nden Güner s g Özdemir. Ama bunu gs yaparken. g kokusu. g Kokusu ve tadıyla dünyaya nam salmı¸ me¸hur Osmanlı çile˘i ise ismini verdi˘i s s g g festival günleri dı¸ında pek hatırlanmaz. Bu nazik ve aromalı çilekten yapılan reçel de likör de bir ba¸ka olur. g Simdi bu sub() metodunu kullanarak biraz daha karma¸ık bir i¸lem yapaca˘ ız. tadı bamba¸ka bir hale dönü¸ür ve me¸hur Osmanlı çile˘i unvanını hak s s s g eder.compile("kırmızı". Her sabah 04.""" s g s Not: Bu metin http://www. A¸a˘ ıdaki ¸ s s g s g metne bakalım: metin = """Karadeniz Ere˘lisi denince akla ilk olarak kömür ve demir-çelik gelir. yılda bir ton ürün alıyor. Metni tekrar tekrar kopyalamak yerine.>>> derle = re. çileklerini özenle s suluyor. e˘ er yapmak istedi˘ iniz i¸ replace() metoduyla halledilebiliyorsa en g g s do˘ ru yol.. Ardından ikinci de˘ i¸iklik yapılaca˘ ı zags g man.. ¸ düzenli ifadeleri kullanarak söyle bir çözüm de üretebiliriz: ¸ #-*-coding:utf-8-*- . hem de bes raber kullanılabilecek derleme seçenekleri sayesinde replace() metodundan çok daha esnektir. Bu durum bu sekilde uzar gider.00’te kalkan Özhan.php?haberno=40130 adresinden alınmı¸tır. s Gelin bu metin içinde geçen “çilek” kelimelerini “erik” kelimesi ile de˘ i¸tirelim. Kasım ba¸ında ekti˘i çilek fideleri haziran ba¸ında meyve veriyor. farklı bir gs gs metin olarak kopyalanması gerekir (metin2 gibi. Elbette sub() metoduyla daha karma¸ık i¸lemler yapılabilir. Oysa Çin’ den Arnavutköy’e oradan da s Ere˘li’ye getirilen kralların meyvesi çilek. replace() metodunu kullanmaktır.. g g g Koca ayaklarıyla ezerler çileklerimizi" Çile˘i toplamanın zor oldu˘unu söyleyen Ay¸e Özhan da çocuklu˘undan bu yana g g s g çilek bahçesinde çalı¸ıyor..UNICODE) >>> print derle.re. ilk de˘ i¸iklikleri içeren metnin. Ama tabii ki.radikal.

sub() metodu. Bu iki seçene˘ i “|” adlı g g g metakarakterle birbirine ba˘ ladı˘ ımıza dikkat edin. s s Öncelikle su satıra bakalım: ¸ derle = re.metin_uni) Yukarıdaki çözüm GNU/Linux kullanıcıları içindir.group(). "Çile˘":"Eri˘". daha önceki bölümlerde gördü˘ ümüz “[ ]” adlı metakarakter yardımıyla g olu¸turduk.compile("çile[k˘]". Neden “çile˘ ”? g g Çünkü “çilek” kelimesi bir sesli harften önce geldi˘ inde sonundaki “k” harfi “˘ ”ye dönü¸üyor.sub(degistir. g g g g "Çilek":"Erik". g g s Bu seçenekli yapıyı.import locale locale. u"Çile˘":u"Eri˘"."") import re derle = re.setlocale(locale.IGNORECASE) g def degistir(nesne): a = {"çile˘":"eri˘".IGNORECASE) g Burada amacımız. "Çile˘":"Eri˘".metin) Gördü˘ ünüz gibi..LC_ALL.IGNORECASE) g def degistir(nesne): a = {u"çile˘":u"eri˘".UNICODE|re.split() for i in b: return a[i] print derle.re.split() for i in b: return a[i] print derle. Tek tek açıklayalım.compile("çile[k˘]". g g g g ."") import re metin_uni=unicode(metin.. metin içinde geçen “çilek” ve “çile˘ ” kelimelerini bulmak.. Ayrıca Türkçe harfler üzerinde i¸lem g s yapaca˘ ımız için de re.UNICODE seçene˘ ini kullanmayı unutmadık."utf8") derle = re. Windows kullanıcıları aynı kodu ufak de˘ i¸ikgs liklerle söyle yazabilir: ¸ #-*-coding:cp1254-*import locale locale.compile(u"çile[k˘]". argüman olarak bir fonksiyon da alabiliyor.group().. "çilek":"erik"} b = nesne.IGNORECASE seçene˘ inden yararlandık.UNICODE|re. u"çilek":u"erik"} b = nesne.re.re.LC_ALL. g g g g u"Çilek":u"Erik".sub(degistir. Yukarıdaki kodlar g biraz karı¸ık görünmü¸ olabilir. Düzenli ifade kalıbımızın hem büyük harfleri hem de küçük harfleri aynı anda s bulması için re.setlocale(locale. Simdi de su satırlara bakalım: g g ¸ ¸ def degistir(nesne): a = {"çile˘":"eri˘".UNICODE|re.

(Mesela önce “çilek” gs kelimelerini bulup bunları “erik” ile de˘ i¸tirirsiniz.. Böylece derle = re. Fonksiyonu. metin içinde geçen bütün “çilek” kelimelerini tek bir “erik” g s kelimesiyle de˘ i¸tiremeyecek olmamız...UNICODE|re. vb. g def degistir(nesne) seklinde tanımladık.group(). e¸le¸me nesnelerinin bir I¸ s s metodu olan group() metodunu fonksiyon içinde kullanabilmek. "çilek":"erik"} Bu sözlü˘ ü olu¸turmamızın nedeni. Bu g ¸ g arada GNU/Linux kullanıcıları Türkçe karakterleri düzgün görüntüleyebilmek için bu sözlükteki ö˘ eleri unicode olarak belirliyor (u”erik” gibi. yukarıdaki yol yerine metni birkaç kez kopyalas g yarak ve her defasında bir de˘ i¸iklik yaparak da sorunu çözebilirsiniz. "çilek":"erik"} b = nesne.group(). Simdi sonraki satıra geçiyoruz: s s ¸ ...split() for i in b: return a[i] Burada."Çilek":"Erik". fonksiyonumuzun argümanı olarak vazife gören e¸le¸me nesnesine ait metotlars s dan biri olan group() metodunu kullanıyoruz. Çünkü “çilek” kelimesi metin içinde pek çok farklı gs biçimde geçiyor. Bu fonksiyon.. ˙ste “nesne” adlı bir argüman kullanmamızın nedeni de. “erik” kelimesinin alaca˘ ı sekilleri ise birer “de˘ er” olarak belirliyoruz. yaptı˘ ımız arama i¸lemi sonucunda ortaya çıkan “e¸le¸me nesnesi” g g g s s s fonksiyona atanacaktır (e¸le¸me nesnesinin ne demek oldu˘ unu ilk bölümlerden hatırlıyors s g sunuz). daha sonra yazaca˘ ımız sub() metodu g g g tarafından ça˘ rıldı˘ ında.) Sonraki satırda iki metot birden var: g b = nesne. Bizim simdi kullandı˘ ımız yöntem metin kopyalama zorunlulu˘ unu ¸ g g ortadan kaldırıyor.. Bir sonraki satırda bir adet sözlük görüyoruz: a = {"çile˘":"eri˘". daha sonra sub() metodu içinde kullanaca˘ ımız fonksiyonu yazıyoruz. Burada for i in g b:print i komutunu verirseniz group() metodu yardımıyla ne buldu˘ umuzu görebilirsiniz: g çile˘ g çilek çile˘ g çilek Çile˘ g çilek çilek çilek Çile˘ g çilek çilek çilek Bu çıktıyı gördükten sonra. "Çile˘":"Eri˘". Bu metodu fonksiyon içinde “nesne” adlı argümana ba˘ layaca˘ ız.. g g g g "Çilek":"Erik". Ba¸ta da dedi˘ imiz gibi.IGNORECASE) satırı yardımıyla metin içinde buldu˘ umuz bütün “çilek” ve g çe¸nilerini alıyoruz. Daha sonra “çile˘ ” kelimelerini arayıp gs g bunları “eri˘ ” ile de˘ i¸tirirsiniz.compile("çile[k˘]". Karakter dizilerinin split() metodunu kullanmamızın nedeni ise group() s metodunun verdi˘ i çıktıyı liste haline getirip daha kolay manipüle etmek.split() Burada.) Ama metni tekrar tekrar olu¸turmak pek performanslı g gs s bir yöntem olmayacaktır. Bu sözlük içinde “çilek” kelimesinin alaca˘ ı sekilleri sözlük içinde birer g ¸ anahtar olarak. Burada “nesne” adlı bir argüman kullanmamızın ¸ nedeni. fonksiyon içinde group() metodunu kullanacak olmamız. kodlarda yapmaya çalı¸tı˘ ımız sey daha anlamlı görünmeye s g ¸ ba¸lamı¸ olmalı.. g re..

bu demetin ikinci ö˘ esini almaktır.metin_uni) print "Toplam %s de˘i¸iklik yapılmı¸tır.sub(degistir. Yani kullanıcıya de˘ i¸iklik g gs g gs gs sayısını göstermek için yapmanız gereken sey. ˙ste bu return satırı bir sonraki kod olan print derle. Eri˘ .metin) ifadesinde I¸ etkinlik kazanacak. Bu yazıları okuduktan sonra kafanızda düzenli ifadels erle ilgili kabataslak da olsa bir resim olu¸tuysa bu yazılar amacına ula¸mı¸ demektir. Yani bu metodu kullanarak. Çünkü bu metot sub() metoduyla neredeyse ¸ g tamamen aynıdır. Buradaki amacımız. Bu arada. g Ama çok büyük metinler üzerinde çok çe¸itli ve karma¸ık de˘ i¸iklikler yapmak istedi˘ inizde bu s s gs g kodların i¸inize yarayabilece˘ ini göreceksiniz. erik.. s g 19. eri˘ . erik. g ¸ gs s Bu kodların biraz karı¸ık gibi göründü˘ ünü biliyorum. erik. group() metodu yardımıyla buldu˘ umuz e¸le¸meler üzerinde bir for döngüsü olu¸g s s s turduk.. s s Yukarıda verdi˘ imiz düzenli ifadeyi böyle ufak bir metinde kullanmak çok anlamlı olmayabilir.7 Sonuç Böylelikle düzenli ifadeler konusunu bitirmi¸ olduk. Tek farkı."%ab[1] g s s 19. buradaki “i”nin yukarıda verdi˘ imiz group() çıktılarını temsil etti˘ ine g g dikkat edin.subn(degistir. Bu son satırımız sözlük ö˘ elerini tek tek metne uygulayacak ve mesela g a["çilek"] komutu sayesinde metin içinde “çilek” gördü˘ ü yerde “erik” kelimesini yapı¸tırag s cak ve böylece bize istedi˘ imiz sekilde de˘ i¸tirilmi¸ bir metin verecektir. Eri˘ . erik. a[i] gibi bir komut verdi˘ imizde aslında sırasıyla 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 komutların çıktıları sırasıyla erik. Bu metot çıktı olarak iki ö˘ eli bir demet verir.. Ardından da “a” sözlü˘ ü içinde g g bunları anahtar olarak kullanarak “çilek” ve çe¸itleri yerine “erik” ve çe¸itlerini koyuyor.2 subn() metodu Bu metodu çok kısa bir sekilde anlatıp geçece˘ iz. kullanıcılarınıza “toplam su kadar sayıda de˘ i¸iklik ¸ gs yapılmı¸tır” seklinde bir bilgi verebilirsiniz. subn() metodunun bir metin içinde yapılan de˘ i¸iklik sayısını da gs göstermesidir. size düzenli ifadeler s konusunda genel bir bakı¸ sunabilmekti. erik. Bu konunun üzerine e˘ ildi˘ inizde g g g . Ardından da return a[i] komutunu vererek “a” adlı sözlük içinde yer alan ö˘ eleri g yazdırıyoruz. ama aslında çok basit bir mantı˘ ı var: s g g group() metodu ile metin içinde aradı˘ ımız kelimeleri ayıklıyor. ikinci ö˘ e ise yapılan de˘ i¸iklik sayısıdır. Mesela ¸ g sub() metodunu anlatırken verdi˘ imiz kodların son satırını söyle de˘ i¸tirebilirsiniz: g ¸ gs ab = derle.for i in b: return a[i] Burada.6.. Elbette s s s düzenli ifadeler burada anlattıklarımızdan ibaret de˘ ildir. Birinci s ¸ g ö˘ e de˘ i¸tirilen metin. erik olacakg g g tır.

düzenli ifadeler apayrı bir dil gibidir. . Do˘ rusu su ki.aslında düzenli ifadelerin dipsiz bir kuyu gibi oldu˘ unu göreceksiniz. s Bizim düzenli ifadeler konusundaki yakla¸ımımız. Hemen hemen bütün programlama dilleri öyle ya da böyle s g düzenli ifadeleri destekler. düzenli ifadeler ba¸lı g g ¸ s ba¸ına ba˘ ımsız bir sistemdir. Python’da düzenli ifadeleri bünyesine adapte etmi¸ dillerden biridir. Dedi˘ imiz gibi. e˘ er yapmak istedi˘ iniz bir i¸lemi karakter dizilerinin metotg g g s ları yardımıyla yapabiliyorsanız düzenli ifadelere giri¸memek en iyisidir. Çünkü karakter dizisi s metotları hem daha hızlıdır hem de anlaması daha kolaydır. Esasında en ba¸ta da g s dedi˘ imiz gibi. her zaman bunları “gerekti˘ inde” kullans g mak olmalıdır.

. Python’a ili¸kin pek çok kaynakta kodlar bir noks tadan sonra NTP yapısı içinde i¸lenmektedir. çünkü siz NTP’yi kullanmasanız da ba¸kaları bunu kullanıyor. NTP’nin pratikte nasıl i¸ledi˘ ini anlarsak. NTP’yi ö˘ renmek zorundasınız!”. ˙ bir Python s Iyi programcısı olmak için NTP’yi kullanmasanız da olur.. Bu yüzden özellikle ba¸langıç seviyesini geçtiks s ten sonra kar¸ınıza çıkacak olan kodları anlayabilmek için bile NTP’ye bir a¸inalı˘ ınızın olması s s g gerekir. Bu bakımdan NTP’yle ilgilenmeniz g gerekir. çünkü Python ba¸ka bazı dillerin aksine NTP’yi dayatmaz. Bir de söyle dü¸ünün: Gerek internet üz¸ s erinde olsun. Yani. g E˘ er yukarıdaki soruya.. NTP’yi kullanmadan da gayet ba¸arılı s programlar yazabilirsiniz. Su soruyu soralım kendimize: ¸ Nesne Tabanlı Programlama’ya hiç girmesem olmaz mı? Bu soruyu cevaplandırmadan önce bakı¸ açımızı söyle belirleyelim. Yani. “Evet. Bu bakımdan NTP’yle ilgilenmek g istemeyebilirsiniz. g g olacaktır. Dolayısıyla en ba¸ta sordu˘ umuz soruya kar¸ılık ben de size su soruyu sormak isterim: s g s ¸ “Daha nereye kadar kaçacaksınız bu NTP’den?” 325 .. NTP’yi kullanmak zorunda de˘ ilsiniz”. Daha do˘ rusu bu soruyu s ¸ g iki farklı açıdan inceleyelim: NTP’yi ö˘ renmek ve NTP’yi kullanmak. “Evet. Dolayısıyla. s g 20. cevabımız. Bu bakımdan önünüzde bir engel yok. Gelin isterseniz biz de bunu Türkçe’de NTP olarak kısaltalım. NTP’nin s bütün erdemlerini bir kenara bıraksak dahi. cevabımız.1 Neden Nesne Tabanlı Programlama? ˙ Isterseniz önce kendimizi biraz yüreklendirip cesaretlendirelim. Simdilik bu “Nesne Tabanlı Programlama”nın ne oldu˘ u ve tanımı bizi ilgilendirmiyor. sırf ba¸kalarının yazdı˘ ı kodları anlayabilmek için s g bile olsa. “Hayır. . “Hayır”. Yabancılar bu ifadeyi “OOP” olarak kısaltıyor. Biz simdi¸ g ¸ lik i¸in teorisiyle pek u˘ ra¸mayıp prati˘ ine bakaca˘ ız. gerekse basılı yayınlarda olsun.BÖLÜM 20 Nesne Tabanlı Programlama – OOP (NTP) Bu yazımızda çok önemli bir konuyu i¸lemeye ba¸layaca˘ ız: Python’da “Nesne Tabanlı Pros s g gramlama” (Object Oriented Programming). elinizi NTP’yle kirletmeniz gerekecektir. “NTP’yi kullanmak” penceresinden bakarsak..” olag caktır. s g s g g s g teorisini ara¸tırıp ö˘ renmek de daha kolay olacaktır. Ama e˘ er yukarıdaki soruya “NTP’yi ö˘ renmek” penceresinden bakarsak.

Mesela yukarıg daki fonksiyonda “deneme” adını seçmi¸tik.2 Sınıflar NTP’de en önemli kavram “sınıflar”dır. size g g g ne gibi bir fayda getirece˘ ini kendi gözlerinizle göreceksiniz. Burada dikkat etmemiz gereken bazı s s noktalar var: Hatırlarsanız fonksiyonları tanımlarken def parçacı˘ ından yararlanıyorduk. Sonunda özgüveniniz artacak. Hatırlarsanız.. Bu da okurun zihninde birtakım fantastik cümlelerin ¸ s uçu¸masından ba¸ka bir i¸e yaramayacaktır. NTP’nin faydalarını size burada bir s s s çırpıda saymak yerine.2. g En azından biz bu noktada sunu rahatlıkla söyleyebiliriz: NTP’yi ö˘ rendi˘ inizde Python Pro¸ g g gramlama’da bir anlamda “boyut atlamı¸” olacaksınız. NTP’yi ö˘ rendikg s g ten sonra. Mesela “class Sinif” g veya “class HerhangiBirKelime”. Zaten NTP denince ilk akla gelen sey de genellikle ¸ “sınıflar” olmaktadır.Dikkat ederseniz. Tabii isim belirlerken Türkçe karakter kullanamıyoruz. 20. Gördü˘ ünüz gibi sınıf adı birden fazla kelimeden olu¸uyorsa g s her kelimenin ilk harfi büyük yazılıyor. bir sınıfı nasıl tanımg layaca˘ ımızı bir örnekle görmeye çalı¸alım: g s Python’da bir sınıf olu¸turmak için su yapıyı kullanıyoruz: s ¸ class IlkSinif: Böylece sınıfları olu¸turmak için ilk adımı atmı¸ olduk. 20. fonksiyonlar yardımıyla farklı de˘ i¸kenleri ve veri tiplerini. metotları I¸ gs gruplandırabiliyoruz. Sınıf adlarını belirlerken kullanaca˘ ımız kelimenin büyük harf veya küçük harf olması önemli g de˘ ildir. bu programlama tekni˘ inin Python deneyiminize ne tür bir katkı sa˘ layaca˘ ını.. bize getirdi˘ i kolaylıklardan hiç bahg setmiyoruz. Ama seçilen kelimelerin ilk harflerini büyük yazmak adettendir. Mesela: g def deneme(): Sınıfları tanımlarken ise class parçacı˘ ından faydalanıyoruz: g class IlkSinif: Tıpkı fonksiyonlarda oldu˘ u gibi.. ö˘ renme sürecine bırakıyoruz bu “özümseme” i¸ini. NTP böyle ho¸tur. isim olarak herhangi bir kelimeyi seçebiliriz. Çünkü böyle ¸ s bir çaba. konuyu anlatan ki¸iyi ister istemez okurun henüz bilmedi˘ i kavramları kullanarak bazı s g seyleri açıklamaya çalı¸maya itecektir. veri tiplerini. ˙ste sınıflar yardımıyla da farklı fonksiyonları.” demenin pek faydası olmayacaktır. Yine yukarıda gördü˘ ümüz sınıf örne˘ inde de s g g “IlkSinif” adını kullandık. Zira su anda içinde bulundu˘ umuz noktada bunları bilmenin bize pek faydası ¸ g dokunmayacaktır. .. . NTP’yi ö˘ renmeye çalı¸an birine birkaç sayfa g s boyunca “NTP söyle iyidir. Sınıflar yapı olarak “fonksiyonlara” benzetilebilir.1 Sınıf Tanımlamak Öncelikle bir sınıfı nasıl tanımlayaca˘ ımıza bakmamız gerekiyor. orada s burada Python’a ili¸kin okudu˘ unuz seyler zihninizde daha anlamlı izler bırakmaya ba¸layas g ¸ s caktır. Çünkü daha NTP’nin ne oldu˘ unu dahi bilmiyoruz ki cicili bicili cümlelerle g bize anlatılacak “faydaları” özümseyebilelim. Bu bir kural de˘ ildir. ama her zaman adetlere uymak g yerinde bir davranı¸ olacaktır.. Hemen. de˘ i¸kenleri. bildik anlamda NTP’nin faydalarından. tekrar kullanılmak üzere bir yerde toplayags biliyorduk.. Dolayısıyla. s .

sınıfımızı tanımladıktan sonra parantez i¸areti kullanmak zorunda olmadı˘ ımıza s g dikkat edin. yine “python programadı.): Ba¸lat > Çalı¸tır yolunu takip g s s edip açılan kutuya “cmd” yazıyoruz (parantezler olmadan). yazdı˘ ımız arayüzü görebiliriz.. Ancak bizim simdilik yazdı˘ ımız kodun s ¸ g bir arayüzü yok. s Windows kullanıcıları ise Python komut satırını modülün oldu˘ u dizin içinde açmak için su yolu g ¸ izleyebilir (yine modülün masaüstünde oldu˘ unu varsayarsak. Örne˘ in yazdı˘ ımız sey arayüzü olan bir Tkinter programıysa g g ¸ “python programadı. Bu arada Python’un bu modülü ¸ düzgün olarak içe aktarabilmesi için komut satırını.. Dolayısıyla bu g sekilde dosyamızı bir modül olarak içe aktarabiliyoruz (import). g GNU/Linux kullanıcıları komut satırıyla daha içli dı¸lı oldukları için etkile¸imli kabu˘ u modülün s s g bulundu˘ u dizinde nasıl açacaklarını zaten biliyorlardır. Sırasıyla bakalım: ˙ satırda do˘ ru bir sekilde sınıfımızı tanımladık. tam olmayan bir kod g g parçasından ibaret. s ... Üstelik bu sadece NTP’yi ö˘ renmek için yazdı˘ ımız. E˘ er s g komut satırından çalı¸an bir uygulama yazdıysak..Son olarak. Hatta s g gerekli ayarlamaları yaptıktan sonra programın simgesine çift tıklayarak veya GNU/Linux sistemlerinde konsol ekranında programın sadece adını yazarak çalı¸tırabiliriz programımızı. Ilk g ¸ ˙ Ikinci satırda ise “mesele” adlı bir de˘ i¸ken olu¸turduk. Komut ekranı kar¸ımıza gelecek. Yani pek s s çok farklı yöntem kullanabiliriz.2.py” adlı bir dosyaya kaydetti˘ inizi varsaydım.. gerçek hayatta bu haliyle kar¸ımıza çıkmayacak da olsa. Bu parantez meselesine tekrar dönece˘ iz. s g Su halde herkes kendi platformuna uygun sekilde Python komut satırını ba¸latsın! Python’u ¸ ¸ s ba¸lattıktan sonra bütün platformlarda su komutu vererek bu kod parçasını çalı¸tırılabilir dus ¸ s ruma getirebiliriz: from sinif import * Burada sizin bu kodları “sinif.py” komutuyla bunu çalı¸tırabilir. Aslında tabii ki normalde sınıflar bundan biraz daha s karma¸ıktır. s s hem yapı olarak kurallara uygun bir sınıftır. Ancak yukarıdaki örnek.(Modülün masaüstünde oldu˘ unu varsayıyoruz): g ALT+F2 tu¸larına basıp açılan pencereye “konsole” (KDE) veya “gnome-terminal” (GNOME) s yazıyoruz. ¸ g ˙ adımı attı˘ ımıza göre ilerleyebiliriz: Ilk g class IlkSinif: mesele = "Olmak ya da olmamak" Böylece eksiksiz bir sınıf tanımlamı¸ olduk. gs s Böylece ilk sınıfımızı ba¸arıyla tanımlamı¸ olduk.2 Sınıfları Çalı¸ tırmak s Simdi güzel güzel yazdı˘ ımız bu sınıfı nasıl çalı¸tıraca˘ ımıza bakalım: ¸ g s g Herhangi bir Python programını nasıl çalı¸tırıyorsak sınıfları da öyle çalı¸tırabiliriz.. s s 20.py” komutuyla s programımızı çalı¸tırıp konsol üzerinden yönetebiliriz. En azından simdilik. hem de bize sınıflara ili¸kin pek çok önemli ipucu s vermektedir. bu modülün bulundu˘ u dizin içinde açmak g gerekir... Ama biz yine de hızlıca üzerinden g geçelim. Dolayısıyla sınıfımızı tecrübe etmek için biz simdilik do˘ rudan Python ko¸ g mut satırı içinden çalı¸aca˘ ız. s Windows kullanıcılarının komut satırına daha az a¸ina oldu˘ unu varsayarak biraz daha detaylı s g anlatalım bu i¸lemi. Python içe aktarılacak modülleri ararken ilk olarak o anda içinde bulunulan dizine bakaca˘ ı için modülümüzü rahatlıkla bulabilecektir.. Ardından konsol ekranında “cd Desktop” komutunu vererek masaüstüne eri¸iyoruz.

python. Apr 18 2007.3 Örnekleme (Instantiation) Simdi söyle bir sey yazıyoruz: ¸ ¸ ¸ deneme = IlkSinif() Böylece olu¸turdu˘ umuz sınıfı bir de˘ i¸kene atadık.com” ifadesi bu sınıfın bir örne˘ idir.Muhtemelen içinde bulundu˘ unuz dizin “C:Documents and Settings˙sminiz” olacaktır.. Orada g I su komutu vererek masaüstüne geçiyoruz: ¸ cd Desktop Simdi de su komutu vererek Python komut satırını ba¸latıyoruz: ¸ ¸ s C:/python25/python Tabii kullandı˘ ınız Python sürümünün 2. s Peki bu “örnekleme” denen sey de ne oluyor? Hemen bakalım: ¸ ˙ Ingilizce’de “instantiation” olarak ifade edilen “örnekleme” kavramı sayesinde sınıfımızı kullanırken belli bir kolaylık sa˘ lamı¸ oluyoruz. s g gs s “sınıfımızı örneklemi¸ olduk”. Yani sınıfın bütününü alır ve onu s s paketleyip. >>> Simdi bu ekrandaki “>>>” satırından hemen sonra su komutu verebiliriz: ¸ ¸ >>> from sinif import * Artık sınıfımızı çalı¸tırmamızın önünde hiç bir engel kalmadı sayılır.quotaless. NTP kavramlarıyla konu¸acak olursak. biz bunları bir internet sayfasının içeri˘ ine beng zetebiliriz. ˙ste biz bu sınıfı “örnekledi˘ imiz” zaman. istedi˘ imiz sekilde kullanabilece˘ imiz bir nesne haline getirir. Hayli kaba bir benzetme olacak ama.. Yani böylece ilk satırda tanımladı˘ ımız sınıfa s g daha kullanı¸lı bir isim vermi¸ oluyoruz. sınıf içeri˘ ini bir bakıma eri¸ilebilir hale I¸ g g s getirmi¸ oluyoruz.” seklinde gösterilen adresi gibi. "credits" or "license" for more information. “IlkSinif” adlı sınıfın gs bir örne˘ idir (“deneme” is an instance of the class “IlkSinif”). Tıpkı bir internet sayfasının. fonksiyonlar.1 (r251:54863. s “www. "copyright". örnekg leme i¸lemi “Class” (sınıf) nesnesini etkinle¸tirmeye yarar. Buna göre. bu i¸lem sonucu ortaya çıkan de˘ i¸kene s s gs de. bu i¸leme “örnekleme” (instantiation) s s g s adı veriliyor. s ¸ Mesela www. “örnek” (instance) diyoruz. Yani. Söyle de diyebiliriz: g ¸ g ¸ Biz bir sınıf tanımlıyoruz. IlkSinif adlı sınıfa bir isim verme i¸lemine “örnekleme” denirken.quotaless. Bu noktada yapmamız s gereken tek bir i¸lem var: Örnekleme s 20.5..com adresi içindeki bütün bilgileri bir sınıf olarak dü¸ünürsek. vb.. “www. burada da “örnekg gs g leme” i¸lemi hemen hemen aynı vazifeyi görüyor. Dedi˘ imiz gibi.. Nasıl daha önce ¸ gs s gördü˘ ümüz de˘ i¸kenler uzun ifadeleri kısaca adlandırmamızı sa˘ lıyorsa. 08:51:08) [MSC v. Sizde sürüm farklıysa komutu g g ona göre de˘ i¸tirmelisiniz.python. Durum tam olarak böyle olmasa g . gs E˘ er herhangi bir hata yapmadıysanız kar¸ınıza suna benzer bir ekran gelmeli: g s ¸ C:\Documents and Settings\Isminiz>c:/python25/Python Python 2. Gördü˘ ünüz gibi. Bu örneklemelerin her birine ise “örnek” (instance) deniyor.. burada “deneme” adlı de˘ i¸ken. Bu sınıfın içinde birtakım de˘ i¸kenler.. olacakgs tır. Daha soyut bir ifadeyle. “örnekleme” (instantiation) g s g aslında sekil olarak yalnızca bir de˘ i¸ken atama i¸leminden ibarettir.1310 32 bit (Intel)] on win32 Type "help".5 oldu˘ unu varsaydım.

Çünkü “a = a + 6” ifadesi yüzünden.bile. “örnekleme” i¸lemine ili¸kin en azından zihnimizde bir kıvılcım çakmasını s s sa˘ layabilir. onu gösteren. 20. Mehmet. sınıf örne˘ imizin “niteliklerine” ula¸abiliriz: ¸ g s >>> deneme. bu benzetme. yani “deneme = IlkSinif ” gibi bir sey yazarsak. “parantezlere dikkat!” diyoruz.mesele Olmak ya da olmamak . “Çöp Toplama” i¸lemini de kısaca anlattı˘ ımıza göre artık kaldı˘ ımız yerden yolumuza devam s g g edebiliriz. Böyle yaparak sınıfı sadece kopyalamı¸ oluruz. Dolayısıyla artık bellekte tutulmayacaktır. bu veriye bizim ula¸mamızı sa˘ layacak hiç bir i¸aret kalmamı¸ oluyor ortada.. g Artık su komut yardımıyla. Böylece etkili bir hafıza yönetimi uygulanmı¸ ve programların perfors mansı artırılmı¸ olur. özellikleri ta¸ıyan bir g s “nesne” oluyor. Dolayısıyla “5” verisi o anda bellekte bo¸u bo¸una yer kaplamı¸ s s s oluyor.. yani bu g s g sınıfı gösteren hiçbir “referans” olmadı˘ ı için...) bu büyük sınıfın bir örne˘ i. “Mehmet” örne˘ i (instance) ise bu tanımları.. yani o veri artık i¸e yaramaz hale s g s geldi˘ inde. o örneklenmeyen sınıf g program tarafından otomatik olarak “çöp toplama” (garbage collection) adı verilen bir sürece tabi tutulacaktır. yaptı˘ ımız sey g ¸ g ¸ “örnekleme” olmaz. Yani artık o veriyi bellekte tutmaktan vazgeçer. Bizim yapmak istedi˘ imiz s g bu de˘ il. sınıfımız olu¸turuldu˘ u anda çöp toplama i¸lemg s g s ine tabi tutulacaktır. Yani “a = a + 6” ifadesi nedeniyle. ıskartaya çıkmı¸ oluyor. O yüzden. ˙ste Python. ˙ste e˘ er biz de yukarıda I¸ g oldu˘ u gibi sınıflarımızı “örneklemezsek”. nitelikleri.. bu sınıflara hiçbir yerde i¸aret edilmedi˘ i.. g Daha yerinde bir benzetme söyle olabilir: “˙ ¸ Insan”ı büyük bir sınıf olarak kabul edelim. g veriler) içeriyor. vb. Mesela: s >>> a = 5 >>> a = a + 6 >>> print a 11 Burada “a” de˘ i¸keninin gösterdi˘ i “5” verisi. bir s g s s I¸ veriye i¸aret eden hiç bir referans kalmadı˘ ı durumlarda. daha sonra gelen “a = a + 6” ifadesi nedeniyle gs g bo¸a dü¸mü¸. Buna göre “insan” sınıfı insanın ne tür özellikleri oldu˘ una dair tanımlar (fonksiyonlar.. ˙ste “siz” I¸ (yani Ahmet. “a” de˘ i¸keni artık s s s s gs “5” verisini göstermiyor... yani ete kemi˘ e bürünmü¸ hali oluyorg g s sunuz...4 Çöp Toplama (Garbage Collection) Peki biz bir sınıfı örneklemezsek ne olur? E˘ er bir sınıfı örneklemezsek. Burada bu sürecin ayrıntılarına girmeyece˘ iz. otomatik olarak “çöp toplama” i¸lemini devreye sokar ve bu örnekte “5” verisini g s çöpe gönderir. Bu arada dikkat ettiyseniz sınıfımızı örneklerken parantez kullandık. “5” verisine gönderme yapan. Yani söyle yaptık: ¸ >>> deneme = IlkSinif() E˘ er parantezleri kullanmazsak. Ama kısaca söyle anlatabiliriz: g ¸ Python’da (ve bir çok programlama dilinde) yazdı˘ ımız programlar içindeki “i¸e yaramayan” g s veriler bellekten silinir.

sonuc.5 Niteliklere Deginme (Attribute References) Biraz önce “nitelik” diye bir seyden söz ettik. “deneme” adlı sınıf örne˘ inin (instance) bir niteli˘ i (atg g g tribute) oluyor. Bu i¸leme “örnekleme” (instantiation) adı s veriyoruz. g g >>> from matematik import * komutunu verdikten sonra sunu yazıyoruz: ¸ >>> sonuc = Toplama() Böylece “Toplama” adlı sınıfımızı “örnekliyoruz”. Bunu yapmak için “class” parçacı˘ ından yararIlk g landık.c biçiminde. diyoruz. “deneme” g g g gs adlı sınıf örne˘ inin bir niteli˘ i idi. “Toplama” sınıf örne˘ inin (örne˘ i biraz sonra tanımlayags g g ca˘ ız) birer niteli˘ i oluyor.a >>> matematik.sonuc. “Toplama” sınıfının bir örne˘ idir..sonuc.org/tut/node11.b >>> sonuc.˘ 20.c . Yani “sonuc”. sınıf örne˘ inin niteliklerine ula¸mak için su g ¸ g s ¸ yapıyı kullanmamız gerekir: >>> matematik. g s Peki kodları söyle çalı¸tırırsak ne olur? ¸ s >>> import matematik E˘ er modülü bu sekilde içe aktarırsak (import). “sonuc” örne˘ inin niteliklerine tek tek eri¸ebiliriz. Python’daki nesnelerin özelliklerine i¸aret eder. buradaki “mesele”. ˙ ¸ Ingilizce’de “attribute” denen bu “nitelik” kavramı.html Bu tanıma göre.b >>> matematik. “sonuc” kelimesine ise Python’cada “örnek” (instance) adı veriliyor.python. g Artık. >>> sonuc. b ve c de˘ i¸kenleri ise.. c de˘ i¸keni a ve b de˘ i¸kenlerinin gs s gs gs toplamıdır. .py” oldu˘ unu varsayarsak. . Biraz karı¸ık gibi mi? Hemen bir örnek yapalım o halde: s class a b c Toplama: = 15 = 20 = a + b ˙ satırda “Toplama” adlı bir sınıf tanımladık.a >>> sonuc. Sırasıyla. a. g g Bu sınıfı yazıp kaydetti˘ imiz dosyamızın adının “matematik. Bundan önceki örne˘ imizde ise “mesele” adlı de˘ i¸ken. Bu sınıftaki a. örne˘ in: g >>> deneme.mesele dedi˘ imiz zaman. Python’un yazarı Guido Van Rossum s bu kavram için söyle diyor: ¸ “I use the word attribute for any name following a dot” (Noktadan sonra gelen bütün isimler için ben “nitelik” kelimesini kullanıyorum) kaynak: http://docs. b ve c adlı üç adet de˘ i¸ken olu¸turduk.

bu modülü kullanaca˘ ınız dosya içinde de bulunuyorsa isim çakı¸maları ortaya g s çıkabilir. E˘ er siz bu kodları IDLE ile çalı¸tırmak isterseniz. Mesela Tkinter ile programlama yaparken rahatlıkla “from Tkinter import *” yapısını kullanabiliriz. Bu komut verildi˘ inde ekranda görece˘ iniz “>>>” i¸aretinden. F5’e bastı˘ ınızda veya “Run > Run Module” yolunu takip etti˘ inizde IDLE sanki kog g mut ekranında “from matematik import *” komutunu vermi¸siniz gibi davranacaktır. Dolayısıyla isim çakı¸ması ¸ s s yaratacak ba¸ka bir modülümüz olmadı˘ ı için “ne yaptı˘ ımızı biliyoruz!”. s g g Yukarıda anlattı˘ ımız kod çalı¸tırma biçimleri tabii ki.a >>> sonuc. Yukarıda bizim verdi˘ imiz örnekte de “from modül import *” yapısını rahatlıkla s g kullanıyoruz. “nitelik” adını veriyoruz.. nitelikler). Bunu da yukarıdaki örnek ¸ ¸ üzerinden yapalım: class Toplama: a = 15 b = 20 c = a + b “Toplama” adlı bir sınıf tanımlıyoruz..c . Esasında. bu kodları komut ekranından g s çalı¸tırdı˘ ınızı varsaymaktadır.. g Simdi yapmamız gereken sey. ¸ ¸ sınıfın kendisini bir de˘ i¸kene atamak. Bu iki kullanım arasında. Yani bir nevi.. Bu de˘ i¸kene biz Python’cada “örnek” (instance) adını gs gs veriyoruz. çünkü simdilik tek bir modül üzerinde çalı¸ıyoruz.. Yani. Ama temel olarak sunu bilmekte fayda var: Genellikle tercih edilmesi ¸ gereken yöntem “from modül import *” yerine “import modül” biçimini kullanmaktır. Bu komutu s verdi˘ imizde “from sinif import *” komutu otomatik olarak verilip hemen ardından Python g komut satırı açılacaktır.. Sınıfımızın içine istedi˘ imiz kod parçalarını ekliyoruz. Biz g burada üç adet de˘ i¸ken ekledik. g Simdi isterseniz buraya kadar söylediklerimizi söyle bir toparlayalım. bunları hazırs g g s ladıktan sonra F5 tu¸una basmanız. Bu de˘ i¸kenlerin her birine. Toplama adlı sınıfı “örneklemek” (instantiation). s Veya GNU/Linux sistemlerinde sistem konsolunda: python -i sinif. “from modül import *” yapısını sadece ne yaptı˘ ımızı çok iyi biliyorsak g ve modülle ilgili belgelerde modülün bu sekilde içe aktarılması gerekti˘ i bildiriliyorsa kullan¸ g mamız yerinde olacaktır.. “Toplama” adlı sınıfın bir örne˘ idir diyoruz (sonuc is an gs g instance of Toplama)” >>> sonuc = Toplama() Bu komutu verdikten sonra niteliklerimize eri¸ebiliriz: s >>> sonuc.Yani her defasında dosya adını (ya da ba¸ka bir ifadeyle “modülün adını”) da belirtmemiz s gerekir. veya “Run > Run Module” yolunu takip etmeniz yeterli s olacaktır.b >>> sonuc. Bu gs gs kodları kullanabilmek için Python komut satırında su komutu veriyoruz: ¸ >>> from matematik import * Burada modül adının (yani dosya adının) matematik oldu˘ unu varsaydık. çünkü Tkinter bu kullanımda problem yaratmayacak sekilde ¸ tasarlanmı¸tır.py komutunu vererek de bu kod parçalarını çalı¸tırılabilir duruma getirebiliriz. E˘ er g “from modül import *” yöntemini kullanarak içe aktardı˘ ınız modül içindeki isimler (de˘ i¸keng gs ler. “sonuc” adlı de˘ i¸ken. g g s Python’un sizden hareket bekledi˘ ini anlayabilirsiniz. özellikle sa˘ ladıkları güvenlik avantajları/dezavantajları g açısından ba¸ka bazı temel farklılıklar da vardır.. ama simdilik konumuzu da˘ ıtmamak için s ¸ g bunlara girmiyoruz.

˙se hemen bir örnekle ba¸layalım. para print "fabrika:". ˙ g I¸ s Isterseniz kendimizce ufacık bir oyun tasarlayalım: #!/usr/bin/env python #-*. enerji print "para:". Bu yüzden bunu her çalı¸tırdı˘ ınızda yeniden belle˘ e g g s g g yüklemi¸ olacaksınız sınıfı. siz “Toplama().coding:utf8 -*class Oyun: def __init__(self): enerji = 50 para = 100 fabrika = 4 isci = 10 print "enerji:". “self”in ne oldu˘ unu simdilik bir kenara ¸ g g ¸ bırakıp. Artık önümüze bakabiliriz. Genellikle su sekilde kullanıldı˘ ını görürüz bunun: s g ¸ ¸ g def __init__(self): Biz simdilik bu yapıdaki __init__ kısmıyla ilgilenece˘ iz.a” der demez sınıf çalı¸tırılacak ve g s çalı¸tırıldıktan hemen sonra ortada bu sınıfa i¸aret eden herhangi bir referans kalmadı˘ ı için s s g Python tarafından “i¸e yaramaz” olarak algılanan sınıfımız çöp toplama i¸lemine tabi tutularak s s derhal belle˘ i terketmesi sa˘ lanacaktır. Bu da bir hayli verimsiz bir çalı¸ma seklidir. fabrika print "i¸çi:". s s ¸ Böylelikle zor kısmı geride bırakmı¸ olduk. isci s macera = Oyun() Gayet güzel.6 __init__ Nedir? E˘ er daha önce etrafta sınıfları içeren kodlar görmü¸seniz.Dikkat ederseniz. Bir kaç seçene˘ imiz var: ¸ s g g Üzerinde çalı¸tı˘ ımız platforma göre Python komut satırını. onu oldu˘ u gibi kabul edelim.b >>> Toplama(). Simdi bir an bu sınıfımızı örneklemedi˘ imizi dü¸ünelim. s Simdi bu kodları çalı¸tıraca˘ ız.a >>> Toplama(). s g s g Orada su komutu veriyoruz: ¸ . niteliklerimize eri¸irken “örnek”ten (instance). Dolayısıyla bu sınıfı söyle kullanmamız ¸ g s ¸ gerekecek: >>> Toplama().c Ama daha önce de anlattı˘ ımız gibi. daha karı¸ık seyleri anlag s g s ¸ mak kolayla¸acaktır. bu __init__ fonksiyonuna en azından g s bir göz a¸inalı˘ ınız vardır. Komut satırına bırakmadık bu i¸i. Dikkat ederseniz “örnekleme” (instantiation) i¸lemini do˘ rudan dosya içinde hals g lettik. Zira en temel bazı s kavramları gözden geçirdi˘ imiz ve temelimizi olu¸turdu˘ umuz için. yani etkile¸imli kabu˘ u açıyoruz. s 20. yani “sonuc” adlı de˘ i¸kenden s gs yararlanıyoruz.

E˘ er örnekleme satırını dosya içine s g yazmazsak. Çok önemli eksiklikleri var bu kodun..pack() uygulama = Arayuz() Bu kodları da yukarıda saydı˘ ımız yöntemlerden herhangi biri ile çalı¸tırıyoruz. Olayın iç yüzünü kavrayabilmek için öyle bir ¸ g örnek vermemiz gerekiyordu. __init__ fonksiyonu gerçek ¸ anlamda bir “constructor” de˘ ildir. GNU/Linux sistemlerinde ba¸ka bir seçenek olarak.. g ama biz bunu simdi bir kenara bırakalım. Bunu biraz sonra açıklayaca˘ ız. Sadece aklımızda olsun. parası 100 fabrika sayısı 4.. ALT+F2 tu¸larına basıyoruz ve açılan s s pencerede “konsole” (KDE) veya “gnome-terminal” (GNOME) yazıp enter’e bastıktan sonra açtı˘ ımız komut satırında su komutu veriyoruz: g ¸ python -i deneme. Gerçi __init__ fonksiyonuna “constructor” demek pek do˘ ru bir ifade sayılmaz. __init__ fonksiyonu s g içinde tanımlanmı¸ olan bütün de˘ i¸kenlerin.py” oldu˘ unu varsaydık. Dolayısıyla söyle bir sey diyebiliriz: ¸ ¸ Python’da bir programın ilk kez çalı¸tırıldı˘ ı anda i¸lemesini istedi˘ imiz seyleri bu __init__ s g s g ¸ fonksiyonu içine yazıyoruz.. F5 tu¸una basarak veya “Run>Run Module” yolg s s unu takip ederek kodlarımızı çalı¸tırıyoruz. s Bu kodları yukarıdaki seçeneklerden herhangi biriyle çalı¸tırdı˘ ımızda. oyuna ba¸landı˘ ı anda s s g bir oyuncunun sahip olaca˘ ı özellikleri __init__ fonksiyonu içinde tanımladık.py E˘ er Windows’ta IDLE üzerinde çalı¸ıyorsak. ama ona çok benzer. in¸a eden. Dikkat ederseniz g s burada da örnekleme i¸lemini dosya içinden hallettik.. Zira sınıflı yapıların en çok ve en verimli kullanıldı˘ ı yer g arayüz programlama çalı¸malarıdır: s from Tkinter import * class Arayuz: def __init__(self): pencere = Tk() dugme = Button(text="tamam") dugme.>>> from deneme import * Burada dosya adının “deneme. meydana geg s s tiren) adı verilir. g Söyle bir yanlı¸ anla¸ılma olmamasına dikkat edin: ¸ s s . Ama simdi konumuz bu de˘ il. i¸çi sayısı ise 10 olacaktır. yani “niteliklerin”. s Yalnız hemen uyaralım: Yukarıdaki örnek aslında pek de düzgün sayılmaz.. “from deneme import *” komutunu verdikten sonra “macera = Oyun()” s satırı yardımıyla ilk olarak sınıfımızı örneklendirmemiz gerekecekti. Ancak simdilik amacımıza hizmet edebilmesi için kodlarımızı bu sekilde g ¸ ¸ yazmamız gerekiyordu.. Mesela yukarıdaki ufak oyun çalı¸masında. E˘ er örnekleme i¸lemini dosya içinden g g s halletmemi¸ olsaydık. ˙ste bu niteliklerin ba¸langıç de˘ eri olarak belirlenebilmesi hep g I¸ s g __init__ fonksiyonu sayesinde olmaktadır. Tabii ki bu kod g s da eksiksiz de˘ ildir. Ama görece˘ iniz gibi yine de çalı¸ıyor bu kodlar. Biz okumaya devam edelim.. ilk çalı¸ma esnasında ekrana s gs s yazdırıldı˘ ını görüyoruz. Buna göre bu g oyunda bir oyuncu oyuna ba¸ladı˘ ında: s g enerjisi 50. Tkinter penceresinin açılması için komut satırında “uygulama = Arayuz()” gibi bir satır yazmamız gerekir. Zaten bu __init__ g s fonksiyonuna da ˙ Ingilizce’de ço˘ u zaman “constructor” (olu¸turan. Buradaki __init__ fonksiyonu sayesinde “Arayuz” adlı sınıf her ça˘ rıldı˘ ında bir adet Tkinter g g penceresi ve bunun içinde bir adet dü˘ me otomatik olarak olu¸acaktır. g Bir de Tkinter ile bir örnek yapalım.

isterseniz yukarıdaki kodları “__init__” fonksiyonunun adını de˘ i¸tirerek çalı¸tırmayı deneyin. Söyle bir sey g g ¸ ¸ yazmayı deneyelim. para print "fabrika:". Kodların su anki g ¸ halinde oldu˘ u gibi. i¸çi” de˘ i¸kenlerini ayrı bir fonksiyon içinde kullans gs mak istiyoruz. .7 self Nedir? Bu küçücük kelime Python’da sınıfların en can alıcı noktasını olu¸turur. . para. yani “in¸a etme” özelli˘ i konumung s g dan kaynaklanmıyor. isci s macera = Oyun() Öncelikle bu kodların sahip oldu˘ u “niteliklere” bir bakalım: g enerji. para. fabrika. Mesela __init__ yerine gs s s __simit__ deyin. enerji print "para:".“__init__” fonksiyonunun. enerji print "para:". fabrika print "i¸çi:". . Yani bu __init__ fonksiyonu. fabrika print "i¸çi:". “varsayılan de˘ erleri belirleme”. Dolayısıyla bu niteliklere su sekilde g gs ¸ ¸ ula¸abiliriz: s . Bakalım sonuç ne olacak? class Oyun: def __init__(self): enerji = 50 para = 100 fabrika = 4 isci = 10 def goster(): print "enerji:". Çalı¸maz. . Bunu test etmek için. fabrika. Self’i anlamaya do˘ ru ilk adımı atmak için yukarıda kullandı˘ ımız kodlardan g g faydalanarak bir örnek yapmaya çalı¸alım. Aynı i¸levi elde edemezsiniz. i¸levini sırf ilk sırada yer aldı˘ ı için yers g ine getirmiyor. i¸ci ve goster() s Burada “örne˘ imiz” (instance) “macera” adlı de˘ i¸ken. isci s macera = Oyun() Diyelim ki biz burada “enerji. ama do˘ rudan ekrana dökülmesin. Kodumuz söyleydi: s ¸ class Oyun: def __init__(self): enerji = 50 para = 100 fabrika = 4 isci = 10 print "enerji:". bu kodlar tanımlansın. bu i¸levi kavrayamazsak neredeyse bütün bir sınıf konusunu kavramak imkansız s s hale gelecektir. Esasında çok basit bir s i¸levi olsa da. Yani mesela göster() adlı ayrı bir fonksiyonumuz olsun ve biz bu de˘ i¸kenleri gs ekrana yazdırmak istedi˘ imizde bu “göster” fonksiyonundan yararlanalım. para print "fabrika:". s __init__ konusuna biraz olsun ı¸ık tuttu˘ umuza göre artık en önemli bile¸enlerden ikincisine s g s gelebiliriz: self 20.

Bu sefer de söyle bir hata aldık: ¸ enerji: Traceback (most recent call last): File "<pyshell0>".goster() Olmadı. burada “macera” adlı sınıf örne˘ ini temsil ediyor.para macera.. fonksiyonlardaki global ifadesinin yerini tutuyor. . in <module> macera. Daha do˘ ru bir ifadeyle. isci s macera = Oyun() Tekrar deniyoruz: >>> macera. Hatırlarsanız buna benzer hata mesajlarını g Fonksiyon tanımlarken “global” de˘ i¸keni yazmadı˘ ımız zamanlarda da alıyorduk.fabrika macera..isci = 10 . goster() fonksiyonuna bir “self” ekleyerek tekrar deneyelim.isci macera. Yani bir bakıma. enerji NameError: global name ’enerji’ is not defined Hmm.enerji macera. enerji print "para:". Artık kodlarımızı g g düzeltebiliriz: class Oyun: def __init__(self): self. para print "fabrika:".goster() TypeError: goster() takes no arguments (1 given) Belli ki bir hata var kodlarımızda.enerji = 50 self.para = 100 self. line 1. in <module> macera. Belki düzelir: class Oyun: def __init__(self): enerji = 50 para = 100 fabrika = 4 isci = 10 def goster(self): print "enerji:".>>> >>> >>> >>> >>> macera.goster() dedi˘ imizde söyle bir hata alıyg ¸ oruz: Traceback (most recent call last): File "<pyshell0>".goster() File "xxxxxxxxxxxxxxxxxxx". Ama o da ne? Mesela macera.goster() Hemen deneyelim.fabrika = 4 self.. . ˙ste “self” gs g I¸ burada devreye giriyor.. line 1. in goster print "enerji:". fabrika print "i¸çi:". line 9. Sorunun ne oldu˘ u az çok ortaya çıktı.

isci s macera = Oyun() Gördü˘ ünüz gibi. s Simdi tekrar deneyelim: ¸ >>> macera.para print "fabrika:"..para 100 >>> macera.goster enerji: 50 para: 100 fabrika: 4 i¸çi: 10 s >>> macera.fabrika 4 >>> macera. Bu arada. . “self. “self. s s s Bir de Tkinter’li örne˘ imize bakalım: g . Ayrıca bunu “goster” adlı g fonksiyon içinde kullanırken de sadece “enerji” olarak de˘ il.fabrika E˘ er biz “enerji” adlı de˘ i¸keni goster() fonksiyonu içinde kullanmak istersek de˘ i¸keni g gs gs sadece “enerji” de˘ il. ˙ g g s g Iyice somutla¸tırmak gerekirse. bu “enerji” adlı de˘ i¸kenin yalnızca içinde gs bulundu˘ u fonksiyonda de˘ il.enerji” diyerek. Yani mesela.fabrika print "i¸çi:". “__init__” fonksiyonu içinde tanımladı˘ ımız “enerji” adlı de˘ i¸ken.isci 10 Sınıfın niteliklerine tek tek nasıl eri¸ebildi˘ imizi görüyorsunuz. yani bir bakıma “global” bir nitelik kazanması için “self” olarak tanımlanmaları gerekiyor. .enerji” diyebilmek için.para macera. Bu dü¸ünme tarzı i¸imizi biraz daha kolayla¸tırabilir.enerji print "para:". self. kodlar içinde yazdı˘ ımız de˘ i¸kenlerin. Yani kodları g çalı¸tırırken “macera. s g “macera” örne˘ inin yerini tutan bir kelime olarak da kurabilirsiniz zihninizde. self. s g gs bu haliyle “goster” adlı fonksiyonun içinde kullanılamaz.enerji” olarak yazmamız g gerekir. Daha da önemlisi bu kodları bu haliyle tam olarak çalı¸tıramayız da.enerji 50 >>> macera. en ba¸ta bunu “self.. “enerji” yerine “self. self. self.def goster(self): print "enerji:". o fonksiyonun dı¸ında da kullanılabilmesini sa˘ lıyoruz. fonksiyon dı¸ından da ça˘ rılabilmesi g g gs s g için. Üstelik mesela “enerji” adlı de˘ i¸keni herhangi bir yerden ça˘ ırmak istedi˘ imiz zags g g man da bunu önceden “self” olarak tanımlamı¸ olmamız gerekir. isterseniz “self”i.enerji” olarak tanımlamamız gerekir.enerji macera.isci macera.enerji” olarak tanımlamamız s s gerekiyor. Mesela su temel komutları i¸letemeyiz: s ¸ s >>> >>> >>> >>> macera.

pack() def yaz(self): print "Hadi eyvallah!" uygulama = Arayuz() Gördü˘ ünüz gibi. in <module> uygulama = Arayuz() File "xxxxxxxxxxxxxxxxxxxxxxxx". “com- .yaz) dugme. “def self. e˘ er programın farklı noktalarında kullanaca˘ ımız de˘ i¸kenler veya fonksiyg g g gs onlar varsa.command=yaz) NameError: global name ’yaz’ is not defined Bunun sebebini bir önceki örnekte ö˘ renmi¸tik. Ama simdilik elimizden bu g ¸ kadarı geliyor. Daha çok bilgimiz oldu˘ unda bu kodları daha düzgün yazmayı da ö˘ renece˘ iz. line 13.pack() uygulama = Arayuz() Burada tanımladı˘ ımız dü˘ menin bir i¸ yapmasını sa˘ layalım.from Tkinter import * class Arayuz: def __init__(self): pencere = Tk() dugme = Button(text="tamam") dugme. in __init__ dugme = Button(text="tamam".pack() def yaz(): print "Hadi eyvallah!" uygulama = Arayuz() Tabii ki bu kodları çalı¸tırdı˘ ımızda söyle bir hata mesajı alırız: s g ¸ Traceback (most recent call last): File "xxxxxxxxxxxxxxxxxxxx". g g g Bu iki örnek içinde. Bu g s ¸ son örnek aslında yine de tam anlamıyla kusursuz bir örnek de˘ ildir.yaz” seklinde bir fonksiyon ¸ tanımlama yöntemi olmadı˘ ına göre bu i¸lemi “def yaz(self)” seklinde yapmamız gerekiyor. Kodlarımızı su sekilde yazmamız gerekiyor: g s ¸ ¸ from Tkinter import * class Arayuz: def __init__(self): pencere = Tk() dugme = Button(text="tamam". Önce söyle deneyelim: ¸ from Tkinter import * class Arayuz: def __init__(self): pencere = Tk() dugme = Button(text="tamam". bunları “self” öneki ile birlikte tanımlıyoruz.command=self.command=yaz) dugme. “self”lerle oynayarak olayın iç yüzünü kavramaya çalı¸ın. Mesela s yaz() fonksiyonundaki self parametresini silince ne tür bir hata mesajı alıyorsunuz. line 7. Mesela dü˘ meye basılınca kog g s g g mut ekranında bir yazı çıksın.

Elimizde simdilik sunlar vardı: ¸ ¸ class Oyun: def __init__(self): self.para print "fabrika:". gs s s Ayrıca sizin kodlarınızı okuyan ba¸kaları.enerji print "para:". s s s s sizin bunu kendi kodlarınızda dahi olsa de˘ i¸tirmeye kalkmanız pek ho¸ kar¸ılanmayacaktır. Hatta birkaç yıl sonra dönüp siz dahi aynı kodlara baktı˘ ınızda.enerji = 50 self.fabrika print "i¸çi:".. “Ben bug rada ne yapmaya çalı¸mı¸ım. self. Mesela kodlara yeni bir fonksiyon ekley¸ erek oyuncumuza yeni fabrikalar kurma olana˘ ı tanıyalım: g class Oyun: def __init__(self): self.para = 100 self. Siz bu kelimeyi bütün sınıflı kodlamalarda bu sekilde görüyor ¸ olsanız da aslında illa ki “self” kelimesini kullanacaksınız diye bir kaide yoktur.fabrika = 4 self. “self” iyidir. s s Sizi “self” kullanmaya ikna etti˘ imizi kabul edersek.yaz) dugme. . fabrika ve i¸çi bilgilerini de girdik. self. Kodlarımız arasındaki goster() fonksiyg s onu yardımıyla da her an bu bilgileri görüntüleyebiliyoruz.isci = 10 . g Hatırlarsanız yukarıda ufacık bir oyun çalı¸ması yapmaya ba¸lamı¸tık. s g s Bu noktada küçük bir sır verelim.” diyebilirsiniz. Self yerine ba¸ka kelimeler de kullanabilirsiniz.yaz” içindeki “self” ifadesini silince ne tür bir hata mesajı alıyorsunuz? Bunları iyice inceleyip.isci = 10 def goster(self): print "enerji:".pack() def yaz(armut): print "Hadi eyvallah!" uygulama = Arayuz() Ama siz böyle yapmayın. self. Mesela yukarıdaki örne˘ i söyle de yazabilirsiniz: s g ¸ from Tkinter import * class Arayuz: def __init__(armut): pencere = Tk() dugme = Button(text="tamam".fabrika = 4 self.command=armut. self. “self”in nerede ne i¸e yaradı˘ ını kavramaya çalı¸ın. Bu oyuncunun oyuna ba¸ladı˘ ında sahip s s g olaca˘ ı enerji. “self” kelimesinin kullanımı o kadar yaygınla¸mı¸ ve yerle¸mi¸tir ki. .isci s macera = Oyun() Gelin isterseniz Buradaki kodlar yardımıyla bir oyuncu olu¸turduk. para. Simdi isterseniz oyunumuza biraz hareket getirelim. s s s oyunumuzu biraz ayrıntılandıralım. “self” kullanın!. artık yolumuza devam edebiliriz.mand=self..enerji = 50 self. ne yapmaya çalı¸tı˘ ınızı anlamakta bir an da olsa s s g tereddüt edecektir.para = 100 self. O yüzden.

. Yani “def fabrikakur(miktar)” g de˘ il. s Yazdı˘ ımız kodlara dikkatlice bakarsanız.fabrika self.enerji .miktar)” dememiz gerekiyor. Python’un beklentisi kar¸ılang s s madı˘ ı için. Yeterli enerjiniz/paranız yok!" macera = Oyun() Burada fabrikakur() fonksiyonuyla ne yapmaya çalı¸tı˘ ımız aslında çok açık. ama bu i¸lem enerjisinde ve parasında g s s bir miktar kayba neden olmu¸ (fabrika kurmayı bedava mı sandınız!).3 self. .enerji > 3 and self.enerji print "para:". Yeterli enerjiniz/paranız yok! Art arda fabrikalar kurarak bunu kendiniz de test edebilirsiniz. miktar): if self. E˘ er “macera. oradaki if deyimi sayesinde oyuncunun enerjisi 3’ün g altına. "adet fabrika kurdunuz! Tebrikler!" else: print "Yeni fabrika kuramazsınız.para .fabrikakur(5) Bu komutu verdi˘ imizde. self. Çünkü kodlarımızı tanımlarken fonksiyon içinde “miktar” adlı bir ifade kullanarak.enerji = self. E˘ er fonksiyon parametresiz çalı¸tırılırsa da. kodları çalı¸tırırken verece˘ imiz parametreyi temsil ediyor. .para print "fabrika:".10 print miktar. hata verecektir. kullanıcıdan fonksiyona bir parametre vermesini bekledi˘ imizi belirttik.def goster(self): print "enerji:".fabrika print "i¸çi:".para = self. Hemen bunun s g nasıl kullanılaca˘ ını görelim: g >>> macera. Burada dikkat edece˘ imiz nokta. g s g Yani burada “5” sayısını temsil ediyor. self. Dolayısıyla Python kullanıcıdan parantez içinde bir parametre girmesini g bekleyecektir. “5 adet fabrika kurdunuz! Tebrikler!” seklinde bir kutlama mesajı g ¸ gösterecektir bize programımız. g Simdi de su komutu verelim: ¸ ¸ >>> macera. kodlar içinde bir fonksiyon tanımg g larken ilk parametrenin her zaman “self” olması gerekti˘ idir. self.fabrikakur()” fonksiyonunu kullanırken g herhangi bir sayı belirtmezseniz. self.isci s def fabrikakur(self. Kodlarımız içindeki “def fabrikakur(self. hata alırsınız.miktar)” ifadesinde gördü˘ ümüz “miktar” kelimesi. parası da 10’un altına dü¸erse söyle bir mesaj verilecektir: s ¸ Yeni fabrika kuramazsınız.goster() enerji: 47 para: 90 fabrika: 9 i¸çi: 10 s Gördü˘ ünüz gibi oyuncumuz 5 adet fabrika kazanmı¸. “def fabrikakur(self.fabrika = miktar + self.para > 10: self.

s Hatırlarsanız. . O halde nasıl yapaca˘ ız bunu? ˙ste burada img I¸ dadımıza Python sınıflarının “miras alma” özelli˘ i yeti¸iyor. Olu¸turdu˘ umuz oyuncu isterse oyun içinde fabrika da kurabiliyor. i¸çi gibi. Simdi sıra geldi onun kolunu baca˘ ını olu¸turmaya. nasıl Mısır’daki dedenizden size miras kaldı˘ ında dedenizin size g bıraktı˘ ı mirasın nimetlerinden her yönüyle yararlanabiliyorsanız. . Peki bu özellikleri yeniden tek tek “dü¸¸ ¸ g s man” için de yazacak mıyız? Tabii ki hayır. .8 Miras Alma (Inheritance) Simdiye kadar bir oyuncu olu¸turduk ve bu oyuncuya oyuna ba¸ladı˘ ı anda sahip olaca˘ ı bazı ¸ s s g g özellikler verdik. parası 100 fabrika sayısı 4. Ama s g böyle. ona s s ¸ g s bir ki¸ilik kazandırmaya. Dusman sınıfının durumunu Python’cada söyle ifade edebiliriz: ¸ “Dusman sınıfı Oyun sınıfını miras aldı” (Dusman inherits from Oyun) Bu haliyle kodlarımız henüz eksik. (enerji. O yüzden idareten oraya bir pass ifadesi yerle¸tirerek gerekli kod blo˘ unu s g geçi¸tirmi¸ oluyoruz. s s s . i¸çi sayısı ise 10 s olsun. . Ama su anda oraya yazacak s g g ¸ bir kodumuz yok. Simdilik söyle bir sey yazıp sınıfımızı kitabına uyduralım: ¸ ¸ ¸ class Dusman(Oyun): pass dsman = Dusman() Yukarıda pass ifadesini neden kullandı˘ ımızı biliyorsunuz. “kendin çal. Yoksa sınıfımız kullanılamaz durumda olur. Yani. çok i¸. Hemen miras aldıralım. Yukarıda “Dusman” adlı sınıfımızı olu¸turmu¸tuk: s s s class Dusman: Dusman sınıfı henüz bu haliyle hiçbir sey miras almı¸ de˘ il. O yüzden gelin oyuna g biraz hareket katalım! Mesela oyunumuzda bir adet oyuncu dı¸ında bir adet de dü¸man olsun. Bunun için ¸ s g sınıfımızı söyle tanımlamamız gerekiyor: ¸ class Dusman(Oyun): Böylelikle daha en ba¸ta tanımladı˘ ımız “Oyun” adlı sınıfı. Mesela dü¸s s manımız da oyuncunun sahip oldu˘ u özelliklerin aynısıyla oyuna ba¸lasın. bir sınıf ba¸ka bir sınıftan g s miras aldı˘ ında da aynı sekilde miras alan sınıf miras aldı˘ ı sınıfın özelliklerini kullanabiliyor. Yabancılar bu kavrama “inherig s tance” adını veriyorlar. s s g fabrika.20. O kısmı bo¸ bırakamayız. para. bu yeni olu¸turdu˘ umuz “Dusman” s g s g adlı sınıfa miras verdik. kendin oyna” tarzı bir durumun sıkıcı olaca˘ ı belli. s s O halde hemen bir adet dü¸man olu¸turalım: s s class Dusman: “Dü¸man”ımızın gövdesini olu¸turduk. Yani onun da: g s enerjisi 50. Simdi hatırlarsanız oyuncu için bunu söyle yapmı¸tık: ¸ ¸ s class Oyun: def __init__(self): enerji = 50 para = 100 fabrika = 4 isci = 10 Simdi aynı seyi “Dusman” sınıfı için de yapaca˘ ız. Sınıfı tanımladıktan sonra iki nokta g üst üstenin ardından a¸a˘ ıya bir kod blo˘ u yazmamız gerekiyor. Hemen bir örnek yapalım. ) ˙ s Isterseniz dü¸manımızın da buna benzer özellikleri olsun. g ¸ g Az laf. oyunun ba¸ında olu¸turdu˘ umuz oyuncunun bazı özellikleri vardı.

goster() enerji: 50 para: 100 fabrika: 4 i¸çi: 10 s Dikkat ederseniz. Oyun sınıfının bir fonksiyonu olan goster()‘i “Dusman” sınıfı içinden de g çalı¸tırabildik. g Simdi bakalım bu sınıfla neler yapabiliyoruz? ¸ Bu kodları..goster() enerji: 47 para: 90 fabrika: 8 i¸çi: 10 s Dü¸manımızın durumuna s Evet. Oyun ve Dusman sınıfları aynı de˘ i¸kenleri kullandıkları halde birindeki gs de˘ i¸iklik öbürünü etkilemiyor. yazının ba¸ında anlattı˘ ımız sekilde çalı¸tıralım. Bir de kendi durumumuzu s s s kontrol edelim: >>> macera. gs g g Simdi söyle bir sey yapalım: ¸ ¸ ¸ . Üstelik Dusman içinde bu de˘ i¸kenleri tekrar tanımlamak zorunda kalmadan.. enerjisi ve parası azalmı¸.. Dolayısıyla “Dusman” adlı g sınıf “Oyun” adlı sınıfın bütün özelliklerine sahip. Bunu hemen test edelim: >>> dsman.isci 10 Dusman sınıfı aynı zamanda Oyun sınıfının fabrikakur() adlı fonksiyonuna da eri¸ebiliyor: s dsman. dü¸manımızın fabrika sayısı artmı¸. Yani dü¸manımızın yeni bir fabrika kurması bizim de˘ erlerimizi gs s g de˘ i¸ikli˘ e u˘ ratmıyor. Dedi˘ imiz gibi. g s bakalım: >>> dsman.fabrikakur(4) 4 adet fabrika kurdunuz! Tebrikler! Gördü˘ ünüz gibi dü¸manımız kendisine 4 adet fabrika kurdu!. “Dusman” adlı s g ¸ s g sınıfımız daha önce tanımladı˘ ımız “Oyun” adlı sınıfı miras alıyor.Daha sonra oraya yazaca˘ ımız kod bloklarını hazırladıktan sonra oradaki pass ifadesini sileg ce˘ iz.goster() enerji: 50 para: 100 fabrika: 4 i¸çi: 10 s Gördü˘ ünüz gibi. s gs ˙ Istersek bu de˘ i¸kenlere teker teker de ula¸abiliriz: gs s >>> dsman.enerji 50 >>> dsman.

ego = 0 Bu kodları çalı¸tırdı˘ ımızda hata alırız. . bu yeni fonksiyon kendini Oyun sınıfının __init__ fonksiyonunun üzerine yazıyor.ego = 0 Burada “Oyun.goster() enerji: 50 para: 100 fabrika: 4 i¸çi: 10 s ego: 0 Hemen Gördü˘ ünüz gibi dü¸manımızın özellikleri arasında oyuncumuza ilave olarak bir de “ego” g s adlı bir nitelik var. Ekranda bunu göremememizin g s nedeni tabii ki kodlarımızda henüz bu niteli˘ i ekrana yazdıracak bir “print” deyiminin yer alg maması.. Böylece “ego” de˘ i¸kenini yazdırırken. para. Bunun ba¸langıç de˘ erini “0” olarak ayarladık. “enerji.goster(self) print "ego:". . gs Aslında bu haliyle kodlarımız düzgün sekilde çalı¸ır.Dü¸manımızın. self. vb. Mesela s g dü¸manımız bize her zarar verdi˘ inde egosu büyüsün!.” niteliklerin kaybolmasını engelliyoruz. s g Önce söyle deneyelim: ¸ class Dusman(Oyun): def __init__(self): self.__init__(self) self.. oyuncunun özelliklerine ek olarak bir de “ego” adlı bir niteli˘ i olsun.__init__(self)” ifadesiyle “Oyun” adlı sınıfın “__init__” fonksiyonu içinde yer alan bütün nitelikleri. g Dolayısıyla Oyun sınıfından miras aldı˘ ımız bütün nitelikleri kaybediyoruz. Kodlarımızı çalı¸tırdı˘ ımızda biz ekranda ¸ s s g göremesek de aslında “ego” adlı niteli˘ e sahiptir dü¸manımız. Simdi gelin bu fonksiyonu s ¸ yazalım: .__init__(self) self. ¸ s g ¸ s s deneyelim: >>> dsman. g Simdi artık dü¸manımızın bütün niteliklerini istedi˘ imiz sekilde olu¸turmu¸ olduk.ego dsman = Dusman() Tıpkı “__init__” fonksiyonunda oldu˘ u gibi. Daha sonra yazaca˘ ımız s g g fonksiyonda dü¸manımız bize zarar verdikçe egosu büyüyecek.ego” de˘ i¸kenini tanımlarken. . öteki de˘ i¸kenlerin de gs gs yazdırılmasını sa˘ ladık. .goster(self)” ifadesi yardımıyla g “Oyun” sınıfının goster() fonksiyonu içindeki de˘ i¸kenleri “Dusman” sınıfının goster() gs fonksiyonu içine kopyaladık.ego = 0 def goster(self): Oyun. ˙ Isterseniz bu özelli˘ i daha önce de yaptı˘ ımız gibi ayrı bir fonksiyon ile halledelim: g g class Dusman(Oyun): def __init__(self): Oyun. . Çünkü burada yeni bir “__init__” fonksiyonu tanıms g ladı˘ ımız için. Böylece “self. “Dusman” adlı sınıfın __init__ fonksiyonu içine kopyalıyoruz. Bunu önlemek için g söyle bir sey yapmamız gerekir: ¸ ¸ class Dusman(Oyun): def __init__(self): Oyun. burada da “Oyun.

para = 100 self.miktar self.para print "fabrika:". Burada.enerji print "para:". miktar.fabrika = macera.para > 10: self. Neden? Çok basit.ego = self..miktar): macera. self. .class Dusman(Oyun): def __init__(self): Oyun.fabrika . Yani bir önceki “Oyun” adlı sınıfın “örne˘ ini” (instance) kullandık.ego def fabrikayik(self.3 self.goster(self) print "ego:". "adet fabrikasını yıktınız!" print "Üstelik egonuz da tavana vurdu!" dsman = Dusman() Dikkat ederseniz.fabrika = miktar + self.fabrikayik(2) Biz burada “2” adet fabrika yıkmayı tercih ettik. fabrikayik() fonksiyonu içindeki de˘ i¸keni “macera.fabrika = 4 self.ego = 0 def goster(self): . Kodlarımızın en son halini topluca görelim isterseniz: class Oyun: def __init__(self): self.ego = 0 def goster(self): Oyun.__init__(self) self.fabrika self.isci = 10 def goster(self): print "enerji:".para = self. Çünkü kendi fabrikalarımızı de˘ il oyuncunun fabrikalarını yıkmak g g istiyoruz!.isci s def fabrikakur(self..enerji = self. Yeterli enerjiniz/paranız yok!" macera = Oyun() class Dusman(Oyun): def __init__(self): Oyun. self..10 print miktar.ego + 2 print "Tebrikler.enerji > 3 and self.enerji . “Dusman” sınıfının g de˘ il. . self.para . su kodu çalı¸tırarak oyuncumuzun kurdu˘ u fabrikaları yıkabiliriz: ¸ s g >>> dsman.fabrika” seklinde gs ¸ yazdık. "adet fabrika kurdunuz! Tebrikler!" else: print "Yeni fabrika kuramazsınız.miktar): if self.fabrika print "i¸çi:". self. self.enerji = 50 self.__init__(self) self. Oyuncunun".

fabrika = miktar + self. Yeterli enerjiniz/paranız yok!" .ego + 2 print "Tebrikler.enerji > 3 and self. self.miktar): macera.para = 100 self. isimlendirmeleri de biraz de˘ i¸tirerek standartla¸tırdı˘ ımıza s s g gs s g dikkat edin: class Oyun: def __init__(self): self.__init__(self) def fabrikakur(self. self. self.isci s oyun = Oyun() class Oyuncu(Oyun): def __init__(self): Oyun.para = self. g E˘ er bir fonksiyon içindeki de˘ i¸kenleri g gs ça˘ ırırken de sınıf isminin kendisini kullanmak isterseniz.3 self. gs g g Artık kodlarımız didiklenmek üzere sizi bekliyor. Böylece sınıfımız daha derli toplu bir görünüm kazang mı¸ olur.enerji . “örne˘ i” (instance) kullanıyoruz. fabrika” gibi nitelikleri ayrı bir sınıf halinde düzenleyip.goster(self) print "ego:". fonksiyon ba¸lıklarını ça˘ ırırken do˘ rudan sınıfın kendi adını kullanıyoruz (mesela s g g “Oyun.enerji = 50 self. “enerji.ego def fabrikayik(self.10 print miktar. Bir fonksiyon içindeki de˘ i¸kenleri ça˘ ırırken ise (mesela “macgs g era.miktar): if self. "adet fabrika kurdunuz! Tebrikler!" else: print "Yeni fabrika kuramazsınız. Burada yapılan seyleri iyice anlayabilmek için ¸ kafanıza göre kodları de˘ i¸tirin.fabrika . self.isci = 10 def goster(self): print "enerji:".__init__(self)”). Neyi nasıl de˘ i¸tirdi˘ inizde ne gibi bir sonuç elde etti˘ inizi gs gs g g dikkatli bir sekilde takip ederek. ifadeyi “Oyun(). bu konunun zihninizde iyice yer etmesini sa˘ layın.fabrika = 4 self.para . "adet fabrikasını yıktınız!" print "Üstelik egonuz da tavana vurdu!" dsman = Dusman() En son olu¸turdu˘ umuz fonksiyonda nerede “Oyun” sınıfını do˘ rudan adıyla kullandı˘ ımıza s g g g ve nerede bu sınıfın “örne˘ inden” (instance) yararlandı˘ ımıza dikkat edin. self.. miktar. Oyuncunun".enerji print "para:".fabrika self.ego = self. ¸ g para. öteki sınıfların do˘ rudan bu g sınıftan miras almasını sa˘ layabiliriz. Dikkat ederg g seniz.__init__(self)” sekg ¸ linde yazmanız gerekir.fabrika print "i¸çi:". A¸a˘ ıdaki kodlar içinde.miktar self.Oyun. ¸ g Aslında yukarıdaki kodları daha düzenli bir sekilde de yazmamız mümkün. Örne˘ in. Ama siz böyle yapmayın..enerji = self.para > 10: self.fabrika = macera. Yani de˘ i¸kenleri ça˘ ırırken örne˘ i kullanın.fabrika”).para print "fabrika:".

Bu silme i¸lemi sadece “Dusman” sınıfı için geçerli oluyor. Bunu söyle de ifade edebiliriz.ego def fabrikayik(self.” Dolayısıyla bu de˘ i¸iklik sadece o “bölgeyi” etkiliyor.oyuncu = Oyuncu() class Dusman(Oyun): def __init__(self): Oyun. yeni bir nitelik belirlemek yerine.__init__(self) del self. Bunu söyle yapabiliriz: s ¸ class Dusman(Oyun): def __init__(self): Oyun. Hatırlarsanız oyuna ba¸larken olu¸turulan g s s niteliklerde de˘ i¸iklik yapabiliyorduk.ego = 0 Gördü˘ ünüz gibi “Dusman” sınıfı için “__init__” fonksiyonunu tanımlarken “fabrika” niteli˘ ini g g “del” komutuyla siliyoruz. Oyuncunun".miktar self. istersek varolan bir niteli˘ i g ¸ g iptal de edebiliriz.ego = 0 def goster(self): Oyun. ama s Dusman’ın oyun ba¸langıcında fabrikası olsun istemiyoruz. "adet fabrikasını yıktınız!" print "Üstelik egonuz da tavana vurdu!" dusman = Dusman() Bu kodlar hakkında son bir noktaya daha de˘ inelim.pack() def yaz(self): print "Hadi eyvallah!" .fabrika = oyuncu. s Küçük bir not: Burada “bölge” olarak bahsetti˘ imiz sey aslında Python’cada “isim alanı” g ¸ (namespace) olarak adlandırılıyor.ego + 2 print "Tebrikler. ¸ “del komutu yardımıyla fabrika adlı de˘ i¸kene Dusman adlı bölgeden eri¸ilmesini engelliygs s oruz.yaz) dugme.__init__(self) self. miktar.fabrika self.fabrika . Öteki sınıflar ve daha sonra olu¸turulacak gs s yeni sınıflar bu i¸lemden etkilenmez. Oyuncu s tarafından de˘ il. Yukarıda verdi˘ imiz örne˘ i hatırlıyorsunuz: ¸ g g from Tkinter import * class Arayuz: def __init__(self): pencere = Tk() dugme = Button(text="tamam". Diyelim ki Oyuncu’nun oyuna ba¸larken “fabrika”ları olsun istiyoruz. self. Yani aslında “del” komutuyla herhangi bir seyi sildi˘ imiz s ¸ g yok! Sadece “eri¸imi engelliyoruz”. Mesela yukarıda “Dusman” sınıfı için “ego” adlı yeni gs bir nitelik tanımlamı¸tık. Simdi bir örnek de Tkinter ile yapalım.ego = self. Bu nitelik sadece “Dusman” tarafından kullanılabiliyordu. Aynı sekilde.miktar): oyuncu.goster(self) print "ego:".command=self. Bu i¸lem s s öteki sınıfları etkilemiyor.

pack() self.uygulama = Arayuz() Bu örnek gayet düzgün çalı¸sa da bu sınıfı daha düzgün ve düzenli bir hale getirmemiz s mümkün: #!/usr/bin/env python #-*-coding:utf-8-*from Tkinter import * class Arayuz(Frame): def __init__(self): Frame. E˘ er kodlarınız içinde gerçekten miras almanız gereken s g ba¸ka bir sınıf yoksa.text="tamam".dugme = Button(self. O yüzden g s g sınıfları istersek parantezsiz olarak tanımlayabiliyoruz. Ba¸ta biraz karı¸ık gibi s s görünse de aslında daha önce verdi˘ imiz basit örneklerden hiç bir farkı yoktur.pencerearaclari() def pencerearaclari(self): self.9 Eski ve Yeni Sınıflar Simdiye kadar verdi˘ imiz sınıf örneklerinde önemli bir konudan hiç bahsetmedik.pack() def yaz(self): print "Hadi eyvallah!" uygulama = Arayuz() uygulama. Ayrıca hangi sınıf tipini kullanırsanız kullanın sorun ya¸as mazsınız. Eski tip sınıflar ile yeni tip sınıflar arasındaki en büyük fark sudur: ¸ Eski tip sınıflar söyle tanımlanır: ¸ class Deneme: Yeni tip sınıflar ise söyle tanımlanır: ¸ class Deneme(object) Gördü˘ ünüz gibi.yaz) self. “miras alma” (inheritance) özelli˘ ini kullanmak için miras alaca˘ ımız sınıfın o anda kulg g landı˘ ımız modül içinde olması sart de˘ il.dugme. eski tip sınıflarda ba¸ka bir sınıfı miras alma zorunlulu˘ u yoktur. çünkü muhtemelen Python’un s sonraki sürümlerinden birinde (büyük ihtimalle Python 3. Python’da ¸ g iki tip sınıf vardır: Eski tip sınıflar ve yeni tip sınıflar. Ama tabii ki kendimizi yeni tipe alı¸tırmakta fayda var. Yeni tip sınıflarda ise her sınıf mutlaka ba¸ka bir sınıfı miras almalıdır. ba¸ka modüllerin içindeki g ¸ g g s sınıfları da miras alabiliyoruz. öntanımlı olarak “object” adlı sınıfı miras almanız gerekiyor. Yukarıdaki kodları dikkatlice inceleyin. Buradan anlayaca˘ ımız g gibi.command=self.mainloop() Burada dikkat ederseniz. Ancak korkmanızı gerektirecek kadar fark yoktur bu iki sınıf tipi arasında.__init__(self) self. Burada oldu˘ u gibi.0’da) eski tip sınıflar kullanımdan kaldırılacaktır. g 20. Tkinter’in “Frame” adlı sınıfını miras aldık. Dolayısıyla s politikamız su olacak: ¸ .

. Python sınıflarının __dict__ metodu yardımıyla görebiliriz: sinifimiz.__dict__ {’sayi2’: 55.. Yine dikkat ederseniz sınıfımız için bir g g “örnek” (instance) de belirtmedik. ya da miras alman gereken herhangi bir sınıf yoksa. Sınıfların yapısı gere˘ i bir kod blo˘ u belirts g g memiz gerekti˘ inde. eski ve yeni sınıflar arasındaki en temel fark budur. Hem sınıfın içini doldurma i¸ini.“Ya bir sınıfı miras al. Simdi bo¸ olan sınıfımıza “nitelikler” ekliyoruz: ¸ s >>> >>> >>> >>> sinifimiz. gs . ’sonuc’] sinifimiz. g g s ¸ g gs g Yani bir sınıfı her seyiyle tanımladıktan sonra.sayi2 = 55 sinifimiz. “object” adlı sınıfı miras al.sonuc Zaten 2475 ˙ Istersek sınıfımızın son halini. Dolayısıyla sözlüklere ait su i¸lemg g ¸ s ler sınıfımız için de geçerlidir: sinifimiz.” Dedi˘ imiz gibi.. istersek o sınıfın niteliklerini etkile¸imli olarak ¸ s de˘ i¸tirebiliyoruz. 2475] Buradan ö˘ rendi˘ imiz ba¸ka bir sey de. Çünkü her ne kadar eski tip sınıflar sons g raki bir Python sürümünde tedavülden kaldırılacaksa da. ’sayi1’: 45.. g Aslında daha en ba¸ta hiç eski tip sınıfları anlatmadan do˘ rudan yeni tip sınıfları anlatmakla i¸e s g s ba¸layabilirdik.sayi2 sinifimiz. Yukarıda hatırlarsanız “pass” ifadesini kullanmı¸tık. ’sayi1’.keys() [’sayi2’. Dolayısıyla sadece yeni tip sınıfları ö˘ renmek mevcut tabloyu eksik algılag mak olacaktır. Ama bu pek do˘ ru bir yöntem olmazdı. etrafta eski sınıflarla yazılmı¸ bolca s kod göreceksiniz. sınıfların içeri˘ inin dinamik olarak de˘ i¸tirilebilece˘ idir. Özel olarak miras alaca˘ ımız bir sınıf g olmadı˘ ı için do˘ rudan “object” adlı sınıfı miras aldık.sayi1 = 45 sinifimiz.values() [55. Ayrıca dikkat ederseniz. g ¸ parantez içinde bir parametre belirtirseniz hata mesajı alırsınız. Su örne˘ e bakalım: ¸ g class BosSinif(object): pass Böylece içi bo¸ da olsa kurallara uygun bir sınıf tanımlamı¸ olduk. ’sonuc’: 2475} Gördü˘ ünüz gibi sınıfın içeri˘ i aslında bir sözlükten ibaret..sayi1 * sinifimiz.. 45. Yine bu pass ifadesini kullanarak ba¸ka bir sey daha s s ¸ yapabiliriz. s s sınıfımızı tanımlarken “yeni sınıf” yapısını kullandık.__dict__. hem de örnek belirleme s i¸ini komut satırından halledece˘ iz. parametresiz olarak örnekliyoruz sınıfımızı.sonuc = sinifimiz.. ama o anda yazacak bir seyimiz olmadı˘ ında sırf bir “yer tutucu” vazifesi g ¸ g görsün diye o pass ifadesini kullanmı¸tık..__dict__. Önce sınıfımızı örnekliyoruz: s g sinifimiz = BosSinif() Gördü˘ ünüz gibi BosSinif() seklinde.

Bu yazımızda bizim yapmaya çalı¸tı˘ ımız sey. Bu yazıdaki amaç NTP gibi g s s g çetrefilli bir konuyu okuyucunun gözünde bir nebze de olsa sevimli kılabilmek. Okuyucu bu yazıdan sonra NTP’ye ili¸kin ba¸ka kaynakları daha s s bir kendine güvenle inceleme imkanına kavu¸acak ve okudu˘ unu daha kolay anlayacaktır. okuyug s g ¸ cuya NTP hakkında bir fikir vermektir. Aslında daha do˘ ru s g bir ifadeyle. Nesne Tabanlı Programlama’ya hızlı bir giri¸ yapmı¸ oluyoruz.10 Sonuç Böylece “Nesne Tabanlı Programlama” konusunun sonuna gelmi¸ oluyoruz.20. Çünkü NTP su birkaç s s ¸ sayfada anlatılanlardan ibaret de˘ ildir. E˘ er okuyucu bu yazı sayesinde NTP hakkında hiç g de˘ ilse birazcık fikir sahibi olmu¸sa kendimizi ba¸arılı sayaca˘ ız. s g . konuyu kolay hazmedilir bir hale getirmektir.

bir bilgisayarda sistematik sekilde saklanmı¸. Biz bunlar içinde. teknik g g anlamının dı¸ında. günlük hayatta da sıkça kullanıyoruz. O halde yava¸ yava¸ i¸e koyulg g s s s maya ba¸layalım. Günlük kullanımda. Python’daki ileri düzey konulardan biri olan veritabanı programlamayı (database programming) inceleyece˘ iz.1 Giri¸ s Bu bölümde. Mesela Vikipedi’de veritabanı söyle tanım¸ lanıyor: Bilgisayar terminolojisinde. birbirleri arasında tanımlı ili¸kiler bulunabilen bilgiler kümesidir. Bizi s esas ilgilendiren de zaten terimin teknik anlamıdır. Biz bu kelimeyi. ¸ g Veritabanı kelimesinin günlük kullanımdaki anlamı dı¸ında bir de teknik anlamı vardır. Veritabanı. taktik boyutuyla ilgilenmeyi tercih edece˘ iz. sistematik eri¸im imkânı olan. g 349 .org/moin/DatabaseInterfaces adresindeki listeyi inceleyebilirsiniz. hiçbirimizin yabancısı oldu˘ u bir kavram de˘ il.BÖLÜM 21 Sqlite ile Veritabanı Programlama 21. güncels lenebilir. içinde veri g s barındıran her seye veritabanı dendi˘ ini duyarsınız. Biz her zaman oldu˘ u gibi i¸in teknik g s boyutuyla de˘ il. basitli˘ i ve kullanım kolaylı˘ ı nedeniyle Sqlite adlı veritabanı yönetim g g g sistemini kullanaca˘ ız. s s Bir ba¸ka tanımı da.python. Ama esasında bizim g veritabanı tanımı üzerinde fazlaca durmamıza gerek yok. veritabanının ne demek oldu˘ unu gayet iyi ifade ediyor. programlarca s ¸ s i¸lenebilecek veri yı˘ ınıdır. yönetilebilir. hakikaten. s Python’la veritabanı programlama i¸lemleri s için pek çok alternatifimiz var. Python’la hangi veritabanı sistemlerini kullanabilece˘ inizi görmek için g http://wiki. Peki nedir bu “veritabanı” denen sey? g ¸ Esasında veritabanı. ta¸ınabilir. sadeli˘ i. içinde veri barındıran bir “¸ey”dir. herkesin bildi˘ i ve kuls g landı˘ ı anlamıyla. s g Yukarıdaki tanım.

s ¸ Google. Bu sayede. Symbian ve Sun bu sirketlerden bazılarıdır. Bütün ili¸kisel veritabanlarında s oldu˘ u gibi. s s g Dolayısıyla Sqlite kodlarının her zerresini istedi˘ iniz gibi kullanabilir. satabilir ve ticari veya ticari olmayan uygulamalarınızda gönül rahatlı˘ ıyla kullang abilirsiniz. yukarıdaki tablonun adını ve bu s g s tablodaki sütunları kullanarak gerçekle¸tirece˘ iz. ¸ Dolayısıyla e˘ er kullandı˘ ınız Python sürümü 2.. bu modülü kullanabilmek için sunucu konfigürasyonu yapmaya da gerek yoktur. Mesela. ¸ • Sqlite. Bu yüzden Sqlite’ı çok kısa bir sürede kavrayıp kullanmaya ba¸layabilirsiniz. Sqlite’ta s ise böyle bir sey yapmazsınız. Mesela yukarıdaki s tabloya “De˘ erler” adını verdi˘ imizi varsayabilirsiniz. Hatta GNOME masaüstü ortamının ¸ sevilen müzik ve video çalarlarından Banshee’de de veritabanı olarak Sqlite kullanıldı˘ ını g söyleyelim.. Bu yüzden Sqlite’ın yapısını anlamak büyük s g önem ta¸ır. g . s • Sqlite herhangi bir yazılım veya sunucu kurulumu gerektirmez. g g Sqlite ile çalı¸ırken veriler üzerinde yapaca˘ ımız i¸lemleri. veritabanları. bu tabloya bir de ad vermemiz gerekir. s • Sqlite özgür bir yazılımdır.2 Neden Sqlite? Dedi˘ imiz gibi.5 veya üstü ise Sqlite’ı Python’daki herg g hangi bir modül gibi içe aktarabilir ve kullanmaya ba¸layabilirsiniz. s g s g verileri sonradan kullanılmak üzere içinde tutan bir sistemdir. bu veritabanı sisteminin yapısını anlamak da öyle zor bir i¸ s g s de˘ ildir. • Sqlite’ın “sade” ve “basit” olması sizi yanıltmasın. Daha do˘ rusu. Yukarıdaki sebeplerden ötürü. Yani aslında bir Sqlite veritabanı g içindeki veriler söyle bir yapıya sahiptir: ¸ Sütun 1 De˘ er 1/1 g De˘ er 1/2 g De˘ er 1/3 g De˘ er 1/4 g Sütun 2 De˘ er 2/1 g De˘ er 2/2 g De˘ er 2/3 g De˘ er 2/4 g Sütun 3 De˘ er 3/1 g De˘ er 3/2 g De˘ er 3/3 g De˘ er 3/4 g Sütun 4 De˘ er 4/1 g De˘ er 4/2 g De˘ er 4/3 g De˘ er 4/4 g Sütun 5 De˘ er 5/1 g De˘ er 5/2 g De˘ er 5/3 g De˘ er 5/4 g Sqlite içinde olu¸turulan yukarıdakine benzer her tablonun bir de ismi vardır. Adobe. öteki pek çok veritabanı alternatifine göre basittir. Peki neden Sqlite? g Sqlite’ın öteki sistemlere göre pek çok avantajı bulunur. Mozilla/Firefox. Apple. Bazı veritabanlarını kullanabilmek için arka planda bir veritabanı sunucusu çalı¸tırıyor olmanız gerekir. Gelin isterseniz Sqlite’ın bazı avantajlarına söyle bir göz gezdirelim: ¸ • Her seyden önce Sqlite Python’un 2. de˘ i¸ikli˘ e u˘ ratag gs g g bilir.21. s g Sqlite ile bir tablo olu¸tururken.3 Sqlite’ın Yapısı Bu bölümün en ba¸ında verdi˘ imiz veritabanı tanımından da anla¸ılaca˘ ı gibi. Sqlite da bu verileri bir tablo yapısı içinde tutar. O halde 21.5 sürümlerinden bu yana bu dilin bir parçasıdır. Bugün Sqlite’ı aktif olarak kulg s lanan pek çok büyük ve tanınmı¸ sirket bulunur. veritabanı konusunu Sqlite üzerinden anlataca˘ ız. Sqlite’ın yeteneksiz bir veritabanı sistemi oldu˘ unu dü¸ünmeyin. Gördü˘ ünüz gibi. Bu yazılımın ba¸tan a¸a˘ ı bütün kodları kamuya açıktır. g hemen yola koyulalım. Python’da veritabanı i¸lemleri için kullanabilece˘ iniz pek çok alternatif bulunur. Bu özelliklerine bakarak. g s g Ama biz bütün bu alternatifler içinde Sqlite’ı tercih edece˘ iz.

connect("veritabanı_adı") connect() metoduna verdi˘ imiz “varitabanı_adı” adlı argüman kullanaca˘ ımız veritabanının g g adıdır.connect("/home/istihza/test.4 Veritabanıyla Baglantı Kurmak Bu bölümde sqlite modülünü kullanarak bir veritabanına nasıl ba˘ lanaca˘ ımızı. Ancak ben konuyu ans latırken. elimizde herg g hangi bir veritabanı yoksa veritabanını nasıl olu¸turaca˘ ımızı inceleyece˘ iz. bu modülü içe s aktarmak için import sqlite3 ifadesini kullanmamız gerekiyor. bu ada sahip bir g g veritabanı olu¸turulur.db") E˘ er bu komutu verdi˘ iniz dizin içinde deneme. sqlite3 bu veritas g banına ba˘ lanacaktır. E˘ er arzu ederseniz.5 sürümünden bu yana Python’un s g bir parçasıdır: >>> import sqlite3 Python’da Sqlite veritabanı sistemine ait modül “sqlite3” adını ta¸ır.db adlı bir veritabanı yoksa. Bu fonksiyonu su sekilde kullanıyoruz: g ¸ ¸ >>> sqlite3.db") #Windows Bu komut yardımıyla sabit disk üzerinde bir dosya olu¸turmu¸ veya varolan bir dosyaya ba˘ lans s g mı¸ oluyoruz. E˘ er belirtilen isimde bir veritabanı sistemde bulunmuyorsa o adla yeni bir veritabanı g olu¸turulacaktır. Sqlite. s g g Dikkat ederseniz burada bir sqlite modülünden söz ettik. s g Gelelim bu modül yardımıyla nasıl veritabanı olu¸turulaca˘ ına. tahmin edebilece˘ iniz gibi.. bu modülü kullanabilmek için öncelikle modülü içe aktarmamız gerekiyor. s g g s Veritabanını kapattı˘ ınız anda da bu geçici veritabanı silinir. modülü import sqlite3 seks g ¸ linde içe aktarmı¸ız gibi davranaca˘ ım. RAM üzerinde g g . Bu yüzden. Bunun için sqlite3 mods g ülünün connect() adlı fonksiyonundan yararlanaca˘ ız. Mesela: s >>> vt = sqlite3. Mesela: g >>> import sqlite3 as sql Veya: >>> import sqlite3 as lite Böylece sqlite3 modülünü “sql” veya “lite” adıyla içe aktarmı¸ olduk.connect("deneme. E˘ er bu isim size çok uzun g geliyorsa veya modül adında sayıların ve harflerin birlikte bulunması nedeniyle hem sayı hem de harf girmeyi bir angarya olarak görüyorsanız elbette sqlite3 modülünü farklı bir adla da içe aktarabilece˘ inizi biliyorsunuz. okur açısından kafa karı¸ıklı˘ ına sebep olmamak için. E˘ er zaten bu adla bir veritabanı dosyanız varsa. Bu g bölümün ba¸ında da söyledi˘ imiz gibi.connect(":memory:") Olu¸turdu˘ unuz bu geçici veritabanı sabit disk üzerinde de˘ il RAM (bellek) üzerinde çalı¸ır.db") #GNU/Linux >>> v = sq..connect("c:/documents and settings/fozgul/desktop/test. Python’un 2. Ancak isterseniz sqlite3 ile geçici bir veritabanı da olu¸turabilirsiniz: s s >>> vt = sqlite3. Dolayısıyla. g Elbette isterseniz connect() metoduna argüman olarak tam dosya yolu da verebilirsiniz: >>> import sqlite3 as sq >>> v = sq.˘ 21.

Bunun için de söyle bir komut g s ¸ kullanıyoruz: >>> vt = sqlite3. Böylece Sqlite ile nasıl veritabanı ba˘ lantısı kuraca˘ ımızı ve nasıl yeni bir veritabanı olu¸tug g s raca˘ ımızı ö˘ renmi¸ olduk. ˙ s Imleç olu¸turmak için cursor() s metodundan yararlanaca˘ ız: g >>> im = vt. Örne˘ in GNU/Linux s g g sistemlerinde. Dikkatinizi çekmek istedi˘ im bir nokta da sudur: Gördü˘ ünüz gibi Sqlite. Bu karakter dizisindeki CREATE TABLE kısmı bir SQL komutu olup.. bo¸ karakter dizisiyle olu¸turulan geçici g s s veritabanları da veritabanı ba˘ lantısının kesilmesiyle birlikte ortadan kalkacaktır. MySQL veritabanları /var/lib/mysql gibi bir dizinin içinde tutulur. g Geçici veritabanı olu¸turmak. Yani aslında söyle bir sey olu¸turmu¸ oluyoruz: ¸ ¸ s s isim soyisim Ayrıca olu¸turdu˘ umuz bu tablonun adının da “adres_defteri” oldu˘ unu unutmuyoruz.. geçici veris s tabanları sayesinde.5 Veri Giri¸ i s Önceki bölümün sonunda söyledi˘ imiz gibi. bu tabloya “isim” ve “soyisim” adlı iki sütun eklemeks ten ibarettir. s g 21. g g g Çünkü.cursor() ˙ Imleci olu¸turduktan sonra artık önümüz iyice açılıyor. g s I¸ g ¸ “adres_defteri” adlı bir tablo olu¸turup. Sonradan nasıl olsa silece˘ iniz. veritabanı üzerinde i¸lem yapag g s s s bilmek için ilk adım olarak bir imleç olu¸turmamız gerekir.execute("CREATE TABLE adres_defteri (isim. Sqlite veritabanı sisteminin tablo benzeri bir yapıya sahip oldu˘ unu ve bu sisg temdeki her tablonun da bir isminin bulundu˘ unu söylemi¸tik. s g g Bu i¸lemleri nasıl yaptı˘ ımıza dikkat edin. yazdı˘ ınız koddan kaynaklandı˘ ından da emin olabilirsiniz. sırf test amaçlı tuttu˘ unuz bir veritabanını disk s g g üzerinde olu¸turmak yerine RAM üzerinde olu¸turmayı tercih edebilirsiniz. özellikle çe¸itli testler veya denemeler yaptı˘ ınız durumlarda s s g i¸inize yarar. ˙ste burada yaptı˘ ımız sey. Burada CREATE TABLE adres_defteri (isim.de˘ il. Ayrıca. Ancak bu ifadeyi siz isterseniz küçük harflerle de yazabilirsiniz. s g soyisim) tek bir karakter dizisidir. Tıpkı :memory: kullanımında oldu˘ u gibi. bellek üzerinde yapılan i¸lemler sabit disk üzerinde yapılan i¸lemlere göre ¸ s s daha hızlıdır.. . olu¸turulan g s s veritabanlarının önceden tanımlanmı¸ bir dizin içine atıldı˘ ını görecektiniz. programın her yeniden çalı¸ı¸ında veritabanı ba¸tan olu¸turulacaktır. Benim burada büyük harf kullanmaktaki amacım SQL komutlarının. dedi˘ imiz gibi.. Veritabanı olu¸turduktan sonra. yukarıda olu¸turdu˘ umuz s s g imlec nesnesinin execute() metodunu kullanarak SQL komutlarını çalı¸tırabilece˘ iz. bir imleç nesnesi olu¸turduktan sonra bunun g s execute() metodunu kullanarak SQL komutlarını i¸letebiliyoruz. soyisim)") Hatırlarsanız. yazdı˘ ınız bir kodu test ederken bir hatayla kar¸ıla¸ırsanız sorunun veritag s s banı içinde varolan verilerden de˘ il. Mesela MySQL kullanıyor olsaydınız.. s g Burada CREATE TABLE ifadesini büyük harflerle yazdık. s Dilerseniz simdi basit bir örnek yaparak neyin ne oldu˘ unu anlamaya çalı¸alım: ¸ g s >>> im. Böylece. bu komut bir tablo olu¸turulmasını sa˘ lar. veritabanını o anda g ¸ g içinde bulundu˘ unuz dizin içinde olu¸turuyor.. disk üzerinde geçici bir veritabanı olu¸turmak için bo¸ bir karakter dizisi g s s kullandık. g ss s s Her seyden öte.connect("") Gördü˘ ünüz gibi. disk üzerinde de geçici veritabanları olu¸turabilirsiniz.

Özellikle deneme amaçlı i¸lems s ler yapmamız gerekti˘ inde. veritabanı içinde adres_defteri adlı bir tablo olu¸turs duk. Bunlardan ilki CREATE TABLE. ˙ s g Ikincisi ise INSERT INTO . Ardından da bu tablo içine isim ve soyisim adlı iki sütun ba¸lı˘ ı yerle¸tirdik.. soyisim) ifadesini görüyoruz. ˙ ˙ IÇINE YERLE¸ T˙ S IR” anlamına gelir.execute("INSERT INTO adres_defteri VALUES (’Fırat’.. Yani CREATE TABLE ifadesinin mesela “adres_defteri” de˘ i¸keninden kolayca ayırt g gs edilebilmesini istedi˘ im için burada CREATE TABLE ifadesini büyük harflerle yazdım. E˘ er bu adda bir veritabanı yoksa. olu¸turdu˘ umuz tabloya içerik eklememizi sa˘ lıyor. Bu fonksiyonu. “isim” ve “soyisim” gibi de˘ i¸kenlerden görsel olarak ayırt edilebilmesini gs sa˘ lamak. olu¸turdu˘ umuz tabloda s s g “isim” ve “soyisim” adlı iki farklı sütun ba¸lı˘ ı olacak. su ana kadar yap¸ ¸ tı˘ ımız seyleri bir gözden geçirelim: g ¸ • Öncelikle sqlite3 modülünü içe aktardık. VALUES . Yani aslında yukarıdaki karakter dizisi su anlama gelir: “adres_defteri ¸ ˘ ˙Ç˙NE ‘Fırat’ ve ‘Özgül’ DEGERLER˙N˙ YERLE¸ T˙R. listede execute() adlı bir metot g g da var.. Tabii ben burada olu¸turdu˘ unuz veritabanına “db” adını s g verdi˘ inizi varsayıyorum. Tabii ben burada img lece “im” adını verdi˘ inizi varsaydım. g g g • Veritabanımızı olu¸turduktan veya varolan bir veritabanına ba˘ landıktan sonra yapmamız s g gereken sey bir imleç olu¸turmak olacaktır.cursor() s g s gibi bir komut kullanıyoruz. s g Yukarıda execute() metodunu kullanarak. ˙ Isterseniz simdi derin bir nefes alıp. Yani söyle bir tablo olu¸tur”: I I I I S I ¸ s isim Fırat soyisim Özgül Buraya kadar gayet güzel gidiyoruz. s • Yukarıda iki adet SQL komutu ö˘ rendik. Bu modülün nimetlerinden yararlanabilmek için bunu yapmamız gerekiyordu. Bunun için connect() adlı s bir fonksiyondan yararlanıyoruz. g Karakter dizisinin devamında (isim. Bu i¸lemin ne s g s s kadar kolay oldu˘ unu görüyorsunuz..connect(":memory:"). • sqlite3 modülünü içe aktardıktan sonra bir veritabanına ba˘ lanmamız veya elimizde bir g veritabanı yoksa yeni bir veritabanı olu¸turmamız gerekiyor. yukarıda g ¸ olu¸turdu˘ umuz sütun ba¸lıklarının altını dolduraca˘ ız: s g s g >>> im. Buna göre. Bu komutla RAM üzerinde olu¸¸ s turdu˘ umuz veritabanı.. bunlar tablodaki sütun ba¸lıklarının adını gösteriyor.. çalı¸ma g g s dizini altında bu ada sahip yeni bir veritabanı olu¸turulur. sabit disk üzerinde bir veritabanı olu¸turmak yerine RAM g s üstünde geçici bir veritabanı ile çalı¸mayı da tercih edebiliriz. Bunun için yukarıdaki kos mutu söyle yazıyoruz: sqlite3.. Mesela g import sqlite3 as sql veya import sqlite3 as lite gibi. ba˘ lantı kesildi˘ i anda ortadan kalkacaktır. Bunları su sekilde kuls g g ¸ ¸ landı˘ ımızı hatırlıyorsunuz: g ... Gördü˘ ünüz gibi.. INSERT INTO ise S ”.. sqlite3. g •˙ Imlecimizi de olu¸turduktan sonra önümüz iyice açılmı¸ oldu. Simdi yine buna benzer bir komut yardımıyla. CREATE TABLE ifadesi Türkçe’de “TABLO OLU¸ TUR” anlamına geliyor.. ’Özgül’)") Burada CREATE TABLE komutundan sonra INSERT INTO adlı yeni bir SQL komutu daha ö˘ reniyg oruz.. Artık imlecin bu execute() metodunu kullanarak SQL komutlarını i¸letebiliriz. “veritabanı_adı” adlı bir veri¸ g g tabanı varsa Sqlite bu veritabanına ba˘ lanır. E˘ er içinde bulundu˘ umuz dizinde..“adres_defteri”. Tahmin edebilece˘ iniz g gibi.connect("veritabanı_adı") seklinde kullanıyoruz.. Sqlite’ta bir imleç olu¸turabilmek için db. Simdi dir(im) gibi bir kos s ¸ mut kullanarak imlecin metotlarının ne oldu˘ unu inceleyebilirsiniz. Bu komut veritag banı içinde bir tablo olu¸turmamızı sa˘ lıyor. Bu komut da. Yukarıdaki karakter dizisi içinde görünen VALUES ise ˘ “DEGERLER” demektir. “sqlite3” kelimesini her defasında yazmak bize angarya gibi gelebilece˘ i için bu modülü farklı bir adla içe aktarmayı tercih edebiliriz. Daha sonra bu imlece ait metotlardan yarar¸ s lanarak önemli i¸ler yapabilece˘ iz.

commit() imlecin de˘ il. g s Ancak her ne kadar veritabanına veri i¸lemi¸ gibi görünsek de aslında henüz i¸lenmi¸ bir sey s s s s ¸ yoktur. Dolayısıyla karakter dizisini yazarken iç taraftaki Fırat ve Özgül de˘ erlerini yazmak s g için tek tırnak kullanmamız gerekti.execute("""CREATE TABLE personel (isim.coding: utf-8 -*import sqlite3 . Verileri veritabanına “i¸leyebilmek” için bir adım daha atmamız s gerekiyor. "Kunek". Biz henüz sadece verileri girdik. soyisim)") >>> im. “personel” adlı s ¸ s bir tablo olu¸turduk. Mesela su örne˘ e bir bakalım: ¸ g # -*. ¸ehir. Karakter dizileri içindeki manevra alanınızı geni¸letmek s için.commit() Gördü˘ ünüz gibi. Zaten gerçek bir uygulama s yazmadı˘ ımız. "Adana".execute("""INSERT INTO adres_defteri VALUES ("Fırat".com” de˘ erlerini yerle¸tirdik. soyisim)""") >>> im. henüz test a¸amasında oldu˘ umuz için en iyi yakla¸ım geçici bir veritabanı g s g s olu¸turmak olacaktır. Daha sonra “personel” tablosunun içine “Orçun”. g 21.commit() Metodu I¸ Bir önceki bölümde bir Sqlite veritabanına nasıl veri girece˘ imizi ö˘ rendik.coding: utf-8 -*import sqlite3 vt = sqlite3. Simdi bu satırı da beti˘ imize ekleyelim: ¸ g # -*. eposta)""") s im. uzun satırları gerekti˘ inde bölerek çok daha okunaklı g kodlar da yazabilece˘ inizi biliyorsunuz. SQL komutlarını yazmaya ba¸larken çift tırnakla ¸ s s ba¸ladık. Böylece karakter dizisi içindeki tek ve çift tırnakları daha rahat bir sekilde kullanabilirsiniz. SQL komutlarımızı s çalı¸tırıyoruz. “Adana” ve s “okunek@gmail. sehir ve eposta adlı sütunlardan olu¸an.cursor() im.connect(":memory:") im = vt. ’Özgül’)") Burada bir sey dikkatinizi çekmi¸ olmalı.>>> im. soyisim. ba˘ lantı nesnesinin (yani burada vt de˘ i¸keninin) g g g gs bir metodudur. Bu girdi˘ imiz s g verileri veritabanına i¸leyebilmek için commit() adlı bir metottan yararlanaca˘ ız: s g >>> vt. s Ardından. "Özgül")""") Ayrıca üç tırnak kullanmanız sayesinde. Ama aslında i¸ g g s sadece veri girmeyle bitmiyor.6 Veri ˙sleme . SQL komutlarını üç tırnak içinde yazmayı da tercih edebilirsiniz. "okunek@gmail.execute("CREATE TABLE adres_defteri (isim. Ama verileri veritabanına i¸lemedik.execute("INSERT INTO adres_defteri VALUES (’Fırat’. Yani: ¸ >>> im. vt.cursor() komutuyla imlecimizi de olu¸turduktan sonra. soyisim.com")""") Burada öncelikle RAM üzerinde geçici bir veritabanı olu¸turduk.execute("""CREATE TABLE adres_defteri (isim. Önce isim. “Kunek”.execute("""INSERT INTO personel VALUES ("Orçun".

coding: utf-8 -*import sqlite3 vt = sqlite3.FROM. miktar.. g g Veritabanından herhangi bir veri alabilmek için SELECT. "okunek@gmail. Dilerseniz önce bir tablo olu¸turalım: s # -*. "30 Ocak 2010")""") Verileri veritabanına i¸leyelim: s vt. Onu da söyle yapıyoruz: g ¸ im.cursor() im. ˙sin asıl önemli g s g I¸ kısmı.. Bilmedi˘ imiz ise bu veritabanından nasıl veri alag ca˘ ımız.commit() Yukarıdaki kodlar bize söyle bir tablo verdi: ¸ fatura Elektrik miktar 45 ilk_odeme_tarihi 23 Ocak 2010 son_odeme_tarihi 30 Ocak 2010 Buraya kadar olan kısmı zaten biliyoruz.. "Adana".execute("""CREATE TABLE personel (isim. bir veritabanına nasıl veri girece˘ imizi ve i¸leyece˘ imizi gördük. 45. adlı bir SQL komutundan yararlanmamız gerekiyor.cursor() im.execute("""SELECT * FROM faturalar""") . son_odeme_tarihi)""") Simdi bu tabloya bazı veriler ekleyelim: ¸ im. soyisim.com 21. eposta)""") s im. bu verileri daha sonra veritabanından geri alabilmektir.execute("""INSERT INTO personel VALUES ("Orçun".7 Veritabanından Veri Almak Yukarıda.connect(":memory:") im = vt.vt = sqlite3. Simdi bu i¸lemi nasıl ya¸ s paca˘ ımıza bakaca˘ ız.execute("""INSERT INTO faturalar VALUES ("Elektrik".. "Kunek".execute("""CREATE TABLE faturalar (fatura.com")""") vt. "23 Ocak 2010". ilk_odeme_tarihi.commit() Bu son satırı da ekledikten sonra Sqlite veritabanı içinde söyle bir tablo olu¸turmu¸ olduk: ¸ s s isim Orçun soyisim Kunek sehir ¸ Adana eposta okunek@gmail.connect(":memory:") im = vt. ¸ehir.

execute("""INSERT INTO faturalar VALUES ("Elektrik". fetchall() metodu ise seçilen bütün verileri alma i¸levi görür.connect(":memory:") im = vt. Burada kulg s landı˘ ımız “*” i¸areti de “her sey” anlamına geldi˘ i için. Ama tabii siz bu verileri g istedi˘ iz gibi biçimlendirecek kadar Python bilgisine sahipsiniz..cursor() im. Burada joker karakterlerden biri olan “*” i¸aretini kullandı˘ ımıza dikkat edin.. Mesela: s "ilk odeme tarihi" veya "ilk ödeme tarihi". “FROM” ise ”.. tablo olu¸tururken sütun adlarında bo¸luk (ve Türkçe karakter) kullanmak iyi bir fikir s s de˘ ildir. ¸ s Beti˘ imizi yazmaya devam edelim: g veriler = im. Yukarıda gördü˘ ümüz SELECT. miktar.‘dan faydalandık.. g gs Artık bu verileri rahatlıkla yazdırabiliriz: print veriler Dilerseniz beti˘ imizi topluca görelim: g # -*. veriler bir liste içinde demet halinde yer alıyor.FROM. komutu bir tablodaki verig leri seçiyordu.execute("""CREATE TABLE faturalar (fatura. fetchall() g g imlecin bir metodudur. 45. g Bu arada. Yukarıda biz s fetchall() metoduyla aldı˘ ımız bütün verileri veriler adlı bir de˘ i¸kene atadık.Burada özel bir SQL komutu olan SELECT. Mesela ilk ödeme tarihi yerine ilk_odeme_tarihi ifadesini tercih edin... u’30 Ocak 2010’)] Gördü˘ ünüz gibi.FROM. son_odeme_tarihi)""") im. E˘ er keg g limeler arasında mutlaka bo¸luk bırakmak isterseniz bütün kelimeleri tırnak içine alın. u’23 Ocak 2010’.commit() im. “SELECT * FROM faturalar” ifadesi g s ¸ g “faturalardan her seyi seç” gibi bir anlama gelmi¸ oluyor.. "30 Ocak 2010")""") vt.DAN” anlamı verir..coding: utf-8 -*import sqlite3 vt = sqlite3.fetchall() Burada da ilk defa gördü˘ ümüz bir metot var: fetchall().. Gördü˘ ünüz gibi.execute("""SELECT * FROM faturalar""") veriler = im. Yani “SELECT FROM faturalar” dedi˘ imizde “faturalardan seç” demi¸ oluyoruz.. SELECT * FROM faturalar ifadesi su s g ¸ anlama gelir: “faturalar adlı tablodaki bütün ö˘ eleri seç!“ g Burada “SELECT” kelimesi “SEÇMEK” demektir.fetchall() print veriler Bu beti˘ i çalı¸tırdı˘ ımızda söyle bir çıktı alırız: g s g ¸ [(u’Elektrik’. "23 Ocak 2010"..DEN/.. 45... . ilk_odeme_tarihi.

s g ˙ste böyle tatsız bir durumla kar¸ıla¸mamak için.execute("""INSERT INTO kullanicilar VALUES %s""" %(i.cursor() #imlecin execute() metodunu kullanarak. s db = sqlite3. im. Ancak depoladı˘ ınız verilerin ne g ¸ g g kadar de˘ erli ve önemli oldu˘ undan ba˘ ımsız olarak veritabanı güvenli˘ ini sa˘ lamak.SQL Injection Python’da veritabanları ve Sqlite konusunda daha fazla ilerlemeden önce çok önemli bir konudan bahsetmemiz gerekiyor. Bu tabloda s #kullanıcı_adi ve parola olmak üzere iki farklı sütun var. g veriler = [ ("ahmet123". çek veren ki¸i çekin üzerindeki miktarı hem I¸ s s s rakamla hem de yazıyla belirtmeye özen gösterir. veritabanı denen sey oldukça g ¸ hassas bir konudur. Böyle bir durumda epey s ba¸ınız a˘ rıyacaktır.˘ 21. Ancak çeki verdi˘ iniz ki¸i bu çek üzerindeki miktarı tahrif ederek artırdı ve banka da g s tahrif edilerek artırılan bu miktarı çeki getiren ki¸iye (hamiline) ödedi. Verilerin liste içinde birer demet olarak #nasıl gösterildi˘ine özellikle dikkat ediyoruz.8 Veritabanı Güvenligi . veritabanı içinde #"kullanicilar" adlı bir tablo olu¸turuyoruz. Simdi su örne˘ e ¸ s ¸ ¸ g bakalım: # -*.connect(":memory:") #Veritabanı üzerinde istedi˘imiz i¸lemleri yapabilmek g s #için bir imleç olu¸turmamız gerekiyor. s im = db. Ayrıca rakam ve yazılara ekleme yapılmasını da engellemek için rakam ve yazıların sa˘ ına soluna “#” gibi i¸aretler de koyar. içerdeki bilgilerin de˘ erine ve öneg mine de ba˘ lı olarak üçüncü sahısların a˘ zını sulandırabilir. parola)""") #Yukarıda olu¸turdu˘umuz tabloya yerle¸tirece˘imiz verileri s g s g #hazırlıyoruz. s s s Simdi söyle bir sey dü¸ünün: Diyelim ki siz bir alı¸veri¸ kar¸ılı˘ ı birine 100. "12345678"). Böylece çeki g s alan ki¸inin. "123123123") ] #veriler adlı liste içindeki bütün verileri kullanicilar adlı #tabloya yerle¸tiriyoruz.coding: utf-8 -*import sqlite3 #Deneme amaçlı bir çalı¸ma yaptı˘ımız için veritabanımızı s g #bellek üzerinde olu¸turuyoruz.)) . ("mehmet321".execute("""CREATE TABLE kullanicilar (kullanici_adi. s s Yukarıdakine benzer bir sey veritabanı uygulamalarında da kar¸ımıza çıkabilir. "87654321"). Bilgiyi bir araya toplayan bu sistem. Tahmin edebilece˘ iniz gibi. Burada tek ö˘eli bir demet s g #tanımladı˘ımıza dikkat edin (i. Peki veritabanı yönetim sistemleri acaba hangi tehditlerle kar¸ı kar¸ıya? s s SQL komutlarını i¸leten bütün veritabanları için günümüzdeki en büyük tehditlerden birisi hiç s ku¸kusuz kötü niyetli ki¸ilerin SQL’e sızma (SQL injection) giri¸imleridir.) g for i in veriler: im. kendisine izin verilenden daha fazla bir miktarı elde etmesini engellemeye çalı¸ır. siz prog g g g g gramcıların asli görevidir.000 TL’lik bir çek ¸ ¸ ¸ s s s s g verdiniz. ("selin456".

Hem de kullanıcı adı ve parola do˘ ru olmadı˘ ı halde. Bu komut. kull = raw_input("Kullanıcı adınız: ") paro = raw_input("Parolanız: ") #Burada yine bir SQL komutu i¸letiyoruz. Hatta g g su kodu sadece kullanıcı adı kısmına girip parola kısmını bo¸ bırakmanız da sisteme giri¸ hakkı ¸ s s elde etmenize yetecektir. bu kodlar çalı¸ırken e˘ er kullanıcı. veritabanında varolan bir kullanıcı adı ve g s g parola yazarsa sisteme kabul edilecektir.. elde etmeye hakkı olandan daha fazlasına eri¸im hakkı elde ediyor. else: print u"Parola veya kullanıcı adı yanlı¸!" s Bu örnekte henüz bilmedi˘ imiz bazı kısımlar var.execute("""SELECT * FROM kullanicilar WHERE kullanici_adi = ’%s’ AND parola = ’%s’"""%(kull.. db. yani bu g g s g #de˘i¸kenin içinde bir de˘er varsa kullanıcı adı g s g #ve parola do˘ru demektir. paro)) #Hatırlarsanız daha önce fetchall() adlı bir metottan ˙s #söz etmi¸tik. kullanicilar s #adlı tabloda yer alan kullanici_adi ve parola adlı sütunlardaki #bilgileri seçiyor. Ama siz simdilik bunları kafanıza takmayın. s Yukarıdaki kodları çalı¸tırdı˘ ınızda. Her sey iyi ho¸. Kullanıcı adı ve parola soruldu˘ unda da her ikisi ¸ s g için sunu yazın: ¸ x’ OR ’1’ = ’1 O da ne! Program sizi içeri aldı. Kullanıcıyı içeri alıyoruz. s . g ¸ Nasıl olsa bu kodlarda görünen her seyi biraz sonra tek tek ö˘ renece˘ iz.: x’ OR ’1’ = ’1’ -- ˙ste yukarıda gösterdi˘ imiz bu i¸leme “SQL’e sızma” (SQL injection) adı verilir. data = im. I¸te bu fetchone() metodu da ona benzer. ama bu kodlarda çok ciddi bir problem var.. E˘ er kullanıcı adınız veya parolanız yanlı¸sa bununla ilgili bir s g s uyarı alacaksınız. ¸ s Dedi˘ imiz gibi. Siz simdilik sadece ¸ g g ¸ i¸in özüne odaklanın. sistemin zaaflarından yararlas g s g g narak. im. s #fetchall() bütün verileri alıyordu. Ama acaba gerçekten öyle mi? s Simdi yukarıdaki programı tekrar çalı¸tırın.. tıpkı I¸ g s en ba¸ta verdi˘ imiz tahrif edilmi¸ çek örne˘ inde oldu˘ u gibi.commit() #Kullanıcıdan kullanıcı adı ve parola bilgilerini alıyoruz.fetchone() #E˘er data adlı de˘i¸ken False de˘ilse. E˘ er do˘ ru kullanıcı adı ve parola girilmezse sistem g g kullanıcıya giri¸ izni vermeyecektir. g if data: print u"Programa ho¸geldin %s!" % data[0] s #Aksi halde kullanıcıya olumsuz bir mesaj veriyoruz.#Yaptı˘ımız de˘i¸ikliklerin tabloya i¸lenebilmesi için g g s s #commit() metodunu kullanıyoruz. fetchone() ise #verileri tek tek alır.. e˘ er kullanıcı adı ve parolayı do˘ ru girerseniz Programa s g g g ho¸geldin çıktısını göreceksiniz.. Kullanıcı.

sadece b == 13 kısmı True oldu˘ u halde a == 22 or b == 13 g ifadesi True sonucu veriyor. or‘un nasıl i¸ledi˘ ini ¸ s s g gayet iyi biliyorsunuz. Merhaba! Örneklerden de gördü˘ ünüz gibi.... sızdırılan kodu do˘ rudan ilgili satıra g g uygulayalım: im.execute("""SELECT * FROM kullanicilar WHERE kullanici_adi = ’x’ OR ’1’ = ’1’ AND parola = ’x’ OR ’1’ = ’1’""") Sanırım bu sekilde neler olup bitti˘ i daha net görülüyor. ama ben yine de birkaç örnekle or‘un ne oldu˘ unu ve ne yaptı˘ ını size g g hatırlatayım.. O yüzden a == 22 and b == 13 gibi bir ifade False de˘ eri g g veriyor. >>> if a == 22 or b == 13: .Burada en basit sekliyle bool i¸leçlerinden biri olan or‘dan yararlanıyoruz. ˙ste biz de yukarıdaki SQL’e sızma giri¸iminde or‘un bu özelli˘ inI¸ s g den faydalanıyoruz. print "Merhaba!" . Bu yüzden..... Ancak or i¸lecinin True sonucu verebilmesi için iki önermeden sadece birinin do˘ ru s g olması yeterlidir. Su örneklere bakın: ¸ >>> a = 21 >>> a == 22 False >>> b = 13 >>> b == 13 True >>> if a == 22 and b == 13: .. Dilerseniz neler olup bitti˘ ini daha iyi anlayabilmek için. Durumu biraz daha netle¸tirmek için ¸ g s Python’u yardıma ça˘ ırabiliriz: g >>> kullanici_adi = ’ahmet123’ >>> parola = ’12345678’ >>> kullanici_adi == ’x’ False >>> ’1’ == ’1’ True >>> kullanici_adi == ’x’ or ’1’ == ’1’ True >>> parola == ’x’ . and i¸lecinin True sonucunu verebilmesi için her iki önerg s menin de do˘ ru olması gerekir. print "Merhaba!" ..

‘%s’ ile gösterilen yerlere kötü niyetli bir SQL komutu sızdırmaktan g ¸ ibarettir. veritabanına s g s s azami düzeyde zarar verme imkanına kavu¸acaktınız. Simdi dilerseniz I¸ s ¸ yukarıdaki kodu do˘ rudan ilgili satıra uygulayalım ve ne oldu˘ unu görelim: g g im.cursor() im. "12345678"). s g Dikkat ederseniz SQL’e sızdı˘ ımızda “ahmet123” adlı kullanıcının hesabını ele geçirmi¸ olduk. O yüzden sızdırılan kod söyle görünüyor: s ¸ x’ OR ’1’ = ’1 Gördü˘ ünüz gibi.coding: utf-8 -*import sqlite3 db = sqlite3. x’in ba¸ındaki ve 1’in sonundaki tırnak i¸aretleri koymuyoruz. Dolayısıyla da sisteme giri¸ g s s yapabilmek için sadece kullanıcı adını girmemiz yeterli oluyor!. Burada ayrıca kodlarımızın çalı¸ması için 1’in sonuna bir adet tırnak yerle¸tirerek kodu kapattı˘ ımıza dikkat edin. s Yukarıda yaptı˘ ımız sey.. Burada zaten ba¸langıç ve biti¸ tırnakları oldu˘ u için sızdırılan kodda ba¸langıç ve s s g s biti¸ tırnaklarını yazmıyoruz. g s s Peki yukarıda verdi˘ imiz su kod nasıl çalı¸ıyor: g ¸ s x’ OR ’1’ = ’1’ -- Python’da yazdı˘ ımız kodlara yorum eklemek için “#” i¸aretinden yararlandı˘ ımızı biliyorg s g sunuz. E˘ er tablonun ba¸ında “admin” diye bir hesap olmu¸ olsaydı. Dolayısıyla kullanıcı adının ve parolanın g do˘ ru olup olmaması hiçbir önem ta¸ımaz. ˙ste SQL kodlarına yorum eklemek için de “–” i¸aretlerinden yararlanılır. ("mehmet321".. ("selin456". Yani yukarıdaki programı söyle yazaca˘ ız: ¸ g # -*. parola)""") veriler = [ ("ahmet123".execute("""SELECT * FROM kullanicilar WHERE kullanici_adi = ’x’ OR ’1’=’1’ --AND parola = ’%s’""") Burada yazdı˘ ımız “–” i¸areti AND parola = ’%s’ kısmının sistem tarafından yorum olarak g s algılanmasını sa˘ lıyor. Bu yüzden kodların bu kısmı i¸letilmiyor. "87654321").connect(":memory:") im = db. Yani her zaman True de˘ erini verece˘ i kesin olan g s g g ifadeler yardımıyla yukarıdaki gibi bir sızma giri¸iminde bulunabilirsiniz. s Peki SQL’e sızma giri¸imlerini nasıl önleyece˘ iz? Bu giri¸ime kar¸ı alabilece˘ iniz ba¸lıca önlem s g s s g s “%s” i¸aretlerini kullanmaktan kaçınmak olacaktır.False >>> (kullanici_adi == ’x’ or ’1’ == ’1’) and (parola == ’x’ or ’1’ == ’1’) True ’1’ == ’1’ ifadesi her zaman True de˘ eri verecektir.execute("""CREATE TABLE kullanicilar (kullanici_adi. g s Peki neden ötekiler de˘ il de “ahmet123”? Bunun sebebi.. “ahmet123” hesabının tablonun en g ba¸ında yer alması.. Çünkü s s g normal biti¸ tırna˘ ı yorum tarafında kaldı. Bu i¸aret yerine ”?” i¸aretini kullanacaks s s sınız.. "123123123") ] .

i) db.execute("""INSERT INTO kullanicilar VALUES (?.execute("""SELECT * FROM kullanicilar WHERE kullanici_adi = ’%s’ AND parola = ’%s’"""%(kull.for i in veriler: im. ¸ g g Birkaç önlemle pek çok güvenlik açı˘ ını engelleyebilirsiniz. paro)) Böylece kullanıcının bazı “tehlikeli” karakterleri girmesini engelleyebilir. Bir programcı olarak sizin göreviniz.com/blog/alfanumerik-ne-demek.isalnum(): im.isalnum() and paro. ancak bütün güvenlik açıklarını g bir çırpıda yamamak pek mümkün de˘ ildir. MODÜL D˙Z˙N˙ s I I I . Örne˘ in kullanıcıdan alınacak s g verileri alfanümerik karakterlerle [http://www. SQL’e sızma giri¸imlerine kar¸ı alabilece˘ iniz ba¸lıca önlem “%s” i¸aretleri yerg s s g s s ine ”?” i¸aretini kullanmak olmalıdır. onları sadece harf ve sayı girmeye zorlayabilirsiniz. SQL komutlarını i¸letmeden önce bazı s s s süzgeçler uygulamak da güvenlik açısından i¸inize yarayabilir. Bunun dı¸ında.html/] sınırlayabilirsiniz: if kull. (kull. güvenli˘ in çok boyutlu bir kavram oldu˘ udur. Her halükarda unutmamamız gereken sey. ?)""".fetchone() if data: print u"Programa ho¸geldin %s!" % data[0] s else: print u"Parola veya kullanıcı adı yanlı¸!" s Dedi˘ imiz gibi.istihza.commit() kull = raw_input("Kullanıcı adınız: ") paro = raw_input("Parolanız: ") im.execute("""SELECT * FROM kullanicilar WHERE kullanici_adi = ? AND parola = ?""". paro)) data = im. yazdı˘ ınız g g programları güvenlik açıklarına kar¸ı sürekli taramak ve herhangi bir açık ortaya çıktı˘ ında da s g bunu derhal kapatmaya çalı¸maktır.

’argv’. ’exc_clear’.py uzantılı birer Python programı oldu˘ unu söylemi¸tik. modüllerin aslında . ’__package__’. s elinizdeki Python sürümünü yönetebilirsiniz. ’__plen’. ’getcheckinterval’. ’getsizeof’. ’getdlopenflags’.1 sys Modülünün ˙çerigi I Her zaman oldu˘ u gibi. os modülünü. ’api_version’. Bunun tam olarak ne demek oldu˘ unu biraz sonra g gayet net bir sekilde anlayacaksınız. ’hexversion’. ’getdefaultencoding’. Simdi de sys modülünü inceleyece˘ iz. ’path_hooks’. ’maxsize’. ’platform’. ’dont_write_bytecode’.BÖLÜM 22 sys Modülü Python’daki en önemli modüllerden biri os ise. Bu modülün C kodlarını görmek için s http://svn. Bu modülü kullanarak. ’__stderr__’.python. ’path_importer_cache’. öteki pek çok modülün aksine Python programlama dili ile de˘ il C programlama dili ile g yazılmı¸tır. 362 . ’exit’. s s ¸ g sys modülü. ’__doc__’. ’builtin_module_names’. ’executable’. ’flags’. Örne˘ in sys modülü bu istisnalardan biridir. sys modülünün içinde ne oldu˘ unu görmek için dir() fonksiyonundan g g yararlanabilirsiniz: >>> dir(sys) [’__displayhook__’. ’excepthook’. ’__egginsert’. ’displayhook’. ’modules’. ’meta_path’. Mesela daha önce inceledi˘ imiz os modülü. ’path’. ’float_info’. ’maxunicode’. Python’daki hiç bir modülü bilmeseniz de bu iki modülü bilmeniz gerekir. “Modüller” konusunu i¸lerken anlatmı¸tık. ’__excepthook__’. öbürü de sys adlı modüldür. ˘ 22. ’getfilesystemencoding’. Yani hemen hemen bütün Python modülleri birer . ’copyright’. ’_getframe’. ’__stdin__’. ’__name__’. ’getrecursionlimit’. ’_current_frames’. Bu modüller o kadar önemlidir ki. ’getprofile’. ’call_tracing’. Ancak bu durumun bazı istisnaları da vardır. ¸ “Modüller” konusunu anlatırken. ’exc_type’.org/projects/python/branches/release26-maint/Python/sysmodule. Bu g modül. bilgisayarımızda bulug s g nan os.py adlı bir dosyaydı. ’gettrace’.c adresini ziyaret edebilirsiniz. ’exec_prefix’.py dosyası olarak sistemimizde bulunur. Python sistemine ili¸kin fonksiyonlar ve nitelikler barındırır. ’maxint’. ’_clear_type_cache’. ’callstats’. ’exc_info’. ’getrefcount’. ’__stdout__’. Dolayısıyla bu modülün Python kodları yoktur. ’byteorder’. Python’daki hemen hemen bütün modüller böyledir.

getdefaultencoding 4.argv) < 2: print "Çalınacak ¸arkı adını belirtmediniz!" s elif len(sys. ’setrecursionlimit’. ’stdin’.startfile(sys. ’version’. ’ps2’. ’warnoptions’] Gördü˘ ünüz gibi sys modülü içinde epey fonksiyon ve nitelik var. ’setprofile’. ’settrace’.argv[1]) elif os. ’subversion’. Amacı müzik s g çalmak olan program mesela söyle kullanılıyor olabilir: ¸ muzikcalar sarki_adi.. ’ps1’. g g Etrafta söyle programları sıkça görmü¸ olmalısınız: Komut satırında programın adı ile birlikte ¸ s birtakım seçenekler de belirtirsiniz ve ilgili program o belirtti˘ iniz seçeneklere göre programı g i¸letir.mp3 Bu komutla “sarki_adi. argv 2.coding: utf-8 -*import sys import os def sarkiyi_cal(): if os. ’setdlopenflags’.mp3” adlı sarkıyı çalabiliriz.. Böyle bir programı Python’da yazmak için ¸ argv niteli˘ inden yararlanabiliriz. platform 6. g s ˘ 22. path 5.. Bu bölümde su fonksiyon ve nitelikleri s g ¸ inceleyece˘ iz: g 1. Dolayısıyla bu niteli˘ i g g ö˘ renirken bu niteli˘ e özel önem ve ilgi göstermenizi öneririm. exit 3.2 argv Niteligi Bu nitelik sys modülünün en bilinen ve en sık kullanılan niteli˘ idir.system("xdg-open %s" %sys.argv) > 2: print "Birden fazla dosya adı belirttiniz!" . Biz bu fonksiyon ve nitelikg ler arasından en önemlilerini incelemeye çalı¸aca˘ ız.name == "posix": os.. ’stdout’.argv[1]) if len(sys. version_info O halde ilk niteli˘ imizle ba¸layalım. ’setcheckinterval’. Simdi su kodlara bakın: g ¸ ¸ #!/usr/bin/env python # -*.name == "nt": os. ’version_info’. stdout 7.’prefix’. Mesela elimizde “muzikcalar” adlı bir program oldu˘ unu varsayalım. ’stderr’. ’py3kwarning’. ’pydebug’.

sadece ismi belirtilerek g çalı¸tırılmı¸ demektir. s Ama e˘ er argv niteli˘ in gösterdi˘ i listenin uzunlu˘ u 2 veya daha fazla ise kullanıcımız prog g g g gramı çalı¸tırırken bazı seçenekler belirtmi¸ demektir (elif len(sys.else: sarkiyi_cal() Gelin isterseniz bu kodları açıklamaya ba¸lamadan önce.argv) >= 2: print "Programı ¸u seçeneklerle birlikte çalı¸tırdınız: " s s for i in sys.coding: utf-8 -*import sys if len(sys.py komu¸ tuyla çalı¸tırın. programınız herhangi bir seçenek belirtilmeden.argv) < 2:). g g g argv listesinin ilk ö˘ esi her zaman programınızın adıdır.argv Simdi bu programı argv_testi. argv niteli˘ inin tam olarak nasıl bir s g i¸e yaradı˘ ını anlamak için söyle bir sey yazalım: s g ¸ ¸ #!/usr/bin/env python # -*. Bu s s seçenekleri argv listesinin ilk ö˘ esi dı¸ındaki bütün ö˘ elerini ekrana yazdırarak görebilirsiniz: g s g . yazdı˘ ınız programa ekledi˘ iniz her seçenek argv listesine sırayla ekleniyor.py falanca filanca Bu defa söyle bir çıktı alaca˘ ız: ¸ g [’argv_testi.argv) < 2: print "Herhangi bir seçenek belirtmediniz!" elif len(sys. argv niteli˘ i bir liste oldu˘ u için listelerle g g g g yapabildi˘ iniz her seyi bu nitelikle de yapabilirsiniz.py’.coding: utf-8 -*import sys print sys. e˘ er argv niteli˘ inin gösterdi˘ i listenin uzunlu˘ u 2’den azsa kullanıcı hiç bir g g g g g seçenek belirtmemi¸ demektir (if len(sys. ’filanca’] Gördü˘ ünüz gibi.py).py adıyla kaydedin ve programı python argv_testi.py’] Gördü˘ ünüz gibi sys modülünün argv niteli˘ i aslında basit bir listeden ibarettir. Dolayısıyla e˘ er argv listesinin uzung g lu˘ u 2’den azsa. g ¸ Simdi aynı programı su sekilde çalı¸tırın: ¸ ¸ ¸ s istihza@istihza:~/Desktop$ python argv_testi. Bu listenin ilk g g ö˘ esi de yazdı˘ ımız programın adıdır (argv_testi. ’falanca’. Bu bilgiyi kullanarak söyle bir program yazabilirsiniz: s s ¸ #!/usr/bin/env python # -*.argv) >= 2:). Bu programı çalı¸tırdı˘ ınızda söyle bir çıktı alacaksınız: s s g ¸ istihza@istihza:~/Desktop$ python argv_testi.py [’argv_testi.argv[1:]: print i Dedi˘ imiz gibi.

ilk ba¸ta yazdı˘ ımız programı anlamak çok daha kolay bir hal s g almı¸ olmalı.. Çünkü programımız içinde bu iki modüle ait nitelik ve fonksiyonlardan yararlanaca˘ ız. Çünkü bildi˘ iniz gibi. ilk ö˘ e her zaman programımızın Ilk g g g adını gösteriyor..argv) < 2: print "Çalınacak ¸arkı adını belirtmediniz!" s elif len(sys. Bütün bu açıklamalardan sonra. sistemde o türdeki s dosyayı açan öntanımlı uygulamayla çalı¸tıracaktır.for i in sys.argv[1:]: print i ˙ ö˘ eyi ekrana yazdırmaya gerek yok. g Ardından sarkiyi_cal() adlı bir fonksiyon yazdık. o zaman sarkiyi_cal() g adlı fonksiyonu devreye sokuyoruz.system("xdg-open %s" %sys. E˘ er kullanılan i¸letim sistemi Windows ise g s argv listesinin birinci ö˘ esini. Peki size bir soru: Bu haliyle programımız müzik dosyası veya ba¸ka bir tür dosya diye bir ayrımda bulunmaksızın bütün dosyaları. os modülünün system() fonksiyonunu kullanarak yine argv listesinin ilk ö˘ esini g çalı¸tırıyoruz.argv[1]) elif os. Mesela su programa g s s ¸ bir bakın: . Programımızı tekrar görelim: s #!/usr/bin/env python # -*. yani kullanıcının program adından sonra yazdı˘ ı ilk seçene˘ i. s Elbette kullanıcının program adından sonra hiç bir seçenek belirtmeme veya 2’den fazla seçenek belirtme ihtimali de var. Acaba biz bu programda kullanıcının girdi˘ i s g dosya adlarının müzik dosyası olup olmadı˘ ını nasıl denetler ve programımızı sadece müzik g dosyalarını çalı¸tıracak hale getirebiliriz? s argv niteli˘ i ba¸ka pek çok faydalı i¸ için kullanılabilecek harika bir araçtır.startfile(sys.coding: utf-8 -*import sys import os def sarkiyi_cal(): if os.argv) > 2: print "Birden fazla dosya adı belirttiniz!" else: sarkiyi_cal() Burada öncelikle sys ve os modüllerini içe aktarıyoruz.argv) < 2: print "Çalınacak ¸arkı adını belirtmediniz!" s elif len(sys. ˙ste bu ihtimallere kar¸ı su kodları yazıyoruz: I¸ s ¸ if len(sys. g g g os modülünün startfile() fonksiyonunu kullanarak çalı¸tırıyoruz.argv[1]) if len(sys. E˘ er kullanılan i¸letim sistemi s g s GNU/Linux ise.name == "nt": os.name == "posix": os.argv) > 2: print "Birden fazla dosya adı belirttiniz!" E˘ er kullanıcımız program adının yanına sadece 1 adet seçenek eklerse.

Bu programı kullanabilmek için sisteminizde Python ..#!/usr/bin/env python # -*. s Programı komut satırından python falanca.argv) < 2: print ".coding: utf-8 -*import sys surum = "0.2" yardim = """ "FALANCA programının %s sürümünü kullanıyorsunuz. E˘ er kullanıcımız su komutu verirse kullandı˘ ı programın g ¸ g sürümünü ö˘ renebilir: g python falanca.coding: utf-8 -*import sys surum = "0.3 exit() Fonksiyonu sys modülünün içindeki fonksiyonlardan biri de exit() fonksiyonudur. Aslında siz bu fonksiyonu daha önce de görmü¸tünüz.2" yardim = """ "FALANCA programının %s sürümünü kullanıyorsunuz. g 22.argv[1] == "-v": print surum elif sys..py komutuyla çalı¸tırabilirsiniz. Hatırlarsanız ilk derslerimizin birinde bu fonksiyonun Python’un s etkile¸imli kabu˘ undan çıkmak için kullanıldı˘ ını söylemi¸tik.argv[1] == "-h": print yardim else: print "Böyle bir seçenek yok!" Gördü˘ ünüz gibi bu programda kullanıcılarımıza programın sürümünü ve yardım dosyasını g görüntüleme imkanı veriyoruz.py -h E˘ er kullanıcı “-v” ve “-h” dı¸ında ba¸ka bir sey yazarsa programımız kendisini böyle bir g s s ¸ seçenek olmadı˘ ı konusunda uyaracaktır. ˙yi e˘lenceler!""" % surum s I g if len(sys. Bu programı kullanabilmek için sisteminizde Python dı¸ında filanca adlı modülün de kurulu olması gerekiyor. Mesela yukarıda yazdı˘ ımız pros g g s g gramda bu fonksiyonu kullanmak istersek söyle bir sey yazabiliriz: ¸ ¸ #!/usr/bin/env python # -*.py -v Ya da e˘ er su komutu verirse programın yardım dosyasına ula¸abilir: g ¸ s python falanca." elif sys.

dı¸ında filanca adlı modülün de kurulu olması gerekiyor.exit() elif sys.4 getdefaultencoding() Fonksiyonu Bildi˘ iniz gibi.getdefaultencoding() ’ascii’ Gördü˘ ünüz gibi Python öntanımlı olarak ‘ascii’ adlı kodlama biçimini kullanıyor. yazdı˘ ımız bir programda Türkçe karakterler kullanabilmemiz için programımızın g g en ba¸ına suna benzer bir satır eklememiz gerekiyor: s ¸ # -*. ˘ 22. unicode ve Python” ba¸lıklı konuyu inceleyebilirsiniz. program içinde kullanaca˘ ımız kodlama biçiminin “utf-8” olaca˘ ını bildirmi¸ g g s oluyoruz. s Programı komut satırından python falanca. Python içe aktarmaya çalı¸tı˘ ımız bir modülü ararken path s g s g . Gördü˘ ünüz gibi exit() fonksiyonunu programdan g g çıkmak için kullanıyoruz.argv) < 2: sys.5 path Niteligi Modüller konusu içinde os modülünü anlatırken sys modülünün path adlı niteli˘ inden söz etg mi¸tik. Python’da g ya¸adı˘ ımız pek çok Türkçe karakter probleminin nedeni budur.argv[1] == "-v": print surum elif sys. Bu gs yüzden Python’un 3. Orada da söyledi˘ imiz gibi. 22. s g Not: Python’un 3. “ascii” ve unicode konularında ayrıntılı bilgi edinmek için “ascii. Not: “utf-8”.argv[1] == "-h": print yardim else: print "Böyle bir seçenek yok!" Böylece e˘ er argv listesinin uzunlu˘ u 2’den azsa programımız kapanacaktır. E˘ er bu satırı yazmazsak Python otomatik olarak “ascii” adlı bir kodlama biçimini g kullanacaktır.x sürümlerinde öntanımlı kodlama biçimi “utf-8” olarak de˘ i¸tirildi.x sürümlerinde Türkçe karakter problemleri çok daha az olacaktır. ˙yi e˘lenceler!""" % surum s I g if len(sys.coding: utf-8 -*- Böylece Python’a.py komutuyla çalı¸tırabilirsiniz. g g Bu fonksiyonun çok fazla bir özelli˘ i yoktur. s Python’un öntanımlı kodlama biçiminin ne oldu˘ unu ö˘ renmek için getdefaultencoding() adlı g g fonksiyondan yararlanabilirsiniz: >>> sys.

mesela bir modül iki g s farklı dizin içinde yer alıyorsa. Aynen buna benzer bir sekilde. O yüzden yazdı˘ ınız programlarda bazen bir dizini bu listenin en ba¸ına eklemeniz g s gerekebilir.path. Dolayısıyla listeler üzerinde yaptı˘ ınız her g g g seyi path niteli˘ i üzerinde de yapabilirsiniz.insert(0. Mesela listelerin insert() veya append() metotlarını ¸ g kullanarak path listesine yeni ö˘ eler ekleyebilirsiniz: g >>> sys.platform ’linux2’ Ben bu komutu GNU/Linux üzerinde verdi˘ im için aldı˘ ım çıktı linux2 oldu. Tıpkı argv niteli˘ i gibi. kullanılan i¸letim sistemini tespit etmek için sys ¸ s modülünün platform adlı niteli˘ inden de yararlanabiliriz: g >>> sys.platform ’win32’ Bu komut Mac Os X’te ise söyle bir çıktı verir: ¸ >>> sys.niteli˘ inin gösterdi˘ i dizinlerin içine bakar. komutu verdi˘ iniz i¸letim sistemine göre farklılık gösterece˘ ini biliyorg s g sunuz.append("/herhangi/bir/dizin") Bu komut. E˘ er aynı komutu g g g Windows üzerinde verirseniz söyle bir çıktı alırsınız: ¸ >>> sys. Dolayısıyla bu niteli˘ i kullanarak 32/64 bit ayrımı g yapamazsınız. Python listede soldan sa˘ a do˘ ru buldu˘ u ilk modülü dikkate g g g alacaktır.platform ’darwin’ Bu nitelik ile ilgili söyle bir uyarı yapalım: Windows mimariniz 32 bit de olsa 64 bit de olsa bu ¸ nitelik her zaman win32 çıktısı verecektir. ekledi˘ iniz dizini listenin en sonuna ili¸tirecektir.path. E˘ er dizininizi listenin en ba¸ına g s g s eklemek isterseniz su komutu kullanabilirsiniz: ¸ >>> sys.6 platform Niteligi Hatırlarsanız kullanılan i¸letim sistemini tespit etmek için os modülünün name adlı niteli˘ ini s g kullanıyorduk. path niteli˘ i de bir listedir. ˘ 22. "/herhangi/bir/dizin") Python içe aktaraca˘ ınız bir modülü path listesinde ararken listenin ba¸ından sonuna do˘ ru g s g ilerler ve modülü buldu˘ u anda arama i¸lemini durdurur. Kullanılan i¸letim sisteminin 32 bit mi yoksa 64 bit mi oldu˘ unu tespit edebilmek s g için platform adlı ba¸ka bir modülden yararlanabilirsiniz: s . Dolayısıyla. g g Bu niteli˘ i söyle kullanıyoruz: g ¸ >>> import sys >>> sys.path Bu komutun çıktısının.

satır 6. satır 7.architecture() (’64bit’. print deyiminin bir sonraki satıra g geçmesini engellemek için virgülden yararlanabiliriz: . satır 2. E˘ er sistemim 64 bit olsaydı söyle bir çıktı alacaktım: g ¸ >>> platform. satır 3. print "%s. her satırdan sonra bir alt satıra geçiliyor.architecture() (’32bit’.>>> import platform >>> platform. satır 4.architecture() (’32bit’.. satır Gördü˘ ünüz gibi. satır 8. ’WindowsPE’) Gördü˘ ünüz gibi bu çıktılar birer demettir. ’WindowsPE’) 64 bitlik Windows i¸letim sisteminde ise su çıktıyı alacaksınız: s ¸ >>> platform.architecture() (’64bit’.. ’ELF’) Ben bu komutu 32 bitlik bir GNU/Linux i¸letim sisteminde verdi˘ im için çıktı yukarıdaki gibi s g oldu. satır 10. satır 5.7 stdout Niteligi Bildi˘ iniz gibi Python’da ekrana herhangi bir sey yazdırabilmek için print deyiminden yararg ¸ lanıyoruz: >>> print "merhaba!" merhaba! Python print deyimlerinden sonra otomatik olarak yeni satıra geçer.. satır 9. Yani: >>> for i in range(10): . ’ELF’) Bu komut 32 bitlik Windows i¸letim sistemlerin su çıktıyı verir: s ¸ >>> platform. 1. Dolayısıyla demetlere nasıl davranıyorsanız bu g çıktılara da öyle davranabilirsiniz. satır" %(int(i)+1) .. ˘ 22.

Ama bu modülü de zamanı geldi˘ inde inceleyece˘ iz.write() metodunun bunu g s yapmaması. sys.. sys. for döngüsü içinde “i” de˘ i¸kenini str() fonksiyonunu kullanarak gs karakter dizisine dönü¸türüyoruz.write() metodu bütün sayıları yan yana dizdi ve satır sog nunda da yeni satıra geçmedi. birbirlerinin yerine geçerek ekrana basılacakg tır.stdout.write() metodu sayıları ekrana basamaz: g >>> for i in range(10): .sleep(1) .write() print niteli˘ iyle aynı i¸i görüyor. ˙ s Istedi˘ iniz sey bu olabilir. ..... time. ˙ satırda sys ve time adlı iki modülü içe aktardık.stdout... not int Böyle bir hata almamak için.stdout..stdout. in <module> TypeError: argument 1 must be string or read-only character buffer. s sys. line 2.. Ama olmaya da bilir. sys.write() komutunu kullanabilece˘ iniz faydalı bir örnek söyle olabilir: g ¸ >>> import sys. Sayılar alt alta de˘ il..stdout. Ayrıca bu sayılar yan yana de˘ il. time Ilk modülünü ise henüz ö˘ renmedik... time >>> for i in range(20): .stdout. Daha do˘ rusu bu i¸ için sys modülünün stdout g g s niteli˘ inin write() adlı metodunu kullanaca˘ ız...stdout.. yan yana diziliyor.write(str(i)) . g .write("Merhaba!") Merhaba!>>> Gördü˘ ünüz gibi...write("%s\r" %i) .. Ancak burada her sayının arasında g s birer adet de bo¸luk karakteri var..write(i) Traceback (most recent call last): File "<stdin>". Python’da tarih ve zamanla ilgili i¸lemler yapmamızı sa˘ layan bir s g modül oldu˘ unu bilelim yeter. Simdig g g ¸ lik biz bu time adlı modülün. E˘ er g ¸ g hem ö˘ eleri yan yana dizmek hem de ö˘ eler arasında bo¸luk bırakmamak istiyorsanız sys g g s modülünün stdout niteli˘ ini kullanabilirsiniz. Bunu sa˘ layan sey print g g ¸ i satırından sonra getirdi˘ imiz bir adet virgül i¸aretidir. Hemen bir örnek verelim: g g >>> sys. print i.write() metoduna verdi˘ imiz argümanın bir karakter dizisi olması zorunlug lu˘ udur.stdout.. sys.stdout. 0123456789>>> Gördü˘ ünüz gibi. sys. Bunlardan sys modülünü biliyoruz.stdout. Tek farkları. Bu kodlarda dikkat etmemiz gereken bir ba¸ka sey de s ¸ sys.>>> for i in range(10): . sys.stdout.flush() Bu kodları çalı¸tırdı˘ ınızda 0’dan 20’ye kadar olan sayılar birer saniye aralıklarla tek bir satıra s g yazdırılacaktır.. print g g s niteli˘ inin i¸ini bitirdikten sonra yeni satıra geçerken sys.. 0 1 2 3 4 5 6 7 8 9 Burada çıktıya dikkat edin. Bu durumu daha net bir sekilde görebilmek için söyle bir örnek verebiliriz: ¸ ¸ >>> for i in range(10): . Peki bu kodlar nasıl çalı¸ıyor? Hemen açıklayalım: s 1. sys.

stdout. Bu kod 0’dan 20’ye kadar olan sayıların alt alta de˘ il. Ama e˘ er istersek biz print çıktılarını ekran dı¸ında ba¸ka g g s s yerlere de yönlendirebiliriz.txt".stdout‘un ba¸ka meziyetleri de vardır.2. Bu fonksiyon. time. Son satırdaki sys.stdout niteli˘ i size aynı i¸i daha do˘ al bir sekilde yapma imkanı verir. konumuna s dönülmesini sa˘ lamaktır. g 3. time >>> for i in range(20): . “istihza” karakter dizisi ile “merhaba” karakter dizisi aynı sayıda karakterden olu¸tu˘ u için “merhaba” karakter dizisi siliniyor.write("%s\r" %i) komutunda da “\r” kaçı¸ dizisi sayılar ekrana döküldükçe en ba¸a dönülmesini..sleep(1) gibi bir kod görüyoruz.. Aslında bu bir kaçı¸ dizisidir. for döngüsünün ilk satırında time.stdout. Sonraki satırda sys. print "%s\r" %i. onun yerine sadece “istis g hza” karakter dizisi çıktıda görünüyor. Biz burada bu süre aralı˘ ını 1 saniye olarak belirledik..write("%s\r" %i) komutunu görüyoruz.. Yukarıdaki sys. g 5. yapılan i¸lemlere belli sürelerde zaman s aralıkları koymamızı sa˘ lar. Ancak yazdı˘ ınız g s g programın birden fazla i¸letim sisteminde düzgün çalı¸masını istiyorsanız bu satırı eklemeniz s s gerekir.stdout. yani karakter dizisinin en ba¸ına dönülüyor ve “istihza” karakter dizisi “merhaba” s karakter dizisinin üzerine yazılıyor. Burada time modülünün sleep() adlı fonksiyonunu kullandık. Mesela su kodlara bir bakın: ¸ >>> import sys >>> f = open("log. g Dilerseniz bu satırı kaldırıp programı öyle çalı¸tırmayı deneyerek bu satırın tam olarak ne i¸e s s yaradı˘ ını görebilirsiniz.flush() Ancak sys.sleep(1) . Bizim g g kodlarımızda 0’dan 20’ye kadar olan sayılar 1’er saniye aralıklarla ekrana basılacak. 4. Görevi ise bir karakter dizisinin 0. g ¸ çıktıları do˘ rudan ekrana verir. Sonraki satırda bir for döngüsü kurduk. ¸ g ¸ g Yani: >>> print "bir ¸ey" s Bu komutu verdi˘ imizde bir sey çıktısı hemen ekranda görünecektir. (Bazı i¸letim sistemlerinde bu satır gereksizdir.) Aslında yukarıda yazdı˘ ımız kodları söyle de yazabilirdik: g ¸ >>> import sys. Ayrıca g s g ¸ sys. Bu kaçı¸ dizisinin nasıl çalı¸tı˘ ını anlamak için söyle bir örnek vereg s s g ¸ biliriz: >>> print "merhaba\ristihza" istihza Burada olan sey su: “merhaba” karakter dizisinin hemen ardından “\r” kaçı¸ dizisinin etkisiyle ¸ ¸ s 0.flush() ise sayıların ekranda hemen görünebilmesini sa˘ lıyor. yan yana yazılmasını sa˘ lıyor.stdout = f . .stdout. Çünkü print komutu. konuma.. sys. böylece bir sonraki sayının s s bir önceki sayıyı silmesini sa˘ lıyor. Bu döngüde 0’dan 20’ye kadar olan sayıları ekrana basaca˘ ız.. s Normal sartlar altında print deyimi yardımıyla yazdırdı˘ ımız seyler do˘ rudan ekranda görünür. "w") >>> sys. Burada bir de “\r” ifadesini g g görüyoruz.

gs g Peki biz print komutunu eski haline nasıl döndürece˘ iz? Bunun birkaç yolu vardır: g 1. ˙ste I¸ biz bu sys. Dosyayı kapattıktan sonra print komutunu kullanmaya çalı¸ırsak Python bize söyle bir hata mesajı verecektir: s ¸ >>> print "deneme" Traceback (most recent call last): File "<stdin>"..stdout niteli˘ inin de˘ erini sys.__stdout__ ifadesi. Ya dosyayı yeniden açg s manız. 5.stdout = sys. Bunu neden yaptı˘ ımızı artık adınız gibi biliyorg sunuz. Dolayısıyla artık print komutu. Python’un öntanımlı standart çıktı konumunu tutar. Biz yukarıdaki örnekte standart çıktı konumu olarak f adını gs verdi˘ imiz dosyayı gösterdik. mevcut çalı¸ma dizini içinde log. bildi˘ iniz gibi. Daha sonra. çıktılarını ekrana de˘ il dosyaya veriyor. Python geli¸tiricilerinin.txt adlı dosyayı açın ve içinde ne yazdı˘ ına bakın. 2. 3. ya da gerekli bütün i¸lemleri dosyayı kapatmadan önce yapmanız gerekir. ¸ s g Dosyayı kapattıktan sonra artık print komutunu kullanamayız. Bu ifade “standart çıktı konumu” anlamına gelir. Öncelikle sys modülünü içe aktardık. line 1.. “stdout” g g kelimesinin açılımı “standard output“tur.. Sonraki satırda f adını verdi˘ imiz dosyamızı sys. dosyada yaptı˘ ımız de˘ i¸ikliklerin etkili olabilmesi için dosyamızı kapatıyoruz.txt dosyasına g ¸ g yazdırılıyor.__stdout__ yapacak olursanız print komutu eski haline g g dönecektir. Dolayısıyla sys. Yani Python’un öntanımlı “standart çıktı konumu” bilgisayar ekranıdır.close() Burada su i¸lemleri yaptık: ¸ s 1. s g açtı˘ ınızda her sey eski haline dönecektir. Dolayısıyla sys.stdout niteli˘ inin gösterdi˘ i de˘ eri ba¸ka bir konuma atayarak standart çıktı g g g s konumunu de˘ i¸tirebiliriz.>>> print "Yeni bir mesajınız var!" >>> f... bu tür i¸lemler için tavsiye etti˘ i yol ise sudur: s s g ¸ >>> import sys >>> orijinal_konum = sys. 3..stdout niteli˘ ine atadık. Normal sartlar altında. g ¸ 2. in <module> ValueError: I/O operation on closed file Python’da kapattı˘ ınız bir dosya üzerinde yeni i¸lem yapamazsınız. s Yalnız burada söyle bir soru akla geliyor: Biz yukarıdaki komutlar yardımıyla standart çıktı ¸ konumunu de˘ i¸tirdik.stdout . Gördü˘ ünüz gibi. Bu komutla yazdırdı˘ ımız seyler do˘ ruca log. Son olarak.stdout niteli˘ i Python’da print komutunun nereye çıktı vereg ce˘ ini belirler.__stdout__ Etkile¸imli kabu˘ u kapatıp yeniden s g sys. g gs Simdi mevcut çalı¸ma dizini altındaki log. Su komutu kullanabilirsiniz: ¸ >>> sys. g 4.txt adlı bir dosya olu¸turduk ve bu dosyayı s s yazma kipinde (“w”) açtık. print komutu do˘ rudan ekrana g ¸ g g çıktı verir. Etkile¸imli kabu˘ u kapatıp yeniden açabilirsiniz. bir önceki adımda yaptı˘ ımız i¸lemlerden ötürü artık print komutu g g s ekrana çıktı vermiyor.

stdout de˘ erini eski s I¸ g haline döndürebilmek için bu niteli˘ in de˘ erini orijinal_konum olarak de˘ i¸tiriyoruz.. Python’daki ileri düzey modüllerden s s biri olan “math” modülü matematikle u˘ ra¸anların i¸lerini bir hayli kolayla¸tıracak metotlar ve g s s s fonksiyonlar barındırır. En ba¸ta da söyledi˘ imiz gibi. ˙simiz bitip dosyayı kapattıktan sonra da sys. g g g yazdı˘ ınız programlarda sürüm kontrolü yapabilirsiniz. ’final’.stdout = orijinal_konum >>> print "deneme" deneme Burada sys. .stdout = f >>> print "deneme mesajı" >>> f. Mesela: g >>> if not sys. Bu niteli˘ in görevi kullanılan Python sürümü hakkında bilgi vermektir. Böylece g g gs print komutu eski i¸levine yeniden kavu¸mu¸ oluyor.version_info (2. Bunu söyle g ¸ kullanıyoruz: >>> sys..close() >>> sys. bu modül s s g Python’daki en önemli modüllerden biridir.8 version_info Niteligi sys modülü konusunda inceleyece˘ imiz son niteli˘ in adı version_info.txt". Oldukça kolay bir g g niteliktir bu. 6. version_info niteli˘ i çıktı olarak bir demet veriyor. Not: Bu yazı Sayın Kür¸at Örsel tarafından hazırlanmı¸tır.version_info[:2] == (2. Daha sonra normal bir sekilde çıktı konumu yönlendirme i¸lemgs ¸ s lerini gerçekle¸tiriyoruz.. 5. Dolayısıyla bu konu içinde anlatılanları sık sık tekrar etmenizi öneririm. "Python’un 2. Bu niteli˘ i kullanarak. "w") >>> sys.. özgün çıktı konumunu orijinal_konum g gs adlı bir de˘ i¸kende saklıyoruz. 6): .stdout‘un de˘ erini de˘ i¸tirmeden önce. s s s ˘ 22.6 sürümü kurulu olmalı!") Böylelikle sys modülünü tamamlamı¸ olduk. 0) Gördü˘ ünüz gibi.>>> f = open("log. print ("Bu programı kullanabilmeniz için " .

Unutmadan modülümüzü çalı¸mamıza ça˘ ıralım: g s g >>> import math Bu komut ile modülümüzü çalı¸mamıza dahil etmi¸ olduk. sinüs. ’log’. ’floor’. ’copysign’. Yukarıdaki kodu yazdı˘ ımızda Python bize cevap olarak sunu gösterir: ¸ g ¸ 8. ’sqrt’. ’e’. ’degrees’. ’trunc’] Modülümüzün içeri˘ ini de gördü˘ ümüze göre simdi kosinüs. ’cosh’. ’__package__’. ’__name__’.pow(2. ’atan2’. 3) seklindedir. ’fsum’. ’fabs’.0 pow ifadesinin kullanımında parentez içerisindeki ilk sayı tabanı. Python’da bunun için pow fonksiyonu kuls s lanılmaktadır. ’factorial’. ’hypot’. pow power kelimesinin kısaltması olup Türkçe’de kuvvet. Simdi math mod¸ ülümüzün içeri˘ ine bakalım. ’pi’. ’log10’. ’tanh’. ’cos’. üs anlamlarına denk gelmektedir. s 23. üslü g g ¸ ifadeler gibi fonksiyonlarla ilgili örneklerle kullanımını anlamaya çalı¸alım. ’acosh’. ’log1p’. ’atan’. ’fmod’. ’pow’. ikinci sayı ise üssü göstermektedir. ’sinh’. tanjant. ’sin’. ’acos’. ’tan’. ’asin’. ’exp’. ’isinf’. 374 . ’frexp’. ’atanh’. Simdi içerdi˘ i fonksiyonları a¸a˘ ıs s ¸ g s g daki komutu vererek görelim: >>> dir(math) [’__doc__’. ’asinh’. ’ceil’. ’modf’. ’isnan’. ’radians’. ’ldexp’. pi.BÖLÜM 23 math Modülü Python’da matematiksel fonksiyonları math modülü ile kullanmaktayız. Örnek verecek olursak 23 ifadesinin Python’daki kar¸ılı˘ ı: s g >>> math. karekök.1 Üslü ˙fadeler Fonksiyonu (pow) I Üslü ifadeler matematikte hep kar¸ımıza çıkmı¸tır.

matematikteki euler sabitini veriyor. g g Hemen Python’a sorarak ö˘ renelim bu pi sayısının de˘ erinin kaç oldu˘ unu.0 / 3.pow(r.4 Euler Sabiti (e) Bu nitelik.0 * math.3 Karekök Fonksiyonu (sqrt) Karekök ile ilgili fonksiyonumuz sqrt. pi sayısı ile çarp.pow(2. s Küre hacmi= 4/3(π. hacim hesaplamalarında bolca kullanılır g ve de˘ eri genellikle 3 ya da 3.˘ 23.coding:utf-8 -*from __future__ import division import math r = input("Kürenin yarıçapını giriniz:") hacim = 4 / 3 * math.510321638291124 Tabii ki bu i¸lemleri kwrite programında bir dosya açarak a¸a˘ ıdaki gibi de yazabiliriz: s s g #/usr/bin/env python #-*. sonra da sonucu 2’nin 3’üncü ¸ s kuvveti ile çarp. Simdi küçük bir hacim hesaplaması örne˘ i ile s ¸ g konuyu peki¸tirelim.r3 ) formülü ile bulunuyordu. Hemen kodlarımızı yazmaya ba¸layalım: s >>> 4. Tabii ki esasen pi sayısı bu kadar kısa de˘ ildir. Kullanımı ise a¸a˘ ıdaki gibidir: s g >>> math. 23. Kürenin hacmini bulalım.2 Pi Niteligi (pi) pi sayısı hepimizin okul yıllarından bildi˘ i üzere alan.1415926535897931 Demek ki gerçek pi sayısı biraz daha uzunmu¸.0 23. A¸a˘ ıdaki komutu g g g s g yazıyoruz: >>> math.pi * math.sqrt(9) Kodunu yazıp enter’e bastı˘ ımızda Python bize a¸a˘ ıdaki sonucu gösterir: g s g 3. Küre hacmi. Kullanımı ise a¸a˘ ıdaki gibi: s g .pi Dedi˘ imizde Python bize a¸a˘ ıdaki çıktıyı gösterir: g s g >>> 3. Python bize cevap olarak sunu gösterdi: ¸ 33.pi * math. 3) Bu kod ile sunu demi¸ olduk: 4 ile 3’ü böl.14 olarak alınır. 3) Böylece kürenin hacmini veren küçük bir programımız oldu.

Kullanımı su sekilde.7 Logaritma (log10) Fonksiyonu Bu fonksiyonun yukarıdakinden tek farkı taban sayısının önceden belirlenmi¸ ve 10 olması.>>> math.0 23. Kullanım ve benzerlik açısından aynı pi sayısı gibi: 2. exp fonksiyonu yukarıda bahsetti˘ imiz euler sabitinin g kuvvetini alan bir fonksiyon. y sayısı ise taban sayısını temsil etmektedir.3890560989306504 Bu sayı da nereden çıktı diyorsanız. Bir örnek ile peki¸tirelim: s >>> math. math. Yani exp(2) dedi˘ imizde esasen biz Python’a sunu demi¸ oluyoruz: (2. ¸ ¸ .7182818284590451 cevap g s olarak Python tarafından gösteriliyor.8 Degrees Fonksiyonu Degrees fonksiyonu girilen açıyı radyan’dan dereceye çevirmeye yarar.log10(10) Dönen cevap: 1. s 23. exp(x) ifadesindeki x parametresi bizim kuvvetimizdir.6 Logaritma (log) Fonksiyonu Logaritma fonksiyonumuzun kullanımı su sekilde. Bu s yüzden fonksiyonun kullanımı söyle.7182818284590451)² Yani g ¸ s euler sabitinin karesini almı¸ olduk.log(2.0 23.7182818284590451 23.e Yukarıdaki kodu yazıp enter’e bastı˘ ımızda kar¸ımıza euler sabiti 2.exp(2) kodunu yazdı˘ ımızda Python a¸a˘ ıdaki cevabı verir: g s g 7. Burada x sayısı logaritması alı¸ ¸ nacak sayı.5 exp Fonksiyonu exp fonksiyonunun kullanımı su sekilde: ¸ ¸ >>> math.exp(x) Bu kodu küçük bir örnekle açıklamak daha kolay olacak. y). 2) Python bize a¸a˘ ıdaki cevabı verir: s g 1. log10(x) Burada x onluk tabana göre logaritması alınacak ¸ sayıdır: >>> math. log(x.

radians(45) 0. Tanjant fonksiyonlarına girmeden önce belirtmem gereken önemli bir nokta bulunmaktadır.cos(math.degrees(45) 2578.9 Radians Fonksiyonu Radians fonksiyonu girilen açıyı derece’den radyan’a çevirmeye yarar.7071 gibi bir de˘ er g g g g bekliyorduk.3100780887044 23.52532198881772973 Evet yukarıda gördü˘ ümüz üzere bizim bekledi˘ imiz cevap bu de˘ il.>>> math. Bunu a¸a˘ ıdaki sekilde düzeltebiliriz: s g ¸ >>> math.radians(45)) 0. g 23. Bu yüzden aldı˘ ımız g sonuçlar okulda ö˘ rendi˘ imiz de˘ erlerden farklı olacaktır.10 Kosinüs Fonksiyonu (cos) Hemen kosinüs fonksiyonu ile bir örnek yapalım: >>> math. >>> math.radians(x) x burada radyana çevrilecek açımızdır.cos(0) Python bunun sonucu olarak bize: 1.70710678118654757 Simdi istedi˘ imiz cevabı aldık.degrees(x) x burada derece’ye çevrilecek radyandır.cos(45) 0. ¸ ¸ >>> math. ¸ g . Biz 0. Örnek olarak 45 derecelik bir açı verelim ve radyan kar¸ılı˘ ını bulalım: s g >>> math.0 cevabını verir. Bu fonksiyonlarda açı olarak Python radyan kullanmaktadır. Örnek olarak 45 radyanlık bir açı verelim ve derece kar¸ılı˘ ını bulalım: s g >>> math. Sinüs. Bunuda radians fonksiyonu ile düzelg g g tece˘ iz.78539816339744828 Kosinüs. Kullanımı su sekilde.

Biz 0.radians(45)) 0. Formülümüz a¸a˘ ıdaki gibidir.0 cevabını verir.tan(0) Python bunun sonucu olarak bize: 0. s Simdi istedi˘ imiz cevabı aldık. >>> math.0 cevabını verir.12 Tanjant (tan) Fonksiyonu Tanjant fonksiyonu ile bir örnek yapalım: >>> math. ¸ g Yukarıda verdi˘ imiz fonksiyonlardan bazılarını kullanarak basit bir fizik sorusu çözelim.7071 gibi bir de˘ er g g g g bekliyorduk.23. >>> math.11 Sinüs Fonksiyonu (sin) Hemen sinüs fonksiyonu ile bir örnek yapalım: math.6197751905438615 Evet yukarıda gördü˘ ümüz üzere bizim bekledi˘ imiz cevap bu de˘ il.000(yakla¸ık) gibi g g g s bir de˘ er bekliyorduk.70710678118654746 Simdi istedi˘ imiz cevabı aldık.000 yapar.sin(0) Python bunun sonucu olarak bize: 0.sin(math.85090352453411844 Evet yukarıda gördü˘ ümüz üzere bizim bekledi˘ imiz cevap bu de˘ il.99999999999999989 Buda yakla¸ık olarak 1. Bunu a¸a˘ ıdaki sekilde düzeltebiliriz: g s g ¸ >>> math.tan(45) 1. g 3 newton ve 5 newton büyüklü˘ ünde olan ve aralarındaki açı 60 derece olan iki kuvvetin g bile¸kesini bulalım. Biz ~1. ¸ g 23.sin(45) 0.tan(math.radians(45)) 0. Bunu a¸a˘ ıdaki sekilde düzeltebiliriz: s g ¸ >>> math. s s g .

0827625303 Tabii ki daha farklı uygulamalar da yapılabilir.13 Faktoriyel (factorial) Faktoriyel i¸lemi için Python 2.Bo¸ bir kwrite belgesi açarak içine kodlarımızı yazmaya ba¸layalım: s s #/usr/bin/env python #coding:utf-8 -*import math #math modülünü ça˘ırdık. g s #¸imdi formülümüzü yazalım: S R = math. ¸ ¸ n!=nx(n-1)x(n-2)x(n-3)x.. 23..factorial(5) dedi˘ imizde Python bize g 120 sonucunu veriyor..ve ekrana çıktı verelim: print "Bile¸ke kuvvet:".pow(f2. s s s Bundan önceki 2. Kullanımı ise su sekilde: ¸ ¸ math. Lise matematik derslerinde faktoriyel su sekilde hesaplanıyordu.. g a = 60 # Açımızı a de˘i¸kenine atadık. Kendimiz hesaplayacak olursak: 5!=5x4x3x2x1=120 sonucuna ula¸ırız.cos(math.sqrt(math. Bu fonksiyon ile Python bizi uzun i¸lemlerden ve ekstra tanımlamalardan s s kurtarıyor. g s f1 = 3 # Birinci kuvveti f1 de˘i¸kenine atadık..factorial(x) x sayısı burada bizim faktoriyelini alaca˘ ımız sayıyı temsil ediyor. g Bir örnek ile inceleyelim. 2) + math. . g s f2 = 4 # ikinci kuvveti f2 de˘i¸kenine atadık.radians(a))) #. ¸ >>> math.pow(f1.x1 Modülümüzü içe aktaralım: >>> import math Simdi..5 sürümünde böyle bir fonksiyon yoktu.6 sürümü ile math modülü içerisinde bir fonksiyon olu¸turulmu¸. 2) + 2 * f1 * f2 * math. R s Kodlarımızı çalı¸tırdı˘ ımızda sonuç: s g 6..

7 saat sonra bulu¸mak üzere anla¸ıp ayrılıyorlar.0 cevabını döndürür. y ise modu temsil eder: ¸ >>> math. s Python bu uzun i¸lemi bizim için fmod fonksiyonu ile tanımlamı¸. ¸ >>> math. saat 09 da.14 fmod Fonksiyonu Bu fonksiyon matematikteki modüler aritmetik hesaplamaları için olu¸turulmu¸. g >>> math. tam sayılardaki toplama i¸les s minden farklıdır.y) Burada x. Örne˘ in 7. s s kısaca mod i¸lemleri nasıl yapılıyor ona de˘ inelim. Birkaç s s s s s örnek ile fmod fonksiyonun kullanımına bakalım: >>> fmod(x.y ondalıklı sayıyı temsil etmektedir. Kullanımı söyle.3) 20. y) seklinde bir kullanımı var. Burada x modu alınacak sayıyı. s g ˙ önce Ilk Ahmet bey ile Fatma hanım. Saat s s 12 bölmeli oldu˘ u için.fmod(99. i¸leri kolayla¸tırmı¸. >>> math. Yapılan toplama i¸lemi.3) 0. Bu tip i¸lemler Modüler Aritmetik’in konusudur.3 gibi. en küçük tam sayıyı döndürür.23.ceil(19.15 ceil Fonksiyonu Ceil kelimesinin Türkçe kar¸ılı˘ ı tavan çekmek. Ahmet bey ile Fatma hanım bulu¸tu˘ unda saat 4’ ü gösterir.0 23. Bunu g s g modüler aritmetik ile söyle buluruz: ¸ Burada 12 sayısı bizim modumuzdur.fmod(639. Python bize. Anla¸ılas g s s ca˘ ı üzere biz yukarıya yuvarlama i¸lemi anlamında kullanaca˘ ız. tavan in¸a etmek anlamlarına gelir. 5) komutunu verdi˘ imizde.0 cevabını döndürür. g 4. . Ceil fonksiyonu verilen ondalıklı s sayıdan büyük.ceil(x. Fonksiyon matematikte g s g kullanılan yuvarlama i¸lemi ile ilgili fonksiyonlardan biridir.

5 sayısını en yakın taban olan 3.17 fabs Fonksiyonu Bu fonksiyon verilen sayının mutlak de˘ erini verir.fabs(9) 9.fabs(-3) 3. 3) sonucunu elde ediyoruz.19 ldexp Fonksiyonu Bu fonksiyon kısaca anlatmak gerekirse frexp fonksiyonunun tersi ya da zıttı diyebiliriz. Floor kelimesi zemin. yer. taban anlamına geliyor.875.875.23.floor(3.frexp(x) Bu durumda Python bize (m.frexp(7) komutunu kullanarak (0.16 floor Fonksiyonu Di˘ er yuvarlama i¸lemi fonksiyonu floor. Bir örnek ile inceleyelim: >>> math.5) dedi˘ imizde Python bize a¸a˘ ıdaki sonucu verir. m mantis. Kullanımı ise a¸a˘ ıdaki gibidir: g s g >>> math. g s Bizim için taban anlamı daha manalı. Simdi ¸ bu sonuçtan elde etti˘ imiz rakamları kullanarak 7 sayısına ldexp fonksiyonunu kullanarak g ula¸alım: s . Fonksiyonun kullanımı su g g ¸ sekilde: ¸ >>> math. k ise karakteristik.0’ a yuvarladı. Bu fonksiyon ile ondalıklı sayıları en yakın tabana yuvarlama i¸lemi gerçekle¸tiriliyor. Tabi burada amaç matematik dersi anlatmak g de˘ il. Yukarıda math.0 23. s s >>> math. k) gibi bir sonuç gönderiyor. 23. Hemen bir örnekle inceleyelim. g s g 3. 3) 23.0 Böyle Python 3.0 Python bize sonuç olarak 3.18 frexp Fonksiyonu Bu fonksiyon verilen de˘ erin mantisini ve karakteristi˘ ini veriyor.frexp(7) (0.0 de˘ erini verdi. Bir örnek daha verelim: g >>> math.

Yukarı ya da a¸a˘ ı s g yuvarlıyor diyemiyoruz. Hatta ezberlerdik 3-4-5 üçgeni. Fonksiyonun kullanımı.20 modf Fonksiyonu Bu fonksiyon verilen sayının ondalıklı kısmı ile tam kısmını parçalayarak size geri döndürüyor. (Pisagor teoremi diye geçer. ¸ g s 23.5) (0. 6.trunc(-15. y) seklindedir.>>> math.5. I¸ s s g Verilen de˘ erlerin karesini al. orası matematik uzmanlarının i¸i.trunc(15. Hani bir zamanlar lise matematik ve fizik ¸ g ¸ derslerinde üçgenlerin kenar uzunluklarını. ˙ste hypot fonksiyonu i¸imizi kolayla¸tırarak bu ba˘ ıntının sonucunu bize döndürüyor. Öklit ba˘ ıntısı a2 = b2 + c2 seklindedir.4) -15 Bu iki örnekten de anla¸ılaca˘ ı üzere birincisinde a¸a˘ ıya. g s >>> math. Hemen bir örnek ile ¸ açıklayalım: >>> math. 3) 7.875. topla.hypot(x.0 Bu sekilde ldexp fonksiyonunu kullanarak de˘ erimize yeniden ula¸abiliyoruz. s 23. ikincisinde (– operatörden dolayı) s g s g yukarı yuvarladı olarak algılanabilir. Fakat bu fonksiyonun yaptı˘ ı i¸lem sadece ondalıklı kısmı g s kesmek.0) 23. s s Simdi örneklerle bakalım: ¸ >>> math. Bu fonksiyon Python 2.4) 15 >>> math.21 trunc Fonksiyonu Bu fonksiyon verilen de˘ erleri tam sayı olarak kırpıyor. x burada tam sayı ve ondalıklı sayı olabilir.modf(6. vektörlerin birim uzunluklarını bulmak için çokça kulladı˘ ımız bir ba˘ ıntı. Bu da – ve + operatörü kullanılmı¸ örnek i¸lemlerde ortaya çıkıyor. Kullanımı modf(x) seklinde. Kırpıyor herhalde uygun kelime diye g dü¸ünüyorum ya da kesiyor diyebiliriz. 5-12-13 üçgeni gibi. Neyse bu kadar g g anı yeter.ldexp(0.6 sürümü ile eklenmi¸.22 hypot Fonksiyonu Öklit ba˘ ıntısı için olu¸turulmu¸ bir fonksiyondur.) Gerçi i¸in Öklitg s s s Pisagor kısmına de˘ inmeyelim. Hemen yukarıg daki üçgenlerde deneyerek örnekleyelim: . Peki neyi kesiyor? Verilen ondalıklı veya tam sayıların s sadece tam kısımlarını bize döndürüyor. Ondalık kısmı kesiyor(kırpıyor). karekökünü bul gibi sıkıntılardan kurtarıyor.

1 cosh Fonksiyonu Hiperbolik kosinüs fonksiyonunu döndürür.0 23. Kullanımı: >>> math.0 ya da: >>> math.0 23.23.sinh(0) 0.cosh(0) 1.hypot(5.23.2 sinh Fonksiyonu Hiperbolik sinüs fonksiyonunu döndürür.0 23. Kullanımı: >>> math.3 tanh Fonksiyonu Hiperbolik tanjant fonksiyonunu döndürür. Burada x girilen de˘ erdir.23 Hiperbolik Fonksiyonlar 23. Kullanımı: >>> math.tanh(x) seklindedir.23. Bir örnek ile inceleyelim: ¸ g >>> math.23. Kullanımı: .cosh(x) seklindedir. Bir örnek ile inceleyelim: ¸ g >>> math.4 acosh Fonksiyonu Hiperbolik kosinüs fonksiyonunun tersini döndürür.hypot(3. Bir örnek ile inceleyelim: ¸ g >>> math.sinh(x) seklindedir.>>> math. 12) 13. Burada x girilen de˘ erdir.tanh(90) 1. Burada x girilen de˘ erdir. 4) 5.0 23.

6 sürümü ile eklenmi¸. Burada x girilen de˘ erdir.23.6 atanh Fonksiyonu Hiperbolik tanjant fonksiyonunun tersini döndürür.5 asinh Fonksiyonu Hiperbolik sinüs fonksiyonunun tersini döndürür.6 sürümü ile eklenmi¸.asinh(x) seklindedir.23. Bir örnek ile inceleyelim: ¸ g >>> math.0 Bu fonksiyon Python 2.6 sürümü ile eklenmi¸. s 23. Kullanımı: >>> math.acosh(1) 0.atanh(0) 0.>>> math. s .asinh(0) 0.0 Bu fonksiyon Python 2. s 23. Bir örnek ile inceleyelim: ¸ g >>> math.0 Bu fonksiyon da Python 2.acosh(x) seklindedir. Bir örnek ile inceleyelim: ¸ g >>> math. Burada x girilen de˘ erdir. Burada x girilen de˘ erdir. Kullanımı: >>> math.atanh(x) seklindedir.

’__name__’. g 24. ’__doc__’.1 Bugünün Tarihini Bulmak datetime adlı modülü kullanarak bugünün tarihini bulabiliriz. Bunun için söyle bir kod yazıy¸ oruz: >>> bugun = datetime. ’date’. ’timedelta’. bu modülü kullanmak için herhangi bir harici pros g gram kurmamıza gerek yok. Yukarıdaki kodu kullanarak. ay ve gün bilgilerini tek tek ayıklayabilirsiniz: 385 . i¸levlerine göre g s inceleyece˘ iz. ’datetime_CAPI’. ’datetime’. s g g yani Python geli¸tiricilerince yazıldı˘ ından.BÖLÜM 24 datetime Modülü Python’da datetime adlı bir modül bulunur. ’__package__’. Bu modül Python’un standart kütüphanesine dahil oldu˘ undan. yıl.today() Burada. ’tzinfo’] Biz bu derste. ’time’. yukarıda görünen nitelik ve fonksiyonları isimlerine göre de˘ il. Yani yukarıdaki karakter dizisi 8 Temmuz ¸ 2010 tarihini gösteriyor. Yazdı˘ ımız bir programda datetime modülüne ihtiyaç duyarsak. g modülü normal bir sekilde içe aktarmamız yeterli olacaktır: ¸ >>> import datetime Dilerseniz ilk i¸ olarak bu modülün içeri˘ inde neler olup olmadı˘ ına bir bakalım: s g g >>> dir(datetime) [’MAXYEAR’. g Bu fonksiyon bize bugünün tarihini verir: >>> print bugun 2010-07-08 Bu çıktıda görünen tarih “yıl-ay-gün” seklindedir.date. Bu modül bize tarih ve zamanla ilgili i¸lemleri s gerçekle¸tirme imkanı sa˘ lar. datetime modülünün date adlı sınıfı içinde yer alan today() adlı bir fonksiyonu ça˘ ırdık. ’MINYEAR’.

Bu bölümde ise bir tarihin haftanın hangi gününe denk geldi˘ ini bulmaya çalı¸ag s ca˘ ız. bugun. g ˘ 24.weekday() 3 Muhtemelen çıktının bu sekilde olmasını beklemiyordunuz. ayın %s. bugun.day ise günü gösteriyor.year 2010 yılındayız! >>> print "%s yılının %s. ayındayız! >>> print "%s.>>> print "%s yılındayız!" %bugun. günündeyiz!" %(bugun.today() Böylece bugünün tarihin aldık.date. günündeyiz! Gördü˘ ünüz gibi bugun. ayındayız!" %(bugun. s "Cuma".month. E˘ er g s s g Python’ın günleri sayıyla göstermesi ho¸unuza gitmediyse. Python haftanın günlerini gös¸ terirken sayılardan yararlanır.year.month) 2010 yılının 7. ayın 8.day) 7.coding: utf-8 import datetime hafta = {0: 1: 2: 3: 4: 5: 6: "Pazartesi".2 Bir Tarihin Hangi Güne Geldigini Bulmak Bir önceki bölümde datetime modülünü kullanarak bugünün tarihiyle ilgili bazı bilgiler edinebildik. Simdi bu tarihin hangi güne denk geldi˘ ini bulaca˘ ız: ¸ g g >>> print bugun. s "Per¸embe".year yılı.month ayı. sözlüklerden yararlanarak söyle s ¸ bir sey yazabilirsiniz: ¸ #!/usr/bin/env python #-*. Simdi su kodlara dikkatlice bakalım: g ¸ ¸ >>> bugun = datetime. bugun. "Çar¸amba". Buna göre söyle bir tablo çizebiliriz: ¸ Sayı 0 1 2 3 4 5 6 Gün Pazartesi Salı Çar¸amba s Per¸embe s Cuma Cumartesi Pazar Buna göre yukarıdaki çıktıda gördü˘ ümüz 3 sayısı Per¸embe gününe i¸aret ediyor. "Salı". "Pazar"} . "Cumartesi". bugun.

day #gün 30 >>> print tarih.year #yıl .. 30) print ("%s tarihi %s gününe denk gelir" %(tarih.weekday() 6 Demek ki 30 Mayıs 2010 tarihi Pazar gününe denk geliyormu¸. s "Per¸embe".month #ay 5 >>> print tarih. datetime.weekday()])) Daha önce ö˘ rendi˘ imiz month. "Salı". Böylece su çıktıyı ¸ ¸ elde edebiliyoruz: >>> print tarih 2010-05-30 Mesela bu tarihin hangi güne denk geldi˘ ini bulmak istersek weekday() adlı fonksiyondan g yararlanabilece˘ imizi biliyorsunuz: g >>> print tarih. 30) Burada. Bunun için öncelikle üzerinde i¸lem yapaca˘ ımız tarihi belirts s g memiz gerekiyor.coding: utf-8 import datetime hafta = {0: 1: 2: 3: 4: 5: 6: "Pazartesi".. 30 Mayıs 2010 tarihini belirttik.date(2010. Bunu nasıl yaptı˘ ımıza çok dikkat edin. Tabii isterseniz yukarıda s yazdı˘ ımız sözlükten yararlanarak daha net bir çıktı alabilirsiniz: g #!/usr/bin/env python #-*. day ve year nitelikleri burada da geçerlidir: g g >>> print tarih. Ancak tabii istersek farklı tarihler g s üzerinde de i¸lem yapabiliriz.date. ilgili tarihi yıl-ay-gün seklinde parantez içinde yazıyoruz. 5. s "Cuma". hafta[tarih.date g adlı sınıfı kullanarak.bugun = datetime.weekday()]) Yukarıda yaptı˘ ımız i¸lemler hep bugünün tarihi ile ilgiliydi.date(2010. 5. Bunu su sekilde yapıyoruz: ¸ ¸ >>> tarih = datetime.today() print "Bugün %s" %(hafta[bugun. "Çar¸amba". "Cumartesi". "Pazar"} tarih = datetime.

line 1..strftime("%c") 08. ˙ g g Isterseniz bu durumu hemen teyit edelim: >>> type(bugun) <type ’datetime.date.2010 24.3 Tarihleri Biçimlendirmek Yukarıda ö˘ rendi˘ imiz bilgilere göre bugünün tarihini elde edebilmek için söyle bir kod yazg g ¸ abiliyoruz: >>> bugun = datetime.07. E˘ er biz tarih çıktılarını karakter g ¸ g dizisi olarak almak istersek strftime() adlı özel bir fonksiyondan yararlanabiliriz. yukarıdaki çıktı bir karakter dizisi de˘ ildir. in <module> TypeError: ’datetime. Bu aracı kullanarak tarih bilgilerini istedi˘ imiz sekilde biçimlendirebiliriz. Yani mesela söyle bir sey yazamayız: g ¸ ¸ >>> print bugun[:4] Traceback (most recent call last): File "<stdin>". Bunu söyle ¸ kullanıyoruz: >>> bugun = datetime. bu çıktıyı istedi˘ imiz gibi biçimlendirmek g g mümkün de˘ ildir.2010 00:00:00 strftime() fonksiyonu son derece yararlı bir araçtır.date. Biz yukarıdaki örnekte “%c” adlı karakteri kullandık..today() Bu kod bize bugünün tarihinin ne oldu˘ unu gösterir: g >>> print bugun 2010-07-08 Ancak bu çıktı bir karakter dizisi olmadı˘ ı için.date’ object is unsubscriptable Dedi˘ imiz gibi.today() >>> print bugun. Dilerseniz bu karakterlerin en önemlilerini listeleyelim: . Bu i¸i yaparken bir takım i¸aretlerden/karakterlerden yararg ¸ s s lanmamız gerekiyor.date’> Gördü˘ ünüz gibi elimizdeki sey bir “datetime.date” nesnesi.

Karakter %a %A %b %B %c %d %j %m %U %y %Y Anlamı hafta gününün kısaltılmı¸ adı s hafta gününün tam adı ayın kısaltılmı¸ adı s ayın tam adı tam tarih tamsayı cinsinden gün belli bir tarihin. Dolayısıyla bu g s g karakter dizisini istedi˘ iniz gibi biçimlendirebilirsiniz: g >>> tarih = datetime. 3) >>> krk = tarih.2005 00:00:00 >>> print type(krk) <type ’str’> >>> print krk[:2] 03 strftime() fonksiyonunun önemli bir özelli˘ i vardır.date(2005.strftime("%A") Bugün günlerden Per¸embe s >>> print bugun. Yani e˘ er sisteminizin dil yereli ˙ s g Ingilizce ise ay isimleri de tabii ki ˙ Ingilizce olacaktır. Bu fonksiyon sisteminizde tanımlı olan dil g yereline (locale) göre i¸lem yapar.04.strftime("%a") Per Dilerseniz bütün karakter dizisini do˘ rudan strftime() fonksiyonu içine de yazabilirsiniz: g >>> print bugun. strftime() fonksiyonunun genellikle söyle kullanıldı˘ ına tanık olursunuz: ¸ g . 4. strftime() fonksiyonunun dönü¸ de˘ eri bir karakter dizisidir.strftime("Aylardan %B") Aylardan Temmuz Dedi˘ imiz gibi. yılın kaçıncı gününe denk geldi˘ ini gösteren 1-366 g arası bir sayı tamsayı cinsinden ay belli bir tarihin yılın kaçıncı haftasına geldi˘ ini gösteren 0-53 arası bir g sayı yılın son iki rakamı tamsayı cinsinden yıl ˙ Isterseniz bu tabloya bakarak birkaç örnek de verelim: >>> print "Bugün günlerden %s" %bugun.strftime("%c") >>> print krk 03.

fark de˘ i¸keninin gs de˘ erini (yani 1’i) çıkarıyoruz. Siz bu tarihin 1 gün öncesini bulmak istiyorsunuz: >>> fark = datetime. En basitinden. bugünün tarihini bilmenin yanısıra bir önceki günün g tarihini de bilmeniz gerekir.com’daki s sayfaların en sonuna eklenen “Son güncelleme” tarihini olu¸turmak için ben de bu fonksiyon s kullanılıyor.. E˘ er bir önceki günün haftanın hangi gününe denk geldi˘ ini bulmak istiyorsak g g söyle bir sey yazabilece˘ imizi biliyorsunuz: ¸ ¸ g >>> print dun. Gelin isterseniz bu tür i¸lemleri nasıl yapabilece˘ imizi gösteren basit bir s g örnek verelim: >>> import datetime >>> bugun = datetime. Mesela TCMB’den döviz kuru bilgilerini alan bir program yazıyorsunuz diyelim.today() >>> print bugun.strftime(’%d/%m/%Y’) . Hatta örne˘ in e˘ er dolar kurundaki haftalık de˘ i¸imi grafiklerle g g gs gösteren bir uygulama yazacaksanız mevcut günün 7 gün öncesine kadar giden tarihleri de alabilmeniz gerekir. Böylece bugünün 1 gün öncesi olan 8 Temmuz 2010 tarihini g elde ediyoruz. Mesela istihza. mevcut tarihin öncesini g g s ve sonrasını da bilmeniz gerekebilir. Bunun için kullanılan karakter dizisi söyle: ¸ bugun. Diyelim ki bugünün tarihi 09.07. Bizim amacımız 1 günlük fark üzerinden i¸lem yapmak oldu˘ u için timedelta() s g fonksiyonuna argüman olarak 1 sayısını verdik. mesela doların bir gün öncesine göre yükselip yükselmedi˘ ini kullanıcıya gösterebilmek için.strftime("Son güncelleme: %d/%m/%y") 24.2010 Cuma olsun.date.weekday() 3 Demek ki 8 Temmuz 2010 tarihi Per¸embeye denk geliyormu¸. s s Dilerseniz strftime() fonksiyonunu kullanarak do˘ rudan gün adını da alabilirsiniz: g >>> print dun.timedelta(1) >>> dun = bugun .strftime("%A") Per¸embe s Bu strftime() fonksiyonunun oldukça geni¸ bir kullanım alanı vardır.date.fark >>> print dun 2010-07-08 Burada datetime modülü içinde bulunan timedelta() adlı özel bir fonksiyondan yararlandık. Bu fonksiyona verdi˘ imiz sayı de˘ erli argüman. kaç günlük bir fark üzerinden i¸lem yapaca˘ ımızı g g s g gösteriyor..>>> bugun = datetime.today() Böylece bugünün tarihini bulduk.4 Tarihlerle Aritmetik ˙slem Yapmak I¸ E˘ er yazdı˘ ınız bir programda tarihlere dayalı bir i¸lem yapıyorsanız. Daha sonra 1 gün öncesinin tarihi bulabilmek için bugünün tarihinden.

yazdı˘ ımız bir programın i¸leyi¸ini belli bir süre durdurmamızı sa˘ lar. Prog gramın kaç saniye duraca˘ ını.1 sleep() Fonksiyonu Dedi˘ imiz gibi..geometry("200x200") etk = Label(font = "Helvetica 60 bold". print i Gördü˘ ünüz gibi. ˙ g s s g Isterseniz buna basit bir örnek verelim: >>> import time >>> for i in range(10): . s 25. sleep() fonksiyonuna verdi˘ imiz bir parametre ile belirliyoruz. g g Biz yukarıdaki örnekte bu parametreyi “1” olarak belirledik.BÖLÜM 25 time Modülü time modülü. Bu modül i¸lev olarak s g s az çok datetime() modülüyle benzerlik gösterir... Dilerseniz bu fonksiyonlar içinde en çok kullanılanı inceleyerek ba¸layalım konumuza. Yani programımızın 1’er saniye aralıklarla çalı¸masını istedik. Python’daki bu time adlı modül.pack(pady=50) a = -1 391 . bu fonksiyon.... 0’dan 10’a kadar olan sayılar 1’er saniye aralıklarla ekrana dökülüyor. time() modülü içinde en sık kullanılan fonksiyondur. Python’da saat/zaman ile ilgili i¸lemler yapmamızı sa˘ lar.. time. fg = "steelblue") etk.sleep(1) . sleep() g fonksiyonu. s Gelin isterseniz yukarıdaki bilgiyi kullanarak grafik arayüze sahip bir sayaç yazalım: from Tkinter import * import time pencere = Tk() pencere. tıpkı öteki modüller gibi içinde birtakım fonksiyonlar barındırır..

E˘er bunu yapmazsak g #program yine de kapanacak..while True: a += 1 time. . Böylece sayacın durmasını sa˘lıyoruz ve programın g aniden kapanıp hata vermesine engel oluyoruz""" pencere. Pros gram penceresini fare ile sürüklerken bu takılmaları daha iyi görebiliyoruz. pencere. g Burada programı tamamen kapatmadan önce pencereyi "withdraw" durumuna alıyoruz.sleep(1) pencere. Üstelik programı çarpı dü˘ mesinden kapatmaya çalı¸tı˘ ımızda da programda belli bir kasılma göze çarpıyor.btn = Button(text = "KAPAT". Bunu engellemek için programınızı çok katmanlı (multi-threaded) bir hale getirebilirsiniz: # -*.etk = Label(font = "Helvetica 60 bold". ama kapanırken #hata verecektir. font = "Helvetica 15 bold".penar_olustur() def penar_olustur(self): """Pencere araçlarımızı burada olu¸turuyoruz.state("withdraw") #sayacın düzgün bir ¸ekilde durabilmesi için s #programımıza 1 saniyelik bir süre tanıyoruz.update() etk["text"] = a pencere. g s g Ayrıca program kapanırken hata da veriyor.btn. s Programımız bir etiket ve dü˘meden ibaret. self.mainloop() Yalnız dikkat ettiyseniz bu sayaç programı çalı¸ma sırasında bloke oluyor.kapat self.pack() #Kullanıcı çarpı dü˘mesine bastı˘ında kapat g g #fonksiyonu devreye girsin.pack(pady=50) self. yani takılıyor..etk. fg = "steelblue") self.protocol("WM_DELETE_WINDOW".coding: utf-8 -*from Tkinter import * import time import threading class GUI(object): def __init__(self): self.btn["command"] = self.. fg = "navy") self.""" g self.kapat) def kapat(self): """Programın kapanmasını sa˘layan fonksiyon.. relief = "raised".

strftime("%m") ’08’ Günü görmek için: >>> time. saniye gibi bilgileri gösterebiliriz. while pencere.destroy() pencere = Tk() pencere. E˘ er yılın son iki hanesini görmek istersek söyle yazg g ¸ abiliriz: >>> time.sleep(1) app.strftime("%d") ’16’ Ay. pencere. Örne˘ in: g >>> import time >>> time.state() != "withdrawn": sayi += 1 time. yıl. gün ve yılı birlikte görmek için: . saat. Bu örnekteki g “%Y” ifadesi yılı göstermemizi sa˘ lıyor.strftime("%Y") ’2010’ Gördü˘ ünüz gibi. dakika. ay. strftime() fonksiyonunu bir parametre ile birlikte kullanıyoruz.2 strftime() Fonksiyonu strftime() fonksiyonu yardımıyla gün.time. Artık programımızı sona erdirebiliriz. hafta.Thread): def run(self): sayi = -1 #pencere durumu "withdrawn" olmadı˘ı sürece g #sayacımız saymaya devam edecek.mainloop() 25.etk["text"] = sayi syc = Sayac() syc.geometry("350x300") app = GUI() class Sayac(threading.strftime("%y") ’10’ Ayı görmek için: >>> time.sleep(1) #Pencere "withdraw" durumuna alındı ve sayacımız #durdu.start() pencere.

Windows kullanıcıları yukarıdaki kodları su sekilde yazabilir: ¸ ¸ >>> import locale >>> locale.LC_ALL.08.>>> time.setlocale(locale.2010’ E˘ er strftime() modülünü kullanarak saat. s ˙ Ikincisi: >>> import locale >>> locale. dakika ve saniye bilgilerini elde etmek isterseniz g söyle bir sey yazabilirsiniz: ¸ ¸ >>> time.strftime("%d.setlocale(locale. "tr_TR. tıpkı tarih gösteriminde oldu˘ u gibi.setlocale(locale. Yukarıdaki kullanım GNU/Linux içindir.08.LC_ALL.1254") >>> time.strftime("%H") ’14’ Dakikayı almak için: >>> time. s Burada da. dakika ve saniye bilgilerini tek tek alabilirsiniz. Birincisi: >>> time.LC_ALL. Türkiye’ye uygun bir tarih gösterimi elde etmek için iki yol takip edebilirsiniz.strftime("%x") ’16. "Turkish_Turkey.%Y") ’16. Amerikan sisteminde 12 saat üzerinden i¸lem yapılırken. e˘ er isterseniz saat.UTF-8") >>> time.strftime("%M") ’13’ . Amerikan sistemine uygun bir saat gösterimidir.UTF-8") >>> time.strftime("%X") ’14:08:02’ Gördü˘ ünüz gibi. g Bunu Türkiye sistemine uygun bir hale getirmek için yine locale modülünden yararlanaca˘ ız: g >>> locale.strftime("%x") ’08/16/2010’ Tabii buradaki gösterim ay/gün/yıl seklinde. g Saati almak için: >>> time. Türkiye’deki tarih gösterimi ise gün-ay-yıl sek¸ ¸ lindedir.strftime("%X") ’2:08:02 PM’ Bu da.strftime("%x") ’16-08-2010’ Burada ise locale modülünden yararlanarak Türkçe yerelleri etkin hale getirdik.2010’ Burada gün. "tr_TR.%m. ay ve yıl bile¸enlerini uygun sırada ve tek tek belirttik. Türkiye sisteminde g s 24 saat üzerinden i¸lem yapılıyor.

tm_min=49. tm_mday=16.struct_time(tm_year=2010. tm_yday=228. s s harfleri söylece özetleyebiliriz: ¸ ˙fade I %a %A %b %B %c %d %H %I %j %m %M %S %U %x %X %y %Y Anlamı Kısaltılmı¸ gün adı s Tam gün adı Kısaltılmı¸ ay adı s Tam ay adı Tam tarih ve saat Ondalık sayı cinsinden gün (aya göre) Ondalık sayı cinsiden saat (24 saat hesabına göre) Ondalık sayı cinsinden saat (12 saat hesabına göre) Ondalık sayı cinsinden gün (yıla göre) Ondalık sayı cinsinden ay Ondalık sayı cinsinden dakika Ondalık sayı cinsinden saniye Yıla göre hafta numarası. tm_wday=0. tm_mon=8. tm_isdst=1) Bu demette toplam 9 adet de˘ er bulunur ve bu de˘ erlerin anlamı sudur: g g ¸ .localtime() time. tm_hour=16.3 localtime() Fonksiyonu localtime() fonksiyonunu kullanarak tarih ve saate ili¸kin bütün bilgilerin yer aldı˘ ı bir demet s g elde edebilirsiniz: >>> time.Saniyeyi almak için: >>> time.strftime("%S") ’53’ Elbette bunları birle¸tirebilirsiniz de: s >>> time. tm_sec=42.strftime("%H:%M:%S") ’14:13:53’ Bunların dı¸ında. strftime() fonksiyonu ile birlikte kullanılan ba¸ka harfler de bulunur. Pazar haftanın ilk günü olarak alınır Tam tarih Tam saat Yılın son iki hanesi Tam yıl gösterimi Bu 25.

tm_year 2010 >>> zaman. Epoch zamanın ba¸langıcıdır..tm_yday 228 #yılın 228.. >>> zaman..tm_isdst 1 #gün ı¸ı˘ından yararlanma uygulaması etkin s g 25..localtime() >>> zaman.tm_mon 8 #A˘ustos ayı.tm_mday 16 #Ayın 16’sı. >>> zaman.4 gmtime().tm_year 1970 . dakika >>> zaman.Sıra 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ı yıl ay gün saat dakika saniye haftanın günü (Pazartesi 0) yıla göre gün gün ı¸ı˘ ından yararlanma uygulamasının olup olmadı˘ ını denetler sg g Bu de˘ erlere su sekilde ula¸abiliriz: g ¸ ¸ s >>> zaman = time. >>> zaman.tm_wday 0 #Pazartesi.... g >>> zaman.gmtime(0). günü. Zamanın ba¸langıcının ne oldu˘ unu bulmak için gmtime() fonksiyonunu s s g kullanabiliriz: >>> print time.tm_hour 16 #Saat ak¸am 4 s >>> zaman.tm_min 49 #49.. time() ve ctime() Fonksiyonları Python’da zaman hesaplaması yapılırken “epoch” adlı bir kavramdan yararlanılır.

Mesela su andan 60 saniye sonrasını hesaplamak için söyle bir sey yazabiliriz: ¸ ¸ ¸ >>> sonraki_tarih = time.time() + (60 * 60) >>> print time..ctime() ’Tue Aug 17 09:13:47 2010’ time() ve ctime() fonksiyonlarını birlikte kullanarak sonraki bir zamanı hesaplayabiliriz.time() 1282025564. time() adlı ba¸ka bir fonksiyonu kullas s s narak zamanın ba¸langıcından bu yana kaç saniye geçti˘ ini bulabiliriz: s g >>> time..984 ctime() fonksiyonu ise bize tam tarih ve saat bilgisini gösterir: >>> time.time() + 60 >>> print time. yani zamanın ba¸langıcı 1970 imi¸.ctime(sonraki_tarih) Tue Aug 17 09:17:44 2010 E˘ er tam bir saat sonrasını hesaplamak isterseniz su kodu kullanabilirsiniz: g ¸ >>> bir_saat_sonra = time.Demek ki “epoch”.ctime(bir_saat_sonra) Tue Aug 17 10:18:59 2010 ÖZEL KONULAR .

E˘ er beti˘ imiz içinde kendimiz bir kodlama düzeni belirtmezsek.python.html for details Burada Python bize ASCII olmayan bir karakter kullandı˘ ımızı. Bu hatayı almamak için beti˘ imizi su hale getirmemiz gerekir: g g ¸ #!/usr/bin/env python #-*-coding:utf8-*print "Türkçeye özgü karakterler: ¸çö˘üı" s g Burada ekledi˘ imiz “#--coding:utf8--” satırı yardımıyla beti˘ imizin kodlama düzenini “utf8” g g olarak belirledik. line 3 SyntaxError: Non-ASCII character ’\xc3’ in file deneme.org/peps/pep-0263. “#--coding:utf8--” satırını eklemezsek suna benzer bir hata alırız: g ¸ File "deneme.py". see http://www. içinde Türkçe karakterler geçen bir program yazdı˘ ımızda beti˘ imizin en ba¸ına g g g s su satırı eklememiz gerekir: ¸ #-*-coding:utf8-*- Not: Windows kullananlar “utf8” yerine “cp1254” kodlamasını kullanabilir.. üstelik uygun bir kodlama düzeni g de belirtmedi˘ imizi söylüyor.BÖLÜM 26 len() Fonksiyonu ve ascii’nin Laneti Bildi˘ iniz gibi. but no encoding declared..getdefaultencoding() ’ascii’ 398 . Diyelim ki söyle bir sey var elimizde: ¸ ¸ #!/usr/bin/env python print "Türkçeye özgü karakterler: sçö˘üı" ¸ g Burada oldu˘ u gibi. Python g g otomatik olarak “ascii” kodlamasını kullanacaktır. Su komutun çıktısına baktı˘ ımızda gerçekten ¸ g de Python’un varsayılan kod çözücüsünün “ascii” oldu˘ unu görüyoruz: g >>> import sys >>> sys.py on line 3.

Yani söz konusu karakter.. yazılan bir metnin akı¸ını kontrol etme görevi gördükleri için. tabloda bulunmayan bu karakterleri çözümleyemiyor. “kontrol karakterleri” s adı veriliyor... g ¸ ˙ Ingiliz alfabesindeki her harf bir sayıya kar¸ılık geliyor. Ayrıca isterseniz su komutu kullanarak kendiniz de ¸ benzer bir ascii tablosu üretebilirsiniz: >>> for i in range(128): . Bu karakterlere.com/ g adresindeki tablodan faydalanabilirsiniz. “ascii” kodlamasında. Türkçe harflerin (¸çö˘ ı) bu tabloda bulunmadı˘ ını görüyg s g g oruz. “ascii” kelimesini “askii” seklinde telaffuz ediyoruz. print chr(i) Bu tabloda hangi sayının hangi karaktere kar¸ılık geldi˘ ini açık açık görebilmek için ise söyle s g ¸ bir sey yazabilirsiniz: ¸ >>> for i in range(128): . konumu belirtilen g karakteri çözümleyemiyormu¸.. Hemen Python komut ¸ g satırında sunu yazıyoruz: ¸ . “ascii”nin aksine Türkçe karakterleri de çözümleyebiliyor. “%c” ise bu sayıların “char” yani g g “karakter” kar¸ılıklarını gösteriyor. print "%s => %c"%(i.asciitable.. “ascii” denen karakter kodlama düzeni ˙ Ingiliz alfabesi temel alınarak 1960’lı yıllarda hazırlanmı¸. Yani bu g tabloda sadece 128 adet karakter tanımlanmı¸tır. Python’un I¸ g g varsayılan kodlama düzeni olan “ascii”. Simdi yukarıda anlattı˘ ımız meseleye biraz daha yakından bakalım.. Standart “ascii” kodlamasında toplam s s 128 karakter bulunur.. 128 aralı˘ ındaki sayıların “bildi˘ imiz” halini. yukarıda bahsetti˘ imiz 128 karaks g terlik tablonun dı¸ında kalıyormu¸.. Peki burada neden 128’e kadar olan sayıları kullandık? s Çünkü yukarıda da söyledi˘ imiz gibi ascii tablosunda toplam 128 karakter bulunur. Su kod yardımıyla bunu do˘ rulayabiliriz: ¸ g >>> print chr(65) A Örne˘ in “100” sayısının hangi karaktere kar¸ılık geldi˘ ine bakalım: g s g >>> print chr(100) d Demek ki “100” sayısı “d” harfine kar¸ılık geliyormu¸.. s s ascii tablosuna baktı˘ ımız zaman..i) Burada “%s”. Bu durumun bir yansımasını. ascii kodlag masında hangi sayının hangi karaktere denk geldi˘ ini bulmak için http://www. daha önce bir s yerlerde muhtemelen kar¸ınıza çıkmı¸ olan su hata mesajından da hatırlıyor olabilirsiniz: s s ¸ UnicodeDecodeError: ’ascii’ codec can’t decode byte 0xc5 in position 0: ordinal not in range(128) Buradan anladı˘ ımıza göre. ˙ste biz beti˘ imizde “utf8” gibi bir kodlama düzeni belirtmedi˘ imiz zaman. Geri kalan 95 karakter ise ekranda bilfiil gördü˘ ümüz karakterlerdir. Amacı da o dönemde kullanımda s olan yazı makinelerinin standartla¸masını ve böylece bu makinelerin birbirleriyle uyumlu çalı¸s s masını sa˘ lamak... “utf8” kodlaması.. Bunların ilk 33 tanesi ekranda görünmeyen karakterlerdir. Beti˘ imizde “utf8” kodlaması kullanarak Python’un “ascii” yerine “utf8”i kullanmasını sa˘ lıyg g oruz. Python’un varsayılan kod çözücüsü olan “ascii”. Mesela “65” sayısının kar¸ılı˘ ı “A” s s g harfidir.Peki bu “ascii” denen sey de ne oluyor? ¸ “ascii” kelimesi ˙ Ingilizce “American Standard Code for Information Interchange” (Bilgi Alı¸veri¸i s s için Amerikan Standart Kodu) ifadesinin kısaltması..

Türkçe’ye özgü öteki karakterlerde de görüyoruz: .. Aslında ara vermekten ziyade aynı konuya ba¸ka bir ¸ s pencereden bakmaya devam edece˘ iz. Ama gördü˘ ünüz gibi aslında “çilek” karakter g dizisi 6 de˘ il. s Simdi bu konuya ufak bir ara verelim. “¸” harfinin bu tabloda bulunmuyor olması. Burada “a” ve “s” harflerinin ortak özelli˘ i.. bunların g g “ascii” kod tablosunda yer alıyor olması.. bu harfi “a” harfinden farklı bir sekilde yorumladı. En basit sekliyle bu fonksiyonu su sekilde kullanabiliriz: ¸ ¸ ¸ >>> a = "python" >>> len(a) 6 Demek ki “python” karakter dizisi içinde 6 karakter varmı¸. Simdi bir de suna bakalım: g g ¸ ¸ ¸ >>> "¸" s Burada Türkçe’ye özgü bir harf olan “¸”yi kullandık.. Aynı durumu. “a”.. Bunun nedeni “a” harfinin “ascii” ¸ tablosunda bulunuyorken. “ç” harfinin suçu ise Türkçe’ye özgü g ¸ karakterlerden biri olması.. g Hepimizin bildi˘ i gibi.. Bakalım Python ne yapacak? s ’\xc5\x9f’ Python. Python’da bir nesnenin boyutunu ö˘ renmek için len() fonksiyonundan g g yararlanıyoruz. ama “ç” harfi g g öyle de˘ il. Bir de suna bakalım: s ¸ >>> b = "çilek" >>> len(b) 6 Burada len() fonksiyonu “6” sonucunu verdi.>>> "a" Buradan elde edece˘ imiz çıktı tabii ki söyle olacaktır: g ¸ ’a’ Gördü˘ ünüz gibi Python “a” harfini do˘ ru bir sekilde algıladı.. Ya da kabaca söyle diyebiliriz: “a” ve “s” harflerinin ¸ ortak özelli˘ i her ikisinin de ˙ g Ingiliz alfabesinde bulunuyor olması.. “s” gibi harfler normal olarak 1 karakter uzunlu˘ unda. 5 karakterden olu¸uyor!.. Dolayısıyla Python “çilek” karakter dizisi içinde geçen “ç” harfini tek ba¸ına 2 g s saydı˘ ı için toplam 6 karakter buluyor. Dolayısıyla bunlar “ascii” ile kodlandı˘ ında tek karakter seklinde temsil edilebiliyor.... Simdi bu tuhaflı˘ ın nereden kaynaklandı˘ ını bulmaya g s ¸ g g çalı¸alım: s >>> len("s") 1 >>> len("a") 1 >>> len("ç") 2 Gördü˘ ünüz gibi.

"¸". ’\xc4\xb1’) Aslında sorunun temelinde su yatıyor: len() fonksiyonu..>>> len("ı") 2 >>> len("¸") s 2 >>> len("ö") 2 >>> len("˘") g 2 Yukarıda Python’un “¸” harfini nasıl gösterdi˘ ini hatırlıyoruz: s g >>> "¸" s ’\xc5\x9f’ Aynı sekilde öteki Türkçe harfler de ˙ ¸ Ingilizce harflerden farklı görünecektir: >>> "ç". bir karakter dizisindeki bayt sayısını saymaktır. Çünkü bilgisayarlar g sadece sayılardan anlar. Karakterler veya harfler özünde bilgisayara hiç bir sey ifade etmez. Türkçe harfler ascii kodlamasına göre 1 baytla gösterilemedi˘ i için de yukarıdaki gibi bir g durum ortaya çıkar. ’\xc5\x9f’. “x82” ve “xac”). (“xe2”. s s s Bütün bu anlattıklarımızdan yola çıkarak. yalnızca bayt sayısıdır. Mesela “¸” harfinin çıktısına bakalım tekrar: s >>> "¸" s ’\xc5\x9f’ Buradaki çıktıda “xcf” + “x9f” seklinde gösterilen toplam 2 bayt var. e˘ er kuls g lanıcıdan birtakım veriler alıyorsak ve program içinde bu verilerin uzunlu˘ unu ölçüyorsak. Mesela “avro” i¸areti g s de ascii’nin lanetinden payını alıyor: >>> "€" ’\xe2\x82\xac’ >>> len("€") 3 Demek ki. Bayt sayısı 1’den fazla oldu˘ unda ise çuvallıyor!. karakter ¸ g s g sayısını saymaz. g . Esasında yukarıdaki çıktıları inceledi˘ imiz zaman bu durumu net olarak g görüyoruz."˘". ’\xc3\xb6’.. Onun ilgilendi˘ i. ’\xc4\x9f’. g s Yani aslında len() fonksiyonu bir karakter dizisinin bir veya birden fazla karakter (veya harf) içerip içermemesiyle ilgilenmez. özellikle Türkçe yazılmı¸ bir programda. Bu fonksiyonun yaptı˘ ı i¸. g Bu problem tabii ki yalnızca Türkçe’ye özgü karakterler için geçerli de˘ il. ¸ Python’un varsayılan kod çözücüsü olan ascii yalnızca 1 baytlık verileri do˘ ru olarak göstereg bilir."ö". ˙ste len() fonksiyonu da ¸ I¸ karakter içindeki bu bayt sayısına bakıyor.. “€” i¸areti tek ba¸ına üç bayt içeriyormu¸. ço˘ u ki¸inin zannetti˘ i gibi."ı" g s (’\xc3\xa7’.

s g Yanlı¸! Ama biz simdi Python’a do˘ ru yolu gösterece˘ iz: s ¸ g g >>> a = "ı¸ık" s >>> a = unicode(a. “ascii’nin lanetinden” kurtulmanın tek yolu. Amacımız kullanıcının yanlı¸lıkla veya s bilerek birden fazla karakter girmesini engellemek.cam. Yani karakter dizimizi ascii’nin elinden kurtardık.”utf8”)” satırı yardımıyla a de˘ i¸kenini “utf8” olarak g gs kodladık. e˘ er kullanıcı sadece g g ˙ Ingilizce’de bulunan harfleri (ya da daha do˘ ru bir ifadeyle ascii tablosunda bulunan karakterg leri) girerse sorun olmayacaktır. “ç”. Bunun yerine..html#unicode) Hemen söyle bir örnek yapalım: ¸ >>> a = "ı¸ık" s >>> len(a) 7 Burada Python “ı”. kullanıcıdan tek bir karakter girmesini istiyoruz. örne˘ in bir adamasmaca ¸ g oyunu yazıyorsanız ihtiyacınız olabilir.yukarıdaki duruma dikkat etmemiz gerekir.append(soru) print liste else: print "lütfen birden fazla karakter girmeyiniz" Burada. Yukarıda yazdı˘ ımız kodlara göre. Böyle bir durumda kullanıcıdan küfür yemeye hazırlıklı olun!. Böyle bir seye. Su ana kadar bahsetti˘ imiz. karakter diziler¸ g imizi Python’un varsayılan kod çözücüsünün ellerine ve insafına bırakmamaktır.cl.. “a = unicode(a. bayt sayısını ölçüyoruz. “¸” ve “ı” harflerinin her birini çift saydı˘ ı için toplam 7 karakter buldu.ac. Çünkü len() fonksiyonunu kullanırken aslında bir karakterin boyunu posunu de˘ il. (unicode ve utf8 ile ilgili güzel bir belge için bkz: http://www. karakter dizilerimizi mutlaka “unicode” olarak kodlamamız gerekir (Bu “unicode” konusu ba¸ka bir yazıda ayrıntılı olarak ele alınacak). programımız if blo˘ u yerine else blo˘ unu i¸letes g g g s cektir... bunlar s g s da görünü¸te tek karakter olmasına ra˘ men."utf8") >>> len(a) 1 . Diyelim g ki elimizde söyle bir betik var: ¸ #!/usr/bin/env python #-*-coding:utf8-*liste = [ ] while True: soru = raw_input("lütfen bir karakter giriniz: ") if len(soru) == 1: liste. Bu duruma bir örnek verelim.uk/~mgk25/unicode. s Türkçe için en uygun unicode kodlaması “utf8” olacaktır."utf8") >>> len(a) 4 Gördü˘ ünüz gibi burada. Ama kullanıcı “¸çö˘ üı” gibi harfler girmeye kalkı¸ırsa. “˘ ” gibi harflerin durumuna bakalım: s g >>> a = "¸" s >>> a = unicode(a. Bir de bize daha önce sorun çıkaran “¸”.

”utf8”)) == 1:” gibi bir satır eklemenin yanısıra. listeyi ekrana yazdırırken bir “for” döngüsü kurarak listedeki Türkçe karakter içeren ö˘ elerin ekrana g düzgün yazdırılmasını da sa˘ ladık."utf8") >>> len(avro) 1 Gördü˘ ünüz gibi. avromuz artık mutlu!! g Bütün bu söylediklerimizden çıkan sonuca göre..."utf8") >>> len(b) 1 Yukarıda ascii’nin yanlı¸ olarak “2 karakter uzunlu˘ unda” gösterdi˘ i bu harflerin “utf8” kodlas g g masıyla do˘ ru olarak gösterildi˘ ini görüyoruz. Daha s s sonra.>>> b = "˘" g >>> b = unicode(b. Yani kodlarımızı söyle g ¸ yazmalıyız: #!/usr/bin/env python #-*-coding:utf8-*liste = [ ] while True: soru = raw_input("lütfen bir karakter giriniz: ") if len(unicode(soru. kullanıcıdan karakg ter girmesini isteyen beti˘ imizin içinde bir de˘ i¸iklik yaparak. mesela “utf8”i kullanmasını sa˘ lamamız gerekiyor. bizim yukarıda verdi˘ imiz."utf8")) == 1: liste. beti˘ imizin Python’un varsayılan g gs g çözücüsü yerine.. Bir de su zavallı “avro” i¸aretine bakalım: g g ¸ s >>> avro = "€" >>> len(avro) 3 >>> avro = unicode(avro. bu makalede bahsedilen ve bu konuyla yakından ili¸kili olan “unicode” konusuna da s de˘ inece˘ iz.. “if len(unicode(soru. g g . g Böylece “ascii” ve kodlama meselesine ayrıntılı sayılabilecek bir bakı¸ sunmu¸ olduk.append(soru) for i in liste: print i else: print "Lütfen sadece tek bir karakter giriniz!" Dikkat ederseniz.

Python’daki her nesnenin kim¸ li˘ i e¸siz.. Simdi örnek bir nesne üzerinde bu id() fonksiyonunu ¸ nasıl kullanaca˘ ımıza bakalım: g Bildi˘ iniz gibi Python’da her sey bir nesnedir. Peki bir nesnenin kimli˘ ine nasıl ula¸ırız? Python’da bu i¸i yapg s¸ g s s mamızı sa˘ layacak basit bir fonksiyon bulunur. Kabaca söylemek gerekirse. bu “kimlik” g denen sey esasında o nesnenin bellekteki adresini temsil eder. Python iki adet “100” sayısı için bellekte iki farklı nesne yaratmıyor. Herhangi bir “¸ey”. is ˙sleci ve Önbellekleme I¸ Mekanizması Python’da her nesnenin bir “kimli˘ i” (identity) vardır. tek ve benzersizdir. Python a de˘ i¸kenini ve 100 sayısını ayrı ayrı sorgulamamıza ra˘ men aynı g gs g kimlik numaralarını gösterdi.BÖLÜM 27 Python’da id() Fonksiyonu. Ama bir de su örneklere bakalım: ¸ >>> a = 1000 >>> id(a) 138406552 >>> id(1000) 404 . Bu demek oluyor ki. ˙ kullanımda önbelle˘ ine aldı˘ ı sayıyı.. olu¸turdu˘ umuz anda Python açısından bir nesneye dönü¸üvereg s s g s cektir zaten: >>> a = 100 >>> id(a) 137990748 Çıktıda gördü˘ ümüz “137990748” sayısı a de˘ i¸keninin tuttu˘ u “100” sayısının kimli˘ ini gösg gs g g teriyor. Dolayısıyla örnek nesne bulmakta zorlanmayag ¸ ca˘ ız. Simdi id() fonksiyonunu bir de su sekilde deneyelim: ¸ ¸ ¸ >>> id(100) 137990748 Gördü˘ ünüz gibi. Bu fonksiyonun adı “id()”. ikinci kez ihtiyaç oldu˘ unda Ilk g g g bellekten alıp kullanıyor. Yani ˙ g Ingilizce’deki “identity” (kimlik) kelimesinin kısaltması.

.. Bu demek oluyor ki. Python “False” (Yanlı¸) çıktısını suratımıza bir tokat gibi çarptı. Yani bu iki 1000 sayısı Python g s açısından birbirinden farklı.. Python a de˘ i¸keninin tuttu˘ u 1000 sayısı için ve do˘ rudan gs g g girdi˘ imiz 1000 sayısı için bellekte iki farklı nesne olu¸turuyor.. . Bir de “==” i¸leci ile bir kar¸ıla¸tırma yapalım: s s s >>> a == "python" True Bu da normal olarak “True” çıktısı veriyor.137992088 Bu defa Python a de˘ i¸keninin tuttu˘ u 1000 sayısı ile öteki 1000 sayısı için farklı kimlik numargs g aları gösterdi. Peki bu g s ne anlama geliyor? Söyle ki: Python’da “is” i¸lecini kullanarak iki nesne arasında kar¸ıla¸tırma ¸ s s s yapmak güvenli de˘ ildir. “==” i¸leci nesnelerin içeri˘ ine bakarak o nesnelerin g s g aynı de˘ ere sahip olup olmadıklarını sorgular. Ama su örne˘ e bakarsak: ¸ g >>> a = "python güçlü ve kolay bir programlama dilidir" >>> a is "python güçlü ve kolay bir programlama dilidir" False Ama.. Deneyelim: s >>> a is 1000 False Gördü˘ ünüz gibi. “==” i¸leci a de˘ i¸keninin tuttu˘ u verinin 1000 olup olmadı˘ ını g s gs g g denetliyor. >>> a == 1000 True Burada “is” i¸leci a de˘ i¸keninin tuttu˘ u veri ile 1000 sayısının aynı kimlik numarasına sahip s gs g olup olmadı˘ ını sorgularken.. Yani “is” ve “==” i¸leçleri birbirleriyle aynı i¸levi görmez. Yani: g >>> a is 1000 False Ama. Bu durumu görebilece˘ imiz ba¸ka bir yöntem de Python’daki “is” g s i¸lecini kullanmaktır. Yani “is” i¸lecinin yaptı˘ ı sey kabaca su oluyor: s g ¸ ¸ >>> id(a) == id(1000) False Simdiye kadar denedi˘ imiz örnekler hep sayıydı. Simdi isterseniz bir de karakter dizilerinin ¸ g ¸ durumuna bakalım: >>> a = "python" >>> a is "python" True Burada “True” çıktısını aldık. Bu iki i¸leç g s s s nesnelerin farklı yönlerini sorgular: “is” i¸leci nesnelerin kimliklerine bakıp o nesnelerin aynı s nesneler olup olmadı˘ ını kontrol ederken.....

bu nesne ortalıkta oldu˘ u sürece aynı g kalacaksa. kimlikleri aynı olan sayıları ekrana g s s döküyor. Ama bu listelerin ait oldu˘ u veritipi (yani “list”). Çünkü bir nesnenin veritipinin kendisi de ba¸lıba¸ına s s bir nesnedir. Yani bir bakıma Python’un hangi sayıya kadar önbellekleme yaptı˘ ını gösteriyor. Python bu iki g g g listeyi bellekte iki farklı adreste depoluyor. if k is v: .. Çünkü bunlardan biri s g nesnelerin kimli˘ ini sorgularken. Ayrıca burada dikkag g timizi çekmesi gereken ba¸ka bir nokta da “python” karakter dizisinin önbelle˘ e alınıp gereks g ti˘ inde tekrar tekrar kullanılıyorken."kebap"] >>> id(liste) 3082284940L Bunu ba¸ka bir liste üzerinde daha deneyelim: s >>> liste2 = ["elma".>>> a == "python güçlü ve kolay bir programlama dilidir" True “is” ve “==” i¸leçlerinin nasıl da farklı sonuçlar verdi˘ ini görüyorsunuz.."armut". nesnelerin kimliklerini denetler. örne˘ in.. g s Örne˘ in bir listenin kimli˘ ini söyle denetleyebiliriz: g g ¸ >>> liste = ["elma". g s Peki neden Python.. id() fonksiyonu ve dolayısıyla “is” i¸leci. g Burada aldı˘ ımız sonuca göre söyle bir denetleme i¸lemi yapalım: g ¸ s >>> a = 256 >>> a is 256 True >>> a = 257 >>> a is 257 False Dedi˘ imiz gibi. Aynı karakter dizisinin tekrar kullanılması gerekg ti˘ inde Python bunun için bellekte yeni bir nesne daha olu¸turuyor. öbürü nesnelerin içeri˘ ini sorguluyor. Nasıl “liste2” nesnesinin kimlik numarası.. . ˙ s Isterseniz Python açısından “ufak” kavramının sınırının ne olabilece˘ ini söyle bir kod yardımıyla sorgulayabiliriz: g ¸ >>> for k in range(1000): .. g bellekte tek bir adreste depolanacaktır. içerik aynı oldu˘ u halde iki listenin kimli˘ i birbirinden farklı...."kebap"] >>> id(liste2) 3082284172L Gördü˘ ünüz gibi... print k Bu kod 1000 aralı˘ ındaki iki sayı grubunu kar¸ıla¸tırıp."armut".. “python güçlü ve kolay bir programlama dilidir” karakter g dizisinin ise önbelle˘ e alınmıyor olmasıdır... for v in range(1000): . 100 sayısını ve “python” karakter dizisini önbelleklerken 1000 g sayısını ve “python güçlü ve kolay bir programlama dilidir” karakter dizisini önbelle˘ e almıyor. g Sebebi su: Python kendi iç mekanizmasının i¸leyi¸i gere˘ ince “ufak” nesneleri önbelle˘ e ¸ s s g g alırken “büyük” nesneler için her defasında yeni bir depolama i¸lemi yapıyor. bütün listelerin ait oldu˘ u büyük “list” veritipi nesnesi de tek bir kimlik numarasına g sahip olacaktır...

s s s s Mesela söyle bir fonksiyon yazabiliriz: ¸ # -*. iki nesnenin kimlikleri üzerinden bir sorgulama i¸lemi s g s yapıyor.. Aynı durum tabii ki öteki veritipleri için de geçerlidir. “dict” veritipinin nesne kimli˘ i de hep aynı olacaktır: g g >>> id(type(sozluk1) 3085549888L >>> id(type(sozluk2) 3085549888L Peki biz bu bilgiden nasıl yararlanabiliriz? Söyle: “is” i¸lecini do˘ rudan iki nesnenin kendisini ¸ s g kar¸ıla¸tırmak için kullanamasak da bu nesnelerin veritipini kar¸ıla¸tırmak için kullanabiliriz. sonuca göre ba¸ka bir i¸lem.... Çünkü “is” i¸leci. Ama ayrı listeler için ayrı adres kullanıyor. tabii ki “if id(type(a)) == id(type(b)):” da yazılabilir.>>> id(type(liste)) >>> 3085544992L >>> id(type(liste2)) 3085544992L Bu iki çıktı aynıdır..coding: utf-8 -*def karsilastir(a. sonuca göre bir i¸lem.. s >>> if type(b) is list: . s s ..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 DE˘˙LD˙R!" GI I print "ilk argümanın tipi: %s"%(type(a)) print "ikinci argümanın tipi: %s"%(type(b)) Burada “if type(a) is type(b):” satırı yerine.. “is” i¸lecini veritipi kar¸ıla¸tırması yapmak için isterseniz su sekilde de kullanabilirsiniz: s s s ¸ ¸ >>> if type(a) is dict: .. çünkü Python “list” veritipi nesnesi için bellekte tek bir adres kullanıyor.. Mesela “dict” veritipi (sözlük) >>> sozluk1 = {} >>> id(sozluk1) 3082285236L >>> sozluk2 = {} >>> id(sozluk2) 3082285916L Ama tıpkı “list” veritipinde oldu˘ u gibi. dedi˘ imiz gibi...

.. Sözün özü... . bazı nesg neler için her defasında farklı bir depolama i¸lemi yapmaktadır.. ˙ s Içerik kar¸ıla¸tırması için “==” s s veya ”!=” i¸leçlerini kullanmak daha do˘ ru bir yakla¸ım olacaktır.... g dolayısıyla bu de˘ ere gönderme yapan bütün nesneler için aynı bellek adresi kullanılacaktır: g >>> if b is None: .. s g s ... sonuca göre daha ba¸ka bir i¸lem.. s s s g Çünkü Python bazı nesneleri (özellikle “ufak” boyutlu nesneleri) önbelle˘ ine alırken.>>> if type(c) is file: . “is” i¸leci iki nesne arasında içerik kar¸ıla¸tırması yapmak için güvenli de˘ ildir. Çünkü “None” de˘ eri bellekte her zaman tek bir adreste depolanacak.. gibi. s s “is” i¸lecini aynı zamanda bir nesnenin “None” de˘ erine e¸ olup olmadı˘ ını kontrol etmek için s g s g de kullanabilirsiniz..

x > Python (Command Line) yolunu takip edeceksiniz.org adresinden Python programını indirip bilgisayarlarına kurduklarında Python otomatik olarak YOL’a (PATH) eklenmiyor. Windows komut satırında python yazıp ENTER tu¸una basın.. Yani Python’a ula¸mak s için. Bu sayede GNU/Linux kullananlar zahmetsiz bir sekilde Python’ı kurcalamaya ba¸laya¸ s bilirler. Bu durumu su sekilde teyit edebiliriz: ¸ ¸ 1. bu imkanı elde s g etmek için Windows komut satırına daha fazla kod yazmanız gerekecek.python. 409 . Her program çalı¸tırı¸ınızda bu kodu girmek s s s zamanla eziyete dönü¸ebilir. Açılan kutucu˘ a cmd yazıp ENTER tu¸una basın.BÖLÜM 28 Windows’ta Python’ı YOL ’a (PATH) Eklemek GNU/Linux kullananların Python’ın etkile¸imli kabu˘ una ula¸mak için yapmaları gereken tek s g s sey komut satırında python yazıp ENTER tu¸una basmaktır. s Bu durumda Python’ın etkile¸imli kabu˘ una ula¸mak için iki yolunuz var: s g s Birincisi. s ¸ python program_adı yazarak programınızı çalı¸tırma imkanınız da olmayacaktır. Python YOL’a eklenmemi¸ demektir: ¸ s s ’python’ iç ya da dı¸ komut. komut satırına her defasında Python’ın ve/veya kendi programınızın tam yolunu yazmak zorunda kalacaksınız. Windows komut satırında Python’ın tam yolunu belirteceksiniz: c:/python26/python. çalı¸tırılabilir Python dosyasını da /usr/bin klasörü içine s atar. Ba¸lat > Çalı¸tır yolunu takip edin. s s 3. Çünkü GNU/Linux da˘ ıtımları ¸ s g Python paketini sisteme eklerken. Söyle bir hata mesajı almı¸sanız. s Birinci yöntem oldukça me¸akkatli ve sıkıcıdır. Ba¸lat > Programlar > Python 2. Çünkü Windows kullanan¸ lar http://www.exe ˙ Ikincisi. Bu sekilde. g s Böylece Windows komut satırına ula¸mı¸ olduk.. s 4. Ama Windows kullananlar için aynı seyi söyleyemiyoruz. s s 2. çalı¸tırılabilir s s program ya da toplu i¸ dosyası olarak tanınmıyor. Daha do˘ rusu.

getcwd() Etkile¸imli kabu˘ u istedi˘ iniz dizinde açamadı˘ ınız zaman. Windows’ta sadece python s g g komutunu vererek nasıl etkile¸imli kabu˘ a eri¸ebilece˘ imizi ö˘ renece˘ iz. Bu sekmeyi açıyoruz.˙ Ikinci yöntem kolaydır. Örne˘ in bu sekilde kabu˘ a ula¸tı˘ ınızda Python’ı istedi˘ iniz dizin içinde ba¸latamamı¸ g ¸ g s g g s s oluyorsunuz. özellikle KDE’yi kullananlar. örne˘ in masaüstüne kaydetti˘ iniz s g g g g g bir modüle ula¸mak için biraz daha fazla u˘ ra¸acaksınız demektir. Yani bu yazımızda. ˙ste bu yazımızda buna benzer bir kolaylı˘ a s s I¸ g Windows’ta nasıl ula¸abilece˘ imizi anlataca˘ ız. g s s g . s g s g g g Öncelikle Windows’un masaüstündeki Bilgisayarım simgesine sa˘ tıklıyoruz. Bu a¸amada sadece python yazıp ENTER tu¸una basarak s s etkile¸imli kabukla oynamaya ba¸layabilecekler. Bu sekilde Python’ın etkile¸imli kabu˘ u. ancak etkile¸imli kabu˘ a bu sekilde ula¸manın bazı dezavantajları bus g ¸ s lunur. Etkile¸imli kabuk açıkken hangi dizinde oldu˘ unuzu sırasıyla su kos g ¸ mutları vererek ö˘ renebilirsiniz: g >>> import os >>> os. o programın bulundu˘ u dizine girecek ve orada F4 tu¸una s g s basarak bir komut satırı açabilecektir. herhangi bir dizin içinde bulunan bir Python programını çalı¸tırmak için. Python’ın kurulu oldu˘ u C:/Python2x ¸ s g g dizini içinde açılacaktır. g Bilgisayarım simgesine sa˘ tıkladıktan sonra açılan menünün en altında yer alan “Özellikler”e g (Properties) giriyoruz. Bu girdi˘ imiz yerde “Geli¸mi¸” (Advanced) adlı bir sekme görece˘ iz. s g s GNU/Linux kullanıcıları ise.

“Geli¸mi¸” sekmesine tıkladı˘ ımızda kar¸ımıza söyle bir ekran gelecek: s s g s ¸ .

Burada “Çevre De˘ i¸kenleri” (Environment Variables) dü˘ mesine tıklıyoruz. Bu dü˘ meye tıkgs g g ladı˘ ımızda söyle bir pencere açılacak: g ¸ .

“Sistem de˘ i¸kenleri” bölümündeki “Düzenle” (Edit) dü˘ mesine tıklıyg gs g oruz. Listedeki ö˘ eler alfabe sırasına göre dizildi˘ i için Path‘i bulmanız zor olg g g mayacaktır.) g ..Bu ekranda “Sistem De˘ i¸kenleri” (System Variables) bölümünde yer alan liste içinde Path gs ö˘ esini buluyoruz. Kar¸ımıza söyle bir sey geliyor: (A¸a˘ ıdaki ekran görüntüsünde “Sistem De˘ i¸kenleri” s ¸ ¸ s g gs bölümündeki Path ö˘ esini de listede görebilirsiniz.. Path ö˘ esi seçili iken.

s g s . Açılan kutucu˘ a cmd yazıp ENTER ¸ s s g tu¸una bastıktan sonra kar¸ımıza Windows komut satırı gelecek.6 kug ¸ rulu oldu˘ u için oraya ”. Siz de listenin g sonuna bu ö˘ eyi aynı sekilde ekleyeceksiniz. Sizdeki sürümün tam g adını ö˘ renmek için “C:/” dizinini kontrol edebilirsiniz. benim sistemimde Python2. Benim sistemimde “C:/” dizini altındaki g Python klasörünün adı “Python26”. Sizdeki sürüm farklı olabilir. Bu klasörün adı sizdeki sürüme göre farklılık gösterebilir. Simdi Ba¸lat > Çalı¸tır (Start > Run) yolunu takip ediyoruz.C:\Python26” ö˘ esini ben ekledim. Do˘ ru sürüm numarasını gerekli yere yazdıktan sonra “Tamam” dü˘ melerine basarak tekrar g g masaüstüne dönüyoruz.C\Python26” yazdım.Bu ekrandaki listenin en sonunda görünen ”. Burada artık python komus s tunu vererek Python’ın etkile¸imli kabu˘ una ula¸abiliriz. Yalnız tabii ki.

C:\Python26\Scripts” satırını da kutucu˘ a ekliyoruz.. Artık. cmd ile s ula¸tı˘ ımız bu komut satırında su komutu vererek Python programlarını çalı¸tırabiliriz: s g ¸ s python program_adı Windows komut satırı Python’ın Windows’ta sundu˘ u komut satırından biraz daha yeteneklidir. Bu dizini YOL’a eklemek için yukarıdaki adımları tekrar ediyoruz ve ”. ancak s g s ba¸ka bazı modüllerin de çalı¸abilmesi için Scripts adlı dizini de YOL’a eklemenizi tavsiye eds s erim. Sadece g g çalı¸tırılabilir dosyayı YOL’a ekledi˘ inizde Python’ı komut satırından çalı¸tırabilirsiniz. s g s s Yukarıda Python’ın çalı¸tırılabilir dosyasını (executable) sistem YOL’una nasıl ekleyece˘ imizi s g ö˘ rendik. Bu dizini YOL’a eklemek oldukça basittir. g Bu konuyla ilgili herhangi bir sorunuz olması halinde kistihza [et] yahoo [nokta] com adresine yazabilirsiniz. Ancak ço˘ u zaman sadece bu dosyayı YOL’a eklemek yeterli olmayacaktır..Etkile¸imli kabuktan çıkmak için önce CTRL+Z‘ye. . ardından da ENTER‘e basıyoruz. g “cmd” komutu ile ula¸tı˘ ınız ekranda kopyalama/yapı¸tırma i¸lemleri de yapabilirsiniz.

yani “Python’u Geli¸tirme Önerileri”dir. PEP’ler genellikle teknik bir dil kullanılarak yazılır. s g 29. Python 2. yukarıda adresi verilen PEP 3000’in çevirisidir. Asıl Python sürümü Python 3.0 olarak adlandırılacak. sürecin de sorgulanmasına g g s yol açacaktır. Adından da anla¸ılaca˘ ı gibi PEP’lerin i¸levi Python’un geli¸imine ı¸ık s s g s s s tutmaktır.BÖLÜM 29 PEP 3000 Ba¸ lıgı PEP 3000 – Python 3000 s ˘ Adresi http://www.2 Adlandırma Python 3000. PEP’ler Python toplulu˘ una çe¸itli konularda bilgi vermenin yanısıra. “python3. Dosya adlandırmalarında ise.0 ve Py3K aynı seyin adıdır.1 Özet Bu PEP Python 3000’in geli¸tirilmesine ili¸kin bir kılavuz niteli˘ indedir.0 -V” komutunun çıktısı da bu olacaktır. Ço˘ unlukla belirli bir özellik üzerinde yürütülen tartı¸malar.org/dev/peps/pep-3000/ Yazarı Guido Van Rossum Yazılma Tarihi 5 Nisan 2006 ˘ s Son Degi¸ iklik 18 Mart 2008 Türkçesi Fırat Özgül Not: Çevirmenin Notu: PEP’in açılımı “Python Enhancement Proposal”. gs 416 . Tercihen. Çalı¸tırılabilir dosya için yeni bir ad önermek veya Python kaynak dosyalarının s uzantısını de˘ i¸tirmek istemiyorum.x sürümlerinde tutulan yol benimsenecektir. ilk olarak süreç s s g üzerinde uzla¸ılmalı. Python 3. 29. Ama uygulamada özelliklerle sürecin bir arada ele alındı˘ ına sahit olas g ¸ ca˘ ız. g A¸a˘ ıdaki metin.python. Python’a ili¸kin g s s bir özelli˘ i veya özellik önerisini de tarif eder. Projenin ismi Python 3000 veya kısaca ¸ Py3k’dır. özellikler konusu ancak süreç kararla¸tırılıp kesinle¸tirildikten sonra irdes s s lenmeye ba¸lanmalıdır.

Python 3000’e ili¸kin s g s bütün üst-PEP’lerin üst-PEP’idir. ba˘ lamdan ba˘ ımsız olarak kaynaktan s g g kayna˘ a dönü¸türme i¸lemi yapabilecek.x.0’dan sonra..6 ve 3.x sürümlerinin bir süre birbirine paralel gitmesini bekliyorum. Hatta bir kodun bir bölümünün dahi çalı¸aca˘ ı söylenemez.0’a ili¸kin sürüm takvimini içeren PEP 361’e bakınız. PEP s 3000 (¸u anda okudu˘ unuz PEP) ise özel bir duruma sahiptir: PEP 3000. 29.6 sürümünde.2’nin çıkı¸ının 2.2 g sürümlerine kadar devam edebilir.x deste˘ inin sürdürülmeg g sine yönelik olarak topluluktan gelen taleplere.x ve 3..0 (son sürüm) çıktıktan sonra bile en az bir veya iki 2. (Tabii ufak da olsa s g çalı¸acak kısımlar vardır.6 sürümündeki ileriye dönük uyumluluk özelliklerinin yerine veya bunlara ek olarak ayrı bir kaynak kod dönü¸türme aracı da olacaktır [1].0 ile Python 2. süreçlerin nasıl tanımlanaca˘ ına s s g ili¸kin süreci tarif eder).x’te hata verecek sözdizimleridir bunlar) Python 2.1 veya 3. s s Not: Standart kitaplık geli¸iminin 3.3 PEP’lerin Numaralandırılması Python 3000’e ili¸kin PEP’ler PEP 3000 ile ba¸lar. ama ana i¸levinden yoksun olarak.x için hata g düzeltme sürümü yayınlamayı bırakıyoruz. Python 3. args) fonksiyonunu f(*args) sekline g s s g ¸ dönü¸türebilecektir. Python 2. buns s lar sürece ili¸kin veya bilgi amaçlı PEP’lerdir.) s s Python 2.x arasında geriye dönük bir uyumluluk olmayacaktır. Normalde 2.x sürümünün yayınlanaca˘ ını tahmin ediyorum. Bu araç. s 2. Python 3.6’ya geri ta¸ınacak. Ama 3.x sürüm yayınlama g s döngüsü rayına oturacaktır. 29.0’da artık çalı¸mayacak özellikler hakkında (mesela s range() fonksiyonunun dönü¸ de˘ erinin liste oldu˘ unu varsayarak) dinamik sekilde (yani s g g ¸ çalı¸ma esnasında) uyarı verecek olan bir “Py3k uyarı kipi” yer alacaktır. 3.5 Uyumluluk ve Geçi¸ s Python 3. Python 2. Bu sürümlerin yayınlanma s tarihleri ba¸aba¸ gitmektedir. Son olarak. Topluluk 3. bu özellikler ya __future__ modülü aracılı˘ ıyla ya da eski ve yeni s g sözdizimi yan yana kullanılarak etkinle¸tirilebilecektir. 3000-3099 arası PEP’ler üst-PEP’ler olup. Bunun ne kadar devam edece˘ i 2. PEP 3099 ise. örne˘ in apply(f. Ancak tabii ki bu araç veri akı¸ı analizi veya tip çıkarsaması yapamaz. g Python 3.(x+1) sürümü çıktı˘ ı anda 2.1 ve 3. asıl Python 3000 sürecine girs ilmeden önce Python 3000 içinde yer alması kararla¸tırılmı¸ (ya da yer alması ümit edilen) s s özellikleri içeren bir “yapılacaklar listesi” gibidir.6 ile yazılmı¸ kodların Python 3. Hatta bu durum 3.0 altında hiçbir de˘ i¸ikli˘ e u˘ ramadan çalı¸aca˘ ının s gs g g s g teminatı yoktur.x sürümleri.x serisine kıyasla çok daha çabuk s olaca˘ ını tahmin ediyorum. (Ba¸ka bir deyi¸le bu PEP.0 sürümünün kabul görüp kararlı bir hale gelmesine ve gönüllülerin tahammül sınırlarına ba˘ lıdır. de˘ i¸meyecek gs özellikleri sıralar.4 Takvim Python 2.y sürümlerine kıyasla daha uzun bir süre boyunca yayınlanmaya devam edecektir.6 ileriye dönük uyumlulu˘ u su iki sekilde sa˘ layacaktır: g ¸ ¸ g • Python 2. 3100-3999 arası PEP’ler özellikler üzerinedir.x sürümlerine alı¸tıktan sonra 3. s s . s Python 2.29. hata düzeltmelerini içeren geleneksel 2. s • Py3k’ya ait pek çok özellik (normalde 2. PEP 3100 de özel bir PEP’tir: Bu PEP.0a1’den sonra süratlenmesi beklenmektedir.

g 7.6 ve 3.0 sürümünün sözdizimine dönü¸türmek için 2to3 aracını kullanın. Bu yakla¸ım. Projenizi Python 2. Not: Geçi¸ sürecine ili¸kin konuları ayrıntılı olarak tarif eden bir üst-PEP’e ihtiyacımız var. bunun o bildi˘ imiz eski gömülü g g fonksiyon oldu˘ unu varsayacaktır.6 ve 3.Yani bu araç yukarıdaki gibi bir apply fonksiyonu gördü˘ ünde. Ben bir yandan da sıfırdan gerçekleme çalı¸malarına giri¸ilmesine ¸ s s kar¸ı de˘ ilim.0 sürümü altında test edin.8 Kaynaklar [1] subversion test alanında (sandbox) bulunan 2to3 aracı [2] Joel on Software: Katiyen Yapmamanız Gereken Seyler. s s 6.6’ya aktarın. 4.0 sürümlerini birlikte desteklemesi gereken bir proje için önerilen geli¸tirme s modeli a¸a˘ ıdaki gibidir: s g 0. Neredeyse tam kapsamlı. 29. 2. yazarı tarafından memnuniyetle kar¸ılanacaktır.6 Gerçekleme Dili (Implementation) Python 3000 C dilinde gerçeklenecek. Bu kaynak kodunu 3.6 ve 3. yeni sürüm. s Yukarıda anılan ve anılmayan konulara ili¸kin taslak seklindeki üst-PEP’ler ise daha da makbule s ¸ geçecektir! 29. basama˘ a geri dönün. s s 29. 1.6 sürümü için verece˘ iniz deste˘ i salt bakım seviyesine getirene kadar 3. E˘ er sorunla kar¸ıla¸ırsanız.0 için ayrı tar dosyaları (veya sürümler için g hangi ar¸ivleme biçimini kullanıyorsanız onu) hazırlayın.0 g g kaynak kodunun düzenlenmesi tavsiye edilmez (yani 2. Sürümü yayınlama vakti geldi˘ inde 2. g Python 2. ama benim kendi çabalarım en iyi bildi˘ im dile ve gerçeklemeye yönelik olacaks g g tır. ba¸tan a¸a˘ ı yeniden yazmanın tehlikeleri hakkındaki (Joel Spolsky[2] ile pays s s g la¸tı˘ ım) görü¸lerimden kaynaklanmaktadır. kusursuz birim testleri hazırlayın. Python 2 kod tabanından evrilecektir.6 kodunu bakım dalına aktaraca˘ ınız g ana kadar). s Programınızın 2. s Çıktıyı elle düzenlemeyin! 5. 3. Bölüm I ¸ [3] PEP 361 (Python 2. Dönü¸türülmü¸ kaynak kodunu 3.6 sürümü üzerinde yapın ve g s s 3. düzeltmeleri kaynak kodunun 2. Py3k uyarı kipini açın.0 için Sürüm Takvimi) . Python 3000 Python 2 üzerinde yapılmı¸ nispeten s g s s orta düzeyli bir iyile¸tirme çalı¸ması oldu˘ u için dili ba¸tan a¸a˘ ı yeniden yazmaya kalkı¸s s g s s g s mazsak çok sey kazanırız. Uyarı kalmayıncaya kadar test edin ve kodu düzenleyin.7 Üst-Katkılar Bu PEP için yapılacak ilave metin önerileri.

9 Telif Hakkı Bu belge kamuya açılmı¸tır. s .29.

Writer.. OpenOffice’nin GNU/Linux’taki birincil ve en geli¸mi¸ s s ofis paketi olmasından ötürü. Java.. Farklı programlama dilleri. evirip çevirmek. Python’u g s g kullanarak OpenOffice belgelerini nasıl yönetebilece˘ imizi ö˘ renmeye çalı¸aca˘ ız. JavaScript.BÖLÜM 30 Python ve OpenOffice Not: Bu makale henüz taslak halindedir. g g s g OpenOffice. OpenOffice hem GNU/Linux’ta hem de Windows’ta çalı¸as biliyor. Biz bu bölümde OpenOffice ve Python’u nasıl ba˘ da¸tırabilece˘ imizi. Özellikle GNU/Linux kullanıcıları. Microsoft firmasının özgür olmayan ofis paketine alternatif olarak bilgisayarlarımızda kullanabiliyoruz. kendilerine özgü bir UNO köprüsü (UNO bridge) kullanarak OpenOffice’nin UNO bile¸enlerine ve dolayısıyla OpenOffice’nin API’sine ers i¸ebilirler. Ço˘ u kimsenin bildi˘ i gibi. s s API’ye eri¸ebilmek için “UNO” (Universal Network Objects — Evrensel A˘ Nesneleri) adlı bile¸en s g s modelinden faydalanıyoruz. Sun Microsystems firmasının etkin deste˘ iyle geli¸tirilen OpenOfg g g s fice adlı bir özgür yazılımı. OpenOffice’yi Windows kullanıcılarına nazaran çok daha yakından tanır. Python. OLE prog gramcıları). CLI. düzenlemek s veya de˘ i¸tirmek için programcılara oldukça geli¸mi¸ bir API (uygulama programlama arayüzü) gs s s sunuyor. Zamanla bu makale içindeki bilgiler geli¸tirilecek ve s buraya yeni bilgiler de eklenecektir. Su anda kullanılabilecek olan UNO köprüleri söyle listelenebilir: s ¸ ¸ • Uno/Binary • Uno/CLI • Uno/Cpp • Uno/Delphi • Uno/Java • Uno/OLE • Uno/PyUno • Uno/Remote • Perl Uno 420 . E˘ er bu makaleye katkıda bulunmak veya makalede bulg du˘ unuz hataları bildirmek isterseniz kistihza [at] yahoo [nokta] com adresinden bana ula¸ag s bilirsiniz. Calc ve öbür ofis bile¸enlerini yönetmek.. StarBasic. Yani farklı programlama dilg g lerini kullanan programcılar (örne˘ in C++. OpenOffice API’sinin özelli˘ i dilden ba˘ ımsız olmasıdır.. OpenOffice API’sine eri¸erek ofis bile¸enlerini yönetebilirler.

. muhtemelen bu i¸lemi yapmak zorunda kalmayacaksınız.. PyUno adlı paketi bilgisayarımıza kuracaktır. bilgisayarımıza PyUno’nun Python 2. PyUno s g OpenOffice ile birlikte geldi˘ i için. bu köprü. Ancak ço˘ u durumda en iyi yol s gs s g “python-uno” adlı paketi kurmak olacaktır.6 oldu˘ u için. PyUno modülü sisteminizde kurulu demektir. Ancak ba¸ta da dedi˘ imiz gibi. Python ve OpenOffice’yi birlikte kullanabilmek için PyUno adlı g bir yazılıma ihtiyacımız olacak. sistemdeki en yeni resmi Python sürümü hangisiyse bilgisayarınıza ona uygun olan PyUno paketini kuracaktır. listede “Uno/PyUno” da var.6-uno” adlı iki farklı paket görüyoruz. g s . g Benim kullandı˘ ım i¸letim sistemi Ubuntu Jaunty Jackalope. g s GNU/Linux PyUno. Tabii siz bu yazıyı okurken Ubuntu’da i¸ler de˘ i¸mi¸ olabilir. Python s g ile OpenOffice’nin bile¸en modeli arasında ba˘ lantı kurabilmemizi sa˘ lıyor. O halde hemen bu paketi sistemimize kuralım: sudo apt-get install python-uno Bu komut. g ¸ E˘ er yukarıdaki komut bir hata mesajı veriyorsa okumaya devam edin. s Önce Ubuntu paketleri arasında küçük bir ara¸tırma yapalım. s g g 30.. Su an itibariyle Ubuntu Jaunty Jackalope‘deki en yeni resmi Python sürümü ¸ 2.6 ile uyumlu olan sürümünü g kuracaktır. Bu i¸lemin nasıl yapılaca˘ ını GNU/Linux ve Windows için ayrı ayrı s s g inceleyece˘ iz. PyUno’nun kurulu olup olmadı˘ ını denetlemek için Python’un etkile¸imli kabu˘ unda su komutu g s g ¸ verebilirsiniz: >>> import uno E˘ er hiçbir sey olmadan bir alt satıra geçiliyorsa. PyUno’nun Python 2. O yüzden PyUno’yu bilgisayarınıza kurmak için herhangi bir i¸lem yapmanıza gerek yok. Ba¸ka GNU/Linux da˘ ıtımlarını kulg g s g lananlar... “python-uno”. O halde isterseniz bu yazılımın sistemimize nasıl kurulaca˘ ını g inceleyelim ilk i¸ olarak.• Tcl Uno Gördü˘ ünüz gibi. OpenOffice ile birlikte gelen bir modüldür. Önce GNU/Linux’tan ba¸layalım. g s O yüzden ben bu yazıda PyUno’nun Ubuntu üzerine nasıl kurulaca˘ ını anlataca˘ ım. E˘ er “python2.6-uno” bugün itibariyle aynı paketleri kurar... E˘ er sisteminizde OpenOffice kurulu ise PyUno s g da kuruludur.6’ya uygun sürümü kurulacaktır.6-uno uno-libs3 uno-libs3-dbg unoconv Burada “python-uno” ve “python2. ˙ g Isminden de anla¸ılaca˘ ı gibi..1 PyUno’nun Kurulumu Daha önce de dedi˘ imiz gibi.6-uno” g paketini kurarsanız. Dolayısıyla “python-uno” ve “python2. “python-uno” paketi ise. kendi paket yöneticileri aracılı˘ ıyla a¸a˘ ıda anlattıklarıma benzer i¸lemleri gerçekg s g s le¸tirebilirler. 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.

Bunu konsola yazmadan önce su sorunu çözmemiz g ¸ gerek: Yukarıdaki parametre içinde gördü˘ ümüz ”. yani UNO aracılı˘ ıyla s g g OpenOffice API’sine ba˘ lanmamızı sa˘ layacak bilgileri içeren bir karakter dizisi de belirg g lememiz gerekiyor.” i¸aretini Unix kabu˘ unun farklı algılamasından g s g ötürü.urp. a¸a˘ ıda s g s g anlatacaklarımı “GNU/Linux” ve “Microsoft” diye ayırmı¸ olsam da..port=2002.. Unix kabu˘ ug g g nun bize sorun çıkarmaması için yukarıdaki parametreyi tırnak içine almamız yeterlidir. Yani komutumuzu söyle yazaca˘ ız (Bu arada. E˘ er kurulum a¸amasını ba¸arıyla geçtiysek emin adımlarla yolumuza devam edebiliriz.. Bu sayede Python’la yaptı˘ ımız i¸lemg s lerin OpenOffice tarafından algılanmasını sa˘ layaca˘ ız. “-accept” parametresi. bu komutu vermeden önce sistemde hiçbir OpenOf¸ g fice belgesinin açık olmamasına dikkat ediyoruz) . OpenOffice API’sine ba˘ lanmada kullanaca˘ ımız g g kabul mekanizmasını olu¸turabilmek için bir “UNO ba˘ lantı dizisi”. OpenOffice’yi ise http://www. yukarıdaki komut OpenOffice’yle ba˘ lantı kurmamızı sa˘ layamayacaktır. Wins g dows bölümünde GNU/Linux kullanıcılarının i¸ine yarayacak bilgiler de yer alıyor. s g Yine yukarıdaki kısa bilgiden anlıyoruz ki... ba¸ka programların OpenOffice API’sine g s ba˘ lanmak için kullanabilece˘ i bir “ba˘ lantı kabul etme mekanizması” (ba¸ka deyi¸le bir “UNO g g g s s alıcısı”) olu¸turulmasını sa˘ lıyor. OpenOffice API’sine ili¸kin resmi kılavuzun söyledi˘ ine göre bu i¸lemi yapabilmek için OpenOfs g s fice’yi su sekilde ba¸latmamız gerekiyor: ¸ ¸ s soffice -accept=socket. s Dolayısıyla e˘ er sisteminizde OpenOffice kurulu ise ba¸ka herhangi bir sey kurmanıza gerek g s ¸ yok. Bu arada.host=0. g Bu parametre hakkında kısa bir bilgi almak için konsolda su komutu verebilirsiniz: ¸ soffice -h Bu komutun çıktısı içinde su satırları göreceksiniz: ¸ -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ı˘ ımıza göre.org/ adresinden indirebilirsiniz. s GNU/Linux OpenOffice’yi dinleme kipinde açabilmek için “-accept” adlı bir parametreden faydalanaca˘ ız. g s s 30. Bu komutu alıp oldu˘ u gibi kullanamıyoruz. g g Bu i¸lemi sırasıyla GNU/Linux’ta ve Windows’ta nasıl yapaca˘ ımızı görelim.. hangi i¸letim sistemini kuls s lanıyor olursanız olun hem GNU/Linux hem de Windows açıklamalarını okumalısınız.. Çünkü GNU/Linux bölümünde Windows kullanıcılarının da i¸ine yarayacak bilgiler bulundu˘ u gibi..Microsoft Windows Microsoft Windows i¸letim sisteminde de PyUno paketi OpenOffice kurulumu ile birlikte geliyor.openoffice.2 OpenOffice’yi mode) Dinleme Kipinde Açmak (listening Python’u kullanarak OpenOffice ile herhangi bir i¸lem yapabilmek için atmamız gereken ilk s adım OpenOffice’yi “dinleme kipinde” açmak olmalıdır.

resmi kılavuzun önerisine uyarak.urp. Ama önce Windows kullanıcılarının durumunu bir gözden geçirelim.. yukarıdaki komutu ona göre düzenlemeniz gerekiyor. Ancak bu komutu verdikten sonra e˘ er “Could not find a Java Runtime Environment” gibi bir hata mesajı alıyorsanız su komut g ¸ yardımıyla gerekli paketi sisteminize kurmalısınız: sudo apt-get install openoffice. OpenOffice’nin kendisine gelen ba˘ lantı giri¸imlerini kabul g s etmesini sa˘ lıyor. port: Bu parametre. Sistemimizdeki OpenOffice’yi s g çalı¸tırmamızı sa˘ layan dosyanın adı “soffice”dir. “Uno Remote Protocol” teriminin kısaltmasıdır.. Orada önce su komutu vererek “C:\Program Files\OpenOffice 3\program” dizinine s ¸ ula¸ıyoruz: s cd C:\Program Files\OpenOffice..host=0.. OpenOffice’nin dinleyece˘ i konak sistemin adını veya IP nug marasını gösteriyor. Bu arada. güvenlik gerekçesiyle.soffice -accept="socket.urp.exe” dosyasının bulundu˘ u dizin burasıdır. e˘ er bu komutu verdikten sonra “unable to get gail verg g sion number” gibi bir hata alırsanız.org 3\program E˘ er sizdeki OpenOffice dizini farklıysa. Simdi s I¸ g ¸ Ba¸lat>Run” yolunu takip ederek “cmd” komutunu veriyoruz ve Windows’un komut satırına s ula¸ıyoruz. ˙ste “soffice. bunu önemsemeyin. OpenOffice’ye ba˘ lanırken kullanaca˘ ımız ba˘ lantı tipini gösg g g teriyor. “OpenOffice’ye 2002 portu üzerinden bir soket ba˘ lang tısı gerçekle¸tirerek Uno Uzak Ba˘ lantı Protokolü (URP) aracılı˘ ıyla OpenOffice’nin bizi dinles g g meye almasını sa˘ ladık”. OpenOffice ile ba˘ lantıyı hangi port üzerinden gerçekle¸tireg s ce˘ imizi belirtmemizi sa˘ lıyor. urp: Bu ifade. g “0” de˘ eri. g Bu noktada. Windows’ta OpenOffice programı g “C:\Program Files\OpenOffice 3” dizini altında bulunur. yukarıda GNU/Linux kullanıcılarının verdi˘ i “soffice -accept. varsayılan olarak hiç bir g ba˘ lantı giri¸imini kabul etmez. g g “2002” portunu kullandık. OpenOffice.. müsait olan bütün a˘ arayüzleri üzerinden dinleme i¸lemi gerçekg g s le¸tirilmesini sa˘ lar.. g g host: Bu parametre... s g -accept: Bu parametrenin ne oldu˘ unu da biraz önce görmü¸tük.port=2002. sunucu g ve istemci arasında çift yönlü ba˘ lantı kurmamızı sa˘ layan bir mekanizmadır.. Bu belgeyi kapatmadan yolumuza devam edelim.”‘ komutu verildikten sonra bo¸ bir OpenOfs fice Writer belgesi açılacaktır. Biz burada bir “soket ba˘ lantısı” kurmayı deniyoruz. Microsoft Windows Windows kullananlar. g s socket: Bu ifade." Dilerseniz bu komuttaki parametreleri teker teker incelemeye çalı¸alım: s soffice: Bu ifadenin ne i¸e yaradı˘ ını biliyoruz. Yukarıdaki komutta “host=0” yerine “host=localhost” da s g yazabiliriz.port=2002.. Bu dizinin içinde “program” adlı bir ba¸ka dizin daha göreceksiniz.. Ayrıca Windows’ta saat simgesinin yanına yerle¸en “OpenOffice QuickStarter” uygus .host=0. sistemimizde hiçbir OpenOffice belgesinin açık olmadı˘ ından emin olmamız g gerekiyor. OpenOffice’nin kurulu oldu˘ u dizin içinde verecek. Biz burada.org-java-common ‘soffice -accept=”socket. Bu parameg s tre temel olarak. Bu terim Türkçe’de “Uno Uzak Ba˘ lantı Protokolü” anlamına gelir ve kurulacak ba˘ lantının hangi g g protokol üzerinden gerçekle¸tirilece˘ ini ifade eder. “soket”. Bu parametreye “0” veya “localhost” de˘ erlerini verebiliriz.” komug tunu. s g Kısacası yukarıdaki komut yardımıyla..

g Bu arada.host=localhost.urp. Madem i¸imiz Uno ile. o halde hemen “uno” modülünü içe aktaralım: s >>> import uno Böylece “uno” modülünün bütün nimetlerinden faydalanabilece˘ iz. Komutta “host=0” yazmak Windows’ta OpenOffice ile ba˘ lantı kuramamamıza sebep olabiliyor. açılı¸ ekranını göstermeden açılacaktır.. atmamız gereken ilk adımdı.port=2002. yukarıdaki komutların GNU/Linux’takinden biraz farklı oldu˘ una dikkat edin. E˘ er kapalı de˘ ilse bu uygulamayı da kapatıp su komutu g g ¸ veriyoruz: soffice -accept=socket.. E˘ er ne açılı¸ ekranı s g s ne de “ne tür belge?” ekranı görmek isterseniz yukarıdaki iki parametreyi birlikte de kullanabilirsiniz: soffice -accept=socket. her iki bölümü de dikkatle okumanın zararını de˘ il faydasını görürsünüz. Ayrıca Wing dows’tayken “socket.” satırını tırnak içine almamıza gerek olmadı˘ ına da dikkatinizi çekmek isterim. g ˘ 30. Bu komutu verdikten sonra OpenOffice açılacaktır.urp. -nofirstwizard.host=localhost.port=2002.host=localhost. -nofirstwizard Buradaki “-nofirstwizard” parametresi OpenOffice’nin do˘ rudan bo¸ bir metin belgesi açmasını g s sa˘ layacaktır.. ilk açılırken kar¸ımıza çıkan açılı¸ ekranını (splashscreen) da görmek isg s s temiyorsak yukarıdaki komutu su sekilde de verebiliriz: ¸ ¸ soffice -accept=socket. -nologo OpenOffice’yi bu parametrelerle birlikte çalı¸tırdı˘ ınızda OpenOffice’nin her zamankinden bis g raz daha hızlı açıldı˘ ını göreceksiniz.host=localhost. -nologo Böylece OpenOffice programı..port=2002..lamasının da kapalı olması lazım.3 OpenOffice’ye Baglanmak Bir önceki adımda OpenOffice’yi dinleme kipinde açtık. Tabii hangi i¸letim sistemini kulg g s lanırsanız kullanın.urp. E˘ er ne tür bir belge açmak istedi˘ inizi g g soran bir ekranla kar¸ıla¸ırsanız “Text Document” (veya “Bo¸ Belge”) seçene˘ ini i¸aretleyerek s s s g s bo¸ bir metin belgesi açın.. Simdi ¸ ise Python aracılı˘ ıyla OpenOffice’ye ba˘ lanmayı deneyece˘ iz. Bu kog mutu Windows’ta verirken “host=0” yerine “host=localhost” yazıyoruz.port=2002.urp. s Yukarıdaki komuta ek olarak bazı ba¸ka parametreler de verebilirsiniz.host=localhost. Bu. g E˘ er OpenOffice’nin. g . Yine sırasıyla GNU/Linux ve g g g Microsoft kullanıcılarının ne yapması gerekti˘ ini anlataca˘ ız..port=2002.... Verece˘ iniz bu parames g treler OpenOffice programının açılı¸ seklini ekleyecektir: s¸ soffice -accept=socket. Bu parametre sayesinde OpenOffice’nin “ne tür bir belge açmak istersiniz?” g sorusunu sormamasını sa˘ lıyoruz.urp.. g GNU/Linux Öncelikle Python’un etkile¸imli kabu˘ unu ba¸latıyoruz: s g s python Gayet güzel..

• Ardından “Bile¸en Ba˘ lamını” içe aktarıyoruz. s g • “Servis Yöneticisi” yardımıyla OpenOffice ba˘ lantı servisini çalı¸tırıyoruz.ComponentContext") Burada “resolve()” metoduna verdi˘ imiz parametrenin.. s ¸ Burada “createInstanceWithContext()” metodunun iki parametre aldı˘ ına dikkat edin. OpenOffice’ye nasıl ba˘ lanaca˘ ımızı inceleyece˘ iz. a¸a˘ ıda kulg s s s g s g lanaca˘ ımız kavramlara çok takılmayın. “ServiceManager”e s g g ve onun “createInstanceWithContext()” adlı metoduna do˘ rudan yerel ortamımızın bir ö˘ esi g g olarak eri¸ebiliyoruz. s s g Bile¸en Ba˘ lamı kavramını. en ba¸ta “soffice -accept.getComponentContext() Dilerseniz bu metodu bir de˘ i¸kene atayalım.. ikinci parametre ise biraz önce hazırladı˘ ımız “yerel” adlı de˘ i¸kg gs endir. yerel) Bir önceki adımda Bile¸en Ba˘ lamını yerel ortamımıza aktardı˘ ımız için. “bütün bile¸enlerin bir arada bulundu˘ u bir ortam” olarak s g s g dü¸ünebiliriz. ki kullanması kolay olsun: gs >>> yerel = uno.port=2002.host=0.. "com.. yani bütün bile¸enlerin bir arada bulundu˘ u ortamı kendi çalı¸ma alanımıza s g s g s aktardı˘ ımıza göre. “UnoUrlResolver”i kullanabilmek için Servis Yös s neticisinden (yani “ServiceManager”den) ve onun “createInstanceWithContext()” adlı metodundan yararlanarak “ba˘ lantı servisini” çalı¸ır hale getirece˘ iz: g s g >>> baglanti_servisi = yerel. Bu konuya geçmeden önce g g g dilerseniz.ServiceManager. g g . Simdi yapmamız gereken sey..star. ˙ g Ilk parametre “UnoUrlResolver”. bu noktadan sonra OpenOffice’ye ba˘ lanmamızı sa˘ layacak olan “UnoUrlg g g Resolver” adlı servise eri¸meye çalı¸abiliriz.sun. “UnoUrlResolver”i nasıl kullandı˘ ımıza dikkat edin.. s • Ve istedi˘ imiz bir metni belgeye yazdırıyoruz.. bu “bile¸en ba˘ lamını” içe aktarmak. g Simdi gelelim yukarıda sıralanan a¸amaları gerçek hayata aktarmaya.. “com.UnoUrlResolver". Bu i¸lemi.” seklinde yazabildik. s g s • Hemen ardından mevcut belgeye eri¸iyoruz. Bu arada. “uno” modülünün “getg s ComponentContext()” adlı metodu yardımıyla gerçekle¸tirece˘ iz: s g >>> uno. g • Ba˘ lantıyı kurduktan sonra. g s • Daha sonra OpenOffice’ye ba˘ lantı kuruyoruz.getComponentContext() Bile¸en ba˘ lamını.resolve( . Bu arada..sun. s • Belge içinde bir imleç olu¸turuyoruz. ba˘ lantı i¸leminin hangi a¸amalardan olu¸tu˘ unu görelim. "uno:socket.bridge” g OpenOffice API’sinin ö˘ elerinden biridir. g Ba˘ lantı servisini çalı¸ır hale getirdikten sonra “resolve()” metodu yardımıyla OpenOffice’ye g s ba˘ lanma i¸lemini gerçekle¸tirece˘ iz: g s s g >>> baglanti = baglanti_servisi.ServiceManager.urp.Biraz sonra. ¸ s Bu noktada kar¸ımıza “Bile¸en Ba˘ lamı” (Component Context) adı verilen bir kavram çıkıyor.StarOffice.. en ba¸ta “soffice” komutuyla açtı˘ ımız OpenOffice belgesine g s g eri¸memizi sa˘ layacak servisi çalı¸tırıyoruz.bridge.. Bu yüzden komutumuzu “yerel. Bunların ne oldu˘ unu biraz sonra açıklayaca˘ ız: g g g • Önce “uno” modülünü içe aktarıyoruz.star.createInstanceWithContext( . yani bu s ¸ ¸ s g ba˘ lamı yerel ortamımızda kullanılabilir hale getirmektir.” komutuna g s verdi˘ imiz parametreyle hemen hemen aynı oldu˘ una dikkat edin..

"Elveda Zalim Dünya!".insertString(imlec..org g g 3\program” dizini altındayken komut satırında “python” komutunu verirsek...bridge..sun.exe” adlı çalı¸tırılabilir dosyayı ba¸latabilmek için “soffice” komutunu vermi¸tik.frame.. OpenOffice’nin içindeki Python sürümü çalı¸maya ba¸layacaktır..ServiceManager. baglanti) Hemen ardından da mevcut belgeye eri¸iyoruz: s >>> belge = belge_servisi..Desktop". Bu.createTextCursor() Son olarak belgeye bir metin yazdırıyoruz: >>> belge.star. OpenOffice ile birlikte gelen Python sürümünden yararlanmamız gerekiyor. en ba¸ta “soffice. Sistemdeki öbür Python programı Windows’ta OpenOffice ile ba˘ lantı kurmamızı sa˘ layamaz. "uno:socket. “program” dizini altıns s g daki “python.. bu belge içinde bir imleç olu¸turmamız gerekiyor. “C:\Program Files\OpenOffice.createInstanceWithContext( .Text. 0) Microsoft Windows Hatırlarsanız.getComponentContext() >>> baglanti_servisi = yerel.sun. OpenOffice ile birlikte gelen Python sürümüdür ve sisteminizdeki asıl Python’dan farklıdır.org 3\program” dizini altında “python. Bu belgeye s g müdahale edebilmek için. "com.UnoUrlResolver".createInstanceWithContext( . “cd” komutu s yardımıyla “C:\Program Files\OpenOffice. ¸ Dilerseniz bu kodları topluca görelim: >>> import uno >>> yerel = uno..Text.exe” adlı bir dosya göreceksiniz. yine Servis Yöneticisi’nin.urp.. "com.star.host=0.exe” dosyasına çift tıklayarak da OpenOffice’ye özgü Python sürümünü ba¸latas bilirsiniz. yerel) >>> baglanti = baglanti_servisi. baglanti) >>> belge = belge_servisi.sun.ServiceManager.ServiceManager.Text.Ba˘ lantıyı kurduktan sonra.Text..createTextCu