You are on page 1of 269

Python Klavuzu

Srm 3.x

Frat zgl

20/07/2012

IINDEKILER

Temel Bilgiler

1.1

Python Nereden ndirilir?

1.2

Python Nasl altrlr? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

1.3

FreeBSD'de Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.4

Python'un Etkileimli Kabuu ve print() Fonksiyonu . . . . . . . . . . . . . . .

1.5

Python'da Basit Matematik lemleri

1.6

Karakter Dizileri (strings) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

1.7

Deikenler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.8

Python Programlarn Kaydetmek

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

1.9

Python Programlarn altrmak

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

1.10

Python'da lk rnekler... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.11

Kullancyla letiim: input() fonksiyonu . . . . . . . . . . . . . . . . . . . . . . .

Python'da Koula Bal Durumlar

2
5
7
8
11
13
15
18
19
22
29
35

2.1

Giri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.2

if deyimi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.3

elif deyimi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.4

else deyimi

2.5

Basit bir Hesap Makinesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

Python'da Dngler (loops)

35
35
38
40
43
49

3.1

while Dngs (while loop)

3.2

for Dngs (for loop)

3.3

range() Fonksiyonu

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

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

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

Listeler
4.1

Giri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4.2

Listeleri Tanmlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4.3

Listelerin elerine Erimek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

50
55
57
60

60
60
61
i

4.4

len() Fonksiyonu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4.5

Liste elerinde Deiiklik Yapmak

4.6

in Parac ile Aitlik Kontrol

4.7

Listelerin Metotlar

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

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

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

Demetler (Tuples)

86

5.1

Demetleri Tanmlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5.2

Tek eli bir Demet Tanmlamak

5.3

Demetlerin Metotlar

5.4

Demetleme ve Demet zme

5.5

Dnglenebilir Nesneleri zme . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

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

Szlkler
Szlkleri Tanmlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

6.2

Szlklerin Metotlar

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

Kmeler

97
99
112

7.1

Kme Oluturmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

7.2

Kmelerin Metotlar

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

Hata Yakalama

112
114
125

125
129
. 130
. 131
. 132
. 134
. 134
. 135

8.1

try... except...

8.2

break Deyimi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

8.3

pass Deyimi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

8.4

continue Deyimi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

8.5

else... nally...

8.6

except... as... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

8.7

raise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

8.8

Btn Hatalar Yakalamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

Genel Tekrar

137

137
. 139
. 141
. 142
. 144
. 145
. 150
. 152
. 153
. 155
. 157
. 160
. 163

9.1

Python'u Balatma Seenekleri . . . . . . . . . . . . . . . . . . . . . . . . . . . .

9.2

print() Fonksiyonunun Gc . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

9.3

Etkileimli Kabuun Hafzas

9.4

abs(), round(), min() ve max() Fonksiyonlar . . . . . . . . . . . . . . . . . . .

9.5

pow(), divmod() ve sum() Fonksiyonlar . . . . . . . . . . . . . . . . . . . . . .

9.6

Bool Deerleri ve bool() Fonksiyonu . . . . . . . . . . . . . . . . . . . . . . . .

9.7

Bool leleri (Boolean Operators)

9.8

all() ve any() Fonksiyonlar

9.9

Liste reteleri (List Comprehensions)

9.10

Python'da Kodlara Yorum Eklemek

9.11

Karakter Dizilerini Biimlendirme

9.12

enumerate() Fonksiyonu

9.13

Ka Dizileri (Escape Sequences) . . . . . . . . . . . . . . . . . . . . . . . . . .

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

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

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

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

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

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

10 Fonksiyonlar

ii

87
90
91
92
93
97

6.1

10.1

65
71
73
74

Fonksiyon Tanmlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

169

169

10.2

Fonksiyonlarn Parametreleri

10.3

Varsaylan Deerli Argmanlar

10.4

Sral Argmanlar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10.5

simli Argmanlar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10.6

Rastgele Sayda simsiz Argman Verme

10.7

Rastgele Sayda simli Argman Verme

10.8

Gml Fonksiyonlar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10.9

Fonksiyonlarn Kapsam ve global Deyimi . . . . . . . . . . . . . . . . . . . . .

10.10 return Deyimi

174
177
. 179
. 180
. 181
. 187
. 190
. 190
. 194
. 198

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

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

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

10.11 Fonksiyonlarn Belgelendirilmesi

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

11 Modller

201

11.1

Modlleri e Aktarmak (importing modules)

11.2

os ve sys Modlleri

11.3

Kendi Modllerimizi Yazmak

11.4

if __name__ ==  __main__ . . . . . . . . . . . . . . . . . . . . . . . . . .

201
. 207
. 221
. 223

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

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

12 Python'da Dosya lemleri

226

226
228
. 230
. 230
. 230
. 232
. 235
. 236

12.1

Varolan bir Dosyay Okumak zere Amak . . . . . . . . . . . . . . . . . . . . .

12.2

Varolan Bir Dosyay Yazmak zere Amak . . . . . . . . . . . . . . . . . . . . .

12.3

Yeni bir Dosya Oluturmak

12.4

Dosya Silmek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

12.5

seek() ve tell() Metotlar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

12.6

read(), readline(), readlines() Metotlar

12.7

Dosyalarda Karakter Kodlamas (encoding) . . . . . . . . . . . . . . . . . . . .

12.8

kili Dosyalar (Binary Files) . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

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

13 Karakter Dizilerinin Metotlar

238

240
240
. 241
. 241
. 241
. 243
. 244
. 244
. 245
. 246
. 247
. 247
. 247
. 247
. 248
. 249
. 250
. 250
. 251

13.1

startswith Metodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13.2

endswith Metodu

13.3

islower Metodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13.4

isupper Metodu

13.5

replace Metodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13.6

join Metodu

13.7

split Metodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13.8

rsplit Metodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13.9

strip Metodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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

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

13.10 lstrip Metodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


13.11 rstrip Metodu

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

13.12 upper Metodu

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

13.13 lower Metodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


13.14 capitalize Metodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13.15 title Metodu

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

13.16 swapcase Metodu


13.17 istitle Metodu

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

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

13.18 ljust Metodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


13.19 rjust Metodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

iii

251
251
. 252
. 253
. 253
. 254
. 254
. 254
. 254
. 255
. 256
. 256
. 256
. 257
. 257
. 258
. 258
. 258
. 258
. 259
. 259
. 262

13.20 center Metodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


13.21 count Metodu
13.22 nd Metodu

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

13.23 rnd Metodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


13.24 index Metodu

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

13.25 rindex Metodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


13.26 splitlines Metodu
13.27 isalpha Metodu

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

13.28 isdigit Metodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


13.29 isalnum Metodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13.30 isdecimal Metodu
13.31 isidentier Metodu

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

13.32 isnumeric Metodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


13.33 isprintable Metodu

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

13.34 isspace Metodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


13.35 zll Metodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13.36 encode Metodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13.37 expandtabs Metodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13.38 partition Metodu

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

13.39 rpartition Metodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


13.40 str.maketrans ve translate Metotlar . . . . . . . . . . . . . . . . . . . . . . . .
13.41 format Metodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

iv

Uyar:
A
sa
gdaki bilgiler Pythonun 3.x srmleri iindir. E
ger kulland
gnz srm
Pythonun 2.x srmlerinden biriyse s
uradaki belgeleri inceleyebilirsiniz.

Not: E
ger gncel bir Python 3.x srmn anlatan, ama henz daha az bilgi ieren belgelerle
al
smak isterseniz istihza.com/beta/py3/icindekiler_python.html adresini ziyaret edebilirsiniz.

BLM

Temel Bilgiler

Python, Guido Van Rossum adl Hollandal bir programc tarafndan 90l yllarn ba
snda geli
stirilmeye ba
slanm
s bir programlama dilidir. Zannedildi
ginin aksine bu programlama dilinin ad
piton ylanndan gelmez... Guido Van Rossum bu programlama dilini, The Monty Python
adl bir Ingiliz komedi grubunun, Monty Pythons Flying Circus adl gsterisinden esinlenerek
adlandrm
str.
Python, pek ok dile kyasla
grenmesi kolay bir programlama dilidir. Bu yzden, e
ger daha
nce hi programlama deneyiminiz olmam
ssa, programlama maceranza Pythonla ba
slamay
tercih edebilirsiniz.
Python programlarnn en byk zelliklerinden birisi, C ve C++ gibi dillerin aksine, derlenmeye gerek olmadan al
strlabilmeleridir. Pythonda derleme i
slemi ortadan kaldrld
g iin,
Pythonla olduka hzl bir s
ekilde program geli
stirilebilir.
Ayrca Python programlama dilinin basit ve temiz szdizimi, onu pek ok programc tarafndan
tercih edilen bir dil haline getirmi
stir. Pythonun szdiziminin temiz ve basit olmas sayesinde
hem program yazmak, hem de ba
skas tarafndan yazlm
s bir program okumak ok kolaydr.
Pythonu kullanabilmek iin ncelikle onu bilgisayarmza kurmamz gerekiyor. Isterseniz sz
daha fazla uzatmadan Pythonu nereden ve nasl edinebilece
gimizi
grenelim.

1.1 Python Nereden Indirilir?


Pythonun en yeni srm 3.x numaraldr. S
u anda en ok kullanlan ve en yaygn srmler
ise 2.x numaral olanlardr. Pek ok GNU/Linux da
gtmnda Python kurulu olarak gelir. E
ger siz
de bir GNU/Linux kullancs iseniz muhtemelen sisteminizde Python zaten kuruludur. Ancak
sisteminizde kurulu olan bu srm byk ihtimalle Pythonun 2.x numaral bir srmdr.
Windows sistemlerinde ise herhangi bir Python srm kurulu olarak gelmez. Biz bu sitede
Pythonun 3.x srmlerini belgelendirece
giz. Dilerseniz gelin s
imdi Pythonun 3.x srmnn
GNU/Linux ve Windowsta nasl kurulaca
gn ayr ayr inceleyelim:
GNU/Linux Kullanclar
Dedi
gim gibi, e
ger GNU/Linux da
gtmlarndan birini kullanyorsanz sisteminizde muhtemelen
Pythonun 2.x srmlerinden biri zaten kuruludur. Bunu s
u s
ekilde kontrol edebilirsiniz:
Komut satrnda:

python

yazp enter tu
suna bast
gnzda, e
ger kar
snza s
una benzer bir ekran geliyorsa, kurulu srm
2.xtir:
Python 2.6.1+ (r261:67515, Mar 2 2009, 13:10:18)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

Burada 2.6.1+ olarak grnen rakam Pythonun srmn gsteriyor. Bu ktya gre, sisteminizdeki Python srm 2.6.1. Yani sizde Pythonun 2.x numaral bir srm kurulu...
Sisteminizdeki Python srmn
grenmek iin s
yle bir yol da izleyebilirsiniz:
Yine komut satrnda:
python -V

yazp entere bast


gnzda hangi Python srmnn sisteminizde kurulu oldu
gu do
grudan
grnecektir...
E
ger Pythonun 2.x srmleriyle al
smak isterseniz, bu sitede 2.x srmlerine ait belgeler de
bulunmaktadr. Istedi
giniz buysa sizi http://www.istihza.com/icindekiler_python.html adresine
alalm...
E
ger Pythonun 3.x srmn kullanmak isterseniz okumaya devam ediniz...
GNU/Linux kullanclarnn, Pythonun 3.x srmn elde etmek iin tercih edebilece
gi iki yol
vardr. Birincisi ve benim size nerece
gim yol, ncelikle kulland
gnz da
gtmn paket yneticisini kontrol etmenizdir. Python 3.x sisteminizde kurulu olmasa bile, da
gtmnzn depolarnda
bu srm paketlenmi
s halde duruyor olabilir. O yzden sisteminize uygun bir s
ekilde paket
yneticinizi ap orada python s
eklinde bir arama yapmanz neririm. rne
gin Debian tabanl bir GNU/Linux da
gtm kullanyorsanz komut satrnda s
u komutu vererek depolarnzdaki
Python paketlerini listeleyebilirsiniz:
aptitude search python

E
ger bu komutun kts iinde python3 gibi bir s
ey gryorsanz, kurmanz gereken paket
odur... Yine Debian tabanl sistemlerde bu paketi s
u s
ekilde kurabilirsiniz:
sudo apt-get install python3

rne
gin Kubuntu, Debian tabanl bir GNU/Linux da
gtmdr. E
ger Kubuntunun Jaunty Jackalope veya daha st srmlerinden birini kullanyorsanz, yukardaki komut yardmyla python3
paketini sisteminize kurabilirsiniz.
Kulland
gnz da
gtmn depolarnda python3 paketini bulamazsanz, Python 3.xi kaynaktan
kurmanz gerekecektir. Bunun iin yapmanz gereken i
slemler s
yle:
1. ncelikle s
u adresi ziyaret ediyoruz: http://www.python.org/download
2. Bu adreste, zerinde Python 3.x.x compressed source tarball (for Linux, Unix or OS X)
yazan ba
glantya tklyoruz.
3. Ilgili .tgz dosyasn bilgisayarmza indiriyoruz.
4. Daha sonra, bu sk
strlm
s dosyay ayoruz.
5. Alan dosyann iine girip, orada srasyla a
sa
gdaki komutlar veriyoruz:

./configure
make
sudo make altinstall
Bylelikle Python 3.xi sistemimize kurmu
s olduk. Bu arada, yukardaki komutlar vermeden
nce tabii ki sistemimizde gcc ve make adl aralarn kurulu olmas gerekiyor...
Yukardaki kodlarda make install yerine make altinstall komutunu kulland
gmza dikkat
edin. Pythonun kaynak kodlaryla beraber gelen README dosyasnda s
yle bir ibare bulunur:
Installing multiple versions
On Unix and Mac systems if you intend to install multiple versions of Python using
the same installation prefix (prefix argument to the configure script) you must take
care that your primary python executable is not overwritten by the installation of
a different version. All files and directories installed using make altinstall contain
the major and minor version and can thus live side-by-side. make install also
creates ${prefix}/bin/python which refers to ${prefix}/bin/pythonX.Y. If you intend
to install multiple versions using the same prefix you must decide which version (if
any) is your primary version. Install that version using make install. Install all
other versions using make altinstall.
For example, if you want to install Python 2.5, 2.6 and 3.0 with 2.6 being the primary
version, you would execute make install in your 2.6 build directory and make
altinstall in the others.
Birden fazla srm ayn anda kurmak
Unix ve Mac sistemlerinde e
ger birden fazla Python srmn ayn nek ile (configure beti
gine verilen prefix argman) kuracaksanz, farkl bir Python srmne ait
al
strlabilir dosyann, birincil Python srmne ait al
strlabilir dosyay silip zerine yazmamasna dikkat etmelisiniz. make altinstall ile kurulum yapld
gnda btn
dosya ve dizinlerde ana ve alt srm numaralar da ierilecektir. Dolaysyla farkl
srmler yan yana varolabilecektir. make install komutu, ${nek}/bin/pythonX.Y
dosyasna ba
glant veren ${nek}/bin/python adl bir dosya olu
sturacaktr. E
ger
ayn neki kullanarak birden fazla srm kurmak istiyorsanz, hangi srmn (e
ger
olacaksa) birincil srmnz olaca
gna karar vermelisiniz. Birincil srmnz
make install ile kurun. teki btn srmleri ise make altinstall ile...
rne
gin Python 2.5, 2.6 ve 3.0 srmlerini kuracaksanz ve e
ger 2.6 srmnn
birincil srm olmasna karar vermi
sseniz, 2.6 srmnn in
sa dizini iinde make
install komutunu al
strn. teki srmleri ise make altinstall ile kurun.
Bu noktada bir uyar yapmadan gemeyelim: Python zellikle baz GNU/Linux da
gtmlarnda pek ok sistem aracyla sk skya ba
glantldr. Yani Python, kulland
gnz da
gtmn
belkemi
gi durumunda olabilir... Bu yzden Pythonu kaynaktan kurmak baz riskler ta
syabilir.
E
ger yukarda anlatld
g s
ekilde, sisteminize kaynaktan Python kuracaksanz, kar
s kar
sya
oldu
gunuz risklerin farknda olmalsnz...
Kurdu
gumuz yeni Pythonu nasl al
straca
gmz biraz sonra grece
giz. Ama nce Windows
kullanclarnn Python 3.xi nasl kuracaklarna bakalm.
Windows Kullanclar
Windows srmlerinin hibirinde Python kurulu olarak gelmez. O yzden Windows kullanclar,
Pythonu sitesinden indirip kuracak. Bunun iin s
u admlar takip ediyoruz:
1. http://www.python.org/download adresini ziyaret ediyoruz.

2. Orada, zerinde Python 3.x.x Windows installer (Windows binary does not include
source) yazan ba
glantya tklyoruz.
3. .msi uzantl dosyay bilgisayarmza indiriyoruz.
4. Inen dosyaya ift tklayp normal bir s
ekilde kurulumu gerekle
stiriyoruz.
5. E
ger ne yapt
gnzdan emin
de
gi
stirmemenizi neririm...

de
gilseniz,

kurulum

srasnda

varsaylan

ayarlar

Windowsta Python kurulumu bu kadar basittir. Artk bilgisayarmza kurdu


gumuz Python programn nasl al
straca
gmz grebiliriz...

1.2 Python Nasl al


strlr?
Bir nceki blmde, Pythonu nasl kuraca
gmz farkl platformlara gre anlattk.
Bu
blmde ise kurdu
gumuz bu Python programn hem GNU/Linuxta hem de Windowsta nasl
al
straca
gmz grece
giz. ncelikle GNU/Linux kullanclarnn Pythonu nasl al
straca
gna
bakalm...
GNU/Linux Kullanclar
GNU/Linux kullanclar, e
ger paket yneticilerini kullanarak Python kurulumu gerekle
stirmi
s
iseler, komut satrnda s
u komutu vererek Pythonu ba
slatabilirler:
python3

Bu komutun ardndan s
una benzer bir ekranla kar
sla
sm
s olmalsnz:
Python 3.0.1+ (r301:69556, Feb 24 2009, 13:51:44)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

Grd
gnz gibi, kulland
gmz Python srm 3.0.1...
Burada, paket yneticisinden kurdu
gunuz paketin adnn python3 oldu
gunu varsayyorum.
D
sk bir ihtimal de olsa bu paketin ad sizde farkl olabilir. rne
gin Python3 sizin sisteminizde
farkl bir ad altnda geiyor olabilir. Mesela, python3.0 gibi...
E
ger paketin ad python3.0 ise komut satrnda s
u komutu vermelisiniz:
python3.0

Bu komut da benzer bir s


ekilde s
yle bir kt vermeli:
Python 3.0.1+ (r301:69556, Feb 24 2009, 13:51:44)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

Pythonu ne s
ekilde ba
slataca
gnz kesin olarak tespit etmek iin /usr/bin adl klasrn iinde
python programnn hangi adla yer ald
gna bakabilirsiniz. Bu klasrn iinde python
d
snda, adnda python geen hangi programlarn oldu
gunu kontrol edin. Mesela s
unlar olabilir: python3, python3.0, python3.0.1
E
ger Python3 kaynaktan kuranlardansanz, verece
giniz komut muhtemelen s
u olacaktr:
python3.0

GNU/Linuxta Pythonu nasl al


straca
gmz
grendi
gimize gre, Windows kullanclarnn durumuna bakabiliriz...
Windows Kullanclar
Gelelim Windows kullanclarna...
Windows kullanclar Python3 iki s
ekilde ba
slatabilir:
1. Ba
slat > Programlar > Python3.x > Python (Command Line)* yolunu takip ederek.
2. Python3.xi YOLa (PATH) ekledikten sonra DOS ekrannda python komutunu vererek...
E
ger birinci yolu tercih ederseniz, Pythonun size sundu
gu komut satrna ula
srsnz. Ancak
Python komut satrna bu s
ekilde ula
st
gnzda baz kstlamalarla kar
s kar
sya kalrsnz. O
yzden komut satrna bu s
ekilde ula
smak yerine ikinci seene
gi tercih edebilirsiniz.
E
ger sisteminizde birka farkl Python srm kurulu ise ve e
ger siz bu eski srmlerden birini YOLa eklemi
sseniz, Python3.0 YOLa eklemeyin. Sisteminde sadece Python3.0
kurulu olan Windows kullanclar Pythonu YOLa nasl ekleyeceklerini
grenmek iin
http://www.istihza.com/py2/windows-path.html adresindeki makaleyi inceleyebilirler. (Orada
Python26 yerine Python30 ifadesi gelecek...)
Sisteminizde sadece Python3.0 srmnn kurulu oldu
gunu ve bu srm ba
saryla YOLa
ekledi
ginizi varsayarak bir deneme yapalm. Ba
slat > al
str yolunu takip ederek, alan
pencerede cmd komutunu verelim ve Windows komut satrna ula
salm. Orada s
u komutu
verelim:
python

E
ger sisteminizde ba
ska bir Python srm kurulu de
gilse veya siz kurulu olan srm daha
nceden YOLa eklememi
sseniz, yukardaki komutu verdi
ginizde Python3.0 al
smaya ba
slayacaktr. S
una benzer bir kt almalsnz:
Python 3.0.1 (r301:69561, Feb 13 2009, 20:04:18) [MSC v.1500 32 bit (Intel)] on
win32 Type "help", "copyright", "credits" or "license" for more information.
>>>

E
ger sisteminizde eski bir Python srm kuruluysa ve siz bu srm daha nceden YOLa
eklemi
sseniz, python komutunu verdi
ginizde Python3 yerine, sistemimizdeki eski Python
srm alacaktr.
nk Windowstaki btn Python srmlerinin al
strlabilir (exe)
dosyalar python.exe s
eklinde adlandrld
g iin, DOS ekrannda yazaca
gnz python komutu eski srm al
stracaktr. Dedi
gim gibi, e
ger eski srm nceden YOLa eklemi
sseniz,
yeni kurdu
gunuz Python3 YOLa eklemeyin. Bunun yerine, basit bir .bat dosyas yazmamz
yeterli olacaktr. Nasl m?
Notepad yardmyla bo
s bir metin belgesi an ve bu metin belgesinin iine s
u satr ekleyin:
@c:\python30\python.exe %*

S
imdi bu dosyay python3.bat adyla kaydedin ve daha nce YOLa ekledi
giniz eski srm
Pythonun bulundu
gu klasrn iine atn (mesela C:python26).
Artk cmd ile ula
st
gnz komut satrnda sadece python3 yazp entere basarak Python3
al
strabilirsiniz. Sadece python komutu verdi
ginizde ise sisteminizdeki eski srm Python
alacaktr. Tabii ki bu eski srm daha nceden YOLa eklemi
s iseniz...
Bu arada, olu
sturdu
gunuz .bat dosyasn Python26 klasrnn iine atmak yerine, Pythona
ili
skin .bat dosyalarn zel bir klasrde toplayp bu klasr YOLa ekleyerek de i
sinizi halledebilirsiniz. rne
gin benim Windows ykl bilgisayarmda Pythonun 2.5, 2.6 ve 3.0 srmleri
birlikte kurulu... Ben yol adn verdi
gim bir klasr olu
sturup bu klasr C: dizininin iine

attm. Daha sonra C:\yol dizinini YOLa ekledim. Ardndan Python2.5 ve Python3.0 srmleri
iin iki ayr .bat dosyas olu
sturdum. Bunlardan birini python25.bat, tekini de python3.bat
olarak adlandrdm. python25.bat dosyasnn ieri
gi s
yle:
@c:\python25\python.exe %*

python3.bat dosyasnn ieri


gi ise s
yle:
@c:\python30\python.exe %*

Bu s
ekilde, cmd ile ula
st
gm komut satrnda python3 komutunu verdi
gimde Python3.0
srmnn ekran alyor:
Python 3.0.1 (r301:69561, Feb 13 2009, 20:04:18) [MSC v.1500 32 bit (Intel)] on
win32 Type "help", "copyright", "credits" or "license" for more information.
>>>

E
ger python25 komutunu verirsem, Python2.5 srmne ait komut ekran alyor:
Python 2.5.4 (r254:67916, Dec 23 2008, 15:10:54) [MSC v.1310 32 bit (Intel)] on
win32 Type "help", "copyright", "credits" or "license" for more information.
>>>

Python2.6 srmne ise sadece python yazarak ula


sabiliyorum:
Python 2.6.1 (r261:67517, Dec 4 2008, 16:51:00) [MSC v.1500 32 bit (Intel)] on
win32 Type "help", "copyright", "credits" or "license" for more information.
>>>

Isterseniz siz de byle bir al


sma s
ekli benimseyebilirsiniz...

1.3 FreeBSDde Python


Yukarda Python 3.xin GNU/Linux ve Windows sistemlerine nasl kurulaca
gn ve nasl
al
strlaca
gn anlattk. Pythonun FreeBSD sistemine nasl kurulaca
gn
grenmek isterseniz
http://www.istihza.com/denemeler/freebsd.7z adl dosyay indirerek, bu sk
strlm
s klasr iindeki video dosyalarn izleyebilirsiniz. Klasr iinde ayrca FreeBSD kurulumunu gsteren bir
video da bulunuyor. FreeBSD zerinde Pythonun nasl kurulup kullanlaca
gna ili
skin videolar
hazrlayan Mahmut etine te
sekkr ederim.
giniz
Videolar 7z adl yazlmla sk
strdm. Videolarn zgn boyutu toplam 223 MBdir. Indirece
sk
strlm
s klasrn boyutu 7z yardmyla 2 MBye kadar azaltlm
str.
Ubuntu GNU/Linux kullanclar bu dosyay aabilmek iin s
u komut yardmyla 7z yazlmn
sistemlerine kurabilir:
sudo apt-get install p7zip-full

Yazlm kurduktan sonra sk


strlm
s dosyaya sa
g tklayp buraya a seene
gi yardmyla
dosyay aabilirsiniz.
Windows kullanclar ise gerekli yazlm http://www.7-zip.org/ adresinden indirebilir.

ve print() Fonksiyonu
1.4 Pythonun Etkile
simli Kabugu
Bir nceki blmde Pythonun farkl sistem ve durumlarda nasl al
strlaca
gn grm
s,
Pythonu anlatt
gmz s
ekilde al
strd
gnz zaman kar
snza s
una benzer bir ekrann gelece
gini
sylemi
stik:
Python 3.0.1+ (r301:69556, Feb 24 2009, 13:51:44)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

Bu ekrana Python dilinde etkile


simli kabuk (interactive shell) ad verilir. Bu, bizim Python
programlama dili ile ili
ski kurabilece
gimiz, yani onunla etkile
sebilece
gimiz bir st katmandr.
Etkile
simli kabuk, asl programmz iinde kullanaca
gmz kodlar deneme imkan sunar bize...
Buras bir nevi test alan gibidir. rne
gin bir Python kodunun al
sp al
smad
gn denemek
veya nasl al
st
gn, ne sonu verdi
gini grmek istedi
gimizde bu ekran son derece faydal bir
ara olarak kar
smza kar. Isterseniz konuyu daha fazla lafa bo
gmayalm. Zira etkile
simli
kabu
gu kullandka bunun ne byk bir nimet oldu
gunu siz de anlayacaksnz. zellikle derlenerek al
strlan programlama dilleri ile u
gra
sm
s olan arkada
slarm, etkile
simli kabu
gun
gcn grdklerinde, gz ya
slarna hakim olamayacaklar...
S
imdi kendi sistemimize uygun bir s
ekilde etkile
simli kabu
gu al
stryoruz. Bu ekrana nasl
ula
saca
gmz bir nceki konuda ayrntl olarak anlatm
stk. Etkile
simli kabu
ga ula
smak
konusunda sknt ya
syorsanz bir nceki konuyu tekrar gzden geirmenizi tavsiye ederim.
Etkile
simli kabu
gu al
strd
gmzda ekranda grnen >>> i
sareti Pythonun bizden komut
almaya hazr oldu
gunu gsteriyor. Python kodlarmz bu >>> i
saretinden hemen sonra, hi
bo
sluk brakmadan yazaca
gz. Isterseniz basit bir deneme yapalm. >>> i
saretinden hemen
sonra, hi bo
sluk brakmadan s
u komutu yazyoruz:
print("Merhaba Zalim Dnya!")

Bu komutu yazp enter tu


suna bast
gmzda, e
ger herhangi bir yazm hatas yapmam
ssak,
s
yle bir kt alm
s olmalyz:
Merhaba Zalim Dnya!

Grd
gnz gibi, print() adl fonksiyon, ekrana kt vermemizi, yani yaz yazdrmamz
sa
glyor... Bu arada, bu fonksiyon kelimesine fazla taklmayn. Ilerde bunun ne demek oldu
gunu ayrntl bir s
ekilde inceleyece
giz. S
imdilik print() ifadesinin bir fonksiyon
oldu
gunu bilmemiz yeterli olacaktr.
Burada dikkat etmemiz gereken baz noktalar var:
Komutumuzu >>> i
saretinden hemen sonra veriyoruz. Pythona yeni ba
slayanlarn en sk
yapt
g hatalardan bir tanesi, print()in psi ile >>> i
sareti arasnda bir bo
sluk brakmalardr. E
ger p harfi ile >>> i
sareti arasnda bo
sluk brakrsak, Python bize bir hata
mesaj gsterecektir. O yzden bo
sluklara dikkat ediyoruz...
print() fonksiyonunu olu
sturan btn harflerin kk oldu
guna dikkat edin. Python asndan, print ve Print kelimeleri birbirinden farkldr. Bizim fonksiyonumuzun ad print()tir.
Ba
ska bir s
ey de
gil...
print() fonksiyonunda, parantez iindeki ifadenin trnak iinde gsterildi
gine zellikle dikkat
ediyoruz. Burada ift veya tek trnak kullanmamz nemli de
gildir. Yani yukardaki kodu s
yle
de yazabiliriz:

print(Merhaba Zalim Dnya!)

Yalnz dikkat etmemiz gereken s


ey, hangi trnakla ba
sladysak onunla bitirmemiz gerekti
gidir.
Yani e
ger ba
sta ift trnak kullandysak, sonda da ift trnak kullanmalyz. Ayn s
ey tek trnak iin de geerlidir. Yani Python asndan tek veya ift trnak kullanmamzn de
gil, tutarl
olmamzn nemi vardr. Peki neden iki farkl trnak e
sidi var?
Ekrana s
yle bir kt vermek istedi
gimizi varsayn:
Python programlama dilinin ad piton ylanndan gelmez...
Yukardaki kty alabilmek amacyla etkile
simli kabukta >>> i
saretinden hemen sonra
a
sa
gdaki komutu verip enter tu
suna basn. Bakalm ne olacak?
print("Python programlama dilinin ad "piton" ylanndan gelmez...")

Ne oldu? Bu komut bize sinir bozucu bir hata mesaj verdi, de


gil mi?
File "<stdin>", line 1
print("Python programlama dilinin ad "piton" ylanndan gelmez...")
^
SyntaxError: invalid syntax

Dikkat ederseniz, yukardaki hata mesajnda piton kelimesinin hemen altnda minik bir ok
i
sareti grnyor. Bu ok i
sareti, ortaya kan hatann nerede oldu
gu konusunda bize ipucu
veriyor. Buradaki hata, trnak i
saretlerinin kullanmndan kaynaklanyor. Biz cmlemize ift
trnak ile ba
sladk. Ama cmle iinde piton kelimesinde de birer adet ift trnak kullandk.
Ayrca cmlemizi de ift trnak ile bitirdik. I
ste bu noktada Pythonun kafasnn kar
smasna
neden olduk. Python byle bir yap ile kar
sla
st
gnda, piton kelimesinin ba
sndaki ift trnak nedeniyle cmlenin nerede ba
slayp nerede bitti
gini anlayamyor. Ilk ift trnaktan sonra
grd
g ikinci ift trna
gn cmle sonu oldu
gunu zannediyor. Ama piton kelimesinin sonunda da bir ift trnak oldu
gunu grnce bir s
eylerin ters gitti
gini d
snyor ve bize bir hata
mesaj gsteriyor. Zaten grd
gnz gibi, ok i
sareti de bu nc ift trna
gn oldu
gu yerde
duruyor. Yani Pythonun kafas tam olarak o noktada kar
sm
s... Bize d
sen grev, Pythonun
kafa kar
skl
gn gidermek. Bunu s
yle yapabiliriz:
>>> print(Python programlama dilinin ad "piton" ylanndan gelmez...)
Python programlama dilinin ad "piton" ylanndan gelmez...

Grd
gnz gibi, bu komutta, hatay nlemek iin cmlemize tek trnak ile ba
sladk ve cmlemizi tek trnak ile bitirdik. Cmle iindeki piton kelimesini ise ift trnak ile gstererek
kar
skl
g nledik. Bylece bu komutla istedi
gimiz kty alm
s olduk...
Demek ki, Pythonda ekrana kt verirken, trnak i
saretlerini dikkatli kullanyoruz.
Bu arada yukardaki kodlar iinde grnen >>> i
saretini siz yazmayacaksnz. Bu i
sareti
etkile
simli kabu
gun grnmn temsil etmek iin yerle
stirdik oraya... Siz ilk satr yazdktan
sonra do
gruca enter tu
suna basacaksnz.
S
imdi s
u cmleye bakalm:
Pythonu yazan ki
si Guido Van Rossum adl bir programcdr...
Acaba bu cmleyi, print() fonksiyonunu kullanarak ekrana nasl yazdrmalyz? Evet, tam
tahmin etti
giniz gibi:
>>> print("Pythonu yazan ki
si Guido Van Rossum adl bir programcdr...")
Pythonu yazan ki
si Guido Van Rossum adl bir programcdr...

Pythonu kelimesinde geen ayra i


sareti nedeniyle cmlemize tek trnakla ba
slamyoruz.
E
ger cmleye tek trnakla ba
slarsak, Python o tek trnak i
sareti yznden, cmlenin nerede
ba
slayp nerede bitti
gini anlayamayacak ve bize bir hata kts verecektir. I
ste biz de bunu
nlemek iin yukardaki gibi bir nlem alyoruz...
Grd
gnz gibi, Pythonun hem ift trna
ga hem de tek trna
ga msaade etmesi bize baz
durumlarda byk bir kolaylk sa
glyor. Demek ki birden fazla trnak kullanlmas bo
suna de
gil...
E
ger ekrana herhangi bir s
ey yazdrmak yerine, bir satr bo
sluk brakmak isterseniz, print()
fonksiyonunu bo
s olarak kullanabilirsiniz. Yani s
yle:
>>> print()

Bu komutu verip entere bast


gmzda etkile
simli kabu
gun bir bo
sluk brakp alt satra geti
gini
gryoruz...
Etkile
simli kabukta al
srken, print() fonksiyonunu kullanmasak da yazd
gmz cmleler
ekrana kt olarak verilecektir.
Yani s
yle bir kullanm etkile
simli kabukta al
srken
mmkndr:
>>> "Ltfen kullanc ad ve parolanz giriniz"
Ltfen kullanc ad ve parolanz giriniz

Grd
gnz gibi, print() fonksiyonunu kullanmasak da ekrana kt alabiliyoruz. Ama bu
durum sizi yanltmasn. Bu zellik sadece etkile
simli kabu
ga mahsustur. Ilerde kodlarmz
dosyalara yazp kaydetti
gimiz zaman, ekrana kt verebilmek iin mutlaka print() fonksiyonunu kullanmamz gerekir. E
ger programlarmz iindeki cmleleri print() fonksiyonu ile
kullanmazsak, program al
strd
gmzda, yazd
gmz cmleyi Python grr, ama biz ve kullanclarmz gremeyiz!
Bu arada print() fonksiyonu ile veya onsuz yazd
gmz cmlelerdeki Trke karakterlerin ktda herhangi bir soruna sebep olmad
gna dikkat edin. print() fonksiyonu olmadan yazlan
cmlelerdeki Trke karakterlerin dzgn grnmesi, Python 3.x ile gelen bir zelliktir. E
ger
yukardaki cmleyi Pythonun 2.x srmlerinden birinde verseydik, s
yle bir tabloyla kar
sla
sacaktk:
>>> "Ltfen kullanc ad ve parolanz giriniz"
L\xc3\xbctfen kullan\xc4\xb1c\xc4\xb1 ad\xc4\xb1 ve parolan\xc4\xb1z\xc4\xb1 giriniz

Bunun d
snda, bu blmde
grendi
gimiz print() fonksiyonu da Python 3.xle birlikte mutasyon geiren zelliklerden biridir. Bu yazda
grendi
gimiz:
print("Merhaba Zalim Dnya!")

komutunu Pythonun 3.x ncesi srmlerinde:


print "Merhaba Zalim Dnya"

s
eklinde yazyorduk...
Bylece Pythonda print() fonksiyonunun ne oldu
gunu ve ne i
se yarad
gn
grenmi
s olduk. Ilerde kodlarmz dosyalara kaydetti
gimiz zaman bu fonksiyonu bol bol kullanaca
gz. Bu konuyu
bitirdi
gimize gre, artk yeni bir konuya geebiliriz.

1.5 Pythonda Basit Matematik Is


lemleri
Bir nceki blmde nasl ba
slataca
gmz ve nasl kullanaca
gmz
grendi
gimiz etkile
simli
kabuk zerinde biraz daha al
smaya devam edece
giz. Etkile
simli kabuk aslnda Pythonda
asl al
sma ortammz de
gildir. Kodlarmz esas olarak dosyalara kaydedece
giz. Ama etkile
simli kabuk bize, asl programlarmz yazmaya ba
slamadan nce Pythona a
sinalk kazanma
frsat verecek... Etkile
simli kabuk; kod al
strmas yapma ve kodlar test etme gibi i
slerimiz iin
harika bir aratr.
Bu blmde, Pythonda basit matematik i
slemlerini nasl yapabilece
gimizi
grenece
giz.
Pythonla hi bir s
ey yapamasak bile, onu basit bir hesap makinesi yerine kullanabiliriz. S
imdi
etkile
simli kabu
gu ap al
smaya ba
slayalm:
>>> 5 + 2
7

Grd
gnz gibi, Python matematikten anlyor.. stelik yukardaki kodda bize yabanc gelecek hibir
ge yok. Tpk bildi
gimiz matematikte oldu
gu gibi, + i
sareti toplama anlamna
geliyor. Bir de s
una bakalm:
>>> 3457 - 2456
1001

Burada da bir sknt yok. Her s


ey sradan... Peki arpma ve blme i
slemleri iin ne kullanaca
gz? Onlara da bakalm:
arpma i
slemi iin * i
saretini kullanyoruz:
>>> 6 * 5
30

Blme i
slemi iin ise / i
saretini:
>>> 5 / 2
2.5

Python iin, i
sleme alnan saylarn bykl
g kkl
g nemli de
gildir. Python ok byk
(veya ok kk) saylar hibir sorun karmadan arpabilir, toplayabilir, karabilir veya
blebilir...
Yalnz, birden fazla matematik i
slemini ayn anda yaparken bir konuya dikkat etmemiz gerekir.
Mesela size s
yle bir soru soralm: Sizce a
sa
gdaki i
slemin sonucu katr?:
>>> 5 * 2 + 4 / 2

E
ger yukardaki i
slemin sonucu bekledi
giniz gibi kmadysa, i
slem nceli
gi (operator precedence) denen kavram gzard etmi
ssiniz demektir. Matematik derslerinden hatrlad
gmz
i
slem nceli
gi kural Pythonda da geerlidir. Bu kurala gre; arpma ve blme i
slemleri,
toplama ve karma i
slemlerinden nce yaplr. Yani yukardaki ifadede nce 5 * 2 i
slemi,
ardndan 4 / 2 i
slemi yaplacak, daha sonra bu iki i
slemin sonucu birbiriyle toplanacaktr.
Pythonun kulland
g i
slem srasn de
gi
stirmek iin parantez i
saretlerinden yararlanabilirsiniz.
rne
gin yukardaki i
slemin 7 sonucunu vermesi iin ifadeyi s
yle dzenlemeniz gerekir:

>>> (5 * 2 + 4) / 2
7.0

ncelikli olarak yaplmasn istedi


gimiz i
slemleri parantez iine ald
gmza dikkat edin. Bu s
ekilde, nce 5 ile 2 says arplacak, ardndan bu i
slemin sonucuna 4 eklenecek ve kan
de
ger 2ye blnecektir.
Matematik i
slemleri yaparken, bu s
ekilde parantezler kullanarak i
slemin istedi
giniz gibi sonu
vermesini garanti edebilirsiniz.
S
imdiye kadar Pythonda +, -, * ve / i
saretlerini grdk. Bu i
saretlere i
sle (operator)
ad verilir. Gelin isterseniz Pythonda daha ba
ska hangi faydal i
slelerin oldu
guna bir gz
gezdirelim:
% i
sleci
Bir blme i
sleminde, kalan sayy bulmak iin % i
saretinden yararlanyoruz:
>>> 5 % 2
1

Demek ki 5 saysn 2ye bld


gmzde, blme i
sleminden artan say, yani kalan, 1
oluyormu
s...
Bir de s
u i
slemin sonucuna bakalm:
>>> 10 % 2
0

Kalan 0 oldu
guna gre, demek ki 10 says 2ye tam blnyormu
s... Peki bu bilgi bizim
ne i
simize yarar? Mesela % adl i
slecin verdi
gi sonuca bakarak, saylarn ift mi yoksa tek mi
oldu
gunu denetleyebiliriz. herhangibirsay % 2 i
sleminin sonucu 0 ise o say ifttir. E
ger
sonu 1 ise o say tektir... E
ger ilkokul
grencilerine basit matematik kavramlarn
greten
bir program yazmay planlyorsanz bu i
sle i
sinize yarayacaktr. Hatta ileride bu i
slecin hi
tahmin etmedi
giniz yerlerde de i
sinize yarayaca
gn grrseniz s
a
srmayn...
// i
sleci
Pythonda kullanabilece
gimiz ba
ska bir i
sle ise s
udur: //. Bu i
sle, bir blme i
sleminde
sonucun sadece tamsay ksmn almamz sa
glar. Hemen bir rnek vererek durumu somutla
stralm:
>>> 9 // 2
4

Grd
gnz gibi, sonu tamsay s
eklinde. Yani sonucumuz ondalk ksm iermiyor. Normalde
9 says 2 saysna blnd
gnde s
u sonucu elde ederiz:
>>> 9 / 2
4.5

Ayn i
slemi 9 // 2 s
eklinde yapt
gmzda ise ondalk ksm atlr, ekrana sadece tamsay ksm
verilir... Ilk bak
sta bu i
sle ok manal gelmeyebilir, ama ileride mutlaka, ondalk say yerine
tamsay elde etmek istedi
giniz durumlarla kar
sla
sacaksnzdr.
** i
sleci

Bu i
sle, bir saynn kuvvetlerini hesaplamak iin kullanlr. sl saylar bulmak iin bu i
sleten
yararlanaca
gz. rne
gin:
>>> 2 ** 3
8

Demek ki 2 saysnn nc kuvveti 8 imi


s... Mesela 1453 saysnn karesini s
yle bulabiliriz:
>>> 1453 ** 2
2111209

Ya da 15 saysnn 3. kuvvetini s
yle bulabiliriz:
>>> 15 ** 3
3375

Pythonda bunlarn d
snda daha pek ok i
sle bulunur. Ama ilerinde s
u anda en ok i
simize
yarayacak, en temel i
sleler bunlardr. Ilerde teki i
sleleri de inceleyece
giz.
S
u ana kadar Pythonun temellerine ili
skin pek ok s
ey syledik. rne
gin en temel
gelerden
biri olan print() fonksiyonunu ve bu fonksiyonun ne i
se yarad
gn
grendik. Bunun yansra
Pythonda saylarn kullanmna da s
yle bir gz gezdirdik. print() fonksiyonunu i
slerken,
bu fonksiyonun ekrana kt vermek iin kullanld
gn, bu fonksiyonla birlikte kulland
gmz
cmleleri trnak iine almamz gerekti
gini sylemi
stik. Yalnz bu blmde dikkatinizi ekti mi
bilmiyorum, ama farkettiyseniz yukardaki kodlarn hibirinde trnak i
sareti kullanmadk. S
imdi
gelin isterseniz bunun nedenlerini tart
salm...

1.6 Karakter Dizileri (strings)


Pythonda ok nemli iki adet
ge vardr. Bunlardan biri karakter dizileri (strings), ikincisi
ise saylardr (numbers). Saynn ne oldu
gu adndan belli. Peki bu karakter dizisi denen
s
ey de ne oluyor? Aslnda print() fonksiyonunu anlatrken karakter dizilerini kullandk. Yalnz orada kafa kar
strmamak iin karakter dizisi yerine cmle deyip gemi
stik. S
imdi ise
sizlere hakikati sylemenin zaman geldi dostlar! Evet, daha nce cmle dedi
gimiz s
ey
esasnda Pythoncada karakter dizisidir. Ingilizce konu
sanlar buna string diyor... Peki
karakter dizisi denen s
eyi grd
gmzde nasl tanyaca
gz? Tabii ki tipine bakarak... Pythonda
karakter dizileri trnak iinde gsterilir. Yani s
u a
sa
gda grd
gmz s
ey bir karakter dizisidir:
"Merhaba Zalim Dnya!"

Bu karakter dizisini ekrana yazdrmak iin, bildi


giniz gibi s
u komutu kullanyoruz:
print("Merhaba Zalim Dnya!")

Yani karakter dizisi; iinde bir veya daha fazla sayda karakter barndran bir dizidir.
Dolaysyla bir
seyin karakter dizisi olabilmesi iin birden fazla karakter ieriyor olmas s
art
de
gildir. Pythonda tek bir karakter dahi, karakter dizisi snfna girer. Bu sebeple a
sa
gdaki

sey de bir karakter dizisidir:


"c"

Hatta bir s
eyin karakter dizisi olabilmesi iin harf olmas da gerekmez. Kabaca sylemek
gerekirse, trnak iinde gsterebilece
gimiz her s
ey bir karakter dizisir. Bo
sluk karakteri de
dahil...
Karakter dizilerini anladk saylr. Saylar ise zaten adndan tr rahatlkla anlayabiliyoruz.
Mesela s
u rnek bir saydr:
12354

Ama dikkat edin! S


u rnek bir say de
gildir:
"12354"

Trnak iinde gsterilen 12354 bir karakter dizisidir. Dedi


gimiz gibi, Pythonda trnak iinde
gsterilen her s
ey bir karakter dizisidir. Karakter dizilerini basite byle ayrt edebiliriz. Bu
durumu s
u rneklerle teyit edelim:
>>> 12354 + 3444
15798

Isterseniz bunu bir de print() fonksiyonu ile gsterelim. Zaten normalde hep bu s
ekli kullanmamz yararl olacaktr:
>>> print(12354 + 3444)
15798

Bir de s
una bakalm:
>>> print("12354 + 3444")
12354 + 3444

Grd
gnz gibi, bu defa ktmz farkl oldu. Neden? nk dedi
gimiz gibi, trnak i
sareti olmayan 12354 veya 3444 birer saydr, ama trnak i
sareti olan 12354 veya 3444 birer karakter dizisidir. Aritmetik i
slemleri saylarla yaplr, karakter dizileriyle de
gil... Dolaysyla Python,
Merhaba Zalim Dnyaya nasl davranyorsa, 12354 + 3444e de ayn s
ekilde davranyor.
Bunun iin Pythonu sulayamayz...
Hatta s
yle ilgin bir rnek de verebiliriz:
>>> print("12354" + "3444")
123543444

Grd
gnz gibi, iki tane karakter dizisiyle kar
sla
san Python (12354 ve 3444), art (+)
i
saretini bu iki karakter dizisini birle
stirmek iin kulland. E
ger art i
saretinin beraber kullanld
g

geler birer say olsayd, Python bunlar yan yana yazmak yerine, birbirleriyle toplayacakt.
Yukardaki rneklerin bize gsterdi
gi gibi, baz i
sleler, birlikte kullanldklar
gelerin tipine
gre farkl anlamlar ta
syabilir. Yukarda da s
ahit oldu
gumuz gibi, e
ger sz konusu olan s
ey
saylar ise, art i
sareti bir aritmetik i
slem yaplmasn sa
glayacaktr. Ama e
ger sz konusu
olan s
ey karakter dizileri ise, art i
sareti bu karakter dizilerini bir araya getirme grevi grecektir. Mesela daha nce arpma i
slemlerinde kulland
gmz * i
sareti de birlikte kullanld
g

gelerin tipine gre farkl anlamlar ta


syabilir:
>>> print("yava
s"*2)
yava
syava
s

Python burada yava


s karakter dizisini iki kez tekrar etti. Ama dikkat ederseniz, yava
s adl
karakter dizisini tekrar ederken araya bo
sluk koymad. Tabii ki Python bizim ne istedi
gimizi
bilemez. Pythonun istedi
gimizi yapabilmesi iin bizim ona yardmc olmamz gerekir. Yukardaki kodlar s
yle yazarsak, kt daha dzgn grnecektir:
>>> print("yava
s "*2)
yava
s yava
s

yava
s adl karakter dizisinin kapan
s trna
gn koymadan nce bir bo
sluk brakarak emelimize
ula
stk... Python ktda o bo
sluk karakterini de grece
gi iin, iki tane yava
s kelimesi ktda
bo
sluklu olarak grnecektir.
Yalnz baz durumlarda karakter dizisinin sonuna byle bo
sluk eklemek mmkn olmayabilir.
E
ger yle bir durumla kar
sla
srsak, s
yle bir s
ey de yapabiliriz:
>>> print(("yava
s" + " ")*2)
yava
s yava
s

Grd
gnz gibi, burada sanki bir matematik i
slemi yapar gibi, parantezleri kullanarak
Pythona yol gsterdik. Matematikteki i
slem nceli
gi kuralnn burada nasl i
sledi
gine dikkat
edin.
Karakter dizileri (strings) tabii ki yukarda anlattklarmzla snrl de
gildir. Ama s
imdilik bizim
bilgimiz snrl oldu
gu iin, Pythondaki karakter dizilerinin btn imkanlarn burada nnze
seremiyoruz. Pythonla ilgili birka s
ey daha
grendikten sonra karakter dizilerini etkili bir
s
ekilde kullanmay da
grenece
giz. Zira karakter dizileri, Pythonun en gl oldu
gu alanlardan
birisidir.
Bu konuyu da bylece tamamlam
s olduk. Henz sylenmesi gereken her s
eyi syleyemedik,
ama Pythonda sa
glam bir temel atmammz sa
glayacak pek ok nemli bilgiyi konular arasna
serpi
stirdik. Bu ilk blmleri sindire sindire al
smak, ilerde kemikli konular daha kolay
gtmemizi sa
glayacaktr.
Bir sonraki blmde, Pythonda hareket kabiliyetimizi bir hayli artracak bir konuyu inceleyece
giz: De
gi
skenler

skenler
1.7 Degi
Bir nceki blmn sonunda da belirtti
gimiz gibi, de
gi
skenler Pythondaki esnekli
gimizi,
hareket kabiliyetimizi bir hayli artracak olmas bakmndan epey nemli bir konudur. Bu
konuyu i
sledikten sonra, artk asl al
sma alanmz olan dosyalara geebilecek kadar bilgi
sahibi olmu
s olaca
gz. Yani bu konuyu da atlattktan sonra gerek anlamda ilk programlarmz
yazmaya ba
slayabilece
giz.
Biz burada de
gi
sken kavramn tanmlamaya u
gra
smakla vakit kaybetmeyece
giz. Bir ksmmz bu kavrama zaten pek de yabanc de
giliz. br ksmmz ise verdi
gimiz ilk rnekte
bunun ne oldu
gunu, ne i
se yarad
gn derhal anlayacaktr... Dolaysyla bir an nce rneklerimize geelim:
Mesela s
u rne
ge bir bakalm:
>>> n = 10

Burada n adl bir ifadeye, 10 de


gerini atadk. Yani, de
geri 10 olan n adl bir de
gi
sken
tanmladk. Artk n de
gi
skeninin de
gerine s
u s
ekilde ula
sabiliriz:

>>> print(n)
10

Grd
gnz gibi, 10 de
gerini elde etmek iin n de
gi
skenini ekrana yazdrmamz yeterli
oluyor.
Bu s
ekilde bir de
gi
sken tanmladktan sonra, bu de
gi
skeni trl s
ekillerde kullanabiliriz.
rne
gin bu de
gi
skenle matematik i
slemleri yapabiliriz:
>>> print(n * 5)
50

Tabii ki yukardaki de
gi
skenle matematik i
slemleri yapabilmemiz, bu de
gi
skenin de
gerinin bir
say olmasndan kaynaklanyor. E
ger n de
gi
skeninin de
geri bir karakter dizisi olsayd yukardaki komuttan alaca
gmz kt ok farkl olacakt. Bakalm:
>>> n = "10"

Bylece n de
gerini yeniden tanmlam
s olduk. Artk n de
gi
skeninin de
geri 10 de
gil, 10...
Yani say de
gil, karakter dizisi. Bunu s
u s
ekilde teyit edebiliriz:
>>> print(n * 5)
10101010101010101010

Grd
gnz gibi, bu defa Python 5 adet 10u yan yana dizdi. Bunun sebebini biliyorsunuz.
Aritmetik i
slemleri saylarla yaplr, karakter dizileriyle de
gil...
Gelin isterseniz birka tane daha de
gi
sken tanmlayarak elimizi al
stralm:
>>> isim = "istihza"

Burada, de
geri istihza olan, isim adl bir de
gi
sken tanmladk. Buna s
yle ula
sabiliriz:
>>> print(isim)
istihza

Bu de
gi
skeni istersek ba
ska karakter dizileriyle birlikte kullanarak daha kar
sk i
slemler de
yapabiliriz. Mesela:
>>> print("Benim adm", isim)
Benim adm istihza

Burada, Benim adm adl karakter dizisinden sonra bir virgl koydu
gumuza ve isim adl
de
gi
skeni ne s
ekilde kulland
gmza dikkat edin. Bununla ilgili benzer bir rnek daha yapalm:
>>> konu = "de
gi
skenler"
>>> print("Bu dersimizin konusu", konu)
Bu dersimizin konusu de
gi
skenler

Elbette, de
gi
skenimizi sadece en sonda kullanmak zorunda de
giliz. Bunu aralara da yerle
stirebiliriz. rne
gin s
yle bir kod paras yazd
gmz d
snn:

tarih = "12 Ekim 2007"


ziyaret_says = "123456789"
print("Bu siteye", tarih, "tarihinden bu yana", ziyaret_says, "defa tklanm
str.")

Bu kodlarn kts s
yle olacaktr:
Bu siteye 12 Ekim 2007 tarihinden bu yana 123456789 defa tklanm
str.

Burada de
gi
skenlerle ilgili olarak dikkatimizi eken baz noktalar var:
De
gi
sken ad belirlerken Trke karakter kullanabiliyoruz. Grd
gnz gibi, ziyaret_sayisi
demek yerine, ziyaret_says diyebildik... Bu zellik Python3.0 ile gelen bir gzelliktir.
Pythonun 2.x srmlerinde ayn de
gi
skeni ziyaret_sayisi s
eklinde tanmlamamz gerekecekti.
E
ger de
gi
sken ad olarak birden fazla kelime kullanacaksak, kelimeler arasnda bo
sluk brakmyoruz. Kelimeleri biti
sik olarak yazabilece
gimiz gibi, burada grd
gmz s
ekilde kelimeler
arasna alt izgi i
sareti de koyabiliriz.
Ayrca yine virglleri nasl kulland
gmza zellikle dikkat ediyoruz...
Bunlarn d
snda de
gi
sken adlar ile ilgili birka kural daha vardr...
De
gi
sken adlar asla bir sayyla ba
slamaz. Kelimenin ortasnda veya sonunda say bulunabilir,
ama ba
snda bulunamaz... Mesela 3say geerli bir de
gi
sken ad de
gildir. Ama s3ay veya
say3 geerli birer de
gi
sken addr.
Ayrca, baz zel kelimeler vardr ki, bunlar de
gi
sken ad olarak kullanamayz. Bunlar s
yle
listelenebilir:
and, del, from, not, while, as, elif, global, or, with, assert, else, if, pass,
yield, break, except, import, print, class, exec, in, raise, continue, finally,
is, return, def, for, lambda, try
Elbette bu listeyi ezberlemenize gerek yok. Programnz de
gi
skenlerle ilgili anlamsz hatalar
verdi
ginde gelip bu listeyi kontrol edebilirsiniz... Ayrca etkile
simli kabukta s
u komutu vererek
de yukardaki listeyi elde edebilirsiniz:
>>> help("keywords")

Geri e
ger programlarnz Trke olarak yazyorsanz, yukardaki yasakl kelimelerden birine
toslamanz d
sk bir ihtimaldir. Ama yine de Pythonda bu tr yasakl kelimelerin oldu
gunu
bilmenin ilerde bize faydas dokunacaktr.
De
gi
skenler zellikle kullancyla etkile
sen, yani onlardan veri alp onlara veri veren programlar
yazd
gmzda daha ok i
simize yarayacaktr.
Grd
gnz gibi, komut satrnda yazd
gmz kodlar artk tek satr gemeye ba
slad. Bunlar
bir yere kaydedip oradan al
strsak daha iyi olacak. Hem zaten etkile
simli kabukta yazd
gmz
kodlar kalc olmuyor. Etkile
simli kabu
gu kapatt
gmz anda bunlar hafzadan siliniyor. Tabii
ki yazd
gmz programlar ba
skalaryla payla
sabilmek iin bunlar nce bir yere uygun s
ekilde
kaydetmi
s olmamz gerekiyor. Dolaysyla artk yava
s yava
s asl al
sma ortammza geebiliriz. nk bunu yapabilecek kadar temel bilgiye sahibiz s
u anda.

1.8 Python Programlarn Kaydetmek


Buraya kadar olan tecrbelerimizden grd
gmz gibi, etkile
simli kabuk gerekten de olduka
pratik ve gl bir aratr. Ama burada yazd
gmz kodlar kalc olmuyor. Bizim istedi
gimiz s
ey
ise, bir kod yazd
gmzda o an lmszle
stirmek... I
ste bunun iin, yazd
gmz programlar bir
yere kaydetmemiz gerekiyor. Bu blmde bunu nasl yapaca
gmz
grenece
giz.
Aslnda bizim bu a
samada ihtiyacmz olan tek s
ey basit bir metin dzenleyicidir. E
ger
GNU/Linux zerinde KDE masast ortamn kullanyorsanz Kwrite veya Kate i
sinizi grecektir. E
ger kulland
gnz sistem GNU/Linux zerinde GNOME masast ortam ise Gedit sizin iin
yeterli olacaktr. Windows kullanclar, bilgisayarlarna kurduklar Python program ile birlikte
gelen IDLE adl yazlm kullanabilirler.
Windows kullananlar, IDLEye Ba
slat > Programlar > Python 3.x > IDLE (Python GUI) yolunu
takip ederek ula
sabilir. IDLEyi ilk ba
slatt
gnzda kar
snza Python Shell ba
slkl bir ekran
gelecektir. Aslnda bu daha nce bahsetti
gimiz ve s
imdiye kadar hep zerinde al
st
gmz etkile
simli kabu
gun kendisidir... Buray da etkile
simli kabu
gu kulland
gmz gibi kullanabiliriz. Ama
bizim s
imdi bahsedece
gimiz zellik bu de
gildir. Bizim ihtiyacmz olan s
ey bir metin dzenleyici. IDLEnin metin dzenleyicisine ula
smak iin File > New Window yolunu takip etmeliyiz.
Veya ksaca CTRL+N tu
slarna basarak da metin dzenleyiciyi aabiliriz. File > New Window
yolunu takip ederek veya ksaca CTRL+N tu
slarna basarak ula
st
gmz ekran, Python kodlarmz yazaca
gmz alandr. Bu alan nasl kullanaca
gmz biraz sonra grece
giz. Ama nce
GNU/Linux kullanclarnn neler yapaca
gna bir bakalm...
Dedi
gim gibi, e
ger GNU/Linux zerindeyseniz Kwrite, Kate veya Gedit programlarn kullanabilirsiniz. Bu metin dzenleyici programlara ula
smann en kolay yolu komut al
str
penceresinde bu programlarn ismini yazp entere basmaktr... Muhtemelen bunun nasl
yaplaca
gn biliyorsunuz, ama ben yine de ksaca anlataym:
nce ALT+F2 tu
slarna basyoruz. E
ger KDE kullanyorsak, Kwriteyi al
strmak iin, alan
pencerede s
u komutu veriyoruz:
kwrite

Kate iin s
u komutu:
kate

E
ger bir GNOME kullancsysak, Gediti al
strmak iin s
yle bir komut veriyoruz:
gedit

Yukardaki komutlar arasndan kendinize uygun olan verdi


ginizde kar
snza bo
s bir metin
dzenleyici gelecek. I
ste Python kodlarmz buraya yazaca
gz.
Aslnda IDLE, Kwrite, Kate veya Gedit d
snda, Python programlarmz yazp al
strmak iin
kullanabilece
gimiz pek ok uygulama bulunur. Programlarmz yazmak ve al
strmak iin
kullanabilece
gimiz bu zel uygulamalara IDE (Geli
stirme Ortam) ad verilir. Baz IDEler bize
olduka geli
smi
s zellikler sunar. Python iin geli
stirilmi
s IDElerin bir listesi iin s
u adresi
ziyaret edebilirsiniz: http://wiki.python.org/moin/IntegratedDevelopmentEnvironments.
Her bir IDEnin kendine zg bir al
sma mant
g ve s
ekli vardr. Biz burada bu IDEleri tek
tek incelemeyece
giz. Bizim iin s
u a
samada, yazlan kodlar bilgisayarmza kaydetmemizi
sa
glayacak herhangi bir program yeterli olacaktr. Hatta Notepad uygulamas bile bu i
s iin
yeterlidir... Ama tabii ki Notepaddan biraz daha geli
smi
s bir metin dzenleyici kullanmak
hayatmz kolayla
stracaktr. Dolaysyla, Kwrite, Kate, Gedit veya IDLE s
u a
samada bizim iin
yeter de artar bile... Neyse... Laf ok fazla uzattk. Asl konumuza gelmeliyiz artk.

S
imdi kendi sistemimize uygun olarak Kwrite, Kate, Gedit veya IDLE programlarndan birini
ba
slatalm. (IDLE kullanclar File > New Window yolunu takip ederek bo
s bir sayfa amay
unutmuyorlar...)
At
gmz bo
s metin sayfasna s
u satr yazyoruz:
#!/usr/bin/env python3.0

Bu satr sadece GNU/Linux kullanclar iindir. Windows kullanclar bu satr yazmasa da olur...
Bu satr yazmamzn amac, GNU/Linuxta programmz al
straca
gmz zaman Pythonun
hangi srmn kullanmak istedi
gimizi aka belli etmektir... Bu satrn nemini biraz sonra
ayrntl olarak anlataca
gz. Ama s
imdi programmz yazmaya devam edelim. Ikinci satrmz
s
yle:
print("Merhaba Zalim Dnya!")

Ilk programmz bu kadar. Isterseniz bu kodlar bir arada grelim:


#!/usr/bin/env python3.0
print("Merhaba Zalim Dnya!")

Programmz yazd
gmza gre sra geldi bu program bilgisayarmza kaydetmeye... Kulland
gmz metin dzenleyicinin kaydetme zelli
gini kullanarak bu dosyay ilk.py adyla (trnaklar olmadan) bilgisayarmza kaydedelim. Gelin isterseniz ilk programmz masastne
kaydedelim, ki ula
smas kolay olsun. Programmz kaydetti
gimize gre, artk bu program
al
strabiliriz. Kaydetti
gimiz bu program nasl al
straca
gmz bir sonraki blme brakalm...

1.9 Python Programlarn al


strmak
Bir nceki blmde, bir Python programn nasl yazp kaydedebilece
gimizi
grendik.
blmde ise yazp kaydetti
gimiz bu program nasl al
straca
gmz inceleyece
giz.

Bu

nce kendi sistemimize uygun olarak bir konsol veya DOS ekran ayoruz. GNU/Linux KDE kullanclar ALT+F2 ile gelen pencerede konsole komutunu kullanarak komut satrna ula
sabilir.
GNOME kullanclarnn ayn i
s iin kullanmas gereken komut gnome-terminaldir. Windows
kullanclar ise Ba
slat > al
str yolunu takip ederek alan pencerede cmd komutuyla DOS
ekranna eri
sebilir.
Komut satrn ilk at
gnzda bulundu
gunuz dizin muhtemelen masast olmayacaktr.
Ama biz programmz masastne kaydetti
gimiz iin, ncelikle dizinimizi masast olarak
de
gi
stirmemiz gerekiyor. Btn platformlarda s
u komutu vererek masastne geebilirsiniz:
cd Desktop

Masastne geldikten sonra GNU/Linux kullanclar s


u komutu veriyor:
python3.0 ilk.py

Windows kullanclar ise s


u komutu:
python ilk.py

Windows kullanclar bu komutu verdiklerinde program muhtemelen al


sacaktr. Ama e
ger
sistemde ba
ska bir Python srm kuruluysa, program o srm al
strm
s olabilir. Ltfen
okumaya devam ediniz...

E
ger her s
ey yolunda gitmi
sse konsol veya DOS ekranna s
u yaznn dkld
gn grece
giz:
Merhaba Zalim Dnya!

Tebrikler! Bylece gerek anlamda ilk Python programnz yazm


s oldunuz. Henz programmz nemli bir i
s yapmyor. Ama bir Python programnn sahip olmas gereken btn
temel zellikleri ta
syor. S
imdilik bizim iin nemli olan tek s
ey, bu basit program al
strabiliyor olmaktr... Yalnz bu noktada bir-iki ufak not d
selim:
Temel kural s
udur: Pythonun etkile
simli kabu
gunu al
strmak iin hangi komutu kullanyorsanz, yazd
gnz program al
strmak iin de o komutu kullanacaksnz. Yukarda grd
gnz
gibi, Windows iin python ilk.py komutunu kullandk. Tabii bu komut, sistemlerinde sadece
Python 3.x srm kurulu olan kullanclar iin geerlidir. E
ger sisteminizde Python 3.x ile
birlikte Pythonun eski srmleri de kuruluysa (mesela Python2.6), bu komutu verdi
ginizde
aslnda programnz Python2.6 ile al
sm
s olabilir. Ama siz aynen bu sitede anlatld
g s
ekilde .bat dosyalar hazrlayarak Python srmlerini birbirinden ayrdysanz, programnzn
Python3.x srmyle al
smasn garanti etmek iin vermeniz gereken komut s
u olacaktr:
python3 ilk.py

Tabii ki, e
ger siz .bat dosyasnn adn farkl bir s
ey yapm
ssanz o ismi kullanmanz gerekir.
Mesela benim Windows ykl bilgisayarmda, daha nce de syledi
gim gibi, Python2.5,
Python2.6 ve Python3.0 srmleri bir arada kurulu. Windowstaki Pythona ait btn al
strlabilir dosyalarn ad python.exe oldu
gu iin, ben Python 2.6 srmn YOLa ekledim. teki
srmler iin ise, python25.bat ve python3.bat adl iki ayr .bat dosyas yazdm. Dolaysyla
ben herhangi bir Python programn Python2.5 srmyle al
strmak istersem s
u komutu
veriyorum:
python25 program_ad.py

Veya bir program Python2.6 ile al


strmak istedi
gimde sadece s
u komutu veriyorum:
python program_ad.py

nk Python2.6y daha nceden YOLa eklemi


stim... E
ger bir program Python 3.x ile al
strmam gerekirse de s
u komutu kullanyorum:
python3 program_ad.py

GNU/Linux kullanclar iin ise s


u komutu kullandk:
python3.0 ilk.py

Tabii e
ger siz Pythonun etkile
simli kabu
gunu al
strmak iin python3 komutunu kullanyorsanz ilk.py adl program s
yle de al
strabilirsiniz:
python3 ilk.py

Dedi
gim gibi, i
sin z s
u: Pythonun etkile
simli kabu
gunu nasl ba
slatyorsanz, programlarnz
da yle al
stracaksnz. Yani e
ger etkile
simli kabu
gu:
python

komutuyla ba
slatyorsanz, ilk.py adl programmz al
strmak iin s
u komutu vereceksiniz:
python ilk.py

E
ger etkile
simli kabu
gu:

python3

komutuyla al
stryorsanz, programmz s
u komutla al
stracaksnz:
python3 ilk.py

E
ger etkile
simli kabu
gu al
strmak iin verdi
giniz komut:
python3.0

ise, ilk.pyyi s
yle al
stryoruz:
python3.0 ilk.py

Bu noktada IDLE kullanclar iin ufak bir not d


selim: IDLE kullananlar, program bilgisayara kaydettikten sonra, sadece F5 tu
suna basarak programlarn al
strabilir. Ayrca s
unu da
syleyelim: IDLE program, .py uzantl dosyalarn sa
g tk mensne yerle
secektir. Yani bilgisayarnzdaki herhangi bir Python dosyasna sa
g tklad
gnzda, mende Edit with IDLE adl
bir seenek de greceksiniz. Bu seene
gi kullanarak .py uzantl dosyay IDLE ile dzenlemek
zere aabilirsiniz. Bu arada ufak bir not daha d
selim: IDLE adl program Pythonu yazan ki
si
olan Guido Van Rossum tarafndan geli
stirilmi
stir...
Peki bir soru soralm: Acaba Python programlarn al
strmak iin hep ba
slarna byle python
diye yazmak zorunda myz? Elbette hayr. Programlarmz isimleriyle de a
grabiliriz:
A
sa
gda syleyeceklerim GNU/Linux kullanclar iin geerli:
Burada, ilk.py adl programmzn ilk satrna yerle
stirdi
gimiz #!/usr/bin/env python3.0
satrnn nemi ortaya kyor. Programlarmz isimleriyle al
strabilmek iin bir defa bu satr
mutlaka yazmalyz. Ikincisi, program dosyamz al
strlabilir olarak ayarlamalyz. Bunu
yapmak iin program dosyasna sa
g tklayp zellikler mens iindeki izinler sekmesine
geldikten sonra, oradaki al
strlabilir adl kutucu
gu i
saretlememiz gerekir. Ayn i
slemi konsoldan s
u komutu vererek de yapabiliriz:
chmod a+x ilk.py

Bylece dosyamza al
strma yetkisi vermi
s olduk. Bundan sonra programmz s
u komutla
al
strabiliriz:
./ilk.py

Artk programmzn .py uzantsn silip, adn ilk olarak de


gi
stirdikten sonra konsolda do
grudan s
u komutu vererek de programmz al
strabiliriz:
./ilk

Peki ya biz programmz tpk teki programlar gibi sadece adn kullanarak al
strmak istiyorsak ne yapaca
gz?
Bunun iin programmz /usr/bin/ klasrnn iine atmamz gerekir. Programmz /usr/bin/
iine attktan sonra sadece s
u komutu vermemiz yeterli olacaktr:
ilk

Gelelim Windows kullanclarna:


Windows kullanclar, yazdklar program sadece ismiyle al
strmak iin DOS ekrannda cd
Desktop komutuyla masastne geldikten sonra s
u komutu verebilir:

deneme.py

Bu komut, program otomatik olarak sistemdeki en son Python srmyle al


stracaktr.
Windows kullanclar ayrca program dosyasna ift tklayarak da programlarn al
strabilir.
nk Python sisteme kurulurken kendini Windows kt
gne (registry) kaydeder. Dolaysyla
Windows, .py uzantl bir dosyay hangi programla al
strmas gerekti
gini bilir. Ancak dosyaya
ift tkland
gnda Windows bu program Pythonun yine en son srmyle al
stracaktr.
Windowsta, yazd
gnz programa ift tklad
gnzda bir DOS ekrannn hzla yanp snd
gn
greceksiniz. Aslnda programnz al
syor ve ekrana Merhaba Zalim Dnya! yazsn
yazdryor, ama al
sma sreci ok hzl oldu
gu iin bu kt ekrana verilir verilmez, programn
sonuna gelindi
ginden tr DOS ekran hemen kapanyor. Isterseniz ilk.py adl dosyay s
u
s
ekilde yazarak DOS ekrannn hemencecik kapanmasn engelleyebilirsiniz:
print("Merhaba Zalim Dnya!")
input()

Bylelikle, program dosyasna ift tklad


gnzda DOS ekran alacak, Merhaba Zalim Dnya!
kts ekrana verilecek ve siz enter tu
suna basana kadar da DOS ekran ak kalacaktr... Ancak
bu yntem her zaman tercih edilmeyebilir. nk bu s
ekilde, e
ger programda bir hata varsa
programn verdi
gi hatalar gremezsiniz. Hatalar grebilmek iin en do
gru yol program komut
satrndan al
strmaktr. Bylece e
ger programda bir hata varsa komut ekrannda bunlar
grebilir ve hatalar dzeltebilirsiniz. Buna bir rnek verelim. Diyelim ki programmzda s
yle
bir hata yaptk:
print("Merhaba Zalim Dnya!"
input()

Grd
gnz gibi, print(Merhaba Zalim Dnya! satrnda kapan
s parantezini koymay unuttuk ve programmz bu s
ekilde kaydettik. S
imdi program dosyamza ift tklad
gmzda
DOS ekran input() satrna ra
gmen anlk olarak ekranda grnp kaybolacaktr. Bu s
ekilde
sorunun nereden kaynakland
gn anlayamazsnz. Ama e
ger bu program komut satrndan
al
strrsanz, en azndan programdaki hata konusunda bir fikir sahibi olabilir, buna gre programa mdahale edebilirsiniz.
Bylece Python programlarmz nasl al
strabilece
gimiz
grenmi
s olduk. Artk hzla yolumuza
devam edebiliriz.

1.10 Pythonda Ilk rnekler...


Buraya kadar Pythonla ilgili birka s
ey
grendik...
grendiklerimiz henz yeterli de
gil elbette.
Ama en azndan elimizi al
strmak iin dahi olsa birka rnek yapabiliriz. Bu blm ayn zamanda bir nevi, nceki konularn tekrar gibi de olacaktr. Daha nce
grendi
gimiz konular
burada tekrar etme frsat bulmann yansra, bu derste yeni s
eyler de
grenece
giz. O halde
hemen i
se koyulalm.
Ilk i
s olarak, daha nceki derslerde
grendi
gimiz s
ekilde bo
s bir metin sayfas ayoruz. Bu i
s
iin Kwrite, Kate, Gedit, IDLE ve hatta Notepad gibi programlardan herhangi birini kullanabiliriz.
S
imdi, tercih etti
gimiz metin dzenleyiciyi kullanarak bo
s bir sayfa aalm ve iine s
unlar
yazalm:

#!/usr/bin/env python3.0
a = "kalem"
b = "pergel"
c = "ikolata"
print("Bir", a, "bir", b, "bir de", c, "alaca
gm...")

Buradaki ilk satr sadece GNU/Linux kullanclar iindir. Windows kullanclar bu satr yazmayabilirler. Burada a, b ve c adl de
gi
skenlere srasyla kalem, pergel ve ikolata de
gerlerini nasl atad
gmza dikkat edin. De
gerlerimizi trnak iine almay unutmuyoruz.
nk bunlar birer karakter dizisidir.
En son satrda ise, ilk derslerde
grendi
gimiz print() fonksiyonunu gryoruz. Daha nce
tanmlad
gmz de
gi
skenleri, print() fonksiyonu iine tek tek yerle
stirdik. De
gi
sken adlarn
trnak iine almad
gmza dikkat edin. Ayrca bu kodlar yazarken, virglleri de yanl
s yerlere
koymamaya zen gsteriyoruz.
S
imdi artk bu kodlar .py uzantsyla kaydedebiliriz. Mesela deneme.py adyla kaydedelim
kodlarmz... Bylelikle elimizde, Pythonla yazlm
s bir program rne
gi olmu
s oldu. S
imdi bu
program al
straca
gz. Bunun iin, kulland
gmz i
sletim sistemine uygun olarak hemen bir
komut satr ayoruz. Komut satrn nasl aaca
gmz daha nceki derslerimizde anlatm
stk.
Ama isterseniz yine de ksaca de
ginelim:
GNU/Linuxta KDE masast ortamn kullananlar ALT+F2 tu
slarna basp, alan pencerede
konsole komutunu vererek; GNOME masast ortamn kullananlar ise ayn pencerede
gnome-terminal komutunu vererek bir komut satr aabilirler. Windows kullanclar ise
Ba
slat > al
str yolunu takip ederek, alan pencerede cmd komutunu verdikten sonra MSDOS ekranna ula
sabilir. Komut satrna ula
stktan sonra, orada s
u komutu verelim:
python3 deneme.py

Tabii e
ger program dosyanz masastne kaydettiyseniz:
cd Desktop

komutu yardmyla ncelikle masastnn bulundu


gu dizine gelmeniz gerekir...
Bir de ben burada dosyay deneme.py adyla kaydetti
ginizi varsaydm. E
ger farkl bir dosya
ad kullandysanz, burada o ad yazmalsnz. Ayrca dosya adnn nne python3 yazd
gma
dikkat edin. Temel kuralmz s
uydu: Pythonun etkile
simli kabu
guna ula
smak iin hangi komutu
kullanyorsanz burada da o komutu kullanacaksnz. Yani e
ger etkile
simli kabu
gu python3.0
diyerek ayorsanz s
u komutu vermeniz gerekir:
python3.0 deneme.py

Yok e
ger Python 3.xin etkile
simli kabu
gunu sadece python komutuyla ayorsanz, tabii ki
verece
giniz komut s
u olacaktr:
python deneme.py

E
ger daha nceki derslerde aklad
gmz s
ekilde gerekli ayarlar yaparsanz, programmz
sadece adyla veya zerine ift tklayarak da al
strabilece
gimizi biliyorsunuz.
Kendimize uygun olan komutu verip yukardaki program al
strd
gmzda s
yle bir kt elde
edece
giz:
Bir kalem bir pergel bir de ikolata alaca
gm...

Gelin isterseniz bu kodlara yeni bir satr daha ekleyelim. Dosyann en son satrndan sonra
s
unu yazalm:
print("Fi
sini almayacak msn o
glum?")

Yani kodlarmz s
yle olmu
s oldu:
#!/usr/bin/env python3.0
a = "kalem"
b = "pergel"
c = "ikolata"
print("Bir", a, "bir", b, "bir de", c, "alaca
gm...")
print("Fi
sini almayacak msn o
glum?")

Bu kodlar al
strd
gmzda s
yle bir kt alrz:
Bir kalem bir pergel bir de ikolata alaca
gm...
Fi
sini almayacak msn o
glum!

Grd
gnz gibi, ikinci print() fonksiyonu ile verdi
gimiz kt otomatik olarak bir alt satrda
grnyor. o
gu zaman istedi
gimiz davran
s bu olacaktr. Ama bazen istedi
gimiz s
ey bu
olmayabilir. Bunun yerine, yeni eklenen satrn bir ncekiyle ayn satrda grnmesini isteyebiliriz. O zaman, Pythonun bize sundu
gu end adl ifadeden yararlanabiliriz:
#!/usr/bin/env python3.0
a = "kalem"
b = "pergel"
c = "ikolata"
print("Bir", a, "bir", b, "bir de", c, "alaca
gm...",
end="Fi
sini almayacak msn o
glum?")

Bu kodlarn kts s
yle olacaktr:
Bir kalem bir pergel bir de ikolata alaca
gm... Fi
sini almayacak msn
o
glum!istihza@istihza:~/Desktop$

Grd
gnz gibi, ktmz hibir s
ekilde biimlendirilmedi. yle ki, ktmz komut satrndaki
istihza@istihza:~/Desktop$ ifadesinin dahi gerisinde kald! Bu kullanmda ne bir bo
sluk
karakteri otomatik olarak eklenir, ne de otomatik olarak yeni satra geilir. Arzu etti
gimiz
i
saretleri kendimiz koymamz lazm. Mesela bu kodlar s
u s
ekilde yazarak daha dzgn bir
kt alabiliriz:
#!/usr/bin/env python3.0
a = "kalem"
b = "pergel"
c = "ikolata"
print("Bir", a, "bir", b, "bir de", c, "alaca
gm...",
end="Fi
sini almayacak msn o
glum?\n")

Bu defa ktmz s
yle olacak:
Bir kalem bir pergel bir de ikolata alaca
gm... Fi
sini almayacak msn o
glum!

Bu kez hem noktadan sonra bir bo


sluk var, hem de ktmz verildikten sonra bir alt satra
geiliyor. Bunu nasl becerdi
gimize bakalm:
end= ifadesinin ardndan bir bo
sluk brakarak ktnn da bir adet bo
sluk karakteri iermesini
sa
gladk. end= ile ekledi
gimiz karakter dizisinin en sonuna s
yle bir i
saret koyduk: \n.
Buna programlama dillerinde yeni satr karakteri ad verilir. Bir cmleyi herhangi bir yerinden
blp alt satra gemek istedi
gimizde bu karakteri kullanabiliriz. Isterseniz bununla ilgili birka
rnek yapalm:
Diyelim ki elimizde s
yle bir karakter dizisi var:
Guido Van Rossum Pythonu geli
stirmeye 1990 ylnda ba
slam
s... Yani aslnda
Python iin nispeten yeni bir dil denebilir. Ancak Pythonun ok uzun bir gemi
si
olmasa da, bu dil teki dillere kyasla kolay olmas, hzl olmas, ayr bir derleyici
programa ihtiya duymamas ve bunun gibi pek ok nedenden tr o
gu kimsenin gzdesi haline gelmi
stir. Ayrca Googlenin de Pythona zel bir nem ve
de
ger verdi
gini, ok iyi derecede Python bilenlere i
s olana
g sundu
gunu da hemen
syleyelim. Mesela bundan ksa bir sre nce Pythonun yaratcs Guido Van Rossum
Googlede i
se ba
slad...
Bizim amacmz bu uzun cmleyi ekrana yazdrmak, ama yazdrrken de belli noktalarndan
blmek olsun. Bunun iin s
yle bir s
ey yazabiliriz:
#!/usr/bin/env python3.0
print("\nPython Hakknda:")
print()
print("Guido Van Rossum Pythonu geli
stirmeye 1990 ylnda ba
slam
s...\nYani \
aslnda Python iin nispeten yeni bir dil denebilir.\nAncak Pythonun ok uzun\
bir gemi
si olmasa da,\nbu dil teki dillere kyasla kolay olmas, hzl olmas,\nayr\
bir derleyici programa ihtiya duymamas\nve bunun gibi pek ok nedenden tr\
o
gu kimsenin\ngzdesi haline gelmi
stir. Ayrca Googlenin de Pythona zel bir\
nem\nve de
ger verdi
gini, ok iyi derecede Python bilenlere i
s olana
g\nsundu
gunu\
da hemen syleyelim. Mesela bundan ksa bir sre nce\nPythonun yaratcs Guido\
Van Rossum Googlede i
se ba
slad...")

Grd
gnz gibi, yeni bir satrda yer almasn istedi
gimiz ksmlara \n karakterini yerle
stirdik.
Ayrca bu uzun karakter dizisini belli noktalarda enter tu
suna basarak blmek istedi
gimizde
de \ i
saretinden yararlanyoruz. E
ger enter tu
suna basaca
gmz noktalarda bu ters bl
i
saretini kullanmazsak programmz hata verecektir... Bu ters bl i
saretleri ktda grnmez,
hatta bu i
saretlerin kt zerinde hibir etkisi yoktur. Bu i
saret yardmyla Pythona s
yle bir
s
ey sylemi
s oluyoruz:
enter tu
suna bast
gma bakma! Aslnda satr devam ediyor...
Bu kodlar al
strd
gmzda s
una benzer bir kt alrz:
istihza@istihza:~/Desktop$ python3 deneme.py
Python Hakknda:
Guido Van Rossum Pythonu geli
stirmeye 1990 ylnda ba
slam
s...
Yani aslnda Python iin nispeten yeni bir dil denebilir.
Ancak Pythonun ok uzun bir gemi
si olmasa da,
bu dil teki dillere kyasla kolay olmas, hzl olmas,
ayr bir derleyici programa ihtiya duymamas
ve bunun gibi pek ok nedenden tr o
gu kimsenin
gzdesi haline gelmi
stir. Ayrca Googlenin de Pythona zel bir nem
ve de
ger verdi
gini, ok iyi derecede Python bilenlere i
s olana
g

sundu
gunu da hemen syleyelim. Mesela bundan ksa bir sre nce
Pythonun yaratcs Guido Van Rossum Googlede i
se ba
slad...

Grd
gnz gibi, satrlar \ i
saretinin bulundu
gu yerlerden de
gil, \n i
saretinin oldu
gu noktalardan blnyor... Ayrca burada \n karakterini kelimeler arasna yerle
stirirken bo
sluk
brakmad
gmza da dikkat edin. nk \n karakteri kendisinden sonra gelen kelimeyi bir
alt satra alaca
g iin, e
ger kelimeler arasnda bo
sluk brakrsak, alt satra geen kelime, yeni
satrda girintili olarak grnecektir...
Yukarda da ifade etti
gimiz gibi, byle uzun cmlelerle al
srken, e
ger kendiniz enter tu
suna
basarak alt satra gemeye al
srsanz, programnz hata verecektir. Bunu nlemek iin \
i
saretinden yararlanmamz gerekir. Bu durum Pythonda tek ve ift trnak i
saretlerinin zelli
gidir.
E
ger karakter dizilerini yazarken alt satra gemek istiyorsanz bu i
si \n adl karakterle yapmanz gerekir. Dedi
gim gibi, aksi halde hata alrsnz...
Grd
gnz gibi yukardaki gibi bir kod yazabilmek iin epey takla atmamz gerekti... Ama
Pythonda areler tkenmez! Bunun gibi uzun cmlelerle al
srken i
simize yarayacak ba
ska
bir trnak tipi daha vardr Pythonda: trnak
trnak i
saretini kullanarak, ok uzun cmleleri sorunsuz ve dertsiz bir s
ekilde ekrana
yazdrabiliriz. Mesela yukardaki rnek zerinden gidelim:
#!/usr/bin/env python3.0
print("""
Python Hakknda:
""")
print("""Guido Van Rossum Pythonu geli
stirmeye 1990 ylnda ba
slam
s...
Yani aslnda Python iin nispeten yeni bir dil denebilir. Ancak
Pythonun ok uzun bir gemi
si olmasa da, bu dil teki dillere kyasla
kolay olmas, hzl olmas, ayr bir derleyici programa ihtiya duymamas
ve bunun gibi pek ok nedenden tr o
gu kimsenin gzdesi haline gelmi
stir.
Ayrca Googlenin de Pythona zel bir nem ve de
ger verdi
gini, ok iyi derecede
Python bilenlere i
s olana
g sundu
gunu da hemen syleyelim. Mesela bundan ksa
bir sre nce Pythonun yaratcs Guido Van Rossum Googlede i
se ba
slad...""")

Burada ( trnak) i
saretini nasl kulland
gmza dikkat edin. Bir tane bile \n karakteri
kullanmadan, klavyedeki enter tu
sunu kullanarak, istedi
gimiz yerden bldk cmlelerimizi.
Ayn s
eyi ift veya tek trnak ile yapmaya al
st
gmzda programmzn hata verdi
gini grrz...
Buraya kadar
grendi
gimiz bilgilere gre Pythonda adet trnak tipi kullanlabiliyor:
1. Tek trnak ()
2. ift trnak ()
3. trnak ()
Tek ve ift trnaklar ksa karakter dizilerinde kullanlmaya olduka uygundur. Elbette ksa karakter dizileriyle de trna
g kullanabilirsiniz.Ama ksa karakter dizileri iin trnak kullanm pek
yaygn de
gildir. Zaten mesela elma gibi ksa bir karakter dizisini elma s
eklinde yazmak
en basitinden irkin bir grnm sunacak, hi de pratik olmayacaktr...
Yukardaki kodlar ok dikkatli bir s
ekilde inceleyip, hangi kodun ne i
se yarad
gn anlamaya
al
smanz neririm. Hatta yukardaki kodlarda kendinize gre birtakm de
gi
siklikler yaparak,
kodlarn i
slevini daha iyi kavrayabilirsiniz.

Isterseniz Pythonda trnak i


saretlerinin i
slevini daha iyi kavrayabilmek iin birka rnek daha
yapalm. Mesela s
yle bir cmleyi ekrana nasl yazdrrsnz:
*Bugn Adanaya gidiyoruz!*

Bu cmleyi en kolay s
u s
ekilde yazdrabiliriz:
>>> print("Bugn Adanaya gidiyoruz!")
Bugn Adanaya gidiyoruz!

Adanaya kelimesinde geen kesme i


sareti nedeniyle tek trnak kullanmyoruz. Aksi halde
Pythonun kafas kar
sacak, trnaklarn nerede ba
slayp nerede bitti
gini anlayamayacaktr.
Bir de s
u cmleyi yazdrmay deneyelim:
"Bugn gnlerden Per
sembe," dedi Bihter Hanm

Tahmin etti
giniz gibi, cmle iinde ift trnaklar oldu
gu iin, bu cmleyi en kolay s
u s
ekilde
yazdrrz:
>>> print("Bugn gnlerden Per
sembe," dedi Bihter Hanm)
Bugn gnlerden Per
sembe," dedi Bihter Hanm

Burada ba
sta ve sonda tek trnak i
saretlerini kullanyoruz...
Peki ya s
u cmle nasl yazdrlr?
Ahmet, "Bugn Adanaya gidiyoruz," dedi.

Burada hem tek trnak hem de ift trnak var. Acaba bu sorunu nasl a
saca
gz?
Bu sorunu en kolay, trnak i
saretlerini kullanarak zebiliriz:
>>> print("""Ahmet, "Bugn Adanaya gidiyoruz," dedi.""")

Grd
gnz gibi sorun kolayca zld. Peki ya biz burada trnak i
saretini kullanmak istemezsek ne olacak? Diyelim ki biz bu cmleyi mutlaka ift trnak kullanarak yazdrmak istiyoruz.
O zaman ne yapaca
gz?
Burada, Pythonun zel i
saretleri devreye girecek. Bu zel i
saretlere programlama dilinde
ka
s dizisi (escape sequence) ad verilir. Mesela \ i
sareti bunlardan biridir ve bizim yukardaki gibi bir problemden kamamz sa
glar. Hemen grelim nasl kullanld
gn bu i
saretin:
>>> print("Ahmet, \"Bugn Adanaya gidiyoruz,\" dedi.")

\ adl ka
s dizisini nasl kulland
gmz gryorsunuz. Ba
slang ve biti
s trnaklar d
snda
kalan btn ift trnak i
saretlerinin nne \ adl ka
s dizisini getiriyoruz.
E
ger yukardaki cmleyi ift trnak yerine mutlaka tek trnak kullanarak yazdrmak istiyor olsaydk, s
yle yapacaktk:
>>> print(Ahmet, "Bugn Adana\ya gidiyoruz," dedi.)

Burada da, kamamz gereken bir adet kesme i


sareti var. Cmlemize tek trnakla ba
slad
gmz
iin cmle iinde geen ift trnaklarn zarar olmayacak. Ama Adanaya kelimesindeki kesme
i
sareti bize sorun karacak. Bu i
saretin sorun yaratmamas iin \ adl ka
s dizisini kullanarak
sorundan kayoruz...

Pythonda \ karakterinden ba
ska pek ok ka
s dizisi vardr. Bunlar ilerleyen derslerde tek
tek inceleyece
giz.
Karakter dizileri zerinde yeterince al
stk saylr. Isterseniz biraz da saylarla ilgili rnekler
yapalm...
nceki derslerden hatrlad
gmz gibi, karakter dizileriyle saylar arasnda iki temel fark bulunuyordu:
1. Karakter dizileri trnak iinde gsterilir, saylar trnaksz...
2. Saylar, adlarndan anla
slaca
g gibi say de
gerli
gelerdir. Karakter dizileri ise say de
gerli
olabilecekleri gibi, olmayabilirler de...
nceki bilgilerimize dayanarak s
u rnekleri verebiliriz. Mesela a
sa
gdaki ifade bir saydr:
13

Ama s
u ifade bir say de
gildir:
"13"

Ancak s
yle bir yanlgya d
smeyelim. Say olup olmama zelli
gi yalnzca trnak i
saretleriyle
ilgili bir durum de
gildir. rne
gin a
sa
gdaki karakter dizisinin trnaklarn kesip ald
gmzda bir
say elde etmeyiz:
"elma"

Yani:
elma

gibi bir kullanm hata verecektir. nk bir ifadenin say olabilmesi iin, trnak i
sareti ta
smamasnn yansra, say de
gerli olmas da gerekir...
Isterseniz saylar (ve karakter dizilerini) kullanarak s
yle bir rnek yapalm:
#!/usr/bin/env python3.0
km = 10
m = 50000
print(m, "metre", m/1000, "kilometreye e
sittir.")
print(km, "kilometre", km*1000, "metreye e
sittir.")

Bu program s
yle bir kt verecektir:
50000 metre 50.0 kilometreye e
sittir.
10 kilometre 10000 metreye e
sittir.

E
ger km ve m de
gi
skenlerinin de
geri say de
gil de karakter dizisi olsayd, m/1000 veya
km*1000 i
slemlerini yapamazdk.
Bu arada, buradaki ktda 50.0 gibi ondalk de
ger ta
syan bir say elde etti
gimize dikkat edin.
E
ger ondalk say yerine tamsay elde etmek isterseniz, blme i
slemini s
u s
ekilde yapabilirsiniz:
m//1000

nceki derslerimizde // i
slecinden sz etmi
stik. Bu i
sle yukardaki gibi durumlarda olduka
faydal bir aratr.

Bylelikle bir konuyu daha bitirmi


s olduk. Bu derste, s
imdiye kadar
grendi
gimiz konularla
ilgili pek ok rnek yaptk. Burada anlatlanlar daha iyi kavrayabilmek iin kendi kendinize
al
strmalar yapmanz tavsiye ederim.

1.11 Kullancyla Ileti


sim: input() fonksiyonu
Pythonda artk baz s
eyleri yapabiliyoruz. Ama s
imdiye kadar yaptklarmz, kendimiz alp
kendimiz oynamaktan pek farkl de
gil... Artk bir yolunu bulup kullancyla ileti
sime geebilmemiz lazm. Aksi halde tek ynl bir programlama deneyiminin ok skc olaca
g bariz...
Bu blmde kullancyla etkile
sece
giz. Yani ondan bir takm veriler alp programmz iinde bu
verileri i
sleyece
giz. Her zamanki gibi, laf hi uzatmadan konunun zne dalalm...
Pythonda kullancyla veri al
s-veri
si yapabilmek iin input() adl bir fonksiyondan yararlanaca
gz.
Hemen bir rnek yapalm.
Bo
s bir metin belgesi ap iine s
unlar yazyoruz:
#!/usr/bin/env python3.0
print("Merhaba, ben Python. Monty Python")
input("Senin adn nedir? ")

Bu program al
strd
gmz zaman, ekrana s
yle bir kt verilecektir:
Merhaba, ben Python. Monty Python
Senin adn nedir?

Burada Python kullancya adn sordu ve cevap bekliyor. Kullanc kendi adn yazp enter
tu
suna bast
gnda programmz kapanacaktr. Tabii ki program bu haliyle bizi tatmin etmekten
ok uzak. En azndan, kullancnn adn
grenip ona kendi adyla hitap edebilsek ok iyi olur...
S
u kodlar bu dile
gimizi yerine getirecektir:
#!/usr/bin/env python3.0
print("Merhaba, ben Python. Monty Python")
isim = input("Senin adn nedir? ")
print("Merhaba", isim)

Bu program al
strd
gmzda, kullancya kendi adyla hitap edebildi
gimizi gryoruz. Bunu
yapabilmek iin, ncelikle input() fonksiyonunun kendisini bir de
gi
sken iinde depoladk. Kullanc ekrana ismini yazd
gnda input() fonksiyonu bu bilgiyi alp isim adl de
gi
sken iinde
saklayacaktr. Bylece bu veriyi daha sonra tekrar kullanabilece
giz. Hemen bir sonraki satrda
da bu veriyi kulland
gmza dikkat edin. Daha nceki derslerde
grendi
gimiz bilgilerden pek
farkl de
gil. Bu kodlardaki tek yenilik, araya bir input() fonksiyonunun yerle
stirilmi
s olmas.
Grd
gnz gibi, input() fonksiyonunun kullanm print() fonksiyonunun kullanmna biraz
benziyor.
Isterseniz kullancyla biraz sohbet edelim, ne dersiniz?
#!/usr/bin/env python3.0
print("Merhaba, ben Python. Monty Python")
isim = input("Senin adn nedir? ")
print("Merhaba", isim)

ya
s = input("Peki ya
sn ka diye sorsam?")
print("Hmmm... Ya
st de
giliz seninle!")

...bu byle gider...


Benzer bir rnek daha yaparak konuyu peki
stirelim:
#!/usr/bin/env python3.0
kare = input("Bir say gir, ben sana o saynn karesini syleyeyim:")
print(kare, "saysnn karesi: ", kare**2)

Ne oldu? Python hata verdi, de


gil mi? Gayet normal. nk input() fonksiyonu kt olarak
bir karakter dizisi verir. Hatrlarsanz nceki blmlerde s
yle bir s
ey demi
stik:
trnak i
sareti ta
smayan 13 bir saydr, ama trnak i
sareti ta
syan 13 bir say
de
gildir...
I
ste bu input() fonksiyonu kullanlarak elde edilen de
ger de bir say de
gildir. Dolaysyla
kullanc ekrana bir say giriyormu
s gibi grnse de aslnda input() fonksiyonunun kt tr
bir karakter dizisidir... Biz grmesek de, input() fonksiyonu ekrana yazlan ifadeleri trnak
iine alr... Bu bilgi nemlidir. Bunu aklmzda tutmaya al
salm. Zira daha nce de dedi
gimiz
gibi, aritmetik i
slemleri ancak saylar arasnda yaplabilir. Karakter dizileri ile aritmetik i
slemi
yaplamaz.
Peki ne yapaca
gz? Byle elimiz kolumuz ba
gl oturacak myz? Elbette hayr! Yapaca
gmz
i
slem ok basit. input() ile elde edilen kty sayya dn
strece
giz. Bu noktada biraz
Pythondaki say tiplerinden bahsetmekte fayda var:
Pythonda temel olarak iki farkl say tipi vardr:
1. Tamsaylar (Integers)
2. Ondalk Saylar (Floats)
Tamsaylar, ondalk bir ksm iermeyen saylardr. Mesela 5, 20, 17 gibi saylara tamsay
ad verilir.
Ondalk saylar ise, iinde ondalk bir ksm barndran saylardr. Mesela, 12.7, 5.4, 56.8,
0.5 gibi saylar ondalk saylardr.
Bunlarn d
snda Pythonda bir de karma
sk saylar (complex numbers) vardr. Karma
sk saylar;
bir gerek ve bir sanal ksmdan olu
san saylardr. Pythonda karma
sk saylar s
u s
ekilde gsterilir: (9+3j), (1+2j), gibi...
E
ger matematikle ok ili d
sl de
gilseniz karma
sk saylar pek i
sinize yaramayacaktr...
Birka kk rnek ile yolumuza devam edelim. A
sa
gdaki kk rnekleri, uzun uzun metin
dosyalarna yazmak yerine Pythonun etkile
simli kabu
gunu kullanarak yapalm. Zira etkile
simli
kabuk bu tr ufak kod denemeleri iin birebirdir:
>>> a = 56

Bu say bir tamsaydr. Ingilizce olarak ifade etmek gerekirse, integer... Bunun bir tamsay
oldu
gunu s
u s
ekilde teyit edebiliriz:
>>> type(a)
<class int>

Burada ald
gmz class int kts, bize a de
gi
skeninin tuttu
gu saynn bir tamsay
oldu
gunu sylyor. int ifadesi, integer (tamsay) kelimesinin ksaltmasdr.

Bir de s
u sayya bakalm:
>>> b = 34.5
>>> type(b)
<class float>

Bu kt ise bize 34.5 saysnn bir ondalk say oldu


gunu sylyor. float kelimesi Floats
veya Floating Point Number ifadesinin ksaltmasdr. Yani ondalk say demektir...
Bu arada, yeni
grendi
gimiz bu type() adl fonksiyonu sadece saylara de
gil, ba
ska s
eylere de
uygulayabiliriz. Mesela bir rnek vermek gerekirse:
>>> meyve = "karpuz"
>>> type(meyve)
<class str>

Grd
gnz gibi, type() fonksiyonu bize meyve adl de
gi
skenin de
gerinin bir str yani
string yani karakter dizisi oldu
gunu bildirdi...
S
imdi de etkile
simli kabuktan kp a
sa
gdaki gibi bir program yazalm:
#!/usr/bin/env python3.0
kare = input("Bir say giriniz ltfen:")
print(kare)
print("Girdi
giniz verinin tipi
sudur:")
print(type(kare))

Burada, kullancdan bir say girmesini istedik. Kullanc bir veri girip enter tu
suna bast
gnda,
nce kullancnn girdi
gi verinin kendisi ekrana yazdrlacak, ardndan da bu verinin tipi ekrana
kt olarak verilecektir.
Yukardaki programdan ald
gmz ktnn gsterdi
gi gibi, input() fonksiyonu ile alnan verinin
tipi str, yani karakter dizisidir. Bizim yapmamz gereken s
ey, kullancdan ald
gmz bu karakter dizisini sayya dn
strmek olacaktr. Peki bu dn
strme i
slemi nasl olacak? Hemen
bakalm:
Diyelim ki elimizde s
yle bir say var (Bu arada, artk a
sa
gdaki kod paralarn denemek iin
etkile
simli kabu
gu kullanmann daha pratik oldu
gunu sylememe gerek yok...):
>>> a = 45

Isterseniz bunu type()


say adl de
gi
skenin tuttu
gu verinin de
geri bir tamsaydr.
fonksiyonunu kullanarak teyit edebilece
ginizi biliyorsunuz... Biz bu tamsayy ondalk sayya
dn
strmek istiyoruz. Yapaca
gmz i
slem ok basit:
>>> float(a)
45.0

Grd
gnz gibi, 45 adl tamsayy, 45.0 adl bir ondalk sayya dn
strdk. S
imdi
type(45.0) komutu bize <class float> ktsn verecektir... E
ger ondalk bir sayy tamsayya evirmek istersek s
u komutu veriyoruz. Mesela ondalk saymz, 56.5 olsun:
>>> int(56.5)
56

Yukardaki rne
gi tabii ki s
yle de yazabiliriz:

>>> a = 56.5
>>> type(a)
56

Bu arada tekrar bir hatrlatma yapalm. Yukardaki ufak kod paralarn etkile
simli kabukta
al
strd
gmz iin print() fonksiyonunu kullanmamza gerek kalmadan ekrana kt alabiliyoruz. Daha nce de dedi
gimiz gibi, bu durum etkile
simli kabu
gun bir zelli
gidir. Yukardaki
kodlar s
u s
ekilde bir metin dosyasna yazarsak kt almamz mmkn olmaz:
#!/usr/bin/env python3.0
say = 56.5
type(say)

Bu program al
strd
gmzda ekranda hibir kt grnmeyecektir. Bu programn al
smas
iin print() fonksiyonunu kullanmamz lazm:
#!/usr/bin/env python3.0
say = 56.5
print(type(say))

Dn
strme i
slemini saylar arasnda yapabilece
gimiz gibi, saylar ve karakter dizileri arasnda
da yapabiliriz. rne
gin s
u bir karakter dizisidir:
>>> nesne = "45"

Yukardaki de
geri trnak iinde belirtti
gimiz iin bu de
ger bir karakter dizisidir. S
imdi bunu bir
tamsayya evirece
giz:
>>> int(nesne)
45

Dilersek, ayn karakter dizisini ondalk sayya da evirebiliriz:


>>> float(nesne)
45.0

Hatta bir sayy karakter dizisine de evirebiliriz. Bunun iin string (karakter dizisi) kelimesinin ksaltmas olan str parac
gn kullanaca
gz:
>>> s = 6547
>>> str(s)
6547

Bir rnek de ondalk saylarla yapalm:


>>> s = 65.7
>>> str(s)
65.7

Yalnz s
unu unutmayn: Bir karakter dizisinin sayya dn
strlebilmesi iin o karakter dizisinin
say de
gerli olmas lazm. Yani 45 de
gerini sayya dn
strebiliriz. nk 45 de
geri, trnaklardan tr bir karakter dizisi de olsa, neticede say de
gerli bir karakter dizisidir. Ama

mesela elma karakter dizisi byle de


gildir. Dolaysyla, s
yle bir maceraya giri
smek bizi
hsrana u
gratacaktr:
>>> nesne = "elma"
>>> int(nesne)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: elma

Grd
gnz gibi, Python bu numaray yutmad!...
Neyse, olmayacak duaya amin demeyi brakp yolumuza devam edelim...
Gelin s
imdi daha byk bir i
slem yapalm. Kullancdan ald
gmz veriyi tamsayya evirelim...
A
sa
gdaki kodlar bir metin dosyasna yazyoruz:
#!/usr/bin/env python3.0
kare = int(input("Bir say giriniz ltfen:"))
print(kare)
print("Girdi
giniz verinin tipi
sudur:")
print(type(kare))

Grd
gnz gibi, type(kare) fonksiyonu bu defa class int kts verdi. Yukardaki kodlar
kafanz kar
strmasn. Istersek bu kodlar s
yle de yazabiliriz:
#!/usr/bin/env python3.0
kare = input("Bir say giriniz ltfen:")
say = int(kare)
print(say)
print("Girdi
giniz verinin tipi
sudur:")
print(type(say))

Bu rnekten anlyoruz ki, kullancdan gelecek veriyi daha almadan sayya dn


strebilece
gimiz gibi, nce kullancdan veriyi alp daha sonra bunu sayya da dn
strebiliyoruz...
Kullancdan ald
gmz veriyi nasl sayya dn
strece
gimizi
grendi
gimize gre artk en ba
sa
dnebiliriz... En yukarda yazd
gmz ve hata verdi
gini grd
gmz kodlar tekrar ele alalm:
#!/usr/bin/env python3.0
kare = input("Bir say gir, ben sana o saynn karesini syleyeyim:")
print(kare, "saysnn karesi: ", kare**2)

Bu kodlar bu s
ekilde al
strrsak hata verece
gini biliyoruz artk. O yzden yukardaki kodlarda
s
u de
gi
sikli
gi yapyoruz:
#!/usr/bin/env python3.0
kare = int(input("Bir say gir, ben sana o saynn karesini syleyeyim:"))
print(kare, "saysnn karesi: ", kare**2)

Bylece, Python kullancdan ald


gmz veriyi ba
saryla sayya dn
strp, bu veri zerinde
aritmetik bir i
slem yapabildi. Yalnz, tabii ki kullancnn yanl
slkla say de
gerli bir veri yerine
say de
gerli olmayan bir veri girmesi durumunda programmz yine yere aklacaktr... Yani

mesela kullanc 12 yazmak isterken yanl


slkla veya bilerek bir harf girerse programmz
bekledi
gimiz kty vermeyecektir... Henz bu tr durumlara kar
s nlem almay bilmiyoruz.
Ama zaman geldi
ginde beklenmedik durumlara kar
s nlem almay da
grenece
giz... S
imdilik
kullanclarmzn istedi
gimiz ve bekledi
gimiz verileri uslu uslu girmesi iin dua ediyoruz...
Bylece bu konunun da sonuna geldik... S
imdi isterseniz bu blmde
grendiklerimizi s
yle
ksaca bir zetleyelim.
zet
Bu blmde pek ok yeni s
ey
grendik. Bu blmn en nemli getirisi input() fonksiyonunu

grenmemiz oldu. Bu fonksiyon sayesinde kullancyla ileti


sim kurmay ba
sardk. Artk kullancdan veri alp, bu verileri programlarmz iinde i
sleyebiliyoruz. Yine bu blmde dikkatinizi ekti
gimiz ba
ska bir konu da saylar ve karakter dizileri arasndaki ili
skiydi. input()
fonksiyonuyla elde edilen ktnn bir karakter dizisi oldu
gunu
grendik. Bildi
gimiz gibi, aritmetik i
slemleri ancak saylar arasnda yaplabilir. Dolaysyla input() fonksiyonuyla gelen
karakter dizisini bir sayyla arpmaya kalkarsak hata alyoruz. Burada yapmamz gereken
s
ey, elimizdeki verileri dn
strmek. Yani input() fonksiyonundan gelen karakter dizisini
bir sayyla arpmak istiyorsak, ncelikle ald
gmz karakter dizisini sayya dn
strmemiz
gerekiyor. Dn
strme i
slemleri iin kulland
gmz fonksiyonlar s
unlard:
int() Say de
gerli bir karakter dizisini veya ondalk sayy tamsayya (integer) evirir.
float() Say de
gerli bir karakter dizisini veya tamsayy ondalk sayya (float) evirir.
str() Bir tamsay veya ondalk sayy karakter dizisine (string) evirir.
Ayrca bu blmde s
yle nemli bir tespitte de bulunduk:
Her tamsay ve/veya ondalk say bir karakter dizisine dn
strlebilir. Ama her
karakter dizisi tamsayya ve/veya ondalk sayya dn
strlemez...
rne
gin, 5654 gibi bir tamsayy veya 543.34 gibi bir ondalk sayy str() fonksiyonu
yardmyla karakter dizisine dn
strebiliriz:
>>> str(5654)
>>> str(543.34)

5654 veya 543.34 gibi bir karakter dizisini int() veya float() fonksiyonu yardmyla
tamsayya ya da ondalk sayya da dn
strebiliriz:
>>> int("5654")
>>> int("543.34")
>>> float("5654")
>>> float("543.34")

Ama elma gibi bir karakter dizisini ne int() ne de float() fonksiyonuyla tamsayya veya
ondalk sayya dn
strebiliriz!
Bu bilgileri, nemlerinden tr aklmzda tutmaya al
salm. Buraya kadar anlatlan konular hakknda zihnimizde belirsizlikler varsa veya baz noktalar tam olarak kavrayamadysak,
s
imdiye kadar
grendi
gimiz konular tekrar gzden geirmemiz bizim iin epey faydal olacaktr. Zira bundan sonraki blmlerde, yeni bilgilerin yansra, buraya kadar
grendi
gimiz s
eyleri
de yo
gun bir s
ekilde prati
ge dkece
giz. Bundan sonraki konular takip edebilmemiz asndan,
buraya kadar verdi
gimiz temel bilgileri iyice sindirmi
s olmak i
simizi bir hayli kolayla
stracaktr.
nemli bir konuyu daha geride brakt
gmza gre artk yeni bir blme geebiliriz...

BLM

Durumlar
Pythonda Ko
sula Bagl

2.1 Giri
s
Bu blmde yine ok nemli bir konuya de
ginece
giz: Pythonda ko
sula ba
gl durumlar.
Bu blm sonunda, programlarmza karar vermeyi
gretmi
s olaca
gz.
Bu blmde

grenece
gimiz bilgileri kullanarak, yazd
gmz bir programn, kullancdan gelen verinin
niteli
gine gre farkl i
slemler yapabilmesini sa
glayaca
gz.
Python programlama dilinde, ko
sullu durumlar belirtmek iin adet deyimden yararlanyoruz:
if deyimi
elif deyimi
else deyimi

Yukardaki deyimler, bir nceki blmde grd


gmz, kullancdan veri almamz sa
glayan
input() fonksiyonuyla kol kola gider. Bu fonksiyon ve yukardaki deyimler esasnda bir program iinde birbirini tamamlayan unsurlar olarak kar
smza kar.
Gelin isterseniz bir an nce bu nemli konuya giri
s yapalm.

2.2 if deyimi
E
ger daha nceden herhangi bir programlama dilini az da olsa kurcalama frsatnz olduysa, bir
programlama dilinde if deyimlerinin ne i
se yarad
gn az ok biliyorsunuzdur. Daha nceden
hi bir programclk deneyiminiz olmam
ssa da ziyan yok. Zira bu blmde if deyimlerinin ne
i
se yarad
gn ve nerelerde kullanld
gn enine boyuna tart
saca
gz.
Ingilizce bir kelime olan if, Trkede e
ger anlamna gelir. Anlamndan da karabilece
gimiz
gibi, bu kelime bir ko
sul bildiriyor. Yani e
ger bir s
ey filanca ise... ya da e
ger bir s
ey falanca
ise... gibi... I
ste biz Pythonda bir ko
sula ba
glamak istedi
gimiz durumlar if deyimi aracl
gyla
gsterece
giz.
Gelin isterseniz bu deyimi nasl kullanaca
gmza dair ufack bir rnek vererek i
se ba
slayalm:
ncelikle elimizde s
yle bir de
gi
sken olsun:

35

n = 255

Yukarda verdi
gimiz de
gi
skenin de
gerinin bir karakter dizisi de
gil, aksine bir say oldu
gunu
gryoruz. S
imdi bu de
gi
skenin de
gerini sorgulayalm:
if n > 10:

Burada saynn 10dan byk olup olmad


gna bakyoruz.
Burada grd
gmz > i
saretinin ne demek oldu
gunu aklamaya gerek yok sanrm. Hepimizin bildi
gi byktr i
sareti Pythonda da aynen bildi
gimiz s
ekilde kullanlyor. Mesela
kktr demek isteseydik, < i
saretini kullanacaktk. Isterseniz hemen s
urada araya girip
bu i
saretleri yeniden hatrlayalm:
> byktr
< kktr
>= byk e
sittir
<= kk e
sittir
== e
sittir
!= e
sit de
gildir
Grd
gnz gibi hibiri bize yabanc gelecek gibi de
gil... Yalnzca en sondaki e
sittir (==)
i
sareti ve e
sit de
gildir (!=) i
saretleri biraz de
gi
sik gelmi
s olabilir. Burada e
sittir i
saretinin
= olmad
gna dikkat edin. Pythonda = i
saretini de
ger atama i
slemleri iin kullanyoruz
(a = 25 gibi...). == i
saretini ise e
sittir anlamnda... Neyse konuyu da
gtmayalm... Ne
diyorduk?
if n > 10:

Bu ifadeyle Pythona s
yle bir s
ey demi
s oluyoruz:
E
ger saynn de
geri 10dan bykse...
Burada kulland
gmz i
saretlere dikkat edin. En sonda bir adet : i
saretinin oldu
gunu gzden
karmyoruz... Bu tr i
saretler Python iin ok nemlidir. Bunlar yazmay unutursak Python
gzmzn ya
sna bakmadan bize hata mesaj gsterecektir.
Dedik ki, if n > 10: ifadesi, e
ger bir saynn de
geri 10dan bykse... anlamna gelir. Bu
ifadenin eksik oldu
gu apak ortada. Yani belli ki bu cmlenin bir de devam olmas gerekiyor.
O halde biz de devamn getirelim:
if n > 10:
print("say 10dan byktr!")

Burada ok nemli bir durumla kar


s kar
syayz. Dikkat ederseniz, ikinci satr ilk satra gre
girintili yazdk. Elbette bunu s
irinlik olsun diye yapmadk. Python programlama dilinde girintiler ok byk nem ta
sr. Hatta ne kadarlk bir girinti verdi
giniz bile nemlidir. E
ger Python
kodlarna duyarl bir metin dzenleyici kullanyorsanz, kulland
gnz metin dzenleyici o
gu durumda sizin yerinize uygun bir s
ekilde girintilemeyi yapacaktr. Mesela IDLE adl geli
stirme ortamn kullananlar, ilk satrdaki : i
saretini koyup enter tu
suna bastklarnda otomatik olarak
girinti verildi
gini farkedeceklerdir. E
ger kulland
gnz metin dzenleyici, satrlar otomatik
olarak girintilemiyorsa sizin bu girintileme i
slemini elle yapmanz gerekecektir. Yalnz elle girintilerken, ne kadar girinti verece
gimize dikkat etmeliyiz. Genel kural olarak 4 bo
slukluk bir
girintileme uygun olacaktr. Girintileme i
slemini klavyedeki sekme (tab) tu
suna basarak da yapabilirsiniz. Ama ayn program iinde sekmelerle bo
sluklar kar
strmayn. Yani e
ger girintileme
i
slemini klavyedeki bo
sluk (space) tu
suna basarak yapyorsanz, program boyunca ayn s
ekilde

yapn. Ksaca sylemek gerekirse; Pythonda girintileme ve girintilemede tutarllk ok nemlidir. zellikle byk programlarda, girintilemeler asndan tutarszlk gsterilmesi programn
al
smamasna sebep olabilir... Neyse... Konumuza devam edelim.
E
ger yukardaki if blo
gunu bir metin dzenleyici iine de
gil de do
grudan etkile
simli kabu
ga
yazm
ssanz baz s
eyler dikkatinizi ekmi
s olmal... Etkile
simli kabukta if say > 10: satrn
yazp enter tu
suna bast
gnzda s
yle bir grntyle kar
sla
sm
s olmalsnz:
>>> if n > 10:
...

Dikkat ederseniz, >>> i


sareti, ... i
saretine dn
st. E
ger bu noktada herhangi bir s
ey
yazmadan enter tu
suna basacak olursanz Python size s
yle bir hata mesaj verecektir:
File "<stdin>", line 2
^
IndentationError: expected an indented block

Hata mesajnda da sylendi


gi gibi, Python bizden girintilenmi
s bir blok beklerken, biz onun bu
beklentisini kar
slamam
sz. Dolaysyla bize yukardaki hata mesajn gstermi
s. ... i
saretini grdkten sonra yapmamz gereken s
ey, drt kez bo
sluk (space) tu
suna basarak girinti
olu
sturmak ve if blo
gunun devamn yazmak olmalyd. Yani s
yle:
>>> if n > 10:
...
print("say 10dan byktr!")
...

Grd
gnz gibi, print() fonksiyonunu yazp entere bastktan sonra yine ... i
saretini
grdk. Python burada bizden yeni bir satr daha bekliyor. Ama bizim yazacak ba
ska bir
kodumuz olmad
g iin tekrar enter tu
suna basyoruz ve nihai olarak s
yle bir grnt elde
ediyoruz:
>>> if n > 10:
...
print("say 10dan byktr!")
...
say 10dan byktr!
>>>

Demek ki 250 says 10dan bykm


s! Ne byk bir bulu
s! Merak etmeyin, daha ok s
ey

grendike daha mantkl programlar yazaca


gz... Burada amacmz i
sin temelini kapmak.
Bunu da en iyi, sama sapan ama basit programlar yazarak yapabiliriz.
S
imdi metin dzenleyicimizi aarak daha mantkl s
eyler yazmaya al
salm. Zira yukardaki
rnekte de
gi
skeni kendimiz belirledi
gimiz iin, bu de
gi
skenin de
gerini if deyimleri yardmyla
denetlemek pek akla yatkn grnmyor. Ne de olsa de
gi
skenin de
gerinin ne oldu
gunu biliyoruz. Dolaysyla bu de
gi
skenin 10 saysndan byk oldu
gunu da biliyoruz! Bunu if deyimiyle
kontrol etmek ok gerekli de
gil... Ama s
imdi daha makul bir i
s yapaca
gz. De
gi
skeni biz belirlemek yerine kullancya belirletece
giz:
#!/usr/bin/env python3.0
say = int(input("Bir say giriniz: "))
if say > 10:
print("Girdi
giniz say 10dan byktr!")
if say < 10:
print("Girdi
giniz say 10dan kktr!")

if say == 10:
print("Girdi
giniz say 10dur!")

Grd
gnz gibi, art arda adet if blo
gu kullandk. Bu kodlara gre, e
ger kullancnn girdi
gi
say 10dan bykse, ilk if blo
gu i
sletilecek; e
ger say 10dan kkse ikinci if blo
gu i
sletilecek; e
ger say 10a e
sit ise nc if blo
gu i
sletilecektir... Peki ya kullanc muziplik yapp say
yerine harf yazarsa ne olacak? Byle bir ihtimal iin programmza herhangi bir denetleyici yerle
stirmedik. Dolaysyla e
ger kullanc say yerine harf girerse programmz hata verecek, yani
kecektir. Bu tr durumlara kar
s nasl nlem alaca
gmz ilerleyen derslerimizde grece
giz.
Biz s
imdilik bildi
gimiz yolda yryelim...
if deyimlerini kullanc ad veya parola denetlerken de kullanabiliriz. Mesela s
yle bir program
tasla
g yazabiliriz:
#!/usr/bin/env python3.0
print("""
Dnyann en geli
smi
s e.posta hizmetine
ho
sgeldiniz... Yalnz hizmetimizden
yararlanmak iin nce sisteme giri
s
yapmalsnz..
""")
parola = input("Parola: ")
if parola == "bilmiyorum":
print("Sisteme Ho
sgeldiniz!")

Grd
gnz gibi, programn ba
snda trnak i
saretlerinden yararlanarak uzun bir metni kullancya gsterdik. Bu blm, kendiniz gze ho
s gelecek bir s
ekilde ssleyebilirsiniz de...
E
ger kullanc, kendisine parola soruldu
gunda cevap olarak bilmiyorum yazarsa kullancy
sisteme alyoruz.
Daha nce de syledi
gimiz gibi, if deyimi d
snda Pythonda ko
sullu durumlar belirtmek iin
kulland
gmz, elif ve else adl iki deyim daha vardr. Bunlar if ile birlikte kullanlrlar. Gelin
isterseniz bu iki deyimden, ad elif olana bakalm...

2.3 elif deyimi


Pythonda, if deyimleriyle birlikte kullanlan ve yine ko
sul belirten bir ba
ska deyim de elif
deyimidir. Buna s
yle bir rnek verebiliriz:
#!/usr/bin/env python3.0
ya
s = int(input("Ya
snz: "))
if ya
s == 18:
print("18 iyidir!")
elif ya
s < 0:
print("Yok canm, daha neler!...")
elif ya
s < 18:
print("Gen bir karde
simizsin!")

elif ya
s > 18:
print("Eh, artk ya
s yava
s yava
s kemale eriyor!")

Yukardaki rne
gi elbette s
yle de yazabiliriz:
#!/usr/bin/env python3.0
ya
s = int(input("Ya
snz: "))
if ya
s == 18:
print("18 iyidir!")
if ya
s < 0:
print("Yok canm, daha neler!...")
if ya
s < 18:
print("Gen bir karde
simizsin!")
if ya
s > 18:
print("Eh, artk ya
s yava
s yava
s kemale eriyor!")

Bu iki program da ayn i


slevi grecektir. O halde s
yle bir soru geliyor akla: if varken elife
ne lzum var? Ilk bak
sta pek belli olmasa da if ile elif arasnda ok nemli bir fark vardr.
if bize olas btn sonular listeler, elif ise sadece do
gru olan ilk sonucu verir. Bu soyut
tanmlamay biraz somutla
stralm:
#!/usr/bin/env python3.0
a = int(input("Bir say giriniz: "))
if a < 100:
print("verdi
giniz say 100den kktr.")
if a < 50:
print("verdi
giniz say 50den kktr.")
if a == 100:
print("verdi
giniz say 100dr.")
if a > 100:
print("verdi
giniz say 100den byktr.")
if a > 150:
print("verdi
giniz say 150den byktr.")

Yukardaki kodlar al
strd
gmzda, do
gru olan btn sonular listelenecektir. Yani mesela
kullanc 40 saysn girmi
sse, ekrana verilecek kt s
yle olacaktr:
verdi
giniz say 100den kktr.
verdi
giniz say 50den kktr.

Burada 40 says hem 100den, hem de 50den kk oldu


gu iin iki sonu da kt olarak
verilecektir. Ama e
ger yukardaki kodlar s
yle yazarsak:
#!/usr/bin/env python3.0
a = int(input("Bir say giriniz: "))

if a < 100:
print("verdi
giniz say 100den kktr.")
elif a < 50:
print("verdi
giniz say 50den kktr.")
elif a == 100:
print("verdi
giniz say 100dr.")
elif a > 150:
print("verdi
giniz say 150den byktr.")
elif a > 100:
print("verdi
giniz say 100den byktr.")

Kullancnn 40 saysn girdi


gini varsayarsak, bu defa programmmz yalnzca s
u kty verecektir:
verdi
giniz say 100den kktr.

Grd
gnz gibi, elif deyimlerini kulland
gmz zaman, ekrana yalnzca do
gru olan ilk sonu
veriliyor. Yukarda 40 says hem 100den hem de 50den kk oldu
gu halde, Python bu
saynn 100den kk oldu
gunu grr grmez sonucu ekrana basp, kodlarn geri kalann
incelemeyi brakyor. if deyimlerini arka arkaya sralad
gmzda ise, Python btn olaslklar
tek tek de
gerlendirip, geerli olan btn sonular ekrana dkyor...
Bir sonraki blmde else deyimini
grendi
gimiz zaman, elifin tam olarak ne i
se yarad
gn
ok daha iyi anlamanz sa
glayaca
gn d
snd
gm bir rnek verece
gim.
elifi de inceledi
gimize gre, ko
sul bildiren deyimlerin sonuncusuna gz atabiliriz: else

2.4 else deyimi


S
imdiye kadar Pythonda ko
sul bildiren iki deyimi
grendik. Bunlar if ve elif idi. Bu blmde
ise ko
sul deyimlerinin sonuncusu olan elseyi grece
giz.
grendi
gimiz s
eyleri s
yle bir gzden geirecek olursak, temel olarak s
yle bir durumla kar
s kar
sya oldu
gumuzu grrz:
if falanca:
bu i
slemi yap
if filanca:
su i

slemi yap

Veya s
yle bir durum:
if falanca:
bu i
slemi yap
elif filanca:
su i

slemi yap

if ile elif arasndaki fark biliyoruz. E


ger if deyimlerini art arda sralayacak olursak, Python
do
gru olan btn sonular listeleyecektir. Ama e
ger if deyiminden sonra elif deyimini kullanrsak, Python do
gru olan ilk sonucu listelemekle yetinecektir.

Bu blmde grece
gimiz else deyimi, yukardaki tabloya bamba
ska bir boyut kazandryor.
Dikkat ederseniz s
imdiye kadar
grendi
gimiz deyimleri kullanabilmek iin ilgili btn durumlar
tanmlamamz gerekiyor. Yani:
e
ger byle bir durum varsa:
bunu yap
e
ger
syle bir durum varsa:
sunu yap

e
ger filancaysa:
syle git

e
ger falancaysa:
byle gel

gibi...
Ancak her durum iin bir if blo
gu yazmak bir sre sonra yorucu ve skc olacaktr. I
ste bu
noktada devreye else deyimi girecek. elsenin anlam kabaca s
udur:
e
ger yukardaki ko
sullarn hibiri gerekle
smezse...
Gelin isterseniz bununla ilgili s
yle bir rnek verelim:
#!/usr/bin/env python3.0
soru = input("Bir meyve ad syleyin bana:")
if soru == "elma":
print("evet, elma bir meyvedir...")
elif soru == "karpuz":
print("evet, karpuz bir meyvedir...")
elif soru == "armut":
print("evet, armut bir meyvedir...")
else:
print(soru, "gerekten bir meyve midir?")

E
ger kullanc soruya elma, karpuz veya armut cevab verirse, evet, ... bir meyvedir
kts verilecektir. Ama e
ger kullanc bu d
snda bir cevap verirse, ... gerekten bir
meyve midir? ktsn grrz... Burada else deyimi, programmza s
u anlam katyor:
E
ger kullanc yukarda belirlenen meyve adlarndan hi birini girmez, bunlarn yerine bamba
ska bir s
ey yazarsa, o zaman else blo
gu iinde belirtilen i
slemi gerekle
stir.
Dikkat ederseniz yukardaki kodlarda if deyimlerini art arda sralamak yerine ilk iften sonra
elif ile devam ettik. Peki s
yle bir s
ey yazarsak ne olur?
#!/usr/bin/env python3.0
soru = input("Bir meyve ad syleyin bana:")
if soru == "elma":
print("evet, elma bir meyvedir...")
if soru == "karpuz":

print("evet, karpuz bir meyvedir...")


if soru == "armut":
print("evet, armut bir meyvedir...")
else:
print(soru, "gerekten bir meyve midir")

Bu kodlar bekledi
giniz sonucu vermeyecektir. Isterseniz yukardaki kodlar al
strp ne demek
istedi
gimi daha iyi anlayabilirsiniz. Pythonun do
gru sonucu vermesi iin bu tr durumlarda
else deyiminden nce elif deyimlerinden yararlanmalyz...
Yalnz bu dedi
gimizden, else ifadesi if ile birlikte kullanlmaz, anlam karlmamal. Mesela
s
yle bir rnek yaplabilir:
#!/usr/bin/env python3.0
soru = input("Programdan kmak istedi
ginize emin misiniz? \
Eminseniz e harfine basn : ")
if soru == "e":
print("Gle gle!")
else:
print("Peki, biraz daha sohbet edelim!")

Bir nceki blmde elif deyiminin tam olarak ne i


se yarad
gn anlamamz sa
glayacak bir
rnek verece
gimizi sylemi
stik. S
imdi bu rne
ge bakalm:
#!/usr/bin/env python3.0
boy = int(input("boyunuz ka cm?"))
if boy < 170:
print("boyunuz ksa")
elif boy < 180:
print("boyunuz normal")
else:
print("boyunuz uzun")

Yukarda sekiz satrla halletti


gimiz i
si sadece if deyimleriyle yapmaya al
srsanz bunun ne
kadar zor oldu
gunu greceksiniz. Diyelim ki kullanc 165 cevabn verdi. Python bu 165
saysnn 170ten kk oldu
gunu grnce boyunuz ksa cevabn verecek, teki satrlar
de
gerlendirmeyecektir. 165 says, elif ile gsterdi
gimiz ko
sullu duruma da uygun oldu
gu
halde (165 < 180), ko
sul ilk satrda kar
sland
g iin ikinci satr de
gerlendirmeye alnmayacaktr.
Kullancnn 175 cevabn verdi
gini varsayalm: Python 175 saysn grnce nce ilk ko
sula
bakacak, verilen 175 saysnn ilk ko
sulu kar
slamad
gn grecektir (175 > 170). Bunun zerine Python kodlar incelemeye devam edecek ve elif blo
gunu de
gerlendirmeye alacaktr. 175
saysnn 180den kk oldu
gunu grnce de kt olarak boyunuz normal cevabn verecektir.
Peki ya kullanc 190 cevabn verirse ne olacak? Python yine nce ilk if blo
guna bakacak
ve 190 cevabnn bu blo
ga uymad
gn grecektir. Dolaysyla ilk blo
gu brakp ikinci blo
ga
bakacaktr. 190 cevabnn bu blo
ga da uymad
gn grnce, bir sonraki blo
gu de
gerlendirmeye

alacaktr. Bir sonraki blokta ise else deyimimiz var. Bu blmde


grendi
gimiz gibi, else
deyimi, e
ger kullancnn cevab yukardaki ko
sullarn hibirine uymazsa bu blo
gu al
str,
anlamna geliyor. Kullancnn girdi
gi 190 cevab ne birinci ne de ikinci bloktaki ko
sula uydu
gu
iin, normal bir s
ekilde else blo
gu i
sletilecek, dolaysyla da ekrana boyunuz uzun kts
verilecektir.
Pythonda ko
sullu durumlar nasl gsterece
gimizi
grendi
gimize gre, bu
grendiklerimiz
yardmyla kk bir al
strma yapabiliriz. Bir sonraki yazmzn konusu, Pythonda basit bir
hesap makinesi nasl yaplr?

2.5 Basit bir Hesap Makinesi


S
u ana kadar Pythonda pek ok s
ey
grendik. Bu
grendi
gimiz s
eylerle artk ksmen yararl
baz programlar yazabiliriz. Elbette henz yazaca
gmz programlar pek yetenekli olamayacak
olsa da, en azndan bize
grendiklerimizle pratik yapma imkan sa
glayacak... Bu blmde,
zellikle if, elif ve else yaplarn kullanarak ok basit bir hesap makinesi yapmay deneyece
giz. Bu arada, bu derste yeni s
eyler
grenerek ufkumuzu ve bilgimizi geni
sletmeyi de ihmal
etmeyece
giz.
Isterseniz nce kullancya baz seenekler sunarak i
se ba
slayalm:
#!/usr/bin/env python3.0
giri
s = """
(1) topla
(2) kar
(3) arp
(4) bl
(5) karesini hesapla
"""
print(giri
s)

Ilk satrn sadece GNU/Linux kullanclarn ilgilendirdi


gini biliyoruz artk. Bu satr Windows
kullanclar yazmasa da olur...
Ilk satrn ardndan kullancya baz seenekler sunuyoruz. Bu seenekleri ekrana yazdrmak
iin trnaktan yararland
gmza dikkat edin. Birden fazla satra yaylm
s bu tr ifadeleri
en kolay trnak yardmyla yazdrabiliriz. Esasnda her bir seenek iin ayr bir de
gi
sken
tanmlamak da mmkndr. Yani aslnda yukardaki kodlar s
yle de yazabiliriz:
#!/usr/bin/env python3.0
seenek1
seenek2
seenek3
seenek4
seenek5

=
=
=
=
=

"(1)
"(2)
"(3)
"(4)
"(5)

topla"
kar"
arp"
bl"
karesini hesapla"

print(seenek1, seenek2, seenek3, seenek4, seenek5)

Yalnz burada dikkat ederseniz, seenekler hep yan yana diziliyor. E


ger programnzda yukardaki s
ekli kullanmak isterseniz, bu seeneklerin yan yana de
gil de, alt alta grnmesini sa
glamak iin Pythonun bize sundu
gu ok faydal bir paracktan yararlanabilirsiniz. Bu parac
gn
ad septir. sep, Ingilizce separator (ayra) kelimesinin ksaltmasdr. Kullanm tpk daha
nce
grendi
gimiz end parac
gna benzer:

#!/usr/bin/env python3.0
seenek1
seenek2
seenek3
seenek4
seenek5

=
=
=
=
=

"(1)
"(2)
"(3)
"(4)
"(5)

topla"
kar"
arp"
bl"
karesini hesapla"

print(seenek1, seenek2, seenek3, seenek4, seenek5, sep="\n")

Burada sep parac


gnn de
geri olarak \n ka
s dizisini belirledi
gimize dikkat edin. \n
ka
s dizisinin ne i
se yarad
gn hatrlyorsunuz. Bu dizi, yeni satr olu
sturmamz sa
glyordu...
Burada, ayra olarak yeni satr ka
s dizisini belirledi
gimiz iin her bir seenek yan yana
de
gil, alt alta grnecektir. Elbette sep parac
g iin istedi
giniz de
geri belirleyebilirsiniz.
Mesela her bir seene
gi yeni satr i
saretiyle ayrmak yerine, gibi bir i
saretle ayrmay da
tercih edebilirsiniz:
print(seenek1, seenek2, seenek3, seenek4, seenek5, sep="--")

Programnzda nasl bir giri


s paragraf belirleyece
giniz konusunda zgrsnz. Gelin isterseniz
biz birinci s
ekille yolumuza devam edelim:
#!/usr/bin/env python3.0
giri
s = """
(1) topla
(2) kar
(3) arp
(4) bl
(5) karesini hesapla
"""
print(giri
s)

Burada giri
s adl bir de
gi
sken olu
sturduk. Bu de
gi
skenin iinde barndrd
g de
geri kullanclarn grebilmesi iin print() fonksiyonu yardmyla bu de
gi
skeni ekrana yazdryoruz.
Devam edelim:
soru = input("Yapmak istedi
giniz i
slemin numarasn girin: ")

Bu kod yardmyla kullancya bir soru soruyoruz. Kullancdan yapmasn istedi


gimiz s
ey,
yukarda belirledi
gimiz giri
s seenekleri iinden bir say semesi... Kullanc 1, 2, 3, 4
veya 5 seeneklerinden herhangi birini seebilir. Kullancy, seti
gi numarann kar
ssnda
yazan i
sleme ynlendirece
giz. Yani mesela e
ger kullanc klavyedeki 1 tu
suna basarsa hesap
makinemiz toplama i
slemi yapacaktr... 2 tu
su ise kullancy karma i
slemine ynlendirir...
input() fonksiyonunu i
sledi
gimiz blmde, bu fonksiyonun de
ger olarak bir karakter dizisi
(string) verdi
gini sylemi
stik. Yukardaki kodun kts da do
gal olarak bir karakter dizisi olacaktr. Bizim s
u a
samada kullancdan karakter dizisi almamzn bir sakncas yok. nk
kullancnn girece
gi 1, 2, 3, 4 veya 5 de
gerleriyle herhangi bir matematik i
slemi
yapmayaca
gz. Kullancnn girece
gi bu de
gerler, yalnzca bize onun hangi matematik i
slemini
yapmak istedi
gini belirtecek. Dolaysyla input() fonksiyonunu yukardaki s
ekilde kullanyoruz...
Isterseniz s
imdiye kadar grd
gmz ksma topluca bakalm:
#!/usr/bin/env python3.0

giri
s = """
(1) topla
(2) kar
(3) arp
(4) bl
(5) karesini hesapla
"""
print(giri
s)
soru = input("Yapmak istedi
giniz i
slemin numarasn girin: ")

Bu kodlar al
strd
gmzda, ekranda giri
s paragrafmz grnecek ve kullancya, yapmak istedi
gi i
slemin ne oldu
gu sorulacaktr. Henz kodlarmz eksik oldu
gu iin, kullanc hangi sayy
girerse girsin, programmz hi bir i
s yapmadan kapanacaktr. O halde yolumuza devam edelim:
if soru == "1":

Bylece ilk if deyimimizi tanmlam


s olduk. Buradaki yazm s
ekline ok dikkat edin. Bu kodlarla Pythona s
u emri vermi
s oluyoruz:
E
ger soru adl de
gi
skenin de
geri 1 ise, yani e
ger kullanc klavyede 1 tu
suna
basarsa...
if deyimlerinin en sonuna : i
saretini koymay unutmuyoruz. Pythona yeni ba
slayanlarn en
ok yapt
g hatalardan birisi, sondaki bu : i
saretini koymay unutmalardr. Bu i
saret bize ok
ufak bir ayrntym
s gibi grnse de Python iin manevi de
geri ok byktr! Pythonun bize
fkeli mesajlar gstermesini istemiyorsak bu i
sareti koymay unutmayaca
gz. Bu arada, burada
== i
saretini kulland
gmza da dikkat edin. Bunun ne anlama geldi
gini nceki derslerimizde

grenmi
stik. Bu i
saret, iki s
eyin ayn de
gere sahip olup olmad
gn kar
sla
strmamz sa
glyor.
Biz burada 1in de
geri ile soru adl de
gi
skenin de
gerinin ayn olup olmad
gn sorguladk.
1in de
geri tabii ki 1dir, ama soru de
gi
skeninin de
geri kullanc tarafndan belirlenece
gi
iin henz bu de
gi
skenin de
gerinin ne oldu
gunu bilmiyoruz. Bizim programmzda kullanc
klavyeden 1, 2, 3, 4 veya 5 de
gerlerinden herhangi birini seebilir... Biz yukardaki
kod yardmyla, e
ger kullanc klavyede 1 tu
suna basarsa ne yaplaca
gn belirleyece
giz. O
halde devam edelim:
if soru == "1":
say1 = int(input("Toplama i
slemi iin ilk sayy girin: "))
say2 = int(input("Toplama i
slemi iin ikinci sayy girin: "))
print(say1, "+", say2, "=", say1 + say2)

Bylece ilk if blo


gumuzu tanmlam
s olduk.
if deyimimizi yazdktan sonra ne yapt
gmz ok nemli. Buradaki girintileri, programmz
gzel grnsn diye yapmyoruz. Bu girintilerin Python iin bir anlam var. E
ger bu girintileri
vermezsek programmz al
smayacaktr. E
ger Python kodlarna duyarl bir metin dzenleyici
kullanyorsanz, : i
saretini koyup entere bastktan sonra otomatik olarak girinti verilecektir.
E
ger kulland
gnz metin dzenleyici size byle bir gzellik sunmuyorsa entere bastktan
sonra klavyedeki bo
sluk (space) tu
sunu kullanarak drt vuru
sluk bir girinti olu
sturabilirsiniz. Bu
girintiler, ilk satrda belirledi
gimiz if deyimiyle gsterilecek i
slemlere i
saret ediyor. Dolaysyla
burada yazlan kodlar Pythoncadan Trkeye evirecek olursak s
yle bir s
ey elde ederiz:
e
ger sorunun de
geri "1" ise:
Toplama i
slemi iin ilk say girilsin ve biz bu de
gere "say1" diyelim
Ardndan toplama i
slemi iin ikinci say girilsin ve biz bu de
gere
"say2" diyelim

Son olarak, "say1", "+" i


sareti, "=" i
sareti, "say2" ve "say1 + say2"
ekrana yazdrlsn...

Gelin isterseniz buraya kadar olan blm yine topluca grelim:


#!/usr/bin/env python3.0
giri
s = """
(1) topla
(2) kar
(3) arp
(4) bl
(5) karesini hesapla
"""
print(giri
s)
soru = input("Yapmak istedi
giniz i
slemin numarasn girin: ")
if soru == "1":
say1 = int(input("Toplama i
slemi iin ilk sayy girin: "))
say2 = int(input("Toplama i
slemi iin ikinci sayy girin: "))
print(say1, "+", say2, "=", say1 + say2)

Bu kodlar al
strp, klavyede 1 tu
suna bast
gmzda, bizden bir say girmemiz istenecektir.
Ilk saymz girdikten sonra bize tekrar bir say girmemiz sylenecek. Bu emre de uyup enter
tu
suna basnca, girdi
gimiz bu iki saynn topland
gn grece
giz... Fena saylmaz, de
gil mi?
S
imdi programmzn geri kalan ksmn yazyoruz. I
sin temelini kavrad
gmza gre birden fazla
kod blo
gunu ayn anda yazabiliriz:
elif soru == "2":
say3 = int(input("karma i
slemi iin ilk sayy girin: "))
say4 = int(input("karma i
slemi iin ikinci sayy girin: "))
print(say3, "-", say4, "=", say3 - say4)
elif soru == "3":
say5 = int(input("arpma i
slemi iin ilk sayy girin: "))
say6 = int(input("arpma i
slemi iin ikinci sayy girin: "))
print(say5, "x", say6, "=", say5 * say6)
elif soru == "4":
say7 = int(input("Blme i
slemi iin ilk sayy girin: "))
say8 = int(input("Blme i
slemi iin ikinci sayy girin: "))
print(say7, "/", say8, "=", say7 / say8)
elif soru == "5":
say9 = int(input("Karesini hesaplamak istedi
giniz sayy giriniz: "))
print(say9, "saysnn karesi =", say9 ** 2)

Bunlarla birlikte kodlarmzn byk blmn tamamlam


s oluyoruz. Bu blmdeki tek fark,
ilk if blo
gunun aksine, burada elif bloklarn kullanm
s olmamz... E
ger burada btn bloklar
if kullanarak yazarsanz, biraz sonra kullanaca
gmz else blo
gu etkisiz kalacaktr. Yukardaki
kodlarda az da olsa farkllk gsteren tek yer en son elif blo
gumuz. Esasnda buradaki fark
da pek byk bir fark saylmaz. Neticede tek bir saynn karesini hesaplayaca
gmz iin, kullancdan yalnzca tek bir giri
s istiyoruz.
S
imdi de son blo
gumuzu yazalm. Az evvel tlatt
gmz gibi, bu son blok bir else blo
gu olacak:

else:
print("Yanl
s giri
s.")
print("A
sa
gdaki seeneklerden birini giriniz:", giri
s)

ok basit bir else blo


gu ile i
simizi bitirdik. Bu blo
gun ne i
se yarad
gn biliyorsunuz. E
ger
kullancnn girdi
gi de
ger yukardaki bloklardan hi birine uymuyorsa bu else blo
gunu i
slet,
gibi bir komut vermi
s oluyoruz bu else blo
gu yardmyla... Mesela kullancmz 1, 2, 3,
4 veya 5 seeneklerini girmek yerine 6 yazarsa, bu blok i
sletilecek...
Gelin isterseniz son kez kodlarmz topluca bir grelim:
#!/usr/bin/env python3.0
giri
s = """
(1) topla
(2) kar
(3) arp
(4) bl
(5) karesini hesapla
"""
print(giri
s)
soru = input("Yapmak istedi
giniz i
slemin numarasn girin: ")
if soru == "1":
say1 = int(input("Toplama i
slemi iin ilk sayy girin: "))
say2 = int(input("Toplama i
slemi iin ikinci sayy girin: "))
print(say1, "+", say2, "=", say1 + say2)
elif soru == "2":
say3 = int(input("karma i
slemi iin ilk sayy girin: "))
say4 = int(input("karma i
slemi iin ikinci sayy girin: "))
print(say3, "-", say4, "=", say3 - say4)
elif soru == "3":
say5 = int(input("arpma i
slemi iin ilk sayy girin: "))
say6 = int(input("arpma i
slemi iin ikinci sayy girin: "))
print(say5, "x", say6, "=", say5 * say6)
elif soru == "4":
say7 = int(input("Blme i
slemi iin ilk sayy girin: "))
say8 = int(input("Blme i
slemi iin ikinci sayy girin: "))
print(say7, "/", say8, "=", say7 / say8)
elif soru == "5":
say9 = int(input("Karesini hesaplamak istedi
giniz sayy giriniz: "))
print(say9, "saysnn karesi =", say9 ** 2)
else:
print("Yanl
s giri
s.")
print("A
sa
gdaki seeneklerden birini giriniz:", giri
s)

Genel olarak bakt


gmzda, btn programn aslnda basit bir if, elif, else yapsndan
ibaret oldu
gunu gryoruz. Ayrca bu kodlardaki simetriye de dikkatinizi ekmek isterim.
Grd
gnz gibi her paragraf bir if, elif veya else blo
gundan olu
suyor ve her blok kendi
iinde girintili bir yap sergiliyor. Temel olarak s
yle bir s
eyle kar
s kar
syayz:

E
ger byle bir durum varsa:
syle bir i

slem yap
Yok e
ger
syle bir durum varsa:
byle bir i
slem yap
E
ger bamba
ska bir durum varsa:
syle bir

sey yap

Bylelikle s
irin bir hesap makinesine sahip olmu
s olduk!... Hesap makinemiz pek yetenekli
de
gil, ama olsun... Henz bildiklerimiz bunu yapmamza msaade ediyor. Yine de ba
slangtan
bu noktaya kadar epey yol katetti
gimizi gryorsunuz.
S
imdi bu program al
strn ve neler yapabildi
gine gz atn. Bu arada kodlar da iyice inceleyin.
Program yeterince anladktan sonra, program zerinde kendinize gre baz de
gi
siklikler yapn,
yeni zellikler ekleyin. Eksikliklerini, zayf ynlerini bulmaya al
sn. Bylece bu dersten azami
fayday sa
glam
s olacaksnz.
Bu arada bu blmde yazd
gmz basit hesap makinesinin Python 2.x iin olan bir benzerini
zamannda http://www.istihza.com/kosul_elif.html adresinde vermi
stim. O kodlarla bu kodlar
kar
sla
strarak, Python 2.x ve 3.x srmleri arasndaki baz farklar grebilirsiniz...

BLM

Pythonda Dngler (loops)

S
imdiye kadar Pythonla baz ufak programlar yazabilecek dzeye geldik. Mesela
grendi
gimiz
bilgiler yardmyla bir nceki blmde ok basit bir hesap makinesi yapabilmi
stik. Yalnz o
hesap makinesinde farkettiyseniz ok nemli bir eksiklik vard. Hesap makinemizle hesap
yaptktan sonra programmz kapanyor, yeni hesap yapabilmek iin program yeniden ba
slatmamz gerekiyordu...
Mesela bununla ilgili s
yle bir rnek daha verelim:
#!/usr/bin/env python3.0
tuttu
gum_say = 23
bilbakalm = int(input("Aklmdan bir say tuttum. Bil bakalm ka tuttum?? "))
if bilbakalm == tuttu
gum_say:
print("Tebrikler! Bildiniz...")
else:
print("Ne yazk ki tuttu
gum say bu de
gildi...")

Burada tuttu
gum_say adl bir de
gi
sken belirledik. Bu de
gi
skenin de
geri 23. Kullancdan
tuttu
gumuz sayy tahmin etmesini istiyoruz. E
ger kullancnn verdi
gi cevap tuttu
gum_say
de
gi
skeninin de
geriyle aynysa (yani 23 ise), ekrana Tebrikler!... yazs dklecektir. Aksi
halde (else) Ne yazk ki... cmlesi ekrana dklecektir.
Bu program iyi, ho
s, ama ok nemli bir eksi
gi var. Bu program yalnzca bir kez kullanabiliyoruz. Yani kullanc yalnzca bir kez tahminde bulunabiliyor. E
ger kullanc bir kez daha tahminde bulunmak isterse program yeniden al
strmas gerekecek... Bunun hi iyi bir yntem
olmad
g ortada. Programmz srekli olarak ba
sa dnse ne iyi olurdu, de
gil mi? Yani kullanc
bir say tahmin ettikten sonra, e
ger bu say bizim tuttu
gumuz sayyla ayn de
gilse, kullancya
tekrar tahmin etme frsat verebilsek ok ho
s olurdu...
I
ste bu blmde, programlarmz nasl dng iine sokabilece
gimizi, yani nasl srekli
olarak al
smalarn sa
glayabilece
gimizi
grenece
giz.

49

3.1 while Dngs (while loop)


Ingilizce bir kelime olan while, Trkede ... iken, ... oldu
gu srece gibi anlamlara gelir.
Pythonda while bir dngdr. Bir nceki blmde syledi
gimiz gibi, dngler sayesinde
programlarmzn srekli olarak al
smasn sa
glayabiliriz. Bu dersimizde Pythonda while
dngsnn ne oldu
gunu ve ne i
se yarad
gn
grenmeye al
saca
gz. ncelikle while
dngsnn temellerini kavrayarak i
se ba
slayalm.
Basit bir while dngs kabaca s
una benzer:
#!/usr/bin/env python3.0
a = 1
while a == 1:

Burada a adl bir de


gi
sken olu
sturduk. Bu de
gi
skenin de
geri 1. Bir sonraki satrda ise
while a == 1: gibi bir ifade yazdk. En ba
sta da syledi
gimiz gibi while kelimesi, iken,
oldu
gu srece gibi anlamlar ta
syor. Python programlama dilindeki anlam da buna olduka
yakndr. Burada while a == 1 ifadesi programmza s
yle bir anlam katyor:
a de
gi
skeninin de
geri 1 oldu
gu srece...
Grd
gnz gibi cmlemiz henz eksik. Yani belli ki bunun bir de devam olacak. Ayrca
while ifadesinin sonundaki : i
saretinden anlad
gmz gibi, bundan sonra gelecek satr girintili
yazlacak. Devam edelim:
#!/usr/bin/env python3.0
a = 1
while a == 1:
print("bilgisayar ldrd!")

Burada Pythona s
u emri vermi
s olduk:
a de
gi
skeninin de
geri 1 oldu
gu srece, ekrana bilgisayar ldrd! yazsn dk!
Bu program al
strd
gmzda Python verdi
gimiz emre sadakatle uyacak ve a de
gi
skeninin
de
geri 1 oldu
gu mddete de bilgisayarmzn ekranna bilgisayar ldrd! yazsn dkecektir. Programmzn iinde a de
gi
skeninin de
geri 1 oldu
gu ve bu de
gi
skenin de
gerini
de
gi
stirecek herhangi bir s
ey bulunmad
g iin Python hi sklmadan ekrana bilgisayar
ldrd! yazsn basmaya devam edecektir. E
ger siz durdurmazsanz bu durum sonsuza kadar
devam edebilir. Bu lgnl
ga bir son vermek iin klavyenizde CTRL+C veya CTRL+Z tu
slarna
basarak program durmaya zorlayabilirsiniz...
Burada programmz sonsuz bir dngye sokmu
s olduk (infinite loop). Esasnda sonsuz
dngler genellikle bir program hatasna i
saret eder. Yani o
gu durumda programcnn arzu
etti
gi s
ey bu de
gildir. O yzden do
gru yakla
sm, dngye soktu
gumuz programlarmz durduracak bir lt belirlemektir. Yani yle bir kod yazmalyz ki, a de
gi
skeninin 1 olan de
geri bir
noktadan sonra artk 1 olmasn ve bylece o noktaya ula
sld
gnda programmz dursun. Kullancnn CTRL+C tu
slarna basarak program durdurmak zorunda kalmas pek ho
s olmuyor...
Gelin isterseniz bu soyut ifadeleri biraz somutla
stralm. ncelikle s
u iki satr yazarak i
se
ba
slyoruz:
#!/usr/bin/env python3.0
a = 1

Ilk satr geelim. Ikinci satrda, normal bir s


ekilde a de
gi
skenine 1 de
gerini atadk. S
imdi
devam ediyoruz:
#!/usr/bin/env python3.0
a = 1
while a < 10:

while ile verdi


gimiz ilk rnekte while a == 1 gibi bir ifade kullanm
stk. Bu ifade, ann
de
geri 1 oldu
gu mddete... gibi bir anlama geliyordu. while a < 10 ifadesi ise, ann
de
geri 10dan kk oldu
gu mddete... anlamna gelir. I
ste burada programmzn sonsuz
dngye girmesini engelleyecek bir lt koymu
s olduk. Buna gre, a de
gi
skeninin s
imdiki
de
geri 1dir. Biz, ann de
geri 10dan kk oldu
gu mddete bir i
slem yapaca
gz... Devam
edelim:
#!/usr/bin/env python3.0
a = 1
while a < 10:
print("bilgisayar yine ldrd!")

Ne oldu? Istedi
gimizi elde edemedik, de
gil mi? Programmz yine sonsuz dngye girdi... Bu
sonsuz dngy krmak iin CTRL+C (veya CTRL+Dye) basmamz gerekecek yine...
Sizce buradaki hata nereden kaynakland? Yani neyi eksik yaptk da programmz sonsuz
dngye girmekten kurtulamad? Aslnda bunun cevab ok basit. Biz yukardaki kodlar
yazarak Pythona s
u emri vermi
s olduk:
ann de
geri 10dan kk oldu
gu mddete ekrana bilgisayar yine ldrd!
yazsn bas!
a de
gi
skeninin de
geri 1. Yani 10dan kk... Dolaysyla Pythonun ekrana o kty basmasn
engelleyecek herhangi bir s
ey yok... S
imdi bu problemi nasl a
saca
gmz grece
giz:
#!/usr/bin/env python3.0
a = 1
while a < 10:
a = a + 1
print("bilgisayar yine ldrd!")

Burada a = a + 1 diye bir s


ey ekledik kodlarmzn arasna. Bu satr, ann de
gerine her
defasnda 1 ekliyor. En sonunda ann de
geri 10a ula
snca da, Python ekrana bilgisayar
yine ldrd! cmlesini yazmay brakyor. nk while ifadesi iinde belirtti
gimiz lte
gre, programmzn devam edebilmesi iin ann de
gerinin 10dan kk olmas gerekiyor.
ann de
geri 10a ula
st
g anda bu lt bozulacaktr.... Gelin isterseniz bu kodlar Pythonun
nasl alglad
gna bir bakalm:
Python ncelikle a = 1 satrn gryor.
Daha sonra ann de
geri 10dan kk oldu
gu mddete... satrn gryor.
Ardndan ann de
gerini, 1 artryor (a = a + 1) ve ann de
geri 2 oluyor.
ann de
geri (yani 2) 10dan kk oldu
gu iin Python ekrana ilgili kty veriyor.
Ilk dngy bitiren Python ba
sa dnyor ve ann de
gerinin 2 oldu
gunu gryor.

ann de
gerini yine 1 artryor ve ay 3 yapyor.
ann de
geri hl 10dan kk oldu
gu iin ekrana yine ilgili kty veriyor.
Ikinci dngy de bitiren Python yine ba
sa dnyor ve ann de
gerinin 3 oldu
gunu
gryor.
Yukardaki admlar tekrar eden Python, ann de
gerini 9 yapana kadar geliyor.
ann de
geri 9a ula
st
gnda Python ann de
gerini bir kez daha artrnca bu de
ger 10a
ula
syor.
Python ann de
gerinin artk 10dan kk olmad
gn gryor ve programdan kyor...

Yukardaki kodlar s
yle yazarsak belki durum daha anla
slr olabilir:
#!/usr/bin/env python3.0
a = 1
while a < 10:
a = a + 1
print(a)

Burada Pythonun arkada ne i


sler evirdi
gini daha net grebiliyoruz. Kodlarmz iine ekledi
gimiz while dngs sayesinde Python her defasnda a de
gi
skeninin de
gerini kontrol
ediyor ve bu de
ger 10dan kk oldu
gu mddete a de
gi
skeninin de
gerini 1 artrp, yeni
de
geri ekrana basyor. Bu de
gi
skenin de
geri 10a ula
st
gnda ise, bu de
gerin artk 10dan
kk olmad
gn anlayp btn i
slemleri durduruyor.
Gelin isterseniz bu while dngsn daha nce yazd
gmz hesap makinemize uygulayalm:
#!/usr/bin/env python3.0
a = 1
while a < 10:
a = a + 1
giri
s = """
(1) topla
(2) kar
(3) arp
(4) bl
(5) karesini hesapla"""
print(giri
s)
soru = input("Yapmak istedi
giniz i
slemin numarasn girin: ")
if soru == "1":
say1 = int(input("Toplama i
slemi iin ilk sayy girin: "))
say2 = int(input("Toplama i
slemi iin ikinci sayy girin: "))
print(say1, "+", say2, "=", say1 + say2)
elif soru == "2":
say3 = int(input("karma i
slemi iin ilk sayy girin: "))
say4 = int(input("karma i
slemi iin ikinci sayy girin: "))
print(say3, "-", say4, "=", say3 - say4)
elif soru == "3":

say5 = int(input("arpma i
slemi iin ilk sayy girin: "))
say6 = int(input("arpma i
slemi iin ikinci sayy girin: "))
print(say5, "x", say6, "=", say5 * say6)
elif soru == "4":
say7 = int(input("Blme i
slemi iin ilk sayy girin: "))
say8 = int(input("Blme i
slemi iin ikinci sayy girin: "))
print(say7, "/", say8, "=", say7 / say8)
elif soru == "5":
say9 = int(input("Karesini hesaplamak istedi
giniz sayy giriniz: "))
print(say9, "saysnn karesi =", say9 ** 2)
else:
print("Yanl
s giri
s.")
print("A
sa
gdaki seeneklerden birini giriniz:", giri
s)

Burada girintilere zellikle dikkat ediyoruz. while dngsnn kendisi zaten girintili bir kod
yazmay gerektirdi
gi iin kendisinden sonra gelen btn kodlar da bir seviye sa
ga kaydrdk.
Ayrca burada yapt
gmz s
ey aslnda kullancya 9 kez hesap yapma hakk vermek oldu... a
de
gi
skeninin ilk de
geri 1 oldu
gu ve lt olarak belirledi
gimiz say 10 oldu
gu iin kullanc
ancak 9 kez art arda hesap yapabilir bu kodlara gre...
Aslnda burada bir problem var. Kullancya 9 kez art arda hesap yapma hakk veriyoruz, ama
ona istedi
gi zaman programdan kma hakk tanmyoruz. Bu kodlar al
stran bir kullanc
programdan kmak iin 9 kez hesap yapmak zorunda kalacaktr! Bunun iyi bir yntem olmad
g ak. O halde gelin bu soruna bir are bulalm. Mesela kullanc klavyedeki harfine
bast
gnda programdan kabilsin... A
sa
gdaki kodlar dikkatlice inceleyin:
#!/usr/bin/env python3.0
a = 1
while a == 1:
giri
s = """
(1) topla
(2) kar
(3) arp
(4) bl
(5) karesini hesapla
Programdan kmak iin "" harfine basnz...
"""
print(giri
s)
soru = input("Yapmak istedi
giniz i
slemin numarasn girin: ")
if soru == "1":
say1 = int(input("Toplama i
slemi iin ilk sayy girin: "))
say2 = int(input("Toplama i
slemi iin ikinci sayy girin: "))
print(say1, "+", say2, "=", say1 + say2)
elif soru == "2":
say3 = int(input("karma i
slemi iin ilk sayy girin: "))
say4 = int(input("karma i
slemi iin ikinci sayy girin: "))
print(say3, "-", say4, "=", say3 - say4)

elif soru == "3":


say5 = int(input("arpma i
slemi iin ilk sayy girin: "))
say6 = int(input("arpma i
slemi iin ikinci sayy girin: "))
print(say5, "x", say6, "=", say5 * say6)
elif soru == "4":
say7 = int(input("Blme i
slemi iin ilk sayy girin: "))
say8 = int(input("Blme i
slemi iin ikinci sayy girin: "))
print(say7, "/", say8, "=", say7 / say8)
elif soru == "5":
say9 = int(input("Karesini hesaplamak istedi
giniz sayy giriniz: "))
print(say9, "saysnn karesi =", say9 ** 2)
elif soru == "":
print("Tekrar gr
smek zere!")
a = 0
else:
print("Yanl
s giri
s.")
print("A
sa
gdaki seeneklerden birini giriniz:")

Bu kodlar bir ncekine gre ok daha sa


glkl oldu. Bir defa artk kullancya istedi
gi kadar
hesap yapma imkan sunuyoruz. Ayrca kullancmz artk programdan istedi
gi zaman kabilecek. Giri
s paragrafmza, programdan nasl klaca
gn anlatan bir cmle de ekledik. Buna
gre e
ger kullanc program al
srken harfine basarsa programdan klacak... Programmz
iinde bunu sa
glayan kodumuz s
u:
elif soru == "":
print("Tekrar gr
smek zere!")
a = 0

Programmzn en ba
sndaki while dngsn nasl kurdu
gumuza dikkat edin. S
yle dedik:
a = 1
while a == 1:

nce ann de
gerini 1 olarak belirledik ve s
u emri verdik:
a de
gi
skeninin de
geri 1 oldu
gu mddete a
sa
gdaki kodlar al
str...
Dikkat ederseniz burada a = a + 1 gibi bir s
ey yazmadk. nk buna gerek kalmad. a
de
gi
skeninin de
gerini her dngde 1 artrmak yerine, a de
gi
skenin de
gerini, yeni ekledi
gimiz
elif blo
gu iinde de
gi
stirdik. Farkettiyseniz, bu yeni elif blo
gu iinde a = 0 diye bir satr
var. I
ste bu satr sayesinde, kullanc harfine bast
gnda a de
gi
skeninin de
geri de 0
olarak belirleniyor. Bizim en ba
sta belirledi
gimiz, programn al
smaya devam etme s
art a
= 1 oldu
gu iin, Python artk a de
gi
skeninin de
gerinin 1 de
gil 0 oldu
gunu grnce
programdan kyor... Ayrca programmzn en sonundaki else blo
gunda da ufak bir kozmetik
de
gi
siklik yaptk. Daha nce else blo
gunu s
yle yazm
stk:
else:
print("Yanl
s giri
s.")
print("A
sa
gdaki seeneklerden birini giriniz:", giri
s)

Ama artk bu sondaki giri


s de
gi
skenini kaldryoruz. nk artk programmz srekli olarak
en ba
sa dnd
g ve programn en ba
snda da giri
s de
gi
skeni ekrana yazdrld
g iin, programn sonunda bir kez daha bu de
gi
skeni ekrana yazdrmamza gerek yok. Isterseniz pro-

gramn sonunda giri


s de
gi
skenini tekrar yazdrarak nasl bir grnt elde edildi
gini kontrol
edebilirsiniz...
S
imdilik while dngs ile ilgili olarak syleyeceklerimiz bu kadar. Bundan sonra da bu
dngy sk sk kullanp farkl zelliklerini incelemeye devam edece
giz. Ama s
imdi ba
ska
bir dngden bahsedece
giz: Pythonda for dngs.

3.2 for Dngs (for loop)


Pythonda i
sleyece
gimiz ikinci dng, for dngsdr. for dngs, Pythondaki en sk
kullanlan
gelerden biridir desek abartm
s olmayz. Bu dngnn Python programlama
dilinde olduka geni
s bir kullanm alan vardr. Bu dngnn ne i
se yarad
gn ve nasl kullanld
gn
grendikten sonra, Pythonda yapabildiklerimizin epey artt
gn greceksiniz. Ayrca
bu blmde for dngsn i
slerken bir yandan da ok nemli baz ba
ska yeni aralar da

grenece
giz. O halde hi vakit kaybetmeden bu dngnn ne olup ne olmad
gna bir bakalm:
Isterseniz for dngsn do
grudan tarif etmeye al
smak yerine, basit bir rnek yardmyla
bu dngy kavramaya al
salm:
isim = "istihza"
for harfler in isim:
print(harfler)

Bu kodlar incelemeye ba
slamadan nce, isterseniz kodlarmz al
strp ne i
s yapt
gna bir
bakalm. Bu kodlar al
strd
gmz zaman s
yle bir kt elde edece
giz:
i
s
t
i
h
z
a

Grd
gnz gibi, yazd
gmz kodlar, isim de
gi
skeninin de
gerini alp her bir harfi alt alta
ekrana yazdrd. Peki bu nasl oldu? Hemen, yazd
gmz kodlar incelemeye koyulalm.
ncelikle, her zaman yapt
gmz gibi, bir de
gi
sken tanmlyoruz:
isim = "istihza"

Burada herhangi bir gariplik yok. Devam edelim.


De
gi
skenimizi tanmladktan sonra bir for dngs kuruyoruz:
for harfler in isim:
print(harfler)

Burada, Pythona kabaca s


yle bir emir vermi
s oluyoruz:
isim adl de
gi
skenin iindeki
gelerin her birini tek tek harfler olarak adlandr!
Ardndan da bu harfler de
gi
skenini ekrana bas!
Bu emrimizi duyan Python istihza adl karakter dizisine s
yle bir bakacak, bu karakter dizisi
iinde grd
g btn harfleri tek tek tarayacak, bu harflerin her birine harfler adn verecek
ve harfler olarak adlandrd
g bu
geleri tek tek ekrana basacaktr...
Burada neler olup bitti
gini daha iyi anlamak iin bir rnek daha verelim:

for harfler in "Python Programlama Dili":


print(harfler)

Biraz nceki rnekte grd


gmz gibi, yukardaki kodlar al
strd
gmzda da Python Programlama Dili adl karakter dizisinin btn harfleri tek tek ekrana baslacaktr. Ayrca yine
bu rnekte grd
gmz gibi, karakter dizimizi, nce bir de
gi
skene atamak zorunda kalmadan
do
grudan for dngs iine de yerle
stirebiliyoruz.
Hatrlarsanz, bir nceki blmde while dngsn i
slerken s
una benzer bir rnek vermi
stik:
a = 0
while a < 10:
a = a + 1
print(a)

Bu kodlar al
strd
gmz zaman, 1den 10a kadar olan saylarn ekrana basld
gn grrz.
Byle bir s
eyi for dngsn kullanarak, daha kolay bir s
ekilde yapabiliriz:
for saylar in range(10):
print(saylar)

Burada elde etti


gimiz kt tabii ki while dngs ile elde etti
gimiz ktdan biraz farkl. while
dngsnde, 1den 10a kadar olan saylar elde etmi
sken, yukardaki for dngsnde 0dan
10a kadar olan saylar elde ettik (10 hari). Bu durum yukardaki kodlar iinde kulland
gmz
range() fonksiyonunun al
sma biiminden kaynaklanyor. Bu range() fonksiyonunu bir sonraki blmde ayrntl olarak i
sleyece
giz. S
imdilik bu fonksiyonun sadece yukarda nasl kullanld
gna dikkat etmemiz yeterli olacaktr...
for dngsyle s
yle bir rnek de yapabiliriz:
for araya_nokta in "PYTHON":
print(araya_nokta, end=".")

Burada for dngs PYTHON karakter dizisinin btn


gelerini tek tek taryor ve end
parac
gyla belirtti
gimiz . i
saretini her bir
genin arasna yerle
stiriyor...
E
ger yukardaki kodlar al
strd
gnzda komut ekran yeni satra gemiyorsa, yani s
yle bir
grnt elde ediyorsanz:
P.Y.T.H.O.N.istihza@istihza:~/Desktop$

...yukardaki kodlar s
u s
ekilde yazabilirsiniz:
for araya_nokta in "PYTHON":
print(araya_nokta, end=".")
print()

En son satra yazd


gmz bo
s print() fonksiyonu ekrana bo
s bir satr basarak, alt satra
geilmesini sa
glayacaktr...
Bylece temel olarak Pythondaki dngleri incelemi
s olduk. Pythona ili
skin daha ok s
ey

grendike bu dngleri daha yetkin bir biimde kullanabilece


giz. S
imdi isterseniz, biraz nce
bahsetti
gimiz range() fonksiyonuna bir gz atalm. Bu arada, Pythonun 2.x srmlerini kullanm
s olanlar, bir sonraki blmde i
sleyece
gimiz range() fonksiyonunun 2.xe gre baz farkllklar ierdi
gini greceklerdir...

3.3 range() Fonksiyonu


Bir nceki blmde range() fonksiyonuna ksaca de
ginmi
s, konunun ayrntsn bu blme
brakm
stk. I
ste s
imdi bu range() fonksiyonunun ne i
se yarad
gn, ne tr zellikleri oldu
gunu
grece
giz.
range kelimesi Trkede aralk anlamna gelir. Adndan da anla
slaca
g gibi, bu fonksiyon
yardmyla belli bir aralktaki saylar zerinde i
slem yapabilece
giz. Bu fonksiyonla birka rnek
yaparak i
se ba
slayalm. Mesela s
u rne
ge bakalm (Bu rne
gi etkile
simli kabukta yazabiliriz):
>>> range(10)

Bu komutu verdi
gimizde s
yle bir kt alrz:
range(0, 10)

Buradan anlad
gmza gre, range(10) komutu, ierisinde 0dan 10a kadar olan saylar
barndryor (10 says hari). Bu saylar listelemek iin s
yle bir komut vermemiz gerekir:
>>> list(range(10))

Burada, list() adl yeni bir fonksiyon daha gryoruz. Bu fonksiyonu bu derste incelemeyece
giz. list() fonksiyonu daha sonraki bir dersimizin konusu olacak. Biz s
imdilik bu fonksiyonun, listeleme grevi grd
gn bilelim. list() fonksiyonunun buradaki grevi, range()
fonksiyonu iindeki saylar listelemektir. Yukardaki komutu i
sletti
gimizde s
yle bir kt alaca
gz:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Bylece range() fonksiyonu yardmyla, 0dan 10a kadar olan saylar listelemi
s olduk. Burada
10 saysnn listede yer almad
gna dikkat edin. Ayrca, yukardaki komutu etkile
simli kabukta
yazd
gmz iin ba
sa print() komutunu eklemek zorunda kalmadk. Ama e
ger bu kodlar bir
dosya iine yazp kaydetmi
s olsaydk, ba
sa mutlaka print() fonksiyonunu eklememiz gerekecekti:
print(list(range(10)))

Burada, at
gmz btn parantezleri satr sonunda kapatmay unutmuyoruz... E
ger btn
parantezleri kapatmazsak programmz hata verecektir...
range() fonksiyonu baz ba
ska gzellikler de sunar bize. Mesela bu fonksiyonu kullanrken
mutlaka 0dan ba
slamak gibi bir mecburiyetimiz yoktur. rne
gin s
yle bir s
ey yazabiliriz:
>>> list(range(1, 11))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Grd
gnz gibi, yukardaki komut yardmyla 1den 10a kadar olan saylar yazdrabildik. Burada, range() fonksiyonunun saymaya katan ba
slayaca
gn nasl belirledi
gimize dikkat edin.
E
ger 2den 10a kadar olan btn saylar listelemek isteseydik s
yle bir s
ey yazacaktk:
>>> list(range(2, 11))

range() fonksiyonunun yetenekleri bunlarla snrl de


gildir.
Bu fonksiyon yardmyla
yazdrd
gmz saylar birer birer artmak zorunda da de
gildir. Yani illa 1, 2, 3, 4... s
eklinde
ilerlemek zorunda de
giliz. Istersek 0, 2, 4, 6... s
eklinde de ilerleyebiliriz:

>>> list(range(0, 10, 2))

Burada bir nokta dikkatinizi ekmi


s olmal. Yukardaki kodda ba
slang says olan 0 da belirttik. Normalde, e
ger saymaya sfrdan ba
slayacaksak, 0 saysn ayrca belirtmemize gerek
yoktur. Ama yukardaki rnekte, yapmak istedi
gimiz s
eyi gerekle
stirebilmek iin parantez
iinde adet say belirtmemiz gerekiyor. nk range() fonksiyonunun forml s
u s
ekildedir:
range(ba
slang_de
geri, biti
s_de
geri, atlama_de
geri)

Burada ba
slang_de
geri olarak belirtti
gimiz yere, saymaya katan ba
slayaca
gmz yazyoruz. biti
s_de
gerine sayma i
sleminin hangi sayya kadar devam edece
gini yazaca
gz.
atlama_de
geri s
eklinde gsterdi
gimiz ifadeye ise, range() fonksiyonunun, ba
slang
de
gerinden biti
s de
gerine kadar olan saylar sralarken kaar kaar atlamas gerekti
gini yazmamz gerekiyor. range() fonksiyonunda ba
slang_de
gerinin varsaylan bir de
geri vardr.
Bu de
ger 0dr. Yani e
ger range() fonksiyonunu kullanarak 100e kadar sayacaksanz ve
list(range(100)) gibi bir kod yazm
ssanz, Python sizin 0dan ba
slamak istedi
ginizi varsayacaktr. biti
s_de
gerinin varsaylan bir de
geri yoktur. Bunu bizim belirlememiz gerekir. atlama_de
gerinin varsaylan de
geri ise 1dir. Yani e
ger herhangi bir atlama de
geri belirtmezseniz, Python sizin birer birer saymak istedi
ginizi varsayacaktr. Dolaysyla, list(range(100))
gibi bir kod yazd
gmzda Python bunu alttan alta s
u s
ekilde grecektir:
>>> list(range(0, 100, 1))

E
ger 0dan 100e kadar olan saylar iki
ser iki
ser atlayarak listelemek istiyorsanz ve bu iste
ginizi s
u s
ekilde belirtirseniz Pythonun kafasnn kar
smasna yol aarsnz:
>>> list(range(100, 2))

Burada Python sizin ne yapmaya al


st
gnz anlayamaz. Parantez iinde ilk de
ger olarak
100, ikinci de
ger olarak ise 2 yazd
gnz iin, Python bu 100 saysn ba
slang de
geri; 2
saysn ise biti
s de
geri olarak alglayacaktr. Dolaysyla da Python bu durumda sizin 100den
2ye kadar olan saylar listelemek istedi
ginizi zannedecek, range() fonksiyonuyla bu s
ekilde
geriye do
gru sayamayaca
gmz iin de bo
s bir kt verecektir... Bu yzden, Pythonun s
a
srmamas iin yukardaki rne
gi s
u s
ekilde yazmalyz:
>>> list(range(0, 100, 2))

Ksacas, e
ger range() fonksiyonunun kaar kaar sayaca
gn da belirtmek istiyorsak, parantez
iine, gerekli btn saylar yazmalyz...
Bu arada, range(100, 2) gibi bir ifade yazarak saylar geriye do
gru listeleyemeyecek
olmamz, hi bir s
ekilde geriye do
gru sayamayaca
gmz anlamna gelmiyor. Elbette atlama_de
geri parametresine eksi de
gerli bir say vererek range() fonksiyonunun geriye do
gru
saymasn da sa
glayabiliriz:
>>> list(range(100, 2, -1))

Hatta istersek range() fonksiyonunun geriye do


gru kaar kaar sayaca
gn da belirtebiliriz:
>>> list(range(100, 2, -2))

...gibi...
Sanrm tekrar hatrlatmaya gerek yok. Yukardaki kodlar e
ger bir dosyaya yazp al
stracaksanz, ba
slarna print() fonksiyonunu da eklemeniz gerekir. Dolaysyla yukarda en son
verdi
gimiz rnek bir dosya iinde s
yle grnecektir:

print(list(range(0, 100, 2)))

Grd
gnz gibi, bir sr parantez i
sareti oldu kodlarmz iinde. Esasnda yukarda yapt
gmz i
slemleri yapabilmek iin farkl bir yol da izleyebiliriz. range() fonksiyonunu yukardaki
s
ekillerde kullanmak yerine, bunu bir for dngs iine de alabiliriz:
for i in range(0, 100, 2):
print(i)

Ayrca range() fonksiyonunu bir for dngs iine ald


gmzda, range() fonksiyonunun retti
gi saylarla baz yararl i
sler de yapabiliriz. rne
gin s
una bir bakn:
for arp in range(10):
print(arp * 2)

Bu kodlar al
strd
gmzda s
yle bir kt elde ederiz:
0
2
4
6
8
10
12
14
16
18

Burada Pythonun yapt


g s
ey, 0dan 10a kadar olan btn saylar tek tek 2 ile arpmak oldu...
Ayrca range() fonksiyonunu for dngs iinde kulland
gmzda list() fonksiyonunu kullanmamza gerek kalmad
gna da dikkat edin.
for dngsn ve range() fonksiyonunu if deyimi ile birlikte kullanarak s
yle bir s
ey da
yapabiliriz:
for ift_saylar in range(10):
if ift_saylar % 2 == 0:
print(ift_saylar)

Burada gerekle
sen sreci kabaca s
yle ifade edebiliriz:
0dan 10a kadar olan btn saylar tek tek tara ve bunlarn her birini ift_saylar olarak
adlandr. E
ger ift_saylar olarak adlandrd
gmz bu saylar iinde 2ye tam blnen saylar
varsa bunlar ekrana yazdr...
% i
slecinin ne i
se yarad
gn daha nceki derslerimizden hatrlyorsunuz....

BLM

Listeler

4.1 Giri
s
Bu blmde yine Pythonun ok nemli bir
gesinden bahsedece
giz. Bu dersimizin konusu
Pythonda Listeler.
Aslnda biz range() fonksiyonunu incelerken, ucundan da olsa listeleri grm
stk. Mesela s
u
rne
gi hatrlyorsunuz:
list(range(10))

Bu komut s
yle bir kt veriyordu:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

I
ste yukarda grd
gmz bu kt aslnda bir listedir... Teknik bir dille ifade etmek gerekirse,
listeler Pythondaki veri tiplerinden (data types) yalnzca bir tanesidir. S
imdiye kadar
grd
gmz veri tipleri arasnda saylar ve karakter dizileri vard... Dolaysyla, saylar,
karakter dizileri ve listeler Pythonda veri tipi ad verilen bir grubun yesidir. Bu
teknik terimleri elbette ezberlemek zorunda de
gilsiniz. Ama bilmenin zararn de
gil faydasn
grrsnz.
Pythonda listeler konusuna ksa bir giri
s yapt
gmza gre artk yava
s yava
s ayrntlara inmeye ba
slayabiliriz.

4.2 Listeleri Tanmlamak


Pythonda listeleri kullanabilmek iin ncelikle bunlar tanmlamamz gerekir. Endi
selenmeyin.
Liste tanmlamak ifadesinin kendisi biraz fantastik duruyor olsa da, aslnda liste tanmlamak
ok kolaydr!
Listeleri s
yle tanmlyoruz:
liste = []

Burada hi bir
ge iermeyen bo
s bir liste tanmladk. Bunu ekrana basmak istersek s
yle
yapmamz gerekti
gini biliyorsunuz:

60

print(liste)

Tabii bo
s bir liste tanmlad
gmz iin elde etti
gimiz kt da bo
s bir liste oldu... Burada s
a
slacak
bir s
ey yok. S
imdi isterseniz gelin bo
s bir liste yerine, iinde birka
ge barndran daha i
slevli
bir liste yapalm:
diller = ["python", "php", "perl", "C++"]

Grd
gnz gibi, programlama dillerinin bazlarn sralad
gmz, diller adl bir liste olu
sturduk. Dikkat ederseniz, liste tanmlamak, de
gi
sken veya karakter dizisi tanmlamaya ok benziyor. Listeleri ba
ska veri tiplerinden ayran en nemli zellik, [] i
saretidir. Bu i
saret, arka
arkaya dizilmi
s
gelerin bir liste oldu
gunu gsterir. Yani [] i
sareti Pythonda listelerin ayrt
edici zelli
gidir. Gelin isterseniz elimiz al
ssn diye bir ba
ska liste daha tanmlayalm:
al
sveri
s = ["elma", "armut", "kabak", "ekmek", "ilek", "
seker", "
seftali"]

Burada da basit bir al


sveri
s listesi tanmladk. Dikkat ederseniz, listenin btn
geleri birer
karakter dizisi. Bunu trnak iine alnm
s olmalarndan anlyoruz. Listelerin ayrt edici zelli
gi nasl [] i
sareti ise, karakter dizilerinin ayrt edici zelli
gi de trnak i
saretleridir... Elbette sadece karakter dizilerinden olu
san listeler tanmlamak zorunda de
giliz. Istersek,
geleri
saylardan olu
smu
s bir liste de tanmlayabiliriz:
ift_saylar = [2, 4, 6, 8, 10]

Bu listemizin
geleri ise tamsaylardan (integers) olu
smu
s.
lerinden olu
smu
s melez bir liste dahi tanmlayabiliriz:

Hatta istersek, farkl veri tip-

liste1 = ["kedi", 4, 3.5]

Hatta inanmayacaksnz ama, tanmlad


gmz bir listenin
gesi ba
ska bir liste dahi olabilir:
liste2 = ["kuzu", 12, 15.4, ["salam", "sucuk"], liste1]

Sonuncu listemizi dikkatlice inceleyin. Burada bildi


gimiz btn veri tiplerini tek bir listeye
yerle
stirdik. Bu listeyi ekrana bast
gmzda s
yle bir kt elde ederiz:
>>> print(liste2)
[kuzu, 12, 15.4, [salam, sucuk], [kedi, 4, 3.5]]

Bu listede bir nceki liste1 adl listenin kendisinin de yer ald


gna dikkat edin...
Grd
gnz gibi Pythonda bir liste tanmlamak hem ok kolay, hem de
gelerin e
sitlili
gi
asndan olduka zgrz. Isterseniz s
imdi bu listelerle neler yapabilece
gimize bakalm biraz.

4.3 Listelerin gelerine


Eri
smek
Bir nceki blmde gzel gzel tanmladk listelerimizi. Peki bu listeleri tanmladk da ne oldu?
Biz bu listeleri tanmladktan sonra ne yapaca
gz? I
ste bu blmde bu sorulara cevap vermeye
al
saca
gz.
ncelikle tanmlad
gmz listelerin
gelerine nasl eri
sebilece
gimize bakalm...
Hemen bir liste tanmlamakla ba
slayalm i
se:

sistemler = ["GNU/Linux", "Mac Os X", "Windows"]

Bylece i
sletim sistemlerinin adlarn ieren bir liste tanmlam
s olduk.

grendi
gimize gre bu listeyi s
u s
ekilde ekrana basabiliriz:

Bir nceki derste

print(sistemler)

Peki biz bu listenin btn


gelerini de
gil de sadece istedi
gimiz bir
gesini yazdrmak istersek
ne olacak?
Pythonda liste
gelerinin her birinin bir sras vardr. Liste
gelerine,
genin srasn kullanarak
ula
sabiliriz. Formlmz s
yle olacak:
liste[
genin_sras]

Buna hemen bir rnek verelim. Diyelim ki sistemler adl listedeki GNU/Linux
gesini almak
istiyoruz. S
yle bir s
ey deneyelim:
>>> print(sistemler[1])
Mac Os X

Ne oldu? GNU/Linux yerine, listenin ikinci


gesi olan Mac Os Xi verdi bu komut bize, de
gil
mi? Ama bizim istedi
gimiz bu de
gildi... Gelin bir de s
yle bir s
ey deneyelim:
>>> print(sistemler[0])
GNU/Linux

Bu sefer oldu. Buradan anlyoruz ki Python saymaya sfrdan ba


slyor. Yani listemizin ilk
gesine
ula
smak iin 1 de
gil, 0 saysn kullanmamz gerekiyor. Bu kural gz nne alarak srasyla
btn
gelerimizi yazdralm:
>>> print(sistemler[0])
GNU/Linux
>>> print(sistemler[1])
Mac Os X
>>> print(sistemler[2])
Windows

E
ger sra numaras olarak pozitif bir say yerine negatif bir say kullanrsak, liste soldan sa
ga
de
gil, sa
gdan sola, yani geriye do
gru taranacaktr:
>>> print(sistemler[-1])
Windows
>>> print(sistemler[-2])
Mac Os X
>>> print(sistemler[-3])
GNU/Linux

Burada listenin en son


gesine, -0 diye bir s
ey olamayaca
g iin -1 ifadesiyle eri
siyoruz... E
ger listede olmayan bir
genin srasn sorgularsak hata mesaj alrz. Yani
print(sistemler[5]) veya print(sistemler[-4]) gibi komutlar hata verecektir. nk sistemler adl listede be
sinci veya eksi drdnc bir
ge yok...
Pythondaki listelerin bir ba
ska zelli
gi ise, yukardaki sra numaralarnn, bir aralk belirtecek
s
ekilde kullanlabilmesidir. Bu ne demek? Yani bir listeden her defasnda sadece tek bir
ge
almak zorunda de
giliz. Istersek bir ka
geyi birden de alabiliriz. Bununla ilgili hemen bir rnek
verelim. S
yle bir listemiz olsun:
>>> isimler = ["Udith Narayan", "Sonu Nigam", "Kajol Devgan",
... "Rani Mukherjee", "Preity Zinta", "Lata Mangeshkar"]

S
imdi mesela yukardaki listeden 1-3 aras
geleri alalm:
>>> print(isimler[1:3])
[Sonu Nigam, Kajol Devgan]

Burada 0-3 aras


geleri de
gil, 1-3 aras
geleri ald
gmza dikkat edin. Bildi
giniz gibi,
listelerin ilk
gesinin sras 0dr. Ayrca 1-3 s
eklinde bir aralk belirtti
gimizde sadece birinci
ve ikinci
gelerin alnd
gna dikkat edin. Yani isimler[1:3] dedi
gimizde, alaca
gmz sonu 1.

geyi ierirken 3.
geyi iermez... Bu arada, bu i
sleme Pythoncada dilimleme (slicing) ad
verilir. Gerekten de burada yapt
gmz s
ey bir listeyi dilimlemekten ibarettir...
Ayn listeden devam edelim:
>>> print(isimler[2:5])
[Kajol Devgan, Rani Mukherjee, Preity Zinta]

Liste
gelerine tek tek eri
sirken yapt
gmz gibi, burada da negatif saylardan yararlanabiliriz:
>>> print(isimler[0:-1])

Grd
gnz gibi, yukardaki komut bir listenin son
gesini krpmak iin gayet etkili bir yoldur.
Burada farkl saylarla kendi kendinize deneme yaparsanz Pythondaki dilimleme mekanizmasn daha iyi kavrayabilirsiniz.
Listelerdeki bu sra saylarnn baz varsaylan de
gerleri vardr. Mesela, e
ger ilk sayy belirtmezseniz, Python ilk sayy 0 varsayacaktr. Yani:
>>> print(isimler[:4])
[Udith Narayan, Sonu Nigam, Kajol Devgan, Rani Mukherjee]

Grd
gnz gibi, ilk sayy belirtmedi
gimizde Python sanki isimler[0:4] yazm
sz gibi
davrand. Peki ya ikinci sayy belirtmezsek ne olur?
>>> print(isimler[0:])
[Udith Narayan, Sonu Nigam, Kajol Devgan, Rani Mukherjee,
Preity Zinta, Lata Mangeshkar]

Burada da Python sanki isimler[0:6] yazm


sz gibi davrand. Yani listenin sonuna kadar gitti.
Listelerle yapabileceklerimiz bunlarla snrl de
gildir. Yukarda grd
gmz gibi, listelere iki
farkl sra says vererek liste
gelerine teker teker veya topluca eri
sebiliyoruz. E
ger iki farkl
sra saysyla birlikte nc bir say daha verirsek, liste
gelerini, bu verdi
gimiz nc say
kadar atlayarak ekrana yazdrabiliriz. Bu tarif bir rnekle daha kolay anla
slacaktr:

>>> print(isimler[0:6:2])
[Udith Narayan, Kajol Devgan, Preity Zinta]

Grd
gnz gibi, nc say olarak verdi
gimiz 2 sayesinde liste
gelerini birer atlayarak
ekrana yazdrdk. Burada farkl saylar deneyerek sistemi daha iyi anlayabilirsiniz.
Aslnda yukardaki son rne
gi, listelerin varsaylan de
gerlerinden yararlanarak daha basit bir
s
ekilde yazabilirsiniz:
>>> print(isimler[::2])
[Udith Narayan, Kajol Devgan, Preity Zinta]

Bildi
giniz gibi, e
ger ilk sayy belirtmezseniz Python 0 demek istedi
ginizi, ikinci sayy belirtmezseniz de listedeki
ge saysn kullanmak istedi
ginizi varsayacaktr. Dolaysyla bizim 0
ve 6y ayrca belirtmemiz s
art de
gil.
S
imdi verece
gimiz rne
gi dikkatlice inceleyin:
>>> print(isimler[::-1])
[Lata Mangeshkar, Preity Zinta, Rani Mukherjee, Kajol Devgan,
Sonu Nigam, Udith Narayan]

Grd
gnz gibi, nc say olarak negatif bir de
ger de verebiliyoruz. nc say olarak
-1 verdi
gimiz zaman Python listeyi geriye do
gru sralayacaktr. Dolaysyla yukardaki komutu kullanarak, herhangi bir listeyi ters evirebiliriz. Bu zellik bir yerlerde mutlaka i
sinize
yarayacaktr.
Hatrlarsanz bir nceki blmde s
yle iki tane listemiz vard:
>>> liste1 = ["kedi", 4, 3.5]
>>> liste2 = ["kuzu", 12, 15.4, ["salam", "sucuk"], liste1]

Burada liste1 adl ilk listemizi do


grudan liste2 adl ikinci listemizin iinde kullanm
stk.
liste2 adl listeyi yazdrd
gmzda s
yle bir kt alyorduk:
>>> print(liste2)
[kuzu, 12, 15.4, [salam, sucuk], [kedi, 4, 3.5]]

Bu liste biraz kar


sk grnyor. Bakalm bu listelerin
gelerine nasl ula
sabiliriz... Srasyla
deneyelim:
>>> print(liste2[0])
kuzu
>>> print(liste1[1])
12
>>> print(liste1[2])
15.4
>>> print(liste1[3])

[salam, sucuk]

Grd
gnz gibi, son rnekte tek bir
ge de
gil, listenin kendisini alyoruz. nk liste2 adl
listenin nc
gesi bir listedir. ([salam, sucuk]). Mesela sadece salam
gesini almak
istersek s
yle bir yol izlememiz gerekir:
>>> print(liste2[3][0])
salam

Yani burada kabaca s


yle bir s
ey sylemi
s olduk:
Bana liste2 adl listenin nc
gesinin sfrnc
gesini ver!
Ayn listenin bir sonraki
gesi de bir listedir ([kedi, 4, 3.5]). Bu listedeki 3.5
gesine ula
smak iin s
yle bir s
ey yazmamz gerekir:
>>> print(liste2[4][2])
3.5

E
ger liste2 listesinin drdnc
gesini tersten sralamak isterseniz s
yle bir s
ey yazmanz
gerekti
gini tahmin edebilirsiniz:
>>> print(liste2[4][::-1])
[3.5, 4, kedi]

Bylelikle listelere ili


skin nemli bir konuyu geride brakm
s olduk. Bu noktada sizin yapmanz
gereken, yukardaki rneklere ba
gl kalmadan kendi kendinize baz rnek kodlar yazmaktr.
Kendiniz olabildi
gince byk bir liste olu
sturun ve ba
slayn bu listenin
gelerine eri
smeye...
Olu
sturdu
gunuz bu listeye de
gi
sik saylar verin. Bakn bakalm ne tr sonular elde ediyorsunuz...

4.4 len() Fonksiyonu


Bir nceki blmde grd
gnz gibi, bir listenin ka
geden olu
stu
gunu bilmek nemli bir
konu. Bir listedeki
geleri elle saymaya al
smak tabii ki hi pratik bir yol de
gil. Neyse ki
Python bize bu tr i
slemler iin i
simize yarayacak bir fonksiyon sunuyor. Bu fonksiyonun ad
len(). len ifadesi, Ingilizcedeki length (uzunluk) kelimesinin ksaltmasdr. Bu fonksiyon
yardmyla Pythonda uzunluk lme i
slemlerini yapaca
gz. Hemen bir rnek verelim:
>>> liste = ["kitap", "defter", "kalem", "silgi", "tebe
sir",
... "tahta", "sra", "
grenci", "okul", "nlk"]
>>> print(len(liste))
10

Demek ki listemizde 10 tane


ge varm
s. Peki bu listenin sonuncu
gesinin sras katr? Tabii
ki 10 de
gildir. Hemen deneyip grelim:
>>> print(liste[10])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range

Grd
gnz gibi, listemizde 10.
ge diye bir s
ey yok. nk bildi
giniz gibi listelerde saymaya 0dan ba
slyoruz. Yalnz farkettiyseniz len() fonksiyonu do
gal olarak saymaya sfrdan ba
slamyor. nk bu fonksiyon liste
gelerinin srasyla ilgilenmiyor. Bu fonksiyonun
ilgilendi
gi s
ey listedeki
gelerin says.. len() fonksiyonu bir listedeki
genin srasyla ilgili
herhangi bir bilgi vermez bize. Bu fonksiyonu kullanarak o listenin ka adet
gesi oldu
gunu

greniriz. Burada uygulad


gmz len() fonksiyonuna gre bizim listemizin 10 adet
gesi varm
s. Bu
geleri sralarken 0dan ba
slad
gmz iin sonuncu
ge do
gal olarak 10-1 olacaktr.
Yani sonuncu
gemizin sras 9dur:
>>> print(liste[9])
nlk

Herhangi bir listenin sonuncu


gesine ksa yoldan s
yle ula
sabilece
gimizi bir nceki blmde
grm
stk:
>>> print(liste[-1])

Bu komut da bir ncekinde oldu


gu gibi nlk ktsn verecektir. Isterseniz herhangi bir
listenin son
gesine s
u s
ekilde de ula
sabilirsiniz:
>>> print(liste[len(liste)-1])
nlk

Bu son komut gznze biraz kar


sk grnm
s olabilir, ama aslnda hi de kar
sk de
gildir.
S
yle d
snelim:
Listemizin 10 adet
gesi var. Pythonda saymaya 0dan ba
slad
gmz iin, mantk olarak son

ge liste uzunlu
gunun bir eksi
gi olacaktr. Yani bizim rne
gimizde son
ge 10-1 s
eklinde
gsterilebilir... Yani aslnda yukardaki kodu s
yle de yazabiliriz:
>>> print(liste[10-1])
nlk

Ama byle bir kod yazabilmek iin listenin uzunlu


gunu tam olarak biliyor olmamz lazm. Listenin uzunlu
gunu nceden bilmedi
gimizi varsayarsak, yukardaki kodda 10 yerine bir forml
yazmamz gerekir. Bize liste uzunlu
gunu tam olarak verebilecek kodun s
u oldu
gunu biliyoruz:
>>> len(liste)

Dolaysyla, bir listenin son


gesini bulmak iin liste uzunlu
gunun bir eksi
gini almamz, yani
liste uzunlu
gundan 1 karmamz yeterli olacaktr...
len() fonksiyonunu, daha nce
grendi
gimiz range() fonksiyonuyla birlikte de kullanabiliriz:
>>> print(list(range(len(liste))))

Yukardaki kod s
ununla e
sde
gerdir:
>>> print(list(range(10))

Hatta istersek for dngsn kullanarak da benzer bir sonu elde edebiliriz:
>>> for i in range(len(liste)):
...
print(i)

Gelin isterseniz s
imdiye kadar
grendiklerimizle az ok yararl bir program yazalm. Mesela
yukardaki listemizin
gelerini tek tek ekrana basalm ve her
genin solunda birer numara
gsterelim. Yani elde etmek istedi
gimiz kt s
yle bir s
ey olsun:
1. kitap
2. defter
3. kalem
4. silgi
5. tebe
sir
6. tahta
7. sra
8.
grenci
9. okul
10.nlk

ncelikle s
yle bir s
eyler deneyelim:
>>> for eleman in liste:
...
print(eleman)
kitap
defter
kalem
silgi
tebe
sir
tahta
sra

grenci
okul
nlk

Liste
gelerini ba
saryla ekrana yazdrdk. Ama bu kt bizim yapmaya al
st
gmz s
eyden
biraz uzak oldu. Demek ki kodlarmzda baz de
gi
siklikler yapmamz gerekiyor. Bir defa, bu

gelerin her birinin srasn da ekrana basabilmeliyiz. Yani 1. defter, 2. kalem, gibi...
>>> for i in range(len(liste)):
...
print(i, liste[i])
0
1
2
3
4
5
6
7
8
9

kitap
defter
kalem
silgi
tebe
sir
tahta
sra

grenci
okul
nlk

Biraz kar
sk m grnd gznze? Hi endi
selenmeyin. Burada ne yapt
gmz tane tane
anlataca
gz s
imdi... ncelikle s
u satra bakalm:
>>> for i in range(len(liste)):
...

Burada yapt
gmz s
ey, listedeki
ge saysn range() fonksiyonuna atamak. Yani aslnda s
yle
bir s
ey yazm
s olduk:

>>> for i in range(10):


...

Elbette buraya her zaman 10 gibi sabit bir say yazamayabiliriz. nk burada kulland
gmz
listeyi kendimiz olu
sturduk ve ka
geden meydana geldi
gini biliyoruz, ama gerek hayatta
bir listeyi her zaman kendiniz hazrlamam
s olabilirsiniz. Mesela ba
skasnn olu
sturdu
gu bir
listeyi alp zerinde i
slem yapmanz gerekebilir. yle bir durumda o listenin ka
geden olu
stu
gunu kesin olarak bilemezsiniz. Hatta yazd
gnz bir programn i
sleyi
si srasnda srekli olarak
byyen bir liste de sz konusu olabilir. Bu tr durumlar iin en uygun yol, sabit bir say yazmaya al
smak yerine, bir forml kullanmak olacaktr. Bir listenin uzunlu
gunu bize verecek en
uygun forml len(liste) formldr... Dolaysyla s
yle bir s
ey yazmamz gerekir:
>>> for i in range(len(liste)):
...

S
imdi yazd
gmz kodlar incelemeye devam edelim. Ilk satrla beraber, ikinci satr olarak s
yle
bir s
ey yazdk:
>>> for i in range(len(liste)):
...
print(i, liste[i])

Ilk satr biraz nce aklam


stk. Gelelim ikinci satra... Burada ncelikle i de
gi
skenini ekrana
yazdryoruz. S
yle bir s
ey yazarak resmi basitle
stirelim:
>>> for i in range(len(liste)):
...
print(i)
0
1
2
3
4
5
6
7
8
9

Grd
gnz gibi, bu kodlar, elimizdeki listenin uzunlu
gu kadar sayy ekrana basyor. Yani
sanki s
yle bir s
ey yazm
sz gibi:
>>> for i in range(10):
...
print(i)

S
imdi de kodlarmzn geri kalanna bakalm. nce tekrar topluca grelim kodlarmz:
>>> for i in range(len(liste)):
...
print(i, liste[i])

Bir nceki blmden hatrlayaca


gnz gibi, listelerin
gelerine tek tek ula
smak istedi
gimizde
s
yle bir yol izliyorduk:
>>> print(liste[0])

...veya...
>>> print(liste[2])

...gibi...

I
ste yukarda da aslnda bu kalba uygun bir kod yazdk... Birazck sadele
stirelim:
>>> for i in range(len(liste)):
...
print(liste[i])
kitap
defter
kalem
silgi
tebe
sir
tahta
sra

grenci
okul
nlk

Sanrm ne yapt
gmz artk anladnz. Grd
gnz gibi, range(len(liste)) komutu, listenin
uzunlu
gu kadar olan saylar ekrana basyor. I
ste biz bu saylar liste[i] s
eklinde tek tek kullanyoruz. Buradaki for dngs sayesinde range(len(liste)) komutunun retti
gi her bir say
tek tek liste[i] komutuna atanyor. liste[0], liste[1], liste[2], liste[3], gibi...
ktda grnen liste
gelerinin sol tarafnda her birinin srasnn da grnmesi iin kodlarmz
tabii ki s
yle yazdk:
>>> for i in range(len(liste)):
...
print(i, liste[i])
0
1
2
3
4
5
6
7
8
9

kitap
defter
kalem
silgi
tebe
sir
tahta
sra

grenci
okul
nlk

Yalnz, grd
gnz gibi kodlarmz henz elde etmek istedi
gimiz ktdan hl biraz farkl...
Bizim elde etmek istedi
gimiz kt s
yle bir s
eydi:
1. kitap
2. defter
3. kalem
4. silgi
5. tebe
sir
6. tahta
7. sra
8.
grenci
9. okul
10.nlk

Demek ki kodlarmza hl baz eklemeler yapmamz gerekiyor. Gelin s


imdi son darbeyi vuralm:
>>> for sondarbe in range(len(liste)):
...
print(sondarbe, liste[sondarbe], sep=". ")
0. kitap

1.
2.
3.
4.
5.
6.
7.
8.
9.

defter
kalem
silgi
tebe
sir
tahta
sra

grenci
okul
nlk

sep parac
gn nceki derslerimizden hatrlyorsunuz. Bu parack sayesinde
geler arasna
istedi
gimiz ifadeyi yerle
stirebiliyorduk. Biz yukardaki rnekte her bir
genin arasna . i
sareti
koymak iin kullandk bu parac
g...
Yalnz, her ne kadar yukardaki kodlarla son darbeyi vurdu
gumuzu sylesek de aslnda son
darbeyi henz vuramadk... Neden mi? nk ktda saymaya sfrdan ba
slanyor. Bizim
istedi
gimiz s
ey saymaya 0dan de
gil, 1den ba
slamakt. Saymaya 0dan ba
slamak Python
iin do
gal olsa da son kullanc asndan biraz tuhaf gelebilecek bir s
eydir... Iyi bir programc,
yazd
g programlarda mutlaka son kullancy da d
snmelidir. Sonuta sizin yazd
gnz program sizden ok, programlamadan hi bir s
ey anlamayan insanlar kullanacaktr. O yzden
son kullancy d
snmeniz gerekir... Bu sorunu da ufak bir kodla halledece
giz:
>>> for sondarbe in range(len(liste)):
...
print(sondarbe+1, liste[sondarbe], sep=". ")
1. kitap
2. defter
3. kalem
4. silgi
5. tebe
sir
6. tahta
7. sra
8.
grenci
9. okul
10.nlk

Grd
gnz gibi, sondarbe+1 s
eklinde bir kod yazarak sorunumuzu zebildik. Bylece
Python her bir sayya 1 ekleyecek, dolaysyla her bir
genin sras 1 say artrlacaktr. Bu
da bize yukardaki gibi, kullanc asndan daha do
gal grnen bir kt verecektir.
Bylece len() fonksiyonunu enine boyuna incelemi
s olduk. Yalnz bir noktay zellikle vurgulamakta fayda var: len() fonksiyonu sadece listelerle kullanlabilecek bir fonksiyon de
gildir.
len() fonksiyonunu, uzunlu
gu llebilecek her s
ey iin kullanabiliriz. Mesela karakter
dizilerinin de bir uzunlu
gu vardr. Hemen bir rnek verelim:
>>> a = "Kahramanmara
sl Abdullah"
>>> print(len(a))
24

Demek ki Kahramanmara
sl Abdullah karakter dizisinde 24 adet karakter varm
s. Bu 24
saysna iki kelime arasndaki bo
sluk karakterinin de dahil oldu
gunu unutmayn. nk
bo
slu
gun kendisi de bir karakterdir...
Hatta listelerin bir zelli
gi olarak grd
gmz dilimleme tekni
gi, karakter dizilerine de uygulanabilir. Buna da bir rnek verelim:

>>> a = "Kahramanmara
sl Abdullah"
>>> print(a[0])
K

S
imdilik burada bir nokta koyup konuyu kapatalm. Daha sonraki derslerimizde Karakter
Dizileri konusunu yeniden ve olduka ayrntl bir s
ekilde ele alaca
gz. O zaman karakter
dizilerinin btn zelliklerine tek tek bakaca
gz. Biz listeleri incelemeye devam edelim...

siklik Yapmak
4.5 Liste gelerinde
Degi
S
imdiye kadar listelerle ilgili pek ok s
ey
grendik saylr. Ama henz bir listenin
gelerini nasl
de
gi
stirebilece
gimizi bilmiyoruz. I
ste bu derste bu eksi
gimizi kapataca
gz. Yani bir listedeki
tanmlanm
s
geleri nasl de
gi
stirece
gimizi grece
giz. I
se bir liste tanmlayarak ba
slayalm:
>>> met = ["Kwrite", "Kate", "Emacs", "Vi", "Notepad"]

Diyelim ki biz bu listenin ilk


gesini de
gi
stirmek istiyoruz. Listemizin ilk
gesi olan Kwrite
yerine Vim yazalm:
>>> met[0] = "Vim"

S
imdi listemizin son halini kontrol edelim:
>>> print(met)
[Vim, Kate, Emacs, Vi, Notepad]

Grd
gnz gibi, listemizin ilk
gesi olan Kwrite gitti, onun yerine Vim geldi. Pythonda
liste
gelerini de
gi
stirmenin ne kadar kolay oldu
gunu gryorsunuz. Siz de bu listenin ba
ska

gelerini de
gi
stirerek pratik yapabilirsiniz...
Bu noktada listelerin ilgin bir zelli
ginden sz edece
giz. S
imdi met adl listemizi ba
ska bir
de
gi
skene atayalm:
>>> yeni_liste = met
>>> print(met)
[Vim, Kate, Emacs, Vi, Notepad]
>>> print(yeni_liste)
[Vim, Kate, Emacs, Vi, Notepad]

Grd
gnz gibi yeni_liste ve met ayn nesneye atfta bulunuyor. Dolaysyla ikisi de ayn
kty veriyor. S
imdi s
yle bir i
slem yapalm:
>>> yeni_liste[0] = "IDLE"

S
imdi iki listeyi de yazdralm:
>>> print(yeni_liste)
[IDLE, Kate, Emacs, Vi, Notepad]

>>> print(met)
[IDLE, Kate, Emacs, Vi, Notepad]

Grd
gnz gibi, biz sadece yeni_liste adl listede de
gi
siklik yapt
gmz halde, bu de
gi
siklik
met adl listeyi de etkiledi... Buradan s
u sonucu karyoruz: Bir listeyi ba
ska bir de
gi
skene
atad
gnz zaman, aslnda o listeyi kopyalam
s olmuyorsunuz. Yapt
gnz s
ey, varolan bir nesneye, yani listeye ba
ska bir ad daha vermekten ibaret... Dolaysyla burada hem yeni_liste
hem de met ayn nesneyi gsteriyor. E
ger amacnz bir listeyi kopyalamaksa en basit s
ekilde
s
yle bir yol izleyebilirsiniz:
>>> yeni_liste = met[:]

Artk bu listelerden birinde yapt


gnz de
gi
siklik tekini etkilemeyecektir. nk bu s
ekilde
met adl listenin btn
gelerini ba
stan sona kopyalayp yeni_liste adl de
gi
skene atadnz...
Yalnz s
u ayrma dikkat etmek gerekir:
Bir listenin
geleri zerinde de
gi
siklik yapmakla, yeni bir liste olu
sturmak farkl s
eylerdir. Bu
ne demek? Yani s
yle:
>>> yeni_liste = met
>>> print(met)
[Vim, Kate, Emacs, Vi, Notepad]
>>> print(yeni_liste)
[Vim, Kate, Emacs,Vi, Notepad]

Tpk biraz nce yapt


gmz gibi, met adl listeyi, yeni_liste adl de
gi
skene atadk. Artk elimizde,
ayn nesneye i
saret eden iki farkl de
gi
sken var. S
imdi s
yle bir i
slem yapyoruz:
>>> yeni_liste = ["falanca", "filanca", "
su", "bu", "o"]

Burada yeni_liste adl listenin


geleri zerinde de
gi
siklik yapmyoruz.
Yapt
gmz s
ey,
yeni_liste adn ta
syan, tamamen yeni bir liste tanmlamak... S
imdi bu yeni tanmlad
gmz
listeyi yazdralm:
>>> print(yeni_liste)
[falanca, filanca,
su, bu, o]

Bir de met adl listenin durumuna bakalm:


>>> print(met)
[Vim, Kate, Emacs, Vi, Notepad]

Grd
gnz gibi, burada met adl listeyi kopyalamadan yeni_liste adl de
gi
skene atad
gmz
halde, yeni_listede sonradan yapt
gmz de
gi
siklik metin_dzenleyiciyi etkilemedi. nk
dedi
gimiz gibi, yukardaki yeni_listeyi de
gi
stirirken aslnda bir liste zerinde de
gi
siklik yapmadk. Biz burada bamba
ska bir liste olu
sturduk. O yzden iki listeden birinde yaplan de
gi
siklik tekini etkilemedi... Ama e
ger yeni_liste[1] = falanfilan s
eklinde bir de
gi
siklik yapsaydk,
bu de
gi
siklikten teki liste de etkilenecekti. nk burada zaten varolan bir liste zerinde
de
gi
siklik yapm
s oluyoruz. Bu ikisi arasndaki ayrma ok dikkat etmek gerekir.

ile Aitlik Kontrol


4.6 in Paracg
Konu ba
sl
gmz biraz bulank grnm
s olabilir gznze. Ama hi endi
selenmeyin. Zor bir
konudan bahsetmeyece
giz. Bu derste i
sleyece
gimiz konu hem zevkli hem de epey faydaldr.
Bu blmde in parac
gn kullanarak bir
genin listede bulunup bulunmad
gn kontrol edece
giz. Yani aitlik kontrol yapaca
gz...
Diyelim ki s
yle bir listemiz var:
>>> liste = ["elma", "armut", "karpuz", "
seftali"]

S
imdi bir
genin bu listede bulunup bulunmad
gn sorgulayaca
gz:
>>> "elma" in liste
True

ktmz True oldu. Bu kelime Ingilizcede do


gru anlamna gelir. Demek ki elma karakter
dizisi listeye aitmi
s... Yani bu
ge listede varm
s... Bir de s
una bakalm:
>>> "erik" in liste
False

Bu defa False kts aldk. Bu kelime ise Ingilizcede Yanl


s anlamna gelir. Demek ki erik
listede yokmu
s.
Bununla ilgili daha anlaml bir rnek verelim:
yeler = ["Ahmet", "Mehmet", "Selim", "Sleyman", "Ay
se",
"Fatma", "Hale", "Jale", "Lale"]
ad = input("Ltfen adnz giriniz:")
if ad in yeler:
print("Gizli derne
gimizin yelerindensiniz. Buyrun ieri!")
else:
print("ye de
gilsiniz!")

Bu in parac
gn for dnglerini i
slerken de grm
stk. Bu parac
gn oradaki i
sleviyle buradaki i
slevinin aslnda birbirine ok benzer oldu
gunu gryorsunuz... Bu parack her iki durumda da iinde anlam katyor cmleye...
Bu parac
g elbette sadece listelerle birlikte kullanmak zorunda de
giliz. Mesela bunu karakter
dizileriyle de kullanabiliriz:
>>> a = "Mehmet"
>>> "e" in a
True

Bu in parac
g ile birlikte kullanlan not parac
gn da burada anmamz olduka faydal olacaktr. not parac
g kodlarmza olumsuzluk anlam katar. Mesela yukardaki rne
gi not
kullanarak s
yle de yazabiliriz:
yeler = ["Ahmet", "Mehmet", "Selim", "Sleyman", "Ay
se",
"Fatma", "Hale", "Jale", "Lale"]

ad = input("Ltfen adnz giriniz:")


if ad not in yeler:
print("ye de
gilsiniz!")
else:
print("Gizli derne
gimize yesiniz. Buyrun ieri!")

Ilk rnekte if ad in yeler ifadesiyle, e


ger ad yeler listesi iinde varsa... demi
stik. Burada
ise e
ger ad yeler listesi iinde yoksa... dedik... Yani cmlemize olumsuz bir anlam kattk.

4.7 Listelerin Metotlar


Bu blmde metot diye bir s
eyden sz edece
giz. Pythonda bu metot denen s
ey bir hayli
nem ta
sr ve epey de i
se yarar. Metotlar yardmyla pek ok karma
sk i
slemi ok basit bir
s
ekilde yerine getirebiliriz. ncelikle elimizde kullanabilece
gimiz hangi metotlarn oldu
guna
bir bakalm. Bu i
s iin Pythondaki dir() fonksiyonundan yararlanabiliriz. Listelerin metotlarn
sralamak istersek, bu fonksiyonu s
u s
ekilde kullanyoruz:
>>> dir(list)

...veya s
u da olur:
>>> a = []
>>> dir(a)

Yani nce herhangi bir liste tanmlayp (burada biz bo


s bir liste tanmladk), daha sonra dir()
fonksiyonunu bu liste zerine de uygulayabiliriz.
Hangi yolu benimsersek benimseyelim, alaca
gmz kt s
u olacaktr:
[__add__, __class__, __contains__, __delattr__,
__delitem__, __doc__, __eq__, __format__,
__ge__,__getattribute__, __getitem__, __gt__,
__hash__, __iadd__, __imul__, __init__, __iter__,
__le__, __len__, __lt__, __mul__, __ne__, __new__,
__reduce__, __reduce_ex__, __repr__, __reversed__,
__rmul__, __setattr__, __setitem__, __sizeof__,
__str__, __subclasshook__, append, count, extend,
index, insert, pop, remove, reverse, sort]

Burada sa
gnda solunda __ i
sareti olmayanlar bizim ilgi alanmza giren metotlardr. tekiler
ise bizim s
u anda konumuz d
snda kalan zel metotlardr. Onlarla s
imdilik ilgilenmeyece
giz.
Peki dir(list) komutu ile ald
gmz listeyi Python programlama bilgimizi kullanarak ayklayabilir
miyiz? Yani sa
gnda solunda __ i
sareti olan metotlar hi gstermeden sadece ilgi alanmza
giren metotlar alabilir miyiz? Elbette alabiliriz. Bu rnek bize iyi bir pratik yapma imkan
sa
glayacak:
>>> for i in dir(list):
...
if "_" not in i:
...
print(i)
append
count
extend

index
insert
pop
remove
reverse
sort

Burada yapt
gmz s
ey Pythona s
u komutu vermek:
Ey Python! dir(list) komutunun ktsn ba
stan sona tara ve her bir
geyi i olarak
adlandr. Ardndan bu iler iinde _ i
saretini barndrmayanlar bul ve ekrana bas!
Peki ilgilendi
gimiz metotlarn ka adet oldu
gunu nasl bulursunuz? Elle sayarm! diyenleri
s
iddetle knyorum! Burada metot says az oldu
gu iin kod yazmak gereksiz grnebilir, ama
ya yzlerce
ge olsayd saymamz gereken... Onlar da elle mi sayacaktk? Elbette hayr! Gelin
s
imdi bu ilgilendi
gimiz
geleri numaralandralm:
>>> a = dir(list)
>>> b = []
>>> for i in a:
...
if "_" not in i:
...
b.append(i)
...
print(len(b), i, sep=".")
1.append
2.count
3.extend
4.index
5.insert
6.pop
7.remove
8.reverse
9.sort

Bu kodlar iinde s
imdiye kadar grmedi
gimiz tek s
ey append(). teki
gelerle daha nceki
derslerimizde pek ok rnek yapm
stk.
Burada ncelikle a = dir(list) s
eklinde bir de
gi
sken tanmladk. dir(list) komutunu a adl
bir de
gi
skene atamak bize kullanm kolayl
g sa
glad. Bylece dir(list) kodunu kullanmamz
gereken yerlerde uzun uzun bu komutu yazmaktansa ksaca a de
gi
skenini kullanabilece
giz.
Ardndan b = [] diyerek bo
s bir liste olu
sturduk. Bu bo
s liste iine ilgilendi
gimiz metotlar
yerle
stirece
giz.
Bir sonraki satrda ise basit bir for dngs yazdk. Bu dng yardmyla dir(list) komutunun
ktsn ba
stan sona tarayp, iinde _ i
sareti gemeyen
geleri bulduk.
Bu satrn ardndan b.append(i) gibi bir kod gryoruz. append() listelerin metotlarndan
biridir. Bu metodu ve di
gerlerini bir sonraki blmde ayrntl olarak inceleyece
giz. S
imdilik
s
u kadarn syleyelim: Bu metot bir listeye yeni
geler eklememizi sa
glar. Zaten burada yapt
g i
s de budur. b.append(i) komutu yardmyla, ilk ba
sta olu
sturdu
gumuz b adl bo
s listeye
btn ileri ekliyoruz. Bu ilerin ne oldu
gunu biliyorsunuz: Bir nceki satrda for dngs ile
belirledi
gimiz, _ i
sareti iermeyen
geler... Yani dir(list) kts iinde _ i
saretini ta
smayan

geleri b.append(i) komutu ile b adl listeye eklemi


s oluyoruz.
En son satrda ise b adl listenin uzunlu
gunu ekrana basyoruz. Bununla birlikte, ileri de
tek tek yazdryoruz.
Buradaki sep parac
gnn i
slevini biliyorsunuz. Her bir
ge arasna . i
sareti koymak iin
bu paracktan yararlanyoruz...

Kodlar arasndaki len(b)nin nasl kullanld


gna dikkat edin. len(b)nin buradaki kullanm
Pythondaki for dnglerinin i
sleyi
si hakknda bize ok nemli bir bilgi veriyor. Dikkat ederseniz, burada len(b), ekrana yazdrd
gmz
gelerin sol tarafna denk gelen numaralar gsteriyor. Yani yukardaki ktda elde etti
gimiz 1, 2, 3, 4, 5, 6, 7, 8 ve 9 saylarnn ekrana
baslmasndan bu kod sorumlu... Peki len(b) kodu nasl oluyor da bu saylar bu s
ekilde ekrana
basabiliyor? Bunu anlamak iin for dngsnn nasl i
sledi
gini incelememiz gerekiyor. Yukardaki for dngsnn i
sleyi
sini adm adm grelim:
1. a adl de
gi
sken iindeki btn
geleri tek tek tara ve bu
gelerin her birine i adn ver.
2. E
ger i adn verdi
gimiz bu
geler arasnda, iinde _ i
sareti gemeyenler varsa...
3. Bu
geleri b adn verdi
gimiz bo
s listeye ekle.
4. dir(list) kts iinde, _ i
saretini iermeyen ilk
ge append. Dolaysyla bunu hemen
b adl listeye ekle.
5. S
imdi b adl listenin uzunlu
gunu ve
genin kendisini ekrana bas. Bu ikisinin arasna da
bir adet . i
sareti koy.
6. b adl listenin iinde 1 adet
ge var. Bu
ge append Dolaysyla ekrana basaca
gn
ifade s
u: 1.append
7. S
imdi tekrar dir(list) ktsn kontrol et. Orada _ i
saretini iermeyen ba
ska bir
ge var
m?
8. Evet var. Bu
genin ad count. Dolaysyla hemen bunu da b adl listeye ekle.
9. Listenin uzunlu
gu 2 oldu. Bu sayy ve yeni buldu
gun
geyi ekrana bas. Bunlarn arasna
da bir adet . i
sareti koy.
10. Dolaysyla ekrana basaca
gn ifade s
u: 2.count
Python bu i
slemleri dir(list) ktsnn hepsini kontrol edip bitirinceye kadar srdrr ve her
defasnda bir i
slem yaparak bize s
u kty verir:
1.append
2.count
3.extend
4.index
5.insert
6.pop
7.remove
8.reverse
9.sort

Burada append() metodunun kullanmyla ilgili bir rnek verdik. Yukardaki ktdan da
grd
gnz gibi, append()den ba
ska, listelerin daha pek ok metodu vardr. Bu metotlar
bize yapaca
gmz i
slerde byk kolaylklar sa
glar. Bu dersimizde listelerin metotlar konusuna
sa
glam bir giri
s yapt
gmza gre, artk bu metotlar tek tek incelemeye geebiliriz...

4.7.1 append Metodu


Bir nceki blmde append() metoduna de
ginmi
stik. Orada syledi
gimize gre bu metodun
grevi bir listeye
ge eklemek idi. Zaten append kelimesi Ingilizcede eklemek, ili
stirmek
gibi anlamlara gelir. Hemen bu metodu nasl kullanabilece
gimizi gsteren bir rnek yapalm.
nce bir liste tanmlayalm. Isterseniz bo
s bir liste olsun bu:
>>> liste = []

Listemizi kontrol edelim:


>>> print(liste)
[]

Hakikaten listemiz bo
s!
S
imdi bu bo
s listeye bir
ge ekleyelim:
>>> liste.append("Ubuntu")

S
imdi listemizi tekrar kontrol edelim:
>>> print(liste)
[Ubuntu]

Bu listeye s
imdi ba
ska bir
ge daha ekleyelim:
>>> liste.append("Debian")

Listemize bakalm tekrar:


>>> print(liste)
[Ubuntu, Debian]

Listemizin
gelerine tek tek eri
sebilece
gimizi biliyorsunuz:
>>> print(liste[0])
Ubuntu

...veya..
>>> print(liste[1])
Debian

Hatta liste
gelerini ters de evirebiliriz:
>>> print(liste[::-1])
[Debian, Ubuntu]

Peki ya bir
geyi de
gi
stirmek istersek...
>>> liste[1] = "Gentoo"
>>> print(liste)
[Debian, Gentoo]

append() metodunu kullanarak bir listeye sadece tek bir


ge ekleyebiliriz. Yani s
yle bir s
ey
mmkn de
gildir:
>>> liste.append("SuSe", "RedHat")
Traceback (most recent call last):

File "<stdin>", line 1, in <module>


TypeError: append() takes exactly one argument (2 given)

Bu hata ktsna gre append() metodu yalnzca tek bir


ge alabiliyor. Biz ise 2 tane vermi
siz...
Ama s
yle bir s
ey yapmak mmkndr:
>>> liste.append(["SuSe", "RedHat"])

Grd
gnz gibi, SuSe ve RedHat
gelerini bir liste olarak ekledik. Yalnz,
geleri bu s
ekilde ekledi
gimizde listenin durumu pek bekledi
giniz gibi olmayabilir:
>>> print(liste)
[Debian, Gentoo, [SuSe, RedHat]]

Grd
gnz gibi, SuSe ve RedHat
geleri listeye ayr bir liste olarak eklendi. Yani aslnda
yine listeye tek bir
ge eklenmi
s oldu:
>>> print(liste[2])
[SuSe, RedHat]

Demek ki listemizin nc
gesi buymu
s... Burada sadece SuSe
gesini almak isterseniz
s
yle bir s
ey yazmanz gerekti
gini biliyorsunuz:
>>> print(liste[2][0])
SuSe

RedHati almak iin ise:


>>> print(liste[2][1])
RedHat

E
ger append() metodunu kullanarak bir listeye birden fazla
ge eklemek isterseniz elbette
aresiz de
gilsiniz. for dngs ne gne duruyor?
>>> for s in ["Fedora", "Knoppix"]:
...
liste.append(s)
[Debian, Gentoo, [SuSe, RedHat], Fedora, Knoppix]

Dedi
gimiz gibi, for dngsn kullanarak bu s
ekilde birden fazla
geyi listeye ekleyebilirsiniz.
Ama isterseniz, bu i
slem iin retilmi
s ayr bir metottan da yararlanabilirsiniz. Bu yeni metodun
ad extend(). Bunu bir sonraki blmde grece
giz... Ama append() metodu ile ilgili olarak
sylememiz gerekenler henz bitmedi.
append() metodu liste metotlar iinde en ok kullanlan metottur. Dolaysyla listelerin ba
ska
hibir metodunu bilmeseniz de append() metodunu bilmeniz gerekir. Bu metodu kullanarak
baz rnekler vermeye devam edelim. Mesela s
u programa bakalm:
tek_saylar = []
ift_saylar = []
ba
sla = 1
bilgi = """Rastgele saylar giriniz.
Her say giri
ste enter tu
suna basnz.


I
slemi bitirmek iin "" tu
suna basnz:"""
print(bilgi)
while ba
sla == 1:
soru = input()
if soru == "":
ba
sla = 0
elif int(soru) % 2 == 0:
ift_saylar.append(soru)
else:
tek_saylar.append(soru)
print("Girdi
giniz s
u saylar ifttir: ", ift_saylar)
print("Girdi
giniz
su saylar ise tektir: ", tek_saylar)

Burada ncelikle tek_saylar ve ift_saylar adl iki farkl liste olu


sturduk. Kullancdan gelecek tek ve ift saylar ayr ayr listelerde depolayaca
gz.
Ardndan ba
sla = 1 s
eklinde bir kod yazarak ba
sla de
gi
skenini 1 olarak ayarlyoruz. Bu
de
gi
sken, programn biti
sini kontrol etmemizi sa
glayacak.
Daha sonra bilgi adl ba
ska bir de
gi
sken daha tanmlyoruz. Burada kullancy programn nasl al
strlaca
g hakknda bilgilendiriyoruz. Buna gre kullancdan rastgele saylar
girmesini, her saydan sonra da enter tu
suna basmasn istiyoruz. E
ger kullanc programdan
kmak isterse tu
suna basacak.
Bir sonraki satrda bilgi adl de
gi
skeni ekrana yazdryoruz.
Daha sonra, programmzn srekli olarak al
smasn temin etmek iin bir while dngs kuruyoruz. Programmzn srekli olarak al
smas ba
sla adl de
gi
skenin de
gerinin 1 olmasna
ba
gl. En ba
sta, bu ba
sla adl de
gi
skenin de
gerini 1 olarak ayarlad
gmz iin programmz
srekli olarak al
smaya devam edecektir.
Bir alttaki satrda kullancdan veri almamz sa
glayacak olan input() fonksiyonunu yazyoruz.
Dikkat ederseniz input() fonksiyonunu bo
s braktk. Neden? nk zaten kullancya gsterece
gimiz bilgiyi en ba
sta bilgi adl bir de
gi
sken tanmlayarak gsterdik. Elbette isteseydik bu
input() fonksiyonuyla da kullancya bilgi verebilirdik. Ama burada input() fonksiyonunu bo
s
brakmamzn nedeni biraz da estetik kayglar.. nk programmz iinde bir while dngs
oldu
gu iin, e
ger burada input() fonksiyonunu bo
s brakmazsak, kullanc her say giri
sinde bu
input() fonksiyonu iinde tanmlad
gmz karakter dizisini de grecektir. Isterseniz, input()
fonksiyonunu bo
s brakmadan bir deneme yapn. Grece
giniz gibi, kullancnn her say giri
sinde tekrar tekrar ayn karakter dizisini grmesi pek ho
s olmuyor...
Bir sonraki admda programdan k
s ko
sulumuzu belirliyoruz. E
ger kullanc harfine
basarsa ba
sla de
gi
skeninin de
geri 0 olarak ayarlanacaktr. Daha nce tanmlad
gmz
while dngsne gre, programmzn srekli olarak al
smas ba
sla de
gi
skeninin de
gerinin
1 olmasna ba
glyd. Kullanc tu
suna bast
gnda ba
sla de
gi
skeninin de
geri 0 olaca
g
iin programmz duracaktr.
Hemen ardndan kullancdan gelen saylarn ift olup olmad
gna bakyoruz. Burada soru
de
gi
skenini int() fonksiyonu yardmyla sayya evirdi
gimize dikkat edin. Bildi
giniz gibi,
input() fonksiyonunun verdi
gi de
gerin tipi karakter dizisidir. Kullancdan gelen bilgiyle aritmetik bir i
slem yapabilmek iin bu bilgiyi ncelikle sayya dn
strmemiz gerekir. Bir nceki
satrda programdan k
s ko
sulunu tanmlarken soru de
gi
skenini sayya dn
strmedi
gimize

dikkat edin. Aksi halde kullanc tu


suna bast
gnda Python harfini sayya dn
strmeye al
sacak, bunu ba
saramaynca da hata verecektir. O yzden orada input() fonksiyonuna herhangi bir dn
strme i
slemi uygulamadk...
ift saylar belirledikten sonra
ift_saylar.append(soru) komutu yardmyla kullancdan ald
gmz ift saylar ift_saylar
adl listeye ekliyoruz.
S
imdi sra geldi tek saylar belirlemeye. Bunu da bir else: blo
gu yardmyla yapyoruz. E
ger
kullancdan gelen bilgi bir ift say de
gilse veya kullanc harfine basmam
ssa kullancnn
girdi
gi say bir tek saydr. Bunu da tek_saylar adl listeye ekliyoruz. Tabii kullanc harfi
d
snda ba
ska bir harfe basarsa programmz hata verecektir. Henz bu tr durumlara kar
s
nlem almay bilmiyoruz. Ama ilerde bunu nasl yapaca
gmz da
grenece
giz. Fakat s
imdilik
s
yle bir kod yazarak en azndan bu tr bir problemi byk lde zm
s olursunuz:
tek_saylar = []
ift_saylar = []
kontrol = "0123456789"
ba
sla = 1
bilgi = """Rastgele saylar giriniz.
Her say giri
ste enter tu
suna basnz.

I
slemi bitirmek iin "" tu
suna basnz:"""
print(bilgi)
while ba
sla == 1:
soru = input()
if soru == "":
ba
sla = 0
elif soru[0] not in kontrol:
print("ltfen bir say giriniz")
elif "." in soru:
print("yoksa ondalk bir say m girdiniz?")
elif int(soru) % 2 == 0:
ift_saylar.append(soru)
else:
tek_saylar.append(soru)
print("Girdi
giniz s
u saylar ifttir: ", ift_saylar)
print("Girdi
giniz
su saylar ise tektir: ", tek_saylar)

Burada bir nceki kodlara ilave olarak bir kontrol de


gi
skeni tanmlyoruz. Bu de
gi
sken 0dan
9a kadar olan btn saylar ieriyor. Daha sonra program iinde iki adet elif... blo
gu olu
sturarak bu kontrol de
gi
skeninin iindeki saylara gre baz denetlemeler yapyoruz. Burada
daha nce
grendi
gimiz in ve not paracklarn kulland
gmza dikkat edin. Bu paracklar yardmyla, kullancnn girdi
gi verilerin kontrol de
gi
skeni iinde olup olmad
gn denetliyoruz. Yani aitlik kontrol yapyoruz... Burada ayrca kontrol de
gi
skenimizin bir karakter dizisi
oldu
guna dikkat edin. Daha nce de syledi
gimiz gibi, in ve not paracklar sadece listelere
zg bir zellik de
gildir. Bunlar Pythondaki ba
ska
gelerle birlikte de kullanabiliriz. Dedi
gimiz
gibi, bu kodlar da kar
s kar
sya oldu
gumuz sorunu tam anlamyla zmeye yetmez. Bu sorunun
kkten zmn birka ders sonra grece
giz.

S
imdi artk bir sonraki metodumuzu incelemeye geebiliriz.

4.7.2 extend Metodu


Hatrlarsanz bir nceki blmde append() metodunu i
slerken, bu metotla bir listeye birden
fazla
ge eklenemeyece
gini sylemi
stik. append() metodu yardmyla, eklemek istedi
gimiz
birden fazla
geyi liste haline getirip o s
ekilde ekleyebiliyorduk. Ama eklenen bu liste de
aslnda tek bir
ge olarak ekleniyordu. Mutlaka birden fazla
ge eklemek istedi
gimizde ise
for dnglerinden yararlanyorduk. Ama aslnda for dngsne hi gerek olmadan, listelerin
extend() adl metodu yardmyla da bu iste
gimizi yerine getirebiliriz. Nasl m? Hemen bir
rnek verelim. S
yle bir listemiz vard:
>>> liste = ["Debian", "Gentoo", "Fedora", "Knoppix"]

S
imdi extend() metodunu kullanarak, bu listeye yeni
geler ekleyece
giz:
>>> liste.extend(["Arch", "Ubuntu", "Kubuntu", "PCLinuxOs"])
[Debian, Gentoo, Fedora, Knoppix, Arch,
Ubuntu, Kubuntu, PCLinuxOs]

Grd
gnz gibi, append metodunun aksine, extend metodu ekledi
gimiz
geleri teker teker
yerle
stirdi listeye. stelik bizi herhangi bir for dngs kullanmak zorunda da brakmad.
Aslnda extend() metodunun yapt
g i
si sadece + i
saretini kullanarak da yapabilirsiniz.
Mesela s
u rne
ge bakalm:
>>> liste = ["Debian", "Gentoo", "Fedora", "Knoppix",
... "Arch", "Ubuntu", "Kubuntu", "PCLinuxOs"]
>>> yeni_liste = ["Mandriva", "Sabayon", "OpenSuSe"]
>>> liste = liste + yeni_liste
>>> print(liste)
[Debian, Gentoo, Fedora, Knoppix, Arch, Ubuntu,
Kubuntu, PCLinuxOs, Mandriva, Sabayon, OpenSuSe]

Hangi yntem kolaynza geliyorsa onu semekte zgrsnz...

4.7.3 insert Metodu


Pythonun bize sundu
gu bir ba
ska metot da insert() adl metottur. Bu metot yardmyla listenin herhangi bir noktasna
ge ekleyebiliyoruz. insert kelime anlam olarak yerle
stirmek
demek... I
ste bu metotla istedi
gimiz bir
geyi bir listenin istedi
giniz noktasna yerle
stirebilece
giz. Mesela bu metot yardmyla rnek bir listenin 1. srasna (Dikkat edin, 0nc sraya
demiyoruz) istedi
gimiz bir
geyi yerle
stirebiliriz:
>>> bir_liste = ["Debian", "Gentoo", "Fedora", "Knoppix",
... "Arch", "Ubuntu", "Kubuntu", "PCLinuxOs",
... "Mandriva", "Sabayon", "OpenSuSe"]
>>> bir_liste.insert(1, "Mint")
>>> print(bir_liste)

[Debian, Mint, Gentoo, Fedora, Knoppix, Arch, Ubuntu,


Kubuntu, PCLinuxOs, Mandriva, Sabayon, OpenSuSe]

Grd
gnz gibi listemizin birinci srasna Mint adl
geyi yerle
stirdik. Bu metot da, tpk
append() metodunda oldu
gu gibi tek bir
ge yerle
stirmemize izin verir. Ama tabii ki for
dnglerinden yararlanarak bu kstlamay a
sabilece
ginizi biliyorsunuz:
>>> liste = ["elma", "armut", "kebap"]
>>> ekle = ["lahmacun", "pide", "
seftali"]
>>> for i in ekle:
...
liste.insert(0, i)

Burada listenin 0. srasna adet yeni


ge yerle
stiriyoruz. Yalnz burada yeni yerle
stirilen

gelerin ters evrildi


gine dikkat edin...

4.7.4 remove Metodu


Python listelere
ge eklemenin yansra, bize listelerden
ge silme imkan da sa
glar. Bunun
iin listelerin remove() metodunu kullanaca
gz:
>>> bir_liste = ["Debian", "Gentoo", "Fedora", "Knoppix",
... "Arch", "Ubuntu", "Kubuntu", "PCLinuxOs",
... "Mandriva", "Sabayon", "OpenSuSe"]
>>> bir_liste.remove("Fedora")

E
ger listede birden fazla Fedora varsa, Python soldan sa
ga do
gru, listede buldu
gu ilk Fedoray listeden karacaktr.
E
ger listedeki bir
geyi adna gre de
gil de srasna gre karmak isterseniz s
yle bir yol
izleyebilirsiniz:
>>> bir_liste.remove(bir_liste[3])

Bu kod, bir_liste adl listenin 3. srasndaki


geyi karacaktr.

4.7.5 index Metodu


Bu metot, bir listedeki
genin srasn bulmamz sa
glar. Hemen bir rnek verelim:
>>> bir_liste = ["Debian", "Gentoo", "Fedora", "Knoppix",
... "Arch", "Ubuntu", "Kubuntu", "PCLinuxOs",
... "Mandriva", "Sabayon", "OpenSuSe"]
>>> bir_liste.index("Sabayon")
9

E
ger listede olmayan bir
geyi sorgularsanz Python bir hata mesaj gsterecektir.

4.7.6 sort Metodu


sort() metodu ile liste
gelerini alfabe srasna dizece
giz. Yalnz bu metot Python listelerinin
en gck metotlarndan biridir. Neden byle oldu
gunu biraz sonra grece
giz. Ama nce
sort() ile ilgili bir rnek yapalm:
>>> liste = ["Mehmet", "Ahmet", "Cemal", "Seval", "Kezban"]
>>> liste.sort()
>>> print(liste)
[Ahmet, Cemal, Kezban, Mehmet, Seval]

Grd
gnz gibi, Python bu listemizi gzel gzel alfabe srasna koydu. Yalnz bu listede bir s
ey
dikkatinizi ekmi
s olmal. Listedeki hibir isim Trke karakter iermiyor! Bunu bilerek byle
yaptk. nk iinde Trke karakterler geen kelimeleri sralamak o kadar kolay de
gildir.
Isterseniz deneyelim:
>>> liste = ["Mehmet", "Ahmet", "
Sevket", "etin",
... "Cemal", "Seval", "Kezban"]
>>> liste.sort()
>>> print(liste)
[Ahmet, Cemal, Kezban, Mehmet, Seval,
etin,
Sevket]

Grd
gnz gibi, Python bu defa liste
gelerini alfabe srasna dizmekte ba
sarsz oldu. Burada
etin ve
Sevketin yerleri yanl
s... Peki bunu nasl dzeltece
giz?
Bu sorunu dzeltmek iin henz
grenmedi
gimiz baz
geler kullanmamz gerekecek:
>>> import locale
>>> locale.setlocale(locale.LC_ALL, "tr_TR.UTF8")
>>> liste = ["Mehmet", "Ahmet", "
Sevket", "etin",
... "Cemal", "Seval", "Kezban"]
>>> liste.sort(key=locale.strxfrm)
>>> print(liste)

Buradaki bilmedi
giniz
gelere taklmayn. Yeri geldi
ginde bunlar ayrntlaryla inceleyece
giz.
Burada bu kodu vermekteki amacm sort() metoduyla Trke karakter ieren szckleri de
sralayabilece
ginizi gstermek. Yalnz yukarda verdi
gim yntem GNU/Linux iin geerlidir.
Windowsta al
smayabilir...

4.7.7 reverse Metodu


Bu blmde grece
gimiz reverse() metodu, liste
gelerinin srasn ters evirmemizi sa
glar.
Yani bu metot yardmyla liste
gelerini tersyz edebiliriz:
>>> liste = list(range(11))
>>> print(liste)

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Elbette 0dan 10a kadar olan saylar ieren bir liste olu
sturmak iin saylar tek tek elle yazmaya gerek yok. Bu i
s iin range() metodundan yararlanabiliyoruz... S
imdi range() fonksiyonundan da yardm alarak olu
sturdu
gumuz bu listeyi ters evirelim:
>>> liste.reverse()
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

Grd
gnz gibi, reverse() metodu listedeki
gelerin srasn tersine eviriyor. Aslnda biz bu
i
si reverse() metodunu kullanmadan da yapmay
grenmi
stik:
>>> liste[::-1]

Yalnz bu yntem ile reverse() metodunu kullanmak arasnda nemli bir fark var. reverse()
metodu, uyguland
g liste zerinde derhal de
gi
siklik yapyor. Yani bir listeye reverse() metodunu uygulayp liste
gelerinin srasn de
gi
stirdi
ginizde eski listeyi kaybetmi
s oluyorsunuz.
Artk eski listeye tekrar ula
smanzn imkan yoktur. Tabii yeni listeye tekrar reverse() metodunu uygularsanz eski listeye benzeyen ba
ska bir liste olu
sturabilirsiniz. Bu durumun aksine, liste[::-1] komutu liste zerinde herhangi bir de
gi
siklik yapmaz. Isterseniz bu yntemi uyguladktan sonra print(liste) komutunu vererek bunu do
grulayabilirsiniz. Bu komutu
verdi
ginizde kar
snza
geleri ters evrilmemi
s olan liste gelecektir. E
ger yukardaki yntem
yardmyla listeyi de
gi
stirmek isterseniz s
yle bir s
ey yapmanz gerekir:
>>> liste = liste[::-1]

Bu s
ekilde liste adl listemizi de
gi
stirebiliyoruz. Bu iki yntem arasndaki fark nemli bir
farktr. Bunu unutmamak gerekir.

4.7.8 count Metodu


Bu metot bir
genin bir listede ka kez geti
gini bulmamz sa
glar. Kullanm ok basittir:
>>> liste = ["elma", "armut", "elma", "kebap", "
seker",
... "armut", "ilek", "a
ga", "
seker", "kebap", "
seker"]
>>> liste.count("elma")
2

Peki yukardaki listede grd


gmz her bir
genin listede ka kez geti
gini nasl buluruz? Tabii
ki bir for dngs yardmyla:
>>> for i in liste:
...
print(i, "
gesi listede", liste.count(i), "kez geiyor...")

Fena de
gil... Ama bu kodlarn bir sorunu var. Her cmleyi,
genin listede geti
gi say kadar
tekrar ediyor. Her
geyle ilgili cmleyi bir kez bassa ne iyi olurdu, de
gil mi?
Elbette bunu da yapmann yollar vardr. Bunun en kolay yolu Pythondaki set() fonksiyonunu
kullanmaktr. Bu fonksiyonu daha sonraki bir blmde detayl olarak inceleyece
giz. S
imdilik
sadece nasl kullanld
gna dikkat edelim yeter:
for i in set(liste):
print(i, "
gesi listede", liste.count(i), "kez geiyor...")

4.7.9 pop Metodu


pop() metodu listelerin ilgin ve sevimli bir metodudur! Bu metot baz ynlerden remove()
metoduna benzer. Tpk remove() metodunda oldu
gu gibi, pop() metoduyla da listeden
ge
silebiliriz. S
u rne
ge bakalm:
>>>
...
...
...

liste = ["FVWM", "FVWM95", "TWM/VTWM", "MWM", "CTWM",


"OLWM/OLVWM", "wm2/wmx", "AfterStep", "AmiWM",
"Enlightenment", "WindowMaker", "SCWM", "IceWM",
"Sawfish", "Blackbox", "Fluxbox", "Metacity"]

>>> liste.pop()
Metacity

S
imdi listeyi tekrar ekrana yazdrrsanz en sondaki Metacity
gesinin olmad
gn greceksiniz. pop() metodu bu
geyi listeden sildi. Silerken de ekrana kt olarak verdi... Demek
ki pop() metodu bir listedeki en son
geyi silip, sildi
gi
geyi ekranda gsteriyor. Elbette bu
metodu kullanarak illa son
geyi silece
giz diye bir kaide yok. E
ger istersek, pop() metodu
iinde, silmek istedi
gimiz liste
gesinin srasn belirterek, belirli bir
geyi de silebiliriz:
>>> liste.pop(0)
FVWM

Bu metodun remove() metodundan fark, remove() metodunun liste


gelerinin adna gre,
pop() metodunun ise liste
gelerinin srasna gre
ge silmesidir... Yani s
yle:
>>> liste.remove("AmiWM")
>>> liste.pop(7)

Grd
gnz gibi pop() metodunu kullanabilmek iin silece
gimiz
genin listede kanc srada
bulundu
gunu bilmemiz gerekiyor. E
ger silece
giniz
genin adn biliyor, ancak srasn bilmiyorsanz s
yle bir s
ey yapabilirsiniz. (IceWM adl
geyi silmek istiyoruz...):
>>> liste.pop(liste.index("IceWM"))

Burada kulland
gmz index() metodu IceWM adl
genin listedeki srasn verecek, pop()
metodu ise index metodundan gelen bu sayy kullanarak IceWM adl
geyi listeden karacak
ve ekrana basacaktr...

BLM

Demetler (Tuples)

Bu blmde tuple diye bir s


eyden sz edece
giz. Biz buna Trkede genellikle demet
adn veriyoruz. Demetler de tpk listeler, saylar ve karakter dizileri gibi, Pythondaki veri
tiplerinden biridir. Demetler baz ynleriyle listelere benzerler, ama listelerle aralarnda ok
nemli bir fark vardr. Listeler de
gi
stirilebilir (mutable) bir veri tipiyken, demetler ise
de
gi
stirilemez (immutable) bir veri tipidir. Peki bu ne anlama geliyor? Hatrlarsanz listeler konusunu incelerken listelerin baz metotlar oldu
gundan sz etmi
stik. rne
gin remove()
metodu bunlardan biriydi. Mesela bu metodu kullanarak s
yle bir s
ey yapabiliyorduk:
>>> geli
stirme_aralar = ["Drpython", "Spe", "IDLE", "Komodo", "Eclipse"]
>>> geli
stirme_aralar.remove("IDLE")
>>> print(geli
stirme_aralar)
[Drpython, Spe, Komodo, Eclipse]

Grd
gnz gibi remove() metodunu kullanarak, geli
stirme_aralar adl liste zerinde
de
gi
siklik yapabildik. Mesela s
u yntemi kullanarak, liste
gelerinden birini silip yerine ba
ska
bir
ge de koyabiliriz:
>>> geli
stirme_aralar[1] = "Kwrite"
>>> print(geli
stirme_aralar)
[Drpython, Kwrite, Komodo, Eclipse]

Burada en son komutun ktsna bakt


gmzda, listenin birinci srasndaki Spe adl
genin
yerine Kwrite
gesinin geldi
gini gryoruz. Bu durum, yani listeler zerinde de
gi
siklik yapabilme olana
g, listelerin de
gi
stirilebilir bir veri tipi olmasndan kaynaklanyor. Mesela ayn
s
eyi karakter dizileri ile yapamayz:
>>> a = "Adana"
>>> a[3] = "m"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: str object does not support item assignment

Grd
gnz gibi, byle bir s
ey yapmaya al
st
gmzda Python bize bir hata mesaj gsteriyor.

86

nk karakter dizileri, listelerin aksine de


gi
stirilebilme kabiliyetine sahip de
gildir. Yani bunlar
de
gi
stirilemeyen (immutable) veri tipleridir. Elbette karakter dizileri zerinde de de
gi
siklik
yapmann yollar var. Biz Karakter Dizileri konusunu ayrntl olarak inceledi
gimiz zaman
btn bu zellikleri tek tek
grenece
giz. S
imdilik konumuzdan sapmayalm...
Tpk karakter dizileri gibi, demetler de de
gi
stirilemeyen veri tipleridir. Demetlere ksaca
de
gindi
gimize gre, gelin isterseniz bu giri
s blmn burada sonlandrp asl konumuza
geelim...

5.1 Demetleri Tanmlamak


Bir nceki blmde demetler konusuna ksaca bir giri
s yapm
stk. O blmde, demetlerin
listelere benzedi
gini ifade etmi
stik. Hatrlarsanz listeleri s
yle tanmlyorduk:
>>> liste = []

Burada bo
s bir liste tanmladk. Demetler de buna benzer bir s
ekilde tanmlanr:
>>> demet = ()

Grd
gnz gibi, listelerdeki k
seli parantezlerin yerini demetlerde normal parantezler alyor...
Isterseniz yukarda tanmlad
gmz veri tiplerinin sa
glamasn yapalm:
>>> type(liste)
<class list>

Demek ki tanmlad
gmz s
ey gerekten de bir listeymi
s... Bir de s
una bakalm:
>>> type(demet)
<class tuple>

Burada grd
gmz tuple ifadesi Trkede demet anlamna geliyor. Demek ki burada
olu
sturdu
gumuz veri tipi gerekten de bir demetmi
s...
Daha nce dir(list) komutunu kullanarak, listelerin metotlarn sralamay
grenmi
stik. S
imdi
de demetlerin metotlarna bakalm:
>>> dir(tuple)
[__add__, __class__, __contains__, __delattr__, __doc__,
__eq__, __format__, __ge__, __getattribute__, __getitem__,
__getnewargs__, __gt__, __hash__, __init__, __iter__,
__le__, __len__, __lt__, __mul__, __ne__, __new__,
__reduce__, __reduce_ex__, __repr__, __rmul__, __setattr__
, __sizeof__, __str__, __subclasshook__, count, index]

Daha nce listelerin metotlarn almak iin kulland


gmz list yerine burada tuple kelimesini
yazd
gmza dikkat edin. Elbette dir() metodunu s
u s
ekilde kullanabilece
gimizi de tahmin
ediyorsunuzdur:
>>> dir(demet)

Burada daha nce tanmlad


gmz demet adl
geden yararlandk. Hatta istersek s
yle bir
s
ey bile yazabiliriz:

>>> dir(())

Burada ise, demetlerin ayrt edici zelli


gi olan parantezleri kullandk. Benzer bir s
eyi listeler
iin yapmak isteseydik s
yle bir yazm tarz benimseyecektik:
>>> dir([])

Burada da listelerin ayrt edici zelli


gi olan k
seli parantezlerden faydalandk...
dir(tuple) komutundan elde etti
gimiz ktlar arasnda, iinde __ i
sareti olmayanlar bizim ilgi
alanmza giren metotlar oluyor. Tpk daha nce listeler iin yapt
gmz gibi burada da ufak
bir-iki satrlk kod yardmyla dir(tuple) kts iinde bizim ilgimizi eken metotlar alabiliriz:
>>> for i in dir(tuple):
...
if "_" not in i:
...
print(i)
...
count
index

Demek ki demetlerin yalnzca iki adet metodu varm


s. Demetlerin metot says listelere kyasla
epey az. Bunun nedeni, daha nce bahsetti
gimiz de
gi
stirilebilme/de
gi
stirilememe meselesidir... Demetler, listelerin aksine de
gi
stirilemeyen veri tipleri oldu
gu iin, do
gal olarak,
de
gi
siklik yapmaya ynelik metotlara sahip de
gildir. Listeler ise de
gi
stirilebilen veritipleri
oldu
gu iin, append(), extend() ve remove() gibi, liste zerinde de
gi
siklik yapmay sa
glayan
metotlar barndrr. Zaten dikkat ederseniz, demetlerin sahip oldu
gu bu iki metot da de
gi
siklik
yapmaya de
gil, bir demetin
geleri hakknda bilgi vermeye yneliktir. dir(tuple) komutundan
elde etti
gimiz ktda grnen index() ve count() metotlarnn ne i
se yarad
gn az ok tahmin
edersiniz. Bunlar zaten listeleri i
slerken de grm
stk. Burada da i
slevleri ayndr.
Peki demetler ne i
se yarar? Yani listeler gibi olduka gl bir veri tipi nmzde dururken
demetleri kim takar!.. Elbette Python geli
stiricileri e
sit olsun diye yerle
stirmemi
sler demet
diye bir s
eyi dilin iine... Demetlerin de gerekli oldu
gu yerler vardr.
Bir defa demetler listelere kyasla daha hzl al
srlar. Dolaysyla zerinde de
gi
siklik yapmanz
gerekmeyecek
geleri gruplarken listeler yerine demetleri kullanmay tercih edebilirsiniz.
Ayrca demetler de
gi
stirilemeyen bir veri tipi oldu
gu iin, bu veri tipini, program boyunca
de
gi
smesini istemedi
gimiz
geleri gruplamak iin de kullanabiliriz. Yani bir bakma saltokunur
geleri demetler iinde saklamay tercih edebiliriz...
rnek olmas asndan bir demet tanmlayalm:
>>> personel = ("Mehmet", "Ahmet", "Zeliha")

Bylelikle
geli bir demet tanmlam
s olduk. Listelerle yapabildi
gimiz baz s
eyleri demetlerle
de yapabiliriz. Mesela:
>>> personel[0]
Mehmet
>>> personel[:-1]
(Mehmet, Ahmet)
>>> personel[::-1]
(Zeliha, Ahmet, Mehmet)

Ama tabii ki s
yle bir s
ey mmkn de
gildir:
>>> personel[1] = "
Ilkay"

Neden? nk, daha nce de birka kez syledi


gimiz gibi, demetler zerinde de
gi
siklik yapamayz. Demetler de
gi
stirilemeyen (immutable) veri tipleridir.
Demetlerin ilgin bir zelli
gi daha vardr. Her ne kadar demetlerin ayrt edici zelli
gi () i
sareti
olsa da demetleri tanmlamak iin parantez kullanmak zorunda de
giliz:
>>> a = "Ahmet", "Mehmet", "Zarife"

Hemen bu a de
gi
skeninin tipini kontrol edelim:
>>> type(a)
<class tuple>

Grd
gnz gibi, parantezleri kullanmadan da demet tanmlayabiliyoruz. Bu demek oluyor ki,
aslnda bir de
gi
skene birden fazla de
ger atad
gmzda yapt
gmz s
ey bir demet tanmlamak.
Tek
geli bir de
gi
sken, iinde saklad
g verinin tipiyle anlr. Yani:
>>> hava = "ya
gmurlu"
>>> type(hava)
<class str>

Bir de s
una bakalm:
>>> hava = 10
>>> type(hava)
<class int>

...ama birden fazla


ge barndran de
gi
skenler tip olarak birer demettir...
Mesela:
>>> hava = "ya
gmurlu", "bulutlu", "rzgrl"
>>> type(hava)
<class tuple>

Ya da:
>>> hava = 10, 15, 17
>>> type(hava)
<class tuple>

Elbette, e
ger istersek yukardaki demetlerin
gelerini parantez iinde de belirtiriz. Bu s
ekilde
hangi tr bir veri tipi tanmlad
gmz daha ak ve net bir s
ekilde belli etmi
s oluruz.


5.2 Tek geli
bir Demet Tanmlamak
Bir nceki blmde bir demetin nasl tanmlanaca
gn grdk. Yalnz tanmlad
gmz demetler
hep birden fazla
ge ieriyordu. nceki blmde tek
geli bir demetin nasl tanmlanaca
gn

grenmedik. Tek bir


ge yazarsn, olur sana tek
geli bir demet! dedi
ginizi duyar gibiyim...
Ama ne yazk ki durum bu kadar basit de
gil. Hemen durumun karma
skl
gn gsteren bir rnek
yaparak i
se ba
slayalm:
>>> a = ("tek")
>>> type(a)
<class str>

Grd
gnz gibi hsrana u
gradk!... Basite tek bir
ge ieren bir demet tanmlamaya
al
srken, elde etti
gimiz s
ey bir str, yani karakter dizisi oldu... Demek ki tek bir
geyi
parantez iine almak yeterli olmuyormu
s... Peki ne yapaca
gz? Elbette elimiz kolumuz ba
gl
oturmayaca
gz. Bu tr durumlar iin Pythonun zel bir zm vardr. Grelim:
>>> a = ("tek",)
>>> type(a)
<class tuple>

Grd
gnz gibi, tek adl
genin yanna minik bir virgl i
sareti koyarak amacmza ula
sabildik... I
ste Pythonda tek
geli bir demet tanmlamann yolu budur. Gznze tuhaf grnm
s olabilir, ama zamanla al
srsnz...
a adl demeti parantezsiz olarak kullanmak istersek de buna benzer bir yol izlememiz gerekir:
>>> a = "tek",
>>> type(a)
<class tuple>

nk e
ger oraya o virgl koymazsak elde edece
gimiz s
ey bir karakter dizisi olacaktr...
nceki blmlerde demetler hakknda s
yle bir s
ey demi
stik: Demetler de
gi
stirilemeyen bir
veri tipidir. Gerekten de yledir... Ama de
gi
stirilemeyen bir veri tipi olan demetler,
ge
olarak, de
gi
stirilebilen veri tiplerini barndrabilir. Yani mesela s
yle bir s
ey yapabiliriz:
>>> a = (["elma", "armut", "erik"], 1, 2, 3)

Grd
gnz gibi, a adl demetimizin sfrnc
gesi bir liste. Buna s
u s
ekilde eri
sebiliriz:
>>> a[0]

E
ger bu listenin ilk
gesine eri
smek istersek ne yapmamz gerekti
gini biliyorsunuz:
>>> a[0][0]

Demetimizin sfrnc
gesi bir liste oldu
gu iin, listelerin sahip oldu
gu btn zellikleri ta
sr.
Yani listelerin metotlarn burada kullanabiliriz:
>>> a[0].append("kestane")

E
ger tek bir
ge ieren ve bu tek
gesi de bir liste olan bir demet tanmlamak istersek, her
zamanki gibi virglden yararlanaca
gz:
>>> a = (["elma", "armut", "erik"],)

5.3 Demetlerin Metotlar


Daha nce de syledi
gimiz gibi, demetler de
gi
stirilemeyen veri tipleri olduklar iin metot
ynnden fakirdirler. Demetlerin hangi metotlara sahip oldu
gunu nasl bulaca
gmz biliyoruz:
>>> dir(tuple)

Bu komutun kts iinde bizim ilgilendi


gimiz metotlar count() ve index() metotlardr. Bu
metotlar listelerden de hatrlyoruz. Bu metotlar listelerde ne i
se yaryorsa demetlerde de ayn
i
se yarar. Ksaca bakalm.

5.3.1 count metodu


Bu metot bir
genin demet iinde ka kez geti
gini syler bize:
>>> a = ("elma", "armut", "erik", "
seftali", "elma", "erik", "armut")
>>> a.count("elma")

5.3.2 index metodu


Bu metot ise bir demet
gesinin demet iindeki yerini bildirir. Yani o
genin demet iinde
kanc srada yer ald
gn syler:
>>> a = ("elma", "armut", "erik", "
seftali", "elma", "erik", "armut")
>>> a.index("elma")
0

Demek ki elma
gesi demet iinde sfrnc srada bulunuyormu
s. Bu arada grd
gnz
gibi, index() metodu bir
geyi ilk geti
gi noktada tespit eder ve ilk buldu
gu sra numarasn
verir. Dolaysyla ayn demet iinde geen teki elma
gesinin kanc srada oldu
guna bakmaz.
index() metodu,
ge ad d
snda ikinci bir argman daha alr. Yani parantez iinde belirtti
gimiz
ge adnn d
snda bir say da belirterek, o
genin kanc tekrarnn srasn elde etmek
istedi
gimizi belirleyebiliriz. Bu ne demek? Hemen bakalm:
>>> a = ("elma", "armut", "erik", "
seftali", "elma", "erik", "armut")
>>> a.index("elma", 2)
4

Bu defa 0 kts yerine 4 ktsn elde ettik.


aracl
gyla Pythona s
yle dedik:

Parantez iinde belirtti


gimiz 2 says

Ey Python! Bana demet iinde geen ikinci elma


gesinin srasn syle!

Bu emri alan Python da demet iindeki ilk elma


gesini atlayp ikinci elma
gesinin srasna
bakt. Bylece bize 4 ktsn verdi. Demek ki demet iindeki ikinci elma
gesinin sra
numaras 4 imi
s...
Demetlerin bize sundu
gu metotlar bunlardan ibarettir. Bu blmde demetlerin index() ve
count() metotlarn inceledi
gimize gre, artk yolumuza devam edebiliriz...

5.4 Demetleme ve Demet zme


Bu blmde demetlerle ilgili olarak daha nce
grendi
gimiz baz s
eylere farkl bir gzle bakaca
gz. Tabii bu arada yeni s
eyler de
grenece
giz. Bu blmn amac, demetlerle ilgili olarak
s
imdiye kadar
grendiklerimize bir nevi ad koymaktan ibaret olacaktr.
Bu blmn konusu demetleme (tuple packing) ve demet zme (tuple unpacking).
ncelikle demetlemeden bahsedelim. Aslnda s
imdiye kadar birka kez demetleme rne
gi
grdk. S
imdi bu grd
gmz s
eyi iyi bir tanmlayaca
gz.
Demetleri nasl tanmlayaca
gmz biliyoruz:
>>> demet = ("elma", 10, ["su", "ekmek", "zeytin"])

Burada, iinde farkl veri tipleri barndran bir demet olu


sturduk. Ba
stan beri tekrar tekrar
syledi
gimiz gibi demetler de
gi
stirilemeyen veri tipleridir. Ama yukardaki rnekten de grece
giniz gibi, demetlerin iine, de
gi
stirilebilen veri tiplerini de yerle
stirebiliyoruz. rne
gin
yukarda, de
gi
stirilebilen bir veri tipi olan listeleri demetimizin iine yerle
stirdik. Demetin kendisi de
gi
stirilemese de, demetin barndrd
g liste
gelerinin de
gi
stirilebilece
gini biliyoruz.
Yukarda verdi
gimiz rnek basit bir demet tanmlama i
slemidir. S
imdi verece
gimiz rnek ise bir
demetleme (tuple packing) i
slemidir:
>>> demet = "elma", (1, 2, 3, 4), ["kestane", "armut", "ilek"]

Burada yapt
gmz s
ey, birbirinden farkl veri tiplerini alp tek bir demet haline getirmekten
ibaret... I
ste bu i
sleme ksaca demetleme ad veriliyor. ok zel bir yan yok yani... Bu
i
slemin pek zel bir yan olmasa da bu i
slemin tersi olan demet zme (tuple unpacking)
i
sleminin gzel yanlar vardr:
>>> demet = ("elma", (1, 2, 3, 4), ["kestane", "armut", "ilek"])
>>> a, b, c = demet

I
ste burada yapt
gmz s
ey de demet zme i
slemine bir rnektir. a, b, c, = demet s
eklinde
demetimizi zdkten sonra artk s
u s
ekilde
gelere eri
sebiliriz:
>>> a
elma
>>> b
(1, 2, 3, 4)
>>> c
[kestane, armut, ilek]

Bu i
slemi normal bir de
gi
sken tanmlayarak da yapabilirsiniz:

>>> demet = 1, 2, 3, 4
>>> a, b, c, d = demet

Tabii daha nceki blmlerde grd


gmz gibi, birden fazla
geye sahip bir de
gi
sken tanmlad
gmzda aslnda daha ziyade bir demet tanmlam
s oluyoruz. Isterseniz type(demet)
komutuyla yukardaki demet de
gi
skeninin tipini sorgulayarak bunu kendi gzlerinizle grebilirsiniz...

5.5 Dnglenebilir Nesneleri zme


Bu blmde demetlere zg olmayan bir konuya de
ginece
giz. Bu konuyu buraya almamn nedeni, konu demetlere zg olmasa da demetlerle de ba
glantsnn bulunmas, yaps itibariyle
demetleri de ilgilendirmesidir... Ayrca bu blm bir bakma bir nceki blmn devam olarak
da d
snlebilir. nk burada da temel olarak ayn kavramlardan bahsedece
giz.
Blmmzn konusu Dnglenebilir nesneleri zme. Ingilizcede buna Iterable Unpacking diyorlar. Peki ne demek bu dnglenebilir nesneleri zme denen s
ey?
ncelikle burada dnglenebilir nesne kavramndan bahsetmemiz gerekiyor. Ingilizcede
iterable olarak adlandrlan dnglenebilir nesneler kabaca zerinde dng kurulabilen herhangi bir s
ey olarak tarif edilebilir. Mesela karakter dizileri dnglenebilen nesnelerdir. Ama
saylar dnglenebilen nesneler de
gildir. Peki bir nesnenin dnglenebilip dnglenemeyece
gini nasl anlayaca
gz? ok basit. Bunun iin kullanabilece
gimiz ayr bir fonksiyon bulunur
Pythonda... Bu fonksiyonun ad iter():
>>> iter("elma")
<str_iterator object at 0x00E4B8F0>

Bu komuttan elde etti


gimiz kt elma karakter dizisinin bir dnglenebilir nesne oldu
gunu
sylyor bize. Elde etti
gimiz ktya gre, elma karakter dizisi, bellekte bulundu
gu adres
0x00E4B8F0 olan bir dnglenebilir nesne imi
s... Bir de s
una bakalm:
>>> iter(10)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: int object is not iterable

Burada en son satrda grd


gmz int object is not iterable ifadesinden anlyoruz ki saylar
dnglenebilir nesneler de
gilmi
s... Dolaysyla buradan s
u sonucu karyoruz: Pythonda
karakter dizileri dnglenebilirken, saylar dnglenemez. Yani karakter dizileri zerinde
mesela bir for dngs kurabiliriz, ama saylarn zerinde bir for dngs kuramayz...
Konumuz demetler oldu
guna gre, bir de demetlerin durumuna bakalm:
>>> iter(())
<tuple_iterator object at 0x00E4B910>

Burada demetlerin ayrt edici zelli


gi olan () i
saretlerini kulland
gmza dikkat edin. Listeler
iin ise s
yle bir s
ey yapabiliriz:

>>> iter([])
<list_iterator object at 0x00E4B8F0>

Demek ki tpk demetler gibi, listeler de dnglenebilir nesnelermi


s...
Dnglenebilir Nesneleri zme ifadesinin Dnglenebilir Nesne ksmn anlad
gmza
gre, gelelim bu nesneyi zme meselesine... Dnglenebilir nesneleri zmeyi aslnda biliyoruz. Yukarda dedi
gimiz gibi, demetler bir dnglenebilir nesnedir. Geen blmde demetlerin nasl zlece
gini (tuple unpacking) grdk. Dolaysyla dnglenebilir nesneleri nasl
zece
gimizi de tahmin edebiliriz... Zira demetler de bir dnglenebilir nesne oldu
gu iin,
demet zme i
sleminin kendisi de aslnda bir dnglenebilir nesne zme i
slemidir...
Hatrlarsanz demet zme i
slemini s
u s
ekilde yapyorduk:
>>> demet = (0, 1, 2)
>>> a, b, c = demet

Elbette konumuz demetler oldu


gu iin rne
gimizi nce bir demet tanmlayarak yaptk. Ama
tabii ki illa demet tanmlamak zorunda de
giliz. Yukardaki kodlar s
yle de yazabiliriz:
>>> aralk = range(3)
>>> a, b, c = aralk

ncelikle burada tanmlad


gmz s
eyin bir demet olmad
gna dikkatinizi ekmek isterim. aralk de
gi
skenine type() fonksiyonunu uygularsanz bu verinin tipinin tuple olmad
gn greceksiniz...
Ayrca burada tek tek 0, 1, 2 yazmak yerine, range() fonksiyonunun bize sundu
gu kolaylktan yararland
gmza da dikkat edin...
Demetimizi veya aral
gmz tanmladktan sonra a, b ve c de
gi
skenlerini kullanarak demetin
veya aral
gn
gelerini tek tek yazdrabiliriz. Burada nemli nokta, e
sitli
gin sol tarafndaki
nesne says ile sa
g tarafndaki nesne saysnn ayn olmasdr. Yani sol tarafta a, b ve c
gibi adet nesneye kar
slk, sa
g tarafta da 0, 1 ve 2 gibi adet
ge var. Bu arada
yukardaki kodlar istersek s
yle de yazabiliriz elbette:
>>> a, b, c = range(3)

Bunu byle yazdktan sonra normal bir s


ekilde a, b ve c de
gi
skenlerini kullanarak 0dan
3e kadar olan saylar ekrana dkebiliriz.
Tanm gere
gi, dnglenebilir nesneleri zebilmek iin, e
sitli
gin sa
g tarafnda takdir edersiniz
ki dnglenebilir bir nesne olmas gerekiyor... Mesela bu blmn ba
snda saylarn dnglenemedi
gini
grenmi
stik. Dolaysyla s
yle bir s
ey yazamayz:
>>> a, b, c = 5
TypeError: int object is not iterable

Bu hata bize int nesnesinin dnglenemeyece


gini sylyor. Buradaki sorun e
sitli
gin sol ve
sa
g tarafndaki
ge saysnn ayn olmamasndan kaynaklanmyor. Sebep int, yani say veri
tipinin dnglenemez bir nesne olmas... Bu durumu daha net olarak s
u rnekte grebiliriz:
>>> a, b, c = "su"
ValueError: need more than 2 values to unpack

Grd
gnz gibi burada ald
gmz hata farkl. Buradaki sorun e
sitli
gin sol ve sa
g tarafnda ayn
sayda
ge olmamasndan kaynaklanyor. Yoksa su karakter dizisi dnglenebilir bir nesne
oldu
gu iin
ge saysn tutturmamz yeterli olacaktr. Zaten ald
gmz hata, zme i
slemi iin
2den fazla de
ger gerekti
gini sylyor bize...
>>> a, b, c = "Can"

Peki ben a, b ve c de
gi
skenlerinin ne birden tek de
ger vermek istiyorsam ne yapaca
gm? diye soruyor olabilirsiniz... Yani mesela hem a, hem b, hem de c de
gi
skeninin
de
gerinin Can olmasn istersek bunu nasl yapaca
gz? S
yle yapaca
gz:
>>> a = b = c = "Can"

Ancak s
yle bir deneme sizi hsrana u
gratabilir:
>>> a = b = c = 1, 2, 3

Burada her bir de


gi
sken 1, 2 ve 3 saylarnn n birden iine alacaktr. Yani mesela a
komutunu verdi
gimizde s
yle bir kt elde edece
giz:
>>> a
(1, 2, 3)

Ald
gmz bu kt, neden istedi
gimiz gibi bir kt elde edemedi
gimizi aslnda aklyor.
Dikkat ederseniz ald
gmz ktnn veri tipi bir demettir. Isterseniz a de
gi
skenine type()
fonksiyonunu uygulayarak bunu kendiniz de do
grulayabilirsiniz. Zira yukarda yapt
gmz s
ey
aslnda bir nceki blmde
grendi
gimiz demetleme (tuple packing) i
sleminin ta kendisidir...
Demetleme i
slemini yaptktan sonra isterseniz bu demeti zebilirsiniz de...
>>> bir, iki, = a
>>> bir
1
>>> iki
2
>>>
3

S
imdiye kadar verdi
gimiz rneklerde e
sitli
gin sol ve sa
g tarafnn ayn sayda
ge iermesi
gerekiyordu. Peki ya diyelim ki elimizde s
yle bir demet var:
>>> fedailer = ("Ahmet", "Mehmet", "zcan", "Kezban", "Sreyya", "Cevat")

Yapmak istedi
gimiz s
ey bu demeti ilk, orta ve son olarak gruplandrmak olsun... Bu i
slemi
acaba nasl yapmalyz?
Iste
gimizi gerekle
stirmek iin iki yntem var nmzde. Birinci yntemde Pythondaki dilimleme (slicing) zelli
ginden yararlanabiliriz:
>>> ilk, orta, son = fedailer[:1], fedailer[1:-1], fedailer[-1]

geleri bu s
ekilde tanmladktan sonra ilk, orta ve son de
gi
skenlerini kullanarak her bir
grubu ayr ayr yazdrabiliriz.

Gelelim ikinci ynteme... Bu ikinci yntem Python 3.0 ile birlikte gelen bir zelliktir. Pythonun
3.0dan nceki srmlerinde bu zellik bulunmaz:
>>> ilk, *orta, son = fedailer
>>> ilk
Ahmet
>>> orta
[Mehmet, zcan, Kezban, Sreyya]
>>> son
Cevat

Grd
gnz gibi, Python 3.0 ile birlikte yukardaki i
slevi ok daha basit ve temiz bir s
ekilde
yerine getirebiliyoruz. Burada * i
saretinden yararland
gmza dikkat edin. Bu tr ifadelere
Pythonda starred expressions (yldzl ifadeler) ad verilir. Python 3.0 ile birlikte bu yldzl
ifadeler daha geni
s bir kullanm alanna kavu
stu. Hatta print() fonksiyonu iinde bile bu
yldzl ifadelerden yararlanabiliriz. Yldzl ifadelerin print() fonksiyonunda kullanm ile ilgili
rnekleri birka blm sonra grece
giz...
Yukardaki rnekte kulland
gmz yldzl ifade, ilk ve son adl de
gi
skenler ile belirlenen

gelerin d
snda kalan teki btn
geleri tanmlayabilmemizi sa
glad. Ayrca burada yldzl
ifade ile elde etti
gimiz ksmn bir liste oldu
guna da dikkat edin. Burada normal olarak liste
yerine demet verilmesi beklenebilirdi, ama kt zerinde daha kolay i
slem yaplabilmesi iin
Python geli
stiricileri buradaki yldzl ifadenin ktsnn liste veri tipinde olmasn uygun grm
slerdir... Gerekten de de
gi
stirilebilir (mutable) bir veri tipi olan listeler zerinde i
slem
yapmak, de
gi
stirilemeyen (immutable) bir veri tipi olan demetler zerinde i
slem yapmaktan
ok daha kolaydr.
Dnglenebilir nesneleri zme i
sleminin bu geni
sletilmi
s haline ili
skin btn zellikler ve bu
yeni i
slevin gerekeleri, http://www.python.org/dev/peps/pep-3132/ adresinde bulunan PEP
3132de aklanm
str... E
ger bu konuyla ilgili olarak Ingilizce kaynaklarda arama yapmak
isterseniz, kullanmanz gereken ifade Extended Iterable Unpacking olacaktr...
Bylelikle Pythonda demetler konusunu da bitirmi
s olduk. Bu blmde pek ok s
ey

grendik. Bu
grendiklerimizi birka kez gzden geirerek bilgilerimizi peki
stirme yoluna gitmemiz, ilerde grece
gimiz konular daha iyi kavrayabilmek bakmndan olduka faydal olacaktr.

BLM

Szlkler

Bu blmde Pythondaki en verimli ve en kullan


sl veri tiplerinden birini inceleyece
giz.
Blmmzn konusu szlkler. Szlkler Pythonun bir hayli gl aralarndan bir tanesidir.
O kadar ki, istersek szlkleri basit bir veritaban niyetine bile kullanabiliriz.
S
imdiye kadar s
u veri tiplerini grm
stk:
1. Karakter Dizileri
2. Saylar
3. Listeler
4. Demetler
S
imdi ise bunlara bir de szlkleri ekleyece
giz. Szlkler s
ekil olarak teki veri tiplerinden birazck farkl bir grnme sahiptir. Ayrca mesela listeler sral diziler (ordered sequence) s
eklinde tanmlanan bir gruba girerken, szlkler srasz diziler (unordered sequence) grubuna
dahildir. Burada sral-srasz kavramlaryla kastetti
gimiz s
eyin ne oldu
gunu asl konumuza
geti
gimizde
grenece
giz.
Isterseniz laf daha fazla dolandrmadan asl mevzuya geelim. Ben sizin, szlkleri
grendikten sonra bu veri tipini ok sevece
ginize eminim...

6.1 Szlkleri Tanmlamak


teki veri tiplerinde yapt
gmz gibi, szlklerle de ilk i
simiz bunlar tanmlamak olacaktr. Hatrlarsanz listelerin ve demetlerin birtakm ayrt edici i
saretleri vard. Mesela listelerin ayrt edici
i
sareti [] iken, demetlerin ayrt edici i
sareti ise () idi... Tpk listeler ve demetlerde oldu
gu
gibi, szlklerin de bir ayrt edici i
sareti vardr:
>>> ilk_szlk = {}

Grd
gnz gibi, szlkleri kme parantezleri yardmyla teki veri tiplerinden ayrt ediyoruz.
Yukarda bo
s bir szlk tanmladk. Pythoncada szlkler dict parac
gyla gsterilir. Gelin
isterseniz basit bir tip denetlemesi yapalm:
>>> type({})
<class dict>

97

Buradaki dict szc


g denetledi
gimiz veri tipinin bir szlk oldu
guna i
saret ediyor.
S
imdi bo
s bir szlk yerine, iinde
ge barndran bir szlk tanmlamaya al
salm:
>>> telefonlar = {"Ahmet": "0555 555 55 55", "Ay
se": "0212 212 12 12",
... "Veli": "0312 312 13 13"}

Burada szl
g nasl tanmlad
gmza ok dikkat edin. Dedi
gimiz gibi, szlklerin yaps teki
veri tiplerinden biraz farkldr. Isterseniz yukarda tanmlad
gmz szl
g biraz sadele
stirerek
incelemeyi kolayla
stralm:
>>> telefonlar = {"Ahmet": "0555 555 55 55"}

Burada s
yle bir yap gzmze arpyor:
{anahtar: de
ger}

Bu yapda anahtar ve de
ger kelimelerini kullanmamz tesadfi de
gildir. Python programlama dilinde szlkler bir anahtar-de
ger (key-value) ifti olarak tanmlanr. Yani her szlkte
en az bir anahtar, bir de de
ger bulunur. Szlkleri olu
stururken bu anahtar ve de
gerleri iki
nokta st ste i
sareti (:) ile ayrrz. Bizim rne
gimizde anahtara kar
slk gelen ifade Ahmet; de
gere kar
slk gelen ifade ise 0555 555 55 55tir. Szlklerin
gelerine ula
smak iin
anahtarlar kullanaca
gz. Bu aklamalarn biraz soyut gelebilece
gini d
snerek, durumu somutla
strmak iin bir rnek verelim. Yukardaki szlk zerinden gidelim. Szl
gmzdeki
Ahmet adl anahtarn de
gerini alalm:
>>> telefonlar["Ahmet"]
0555 555 55 55

Grd
gnz gibi, ortada listeler ve demetlere gre farkl bir durum var. Bir szl
gn
gelerine
ula
sma biimimiz, demetler ve listelerdeki yapdan farkl. Hatrlarsanz demetler ve listelerin

gelerine s
yle ula
syorduk:
liste[
genin_sra_numaras]

...veya...
demet[
genin_sra_numaras]

Listeler ve demetlerde,
geye ula
smak iin o
genin sra numarasn verirken, szlklerde ise
anahtarn kullanyoruz. ktda elde etti
gimiz s
ey ise o anahtarn de
geri oluyor... Yani Ahmet
anahtarn vererek, 0555 555 55 55 de
gerine ula
syoruz.
Hatrlarsanz giri
s blmnde szlklerin srasz bir veri tipi oldu
gundan sz etmi
stik. Szlklerin srasz olmasndan dolay,
gelere eri
smek iin sra numaras kullanamyoruz. Szlklerin
aksine listeler ve demetler sral birer veri tipi oldu
gu iin,
gelere sra numarasyla ula
sabiliyoruz.
Szlklerin srasz bir veri tipi olmas kendini ktda da gsterecektir. Yani bir szl
g tanmladktan sonra, o szl
g ekrana yazdrd
gmzda elde etti
gimiz kt
gelerin sras bakmndan
kar
sk olacaktr... Mesela s
u szl
g ele alalm:
>>> harfler = {"a": 1, "b": 2, "c": 3}

Bu szl
g ekrana yazdrd
gmzda s
yle bir kt alrz:
>>> harfler
{a: 1, c: 3, b: 2}

Grd
gnz gibi elde etti
gimiz ktda
gelerin sralamas szl
g tanmlarken kulland
gmz

ge sralamasndan farkl... E
ger tanmlad
gnz bir szlkteki
gelerin sralamas ktdakiyle
aynysa bu durum tamamen tesadften ibarettir. Szlkler srasz veri tipleri oldu
gu iin, szlklerle gvenli bir s
ekilde sralamaya dayal herhangi bir i
slem yapamayz...
Szlkleri tanmlamann ba
ska yollar da vardr. Yukardaki tanmlama ynteminin d
snda bir
de s
yle bir s
ey yapabiliriz:
>>> giyim = {}
>>> giyim["ayakkab"] = 2
>>> giyim["elbise"] = 1
>>> giyim["gmlek"] = 4
>>> giyim
{elbise: 1, ayakkab: 2, gmlek: 4}

Grd
gnz gibi, nce bo
s bir szlk tanmladktan sonra bu bo
s szl
ge daha sonradan teker
teker
ge ekleyebiliyoruz.
E
ger istersek nc bir yol olarak szlkleri dict parac
gn kullanarak da tanmlayabiliriz:
>>> dict({"a": 1, "b": 2})

Bu dict parac
gn farkl s
ekillerde de kullanabiliyoruz:
>>> dict(ahmet = "0533 344 44 44")

Burada da sanki bir de


gi
sken tanmlar gibi szlk tanmlad
gmza dikkat edin...
Bunun d
snda, demetler ve listeleri kullanarak da bir szlk tanmlayabiliriz:
>>> dict([("ahmet", "0533 444 44 44")])

Burada iki
geli bir demetten olu
san bir listeyi dict parac
g yardmyla szl
ge dn
stryoruz...
Grd
gnz gibi, szlk tanmlamak iin pek ok farkl yntem bulunuyor. Siz bunlar iinde
kolaynza geleni veya o an kar
s kar
sya oldu
gunuz duruma en uygun yntemi benimseyeceksiniz...

6.2 Szlklerin Metotlar


Szlkler de
gi
stirilebilir veri tipleridir. Dolaysyla szlkler metot says bakmndan zengin
saylr. Szlklerin hangi metotlara sahip oldu
gunu nasl
grenece
gimizi az ok tahmin ediyorsunuzdur. Daha nce liste ve demet veri tiplerini incelerken birka farkl s
ekilde, bu veri
tiplerinin sahip oldu
gu metotlar listelemeyi
grenmi
stik. Szlkler de benzer yntemlerle bize
metotlarn listeleme imkan sunar. Mesela s
yle bir s
ey yapabiliriz:
>>> dir(dict)
[__class__, __contains__, __delattr__, __delitem__, __doc__,
__eq__, __format__, __ge__, __getattribute__, __getitem__,
__gt__, __hash__, __init__, __iter__, __le__, __len__,
__lt__, __ne__, __new__, __reduce__, __reduce_ex__,
__repr__, __setattr__, __setitem__, __sizeof__, __str__,

__subclasshook__, clear, copy, fromkeys, get, items,


keys, pop, popitem, setdefault, update, values]

Her zaman oldu


gu gibi, bu liste iinde bizim ilgilenece
gimiz metotlar s
unlardr:
>>> for i in dir(dict):
...
if "_" not in i:
...
print(i)
...
clear
copy
fromkeys
get
items
keys
pop
popitem
setdefault
update
values

Grd
gnz gibi szlklerin 11 adet metodu var bizim ilgilendi
gimiz... Sonraki sayfalarda bu
metotlar tek tek inceleyece
giz. Yalnz, dikkat ederseniz yukardaki listeyi elde etmek iin ok
fazla u
gra
syoruz. Ilerde kodlarmz belli ltlere gre szmek istedi
gimiz zaman bu iste
gimizi
tek satrla yerine getirmeyi de
grenece
giz:
>>> [i for i in dir(dict) if "_" not in i]
[clear, copy, fromkeys, get, items, keys, pop, popitem,
setdefault, update, values]

Pythonda bu yapya liste reteleri (list comprehensions) ad verilir. Yeri geldi


ginde bu
konuyu da ayrntsyla inceleyece
giz. S
imdilik sadece byle bir imkanmzn oldu
gunu da bilelim yeter...
Neyse... Tekrar konumuza dnelim. Szlklerin 11 adet metodu varm
s. Isterseniz laf hi
uzatmadan ilk metodumuzu incelemeye ba
slayalm...

6.2.1 clear metodu


Szlklerin, inceleyece
gimiz ilk metodu clear(). Bu kelime Ingilizcede temizlemek anlamna gelir. Grevi szlkteki
geleri temizlemektir. Yani ii dolu bir szl
g bu metot
yardmyla tamamen bo
saltabiliriz:
>>> lig = {"
sampiyon": "Adana Demirspor", "ikinci": "Mersin
Idman Yurdu",
... "nc": "Adana Genlerbirli
gi"}

Isterseniz szl
gmz bo
saltmadan nce bu szlkle biraz al
salm:
Szl
gmzn
gelerine s
yle ula
syoruz:
>>> lig
{
sampiyon: Adana Demirspor, ikinci: Mersin
Idman Yurdu,
nc: Adana Genlerbirli
gi}

E
ger bu szl
gn
gelerine tek tek eri
smek istersek s
yle yapyoruz:

>>> lig["
sampiyon"]
Adana Demirspor
>>> lig["nc"]
Adana Genlerbirli
gi

S
imdi geldi bu szl
gn btn
gelerini silmeye:
>>> lig.clear()

S
imdi szl
gmzn durumunu tekrar kontrol edelim:
>>> lig
{}

Grd
gnz gibi artk lig adl szl
gmz bombo
s. clear() metodunu kullanarak bu szl
gn btn
gelerini sildik. Ama tabii ki bu s
ekilde szl
g silmi
s olmadk. Bo
s da olsa
bellekte hl lig adl bir szlk duruyor. E
ger siz ligi ortadan kaldrmak isterseniz del adl
bir paracktan yararlanmanz gerekir:
>>> del lig

Kontrol edelim:
>>> lig
NameError: name lig is not defined

Grd
gnz gibi artk lig diye bir s
ey yok... Bu szl
g bellekten tamamen kaldrdk.
clear() adl metodun ne oldu
gunu ve ne i
se yarad
gn grd
gmze gre ba
ska bir metoda
geebiliriz.

6.2.2 copy metodu


Diyelim ki elimizde s
yle bir szlk var:
>>> hava_durumu = {"
Istanbul": "ya
gmurlu", "Adana": "gne
sli",
... "
Izmir": "bulutlu"}

Biz bu szl
g kopyalamak istiyoruz. Hemen s
yle bir s
ey deneyelim:
>>> yedek_hava_durumu = hava_durumu

Artk elimizde ayn szlkten iki tane var:


>>> hava_durumu
{
Istanbul: ya
gmurlu, Adana: gne
sli,
Izmir: bulutlu}
>>> yedek_hava_durumu
{
Istanbul: ya
gmurlu, Adana: gne
sli,
Izmir: bulutlu}

S
imdi hava_durumu adl szl
ge bir
ge ekleyelim:

>>> hava_durumu["Mersin"] = "sisli"


>>> hava_durumu
{
Istanbul: ya
gmurlu, Adana: gne
sli, Mersin: sisli,

Izmir: bulutlu}

S
imdi bir de yedek_hava_durumu adl szl
gn durumuna bakalm:
>>> yedek_hava_durumu
{
Istanbul: ya
gmurlu, Adana: gne
sli, Mersin: sisli,

Izmir: bulutlu}

Grd
gnz gibi, hava_durumu adl szl
ge yapt
gmz ekleme yedek_hava_durumu adl szl
g de etkiledi. Hatrlarsanz buna benzer bir durumla daha nce listeleri anlatrken de
kar
sla
sm
stk. nk varolan bir szl
g veya listeyi ba
ska bir de
gi
skene atad
gmzda aslnda
yapt
gmz s
ey bir kopyalama i
sleminden ziyade bellekteki ayn nesneye gnderme yapan iki
farkl isim belirlemekten ibaret. Yani szl
gmz bellekteki bir nesne olarak d
snrsek,
bu nesneye atfta bulunan, hava_durumu ve yedek_hava_durumu adl iki farkl isim belirlemi
s oluyoruz. E
ger istedi
gimiz s
ey bellekteki nesneden iki adet olu
sturmak ve bu iki farkl
nesneyi iki farkl isimle adlandrmak ise yukardaki yntemi kullanmak istemedi
giniz sonular
do
gurabilir. Yani amacnz bir szl
g yedekleyip orijinal szl
g korumaksa ve yukardaki
yntemi kullandysanz, hi farknda olmadan orijinal szl
g de de
gi
stirebilirsiniz. I
ste byle
durumlarda imdadmza szlklerin copy metodu yeti
secek. Bu metodu kullanarak varolan
bir szl
g gerek anlamda kopyalayabilir, yani yedekleyebiliriz...
>>> hava_durumu = {"
Istanbul": "ya
gmurlu", "Adana": "gne
sli",
... "
Izmir": "bulutlu"}

S
imdi bu szl
g yedekliyoruz. Yani kopyalyoruz:
>>> yedek_hava_durumu = hava_durumu.copy()

Bakalm hava_durumu adl szl


ge ekleme yapnca yedek_hava_durumu adl szl
gn durumu
ne oluyor?
>>> hava_durumu["Mersin"] = "sisli"
>>> hava_durumu
{
Istanbul: ya
gmurlu, Adana: gne
sli, Mersin: sisli,

Izmir: bulutlu}

yedek_hava_durumu adl szl


ge bakalm:
>>> yedek_hava_durumu
{
Istanbul: ya
gmurlu, Adana: gne
sli,
Izmir: bulutlu}

Grd
gnz gibi bu defa szlklerin birinde yaplan de
gi
siklik brn etkilemedi... copy
metodu sa
golsun!...

6.2.3 fromkeys metodu


fromkeys() metodu teki metotlardan biraz farkldr. Bu metot mevcut szlk zerinde i
slem
yapmaz. fromkeys()in grevi yeni bir szlk olu
sturmaktr. Bu metot yeni bir szlk olu
stu-

rurken listeler veya demetlerden yararlanr. S


yle ki:
>>> elemanlar = "Ahmet", "Mehmet", "Can"
>>> adresler = dict.fromkeys(elemanlar, "Kadky")
>>> adresler
{Ahmet: Kadky, Mehmet: Kadky, Can: Kadky}

Grd
gnz gibi ncelikle elemanlar adl bir demet tanmladk. Daha sonra da adresler
adl bir szlk tanmlayarak, fromkeys() metodu yardmyla anahtar olarak elemanlar
demetindeki
gelerden olu
san, de
ger olarak ise Kadky ieren bir szlk meydana getirdik.
En ba
sta tanmlad
gmz elemanlar demeti liste de olabilirdi. Hatta tek ba
sna bir karakter
dizisi dahi yazabilirdik oraya...

6.2.4 get metodu


Szlk metotlar iinde en faydal metotlardan birisi bu get() adl metottur. Bu metot pek ok
durumda i
sinizi bir hayli kolayla
strr.
Diyelim ki s
yle bir program yazdk:
#!/usr/bin/env python3.0
ing_szlk = {"dil": "language", "bilgisayar": "computer", "masa": "table"}
sorgu = input("Ltfen anlamn
grenmek istedi
giniz kelimeyi yaznz:")
print(ing_szlk[sorgu])

Bu program al
strd
gmzda e
ger kullanc ing_szlk adyla belirtti
gimiz szlk iinde bulunan kelimelerden birini yazarsa, o kelimenin kar
sl
gn alacaktr. Diyelim ki kullancmz soruya
dil diye cevap verdi. Bu durumda ekrana dil kelimesinin szlkteki kar
sl
g olan language yazdrlacaktr. Peki ya kullanc szlkte tanml olmayan bir kelime yazarsa ne olacak?
yle bir durumda programmz hata verecektir. Programmz iin do
gru yol, hata vermektense,
kullancy kelimenin szlkte olmad
g konusunda bilgilendirmektir. Bunu klasik bir yakla
smla
s
u s
ekilde yapabiliriz:
ing_szlk = {"dil": "language", "bilgisayar": "computer", "masa": "table"}
sorgu = input("Ltfen anlamn
grenmek istedi
giniz kelimeyi yaznz:")
if sorgu not in ing_szlk:
print("Bu kelime veritabanmzda yoktur!")
else:
print(ing_szlk[sorgu])

Ama akas bu pek verimli bir yakla


sm saylmaz. Yukardaki yntem yerine szlklerin get()
metodundan faydalanabiliriz. Bakalm bunu nasl yapyoruz:
ing_szlk = {"dil": "language", "bilgisayar": "computer", "masa": "table"}
sorgu = input("Ltfen anlamn
grenmek istedi
giniz kelimeyi yaznz:")

print(ing_szlk.get(sorgu, "Bu kelime veritabanmzda yoktur!"))

Grd
gnz gibi, burada ok basit bir metot yardmyla btn dertlerimizi hallettik. Szlklerin get() adl metodu, parantez iinde iki adet argman alr. Birinci argman sorgulamak istedi
gimiz szlk
gesidir. Ikinci argman ise bu
genin szlkte bulunmad
g durumda
kullancya hangi mesajn gsterilece
gini belirtir. Buna gre, yukarda yapt
gmz s
ey, nce
sorgu de
gi
skenini szlkte aramak, e
ger bu
ge szlkte bulunamyorsa da kullancya, Bu
kelime veritabanmzda yoktur! cmlesini gstermekten ibarettir...
Gelin isterseniz bununla ilgili bir rnek daha yapalm.
Diyelim ki bir havadurumu program yazmak istiyoruz. Bu programda kullanc bir s
ehir ad
girecek. Program da girilen s
ehre ait havadurumu bilgilerini ekrana yazdracak. Bu program
klasik yntemle s
u s
ekilde yazabiliriz:
#!/usr/bin/env python3.0
soru = input("
Sehrinizin adn tamam kk harf olacak
sekilde yazn:")
if soru == "istanbul":
print("gk grltl ve sa
ganak ya
g
sl")
elif soru == "ankara":
print("ak ve gne
sli")
elif soru == "izmir":
print("bulutlu")
else:
print("Bu
sehre ili
skin havadurumu bilgisi bulunmamaktadr.")

Yukardaki, gayet geerli bir yntemdir. Ama biz istersek bu kodlar get metodu yardmyla
ok daha verimli ve sade bir hale getirebiliriz:
#!/usr/bin/env python3.0
soru = input("
Sehrinizin adn tamam kk harf olacak
sekilde yazn:")
cevap = {"istanbul": "gk grltl ve sa
ganak ya
g
sl",
"ankara": "ak ve gne
sli", "izmir": "bulutlu"}
print(cevap.get(soru,"Bu
sehre ili
skin havadurumu bilgisi bulunmamaktadr."))

Bylelikle bir metodu daha geride braktk... Gelelim sradaki metodumuza...

6.2.5 items metodu


Bu metot yardmyla bir szl
gn btn
gelerine ula
sabiliriz. Yalnz bu metot bir szl
gn

gelerini do
grudan vermez. items() metodunu yaln bir s
ekilde kulland
gmzda elde etti
gimiz
s
eye Python dilinde grnm nesnesi (view object) ad verilir. rnek verelim:
>>> sepet = {"meyveler": ("elma", "armut"), "sebzeler": ("prasa", "fasulye")}
>>> sepet.items()
<dict_items object at 0xb7cee95c>

I
ste burada elde etti
gimiz ktya grnm nesnesi ad veriyorlar. Bu nesneler dinamik bir
yapdadr. Peki bu ne anlama geliyor? Hemen bakalm:
>>> a = sepet.items()
>>> len(a)
2

Buradan, sepet szl


gndeki
ge saysnn iki oldu
gunu gryoruz. S
imdi sepet szl
gne
ekleme yapalm:
>>> sepet["iecekler"] = ("su", "ayran", "
salgam")

S
imdi a adl de
gi
skenin uzunlu
gunu tekrar kontrol edelim:
>>> len(a)
3

Grd
gnz gibi, sepet adl szl
gn ieri
gi de
gi
since sepet.items() metodunun ieri
gi de
otomatik olarak gncellendi. Bu, Python 3.0la gelen bir zelliktir. Pythonun 2.x srmlerinde
items() metodu daha farkl bir yapya sahipti ve yukardaki gibi otomatik gncellenme gibi bir
zellik de ta
smyordu...
Peki biz bu items() metoduyla elde etti
gimiz
geleri nasl grece
giz? Bunun birka yolu vardr.
En basitinden bu metot zerinde bir dng kurabiliriz:
>>> for i in sepet.items():
...
print(i)
...
(iecekler, (su, ayran,
salgam))
(meyveler, (elma, armut))
(sebzeler, (prasa, fasulye))

Veya list() ya da tuple() metotlarn kullanarak da sepet.items() metodunun ieri


gini grebiliriz:
>>> list(sepet.items())
>>> tuple(sepet.items())

Hatrlarsanz bu yntemi daha nce range() fonksiyonuyla birlikte de kullanm


stk...

6.2.6 keys metodu


Bir nceki blmde inceledi
gimiz items() metodu bir szl
gn btn
gelerini almamz
sa
glyordu. Bu blmde grece
gimiz keys() metodu ise bir szl
gn yalnzca anahtarlarn
almammz sa
glayacak. Bu metot da tpk items() metodu gibi yaln olarak kullanld
gnda
bir grnm nesnesi verir. Elde edilen bu grnm nesnesi de tpk items() metoduyla elde
etti
gimiz grnm nesnesi gibi dinamik yapdadr. Yani szl
gn anahtarlarnda bir de
gi
siklik
oldu
gunda bu grnm nesnesi de otomatik olarak gncellenir. S
imdi bu keys() metodunu
nasl kullanaca
gmza bakalm. Daha nce tanmlam
s oldu
gumuz sepet szl
g zerinden
gidelim isterseniz:
>>> sepet = {"meyveler": ("elma", "armut"), "sebzeler": ("prasa", "faslye")}

S
imdi bu szlkteki anahtarlar alalm:

>>> anahtarlar = sepet.keys()

S
imdi de bu
geleri ekrana yazdralm:
>>> list(anahtarlar)
[meyveler, sebzeler]

E
ger anahtarlar liste olarak de
gil de demet olarak almak istersek s
u komutu kullanaca
gz:
>>> tuple(anahtarlar)
(meyveler, sebzeler)

Alternatif olarak, sepet.keys() metodu zerinde bir for dngs kurmay da tercih edebiliriz.
Bu s
ekilde elde etti
gimiz kt grn
s olarak biraz daha temiz olacaktr:
>>> for i in sepet.keys():
...
print(i)
...
meyveler
sebzeler

Grd
gnz gibi keys() metodunu kullanmak da olduka kolaydr.

6.2.7 values metodu


Bu metot, bir nceki blmde grd
gmz keys() metodunun yapt
g i
sin tam tersini yapar.
keys() metoduyla bir szl
gn anahtarlarn alyorduk. values() metoduyla ise szl
gn
de
gerlerini alaca
gz:
>>> sepet = {"meyveler": ("elma", "armut"), "sebzeler": ("prasa", "fasulye")}
>>> degerler = sepet.values()
>>> for i in degerler:
...
print(i)
...
(elma, armut)
(pirasa, fasulye)

6.2.8 pop metodu


Bu metodu listelerden hatrlyoruz. Bu metot listelerle birlikte kullanld
gnda, listenin en son

gesini silip, silinen


geyi de ekrana basyordu. E
ger bu metodu bir sra numaras ile birlikte
kullanrsak, listede o sra numarasna kar
slk gelen
ge siliniyor ve silinen bu
ge ekrana
baslyordu. Bu metodun szlklerdeki kullanm da az ok buna benzer. Ama burada fark
olarak, pop metodunu argmansz bir s
ekilde kullanamyoruz. Yani pop metodunun parantezi
iinde mutlaka bir szlk
gesi belirtmeliyiz:
>>> sepet = {"meyveler": ("elma", "armut"), "sebzeler": ("prasa", "fasulye"),
... "iecekler": ("su", "kola", "ayran")}
>>> sepet.pop("meyveler")

Bu komut, szlkteki meyveler anahtarn silecek ve sildi


gi bu
genin de
gerini ekrana
basacaktr. E
ger silmeye al
st
gmz anahtar szlkte yoksa Python bize bir hata mesaj
gsterecektir:
>>> sepet.pop("tatllar")
KeyError: tatlilar

Bir program yazarken byle bir durumla kar


sla
smak istemeyiz o
gu zaman. Yani bir szlk
iinde arama yaparken, aranan
genin szlkte bulunmad
g bir durumda kullancya mekanik
ve anlamsz bir hata gstermek yerine, daha anla
slr bir mesaj iletmeyi tercih edebiliriz. Hatrlarsanz szlklerin get() metodunu kullanarak benzer bir s
ey yapabiliyorduk. S
u anda incelemekte oldu
gumuz pop() metodu da bize byle bir imkan verir. Bakalm:
>>> sepet.pop("tatllar", "Silinecek
ge yok!")

Bylelikle szlkte bulunmayan bir


geyi silmeye al
st
gmzda Python bize bir hata mesaj
gstermek yerine, Silinecek
ge yok! s
eklinde daha anlaml bir mesaj verecektir...

6.2.9 popitem metodu


popitem() metodu da bir nceki blmde
grendi
gimiz pop() metoduna benzer. Bu iki metodun grevleri hemen hemen ayndr. Ancak pop() metodu parantez iinde bir parametre
alrken, popitem() metodunun parantezi bo
s, yani parametresiz olarak kullanlr. Bu metot
bir szlkten rastgele
geler silmek iin kullanlr. Daha nce de pek ok kez syledi
gimiz gibi,
szlkler srasz veri tipleridir. Dolaysyla popitem() metodunun
geleri silerken kullanabilece
gi bir sra kavram yoktur. Bu yzden bu metot
geleri rastgele silmeyi tercih eder...
>>> sepet = {"meyveler": ("elma", "armut"), "sebzeler": ("prasa", "fasulye")}
>>> sepet.popitem()

Bu komut szlkten rastgele bir anahtar, de


gerleriyle birlikte szlkten silecektir. E
ger szlk
bo
ssa bu metot bize bir hata mesaj gsterir.

6.2.10 setdefault metodu


Bu metot epey enteresan, ama bir o kadar da yararl bir mahluktur... Bu metodun ne i
se
yarad
gn do
grudan bir rnek zerinde grelim:
>>> sepet = {"meyveler": ("elma", "armut"), "sebzeler": ("prasa", "fasulye")}
>>> sepet.setdefault("iecekler", ("su", "kola"))

Bu komut yardmyla szl


gmz iinde iecekler adl bir anahtar olu
sturduk. Bu anahtarn
de
geri ise (su, kola) oldu... Bir de s
una bakalm:
>>> sepet.setdefault("meyveler", ("erik", "ilek"))
(elma, armut)

Grd
gnz gibi, szlkte zaten meyveler adl bir anahtar bulundu
gu iin, Python ayn ad
ta
syan ama de
gerleri farkl olan yeni bir meyveler anahtar olu
sturmad... Demek ki bu
metot yardmyla bir szlk iinde arama yapabiliyor, e
ger arad
gmz anahtar szlkte yoksa,
setdefault() metodu iinde belirtti
gimiz zellikleri ta
syan yeni bir anahtar-de
ger ifti olu
sturabiliyoruz.

6.2.11 update metodu


Inceleyece
gimiz son metot update() metodu... Bu metot yardmyla olu
sturdu
gumuz szlkleri yeni verilerle gncelleyece
giz. Diyelim ki elimizde s
yle bir szlk var:
>>> stok = {"elma": 5, "armut": 10, "peynir": 6, "sosis": 15}

Sto
gumuzda 5 adet elma, 10 adet armut, 6 kutu peynir, 15 adet de sosis var. Diyelim ki daha
sonraki zamanlarda bu sto
ga mal giri
s-k
s oldu ve sto
gun son hali s
yle:
>>> yeni_stok = {"elma": 3, "armut": 20, "peynir": 8, "sosis": 4, "sucuk": 6}

Yapmamz gereken s
ey, sto
gumuzu yeni bilgilere gre gncellemek olacaktr. I
ste bu i
slemi
update() metodu ile yapabiliriz:
>>>updatestok.update(yeni_stok)
>>> print(stok)
{peynir: 8, elma: 3, sucuk: 6, sosis: 4, armut: 20}

Bylelikle mallarn son miktarlarna gre stok bilgilerimizi gncellemi


s olduk...

6.2.12 Szlk gelerini


Alfabe Srasna Dizmek
Daha nce de dedi
gimiz gibi szlkler sral olmayan veri tipleridir. Dolaysyla bir szl
g
ekrana yazdrrken elde edece
giniz ktdaki
ge sralamas, szl
g tanmlarken kulland
gnz

ge sralamasndan farkl olacaktr. Mesela:


>>> harfler = {"a": 1, "b": 5, "c": 8, "d": 10, "e": "30"}
>>> harfler
{a: 1, c: 8, b: 5, e: 30, d: 10}

Grd
gnz gibi,
gelerin sras ktda kar
sk grnyor. Peki biz bu szl
gn
gelerini sral
olarak kt almak istersek ne yapmamz gerekir? Python byle bir s
eyi yapmak iin zel bir
ara sunmaz. Dolaysyla bizim bu i
slem iin ba
ska yollar aramamz gerekecek.
En basit s
ekilde yukardaki szl
g s
yle sralayabiliriz:
>>> for i in sorted(harfler):
...
print(i, harfler[i])
...
a 1
b 5
c 8
d 10
e 30

Burada dikkat ederseniz yeni bir fonksiyonla kar


sla
stk. Bu yeni fonksiyonun ad sorted().
Bu fonksiyon, i
slev olarak listelerin sort() metoduna ok benzer. Ancak sort() metodu yalnzca listeler iin geerlidir. Yani mesela sort() metodunu demetlerle veya szlklerle birlikte
kullanamayz. Ama sorted() fonksiyonu sralanabilen btn veritipleri iin kullanlabilir. Bu
bakmdan sorted() fonksiyonu sort() metoduna gre ok daha genel bir aratr ve ok daha
kullan
sldr. Mesela sorted() fonksiyonuyla bir rnek daha yapalm:

>>> demet = ("mehmet", "ahmet", "kezban", "celal")


>>> sorted(demet)
[ahmet, celal, kezban, mehmet]

Grd
gnz gibi, sorted() fonksiyonu yardmyla demetin
gelerini alfabe srasna dizebildik.
Bu fonksiyonu listelerle birlikte de kullanabilirsiniz...
E
ger sralamak istedi
giniz demet, liste veya szlkte Trke karakterler varsa, bu metot o
demet, liste veya szl
g dzgn bir s
ekilde sralayamayacaktr. Hatrlarsanz listelerin sort()
metodunu incelerken de byle bir durumla kar
sla
sm
stk. Orada kulland
gmz yntemi burada
da kullanabiliriz:
>>> import locale
>>> locale.setlocale(locale.LC_ALL, "tr_TR.UTF8")
>>> demet = ("mehmet", "ahmet", "kezban", "celal", "i
gdem")
>>> print(sorted(demet, key=locale.strxfrm))
[ahmet, celal, i
gdem, kezban, mehmet]

Neyse... Biz konumuza dnelim. Yukarda sorted() fonksiyonunu kullanarak szlk


gelerini
sraladk ve s
yle bir kt elde ettik:
a
b
c
d
e

1
5
8
10
30

Bu ktnn grntsn ho
sunuza gitmediyse, bu kty biraz biimlendirmek de elbette
mmkndr. Mesela her
genin arasna, bu
gelerin birbiriyle ba
glantl oldu
gunu gsterecek bir i
saret yerle
stirebiliriz:
>>> for i in sorted(harfler):
...
print(i, harfler[i], sep = " --> ")
...
a --> 1
b --> 5
c --> 8
d --> 10
e --> 30

Grd
gnz gibi, szlk
gelerini alfabe srasna dizmek o kadar da zor de
gil. Isterseniz yukardaki dngy nasl kurdu
gumuzu biraz inceleyelim:
Ilk satrda bildi
gimiz s
ekilde bir for dngs olu
sturuyoruz. Burada bir yenilik olarak sorted()
fonksiyonunu
grendik. Bu fonksiyon bize
geleri sralama imkan tanyor:
>>> for i in sorted(harfler):
...

Ikinci satrda grd


gmz kodlar biraz kafanz kar
strm
s olabilir. Belki ilk bak
sta bu satrn ne
i
se yarad
gn anlamak ok kolay olmayabilir. Ama aslnda hem ok kolay, hem de ok mantkl
bir koddur bu. Isterseniz kodlarmz s
u s
ekilde sadele
stirerek olaylarn arka yzn grmeye
al
sabiliriz:

>>> for i in sorted(harfler):


...
print(i)
...
a
b
c
d
e

Burada sorted(szlk) ifadesinin nasl bir kt verdi


gine baktk. Grd
gnz gibi, bu ifade,
szl
gn anahtarlarn alfabe srasna diziyor. Ama szlkteki de
gerlerle ilgili herhangi bir
i
slem yapmyor. Yani bu ifade, anahtar-de
ger iftlerinden olu
san szl
gmz iinde sadece
anahtar ksmyla ilgileniyor, de
ger ksmn es geiyor. Bizim bir yolunu bulup, sorted()
ile elde etti
gimiz sral anahtarlar, bunlara kar
slk gelen de
gerlerle e
sle
stirmemiz gerekiyor.
Hatrlarsanz bir szl
gn
gelerine s
u s
ekilde ula
syorduk:
>>> harfler[anahtar]

Bunu kendi szl


gmze uyarlayalm:
>>> harfler["a"]
1
>>> harfler["b"]
5

I
ste yukardaki rnekte de szlklerin bu zelli
ginden faydalandk. S
u satr tekrar gzmzn
nne getirelim:
>>> print(i, harfler[i])

Burada dikkat ederseniz, for dngs iinde i adn vererek ald


gmz btn szlk anahtarlarn tek tek szlk[anahtar] s
eklinde uyguluyoruz. Kodlarmza tekrar btn olarak bakalm:
>>> for i in sorted(harfler):
...
print(i, harfler[i], sep = " --> ")

Burada nce szlkteki anahtarlar alfabe srasna dizip her birine i adn veriyoruz. Daha
sonra print() fonksiyonu iinde ncelikle bu ileri ekrana basyoruz. Bu ilerle birlikte ayrca
szlk[i] kodunu kullanarak, i adn verdi
gimiz her bir anahtarn de
gerini de a
gryoruz.
Satrn en sonundaki sep parac
gnn grevini biliyorsunuz zaten. Bu parack burada bize
estetik bir fayda sunuyor... Ve nihayet s
u kty elde ediyoruz:
a
b
c
d
e

-->
-->
-->
-->
-->

1
5
8
10
30

Silmek
6.2.13 Szlkten ge
Szlklerin metotlarn i
slerken pop() ve popitem() adl metotlar grm
stk. Bu metotlar
yardmyla szlkteki
geleri silebiliyorduk. Yalnz bu metotlar silinen
geleri de otomatik
olarak ekrana basyorlard. Bizim ihtiyacmz olan s
ey listelerdeki remove() metodu gibi bir
s
ey olabilir. Yani silinen
geyi dnya aleme duyurmadan silmek istiyor olabiliriz, de
gil mi?

E
ger byle bir iste
gimiz varsa bunu daha nce bir kez grd
gmz del deyimi yardmyla
yapabiliriz. Hatrlarsanz del deyimini btn bir listeyi ortadan kaldrmak iin kullanm
stk.
Istersek bu del deyimini szlkteki tek bir
geyi silmek iin de kullanabiliriz:
>>> stok = {peynir: 8, elma: 3, sucuk: 6, sosis: 4, armut: 20}
>>> del stok["peynir"]

Bu s
ekilde stoktaki peynir anahtarn de
geriyle birlikte silmi
s olduk...
Daha nceki konulardan hatrlad
gmz bir de clear() metodu var. Bu metot ise btn bir
listeyi bo
saltmak iin kullanlyor. clear() metodunun grevi elimize bo
s bir liste vermektir.

BLM

Kmeler

Yeni konumuz Pythonda kmeler. Ingilizcede buna set diyorlar... Kmeler Pythonda nispeten yeni saylabilecek bir aratr ve hem ok hzldr, hem de epey i
se yarar...
Kmeleri
grendi
gimizde, bunlarn kimi zaman hi tahmin bile edemeyece
gimiz yerlerde
i
simize yarad
gn grece
giz. Normalde uzun uzun kod yazmay gerektiren durumlarda
kmeleri kullanmak, bir-iki satrla i
simizi halletmemizi sa
glayabilir.
Kmeler, matematikten bildi
gimiz kme kavramnn sahip oldu
gu btn zellikleri ta
sr. Yani
kesi
sim, birle
sim ve fark gibi zellikler Pythondaki setler iin de geerlidir.
Bu arada hatrlarsanz listelerin count() metodunu anlatrken de kmelerden faydalanm
stk.
O blmde s
yle bir rnek vermi
stik:
>>> for i in set(liste):
...
print(i, "
gesi listede", liste.count(i), "kez geiyor...")

Bu rne
gi verdi
gimizde, set() fonksiyonunu henz
grenmedi
gimizi, ama hi endi
se etmememiz gerekti
gini, zira bunu sonraki blmlerde ayrntl olarak i
sleyece
gimizi sylemi
stik.
I
ste artk bu kmeler konusunu ayrntl olarak
grenme zaman geldi. Isterseniz s
imdi hi vakit
kaybetmeden i
simize bakalm...

7.1 Kme Olu


sturmak
Kmelerin bize sunduklarndan faydalanabilmek iin elbette ncelikle bir kme olu
sturmamz
gerekiyor. Kme olu
sturmak ok kolay bir i
slemdir:
>>> kume = set(["elma", "armut", "kebap"])

Bylelikle ilk kmemizi ba


saryla olu
sturduk. Dikkat ederseniz, kme olu
stururken listelerden faydalandk. Grd
gnz gibi set() fonksiyonu iindeki
geler bir liste iinde yer alyor.
Dolaysyla yukardaki tanmlamay s
yle de yapabiliriz:
>>> liste = ["elma", "armut", "kebap"]
>>> kume = set(liste)

Bu daha temiz bir grnt oldu. Elbette kme tanmlamak iin mutlaka liste kullanmak zorunda
de
giliz. Istersek demetleri de kme haline getirebiliriz:
112

>>> demet = ("elma", "armut", "kebap")


>>> kume = set(demet)

Hatta ve hatta karakter dizilerinden dahi kme yapabiliriz:


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

Kulland
gmz karakter dizisinin byle uzun olmasna da gerek yok. Tek karakterlik dizilerden
bile kme olu
sturabiliriz:
>>> kardiz = "a"
>>> kume = set(kardiz)

Ama saylardan kme olu


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

Burada kmelerle ilgili ok nemli bir bilgi ediniyoruz. Dikkat ederseniz yukarda ald
gmz hata
mesaj, Dnglenebilir Nesneleri zme konusundan bahsederken, saylar kulland
gmzda
ald
gmz hatayla ayn.
Buradan anlyoruz ki, set() fonksiyonu parametre olarak bir
dnglenebilir nesne istiyor... Saylar dnglenebilir nesneler olmad
g iin, bunlar kullanarak
kme olu
sturamyoruz. Bu da aklmzn bir kenarnda bulunsun...
Peki szlkleri kullanarak kme olu
sturabilir miyiz? Evet, neden olmasn? Szlkler de birer
dnglenebilir nesne oldu
guna gre, bunlardan kme olu
sturmamzn nnde hibir engel yok:
>>> bilgi = {"i
sletim sistemi": "GNU", "sistem ekirde
gi": "Linux",
... "da
gtm": "Ubuntu GNU/Linux"}
>>> kume = set(bilgi)

Bylece kmeleri nasl olu


sturaca
gmz
grendik. E
ger olu
sturdu
gunuz kmeyi ekrana yazdrmak isterseniz, ne yapaca
gnz biliyorsunuz. Burada tanmlad
gnz kme de
gi
skenini kullanmanz yeterli olacaktr:
>>> kume
{i
sletim sistemi, sistem ekirde
gi, da
gtm}

Tabii burada ben sizin etkile


simli kabukta al
st
gnz varsayyorum. E
ger yukardaki rne
gi bir
metin dzenleyici kullanarak kaydedecekseniz kme yerine print(kme) ifadesini kullanmanz gerekti
gini hatrlatmaya gerek yok sanrm...
Bir de s
una bakalm:
>>> kardiz = "Python Programlama Dili"
>>> kume = set(kardiz)
>>> print(kume)

{a, , D, g, i, h, m, l, o, n, P, r, t, y}

Burada bir s
ey dikkatinizi ekmi
s olmal. Bir karakter dizisini kme olarak tanmlayp ekrana
yazdrd
gmzda elde etti
gimiz kt, o karakter dizisi iindeki her bir karakteri tek bir kez
ieriyor. Yani mesela Python Programlama Dili iinde iki adet P karakteri var, ama ktda bu iki P karakterinin yalnzca biri grnyor. Buradan anlyoruz ki, kmeler ayn
geyi
birden fazla tekrar etmez. Bu ok nemli bir zelliktir ve pek ok yerde i
simize yarar. Ayn durum karakter dizisi d
snda kalan teki veri tipleri iin de geerlidir. Yani mesela e
ger bir listeyi
kme haline getiriyorsak, o listedeki
geler kme iinde yalnzca bir kez geecektir. Listede
ayn
geden iki- tane bulunsa bile, kmemiz bu
geleri teke indirecektir...
grendi
gimiz bu
bilgi sayesinde listelerin count metodunu anlatrken verdi
gimiz rne
gi ok daha iyi kavrayabilirsiniz. Isterseniz o rne
ge bir kez daha bakalm:
>>> liste = ["elma", "armut", "elma", "kebap", "
seker", "armut",
... "ilek", "a
ga", "
seker", "kebap", "
seker"]
>>> for i in set(liste):
...
print(i, "
gesi listede", liste.count(i), "kez geiyor...")
elma
gesi listede 2 kez geiyor...
eker
s
gesi listede 3 kez geiyor...
kebap
gesi listede 2 kez geiyor...
a
ga
gesi listede 1 kez geiyor...
ilek
gesi listede 1 kez geiyor...
armut
gesi listede 2 kez geiyor...

Burada set(liste) ifadesini kullanarak, liste


gelerini e
ss
iz ve benzersiz hale getiriyoruz...
Dolaysyla zgn listede
seker
gesi kez geti
gi halde, elde etti
gimiz ktda
seker

gesi bir kez geiyor... Bu da


seker
gesi listede 3 kez geiyor... cmlesinin ktda kez
tekrarlanmasn engelliyor... Dolaysyla, ayn
geden birden fazla sayda ieren listeler, szlkler veya ba
ska veri tiplerini, her bir
geyi tek sayda ierecek hale getirmenin en kestirme
yolu kmeleri kullanmaktr. Neyse... Biz konumuza devam edelim...
Esasnda tek bir kme pek bir i
se yaramaz. Kmeler ancak birden fazla oldu
gunda bunlarla
yararl i
sler yapabiliriz. nk kmelerin en nemli zelli
gi, ba
ska kmelerle kar
sla
strlabilme kabiliyetidir. Yani mesela kmelerin kesi
simini, birle
simini veya farkn bulabilmek iin
ncelikle elimizde birden fazla kme olmas gerekiyor. I
ste biz de s
imdi bu tr i
slemleri nasl
yapaca
gmz
grenece
giz. O halde hi vakit kaybetmeden yolumuza devam edelim.

7.2 Kmelerin Metotlar


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

__str__, __sub__, __subclasshook__, __xor__, add,


clear,copy, difference, difference_update, discard,
intersection, intersection_update, isdisjoint, issubset,
issuperset, pop, remove, symmetric_difference,
symmetric_difference_update, union, update]

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

Grd
gnz gibi kmelerin epey metodu var. Bu arada if __ not in i satrnda _ yerine __ kulland
gmza dikkat edin... Neden? nk e
ger sadece _ kullanrsak symmetric_difference ve symmetric_difference_update metotlar ktmzda yer almayacaktr...
Unutmadan syleyelim: Kmeler de, tpk listeler gibi, de
gi
stirilebilir (mutable) bir veri tipidir...

7.2.1 clear metodu


Kmelerle ilgili olarak inceleyece
gimiz ilk metot clear(). Bu metodu daha nce szlkleri
al
srken de grm
stk. Szlklerde bu metodun grevi szl
gn iini bo
saltmak idi... Burada
da ayn vazifeyi grr:
>>> tr = set("
s
g")
>>> tr
{, ,
s, , ,
g}
>>> tr.clear()
set()

Burada nce tr adl bir kme olu


sturduk. Bu kme, Trkeye zg karakterleri barndryor.
Daha sonra da clear() metodunu kullanarak bu kmenin btn
gelerini sildik. Artk elimizde
bo
s bir liste var...

7.2.2 copy metodu


De
gi
stirilebilir veri tipleri olan listeler ve szlklerden edindi
gimiz tecrbeye gre, e
ger
de
gi
stirilebilir bir veri tipini kopyalamak istersek yapmamz gereken s
ey s
u de
gildir:
>>> liste = range(100)
>>> yedek = liste

Bu s
ekilde aslnda listeyi kopyalamad
gmz, yalnzca ayn nesneye (range(100)) gnderme
yapan iki farkl isim olu
sturdu
gumuzu
grenmi
stik. Dolaysyla yukardaki gibi bir i
slem yapt
gmzda, listedeki de
gi
siklikler yedek adl nesneyi de etkileyecektir. E
ger istedi
gimiz buysa ne
ala!... Ama e
ger yapmak istedi
gimiz s
ey bu de
gilse, izlememiz gereken yntem farkl olacaktr.
Listeler ve szlkleri incelerken copy() adl bir metot
grenmi
stik. Bu metot ayn zamanda
kmelerle birlikte de kullanlabilir. stelik i
slevi de ayndr:
>>> tr = set("
s
g")
>>> yedek = tr.copy()
>>> tr
{, ,
s, , ,
g}
>>> yedek
{,
g, , , ,
s}

Burada bir s
ey dikkatinizi ekmi
s olmal. tr adl kmeyi yedek adyla kopyaladk, ama bu
iki kmenin ktlarna bakt
gmz zaman
ge sralamasnn birbirinden farkl oldu
gunu gryoruz. Bu da bize kmelerle ilgili ok nemli bir bilgi daha veriyor. Demek ki, tpk szlklerde
oldu
gu gibi, kmeler de srasz veri tipleriymi
s. Elde etti
gimiz ktda
geler rastgele diziliyor...
Dolaysyla
gelere sralarna gre eri
semiyoruz. Aynen szlklerde oldu
gu gibi...

7.2.3 add metodu


Kmelerden bahsederken, bunlarn de
gi
stirilebilir bir veri tipi oldu
gunu sylemi
stik. Dolaysyla
kmeler, zerlerinde de
gi
siklik yapmamza msaade eden metotlar da ierir. rne
gin add()
bu tr metotlardan biridir. Add kelimesi Trkede eklemek anlamna gelir. Adndan da
anla
slaca
g gibi, bu metot yardmyla kmelerimize yeni
geler ilave edebilece
giz. Hemen
bunun nasl kullanld
gna bakalm:
>>> kume = set(["elma", "armut", "kebap"])
>>> kume.add("ilek")
>>> print(kume)
{elma, armut, kebap, ilek}

Grd
gnz gibi, add() metodunu kullanarak, kmemize ilek adl yeni bir
ge ekledik. E
ger
kmede zaten varolan bir
ge eklemeye al
srsak kmede herhangi bir de
gi
siklik olmayacaktr. nk, daha nce de syledi
gimiz gibi, kmeler her bir
geyi tek bir sayda barndrr...
E
ger bir kmeye birden fazla
geyi ayn anda eklemek isterseniz for dngsnden yararlanabilirsiniz:

>>> yeni = [1, 2, 3]


>>> for i in yeni:
...
kume.add(i)
...
{1, 2, 3, elma, kebap, ilek, armut}

Burada yeni adl listeyi kmeye for dngs ile ekledik. Ama bu i
slemi yapmann ba
ska bir
yolu daha vardr. Bu i
slem iin Pythonda ayr bir metot bulunur. Bu metodun ad update()
metodudur. Sras gelince bu metodu da grece
giz...

7.2.4 difference metodu


Bu metot iki kmenin farkn almamz sa
glar. rne
gin:
>>> k1 = set([1, 2, 3, 5])
>>> k2 = set([3, 4, 2, 10])
>>> k1.difference(k2)
{1, 5}

Demek ki k1in k2den fark buymu


s... Peki k2nin k1den farkn bulmak istersek ne yapaca
gz?
>>> k2.difference(k1)
{10, 4}

Grd
gnz gibi, birinci kullanmda, k1de bulunup k2de bulunmayan
geleri elde ediyoruz.
Ikinci kullanmda ise bunun tam tersi. Yani ikinci kullanmda k2de bulunup k1de bulunmayan

geleri alyoruz...
Isterseniz uzun uzun difference() metodunu kullanmak yerine sadece eksi (-) i
saretini
kullanarak da ayn sonucu elde edebilirsiniz:
>>> k1 - k2

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

Hayr, madem eksi i


saretini kullanabiliyoruz, o halde art i
saretini de kullanabiliriz! gibi bir
fikir do
gru de
gildir...

7.2.5 difference_update metodu


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

>>> print(k1)
{2}
>>> print(k2)
{1, 3, 5}

Grd
gnz gibi, bu metot k1in k2den farkn ald ve bu fark kullanarak k1i yeniden olu
sturdu... k1 ile k2 arasndaki tek fark 2 adl
ge idi. Dolaysyla difference_update() metodunu uygulad
gmzda k1in
gelerinin silinip yerlerine 2 adl
genin geldi
gini gryoruz...

7.2.6 discard metodu


Bir nceki blmde
grendi
gimiz add() metodu yardmyla, nceden olu
sturdu
gumuz bir kmeye yeni
geler ekleyebiliyorduk. Bu blmde
grenece
gimiz discard() metodu ise kmeden

ge silmemizi sa
glayacak:
>>> hayvanlar = set(["kedi", "kpek", "at", "ku
s", "inek", "deve"])
>>> hayvanlar.discard("kedi")
>>> print(hayvanlar)
{kpek, ku
s, deve, inek, at}

E
ger kme iinde bulunmayan bir
ge silmeye al
srsak hi bir s
ey olmaz... Yani hata mesaj
almayz:
>>> hayvanlar.discard("ylan")

Burada etkile
simli kabuk sessizce bir alt satra geecektir. Bu metodun en nemli zelli
gi
budur. Yani olmayan bir
geyi silmeye al
st
gmzda hata vermemesi...

7.2.7 remove metodu


Bu metot da bir nceki blmde grd
gmz discard() metoduyla ayn i
slevi yerine getirir.
E
ger bir kmeden
ge silmek istersek remove() metodunu da kullanabiliriz:
>>> hayvanlar.remove("kpek")

Peki discard() varken remove() metoduna ne gerek var? Ya da tersi... Bu iki metot ayn i
slevi
yerine getirse de aralarnda nemli bir fark vardr. Hatrlarsanz discard() metoduyla, kmede
olmayan bir
geyi silmeye al
srsak herhangi bir hata mesaj almayaca
gmz sylemi
stik.
E
ger remove() metodunu kullanarak, kmede olmayan bir
geyi silmeye al
srsak, discard()
metodunun aksine, hata mesaj alrz:
>>> hayvanlar.remove("fare")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: fare

Bu iki metot arasndaki bu fark nemli bir farktr. Bazen yazd


gmz programlarda, duruma
gre her iki zelli
ge de ihtiyacmz olabilir...

7.2.8 intersection metodu


intersection kelimesi Trkede kesi
sim anlamna gelir. Adndan da anlad
gmz gibi,
intersection() metodu bize iki kmenin kesi
sim kmesini verecektir:
>>> k1 = set([1, 2, 3, 4])
>>> k2 = set([1, 3, 5, 7])
>>> k1.intersection(k2)
{1, 3}

Grd
gnz gibi, bu metot bize k1 ve k2nin kesi
sim kmesini veriyor. Dolaysyla bu iki kme
arasndaki ortak elemanlar bulmu
s oluyoruz...
Hatrlarsanz, difference() metodunu anlatrken, difference() kelimesi yerine - i
saretini
de kullanabilece
gimiz, sylemi
stik. Benzer bir durum intersection() metodu iin de geerlidir. Iki kmenin kesi
simini bulmak iin & i
saretinden yararlanabiliriz:
>>> k1 & k2
{1, 3}

Python programclar genellikle uzun uzun intersection yazmak yerine & i


saretini kullanrlar...
Isterseniz bu metot iin rnek bir program verelim. Bylece gerek hayatta bu metodu nasl
kullanabilece
gimizi grm
s oluruz:
parola = input("Ltfen sisteme giri
s iin bir parola belirleyin: ")
tr = "
s
g
S
G
I"
if set(tr) & set(parola):
print("Ltfen parolanzda Trke harfler kullanmayn!")
else:
print("Parolanz kabul edildi!")

Burada e
ger kullanc, parola belirlerken iinde Trke bir harf geen bir kelime yazarsa programmz kendisini Trke harf kullanmamas konusunda uyaracaktr. Bu kodlarda kmeleri
nasl kulland
gmza dikkat edin. Programda asl i
si yapan ksm s
u satrdr:
if set(tr) & set(parola):
print("Ltfen parolanzda Trke harfler kullanmayn!")

Burada aslnda s
yle bir s
ey demi
s oluyoruz:
E
ger set(tr) ve set(parola) kmelerinin kesi
sim kmesi bo
s de
gilse, kullancya Ltfen parolanzda Trke harfler kullanmayn! uyarsn gster!
set(tr) ve set(parola) kmelerinin kesi
sim kmesinin bo
s olmamas, kullancnn girdi
gi kelime
iindeki harflerden en az birinin tr adl de
gi
sken iinde geti
gi anlamna gelir... Burada basite, tr de
gi
skeni ile parola de
gi
skeni arasndaki ortak
geleri sorguluyoruz. E
ger kullanc
herhangi bir Trke harf iermeyen bir kelime girerse set(tr) ve set(parola) kmelerinin kesi
sim
kmesi bo
s olacaktr. Isterseniz kk bir deneme yapalm:

>>> tr = "
s
g
S
G
I"
>>> parola = "ilek"
>>> set(tr) & set(parola)
{}

Burada kullancnn ilek adl kelimeyi girdi


gini varsayyoruz... Byle bir durumda set(tr)
ve set(parola) kmelerinin kesi
sim kmesi harfini ierecek, dolaysyla da programmz
kullancya uyar mesaj gsterecektir. E
ger kullancmz kalem gibi Trke harf iermeyen
bir kelime girerse:
>>> tr = "
s
g
S
G
I"
>>> parola = "kalem"
>>> set(tr) & set(parola)
set()

Grd
gnz gibi, elde etti
gimiz kme bo
s... Dolaysyla byle bir durumda programmz kullancya herhangi bir uyar mesaj gstermeyecektir...
intersection() metodunu pek ok yerde kullanabilirsiniz. Hatta iki dosya arasndaki benzerlikleri bulmak iin dahi bu metottan yararlanabilirsiniz... Ilerde dosya i
slemleri konusunu
i
slerken bu metottan nasl yararlanabilece
gimizi de anlataca
gz...

7.2.9 intersection_update metodu


Hatrlarsanz difference_update() metodunu i
slerken s
yle bir s
ey demi
stik:
Bu metot, difference() metodundan elde edilen sonuca gre bir kmenin gncellenmesini
sa
glar.
I
ste intersection_update metodu da buna ok benzer bir i
slevi yerine getirir. Bu metodun
grevi, intersection() metodundan elde edilen sonuca gre bir kmenin gncellenmesini
sa
glamaktr:
>>> k1 = set([1, 2, 3])
>>> k2 = set([1, 3, 5])
>>> k1.intersection_update(k2)
{1, 3}
>>> print(k1)
{1, 3}
>>> print(k2)
{1, 3, 5}

Grd
gnz gibi, intersection_update() metodu k1in btn
gelerini sildi ve yerlerine k1
ve k2nin kesi
sim kmesinin elemanlarn koydu...

7.2.10 isdisjoint metodu


Bu metodun ok basit bir grevi vardr. isdisjoint() metodunu kullanarak iki kmenin kesi
sim kmesinin bo
s olup olmad
g sorgulayabilirsiniz. Hatrlarsanz ayn i
si bir nceki blmde
grd
gmz intersection() metodunu kullanarak da yapabiliyorduk. Ama e
ger hayattan tek
beklentiniz iki kmenin kesi
sim kmesinin bo
s olup olmad
gn, yani bu iki kmenin ortak eleman ierip iermedi
gini
grenmekse, basite isdisjoint() metodundan yararlanabilirsiniz:
>>> a = set([1, 2, 3])
>>> b = set([2, 4, 6])
>>> a.isdisjoint(b)
False

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

Burada a ve b kmeleri ortak hi bir elemana sahip olmad


g iin Do
gru anlamna gelen
True ktsn elde ediyoruz...

7.2.11 issubset metodu


Bu metot yardmyla, bir kmenin btn elemanlarnn ba
ska bir kme iinde yer alp yer almad
gn sorgulayabiliriz. Yani bir kmenin, ba
ska bir kmenin alt kmesi olup olmad
gn bu
metot yardmyla
grenebiliriz. E
ger bir kme ba
ska bir kmenin alt kmesi ise bu metot bize
True de
gerini verecek; e
ger de
gilse False ktsn verecektir:
>>> a = set([1, 2, 3])
>>> b = set([0, 1, 2, 3, 4, 5])
>>> a.issubset(b)
True

Bu rnekte True ktsn aldk, nk a kmesinin btn


geleri b kmesi iinde yer alyor. Yani
a, bnin alt kmesidir...

7.2.12 issuperset metodu


Bu metot, bir nceki blmde grd
gmz issubset() metoduna benzer. Matematik derslerinde grd
gmz kmeler konusunda hatrlad
gnz b kmesi a kmesini kapsar

ifadesini bu metotla gsteriyoruz... nce bir nceki derste grd


gmz rne
ge bakalm:
>>> a = set([1, 2, 3])
>>> b = set([0, 1, 2, 3, 4, 5])
>>> a.issubset(b)
True

Buradan, a kmesi b kmesinin alt kmesidir, sonucuna ula


syoruz... Bir de s
una bakalm:
>>> a = set([1, 2, 3])
>>> b = set([0, 1, 2, 3, 4, 5])
>>> b.issuperset(a)
True

Burada ise, b kmesi a kmesini kapsar, sonucunu elde ediyoruz...


kmesinin btn elemanlarn iinde barndryor...

Yani b kmesi a

7.2.13 union metodu


union() metodu iki kmenin birle
simini almamz sa
glar. Hemen bir rnek verelim:
>>> a = set([2, 4, 6, 8])
>>> b = set([1, 3, 5, 7])
>>> a.union(b)
{1, 2, 3, 4, 5, 6, 7, 8}

nceki blmlerde grd


gmz baz metotlarda oldu
gu gibi, union() metodu da bir ksayola
sahiptir. union() metodu yerine | i
saretini de kullanabiliriz:
>>> a | b

union() metodu yerine, bu metodun ksayolu olan | i


sareti Python programclar tarafndan
daha sk kullanlr...

7.2.14 update metodu


Hatrlarsanz add() metodunu anlatrken s
yle bir rnek vermi
stik:
>>> kume = set(["elma", "armut", "kebap"])
>>> yeni = [1, 2, 3]
>>> for i in yeni:
...
kume.add(i)
...
{1, 2, 3, elma, kebap, ilek, armut}

Bu rne
gi verdikten sonra da s
yle bir s
ey demi
stik:
Burada yeni adl listeyi kmeye for dngs ile ekledik. Ama bu i
slemi yapmann ba
ska bir
yolu daha vardr. Bu i
slem iin Pythonda ayr bir metot bulunur.

I
ste bu metodu
grenmenin vakti geldi. Metodumuzun ad update(). Bu metot, bir kmeyi
gncellememizi sa
glar. Isterseniz yukardaki rne
gi, bu metodu kullanarak tekrar yazalm:
>>> kume = set(["elma", "armut", "kebap"])
>>> yeni = [1, 2, 3]
>>> kume.update(yeni)
>>> print(kme)
{1, 2, 3, elma, kebap, armut}

Grd
gnz gibi, for dngsn kullanmaya gerek kalmadan ayn sonucu elde edebildik...

7.2.15 symmetric_difference metodu


Daha nceki blmlerde difference() metodunu kullanarak iki kme arasndaki farkl
geleri
bulmay
grenmi
stik. rne
gin elimizde s
yle iki kme var diyelim:
>>> a = set([1, 2, 5])
>>> b = set([1, 4, 5])

E
ger a kmesinin b kmesinden farkn bulmak istersek s
yle yapyoruz:
>>> a.difference(b)
{2}

Demek ki a kmesinde bulunup b kmesinde bulunmayan


ge 2 imi
s...
Bir de b kmesinde bulunup a kmesinde bulunmayan
gelere bakalm:
>>> b.difference(a)
{4}

Bu da bize 4 ktsn verdi. Demek ki bu


ge b kmesinde bulunuyor, ama a kmesinde
bulunmuyormu
s. Peki ya kmelerin ikisinde de bulunmayan
geleri ayn anda nasl alaca
gz?
i
ste bu noktada yardmmza symmetric_difference() adl metot yeti
secek:
>>> a.symmetric_difference(b)
{2, 4}

Bylece iki kmede de bulunmayan


geleri ayn anda alm
s olduk...

7.2.16 symmetric_difference_update metodu


Daha nce difference_update ve intersection_update gibi metotlar
grenmi
stik.
symmetric_difference_update() metodu da bunlara benzer bir i
slevi yerine getirir:
>>> a = set([1,2, 5])
>>> b = set([1,4, 5])
>>> a.symmetric_difference_update(b)

>>> print(a)
set([2, 4])

Grd
gnz gibi, a kmesinin eski
geleri gitti, yerlerine symmetric_difference() metoduyla
elde edilen kt geldi... Yani a kmesi, symmetric_difference() metodunun sonucuna gre
gncellenmi
s oldu...

7.2.17 pop metodu


Inceleyece
gimiz son metot pop() metodu olacak. Geri bu metot bize hi yabanc de
gil.
Bu metodu listeler konusundan hatrlyoruz. Orada
grendi
gimize gre, bu metot listenin
bir
gesini silip ekrana basyordu... Aslnda buradaki fonksiyonu da farkl de
gil. Burada da
kmelerin
gelerini silip ekrana basyor:
>>> a = set(["elma", "armut", "kebap"])
>>> a.pop()
elma

Peki bu metot hangi lte gre kmeden


ge siliyor? Herhangi bir lt yok. Bu metot, kme

gelerini tamamen rastgele siliyor...

BLM

Hata Yakalama

Bu blmde yine Python Programlama Dili ile ilgili ok nemli bir konudan sz edece
giz. Yeni
konumuz Pythonda Hata Yakalama. Bu blmde Pythonda hatalarla ba
setmeyi
grenece
giz...
Hatrlarsanz nceki blmlerde yazd
gmz programlarda, rne
gin kullanc bizim beklentimizin
aksine bir say yerine harf girerse programmz hata verip kyordu. Gelin isterseniz buna
basit bir rnek verelim:
Amacmz iki sayy toplayan bir program yazmak olsun:
topla1 = input("Ltfen toplama i
slemine girecek ilk sayy giriniz: ")
topla2 = input("Ltfen toplama i
slemine girecek ikinci sayy giriniz: ")
sonu = int(topla1) + int(topla2)
print(sonu)

Bu program al
strd
gmzda, programmz kullanc tarafndan girilen iki sayy toplayp ekrana
yazdracaktr. Burada i
slerin do
gru gitmesi kullancnn ekrana iki adet say yazmasna ba
gldr.
E
ger kullanc say yerine harf girerse Pythonun bize verece
gi kt s
una benzer bir s
ey olacaktr:
Traceback (most recent call last):
File "deneme.py", line 5, in <module>
sonu = int(topla1) + int(topla2)
ValueError: invalid literal for int() with base 10: f

Esasnda daha nceki bir blmde rnek olarak basit bir hesap makinesi yazarken de byle bir
sorunumuzun oldu
gunu sylemi
stik. Orada ayn zamanda sonraki bir derste bu sorunun kesin
zmn
grenece
gimizi de sylemi
stik. I
ste bu tr problemlerin zmn s
imdi inceleyece
gimiz blmde
grenece
giz...

8.1 try... except...


Pythonda hatalarla ba
setmek iin try...
bir rnek verelim...

except... adl bloklardan yararlanaca


gz. Basit

Geen blmde s
yle bir rnek vermi
stik:

125

topla1 = input("Ltfen toplama i


slemine girecek ilk sayy giriniz: ")
topla2 = input("Ltfen toplama i
slemine girecek ikinci sayy giriniz: ")
sonu = int(topla1) + int(topla2)
print(sonu)

Bu program al
strd
gmzda e
ger kullanc srasyla iki tane say girerse ne ala!... Programmz
hi bir sorun kartmadan bu saylar toplayacaktr. Ama e
ger kullanc say girmek yerine,
mesela a harfine basarsa programmzn s
yle bir hata verece
gini biliyoruz:
Traceback (most recent call last):
File "deneme.py", line 5, in <module>
sonu = int(topla1) + int(topla2)
ValueError: invalid literal for int() with base 10: a

Bu hata mesaj bizim iin nemli baz bilgiler ieriyor. Burada bizim dikkat etmemiz gereken,
bu hatann son satr... Gryoruz ki hata mesajnn son satrnda ValueError ifadesi var. I
ste
hata mesajnn bizim i
simize yarayacak ksm bu. Demek ki kullanc say yerine harf girerse
Pythonun verdi
gi hata tr ValueError imi
s... S
imdi s
yle bir s
ey yazalm:
try:
topla1 = input("Ltfen toplama i
slemine girecek ilk sayy giriniz: ")
topla2 = input("Ltfen toplama i
slemine girecek ikinci sayy giriniz: ")
sonu = int(topla1) + int(topla2)
print(sonu)
except ValueError:
print("Yanl
s de
ger!")

Artk kullancmz say d


snda bir de
ger girerse, programmz hata vermek yerine daha anlaml bir kt retecek ve kullancya Yanl
s de
ger! uyars gsterecektir. Burada yapt
gmz
s
ey, programn btn a
samalarn bir try... blo
gu iine almak.. Kullancnn say d
s bir veri
girmesi durumunda ValueError ile kar
sla
saca
gmz biliyoruz. Bu hata trn except ValueError s
eklinde gsterip, Pythonun bu hata trn grmezden gelmesini sa
glyoruz. Aslnda
burada Pythona s
u emri vermi
s oluyoruz:
Kullancya, birbiriyle toplanacak saylar sor! Daha sonra bu saylar topla ve
sonucu ekrana yaz! E
ger try blo
gu iinde gerekle
sen i
slemlerin herhangi bir a
samasnda ValueError hatas olu
sursa pat diye kmek yerine ekrana Yanl
s de
ger!
ifadesini yazdr!
Isterseniz try.. except.. blo
gunun i
slevini daha net grebilmek iin yukardaki rne
gimizi
bir while dngs iine alalm. Bylece programmz tekrar tekrar al
ssn:
while True:
topla1 = input("Ltfen toplama i
slemine girecek ilk sayy giriniz: ")
topla2 = input("Ltfen toplama i
slemine girecek ikinci sayy giriniz: ")
sonu = int(topla1) + int(topla2)
print(sonu)

Grd
gnz gibi, bu s
ekilde programmz her i
slem sonunda ba
sa dnp kullancya tekrar
say soruyor. Tabii e
ger kullanc harf yerine ba
ska bir veri girerse programmzn al
smas
sona eriyor. Bir de s
una bakalm:
while True:
try:
topla1 = input("Ltfen toplama i
slemine girecek ilk sayy giriniz: ")
topla2 = input("Ltfen toplama i
slemine girecek ikinci sayy giriniz: ")

sonu = int(topla1) + int(topla2)


print(sonu)
except ValueError:
print("yanl
s de
ger!")

Programmz al
strd
gmzda, kullanc ne tr bir veri girerse girsin programmz al
smasna
devam edecektir. E
ger kullanc iki adet say girerse bunlar toplayp sonucu ekrana yazdracak;
ama e
ger kullanc say yerine ba
ska bir s
ey girerse de nce kullancy yanl
s de
ger girdi
gi
konusunda uyaracak ve yine al
smasna devam edecektir.
Bu demek oluyor ki, try... except... blo
gu sayesinde programmz ValueError hatasyla
kar
sla
ssa bile kmeden al
smaya devam edebilecektir.
Buradan, Pythonda hata yakalama konusunun nemli bir faydasn
grenmi
s oluyoruz:
Bildi
giniz gibi, Pythonu kendi haline brakt
gnzda, kullanc iin pek bir s
ey ifade etmeyecek hata mesajlar retiyor. Bu mesajlar bir Python programcs iin ok s
ey ifade ediyor olsa
da, programmz kullanan kimselerin bu kriptik hata mesajlarn anlamasn bekleyemeyiz. O
yzden onlara bu tr bulank hata mesajlar yerine, yukarda grd
gmz try... except...
bloklarn kullanarak daha anlaml mesajlar gsterebiliriz... Ne de olsa yanl
s de
ger! gibi bir
ileti, ValueError: invalid literal for int() with base 10: a gibi, olduka bilgisayarvari bir hata
mesajna gre ok daha anlaml olacaktr son kullanc iin.
Isterseniz daha nce yapt
gmz basit hesap makinesine geri dnp, yukarda
grendi
gimiz
yeni bilgiyi o kodlara uygulayalm. Zira hesap makinemiz de, e
ger kullanc say yerine harf
girerse kyordu:
#!/usr/bin/env python3.0
while True:
giri
s = """
(1) topla
(2) kar
(3) arp
(4) bl
(5) karesini hesapla
Programdan kmak iin "" harfine basnz...
"""
print(giri
s)
soru = input("Yapmak istedi
giniz i
slemin numarasn girin: ")
try:
if soru == "1":
say1 = int(input("Toplama i
slemi iin ilk sayy girin: "))
say2 = int(input("Toplama i
slemi iin ikinci sayy girin: "))
print(say1, "+", say2, "=", say1 + say2)
elif soru == "2":
say3 = int(input("karma i
slemi iin ilk sayy girin: "))
say4 = int(input("karma i
slemi iin ikinci sayy girin: "))
print(say3, "-", say4, "=", say3 - say4)
elif soru == "3":
say5 = int(input("arpma i
slemi iin ilk sayy girin: "))

say6 = int(input("arpma i
slemi iin ikinci sayy girin: "))
print(say5, "x", say6, "=", say5 * say6)
elif soru == "4":
say7 = int(input("Blme i
slemi iin ilk sayy girin: "))
say8 = int(input("Blme i
slemi iin ikinci sayy girin: "))
print(say7, "/", say8, "=", say7 / say8)
elif soru == "5":
say9 = int(input("Karesini hesaplamak istedi
giniz sayy giriniz: "))
print(say9, "saysnn karesi =", say9 ** 2)
elif soru == "":
print("Tekrar gr
smek zere!")
a = 0
else:
print("Yanl
s giri
s.")
print("A
sa
gdaki seeneklerden birini giriniz:")
except ValueError:
print("Sadece say giriniz!")

Grd
gnz gibi, burada da yapt
gmz s
ey, kullancnn say yerine harf girmesi durumunda
Pythonun ValueError hatas verece
gini bildi
gimiz kodlar try... blo
gu iine almaktan
ibaret... ValueError hatas alnd
gnda kullancya gsterilecek mesaj ise except ValueError blo
gu iinde gsteriyoruz.
Yukarda grd
gmz try... except... bloklar konusunda nemli bir nokta vardr dikkat
etmemiz gereken... except ValueError s
eklinde bir ifade kulland
gmzda, Python yalnzca
ValueError hatalarn yakalayacaktr. Bir program ValueError d
snda da pek ok hata verebilir. Mesela yukarda tekrar verdi
gimiz hesap makinemizin bir sorunu daha var. Bu programda
blme i
slemi srasnda bir sayy 0a blmeye al
srsak programmz s
yle bir hata verecektir:
Traceback (most recent call last):
File "deneme.py", line 38, in <module>
print(say7, "/", say8, "=", say7 / say8)
ZeroDivisionError: int division or modulo by zero

Programlama dillerinde bir saynn sfra blnmesi programn kmesiyle sonulanr. O yzden
biz de yazd
gmz programlarda yaplan i
slemlerin bir a
samasnda herhangi bir saynn sfra
blnmedi
ginden emin olmalyz...
Yukardaki hata mesajnda bizi ilgilendiren ksm ZeroDivisionError. Dolaysyla hata mesajn
yakalarken bu ifadeyi kullanaca
gz. Yazaca
gmz kodun tasla
g s
yle olacak:
try:
...hata verece
gini bildi
gimiz kodlar...
except ZeroDivisionError:
...hata geldi
ginde kullancya gsterilecek mesaj veya yaplacak i
slem...

Bu kodlar, yukarda ValueError iin yazd


gmz kodlarn yerine koyabiliriz. Bu basit bir i
s.
Peki ya ayn program iinde hem ValueError hatasn, hem de ZeroDivisionError hatasn
yakalamak istersek ne yapaca
gz? Bu daha da basit bir i
s. Tasla
gmz s
yle:
try:
...hata verece
gini bildi
gimiz kodlar...
except ValueError:
...ValueError hatas ald
gmzda yapaca
gmz i
slem...

except ZeroDivisionError:
...ZeroDivisionError hatas ald
gmzda yapaca
gmz i
slem...

Grd
gnz gibi, birden fazla hatay ayn anda yakalamak istedi
gimizde, her bir hata iin ayr
bir except... blo
gu yazmamz yeterli oluyor. Elbette, yukardaki taslak, her bir hata mesaj
iin ayr bir i
slem yapmak istedi
gimizde geerli. E
ger hangi hatayla kar
sla
slrsa kar
sla
slsn
ayn mesaj gsterilecekse veya ayn i
slem yaplacaksa kodlarmz s
yle de yazabiliriz:
try:
...hata verece
gini bildi
gimiz kodlar...
except (ValueError, ZeroDivisionError):
...hata alnnca yaplacak i
slem...

Burada hata mesajlarn bir demet iinde toplad


gmza zellikle dikkat edin.
Bir sonraki blmde bu hata yakalama konusunu incelemeye devam edece
giz. Ama ncelikle
grenmemiz gereken ba
ska s
eyler var...

8.2 break Deyimi


Pythonda break zel bir deyimdir. Bu deyim yardmyla, devam eden bir sreci kesintiye
u
gratabiliriz. Bu deyimin kullanld
g basit bir rnek verelim:
>>> tekrar = 1
>>> while tekrar <= 10:
...
tekrar = tekrar + 1
...
try:
...
soru = int(input("
grencinin notu: "))
...
except ValueError:
...
break

Burada ncelikle tekrar adl bir de


gi
sken tanmladk. Bu de
gi
skenin de
geri 1. tekrar adl
de
gi
skenin de
geri 10dan kk veya 10a e
sit oldu
gu mddete programmzn al
smaya devam etmesi iin while tekrar <=10 s
eklinde bir satr yazyoruz. Daha sonra, tanmlad
gmz
bu while dngs iinde, tekrar adl de
gi
skenin de
gerini her dngde 1 say artryoruz.
Bylece programmz tekrar adl de
gi
skenin de
geri 10a ula
sncaya kadar al
smaya devam
edecek. Ardndan, soru = int(input(
grencinin notu: )) ifadesi yardmyla bir dn
strme
i
slemi yapyoruz. input() fonksiyonu ile kullancdan bekledi
gimiz verinin tipi say olacak.
Kullancnn say yerine bir harf girmesi ihtimaline kar
s input() fonksiyonunu bir try... blo
gu
iine yerle
stirdik. E
ger kullanc say yerine harf girerse programmzn ValueError hatas
verece
gini biliyoruz. O yzden bir except... blo
gu olu
sturarak bu olas hatay yakalyoruz.
break deyimi bu noktada devreye giriyor. E
ger kullanc ValueError hatasnn verilmesine yol
aacak bir veri girerse programmz sessizce sonlanacaktr... Bu sessizce sonlanma i
sini yerine
getiren kodumuz en son satrdaki break ifadesi...
Program al
strd
gmzda, e
ger kullanc say yerine bir harf girerse, veya hi bir veri girmeden
enter tu
suna basarsa programmz kapanacaktr.
Grd
gnz gibi, break ifadesinin temel grevi bir dngy sona erdirmek. Buradan anlayaca
gmz gibi, break ifadesinin her zaman bir dng iinde yer almas gerekiyor. Aksi halde
Python bize s
yle bir hata verecektir:
SyntaxError: break outside loop

Yani; SzDizimiHatas: break dng d


snda

Bununla ilgili basit bir rnek daha verelim:


>>> while True:
...
parola = input("Ltfen bir parola belirleyiniz:")
...
if len(parola) < 5:
...
print("Parola 5 karakterden az olmamal!")
...
else:
...
print("Parolanz belirlendi!")
...
break

Burada da, e
ger kullancnn girdi
gi parolann uzunlu
gu 5 karakterden azsa, Parola 5 karakterden az olmamal! uyars gsterilecektir. E
ger kullanc 5 karakterden uzun bir parola
belirlemi
sse, kendisine Parolanz belirlendi! mesajn gsterip, break deyimi yardmyla programdan kyoruz...

8.3 pass Deyimi


pass kelimesi Ingilizcede gemek anlamna gelir. Bu deyimin Python programlama dilindeki anlam da buna ok yakndr. Bu deyimi Pyhonda grmezden gel, hibir s
ey yapma
anlamnda kullanaca
gz:
>>> liste = []
>>> while True:
...
a = input("Herhangi bir karakter giriniz: ")
...
if a == "0":
...
pass
...
else:
...
liste.append(a)
...
print(liste)

Burada e
ger kullancnn girdi
gi karakter 0 ise hibir s
ey yapmyoruz. Ama e
ger kullanc
0 d
snda herhangi bir karakter girerse, bu karakterleri alp listeye ekliyoruz. Bu kodlarla
Pythona s
yle bir s
ey sylemi
s oluyoruz:
E
ger kullanc 0 karakterini girerse grmezden gel. Hibir s
ey yapma!... Ama e
ger
girilen karakter 0 d
snda bir s
eyse bunu listeye ekle ve listeyi ekrana bas!
pass deyimini hata yakalama i
slemlerinde de kullanabiliriz. E
ger bir hata yakaland
gnda programmzn hi bir s
ey yapmadan yoluna devam etmesini istiyorsak bu deyim i
simize yarayacaktr:
try:
....bir
seyler...
except IndexError:
pass

Bu s
ekilde programmz IndexError hatasyla kar
sla
srsa hi bir s
ey yapmadan yoluna devam edecek, bylece kullancmz programda ters giden bir s
eyler oldu
gunu dahi anlamayacaktr!... Yazd
gnz programlarda bunun iyi bir s
ey mi yoksa kt bir s
ey mi oldu
guna programc olarak sizin karar vermeniz gerekiyor... E
ger bir hatann kullancya gsterilmesinin
gerekmedi
gini d
snyorsanz yukardaki kodlar kullann, ama e
ger verilen hata nemli bir
hataysa ve kullancnn bu durumdan haberdar olmas gerekti
gini d
snyorsanz, bu hatay
pass ile gei
stirmek yerine, kullancya hatayla ilgili makul ve anla
slr bir mesaj gstermeyi
d
snebilirsiniz...
Yukarda anlatlan durumlarn d
snda, pass deyimini kodlarnz henz taslak a
samasnda
oldu
gu zaman da kullanabilirsiniz. rne
gin, diyelim ki bir kod yazyorsunuz. Programn

gidi
satna gre, bir noktada yapmanz gereken bir i
slem var, ama henz ne yapaca
gnza
karar vermediniz. Byle bir durumda pass deyiminden yararlanabilirsiniz. Mesela birtakm
if deyimleri yazmay d
snyor olun:
if .....:
byle yap
elif .....:
syle yap

else:
pass

Burada henz else blo


gunda ne yaplaca
gna karar vermemi
s oldu
gunuz iin, oraya bir pass
koyarak durumu s
imdilik gei
stiriyorsunuz. Program son haline gelene kadar oraya bir s
eyler
yazm
s olaca
gz.
Szn z, pass deyimlerini, herhangi bir i
slem yaplmasnn gerekli olmad
g durumlar iin
kullanyoruz.. Ilerde i
se yarar programlar yazd
gnzda, bu pass deyiminin grnd
gnden
daha faydal bir ara oldu
gunu anlayacaksnz...

8.4 continue Deyimi


continue ilgin bir deyimdir. Isterseniz continueyi anlatmaya al
smak yerine bununla ilgili
bir rnek verelim:
>>> while True:
...
s = input("Bir say girin: ")
...
if s == "iptal":
...
break
...
if len(s) <= 3:
...
continue
...
print("En fazla haneli bir say girebilirsiniz.")

Burada e
ger kullanc klavyede iptal yazarsa programdan klacaktr. Bunu;
if s == "iptal":
break

satryla sa
glamay ba
sardk.
E
ger kullanc tarafndan girilen say haneli veya daha az haneli bir say ise, continue
ifadesinin etkisiyle:
>>> print("En fazla haneli bir say girebilirsiniz.")

satr es geilecek ve dngnn en ba


sna gidilecektir.
E
ger kullancnn girdi
gi saydaki hane ten fazlaysa ekrana:
En fazla haneli bir say girebilirsiniz.

cmlesi yazdrlacaktr.
Dolaysyla buradan anlad
gmza gre, continue deyiminin grevi kendisinden sonra gelen
her s
eyin es geilip dngnn ba
sna dnlmesini sa
glamaktr. Bu bilgiye gre, yukardaki programda e
ger kullanc, uzunlu
gu 3 karakterden az bir say girerse continue deyiminin etkisiyle
programmz dngnn en ba
sna geri gidiyor. Ama e
ger kullanc, uzunlu
gu 3 karakterden fazla bir say girerse, ekrana En fazla haneli bir say girebilirsiniz, cmlesinin yazdrld
gn
gryoruz.

8.5 else... finally...


Pythonda hata yakalama i
slemleri iin o
gunlukla try... except... bloklarn bilmek
yeterli olacaktr. I
slerimizin byk ksmn sadece bu bloklar kullanarak halledebiliriz. Ancak Python bize bu konuda, zaman zaman i
simize yarayabilecek ba
ska aralar da sunmaktadr. I
ste else... finally bloklar da bu aralardan biridir. Bu blmde ksaca else... ve
finally... bloklarnn ne i
se yarad
gndan sz edece
giz.
ncelikle else... blo
gunun ne i
se yarad
gna bakalm. Esasnda biz bu else deyimini daha
nce de ko
sullu ifadeler konusunu i
slerken grm
stk. Buradaki kullanm da zaten hemen
hemen ayndr. Diyelim ki elimizde s
yle bir s
ey var:
try:
blnen = int(input("blnecek say: "))
blen = int(input("blen say: "))
print(blnen/blen)
except ValueError:
print("hata!")

Burada e
ger kullanc say yerine harf girerse ValueError hatas alrz. Bu hatay except ValueError: ifadesiyle yakalyoruz ve hata verildi
ginde kullancya uyar vererek programmzn
kmesini engelliyoruz. Ama biliyoruz ki, bu kodlar al
strd
gmzda Pythonun verebilece
gi
tek hata ValueError de
gildir. E
ger kullanc bir sayy 0a blmeye al
srsa Python ZeroDivisionError adl hatay verecektir. Dolaysyla bu hatay da yakalamak iin s
yle bir s
ey
yazabiliriz:
try:
blnen = int(input("blnecek say: "))
blen = int(input("blen say: "))
print(blnen/blen)
except ValueError:
print("hata!")
except ZeroDivisionError:
print("Bir sayy 0a blemezsiniz!")

Bu s
ekilde hem ValueError hatasn hem de ZeroDivisionError hatasn yakalam
s oluruz...
Bu kodlarn zelli
gi, except... bloklarnn tek bir try... blo
gunu temel almasdr. Yani biz
burada btn kodlarmz tek bir try... blo
gu iine tk
stryoruz. Bu blok iinde gerekle
sen
hatalar da daha sonra tek tek except... bloklar yardmyla yakalyoruz. Ama e
ger biz istersek bu kodlarda verilebilecek hatalar gruplamay da tercih edebiliriz:
try:
blnen = int(input("blnecek say: "))
blen = int(input("blen say: "))
except ValueError:
print("hata!")
else:
try:
print(blnen/blen)
except ZeroDivisionError:
print("Bir sayy 0a blemezsiniz!")

Burada yapt
gmz s
ey s
u: Ilk try... except... blo
gu yardmyla ncelikle int(input())
fonksiyonu ile kullancdan gelecek verinin say olup olmad
gn denetliyoruz. Ardndan bir
else... blo
gu aarak, bunun iinde ikinci try... except... blo
gumuzu devreye sokuyoruz. Burada da blme i
slemini gerekle
stiriyoruz. Kullancnn blme i
slemi srasnda 0
saysn girmesi ihtimaline kar
s da except ZeroDivisionError ifadesi yardmyla olas hatay
g
gslyoruz... Bu s
ekilde bir kodlamann bize getirece
gi avantaj, hatalar zerinde belli bir
kontrol sa
glamamza yardmc olmasdr. Yukardaki kodlar sayesinde hatalara bir nevi teker
teker gelin! mesaj vermi
s oluyoruz!... Bylelikle her blok iinde sadece almay bekledi
gimiz
hatay kar
slyoruz. Mesela yukarda ilk try... blo
gu iindeki dn
strme i
slemi yalnzca
ValueError hatas verebilir. else: blo
gundan sonraki try... blo
gunda yer alan i
slem ise
ancak ZeroDivisionError verecektir. Biz yukarda kulland
gmz yap sayesinde her bir hatay
tek tek ve yeri geldi
ginde kar
slyoruz. Bu durumun aksine, blmn ilk ba
snda verdi
gimiz
try... blo
gunda hem ValueError hem de ZeroDivisionError hatalarnn gerekle
sme ihtimali bulunuyor. Dolaysyla biz orada btn hatalar tek bir try... blo
gu iine sk
strm
s
oluyoruz. I
ste else: blo
gu bu sk
skl
g gidermi
s oluyor. Ancak sizi bir konuda uyarmak isterim: Bu yap, her akla geldi
ginde kullanlacak bir yap de
gildir. Byk programlarda bu tarz
bir kullanm kodlarnzn darmada
gn olmasna, kodlarnz zerindeki denetimi tamamen kaybetmenize yol aabilir. Sonunda da elinizde blk prk bir kod y
gn kalabilir... Zaten aka
sylemek gerekirse try... except... else... yapsnn ok geni
s bir kullanm alan yoktur. Bu yap ancak ok nadir durumlarda kullanlmay gerektirebilir. Dolaysyla bu l yapy
hi kullanmadan bir mr rahatlkla geirebilirsiniz...
try...
try...

except...
except...

else... yaplarnn d
snda, Pythonun bize sundu
gu bir ba
ska yap da
finally... yaplardr... Bunu s
yle kullanyoruz:

try:
...bir takm i
sler...
except birHata:
...hata alnnca yaplacak i
slemler...
finally:
...hata olsa da olmasa da yaplmas gerekenler...

finally.. blo
gunun en nemli zelli
gi, programn al
smas srasnda herhangi bir hata
gerekle
sse de gerekle
smese de i
sletilecek olmasdr. E
ger yazd
gnz programda mutlaka
ama mutlaka i
sletilmesi gereken bir ksm varsa, o ksm finally... blo
gu iine yazabiliriz.
finally... blo
gu zellikle dosya i
slemlerinde i
simize yarayabilir. Henz Pythonda dosyalarla
nasl al
saca
gmz
grenmedik, ama ben s
imdilik size en azndan dosyalarla al
sma prensibi
hakknda bir s
eyler syleyeyim.
Genel olarak Pythonda dosyalarla al
sabilmek iin ncelikle bilgisayarda bulunan bir dosyay
okuma veya yazma kipinde aarz. Dosyay atktan sonra bu dosyayla ihtiyacmz olan birtakm i
slemler gerekle
stiririz. Dosyayla i
simiz bittikten sonra ise dosyamz mutlaka kapatmamz gerekir. Ancak e
ger dosya zerinde i
slem yaplrken bir hata ile kar
sla
slrsa dosyamz
kapatma i
slemini gerekle
stirdi
gimiz blme hi ula
slamayabilir. I
ste finally... blo
gu byle
bir durumda i
simize yarayacaktr:
try:
dosya = open("dosyaad", "r")
...burada dosyayla baz i
slemler yapyoruz...
...ve anszn bir hata olu
suyor...
except IOError:
print("bir hata olu
stu!")

finally:
dosya.close()

Burada finally... blo


gu iine yazd
gmz dosya.close() ifadesi dosyamz kapatmaya
yaryor. Bu blok, yazd
gmz program hata verse de vermese de i
sletilecektir.

8.6 except... as...


Pythondaki hata mesajlar temel olarak iki blmden olu
sur:
1. Hatann ad,
2. Hatann ad ile birlikte gsterilen mesaj.
Bir rnek zerinde grelim bunu:
ValueError: invalid literal for int() with base 10: a

Burada ValueError hatann addr. invalid literal for int() with base 10: a ise gsterilen
mesaj... Biz e
ger istersek bu hatann adn zelle
stirebilir, o ksma istedi
gimiz ba
ska bir ifade
yazabiliriz. Bunun iin except... as... bloklarndan yararlanaca
gz. Hemen bir rnek verelim:
try:
blnen = int(input("blnecek say: "))
blen = int(input("blen say: "))
print(blnen/blen)
except ZeroDivisionError as hata:
print("Sfra Blme Hatas. Python
su hata mesajn verdi:", hata)

Burada ZeroDivisionError adl hatay aslnda bile


senlerine ayrm
s olduk... except ZeroDivisionError as hata ifadesi yardmyla bu hata mesajnn ana gvdesini hata olarak adlandrdk. Son olarak da bu hata de
gi
skenini print() fonksiyonu iinde kullanarak ekrana
yazdrdk.

8.7 raise
Bazen, yazd
gmz bir programda, kullancnn yapt
g bir i
slem normal s
artlar altnda hata vermeyecek olsa bile biz ona Python tarz bir hata mesaj gstermek isteyebiliriz. Byle bir durumda ihtiyacmz olan s
ey Pythonun bize sundu
gu raise adl deyimdir. Bu deyim yardmyla
duruma zg hata mesajlar retebiliriz. Bir rnek verelim:
blnen = int(input("blnecek say: "))
if blnen == 23:
raise Exception("Bu programda 23 saysn grmek istemiyorum!")
blen = int(input("blen say: "))
print(blnen/blen)

Burada e
ger kullanc 23 saysn girerse, kullancya bir hata mesaj gsterilip programdan
klacaktr... Biz bu kodlarda Exception adl genel hata mesajn kullandk. Burada Ex-

ception yerine her istedi


gimizi yazamayz. Yazabileceklerimiz ancak Pythonda tanml hata
mesajlar olabilir. rne
gin NameError, TypeError, ZeroDivisionError, IOError, vb...
raise deyimini, bir hata mesajna ek olarak bir i
slem yapmak istedi
gimizde de kullanabiliriz.
rne
gin:
try:
blnen = int(input("blnecek say: "))
blen = int(input("blen say: "))
print(blnen/blen)
except ZeroDivisionError:
print("bir sayy 0a blemezsiniz")
raise

Burada, e
ger kullanc bir sayy 0a blmeye al
srsa, normal bir s
ekilde ZeroDivisionError
hatas verilecek ve programdan klacaktr. Ama bu hata mesajyla birlikte kullancya bir
sayy 0a blemezsiniz uyarsn da gsterme imkann elde edece
giz... Yani burada except
ZeroDivisionError blo
gunu herhangi bir hatay engellemek iin de
gil, hataya ilave bilgi eklemek iin kullanyoruz. Bunu yapmamz sa
glayan s
ey tabii ki bu kodlar iinde grnen raise
adl deyimdir...

8.8 Btn Hatalar Yakalamak


S
imdiye kadar yapt
gmz btn rneklerde except... blo
gunu bir hata mesaj adyla birlikte
kullandk. Yani rneklerimiz s
una benziyordu:
try:
....birtakm i
sler...
except ZeroDivisionError:
...hata mesaj...

Yukardaki kod yardmyla sadece ZeroDivisionError adl hatay yakalayabiliriz.


E
ger
yazd
gmz program ba
ska bir hata daha veriyorsa, o hata mesaj yukardaki bloklarn kapsam d
snda kalacaktr. Ama e
ger istersek yukardaki kodu s
u s
ekilde yazarak olas btn
hatalar yakalayabiliriz:
try:
....birtakm i
sler...
except:
...hata mesaj...

Grd
gnz gibi, burada herhangi bir hata ad belirtmedik. Bylece Python, yazd
gmz programda hangi hata olu
sursa olu
ssun hepsini yakalayabilecektir.
Bu yntem gznze ok pratik grnm
s olabilir, ama aslnda hi de yle saylmaz. Hatta
olduka kt bir yntem oldu
gunu syleyebiliriz bunun. nk bu tarz bir kod yazmnn baz
dezavantajlar vardr. rne
gin bu s
ekilde btn hata mesajlarn ayn kefeye koyarsak, programmzda ne tr bir hata olu
sursa olu
ssun, kullancya hep ayn mesaj gstermek zorunda
kalaca
gz. Bu da, herhangi bir hata durumunda kullancy ne yapmas gerekti
gi konusunda
do
gru dzgn bilgilendiremeyece
gimiz anlamna geliyor. Yani kullanc bir hataya sebep
oldu
gunda tersli
gin nereden kaynakland
gn tam olarak kestiremeyecektir.
Ayrca, e
ger kendimiz bir program geli
stirirken srekli olarak bu tarz bir yazm benimsersek,
kendi kodlarmzdaki hatalar da maskelemi
s oluruz. Dolaysyla, Python yukardaki geni
s apl

except... blo
gu nedeniyle programmzdaki btn hatalar gizleyece
gi iin, programmzdaki
potansiyel aksaklklar grme imkanmz olmaz. Dolaysyla bu tr bir yapdan olabildi
gince
kanmakta fayda var...

BLM

Genel Tekrar

Bu noktaya kadar Python ile ilgili epey s


ey
grendik. Buraya kadar
grendiklerimizi kullanarak
Python programlama dili ile nemli ve yararl i
sler yapabiliriz. Bu blmden sonra Pythonun
derinliklerine dalmaya ba
slayaca
gz. Ama dal
sa gemeden nce tehizatmz kontrol etmemiz, sonra da derin bir nefes almamz gerekti
gini d
snyorum. O yzden bir adm daha
ileriye gitmeden nce s
imdiye kadar
grendi
gimiz ksmlarn s
yle bir zerinden gememizin
faydal olaca
gn zannediyorum.
Yalnz bu genel tekrar ba
sl
g sizi yanltmasn. Bu blmde zaten bildi
gimiz konular tekrar
etmeyece
giz. Daha do
grusu, yine bildi
gimiz konulardan bahsedece
giz, ama buraya kadar
geldi
gimiz noktada, konuyu okur asndan bo
gucu ve skc hale getirmemek iin gz ard etti
gimiz, atlad
gmz bilgileri tart
saca
gz bu blmde. Dolaysyla bu genel tekrar blm,
okurlarn hem eski bilgilerini tazelemesini, hem de buraya kadar olan ksmda bahsetmeden
geti
gimiz baz nemli ayrntlar
grenmesini sa
glayacaktr. Bu blmn en nemli amac,
s
imdiye kadar
grenilen konular peki
stirmek ve
grenilen konulara ili
skin yeni bilgiler vermektir. Bu blmde, Temel Bilgiler kategorisinde bulunan, ama yukarda bahsetti
gimiz sebeplerden tr bahsetmeden veya derinlemesine incelemeden geti
gimiz konular
grenece
giz.

9.1 Pythonu Ba
slatma Seenekleri
E
ger bu noktaya kadar gelmi
sseniz, Pythonu ba
saryla kurmu
s ve al
strm
ssnz demektir... O yzden bu blmde Pythonun bilgisayarnza nasl kurulaca
gndan ve Pythonun
nasl al
strlaca
gndan bahsetmek yerine, bu konuyla ilgili baz ayrntlara de
ginmeye al
saca
gz. Bu blmn konusu, Pythonu ba
slatma seenekleri (startup options)... Yani bu
blmde, Pythonu al
strrken hangi seenekleri kullanabilece
gimizi ve bu seeneklerin ne
i
se yarad
gn
grenece
giz.
Ben bu blmde, sizin Pythonun etkile
simli kabu
guna ula
smak veya Python ile yazd
gnz
programlar al
strmak iin s
u komutu kulland
gnz varsayaca
gm:
python3

E
ger siz kendi sisteminizde Pythonu al
strmak iin ba
ska bir komut kullanyorsanz
(python3.0 gibi...), python3 grd
gnz yere, kendi kulland
gnz komutu yerle
stireceksiniz...
Ilk seene
gimizle ba
slayalm...
python3 -h
137

Pythonu -h seene
gi ile ba
slatt
gmzda kar
smza Pythonun yardm (help) ekran gelir. Buradan, Pythonu nasl al
straca
gnza, al
strrken hangi seenekleri kullanabilece
ginize ve
bu seeneklerin ne i
se yarad
gna dair ksa bilgilere eri
sebilirsiniz. I
ste biz de bu blmde, bu
yardm ekrannda grnen seeneklerin en nemli olanlarna ve s
u a
samada bizi ilgilendirenlerine de
ginece
giz...
Bu yardm ekranna s
u komut ile de eri
sebilirsiniz:
python --help

Burada - i
saretinin ift oldu
guna dikkat edin.
python3 -c
Bu seenek, Pythonu bir komutla al
strmamz sa
glar. Bu ne demek oluyor? Hemen s
yle bir
rnek verelim:
python3 -c "print(Merhaba Dnya)"

gnz gibi, Pythonun etkile


simli kabu
gunu hi amadan veya kodumuzu bir metin
Grd
dzenleyiciyle yazp kaydetmeye gerek kalmadan, kodlarmz do
grudan komut satr zerinde
al
strabiliyoruz. Burada nemli nokta, -c seene
ginden sonra gelecek kodlar trnak iine
almak... Ancak bunu yaparken, kodun kendisinin iinde yer alan br trnaklarla bu ilk trna
gn birbirine kar
smamasna dikkat ediyoruz. E
ger -c seene
ginden sonra ift trnak ile
ba
slam
ssak, Merhaba Dnya karakter dizisini tek trnak iine almaya zen gsteriyoruz...
E
ger -c seene
gine verece
gimiz komut birden fazla ise her bir komutu ; i
sareti ile ayryoruz:
python3 -c "print(Merhaba Dnya); print(Sana da merhaba canm!)"
Merhaba Dnya
Sana da merhaba canm!

python3 -v
-v seene
gin grevi, Pythonun al
smaya ba
slad
g anda ve kapanrken hangi i
slemleri yapt
gn ayrntl olarak gstermektir. Kullanm s
yledir:
python3 -v

Bu komutu verdi
gimizde Pythonun etkile
simli kabu
gu ba
slayacak, ama kabuk ba
slarken
Pythonun arkaplanda neler kar
strd
g da ekrana dklecektir. Ayn s
ekilde, etkile
simli kabu
gu
CTRL+Z tu
s bile
simiyle kapatt
gmzda da, arkaplanda olup biten her s
ey ekrana dklecektir.
python3 -V
Bu seenekteki Vnin byk harf oldu
guna dikkat ediyoruz. Bu seene
gin kullanm s
yledir:
python3 -V

Grevi ise, sistemimizde kurulu olan Python srmn gstermektir.


python3 -x
E
ger Pythonu bu seenekle ba
slatrsak, Python kodlarmzn ilk satrn grmezden gelecektir.
Mesela bir rnek verelim:
S
u kodlar ieren bir dosyamz olsun:

print("Merhaba")
print("Glegle")

E
ger bu dosyay s
u komutla al
strrsak:
python3 -x dosya.py

print(Merhaba) satr grmezden gelinecek, ekrana Glegle kts verilecektir.


Bylelikle Pythonu ba
slatma seenekleri iinde s
u an iin i
simize yarayabilecek seenekleri
grm
s olduk. Pythona ili
skin bilgilerimiz arttka teki seenekler de bizim iin bir anlam
ifade etmeye ba
slayacaktr...

9.2 print() Fonksiyonunun Gc


Pythonun 2.x srmlerinde print() bir deyimdi... Yani 3.x ncesi srmlerde ekrana bir
s
eyler yazdrmak istedi
gimizde s
u yapy kullanyorduk:
>>> print "bir
seyler..."

Ancak Pythonun 3.x srmyle birlikte, print bir fonksiyon halini ald. Dolaysyla artk
ekrana bir s
eyler yazdrmak iin s
yle yapyoruz:
>>> print("bir
seyler...")

print() fonksiyonundaki bu de
gi
siklik, Pythonun 2.xten 3.xe gei
sinde yaplan en nemli
yeniliklerden biridir. Ayrca print()in bir fonksiyon haline gelmesi ile birlikte bu fonksiyon
baz gl zellikler de kazand. I
ste biz de bu blmde yeni print() fonksiyonunun gcn
ortaya koymaya al
saca
gz.
Diyelim ki elimizde s
yle bir liste var:
>>> liste = ["elma", "armut", "kebap"]

E
ger Pythonun 2.x srmlerinden birini kullanyor olsaydk s
yle bir komut yazabilirdik:
>>> for i in liste:
...
print i

Bu komut bize s
yle bir kt verir:
elma
armut
kebap

Ayn i
slemi Python 3.x ile yapt
gmzda da tpatp ayn sonucu elde ederiz.
Python 2.xte, liste
gelerini byle alt alta de
gil de yan yana dizmek istersek s
yle bir yol
izliyorduk:
>>> for i in liste:
...
print i,
...
elma armut kebap

Burada inin yanna bir virgl i


sareti koydu
gumuza dikkat edin. Ayn s
eyi Python 3.x ile yapmaya al
st
gmzda ise beklentimizin kar
slanmayaca
gn gryoruz:

>>> for i in liste:


...
print(i,)
...
elma
armut
kebap

Grd
gnz gibi, inin yanna koydu
gumuz virgln herhangi bir etkisi olmad. Peki biz liste

gelerini Python 3.xi kullanarak nasl yan yana dizece


giz? I
ste burada print() fonksiyonunun
gc devreye girecek. Bakn bu i
slemi sadece print() fonksiyonunu kullanarak nasl da
halledebiliyoruz:
>>> print(*liste)
elma armut kebap

Burada Python 3.x ile birlikte kullanm alan geni


sletilen yldzl ifadeler (starred expressions) adl bir zellikten faydalandk. Yldzl ifadeyi print() fonksiyonu iinde bir listeye
uygulad
gmzda, sanki liste
geleri zerinde bir for dngs olu
sturulmu
s gibi bir sonu elde
edilecektir. Yldzl ifadelerin farkl bir kullanmna demetler konusunu i
slerken de de
ginmi
stik...
Peki ya bu liste
gelerini ekrana hem byle yan yana dizmek, hem de her
genin arasna bir
virgl koymak istersek ne yapaca
gz?
nce bu i
slemi Python 2.x ile nasl yapt
gmza bakalm:
>>> for i in liste:
...
print i + ", ",
elma,

armut,

kebap,

Bu kullanm en hafif tabiriyle irkindir. Ayrca aslnda istedi


gimiz s
eyi de tam olarak yerine
getirmez. nk biz liste
gelerinin arasna birer virgl koymak istiyoruz, ama en son
geden
sonra virgl olmasn istemiyoruz. Bu iste
gimizi Python 2.x ile gerekle
stirebilmek iin karakter
dizilerinin (henz
grenmedi
gimiz) join() adl metodundan yararlanmamz gerekir:
>>> print ", ".join(liste)
elma, armut, kebap

Python 3.xi kullanarak ayn s


eyi yapmak istedi
gimizde ise print() fonksiyonunun gcnden
yararlanmamz yeterli olacaktr:
>>> print(*liste, sep=", ")
elma, armut, kebap

E
ger kulland
gnz konsol/terminal i
slem sonunda yeni satra gemiyorsa bu komutu s
yle de
yazabilirsiniz:
>>> print(*liste, sep=", ", end="\n")

Buradaki sep ve end parametreleri print() fonksiyonunun kvrakl


gn artran etkenler...
sep parametresi print() fonksiyonuna yazlan
gelerin her birinin arasna istedi
gimiz bir
karakter dizisini yerle
stirme imkan sa
glyor bize. Basit bir rnek verelim:
>>> print("elma", "armut", "kebap", sep=", ")
elma, armut, kebap

Bu rnekte, print() fonksiyonu iinde belirtilen karakter dizilerinin her birinin arasna, sep
parametresi yardmyla bir virgl i
sareti koyuyoruz...
sep parametresi ile birlikte
grendi
gimiz end adl parametre ise, print() fonksiyonu iinde
belirtilen ifadenin ne s
ekilde bitece
gini gsteriyor. Biz yukardaki rnekte n i
saretini kullandk. Bylece print() fonksiyonu yardmyla ekrana bir s
eyler yazdrdktan sonra yeni satra
geebiliyoruz...
print() fonksiyonu sep ve end d
snda bir de file adl bir parametre alr. Bu parametre
yardmyla, ekrana yazdraca
gmz s
eyleri ekran yerine bilgisayarmzdaki bir dosyaya yazdrabiliriz:
>>> print("Merhaba Dostlar!", file=open("pydeneme.txt", "w"))

Bu zelli
gin ne kadar faydal olabilece
gini tahmin edebilirsiniz. Burada open() adl bir
fonksiyondan yararland
gmza dikkat edin. Bu fonksiyonu dosya i
slemleri konusunu i
slerken
daha detayl olarak inceleyece
giz. Ayn fonksiyona, hata yakalama konusunu i
slerken de
de
ginmi
stik... Bu arada, bilginiz olmas asndan, yukardaki open() fonksiyonu iinde kulland
gmz w parametresinin, bilgisayarmzda yeni bir dosya olu
sturmaya yarad
gn syleyelim... Hatrlarsanz, hata yakalama konusu iinde bu fonksiyona de
ginirken w yerine r
adl bir parametre kullanm
stk. O parametre dosyay okumak zere amamz sa
glyordu. w
parametresi ise dosyay yazmak zere amamz sa
glyor.
Gelin isterseniz bu file parametresini kullanarak az ok yararl bir uygulama yazalm:
ad = input("adnz: ")
soyad = input("soyadnz: ")
eposta = input("e.posta adresiniz: ")
print(ad, soyad, eposta, file=open("deneme.txt", "w"), sep="\n")
print("Girdi
giniz veriler dosyaya ba
saryla i
slendi!")

Burada kullancya adn, soyadn ve e.posta adresini soruyoruz. Ardndan kullancnn girdi
gi
bu verileri, deneme.txt adl bir dosyaya kaydediyoruz. sep parametresini nasl kulland
gmza dikkat edin. Kullancnn girdi
gi her bir verinin dosya iinde ayr bir satrda yer
almas iin, sep parametresine n de
gerini verdik...

9.3 Etkile
simli Kabugun
Hafzas
Pythondaki etkile
simli kabuk denen s
eyin ne oldu
gunu daha nce anlatm
stk. Etkile
simli
kabu
gun, Pythonun gcne g katan en nemli zelliklerden birisi oldu
gunu sylesek abartm
s olmayz. zellikle byle bir araca sahip olmayan diller zerinde al
sm
s arkada
slarm ne
demek istedi
gimi ok daha iyi anlayacaktr. Etkile
simli kabuk programclar arasnda o kadar
hayranlk uyandrm
str ki baz yazarlar srf etkile
simli kabu
gun bile Pythonu Javadan stn
klmaya yeterli oldu
gunu sylemekten ekinmemi
slerdir.
Bu blmde, etkile
simli kabu
gun ufak ama olduka pratik bir zelli
ginden sz edece
giz.
Diyelim ki etkile
simli kabukta baz aritmetik i
slemler yapyorsunuz... rne
gin s
yle bir i
slem
yaptnz:
>>> 54345345 * 45
2445540525

Daha sonra da bu sayy 25e blmeye karar verdiniz... Bu i


slemi yapmak iin de
gi
sik yollar kullanabilirsiniz, ama btn yollar iinde en kolay _ i
slecinden yararlanmaktr. Bu i
sle, yaplan

en son i
slemin de
gerini barndrr. Etkile
simli kabukta 54345345 * 45 i
slemini yaptktan ve
sonucu aldktan sonra s
u komutu verin:
>>> _
2445540525

Grd
gnz gibi b u komut size en son yapt
gnz i
slemin sonucu olan sayy veriyor. Dolaysyla
en son elde etti
giniz sayy mesela 25e blmek iin s
yle bir s
ey yapabilirsiniz:
>>> _ / 25
97821621.0

Burada _ i
sareti 2445540525 saysn hafzasnda tuttu
gu iin bu sayy pratik bir s
ekilde
ba
ska bir i
slem iinde kullanmamza imkan sa
glyor. stelik bu i
sleci sadece saylarla kullanmak zorunda da de
giliz. _ i
sleci her trl i
slemin sonucunu hafzasnda tutabilir. Mesela:
>>> "elma" + " armut"
elma armut
>>> _
elma armut

Hatta isterseniz bu i
sleci bir de
gi
skene dahi atayabilirsiniz:
>>> sondeger = _
elma

Yalnz bu zellik sadece etkile


simli kabuk iin geerlidir. Bunu yazd
gmz bir program iinde
kullanamayz... Bu i
slecin grevi sadece etkile
simli kabuk zerinde al
san programcnn i
sini
biraz kolayla
strmaktr.

9.4 abs(), round(), min() ve max() Fonksiyonlar


Python bize matematik ve aritmetik i
slemlerinde kullanabilece
gimiz abs(), round(), min() ve
max() adnda drt adet pratik fonksiyon sunar. Bu drt fonksiyonun yapt
g i
sler ilk bak
sta ok
gerekliymi
s gibi grnmese de aslnda baz durumlarda i
slerimizi bir hayli kolayla
strmamz
sa
glar. ncelikle abs() fonksiyonundan ba
slayalm...
abs()
abs, Ingilizce absolute kelimesinin ksaltmasdr. Bu kelime Trkede mutlak anlamna
gelir. Bunun abs() fonksiyonundaki kullanm ise mutlak de
ger anlamndadr. Dolaysyla
abs() fonksiyonu bir saynn mutlak de
gerini almamz sa
glar.
abs() fonksiyonunun kullanm s
yledir:
>>> a = -8
>>> abs(a)
8

round()

Ikinci fonksiyonumuz ise round().


Bu kelime Trkede yuvarlamak anlamna gelir.
Dolaysyla round() fonksiyonunu kullanarak saylarn de
gerini yuvarlayabiliyoruz. rne
gin:
>>> a = 59 / 23
>>> round(a)
3

Bylece normalde ksrl kacak bir blme i


slemini round() metodu yardmyla yuvarlam
s
oluyoruz...
Ba
ska bir rnek:
>>> round(150/4)
38

Bu fonksiyonu kullanrken, istersek noktadan sonra ka basamak istedi


gimizi de belirtebiliriz:
>>> print(round(59/23, 0))
3.0
>>> print(round(59/23, 1))
2.6
>>> print(round(59/23, 2))
2.57
>>> print(round(59/23, 3))
2.565
>>> print(round(59/23, 4))
2.5652

Burada daha dzgn bir kt alabilmek iin print() fonksiyonundan da yararland


gmza
dikkat edin. E
ger burada print() fonksiyonunu kullanmazsak blme i
slemlerinin sonucu insan
gzne yabanc grnecektir... Isterseniz burada print() fonksiyonu yerine str() fonksiyonundan da yararlanabilirsiniz dzgn kt elde edebilmek iin:
>>> str(round(59/23, 4))
2.5652

Tabii str() fonksiyonuyla yapt


gmz s
ey aslnda sayy karakter dizisine evirme i
slemi oldu
gu
iin, yukardaki ktnn bir karakter dizisi oldu
guna, dolaysyla bunu kullanarak herhangi bir
aritmetik i
slem yapamayaca
gmza dikkat ediyoruz...
min()
min kelimesi, tahmin edece
giniz gibi minimum kelimesinin ksaltmasdr. Bu fonksiyon bir
say dizisi iindeki en kk sayy verir:
>>> min(45, 90, 43, 23, 3353)
23

Bu fonksiyonu listelerle birlikte de kullanabiliriz:


>>> liste = [4234, 343543, 23323, 6161, 54564, 65675,
... 34243243, 4324, 4234]
>>> min(liste)
4234

max()
Evet, bu fonksiyon min() fonksiyonunun tam tersidir. Bir say dizisi iindeki en byk sayy
verir:
>>> max(45, 90, 43, 23, 3353)
3353

...veya...
>>> liste = [4234, 343543, 23323, 6161, 54564, 65675,
... 34243243, 4324, 4234]
>>> max(liste)
34243243

9.5 pow(), divmod() ve sum() Fonksiyonlar


Bu blmde, Pythonun i
slerimizi kolayla
strmamz iin bize sundu
gu adet fonksiyondan
sz edece
giz. Bu fonksiyonlar pow(), divmod() ve sum(). ncelikle pow() fonksiyonuyla
ba
slayalm:
pow()
Hatrlarsanz saylar konusunu i
slerken bir saynn kuvvetini almak iin s
yle bir yntem
izleyebilece
gimizi sylemi
stik:
x ** y

Burada x kuvvetini alaca


gmz sayy, y ise bu x saysnn kanc kuvvetini alaca
gmz
gsteriyor. rne
gin 2 saysnn 3. kuvvetini almak istersek s
unu yazyoruz:
>>> 2**3
8

Python bu yntemin d
snda, bir saynn kuvvetini almak iin bize pow() adl bir fonksiyon daha
sunuyor. Yukardaki i
slemi pow() fonksiyonunu kullanarak s
yle yazabiliriz:
>>> pow(2, 3)
8

Burada tahmin edece


giniz gibi parantez iindeki ilk parametre kuvvetini alaca
gmz sayy,
ikinci parametre ise bu saynn kanc kuvvetini alaca
gmz gsteriyor...
divmod()

S
yle bir blme i
slemi yapt
gmz d
snelim:
>>> 10 / 2
5.0

Grd
gnz gibi burada bir ondalk say elde ediyoruz. E
ger elde etti
gimiz saynn ondalk
de
gil de tamsay olmasn istersek // i
slecinden yararlanmamz gerekti
gini biliyoruz:
>>> 10 // 2
5

Bir de s
yle bir i
slem yapt
gmz d
snelim:
>>> 10 % 2
0

Burada da 10 saysnn 2ye blmnden kalan sayy buluyoruz. Demek ki 10 says 2ye
blnd
gnde kalan 0 oluyormu
s. Burada % i
slecinin ne i
se yarad
gn saylar konusunu
i
slerken
grenmi
stik...
I
ste divmod() fonksiyonu yukarda bahsetti
gimiz bu iki i
slemi birle
stiriyor. Hemen bir rnekle
bunu somutla
stralm:
>>> divmod(10, 2)
(5, 0)

Grd
gnz gibi divmod() fonksiyonu ayn anda noktasz blme i
slemi yapyor ve blme i
sleminden kalan sayy gsteriyor...
sum()
S
imdi grece
gimiz sum() adl fonksiyon olduka yararl bir aratr. Bu fonksiyon bir say dizisini
alp bu dizinin toplamn verir bize. rne
gin:
>>> liste = [34, 43, 32, 23, 23232, 32]
>>> sum(liste)
23396

Bu fonksiyonun yalnzca saylarla kullanlabilece


gini aklmzdan karmyoruz...
sum() fonksiyonu ayrca ikinci bir parametre daha alabilir:
>>> sum(liste, 2)
23398

sum() fonksiyonu, listenin elemanlarn topladktan sonra, elde edilen toplam de


gere ikinci
parametreyi de ekliyor...

9.6 Bool Degerleri


ve bool() Fonksiyonu
Daha nceki derslerimizde, zerinde fazla durmam
s olsak da aslnda Bool de
gerlerini kullanm
stk. True ve False olarak ifade edilen de
gerlere Bool de
gerleri ad verilir (George Boole

adl Ingiliz matematiki ve filozofun adndan). True de


geri saysal olarak 1 ile gsterilirken,
False de
geri 0 ile gsterilir. Trke olarak sylemek gerekirse, True de
gerinin kar
sl
g
Do
gru, False de
gerinin kar
sl
g ise Yanl
str... Biz bu de
gerleri mesela kmeler konusunu
i
slerken de grm
stk:
>>> a = set([1, 2, 3])
>>> b = set([1, 3, 4, 5])
>>> a.isdisjoint(b)
False

Burada a ve b ayrk kmeler olmadklar iin Yanl


s anlamna gelen False de
gerini alyoruz.
Bool de
gerleri temel olarak bir nesnenin do
gruluk de
gerini sorgulamak iin kullanlr. Yani bir
s
eyin do
gru olup olmad
gn anlamak iin kullanyoruz bu Bool de
gerlerini... rne
gin:
>>> a = 23
>>> if a == 23:
...
print("ann de
geri 23tr")

Burada aslnda bir do


gruluk de
geri sorgulamas yapyoruz (E
ger a 23e e
sitse...). Geri burada kar
sla
strma i
slemini yapan asl
ge == i
slecidir, ama aslnda bu yap iinde temel
olarak Bool kavramndan yararlanlyor. Bunu etkile
simli kabukta test edebiliriz:
>>> a = 23
>>> a == 23
True
>>> a == 4
False

Burada oldu
gu gibi Bool kavramndan kar
sla
strma i
slemlerinde yararlanmann yansra, bir
s
eyin herhangi bir de
gere sahip olup olmad
gn denetlemek iin de Bool de
gerlerinden faydalanabiliriz. rne
gin:
>>> a = 23
>>> if a:
...
print("Evet, ann bir de
geri var!..")
...
Evet, ann bir de
geri var!..

Bir de s
u rne
ge bakalm:
>>> a = ""
>>> if a:
...
print("Evet, ann bir de
geri var!..")
... else:
...
print("Hayr, ann herhangi bir de
geri yok!")
...
Hayr, ann herhangi bir de
geri yok!"

Burada kulland
gmz if a: ifadesi, E
ger a do
gru ise... anlamna geliyor. Yani burada E
ger
ann Bool de
geri True ise... demi
s oluyoruz. Bu durumu daha ak bir s
ekilde gstermek iin

Pythondaki bool() adl fonksiyondan yararlanabiliriz. Bu fonksiyon, bize herhangi bir s


eyin
de
gerinin True mi yoksa False mi oldu
gunu syleyecektir:
>>> a = ""
>>> bool(a)
False

Bir de s
una bakalm:
>>> a = "karakter dizisi"
>>> bool(a)
True

Dolaysyla yukardaki if deyimini s


yle de yazabiliriz:
>>> a = ""
>>> if bool(a):
...
print("Evet, ann bir de
geri var!..")
... else:
...
print("Hayr, ann herhangi bir de
geri yok!")

a = ifadesinin False de
gerini vermesi bize Pythondaki Bool de
gerleri hakknda nemli
bir bilgi veriyor. Pythonda baz s
eyler her zaman False de
geri verir. rne
gin btn bo
s
veritipleri False de
gerine sahiptir. rne
gin:
>>> liste = []
>>> bool(liste)
False
>>> sozluk = {}
>>> bool(sozluk)
False
>>> demet = ()
>>> bool(demet)
False
>>> kume = set()
>>> bool(kume)
False

Yukardaki veritiplerinin True de


geri verebilmesi iin en az bir
geye sahip olmalar gerekir...
Daha nce de dedi
gimiz gibi, saysal olarak Truenin de
geri 1; Falsenin de
geri ise 0dr. Bu
durumu s
u kodlarla daha net bir s
ekilde grebiliriz:

>>> True + 1
2

Burada Truenin de
geri 1 oldu
gu iin, True + 1 ifadesi 2 sonucunu veriyor. Bir de s
una
bakalm:
>>> False + 1
1

Burada ise Falsenin de


geri 0 oldu
gu iin, False + 1 i
sleminin sonucu 1 oluyor...
Bu bilgiye gre, de
geri 0 olan bir de
gi
sken False; de
geri 1 olan bir de
gi
sken ise True olacaktr:
>>> a = 0
>>> bool(a)
False
>>> b = 1
>>> bool(b)
True

Ancak bu durumun sadece de


gi
skenler iin geerli oldu
gunu unutmuyoruz.
demet, vb. veri tiplerinde durum biraz farkldr:

Liste, szlk,

>>> liste = [0]


>>> bool(liste)
True

Bunun d
snda zel olarak None de
geri de her zaman Falsedir:
>>> a = None
>>> bool(a)
False

Bo
s veritiplerinin False, dolu veritiplerinin True de
geri vermesinden yola karak s
yle bir uygulama yazabiliriz:
liste = []
print("""
Ltfen bir say girin. Her veri giri
sinden sonra Enter
tu
suna basn.
I
slemi bitirip programdan
kmak iin ise yine Enter tu
suna basn.""")
while True:
veri = input("Say: ")
if veri:
try:
say = int(veri)
liste.append(say)

except ValueError:
continue
else:
toplam = sum(liste)
print("girdi
giniz saylarn toplam: ", toplam)
print("tekrar gr
smek zere!")
break

S
imdi bu kodlar satr satr inceleyelim...
ncelikle liste = [] satr yardmyla bo
s bir liste olu
sturuyoruz. Kullancdan alaca
gmz verileri bu liste iinde toplayaca
gz.
Ardndan bir print() fonksiyonu iinde programmzn ne i
s yapaca
gn, kullancdan ne bekledi
gimizi anlatan bir karakter dizisi olu
sturuyoruz. Buna gre, kullanc ekrana bir say girecek
ve her veri giri
sinden sonra Enter tu
suna basacak. Ayrca i
slemin sonucunu alp programdan
kmak iin de yine Enter tu
suna basmas gerekecek...
Daha sonra bir while dngs olu
sturuyoruz. Burada kulland
gmz while True: ifadesine
dikkat edin. Bu ifade, bir kod dizisini srekli bir dngye sokmak iin kullanabilece
gimiz standart bir yoldur. Trke olarak sylemek gerekirse, while True: ifadesi Do
gru oldu
gu mddete... anlamna gelir. Bu sayede programmza s
u komutu vermi
s oluyoruz:
Do
gru oldu
gu mddete a
sa
gdaki komutlar al
strmaya devam et...
Peki ne do
gru oldu
gu mddete? Neyin do
gru oldu
gunu aka belirtmedi
gimiz iin Python
burada her s
eyi do
gru kabul ediyor... Yani bir nevi, aksi belirtilmedi
gi srece a
sa
gdaki
komutlar al
strmaya devam et! emrini yerine getiriyor.
Sonraki satrda veri = input(Say: ) kodu ile kullancdan veri alma i
slemini ba
slatyoruz. Burada henz kullancdan ald
gmz veriyi int() fonksiyonu yardmyla tamsayya evirmedi
gimize dikkat edin. E
ger daha bu a
samada dn
strme i
slemini yaparsak, daha sonra
kullancnn programdan kmak iin kullanaca
g Enter tu
sunu yakalayamayz. nk byle bir
durumda kullanc Enter tu
suna basarsa programmz hata verecektir.
Bundan sonraki admda if veri: satrn yazyoruz. Bunun, e
ger veri adl karakter dizisi True
de
gerine sahipse... anlamna geldi
gini biliyoruz. Zira bildi
giniz gibi, e
ger veri adl karakter
dizisi hibir s
ey iermezse, yani bo
ssa, sahip oldu
gu Bool de
geri False olacaktr. Yani e
ger
kullancmz hibir say girmeden Enter tu
suna basarsa, veri adl karakter dizisinin ieri
gi bo
s
olaca
g iin bu karakter dizisi False de
gerine sahip olacaktr. Dolaysyla e
ger kullancmz
bir say girip Enter tu
suna basarsa, veri adl karakter dizisinin Bool de
geri True olaca
g iin
if veri: blo
gu iindeki kodlar i
sletilecektir. Yok e
ger kullancmz herhangi bir say girmeden
Enter tu
suna basarsa a
sa
gdaki else: blo
gu iindeki kodlar al
strlacaktr...
if veri: kodunu yazdktan sonra bir try... except... blo
gu olu
sturuyoruz. Sayya
dn
strme i
slemini bu blok iinde gerekle
stirece
giz. say = int(veri) satr yardmyla,
kullancdan ald
gmz karakter dizisini sayya eviriyoruz.
Hemen ardndan gelen
liste.append(say) satr ise, kullancdan alp tamsayya evirdi
gimiz veriyi, en ba
sta olu
sturdu
gumuz listeye eklememizi sa
glyor.
Sonraki satrda ise except... blo
gumuzu yazyoruz. Bir nceki try... blo
gu iine yazd
gmz
int() fonksiyonunun, kullancnn say yerine harf girmesi durumunda ValueError hatas
verece
gini bildi
gimiz iin bu blok iinde bu hata tipini yakalyoruz. E
ger kullanc say yerine
harf girer ve ValueError hatas alnmasna yol aarsa, continue ifadesi yardmyla dngnn
en ba
sna geri gidiyoruz.
Sra geldi else: blo
gumuzu yazmaya... Kodlarmzn ba
snda if veri: s
eklinde bir s
ey
yazm
stk. Bu kod, kullancnn ekrana bir veri girip girmedi
gini denetliyordu. I
ste kullancnn

herhangi bir veri girmedi


gi durumlar iin bu else: blo
gunu yazyoruz. E
ger kullanc hibir veri
girmeden Enter tu
suna basarsa bu blok iindeki kodlar i
sletilecektir.
else: blo
gu iinde yapt
gmz ilk i
s, listeye ekledi
gimiz saylarn hepsini toplamak olacak...
Bunu daha nce
grendi
gimiz sum() fonksiyonu yardmyla yapyoruz. Ardndan da print()
fonksiyonunu kullanarak bu toplam de
geri kullancya gsteriyoruz ve kendisine veda ettikten
sonra break ifadesi yardmyla da programdan kyoruz.

9.7 Bool Is
leleri (Boolean Operators)
Bu blmde Pythondaki Bool i
sleleri konusundan sz edece
giz. Burada de
ginece
gimiz
i
sleler and, or ve not adl Bool i
sleleridir... Bu i
slelere ayrca mantk i
sleleri (logical
operators) ad da verilir.
and
Bu kelime Trkede ve anlamna gelir. S
yle bir rnek verelim:
>>> a = 4
>>> b = 12
>>> a == 4 and b == 12
True

Yukardaki rnekte and i


sleci, a ve bnin her ikisinin de de
geri True olursa, True sonucunu
verecektir. E
ger kar
sla
strma i
slemlerinden herhangi birisi False ise, sonu da False olacaktr:
>>> a == 3 and b == 12
False

Lisede Mantk dersleri alm


s olanlar bu i
sleci gayet iyi tanrlar. E
ger iki nerme birbirine ve ile
ba
glanm
ssa, do
gru sonu elde edebilmemiz iin bu iki nermenin her ikisinin de do
gru olmas
gerekir.
and i
slelerini Pythonda mesela parola ve kullanc ad denetlemek iin kullanabiliriz. Bildi
giniz
gibi, bir sisteme kullanc ad ve parola ile giri
s yapabilmek iin hem kullanc adnn hem de
parolann do
gru olmas gerekir. rnek olarak s
yle bir uygulama yazalm:
kullanc_ad = "istihza"
parola = "parola"
print("""Sitemize ho
sgeldiniz! Hizmetlerimizden yararlanmak iin
ltfen kullanc adnz ve parolanz giriniz.""")
while True:
kull = input("kullanc ad: ")
par = input("parola: ")
if kull == kullanc_ad and par == parola:
print("Sisteme ho
sgeldiniz!")
break
else:
print("Kullanc adnz veya parolanz yanl
s! Tekrar deneyin.")
continue

Burada kullancnn sisteme girebilmesi iin hem parolann hem de kullanc adnn nceden
belirledi
gimiz kullanc ad ve parolayla e
sle
smesi lazm. Bunlardan herhangi biri e
sle
smezse
kullanc sisteme alnmayacaktr.
or
Bu kelime veya anlamna gelir. and i
slecini anlatrken, bir sonucun True olabilmesi iin
her iki ko
sulun da True olmas gerekti
gini sylemi
stik. or i
slecinde ise, ko
sullardan herhangi
birinin True olmas, sonucun True olmas iin yeterli olacaktr. Mesela yukardaki rne
gi
or i
sleci ile yazarsak, kullanc ad veya paroladan herhangi birinin do
gru olmas, kullancnn
sisteme girmesi iin yeterli olacaktr:
kullanc_ad = "istihza"
parola = "parola"
print("""Sitemize ho
sgeldiniz! Hizmetlerimizden yararlanmak iin
ltfen kullanc adnz ve parolanz giriniz.""")
while True:
kull = input("kullanc ad: ")
par = input("parola: ")
if kull == kullanc_ad or par == parola:
print("Sisteme ho
sgeldiniz!")
break
else:
print("Kullanc adnz ve parolanz yanl
s! Ltfen tekrar deneyin.")
continue

Dedi
gimiz gibi, or i
slecinin True sonucu verebilmesi iin nermelerden herhangi birinin
True olmas yeterli olacaktr. E
ger nermelerden her ikisi de yanl
s ise sonucumuz False
olur:
>>> a = 12
>>> b = 2
>>> a == 12 or b == 4
True
>>> a == 5 or b == 43
False

not
Bu blmde i
sleyece
gimiz son i
slecimiz not adl Bool i
slecidir. Bu kelime de
gil anlamna gelir
ve cmleye olumsuzluk anlam katar. rne
gin:
try:
soru = int(input("bir ift say giriniz: "))
if not soru % 2 == 0:
print("ift say girmediniz!")
else:
print("ift say girdiniz!")

except ValueError:
print("Say... Sadece say...")

Burada if not soru % 2 == 0: ifadesiyle s


yle demi
s oluyoruz:
E
ger soru de
gi
skeninin de
gerini 2ye bld
gmzde kalan 0 de
gil ise...
Benzer bir s
eyi etkile
simli kabuk zerinde test edelim:
>>> a = 13
>>> not a % 2 == 0
True

Burada, a de
gi
skeninin de
geri 2ye blnd
gnde kalan 0 de
gildir gibi bir nerme veriyoruz.
Python da cevap olarak bize True (Do
gru) diyor... nk gerekten de a de
gi
skeninin de
geri
olan 13 saysn 2ye bld
gmzde kalan say 0 de
gildir... Bir de s
una bakalm:
>>> a = 34
>>> not a % 2 == 0
False

Burada da, a de
gi
skeninin de
geri olan 34 says 2ye blnd
gnde kalan say 0 oldu
gu iin
Python, a 2ye blnd
gnde kalan say 0 de
gildir nermemize False (Yanl
s) cevabn
veriyor...

9.8 all() ve any() Fonksiyonlar


Bir nceki blmde and ve or i
slelerini
grenmi
stik. Python bize bu and ve or i
slelerinin
kullanm iin baz kolaylklar sa
glar. I
ste bu blmde Pythonun bu konuda bize sundu
gu
kolaylklarn ne oldu
gunu grece
giz.
all()
Bu fonksiyon bir dizi iindeki btn de
gerlerin Bool de
gerlerine gre do
gruluklarn ayn anda
denetlememizi sa
glar. E
ger o dizi iindeki btn de
gerler True ise bu fonksiyon True sonucunu verecektir. Hatrlarsanz bir nceki blmde kullanc ad ve parola soran bir uygulama
yazm
stk. O uygulamay all() fonksiyonunu kullanarak s
yle de yazabiliriz:
kullanc_ad = "istihza"
parola = "parola"
print("""Sitemize ho
sgeldiniz! Hizmetlerimizden yararlanmak iin
ltfen kullanc adnz ve parolanz giriniz.""")
while True:
kull = input("kullanc ad: ")
par = input("parola: ")
if all([kull == kullanc_ad, par == parola]):
print("Sisteme ho
sgeldiniz!")
break
else:

print("Kullanc adnz veya parolanz yanl


s!")
print("Tekrar deneyin.")
continue

Burada all() fonksiyonu iinde bir liste kulland


gmza dikkat edin. nk all() fonksiyonu
sadece tek bir parametre alr. Bu fonksiyona birden fazla parametre atayabilmek iin parametreleri bir liste veya demet iinde toplamanz gerekir...
any()
any() fonksiyonu ise bir dizi iindeki herhangi bir
genin do
gruluk de
geri True ise sonu
olarak True verecektir. Yine yukardaki rne
gi or ile yazmak yerine, istersek any() fonksiyonundan yararlanabiliriz:
kullanc_ad = "istihza"
parola = "parola"
print("""Sitemize ho
sgeldiniz! Hizmetlerimizden yararlanmak iin
ltfen kullanc adnz ve parolanz giriniz.""")
while True:
kull = input("kullanc ad: ")
par = input("parola: ")
if any([kull == kullanc_ad, par == parola]):
print("Sisteme ho
sgeldiniz!")
break
else:
print("Kullanc adnz veya parolanz yanl
s! Ltfen tekrar deneyin.")
continue

9.9 Liste reteleri (List Comprehensions)


Hatrlarsanz, szlkler konusunu i
slerken s
yle bir kod kullanm
stk:
>>> [i for i in dir(dict) if "_" not in i]

Bu kod, birka satrda yapabilece


gimiz i
slemleri tek satra indirmemizi sa
glyordu. Ayrca bu
yapnn normal bir for dngsne gre daha performansl ve hzl oldu
gunu da sylemek
gerek... Bu tr yaplara Pythonda Liste reteleri (List Comprehensions) ad verilir. Liste
reteleri, Pythonda bir de
gerler dizisinden liste olu
sturmann etkili bir yntemidir.
Diyelim ki elimizde elma adl bir karakter dizisi var. Yine diyelim ki biz bu karakter dizisinin
btn
gelerini bir liste haline getirmek istiyoruz. Yani elde etmek istedi
gimiz s
ey s
u:
[e, l, m, a]

Liste retelerini kullanmadan bu grevi s


yle halledebiliriz:
>>> liste = []
>>> a = "elma"
>>> for i in a:
...
liste.append(i)
>>> print(liste)

[e, l, m, a]

Grd
gnz gibi ncelikle bo
s bir liste olu
sturuyoruz. Ardndan da a adl de
gi
sken zerinde
bir for dngs kurarak bunun btn
gelerini append() metodu yardmyla listeye ekliyoruz. Ancak ayn i
slemi yapmann ok daha kolay ve verimli bir yolu vardr. Liste retelerini
kullanarak bu i
slemi tek satrda halledebiliriz:
>>> [i for i in a]
[e, l, m, a]

Burada liste retelerinin szdizimi ile for dnglerinin szdizimi arasndaki benzerli
ge dikkat
edin. Gerekten de liste reteleri grnm olarak for dnglerinin tek satra indirilmi
s hali
gibi grnr. S
u for dngsnn s
yle evrildi
gini d
snn:
for dngmz...
>>> for i in range(10):
...
print(i)

liste retecinin tasla


g:
>>> print(i) for i in range(10)

liste retecinin kendisi:


>>> [i for i in range(10)]

Elbette liste retelerinin yapabildi


gi tek s
ey bu olsayd dnya daha gzel bir yer olmazd...
nk ayn s
eyi sadece list() fonksiyonunu kullanarak da yapabiliriz!
>>> list(a)
[e, l, m, a]

...veya...
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Liste retelerinin gc daha karma


sk i
slemlerde ortaya kar. Mesela bir
ge dizisini belli bir
lte gre szmek istedi
gimizde liste retelerinden yararlanabiliriz. rne
gin bir isim dizisi
iindeki A harfi ile ba
slayan isimleri szelim:
>>> isimler = ["Mehmet", "Ay
se", "Sleyman", "Ali", "Kenan",
... "Kerem", "Aycan", "Ayhan", "Metin", "Ayla"]
>>> [i for i in isimler if i[0] == "A"]
[Ay
se, Ali, Aycan, Ayhan, Ayla]

E
ger bunu bir for dngs ile halletmek isteseydik s
yle yazacaktk bu kodlar:
>>> for i in isimler:
...
if i[0] == "A":
...
print(i)
...
Ay
se

Ali
Aycan
Ayhan
Ayla

Yalnz burada elde etti


gimiz s
eyin bir liste olmad
gna dikkat edin. E
ger szlen
geleri bir liste
haline getirmek istersek a
sa
gdaki yazm tarzn benimsememiz gerekir:
>>> liste = []
>>> for i in isimler:
...
if i[0] == "A":
...
liste.append(liste)
>>> print(liste)
[Ay
se, Ali, Aycan, Ayhan, Ayla]

Liste retelerini, bir nceki blmde


grendi
gimiz all() ve any() fonksiyonlaryla birlikte de
kullanabiliriz. Mesela elimizde s
yle bir liste olsun:
>>> a = [10, 15, 6, 3, 32, 45, 25]

Diyelim ki bu listedeki saylarn hepsinin 20den byk olup olmad


gn denetlememiz
gerekiyor. O zaman s
yle bir kod yazabiliriz:
>>> all([i > 20 for i in a])
False

Yapt
gmz i
slemden False sonucunu aldk. Demek ki listedeki btn saylar 20den byk
de
gilmi
s...
Pythondaki liste reteleri pek ok konuda i
slerimizi kolayla
strmamza yardmc olur. Mesela
bir dizi iindeki btn saylar hzl bir s
ekilde belli bir i
sleme tabi tutmak istersek liste retelerinden yararlanabiliriz:
>>> liste = [1, 2, 3, 4, 5, 6]
>>> [pow(i, 3) for i in liste]
[1, 8, 27, 64, 125, 216]

Bu kodlar, liste iindeki btn saylarn tek tek 3. kuvvetlerini hesaplamamz sa


glad.

9.10 Pythonda Kodlara Yorum Eklemek


Programclkta en zor s
ey ba
skasnn yazd
g kodlar okuyup anlamaktr. Hatta yazlm
s bir
program dzeltmeye al
smak, bazen o program sfrdan yazmaktan daha zor olabilir. Bunun
nedeni, program iindeki kodlarn ne i
se yarad
gn anlamann zorlu
gudur. Program yazan ki
si
kendi d
sn
sne gre bir yol izlemi
s ve program geli
stirirken kar
sla
st
g sorunlar zmek
iin kimi yerlerde enteresan zmler retmi
s olabilir. Ancak kodlara d
sardan bakan birisi iin
o programn mantk dzenini ve iindeki kodlarn tam olarak ne yapt
gn anlamak bir hayli
zor olacaktr. Byle durumlarda, kodlar okuyan programcnn en byk yardmcs, program
geli
stiren ki
sinin kodlar arasna ekledi
gi notlar olacaktr. Tabii program geli
stiren ki
si kodlara
yorum ekleme zahmetinde bulunmu
ssa...

Pythonda yazd
gmz kodlarn ba
skalarnn da anlayabilmesini sa
glamak iin, programmzn
yorumlarla desteklenmesi tavsiye edilir. Elbette programnz yorumlarla desteklemeseniz de
programnz sorunsuz bir s
ekilde al
sacaktr. Ama program yorumlarla desteklemek en azndan nezaket gere
gidir.
Ayrca i
sin ba
ska bir boyutu daha var. Sizin yazd
gnz kodlar nasl ba
skalar okurken zorlanyorsa, kendi yazd
gnz kodlar okurken siz bile zorlanabilirsiniz... zellikle uzun sredir
ilgilenmedi
giniz eski programlarnz gzden geirirken byle bir sorunla kar
sla
sabilirsiniz. Programn iindeki bir kod paras, programn ilk yazl
snn zerinden 5-6 ay getikten sonra size
artk hibir s
ey ifade etmiyor olabilir... Kodlara bakp, Acaba burada ne yapmaya al
sm
sm?
diye d
snd
gnz zamanlar da olacaktr... I
ste bu tr skntlar ortadan kaldrmak veya en
aza indirmek iin kodlarmzn arasna aklayc notlar ekleyece
giz.
Pythonda yorumlar # i
sareti ile gsterilir. Yorumlarla desteklenmi
s rnek bir kod paras
s
yle olabilir:
#Bo
s bir liste olu
sturuyoruz. Bu liste
#kullancnn girdi
gi verileri tutacak
liste = []
#
Simdi kullancya adn soruyoruz...
ad = input("Ltfen adnz giriniz: ")
#Kullancdan ald
gmz veriyi listeye ekliyoruz.
liste.append(ad)

Burada dikkat edece


gimiz nokta her yorum satrnn ba
sna # i
saretini koymay unutmamaktr.
Yazd
gmz yorumlar Pythona hi bir s
ey ifade etmez. Python bu yorumlar tamamen grmezden gelecektir. Bu yorumlar bilgisayardan ziyade programc iin bir anlam ta
sr.
Elbette yazd
gnz yorumlarn ne kadar faydal olaca
g, yazd
gnz yorumlarn kalitesine
ba
gldr... Dedi
gimiz gibi, yerli yerinde kullanlm
s yorumlar bir programn okunakll
gn artrr,
ama her taraf yorumlarla kapl bir program okumak da bazen hi yorum girilmemi
s bir program okumaktan daha zor olabilir!...
Yukarda oldu
gu gibi yorumlarmz ilgili oldu
gu koddan nce yazmak yerine, yorumlarmz
kodlarmzn farkl yerlerine de ekleyebiliriz:
liste = [] #bo
s bir liste olu
sturuyoruz...

Pythonda yorum eklerken nemli olan s


ey, ka
s yapmaya al
srken gz karmamaktr. Yani
yorumlarmz, bir kodun okunakll
gn artrmaya al
srken daha da bozmayacak s
ekilde yerle
stirmeye dikkat etmeliyiz...
Pythonda yorumlar asl amalarnn d
snda da baz ba
ska amalara hizmet edebilir.
rne
gin, yazd
gmz programa bir zellik eklemeyi d
snyoruz, ama henz bu zelli
gi yeni
srme eklemek istemiyoruz. O zaman s
yle bir s
ey yapabiliriz:
#Bo
s bir liste olu
sturuyoruz. Bu liste
#kullancnn girdi
gi verileri tutacak
liste = []
#
Simdi kullancya adn soruyoruz...
ad = input("Ltfen adnz giriniz: ")
#Kullancdan ald
gmz veriyi listeye ekliyoruz.
liste.append(ad)

#Kullanc "p" harfine basarsa liste ieri


gini ekrana dkelim.
#if ad == "p":
#
print(liste)

Burada, programa henz eklemek istemedi


gimiz bir zelli
gi, yorum iine alarak s
imdilik iptal ediyoruz (Ingilizcede bu yorum iine alma i
slemine comment out deniyor...). Python
yorum iinde bir kod bile yer alsa o kodlar al
strmayacaktr. nk Python # i
sareti ile
ba
slayan satrlarn ieri
gini grmez (#!/usr/bin/env python satr hari).
Peki eklemek istemedi
gimiz zelli
gi yorum iine almaktansa do
grudan silsek olmaz m? Elbette olur. Ama programn daha sonraki bir srmne ilave edece
gimiz bir zelli
gi yorum
iine almak yerine silecek olursak, vakti geldi
ginde o zelli
gi nasl yapt
gmz hatrlamakta
zorlanabiliriz!... Hatta bir sre sonra programmza hangi zelli
gi ekleyece
gimizi dahi unutmu
s
olabiliriz... Hayr, ben hafzama gveniyorum! diyorsanz karar sizin!...
Yorum iine alarak iptal etti
giniz bu kodlar programa ekleme vakti geldi
ginde yapaca
gnz tek
s
ey, kodlarn ba
sndaki # i
saretlerini kaldrmak olacaktr. Hatta baz metin dzenleyiciler bu
i
slemi tek bir tu
sa basarak da gerekle
stirme yetene
gine sahiptir. rne
gin IDLE ile al
syorsanz, yorum iine almak istedi
giniz kodlar fare ile setikten sonra ALT+3 tu
slarna basarak ilgili kodlar yorum iine alabilirsiniz. Bu kodlar yorumdan kurtarmak iin ise ilgili alan setikten
sonra ALT+4 tu
slarna basmanz yeterli olacaktr (yorumdan kurtarma i
slemine Ingilizcede
uncomment diyorlar).
Btn bunlarn d
snda, isterseniz yorum i
saretini kodlarnz sslemek iin dahi kullanabilirsiniz:
#######################################################
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
#
FALANCA v.1
#
#
Yazan: Keramet Su
#
#
Lisans: GPL v2
#
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
#######################################################
#Bo
s bir liste olu
sturuyoruz. Bu liste
#kullancnn girdi
gi verileri tutacak
liste = []
#
Simdi kullancya adn soruyoruz...
ad = input("Ltfen adnz giriniz: ")
#Kullancdan ald
gmz veriyi listeye ekliyoruz.
liste.append(ad)

Yani ksaca, Pythonun grmesini, al


strmasn istemedi
gimiz her s
eyi yorum iine alabiliriz...
Unutmamamz gereken tek s
ey, yorumlarn yazd
gmz programlarn nemli bir paras oldu
gu
ve bunlar mantkl-makul bir s
ekilde kullanmamz gerekti
gidir...

9.11 Karakter Dizilerini Biimlendirme


Pythondaki zel bir fonksiyon/metot yardmyla karakter dizilerine mdahale edebilir, bunlar
istedi
gimiz s
ekilde biimlendirebiliriz.
ncelikle elimizdekilerle neler yapabildi
gimize bakalm. S
imdiye kadar
grendiklerimizi kullanarak s
yle bir kod yazabiliyoruz:

>>> lider = input("


Sampiyonun ismini giriniz: ")
>>> print("Bu senenin
sampiyonu", lider, "Tebrikler.")

Burada kullancmz lider de


gi
skeni iin ne yazarsa, print() fonksiyonu iinde ilgili yere o
kelime yerle
stirilecektir.
Grd
gnz gibi, yukardaki yapy kullanarak iste
gimizi yerine getirebiliyoruz. Ama Pythonda
bu tr i
slemleri ve daha fazlasn ok daha esnek bir biimde yerine getirmenin yollar vardr.
ncelikle yukarda yapt
gmz rne
ge bakalm. Dedi
gim gibi, yukardaki kodlar temel olarak
istedi
gimiz s
eyi yerine getiriyor. Ama tam olarak de
gil... Diyelim ki kullanc burada
Sampiyonun ismini giriniz: cmlesine kar
slk olarak Saryer yazd... O zaman ktmz s
yle
grnecektir:
Bu senenin
sampiyonu Saryer Tebrikler.

Burada aslnda kt dzgn de


gil. Trkenin kurallarna gre bu ktnn s
yle olmas gerekiyordu:
Bu senenin
sampiyonu Saryer. Tebrikler.

Yukardaki kodlar kullanarak Saryer kelimesine yap


sk s
ekilde bir nokta i
sareti koyabilmek
iin deveye hendek atlatmanz gerekir...
>>> lider = input("
Sampiyonun ismini giriniz: ")
>>> print("Bu senenin
sampiyonu", lider, "\b.",

"Tebrikler.")

Buradaki \b i
sareti henz
grenmedi
gimiz bir ka
s dizisidir (escape sequence). Bu konuyu
birka blm sonra grece
giz.
Peki ya kullancnn girdi
gi kelimeyi trnak iine almak isterseniz ne yapacaksnz? I
ste bunu
yapmanz yukardaki yntemle imkanszdr.
Bu tr i
slemleri yapabilmek iin karakter dizilerinin format() adl metodunu devreye sokaca
gz. Yukardaki uygulamay temel alarak basit bir rnek verelim:
>>> lider = input("
Sampiyonun ismini giriniz: ")
>>> print("Bu senenin
sampiyonu {0}. Tebrikler.".format(lider))

Bu yap gznze biraz kar


sk m grnd? Hi endi
selenmeyin aslnda ok basittir kullanm.
Isterseniz daha belirgin bir rnek verelim:
>>> "{0}".format("istihza")
istihza

Grd
gnz gibi, format() metodunun, daha nce
grendi
gimiz herhangi bir metottan
fark yok... rne
gin listeleri anlatrken liste metotlarndan da bahsetmi
stik. Liste metotlar liste.metot() s
eklinde kullanlyordu. format() metodu da byledir. Bu da karakter_dizisi.format() s
eklinde kullanlr.
Burada {0} s
eklinde gsterdi
gimiz ifade, format() metodunun parantezi iinde yer alan
istihza adl karakter dizisinin yerini tutuyor. Parantez iine ne yazarsanz, {0} ifadesinin
yerinde o grnecektir:

>>> lider = input("


Sampiyonun ismini giriniz: ")
>>> print("{0}".format(lider))

format() metodu iindeki ifadenin aslnda bir demet oldu


gunu sylersek sanrm {0}
sznn anlam biraz daha netle
secektir. Buradaki 0 says, parantez iinde yazd
gmz
demetin
gelerinin srasn gsteriyor. S
yle bir rnek verelim:
>>> print("Yllardan {0}, aylardan {1}".format(1980, "Mays"))
Yllardan 1980, aylardan Mays

Grd
gnz gibi, al
sk oldu
gumuz s
ekilde saymaya sfrdan ba
slyoruz... (1980, Mays)
demetinin 0. ve 1.
gelerini karakter dizisi iine tek tek yerle
stiriyoruz. Burada nemli nokta
s
u: Karakter dizisi iinde belirledi
gimiz biimlendirme i
saretlerinin says kadar
geyi parantez
iindeki demete yazyoruz.
Bu arada, biimlendirme i
saretlerinin say srasna gre yazlmas s
art de
gil. Yani s
yle bir s
ey
de yapabiliriz:
>>> print("Yllardan {1}, aylardan {0}".format(1980, "Mays"))

Tabii bu s
ekilde elde etti
gimiz ktdaki
gelerin yeri de farkl olacaktr...
Yllardan Mays, aylardan 1980

En ba
staki rne
gimize geri dnelim:
>>> lider = input("
Sampiyonun ismini giriniz: ")
>>>print("Bu senenin
sampiyonu", lider, "Tebrikler.")

Burada lider de
gi
skenini karakter dizisi iinde mesela trnak iine alamyoruz... Ama artk
format() adl metodu bildi
gimize gre bu i
slemi yapmak bizim iin ocuk oyunca
g:
>>> lider = input("
Sampiyonun ismini giriniz: ")
>>> print("Bu senenin
sampiyonu {0}. Tebrikler.".format(lider))

Grd
gnz gibi, karakter biimlendirme i
saretleri bize epey esneklik kazandryor.
Bu metoda al
smak iin ok basit bir rnek daha verelim:
>>> print("{0}; {1} ve {2}i

seviyor!".format("Ali", "Ay
se", "Zeynep"))

Ali; Ay
se ve Zeynepi seviyor!

Grd
gnz gibi, format() metodu istedi
gimiz sayda
ge alabiliyor.
Biimleyici olarak sadece saylardan yararlanmak zorunda da de
giliz. E
ger istersek say yerine
daha anlaml kelimeler de kullanabiliriz:
>>> lider = input("
Sampiyonun ismini giriniz: ")
>>> ikinci = input("
Ikinci olan takmn ismini giriniz: ")
>>> print("
Sampiyon {bir}. {iki} ikinci oldu...".format(bir=lider, iki=ikinci))

Burada biimlendirme i
saretleri olarak bir ve iki de
gi
skenlerini kulland
gmza dikkat edin.
Daha sonra da format() metodunun parantezleri iinde bu bir ve iki adl de
gi
skenleri
tanmlyoruz...

S
yle bir rnek verelim:
>>> a = 10
>>> b = 3
>>> print("{0} ile {1} blnrse {2} elde edilir.".format(a, b, a/b))
10 ile 3 blnrse 3.33333333333 elde edilir.

Burada istersek . i
saretinden sonra gelen basamak saysn keyfimize gre ayarlayabiliriz:
E
ger noktadan sonra herhangi bir say olmasn istemezsek s
u kodlar kullanyoruz:
>>> print("{0} ile {1} blnrse {2:.0f} elde edilir.".format(a, b, a/b))
10 ile 3 blnrse 3 elde edilir.

Burada dilimleme (slicing) i


slemine benzer bir s
ey yapt
gmza dikkat edin. Kme parantezleri
iinde yer alan .0f ifadesi noktadan sonra ka basamak gsterilece
gini belirliyor. Buna gre
noktadan sonra sfr sayda basamak olacak... Bir de s
una bakalm:
>>> print("{0} ile {1} blnrse {2:.1f} elde edilir.".format(a, b, a/b))
10 ile 3 blnrse 3.3 elde edilir.

Burada noktadan sonra bir basamak istedi


gimizi belirttik. .1f ifadesi iindeki sayy artrarak
basamak saysn istedi
giniz s
ekle getirebilirsiniz. Buradaki f harfi fixed-point number (sabit
noktal say) ifadesinin ba
s harfi... Bu harf, saymzn sabit noktal bir say cinsinden verilece
gini
gsteriyor.
Python 3.0 ile birlikte gelen bu format() adl metot olduka geli
smi
s zellikler sunar. Hatta
bu yap Python iinde minik bir dil gibidir. Biz bu blmde bu metodun baz temel zelliklerini
vermekle yetindik. Ilerki bir blmde bu metot daha ayrntl bir s
ekilde incelenecektir.

9.12 enumerate() Fonksiyonu


Bu fonksiyon Pythondaki en pratik ve yararl metotlardan bir tanesidir. enumerate kelimesi Trkede numaralandrmak anlamna gelir. Isminden de anla
slaca
g gibi bu fonksiyon
yardmyla numaralandrma i
slemleri yapaca
gz.
rne
gin, Pythondaki bir veri tipinin btn metotlarn nasl sralayaca
gmz biliyoruz:
>>> dir(list)

Bu komut list (liste) adl veri tipinin btn metotlarn listeleyecektir. I


ste bu metotlar numaralandrmak istememiz halinde enumerate() adl fonksiyon yardmmza ko
sacaktr.
I
se bu metodu biraz tanyarak ba
slayalm. Mesela s
yle bir s
ey yazalm:
>>> enumerate("istihza")
<enumerate object at 0x00C16238>

Grd
gnz gibi, enumerate() fonksiyonunu do
grudan kulland
gmzda bize bir numaralandrma nesnesi (enumerate object) veriyor.
Bu nesnenin ieri
gini grmek iin list() fonksiyonunu kullanabiliriz. Hatrlarsanz range()
fonksiyonu iin de list()ten yararlanm
stk...

>>> list(enumerate("istihza"))
[(0, i), (1, s), (2, t), (3, i), (4, h), (5, z), (6, a)]

S
imdi bu kty dikkatle inceleyelim. Burada bir liste iinde her biri bir say ve harften olu
san,
iki
geli demetler gryoruz. Bu tabloyu daha net grebilmek iin for dnglerinden yararlanabiliriz:
>>>
...
...
(0,
(1,
(2,
(3,
(4,
(5,
(6,

for i in enumerate("istihza"):
print(i)
i)
s)
t)
i)
h)
z)
a)

Grd
gnz gibi, bir say ve bir harften olu
san iftler elde ediyoruz. Al
strma olsun diye,
enumerate() fonksiyonunu liste reteleri (list comprehensions) ile birlikte kullanalm:
>>> [i for i in enumerate("istihza")]
[(0, i), (1, s), (2, t), (3, i), (4, h), (5, z), (6, a)]

Bu fonksiyonun nasl bir kt verdi


gini
grendi
gimize gre, bu kty ihtiyalarmz ve isteklerimiz do
grultusunda evirip evirebiliriz. Mesela istihza kelimesindeki harfleri dzgn bir
s
ekilde numaralandralm:
>>> for i in enumerate("istihza"):
...
print(i[0], i[1])
...
0 i
1 s
2 t
3 i
4 h
5 z
6 a

Hatta istersek say ve harflerin arasna birer i


saret de yerle
stirebiliriz:
>>> for i in enumerate("istihza"):
...
print(i[0], i[1], sep="==>")
...
0==>i
1==>s
2==>t
3==>i
4==>h
5==>z
6==>a

Hatta ve hatta artk format() gibi olduka esnek bir metodu da biliyor oldu
gumuza gre daha
karma
sk s
eyler de yapabiliriz:
>>> for i in enumerate("istihza"):
...
print("{0} : {1}".format(i[0], i[1]))

...
0 :
1 :
2 :
3 :
4 :
5 :
6 :

i
s
t
i
h
z
a

enumerate() fonksiyonunun verdi


gi ktnn ift
geli demetlerden olu
stu
gunu grm
stk. Bu
bilgiyi kullanarak yapy biraz sadele
stirebiliriz:
>>>
...
...
0 :
1 :
2 :
3 :
4 :
5 :

for k, v in enumerate("python"):
print("{0} : {1}".format(k, v))
p
y
t
h
o
n

Burada for k, v... satrndaki k harfi enumerate() fonksiyonu tarafndan retilen iki
geli
demetin birinci
gesini, v harfi ise o demetin ikinci
gesini temsil ediyor. Yani k sayy, v
ise harfi temsil ediyor... Daha sonra print() fonksiyonuyla
geleri ekrana yazdrrken de bu
harflerden yararlanyoruz...
Daha nce veri tiplerini anlatrken sk sk kulland
gmz bir kod parasn temel alarak
enumerate() ile ilgili bir rnek daha yapalm.
Hatrlarsanz len() fonksiyonunu anlatrken s
yle bir rnek vermi
stik:
>>> liste = ["kitap", "defter", "kalem", "silgi", "tebe
sir",
... "tahta", "sra", "
grenci", "okul", "nlk"]
>>> for sondarbe in range(len(liste)):
...
print(sondarbe+1, liste[sondarbe], sep=". ")
...
1. kitap
2. defter
3. kalem
4. silgi
5. tebe
sir
6. tahta
7. sra
8.
grenci
9. okul
10.nlk

Artk enumerate() fonksiyonunu


grendi
gimize gre bu i
slemi ok basit ve verimli bir s
ekilde
halledebiliriz:
>>> liste = ["kitap", "defter", "kalem", "silgi", "tebe
sir",
... "tahta", "sra", "
grenci", "okul", "nlk"]
>>> for k, v in enumerate(liste):
...
print(k, v, sep=". ")
...
0. kitap
1. defter

2.
3.
4.
5.
6.
7.
8.
9.

kalem
silgi
tebe
sir
tahta
sra

grenci
okul
nlk

Yalnz, grd
gnz gibi burada bir eksiklik var. Listemizdeki saylar 0dan ba
slyor. Halbuki biz
saymaya 1den ba
slanmasn istiyoruz. enumerate() fonksiyonunu kullanarak bunu yapmak
ok basittir:
>>> for k, v in enumerate(liste, 1):
...
print(k, v, sep=". ")
...
1. kitap
2. defter
3. kalem
4. silgi
5. tebe
sir
6. tahta
7. sra
8.
grenci
9. okul
10. nlk

Grd
gnz gibi, enumerate() fonksiyonuna ikinci parametre olarak verdi
gimiz say, ilk

genin hangi numaraya sahip olaca


gn gsteriyor. Biz burada ilk
genin 1 saysna sahip
olmasn istedik...
Son bir rnek daha verip bu konuyu kapatalm:
>>> for k, v in enumerate(dir(dict), 1):
...
print(k, v)

Bu kodlarla dict adl veri tipinin btn metotlarn numaralandrarak ekrana basyoruz...

9.13 Ka
s Dizileri (Escape Sequences)
Hatrlarsanz ilk derslerimizin birinde s
yle bir rnek vermi
stik:
>>> print("Ahmet, \"Bugn Adanaya gidiyoruz,\" dedi.")

O derste, buradaki \ i
saretinin bir ka
s dizisi oldu
gundan sz etmi
stik. Bu i
saret, karakter
dizisini ba
slatan ift trnak ile, cmle iinde geen ift trnaklarn birbirine kar
smasn engelliyordu. Ayn s
ekilde, yeni bir satra gememizi sa
glayan \n i
saretinin de bir ka
s dizisi
oldu
gunu sylemi
stik. Pythonda bol miktarda ka
s dizisi bulunur ve bunlarn her biri birbirinden farkl grevleri yerine getirir.
Pythonda temel olarak iki adet ka
s dizisi vardr: r ve \. Bu blmde bu ka
s dizilerini ve
bunlarn varyasyonlarn tek tek inceleyece
giz:
\
Bu i
saret hemen hemen btn programlama dillerinin demirba
sdr. Bunun dz bl de
gil ters
bl oldu
guna zellikle dikkat etmeliyiz...

Bu i
saretin ne i
se yarad
gn daha nceki derslerimizde grm
stk. Yukarya da ald
gmz
rne
ge bakt
gmzda bu i
saretin grevi aka ortaya kyor. \ i
sareti kendisinden sonra
gelen herhangi bir karakterin zel bir anlam oldu
gunu gsterir. Mesela s
u rne
ge bakalm:
>>> print("Kezban, \"Nen var kuzum,\" dedi.")

Burada \ i
sareti, kendisinden sonra gelen ift trnak karakterinin zel bir anlam oldu
gunu belirtiyor. Yani bu ift trna
gn, karakter dizisini ba
slatan ve bitiren ift trnaklardan farkl oldu
gunu
gsteriyor. Ayn i
sareti teki zel ift trna
gn da nne yerle
stirdi
gimizde yukardaki karakter
dizisini hatasz olarak ekrana yazdrabiliyoruz.
Mesela bu ka
s dizisi n harfinden nce gelirse, bu harfin de zel bir anlam oldu
gunu belirtecektir. \n adl ka
s dizisi yeni satra geilmesini sa
glar:
>>> print("Bu birinci satr.\nBu da ikinci satr...")
Bu birinci satr.
Bu da ikinci satr...

Pythondaki ka
s dizileri genel olarak \ i
saretinin ba
ska harflerle birle
serek zel bir anlam
olu
sturmasyla meydana getirilir. S
imdi bu \ i
saretinin yanna gelip zel bir anlam kazanan
harfleri ve bu s
ekilde ortaya kan ka
s dizilerini inceleyelim...
\t
E
ger \ i
saretini t harfinden nce getirirsek, ortaya kan i
saret (\t), karakter dizisi iinde
bir sekme (tab) olu
sturacaktr:
>>> print("Aramzda \tda
glar var...")
Aramzda

da
glar var...

E
ger daha byk bir sekmeye ihtiyacnz varsa, \t ka
s dizisini birden fazla sayda kullanabilirsiniz:
>>> print("Uzak... \t\tok uzak...")
Uzak...

ok uzak...

Elbette birden fazla farkl ka


s dizisini bir arada da kullanabiliriz:
>>> print("A
sa
gda \n\thava nasl?")
A
sa
gda
hava nasl?

Grd
gnz gibi \t adl ka
s dizisi bizi bo
sluk tu
suna st ste birka kez basmaktan kurtaryor. Karakter dizimiz iinde sekmeye ihtiyacmz oldu
gunda bu ka
s dizisi epey i
simize
yarayacak.
S
imdi ba
ska bir ka
s dizisine bakalm.
\\
S
imdiye kadar
grendi
gimiz gibi, \, \t ve \n i
saretlerini bir karakter dizisi iinde kulland
gmzda her biri zel bir grevi yerine getiriyor. Peki ya biz yazd
gmz bir karakter dizisi
iinde bu i
saretleri gstermek istersek ne yapaca
gz? Mesela \n ifadesinin kendisini bir karakter dizisi iine yazp kullanclarmza gsteremez miyiz?
Elbette gsterebiliriz. E
ger yazd
gmz bir karakter dizisi iinde bu ka
s dizilerinin kendisini
gstermek istersek s
yle bir yol tutuyoruz:

>>> print("
grendi
gimiz karakter dizileri
sunlardr: \\n, \\t")

grendi
gimiz karakter dizileri
sunlardr: \n, \t

Grd
gnz gibi, \t, \n veya \ ka
s dizisinin kendisini ekrana basabilmek iin \ i
saretini
iftleyerek \\ s
eklinde yazmamz gerekiyor...
E
ger sadece \ i
saretini gstermek istersek baz noktalara dikkat etmemiz gerekiyor.
Mesela s
u rne
ge bakalm:
>>> print("demirba
s ka
s dizisi: \.")
demirba
s ka
s dizisi: \.

Grd
gnz gibi, e
ger \ i
saretini tek ba
sna kullanacaksak zel bir s
ey yapmamza gerek
yok. Yalnz burada s
una dikkat etmemiz gerek: \ i
saretini iftlemeden yazabilmemiz iin, bu
i
saretin sa
gna herhangi bir zel karakterin gelmemesi lazm. Bu ne demek? Hemen bir rnek
verelim:
>>> print("demirba
s ka
s dizisi: \")
SyntaxError: EOL while scanning string literal

Bu rnek Pythonun bize bir hata mesaj gstermesine neden oluyor... Bunun sebebi aslnda
\ i
saretinin bu rnekte tek ba
sna kullanlmyor olmas. Yani \ i
saretinden sonra karakter
dizisinin biti
s trna
g geliyor... Bildi
gimiz gibi, \ i
sareti ift veya tek trnak ile birlikte kullanlrsa, Python bu tek veya ift trna
g farkl bir s
ekilde alglayacaktr. Mesela bu rnekte,
kapan
s trna
gndan hemen nce gelen \ ka
s dizisi nedeniyle Python bu kapan
s trna
gn
sanki yokmu
s gibi varsayacak ve bize hata mesaj gsterecektir... Bunun olmasn engellemek
iin, \ i
saretini iftlememiz gerekiyor:
>>> print("demirba
s ka
s dizisi: \\")
demirbas ka
s dizisi: \

Bir de s
u rne
ge bakalm:
>>> print("
grendi
gimiz karakter dizileri
sunlardr: \, \\n, \\t")
Simdiye kadar

grendi
gimiz karakter dizileri
sunlardr: \, \n, \t

Burada \ ka
s dizisini iftlememize gerek kalmad
gna dikkat edin. nk bu i
saretten
hemen sonra gelen virgl i
sareti Python asndan zel anlam ta
syan bir karakter de
gildir.
Bu yzden yukardaki karakter dizisinin ekrana baslmasnda herhangi bir sorunla kar
sla
smyoruz. Ama \ i
saretini yukardaki rnekte en sona yerle
stiremeyece
gimize dikkat edin:
>>> print("
grendi
gimiz karakter dizileri
sunlardr: \\n, \\t, \")
SyntaxError: EOL while scanning string literal

Bu hatay almamzn nedeni, \ i


saretini en sona koydu
gumuzda bu i
saretin, karakter dizisini
kapatan trnak i
saretleriyle ak
smasdr... Yukarda verdi
gimiz print(demirba
s ka
s dizisi:
\.) rne
ginde \ i
saretinden sonra bir nokta getirerek sorundan kat
gmza dikkat edin...
Burada nokta koymak yerine bo
sluk karakteri de koyabilirdik:

>>> print("demirba
s ka
s dizisi: \ ")
demirba
s ka
s dizisi: \

Szn z, \ i
saretini tek ba
sna kulland
gmzda sa
gndaki karakterle ak
sma riski varsa,
zm olarak \ i
saretini iftleme yoluna gidiyoruz.
\v
E
ger \ i
saretini v harfiyle birlikte kullanrsak d
sey sekme denen s
eyi elde ederiz. Hemen
bir rnek verelim:
>>> print("d
sey\vsekme")
d
sey
sekme

Yalnz bu \v adl ka
s dizisi her i
sletim sisteminde al
smayabilir... Dolaysyla, birden fazla
platform zerinde al
smak zere tasarlad
gnz programlarnzda bu ka
s dizisini kullanmanz
nermem.
\b
\ ka
s dizisinin, biraraya geldi
ginde zel bir anlam kazand
g bir ba
ska harf de bdir... \b
ka
s dizisini karakter dizisi biimlendirme blmnde bir rnek iinde kullanm
stk. rne
gimiz
s
yleydi:
>>> lider = input("
Sampiyonun ismini giriniz: ")
>>> print("Bu senenin
sampiyonu", lider, "\b.",

"Tebrikler.")

Burada \b adl ka
s dizisi, kendisinden nceki bir karakteri silme grevini stleniyor. Bu
rnekte lider de
gi
skeni ekrana yazdrlrken kendisinden sonra bir adet bo
sluk karakteri olacaktr ktda... I
ste \b ka
s dizisi bu bo
sluk karakterini siliyor. \b ka
s dizisinin grevi
klavyedeki backspace tu
suyla ayndr...
\b ka
s dizisini bir rnekte daha grelim:
>>> print("merhaba\b")

Ne oldu? Bu karakter dizisi hi bir s


eyi de
gi
stirmedi, de
gil mi? ok normal. nk bu ka
s
dizisi biraz kaprislidir. \b adl ka
s dizisi, al
sabilmek iin kendisinden sonra da en az bir
karakter olmasn ister. Dolaysyla yukardaki rnekte \b ka
s dizisi grevini yerine getirmiyor, ama s
u rnekte bu ka
s dizisi grevini eksiksiz olarak yerine getirecektir:
>>> print("merhaba\b dnya")
merhab dnya

Burada \b ka
s dizisinden sonra bo
sluk karakteri var. Bu yzden bu ka
s dizisi byle bir
ortamda grevini yerine getirebiliyor. E
ger sadece print(merhaba) yazp merhab ktsn
elde etmek isterseniz s
yle bir hileye ba
svurabilirsiniz:
>>> print("merhaba\b ")
merhab

Burada grd
gnz gibi, \b ka
s dizisinden sonra bir bo
sluk brakarak kandrmaca yoluna
gittik...

Bu ka
s dizisini art arda yazarak tuhaf s
eyler de yapabilirsiniz...
>>> print("merhaba\b\b ")
merha a

Burada \b\b ka
s dizilerinin yapt
g s
ey, sola do
gru iki karakter atlayp, ula
st
g noktaya bir
adet bo
sluk karakteri yerle
stirmektir. S
u rnekte durum biraz daha ak grnecektir:
>>> print("merhaba\b\bf")
merhafa

Yani bu karakter dizisini kullanarak s


yle sama bir s
ey de yapabilirsiniz:
>>> print("merhaba\b\b\b\b\b\b\bglegle")
glegle

Bu kodlar s
yle yazarak biraz beyin jimnasti
gi yapmak isteyebilirsiniz:
>>> print("merhaba{0}{1}".format("\b"*len(merhaba), "glegle"))
glegle

Grd
gnz gibi, bu karakter dizisi rahatlkla suyu karlabilecek bir aratr...
\r
\ i
saretini birarada kullanaca
gmz ba
ska bir harfimiz ise r harfidir...
\r ka
s dizisi, bir karakter dizisinin en ba
sna gelmemizi sa
glar. Mesela bu karakter dizisini
kullanarak tank kelimesini banka evirebiliriz!
>>> print("tank\rb")
bank

\a
\ ka
s dizisini son olarak a harfi ile birlikte kullanaca
gz. \a ka
s dizisi bilgisayarmzn
bip sesi karmasn sa
glar:
>>> print("\a")
==bip!==

Tpk \v ka
s dizisi gibi, bu ka
s dizisi de her i
sletim sisteminde al
smayabilir. rne
gin bu
ka
s dizisinin GNU/Linuxta al
saca
gnn garantisi yoktur...
r
Bu karakter dizisi kimi durumlarda olduka faydal olabilecek bir aratr. Diyelim ki bilgisayarmzda tam yolu C:\test\rehber.txt olan bir dosya var. Bu dosyann tam yolunu print()
fonksiyonu yardmyla ekrana yazdrmak istersek s
yle bir kt alrz:
>>> print("C:\test\rehber.txt")
ehber.txtst

Burada olan s
ey s
u: Python, C:\test\rehber.txt iindeki \t ve \r ifadelerini birer ka
s dizisi
olarak alglad. Dolaysyla C:den sonra sanki sekme tu
suna baslm
s gibi davrandktan sonra,

\r ka
s dizisi zannetti
gi s
eyin etkisiyle de karakter dizisinin ba
sna dnp ehber.txt ksmn
oraya yap
strd... Bu rnek, Pythondaki ka
s dizilerini kullanmasak bile onlar en azndan
tanmamz gerekti
gini ak seik gsteriyor. I
ste bu tr srprizleri engellemek iin r adl ka
s
dizisinden yararlanaca
gz. Bunun, daha nce grd
gmz \r ka
s dizisinden farkl oldu
guna
dikkat edin:
>>> print(r"C:\test\rehber.txt")
C:\test\rehber.txt

Grd
gnz gibi, r ka
s dizisinin kullanm yeri teki ka
s dizilerine gre farkllk gsteriyor.
Bu ka
s dizisini karakter dizisinin iinde de
gil, d
snda kullanyoruz. Bu ka
s dizisinin grevi,
karakter dizisi iinde geen btn ka
s dizilerini etkisiz hale getirmektir... Dolaysyla daha
nce verdi
gimiz s
u rne
gi:
>>> print("
grendi
gimiz karakter dizileri
sunlardr: \\n, \\t, \\")

...
syle de yazabiliriz...
>>> print(r"
grendi
gimiz karakter dizileri
sunlardr: \n, \t")

Burada kulland
gmz r ka
s dizisi, karakter dizisi iindeki btn ka
s dizilerini etkisiz hale
getirdi
gi iin, bizim cmle iinde geen karakter dizilerini iftlememize gerek kalmad.
Ancak r adl karakter dizisi \ ka
s dizisini etkisizle
stiremez. Dolaysyla s
yle bir yazm,
hata almamza yol aacaktr:
>>> print(r"
grendi
gimiz karakter dizileri
sunlardr: \n, \t, \\, \")

Bu durumdan kurtulmann tek yolu, en sona bir bo


sluk karakteri yerle
stirmektir:
>>> print(r"
grendi
gimiz karakter dizileri
sunlardr: \n, \t, \\, \ ")

Bylece Pythondaki ka
s dizilerini gzden geirmi
s olduk. Gelin isterseniz ka
s dizilerine
s
yle topluca bir gz atalm:
\n Yeni satr olu
sturur.
\ Tek trnak iine ald
gmz karakter dizilerinde tek trnak kullanmamz sa
glar.
\ ift trnak iine ald
gmz karakter dizilerinde ift trnak kullanmamz sa
glar.
\a Sistemimizin bip sesi karmasn sa
glar (Her platformda al
smaz).
\b Kendisinden nce gelen karakteri siler.
\r Karakter dizisinin en ba
sna dnlmesini sa
glar.
\t Karakter dizisi iinde sekme olu
sturur.
\v D
sey sekme olu
sturur (Her platformda al
smaz).
\\ Herhangi bir ka
s dizisini etkisiz hale getirir.
r Karakter dizisi iinde geen btn ka
s dizilerini etkisiz hale getirir.

BLM

10

Fonksiyonlar

Bir nceki blmn tamamlanmasyla birlikte Pythonda Temel Bilgiler olarak adlandrabilece
gimiz konular bitirmi
s olduk. Bylelikle artk Python programlama dilini temel dzeyde
bildi
gimizi rahatlkla iddia edebiliriz...
Bu blmden itibaren Pythonun derinliklerine do
gru yolculu
gumuza ba
slayaca
gz. Bu yolculuktaki ilk dura
gmz Pythonda Fonksiyonlar olacak... Peki nedir bu fonksiyon denen s
ey?
En basit tanmyla fonksiyon, birbiriyle ili
skili deyimleri, kod paralarn bir araya toplamamz
sa
glayan bir kod blo
gudur. Pythondaki fonksiyonlar bize i
slerimizi otomatikle
stirme imkan
sa
glar. Fonksiyonlarn bu otomatikle
stirme i
sini nasl yerine getirdi
gini bu blmde inceleyece
giz. Bu blm bitirip fonksiyonlar konusunu
grendi
gimizde, Pythonda ileriye do
gru ok
nemli ve byk bir adm atm
s, deyim yerindeyse level atlam
s olaca
gz...
Aslnda fonksiyon bizim yabancs oldu
gumuz bir kavram de
gil. S
imdiye kadar Pythonda pek
ok fonksiyon grdk ve kullandk. rne
gin, print() komutunun bir fonksiyon oldu
gunu ta
en ba
sta sylemi
stik... Ayn s
ekilde, daha nceki derslerimizde grd
gmz ve i
slerimizi bir
hayli kolayla
strm
s olan range(), len(), round(), str(), int(), list(), dict(), tuple()
vb. de birer fonksiyondur. I
ste s
imdi biz de bu blmde buna benzer fonksiyonlar nasl olu
sturabilece
gimizi
grenece
giz... O halde isterseniz laf daha fazla uzatmadan i
se koyulalm...

10.1 Fonksiyon Tanmlamak


Giri
s ksmnda syledi
gimiz gibi, fonksiyonlar i
slerimizi otomatikle
stirmemizi sa
glar. Hatrlarsanz, bundan nceki derslerimizin birinde sum() adl bir fonksiyondan sz etmi
stik. Bu
fonksiyon, mesela bir liste iindeki btn saylarn toplamn veriyordu bize. Bu fonksiyonu
s
yle kullanyorduk:
>>> a = [2, 3, 4]
>>> sum(a)
9

Peki bu fonksiyon nasl oluyor da i


slerimizi otomatikle
stirmemizi sa
glyor?
Bir an iin Pythonda fonksiyon diye bir s
eyin olmad
gn varsayalm. Yukardaki gibi, bir liste
iindeki btn saylar toplamak istedi
gimizde s
yle bir s
ey yazmamz gerekecekti:

169

>>> lst = [2, 3, 4]


>>> a = 0
>>> for i in lst:
...
a = a + i
... print(a)

Ba
ska bir grup sayy toplamak istedi
gimizde ise bu kodlar en ba
stan tekrar yazmak zorunda
kalacaktk:
>>> lst2 = [10, 20, 56, 55]
>>> a2 = 0
>>> for v in lst2:
...
a2 = a2 + v
... print(a2)

E
ger sum() fonksiyonu olmasayd, program iinde ne zaman bir grup sayy toplamak istesek yukardaki kodlar her defasnda yeni ba
stan yazmanz gerekecekti... Ama Pythonun
bize sundu
gu sum() fonksiyonu sayesinde bu i
slemlerin hibirini yapmak zorunda kalmyoruz.
Programmz iinde bir grup sayy toplamak istedi
gimizde sadece sum() fonksiyonunu a
grmamz yeterli oluyor. Yani bu fonksiyon bir anlamda i
slerimizi otomatik bir hale getirmemizi
sa
glyor...
sum() olduka faydal bir fonksiyondur. Bu fonksiyon sayesinde, bir kere yazlm
s bir kod
parasn farkl yerlerde ve programlarda tekrar tekrar kullanabiliyoruz. Zaten fonksiyonlarn
ana grevlerinden biri de, bir kere yazlm
s kodlarn tekrar tekrar kullanlabilmesini sa
glamaktr.
Yabanclar buna code reusability adn veriyor...
sum() fonksiyonu, bir grup sayy kolay bir s
ekilde toplamamz sa
glayan bir aratr. Ancak Pythonda tpk bu sum() fonksiyonuna benzer s
ekilde bir liste iindeki btn saylar
arpan, do
grudan kullanabilece
gimiz zel bir fonksiyon bulunmaz. Ama biz istersek fonksiyonlar yardmyla kendimiz iin byle bir fonksiyon yazabiliriz. S
imdi bunu nasl yapaca
gmza
bakalm. Hem bylece fonksiyonlar konusuna da hzl bir giri
s yapm
s olalm.
Pythonda bir fonksiyonu kullanabilmek iin ncelikle o fonksiyonu tanmlamamz gerekir. Bu
tanmlama i
sini def adl bir parack yardmyla yapyoruz. Pythonda bir fonksiyon s
yle tanmlanr (Bu kodlar dosyaya kaydedelim):
def fonksiyon_ad():

Madem biz arpma yapan bir fonksiyon yazaca


gz, o halde fonksiyonumuzu s
yle tanmlayabiliriz:
def arp():

Burada def parac


g fonksiyonumuzu tanmlamamz sa
glyor. arp() ise fonksiyonumuzun
ad... Bu arada arp kelimesinin sonuna () i
saretini ve ardndan da iki nokta st steyi
koymay asla unutmuyoruz. S
imdi yapmamz gereken s
ey fonksiyonumuzun ieri
gini yazmak
olacak:
def arp():
a = 1
for i in [2, 3, 4]:
a = a * i
print(a)

Burada girintilere zellikle dikkat ediyoruz... Bu kodlarda yapt


gmz s
ey, [2, 3, 4] listesinin

tek tek btn


gelerini 1 saysyla arpp, sonucu a de
gi
skenine atamaktan ibaret... Bu i
slem
nihai olarak listedeki btn saylarn birbiriyle arplmasn sa
glayacaktr.
Bylece fonksiyonumuzu tanmlam
s olduk. S
u anda yapmamz gereken tek bir s
ey kald. O
da yazd
gmz fonksiyonumuzu a
grmak:
arp()

Bunu da kodlarmz arasna ekleyelim:


def arp():
a = 1
for i in [2, 3, 4]:
a = a * 1
print(a)
arp()

Yine girintilere ok dikkat ediyoruz... Ayrca tanmlad


gmz fonksiyonun snrlarna da dikkat
edin. Bir fonksiyon, def parac
gyla ba
slar, kendisinden sonra gelen girintili kod blo
guyla
devam eder. Bu kod blo
gunun d
snda kalan her s
ey fonksiyonun da d
sndadr. Mesela
burada yazd
gmz arp() satr fonksiyonun bir paras de
gildir. Tanmlad
gmz fonksiyon
sadece koyu harflerle gsterilen kodlardan ibarettir. arp() satrnn grevi ise tanmlad
gmz
fonksiyonu a
grmaktr. Bu demek oluyor ki, Pythonda bir fonksiyonu kullanabilmek iin nce
o fonksiyonu tanmlamamz, ardndan da bu fonksiyonu a
grmamz gerekiyor. Yukardaki
rnekte, koyu harflerle gsterilen ksm fonksiyonun tanmland
g ksmdr... Bundan sonra
gelen arp() ifadesi ise fonksiyonumuzu a
grd
gmz ksm oluyor... Bu nemli bilgiyi de

grendi
gimize gre yolumuza devam edebiliriz...
Bu arada, bu blmn en ba
snda rnek olarak verdi
gimiz toplama i
slemi yapan kodlar da bir
fonksiyon haline getirelim isterseniz:
def topla():
a = 0
for i in [2, 3, 4]:
a = a + i
print(a)

Son olarak fonksiyonumuzu a


gryoruz:
topla()

Bunu da kodlarmzn arasna yerle


stirelim:
def topla():
a = 0
for i in [2, 3, 4]:
a = a + 1
print(a)
topla()

Yukarda tanmlad
gmz arp() ve topla() adl fonksiyonlar bir dosyaya kaydedip
al
strd
gmzda Python bize ilgili i
slemlerin sonucunu verecektir. Yani arp() fonksiyonu
2, 3 ve 4 saylarnn arpmn, topla() fonksiyonu ise 2, 3 ve 4 saylarnn
toplamn gsterecektir. Burada fonksiyonlarn i
simizi nasl da kolayla
strd
gna dikkat edin.
Yukarda tanmlad
gmz arp() fonksiyonu sayesinde, bir grup sayy arpmak istedi
gimiz zaman, btn kodlar her defasnda yeni ba
stan yazmak yerine sadece arp() fonksiyonunu
a
grmamz yeterli olacaktr...

Yalnz dikkat ederseniz, burada yazd


gmz fonksiyonlar kstl. Bu fonksiyonlar sadece 2, 3
ve 4 saylar zerinde i
slem yapabiliyor. Bunun nedeni bizim bu sayy fonksiyon iinde
do
grudan tanmlam
s olmamz... E
ger fonksiyonumuzu daha esnek bir hale getirmek istersek,
rne
gin arp() fonksiyonunu s
u s
ekilde yazmamz gerekir:
def arp(liste):
a = 1
for i in liste:
a = i * a
print(a)

Burada, bir nceki yazmdan farkl olarak herhangi bir say belirtmedik. Onun yerine liste adl
bir de
gi
sken olu
sturup bunu fonksiyona parametre olarak verdik... Bu sayede fonksiyonumuz
herhangi bir say listesinin ieri
gini arpabilecek. Bir deneme yapalm:
saylar = [24, 56, 77, 87]
arp(saylar)

Yazd
gmz kodlar tam olarak s
yle grnecek:
def arp(liste):
a = 1
for i in liste:
a = i * a
print(a)
saylar = [24, 56, 77, 87]
arp(saylar)

Bu kodlar bir dosyaya kaydedip al


strd
gmzda s
u sonucu alrz:
9003456

Grd
gnz gibi fonksiyonlar, yazd
gmz kodlar bir araya toplamamz, gruplandrmamz da
sa
glamann yansra, yapaca
gmz i
slemler iin bir s
ablon olu
sturma vazifesi de gryor. Pek
ok kez kullanmamz gereken i
slevleri bir s
ablon haline getirerek, bu s
ablon zerinden, benzer i
slemleri tek bir komutla halledebiliyoruz. Ilerleyen derslerimizde modller konusunu

grendi
gimizde bu fonksiyonlar ok daha verimli bir biimde kullanabilece
giz.
Fonksiyonlar, yazd
gmz programlarda i
slerimizi bir hayli kolayla
strr. Fonksiyonlar olmasayd
bir program iinde defalarca yazmak zorunda kalaca
gmz kodlar bir kez fonksiyon olarak
tanmladktan sonra program iinde tekrar tekrar kullanabiliriz. E
ger kodlarda bir de
gi
siklik
yapmamz gerekirse sadece fonksiyon iinde de
gi
siklik yapmamz yeterli olacaktr. br trl,
program iinde oraya buraya da
glm
s kod paralarn tek tek bulup dzeltmemiz gerekecekti...
zellikle arayz tasarlarken fonksiyonlardan bolca yararlanaca
gz...
Fonksiyonlarla ilgili ok basit bir rnek verelim. Diyelim ki bir program yazdk ve programn bir
yerinde kullancdan say girmesini istiyoruz. Bunun, programmzn hata vermesine yol ama
potansiyeli ta
syan bir i
slem oldu
gunu varsayalm. Programn al
smas srasnda bir hatayla
kar
sla
sld
gnda kullancya genel bir hata mesaj gstermek istersek s
yle bir kod yazabiliriz:
try:
soru = input("gerekli sayy giriniz: ")
except:
print("Beklenmeyen bir hata olu
stu.")
print("Bu hatay, hata takip sistemine raporlaynz!..")

Yine diyelim ki except blo


gu iinde yazd
gmz genel hata mesajn programmzn ba
ska
yerlerinde de aynen kullanmak istiyoruz. Yani mesela s
yle bir s
ey yapmak istiyoruz:
try:
soru = int(input("gerekli sayy giriniz: "))
except:
print("Beklenmeyen bir hata olu
stu.")
print("Bu hatay, hata takip sistemine raporlaynz!..")
#Burada programmza ait ba
ska kodlar yer alyor...
try:
soru2 = int(input("ba
ska bir say giriniz: "))
except:
print("Beklenmeyen bir hata olu
stu.")
print("Bu hatay, hata takip sistemine raporlaynz!..")

Burada dikkat ederseniz, genel hata mesajn gstermek istedi


gimiz her yerde bu mesajlar
tekrar tekrar yazmamz gerekiyor. I
ste fonksiyonlar byle durumlarda i
slerimizi kolayla
strabilir... Yukardaki kodlar fonksiyonlar yardmyla s
u s
ekilde sadele
stirebiliriz:
def genelHata():
print("Beklenmeyen bir hata olu
stu.")
print("Bu hatay, hata takip sistemine raporlaynz!..")
try:
soru = int(input("gerekli sayy giriniz: "))
except:
genelHata()
#Burada programmza ait ba
ska kodlar yer alyor...
try:
soru2 = int(input("ba
ska bir say giriniz: "))
except:
genelHata()

Bu verdi
gimiz ok basit bir rnektir, ama bu basit rnekte bile, fonksiyonlarn i
simizi ne kadar
kolayla
strabilece
gini grebiliyoruz. Burada kulland
gmz fonksiyon ncelikle bizi ayn s
eyleri
tekrar tekrar yazma zahmetinden kurtaryor. genelHata() adl fonksiyonu bir kez tanmladktan sonra, gereken yerlerde sadece bu fonksiyonu a
grarak i
simizi halledebiliyoruz. Ayrca
e
ger kullancya gstermek istedi
gimiz hata mesajnda de
gi
siklik yapmak istersek, sadece
fonksiyon iinde gerekli de
gi
siklikleri yapmamz yeterli olacaktr. E
ger burada fonksiyon kullanmasaydk, hata mesajlarn kodlar iinde tek tek bulup de
gi
stirmemiz gerekecekti...
Bu blmde grd
gmz rneklerden de bildi
gimiz gibi, yazd
gmz fonksiyonlara parametre
atayarak bunlar daha da esnek bir hale getirebiliyoruz:
def genelHata(eposta):
print("Beklenmeyen bir hata olu
stu.")
print("Bu hatay, {0} adresine raporlaynz!".format(eposta))
try:
soru = int(input("gerekli sayy giriniz: "))

except:
genelHata("abc123@abc.com")
try:
soru2 = int(input("ba
ska bir say giriniz: "))
except:
genelHata("123fds@cbc.com")

Bu programn al
smas esnasnda e
ger ilk try... except... blo
gu iinde bir hata meydana
gelirse kullancya Bu hatay abc123@abc.com adresine raporlaynz! mesaj; e
ger hata ikinci try... except... blo
gu iinde meydana gelirse de Bu hatay 123fds@cbc.com adresine
raporlaynz! mesaj gsterilecektir.
Bu arada dikkat ederseniz, genelHata() adl fonksiyondaki eposta parametresi aslnda bir
yer tutucu olmaktan te bir anlam ifade etmiyor. Yani oraya istedi
giniz bir kelimeyi yazabilirsiniz. Amacmz oraya bir parametre gelece
gini belirtmek. Tabii ki parametrelerimizi adlandrrken anlaml isimler yazmamz her zaman iin i
simizi kolayla
stracaktr... Bu parametre
meselesini bir sonraki blmde biraz daha ayrntl olacak inceleyece
giz.
Bu blmn son sz olarak fonksiyonlarn adlandrlmas konusunda birka s
ey syleyelim...
Fonksiyon adlarn kk harflerle yazmak adettendir. Yani:
def fonk():

Burada grld
g gibi, fonksiyon adlarn yazarken kk harfleri kullanyoruz. E
ger yazaca
gmz fonksiyonun ad birden fazla kelimeden olu
suyorsa, fonksiyon adn olu
sturan kelimeleri birbirinden _ i
sareti ile ayryoruz. Yani:
def fonksiyon_ad():

Daha nadir olarak, birden fazla kelimeden olu


san fonksiyon adlarnn s
u s
ekilde yazld
gn da
grebiliriz:
def fonksiyonAd():

Son olarak, fonksiyon adlarnn byk harflerle ba


slad
g pek grlmez...

10.2 Fonksiyonlarn Parametreleri


Bir nceki blmde fonksiyonlar parametrelerle birlikte kullanarak epey esnek sonular elde
edebilece
gimizi grm
stk. Bu arada, bizim burada parametre olarak adlandrd
gmz s
ey
baz yerlerde argman olarak da kar
snza kabilir. Bu iki terim znde birbirinden farkl olsa
da, o
gunlukla fonksiyonlar iin birbiriyle e
s anlaml olarak kullanlmaktadr... Yani fonksiyonlar
sz konusu oldu
gunda parametre ve argman ayn s
eyi ifade eder. Peki argman ile
parametre arasndaki fark nedir?
S
u rnekte x bir parametredir:
def fonk(x):

S
u rnekte ise 50 bir argmandr:
fonk(50)

Yani bir fonksiyonun tanmlanmas srasnda, parantez iinde belirtilen de


gi
skenlere parametre ad verilirken, tanmlanan fonksiyonun a
grlmas esnasnda, bu de
gi
skenlere verilen

de
gerlere ise argman ad veriliyor. Dolaysyla yukardaki fonksiyon hakknda s
yle bir
cmle kurabiliriz:
fonk adl fonksiyonun x parametresine argman olarak 50 de
gerini verdik...
Ancak parametre ile argman arasndaki bu farkllk o
gu zaman gzard edilir ve bu iki
kavram o
gunlukla birbiriyle e
s anlaml olarak kullanlr.
Dedi
gimiz gibi, bir nceki blmde parametreleri temel olarak nasl kullanabilece
gimizi
grenmi
stik. Bu blmde ise parametre kavramna biraz daha ayrntl olarak bakmaya al
saca
gz.
nce s
u ok basit fonksiyona bir bakalm:
def bas(kelime):
print("merhaba", kelime)

Burada bas() adl bir fonksiyon tanmladk. Bu fonksiyon tek bir parametre alyor. Fonksiyonumuzda bu parametreyi bir karakter dizisi iinde kullanyoruz. Bu fonksiyonu al
strd
gmzda,
bas() fonksiyonuna argman olarak verdi
gimiz kelime merhaba karakter dizisi ile birlikte
ekrana baslacaktr. Mesela bu fonksiyonu istihza argmanyla a
gralm:
bas("istihza")

Kodlarmz s
yle grnecek:
def bas(kelime):
print("merhaba", kelime)
bas("istihza")

Bu kodlar bir dosyaya kaydedip al


strd
gmzda s
yle bir kt elde ederiz:
merhaba istihza

Grd
gnz gibi, bas() fonksiyonuna verdi
gimiz istihza argman merhaba karakter dizisi
ile birlikte ekrana baslyor. Kodlarmz biraz geli
stirelim:
def bas(kelime):
print("merhaba", kelime)
soru = input("adnz nedir? ")
bas(soru)

Bu kodlar, merhaba karakter dizisi ile birlikte ekrana dklecek kelimeyi do


grudan kullancdan alyor... Bu arada, yazd
gmz fonksiyonun nerede ba
slayp nerede bitti
gine dikkat edelim.
soru = input(.... satr ve ondan sonraki ksm fonksiyonumuzun d
snda yer alyor.
Dedi
gimiz gibi, bas() fonksiyonu tek bir argman alyor. Dolaysyla bu fonksiyonu argmansz
olarak a
gramayz:
def bas(kelime):
print("merhaba", kelime)
soru = input("adnz nedir? ")
bas()

E
ger bas() fonksiyonunu bu s
ekilde argmansz olarak yazp al
strrsak a
sa
gdakine benzer
bir hata alrz:
TypeError: bas() takes exactly 1 positional argument (0 given)

Bu hata mesaj s
yle evrilebilir: TipHatas: bas() tam tamna 1 adet sral argman alr (0
verilmi
s)
Demek ki bas() fonksiyonunu al
strabilmek iin 1 adet argman girmemiz gerekiyormu
s...
Ne bir eksik, ne bir fazla... Bu arada hata mesaj iinde geen sral argman (positional
argument) kavramndan da biraz sonra bahsedece
giz.
Fonksiyonlara istedi
gimiz sayda parametre verebiliriz. Ancak parametrelerimizi makul
sayda tutmak, fonksiyonun hangi parametrelere ihtiya duydu
gunu hatrlayabilmek asndan
nemlidir:
def deneme(bir, iki, liste, lt):
sonu = bir * iki
if bir and iki != lt:
liste.append(sonu)
else:
print("{0} ile arpmaya izin vermiyoruz!".format(lt))
print(liste)

Grd
gnz gibi, fonksiyonlara birden fazla parametre verebiliyoruz... Burada tanmlad
gmz
fonksiyon, bir, iki, liste ve lt olmak zere drt adet parametre alyor. Yani bu
fonksiyonu kullanabilmek iin fonksiyonumuzu drt adet argman ile a
grmamz gerekiyor.
Fonksiyonumuzun ieri
gine bakt
gmz zaman ilk olarak s
u satr gryoruz:
sonu = bir * iki

Buna gre, deneme() adl fonksiyondaki bir ve iki adl parametreler birbiriyle arplp
sonu adl de
gi
skeni olu
sturacak. Ardndan gelen satrda bir if... else... blo
gu gryoruz. E
ger bir ve iki parametrelerinin de
geri lt parametresinin de
gerine e
sit de
gilse,
bir nceki satrda belirledi
gimiz sonu adl de
gi
skenin de
gerini liste parametresine ekliyoruz. Burada and adl bool de
gerinin anlamna dikkat edin. sonu adl de
gi
skenin listeye
eklenebilmesi iin hem bir de
gerinin, hem de iki de
gerinin lte e
s olmamas gerekiyor.
Daha sonra else blo
gunu tanmlyoruz. Buna gre e
ger bir ve iki parametrelerinden herhangi birinin de
geri lte e
sitse, kullancya lt ile arpmaya izin vermiyoruz! s
eklinde
bir uyar gsteriyoruz. Son satrda ise liste adl parametrenin de
gerini ekrana basyoruz...
S
imdi sra geldi fonksiyonumuzu a
grmaya:

geler = []
deneme(23, 5,
geler, 4)

Kodlarmz topluca grelim:


def deneme(bir, iki, liste, lt):
sonu = bir * iki
if bir and iki != lt:
liste.append(sonu)
else:
print("{0} ile arpmaya izin vermiyoruz!".format(lt))
print(liste)

geler = []
deneme(23, 5,
geler, 4)

Burada ncelikle
geler adl bo
s bir liste olu
sturduk. nk deneme() fonksiyonunun
parametrelerinden birisi liste olmak zorunda... Ardndan da deneme() fonksiyonunu a
gryoruz. Fonksiyonumuzu drt adet argman ile a
grd
gmza dikkat edin. E
ger argman says
drtten az veya fazla olursa programmz hata verecektir.

Bu kodlar al
strd
gmzda ekrana, fonksiyon iinde belirtti
gimiz listenin
geleri baslacaktr.
Fonksiyonumuzu bir de s
u argmanlarla a
gralm:
def deneme(bir, iki, liste, lt):
sonu = bir * iki
if bir and iki != lt:
liste.append(sonu)
else:
print("{0} ile arpmaya izin vermiyoruz!".format(lt))
print(liste)

geler = []
deneme(23, 5,
geler, 5)

Bu defa s
yle bir kt alyoruz:
5 ile arpmaya izin vermiyoruz!
[]

Bu kty almamznn sebebi iki adl parametrenin de


gerinin (5), lt parametresinin
de
geriyle ayn olmas (5). Fonksiyonumuz iinde byle bir durum iin else blo
gunu yazm
s ve
byle bir duruma izin vermedi
gimiz konusunda kullancy uyarm
stk...

10.3 Varsaylan Degerli


Argmanlar
Bu blmde Varsaylan De
gerli Argmanlar diye bir s
eyden sz edece
giz. Bakalm neymi
s
bu Varsaylan De
gerli Argmanlar...
nceki derslerimizden range() fonksiyonunu biliyorsunuz. range() fonksiyonunu anlatrken
bu fonksiyonun baz varsaylan de
gerleri oldu
gunu sylemi
stik. Yani bu range() fonksiyonu
aslnda argman almasna ra
gmen biz bunu tek bir argman ile de kullanabiliyorduk...
range() fonksiyonu s
u parametrelerden olu
suyordu:
range(ba
slang_de
geri, biti
s_de
geri, atlama_de
geri)

range() fonksiyonunu kullanabilmek iin bu parametreler iinde sadece biti


s_de
geri adl
parametreye bir argman vermemiz yeterli olacaktr:
list(range(10))

teki iki parametrenin birer varsaylan de


geri oldu
gu iin o parametreleri belirtmesek de olur.
Yine range() fonksiyonunu anlatt
gmz blmde o parametrelerin varsaylan de
gerlerinin
s
yle oldu
gunu sylemi
stik:
ba
slang_de
geri = 0
atlama_de
geri = 1

Dolaysyla, biz range(10) yazd


gmzda Python bunu range(0, 10, 1) s
eklinde alglayacak
ve ona gre i
slem yapacaktr.
Peki varsaylan de
gerli argmanlarn bize ne gibi bir faydas var? Varsaylan de
gerli argmanlar s
una benzetebiliriz: Diyelim ki bilgisayarnza bir program kuruyorsunuz. E
ger bu
program ilk defa kuruyorsanz, kurulumla ilgili btn seeneklerin ne i
se yarad
gn bilmiyor
olabilirsiniz... Dolaysyla e
ger program size kurulumun her a
samasnda bir soru sorarsa her
soruya ne cevap verece
ginizi kestiremeyebilirsiniz. O yzden, makul bir program, kullancnn
en az seimle program kullanlabilir hale getirmesine msaade etmelidir. Yani bir programn

kurulumu esnasnda baz seeneklere program yazan ki


si tarafndan baz mantkl varsaylan
de
gerler atanabilir. rne
gin kullanc program kurarken herhangi bir kurulum dizini belirtmezse program otomatik olarak varsaylan bir dizine kurulabilir... Veya programla ilgili, kullancnn i
sine yarayacak bir zellik varsaylan olarak ak gelebilir. I
ste biz de yazd
gmz programlarda kullanaca
gmz fonksiyonlara bu s
ekilde varsaylan de
gerler atarsak programmz
kullanacak ki
silere kullanm kolayl
g sa
glam
s oluruz... rne
gin range() fonksiyonunu yazan
Python geli
stiricileri bu fonksiyona baz varsaylan de
gerler atayarak bizim iin bu fonksiyonun
kullanmn kolayla
strm
slardr. Bu sayede range() fonksiyonunu her defasnda argman
vermek yerine tek argman ile al
strabiliyoruz...
Biz de kendi yazd
gmz fonksiyonlarda byle varsaylan de
gerler belirleyebiliriz. Mesela s
u
rne
ge bir bakalm:
def bl(bir, iki, kip=True):
sonu = bir / iki
if kip == True:
print(sonu)
if kip == False:
print(int(sonu))

Bu fonksiyonu s
u argmanlarla a
gralm:
bl(10, 2)

Kodlarmz tam olarak s


yle grnecek:
def bl(bir, iki, kip=True):
sonu = bir / iki
if kip == True:
print(sonu)
if kip == False:
print(int(sonu))
bl(10, 2)

Bu program al
strd
gmzda s
u sonucu alrz:
5.0

Grd
gnz gibi, sonu iinde ondalk ksm da grnyor... E
ger tamsay s
eklinde bir sonu
elde etmek istersek fonksiyonumuzu s
yle a
graca
gz:
bl(10, 2, False)

Bu s
ekilde s
yle bir sonu alrz:
5

Fonksiyonumuza bakt
gmz zaman, bl() fonksiyonunun adet parametre ald
gn gryoruz. Ama sonuncu parametreye varsaylan bir de
ger atad
gmz iin, fonksiyonumuzu kullanrken sadece iki argman vermemiz yeterli olacaktr. E
ger nc parametreyi belirtmezsek, bu parametrenin de
geri True varsaylacaktr...
Bu arada, yukardaki fonksiyonu s
u s
ekilde tanmlayabilece
gimizi de biliyoruz:
def bl(bir, iki, kip=True):
sonu = bir / iki
if kip:
print(sonu)

if not kip:
print(int(sonu))

Burada if kip: ifadesi if kip == True: ile e


sanlamldr. f not kip: ise if kip == False ile
ayn anlama gelir...
Hatta istersek fonksiyonumuz iin s
yle bir yazm tarz dahi belirleyebiliriz:
def bl(bir, iki, kip=True):
if kip == True:
print(bir / iki)
if kip == False:
print(bir // iki)

// ve / i
slelerinin farkn daha nceki derslerimizde grm
stk. // i
slecini kullanarak
blme i
slemi yapt
gmzda elde etti
gimiz sonu bir tamsay oluyor. Yani blme i
sleminin sonucu
ondalk ksm iermeyecek s
ekilde veriliyor...
Varsaylan de
gerli fonksiyonlar tanmlarken dikkat etmemiz gereken nemli bir kural var. Bu
tr fonksiyonlarda varsaylan de
gerin, parametre sralamasnda en sonda gelmesi gerekiyor.
Yani s
yle bir s
ey yazamayz:
def bl(kip = True, bir, iki):

E
ger varsaylan de
gerli argman en sona de
gil de ba
sa veya ortaya alrsak Python bize s
yle
bir hata verir:
SyntaxError: non-default argument follows default argument

Yani:
SzdizimiHatas: varsaylan de
gersiz argman, varsaylan de
gerli argmandan sonra geliyor

Dolaysyla kural olarak, varsaylan de


gere sahip argmanlar parametre listesinin en sonuna
yerle
stirmeye zen gstermemiz gerekiyor...

10.4 Sral Argmanlar


nceki blmlerden birinde, parametre gerektiren bir fonksiyonu parametresiz olarak
a
grd
gmzda s
yle bir hata alm
stk:
TypeError: bas() takes exactly 1 positional argument (0 given)

I
ste bu dersimizde bu sral argman (positional argument) ifadesinin neye kar
slk geldi
gini

grenece
giz.
Esasnda s
imdiye kadar verdi
giniz fonksiyon rneklerinde o
gunlukla sral argmanlardan
yararlandk. Sral argmanlar, bir fonksiyon iinde, bulundu
gu konuma, yani srasna gre
belirtilen argmanlardr. Bu ne demek oluyor? Daha nce yapt
gmz s
u rne
ge bakalm:
def deneme(bir, iki, liste, lt):
sonu = bir * iki
if bir and iki != lt:
liste.append(sonu)
else:
print("{0} ile arpmaya izin vermiyoruz!".format(lt))

print(liste)

geler = []
deneme(23, 5,
geler, 4)

Burada deneme() fonksiyonunu a


grrken bir, iki, liste ve lt parametrelerinin hangi
srayla dizildi
gine dikkat etmeliyiz. Yani iki parametresine yazmamz gereken s
eyi liste
parametresinin yerine yazamayz. Bu tr parametrelere sral parametreler veya sral argmanlar ad verilir. Dolaysyla, adlarndan da anla
slaca
g gibi, bu argmanlarn fonksiyon iindeki sras nemlidir. Mesela range() fonksiyonunu d
snelim:
for i in range(1, 10, 2):
print(i)

Burada range() fonksiyonuna verdi


gimiz 1 parametresi saymaya katan ba
slayaca
gmz,
10 parametresi ise saymay kata bitirece
gimizi gsterir. En sonda verdi
gimiz 2 parametresi ise kaar kaar sayaca
gmz gsterir. Bu parametrenin, fonksiyon iinde bulundu
gu
sra nemlidir. Yani bu saylarn srasn de
gi
stirirsek farkl sonular elde ederiz...
Sral argmanlarn ok fazla bir zelli
gi yoktur. Burada dikkat etmemiz gereken tek s
ey,
parametrelerin konumunu ve srasn kar
strmamaktr. nk farkl sralandrmalar farkl
sonular ortaya karabilir. Bu basit konuyu da gzden geirdi
gimize gre ilerlemeye devam
edebiliriz.

10.5 Isimli Argmanlar


Bir nceki blmde sral argmanlar grm
stk. Kar
smza kacak fonksiyonlar ve bizim
kendi yazacaklarmz genellikle sral argmanlara sahip fonksiyonlar olacaktr... Ancak baz
durumlarda sral argmanlar bize birtakm zorluklar karabilir. zellikle bir fonksiyonun
ok sayda sral argmana sahip oldu
gu durumlarda parametrelerin neler oldu
gunu, bunlarn
saysn ve srasn hatrlamak hi de kolay olmayabilir. I
ste bu tr durumlarda, fonksiyonlarn
argmanlarn isimleriyle a
grma yoluna gidebiliriz... Hemen bir rnek verelim:
def deneme(bir, iki, liste, lt):
sonu = bir * iki
if bir and iki != lt:
liste.append(sonu)
else:
print("{0} ile arpmaya izin vermiyoruz!".format(lt))
print(liste)

geler = []
deneme(lt=23, bir=5, liste=
geler, iki=4)

Grd
gnz gibi, argmanlar isimleriyle a
grarak, yani isimli argmanlar kullanarak
kendimizi argmanlarn srasn ezberleme zahmetinden kurtarm
s oluyoruz...
Burada da kulland
gmz isimli argmanlar isimsiz argmanlardan sonra getirmeye dikkat ediyoruz. Aksi halde Python bize bir hata mesaj gsterecektir. Dolaysyla yukardaki fonksiyonu
a
sa
gdaki s
ekilde a
grmamz mmkn de
gildir:
deneme(lt=23, bir=5, liste=
geler, 4)

Buradaki sorun, isimli argmanlar olan lt, bir ve listenin; isimsiz bir argman olan 4ten
nce gelmesidir... Byle bir durumda programmz hata verecektir.

10.6 Rastgele Sayda Isimsiz Argman Verme


Hatrlarsanz birka blm nce s
yle bir fonksiyon tanmlam
stk:
def arp(liste):
a = 1
for i in liste:
a = i * a
print(a)

Bu fonksiyon, liste halinde verilmi


s saylar birbiriyle arpma vazifesi gryordu. Biz bu fonksiyonu, Pythondaki sum() adl fonksiyona zenerek yazm
stk. Hatrlarsanz bu sum() fonksiyonu kendisine verilen liste halindeki saylar birbiriyle toplayabiliyordu. Bizim tanmlad
gmz
arp() fonksiyonu da buna benzer s
ekilde, kendisine verilen liste halindeki saylar birbiriyle
arpabiliyor... Ancak arp() ve sum() adl fonksiyonlarn nemli bir eksikli
gi var. Bildi
gimiz
gibi, sum() fonksiyonunu s
u s
ekilde kullanyoruz:
li = [2, 3, 4]
sum(li)

Ayn s
ekilde, yukarda tanmlad
gmz arp() fonksiyonunu da s
yle kullanyoruz:
li = [2, 3, 4]
arp(li)

Ancak biz bu iki fonksiyonu mesela s


yle kullanamyoruz:
sum(2, 3, 4)

...veya...
arp(2, 3, 4)

Bu fonksiyonlar yukardaki s
ekilde a
grmay denedi
gimizde Python bize hata mesaj gsterecektir.
arp() fonksiyonu s
yle bir hata verir:
TypeError: arp() takes exactly 1 positional argument (3 given)

Yani:
TipHatas: arp() tam tamna 1 adet sral argman alr (3 adet verilmi
s)

sum() fonksiyonu ise s


u hatay verir:
TypeError: sum expected at most 2 arguments, got 3

Yani:
TipHatas: sum en fazla 2 argman almay beklerken 3 argman alm
s

Grd
gnz gibi, ne sum() ne de arp() fonksiyonu kendilerine verilen 2, 3 ve 4 saylar
zerinde i
slem yapabiliyor. Biz burada sum() fonksiyonuna mdahale edemeyiz, ama istersek
arp() fonksiyonuna byle bir yetenek kazandrabiliriz.

ncelikle s
u basit fonksiyonu inceleyelim:
def bas(isim):
print("merhaba", isim)

E
ger tanmlad
gmz bu fonksiyonu Frat parametresiyle al
strrsak s
yle bir sonu alrz:
bas("Frat")
merhaba Frat

Bu fonksiyonu birden fazla argman ile al


stramayz. nk fonksiyonu tanmlarken yalnzca tek bir parametre belirledik (isim). E
ger birden fazla argmanla al
strmak istersek,
istedi
gimiz argman says kadar parametreyi fonksiyon tanm iine yerle
stirmeliyiz:
def seksenler(bir, iki, ):
print("bir {0}, bir {1}, bir de {2} alaca
gm!".format(bir, iki, ))
seksenler("kalem", "pergel", "ikolata")

Peki ya parametre saysn belirtmeden, istedi


gimiz kadar argmana izin vermek istersek ne
olacak? S
u rne
gi daha nce de vermi
stik:
def arp(saylar):
a = 1
for i in saylar:
a = a * i
print(a)
li = [2, 3, 4]
arp(li)

Grd
gnz gibi, birden fazla sayy birbiriyle arpabilmek iin bunlar nce bir liste haline
getirmemiz gerekiyor (demet haline de getirebiliriz...). arp(2, 3, 4) gibi bir s
ey yazd
gmzda
hata alaca
gmz biliyoruz. I
ste s
imdi bu engeli nasl a
saca
gmz grece
giz. Dikkatlice bakn:
def arp(*saylar):
a = 1
for i in saylar:
a = a * i
print(a)
arp(2, 3, 4)

Burada tek fark, parantez iindeki saylar parametresinin solundaki ufack bir * i
saretinden
ibaret. Bu yldz i
sareti, fonksiyonumuzun alabilece
gi kadar parametreyi alabilmesini sa
glar.
Hatta bu i
saret, fonksiyonumuzu parametresiz olarak da a
grmamza olanak tanr. Bu arada
ek bilgi olarak, bir fonksiyonun en fazla 255 parametre alabilece
gini syleyelim...
Yldz i
sareti, fonksiyona argman olarak verilen btn de
gerlerin bir demet haline getirilmesini
sa
glar. Bunu s
u s
ekilde teyit edebiliriz:
def arp(*saylar):
print(saylar)
arp(2, 3, 4)

Bu kodlar al
strd
gmzda s
yle bir kt elde ederiz:

(2, 3, 4)

ktdaki parantez i
saretlerinden de anlad
gmz gibi, bu fonksiyon bize bir demet veriyor...
Aslnda burada olan s
ey, basit bir demetleme (tuple packing) i
sleminden ibarettir. Yazd
gmz
fonksiyonlarda * i
saretini kulland
gmz zaman, Python fonksiyona argman olarak verilen

geleri bir demet haline getirir. Bylece demet haline gelmi


s bu
geler birbirleriyle i
sleme
sokulabilir.
Pythondaki bu zelli
gin yapsn gsteren basit bir rnek verelim:
def test(arg, *arglar):
print("Bu fonksiyondaki sral argmanmz
sudur: ", arg)
print("Bu fonksiyondaki isimsiz argmanlarmz
sunlardr: ", *arglar)
test("bir", "iki", "", "drt", "be
s")

Yukardaki fonksiyon bir adet sral argman ve rastgele sayda isimsiz argman alyor. Bu
arada, isimsiz argman sz kafanz kar
strmasn. Aslnda isimsiz argman dedi
gimiz s
ey
sral argmann ta kendisidir... Ancak yldzl yaplarda sra sz konusu olmad
g iin, bu
argmanlar sral argman yerine isimsiz argman (non-keyword argument) olarak adlandryoruz. E
ger istersek yukardaki test fonksiyonunu s
yle de yazabiliriz:
def test(arg, *arglar):
print("Bu fonksiyondaki sral argmanmz
sudur: ", arg)
for i in arglar:
print("Bu fonksiyondaki isimsiz argmanlardan biri
sudur: ", i)
test("bir", "iki", "", "drt", "be
s")

Bu yldz i
saretini yukarda gsterdi
gimiz s
ekilde fonksiyonun tanmland
g srada kullanabilece
gimiz gibi, fonksiyonu a
grma a
samasnda da kullanabiliriz. Yani s
yle bir s
ey yazabiliriz:
def test(arg, *arglar):
print("Bu fonksiyondaki sral argmanmz
sudur: ", arg)
for i in arglar:
print("Bu fonksiyondaki isimsiz argmanlardan biri
sudur: ", i)
li = ["bir", "iki", "", "drt", "be
s"]
test(*li)

Burada test() adl fonksiyonu a


grrken, argmanlar do
grudan parantez iine yazmak yerine, bu argmanlar li adl bir liste iinde topladk. Ardndan da test() fonksiyonu iinde bu
li adl listeyi yldz i
saretiyle birlikte kullanarak istedi
gimiz sonucu elde ettik.
Yldz i
saretini, yukarda anlattklarmzdan farkl bir i
slevi yerine getirmek iin de kullanabiliriz.
Bu i
slevin ne oldu
gunu isterseniz bir rnek zerinde grelim...
Hatrlarsanz, isimli argmanlar kullanarak s
yle bir s
ey yazabiliyorduk:
def topla(bir, iki):
print(bir + iki)

Tanmlad
gmz bu fonksiyonu s
u s
ekilde a
grabiliriz:
topla(bir=3, iki=5)

Bildi
giniz gibi, isimli argmanlar kullanmak, fonksiyon parametrelerini istedi
gimiz bir srada
kullanmamza olanak veriyor. Yani yukardaki topla() adl fonksiyonu s
u s
ekilde de a
grabiliyoruz:
topla(iki=5, bir=3)

Isimli argmanlar bizi parametre srasn ezberleme zahmetinden kurtaryor. Ama elbette istersek biz yukardaki fonksiyonu s
u s
ekilde de a
grabiliriz:
topla(3, 5)

Bu fonksiyonu bu s
ekilde a
grd
gmzda, bir ve iki adl parametreleri sral argman olarak
kullanm
s olduk. Dolaysyla, topla() fonksiyonuna verdi
gimiz 3 argman bir parametresinin; 5 argman ise iki adl parametrenin yerini tutmu
s oldu... Gelelim yldz i
saretinin
burada anlatt
gmz durumla ne ilgisi oldu
guna...
Grd
gnz gibi, tanmlad
gmz fonksiyonlarn parametrelerini hem isimli hem de sral argman olarak kullanabiliyoruz. Ancak baz durumlarda, kullancnn sadece isimli argmanlar
kullanmasna izin vermek istiyor olabiliriz... Mesela yukardaki rnekte s
yle bir kullanma
msaade etmek istemiyor olabiliriz:
topla(3, 5)

Biz istiyoruz ki topla() fonksiyonu sadece isimli argmanlar ile a


grlabilsin... E
ger iste
gimiz
sadece isimli argmanlara msaade etmek ise s
yle bir yol izleyebiliriz:
def topla(*, bir, iki):
print(bir + iki)

Kodlarmz bu s
ekilde yazd
gmzda, yldz i
saretinin sa
gnda kalan btn parametrelerin,
fonksiyonun a
grlmas esnasnda isimli argman olarak kullanlmalar gerekir. Dolaysyla
yukardaki topla() fonksiyonunu ancak s
u s
ekilde kullanabiliriz:
topla(bir=4, iki=6)

Yani sadece s
yle bir yazm bizi hsrana u
gratacaktr:
topla(4, 6)
TypeError: topla() takes exactly 0 positional arguments (2 given)

Burada ald
gmz hata mesaj bize s
yle diyor:
TipHatas: topla() tam tamna 0 adet sral argman alr (2 adet verilmi
s)

Grd
gnz gibi, topla() fonksiyonunu kullanabilmek iin mutlaka isimli argmanlar kullanmamz gerekiyor. Parametrelerin en ba
sna yerle
stirdi
gimiz * i
sareti sayesinde, bu i
saretin
sa
gnda kalan hi bir parametreyi isimsiz olarak kullanamyoruz...
Bu arada, hatrlarsanz, bu blmn en ba
snda s
yle bir fonksiyon yazm
stk:
def arp(*saylar):
a = 1
for i in saylar:
a = a * i
print(a)
arp(2, 3, 4)

Yldzl parametre sayesinde bu fonksiyonu a


grrken istedi
gimiz sayda argman kullanabiliyoruz. Ancak bu fonksiyonun bir problemi var. Bu fonksiyona argman olarak tek tek
geler
de
gil de bir liste (veya demet) verirsek bekledi
gimiz kty alamyoruz:
def arp(*saylar):
a = 1
for i in saylar:
a = a * i
print(a)
li = [2, 3, 4]
arp(li)
[2, 3, 4]

Grd
gnz gibi, fonksiyonumuz 2, 3 ve 4 saylarn birbirleriyle arpmak yerine bu saylar
ekrana bast... Ama bizim istedi
gimiz s
ey bu de
gil. Burada yle bir kod yazalm ki, kullanc
argmanlar liste halinde de verse, tek tek de yazsa, arp() fonksiyonumuz btn saylar
birbiriyle arpabilsin...
def arp(*saylar):
a = 1
try:
for k in saylar[0]:
a = a * k
print(a)
except TypeError:
for v in saylar:
a = a * v
print(a)

Artk arp() fonksiyonuna argman olarak ister liste verelim, ister tek tek
ge yazalm,
fonksiyonumuz btn
geleri ba
saryla arpacak ve sonucu ekrana basacaktr... Yukardaki
kodlarda neler olup bitti
gini anlayabilmek iin isterseniz bu kodlar biraz daha yakndan inceleyelim. ncelikle saylar adl parametrenin ne kt verdi
gini kontrol edelim:
def arp(*saylar):
print(saylar)

S
imdi bu fonksiyonu bir liste ile a
gralm:
li = [2, 3, 4]
arp(li)

Buradan s
u kty alyoruz:
([2, 3, 4],)

Grd
gnz gibi, ktmz tek
geli bir demet... Bu demetin mevcut tek
gesi de bir liste... Bu
listenin
gelerine eri
smek iin fonksiyonumuzu s
yle yazmamz gerekiyor:
def arp(*saylar):
for k in saylar[0]:
print(k)

S
imdi fonksiyonumuzu a
gryoruz:
li = [2, 3, 4]
arp(li)

2
3
4

Grd
gnz gibi, bu s
ekilde listenin btn
gelerini tek tek aldk... Tek tek ald
gmz bu
geleri
birbirleriyle arpmak iin s
yle bir s
ey yazmamz gerekti
gini biliyoruz:
def arp(*saylar):
a = 1
for k in saylar[0]:
a = a * k
print(a)
li = [2, 3, 4]
arp(li)

Kodlarmz bu s
ekilde yazd
gmzda, e
ger arp() fonksiyonuna argman olarak bir liste
verirsek fonksiyonumuz sorunsuz bir s
ekilde al
sacaktr. Ama e
ger argman olarak tek tek
saylar yazarsak Python bize bir hata mesaj gsterecektir:
arp(2, 3, 4)
TypeError: int object is not iterable

nk daha nce de grd


gmz gibi, int (say) veri tipi dnglenebilen bir nesne de
gildir.
Dolaysyla int veri tipi zerinde bir for dngs kuramyoruz... O halde bizim burada yapmamz gereken, bu hatay yakalayp buna gre bir i
slem yapmak... Yani kodlarmz taslak
olarak s
yle grnmeli:
def arp(*saylar):
a = 1
try:
for k in saylar[0]:
a = a * k
print(a)
except TypeError:
pass

Burada pass ile gsterdi


gimiz yere uygun kodlar yazaca
gz... O ksma, bu blmn en
ba
snda gsterdi
gimiz kodlar yazmamz yeterli olacaktr:
def arp(*saylar):
a = 1
try:
for k in saylar[0]:
a = a * k
print(a)
except TypeError:
for v in saylar:
a = a * v
print(a)

Bylelikle, TypeError adl hata alnd


gnda, Python arp() fonksiyonuna verilen argmanlarn dnglenebilen bir nesne olmad
gn anlayacak ve bu argmanlar alp dnglenebilen
bir nesne olan demete dn
strecektir...

10.7 Rastgele Sayda Isimli Argman Verme


Bir nceki blmde fonksiyonlar kullanarak, nasl rastgele sayda isimsiz argman verebilece
gimizi
grenmi
stik. Bu blmde ise rastgele sayda isimli argman verme konusunu inceleyece
giz.
Bildi
giniz gibi isimli argmanlar, adndan da anla
slaca
g gibi, bir isimle birlikte kullanlan argmanlardr. rne
gin s
u fonksiyonda isimli argmanlar kullanlm
str:
def adres_defteri(isim, soyisim, telefon):
defter = {}
defter["isim"] = isim
defter["soyisim"] = soyisim
defter["telefon"] = telefon
for k, v in defter.items():
print("{0}\t:\t{1}".format(k, v))
adres_defteri(isim="Frat", soyisim="zgl", telefon="02122121212")

Burada ncelikle defter adl bir szlk tanmladk. Adres bilgilerini bu szlk iine kaydece
giz. Daha sonra bu defter adl szlk iinde yer alacak alanlar belirliyoruz. Yazd
gmz
kodlara gre defter adl szlk iinde isim, soyisim ve telefon olmak zere farkl alan
bulunacak. Fonksiyon parametresi olarak belirledi
gimiz isim, soyisim ve telefon
gelerine kar
slk gelen de
gerler, defter adl szlkteki ilgili alanlara yerle
stirilecek.
Daha sonra gelen satrda s
yle bir kod gryoruz:
for k, v in defter.items():
print("{0}\t:\t{1}".format(k, v))

Burada defter szl


gnn items() metodunu kullanarak, szlk iindeki anahtar ve
de
ger iftlerini birer demet halinde alyoruz. E
ger yukardaki kodu s
yle yazacak olursanz
neler olup bitti
gi biraz daha netle
secektir:
for
geler in defter.items():
print(
geler)
(soyisim, zgl)
(adres,
Istanbul)
(telefon, 02122121212)
(eposta, firatozgul@frtzgl.com)
(cep, 05994443322)
(isim, Frat)

Grd
gnz gibi, yukardaki kod bize defter adl szl
gn anahtar ve de
ger iflerini ieren
birer demet veriyor. for k, v in defter.items() satr ile bu demetlerdeki
gelere tek tek
eri
sebiliyoruz. Burada k harfi, demetlerin ilk
gelerini, v harfi ise ikinci
gelerini temsil
ediyor. Alt satrdaki print({0}t:t{1}.format(k, v)) kodu yardmyla yapt
gmz s
ey, k ve
v ile temsil edilen
geleri biraz biimlendirerek ekrana basmaktan ibaret... Bu satr iinde
grd
gmz \t harflerinin ne i
se yarad
gn biliyoruz. Bunlar karakter dizileri iine sekme
(tab) eklemek iin kullanlan ka
s dizileridir.
Bu fonksiyona gre, isim, soyisim ve telefon alanlarn doldurarak fonksiyonu al
sr hale
getirebiliyoruz. S
imdi yukardaki fonksiyona s
yle bir ekleme yapalm:

def adres_defteri(isim, soyisim, telefon, **arglar):


defter = {}
defter["isim"] = isim
defter["soyisim"] = soyisim
defter["telefon"] = telefon
for i in arglar.keys():
defter[i] = arglar[i]
for k, v in defter.items():
print("{0}\t:\t{1}".format(k, v))
adres_defteri(isim="Frat",
soyisim="zgl",
telefon="02122121212",
eposta="firatozgul@frtzgl.com",
adres="
Istanbul",
cep="05994443322")

Burada yapt
gmz eklemeler sayesinde adres_defteri() adl fonksiyona isim, soyisim
ve telefon parametrelerini yerle
stirdikten sonra istedi
gimiz sayda ba
ska isimli argmanlar
da belirtebiliyoruz. Burada **arglar parametresinin bir szlk (dictionary) oldu
guna zellikle
dikkat edin. Bu parametre bir szlk oldu
gu iin, szlklerin btn zelliklerine de do
gal olarak
sahiptir. Yukardaki kodlar s
u s
ekilde yazarak, arka planda neler olup bitti
gini daha ak bir
s
ekilde grebiliriz:
def adres_defteri(isim, soyisim, telefon, **arglar):
print("isim:\n\t", isim)
print("soyisim:\n\t", soyisim)
print("telefon:\n\t", telefon)
print("teki argmanlar:\n\t", arglar)
adres_defteri(isim="Frat",
soyisim="zgl",
telefon="02122121212",
eposta="firatozgul@frtzgl.com",
adres="
Istanbul",
cep="05994443322")

Bu kodlar al
strd
gmzda s
una benzer bir kt alaca
gz:
isim:
Frat
soyisim:
zgl
telefon:
02122121212
teki argmanlar:
{adres:
Istanbul,
eposta: firatozgul@frtzgl.com,
cep: 05994443322}

Grd
gnz gibi, arglar parametresi bize bir szlk veriyor. Dolaysyla s
yle bir kod yazmamz mmkn olabiliyor:

for i in arglar.keys():
defter[i] = arglar[i]

Bu kodlar yardmyla arglar adl szl


gn
gelerini defter adl szl
ge ekliyoruz. Bu yapnn
kafanz kar
strmasna izin vermeyin. Aslnda yapt
gmz s
ey ok basit. Szlkler konusunu
anlatrken verdi
gimiz s
u rne
gi hatrlayn:
szlk = {}
szlk["ayakkab"] = 2
szlk["elbise"] = 1
szlk["gmlek"] = 4

Bu rnekte szlk adl szl


ge ayakkab, elbise ve gmlek adl
geler ekliyoruz. Bu

gelerin de
gerini srasyla 2, 1 ve 4 olarak ayarlyoruz. Dedi
gim gibi, yukardaki rnek
for i in arglar.keys()... satryla yapt
gmz s
eyden farkl de
gildir. S
yle d
snn:
defter = {}
defter["adres"] = "
Istanbul"
defter["eposta"] = "firatozgul@frtzgl.com"
defter["cep"] = "05994443322"

defter[i] dedi
gimiz s
ey, adres, eposta ve cep
gelerine; arglar[i] dedi
gimiz s
ey ise
Istanbul, firatozgul@frtzgl.com ve 05994443322
gelerine kar
slk geliyor.
Grd
gnz gibi, ift yldzl parametreler fonksiyonlara istedi
gimiz sayda isimli argman ekleme imkan tanyor bize... Dedi
gim gibi, bu parametreler bir szlk oldu
gu iin yukardaki
rne
gi s
u s
ekilde de yazabilirsiniz:
def adres_defteri(isim, soyisim, telefon, **arglar):
defter = {}
defter["isim"] = isim
defter["soyisim"] = soyisim
defter["telefon"] = telefon
for i in arglar.keys():
defter[i] = arglar[i]
for k, v in defter.items():
print("{0}\t:\t{1}".format(k, v))
szlk = {"eposta": "firatozgul@frtzgl.com",
"adres": "
Istanbul",
"cep": "05994443322"}
adres_defteri(isim="Frat",
soyisim="zgl",
telefon="02122121212",
**szlk)

Burada szl
g nceden tanmlad
gmza ve bunu fonksiyonu a
grrken do
grudan argman
olarak ekledi
gimize dikkat edin. Ayrca szlk argmann fonksiyona yazarken yine ift
yldzl yapy kullanmay da unutmuyoruz.

10.8 Gml Fonksiyonlar


Pythondaki baz fonksiyonlara gml fonksiyonlar ad verilir. rne
gin daha nceki derslerimizde grd
gmz range(), sum(), len() gibi fonksiyonlar bu snfa girer. Bu fonksiyonlara gml fonksiyonlar denmesinin nedeni, adndan da anla
slaca
g gibi, bu fonksiyonlarn Pythonun iine tam anlamyla gml olmasdr... Gml fonksiyonlarn kar
st kullanc tanml fonksiyonlardr. Kullanc tanml fonksiyonlar, yine adndan anla
slaca
g gibi, kullancnn bizzat kendisi tarafndan tanmlanm
s, el yapm fonksiyonlardr... rne
gin bir nceki
blmde tanmlam
s oldu
gumuz arp() fonksiyonu kullanc tanml bir fonksiyondur. Kullanc
tanml fonksiyonlarn aksine gml fonksiyonlar Pythonu geli
stiren ki
siler tarafndan tanmlanm
s ve Pythonun iine yerle
stirilmi
stir. Gml fonksiyonlar istedi
gimiz her an kullanlabilir
vaziyettedir. Yani mesela len() fonksiyonunu, yazd
gmz bir program iinde kullanabilmek
iin bu fonksiyonu programmz iinde yeniden tanmlamamza gerek yoktur. Kullanc tanml
fonksiyonlar ise iki s
ekilde kullanabiliriz. Bu fonksiyonlar ya mevcut program iinde bir yerlerde tanmlam
s olmalyz, ya da e
ger bu fonksiyon ba
ska bir dosya iinde tanmlanm
ssa, o
dosyay (yani modl) mevcut programmz iine aktarmalyz. Bu modl ve ie aktarma
kavramlarnn kafanz kar
strmasna izin vermeyin. Birka blm sonra bu kavramlarn ne
anlama geldi
gini ayrntl bir s
ekilde inceleyece
giz. Burada amacmz sizi sadece gml
fonksiyonlarn varl
g konusunda bilgilendirmekten ibaret...
Pythondaki btn gml fonksiyonlarn listesini http://docs.python.org/dev/3.0/library/functions.html
adresinde bulabilirsiniz. Orada da grece
giniz gibi, listedeki gml fonksiyonlarn bir ksmn
zaten biliyoruz...
Pythondaki gml fonksiyonlarn zelli
gi,
bu fonksiyonlarn kaynak kodlarnn
Pythonla yazlmam
s olmasdr.
Bu fonksiyonlar Python geli
sticileri tarafndan
C dili kullanlarak yazlm
str.
Gml fonksiyonlarn tanmland
g C dosyasna
http://svn.python.org/view/python/trunk/Python/bltinmodule.c?view=markup&pathrev=52315
adresinden eri
sebilirsiniz.
Bu fonksiyonlar C dili ile yazld
g iin son derece hzl ve performansl al
srlar. Dolaysyla
e
ger yapmak istedi
giniz bir i
slem iin uygun bir hazr fonksiyon varsa, gerekli i
slevi yerine
getiren fonksiyonu kendiniz yazmak yerine Python iindeki o hazr fonksiyonu kullanmalsnz.

10.9 Fonksiyonlarn Kapsam ve global Deyimi


Bu blmde Pythondaki isim alan (namespace) ve kapsam (scope) kavramndan sz edece
giz biraz... Kabaca ifade etmek gerekirse isim alan denen s
ey, Pythondaki herhangi bir
nesnenin etki alandr. Pythondaki nesnelerin birer kapsama alan vardr. rne
gin Pythondaki
fonksiyonlar birer nesnedir. Esasnda Pythondaki her s
ey bir nesnedir. S
imdilik bu nesne
meselesini fazla kafanza takmayn. Bu konuyu yeri geldi
ginde esasl bir s
ekilde inceleyece
giz... Ne diyorduk? Evet, Pythondaki fonksiyonlar birer nesnedir ve bu nesnelerin de bir
kapsama alan vardr. Ya da ba
ska bir deyi
sle fonksiyonlar belirli bir isim alan iinde yer alr.
Hemen ufak bir rnek verelim:
def deneme():
say = 5
print(say)

Burada say adl de


gi
sken, deneme() adl fonksiyonun isim alan iinde yer alr. Yani bu
de
gi
skenin kapsam deneme() adl fonksiyonla snrldr. say adl de
gi
sken bu fonksiyonun
d
snda var olamaz. Peki bu ne anlama geliyor? Yukardaki kodlara s
yle bir ekleme yaparak
durumu birazck da olsa somutla
stralm:

def deneme():
say = 5
print(say)
print(say)

Bu kod parasn al
strd
gmzda Python bize s
yle bir hata mesaj gsterecektir:
NameError: name say is not defined

Yani:

IsimHatas: "say" ismi tanmlanmam


s

Halbuki biz say adl de


gi
skeni deneme() adl fonksiyonun iinde tanmlam
stk, de
gil mi?
Evet, biz bu de
gi
skeni deneme adl fonksiyon iinde tanmlam
stk. Ama nmzde s
yle
bir gerek var: Bu blmn ba
snda da syledi
gimiz gibi, Pythondaki nesnelerin bir kapsama
alan vardr. Yani bu nesneler bir isim alan iinde yer alr. Dolaysyla say adl de
gi
skenin
kapsam deneme() adl fonksiyonun isim alan ile snrldr. Yani bu de
gi
sken deneme() adl
fonksiyonun d
snda var olamaz... Bu deneme fonksiyonunun kapsama alan da fonksiyonun
ii ile snrldr.
S
imdi s
una bir bakalm:
def deneme():
say = 5
print("deneme() fonksiyonu iindeki say: ", say)
say = 10
print("deneme() fonksiyonu d
sndaki say: ", say)
deneme()

Grd
gnz gibi, say adl de
gi
skeni fonksiyon d
snda da kullanabilmek iin, bu de
gi
skeni
fonksiyonun d
snda da tanmlamamz gerekiyor. Yukarda iki farkl de
gerle gsterilen say
adl de
gi
skenler farkl isim alanlar iinde yer ald
g iin, ayn ada sahip olmalarna ra
gmen
birbirlerine kar
smyorlar. Aslnda isim alan kavram ok gzel bir zelliktir. Byk programlar yazarken isim alan kavramnn ok i
sinize yarad
gn greceksiniz. Bu kavram sayesinde
de
gi
skenlerin birbirine kar
smasn nleyebiliyoruz. Hele bir de ayn program zerinde farkl
ki
siler al
syorsa, bu isim alan zelli
gi hayat kurtarc olabilir...
Ancak baz durumlarda bir isim alan iinde yer alan bir de
gi
skene o isim alan d
sndan da
eri
sebilmeniz gerekebilir. Mesela s
yle bir s
ey yazmak isteyebilirsiniz:
def sor():
say1 = int(input("bir say: "))
say2 = int(input("ba
ska bir say: "))
def topla():
print(say1 + say2)
try:
sor()
except ValueError:
pass
else:
topla()

Burada say alma ve alnan bu saylar toplama i


slemleri iin ayr birer fonksiyon olu
sturduk.

Yukardaki yapya gre, sor() fonksiyonu iinde geen say1 ve say2 adl de
gi
skenleri
topla() fonksiyonu iinde i
sleme tabi tutabilmemiz gerekiyor. Ancak burada bir problem
var. Pythonun yaps gere
gince, sor() ve topla() adl fonksiyonlar farkl isim alanlarna,
dolaysyla da farkl kapsamlara sahip... Bundan tr, bu iki fonksiyon iindeki de
gi
skenlere
d
sardan eri
semiyoruz. Zaten yukardaki kodlar al
strd
gmzda Python bize bununla ilgili bir
hata mesaj gsterecektir...
Yukardaki sorunu a
sabilmek iin Python bize global adl bir ara sunuyor... global deyimi
yardmyla, bir isim alan iindeki de
gi
skenlere o isim alan d
sndan da eri
sebiliyoruz. Mesela
yukardaki rne
gi s
yle yazalm:
def sor():
global say1
global say2
say1 = int(input("bir say: "))
say2 = int(input("ba
ska bir say: "))
def topla():
print(say1 + say2)
try:
sor()
except ValueError:
pass
else:
topla()

Bu kodlarn ba
sna ekledi
gimiz global say1 ve global say2 ifadeleri sayesinde say1 ve
say2 adl de
gi
skenlere fonksiyon d
sndan da eri
silebilmesini sa
glyoruz. Yukardaki kodlar
al
strd
gmzda artk programmz hatasz bir s
ekilde grevini yerine getirecektir. Say d
snda
bir de
ger girilmesi durumunda dahi programmzn kmemesi iin try... except... bloklarndan yararland
gmza dikkat ediyoruz...
Bu arada e
ger istersek yukardaki global say1 ve global say2 ifadelerini birle
stirebiliriz:
def sor():
global say1, say2
...
...

Gelin isterseniz tandk bir program zerinde uygulayalm


grendiklerimizi...
def sor():
global say1
global say2
say1 = int(input("bir say: "))
say2 = int(input("ba
ska bir say: "))
def topla():
print(say1 + say2)
def kar():
print(say1 - say2)
def arp():

print(say1 * say2)
def bl():
try:
print(say1 / say2)
except ZeroDivisionError:
print("Bir sayy sfra blemezsiniz!")
print("""Topla >> 1
kar >> 2
arp >> 3
Bl
>> 4
k
s >> 5
""")
while True:
seenek = input("Yapmak istedi
giniz i
slem: ")
if seenek == "5":
break
else:
try:
sor()
except ValueError:
print("Yanl
s seenek!..")
else:
if seenek == "1":
topla()
elif seenek == "2":
kar()
elif seenek == "3":
arp()
elif seenek == "4":
bl()

Grd
gnz gibi, global deyimi epey i
se yaryor. Ancak size bu deyimle ilgili kt bir haberim
var. Bu deyim ne kadar faydalym
s gibi grnse de aslnda o
gu zaman i
sleri kar
strabiliyor.
S
yle bir rnek verelim:
a = 5
def de
gi
skeni_de
gi
stir():
a = 10
print("bu de
gi
sken fonksiyon iinde: ", a)
de
gi
skeni_de
gi
stir()
print("bu de
gi
sken fonksiyon d
snda: ", a)

Bu kodlar al
strd
gmzda s
yle bir kt alyoruz:
bu de
gi
sken fonksiyon iinde: 10
bu de
gi
sken fonksiyon d
snda: 5

Bir de s
una bakalm:
a = 5
def de
gi
skeni_de
gi
stir():
global a

a = 10
print("bu de
gi
sken fonksiyon iinde: ", a)
de
gi
skeni_de
gi
stir()
print("bu de
gi
sken fonksiyon d
snda: ", a)

Bu kodlar ise bize s


yle bir kt veriyor:
bu de
gi
sken fonksiyon iinde: 10
bu de
gi
sken fonksiyon d
snda: 10

Grd
gnz gibi, fonksiyon iindeki i
slem fonksiyonun d
s blgesini de etkiledi ve normalde
de
geri 5 olmas gereken a adl de
gi
skeni de
gi
sikli
ge u
gratt. global deyimi bu zelli
ginden tr hi beklenmedik bir anda programnz allak bullak edebilir. zellikle byk boyutlu
ve birden fazla ki
sinin zerinde al
st
g programlarda global deyimi zccaciye dkkanna fil
girmi
s gibi bir etki yaratabilir... O yzden Python programclar genellikle global deyimini kullanmaktan kanr. Hatta Python camiasnda s
yle bir sz vardr: E
ger yazd
gnz programda
global deyimini kullanmanz gerekti
gini d
snyorsanz, programnz gzden geirmenizin
zaman gelmi
s demektir!
Pythonda global yerine benimseyebilece
gimiz daha sa
glkl yollar vardr. Mesela snfl
yaplar kullanmak gibi... Hi endi
se etmeyin. Yeri geldi
ginde snfl yaplar da enine boyuna
inceleyece
gimizden emin olabilirsiniz. Peki global deyimini hangi durumlarda kullanmamzn
bir sakncas yoktur? Esasnda, dedi
gimiz gibi, en iyisi ki
sinin kendini global deyimine hi
al
strmamasdr. Ama e
ger u
gra
st
gnz kod ufak boyutlu bir s
eyse ve sizden ba
ska kimsenin
bu kodlar zerinde al
smayaca
gndan eminseniz, o anda kar
sla
st
gnz bir sorunu zmek iin
global deyimine ba
svurmay tercih edebilirsiniz... Elbette global deyimini kullanmak gnah
de
gildir! Sadece, bunu kullanmak iyi bir programclk tekni
gi olarak kabul edilmez...

10.10 return Deyimi


Bu blmde inceleyece
gimiz bir ba
ska nemli konu da return deyimi olacak. return kelime
olarak dndrmek anlamna gelir. Ama dndrmek derken bir s
eyi kendi etrafnda evirmeyi kastetmiyoruz. Buradaki dndrmek ifadesi daha ok iade etmek veya vermek
kavramna yakndr... Peki fonksiyonlarla bu kavramn ne ilgisi olabilir? Isterseniz bunu bir
rnekle grmeye al
salm:
bool(5>2)
True

Burada bool() fonksiyonunu kullanarak 5 saysnn 2 saysndan byk olup olmad


gn
sorguladk. bool() fonksiyonu da bize kar
slk olarak True de
gerini verdi. I
ste bu durum iin,
bool() fonksiyonu True de
gerini dndrd, diyoruz... S
u rne
ge bakalm:
li = [2, 3, 4]
sum(li)
9

Burada da sum() fonksiyonu bir say dndryor...


I
ste return deyimi Pythonda bu anlama geliyor. Yani kabaca bir fonksiyonun de
ger retmesi,
bir sonu ortaya karmas dndrmek (return) olarak adlandrlyor. Peki biz bu deyimi fonksiyonlarmz iinde nasl kullanaca
gz? Daha do
grusu, fonksiyonlarmzn bir de
ger

dndrmesini nasl sa
glayaca
gz? Esasnda Pythondaki btn fonksiyonlar, biz belirtsek de
belirtmesek de mutlaka bir de
ger dndrr. S
u rne
gi inceleyelim:
def bas(kelime):
print(kelime)
a = bas("www.istihza.com")
print(a)

Bu kodlar al
strd
gmzda s
yle bir sonu elde edece
giz:
www.istihza.com
None

I
ste bu ktda grd
gmz None,
yazd
gmz fonksiyonun dn
s de
geridir.
www.istihza.com ise fonksiyon iinde yazd
gmz print() fonksiyonunun marifetidir ve
onun yapt
g s
ey returnun yapt
g s
eyden farkldr. return ile print() ayn s
eyler de
gildir
ve ayn i
slevi grmezler.
Yukardaki rne
ge gre, Pythondaki btn fonksiyonlar bir de
ger dndryor. zel olarak bir
dn
s de
geri belirtilmezse, fonksiyonun dndrece
gi de
ger None olacaktr. Eee, ne olmu
s?
dedi
ginizi duyar gibiyim... Konuyu biraz daha somutla
strmak iin s
yle bir rnek verelim:
def santtan_faha(sant):
fah = sant * (9/5) + 32
return fah

Burada kendisine verilen santigrat dereceyi fahrenhayta eviren bir uygulama yazdk... Bu
fonksiyonu s
u s
ekilde a
gryoruz:
print(santtan_faha(22))

Yani kodlarmz tam olarak s


yle grnecek:
def santtan_faha(sant):
fah = sant * (9/5) + 32
return fah
print(santtan_faha(22))

Buradan s
u kty alyoruz:
71.6

Demek ki 22 santigrat derece 71.6 fahrenhayta kar


slk geliyormu
s... Neyse... I
sin bizi ilgilendiren asl ksm bu de
gil. Biz buradaki return deyiminin ne i
se yarad
gn anlamaya
al
syoruz.
Burada fonksiyonu nasl a
grd
gmza dikkat edin. Daha nceki fonksiyonlarmzda s
yle bir
a
grma s
ekli kullanyorduk:
santtan_faha(22)

Burada print() fonksiyonunu kullanmad


gmza zellikle dikkatinizi ekmek isterim. Peki neden nceki rneklerde print() kullanmadk da yukardaki rnekte print() kullandk? nceki
rneklerde print() kullanmamamzn nedeni, o rneklerde hep fonksiyon iinde print()i
kullanm
s olmamzdr. Yani nceki rneklerde yazd
gmz fonksiyonlar zaten belli bir de
geri
ekrana basyordu. Yukardaki fahrenhayt fonksiyonunda ise fonksiyon iinde herhangi bir
print() i
slemi yapmadk. Dolaysyla fonksiyonumuz kendi ba
sna herhangi bir de
geri ekrana
basma zelli
gine sahip de
gil. Bu fonksiyonun grevi fah de
gi
skenini dndrmekten

ibaret... Mesela daha nce bahsetti


gimiz, gml fonksiyonlardan biri olan sum() fonksiyonu da ekrana herhangi bir de
ger basmaz. Bu fonksiyonun grevi kendisine parametre olarak
verilen dnglenebilir nesnenin
gelerinin toplamn dndrmektir. Grelim:
li = [2, 3, 4]
sum(li)

Bu kodlar do
grudan bir dosyaya kaydedip al
strd
gmzda herhangi bir kt almayz. nk
sum() fonksiyonu kendi ba
sna herhangi bir de
geri ekrana basmaz. Bu fonksiyonun bir de
geri
ekrana basabilmesi iin s
yle bir s
ey yapmamz gerekir:
print(sum(li))

Aynen sum() fonksiyonunda oldu


gu gibi, yukarda tanmlad
gmz santtan_faha() adl
fonksiyon da ekrana herhangi bir de
ger basmyor. Bu fonksiyon sadece fah adl de
gi
skenin
de
gerini dndryor. Fonksiyonumuzun dndrd
g bu de
gerle ne yapaca
gmz tamamen
bize kalm
s. Biz bu de
geri istersek ekrana basarz, istersek bununla ba
ska i
slemler yaparz. Bu
durumu biraz aklayalm. S
u rne
ge bakn:
def santtan_faha(sant):
fah = sant * (9.0/5.0) + 32
return fah
print(santtan_faha(22)-1)

Bu fonksiyon bize s
u kty verir:
70.6

Burada santtan_faha() fonksiyonunun dndrd


g de
gerden 1 kardk...
fonksiyonu s
u s
ekilde tanmlayarak yapmaya al
salm:

Ayn i
slemi,

def santtan_faha(sant):
fah = sant * (9.0/5.0) + 32
print(fah)
print(santtan_faha(22)-1)

Grd
gnz gibi bu defa Python bize bir hata mesaj veriyor:
TypeError: unsupported operand type(s) for -: NoneType and int

Yani:
TipHatas: - i
saretinin desteklemedi
gi i
sleyen tr/trleri: "NoneType" ve "int"

Bu hata mesaj bize, birbiriyle karma i


slemi yapmann mmkn olmad
g
geler kulland
gmz
sylyor... Peki bu nasl oluyor?
Hatrlarsanz, Pythonda btn fonksiyonlarn bir de
ger dndrd
gn, e
ger biz zel olarak
herhangi bir de
ger dndrmezsek, dndrlecek de
gerin None olaca
gn sylemi
s ve bu
durumu da s
u s
ekilde teyit etmi
stik:
def bas(kelime):
print(kelime)
a = bas("www.istihza.com")
print(a)

Burada bas() fonksiyonu www.istihza.com karakter dizisini ekrana basyor, ama None
de
gerini dndryor. Yukarda hata verdi
gini grd
gmz santtan_faha() fonksiyonunda
da zel olarak herhangi bir de
ger dndrmedi
gimiz iin bu fonksiyon otomatik olarak None
de
gerini dndryor. Dikkat ederseniz, bu defa fah de
gi
skenini dndrmek yerine do
grudan
print()i kullanarak ekrana bastk. Yani burada de
geri dndrmedik, ama ekrana basmakla
yetindik. Bu yzden santtan_faha() fonksiyonunun dn
s de
geri None oldu. Dolaysyla
biz print(santtan_faha(22)-1) komutuyla sanki s
yle bir i
slem yapyormu
s gibi olduk:
print(None - 1)

Pythonun etkile
simli kabu
gunda None - 1 komutunu verdi
ginizde s
u hatay alacaksnz:
TypeError: unsupported operand type(s) for -: NoneType and int

Grd
gnz gibi, biraz nceki fonksiyonumuzun verdi
gi hatayla ayn hatay aldk... nk
orada olan s
eyle burada olan s
ey tamamen ayndr. None de
gerinden 1 de
gerini karamayaca
gmz iin Python bize byle bir hata veriyor. Buradan return deyiminin ne i
se
yarad
gn az ok anlam
s olmalyz. Pythonda fonksiyon tanmlarken do
grudan fonksiyon
iinde herhangi bir de
geri print() ile ekrana basmak her zaman iyi bir yol olmayabilir. nk
daha nce de dedi
gimiz gibi, fonksiyonlar s
ablonlara benzer. O yzden fonksiyonlar ne kadar
genel tutarsak o kadar i
se yarar. Bir fonksiyonun grevi sadece bir de
geri ekrana basmak olmamal. Tanmlad
gmz fonksiyonlarda herhangi bir de
geri do
grudan ekrana basmak yerine o
de
geri dndrmeyi (return) tercih edersek, fonksiyondan dnen de
ger ile istedi
gimiz i
slemi
yapabiliriz. Artk dnen bu de
geri sonradan ekrana basmak veya bu de
gerle ba
ska i
slemler
yapmak tamamen size kalm
s bir s
ey olacaktr...
Mesela yukardaki fonksiyonla s
yle bir deneme yapalm:
def santtan_faha(sant):
fah = sant * (9.0/5.0) + 32
return fah
santigrat = 20
print("{0} santigrat {1} fahrenhayt eder".format(santigrat,
santtan_faha(santigrat)))

Bu fonksiyonu al
strd
gmzda istedi
gimiz kty alabiliriz. Ama e
ger fonksiyonu s
yle tanmlarsak sknt ya
sarz:
def santtan_faha(sant):
fah = sant * (9.0/5.0) + 32
print(fah)
santigrat = 20
print("{0} santigrat {1} fahrenhayt eder".format(santigrat,
santtan_faha(santigrat)))

Buradan alaca
gmz kt s
yle olacaktr:
68.0
20 santigrat None fahrenhayt eder

Grd
gnz gibi, fonksiyonumuzun dndrd
g None de
geri, karakter dizisinin iine yerle
sti...
Sonu olarak, return deyimi bir fonksiyonu genel amal bir hale getirmeye yardmc olan bir
aratr. Bu deyim yardmyla, tanmlad
gmz fonksiyonlarn bir de
ger dndrmesini sa
glyoruz.
Dndrlen bu de
geri daha sonra istedi
gimiz gibi kullanma zgrl
gne sahibiz...

10.11 Fonksiyonlarn Belgelendirilmesi


Bu blmde kodlarmzn al
smasn de
gil ama okunakll
gn etkileyecek bir zellikten sz
edece
giz. Bahsedece
gimiz zellik fonksiyonlarn belgelendirilmesi... Fonksiyonlarn belgelendirilmesi de ne demek oluyor? diye d
snm
s olabilirsiniz. Isterseniz size s
yle bir rnek
gstererek konuya snmanz sa
glayalm:
Ska de
gindi
gimiz fonksiyonlardan biri olan sum() fonksiyonunu ele alalm ve daha nce

grendi
gimiz dir() fonksiyonu yardmyla bu fonksiyonun iine bakalm:
>>> dir(sum)
[__call__, __class__, __delattr__, __doc__, __eq__, __format__,
__ge__, __getattribute__, __gt__, __hash__, __init__, __le__,
__lt__, __module__, __name__, __ne__, __new__, __reduce__,
__reduce_ex__, __repr__, __self__, __setattr__, __sizeof__,
__str__, __subclasshook__]

Bu s
ekilde sum() fonksiyonunun niteliklerini ekrana dkm
s olduk. Bunlar iinde bizi ilgilendiren, drdnc sradaki __doc__ niteli
gidir. S
imdi bu __doc__ niteli
gini nasl kullanaca
gmza
ve bu niteli
gin ne i
se yarad
gna bakalm. Bu komutu etkile
simli kabukta veriyoruz:
>>> print(sum.__doc__)
sum(iterable[, start]) -> value
Returns the sum of an iterable of numbers (NOT strings) plus the value
of parameter start (which defaults to 0). When the iterable is
empty, returns start.

Grd
gnz gibi, print(sum.__doc__) komutu bize sum() fonksiyonu hakknda ksa bir bilgi
veriyor. Tabii e
ger Ingilizce bilmiyorsanz bu ksa aklamalarn size pek faydas olmayacaktr.
Ama hi endi
se etmeyin! istihza.com bugnler iin var!...
Burada sum() fonksiyonunun __doc__ niteli
gini kullanarak, bu fonksiyon hakknda ksa da
olsa bilgi edinebiliyoruz. Bu __doc__ niteli
gi btn fonksiyonlarda vardr. Hatta kendi tanmlad
gmz fonksiyonlar dahi bu niteli
ge sahiptirler. Hemen bir fonksiyon tanmlayarak bu durumu teyit edelim:
def bo
s_fonksiyon():
pass

Bu arada, bu fonksiyonu isterseniz etkile


simli kabukta tanmlayn. Bylece fonksiyonu daha
rahat test edebilirsiniz. Fonksiyonlar etkile
simli kabukta tanmlamak iin s
yle bir yol izliyoruz:
>>>def bo
s_fonksiyon():
...
pass
...
>>>

Grd
gnz gibi def ile ba
slayan satr yazp entere bast
gmzda etkile
simli kabu
gun >>>
i
sareti ... i
saretine dn
syor. Burada drt kez bo
sluk tu
suna basp girinti veriyoruz ve
pass satrn yazyoruz. Ardndan entere bast
gmzda i
saretin yine ... oldu
gunu gryoruz.
Etkile
simli kabuk burada bizden ba
ska kodlar bekliyor, ama bu fonksiyonda bizim yazaca
gmz
ba
ska kod yok. O yzden tekrar entere basarak >>> i
saretinin oldu
gu ba
slang konumuna
geri dnyoruz. Bylece etkile
simli kabukta fonksiyonumuzu tanmlam
s olduk. S
imdi yine etkile
simli kabukta s
u komutu vererek, yeni olu
sturdu
gumuz bu bo
s_fonksiyon adl fonksiyonun
iine, yani niteliklerine bakabiliriz:

>>> dir(bo
s_fonksiyon)
[__annotations__, __call__, __class__, __closure__, __code__,
__defaults__, __delattr__, __dict__, __doc__, __eq__, __format__,
__ge__, __get__, __getattribute__, __globals__, __gt__, __hash__,
__init__, __kwdefaults__, __le__, __lt__, __module__, __name__,
__ne__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__,
__sizeof__, __str__, __subclasshook__]

Grd
gnz gibi, bizim olu
sturdu
gumuz fonksiyonun da __doc__ adl bir niteli
gi var. Gelin
isterseniz biraz nce sum() fonksiyonuna yapt
gmz gibi, bo
s_fonksiyona da bu __doc__
niteli
gini uygulayalm:
>>> print(bo
s_fonksiyon)
None

Grd
gnz gibi, fonksiyonumuz None de
geri dndrd. nk fonksiyonumuzu henz belgelendirmedik. O yzden bu __doc__ niteli
gi bo
s grnyor. S
imdi bu fonksiyonu nasl belgelendirece
gimize bakalm:
def bo
s_fonksiyon():
"""Kullanm: bo
s_fonksiyon() Hi bir i
se yaramayan bo
s bir fonksiyondur.
None de
gerini dndrr."""
pass
print(bo
s_fonksiyon.__doc__)

Bu kodlar al
strd
gmzda ekrana s
u satrlar dklecektir:
Kullanm: bo
s_fonksiyon() Hi bir i
se yaramayan bo
s bir fonksiyondur.
None de
gerini dndrr.

Bylece fonksiyonumuzun __doc__ niteli


gini doldurmu
s, yani fonksiyonumuzu belgelendirmi
s
olduk. Artk bu fonksiyon hakknda bilgi almak isteyenler bu fonksiyonun __doc__ niteli
gini
kullanarak fonksiyonun ne yapt
g hakknda ksa bir bilgi sahibi olabilecekler. Burada fonksiyonumuzu nasl belgelendirdi
gimize dikkat edin. Bunun iin belgelendirme dizilerinden (docstring) yararlandk. Fonksiyonu def parac
g yardmyla tanmladktan hemen sonra getirdi
gimiz aklayc bilgilere belgelendirme dizisi ad veriyoruz. Pythonda genel kural olarak
belgelendirme dizileri trnak iinde gsterilir. Belgelendirme dizilerini ift veya tek trnakla
da gstermek mmkn olsa da trnak kullanmak adettendir. Ayrca trnak kulland
gmzda
uzun metinleri daha kolay yazabiliriz. nk bildi
giniz gibi, trnak kullanld
gnda enter
tu
suna basarak cmleleri rahatlkla kaydrabiliyoruz...
Bu arada belgelendirme dizilerini yazarken girintilere dikkat ediyoruz. def parac
g ile fonksiyonu tanmlayp enter tu
suna bastktan sonra belgelendirme dizisini girintili olarak yazmaya
ba
slamamz gerekiyor. Yani s
yle bir s
ey yazamyoruz:
def bo
s_fonksiyon():
"""belgelendirme dizisi..."""

Fonksiyonumuzu s
yle yazmamz gerekiyor:
def bo
s_fonksiyon():
"""belgelendirme dizisi..."""

Dedi
gimiz gibi, bir fonksiyonun belgelendirme dizisine ula
smak iin __doc__ niteli
gini kullanyoruz. Alternatif olarak bu dizilere ula
smak iin help() adl zel bir fonksiyondan da yararlan-

abiliriz:
>>> print(help(enumerate))

En ba
sta da syledi
gimiz gibi, belgelendirme dizilerinin kodlarmzn al
smas zerinde hi
bir etkisi yoktur. Ayrca bunlar yazmak mecburiyetinde de de
giliz. Bu zellik kodlarmz
daha anla
slr ve okunakl klmaya yarar. Bu sayede, yazd
gmz fonksiyonu okuyanlar veya
kullanacak olanlar fonksiyonun nasl kullanlaca
g hakknda bilgilenme imkan edinmi
s olurlar.
Elbette yazd
gmz belgelendirme dizilerinin faydas, bu dizilerin ne kadar dzgn yazld
gna
ba
gldr...
Ayrca belgelendirme dizilerinin sadece fonksiyonlara has bir zellik olmad
gn da belirtelim.
Bir sonraki blmde de grece
giniz gibi, belgelendirme dizileri modllerin de sahip oldu
gu bir
zelliktir. Dolaysyla modlleri belgelendirmek iin yine bu belgelendirme dizilerinden yararlanaca
gz...

BLM

11

Modller

Bu blmde yine ok nemli bir konu olan modllerden bahsedece


giz. Peki nedir modl?
Modl en basit tanmyla, .py uzantsna sahip bir dosyadr. Bu tanma gre, Pythonla
yazd
gnz btn program dosyalar birer modldr. Dolaysyla bir program yazp bunu cmbz.py adyla kaydetti
ginizi varsayarsak, i
ste bu cmbz.py adl dosya bir modldr... Buradan yola karak s
yle bir tanm yapabiliriz o halde:
Fonksiyonlar, deyimler ve ifadelerden olu
san, bu
geleri iinde barndran Python
dosyalarna modl ad verilir.
Peki modller ne i
se yarar?
Modller Pythondaki en yararl
gelerden bir tanesidir. Bir modl iinde tanmlad
gmz
fonksiyonlar ba
ska bir programa aktarabilir, bu fonksiyonlar bir daha yazmak zorunda
kalmadan tekrar tekrar kullanabiliriz.
Modller Pythona g ve esneklik kazandran
gelerdir. Etrafta, emrimize amade bir s
ekilde
bekleyen binlerce hazr modl bulunur. Bu modllerden bir ksm Pythonun iindedir, bir ksm
ise internetten indirilebilmektedir. Hazr modlleri kullanarak Pythonda inanlmaz i
sler ba
sarabilirsiniz. rne
gin Tkinter adl bir modl sayesinde Pythonla arayzl programlar tasarlayabilirsiniz... E
ger matemati
ge meraklysanz math modln kullanarak karma
sk i
slemleri son
derece kolay bir s
ekilde halledebilirsiniz... Etrafta bunlar gibi bir y
gn modl bulunur.
Pythonun iinde yer alan modllerin listesine http://www.python.org/doc/3.0.1/modindex.html
adresinden ula
sabilirsiniz.
Yukarda syledi
gimiz szler kula
ga biraz anla
slmaz geliyor olabilir. Ama hi dert etmeyin.
Ilerleyen sayfalarda modl konusunu ayrntl olarak inceleyece
giz. O halde laf daha fazla
dolandrmadan i
se koyulalm.

11.1 Modlleri Ie Aktarmak (importing modules)


Pythonda bir modl kullanabilmek iin, o modl ncelikle ie aktarmamz gerekiyor. Burada ie aktarmaktan kast, sz konusu modle ait zellikleri ba
ska bir dosyann iine ta
smaktr. Bir modl ie aktarld
gnda, o modle ait zellikler, modln aktarld
g dosya iinden
de kullanlabilecektir. Bu sylediklerimiz kafanz kar
strmasn. S
imdi bu anlattklarmzn ne
demek oldu
gunu ok basit rneklerle aklayaca
gz.

201

Pythonda os adl bir modl bulunur. Bu modl Pythonun en temel ve en nemli modllerinden
bir tanesidir. S
imdi bir modln ne olup ne olmad
gn anlayabilmek iin etkile
simli kabukta
a
sa
gdaki komutu verelim. Bu komut yardmyla bu os adl modln iine bakaca
gz:
>>> dir(os)

Ne oldu? Python bize bir hata mesaj gsterdi, de


gil mi? Bu gayet normal. nk biraz nce
de syledi
gimiz gibi, bir modl kullanabilmek iin ncelikle o modl ie aktarmamz (import)
gerekiyor. Hemen bu i
slemi nasl yapaca
gmza bakalm:
>>> import os

Bu komut yardmyla Pythona s


u emri vermi
s oluyoruz: Ey Python! os adl modl ie aktar,
ki ben bu modln bana sundu
gu nimetlerden faydalanabileyim...
Bu emrimizi alan Python sessizce alt satra geecektir. Buraya kadar her s
ey normal. Bu
yapt
gmz i
sleme ie aktarma ad veriliyor. Yani biz bu i
slemle, os adl modl ie aktarm
s
olduk. Artk bu modln btn zelliklerinden yararlanabiliriz. ncelikle bu modln iine
bakalm neler varm
s:
>>> dir(os)
[F_OK, MutableMapping, O_APPEND, O_BINARY, O_CREAT, O_EXCL, O_NOINH
ERIT, O_RANDOM, O_RDONLY, O_RDWR, O_SEQUENTIAL, O_SHORT_LIVED, O_TEM
PORARY, O_TEXT, O_TRUNC, O_WRONLY, P_DETACH, P_NOWAIT, P_NOWAITO,
P_OVERLAY, P_WAIT, R_OK, SEEK_CUR, SEEK_END, SEEK_SET, TMP_MAX, W_
OK, X_OK, _Environ, __all__, __builtins__, __doc__, __file__, __na
me__, __package__, _copyreg, _execvpe, _exists, _exit, _get_exports_
list, _keymap, _make_stat_result, _make_statvfs_result, _pickle_stat_res
ult, _pickle_statvfs_result, _putenv, _unsetenv, _wrap_close, abort,
access, altsep, chdir, chmod, close, closerange, curdir, defpath
, device_encoding, devnull, dup, dup2, environ, errno, error, exe
cl, execle, execlp, execlpe, execv, execve, execvp, execvpe, ext
sep, fdopen, fstat, fsync, getcwd, getcwdb, getenv, getpid, isat
ty, linesep, listdir, lseek, lstat, makedirs, mkdir, name, open
, pardir, path, pathsep, pipe, popen, putenv, read, remove, rem
ovedirs, rename, renames, rmdir, sep, spawnl, spawnle, spawnv, s
pawnve, startfile, stat, stat_float_times, stat_result, statvfs_result
, strerror, sys, system, times, umask, unlink, urandom, utime,
waitpid, walk, write]

Grd
gnz gibi, os modl iinde bir hayli ara bulunuyor. Peki bu os modl ne i
se yarar?
Ingilizce bilen arkada
slarm s
u komutu kullanarak bu modln belgelendirme dizisine ula
sabilir
(Belgelendirme dizilerinin ne oldu
gunu fonksiyonlar blmnde i
slemi
stik...):
>>> print(os.__doc__)

Ingilizce bilmeyen arkada


slarm iin bu modln ne i
se yarad
gn biz syleyelim:
os modl Python iindeki en nemli modllerden bir tanesidir. Bu modl, kulland
gmz i
sletim
sistemine ili
skin baz nemli i
slemler yapmamz sa
glar. Ayrca bu modlden yararlanmak,
birden fazla platform zerinde al
san programlar yazmanz da kolayla
stracaktr. Bu modl
ayr bir ba
slk altnda daha detayl bir s
ekilde inceleyece
giz. Ama s
imdilik isterseniz bu modlle
ilgili birka rnek yaparak modller konusuna biraz olsun snmanz kolayla
strmaya al
salm:
En ba
sta da dedi
gimiz gibi, bir modl kullanabilmek iin ncelikle o modl ie aktarmamz
gerekiyor. Bunu sk sk tekrar ediyorum, nk Pythonu
grenenlerin en ok yapt
g hatalardan
biri de bir modl ie aktarmadan kullanmaya al
smaktr... S
u halde hemen os modln ie
aktaralm:

>>> import os

E
ger etkile
simli kabuk zerinde al
syorsanz, bu modl her oturumda bir kez ie aktarmak
yeterli olacaktr.
S
imdi s
u kodlara bakalm:
>>> import os
>>> if os.name == "posix":
...
print("Merhaba GNU/Linux kullancs... Stallmana benden selam syle!")
>>> elif os.name == "nt":
...
print("Merhaba Windows kullancs... Gatese benden selam syle!")

E
ger kulland
gnz sistem GNU/Linux ise yukardaki kodlar al
strd
gnzda Merhaba
GNU/Linux kullancs... kts verilecek, e
ger Windows kullanyorsanz Merhaba Windows
kullancs... kts verilecektir. Isterseniz bu kodlar biraz inceleyelim:
ncelikle os modln ie aktaryoruz. nk bu modl ve iindeki nitelikleri kullanabilmek
iin ilk yapmamz gereken s
ey bu modl ie aktarmaktr. Modl bir kez ie aktardktan
sonra dir(os) ktsnda grnen btn niteliklerden, metotlardan ve fonksiyonlardan faydalanabiliriz. os modl iinde, i
sletim sistemlerine ili
skin baz i
slemleri yerine getirmemizi
sa
glayacak aralar bulunur. E
ger os(dir) ktsna bakacak olursanz, orada name adl bir
ifade grrsnz. name kelimesinin anlam isimdir. Dolaysyla bu ifade bize kulland
gmz
i
sletim sisteminin ismini syleyecektir. os modl iinde s
u isimler tanmlanm
str:
posix, nt, mac, os2, ce, java, riscos

S
imdi etkile
simli kabukta os modln ie aktardktan sonra s
u komutu verin:
>>> print(os.name)

Bu komut, kulland
gnz i
sletim sistemine gre farkl ktlar verecektir. E
ger GNU/Linux
da
gtmlarndan birini kullanyorsanz yukardaki komuttan alaca
gnz kt posix olacaktr.
E
ger Windows kullanyorsanz bu komut size nt cevabn verir. Yok e
ger siz bir Macintosh
kullancsysanz bu komuttan alaca
gnz cevap mac olacaktr...
Bu ifadeler arasnda grnen os2, OS/2 adl i
sletim sistemini, ce Windows CE i
sletim sistemini, java JavaOS i
sletim sistemini, riscos ise RISC OS i
sletim sistemini temsil eder...
Burada os modl iindeki bir niteli
gi nasl kulland
gmza dikkat edin: os + . + name. Burada
modl_ad + nokta + istenen_nitelik yolunu izliyoruz.
Biz burada print(os.name) komutuyla aslnda Pythona s
yle bir emir vermi
s oluyoruz: os
adl modlnn name adl niteli
gi aracl
gyla bana kulland
gm i
sletim sisteminin adn
syle!
Gelin isterseniz yine os modl iinde yer alan aralardan biriyle ilgili bir rnek daha yapalm:
>>> print(os.getcwd())

Bu komut bize, o anda hangi dizin iinde al


syorsak o dizinin adn verecektir. getcwd()
adl fonksiyonu da dir(os) kts iinde grebilirsiniz. Bu arada, getcwdnin bir fonksiyon
oldu
guna dikkat edin. Bu ara bir fonksiyon oldu
gu iin bunu parantezlerle kullanmay unutmuyoruz. Biraz nce grd
gmz name niteli
gi ise bir fonksiyon de
gil, os modl iinde yer
alan de
gi
skenlerden biridir.
Burada da print(os.getcwd()) komutuyla Pythona s
u emri veriyoruz: os adl modln
getcwd() adl niteli
gi aracl
gyla bana s
u anda hangi dizinde al
st
gm gster.

Bu arada, e
ger os modlnn ieri
gini merak ediyorsanz, bu dosyay inceleyebilirsiniz.
Bu modln sisteminizde nerede bulundu
gunu
grenmek iin s
yle bir komuttan yararlanabilirsiniz:
>>> os.__file__

Bu komut, size os modlnn hangi klasr iinde oldu


gunu syleyecektir...
Dedi
gimiz gibi, ilerleyen sayfalarda bu os modln daha detayl olarak inceleyece
giz. Burada
amacmz sadece modl konusuna sizleri sndrmak...
Dilerseniz s
imdi ba
stan beri sz etti
gimiz ie aktarma mevzuunu biraz de
selim...
Dedik ki, bir modl herhangi bir s
ekilde kullanabilmek iin ncelikle o modl ie aktarmamz
gerekiyor. Yabanclar bu kavrama import diyorlar... Pythonda bir modl birka farkl s
ekilde
ie aktarabiliyoruz:
1. import modl
2. from modl import nitelik_ad
3. from modl import *
4. import modl as takma_ad
Peki bu biimler arasndaki farklar nedir? Tek tek bakalm:
import modl

Pythonda bir modl bu s


ekilde ie aktard
gmz zaman o modln ismi dahil btn nitelikleri
kullanlabilir duruma gelir. Bir rnek verelim:
>>> import os
>>> print(os.name)

Burada os adl modl import os biimini kullanarak ie aktard


gmz iin, bu modl iinde
bulunan niteliklerden biri olan nameyi kullanabiliyoruz. os modl iindeki nitelikleri kullanabilmek iin os.nitelik yapsn kullanmamz gerekiyor.
Bir modl bu s
ekilde ie aktard
gmzda, o modln kendi ismi de ie aktarlm
s olur. Bu ne
demek? S
u rne
ge bakalm:
>>> dir(os)

Modlmz import os diyerek ie aktard


gmz iin dir(os) komutu al
syor. Bunun sebebi
os isminin de ie aktarlm
s olmasdr. Bunu biraz sonra daha iyi anlayaca
gz.

11.1.1 from modl import nitelik_ad


Modllerimizi from modl import nitelik_ad biimini kullanarak da ie aktarabiliyoruz. Bir
modl bu s
ekilde ie aktard
gmz zaman ortaya baz kullanm farklar kacaktr. S
u rne
ge
bakalm:
>>> from os import getcwd

Burada yapt
gmz s
ey, os modlnn getcwd adl niteli
gini ie aktarmaktan ibarettir. Burada
modlmzn tek bir niteli
gini ie aktarm
s olduk. Ayrca kullanmda da s
yle bir fark ortaya
kt:

>>> print(getcwd())
/home/istihza/Desktop/

Grd
gnz gibi, bu defa getcwd()nin ba
sna os. ifadesini koymadk. Artk os.getcwd()
demek yerine sadece getcwd() komutunu kullanabiliyoruz. Ancak modlmz bu biimde
ie aktard
gmzda sadece belirtilen nitelik kullanlabilir durumda olacaktr. Yani bu durumda
os modlnn getcwd() niteli
gi d
sndaki hi bir niteli
gini kullanamyoruz. Mesela burada name
niteli
ginden yararlanamayaca
gz:
>>> print(name)
NameError: name name is not defined

E
ger getcwd() ile birlikte name niteli
gini de kullanmak istersek kodumuzu s
yle yazmamz
gerekir:
>>> from os import getcwd, name

Artk s
u komutlar al
sacaktr:
>>> print(getcwd())
>>> print(name)

Grd
gnz gibi, kullanmak istedi
gimiz her niteli
gi ayr ayr ie aktaryoruz. E
ger yazaca
gnz
programda bir modln sadece tek bir niteli
gini kullanacaksanz koca bir modln tamamn
ie aktarmak yerine, bu biimi tercih edebilirsiniz...
Biraz nce, bir modl bu import modl_ad biimiyle ie aktard
gmzda, o modln kendi
ismi de ie aktarlm
s olur, demi
stik. S
imdi bunun ne demek oldu
gunu grece
giz:
>>> dir(os)
NameError: name os is not defined

Grd
gnz gibi, modlmz from modl import modl_ad biiminde ie aktard
gmzda os
adn kullanamyoruz. nk, dedi
gimiz gibi, bu s
ekilde ie aktarmalarda modl ad aktarm
listesine dahil olmayacaktr.

11.1.2 from modl import *


Modlmz ie aktarmak iin kullanabilece
gimiz bir ba
ska yol da from modl import * biimini tercih etmektir. E
ger bir modl bu s
ekilde ie aktaracak olursak, o modl iindeki, ismi
_ ile ba
slayanlar hari btn nitelikler kullanlabilir hale gelecektir. rnek verelim:
>>> from os import *
>>> print(name)
>>> print(getcwd())

Grd
gnz gibi, from os import * yapsn kulland
gmzda, modl ismini kullanmadan (yani
os. ksmn atarak), modle ait nitelikleri kullanabiliyoruz. Ancak bu yapnn ok nemli bir
riski vardr. Bir modl bu s
ekilde ie aktard
gmzda, o modle ait btn nitelikler do
grudan o
anda iinde al
st
gmz isim alanna dahil olacaktr. isim alan kavramn nceki derslerimizden hatrlyorsunuz. Isterseniz bu riski s
yle bir rnekle somutla
stralm.

Diyelim ki s
yle bir kodumuz var:
>>> name = "istihza.com"

E
ger biz bu kodun bulundu
gu bir programda from os import * komutunu verecek olursak
programmz darmada
gn ederiz... Nasl m? S
una bakn s
imdi:
>>> name = "istihza.com"
>>> print(name)
istihza.com

S
imdi os modln ie aktaryoruz:
>>> from os import *
>>> print(name)
posix

Grd
gnz gibi, os modln ie aktarmamzla birlikte nceden tanmlam
s oldu
gumuz name
adl de
gi
sken siliniverdi... Muhtemelen yazaca
gnz programlarda byle bir s
eyin ba
snza
gelmesini istemezsiniz... Bu tr durumlar engellemenin en iyi yolu modl import modl_ad
s
eklinde ie aktarmaktr:
>>> name = "istihza.com"
>>> print(name)
istihza.com
>>> import os
>>> print(os.name)
posix
>>> print(name)
istihza.com

Bu defa, os modlne ait name niteli


gini kullanabilmek iin os. ifadesini de eklememiz gerekti
ginden, daha nce tanmlad
gmz name adl de
gi
skeni kaybetmemi
s oluyoruz...

11.1.3 import modl as takma_ad


Pythonda baz modl isimleri uzundur. rne
gin multiprocessing adl modl s
u s
ekilde ie
aktard
gmz varsayalm:
>>> import multiprocessing

Bu modl bu s
ekilde ie aktard
gmzda modln niteliklerine eri
smek iin her defasnda
modl adn da belirtmemiz gerekecek:
>>> multiprocessing.nitelik_ad

E
ger her defasnda multiprocessing yazmak zor geliyorsa modl s
u s
ekilde ie aktarmay
tercih edebiliriz:
>>> import multiprocessing as mp

Bylece normalde multiprocessing yazmamz gereken yerlere sadece mp yazabilece


giz:
mp.nitelik_ad

Bu yntemi ayrca modl adnn sizin programnzdaki kodlarla ak


smaya neden olaca
gn
d
snd
gnz durumlarda da kullanmay tercih edebilirsiniz.
Grd
gnz gibi Pythonda bir modl ie aktarmann pek ok yolu var. Peki bunlardan
hangisini tercih etmeliyiz? Bunlar iinde en sa
glkl olan import modl_ad, en pratik olan ise
from modl_ad import * s
eklinde gsterdi
gimiz ie aktarma biimidir. Kulland
gmz modln
from modl_ad import * s
eklinde ie aktarlmasnn sakncal olmad
gndan emin de
gilsek
import modl_ad biimini tercih etmeliyiz. Yani o
gunlukla tercih edece
gimiz biim import
modl_ad olacaktr... Baz modlleri from modl_ad import * s
eklinde ie aktarmamzda
saknca yoktur. Mesela grafik arayzl programlar yapmak iin kullanaca
gmz tkinter adl
modl bunlardan biridir...

11.2 os ve sys Modlleri


Bu blmde Python iindeki modllerden en nemli iki tanesi olan os ve sys adl modlleri
inceleyece
giz. Bu iki modl Pythonun en temel modlleridir ve mutlaka
grenilmeleri gerekir.
O halde ilk modlmz olan ostan ba
slayalm...

11.2.1 os Modl
os Modl Pythonun en temel modllerinden bir tanesidir. Bu modle daha nce de
ginmi
stik.
Burada bu modl, biraz daha ayrntsna inerek incelemeye al
saca
gz.
Bildi
giniz gibi, bir modl kullanabilmek iin ncelikle o modl ie aktarmamz gerekiyor:
>>> import os

Yine bildi
giniz gibi, modllerimizi birka farkl s
ekilde ie aktarabiliyoruz. Ama mevcut yntemler iinde en sa
glkls import os biimidir.
Ie aktard
gmz bu modln ieri
gini grmek istersek, daha nce pek ok kez kulland
gmz
dir() fonksiyonundan yararlanabiliriz:
>>> dir(os)

dir() fonksiyonuyla os modlnn iine bakt


gmzda bu modln epey bir niteli
gi oldu
gunu
gryoruz...
os, Ingilizcedeki operating system ifadesinin ksaltmasdr. Bu ifade i
sletim sistemi anlamna gelir. Dolaysyla os modl bize i
sletim sistemleriyle ilgili i
slemler yapma imkan verir.
E
ger bu modlle ilgili yardm almak isterseniz s
u komutlar kullanabilirsiniz:
>>> help(os)

...veya...
>>> print(os.__doc__)

E
ger Ingilizce biliyorsanz, yukardaki komutlarn ktlarna bakarak os modlnn ne i
se
yarad
gna dair baz bilgiler edinebilirsiniz. E
ger Ingilizce bilmiyorsanz ziyan yok. Biz size
yardmc olmaya al
saca
gz.

Gelin isterseniz s
imdi dir(os) komutu ile kar
smza gelen listedeki niteliklerin en nemlilerini
incelemeye koyulalm.

name Niteligi
name kelime olarak isim anlamna gelir. os modlne ait bir nitelik olan name, bize kulland
gmz i
sletim sisteminin adn verir. Bununla ilgili s
yle bir rnek verebiliriz:
>>> print(os.name)

Kulland
gmz i
sletim sistemine gre bu komuttan s
u ktlardan birini alrz:
posix, nt, mac, os2, ce, java, riscos

Bunlarn ne anlama geldi


gini daha nce sylemi
stik.
os modlnn name niteli
gini kullanarak, yazd
gnz kodlarn birka sisteme birden duyarl olmasn sa
glayabilirsiniz. Mesela s
yle bir rnek verelim:
>>> if os.name == "posix": #E
ger i
sletim sistemi GNU/Linux ise...
...
print("Sisteme ho
sgeldiniz!")
>>> elif os.name == "nt": #E
ger i
sletim sistemi Windows ise...
...
print("Kulland
gnz i
sletim sistemi desteklenmemektedir.")

Burada kullancnn sahip oldu


gu i
sletim sistemine gre kullancy kabul ediyoruz veya etmiyoruz... Bu arada, yukardaki kodlar al
strabilmek iin ncelikle os modln ie aktarm
s
olmanz gerekti
gini biliyorsunuz...
os modlnn name niteli
gi zerine sylenecek fazla bir s
ey yok. Ne i
se yarad
g zaten adndan
da belli oluyor. O yzden isterseniz hemen ba
ska bir niteli
gi tanmaya giri
selim.
getcwd Fonksiyonu
getcwd os modl iinde bulunan bir fonksiyondur. Biz bu fonksiyona daha nce de de
ginmi
stik. Orada da dedi
gimiz gibi, bu fonksiyon o anda bulundu
gumuz dizinin adn verir:
>>> print(os.getcwd())
/home/istihza

Demek ki ben s
u anda /home/istihza dizininin altnda al
syormu
sum. Elbette i
sletim sisteminize ve o anda bulundu
gunuz dizine ba
gl olarak bu komutun kts sizde farkl olacaktr.
rne
gin bu fonksiyonu Windows altnda al
strmak istersek...
>>> print("
Su anda bulundu
gunuz dizinin ad:\n", os.getcwd())

Su anda bulundu
gunuz dizinin ad:
C:\\Documents and Settings\\ISTIHZA

os modlnn bu getcwd() adl fonksiyonu, yazd


gmz pek ok programda i
simizi kolayla
strabilecek bir aratr.

listdir Fonksiyonu
listdir kelimesi list directory (dizini listele) ifadesinin ksaltmasdr. Bu fonksiyonu kullanarak, istedi
gimiz bir dizinin ieri
gini gsterebiliriz:
>>> os.listdir("/home/istihza/")

Burada ben /home/istihza dizininin ieri


gini listeledim. E
ger Windows zerindeyseniz s
yle
bir s
ey de yapabilirsiniz tabii ki:
>>> os.listdir("C:\\Documents and Settings")

Bu komut C:\Documents and Settings altnda bulunan btn dosyalar bir liste halinde verecektir. E
ger o anda iinde bulundu
gunuz dizinin ieri
gini listelemek isterseniz s
yle bir s
ey
yazabilirsiniz:
>>> mevcut_dizin = os.getcwd()
>>> os.listdir(mevcut_dizin)

Bu komut da o anda bulundu


gunuz dizin iinde ne var ne yoksa listeleyecektir.
E
ger mesela bir dizin iindeki, f harfiyle ba
slayan dosyalar listelemek gibi bir niyetiniz varsa
s
yle bir kod yazabilirsiniz:
>>> dizin = "/home/istihza/Desktop"
>>> for i in os.listdir(dizin):
...
if i[0] == "f":
...
print(i)

print() fonksiyonunun gcn kullanarak s


yle bir kt da elde edebilirsiniz:
>>> mevcut_dizin = os.getcwd()
>>> print(*os.listdir(mevcut_dizin), sep=", ")

Bylece hem mevcut dizindeki dosyalar listeledik, hem de her bir


geyi virglle ayrdk...
chdir Fonksiyonu
chdir kelimesi, change directory (dizin de
gi
stir) ifadesinin ksaltmasdr. Adndan da anla
slaca
g gibi bu fonksiyon o anda iinde bulundu
gumuz dizinden kp ba
ska bir dizine
gememizi sa
glar. Mesela:
>>> os.chdir("/usr/share/")

Yukardaki komut yardmyla, o anda bulundu


gum dizin iinden kp /usr/share/ adl dizinin
iine girdim. Bu durumu s
u s
ekilde teyit edebiliriz:
>>> mev_diz = os.getcwd()
>>> os.listdir(mev_diz)

S
u anda /usr/share/ dizini altnda bulundu
gum iin yukardaki kodlarn ktsnda bu dizinin
ieri
gini gryorum. S
imdi bulundu
gum dizini tekrar de
gi
stireyim:
>>> os.chdir("/etc/X11/")
>>> os.listdir(os.getcwd())

O anda iinde bulundu


gum dizini terkedip /etc/X11/ dizinine
os.listdir(os.getcwd()) komutu bana /etc/X11/ dizininin ieri
gini listeliyor.

geldi
gim

iin,


curdir Niteligi
curdir Ingilizcede current directory (mevcut dizin) ifadesinin ksaltmasdr. Bu nitelik daha
nce
grendi
gimiz getcwd() fonksiyonuna ok benzer. Bu ikisi arasnda anlay
s fark vardr...
ncelikle curdir niteli
ginin ne kt verdi
gine bakalm:
>>> os.curdir
.

Grd
gnz gibi, bu komuttan bir nokta kts alyoruz... Peki bu ne i
se yaryor?
sistemlerinde mevcut dizini ifade etmek iin kullanlan basit karakter dizileri vardr.
nokta i
sareti de bunlardan biridir. Mesela bu karakter dizisini s
u s
ekilde kullanabiliriz:

I
sletim
I
ste bu

>>> os.listdir(".")

Bu komut bize os.listdir(os.getcwd()) ile ayn kty verecektir. Genellikle btn i


sletim sistemlerinde mevcut dizini temsil eden karakter dizisi nokta i
saretidir. Ama programnzn birden
fazla i
sletim sistemi zerinde al
smasn temin etmek iin s
yle bir kod yazmay tercih edebilirsiniz:
>>> os.listdir(os.curdir)

Bylece, programnzn al
strld
g i
sletim sistemi neyse, os.curdir yerine otomatik olarak
mevcut dizini temsil eden karakter dizisi yerle
stirilecek ve bylece mevcut dizinin ieri
gi
otomatik olarak ekrana dklecektir...

environ Niteligi
os modl iinde bulunan bu environ adl nitelik esasnda bir szlktr. Bu szlk sisteminizdeki evre de
gi
skenlerine ili
skin bilgileri tutar. Mesela environ niteli
gini kullanarak sistemdeki kullanc adn
grenebiliriz:
>>> os.environ["USER"] #Windowsta "USERNAME"

Kullanc dosyalarnn bulundu


gu dizini elde etmek iin ise s
yle bir s
ey yazabiliriz:
>>> os.environ["HOME"] #Windowsta "HOMEPATH"

Bilgisayar ad:
>>> os.environ["COMPUTERNAME"] #GNU/Linuxta buna yakn olarak "LOGNAME" bulunur...

I
slemciye ili
skin bilgiler:
>>> os.environ["PROCESSOR_IDENTIFIER"] #GNU/Linuxta bulunmaz.

Dedi
gimiz gibi, environ esasnda bir szlktr. Dolaysyla bu szl
gn iindeki btn
de
gi
skenleri grmek iin s
yle bir yol izleyebilirsiniz:
>>> for k, v in os.environ.items():
...
print("{0} = {1}".format(k, v)

Mesela kullancnn masast dizinine gitmek, ardndan da masastndeki dosyalar listelemek


iin environdan yararlanabilirsiniz:

>>> os.chdir(os.environ["HOME"] + "/Desktop")


>>> os.listdir(os.curdir)

sep Niteligi
I
sletim sistemleri, dizinleri birbirinden ayrmak iin farkl i
saretler kullanr.
rne
gin
os.getcwd() komutunu verdi
gimizde, dizin ayralar asndan GNU/Linux ve Windowsta farkl
sonular alrz:
>>> os.getcwd()
/home/istihza/Desktop #GNU/Linux
C:\\Documents and Settings\\ISTIHZA\\Desktop #Windows

Grd
gnz gibi, dizin ayralar birbirinden farkl. E
ger yazd
gmz programlarda bu farkll
g
gz nnde bulundurmazsak, programlarmz farkl i
sletim sistemlerinde dzgn al
smayacaktr. Python bu riske kar
s bize os modl iinde sep adl bir nitelik sunar. Bu komut farkl
sistemlerde farkl ktlar verecektir:
>>> os.sep
/ #GNU/Linux
\\ #Windows

GNU/Linux ve Windowstaki dizin ayralarnn birbirlerinden farkl oldu


guna dikkat edin. Bu sep
niteli
gi sayesinde birden fazla i
sletim sisteminde al
sabilecek programlar yazma ihtimalimiz
artar. Bir rnek verelim:
>>> dizin = os.getcwd() + "\\resimler"

Bu yap sadece Windows iin uygundur. nk biz burada kodumuzun iine do


grudan
\\ ayracn koyarak programmzn GNU/Linuxta al
smasn engelledik. Bu s
ekilde dizin
ayralarn kodun iine gmmek yerine os.septen faydalanabiliriz:
>>> dizin = os.getcwd() + os.sep + "resimler"

Bu s
ekilde Python uygun dizin ayracn otomatik olarak yerine yerle
stirecektir.
mkdir ve makedirs Fonksiyonlar
Bu blmde, os modl iinde yer alan iki nemli fonksiyondan sz edece
giz. Bunlar mkdir()
ve makedirs() fonksiyonlardr. Ilk olarak mkdir() fonksiyonuyla ba
slayalm.
mkdir() Fonksiyonu

os modl iinde yer alan mkdir adl fonksiyon yardmyla bilgisayarmzda yeni dizinler olu
sturabiliyoruz. rne
gin:
>>> os.mkdir("DENEME_D
IZ
IN
I")

Bylece o anda al
st
gmz dizin iinde DENEME_DIZINI adl yeni bir dizin olu
sturmu
s olduk.
mkdir() fonksiyonu sadece tek bir dizin olu
sturmamza izin verir. Yani bu fonksiyonu kullanarak birden fazla veya i ie gemi
s dizinler olu
sturamayz. Yani s
yle bir s
ey yapamayz:
>>> os.mkdir("deneme/test")

Ancak s
yle bir s
ey yapabiliriz:
>>> os.mkdir("deneme")
>>> os.mkdir("deneme/test")

Yani bu fonksiyonu kullanarak bir dizin olu


sturduktan sonra o dizin iinde ba
ska dizinler de
olu
sturabiliriz. Ayrca bu fonksiyon yardmyla ayn anda birden fazla dizin olu
sturmak istersek
elbette for dnglerinden de yararlanabiliriz:
>>> dizin_listesi = ["Programlar", "Belgeler", "Resimler"]
>>> for i in dizin_listesi:
...
os.mkdir(i)

mkdir() fonksiyonu GNU/Linuxta mode adl bir parametre daha alr. Bu fonksiyonu kullanarak
dizin olu
stururken mode adl parametreye 0755, 0644 gibi saylar vererek, olu
sturdu
gunuz
klasrn izinlerini belirleyebilirsiniz:
rne
gin s
u komut yardmyla GNU/Linuxta olu
sturdu
gunuz klasrn izinlerini 0755 olarak
ayarlayabilirsiniz:
>>> os.mkdir("dizin", 0755)

Son olarak, e
ger os.mkdir() fonksiyonunu kullanarak, halihazrda var olan bir dizin yaratmaya
al
srsanz, Python size bir hata mesaj gsterecektir.
Gelelim makedirs() fonksiyonuna...
makedirs() Fonksiyonu

makedirs() fonksiyonu bize i ie gemi


s dizinler olu
sturma imkan sa
glar:
>>> os.makedirs("dizin1/dizin2")

Bu komut dizin1 adl bir dizin, bunun iinde de dizin2 adl ba


ska bir dizin olu
sturacaktr.
E
ger olu
sturmaya al
st
gnz dizinler zaten varsa Python bir hata mesaj gsterecektir. Tpk
mkdir() fonksiyonunda oldu
gu gibi makedirs() fonksiyonu da kullanlp kullanlmamas tercihinize kalm
s bir mode parametresi sunar:
>>> os.makedirs("falanca/filanca", 0644)

rmdir() ve removedirs() Fonksiyonlar


Bir nceki blmde os modln kullanarak nasl dizin olu
sturaca
gmz
grenmi
stik. Bu
blmde ise olu
sturdu
gumuz bu dizinleri silmeyi
grenece
giz. Bunun iin os modlnde yer
alan iki adet fonksiyondan yararlanaca
gz. Bu fonksiyonlardan birinin ad rmdir() br ise
removedirs(). ncelikle rmdir() fonksiyonundan ba
slayalm:

rmdir() Fonksiyonu

Bu fonksiyon yardmyla tek bir dizini silebiliyoruz:


>>> os.rmdir("dizin")

Ancak e
ger silmek istedi
gimiz dizinin ii doluysa Python bize bir hata mesaj gsterecektir.
Dolaysyla bu fonksiyonu kullanarak ii dolu dizinleri silemeyiz. Ama diyelim ki elimizde ii
bo
s, ama i ie gemi
s dizinler varsa bu fonksiyon yardmyla bunlar silebiliriz.
Diyelim ki sistemimizde dizin1 adl bir dizin, bunun iinde de dizin2 adl bo
s bir dizin daha
var. Biz rmdir() fonksiyonunu kullanarak dizin1i silemeyiz. nk dizin1 bo
s de
gildir
(dizin1in iinde dizin2 var). Ama istersek dizin2yi silebiliriz. nk bu dizinin iin bo
s:
>>> os.rmdir("dizin1/dizin2")

Bu komut yalnzca dizin2yi silecek, dizin1e ise dokunmayacaktr. Ama e


ger dizin2yi
sildikten sonra dizin1in iinde ba
ska hi bir dosya veya klasr kalmam
s, yani dizin1in ii
bo
salm
ssa, bu komutu tekrar yazarak dizin1i de silebiliriz:
>>> os.rmdir("dizin1")

Grd
gnz gibi, rmdir() fonksiyonu tek bir bo
s dizin zerinde i
slem yapabiliyor. Elbette bu
fonksiyonu bir for dngsne sokarak birden fazla bo
s dizini de silebilirsiniz...
Sra geldi removedirs() adl fonksiyona...
removedirs() Fonksiyonu

Bu fonksiyon genellikle yanl


s anla
slr. Bir defa s
unu bilmeliyiz ki bu fonksiyon ii dolu dizinleri
silmek iin kullanlmaz. Bu fonksiyon birden fazla dizini silmek iin de kullanlmaz... Peki bu
removedirs() denen fonksiyon ne i
se yarar?
Diyelim ki sistemimizde dizin1 adl bir dizin, bunun iinde dizin2 adl ba
ska bir dizin, bunun
iinde de dizin3 adl ba
ska bir dizin var. S
imdi s
yle bir komut verelim:
>>> os.removedirs("dizin1/dizin2/dizin3")

Bu komutu alan Python, sondan ba


sa do
gru ilerleyecek ve yoluna kan btn bo
s dizinleri silecektir. Ama Python bu i
slem srasnda kar
ssna kan ilk ii dolu dizinde silme i
slemini keser...
Yani e
ger bu dizinin nn de ii bo
ssa removedirs() fonksiyonu bu dizinin n de
siler. E
ger dizin1in iinde dizin2 harici ba
ska dosyalar da varsa, removedirs() fonksiyonu dizin2 ve dizin3 siler. E
ger dizin2nin iinde ba
ska dosyalar varsa, bu fonksiyon
sadece dizin3 siler. E
ger dizin3n iinde ba
ska dosyalar var ise hi bir s
ey silmez... E
ger
bu dediklerim biraz kar
sk geldiyse, kendi kendinize baz denemeler yaparak removedirs()
fonksiyonunun tam olarak ne i
s yapt
gn daha net olarak grebilirsiniz.
Peki rmdir() ve removedirs() fonksiyonlarndan hibiri ii dolu dizinleri silemiyorsa, biz ii
dolu dosyalar silmek istersek ne yapaca
gz? Hi endi
selenmeyin. Pythonda bunun iin kullanlan ba
ska aralar vardr. Onlar da bir iki blm sonra grece
giz.
rename Fonksiyonu
S
imdiye kadar Pythondaki os modln kullanarak dizin olu
sturmay (mkdir/makedirs) ve
olu
sturdu
gumuz bu dizinleri silmeyi (rmdir/removedirs)
grendik. Peki ya biz olu
sturdu
gu-

muz dizinlerin adn de


gi
stirmek istersek ne yapaca
gz? I
ste burada devreye rename() adl
fonksiyon girecek.
rename() fonksiyonunun forml s
udur:
>>> os.rename("dizinin_eski_ad", "dizinin_yeni_ad")

Diyelim ki sistemimizde documents adl bir dizin var ve biz bu dizinin adn belgeler olarak
de
gi
stirmek istiyoruz. I
ste burada os.rename() fonksiyonu i
simizi grecektir:
>>> os.rename("documents", "belgeler")

Bu fonksiyon iin, zerinde i


slem yapaca
g dizinin bo
s olup olmamas farketmez. rename()
fonksiyonu hem bo
s hem de dolu dizinlerin isimlerini ba
saryla de
gi
stirebilir.
system Fonksiyonu
os modl iinde yer alan system adl fonksiyon, olduka faydal bir aratr. Ayrca bu ara,
os modl iindeki fonksiyon ve nitelikler arasnda en sk kullanlanlardan biridir. Bu fonksiyon
yardmyla i
sletim sistemimize ili
skin komutlar Python iinden al
strabiliriz:
if os.name == "nt":
os.system("C:\Program Files\Internet Explorer\iexplore.exe www.istihza.com")
elif os.name == "posix":
os.system("firefox www.istihza.com")

E
ger kulland
gmz sistem Windows ise Internet Explorer programn kullanarak istihza.com
adresine gidiyoruz. E
ger kulland
gmz sistem GNU/Linux ise ayn i
slemi Firefox kullanarak
yapyoruz...
Herhalde sylememize gerek yok... system adl bu fonksiyon, sistem komutlarn al
strd
g
iin, bu fonksiyonu kullanrken dikkatli olmamz gerekir...
os.path Modl
Aslnda Pythonda os.path veya path adl bir modl yoktur. Bunun yerine, GNU/Linux iin
posixpath ve Windows iin nt.path adl iki farkl modl bulunur. os.path ad bu iki modl
yerine kullanlan bir takma addr. Biz kulland
gmz sisteme gre do
grudan bu iki modlden
birini ie aktarmakla u
gra
smyoruz. Bizim yapmamz gereken tek s
ey os modln ie aktarp,
path niteli
gine ise os.path biimini kullanarak eri
smektir. Python kulland
gmz sistemi kendisi tespit edip, ntpath veya posixpath modllerinden birini otomatik olarak ie aktaracaktr.
S
imdi etkile
simli kabukta s
u komutu verelim:
>>> os.path.__file__

Bu komutun ktsnda, kulland


gnz i
sletim sistemine ba
gl olarak, os.path isminin hangi
dosyaya ba
gl oldu
gu ve bu dosyann sistemdeki konumu grnecektir. S
imdi bu komutun
sizi gtrd
g yere gidip ntpath.py veya posixpath.py dosyalarnn ieri
gini inceleyin. Bu
dosyalarn en ba
snda baz aklamalar greceksiniz. Mesela posixpath.py dosyasnn en
ba
snda s
u aklama var:
Common operations on Posix pathnames. Instead of importing this module directly,
import os and refer to this module as os.path. The os.path name is an alias for this
module on Posix systems; on other systems (e.g. Mac, Windows), os.path provides
the same operations in a manner specific to that platform, and is an alias to another

module (e.g. macpath, ntpath). Some of this can actually be useful on non-Posix
systems too, e.g. for manipulation of the pathname component of URLs.
Bu paragrafta, os.path modlnn, GNU/Linux iin yazlm
s posixpath modlne atfta bulunan bir takma ad oldu
gundan bahsediliyor. Buradaki aklamaya gre, os.path modl ba
ska
i
sletim sistemlerinde de macpath veya ntpath gibi modllere atfta bulunan bir takma addr
ayn zamanda... Buna benzer bir aklamay ntpath.py dosyasnda da bulabilirsiniz. E
ger bu
aklamaya etkile
simli kabuktan eri
smek isterseniz ne yapmanz gerekti
gini biliyorsunuz:
>>> print(os.path.__doc__)

Bu komutun ktsnda, kulland


gnz sisteme ba
gl olarak farkl aklamalar greceksiniz.
Bu .py uzantl dosyalarn bulundu
gu dizinde os.py adl bir dosya daha greceksiniz. I
ste
bu dosya, biz etkile
simli kabukta import os komutunu verdi
gimizde ie aktarlan modldr...
En ba
sta modln ne demek oldu
gunu tanmlarken syledi
gimiz gibi, Python modlleri (o
gunlukla) .py uzantl birer dosyadr. Bu os.py adl dosyay ap iine dikkatlice bakn. Bu
blmde bahsetti
gimiz, makedirs, mkdir, removedirs gibi fonksiyonlar ve name gibi nitelikleri bu os.py adl modl iinde bulup, bunlarn nasl tanmland
gn inceleyebilirsiniz. Bu
dosya iindeki her s
eyi anlamak zorunda de
gilsiniz. Sadece gz ucuyla inceleseniz bile Python
programlarnn nasl yazlaca
g konusunda epey fikir sahibi olabilirsiniz...
os.py dosyas iinde s
yle bir kod paras greceksiniz:
if "posix" in _names:
import posixpath as path
elif "nt" in _names:
import ntpath as path

Bu blmn ba
sndan beri anlatt
gmz s
eylerin os.py dosyas iinde nasl tanmland
gna
dikkat edin.
Yukardaki kod parasnda, biz etkile
simli kabukta import os komutu
verdi
gimizde, kulland
gmz i
sletim sistemine gre hangi modln path adyla a
grlaca
g
belirtiliyor. Buna gre, e
ger GNU/Linux kullanyorsak posixpath adl modl path takma adyla
a
grlyor. Ayn s
ekilde Windows kullanclar iin de ntpath adl modl path adyla ie aktarlyor...
S
imdi biraz pratik yapalm:
>>> import os
>>> dir(os.path)

Burada, os.path adl modln iinde neler oldu


gunu gryoruz. Kulland
gnz sisteme gre
posixpath.py veya ntpath.py dosyalarnn ieri
gini tekrar kontrol ederseniz, bu listedeki
nitelik ve fonksiyonlarn nasl tanmland
gn inceleyebilirsiniz...
S
imdi bu modln iindeki nemli nitelik ve fonksiyonlar ksaca inceleyelim:
os.path.abspath()

Bu fonksiyon, bize bir dosyann tam yolunu verir:


>>> os.path.abspath("falanca.pdf")

os.path.abspath() fonksiyonunun grevi bir dosyann nerede oldu


gunu bulmak de
gildir.
Hatta bu fonksiyon, kendisine parametre olarak girdi
giniz dosya adnn gerek olup olmad
gyla dahi ilgilenmez... Bu fonksiyonun grevi, bir dosya adn almak ve bunu o anda
iinde bulunulan dizinin sonuna yap
strmaktr... Mesela bilgisayarnzda olmayan bir dosya

ad vermeyi deneyin bu fonksiyona... rne


gin yukarda verdi
gimiz falanca.pdf adn kullann. Diyelim ki o anda iinde bulundu
gunuz dizin home/kullanc_ad/Desktop. S
u halde
os.path.abspath(falanca.pdf) komutunun kts home/kullanc_ad/Desktop/falanca.pdf
olacaktr. S
u anda bulundu
gunuz dizinin ne oldu
gunu os.getcwd() komutuyla
grenebilece
ginizi biliyorsunuz.
os.path.basename()

Bu fonksiyon bir yol iindeki dosya adn verir bize... rne


gin:
>>> os.path.basename("/home/istihza/Desktop/falanca.pdf")
falanca.pdf

Tpk os.path.abspath() fonksiyonunda oldu


gu gibi, os.path.basename() fonksiyonu da yol
adnn gerek olup olmad
gyla ilgilenmez. Yani bu fonksiyonu hayali yol adlaryla birlikte de
kullanabilirsiniz:
>>> os.path.basename("/dangl/dungul/bangl/bungul/fzel.pfg")
fzel.pfg

os.path.exists

Bu fonksiyon, bir dosyann var olup olmad


gn kontrol eder. E
ger dosya varsa True, yoksa
False kts verir:
>>> os.path.exists("falanca.txt")

E
ger o anda al
slan dizin iinde falanca.txt adl bir dosya varsa True, yoksa False kts
alrz. Bu fonksiyonu uzak konumlardaki dosyalarn varl
gn kontrol etmek iin de kullanabiliriz:
>>> os.path.exists("/home/istihza/Desktop/deneme.py")

os.path.getsize

Bu fonksiyon yardmyla bir dosyann boyutunu bayt cinsinden elde edebiliriz:


>>> os.path.getsize("falanca.odt")
27135

Demek ki falanca.odt adl dosyann boyutu 27135 baytm


s. Yani yakla
sk 27 kilobayt...
os.path.isdir ve os.path.isfile

isdir() fonksiyonu bir


seyin dizin olup olmad
gn kontrol eder. E
ger sorgulad
gmz s
ey bir
dizin ise bu fonksiyon True de
gerini, de
gilse False de
gerini verir:
>>> os.path.isdir("falanca")

isfile() fonksiyonu ise bir s


eyin dosya olup olmad
gn kontrol eder:

>>> os.path.isfile("falanca")

os.path.split

Isterseniz bu fonksiyonun ne yapt


gna do
grudan bir rnekle bakalm:
>>> os.path.split("/usr/share/harman/harman.py")
(/usr/share/harman, harman.py)

Grd
gnz gibi, bu fonksiyon yol ve dosya adn aykladktan sonra bunlar bize bir demet
olarak verdi...
os.path.join

os.path modl iindeki sk kullanlan fonksiyonlardan biri de joindir. Bu kelime Trkede


birle
stirmek anlamna gelir. join fonksiyonu, kendisine verdi
gimiz parametreleri alp bir
dizin haline getirir. Mesela s
u komut o anda iinde bulunulan dizin iindeki, zel dosyalar
ve resimler adl klasrleri birle
stirip, kullanlan i
sletim sisteminin yapsna uygun bir yol ad
olu
sturacaktr:
>>> dizin = os.path.join(os.getcwd(), "zel dosyalar", "resimler")
C:\\Documents and Settings\\ISTIHZA\\Desktop\\zel dosyalar\\resimler

...veya...
/home/istihza/Desktop/zel dosyalar/resimler

11.2.2 sys Modl


Pythondaki nemli modllerden biri de sys adl modldr. Bu modl Python sistemiyle ilgili
nitelikler ve fonksiyonlar barndrr. os modlnn aksine, sys adl bu modln Python dilinde
yazlm
s bir kaynak kodu yoktur. Bu modl C programlama dili ile yazlm
str. Dolaysyla, sistemde sys.py adl bir dosya bulunmad
g iin, sys.__file__ gibi bir komut bu modl zerinde
al
smayacaktr.
Her zamanki gibi, bu modln ieri
gini s
u s
ekilde gryoruz:
>>> import sys
>>> dir(sys)

Bu ktdaki
geler, kulland
gnz i
sletim sistemine gre farkllk gsterebilir. rne
gin winver
adl nitelik sadece Windowsta al
sacaktr...
Bu blmde sys modlnn iindeki fonksiyon ve niteliklerden en nemli olanlarn i
slemeye
al
saca
gz. Burada i
sleyece
gimiz nitelik ve fonksiyonlar s
unlardr:
1. sys.argv
2. sys.executable
3. sys.exit
4. sys.getdefaultencoding

5. sys.path
6. sys.platform
O halde dilerseniz vakit kaybetmeden ilk
gemizle i
se koyulalm...

argv Niteligi
Bu nitelik sys modlnn en fazla kullanlan
gelerinden bir tanesidir. argv yap olarak aslnda
basit bir listeden ibarettir. Pythonu normal bir s
ekilde ba
slatp etkile
simli kabukta s
u komutu
verecek olursak alaca
gmz kt ii bo
s bir karakter dizisi ieren tek
geli bir liste olacaktr:
>>> sys.argv
[]
>>> len(sys.argv)
1

Grd
gnz gibi, elimizdeki s
ey bir listeden ibarettir... Peki bu sys.argv denen s
ey ne i
se
yarar?
sys.argv bize Pythonun hangi parametrelerle ba
slatld
gn gsterir. Dilerseniz bunu basite
test edelim. S
imdi bir Python dosyasna s
u kodlar yazalm:
import sys
print(sys.argv)

Daha sonra bu dosyay mesela deneme.py adyla kaydedelim ve komut satrna gidip bu
program al
stralm:
python3 deneme.py
[deneme.py]

Buradan grd
gmze gre python3 uygulamas deneme.py adl parametre ile al
strlm
s...
Dedi
gimiz gibi, sys.argv bir listedir. Dolaysyla bu listenin
gelerine rahatlkla eri
sebilirsiniz:
print(sys.argv[0])
deneme.py

Peki sys.argvnin bize verdi


gi bu bilgi neye yarar?
sys.argvden elde etti
gimiz kty kullanarak programmzla ilgili baz nemli i
slevleri yerine
getirebiliriz. Mesela yukardaki rne
gi s
yle al
strmay deneyelim:
python3 deneme.py --yardm
[deneme.py, --yardm]

Bu defa sys.argv kts iki


geli bir liste verdi. I
ste bu listeyi kullanarak mesela s
yle bir s
ey
yazabilirsiniz:
import sys
if "--yardm" in sys.argv:
print("""

Yardm blmne ho
sgeldiniz. Burada programn nasl kullanlaca
gna
ili
skin ksa bilgiler bulacaksnz.""")

E
ger kullancmz yazd
gmz program yardm parametresiyle birlikte a
grrsa, kendisine
programmza ili
skin yardm bilgileri sunuyoruz:
python3 deneme.py --yardm

Bu komut s
yle bir kt verecektir:
Yardm blmne ho
sgeldiniz. Burada programn nasl kullanlaca
gna
ili
skin ksa bilgiler bulacaksnz.

sys.argvyi kullanarak, programnzn parametreli mi yoksa parametresiz mi al


strld
gn
denetlemek iin sys.argvnin uzunlu
gunu kontrol edebilirsiniz:
import sys
if len(sys.argv) < 2:
print("programmz parametresiz olarak al
strdnz!")
else:
print("programmz parametreli olarak al
strdnz!")

E
ger sys.argv adl listenin uzunlu
gu 2den azsa program parametresiz al
strlm
s demektir. E
ger uzunluk 2 ya da daha fazla ise kullancmz programmza en az bir adet parametre
eklemi
s demektir...
executable, getdefaultencoding ve platform
Bu blmde minik nitelikten/fonksiyondan bahsedece
giz. Bunlar sys.executable ve
sys.platform" adl nitelikler ile sys.getdefaultencoding() adl fonksiyondur. Bu

ge bize sistem hakknda baz bilgiler verir. nce sys.executable niteli
ginin ne verdi
gine
bakalm:
>>> sys.executable

Bu komut bize kulland


gmz sisteme ba
gl olarak, al
strlabilir Python dosyasnn adn ve
konumunu verecektir. Mesela GNU/Linuxta bu komutun kts /usr/bin/python3 gibi bir s
ey
olurken, Windowsta c:\python3x\python.exe olacaktr...
sys.getdefaultencoding fonksiyonu ise Pythonun varsaylan olarak hangi kodlama sistemini
kulland
gn gsterir:
>>> sys.getdefaultencoding()

Bu komut utf-8 kts verecektir. Pythonun 2.x srmlerinde bu komutun kts ascii idi...
Pythonun 3.x srmyle birlikte gelen utf-8 deste
gi sayesinde Ingiliz alfabesinde bulunmayan harflerle de i
slem yapabiliyoruz...
Son olarak sys.platform adl niteli
gin ktsna bakaca
gz:
>>> sys.platform

Bu komut Windowsta win32 ktsn verirken GNU/Linuxta linux2 ktsn verecektir. Bu


komutun kts kullanlan sistemin zelli
gine gre farkllk gsterebilir...

exit Fonksiyonu
exit kelimesi kmak anlamna geliyor. Adndan da anla
slaca
g gibi, bu fonksiyon Python
programndan kmamz sa
glar. Bunu s
u s
ekilde kullanyoruz:
sys.exit()

E
ger yazd
gmz bir programn herhangi bir a
samasnda program terketmemiz gerekirse
sys.exit() fonksiyonundan yararlanabiliriz:
import sys
say = "23"
while True:
soru = input("Bir say tutun: ")
if soru == say:
sys.exit()
else:
continue

Burada e
ger kullancnn girdi
gi say 23e e
sitse programdan klacaktr...

path Niteligi
Hatrlarsanz, nceki derslerimizde os.path adl bir modlden sz etmi
stik. S
imdi i
sleyece
gimiz sys.path modln daha nce i
sledi
gimiz os.path modlyle kar
strmamamz
gerekiyor. Isim olarak birbirlerine benzeseler de bu iki
genin grevleri birbirinden ok farkldr.
sys modlnn path niteli
gi bize Pythonun modlleri ie aktarma sistemiyle ilgili nemli bilgiler verir. Dilerseniz bu path niteli
gini anlatmaya ba
slamadan nce biraz modl ie aktarma
sisteminden sz edelim.
Pythonda import modl_ad komutunu verdi
gimizde, Python arad
gmz modl bulabilmek iin sistem zerinde birka farkl konuma bakar. Biz import modl_ad komutunu
verdi
gimizde Pythonun ilk bakaca
g yer o anda iinde bulundu
gumuz dizindir. Yani Python
ncelikle os.getcwd() ile elde edilen dizin adnn iini kontrol edecektir. E
ger arad
gmz modl
bu dizin iinde yoksa, Pythonun kendi iinde tanml olan zel dizinlerin ieri
gi kontrol edilecektir. E
ger aranan modl hi bir yerde bulunamazsa Python bize bir hata mesaj gsterecektir.
Pythonun, bir modl bulamamas durumunda verdi
gi hata s
yledir:
import falanca
ImportError: No module named falanca

Daha nce de szn etti


gimiz gibi, Pythonun kendi iinde bulunan modller haricinde bir de
internet zerinden veya ba
ska kaynaklardan elde edilen modller vardr. O modlleri kullanabilmek iin ncelikle ilgili modl bilgisayarmza kurmamz gerekir. Dolaysyla e
ger isterseniz, o modlleri kullanarak yazd
gnz programlarda s
yle bir kontrol kodu yazabilirsiniz:
try:
import falanca
except ImportError:
print("falanca adl modl bilgisayarnzda kurulu de
gil.")
print("Bu modl filanca adresinden indirebilirsiniz.")

Bylece harici bir modle ba


gml olan programnz, son kullanc iin anlamsz bir hata retmek
yerine, kullancya daha makul bir mesaj gsterebilecektir...
Dedik ki, e
ger arad
gmz modl o anda al
st
gmz dizin iinde yoksa, Python kendi iinde
tanml olan zel dizinlerin ieri
gini kontrol edecektir... Peki bu dizinler hangileridir? I
ste burada
sys.path adl nitelik devreye giriyor. S
imdi bu niteli
gin ktsna bakalm:
>>> sys.path

Bu komutun ktsnda grnen dizinler, o bahsetti


gimiz zel dizinlerdir. E
ger o anki al
sma
dizininde bulunamayan modl sys.path listesinden elde edilen ktdaki dizinlerde de yoksa,
yukarda bahsetti
gimiz ImportError adl hata verilecektir...
Dedi
gimiz gibi, sys.path aslnda bir listeden ibarettir. Dolaysyla listelerin btn metotlarn
destekler. Mesela listelerin append adl metodunu kullanarak, herhangi bir dizini bu listeye
ekleyebilirsiniz:
>>> sys.path.append("/falanca/filanca/")

Elbette bu de
gi
siklik kalc olmayacaktr. Programnz veya etkile
simli kabu
gu kapatt
gnzda
sys.path listesi zgn haline geri dnecektir.

11.3 Kendi Modllerimizi Yazmak


S
imdiye kadar hep halihazrda yazlm
s olan modlleri kullanmay
grendik. Bu blmde ise
modllerimizi kendimiz yazmay ve kullanmay
grenece
giz.
En ba
sta da dedi
gimiz gibi, sonu .py uzants ile biten btn dosyalar aslnda bir modldr
ve ba
ska programlarn iine aktarlabilme potansiyeli ta
srlar. Bununla ilgili ok basit bir rnek
verelim. Diyelim ki elimizde s
yle bir kod var:
isim = "istihza"
eposta = "kistihza[at]yahoo[nokta]com"

Yine diyelim ki bu kodlar bilgi.py adl bir dosya iinde bulunuyor. I


ste bu bilgi.py adl dosya
bir modldr ve bu modln ad da bilgidir... Dolaysyla bu modl ba
ska bir program
iinden a
grabiliriz.
S
imdi mesela bilgi.pynin oldu
gu klasr iinde deneme.py adl ba
ska bir dosya daha olu
sturup iine s
unu yazalm:
import bilgi

Geen blmlerde sys.path konusunu anlatrken, Pythonun bir modl bulmak iin hangi
dizinlere bakt
gn sylemi
stik. Orada da dedi
gimiz gibi, Python arad
gmz bir modl bulabilmek iin nce o anda al
slan dizinin iine ardndan da sys.path iinde grnen dizinlere
bakar. E
ger arad
gmz modl bu dizinlerin hibirinde bulunamazsa, Python bize bir hata mesaj
gsterir. Dolaysyla kendi yazd
gmz modlleri pratik s
ekilde kullanabilmek iin en makul yol,
modllerimizi ve bu modlleri a
grmak iin kulland
gmz ana programmz ayn klasr iine
yerle
stirmektir. Yani bu bilgi.py adl dosyay ve bu modl ie aktarmak iin kulland
gmz
deneme.py adl dosyay ayn dizin iine koyarsak, bilgi adl modl ie aktarmak kolay
olacaktr...
Yukarda gsterdi
gimiz import bilgi komutunu verdikten sonra bilgi.py iindeki btn nitelikleri deneme.py adl dosyann iine aktarm
s oluyoruz. Artk bilgi adl modln bize sundu
gu btn olanaklardan yararlanabiliriz. Mesela bilgi.py iindeki isim adl niteli
ge eri
smek
iin s
yle bir s
ey yazabiliriz:

import bilgi
print(bilgi.isim)

Bu kodlarn kts s
u olacaktr:
istihza

Bu bilgi adl modl tpk daha nce


grendi
gimiz os ve sys modlleri gibi kulland
gmza
dikkat edin. Mesela os modl iindeki name adl niteli
ge eri
smek iin s
yle bir s
ey yazyorduk:
import os
print(os.name)

Ayn s
ekilde bilgi modl iindeki isim adl niteli
ge eri
smek iin de bilgi.isim komutunu
veriyoruz..
Elbette modlmzn iine fonksiyon da yazabiliriz. Mesela daha nceki derslerimizin birinde
yazd
gmz arp() adl fonksiyonu bu modl iine yerle
stirelim:
isim = "istihza"
eposta = "kistihza[at]yahoo[nokta]com"
def arp(liste):
a = 1
for i in liste:
a = i * a
print(a)

Artk bilgi adl modlmzn, isim ve eposta adl niteliklerinin yansra, arp adl bir fonksiyonu da var... Bu fonksiyona s
u s
ekilde eri
sebilece
gimizi biliyorsunuz:
import bilgi
lis = [20, 45, 55]
bilgi.arp(lis)

Burada nemli bir noktaya de


ginmemizde yarar var. zellikle etkile
simli kabuk zerinde
al
srken, ie aktarma konusunda Pythonun bir zelli
gine dikkat etmemiz gerekir. Python
ayn oturum iinde bir modl sadece bir kez ie aktarr. Yani biz etkile
simli kabukta import
modl_ad komutunu ilk veri
simizde modlmz ie aktarlr. Bundan sonra verece
gimiz import modl_ad komutlar hi bir i
se yaramaz. Bunu s
yle test edebiliriz. Diyelim ki bilgi.py
adl dosyamz masastnde kaytl. S
imdi etkile
simli kabu
gu masastnn oldu
gu dizinde ap
s
u komutlar verelim:
>>> import bilgi
>>> dir(bilgi)
[__builtins__, __doc__, __file__, __name__,
__package__, eposta, isim, arp]

Grd
gnz gibi, bizim tanmlad
gmz eposta, isim ve arp
geleri modlmzn iinde
grnyor. S
imdi bilgi.py adl dosyay ap iine s
yle bir ekleme yapalm:
telefon = "02121231212"

Yani dosyamzn son hali s


yle grnecek:
isim = "istihza"
eposta = "kistihza[at]yahoo[nokta]com"

telefon = "02121231212"
def arp(liste):
a = 1
for i in liste:
a = i * a
return a

S
imdi etkile
simli kabukta bu modln ieri
gini tekrar kontrol edelim:
>>> dir(bilgi)

Grd
gnz gibi, modle yeni ekledi
gimiz telefon niteli
gi listede grnmyor. nk eklemeler modle otomatik olarak kaydedilmiyor. S
imdi modlmz tekrar ie aktarmay
deneyelim:
>>> import bilgi
>>>dir(bilgi)

Listede yine herhangi bir de


gi
siklik olmad
gna dikkat edin. Zaten telefon niteli
gini kullanamamamzdan da bellidir bu:
>>> bilgi.telefon
AttributeError: module object has no attribute telefon

Bu hata mesaj s
yle evrilebilir: NitelikHatas: module nesnesinin telefon adl bir niteli
gi
yok
Halbuki biz bu modle biraz nce telefon adl bir nitelik eklemi
stik...
E
ger bunun gibi durumlarda modlmz tekrar ie aktarmak istersek Pythondaki imp adl bir
modln reload adl fonksiyonundan yararlanmamz gerekir:
>>> import imp
>>> imp.reload(bilgi)

Artk modlmzn telefon adl niteli


gini kullanabiliriz:
>>> print(bilgi.telefon)
02121231212

Dolaysyla modllerimizi tazeleme ihtiyac duydu


gumuzda yardmmza ko
sacak fonksiyon,
imp modlnn reload fonksiyonudur...

11.4 if __name__ == __main__


Pythonda, kendi yazd
gnz modller de dahil, dir() fonksiyonunu kullanarak hangi modln
iine bakarsanz bakn orada __name__ adl bir nitelik grrsnz. name kelimesi Trkede
isim anlamna geliyor. Bu fonksiyon bize modln adnn ne oldu
gunu sylemekle ykmldr.
Bir modln farkl durumlara gre iki ad bulunur: __main__ veya modln kendi ad...
Hemen bir rnek verelim... S
imdi bo
s bir dosyaya s
u satr yazp isim.py adyla kaydedelim:

print(__name__)

Daha sonra ba
ska bir bo
s dosyaya s
u satr yazp test.py adyla kaydedelim:
import isim

S
imdi komut satrnda s
u komutu verelim:
python3 isim.py

Bu komutun kts __main__ olacaktr. S


imdi de s
una bakalm:
python3 test.py

Bu komut ise isim ktsn verecektir...


Buradan s
u sonular karyoruz:
1. E
ger bir modl do
grudan al
strlrsa __name__ niteli
gi (yani ismi) __main__ oluyor.
2. E
ger bir modl do
grudan de
gil de bir ba
ska program iinden a
grlyorsa __name__ niteli
gi
modln kendi ad oluyor.
Yukardaki rnekte, python3 isim.py komutunu vererek isim adl modl do
grudan al
strm
s olduk. Dolaysyla __name__ niteli
ginin de
geri __main__ oldu. python3 test.py komutunu verdi
gimizde ise isim adl modl test.py adl program iinden a
grm
s olduk. Bu yzden
de __name__ niteli
ginin de
geri modln kendi ad olan isim oldu...
Peki bu zellik ne i
simize yarar?
Pythonda __name__ niteli
ginin de
gerini kontrol ederek, yazd
gnz modlleri test edebilirsiniz.
Mesela bir nceki blmde verdi
gimiz rne
gi ele alalm:
isim = "istihza"
eposta = "kistihza[at]yahoo[nokta]com"
telefon = "02121231212"
def carp(liste):
a = 1
for i in liste:
a = i * a
return a

Bu modl bu haliyle do
grudan al
strld
g zaman herhangi bir kt vermez (dosya adnn deneme.py oldu
gunu varsayyoruz):
python3 deneme.py

S
imdi bu dosyaya s
yle bir ekleme yapalm:
if __name__ == "__main__":
lis = [2, 3, 4]
print("deneme amal hesap i
sleminin sonucu: ", carp(lis))

Yani programmzn en son hali s


yle grnecek:
isim = "istihza"
eposta = "kistihza[at]yahoo[nokta]com"
telefon = "02121231212"
def carp(liste):

a = 1
for i in liste:
a = i * a
return a
print(__name__)
if __name__ == "__main__":
lis = [2, 3, 4]
print("deneme amal hesap i
sleminin sonucu: ", carp(lis))

Komut satrnda python3 deneme.py komutunu verdi


gimizde s
u kty elde ederiz:
deneme amal hesap i
sleminin sonucu: 24

Bylece yazd
gmz modln al
sp al
smad
gn ufak bir kod parasyla test etmi
s olduk. Artk
bu modl gvenle ba
ska programlar iinden a
grabiliriz. Mesela test.py adl bir dosya
olu
sturup s
u kodlar yazmay deneyelim:
import deneme
lst = [20, 10, 30]
print("test.py modlnden a
grlarak yaplan hesap i
sleminin sonucu: ", deneme.carp(lst))

Komut satrnda python3 test.py komutunu verdi


gimizde ise s
u sonucu elde edece
giz:
test.py modlnden a
grlarak yaplan hesap i
sleminin sonucu:

6000

Burada durumu birazck daha somutla


strmak iin modl iine s
u satr ekleyerek arka planda
neler olup bitti
gini grebilirsiniz:
print("__name__ niteli
ginin de
geri: ", __name__)

S
yle:
isim = "istihza"
eposta = "kistihza[at]yahoo[nokta]com"
telefon = "02121231212"
def carp(liste):
a = 1
for i in liste:
a = i * a
return a
print("__name__ niteli
ginin de
geri: ", __name__)
if __name__ == "__main__":
lis = [2, 3, 4]
print("deneme amal hesap i
sleminin sonucu: ", carp(lis))

Burada modl ne s
ekilde al
strd
gmza ba
gl olarak __name__ niteli
ginin de
gerinin nasl
de
gi
sti
gine dikkat edin...

BLM

12

Pythonda Dosya Is
lemleri

Bu blmde Python programlama dilini kullanarak sistemimizdeki dosyalar nasl ynetece


gimizi
grenece
giz. Konumuz temel olarak, bir dosyann nasl alaca
g, bu dosya zerinde
nasl i
slem yaplaca
g ve dosya zerindeki i
slemler bittikten sonra bu dosyann nasl kapatlaca
gdr.
Ileride yazaca
gnz programlarda sklkla kullanaca
gnz bilgileri barndrd
g iin, bu blm
dikkatlice incelemenizi tavsiye ederim... O halde en temel bilgilerle ba
slayalm.

12.1 Varolan bir Dosyay Okumak zere Amak


Bir nceki blmde modlleri i
slerken os modl iindeki listdir() adl bir fonksiyon
yardmyla bilgisayarmzdaki dizinlerin ieri
gini listelemeyi
grenmi
stik. S
imdiki blmde ise,
listeledi
gimiz bu dizinler iindeki dosyalar amay
grenece
giz.
Diyelim ki bilgisayarmzda s
u adda bir dosya var:
liste.txt

Bu dosya zerinde herhangi bir i


slem yapabilmek iin, ilk i
s olarak bu dosyay amamz
gerekiyor. Dosyalarmz Python ile aabilmek iin open() adl bir fonksiyondan yararlanaca
gz.
Gelin isterseniz bu fonksiyonu kullanarak liste.txt adl dosyamz aalm:
>>> open("liste.txt")

Burada yapt
gmz s
ey, liste.txt adl dosyay amaktan ibaret. Yalnz biz burada, liste.txt
adl dosyann o anda al
st
gmz dizin iinde oldu
gunu varsaydk. Yani bu dosyann yukardaki
komutla alabilmesi iin s
u komutun ktsnda grnyor olmas lazm:
>>> os.listdir(os.curdir) #ya da os.listdir(os.getcwd())

E
ger bu dosya yukardaki komutun ktsnda grnmyorsa, open() fonksiyonu iinde bu
dosyann tam yolunu belirtmemiz gerekir:
>>> open("/home/istihza/Desktop/liste.txt")

...gibi...

226

Yukardaki komutu verdi


gimizde, liste.txt adl dosyay salt-okunur olarak am
s oluyoruz.
Yani burada yapt
gmz s
ey dosyay sadece okumak zere amaktr. Dolaysyla, dosyay bu
s
ekilde at
gmzda zerinde de
gi
siklik yapamayz. Sadece okuyabiliriz bu dosyay...
liste.txt adl dosyay amamz sa
glayan bu open() adl fonksiyon ek olarak bir argman
daha alr. rnek zerinden grelim bunu:
>>> open("liste.txt", "r")

Burada r harfi read kelimesinin ksaltmasdr. Bu kelime Trkede okumak anlamna


gelir. Bu harfin grevi dosyay salt-okunur kipte (sadece okumak zere) amamz sa
glamaktr... E
ger biz open() fonksiyonunun bu ikinci argmann belirtmezsek, Python varsaylan
olarak r argmann vermi
siz gibi davranacaktr. Dolaysyla, open(liste.txt, r) yazmak ile
open(liste.txt) yazmak arasnda hi bir fark yoktur...
r harfi d
snda, open() fonksiyonuyla birlikte kullanabilece
gimiz ba
ska kip belirleme
harfleri de bulunur. Bunlar biraz sonra grece
giz...
Pythonda open() fonksiyonunu kullanarak bir dosyay amaya al
st
gmzda e
ger herhangi
bir hata ortaya kmadan imle bir alt satra geiyorsa bu iyiye i
sarettir ve amaya al
st
gmz
dosyann ba
saryla ald
gn gsterir. E
ger Python amaya al
st
gmz dosyay bulamazsa bize
s
yle bir hata verecektir:
>>> open("falanca.txt")
IOError: [Errno 2] No such file or directory: falanca.txt

Grd
gnz gibi, dosya bulunamad
gnda IOError adl bir hata alyoruz. Yazd
gmz programlarda sklkla bu hatay yakalamamz gerekecektir. Zira dosyalar ile u
gra
st
gmz programlarda,
bir dosyay aarken, ncelikle o dosyann sistemde var olup olmad
gn kontrol etmek iyi bir
yntemdir:
>>> try:
...
open("falanca.txt")
... except IOError:
...
print("Byle bir dosya yok!")

Bylece, e
ger sistemde falanca.txt adl bir dosya bulunmuyorsa, kullanclarmza mantkl
bir hata mesaj gstermi
s oluyoruz.
Pythonda bir dosyay okumak zere nasl aaca
gmz grdk. Ama henz dosyamz okumadk... Peki yukarda gsterildi
gi s
ekilde dosyalar atktan sonra bunlarn ieri
gini nasl
grntleyece
giz?
Okumak zere at
gmz dosyalarn ieri
gini grntlemenin en kolay yolu basit bir for
dngs kurmaktr. Bunu nasl yapaca
gmza bakalm. nce dosyamz ayoruz:
>>> dosya = open("python.txt")

Bu ksm zaten biliyoruz. S


imdi bu dosya zerinde bir for dngs kurarak dosya ieri
gini
grntleyelim:
>>> for satirlar in dosya:
...
print(satirlar)

Bu dng, python.txt adl dosyann btn ieri


gini ekrana dkecektir.
Bylece en basit s
ekilde, varolan bir dosyay nasl ap okuyabilece
gimizi grm
s olduk... S
imdi
yolumuza dosyalarn ba
ska bir ynyle devam edebiliriz.

12.2 Varolan Bir Dosyay Yazmak zere Amak


Bir nceki blmde, varolan bir dosyay okumak zere nasl aaca
gmz
grenmi
stik. Bu
blmde ise varolan bir dosyay yazmak zere aaca
gz.
Hatrlarsanz, nceki blmde dosyay okumak zere amak iin r adl bir kip de
gi
stirme
harfinden sz etmi
stik. Bu harf, dosyay okumak zere at
gmz gsteriyordu. Tpk buna
benzer bir biimde, varolan dosyalara yazabilmek iin de bir kip de
gi
stirme harfi kullanaca
gz.
Bu seferki kip de
gi
stirme harfimiz a. Bu harf Ingilizcedeki append (eklemek, ili
stirmek)
kelimesinin ba
s harfidir. nceki blmde de syledi
gimiz gibi, e
ger dosyay aarken herhangi bir kip de
gi
stirici harf kullanmazsak, Python r yazm
sz gibi davranacaktr. Dolaysyla,
e
ger amacmz bir dosyay okumak zere de
gil de yazmak zere amaksa, ilgili kip de
gi
stirme
harfini (yani ay) mutlaka belirtmemiz gerekir:
>>> dosya = open("falanca.txt", "a")

E
ger bilgisayarnzda falanca.txt adl bir dosya varsa, bu komut varolan dosyay aacaktr.
E
ger byle bir dosya yoksa, bu ada sahip yeni bir dosya olu
sturulacaktr. Dolaysyla bu komutu
yeni bir dosya olu
sturmak iin de kullanabilirsiniz.
S
imdi bu falanca.txt adl dosyann iinde ne yazd
gn kontrol edelim:
>>> for satirlar in dosya:
...
print(satirlar)

Ne oldu? Hata aldnz, de


gil mi? Gayet normal... nk biz dosyamz yazmak zere atk...
Okumak zere de
gil... a ve r kipleri arasndaki bu fark ok nemlidir. Bu ikisi arasndaki
fark unutmamamz gerekir: r dosyay okumamz, a ise dosyaya yazmamz sa
glar... E
ger
dosyann iindekileri grmek istiyorsanz dosyay s
yle amanz gerekiyor:
>>> open("falanca.txt", "r") #veya "r" olmadan...

Neyse... Ne diyorduk? Evet... S


imdi bu dosyaya, a
sa
gda metin adl bir de
gi
sken iine
yerle
stirdi
gimiz satrlar ekleyelim:
metin = """Python, pek ok dile kyasla
grenmesi kolay bir programlama
dilidir. Bu yzden, e
ger daha nce hi programlama deneyiminiz olmam
ssa,
programlama maceranza Pythonla ba
slamay tercih edebilirsiniz."""

Bu satrlar eklemek iin write() adl bir fonksiyondan faydalanaca


gz:
>>> dosya.write(metin)

Grd
gnz gibi, bu write() adl metodu do
grudan dosyann zerine uyguluyoruz...
Bu a
samada nemli bir noktadan bahsetmemiz gerekiyor. Pythonda dosya i
slemleri yaparken
temel olarak s
u a
samay takip etmemiz gerekir:
1. Dosyay amak
2. At
gmz dosya zerinde i
slem yapmak
3. Son olarak da dosyay kapatmak
Biz s
imdiye kadar bu listedeki ilk iki i
slemi yerine getirdik. Yani s
imdiye kadar Pythonla bir
dosyann nasl alaca
gn ve alan bu dosya zerinde nasl i
slem yaplaca
gn inceledik. S
imdi

grenmemiz gereken s
ey dosyay kapatmak olacaktr. Pythonda at
gmz bir dosyay kapatmak iin close() adl ba
ska bir metottan yararlanaca
gz:

>>> dosya.close()

Yukardaki rne
gi basitle
stirerek tekrar grelim:
metin = """Python, pek ok dile kyasla
grenmesi kolay bir programlama
dilidir. Bu yzden, e
ger daha nce hi programlama deneyiminiz olmam
ssa,
programlama maceranza Pythonla ba
slamay tercih edebilirsiniz."""

S
imdi bu de
gi
skeni kullanarak dosya i
slemlerimizi gerekle
stirelim:
>>> dosya = open("falanca.txt", "a")
>>> dosya.write(metin)
>>> dosya.close()

Burada open() adl fonksiyonu kullanarak ncelikle dosyamz atk. Daha sonra write()
metodu yardmyla dosya zerinde bir i
slem yaptk. En son da close() metodunu kullanarak
dosyamz kapattk. E
ger yazd
gmz uygulamalarda, at
gmz bir dosyay kapatmay ihmal
edersek, dosyamz zerinde yapt
gmz son de
gi
siklikler dosyada grnmeyebilir. Ayrca, kulland
gmz i
sletim sisteminin yntemlerini kullanarak (mesela dosyay seip delete tu
suna
basarak) ak olan bir dosyay silmeye al
smak bizi hsrana u
gratacaktr...
Gelin isterseniz bu noktada bir nefes alp, s
imdiye kadar
grendi
gimiz s
eyleri ok ksaca
zetleyelim:
1. Pythonda bir dosyay amak iin open() adl bir fonksiyondan yararlanyoruz.
2. E
ger dosyamz okumak zere aacaksak kip de
gi
stirme harfi olarak ryi kullanyoruz.
3. E
ger niyetimiz dosyaya yazmak ise kullanmamz gereken harf a olacaktr.
4. Bir dosyaya ekleme yapmak iin write() adl bir fonksiyondan yararlanyoruz.
5. zerinde i
slem yapt
gmz bir dosyay kapatmak iin ise close() fonksiyonunu kullanyoruz.
Yukardaki listeyi rneklerle anlatmamz gerekirse...
1:
>>> dosya = open("falanca.txt", "r") #dosyay okuma kipinde atk

2:
>>> dosya = open("falanca.txt", "a") #dosyay yazma kipinde atk

3:
>>> dosya.write("Merhaba Zalim Dnya!") #dosyaya ekleme yaptk

4:
>>> dosya.close() #dosyayla i
simizi bitirip dosyamz kapattk

Bir dosyay okuma kipinde at


gmzda, basit bir for dngs yardmyla dosyann ieri
gini
grntleyebiliriz:
>>> for i in dosya:
...
print(i)

Bir dosyay nasl aaca


gmz, zerinde i
slem yapaca
gmz ve bu dosyay nasl kapataca
gmz

grendi
gimize gre, Pythonda dosya i
slemleri konusunun ba
ska bir ynn incelemeye
geebiliriz...

12.3 Yeni bir Dosya Olu


sturmak
S
imdiye kadar hep varolan dosyalar zerinde al
stk. Geri bir nceki blmde
grendi
gimiz
a adl kip de
gi
stirme harfi yardmyla yeni bir dosya da olu
sturabiliyoruz, ama bu blmde
tek grevi yeni bir dosya olu
sturmak olan bir kip de
gi
stirme harfinden sz edece
giz... Bu harfin
ad wdir. Ingilizce write (yazmak) kelimesinin ba
s harfi olan w, bilgisayarmzda yeni bir
dosya amamz sa
glar. Hemen bir rnek verelim:
>>> dosya = open("yenidosya.txt", "w")

Bu komut, bilgisayarmzda yenidosya.txt adl bir dosya olu


sturacaktr. Yalnz bu harfi ok
dikkatli kullanmamz gerekiyor. E
ger bilgisayarmzda yenidosya.txt adl bir dosya halihazrda mevcutsa, yukardaki komut bu dosyann iinde ne var ne yoksa silecektir... Daha
do
grusu, bu komut ayn adl eski dosyay silip ayn adda ba
ska bir dosya olu
sturacaktr.
Grd
gnz gibi, w harfi sa-ba
s yoldurma potansiyeli ta
syan bir ara. O yzden dikkatlice
kullanlmas gerekiyor.

12.4 Dosya Silmek


Artk Pythonda dosya amay, dosya olu
sturmay ve dosya kapatmay
grendik. Peki ya biz
bu dosyalar silmek istersek ne olacak? Bunun ok basit bir cevab var. Pythondaki hemen
hemen her s
eyde oldu
gu gibi, bu i
s iin de zel bir fonksiyondan yararlanaca
gz. Aslnda bu
fonksiyon daha nce
grendi
gimiz os adl modln metotlarndan bir tanesidir. Dolaysyla bu
metodu kullanabilmek iin ncelikle os modln ie aktarmamz gerekir. Dilerseniz bununla
ilgili bir rnek verelim:
>>> import os
>>> os.remove("/home/istihza/Desktop/falanca")

Yukardaki komut, /home/istihza/Desktop/ dizini iindeki falanca adl dosyay uuracaktr.


Ayrca bu komutun, dosya silerken emin misiniz? tarz bir soru sormad
gna dikkatinizi ekmek isterim. Dolaysyla bu komutu vermeden nce iki kez d
snmekte fayda var...

12.5 seek() ve tell() Metotlar


Hatrlarsanz, okumak zere at
gmz bir dosyann iinde ne oldu
gunu grebilmek iin for
dnglerinden faydalanabilece
gimizi sylemi
stik. Yani bir dosyay s
u komutlar yardmyla
okuyabiliyorduk:
>>> dosya = open("falanca.txt")
>>> for i in dosya:
...
print(i)

Dosyay bu s
ekilde ba
saryla okuyabildik. S
imdi bu dosyay tekrar okumay deneyelim:

>>> for i in dosya:


...
print(i)

Ne oldu? Bo
s bir kt aldk, de
gil mi? Bu gayet normal. nk bir nceki admda dosyay
bir kez sonuna kadar okudu
gumuz iin, ayn dosyay ikinci kez okumaya al
st
gmzda, zaten
dosyann sonuna varm
s olmamzdan tr, Python bize bo
s bir kt verdi... Bunu, sonuna
geldi
gimiz bir kaseti tekrar dinlemeye al
smaya benzetebiliriz (kaset diye bir s
ey vard,
hatrlyorsunuz de
gil mi??).
E
ger sonuna geldi
gimiz bir kaseti tekrar dinlemek istersek, ncelikle bu kaseti ba
sa sarmamz
gerekir. Ayn s
ekilde Pythonda da bir dosyay sonuna kadar okuduktan sonra tekrar okumak istersek bu dosyay ba
sa sarmamz gerekecek. Bu i
s iin seek() adl bir metottan yararlanaca
gz. S
imdi dosyamz ba
sa saralm:
>>> f.seek(0)

Bylece dosyamz 0. bayta, yani en ba


sa geri alm
s olduk. S
imdi dosyay tekrar okuyabiliriz:
>>> for i in dosya:
...
print(i)

seek() metoduna sadece 0 parametresini verip dosyann 0. baytna gitmek mecburiyetinde


de
giliz. E
ger biz istersek, seek() metodunu kullanarak dosyann istedi
gimiz baytna atlayabiliriz. Bu konunun daha somut bir s
ekilde anla
slabilmesi iin isterseniz dosyamzn iinde s
u
satrlarn oldu
gunu varsayalm:
birinci satr
ikinci satr
nc satr

S
imdi bu dosyann 10. baytna gidiyoruz:
>>> f.seek(10)

Dedi
gim gibi, bu komut, bizi alp dosyann 10. baytna gtrecektir. Dolaysyla bu komuttan
sonra a
sa
gdaki komutu verecek olursak, Python okumaya 10. bayttan ba
slar:
>>> for i in dosya:
...
print(i)
...
tr
ikinci satr
nc satr

ok kaba bir s
ekilde ifade edecek olursak, o
gunlukla 10. bayt demek 10. karakter demek
gibidir. Mesela yukardaki rnekte seek(10) komutu bizi 10. karakterin ba
sna gtrd... Ama
bunun her zaman byle olmayaca
gn da asla aklmzdan karmyoruz. nk her karakter 1
bayt de
gerinde olmayabilir. Baz karakterler 1den fazla bayttan olu
sur. Dolaysyla 1 bayt =
1 karakter s
eklindeki bir d
snce bizi yanl
s sonulara gtrr.
Dedi
gimiz gibi, seek() fonksiyonunu kullanarak bir metnin herhangi bir baytna gidebiliriz. Peki
o anda bir metnin kanc baytnda oldu
gumuzu nasl
greniriz? Tabii ki tell() adl metodu
kullanarak:
>>> dosya.tell()

Bu komut bize o anda metnin kanc baytnda oldu


gumuzu syleyecektir. Henz bir dosyay
para para okumamaz sa
glayacak fonksiyonlar grmedi
gimiz iin, seek() metodunu kullanarak bir dosyann belirli bir baytna gitmedi
gimiz srece, tell() komutu bize ancak bir

dosyann 0. veya sonuncu baytnda oldu


gumuzu syleyebilecektir. Ama hi merak etmeyin.
Bu bahsetti
gimiz fonksiyonlar s
imdi grece
giz...

12.6 read(), readline(), readlines() Metotlar


Pythonda dosya i
slemlerine ili
skin temel baz bilgileri edindi
gimize gre, bu konuya ili
skin
nemli baz fonksiyon ve metotlar incelemeye geebiliriz. Pythonda dosyalar i
slerken kullanabilece
gimiz ok nemli adet metot bulunur. Bunlar read(), readline() ve readlines()
adl metotlardr. Bu metotlar birbirine benzese de aralarnda nemli baz farklar bulunur.
S
imdi s
u komutlar al
stralm:
>>> f = open("deneme.txt", "w")
>>> f.write("birinci satr\n")
>>> f.write("ikinci satr\n")
>>> f.write("nc satr\n")
>>> f.close()

Yukardaki komutlar yardmyla nce deneme.txt adl bir dosya olu


sturduk. Burada w
harfini kulland
gmza dikkat edin. E
ger bilgisayarmzda deneme.txt adl bir dosya yoksa bu
w harfi sayesinde deneme.txt adl bir dosya olu
sturulacaktr. E
ger zaten byle bir dosya
varsa, bu dosya silinip yerine ayn adla ba
ska bir dosya gelecektir...
Daha sonra art arda satr ekliyoruz deneme.txt adl dosyamza. Bunu yaparken write()
fonksiyonundan yararland
gmza dikkat edin. Son olarak da close() metodunu kullanarak
dosyamz kapatmay ihmal etmiyoruz.
Bu arada her bir write() komutundan sonra etkile
simli kabukta 14, 13, 13 gibi rakamlar grm
s olmalsnz. Bu rakamlar sizin write() metodunu kullanarak dosyaya ekledi
giniz
karakter dizisinin ka bayt oldu
gunu gsteriyor...
S
imdi dosyamz okuma kipinde tekrar aalm:
>>> f = open("deneme.txt")

Burada bu komutu istersek s


yle yazabilece
gimizi de biliyoruz:
>>> f = open("deneme.txt", "r")

Bildi
giniz gibi, biz r harfini kullansak da kullanmasak da Python o harf oraya yazlm
s gibi
davranacaktr...
S
imdi bu dosyamzn ieri
gine bakalm:
>>> for i in f:
...
print(i)
...
birinci satr
ikinci satr
nc satr

Daha nce de dedi


gimiz gibi, dosyalar okumak iin for dngleri basit ve pratik bir aratr.
Ama s
imdi gsterece
gimiz yntem bize bu i
s iin daha da pratik bir yol sunar. Bu yntemin ad
read() metodudur... Hemen deneyelim:

>>> print(f.read())

E
ger bu komutun kts bo
s ise, ya amaya al
st
gnz dosya bo
stur, ya da seek(0) metodunu
kullanarak dosyann en ba
sna sarmam
ssnzdr. E
ger dosyann bo
s olmad
gndan eminseniz
s
u komutu vererek dosyay en ba
sa sarn:
>>> seek(0)

S
imdi komutumuzu tekrar verelim:
>>> print(f.read())
birinci satr
ikinci satr
nc satr

Bu read() metodunu kullanarak dosyadan istedi


gimiz sayda bayt da okuyabiliriz:
>>> print(f.read(7))
birinci

Yukardaki komut ile, f adl dosyadan 7 baytlk bir ksm okumu


s olduk... Ayn komutu tekrar
verelim:
>>> print(f.read(7))
ikinci

Grd
gnz gibi, o anda dosyann hangi noktasnda oldu
gumuza ba
gl olarak dosyann farkl
ksmlar okunuyor... O anda dosyann kanc baytnda oldu
gumuzu
grenmek iin tell() adl
metottan yararlanmamz gerekti
gini biliyoruz:
>>> f.tell()

S
imdiye kadar dosyalarmz hep bir btn olarak okuduk. Ama e
ger istersek, readline() adl
bir metot yardmyla dosyamz satr satr da okuyabiliriz:
>>> print(f.readline())
birinci satr

Grd
gnz gibi bu komutla dosyann btnn bir anda de
gil, sadece ilk satr okuduk. S
imdi
ayn komutu tekrar verelim:
>>> print(f.readline())
ikinci satr

Bu defa dosyann ikinci satrn elde ettik. Devam edelim:


>>> print(f.readline())
nc satr

Tpk read() metodunda oldu


gu gibi, readline() metoduna isterseniz parametre olarak bir
say verip, o verdi
giniz say kadar bayt okuyabilirsiniz dosyadan:

>>> print(f.readline(7))
birinci

Btn bu rneklerden anlad


gmz gibi, read() metodu bir dosyann tamamn bir anda okuturken, readline() metodu ayn dosyay satr satr okumamza imkan tanyor. Peki ba
slkta
grd
gmz readlines() metodu ne i
se yaryor? Hemen grelim:
>>> print(f.readlines())
[birinci satr\n, ikinci satr\n, nc satr\n]

Bu metodun kts bir listedir. Bu listede, dosya iindeki btn satrlar tek tek yer alr. Ayrca
dikkat ederseniz satr sonlarna i
saret eden n ka
s dizisi de ktda belirgindir. Elde etti
gimiz
kt bir liste oldu
gu iin, dosyadaki satrlara tek tek eri
sebiliriz:
>>> f.seek(0) #dosyamz ba
sa saralm...
>>> satrlar = f.readlines() #kolay eri
sim iin f.readlines() komutunu de
gi
skene atadk
>>> satrlar[1] #
simdi de tek tek satrlara eri
selim...
ikinci satr\n
>>> satrlar[2]
nc satr\n
>>> satrlar[0]
birinci satr\n
>>> f.close() #e
ger i
simiz bittiyse dosyamz kapatalm

teki iki metotta oldu


gu gibi, readlines() metoduna da istenirse parametre olarak bir say
verilebilir. Ancak readlines() metoduna verilen bu say biraz farkl bir i
slev grecektir.
Bakalm:
>>> print(f.readlines(4))
[birinci satr\n]

Burada 4 saysn vermemize ra


gmen sadece 4 bayt okunmad
gna dikkat edin. S
imdi s
u
rne
ge bakalm. Bu rnek durumu biraz aydnlatacaktr:
>>> print(f.readlines(15))
[birinci satr\n, ikinci satr\n]

Grd
gnz gibi, readlines() metodu her ko
sulda satr sonuna ula
syor. E
ger parametre
olarak verdi
gimiz say bir satrdan az sayda bayt ieriyorsa sadece bir satr kt olarak veriliyor. E
ger parametredeki say bir satrdaki bayt saysn a
syorsa, bu bayt says ikinci satrn
tamamn kar
slamasa bile, birinci satrla birlikte ikinci satrn tamam da ekrana dklyor...
Bu zelli
gi, bir satrndaki bayt saysn tam olarak bilmedi
giniz, ama dosyann bykl
gnden
tr tamamn da okumak istemedi
giniz dosyalar zerinde kullanabilirsiniz...

12.7 Dosyalarda Karakter Kodlamas (encoding)


Bazen internette dola
srken kimi Trke sayfalardaki harflerin bozuk oldu
gunu grrz. Yani
hemen hemen herkes hayat boyunca en az bir kez s
una benzer bir grntyle kar
sla
sm
str:
Python nesne y?nelimli, yorumlanabilen, birimsel(mod?ler) ve etkile?imli bir programlama dilidir. Girintilere dayal? basit s?zdizimi, dilin ?renilmesini ve ak?lda
kalmas?n? kolayla?t?racakt?r. Bu da ona s? diziminin ayr?nt?lar? ile vakit yitirmeden programlama yap?lmaya ba?lanabilen bir dil olma ?zelli?i kazand?r?r.
Buradaki sorun, sayfann karakter kodlamasnn dzgn yaplmam
s olmasdr. Biz bu durumu
internet tarayclarmzn dil kodlamas (veya kodlama) ayarlarnn yapld
g blmden uygun bir dili veya kodlamay seerek dzeltebiliriz. Bu ayarlarda genellikle tercih edece
gimiz
kodlama Utf-8 olacaktr. Python programlama dili de varsaylan olarak utf-8 kodlamasn
kullanr. Bu kodlama yardmyla dnya zerindeki pek ok dile ait zel karakterleri rahatlkla
grntleyebiliyoruz. Konuya i
sletim sistemleri erevesinden bakacak olursak, GNU/Linuxta
utf-8 kodlamasn kullanarak sorunsuz bir s
ekilde al
sabiliyoruz. Ancak Windows zerinde
bazen utf-8 kodlamas grntleme hatalarna yol aabilir. Windows sistemlerinde yaygn olan
karakter kodlamas (Trke iin) cp1254tr. Bu yzden yazd
gmz bir Python programnda
Trke karakterler kullanaca
gmz zaman, dosyamzn karakter kodlamasn ak bir s
ekilde
belirtmemiz gerekebilir.
Dedi
gim gibi, Python varsaylan olarak utf-8 kodlamasn kullanr.
Bu kodlama biimi,
GNU/Linux sistemlerinde Trke harfleri rahatlkla gstermemizi sa
glarken, baz Windows sistemlerinde sorun yaratabilir. E
ger yazd
gnz bir programda kulland
gnz Trke harfler dzgn
grnmyorsa veya Python bu programn al
smas srasnda hata veriyorsa, beti
ginizin en
ba
sna s
u satr eklemeniz gerekebilir:
#-*-coding:cp1254-*-

Buna benzer bir durum dosyalarla al


srken de kar
smza kabilir. Baz dosyalar amaya
al
srken s
una benzer bir hata mesajyla kar
sla
sabiliriz:
UnicodeEncodeError: charmap codec cant encode characters
in position x-y: character maps to <undefined>

Bu durumu engellemek iin, dosya aarken mutlaka encoding seene


gini de belirtmemiz
gerekir:
>>> dosya = open("deneme.txt", "r", encoding="utf-8")

Grd
gnz gibi, open() fonksiyonu toplam parametre alyor. Ilk iki parametreyi daha nce
grm
stk. nc parametre olan encoding dosyann karakter kodlamasn belirlememizi
sa
glyor. E
ger biz at
gmz bir dosyada encoding parametresini belirtmezsek, Python otomatik
olarak varsaylan karakter kodlamasn kullanacaktr. encoding parametresini belirtmeden
at
gnz bir dosyann karakter kodlamasn iki s
ekilde
grenebilirsiniz:
1:
>>> dosya.encoding
utf-8

Bu komut GNU/Linux zerinde verildi


gi iin ktmz utf-8. E
ger ayn komutu Windows zerinde verirseniz ktnz muhtemelen cp1254 olacaktr.
2:

>>> import locale


>>> locale.getpreferredencoding()
utf-8

Bu komut da tpk bir nceki komut gibi GNU/Linux zerinde verilmi


stir. Bu yzden buradaki
kt utf-8. E
ger bu komutu Windowsta verirseniz ktnz byk ihtimalle cp1254 olacaktr. Grd
gnz gibi, ikinci komutta locale adl modln getpreferredencoding() adl
fonksiyonundan yararlandk... E
ger at
gnz bir dosyada zel olarak bir karakter kodlamas
belirtmediyseniz, encoding niteli
ginin kts ile locale.getpreferredencoding() fonksiyonunun kts ayn olacaktr.

12.8 Ikili Dosyalar (Binary Files)


S
imdiye kadar hep metin dosyalar ile al
stk. S
u ana dek
grendi
gimiz bilgilerle, ieri
ginde
bir metin barndran dosyalar okuyabilir, bu dosyalara yazabilir ve bu dosyalar gvenli bir
s
ekilde kapatabiliriz. ok kaba bir s
ekilde ifade etmemiz gerekirse, e
ger bir dosyay herhangi
bir metin dzenleyici ile aabiliyorsak, bu dosyalara s
imdiye kadar
grendi
gimiz bilgileri uygulayabiliriz... Ancak kar
smza her zaman sadece metin ieren dosyalar kmayabilir. Bazen
de ikili (binary) biimdeki dosyalarla u
gra
smamz gerekebilir. Mesela resim dosyalar birer
ikili dosyadr ve bunlar s
imdiye kadar
grendi
gimiz bilgilerle ap okuyamayz veya bunlara
herhangi bir s
ey yazamayz. Pythonda ikili dosyalarla al
sabilmek iin zel bir kip de
gi
stirme
harfinden yararlanaca
gz.
Bildi
giniz gibi, s
imdiye dek Pythonda adet kip de
gi
stirme harfi grdk. Bunlar, r (okuma),
a (yazma) ve w (olu
sturma) harfleri idi. Bu blmde bu harflere bir yenisini daha ekleyece
giz. Burada grece
gimiz harf binary kelimesinin ba
s harfi olan bdir...
Bu b harfini tek ba
sna kullanmyoruz. Bunu daha nce
grendi
gimiz o harfle birlikte kullanaca
gz. Mesela ikili dzendeki bir dosyay okumak zere amak iin s
u komutu yazaca
gz:
>>> dosya = open("falanca.bin", "rb")

Hatrlarsanz, metin dosyalarn okumak zere aarken r harfini belirtmesek de oluyordu.


Ama ikili dosyalar okumak zere aarken, bu dosyann kipini mutlaka belirtmemiz gerekir.
Ikili dosyalar yazmak zere aarken ise s
yle bir komut kullanaca
gz:
>>> dosya = open("falanca.bin", "ab")

Grd
gnz gibi, yapt
gmz s
ey nceden bildi
gimiz a harfinin sa
gna bir adet b harfi eklemekten ibarettir... Yeni bir ikili dosya olu
sturabilmek iin de yine benzer bir yntem kullanyoruz:
>>> dosya = open("falanca.bin", "wb")

Metin dosyalarn okurken karakter dizilerine bakyoruz. Ikili dosyalarda bakt


gmz s
ey ise
baytlardr. Yani metin dosyalar bize karakter karakter gelirken, ikili dosyalar bayt bayt gelecektir:
>>> ikili = open("logo.jpeg", "rb")
>>> oku = ikili.read()
>>> len(oku)

27429

Demek ki benim elimdeki logo.jpeg dosyas 27429 bayt uzunlu


gundaym
s. E
ger dosyanzn
zelliklerine bakacak olursanz, dosyann boyut ksmndaki rakamn len() fonksiyonundan
ald
gmz rakamla ayn oldu
gunu greceksiniz.
Bu arada, e
ger bu ikili dosyay daha nce
grendi
gimiz s
ekilde ap okumaya al
srsanz
Python size hata mesaj gsterecektir:
>>> dosya = open("logo.jpeg")
>>> oku = dosya.read()
UnicodeDecodeError: charmap codec cant decode byte
0x8e in position 1254: character maps to <undefined>

Grd
gnz gibi, Python bu s
ekilde ikili dosya iindeki baytlar do
gal olarak tanyamyor...
Dolaysyla ikili dosyalar aarken, kullanaca
gmz kip de
gi
stirme harfine dikkat etmemiz
gerekiyor.

BLM

13

Karakter Dizilerinin Metotlar

Bu blmde, nceki derslerde


grenmi
s oldu
gumuz bir konu olan Karakter Dizilerinden sz
edece
giz. Dedi
gim gibi, aslnda biz karakter dizisinin ne oldu
gunu biliyoruz. ok kaba bir
s
ekilde ifade etmek gerekirse, karakter dizileri, adndan da anla
slaca
g gibi, karakterlerin bir
araya gelmesiyle olu
san bir dizidir. Karakter dizileri, trnak (tek, ift veya trnak) iinde
gsterilen ve teki veri tiplerinden bu trnaklar aracl
gyla ayrt edilen zel bir veri tipidir.
Mesela s
u rneklerin birer karakter dizisi oldu
gunu biliyoruz:
>>> kardiz1 = "ift trnakl karakter dizisi"
>>> kardiz2 = tek trnakl karakter dizisi
>>> kardiz3 = """ trnakl karakter dizisi"""

Biz karakter dizilerini bundan nceki blmlerde de bolca kullanm


stk. Dolaysyla bu veri
tipinin ne oldu
gu konusunda bir skntmz yok. Bu blmde, s
imdiye kadar karakter dizileri
ile ilgili
grendi
gimiz s
eylere ek olarak, karakter dizilerin metotlarndan sz edece
giz. Aslnda
biz metot kavramnn da ne oldu
gunu biliyoruz. Metotlar Pythonda bir karakter dizisinin,
bir saynn, bir listenin veya szl
gn niteliklerini kolaylkla de
gi
stirmemizi veya bu veri tiplerine yeni zellikler katmamz sa
glayan kk paracklardr. rne
gin listeler konusunu i
slerken
szn etti
gimiz append(), listelerin bir metodudur. Daha nce listeleri, szlkleri, demetleri ve kmeleri i
slerken nasl bu veri tiplerinin baz metotlar oldu
gundan bahsettiysek, bu
blmde de karakter dizilerinin metotlarndan bahsedece
giz. Ancak bu blmde bahsedece
gimiz tek s
ey karakter dizilerinin metotlar olmayacak. Bu blmde ayn zamanda karakter
dizilerinin yaps ve zelliklerine ili
skin syleyeceklerimiz de olacak...
Ilk i
s olarak isterseniz karakter dizilerinin hangi metotlar oldu
gunu grelim:
>>> dir("")
...
[__add__, __class__, __contains__, __delattr__, __doc__, __eq__,
__format__, __ge__, __getattribute__, __getitem__, __getnewargs__,
__gt__, __hash__, __init__, __iter__, __le__, __len__, __lt__,
__mod__, __mul__, __ne__, __new__, __reduce__, __reduce_ex__,
__repr__, __rmod__, __rmul__, __setattr__, __sizeof__, __str__,
__subclasshook__, _formatter_field_name_split, _formatter_parser,
capitalize, center, count, encode, endswith, expandtabs, find,
format, index, isalnum, isalpha, isdecimal, isdigit, isidentifier,
islower, isnumeric, isprintable, isspace, istitle, isupper, join,
ljust, lower, lstrip, maketrans, partition, replace, rfind,
rindex, rjust, rpartition, rsplit, rstrip, split, splitlines,
startswith, strip, swapcase, title, translate, upper, zfill]

238

Grd
gnz gibi karakter dizilerinin ok sayda metodu var. Zaten daha nce de dedi
gimiz
gibi, karakter dizileri Python programlama dilinin en gl oldu
gu veri tiplerinden bir tanesidir.
Biz bu blmde, yukardaki liste iinde grnen metotlar arasnda, iinde _ i
sareti barndrmayanlar inceleyece
giz. Yani s
unlar:
>>> for i in dir(""):
...
if "_" not in i:
...
print(i)
...
capitalize
center
count
encode
endswith
expandtabs
find
format
index
isalnum
isalpha
isdecimal
isdigit
isidentifier
islower
isnumeric
isprintable
isspace
istitle
isupper
join
ljust
lower
lstrip
maketrans
partition
replace
rfind
rindex
rjust
rpartition
rsplit
rstrip
split
splitlines
startswith
strip
swapcase
title
translate
upper
zfill

Bu metotlar kar
sk olarak inceleyece
giz ilerleyen sayfalarda... Gelin isterseniz sz daha fazla
uzatmadan ilk metodumuzla ba
slayalm i
se...

13.1 startswith Metodu


Bu blmde inceleyece
gimiz ilk metodumuz startswith(). Bu metot, bize bir karakter
dizisinin belli bir karakterle ba
slayp ba
slamad
gn syler. Hemen bir rnek verelim:
>>> kardiz = "elveda zalim dnya!"
>>> kardiz.startswith("e")
True

Burada elveda zalim dnya! karakter dizisi e harfiyle ba


slad
g iin startswith() metodu
True kts veriyor. Bir de s
una bakalm:
>>> kardiz.startswith("i")
False

elveda zalim dnya! karakter dizisi i harfiyle ba


slamad
g iin metodumuz bize False kts verdi. E
ger startswith() diye bir metot olmasayd yukardaki rnekleri s
yle yazmamz
gerekecekti:
>>> kardiz[0] == "e"
True
>>> kardiz[0] == "i"
False

Bu rnekten de anlad
gmza gre, tpk listelerde oldu
gu gibi karakter dizilerinde de,
gelerin
srasn belirterek bu
gelere tek tek eri
sebiliyoruz. rne
gin:
>>> kardiz = "python"
>>> kardiz[0] #karakter dizisinin ilk
gesini alyoruz...
p
>>> kardiz[-1] #karakter dizisinin son
gesini alyoruz...
n
>>> len(kardiz) #karakter dizisinin uzunlu
gunu lelim...
6

13.2 endswith Metodu


Sradaki metodumuz endswith(). Bu metot yukarda inceledi
gimiz startswith() metodunun
yapt
g i
sin tam tersini yapar. O metot bir karakter dizisinin belli bir harfle ba
slayp ba
slamad
gn sylyordu, bu metot ise bize bir karakter dizisinin belli bir karakterle bitip bitmedi
gini
syler:
>>> kardiz = "elveda zalim dnya!"
>>> kardiz.endswith("!")

True

Grd
gnz gibi, karakter dizimiz ! karakteriyle bitti
gi iin yukardaki koddan True kts
aldk. E
ger karakter dizimiz ! karakteriyle bitmeseydi False kts alacaktk.
endswith() diye bir metot olmasayd, ayn i
slevi s
yle de yerine getirebilirdik:
>>> kardiz = "elveda zalim dnya!"
>>> kardiz[-1] == ("!")
True

13.3 islower Metodu


Bu metot bir karakter dizisinin tamamen kk harflerden olu
sup olmad
gn denetler. Mesela:
>>> kardiz = "elif dedim be dedim"
>>> kardiz.islower()
True

Burada btn karakterler kk harfli oldu


gu iin islower() metodu True kts veriyor. E
ger
karakter dizimizin iinde tek bir byk harf dahi olsa bu metot False kts verecektir:
>>> kardiz = "Elif dedim be dedim"
>>> kardiz.islower()
False

13.4 isupper Metodu


Bu metot ise, islower() metodunun yapt
g i
sin tam tersini yapar. Bu metot ile bir karakter
dizisinin tamamen byk harflerden olu
sup olu
smad
gn denetleyebiliriz:
>>> kardiz = "EL
IF DED
IM BE DED
IM"
>>> kardiz.isupper()
True

Bu metot da, tpk islower() metodunda oldu


gu gibi, e
ger karakter dizisinin iinde tek bir
kk harf varsa dahi False kts verecektir...

13.5 replace Metodu


Bu metot, karakter dizisi metotlar iinde en yararl ve en ok kullanlan metotlardan biridir.
Normal s
artlar altnda zorlukla halledebilece
gimiz i
slerin altndan bu metot yardmyla ok kolay bir s
ekilde kalkabiliriz. replace() metodu bir karakter dizisi iindeki karakterleri ba
ska
karakterlerle de
gi
stirmemize olanak tanr:

>>> kardiz = "elma"


>>> kardiz.replace("e", "a")
alma

Grd
gnz gibi, elma karakter dizisi iindeki e harfini a harfine dn
strdk. Ancak
burada nemli bir ayrntya dikkatinizi ekmek isterim. Hatrlarsanz karakter dizilerinden
ilk kez bahsetti
gimiz blmde, karakter dizilerinin de
gi
stirilemeyen (immutable) veri tipleri oldu
gunu sylemi
stik. Bu zellik burada da kar
smza kyor. Mesela yukardaki rnekte
elma karakter dizisi zerinde de
gi
siklik yapm
s gibi grnsek de, aslnda karakter dizisinde
herhangi bir de
gi
siklik olmad. Bunu s
u s
ekilde test edebiliriz:
>>> print(kardiz)
elma

Grd
gnz gibi, karakter dizimiz, replace() metoduyla e harfini a harfine dn
strm
s
olmamza ra
gmen oldu
gu gibi duruyor. I
ste bunun nedeni karakter dizilerinin de
gi
stirilemeyen
bir yapda olmasdr. Elbette bu kstlamay da a
smann bir yolu var:
>>> kardiz = kardiz.replace("e", "a")
>>> print(kardiz)
alma

Burada yapt
gmz s
ey, yeni verileri kardiz adl karakter dizisinin zerine yazmaktan ibarettir... Yani biz burada kardizin de
gi
stirilmi
s halini tekrar kardizin kendisine atyoruz. Bylece
sonu olarak karakter dizimiz zerinde de
gi
siklik yapm
s oluyoruz. Karakter dizilerinin de
gi
stirilemez olu
su olduka nemli bir konudur. Yazd
gmz kodlarn bekledi
gimiz s
ekilde al
sabilmesi
iin karakter dizilerinin bu zelli
gini mutlaka gz nnde bulundurmamz gerekir.
Sizlere kolaylk olmas asndan bu replace() metodunun formln de verelim:
karakter_dizisi.replace(eski_karakter, yeni_karakter)

Bu formle gre, parantez iinde ilk srada kendisini de


gi
stirece
gimiz karakteri belirtiyoruz.
Ikinci srada ise de
gi
stirece
gimiz karakterin yerine gelecek yeni karakteri yazyoruz.
replace() metodu yukardakilerin d
snda nc bir argman daha alr. Bunu bir rnek zerinden grelim:
>>> kardiz = "katar"
>>> kardiz.replace("a", "", 2)
ktr

replace() metoduna verdi


gimiz nc argman, belirtilen karakterin ka yerde de
gi
stirilece
gini gsteriyor. Yukardaki rne
ge gre biz katar adl karakter dizisi iinde geen 2 adet a
harfini harfiyle de
gi
stirmek istiyoruz. E
ger bu nc argman belirtmezsek, replace()
metodu buldu
gu btn a harflerini de
gi
stirecektir:
>>> kardiz = "dal kalkar kartal sarkar, kartal kalkar dal sarkar"
>>> kardiz.replace("a", "@")
d@l k@lk@r k@rt@l s@rk@r, k@rt@l s@rk@r d@l k@lk@r

13.6 join Metodu


Tpk replace() metodu gibi, join() metodu da en ok kullanlan ve en i
se yarar karakter
dizisi metotlarndan biridir. join kelimesi Trkede birle
stirmek anlamna gelir. Bu metodun grevi birden fazla karakter dizisini tek bir karakter dizisi haline getirmektir. Bu metodu,
rne
gin, karakter dizilerinden olu
smu
s bir listeyi tek bir karakter dizisi haline getirmek iin
kullanabiliriz:
>>> liste = ["bugn", "gnlerden", "pazar"]
>>> " ".join(liste)
bugn gnlerden pazar

Grd
gnz gibi, bu metodun kullanm teki metotlardan biraz farkl gibi grnyor. Ama
aslnda tekilerden pek bir fark yoktur. Metodu nasl kulland
gmza dikkat edin. Sanrm s
yle
bir rnek daha verirsek baz noktalar birazck aydnlatm
s oluruz:
>>> ", ".join(liste)
bugn, gnlerden, pazar

Bu rnekten de anlad
gmz gibi, join() metodu listedeki btn karakter dizilerini alyor, her
bir karakter dizisinin arasna , i
saretini yerle
stiriyor ve bu karakter dizilerini tek bir karakter
dizisi olarak birle
stiriyor.
Hatrlarsanz Genel Tekrar blmnde bu join() metoduyla ilgili olarak s
yle bir rnek vermi
stik:
>>> liste = ["elma", "armut", "kebap"]
>>> print(", ".join(liste))
elma, armut, kebap

Artk bu rne
gin nasl al
st
gn anlayabiliyoruz. Burada listemizin btn
gelerini alp her
bir
geyi tek bir karakter dizisi halinde birle
stirdik. Bu
geleri birle
stirirken de her bir
genin
arasna bir , i
sareti koyduk... Elbette e
ger istersek biz bu
geleri istedi
gimiz ba
ska bir i
saretle
de birle
stirebiliriz. Mesela:
>>> liste = ["elma", "armut", "kebap"]
>>> print(" -- ".join(liste))
elma -- armut -- kebap

Bu arada, bu join() metodunun sadece karakter dizileri zerinde i


sledi
gini unutmuyoruz.
Dolaysyla, iinde karakter dizisi d
snda bir veri tipi barndran listeleri bu metotla birle
stirmeye kalkarsak hata alrz:
>>> liste = [1, 2, "elma"]
>>> " -- ".join(liste)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: sequence item 0: expected str instance, int found

13.7 split Metodu


Bu metot, temel olarak join() metodunun tam tersi bir vazife grr. split() metodunu
kullanarak, bir karakter dizisinin iindeki
geleri liste haline getirebiliriz:
>>> kardiz = "gzel gnler grece
giz"
>>> kardiz.split()
[gzel, gnler, grece
giz]

E
ger karakter dizisinin tamamn tek bir liste halinde almak isterseniz s
yle bir kod kullanabilirsiniz:
>>> kardiz.split(",")
[gzel gnler grece
giz]

Elbette, split() metoduna argman olarak yalnzca virgl (,) vermek zorunda de
giliz:
>>> kardiz.split("g")
[, zel , nler , rece
giz]

S
yle bir rnek daha vererek bu metot hakkndaki bilgimizi peki
stirelim:
>>> site = "www.istihza.com"
>>> site.split(".")
[www, istihza, com]

Burada site adl karakter dizimizi, iindeki nokta i


saretlerinden bldk.
split() metodu ek olarak bir parametre daha alr. Bu parametre bir saydr ve karakter dizisi
zerine ka kez blme i
slemi uygulanaca
gn gsterir:
>>> site.split(".", 1)
[www, istihza.com]

Burada metodumuz, site adl karakter dizisi zerine sadece 1 kez blme i
slemi uygulad.
Buna gre, www ksmn bldkten sonra geri kalan ksm tek bir
ge olarak liste iine dahil
etti.

13.8 rsplit Metodu


Bu metot yukarda anlatt
gmz split() metoduna ok benzer. Hatta tamamen ayn i
si yapar. Tek bir farkla: split() metodu karakter dizilerini soldan sa
ga do
gru okurken; rsplit()
metodu sa
gdan sola do
gru okur. nce s
yle bir rnek verip bu iki metodun birbirine ne kadar
benzedi
gini grelim:
>>> site = "www.istihza.com"
>>> site.split(".")
[www, istihza, com]
>>> site.rsplit(".")

[www, istihza, com]

Bu rnekte ikisi arasndaki fark pek belli olmasa da, aslnda split() metodu karakter dizisini
soldan sa
ga do
gru okurken, rsplit() metodu sa
gdan sola do
gru okuyor. S
imdi daha ak bir
rnek verelim:
>>> site.split(".", 1)
[www, istihza.com]

Yukardaki rnek, split() metodunun davran


sn gsteriyor. S
imdi s
una bakalm:
>>> site.rsplit(".", 1)
[www.istihza, com]

Grd
gnz gibi, rstrip() metodu karakter dizisini sa
gdan sola do
gru okuyup, tek bir blme
i
slemi yaparak, sitenin com ksmn tek ba
sna, www.istihza ksmn ise birlikte tek bir
ge
olarak liste haline getirdi...

13.9 strip Metodu


strip(), karakter dizilerinin metotlar arasnda en ilginlerinden biridir...
parametreli veya parametresiz verili
sine ba
gl olarak farkl grevleri vardr.

Bu metodun,

Bu metot parametresiz olarak kullanld


gnda, bir karakter dizisinin ba
sndaki ve sonundaki
bo
sluk karakterlerini ve ka
s dizilerini krpar. rnek zerinde grelim:
>>> kardiz = "\nVicdansz Sabuha\t"
>>> kardiz.strip()
Vicdansz Sabuha

Grd
gnz gibi, bu metot yukardaki karakter dizisinin ba
sndaki ve sonundaki \n ve \t
ka
s dizilerini krpt. Bu metot ayn zamanda ba
staki ve sondaki bo
sluklar da siler:
>>> kardiz = " Vicdansz Sabuha "
>>> kardiz.strip()
Vicdansz Sabuha

E
ger bu metodu baz parametrelerle kullanrsak daha farkl bir sonu elde ederiz:
>>> kardiz = "Vicdansz Sabuha"
>>> kardiz.strip("ha")
Vicdansz Sabu

Burada strip() metodu, karakter dizimizin en sonunda yer alan ha harflerini sildi. E
ger bu
karakter dizisinin ba
snda da ha harfleri olsayd onlar da gidecekti...
>>> kardiz = "hayrsz Sabuha"
>>> kardiz.strip("ha")
yrsz Sabu

Bu metot, kendisine parametre olarak verilen karakterlerin srasn nemsemez. Yani s


yle bir
s
ey de yazsanz ba
staki ve sondaki ha harfleri uacaktr:
>>> kardiz.strip("ah")
yrsz Sabu

Hatta s
yle bir s
ey dahi mmkndr:
>>> kardiz.strip("ahy")
rsz Sabu

Burada strip() metodu karakter dizisinin ba


snda ve sonunda grd
g a, h, y ve
harflerini krpt.
Bu metotla ilgili s
yle bir kullanm rne
gi verebiliriz:
>>> liste = ["ilek", "
seker", "zm", "srgan", "dl", "kitap", "defter",
... "soru"]
>>> for i in liste:
...
i.strip("
s")
...
ilek
eker
zm
srgan
dl
kitap
defter
soru

Burada, bir liste iinde geen kelimelerin ba


sndaki ve sonundaki Trke harfleri krptk.
Ba
snda ve sonunda Trke harfler iermeyen kelimeler bu kodlardan etkilenmedi...

13.10 lstrip Metodu


strip() metodunu anlatrken bu metodun bir karakter dizisinin ba
sna ve sonuna etki etti
gini
grm
stk. E
ger istedi
gimiz s
ey karakter dizisinin sadece ba
snda yer alan baz karakterleri
krpmaksa lstrip() metodundan yararlanaca
gz.
Hatrlarsanz strip() metodunda s
yle bir rnek vermi
stik:
>>> kardiz = "hayrsz Sabuha"
>>> kardiz.strip("ha")
yrsz Sabu

Bu rnekte do
gal olarak strip() metodu karakter dizisinin her iki tarafn da krpyordu. S
imdi
ayn rne
gi lstrip() ile yapalm:
>>> kardiz == "hayrsz Sabuha"
>>> kardiz.lstrip("ha")
yrsz Sabuha

Grd
gnz gibi, lstrip() metodu karakter dizisinin sadece ba
s tarafyla ilgilendi, son ksma
hi dokunmad.

13.11 rstrip Metodu


rstrip() metodu yukarda grd
gmz lstrip() metodunun tersidir. Bu metot, bir karakter
dizisinin sadece son tarafyla ilgilenir:
>>> kardiz = "hayrsz Sabuha"
>>> kardiz.rstrip("ha")
hayrsz Sabu

Grd
gnz gibi, lstrip() metodunun aksine rstrip() metodu karakter dizisinin sadece son
tarafyla ilgilendi, ba
s tarafa hi ili
smedi.

13.12 upper Metodu


Srada upper() adl bir metot var. Bu metot yardmyla bir karakter dizisi iindeki btn harfleri
bytebilece
giz:
>>> kardiz = "merhaba dnya!"
>>> kardiz.upper()
MERHABA DNYA

13.13 lower Metodu


lower() metodu upper() metodunun yapt
g i
sin tam tersini yapar. Yani byk olan harfleri
kltr:
>>> kardiz = "MERHABA DNYA!"
>>> kardiz.lower()
merhaba dnya!

13.14 capitalize Metodu


Yeni metodumuz capitalize(). Bu metodun grevi bir karakter dizisinin ilk harfini bytmektir. Bunu s
yle kullanyoruz:
>>> kardiz = "lahanay yerken ktr ktr, sapna gelince meee!"
>>> kardiz.capitalize()
Lahanay yerken ktr ktr, sapna gelince meee!

Grd
gnz gibi, karakter dizimizin yalnzca ilk harfini bytt bu capitalize() adl metot...
Bu metodu (ve tabii ki teki btn metotlar) istersek do
grudan karakter dizisinin zerine de
uygulayabiliriz:
>>> "ilek".capitalize()
ilek

Bu arada, grd
gnz gibi bu metot Trke harfleri bytmekte zorlanmad. Ancak bunun
bir istisnas vardr. Bu metodun (ve birka ba
ska metodun) anla
samad
g tek bir Trke harf
bulunur: i harfi. Sorunu kendi gzlerinizle grn:
>>> a = "i
sletim sistemi"
>>> a.capitalize()
I
sletim sistemi

Buradaki sorun, i harfinin bytlrken noktasn kaybetmesi... Ne yazk ki do


grudan
Pythondan kaynaklanmayan bir sorun nedeniyle i harfini I s
eklinde bytemiyoruz. Ancak
endi
se etmeyin. Bu i harfini do
grudan bytemeyecek olsanz da, kar
s kar
sya oldu
gunuz
duruma gre zel zmler reterek yolunuza devam edebilirsiniz. Basit bir rnek vereyim:
def tr_capitalize(kardiz):
"""Bir karakter dizisinin sadece ilk harfini bytr."""
if kardiz.startswith("i"):
kardiz = kardiz[0].replace("i", "
I") + kardiz[1:]
return kardiz.capitalize()

Aynen yukarda oldu


gu gibi, e
ger iinde Trke karakterler barndran karakter dizileriyle
u
gra
sacaksanz, capitalize() metodunu do
grudan kullanmak yerine, if deyimlerinden
de yararlanarak kendinize zel zmler retebilirsiniz. Yukardaki tr_capitalize() adl
fonksiyon her trl karakter dizisinin ilk harfini bytecektir.

13.15 title Metodu


S
imdi de title() metoduna bakalm...
Bu metot bir nceki blmde inceledi
gimiz
capitalize() metoduna benzer. O metot, bir karakter dizisinin sadece ilk harfini bytyordu, bu metot ise bir karakter dizisi iinde geen btn kelimelerin ilk harflerini bytr.
Hemen bununla ilgili bir rnek vererek metodun ne i
se yarad
gn anlamaya al
salm:
>>> kardiz = "python programlama dili"
>>> kardiz.title()
Python Programlama Dili

Bu metot, grd
gnz gibi, capitalize metodunun aksine karakter dizisinin sadece ilk harfini
bytmekle yetinmedi... Elbette bu metodu istersek do
grudan karakter dizisi zerine de uygulayabiliriz:
>>> "python programlama dili".title()
Python Programlama Dili

Bu metot da Trke karakterlerle kar


sla
st
gnda genellikle bir sorun karmaz:
>>> a = "ayr mlek patlad"
>>> a.title()
ayr mlek Patlad

Anca.. highlight:: py3 .. _kardiz-metot-upper:k tpk capitalize() metodunda oldu


gu gibi,
burada da i harfi bize biraz sorun karacaktr:

>>> a = "iyi incir"


>>> a.title()
Iyi Incir"

Tabii yine endi


selenmenize gerek yok. E
ger i harfini bytmeniz gereken bir durumla kar
s
kar
sya kalrsanz, kendi zmlerinizi kendiniz de retebilirsiniz. Basit bir rnek verelim yine:
def tr_title(kardiz):
"""Bir karakter dizisi iindeki her bir kelimenin ilk harfini bytr."""
depo = []
for elem in kardiz.split():
if not "i" in elem[0]:
depo.append(elem.title())
else:
elem = elem[0].replace("i", "
I") + elem[1:]
depo.append(elem)
return " ".join(depo)

13.16 swapcase Metodu


Bu metot ile bir karakter dizisinin sahip oldu
gu byk-kk harf yapsn tersine eviriyoruz.
S
u rne
ge bakalm:
>>> a = "python programlama"
>>> a.swapcase()
PYTHON PROGRAMLAMA

Grd
gnz gibi, tamam kk olan harfler, bu metot yardmyla tamam byk olacak s
ekilde
de
gi
sti. Bir de s
una bakalm:
>>> a = "PYTHON PROGRAMLAMA"
>>> a.swapcase()
python programlama

Bu defa tamam byk olan harfler, bu metot yardmyla tamam kk olacak s


ekilde de
gi
sti...
Demek ki bu metot byk harfleri kk harfe, kk harfleri ise byk harfe dn
strmeye
yaryor. Bir de s
u rne
ge bakalm:
>>> a = "Python programlama"
>>> a.swapcase()
pYTHON PROGRAMLAMA

swapcase() metodu normal olarak grevini yerine getirdi ve byk harfleri kk harfe, kk
harfleri de byk harfe evirdi...
Bu metodun da i harfiyle sorunu oldu
gunu tahmin etmi
ssinizdir. Burada da kendi zmlerinizi kendiniz retebilirsiniz:
def tr_swapcase(kardiz):
"""Bir karakter dizisi iindeki byk-kk harfleri de
gi
stirir."""

depo = []
for elem in kardiz:
if "i" not in elem:
depo.append(elem.swapcase())
elif "i" in elem and elem.islower():
elem = elem.replace("i", "
I")
depo.append(elem.upper())
else:
depo.append(elem.lower())
return "".join(depo)

13.17 istitle Metodu


Hatrlarsanz title() adl metodu kullanarak bir karakter dizisi iindeki btn kelimelerin ilk
harflerini bytebiliyorduk. Bu istitle() metoduyla da bir karakter dizisi iindeki btn kelimelerin ilk harflerinin byk olup olmad
gn sorguluyoruz:
>>> kardiz = "Python Programlama Dili"
>>> kardiz.istitle()
True
>>> kardiz = "Python programlama dili"
>>> kardiz.istitle()
False

Grd
gnz gibi, e
ger karakter dizisi iindeki btn kelimelerin ilk harfleri bykse istitle()
metodu True kts veriyor. Aksi bir durumda ise False kts alyoruz...

13.18 ljust Metodu


ljust() metodu bize zellikle karakter dizilerinin hizalama i
slemlerinde yardmc olacak. Bu
metot yardmyla karakter dizilerimizi sola yaslayp, sa
g tarafna da istedi
gimiz karakterleri
yerle
stirebilece
giz. Hemen bir rnek verelim:
>>> kardiz = "tel no"
>>> kardiz.ljust(10, ".")
tel no....

Burada olan s
ey s
u: ljust() metodu, kendisine verilen 10 parametresinin etkisiyle 10 karakterlik bir alan olu
sturuyor. Bu 10 karakterlik alann iine nce 6 karakterlik yer kaplayan tel
no ifadesini, geri kalan 4 karakterlik bo
slu
ga ise . karakterini yerle
stiriyor. E
ger ljust()
metoduna verilen say karakter dizisinin uzunlu
gundan az yer tutarsa, karakter dizisinin
grn
snde herhangi bir de
gi
siklik olmayacaktr. rne
gin yukardaki rnekte karakter dizimizin uzunlu
gu 6. Dolaysyla kodumuzu s
u s
ekilde yazarsak bir sonu elde edemeyiz:

>>> kardiz.ljust(5, ".")


tel no

Grd
gnz gibi, karakter dizisinde herhangi bir de
gi
siklik olmad. ljust() metoduna
verdi
gimiz . karakterini grebilmemiz iin, verdi
gimiz say cinsli parametrenin en az karakter
dizisinin boyunun bir fazlas olmas gerekir:
>>> kardiz.ljust(7, ".")
tel no.

ljust() metoduyla ilgili basit bir rnek daha verelim:


>>> liste = ["elma", "armut", "patlcan"]
>>> for i in liste:
...
i.ljust(10, ".")
...
elma......
armut.....
patlcan..

Grd
gnz gibi, bu metot karakter dizilerini s
k bir biimde sola hizalamamza yardmc
oluyor...

13.19 rjust Metodu


Bu metot, ljust() metodunun yapt
g i
sin tam tersini yapar. Yani karakter dizilerini sola de
gil
sa
ga yaslar:
>>> liste = ["elma", "armut", "patlcan"]
>>> for i in liste:
...
i.rjust(10, ".")
...

elma

armut
patlcan

13.20 center Metodu


Bu metot ise karakter dizilerini ne sola ne de sa
ga yaslar. center() metodunun grevi karakter
dizilerini ortalamaktr:
>>> kardiz = "elma"
>>> kardiz.center(10, "-")
---elma---

13.21 count Metodu


Bu metot ile bir karakter dizisi iindeki harflerin, o karakter dizisi iinde ka kez geti
gini

grenece
giz:

>>> kardiz = "karakter dizisi"


>>> kardiz.count("a")
2

count() metodu ilave olarak bir parametre daha alr. rnek zerinden aklamaya al
salm:
>>> kardiz.count("a", 0)
2

Burada 0 parametresi, a harfini ararken metodumuzun karakter dizisinin kanc srasndan ba


slamas gerekti
gini gsteriyor. Yukardaki koda gre, karakter dizisinin 0. srasndan
ba
slayarak, diziyi sonuna kadar tarayaca
gz ve a harfinin ka kez geti
gini raporlayaca
gz.
Bir de s
u rne
ge bakalm:
>>> kardiz.count("a", 2)
1

Bu defa 1 kts almamzn nedeni, a harfini karakter dizisinin soldan sa


ga 2. srasndan itibaren aramamzdr. Grd
gnz gibi, karakter dizisi ifadesi iinde a harfi 1 ve 3.
sralarda yer alyor... E
ger s
yle bir kod yazarsak 0 kts alrz:
>>> kardiz.count("a", 5)
0

Burada 0 kts almamzn nedeni, karakter dizisinin 5. srasndan sonra herhangi bir a
harfinin bulunmamasdr.

13.22 find Metodu


Bu metot bir karakter dizisi iindeki karakterin sra numarasn syler bize:
>>> kardiz = "karakter dizisi"
>>> kardiz.find("t")
5

Buna gre karakter dizimiz iinde t harfi 5. srada bulunuyormu


s. Bunu teyit edelim:
>>> kardiz[5]
t

find() metodundan ald


gnz bilgiyi pek ok farkl yerde kullanabilirsiniz. Mesela bir karakter
dizisinin belli bir harften sonraki ksmn almak iin s
yle bir kod yazabilirsiniz:
>>> kardiz[kardiz.find("t"):]
ter dizisi

Bu metot, arad
gmz harfin sadece ilk geti
gi sray verecektir. rne
gin yukardaki karakter
dizisinde a harfi iki kez geiyor. Ancak find() metodu yalnzca ilk a harfinin srasn syler:

>>> kardiz.find("a")
1

E
ger ikinci a harfinin srasn
grenmek isterseniz find() metodunu s
u s
ekilde kullanabilirsiniz:
>>> kardiz.find("a", 2)
3

Grd
gnz gibi, find() metoduna say de
gerli bir parametre vererek, bir harfin karakter
dizisi iindeki kanc tekrarn almak istedi
gimizi belirtebiliyoruz.
E
ger find() metodunu kullanarak, bir harfin geti
gi btn sra numaralarn almak isterseniz
s
yle bir s
ey yazabilirsiniz:
>>> for i in range(1, kardiz.count("a")+1):
...
print(kardiz.find("a", i))
...
1
3

E
ger find() metodu arad
gn karakteri bulamazsa -1 kts verecektir:
>>> kardiz.find("j")
-1

13.23 rfind Metodu


Bu metot, find() metoduyla ayn i
si yapar. Ama rfind() metodu find() metodunun aksine,
bir karakter dizisini sa
gdan sola do
gru tarar:
>>> kardiz = "karakter dizisi"
>>> kardiz.find("a")
3

Grd
gnz gibi, bu metot ilk a harfini de
gil, ikinci a harfini verdi.
Bu metot da tpk find() metodu gibi, e
ger arad
gnz karakteri bulamazsa -1 kts verecektir...

13.24 index Metodu


index() metodu find() metodu ile tamamen ayn i
si yapar. Bu iki metot arasndaki tek
fark, aranan karakter bulunamad
gnda verilen ktdr. Hatrlarsanz, find() metodunun,
arad
gmz karakteri bulamamas halinde -1 kts verdi
gini sylemi
stik. index() metodu
ise, arad
gmz karakteri bulamad
gnda do
grudan bir hata mesaj verecektir:
>>> kardiz.index("g")
ValueError: substring not found

13.25 rindex Metodu


Bu metot da tpk rfind() metodu gibidir. Burada da tek fark, karakter dizisinin bulunamad
g
durumda verilen cevaptr:
>>> kardiz.rindex("g")
ValueError: substring not found

13.26 splitlines Metodu


Bu metot, birka satrdan olu
san karakter dizilerini satr satr bler:
>>> kardiz = "birinci satr.\nikinci satr.\nnc satr.\ndrdnc satr"
>>> kardiz.splitlines()
[birinci satr., ikinci satr., nc satr., drdnc satr]

E
ger bu metoda herhangi bir say de
gerli parametre verecek olursanz, s
yle bir kt alrsnz:
>>> kardiz.splitlines(1)
[birinci satr.\n, ikinci satr.\n, nc satr.\n, drdnc satr]

Burada hangi sayy verdi


ginizin nemi yoktur. Parantez iinde herhangi bir say olmas durumunda splitlines() metodu satr sonu i
saretlerini de (\n) ktya dahil edecektir.

13.27 isalpha Metodu


Bu metot yardmyla bir karakter dizisinin alfabetik olup olmad
gn denetleyece
giz. Peki
alfabetik ne demektir? E
ger bir karakter dizisi iinde yalnzca alfabe harfleri (a, b, c gibi...)
varsa o karakter dizisi iin alfabetik diyoruz. Bir rnekle bunu do
grulayalm:
>>> a = "kezban"
>>> a.isalpha()
True

Ama:
>>> b = "k3zb6n"
>>> b.isalpha()
False

13.28 isdigit Metodu


Bu metot da isalpha metoduna benzer. Bunun yardmyla bir karakter dizisinin saysal olup
olmad
gn denetleyebiliriz. Saylardan olu
san karakter dizilerine say karakter dizileri ad
verilir. rne
gin s
u bir say karakter dizisidir:

>>> a = "12345"

Metodumuz yardmyla bunu do


grulayabiliriz:
>>> a.isdigit()
True

Ama s
u karakter dizisi saysal de
gildir:
>>> b = "123445b"

Hemen kontrol edelim:


>>> b.isdigit()
False

13.29 isalnum Metodu


Bu metot, bir karakter dizisinin alfanmerik olup olmad
gn denetlememizi sa
glar. Peki alfanmerik nedir?
Daha nce bahsetti
gimiz metotlardan hatrlayacaksnz:
Alfabetik karakter dizileri, alfabe harflerinden olu
san karakter dizileridir.
Saysal karakter dizileri, saylardan olu
san karakter dizileridir.
Alfanmerik karakter dizileri ise bunun birle
simidir. Yani say ve harflerden olu
san karakter
dizilerine alfanmerik karakter dizileri ad verilir. rne
gin s
u karakter dizisi alfanmerik bir
karakter dizisidir:
>>> a = "123abc"

Isterseniz hemen bu yeni metodumuz yardmyla bunu do


grulayalm:
>>> a.isalnum()
True

E
ger denetleme sonucunda True alyorsak, o karakter dizisi alfanmeriktir.
bakalm:

Bir de s
una

>>> b = "123abc>"
>>> b.isalnum()
False

b de
gi
skeninin tuttu
gu karakter dizisinde alfanmerik karakterlerin yansra (123abc), alfanmerik olmayan bir karakter dizisi de bulundu
gu iin (>), b.isalnum() s
eklinde gsterdi
gimiz denetlemenin sonucu False (yanl
s) olarak grnecektir.
Dolaysyla, bir karakter dizisi iinde en az bir adet alfanmerik olmayan bir karakter dizisi
bulunursa (bizim rne
gimizde <), o karakter dizisi alfanmerik olmayacaktr.

13.30 isdecimal Metodu


Bu metot yardmyla bir karakter dizisinin ondalk say cinsinden olup olmad
gn denetliyoruz.
Mesela a
sa
gdaki rnek ondalk say cinsinden bir karakter dizisidir:
>>> a = "123"
>>> a.isdecimal()
True

Ama s
u ise kayan noktal (floating-point) say cinsinden bir karakter dizisidir:
>>> a = "123.3"
>>> a.isdecimal()
False

Dolaysyla a.isdecimal() komutu False kts verir...

13.31 isidentifier Metodu


identifier kelimesi Trkede tanmlayc anlamna gelir. Pythonda de
gi
skenler, fonksiyon
ve modl adlarna tanmlayc denir. I
ste ba
slkta grd
gmz isidentifier() metodu,
neyin tanmlayc olup neyin tanmlayc olamayaca
gn denetlememizi sa
glar. Hatrlarsanz
de
gi
skenler konusundan bahsederken, de
gi
sken ad belirlemenin baz kurallar oldu
gunu
sylemi
stik. Buna gre, rne
gin, de
gi
sken adlar bir say ile ba
slayamyordu. Dolaysyla s
yle
bir de
gi
sken ad belirleyemiyoruz:
>>> 1a = 12

Dedi
gimiz gibi, de
gi
skenler birer tanmlaycdr. Dolaysyla bir de
gi
sken adnn geerli olup
olmad
gn isidentifier() metodu yardmyla denetleyebiliriz:
>>> "1a".isidentifier()
False

Demek ki 1a ifadesini herhangi bir tanmlayc ad olarak kullanamyoruz. Yani bu ada sahip
bir de
gi
sken, fonksiyon ad veya modl ad olu
sturamyoruz. Ama mesela liste1 ifadesi
geerli bir tanmlaycdr. Hemen denetleyelim:
>>> "liste1".isidentifier()
True

13.32 isnumeric Metodu


Bu metot bir karakter dizisinin nmerik olup olmad
gn denetler. Yani bu metot yardmyla
bir karakter dizisinin say de
gerli olup olmad
gn denetleyebiliriz:
>>> "12".isnumeric()
True

>>> "dasd".isnumeric()
False

13.33 isprintable Metodu


E
ger bir karakter ekrana baslabiliyorsa bu metot True kts verecektir. Aksi halde bu metottan
False* yantn alrz. Temel olarak btn harfler, saylar ve bo
sluk i
sareti baslabilir karakterlerdir. Ama rne
gin ka
s dizileri baslabilir karakterler de
gildir:
>>> "a".isprintable()
True
>>> "123".isprintable()
True
>>> "".isprintable()
True
>>> "\n".isprintable()
False

13.34 isspace Metodu


Bu metot yardmyla bir karakter dizisinin tamamen bo
sluklardan olu
sup olu
smad
gn
denetleyebiliriz. E
ger karakter dizimiz bo
sluklardan olu
suyorsa bu metot True kts verecek,
ama e
ger karakter dizimizin iinde bir tane bile bo
sluk harici karakter varsa bu metot False
kts verecektir:
>>> a = " "
>>> a.isspace()
True
>>> a = "
>>> a.isspace()

"

True
inde bo
>>> a = "" #karakter dizimiz tamamen bo
s. I
sluk karakteri bile yok...
>>> a.isspace()
False
>>> a = "fd"
>>> a.isspace()
False

13.35 zfill Metodu


Bu metot kimi yerlerde i
simizi epey kolayla
strabilir. zfill() metodu yardmyla karakter
dizlerinin sol tarafna istedi
gimiz sayda sfr ekleyebiliriz:
>>> a = "12"
>>> a.zfill(3)
012

Bu metodu s
yle bir i
s iin kullanabilirsiniz:
>>> for i in range(11):
...
print(str(i).zfill(2))
00
01
02
03
04
05
06
07
08
09
10

Burada str() metodunu kullanarak range() fonksiyonundan elde etti


gimiz saylar birer
karakter dizisine evirdi
gimize dikkat edin. nk zfill() karakter dizilerinin bir metodudur...
Saylarn de
gil...

13.36 encode Metodu


Bu metot yardmyla karakter dizilerimizi istedi
gimiz kodlama sistemine gre kodlayabiliriz.
Python 3.xte varsaylan karakter kodlamas utf-8dir. E
ger istersek s
u karakter dizisini utf8 yerine cp1254 ile kodlayabiliriz:
>>> "ilek".encode("cp1254")

13.37 expandtabs Metodu


Bu metot yardmyla bir karakter dizisi iindeki sekme bo
sluklarn geni
sletebiliyoruz. rne
gin:
>>> a = "elma\tbir\tmeyvedir"
>>> a.expandtabs(10)

elma bir meyvedir

13.38 partition Metodu


Bu metot yardmyla bir karakter dizisini belli bir lte gre e blyoruz. rne
gin:

>>> a = "istanbul"
>>> a.partition("an")

(ist, an, bul)


E
ger partition() metoduna parantez iinde verdi
gimiz lt karakter dizisi iinde bulunmuyorsa s
u sonula kar
sla
srz:
>>> a = "istanbul"
>>> a.partition("h")

(istanbul, , )

13.39 rpartition Metodu


Bu metot da partition() metodu ile ayn i
si yapar, ama yntemi biraz farkldr. partition()
metodu karakter dizilerini soldan sa
ga do
gru okur. rpartition() metodu ise sa
gdan sola
do
gru.. Peki bu durumun ne gibi bir sonucu vardr? Hemen grelim:
>>> b = "istihza"
>>> b.partition("i")
(, i, stihza)

Grd
gnz gibi, partition() metodu karakter dizisini ilk i harfinden bld. S
imdi ayn
i
slemi rpartition() metodu ile yapalm:
>>> b.rpartition("i")
(ist, i, hza)

rpartition() metodu ise, karakter dizisini sa


gdan sola do
gru okudu
gu iin ilk i harfinden
de
gil, son i harfinden bld karakter dizisini...
partition() ve rpartition() metotlar, ltn karakter dizisi iinde bulunmad
g durumlarda da farkl tepkiler verir:
>>> b.partition("g")
(istihza, , )
>>> b.rpartition("g")
(, , istihza)

Grd
gnz gibi, partition() metodu bo
s karakter dizilerini sa
ga do
gru yaslarken,
rpartition() metodu sola do
gru yaslad.

13.40 str.maketrans ve translate Metotlar


Bu iki metot birbiriyle ba
glantl oldu
gu iin, bunlar bir arada grece
giz.
Diyelim ki elimizde bir karakter dizisi var ve biz bu karakter dizisini s
ifrelemek istiyoruz. Bunun
iin s
yle bir kod yazd
gmz varsayalm:

szlk = {"a":"0",
"b":"1",
"c":"2",
"":"3",
"d":"4",
"e":"5",
"f":"6",
"g":"7",
"
g":"8",
"h":"9",
"":"a",
"i":"b",
"j":"c",
"k":"",
"l":"d",
"m":"e",
"n":"f",
"o":"g",
"":"h",
"p":"",
"r":"i",
"s":"j",
"
s":"k",
"t":"l",
"u":"m",
"":"n",
"v":"o",
"y":"",
"z":"p",
" ":" "}
kardiz = "python programlama dili"
ifreli = ""
s
for i in kardiz:
sifreli =

sifreli + szlk[i]
print(
sifreli)

Bu kodu al
strd
gmz zaman s
yle bir kt alrz:
l9gf ig7i0ed0e0 4bdb

Aslnda bu ktda python programlama dili yazyor. Biz yukardaki kodlar yardmyla karakter
dizimizi s
ifreledik. Python, yazd
gmz szl
g temel alarak p harfi grd
g yere harfini;
y harfi grd
g yere harfini, t grd
g yere l harfini... yerle
stiriyor. Bylece karakter
dizimizin plak gzle anla
slmasn engelleyecek bir kt veriyor bize. Isterseniz yukardaki
kodlar bir fonksiyon olarak tanmlayp ok daha verimli bir hale getirebiliriz:
szlk = {"a":"0",
"b":"1",
"c":"2",
"":"3",
"d":"4",
"e":"5",
"f":"6",
"g":"7",
"
g":"8",

"h":"9",
"":"a",
"i":"b",
"j":"c",
"k":"",
"l":"d",
"m":"e",
"n":"f",
"o":"g",
"":"
g",
"p":"h",
"r":"",
"s":"i",
"
s":"j",
"t":"k",
"u":"l",
"":"m",
"v":"n",
"y":"o",
"z":"",
" ":" "}
def sifrele(kardiz):
sifreli = ""

for i in kardiz:
sifreli =

sifreli + szlk[i]
return
sifreli
print(sifrele("python programlama dili"))

Fonksiyonumuzu bir kez bu s


ekilde tanmladktan sonra sadece sifrele() fonksiyonunu kullanarak karakter dizilerimizi s
ifreleyebiliriz:
>>> print(sifrele("merhaba dnya"))
e5i9010 4nf0

Burada baz sorunlar oldu


gu ak. Mesela szlk iinde tanmlanmam
s karakter kullanld
gnda
programmz hata verecektir. Ayrca akas bu kodlar biraz kalabalk grnyor gze...
Isterseniz yukardaki i
slemi daha sade ve performansl bir biimde yapmann bir yolu vardr
Pythonda...
Bunun iin str.maketrans() ve translate() metotlarndan yararlanaca
gz. S
u kodlara bir
bakalm:
kaynak_dizi = "abcdefg
ghijklmnoprs
stuvyz"
hedef_dizi = "0123456789abcdefg
ghijklmno"
eviri_nesnesi = str.maketrans(kaynak_dizi, hedef_dizi)
kardiz = "python programlama dili"
sonu = kardiz.translate(eviri_nesnesi)
print(sonu)

Burada yapt
gmz s
ey ok basit. ncelikle kaynak_dizi adnda bir karakter dizisi olu
sturduk.
Amacmz bir karakter dizisi iindeki karakterleri ba
ska karakterlere dn
strmek. I
ste bu kay-

nak_dizi adl karakter dizisi zgn kaynak dizimizin karakterlerini temsil ediyor. Alt satrdaki
hedef_dizi adl karakter dizisi ise, kaynak dizi iindeki karakterlerin dn
strlece
gi karakterleri gsteriyor. Bu iki karakter dizisini, bir stteki kodlarda szlk halinde yazm
stk. Buradaki kaynak_dizi adl karakter dizisi bir nceki kodlardaki szl
gn anahtarlarnn (keys),
hedef_dizi adl karakter dizisi ise szl
gn de
gerlerinin (values) yerini tutuyor.
Karakter dizilerimizi tanmladktan sonra str.maketrans() metodunu kullanarak bir eviri
nesnesi olu
sturaca
gz. Olu
sturaca
gmz bu eviri nesnesi, biraz nce tanmlad
gmz kaynak_dizi ve hedef_dizi adl karakter dizilerinin
gelerini birbiriyle e
sle
stirme vazifesi grecek. Zaten str.maketrans(kaynak_dizi, hedef_dizi) satr bu vazifeyi gzler nne seriyor...
Bu arada maketrans() metodunu, teki metotlardan farkl olarak str.maketrans() s
eklinde
kulland
gmza zellikle dikkat edin.
Hemen ardndan eviri i
slemine tabi tutaca
gmz karakter dizimizi yazdk. Bu karakter dizimiz
python programlama dili.
Daha sonra da sonu adl bir de
gi
sken iinde translate() metodundan faydalanarak
yukarda olu
sturdu
gumuz eviri_nesnesini bu metoda argman olarak veriyoruz. Bu metot,
kardiz adl karakter dizisini alp, yukarda eviri_nesnesi iinde belirledi
gimiz formle gre
eviri i
slemine tabi tutuyor ve ortaya s
ifrelenmi
s bir karakter dizisi karyor...

13.41 format Metodu


format(), karakter dizilerinin en nemli metotlarndan biridir. Bu metot Pythonun 3.x srm
ile birlikte dile dahil oldu. Aslnda biz bu metodu daha nce Karakter Dizilerini Biimlendirme
konusunu i
slerken de anlatm
stk. Burada ise bu metodu biraz daha ayrntl bir s
ekilde inceleyece
giz.
Dedi
gimiz gibi, format() metodu Pythona 3.x srmyle birlikte dahil oldu. 3.xten nce
format() metodunun yapt
g i
si s
u s
ekilde yerine getiriyorduk:
>>> "%s %syi seviyor!"%("Ali", "Ay
se")
Ali Ay
seyi seviyor!

Esasnda bu yntem Pythonun 3.x srmnde de geerlidir. Yani yukardaki yntemi kullanarak hl karakter dizilerini biimlendirebiliriz. Ancak bu yntem artk eskimi
s olarak kabul
ediliyor ve yerini yava
s yava
s format() metoduna brakyor. Dolaysyla yeni yazd
gnz kodlarda % i
sareti yerine format() metodunu kullanmanz s
iddetle tavsiye edilir...
Gelelim bu metodun ayrntlarna...
Temel olarak format() metodunu nasl kullanaca
gmz biliyoruz. Basit bir rnek verelim:
>>> zaman = "Cumartesi"
>>> "Seninle {0} gn bulu
salm".format(zaman)
Seninle Cumartesi gn bulu
salm

Burada {0} biiminde belirtti


gimiz ksma, format() metodu iinde belirtti
gimiz de
gi
sken ad
otomatik olarak yerle
stiriliyor. Buradaki 0 says, parantez iinde gsterilecek
gelerin
srasna i
saret ediyor:
>>> zaman = "Pazartesi"
>>> saat = "12:30"
>>> "Seninle {0} gn saat {1}da bulu
salm".format(zaman, saat)

"Seninle Pazartesi gn saat 12:30da bulu


salm"

Pythonun 3.0 srmnde, yukardaki kodlarda grnen {} alanlar iine mutlaka sra belirten
bir say yazmamz gerekiyordu. Ancak Pythonun 3.1 srmyle birlikte bu zorunluluk ortadan kaldrld. Yani Python 3.1den itibaren artk yukardaki kodlar s
yle de yazma imkanna
sahibiz:
>>> "Senin {} gn saat {}da bulu
salm".format(zaman, saat)

E
ger istersek yine {} iinde say belirtmekte zgrz. Ama artk bu bir zorunluluk de
gil...
Ama format() metodu iinde belirtilen parametrelerin do
gal srasn bozacaksak, sayy belirtmemiz gerekir:
>>> "{1} {0}yi seviyor!".format("Ali", "Ay
se")
Ay
se Aliyi seviyor!

format() metodu en basit haliyle yukardaki gibidir. Ancak bu metot bize ok daha geli
smi
s
zellikler de sunar. S
u rne
ge bir bakalm:
>>>
>>>
>>>
>>>

liste = ["elma", "armut", "kebap"]


"listenin ilk
gesi
sudur: {0[0]}".format(liste)
"listenin ikinci
gesi
sudur: {0[1]}".format(liste)
"listenin nc
gesi
sudur: {0[2]}".format(liste)

Grd
gnz gibi, {} alan iinde liste
gelerini dilimleme imkanna da sahibiz... Yukardaki
kodlar s
yle de yazabiliriz:
>>> "listenin ilk
gesi
sudur :", liste[0]
>>> "listenin ikinci
gesi
sudur :", liste[1]
>>> "listenin nc
gesi
sudur :", liste[2]

Elbette format() metodu yukardaki ynteme gre ok daha esnek ve pratiktir...


format() metodunu ayrca s
u s
ekilde de kullanabiliriz:
>>> "Son gncelleme: {gun} {ay} {yil}".format(gun="27", ay="05", yil="2009")

Burada {} alan iinde isim kullanarak kullanm daha kolay bir yap olu
sturdu
gumuza dikkat
edin.

You might also like