You are on page 1of 203

indekiler

Temel Bilgiler.......................................................................................................................................6
Giri.............................................................................................................................................6
Python'u Nereden Bulabilirim?...................................................................................................6
Python Nasl altrlr?.............................................................................................................7
print komutu................................................................................................................................7
Python'da Saylar ve Matematik lemleri..................................................................................9
Deikenler................................................................................................................................11
Metin Dzenleyici Kullanlarak Python Program Nasl Yazlr?.............................................12
Kullancyla letiim: Veri Al-Verii................................................................................................17
raw_input() fonksiyonu.............................................................................................................17
input() fonksiyonu.....................................................................................................................19
Python'da Koula Bal Durumlar......................................................................................................21
if... ............................................................................................................................................21
else:...........................................................................................................................................25
elif.............................................................................................................................................25
Python'da Dngler............................................................................................................................29
while dngs...........................................................................................................................29
for dngs...............................................................................................................................35
range() fonksiyonu....................................................................................................................36
len() fonksiyonu........................................................................................................................37
break ifadesi..............................................................................................................................37
continue ifadesi.........................................................................................................................38
Python'da Listeler, Demetler, Szlkler.............................................................................................39
Listeler......................................................................................................................................39
append parac...................................................................................................................41
insert parac.....................................................................................................................42
extend parac....................................................................................................................43
liste + yeni_liste....................................................................................................................43
remove parac..................................................................................................................43
pop parac........................................................................................................................43
index parac.....................................................................................................................44
sort parac........................................................................................................................44
liste.sort()..............................................................................................................................45
reverse parac...................................................................................................................45
count parac.....................................................................................................................45
Demetler....................................................................................................................................48
Szlkler...................................................................................................................................49
telefon_defteri.clear()................................................................................................................50
if-elif-else Yerine Szlk Kullanmak........................................................................................50
Python'da Fonksiyonlar......................................................................................................................53
Giri...........................................................................................................................................53
Fonksiyon Tanmlama...............................................................................................................53
Komut Satrnda Fonksiyon Tanmlama...................................................................................54
Metin Dzenleyicide Fonksiyon Tanmlama............................................................................54
Fonksiyonlarda Parametreler....................................................................................................55
Fonksiyon indeki Deikenlerin Okunma Sras...................................................................60
----------------------------------------------------------------------------------------------------------------------Python Dersleri
1/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

merhaba(arkadas, ark)...............................................................................................................62
"global" ifadesi..........................................................................................................................62
"return" ifadesi..........................................................................................................................64
"pass" ifadesi.............................................................................................................................66
Modller ............................................................................................................................................66
Giri ..............................................................................................................................................66
Modl ekme (importing Modules) .............................................................................................66
os Modl .....................................................................................................................................67
name fonksiyonu ......................................................................................................................68
listdir fonksiyonu .....................................................................................................................69
getcwd fonksiyonu ...................................................................................................................70
chdir() fonksiyonu ....................................................................................................................71
mkdir() ve makedirs() fonksiyonlar ........................................................................................72
rmdir() ve removedirs() fonksiyonlar .....................................................................................74
os.sep fonksiyonu .....................................................................................................................75
Dosya lemleri ..................................................................................................................................78
Yeni bir dosya yaratma .................................................................................................................79
Dosyaya Veri leme .....................................................................................................................81
Bir Dosyadan Veri Okuma ............................................................................................................83
Dosyaya Deiken Yazdrma ........................................................................................................86
int(x)...............................................................................................................................................87
Dosya Silme ..................................................................................................................................87
Dosyann Herhangi Bir Yerine Satr Ekleme ................................................................................87
Hatalarla Baetme ..............................................................................................................................89
Giri ..............................................................................................................................................89
Deiken smine likin Hatalar (NameError) ..............................................................................90
Szdizimine likin Hatalar (SyntaxError) ...................................................................................91
Hata Kodu Vermeden Hata Yakalama ...........................................................................................92
Hatalarla Baetmede "pass" fadesi" .............................................................................................94
Karakter Dizilerinin Metotlar............................................................................................................95
Giri ..............................................................................................................................................95
Kullanlabilir Metotlar Listelemek...............................................................................................96
capitalize metodu......................................................................................................................98
upper metodu.............................................................................................................................99
lower metodu...........................................................................................................................101
swapcase metodu.....................................................................................................................101
title metodu.............................................................................................................................102
center metodu..........................................................................................................................102
ljust metodu.............................................................................................................................103
rjust metodu.............................................................................................................................103
zfill metodu.............................................................................................................................103
replace metodu........................................................................................................................104
startswith metodu....................................................................................................................105
endswith metodu.....................................................................................................................106
count metodu...........................................................................................................................106
isalpha metodu........................................................................................................................107
isdigit metodu..........................................................................................................................108
isalnum metodu.......................................................................................................................108
----------------------------------------------------------------------------------------------------------------------Python Dersleri
2/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

islower metodu........................................................................................................................109
isupper metodu........................................................................................................................110
istitle metodu...........................................................................................................................110
isspace metodu........................................................................................................................111
expandtabs metodu..................................................................................................................112
find metodu.............................................................................................................................112
rfind metodu............................................................................................................................114
index metodu...........................................................................................................................114
rindex metodu..........................................................................................................................115
join metodu..............................................................................................................................115
translate metodu......................................................................................................................116
partition metodu......................................................................................................................118
rpartition metodu.....................................................................................................................119
strip metodu.............................................................................................................................119
rstrip metodu...........................................................................................................................120
lstrip metodu...........................................................................................................................120
splitlines metodu.....................................................................................................................120
split metodu.............................................................................................................................121
rsplit metodu...........................................................................................................................122
Nesne Tabanl Programlama OOP (NTP)......................................................................................123
Neden Nesne Tabanl Programlama?......................................................................................124
Snflar.....................................................................................................................................125
Snf Tanmlamak....................................................................................................................125
Snflar altrmak................................................................................................................126
rnekleme (Instantiation).......................................................................................................128
p Toplama (Garbage Collection)........................................................................................129
Niteliklere Deinme (Attribute References)...........................................................................130
__init__ Nedir?.......................................................................................................................134
self Nedir?...............................................................................................................................136
Miras Alma (Inheritance)........................................................................................................145
Eski ve Yeni Snflar................................................................................................................155
Sonu.......................................................................................................................................157
Grafik Arayz Tasarm // Temel Bilgiler ........................................................................................157
Giri ............................................................................................................................................157
Pencere Oluturmak ....................................................................................................................158
Pencere Bal ...........................................................................................................................161
Renkler ........................................................................................................................................163
fg seenei ..............................................................................................................................163
bg seenei .............................................................................................................................164
Yaz Tipleri (Fonts) .....................................................................................................................165
Metin Biimlendirme ..................................................................................................................166
mleler .......................................................................................................................................167
Pencere Boyutu ...........................................................................................................................167
Grafik Arayz Tasarm // Pencere Aralar (Widgets) ....................................................................169
Giri ............................................................................................................................................169
"Label" Pencere Arac .................................................................................................................169
"Button" Pencere Arac ...............................................................................................................170
"Entry" Pencere Arac .................................................................................................................172
----------------------------------------------------------------------------------------------------------------------Python Dersleri
3/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

"Checkbutton" Pencere Arac .....................................................................................................175


"Toplevel" Pencere Arac ............................................................................................................182
"Listbox" Pencere Arac ..............................................................................................................184
"Menu" Pencere Arac ................................................................................................................193
"Text" Pencere Arac....................................................................................................................198

----------------------------------------------------------------------------------------------------------------------Python Dersleri
4/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

-----------------------------------------~~~~~~~~~~---------------------------------------------Bu almann Pardus Forumu'ndaki tartma adresi


e.posta: kistihza [et] yahoo [nokta] com
-----------------------------------------~~~~~~~~~~----------------------------------------------

Bu almann gncel srmlerine u iki adresten ulaabilirsiniz:


http://wiki.pardus-linux.org/index.php/Python
http://www.python.quotaless.com/

----------------------------------------------------------------------------------------------------------------------Python Dersleri
5/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Temel Bilgiler
Giri
Python, Guido Van Rossum adl Hollandal bir programc tarafndan yazlm bir programlama dili.
Guido Van Rossum'un neye benzediini merak edenler u adresi ziyaret edebilir: [1]
Python kelimesi aslnda ou kiinin zannettii gibi "Piton Ylan" anlamna gelmiyor. "Python"
ismi Guido Van Rossum'un ok sevdii, "Monty Python" adl alt kiilik bir ngiliz komedi
grubunun "Monty Python's Flying Circus" adl gsterisinden geliyor.
Guido Van Rossum Python'u gelitirmeye 1990 ylnda balam... Yani aslnda Python iin nispeten
yeni bir dil denebilir. Ancak Python'un ok uzun bir gemii olmasa da, bu dil teki dillere kyasla
kolay olmas, hzl olmas, ayr bir derleyici programa ihtiya duymamas ve bunun gibi pek ok
nedenden tr ou kimsenin gzdesi haline gelmitir. Ayrca Google'nin de Python'a zel bir
nem ve deer verdiini, ok iyi derecede Python bilenlere i olana sunduunu da hemen
syleyelim. Mesela bundan ksa bir sre nce Python'un yaratcs Guido Van Rossum Google'de ie
balad...
Python'u Nereden Bulabilirim?
Python hemen hemen btn Linux datmlarnda kurulu olarak geliyor. Pardus'ta Python'un ykl
olduunu biliyoruz, o yzden Pardus kullanyorsanz ayrca yklemenize gerek yok. Eer Python'u
yklemeniz gerekirse http://www.python.org/download/ adresinden ykleyebilirsiniz. Ancak Python
GNU/Linux datmlarnda ok nemli baz paralarla etkileim halinde olduu iin kaynaktan
kurulum pek tavsiye edilmez... Hele hele Pardus gibi, sistemin belkemiini Python'un oluturduu
bir datmda kaynaktan kurulum epeyce ba artabilir... Szn z, GNU/Linux sistemlerinde en
pratik yol datmn kendi Python paketlerini kullanmaktr...
Yukardaki indirme adresinde GNU/Linux kaynak kodlaryla birlikte programn Windows
srmn de bulabilirsiniz. Bu adresten Python'u indirmek isteyen ou Windows kullancs iin
uygun srm "Python x.x.x Windows installer" olacaktr... ndirilen bu dosya .msi uzantldr. Eer
sisteminizde .msi ykleyici uygulama yoksa (muhtemelen vardr) buradan gerekli uygulamay
bilgisayarnza indirip kurabilirsiniz.

----------------------------------------------------------------------------------------------------------------------Python Dersleri
6/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Python Nasl altrlr?


Eer KDE masast kullanyorsak Python programn altrmak iin ALT+F2 tularna basp
kan ekranda
konsole
yazarak bir konsol ekran ayoruz.
Eer kullandmz masast GNOME ise ALT+F2 tularna bastktan sonra vermemiz gereken
komut udur:
gnome-terminal
Bu ekilde konsol ekranna ulatmzda;
python
yazp "enter"e basarak Python Programlama Dili'ni balatyoruz. Karmza una benzer bir ekran
gelmeli:
Python 2.4.4 (#1, Oct 23 2007, 11:25:50) [GCC
3.4.6] on linux2 Type "help", "copyright", "credits" or "license" for more information.
>>>
Bu ekranda kullandmz Python srmnn 2.4.4 olduunu gryoruz...
Buradaki ">>>" iareti Python'un bizden komut almaya hazr olduunu gsteriyor. Komutlarmz
bu iaretten hemen sonra, boluk brakmadan yazacaz. Bunun dnda, istersek Python kodlarn
bir metin dosyasna da kaydedebilir, bu kaydettiimiz metin dosyasn konsoldan altrabiliriz. Bu
ilemin nasl yaplacan daha sonra konuacaz.
Windows kullanclar ise Python komut satrna Balat > Programlar > Python > Python
(Command Line) yolunu takip ederek ulaabilirler...
Python'u nasl altracamz rendiimize gre artk ilk programmz yazabiliriz. e ok
bilindik, basit bir komutla balayalm:
print komutu
Bu komut ekrana bir eyler yazdrmamz salar. Mesela bu komutu tek bana kullanmay
deneyelim:
----------------------------------------------------------------------------------------------------------------------Python Dersleri
7/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

print
yazp hemen "enter" tuuna basyoruz.
Ne oldu? Python bir satr boluk brakarak alt satra geti, deil mi? Bunu ona yapmasn biz
syledik, o da yapt... imdi de bo bir satr brakmak yerine ekrana bir eyler yazmasn syleyelim
Python'a:
print "Ben Python, Monty Python!"
yazp "enter" tuuna bastktan sonra ekranda "Ben Python, Monty Python!" ktsn grrz.
Grdnz gibi "print" komutunun ardndan gelen "Ben Python, Monty Python!" ifadesini ift
trnak iinde belirtiyoruz. Eer burada ift trnak iaretini koymazsak veya koymay unutursak
Python bize bir hata kts gsterecektir. Biz istersek ift trnak yerine tek trnak (') da
kullanabiliriz. Ancak tek trnak baz yerlerde bize sorun karabilir. Diyelim ki "Linux'un faydalar"
ifadesini ekrana yazdrmak istiyoruz. Eer bunu ift trnakla gsterirsek sorun yok:
print "Linux'un faydalar"
Bu komut bize hatasz bir ekilde "Linux'un faydalar" ktsn verir. Ancak ayn ilemi tek trnakla
yapmaya alrsak yle bir hata mesaj alrz:
print 'Linux'un faydalar'
File "<stdin>", line 1
print 'Linux'un faydalar'
^
SyntaxError: invalid syntax
Bunun nedeni, "Linux'un" kelimesindeki kesme iaretinden tr Python'un trnaklarn nerede
balayp nerede bittiini anlamamasdr... Eer illa tek trnak kullanmak istiyorsak, kodu u hale
getirmemiz gerekir:
print 'Linux\'un faydalar'
Buradaki "\" iareti olas bir hatadan kamamz salar. Bu yzden bu tr ifadelere Python dilinde
"Ka Dizileri" (Escape Sequences) ad verilir. Python'da "print" komutunun nasl kullanldn
grdmze gre artk Python'un baka bir zelliini anlatmaya balayabiliriz:

----------------------------------------------------------------------------------------------------------------------Python Dersleri
8/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Python'da Saylar ve Matematik lemleri


Python'da henz drt ba mamur bir program yazamasak da en azndan imdilik onu basit bir hesap
makinesi niyetine kullanabiliriz! rnein:
2+5
52
2*5
6/2
sterseniz bunlarn bana "print" komutu ekleyerek de kullanabilirsiniz bu ilevi. Bir rnek verelim:
print 234 + 546
Grdnz gibi tamsaylar (integer) yazarken trnak iaretlerini kullanmyoruz. Eer trnak iareti
kullanrsak Python yazdklarmz "tamsay" (integer) olarak deil "karakter dizisi" (string), yani bir
nevi "harf" olarak alglayacaktr. Bu durumu birka rnekle grelim:
print 25 + 50
Bu komut, 25 ve 50'yi toplayp sonucu kt olarak verecektir. imdi aadaki rnee bakalm:
print "25 + 50"
Bu komut 25 ile 50'yi toplamak yerine, ekrana "25 + 50" eklinde bir kt verecektir. Peki yle bir
komut verirsek ne olur:
print "25" + "50"
Byle bir komutla karlaan Python derhal "25" ve "50" karakter dizilerini (bu saylar trnak iinde
olduu iin Python bunlar say yerine koymaz...) yan yana getirip birletirecektir. Yani yle bir ey
yapacaktr:
print "25" + "50"
2550
Uzun lafn ksas, "25" ifadesi ile "Ben Python, Monty Python!" ifadesi arasnda Python asndan
hi bir fark yoktur. Bunlarn ikisi de "karakter dizisi" snfna girer. Ancak trnak iareti olmayan 25
ile "Ben Python, Monty Python!" ifadeleri Python dilinde ayr anlamlar tar. nk bunlardan biri
"tamsay" (integer) teki ise "karakter dizisi"dir (string).
----------------------------------------------------------------------------------------------------------------------Python Dersleri
9/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

imdi matematik ilemlerine geri dnelim. ncelikle u komutun ktsn inceleyelim:


print 5 / 2
2
Ama biz biliyoruz ki 5'i 2'ye blerseniz 2 deil 2,5 kar... O zaman nedir bu imdi? Yoksa Python
matematikten anlamyor mu?! Anlyor anlamasna ama bizim de Python'a biraz yardmc olmamz
gerekiyor. Ayn komutu bir de yle deneyelim:
print 5.0 / 2
2.5
Grdnz gibi blme ilemini oluturan bileenlerden birinin yanna ".0" koyulursa sorun
zlyor. Bylelikle Python bizim sonucu tamsay yerine "kayan noktal" (floating point) say
cinsiden grmek istediimizi anlyor. Bu ".0" ifadesini istediimiz saynn nne koyabiliriz. Birka
rnek grelim:
print 5 / 2.0
print 5.0 / 2.0
Python'da matematik ilemleri yaplrken altmz matematik kurallar geerlidir. Yani mesela
ayn anda blme karma, toplama, arpma ilemleri yaplacaksa ilem ncelik sras, nce blme
ve arpma sonra toplama ve karma eklinde olacaktr. rnein:
print 2 + 6 / 3 * 5 4
ileminin sonucu 8 olacaktr. Tabii biz istersek parantezler yardmyla Python'un kendiliinden
kulland ncelik srasn deitirebiliriz. Bu arada yapacamz matematik ilemlerinde saylar
"kayan noktal say" cinsinden yazmamz ilem sonucunun kesinlii asndan byk nem tar...
Eer her defasnda ".0" koymaktan sklyorsanz, u komutla Python'a, "Bana her zaman kesin
sonular gster," mesaj gnderebilirsiniz:
from __future__ import division
Not: Burada "__" iaretini iki kez art arda klavyedeki alt izgi tuuna basarak yapabilirsiniz.
Artk bir sonraki Python oturumuna kadar btn matematik ilemlerinizin sonucu kayan noktal
say cinsinden gsterilecektir.

----------------------------------------------------------------------------------------------------------------------Python Dersleri
10/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Buraya kadar Python'da tane "veri tipi" (data type) olduunu grdk. Bunlar:

Karakter dizileri (strings)

Tamsaylar (integers)

Kayan noktal saylar (floating point numbers)

Python'da bunlarn dnda baka veri tipleri de bulunur. Ama biz imdilik veri tiplerine ara verip
"deikenler" (variables) konusuna deinelim biraz.
Deikenler
Kabaca, bir veriyi kendi iinde depolayan birimlere deiken ad veriyorlar. Ama u anda aslnda
bizi deikenin ne olduundan ziyade neye yarad ilgilendiriyor. O yzden hemen bir rnekle
durumu aklamaya alalm. Mesela;
n=5
ifadesinde "n" bir deikendir. Bu "n" deikeni "5" verisini sonradan tekrar kullanlmak zere
depolar. Python komut satrnda "n = 5" eklinde deikeni tanmladktan sonra "print n" komutunu
verirsek ekrana yazdrlacak veri 5 olacaktr. Yani:
n=5
print n
5
Bu "n" deikenini alp bununla matematik ilemleri de yapabiliriz:
n*2
n/5
Hatta bu "n" deikeni, iinde bir matematik ilemi de barndrabilir:
n = 34 * 45
print n
1530
u rneklere bir gz atalm:
a=5
b=3
print a * b
----------------------------------------------------------------------------------------------------------------------Python Dersleri
11/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

15
print "a ile b'yi arparsak", a * b, "elde ederiz!"
a ile b'yi arparsak 15 elde ederiz!
Burada

deikenleri

karakter

dizileri

arasna

nasl

yerletirdiimize,

virglleri

nerede

kullandmza dikkat edin.


Ayn deikenlerle yaptmz u rnee bakalm bir de:
print a, "says", b, "saysndan byktr"
Deikenleri kullanmann baka bir yolu da zel iaretler yardmyla bunlar karakter dizileri iine
gmmektir. u rnee bir bakalm:
print "%s ile %s arplrsa %s elde edilir" % (3, 5, 3*5)
Burada, kullanacamz her bir "tamsay" iin "%s" ekliyoruz. fadenin en sonunda da % iaretinin
ardndan parantez iinde bu deikenleri teker teker tanmlyoruz. Buna gre birinci deikenimiz
"3", ikincisi "5", ncs ise bunlarn arpm...
Bir de u rnei inceleyelim:
print "%s %s'yi seviyor!" % ("Ali", "Aye")
Grlecei gibi, bu kez deikenlerimiz tamsay yerine karakter dizisi olduu iin parantez iinde
deikenleri belirtirken trnak iaretlerini kullanmay unutmuyoruz..
Metin Dzenleyici Kullanlarak Python Program Nasl Yazlr?
zellikle kk kod paralar yazp bunlar denemek iin Python komut satr mkemmel bir
ortamdr. Ancak kodlar oalp bymeye balaynca komut satr yetersiz gelmeye balayacaktr.
stelik tabii ki yazdnz kodlar bir yere kaydedip saklamak isteyeceksiniz... te burada metin
dzenleyiciler devreye girecektir. Python kodlarn yazmak iin istediiniz herhangi bir metin
dzenleyiciyi kullanabilirsiniz. Ancak iine yazlan kodlar ayrt edebilen, bunlar farkl renklerde
gsterebilen bir metin dzenleyici ile yola kmak her bakmdan hayatnz kolaylatracaktr.
Eer kullandnz sistem GNU/Linux'ta KDE masast ortam ise balang dzeyi iin kwrite
veya kate metin dzenleyicilerden herhangi biri yeterli olacaktr. u aamada kullanm kolayl ve
sadelii nedeniyle kwrite nerilebilir.
Eer kullandnz sistem GNU/Linux'ta GNOME masast ortam ise gedit'i kullanabilirsiniz.
----------------------------------------------------------------------------------------------------------------------Python Dersleri
12/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Windows kullanclar ise Balat > Programlar > Python > IDLE (Python GUI) yolunu takip
ederek IDLE adl gelitirme arac ile alabilirler.
e yeni bir kwrite belgesi aarak balayalm. Yeni bir kwrite belgesi amann en kolay yolu ALT
+F2 tularna basp, kan ekranda
kwrite
yazmaktr...
Bo kwrite belgesi karmza geldikten sonra ilk yapmamz gereken, ilk satra
#!/usr/bin/env python
yazmak olacaktr. Bu komut sayesinde kwrite yazacamz kodlar Python'la altrmas gerektiini
anlayacak. Bu konuyu biraz sonra daha ayrntl olarak greceiz. Kwrite belgesinin ilk satrna
yukarda verilen ifadeyi yerletirdikten sonra artk kodlarmz yazmaya balayabiliriz. Aslnda
metin iine kod yazmak, Python komut satrna kod yazmaktan ok farkl deil. imdi aada
verilen satrlar kwrite belgesi iine ekleyelim:
#!/usr/bin/env python
a = "elma"
b = "armut"
c = "muz"
print "bir", a, "bir", b, "bir de", c, "almak istiyorum!"
Bunlar yazp bitirdikten sonra sra geldi dosyamz kaydetmeye. imdi dosyamz "deneme.py"
adyla herhangi bir yere kaydediyoruz. Gelin biz masastne kaydedelim dosyamz! u anda
masastnde "deneme.py" adnda, muhtemelen yeil renkli, zerinde bir ylan resmi bulunan bir
dosya gryor olmamz lazm... Geri uzaktan baknca kaplumbaaya benziyor ya, neyse... imdi
hemen bir konsol ekran ayoruz. (Ama python komut satrn altrmyoruz) u komutu vererek,
masastne, yani dosyay kaydettiimiz yere geliyoruz:
cd Desktop
Yazdmz program altrmak iin ise u komutu verip enter'e basyoruz:
python deneme.py
Eer her ey yolunda gitmise u kty almamz lazm:
bir elma, bir armut, bir de muz almak istiyorum!
----------------------------------------------------------------------------------------------------------------------Python Dersleri
13/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

GNOME kullanclar da yukarda anlatlan ilemi takip ederek dosyay kaydedip altrabilir.
Windows kullanclar ise IDLE adl gelitirme aracn yukarda anlattmz ekilde atktan sonra
File > New Window yolunu takip ederek yeni bir dosya oluturmal, ardndan yukarda verdiimiz
kodlar yazmal, en son olarak da File > Save as... yolunu takip ederek dosyay deneme.py adyla
herhangi bir yere kaydetmelidir... Bu arada Windows kullanclarnn, #!/usr/bin/env python satrn
yazmalarna gerek yok... Bu satr sadece GNU/Linux kullanclarn ilgilendiriyor. Windows
kullanclar IDLE ile dosyay kaydettikten sonra Run > Run Module yolunu takip ederek veya
dorudan F5 tuuna basarak yazdklar program altrabilir.
"python deneme.py" komutuyla programlarmz altrabiliyoruz. Peki ama acaba Python
programlarn baa "python" komutu eklemeden altrmann bir yolu var m? te burada biraz
nce bahsettiimiz "#!/usr/bin/env python" satrnn nemi ortaya kyor... Baa "python" komutu
getirmeden programmz altrabilmek iin ncelikle programmza "altrma yetkisi" vermemiz
gerekiyor. Bunu u komut yardmyla yapyoruz:
cd Desktop
komutuyla dosyay kaydettiimiz yer olan masastne geliyoruz.
chmod a+x deneme.py
komutuyla da "deneme.py" adl dosyaya "altrma yetkisi" veriyoruz, yani dosyay
"altrlabilir" (executable) bir dosya haline getiriyoruz.
stersek bu ilemi u ekilde de yapabiliriz:
+ Masastndeki deneme.py dosyasna sa tklayn
+ "zellikler" mensne girin
+"izinler" sekmesi altndaki "altrlabilir" seeneinin solundaki kutucuu iaretleyin.
Artk komut satrnda u komutu vererek programmz altrabiliriz:
cd Desktop
./deneme.py
Peki tm bu ilemlerin #!/usr/bin/env python" satryla ne alakas var? El Cevap: Eer bu satr
metne yerletirmezsek "./deneme.py" komutu almayacaktr...
Bu ilemlerden sonra bu deneme.py dosyasnn isminin sonundaki .py uzantsn kaldrp,
./deneme
----------------------------------------------------------------------------------------------------------------------Python Dersleri
14/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

komutuyla da programmz altrabiliriz.


Ya biz programmz sadece ismini yazarak altrmak istersek ne yapmamz gerekiyor?
Bunu yapabilmek iin programmzn "PATH deikeni" iinde yer almas, yani Trke ifade etmek
gerekirse, programn "YOL stnde" olmas gerekir... Peki bir programn "YOL stnde olmas" ne
anlama geliyor? Bilindii gibi, bir programn veya dosyann "yolu", kabaca o programn veya
dosyann iinde yer ald dizindir.... rnein GNU/Linux sistemlerindeki fstab dosyasnn yolu
/etc/fstab'dr. Baka bir rnek vermek gerekirse, xorg.conf dosyasnn yolu /etc/X11/xorg.conf'tur...
Bu "yol" kelimesinin bir de daha zel bir anlam bulunur. Bilgisayar dilinde, altrlabilir
dosyalarn (rnein Windows'taki .exe dosyalar ve GNU/Linux'taki .bin dosyalar altrlabilir
dosyalardr.) iinde yer ald dizinlere de zel olarak YOL ad verilir ve bu anlamda
kullanldnda "yol" kelimesi genellikle byk harfle yazlr... te altrlabilir dosyalar eer
YOL stnde iseler dorudan isimleriyle arlabilirler. imdi bu konuyu daha iyi anlayabilmek
iin birka deneme yapalm. Hemen bir konsol ekran ap u komutu veriyoruz:
echo $PATH
Bu komutun kts yle bir ey olacaktr:
/usr/local/bin:/usr/bin:/bin:/opt/bin:/usr/i686-pc-linux-gnu/gcc-bin/3.4.6:
/opt/sun-jre/bin:/usr/qt/3/bin:/usr/kde/3.5/bin
Bu kt bize YOL deikeni dediimiz eyi gsteriyor. te eer altrlabilir dosyalar bu
dizinlerden herhangi biri iinde ise o dosyalar isimleriyle arabiliyoruz. rnein;
which amarok
komutun ktsna bir bakalm:
/usr/kde/3.5/bin/amarok
Grdnz gibi amarok programnn YOL'u /usr/kde/3.5/bin/amarok. Hemen yukarda echo
$PATH komutunun ktsn kontrol ediyoruz ve gryoruz ki /usr/kde/3.5/bin/ dizini YOL
deikenleri arasnda var... Dolaysyla, amarok program YOL stndedir, diyoruz. Amarok
program YOL stnde olduu iin, konsolda sadece "amarok" yazarak program balatabiliyoruz.
imdi eer biz de yazdmz program dorudan ismiyle arabilmek istiyorsak programmz
echo $PATH ktsnda verilen dizinlerden birinin iine kopyalamamz gerekiyor. Mesela
programmz /usr/local/bin iine kopyalayalm. Tabii ki bu dizin iine bir dosya kopyalayabilmek
----------------------------------------------------------------------------------------------------------------------Python Dersleri
15/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

iin root yetkilerine sahip olmalsnz. u komut ii halledecektir:


sudo cp Desktop/deneme /usr/local/bin
imdi konsol ekrannda
deneme
yaznca programmzn altn grmemiz lazm.
Program dosyamz YOL'a eklemek yerine, dosyamzn iinde bulunduu dizini YOL'a eklemek de
mmkn. yle ki:
PATH=$PATH:/home/kullanc_adnz/Desktop
Bu ekilde masast ortamn YOL'a eklemi olduk. sterseniz;
echo $PATH
komutuyla masastnzn YOL stnde grnp grnmediini kontrol edebilirsiniz... Bu sayede
artk masastnde bulunan altrlabilir dosyalar da kendi adlaryla arlabilecekler. Ancak
masastn YOL'a eklediinizde, masastnz hep YOL stnde kalmayacak, mevcut konsol
oturumu kapatlnca her ey yine eski haline dnecektir.
imdiye kadar rendiklerimizi ksaca zetlemek gerekirse:

Python program ou GNU/Linux datmnda zaten ykl olarak geldii iin ayrca
yklemeye gerek yok.

Python kodlarn yazmak iin iki seeneimiz var. Birincisi kodlarmz dorudan Python
komut satrna yazabiliyoruz. Python komut satrn amak iin ALT+F2 tularna basp
kan ekrana "konsole" yazmamz, ardndan da konsolda "python" komutunu vermemiz
gerekiyor. Bu ekranda komutlarmz ">>>" iaretinden hemen sonra yazacaz.

kinci seeneimiz ise bir metin dzenleyici kullanmaktr. Baz ufak kodlar denemek iin
komut satr yeterli olsa da hem kodlarmz kaydetmek hem de byk programlarda rahat
hareket edebilmek iin mutlaka bir metin dzenleyici kullanmamz gerekiyor. u aamada
kullanm kolayl nedeniyle "kwrite" metin dzenleyici nerilebilir.

ALT+F2 tularna basp "kwrite" yazarak bo bir kwrite belgesi aabiliriz.


Python kodlarn yazmaya balamadan nce, bo belgenin ilk satrna

----------------------------------------------------------------------------------------------------------------------Python Dersleri
16/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

#!/usr/bin/env python
yazmamz gerekiyor. Bu satr sayesinde sistemimiz, yazdmz kodlarn hangi program tarafndan
altrlacan anlyor.

Python'da en temel komutlardan biri de "print" komutudur. Bu komut bizim ekrana bir
eyler yazdrmamz salyor. rnein u kod, bir bilgisayar diliyle yazlabilecek en basit
programdr:

print "Merhaba Python!"


Yukardaki kodu, deikenleri kullanarak da yazabiliriz:
#!/usr/bin/env/python
ilk_program = "Merhaba Python!"
print ilk_program

Kullancyla letiim: Veri Al-Verii


Python'da kullancdan birtakm veriler alabilmek, yani kullancyla iletiime geebilmek iin iki
tane fonksiyondan faydalanlr. Bunlardan ncelikle ilkine bakalm:
raw_input() fonksiyonu
Bu fonksiyon yardmyla kullanclarn veri girii yapmasn salayabiliriz. Hemen bununla ilgili bir
rnek verelim. ncelikle bo bir kwrite belgesi aalm. Her zaman yaptmz gibi, ilk satrmz
ekleyelim belgeye:
#!/usr/bin/env python
imdi raw_input fonksiyonuyla kullancdan baz bilgiler alacaz. Mesela kullancya bir ifre
sorup kendisine teekkr edelim...:
#!/usr/bin/env python
raw_input("Ltfen parolanz girin:")
print "Teekkrler!"
Python yazdmz kodlar iindeki Trke karakterler nedeniyle bize bir uyar mesaj gsterecektir.
Bu uyar mesajn grmek istemiyorsak, programmzn iine yle bir kod eklememiz gerekiyor:

----------------------------------------------------------------------------------------------------------------------Python Dersleri
17/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

# -*- coding: utf-8 -*Bylelikle kullandmz karakter tipini Python'a tantm oluyoruz. Programmzn en son hali
yle olacak:
#!/usr/bin/env python
# -*- coding: utf-8 -*raw_input("Ltfen parolanz girin:")
print "Teekkrler!"
imdi bu belgeyi "deneme.py" ismiyle kaydediyoruz. Daha sonra bir konsol ekran ap,
programmzn kaytl olduu dizine geerek u komutla programmz altryoruz:
python deneme.py
Tabii ki siz isterseniz daha nce anlattmz ekilde dosyaya altrma yetkisi vererek ve gerekli
dzenlemeleri yaparak programnz dorudan ismiyle de arabilirsiniz. Bu sizin tercihinize
kalm..
sterseniz imdi yazdmz bu program biraz gelitirelim. Mesela programmz u ilemleri yapsn:

Program ilk altrldnda kullancya parola sorsun

Kullanc parolasn girdikten sonra programmz kullancya teekkr etsin

Bir sonraki satrda kullanc tarafndan girilen bu parola ekrana yazdrlsn

Kullanc

daha

sonraki

satrda,

parolann

yanl

olduu

konusunda

uyarlsn

imdi kodlarmz yazmaya balayabiliriz. ncelikle yazacamz kodlardan bamsz


olarak girmemiz gereken bilgileri ekleyelim:
#!/usr/bin/env python
# -*- coding: utf-8 -*imdi raw_input fonksiyonuyla kullancya parolasn soracaz. Ama isterseniz bu raw_input
fonksiyonunu bir deikene atayalm:
a = raw_input("Ltfen parolanz girin:")
imdi kullancya teekkr ediyoruz:
print "Teekkrler!"
Kullanc tarafndan girilen parolay ekrana yazdrmak iin u satr ekliyoruz:

----------------------------------------------------------------------------------------------------------------------Python Dersleri
18/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

print a
Biraz nce raw_input fonksiyonunu neden bir deikene atadmz anladnz sanrm. Bu sayede
dorudan "a" deikenini ararak kullancnn yazd ifreyi ekrana dkebiliyoruz.
imdi de kullancya parolasnn yanl olduunu bildireceiz:
print "Ne yazk ki doru parola bu deil"
Programmzn son hali yle olacak:
#!/usr/bin/env python
# -*- coding: utf-8 -*a = raw_input("Ltfen parolanz girin:")
print "Teekkrler!"
print a
print "Ne yazk ki doru parola bu deil"
sterseniz son satrda u deiiklii yapabiliriz:
print "Ne yazk ki doru parola", a, "deil"
Bylelikle, "a" deikenini, yani kullancnn yazd parolay cmlemizin iine (ya da Python'ca
ifade etmek gerekirse: "karakter dizisi iine") eklemi olduk...
Bu "a" deikenini karakter dizisi iine eklemenin baka bir yolu da kodu u ekilde yazmaktr:
print "Ne yazk ki doru parola %s deil" %(a)
imdi raw_input fonksiyonuna bir ara verip, kullancdan bilgi almak iin kullanabileceimiz ikinci
fonksiyondan biraz bahsedelim. Az sonra raw_input fonksiyonuna geri dneceiz.
input() fonksiyonu
Tpk raw_input fonksiyonunda olduu gibi, bu komutla da kullanclardan baz bilgileri
alabiliyoruz. u basit rnee bir bakalm:
#!/usr/bin/env python
# -*- coding: utf-8 -*a = input("Ltfen bir say girin:")
b = input("Ltfen baka bir say daha girin:")
print a + b
----------------------------------------------------------------------------------------------------------------------Python Dersleri
19/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Kullanm asndan, grld gibi, raw_input() ve input() fonksiyonlar birbirlerine ok benzer.


Ama bunlarn arasnda ok nemli bir fark vardr. Hemen yukarda verilen kodlar bir de
raw_input() fonksiyonuyla yazmay denersek bu fark ok ak bir ekilde ortaya kacaktr:
#!/usr/bin/env python
# -*- coding: utf-8 -*a = raw_input("Ltfen bir say girin:")
b = raw_input("Ltfen baka bir say daha girin:")
print a + b
Bu kodlar yazarken input() fonksiyonunu kullanrsak, kullanc tarafndan girilen saylar
birbirleriyle toplanacaktr. Diyelim ki ilk girilen say 25, ikinci say ise 40. Programn sonunda elde
edeceimiz say 65 olacaktr.
Ancak bu kodlar yazarken eer raw_input() fonksiyonunu kullanrsak, girilen saylar birbirleriyle
toplanmayacak, sadece yan yana yazlacaklardr... Yani elde edeceimiz say 2540 olacaktr.
Buradan kan sonu udur:
Yukarda anlatlanlar, raw_input() fonksiyonunun, girilen verileri "karakter dizisi" (string) olarak;
input() fonksiyonunun ise "tamsay" (integer) olarak algladn gsteriyor. Yani eer biz
programmz araclyla kullanclardan baz saylar isteyeceksek ve eer biz bu saylar ileme
sokacaksak (karma, toplama, blme gibi...) input fonksiyonunu kullanmamz gerekiyor. Ama eer
biz kullanclardan say deil de "kelime" veya baka bir ifadeyle "karakter dizisi" girmesini
istiyorsak raw_input fonksiyonunu kullanacaz. rnein bir hesap makinesi program yapacaksak
kullanacamz fonksiyon input fonksiyonu olmal. Eer burada raw_input fonksiyonunu
kullanrsak hesap makinemiz istediimiz gibi almayacak, girilen saylar birbirleriyle
toplayamayacaktr. Tpk bunun gibi, eer programmz araclyla kullancnn ismini soyismini
reneceksek, bu ilem iin de raw_input komutunu kullanmamz gerekiyor. Mesela aada
raw_input fonksiyonuyla yazdmz kodlar siz bir de input fonksiyonuyla yazmay deneyin:
#!/usr/bin/env python
# -*- coding: utf-8 -*a = raw_input("Ltfen isminizi yazn:")
b = raw_input("Ltfen soyisminizi yazn:")
print a + " " + b

----------------------------------------------------------------------------------------------------------------------Python Dersleri
20/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Son kodu yazarken kullandmz " " iaretinin amac isim ve soyismi ekrana yazdrrken arada bir
boluk brakmaktr... Aksi halde kullanc isim ve soyismini girdikten sonra bunlar ekranda birbirine
bitiik olarak grnecektir.
Eer bu kodlar input fonksiyonuyla yazmay denediyseniz, Python'un ilk veri giriinden sonra hata
verdiini grmsnzdr. Python'un input fonksiyonuyla bu hatay vermemesi iin tek yol,
kullancnn ismini ve soyismini trnak iinde yazmas olacaktr... Ama tabii ki normal artlarda
kimseden ismini ve soyismini trnak iinde yazmasn bekleyemezsiniz...

Python'da Koula Bal Durumlar


Python'da en nemli konulardan biri de koula bal durumlardr. sterseniz ne demek istediimizi
bir rnekle aklayalm. Diyelim ki Gmail'den aldnz e. posta hesabnza gireceksiniz. Gmail'in
ilk sayfasnda size bir kullanc ad ve ifre sorulur. Siz de kendinize ait kullanc adn ve ifreyi
size verilen kutucuklara yazarsnz. Eer yazdnz kullanc ad ve ifre doruysa hesabnza
eriebilirsiniz. Yok eer kullanc adnz ve ifreniz doru deilse, hesabnza eriemezsiniz. Yani e.
posta hesabnza erimeniz, kullanc ad ve ifreyi doru girme kouluna baldr. Ya da u rnei
dnelim: Diyelim ki Pardus'ta konsol ekranndan gncelleme ilemi yapacaksnz. sudo pisi up
komutunu verdiiniz zaman, gncellemelerin listesi size bildirilecek, bu gncellemeleri yapmay
isteyip istemediiniz size sorulacaktr. Eer "evet" cevab verirseniz gncelleme ilemi
balayacaktr. Yok eer "hayr" cevab verirseniz gncelleme ilemi balamayacaktr. Yani
gncelleme ileminin balamas kullancnn "evet" cevab vermesi kouluna baldr. Biz de imdi
Python'da bu tip koullu durumlarn nasl oluturulacan reneceiz. Bu i iin kullanacamz
tane ifade var: if..., else: ve elif...
Bu konu iinde ayrca Python'da girintilerin nemine ve yazdmz kodlarn iine nasl aklama
yerletirebileceimize de deineceiz.
if...
If... sz ngilizce'de "eer" anlamna geliyor. Dolaysyla, adndan da anlalabilecei gibi, bu ifade
yardmyla Python'da koula bal bir durumu belirtebiliyoruz. Cmle yapsn anlayabilmek iin bir
rnek verelim:
if a = = b

----------------------------------------------------------------------------------------------------------------------Python Dersleri
21/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Bunun anlam udur: "eer a ile b ayn ise..."


Biraz daha aarak sylemek gerekirse: "eer a deikeninin deeri b deikeninin deeriyle ayn
ise..."
Grdnz gibi cmlemiz u anda yarm... Yani belli ki bunun bir de devam olmas gerekiyor...
Mesela cmlemizi yle tamamlayabiliriz:
if a = = b:
print "a ile b birbirine eittir"
Yukarda yazdmz kod u anlama geliyor: "Eer a deikeninin deeri b deikeninin deeriyle
ayn ise, ekrana 'a ile b birbirine eittir,' diye bir cmle yazdr!"
Cmlemiz artk tamamlanm da olsa, tabii ki programmz hl eksik... Bir defa, henz elimizde
tanmlanm birer a ve b deikeni yok... Zaten bu kodlar bu haliyle altrmaya kalkrsanz
Python size, "Sen a diyorsun, b diyorsun ama, a'nn b'nin ne demek olduunu ben bilmiyom abi!"
diye bir hata mesaj verecektir...
Biraz sonra bu yarm yamalak kodu eksiksiz bir hale nasl getireceimizi greceiz. Ama imdi
burada bir parantez aalm ve Python'da girintileme ileminden ve kodlarn iine nasl aklama
ekleneceinden bahsedelim ksaca...
ncelikle girintilemeden bahsedelim, nk bundan sonra girintilerle bol bol muhatap olacaksnz...
Dikkat ettiyseniz yukarda yazdmz yarm kod iinde "print" ile balayan ifade, "if" ile balayan
ifadeye gre daha ieride. Bu durum, "print" ile balayan ifadenin, "if" ile balayan ifadeye ait bir
alt-ifade olduunu gsteriyor... Eer metin dzenleyici olarak kwrite kullanyorsanz, "if a = = b:"
yazp enter'e bastktan sonra kwrite sizin iin bu girintileme ilemini kendiliinden yapacak, imleci
"print 'a ile b birbirine eittir'" komutunu yazmanz gereken yere getirecektir. Ama eer bu
girintileme ilemini elle yapmanz gerekirse izlemeniz gereken genel kural yledir: Klavyedeki
"tab" tuuna bir kez veya "space" tuuna drt kez basn..
Ancak bu kural uygularken "tab" veya "space" tularna basma seeneklerinden yalnzca birini
uygulayn... Yani bir yerde "tab" tuuna baka yerde "space" tuuna basp da Python'un kafasn
kartrmayn...
imdi de Python'da kodlar iine nasl aklama eklenir, biraz da bundan bahsedelim:
Diyelim ki, ierisinde bir ton kod barndran bir program yazdk ve bu programmz bakalarnn da
----------------------------------------------------------------------------------------------------------------------Python Dersleri
22/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

kullanabilmesi iin internet zerinden datacaz. Bizim yazdmz program kullanacak kiiler,
kullanmadan nce kodlar incelemek istiyor olabilirler. te bizim de, kodlarmz incelemek isteyen
kiilere yardmc olmak maksadyla, programmzn iine neyin ne ie yaradn aklayan baz
notlar eklememiz en azndan nezaket gereidir... Bakalarn bir kenara brakalm, bu aklayc
notlar sizin de iinize yarayabilir... Aylar nce yazmaya baladnz bir programa aylar sonra geri
dnmek istediinizde, "Arkada, ben buraya byle bir kod yazmm zamannda ama hangi akla
hizmet byle bir ey yapmm acaba!" demenizi de engelleyebilir bu aklayc notlar...
Peki programmza bu aklayc notlar nasl ekleyeceiz?
Kuralmz u: Python'da kod iine aklayc notlar eklemek iin # iaretini kullanyoruz.
Hemen bir rnek verelim:
print "deneme 1, 2, 3" #Ben bir kk cezveyim, ke bucak gezmeyim!
Sizin daha mantkl aklamalar yazacanz mit ederek konumuza geri dnyoruz...
imdi yukarda verdiimiz yarm program tamamlamaya alalm. Hemen bo bir kwrite belgesi
ap iine unlar yazyoruz:
#!/usr/bin/env python
#-*- coding: utf-8 -*Bunlar zaten ilk etapta yazmamz gereken kodlard. Devam ediyoruz:
#!/usr/bin/env python
#-*- coding: utf-8 -*a = 23
b = 23
Yukarda a ve b adnda iki tane deiken tanmladk.. Bu iki deikenin de deeri 23.
Programmz yazmaya devam ediyoruz:
#!/usr/bin/env python
#-*- coding: utf-8 -*a = 23
b = 23
if a = = b:
print "a ile b birbirine eittir."
----------------------------------------------------------------------------------------------------------------------Python Dersleri
23/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Bu ekilde programmz tamamlam olduk. Bu programn pek nemli bir i yapt sylenemez.
Yapt tek ey, a ile b deikenlerinin deerine bakp, eer bunlar birbirleriyle aynysa ekrana "a ile
b birbirine eittir" diye bir kt vermektir... Ama bu program ahm ahm bir ey olmasa da, en
azndan bize if ifadesinin nasl kullanlaca hakknda nemli bir fikir verdi... Artk bilgilerimizi bu
programn bize salad temel zerine ina etmeye devam edebiliriz.
Her zamanki gibi bo bir kwrite belgesi ayoruz ve iine unlar yazyoruz:
#!/usr/bin/env python
# -*- coding: utf-8 -*parola = "python"
cevap = raw_input("Ltfen parolanz giriniz: ")
if cevap = = parola:
print "Parola onayland! Programa hogeldiniz!"
Grdnz gibi, burada ncelikle "parola" adl bir deiken yarattk. (Bu arada deikenlere ad
verirken Trke karakter kullanmamalsnz.) Bu parola adl deikenin deeri, kullancnn girmesi
gereken ifre oluyor... Ardndan "cevap" adl baka bir deiken daha yaratp raw_input()
fonksiyonunu bu deikene atadk. Daha sonra da if ifadesi yardmyla, "Eer cevap deikeninin
deeri parola deikeninin deeriyle ayn ise ekrana 'Parola onayland! Programa hogeldiniz!'"
yazdr dedik...
Bu program altrdmzda, eer kullancnn girdii ifre "python" ise parola onaylanacaktr.
Yok eer kullanc baka bir kelime yazarsa, program derhal kapanacaktr.
Ayn program u ekilde ksaltarak da yazabiliriz:
#!/usr/bin/env python
# -*- coding: utf-8 -*parola = raw_input("Ltfen parolanz giriniz: ")
if parola = = "python":
print "Parola onayland! Programa hogeldiniz!"
Burada raw_input() fonksiyonunun deerini dorudan "parola" adl deikene atyoruz. Hemen
alttaki satrda ise girilmesi gereken parolann ne olduunu u ekilde ifade ediyoruz:
"Eer parola "python" ise ekrana 'Parola onayland! Programa hogeldiniz!' yazdr"

----------------------------------------------------------------------------------------------------------------------Python Dersleri
24/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

else:
"else:" ifadesi her zaman if ifadesi ile birlikte kullanlr. "else:" ifadesi ksaca, "if ifadesiyle
tanmlanan koullu durumlar dnda kalan btn durumlar gstermek iin kullanlr." Kk bir
rnek verelim:
#!/usr/bin/env python
#-*- coding: utf-8 -*isim = raw_input("Senin ismin ne?")
if isim = = "Ferhat":
print "Yarabbim! Ne gzel bir isim bu!"
else:
print isim, "adn hi sevmem!"
Burada yaptmz ey u: ncelikle kullancya, "Senin ismin ne?" diye soruyoruz (bu soruyu,
"isim" ad verdiimiz bir deikene atadk.) Daha sonra u cmleyi Python'caya evirdik:
"Eer isim deikeninin deeri "Ferhat" ise, ekrana "Yarabbim! Ne gzel bir isim bu!" cmlesini
yazdr. Yok eer isim deikeninin deeri "Ferhat" deil de baka herhangi bir eyse, ekrana "isim"
deikeninin deerini ve "adn hi sevmem!" cmlesini yazdr."
Bu rendiimiz "else:" fonksiyonu sayesinde artk kullanc yanl parola girdiinde uyar mesaj
gnderebileceiz:
#!/usr/bin/env python
# -*- coding: utf-8 -*parola = raw_input("Ltfen parolanz giriniz: ")
if parola = = "python":
print "Parola onayland! Programa hogeldiniz!"
else:
print "Ne yazk ki, yanl parola girdiniz!

elif...
Eer bir durumun gereklemesi birden fazla koula balysa elif... ifadesinden faydalanyoruz.
Mesela:

----------------------------------------------------------------------------------------------------------------------Python Dersleri
25/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

#!/usr/bin/env python
#-*- coding: utf-8 -*meyve = raw_input("Bir meyve ad yaznz: ")
if meyve = = "elma":
print "elma bir meyvedir"
elif meyve = = "armut":
print "armut bir meyvedir"
else:
print meyve, "bir meyve deildir!"
Burada u Trke ifadeyi Python'caya evirdik:
"Kullancya, bir meyve ismi yazmasn syle. Eer kullancnn yazd isim "elma" ise, ekrana
"elma bir meyvedir" kts verilsin. Yok eer kullancnn yazd isim "elma" deil, ama "armut"
ise ekrana "armut bir meyvedir" kts verilsin. Eer kullancnn yazd isim bunlardan hibiri
deilse ekrana "meyve" deikeninin deeri ve "bir meyve deildir" kts yazlsn..."
Eer bir durumun gereklemesi birden fazla koula balysa birden fazla "if" ifadesini art arda da
kullanabiliriz. rnein:
#!/usr/bin/env python
#-*- coding: utf-8 -*sayi = 100
if sayi = = 100:
print "sayi 100'dr"
if sayi < 150:
print "sayi 150'den kktr"
if sayi > 50:
print "sayi 50'den byktr"
if sayi <= 100:
print "sayi 100'den kktr veya 100'e eittir"
Bu program altrldnda btn olas sonular listelenecektir. Yani ktmz yle olacaktr:

----------------------------------------------------------------------------------------------------------------------Python Dersleri
26/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

sayi 100'dr
sayi 150'den kktr
sayi 50'den byktr
sayi 100'den kktr veya 100'e eittir
Eer bu program elif... ifadesini kullanarak yazarsak sonu u olacaktr:
ncelikle kodumuzu grelim:
#!/usr/bin/env python
#-*- coding: utf-8 -*sayi = 100
if sayi = = 100:
print "sayi 100'dr"
elif sayi < 150:
print "sayi 150'den kktr"
elif sayi > 50:
print "sayi 50'den byktr"
elif sayi <= 100:
print "sayi 100'den kktr veya 100'e eittir"
Bu kodlarn kts ise yle olacaktr:
say 100'dr
Grdnz gibi programmz elif... ifadesi kullanarak yazarsak Python belirtilen koulu
karlayan ilk sonucu ekrana yazdracaktr.
Buraya kadar Python'da pek ok ey renmi olduk. If..., elif... else: ifadelerini de rendiimize
gre artk ok basit bir hesap makinesi yapabiliriz!
#!/usr/bin/env python
#-*- coding:utf-8 -*from __future__ import division
secenek1 = "(1) toplama"
secenek2 = "(2) karma"
secenek3 = "(3) arpma"
secenek4 = "(4) blme"
----------------------------------------------------------------------------------------------------------------------Python Dersleri
27/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

print secenek1
print secenek2
print secenek3
print secenek4
soru = raw_input("Ltfen yapmak istediiniz ilemin numarasn girin: ")
if soru = = "1":
sayi1 = input("Ltfen toplama ilemi iin ilk sayy girin: ")
print sayi1
sayi2 = input("Ltfen toplama ilemi iin ikinci sayy girin: ")
print sayi1, "+", sayi2,":", sayi1 + sayi2
if soru = = "2":
sayi3 = input("Ltfen karma ilemi iin ilk sayy girin: ")
print sayi3
sayi4 = input("Ltfen karma ilemi iin ikinci sayy girin: ")
print sayi3, "-", sayi4,":", sayi3 sayi4
if soru = = "3":
sayi5 = input("Ltfen arpma ilemi iin ilk sayy girin: ")
print sayi5
sayi6 = input("Ltfen arpma ilemi iin ikinci sayy girin: ")
print sayi5, "x", sayi6,":", sayi5 * sayi6
if soru = = "4":
sayi7 = input("Ltfen blme ilemi iin ilk sayy girin: ")
print sayi7
sayi8 = input("Ltfen blme ilemi iin ikinci sayy girin: ")
print sayi7, "/", sayi8,":", sayi7 / sayi8

----------------------------------------------------------------------------------------------------------------------Python Dersleri
28/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Python'da Dngler
Bir nceki blmn sonunda hatrlarsanz basit bir hesap makinesi yapmtk. Ancak dikkat
ettiyseniz, o hesap makinesi programnda toplama, karma, arpma veya blme ilemlerinden
birini seip, daha sonra o setiimiz ilemi bitirdiimizde program kapanyor, baka bir ilem
yapmak istediimizde ise program yeniden balatmamz gerekiyordu... Ayn ekilde kullanc ad
ve parola soran bir program yazsak, u anki bilgilerimizle her defasnda program yeniden
balatmak zorunda kalrz. Yani kullanc ad ve ifre yanl girildiinde bu kullanc ad ve ifreyi
tekrar tekrar soramayz; program yeniden balatmamz gerekir... te bu blmde Python'da
yazdmz kodlar srekli hale getirmeyi, tekrar tekrar dndrmeyi reneceiz.
Kodlarmz "srekli dndrmemizi" salamada bize yardmc olacak paracklara Python'da
"dng" (ngilizce: Loop) ad veriliyor... Bu blmde iki tane dngden bahsedeceiz: "while" ve
"for" dngleri. Ayrca bu blmde dngler dnda "break" ve "continue" ifadeleri ile range() ve
len() fonksiyonlarna da deineceiz.
while dngs
While dngs, yukarda verilen tanma tam olarak uyar. Yani yazdmz bir programdaki kodlarn
tamam iletilince programn kapanmasna engel olur ve kod dizisinin en baa dnmesini salar. u
kck rnei bir inceleyelim bakalm:
#!/usr/bin/ env python
#-*- coding: utf-8 -*a=0
a=a+1
print a
Bu minicik kodun yapt i, birinci satrda "a" deikeninin deerine bakp ikinci satrda bu deere
1 eklemek, nc satrda da bu yeni deeri ekrana yazdrmaktr.. Dolaysyla bu kod parasnn
verecei kt da, "1" olacaktr. Bu kty verdikten sonra ise program sona erdirilecektir. imdi bu
koda baz eklemeler yapalm:
#!/usr/bin/env python
#-*- coding: utf-8 -*a=0
while a < 100:
----------------------------------------------------------------------------------------------------------------------Python Dersleri
29/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

a=a+1
print a
Bu kodu altrdmzda, 1'den 100'e kadar olan saylarn ekrana yazdrldn grrz.
Konuyu anlayabilmek iin imdi de satrlar teker teker inceleyelim:
ilk satrda, "0" deerine sahip bir "a" deikeni tanmladk.
ikinci ve nc satrlarda, "a deikeninin deeri 100 saysndan kk olduu mddete a
deikeninin deerine 1 ekle," cmlesini Python'caya evirdik.
son satrda ise, bu yeni a deerini ekrana yazdrdk.
te bu noktada "while dngsnn" faziletlerini gryoruz. Bu dng sayesinde programmz son
satra her geliinde baa dnyor. Yani:
a deikeninin deerini kontrol ediyor
a'nn 0 olduunu gryor
a deerinin 100'den kk olduunu idrak ediyor
a deerine 1 ekliyor (0 + 1 = 1)
Bu deeri ekrana yazdryor (1)
Baa dnp tekrar a deikeninin deerini kontrol ediyor
a'nn u anda 1 olduunu gryor
a deerinin hl 100'den kk olduunu anlyor
a deerine 1 ekliyor (1 + 1 = 2)
Bu deeri ekrana yazdryor (2)
Bu ilemi 99 saysna ulaana dek tekrarlyor ve en sonunda bu sayya da 1 ekleyerek vuslata
eriyor...
Burada ilerleyebilmek iin ihtiyacmz olacak baz ilem yardmclarna veya baka bir ifadeyle
ilelere (operators) deinelim:
imdiye kadar aslnda bu ilelerden birka tanesini grdk. Mesela:
+

ileci, toplama ilemi yapmamz salyor

ileci, karma ilemi yapmamz salyor

ileci, blme ilemi yapmamz salyor

ileci, arpma ilemi yapmamz salyor

>

ileci, "byktr" anlamna geliyor

----------------------------------------------------------------------------------------------------------------------Python Dersleri
30/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

<

ileci, "kktr" anlamna geliyor

Bir de henz grmediklerimiz, ama bilmemiz gerekenler var:


>=

ileci, "byk eittir" anlamna geliyor

<=

ileci, "kk eittir" anlamna geliyor

!=

ileci, "eit deildir" anlamna geliyor (rn. "2 * 2 != 5")

and
or
True

ileci, "ve" anlamna geliyor


ileci, "veya" anlamna geliyor
ileci, "Doru" anlamna geliyor

False ileci, "Yanl" anlamna geliyor


Bu ileleri u anda ezberlemenize gerek yok. Bunlar yalnzca size klavuz olsun diye veriliyor...
Yeri geldike bunlar kullanacamz iin muhakkak aklnza yerleeceklerdir...
imdi konumuza geri dnebiliriz:
Bu konunun banda, bir nceki blmde yazdmz hesap makinesi programna deinmitik.
imdi bu program grelim tekrar:
#!/usr/bin/env python
#-*- coding:utf-8 -*from __future__ import division
secenek1 = "(1) toplama"
secenek2 = "(2) karma"
secenek3 = "(3) arpma"
secenek4 = "(4) blme"
print secenek1
print secenek2
print secenek3
print secenek4
soru = raw_input("Ltfen yapmak istediiniz ilemin numarasn girin: ")
----------------------------------------------------------------------------------------------------------------------Python Dersleri
31/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

if soru = = "1":
sayi1 = input("Ltfen toplama ilemi iin ilk sayy girin: ")
print sayi1
sayi2 = input("Ltfen toplama ilemi iin ikinci sayy girin: ")
print sayi1, "+", sayi2,":", sayi1 + sayi2
if soru = = "2":
sayi3 = input("Ltfen karma ilemi iin ilk sayy girin: ")
print sayi3
sayi4 = input("Ltfen karma ilemi iin ikinci sayy girin: ")
print sayi3, "-", sayi4,":", sayi3 sayi4
if soru = = "3":
sayi5 = input("Ltfen arpma ilemi iin ilk sayy girin: ")
print sayi5
sayi6 = input("Ltfen arpma ilemi iin ikinci sayy girin: ")
print sayi5, "x", sayi6,":", sayi5 * sayi6
if soru = = "4":
sayi7 = input("Ltfen blme ilemi iin ilk sayy girin: ")
print sayi7
sayi8 = input("Ltfen blme ilemi iin ikinci sayy girin: ")
print sayi7, "/", sayi8,":", sayi7 / sayi8
Dediimiz gibi, program bu haliyle her defasnda yalnzca bir kez ilem yapmaya izin verecektir.
Yani mesela toplama ilemi bittikten sonra program sona erecektir. Ama eer biz bu programda u
ufack deiiklii yaparsak iler deiir:
#!/usr/bin/env python
#-*- coding:utf-8 -*from __future__ import division
while True:

----------------------------------------------------------------------------------------------------------------------Python Dersleri
32/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

secenek1 = "(1) toplama"


secenek2 = "(2) karma"
secenek3 = "(3) arpma"
secenek4 = "(4) blme"
print secenek1
print secenek2
print secenek3
print secenek4
soru = raw_input("Ltfen yapmak istediiniz ilemin numarasn girin: ")
if soru = = "1":
sayi1 = input("Ltfen toplama ilemi iin ilk sayy girin: ")
print sayi1
sayi2 = input("Ltfen toplama ilemi iin ikinci sayy girin: ")
print sayi1, "+", sayi2,":", sayi1 + sayi2
if soru = = "2":
sayi3 = input("Ltfen karma ilemi iin ilk sayy girin: ")
print sayi3
sayi4 = input("Ltfen karma ilemi iin ikinci sayy girin: ")
print sayi3, "-", sayi4,":", sayi3 - sayi4
if soru = = "3":
sayi5 = input("Ltfen arpma ilemi iin ilk sayy girin: ")
print sayi5
sayi6 = input("Ltfen arpma ilemi iin ikinci sayy girin: ")
print sayi5, "x", sayi6,":", sayi5 * sayi6
if soru = = "4":
sayi7 = input("Ltfen blme ilemi iin ilk sayy girin: ")
print sayi7

----------------------------------------------------------------------------------------------------------------------Python Dersleri
33/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

sayi8 = input("Ltfen blme ilemi iin ikinci sayy girin: ")


print sayi7, "/", sayi8,":", sayi7 / sayi8
Burada u deiiklikleri yaptk:
lk nce from __future__ import division satr ile secenek1 = "(1) toplama" satr arasna
while True:
ifadesini ekledik... Bu sayede programmza u komutu vermi olduk:
"Doru olduu mddete aadaki komutlar altrmaya devam et..."
Zira yukarda verdiimiz "ile" tablosundan da hatrlayacanz gibi "True" ifadesi "doru"
anlamna geliyor...
Peki ne doru olduu mddete? Neyin doru olduunu aka belirtmediimiz iin Python burada
"her eyi doru" kabul ediyor... Yani bir nevi, "aksi belirtilmedii srece aadaki komutlar
altrmaya devam et!" emrini yerine getiriyor.
kinci deiiklik ise "while True:" ifadesinin altnda kalan btn satrlar bir seviye saa kaydrmak
oldu... Eer kwrite kullanyorsanz, kaydracanz blm setikten sonra CTRL + i tularna
basarak bu kaydrma ilemini kolayca yapabilirsiniz. Bir seviye sola kaydrmak iin ise CTRL +
SHIFT + i tularn kullanyoruz.
u rnee bir bakalm:
#!/usr/bin/env python
#-*- coding: utf-8 -*soru = raw_input("Arkadam sen deli misin?")
while soru != "hayr":
print "delisin sen deli! Kulaklar kpeli!"
Dikkat ederseniz burada da ilelerimizden birini kullandk. Kullandmz ile "eit deildir"
anlamna gelen "!=" ileci...
Bu program altrdmzda sorulan soruya "hayr" cevab vermezsek, program biz mdahale
edene kadar ekrana "delisin sen deli! Kulaklar kpeli" ktsn vermeye devam edecektir... nk
biz Python'a u komutu vermi olduk bu kodla:
"Soru deikeninin cevab "hayr" olmad mddete ekrana "delisin sen deli! Kulaklar kpeli"
ktsn vermeye devam et."
----------------------------------------------------------------------------------------------------------------------Python Dersleri
34/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Eer bu program durdurmak istiyorsak CTRL+C'ye basmamz gerekir...


Ayn kodlar bir de u ekilde denerseniz "if" ile "while" arasndaki fark bariz bir biimde ortaya
kacaktr:
#!/usr/bin/env python
#-*- coding: utf-8 -*soru = raw_input("Arkadam sen deli misin?")
if soru != "hayr":
print "delisin sen deli! Kulaklar kpeli!"
imdilik while dngsne ara verip bu konuda incelememiz gereken ikinci dngmze geiyoruz.
for dngs
Bir nceki konuda while dnglerini anlatrken yazdmz u kodu hatrlyorsunuz:
#!/usr/bin/env python
#-*- coding: utf-8 -*a=0
while a < 100:
a=a+1
print a
Bu kod yardmyla ekrana 1'den 100'e kadar olan saylar yazdrabiliyorduk. Ayn ilemi daha basit
bir ekilde for dngs yardmyla da yapabiliriz:
#!/usr/bin/env python
#-*- coding: utf-8 -*for zombi in range(1, 100):
print zombi
Ben burada deiken ad olarak zombi kelimesini kullandm, siz isterseniz Osman da
diyebilirsiniz...
Yukardaki Pythonca kod Trke'de aa yukar u anlama gelir:
"1, 100 aralndaki saylara zombi adn verdikten sonra ekrana zombi'nin deerini yazdr."
for dngsyle ilgili u rnee de bir bakalm:

----------------------------------------------------------------------------------------------------------------------Python Dersleri
35/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

#!/usr/bin/env python
#-*- coding: utf-8 -*for kelimeler in "linux":
print kelimeler
Grdnz gibi, for dngsyle yalnzca saylar deil, karakter dizilerinin elerini de
dkebiliyoruz ekrana.
Bylelikle Python'da while ve for dnglerini de renmi olduk. Bu arada dikkat ettiyseniz, for
dngs iin verdiimiz ilk rnekte dng iinde yeni bir fonksiyon kullandk. sterseniz bu
vesileyle biraz da hem dnglerde hem koullu ifadelerde hem de baka yerlerde karmza
kabilecek faydal fonksiyonlara ve ifadelere deinelim:

range() fonksiyonu
Bu fonksiyon Python'da say aralklarn belirtmemizi salar. Zaten ngilizce'de de bu kelime
"aralk" anlamna gelir. Mesela:
print range(100)
komutu 0 ile 100 arasndaki saylar yazdrmamz salar. Baka bir rnek daha verelim:
print range(100,200)
komutu 100 ile 200 arasndaki saylar dker.
Bir rnek daha:
print range(1,100,2)
Bu komut ise 1 ile 100 arasndaki saylar 2'er 2'er atlayarak yazdrmamz salar...
Hemen for dngsyle range fonksiyonunun birlikte kullanld bir rnek verip baka bir
fonksiyonu anlatmaya balayalm:
#!/usr/bin/env python
#-*- coding: utf-8 -*for sarki in range (1, 15):
print sarki, "mumdur"

----------------------------------------------------------------------------------------------------------------------Python Dersleri
36/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

len() fonksiyonu
Bu fonksiyon, karakter dizilerinin uzunluunu gsterir. Mesela:
#!/usr/bin/env python
#-*- coding: utf-8 -*a = "Afyonkarahisar"
print len(a)
Bu kod, "Afyonkarahisar" karakter dizisi iindeki harflerin saysn ekrana dkecektir.
Bu fonksiyonu nerelerde kullanabiliriz? Mesela yazdnz bir programa kullanclarn giri
yapabilmesi iin ifre belirlemelerini istiyorsunuz. Seilecek ifrelerin uzunluunu snrlamak
istiyorsanz bu fonksiyondan yararlanabilirsiniz. Hemen rnek bir kod yazalm:
#!/usr/bin/env python
#-*- coding: utf-8 -*a=raw_input("Ltfen bir ifre belirleyin: ")
if len(a) >= 6:
print "Setiiniz ifre en fazla 5 karakterden oluabilir!"
else:
print "ifreniz etkinletirilmitir."

break ifadesi
break ifadesi program iinde bir noktada program sona erdirmek gerektii zaman kullanlr.
Aadaki rnek break ifadesinin ne ie yaradn aka gsteriyor:
#!/usr/bin/env python
#-*- coding:utf-8 -*kullanici_adi = "kullanici"
parola = "sifre"
while True:
soru1 = raw_input("Kullanc ad: ")
soru2 = raw_input("ifre: ")
if soru1 = = kullanici_adi and soru2 = = parola:
print "Kullanc ad ve ifreniz onayland. Programa hogeldiniz!"

----------------------------------------------------------------------------------------------------------------------Python Dersleri
37/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

break
else:
print "Kullanc adnz veya ifrenizden en az birisi onaylanmad. Ltfen tekrar deneyiniz!"
Bu programda break ifadesi yardmyla, kullanc ad ve ifre doru girildiinde ifre sorma
ileminin durdurulmas salanyor. Yukardaki kodlar arasnda, dikkat ederseniz, daha nce
bahsettiimiz ilelerden birini daha kullandk. Kullandmz bu ile, "ve" anlamna gelen "and"
ileci. Bu ilecin getii satra tekrar bakalm:
if soru1 = = kullanici_adi and soru2 = = parola:
print "Kullanc ad ve ifreniz onayland. Programa hogeldiniz!"
Burada u Trke ifadeyi Python'caya evirmi olduk:
"Eer soru1 deikeninin deeri kullanici_ad deikeniyle ayn ve soru2 deikeninin deeri parola
deikeniyle ayn ise ekrana 'Kullanc ad ve ifreniz onayland. Programa hogeldiniz,' cmlesini
yazdr..."
Burada dikkat edilmesi gereken nokta u: and ilecinin birbirine balad soru1 ve soru2
deikenlerinin ancak ikisi birden doruysa o bahsedilen cmle ekrana yazdrlacaktr. Yani
kullanc ad ve parola'dan biri yanlsa "if" ifadesinin gerektirdii koul yerine gelmemi
olacaktr... Okulda mantk dersi alm olanlar bu "and" ilecini yakndan tanyor olmallar... "And"
ilecinin kart "or" ilecidir. Bu ile Trke'de "veya" anlamna gelir. Buna gre, "a veya b doru
ise" dediiniz zaman, bu a veya b ifadelerinden birinin doru olmas yetecektir. ayet "a ve b doru
ise" derseniz, burada hem a'nn hem de b'nin doru olmas gerekir...

continue ifadesi
Bu ifade ise dng iinde bir bloun es geilip ondan sonraki bloun altrlmasn salar. ok
bilindik bir rnek verelim:
#!/usr/bin/env python
#-*- coding:utf-8 -*while True:
s = raw_input("Bir say girin: ")
if s = = "iptal":
break
if len(s) <= 3:
----------------------------------------------------------------------------------------------------------------------Python Dersleri
38/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

continue
print "En fazla haneli bir say girebilirsiniz."
Burada eer kullanc klavyede "iptal" yazarsa programdan klacaktr. Bunu,
if s = = "iptal":
break
satryla salamay baardk.
Eer 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 en baa dnlecektir.
Eer kullancnn girdii saydaki hane ten fazlaysa ekrana:
print "En fazla haneli bir say girebilirsiniz."
cmlesi yazdrlacaktr.

Python'da Listeler, Demetler, Szlkler


Bu blmde Python'da nasl liste (list), demet (tuple) ve szlk (dictionary) hazrlanacan
reneceiz. Burada gstereceimiz kk kod paralarn metin dosyas yerine dorudan Python
komut satrnda deneyebilirsiniz. Bylesi hem daha hzl, hem daha kolay, hem de daha etkili
olacaktr.
lk konumuz listeler:
Listeler
Python'da herhangi bir liste oluturmak iin nce listemize bir ad vermemiz, ardndan da keli
parantez kullanarak bu listenin elerini belirlememiz gerekiyor. Yani liste olutururken dikkat
etmemiz gereken iki temel nokta var. Birincisi tpk deikenlere isim veriyormuuz gibi
listelerimize de isim vermemiz gerekiyor... Tabii listelerimizi isimlendirirken Trke karakterler
kullanmayacaz... kincisi, listemizi oluturan eleri keli parantezler iinde yazacaz.
Yukarda da belirttiimiz gibi, hzllk asndan burada reneceimiz kodlar Python komut
satrna yazp deneyeceiz. Python komut satrn, hatrlarsanz, yle ayorduk: ALT+F2 tularna
----------------------------------------------------------------------------------------------------------------------Python Dersleri
39/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

basp kan pencerede "konsole" yazyoruz ve konsol ekrannda "python" komutu vererek Python
komut satrn balatyoruz. imdi hemen ilk listemizi tanmlayalm :
liste = ["Hale", "Jale", "Lale", 12, 23]
Daha nce de sylediimiz gibi, burada dikkat etmemiz gereken nokta, liste elerini tanmlarken
keli parantezler kullanyor olmamz... Ayrca liste iindeki karakter dizilerini (strings) her
zamanki gibi trnak iinde belirtmeyi unutmuyoruz... Tabii ki saylar (integers) yazarken bu trnak
iaretlerini kullanmayacaz. Eer saylarda trnak iareti kullanrsanz Python'un bu eleri nasl
alglayacan biliyorsunuz... Bakalm bunlar Python nasl alglyormu?
Python komut satrnda u ifadeyi yazn:
type("Hale")
Bu komutun kts:
<type 'str'>
olacaktr. Yani "Hale" ifadesinin tipi "str" imi. "Str", ngilizce'deki "string" kelimesinin ksaltmas.
Trke anlam ise "karakter dizisi".
imdi ayn komutu u ekilde deniyoruz:
type(123)
Bu komut bize u kty verecektir:
<type 'int'>
Demek ki 123 ifadesinin tipi "int" imi. Bu "int" de ngilizce'deki "integer" kelimesinin ksaltmas
oluyor... Trke anlam, "tamsay".
imdi bu 123 ifadesini trnak iinde yazalm:
type("123")
Sonu:
<type 'str'>
Grdnz gibi yazdnz ey say da olsa, siz bunu trnak iinde belirtirseniz, Python gznzn
yana bakmyor...
Neyse biz konumuza dnelim...
----------------------------------------------------------------------------------------------------------------------Python Dersleri
40/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Olmas gerektii ekilde listemizi tanmladk:


liste = ["Hale", "Jale", "Lale", 12, 23]
imdi komut satrnda
liste
yazdmzda tanmladmz "liste" adl listenin eleri ekrana yazdrlacaktr.
Tanmladmz bu listenin e saysn len() fonksiyonu yardmyla renebiliriz:
len(liste)
5
imdi listeleri ynetmeyi; yani listeye e ekleme, listeden e karma gibi ilemleri yapmay
reneceiz. Bu ii Python'da baz paracklar yardmyla yapyoruz. sterseniz gelin imdi bu
paracklarn neler olduuna ve nasl kullanldklarna bakalm.
append parac
lk paracmz "append". Bu kelime Trke'de "eklemek, ilitirmek" anlamna geliyor...
Oluturduumuz listeye yeni bir e eklemek iin "append" paracndan faydalanyoruz:
liste.append("Mehmet")
Dikkat edin, liste tanmlarken keli parantez kullanyorduk... Listeleri ynetirken ise (yani
paracklar kullanarak ekleme, karma, vb. yaparken) normal parantezleri kullanyoruz. Ayrca
grdnz gibi, bu "append" paracn, liste isminin yanna koyduumuz bir noktadan sonra
yazyoruz.
"append" parac yardmyla, eyi oluturduumuz bir listenin en sonuna ekleyebiliyoruz. Peki
bu parack yardmyla birden fazla e ekleyebilir miyiz? Ne yazk ki, append parac bize
listeye yalnzca tek bir e ekleme olana sunar...
Eer biz ekleyeceimiz bir eyi en sona deil de listenin belirli bir noktasna yerletirmek
istiyorsak, baka bir paracktan faydalanyoruz. Ama bu parac kullanmaya balamadan nce
Python'un liste elerini sralama ynteminden bahsetmemiz gerekir. Python'un "sralama yntemi"
ile ilgili olarak bilinmesi gereken en nemli kural udur:
"Python, liste iindeki eleri sralarken, listenin ilk esini 0'dan balatr."

----------------------------------------------------------------------------------------------------------------------Python Dersleri
41/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Yani:
liste = ["Hale", "Jale", "Lale", 12, 23, "Mehmet"]
biiminde grdmz listenin ilk esine "0'nc e" denir. Bu listedeki birinci e ise "Jale"dir.
Bunu u ekilde teyit edelim:
liste[0]
Bu komutu yazdmzda Python bize 0'nc enin "Hale" olduunu syleyecektir. Ayn ekilde;
liste[2]
komutu ise bize 2. enin "Lale" olduunu syleyecektir. Ancak burada una dikkat etmemiz lazm:
Python liste elerini numaralarken 0'dan balasa da liste elerini sayarken 1'den balar... Yani;
len(liste)
komutunu verdiimizde elde edeceimiz say 6 olacaktr. nk listemizde 6 adet e bulunuyor.
Python'un e sralama mantn rendiimize gre, imdi listenin en sonuna deil de kendi
belirleyeceimiz baka bir noktasna e eklememizi salayacak parac grebiliriz:
insert parac
te bu "insert" parac yardmyla listenin herhangi bir noktasna e ekleyebiliyoruz. Bu kelime
Trke'de "yerletirmek, sokmak" anlamna geliyor... insert parac yardmyla listenin 1. srasna
(Dikkat edin, 0'nc sraya demiyoruz) "Ahmet"i yerletirebiliriz:
liste.insert(1, "Ahmet")
Burada parantez iindeki ilk say, "Ahmet" esinin liste iinde yerletirilecei sray gsteriyor. Bu
komutun kts yle olur:
["Hale", "Ahmet", "Jale", "Lale", 12, 23, "Mehmet"]
Grdnz gibi, "1" says Python iin "ilk" anlamna gelmiyor. Eer listemizin en bana bir e
eklemek istiyorsak u komutu kullanacaz:
liste.insert(0, "Veli")
Bu parack da tpk append paracnda olduu gibi listeye yalnzca bir adet e eklememize izin
verir...

----------------------------------------------------------------------------------------------------------------------Python Dersleri
42/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

extend parac
Bu kelime "geniletmek, uzatmak" anlamna geliyor. extend parac, oluturduumuz listeleri
"geniletmemizi" veya "uzatmamz" salar. Bu paracn ilevini anlatabilmenin en iyi yolu tabii
ki rnekler zerinde almak. imdi yeni bir liste oluturalm:
yeni_liste = ["Simovic", "Prekazi", "Jardel", "Nouma"]
imdi de u komutu verip ne elde ettiimize bir bakalm:
liste.extend(yeni_liste)
Bu komutun kts yle olacaktr:
['Veli', 'Hale', 'Ahmet', 'Jale', 'Lale', 12, 23, 'Mehmet', 'Simovic', 'Prekazi', 'Jardel', 'Nouma']
Grdnz gibi, extend parac iki listenin elerini tek bir liste iinde birletirmeye yaryor. Ya
da baka bir ifadeyle, bir listeyi geniletiyor, uzatyor...
extend paracyla yaptmz ilemin aynsn "+" ilecini kullanarak u ekilde de yapabiliriz:
liste + yeni_liste
remove parac
Liste oluturmay, append ve insert paracklar yardmyla listeye eler eklemeyi rendik... Peki
ya listemizden baz eleri nasl karacaz? Python'da bu ii yapmamz salayan iki tane parack
var. Biz nce bunlardan ilki olan remove paracna bakacaz. Bu kelime "karmak, kaldrmak,
silmek" anlamna geliyor.
Diyelim ki listemizden "Nouma" esini karmak/kaldrmak istiyoruz. O zaman u komutu
vermemiz gerekir:
liste.remove("Nouma")
Eer listede "Nouma" adl birden fazla e varsa, Python listede bulduu ilk "Nouma"y
karacaktr...
pop parac
ngilizce'de "pop" kelimesi, "frlamak, prtlamak, aniden almak" gibi anlamlar tayor. Biz bu
kelimeyi internette bir adrese tkladmzda prt diye nmze kan "pop up"lardan yani "alr
----------------------------------------------------------------------------------------------------------------------Python Dersleri
43/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

pencereler"den hatrlyoruz... Python'da listeler ile birlikte kullandmz "pop" parac ise
listeden bir e silerken, bu sildiimiz enin prt diye ekrana yazdrlmasn salyor...
u komutu deneyelim:
liste.pop()
Grdnz gibi, Python bu pop parac yardmyla listenin son esini karacak, stelik
kard eyi ekrana yazdracaktr. Eer bu komutu yle verirsek ne olur?
liste.pop(0)
Bu komut ise listedeki "ilk" yani "0'nc" eyi karr ve kard eyi ekrana yazdrr.
Anladnz gibi pop parac ile remove parac arasndaki en temel fark pop paracnn
silinen eyi ekrana yazdrmas, remove paracnn ise yazdrmamasdr... Ayrca pop
paracnda isim belirterek listeden silme ilemi yapamazsnz. Mutlaka silinecek enin liste
iindeki srasn vermelisiniz. remove paracnda da bu durumun tam tersi sz konusudur. Yani
remove paracnda da sra belirtemezsiniz; isim vermeniz gerekir...
imdiye kadar bir listenin en sonuna nasl e ekleyeceimizi (append parac), listenin
herhangi bir yerine nasl e ekleyeceimizi (insert parac), listeden isim vererek nasl e
karacamz (remove parac), listeden say vererek nasl e karacamz (pop parac)
rendik.
Buraya kadar rendiimiz paracklar listenin boyutunda deiiklikler yapmamz salyordu.
imdi reneceimiz paracklar ise listelerin boyutlarnda herhangi bir deiiklik yapmyor,
yalnzca elerin yerlerini deitiriyor veya bize liste hakknda ufak tefek baz bilgiler veriyorlar.
index parac
Diyelim ki listedeki "Jardel" esinin listenin kanc srasnda olduunu merak ediyorsunuz. te
bu index parac sizin aradnz ey! Bu parac yle kullanyoruz:
liste.index("Jardel")
Bu komut, "Jardel" esinin liste iinde kanc srada olduunu gsterecektir bize...
sort parac
Bazen listemizdeki eleri alfabe srasna dizmek isteriz. (isteriz, deil mi?) te yreimizde byle

----------------------------------------------------------------------------------------------------------------------Python Dersleri
44/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

bir istek hasl olduunda kullanacamz paracn ad "sort":


liste.sort()
reverse parac
Bu parack listedeki elerin srasn ters yz eder. yle ki:
liste.reverse()
Bu komutu st ste iki kez verirseniz listeniz ilk haline dnecektir. Yani bu komut aslnda sort
paracnn yapt gibi alfabe srasn kaale almaz... Listenizdeki elerin srasn ters evirmekle
yetinir.
count parac
Listelerle birlikte kullanabileceimiz baka bir parack da budur. Grevi ise liste iinde bir enin
ka kez getiini sylemektir:
liste.count("Prekazi")
Buraya kadar listeleri nasl yneteceimizi; yani:
Nasl liste oluturacamz - - liste = []
bu listeye nasl yeni eler ekleyeceimizi - - liste.append(), liste.insert()
listemizi nasl genileteceimizi - - liste.extend()
eklediimiz eleri nasl karacamz - - liste.remove(), liste.pop()
liste iindeki elerin srasn bulmay - - liste.index()
eleri abc srasna dizmeyi - - liste.sort()
elerin srasn ters evirmeyi - - liste.reverse()
listedeki elerin liste iinde ka kez getiini bulmay - - liste.count()
rendik...
Bunlarn yansra Python'un liste elerini kendi iinde sralama mantn da rendik... Buna gre
unutmamamz gereken ey; Python'un liste elerini saymaya 0'dan balad... sterseniz bu mantk
zerine baz almalar yapalm. rnein unlara bir bakalm:
liste[0]
Bu komut listenin "ilk" yani "0'nc" esini ekrana yazdracaktr. Dikkat edin, yine keli parantez
----------------------------------------------------------------------------------------------------------------------Python Dersleri
45/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

kullandk.
Peki listedeki son eyi armak istersek ne yapacaz? Eer listemizde ka tane e olduunu
bilmiyorsak ve len() komutuyla bunu renmeyecek kadar tembelsek u komutu kullanacaz:
liste[-1]
Tabii ki siz len(liste) komutu verip nce listenin uzunluunu da renebilirsiniz. Buna gre, Python
saymaya 0'dan balad iin, kan saynn bir d listenin son esinin srasn verecektir. Yani
eer len(liste) komutunun kts 5 ise, listedeki son eyi:
liste[4]
komutuyla da arabilirsiniz...
Olur ya, eer kulanz tersten gstermek isterseniz len(liste) komutuyla bulduunuz sayy eksiye
dntrp listenin ilk esini arabilirsiniz. Yani, eer len(liste) komutunun kts 5 ise:
liste[-5]
komutu size ilk eyi verecektir, tpk liste[0] komutunun yapt gibi...
Python bize bu mantk zerinden baka olanaklar da tanyor. Mesela tanmladmz bir listedeki
elerin tamamn deil de yalnzca 2. ve 3. eleri grmek istersek u komuttan faydalanyoruz
(Saymaya 0'dan balyoruz):
liste[2:4]
Grdnz gibi, yukardaki komutta birinci say dahil ikinci say hari olacak ekilde bu ikisi
arasndaki eler listelenecektir... Yani "liste[2:4]" komutu listedeki 2. ve 3. eleri yazdracaktr.
Eer ":" iaretinden nce veya sonra herhangi bir say belirlemezseniz Python varsaylan olarak
oraya ilk veya son eyi koyacaktr:
liste[:3]
komutu u komutla ayndr:
liste[0:3]
Ayn ekilde;
liste[0:]
komutu da u komutla ayndr (Listenin 5 eli olduunu varsayarsak):
----------------------------------------------------------------------------------------------------------------------Python Dersleri
46/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

liste[0:5]
Bu yntemlerle listeye yeni e yerletirmek, listeden e silmek, vb. de mmkndr. Yani
yukarda "paracklar" yardmyla yaptmz ilemleri baka bir ekilde de yapabilmi oluyoruz...
nce temiz bir liste oluturalm:
liste = ["elma", "armut", "kiraz", "karpuz", "kavun"]
Bu listenin en sonuna bir veya birden fazla e eklemek iin (append paracna benzer...):
liste[5:5] = ["domates", "salata"]
['elma', 'armut', 'kiraz', 'karpuz', 'kavun', 'domates', 'salata']
Hatrlarsanz, append paracyla listeye yalnzca bir adet e ekleyebiliyorduk.. Yukardaki
yntem yardmyla birden fazla e de ekleyebiliyoruz listeye.
Bu listenin 3. srasna bir veya birden fazla e yerletirmek iin (insert paracna benzer...):
liste[3:3] = ["kebap", "lahmacun"]
['elma', 'armut', 'kiraz', 'kebap', 'lahmacun', 'karpuz', 'kavun', 'domates', 'salata']
Bu listenin 2. srasndaki eyi silmek iin (remove paracna benzer...):
liste[2:3] = []
['elma', 'armut', 'kebap', 'lahmacun', 'karpuz', 'kavun', 'domates', 'salata']
Bu listenin 2. srasndaki eyi silip yerine bir veya birden fazla e eklemek iin:
liste[2:3] = ["nane", "limon"]
['elma', 'armut', 'nane', 'limon', 'kebap', 'lahmacun', 'karpuz', 'kavun', 'domates', 'salata']
Bu listenin 2. srasndaki eyi silip yerine bir veya birden fazla eye sahip bir liste yerletirmek
iin:
liste[2] = ["ruj", "maskara", "rimel"]
['elma', 'armut', ['ruj', 'maskara', 'rimel'], 'nane', 'limon', 'kebap', 'lahmacun', 'karpuz',
'kavun', 'domates', 'salata']
Hangi ilemi yapmak iin nasl bir say dizilimi kullandmza dikkat edin... Bu komutlar
balangta biraz kark gelebilir... Ama eer yeterince rnek yaparsanz bu komutlar
kartrmadan uygulamay renebilirsiniz.
Artk listeler konusunu burada noktalayp "demetler" (tuples) konusuna geebiliriz...
----------------------------------------------------------------------------------------------------------------------Python Dersleri
47/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Demetler
Demetler (tuples) listelere benzer. Ama listeler ile aralarnda ok temel bir fark vardr. Listeler
zerinde oynamalar yapabiliriz. Yani e ekleyebilir, e karabiliriz. Demetlerde ise byle bir ey
yoktur...
Demeti u ekilde tanmlyoruz:
demet = "Ali", "Veli", 49, 50
Grdnz gibi, yaptmz bu i deiken tanmlamaya ok benziyor. stersek demetin elerini
parantez iinde de gsterebiliriz.
demet2 = ("Ali", "Veli", 49, 50)
Parantezli de olsa parantezsiz de olsa yukarda tanmladklarmzn ikisi de "demet" snfna giriyor.
sterseniz bu durumu teyit edelim:
type(demet)
<type 'tuple'>
type(demet2)
<type 'tuple'>
Peki bo bir demet nasl oluturulur? ok basit:
demet = ()
Peki tek eli bir demet nasl oluturulur? O kadar basit deil. Aslnda basit ama biraz tuhaf:
hede = ("inek",)
Grdnz gibi, tek eli bir demet oluturabilmek iin enin yanna bir virgl koyuyoruz!
Hemen teyit edelim:
type(hede)
<type 'tuple'>
O virgl koymazsak ne olur?
hede2 = ("inek")
hede2'nin tipini kontrol edelim:
type(hede2)
----------------------------------------------------------------------------------------------------------------------Python Dersleri
48/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

<type 'str'>
Demek ki, virgl koymazsak demet deil, alelade bir karakter dizisi oluturmu oluyoruz...
Yukarda anlattmz ekilde bir demet oluturma iine "demetleme" (tuple packing) ad veriliyor.
Bunun tersini de yapabiliriz. Buna da "demet ama" deniyor (sequence unpacking):
nce demetleyelim:
aile = "Anne", "Baba", "Kardesler"
imdi demeti aalm:
a, b, c = aile
Bu ekilde komut satrna "a" yazarsak, "Anne" esi; "b" yazarsak "Baba" esi; c yazarsak
"Kardesler" esi ekrana yazdrlacaktr. "Demet ama" ileminde dikkat etmemiz gereken nokta,
eittir iaretinin sol tarafnda demetteki e says kadar deiken ad belirlememiz gerektiidir...
Peki bu demetler ne ie yarar? Bir defa, demetler listelerin aksine deiiklik yapmaya msait
olmadklarndan listelere gre daha gvenlidirler. Yani yanllkla deitirmek istemediiniz veriler
ieren bir liste hazrlamak istiyorsanz demetleri kullanabilirsiniz...
Szlkler
Szln ne demek olduunu tanmlamadan nce gelin isterseniz ie bir rnekle balayalm:
sozluk = {"elma": "meyve", "domates": "sebze", 1: "sayi"}
Burada rnein, "elma" bir "anahtar", "meyve" ise bu anahtarn "deeri"dir. Ayn ekilde "sebze"
deerinin anahtar "domates"tir.
Dolaysyla Python'da szlk; "anahtar" ve "deer" arasndaki ilikiyi gsteren bir veri tipidir!
Mesela bir adres veya telefon defteri yaratmak istediimizde bu szlklerden faydalanabiliriz. Yani
"szlk" denince aklmza sadece bildiimiz szlkler gelmemeli... u rnee bir bakalm:
telefon_defteri = {"Ahmet": "0533 123 45 67",
"Kezban": "0532 321 54 76", "Feristah": "0533 333 33 33"}
Szlk tanmlarken dikkat etmemiz gereken birka nokta var. Bunlardan birincisi eleri belirlerken
kme parantezlerini kullanyor olmamz. kincisi karakter dizilerinin yansra saylar da trnak
iinde gsteriyor olmamz... sterseniz saylar trnaksz kullanrsanz ne olacan deneyerek

----------------------------------------------------------------------------------------------------------------------Python Dersleri
49/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

grebilirsiniz... Ancak eer gireceiniz say ok uzun deil ve 0 ile balamyorsa bu sayy trnaksz
da yazabilirsiniz... ncs iki nokta st ste ve virgllerin nerede, nasl kullanldna da dikkat
etmeliyiz.
imdi gelelim szlklerle neler yapabileceimize... u komuta bir bakalm:
telefon_defteri["Ahmet"]
veya
telefon_defteri["Kezban"]
Bu komutlar "Ahmet" ve "Kezban" adl "anahtar"larn karsnda hangi "veri" varsa onu ekrana
yazdracaktr... Dikkat edin, szlkten e arrken kme parantezlerini deil, keli parantezleri
kullanyoruz. Bu arada aklnzda bulunsun, szlk iindeki eleri "anahtar"a gre aryoruz,
"veri"ye gre deil. Yani iki nokta st ste iaretinin solundaki ifadeleri kullanyoruz eleri
arrken, sandakileri deil...
imdi gelelim bu szlkleri nasl yneteceimize... Diyelim ki szlmze yeni bir e eklemek
istiyoruz:
telefon_defteri["Zekiye"] = "0544 444 01 00"
Peki szlmzdeki bir enin deerini deitirmek istersek ne yapacaz?
telefon_defteri["Kezban"] = "0555 555 55 55"
Buradan anladmz u: Bir szle yeni bir e eklerken de, varolan bir eyi deitirirken de
ayn komutu kullanyoruz... Demek ki bir eyi deitirirken aslnda eyi deitirmiyor, silip
yerine yenisini koyuyoruz...
Eer bir eyi listeden silmek istersek u komutu kullanyoruz:
del telefon_defteri["Kezban"]
Eer biz szlkteki btn eleri silmek istersek u komut kullanlyor:
telefon_defteri.clear()
if-elif-else Yerine Szlk Kullanmak
imdi isterseniz, Python szlklerinin pratikliini bir rnek yardmyla grmeye alalm:

----------------------------------------------------------------------------------------------------------------------Python Dersleri
50/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Diyelim ki bir havadurumu program yazmak istiyoruz. Tasarmza gre kullanc bir ehir ad
girecek. Program da girilen ehre zg havadurumu bilgilerini ekrana yazdracak. Bunu yapabilmek
iin, daha nceki bilgilerimizi de kullanarak yle bir ey yazabiliriz:
#!/usr/bin/env python
#-*-coding:utf8-*soru = raw_input("Bulunduunuz ehrin adn tamam kk harf olacak ekilde yaznz: ")
if soru = = "istanbul":
print "gk grltl ve saanak yal"
elif soru = = "ankara":
print "ak ve gneli"
elif soru = = "izmir":
print "bulutlu"
else:
print "Bu ehre ilikin havadurumu bilgisi bulunmamaktadr."
Ama yukardaki yntemin, biraz meakkatli olaca ak. Sadece ehir iin havadurumu
bilgilerini sorgulayacak olsak mesele deil, ancak onlarca ehri kapsayacak bir program retmekse
amacmz, yukardaki yntem yerine daha pratik bir yntem uygulamak akl salmz iin de
gayet yerinde bir tercih olacaktr.
te bu noktada programcnn imdadna Python'daki szlk veritipi yetiecektir. Yukardaki kodlarn
yerine getirdii ilevi, u kodlarla da gerekletirebiliriz:
#!/usr/bin/env python
#-*-coding:utf8-*soru = raw_input("Bulunduunuz ehrin adn tamam kk harf olacak ekilde yaznz: ")
cevap = {"istanbul":"gk grltl ve saanak yal", "ankara":"ak ve gneli",
----------------------------------------------------------------------------------------------------------------------Python Dersleri
51/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

"izmir":"bulutlu"}
print cevap.get(soru,"Bu ehre ilikin havadurumu bilgisi bulunmamaktadr.")
Grdnz gibi, ilk nce, normal biimde, kullancya sorumuzu soruyoruz. Ardndan da "anahtardeer" iftleri eklinde ehir adlarn ve bunlara karlk gelen havadurumu bilgilerini bir szlk
iinde depoluyoruz.
Daha sonra, szlk metotlarndan biri olan "get" metodunu seiyoruz. Bu metot bize szlk iinde
bir deerin varolup olmadn denetleme imkannn yansra, ad geen deerin szlk iinde
varolmamas durumunda kullancya gsterilecek bir mesaj seme olana da sunar. Python
szlklerinde bulunan bu "get" metodu bizi bir "else" veya sonraki derslerimizde ileyeceimiz
"try-except" blou kullanarak hata yakalamaya urama zahmetinden de kurtarr.
Burada;
print cevap.get(soru,"Bu ehre ilikin havadurumu bilgisi bulunmamaktadr.")
satr yardmyla "soru" adl deikenin deerinin szlk iinde varolup varolmadn
sorguluyoruz. Eer kullancnn girdii ehir ad szlmz iinde bir "anahtar" olarak
tanmlanmsa, bu anahtarn deeri ekrana yazdrlacaktr. Eer kullancnn girdii ehir ad
szlmz iinde bulunmuyorsa, bu defa kullancya "Bu ehre ilikin havadurumu bilgisi
bulunmamaktadr." biiminde bir mesaj gsterilecektir.
"if" deyimleri yerine szlklerden yararlanmann, yukarda bahsedilen faydalarnn dnda bir de u
yararlar vardr:
1. ncelikle sz geen senaryo iin szlkleri kullanmak programcya daha az kodla daha ok i
yapma olana salar.
2. Szlk programcnn elle oluturaca if-elif-else bloklarndan daha performansldr ve bize ok
hzl bir ekilde veri sorgulama imkan salar.
3. Kodlarn daha az yer kaplamas sayesinde programn bakm da kolaylaacaktr.
4. Tek tek "if-elif-else" bloklar iinde ehir ad ve buna ilikin havadurumu bilgileri tanmlamaya

----------------------------------------------------------------------------------------------------------------------Python Dersleri
52/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

kyasla szlk iinde yeni "anahtar-deer" iftleri oluturmak daha pratiktir.


Bylelikle Python'da Listeler, Demetler ve Szlkler konusunu bitirmi olduk... Bu konuyu sk sk
tekrar etmek, hi olmazsa arada srada gz gezdirmek baz eylerin zihnimizde yer etmesi asndan
olduka nemlidir...

Python'da Fonksiyonlar
Giri
Bazen kodlar her defasnda tekrar tekrar yazmak yerine, bir kez yazp tekrar tekrar kullanabilmek
isteriz. Eer byle bir ey istiyorsak Python'da fonksiyonlar kullanmamz gerekiyor. Python'un
iinde gml vaziyette duran onlarca fonksiyon bulunur. Mesela len() ve range() birer
fonksiyondur.
Fonksiyon Tanmlama
Python, kendisinde var olan fonksiyonlarn yansra bizim de yeni fonksiyon tanmlamamza olanak
tanr. Fonksiyonlar tanmlarken "def" adl bir paracktan yararlanacaz. Bu "def" paracnn
hemen ardndan ise fonksiyonumuzun adn belirlememiz gerekiyor... Bu ad belirlerken Trke
karakter kullanmamamz gerektiini hatrlatmaya gerek yok herhalde.
Hemen bir rnek verelim:
def ilk_fonksiyonumuz():
Grdnz gibi nce "def" parac yardmyla Python'a bir fonksiyon tanmlayacamz
bildirdik. Daha sonra bu fonksiyona "ilk_fonksiyonumuz" adn verdik. Tabii siz isterseniz
fonksiyonunuza baka adlar da verebilirsiniz. Bu arada ifadenin en sonuna iki nokta st steyi
eklemeyi de unutmuyoruz.
u anda fonksiyonumuzun fonksiyon olduu ve adnn ne olduu belli. Ama ne yapt, ne ie
yarad belli deil... O halde devam edelim:
def ilk_fonksiyonumuz():
print "Ben Python! Monty Python!"
Aslnda u an itibariyle ilk fonksiyonumuzu tanmlam bulunuyoruz. sterseniz bu kodu Python
komut satrnda yazabiliriz. Peki nasl?
----------------------------------------------------------------------------------------------------------------------Python Dersleri
53/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Komut Satrnda Fonksiyon Tanmlama


Her zamanki gibi ALT+F2 tularna basp, kan ekrana "konsole" yazyoruz ve siyah ekranda
"python" yazarak Python komut satrn balatyoruz.
Komut satrnda:
def ilk_fonksiyonumuz():
yazp enter'e bastmzda "..." iaretini grrz. Bu, Python'un bizden yeni bir satr yazmamz
bekledii anlamna geliyor. imdi de
print "Ben Python! Monty Python!"
satrn yazacaz. Ama bu satr girintili yazmamz gerekiyor. "Space" tuuna drt kez basarak
girintileme ilemini yapyoruz. imdi;
print "Ben Python! Monty Python!"
satrn yazabiliriz.
Bu satr da yazdktan sonra iki kez enter tuuna basarak ">>>" iaretinin belirmesini bekliyoruz.
Bu iareti grdkten sonra:
ilk_fonksiyonumuz()
yazp enter'e bastmzda fonksiyonumuzun ierii ekrana yazlacaktr...
Metin Dzenleyicide Fonksiyon Tanmlama
Peki ya bu fonksiyonu bir metin dosyasna kaydetmek istersek ne yapacaz? (ki dorusu da budur
aslnda)
Hemen bo bir kwrite dosyas ap iine unlar yazyoruz:
#!/usr/bin/env python
#-*- coding:utf-8 -*def ilk_fonksiyonumuz():
print "Ben Python! Monty Python!"
imdi son bir satr daha eklememiz gerekiyor. Komut satrnda yazarken kodumuz bu satr olmadan
da alyordu, ama metin dosyasna yle bir satr eklememiz gerekiyor:
ilk_fonksiyonumuz()
----------------------------------------------------------------------------------------------------------------------Python Dersleri
54/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Metnimiz en son yle grnecek:


#!/usr/bin/env python
#-*- coding:utf-8 -*def ilk_fonksiyonumuz():
print "Ben Python! Monty Python!"
ilk_fonksiyonumuz()
Bu son satr, yazdmz fonksiyonu armamz salyor. Bu metin dosyasn ilk_fonksiyon.py
adyla bilgisayarmza kaydediyoruz. Artk konsol'da
python ilk_fonksiyonumuz.py
komutuyla fonksiyonumuzu altrabiliriz.
Fonksiyonlarda Parametreler
Grdnz

gibi

tanmladmz

fonksiyonda

ii

bo

parantezler

kullandk:

"def

ilk_fonksiyonumuz()"
Bu parantezlerin iine, yerine gre baz ifadeler, yani parametreler ekleme ansmz da var... Ancak
bu parantezlerin ii bo da olsa, dolu da olsa fonksiyon tanmlarken bu parantezleri koymay
unutmamamz gerekiyor. Peki bu parantezlerin iine neler yazabiliriz? Mesela arpma yapan bir
fonksiyon tanmlayacaksak eer, birbirleriyle arplacak deerleri yazabiliriz. Tabii bu deerler
mutlaka say cinsinden olacak diye bir kaide yok... Biz deerlerimizi "deiken" olarak da
tanmlayabiliriz:
#!/usr/bin/env python
#-*- coding:utf-8 -*def carpma(a, b):
print a * b
carpma(124, 345)
Dikkat ederseniz, son satrda, "124" ve "345" saylarn kullanarak srasyla "a" ve "b"
deikenlerini tanmlam olduk. Bu fonksiyon altrldnda ekrana 124 x 345 ileminin sonucu
yazdrlacaktr.
Yukardaki rnekte deikenlerin deerini (124 ve 345) son satrda parantez iine yazarak bunlar
dorudan tanmlam olduk. Ama biz istersek bu deikenleri ayr olarak da tanmlayabiliriz:
----------------------------------------------------------------------------------------------------------------------Python Dersleri
55/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

#!/usr/bin/env python
#-*- coding:utf-8 -*def carpma(a, b):
print a * b
a = 124
b = 345
carpma(a, b)
Burada a ve b deikenlerini print ifadesinin alt hizasna yazmadmza dikkat edin.. Eer bu
deerleri print ifadesinin alt hizasna yazarsak Python bize pislik yapacak, deikenleri
tanmlamadmz iddia edecektir...
Ama istersek yukardaki kodu u ekilde de yazabiliriz:
#!/usr/bin/env python
#-*- coding:utf-8 -*def carpma(a, b):
a = 124
b = 345
print a * b
carpma(a, b)
Grdnz gibi, a ve b deikenlerini fonksiyonu tanmladktan hemen sonra belirlersek print
ifadesinin st hizasna yazabiliyoruz.. Tabii imdi bunlar satrn en bana alrsanz Python bu defa
da size baka bir bahaneyle pislik yapacak, "Abi bizim buralarda iki nokta st ste koyup enter'e
bastktan sonraki ifade girintili yazlr.. imdi eski kye yeni adet getirme," diye bir hata mesaj
verecektir.
imdi baka bir rnek daha grelim:
#!/usr/bin/env python
#-*- coding:utf-8 -*def liste_kontrol(liste):
if liste = = []:
print "listeniz u anda bo"
else:
----------------------------------------------------------------------------------------------------------------------Python Dersleri
56/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

print "listenizde u anda", liste, "adl eler grnyor"


liste = ["ahmet", "mehmet"]
liste_kontrol(liste)
Bu rnekte de liste elerini ayr olarak tanmladk. Tabii biraz nceki rnekte olduu gibi istersek
bu eleri fonksiyonun iine de yedirebiliriz:
#!/usr/bin/env python
#-*- coding:utf-8 -*def liste_kontrol(liste):
if liste = = []:
print "listeniz u anda bo"
else:
print "listenizde u anda", liste, "adl eler grnyor"
liste_kontrol(liste = ["ahmet", "mehmet"])
Daha nce anlattmz gibi, bu fonksiyonlar metin dzenleyici yerine dorudan Python komut
satrna da yazabiliriz. Eer bu kodlar komut satrna yazarsak, mesela yukardaki arpma
fonksiyonunu arrken arplacak deerleri isteimize gre deitirebiliriz. Hemen deneyelim:
Python komut satrn ap ">>>" iaretinden hemen sonra;
def carpma(a, b):
yazp enter'e basyoruz. imdi drt kez "space" tuuna basarak girinti veriyoruz. Girintiyi verdikten
sonra u kodu yazyoruz:
print a * b
Hemen ardndan iki kez enter tuuna basarak ">>>" iaretinin tekrar belirmesini salyoruz. imdi
de mesela u komutu yazarak az evvel tanmladmz fonksiyonumuzu altryoruz:
carpma(45, 56)
Yukardaki komutta 45 ile 56 saysn arpm olduk. sterseniz parantez iindeki bu deerleri, yani
parametreleri, istediimiz gibi deitirebiliriz. Mesela yle yapabiliriz:
carpma(555, 444)
imdi yle bir ey deneyelim. nce bo bir kwrite belgesi aalm ve iine unlar yazalm:
#!/usr/bin/env python
----------------------------------------------------------------------------------------------------------------------Python Dersleri
57/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

#-*- coding:utf-8 -*def carpma(a, b):


print a * b
Grdnz gibi bu kod yukarda yazdmz kodla ayn... Tek fark en sonda "carpma(124, 345)
gibi bir ifade kullanmadk. Bu dosyay "fonk.py" adyla kaydedelim.
imdi de baka bir bo kwrite belgesi ap iine unlar yazalm:
#!/usr/bin/env python
#-*- coding:utf-8 -*from fonk import carpma
carpma(34,45)
Bu dosyay da istediimiz bir adla kaydedebiliriz. Mesela "deneme.py" diyelim...
imdi bu "deneme.py" adl dosyay altrdmz zaman 34 ve 45 saylarnn birbirleriyle
arpldn grrz... Halbuki deneme dosyas iinde herhangi bir arpma ilemi tanmlamadk...
Durum byle olduu halde arpma yapabilmemizin nedeni daha nce tanmladmz "fonk" isimli
fonksiyonu "deneme" isimli belgemize "davet etmi" veya "yklemi" olmamz... Ya da ngilazca
olarak ifade edersek, "import etmi" olmamz... Hatrlarsanz o "fonk" isimli fonksiyon iinde zaten
bir arpma ilemi tanmlamtk... Dolaysyla "deneme" isimli belgede tekrar arpma ilemi
tanmlamamza gerek kalmad... Peki bu "davet etme" iini nasl yaptk?
Dikkat ederseniz, "deneme.py" isimli dosyamzn nc satr yle:
from fonk import arpma
Bu Python'ca ifadenin Trkesi u: "fonk isimli modlden arpma isimli fonksiyonu ykle (veya
davet et veya import et)"
Bizim konumuz "Python'da Fonksiyonlar" idi... Peki imdi bu "modl" laf da nereden kt... Bu
durumu yle aklayabiliriz:
Bu blmn en banda, "def" paracn kullanarak Python'da fonksiyon tanmlamay
renmitik. Ayn belge iinde bu "def" paracn kullanarak pek ok fonksiyon tanmlayabiliriz.
te bu bir veya birden fazla fonksiyon hep birlikte "modl" denen eyi oluturuyor... Yani aslnda
"modl", fonksiyonlardan olumu bir btnn ad... Python'da modl kavramn bir sonraki
blmde daha ayrntl bir ekilde inceleyeceiz... Bizim rneimizde "def" paracyla

----------------------------------------------------------------------------------------------------------------------Python Dersleri
58/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

tanmlanm "carpma" isimli blok bir fonksiyon; dosyamzn ad olan "fonk" ise bir modl olmu
oluyor...
Bu arada dikkat edin, yukardaki modl ilk yklediimizde, alma klasrmzde .pyc uzantl bir
dosya daha olutu. Python bu dosyay oluturarak modln bir dahaki sefere daha hzl
yklenmesini salyor...
imdi konumuza dnelim... Ne demitik:
"fonk isimli modlden arpma isimli fonksiyonu ykle (veya davet et veya import et)"
Yani Python'ca sylemek gerekirse:
from fonk import carpma
Bu sayede fonk isimli modln iinde yer alan arpma isimli fonksiyonu belgemizin iine davet
ettik... Bu "arpma" isimli fonksiyon da arpma ilemi yapt iin, girdiimiz "34" ve "45"
saylarn birbiriyle arpt...
Hatrlarsanz ok nceden yazdmz bir hesap makinesi programnda, blme ilemlerini hatasz
yapabilmek iin
from __future__ import division
satrn eklemitik... te imdi yaptmz ey de buna ok benziyor... sterseniz /usr/lib/python2.4/
klasrnn iine bakn. Orada "__future__.py" adl bir dosya greceksiniz. Bu dosyay atnzda
onun iinde de "division" adl bir satr olduunu grrsnz... te bu "from __future__ import
division" komutuyla "__future__" dosyas iindeki "division" satrn kendi belgemizin iine davet
etmi oluyoruz... Dediimiz gibi, bu konuyu bir sonraki blmde daha ayrntl bir ekilde
inceleyeceiz.
Yukardaki fonksiyonu u ekilde de altrabiliriz:
#!/usr/bin/env python
#-*- coding:utf-8 -*import fonk
fonk.carpma(34,45)
Grdnz gibi, "fonk" adl modln iinden belirli bir fonksiyonu programmza davet etmek
yerine, "fonk" adl modln kendisini de davet edebiliyoruz. Bu ekilde "fonk" modl iinde ne
kadar fonksiyon varsa programmza davet edilecektir. Ancak dikkat ederseniz, bu ekilde
----------------------------------------------------------------------------------------------------------------------Python Dersleri
59/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

fonksiyonumuzu parack olarak kullanyoruz. Yani "fonk.carpma()" eklinde... Tpk bir nceki
blmn konusu olan "Listeler, Demetler ve Szlkler"de grdmz gibi... Hatrlarsanz orada da
baz paracklar kullanarak iimizi gryorduk...
Fonksiyon indeki Deikenlerin Okunma Sras
imdi u rnei ele alalm:
#!/usr/bin/env python
#-*- coding:utf-8 -*def merhaba(arkadas):
print "Merhaba", arkadas
arkadas = "Kezban"
merhaba(arkadas)
Her ey normal... ktmz:
Merhaba Kezban
olacaktr.
Yukardaki rnee ufak bir ekleme yapalm:
#!/usr/bin/env python
#-*- coding:utf-8 -*def merhaba(arkadas):
print "Merhaba", arkadas
arkadas = "Kezban"
arkadas = "Mcella"
merhaba(arkadas)
Sizce Python burada kimi arkadatan sayacak? Kezban' m yoksa Mcella'y m?
Cevap: Mcella!
Peki bunun nedeni nedir?
Cevap: Python fonksiyonlarda deikenleri okumaya sondan balar... Yukardaki rnekte arkadas =
"Mcella" ifadesinin altna arkadas = "Ahmet" ifadesini eklerseniz, Python bu kez "Ahmet"i dikkate
alacaktr... nk bu kez en sonda "Ahmet" deeri olmu olacak...

----------------------------------------------------------------------------------------------------------------------Python Dersleri
60/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

imdi u rnee bakn:


#!/usr/bin/env python
#-*- coding:utf-8 -*def merhaba(arkadas):
print "Merhaba", arkadas
arkadas = "Kezban"
print "Artk benim yeni arkadam", arkadas
arkadas = "Mcella"
merhaba(arkadas)
Bu rnekte ayn adla iki farkl deiken tanmladk. Burada Python'un deikenleri okurken nasl
bir sra takip ettiine dikkat edin...
Ayrca grdnz gibi,
arkadas = "Kezban"
satrn,
arkadas = "Mcella"
satrndan farkl olarak print ifadesinin tam altna denk getirdik. nk kodumuz henz bitmedi.
Daha baka satrlar da eklemeyi dnyoruz kodumuza. Bu deikeni satrn en bana alrsak
Python beyin st betona aklacaktr. nk bu deikeni satr bana alrsak, Python bizim artk
son kodu yazdmz, bu kodun hemen ardndan "merhaba(arkadas)" satrn ekleyip fonksiyonu
armak suretiyle mevcut fonksiyon blounu sona erdireceimizi zanneder... Halbuki bizim
yazacak birka satrmz daha var... sterseniz bu ifadeyi satr bana alarak Python'un bize ne tr
kfrler edeceini grebilirsiniz...
Tabii ki biz bu iki deikene farkl adlar vererek ok daha kolay biimde iimizi halledebiliriz:
#!/usr/bin/env python
#-*- coding:utf-8 -*def merhaba(arkadas, ark):
print "Merhaba", ark
print "Artk benim yeni arkadam", arkadas

----------------------------------------------------------------------------------------------------------------------Python Dersleri
61/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

arkadas = "Kezban"
ark = "Mcella"
merhaba(arkadas, ark)
"global" ifadesi
imdi kendimize yle bir soru soralm:
Acaba fonksiyon blou iinde tanmladmz bir deiken, mevcut fonksiyon haricinde de ayn
adla kullanlabilir mi? Yani diyelim ki bir fonksiyon oluturduk ve bu fonksiyon iinde bir x
deikeni tanmladk. Daha sonra baka bir fonksiyon daha oluturduk ve bir nceki fonksiyonda
tanmladmz x deikenini bu yeni fonksiyon iinde de kullanmak istiyoruz. Amacmz mesela
yle bir ey yapmak:
#!/usr/bin/env python
#-*- coding:utf-8 -*def matematik_toplama():
soru = input("Ltfen bir say girin: ")
soru2 = input("Ltfen baka bir say daha girin: ")
print "Bu iki say toplanrsa u kar:"
print soru + soru2
matematik_toplama()
def matematik_carpma():
print "bu iki say arplrsa u kar:"
print soru * soru2
matematik_carpma()
Bu kodlar bu ekilde altrrsak Python bize bir hata mesaj gsterecektir. nk bir fonksiyon
iinde tanmlanan deikenler sadece o fonksiyonun snrlar iinde geerlidir. Yani bir fonksiyon
iinde tanmlanan bir deiken baka bir fonksiyon iinde kullanlamaz. Eer biz bir fonksiyon
iinde tanmladmz bir deikeni o fonksiyon dnda da kullanmak istiyorsak yle bir satr
eklemeliyiz:
global [deiken_ad]

----------------------------------------------------------------------------------------------------------------------Python Dersleri
62/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Bunu yukardaki kodlara uygularsak yle olmal:


#!/usr/bin/env python
#-*- coding:utf-8 -*def matematik_toplama():
global soru, soru2
soru = input("Ltfen bir say girin: ")
soru2 = input("Ltfen baka bir say daha girin: ")
print "Bu iki say toplanrsa u kar:"
print soru + soru2
matematik_toplama()
def matematik_carpma():
print "bu iki say arplrsa u kar:"
print soru * soru2
matematik_carpma()
Grdnz gibi, "global" ifadesi, deikenin deerinin bir nevi "evrensel" olmasn salyor...
Bir rnek daha verelim:
#!/usr/bin/env python
#-*- coding:utf-8 -*def deneme(arkadas):
print "Merhaba", arkadas
arkadas = "Kezban"
print "Benim yeni arkadam artk", arkadas
arkadas = "Mcella"
deneme(arkadas)
print "evet, onun arkada artk", arkadas
Bu kodu bu haliyle altrrsak ktmz yle olacaktr:
Merhaba Mcella
Benim yeni arkadam artk Kezban
evet, onun arkada artk Mcella
----------------------------------------------------------------------------------------------------------------------Python Dersleri
63/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Son satrdaki mantk hatasn gryorsunuz. Olmas gereken "Mcella" deil, "Kezban"...
Bu durumu dzeltmek iin global ifadesini kullanacaz:
#!/usr/bin/env python
#-*- coding:utf-8 -*def deneme():
global arkadas
print "Merhaba", arkadas
arkadas = "Kezban"
print "Benim yeni arkadam artk", arkadas
arkadas = "Mcella"
deneme()
print "evet, onun arkada artk", arkadas
Dikkat ederseniz, global ifadesini kullanabilmek iin fonksiyon tanmlarndaki parantez ii
parametreleri kaldrdk. Aksi halde Python bize bir hata mesaj gsterecektir.
"return" ifadesi
Bu ifadenin ne ie yaradn anlamak iin u rneklere bakalm:
#!/usr/bin/env python
#-*- coding:utf-8 -*def return_deneme(a,b):
if a < b:
return a
else:
return b
print return_deneme(34, 45)
Grdnz gibi burada "return" ifadesi yarattmz koulun sonucuna gre ya a deikenini ya da
b deikenini "dndryor"; yani bize kt olarak veriyor...
Bir de u rnee bakalm:
#!/usr/bin/env python
#-*- coding:utf-8 -*----------------------------------------------------------------------------------------------------------------------Python Dersleri
64/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

def deneme():
liste = ["Ayva", "iek", "Am", "Yaz m", "Gelecek"]
return liste
print deneme()
Bu rnekte de "return" ifadesi listenin elerini ekrana dkyor.. Bu arada fonksiyonun sonuna bir
"print" ifadesi eklediimize dikkat edin.
Eer fonksiyonumuzu aadaki ekilde yazarsak, Python bize "none" diye bir kt verecektir:
#!/usr/bin/env python
#-*- coding:utf-8 -*def deneme():
return
print deneme()
Bu "none" deeri, fonksiyonun geerli ve doru olduunu, ama hibir ey iermediini anlatr...
"Return" ifadesinin ikinci bir ilevi ise bir fonksiyonun iletilmesine engel olmaktr. nceden
verdiimiz u rnee bir bakalm tekrar:
#!/usr/bin/env python
#-*- coding:utf-8 -*def matematik_toplama():
global soru, soru2
soru = input("Ltfen bir say girin: ")
soru2 = input("Ltfen baka bir say daha girin: ")
print "Bu iki say toplanrsa u kar:"
print soru + soru2
matematik_toplama()
def matematik_carpma():
return
print "bu iki say arplrsa u kar:"
print soru * soru2
matematik_carpma()

----------------------------------------------------------------------------------------------------------------------Python Dersleri
65/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Grdnz gibi ikinci fonksiyonda "return" ifadesi kullanarak bu ksmn altrlmasna engel
olduk.
"pass" ifadesi
u rnee bir bakalm:
#!/usr/bin/python
def deneme():
liste = []
while True:
a = raw_input("Giriniz: ")
if a = = "0":
pass
else:
liste.append(a)
print liste
deneme()
Burada grdmz gibi, eer kullanc "0" deerini girerse, bu deer listeye eklenmeyecek,
Python hibir ey yapmadan bu satr atlayacaktr.
Modller
Giri
Modl, kabaca, fonksiyonlar ve sabitleri (constants) ieren, istendiinde baka programlarn iine
davet edilebilen, .py uzantl bir dosyadr. Modller, yazacamz programlara ilevsellik katmamz
salar.
Bu blmde en nemli Python modllerinden os modln inceleyerek, Python'da modllerin nasl
kullanldn anlamaya alacaz.
Modl ekme (importing Modules)
Python'da programmz iinde kullanacamz modlleri birka farkl yntemle ekebiliriz. Hemen
ksaca bu yntemleri grelim:
----------------------------------------------------------------------------------------------------------------------Python Dersleri
66/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

import modl_ad
Bu yntemle bir modl, btn ieriiyle birlikte ekebiliriz. Veya baka bir deyile bir modln
iinde ne var ne yoksa programmz iine davet edebiliriz... Kimileri buna "import" etmek de
diyor...
from modl_ad import *
Bu yntemle bir modl iinde ad "__" ile balayanlar hari btn fonksiyonlar programmz iine
ekebiliriz. Yani bu yntem de tpk yukarda anlatlan yntemde olduu gibi, btn fonksiyonlar
alacaktr... Yalnz "__" ile balayan fonksiyonlar hari...
from modl_ad import falanca, filanca
Bu yntem ise bir modlden "falanca" ve "filanca" adl fonksiyonlar armamz salayacaktr.
Yani btn ierii deil, bizim istediimiz fonksiyonlar ekmekle yetinecektir.
Peki bu yntemlerden hangisini kullanmak daha iyidir. Eer ne yaptnzdan tam olarak emin
deilseniz veya o modlle ilgili bir belgede farkl bir yntem kullanmanz nerilmiyorsa, anlatlan
birinci yntemi kullanmak her zaman daha gvenlidir (import modl_ad). nk br yntemler
modl ieriinin tamamn ekmedii iin programnzda ilev kayb yaayabilirsiniz... Ama tabii ki
hangi ierii ekmeniz gerektiinden eminseniz o baka...
Modller hakknda genel bir bilgi edindiimize gre artk nemli modllerden os modln
incelemeye balayabiliriz:
os Modl
Bu modl bize, kullanlan iletim sistemiyle ilgili ilemler yapma olaca sunuyor. Modln kendi
belgelerinde belirtildiine gre, bu modl kullanan programlarn farkl iletim sistemleri zerinde
alma ans daha fazla...
Bu modl, yukarda anlattmz ekilde ekeceiz:
import os
Eer bu ekilde modl "import" etmezsek, bu modlle ilgili kodlarmz altrmak istediimizde
Python bize bir hata mesaj gsterecektir.
Bu modl programmz iine nasl davet edeceimizi rendiimize gre, os modl iindeki
fonksiyonlardan sz edebiliriz. ncelikle, isterseniz bu modl iinde neler var neler yok yle bir
----------------------------------------------------------------------------------------------------------------------Python Dersleri
67/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

listeleyelim:
Python komut satrnda ">>>" iaretinden hemen sonra
import os
komutuyla os modln alyoruz. Daha sonra u komutu veriyoruz:
dir(os)
sterseniz daha anlalr bir kt elde edebilmek iin bu komutu u ekilde de verebilirsiniz:
for icerik in dir(os):
print icerik
Grdnz gibi, bu modl iinde bir yn fonksiyon var! imdi biz bu fonksiyonlardan nemli
olanlarn incelemeye alalm...
name fonksiyonu
Basit bir rnekle balayalm:
#!/usr/bin/env python
#-*- coding:utf-8 -*import os
if os.name = = "posix":
a = raw_input("Linus Torvalds'a mesajnz yazn:")
print "Selam Linux kullancs!"
if os.name = = "nt":
a = raw_input("Bill Gates'e mesajnz yazn:")
print "Selam Windows Kullancs!"
Bu basit rnekte ncelikle "os" adl modl btn ieriiyle birlikte programmza davet ettik...
Daha sonra bu modl iindeki "name" fonksiyonunu kullanarak, kullanlan iletim sistemini
sorguladk. Buna gre bu program altrldnda, eer kullanlan iletim sistemi GNU/Linux ise,
kullancdan "Linus Torvalds'a mesajn yazmas" istenecektir. Eer kullanlan iletim sistemi
Windows ise, "Bill Gates'e mesaj yazlmas istenecektir... Python'da iletim sistemi isimleri iin
tanml olarak u ifadeler bulunur:

----------------------------------------------------------------------------------------------------------------------Python Dersleri
68/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

GNU/Linux iin "posix",


Windows iin "nt", "dos", "ce"
Macintosh iin "mac"
OS/2 iin "os2"
Ayn komutlar u ekilde de yazabiliriz:
#!/usr/bin/env python
#-*- coding:utf-8 -*from os import name
if name = = "posix":
a = raw_input("Linus Torvalds'a mesajnz yazn:")
print "Selam Linux kullancs!"
if name = = "nt":
a = raw_input("Bill Gates'e mesajnz yazn:")
print "Selam Windows Kullancs!"
Dikkat ederseniz burada "from os import name" komutuyla, os modl iindeki name fonksiyonunu
ektik yalnzca. Ayrca program iinde kullandmz "os.name" ifadesini de "name" ekline
dntrdk... nk "from os import name" komutuyla yalnzca "name" fonksiyonunu ektiimiz,
aslnda os modln ekmediimiz iin, "os.name" yapsn kullanrsak Python bize "os" isminin
tanmlanmadn syleyecektir.
listdir fonksiyonu
Os modl iinde yer alan bu fonksiyon bize bir dizin iindeki dosyalar veya klasrleri listeleme
imkan veriyor. Bunu yle kullanyoruz:
import os
a = os.listdir("/home/")
print a
Yukardaki rnekte her zamanki gibi, modlmz "import os" komutuyla programmzn iine
ektik ilk nce. Ardndan kullanm kolayl asndan "os.listdir" fonksiyonunu "a" adl bir
deikene baladk. rnekte os.listdir fonksiyonunun nasl kullanldn gryorsunuz.
rneimizde /home dizini altndaki dosya ve klasrleri listeliyoruz. Burada parantez iinde trnak
iaretlerini ve yatk izgileri nasl kullandmza dikkat edin. En son da "print a" komutuyla /home
----------------------------------------------------------------------------------------------------------------------Python Dersleri
69/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

dizininin ieriini liste olarak ekrana yazdryoruz.


ktnn tipinden anladmz gibi, elimizde olan ey, eleri yan yana dizilmi bir "liste". Eer biz
dizin ieriinin byle yan yana deil de alt alta dizildiinde daha yakkl grneceini
dnyorsak, kodlarmz u biime sokabiliriz:
import os
a = os.listdir("/home/")
for dosyalar in a:
print dosyalar
Hatta eer dosyalarmza numara vererek listelemek istersek yle de yapabiliriz:
import os
a = os.listdir("/home/")
c=0
for dosyalar in a:
if c < len(a):
c = c+1
print c, dosyalar

getcwd fonksiyonu
Os modl iinde yer alan bu fonksiyon bize o anda hangi dizin iinde bulunduumuza dair bilgi
verir. sterseniz bu fonksiyonun tam olarak ne ie yaradn bir rnek zerinde grelim. Bunun iin,
kolaylk asndan, hemen Python komut satrn aalm ve ">>>" iaretinden hemen sonra u
komutu yazalm:
import os
Bu komutu yazp enter'e bastktan sonra da u komutu verelim:
os.getcwd()
Grdnz gibi bu komut bize o anda hangi dizin iinde bulunduumuzu sylyor. Bu arada
ngilizce bilenler iin syleyelim, buradaki "cwd"nin alm "current working directory". Yani
kabaca "mevcut alma dizini"... Daha ak ifade etmek gerekirse: "O anda iinde bulunduumuz
dizin".

----------------------------------------------------------------------------------------------------------------------Python Dersleri
70/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

yle bir rnek vererek konuyu biraz aalm:


#!/usr/bin/env python
#-*- coding:utf-8 -*import os
mevcut_dizin = os.getcwd()
if mevcut_dizin = = "/home/istihza/Desktop":
for i in os.listdir(mevcut_dizin):
print i
else:
print "Bu program yalnzca /home/istihza/Desktop dizininin ieriini gsterebilir!"
Yukardaki rnekte ncelikle os modln programmza ektik. Daha sonra mevcut_dizin adnda
bir deiken yaratp "os.getcwd" fonksiyonunun kendisini bu deikenin deeri olarak atadk.
Ardndan, "eer mevcut_dizin /home/istihza/Desktop ise bu dizin iindeki dosyalar bize listele ve
sonucu ekrana yazdr, yok eer mevcut_dizin /home/istihza/Desktop deil ise, bu program
yalnzca /home/istihza/Desktop dizininin ieriini gsterebilir, cmlesini gster" dedik. Burada
dikkat ederseniz "if" ifadesinden sonra "for" dngsn kullandk... Bu ilemi, ekran kts daha
yakkl olsun diye yaptk... Eer byle bir kaygmz olmasayd,
if mevcut_dizin = = "/home/istihza/Desktop":
satrnn hemen altna
print mevcut_dizin
yazp ii bitirirdik...
Biz burada getcwd fonksiyonu iin basit rnekler verdik, ama eminim siz yaratclnzla ok daha
farkl ve kullanl kodlar yazabilirsiniz...
imdi de os modl iindeki baka bir fonksiyona deinelim.
chdir() fonksiyonu
Bu fonksiyon yardmyla iinde bulunduumuz dizini deitirebiliriz. Diyelim ki o anda
/usr/share/apps dizini iindeyiz. Eer bir st dizine, yani /usr/share/ dizinine gemek istiyorsak, u
komutu verebiliriz:

----------------------------------------------------------------------------------------------------------------------Python Dersleri
71/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

import os
os.chdir(os.pardir)
print os.getcwd()
Buradaki "pardir" sabiti, ngilizce "parent directory" (bir st dizin) ifadesinin ksaltmas oluyor.
"pardir" sabiti dnda, bir de "curdir" sabiti vardr. Bu sabiti kullanarak "mevcut dizin" zerinde
ilemler yapabiliriz:
import os
os.listdir(os.curdir)
Grdnz gibi bu "curdir" sabiti "getcwd()" fonksiyonuna benziyor.
Bunun dnda, istersek gitmek istediimiz dizini kendimiz elle de belirtebiliriz:
import os
os.chdir("/var/tmp")
mkdir() ve makedirs() fonksiyonlar
Bu iki fonksiyon yardmyla dizin veya dizinler oluturacaz. Mesela:
import os
os.mkdir("/test")
Bu kod "/" dizini altnda "test" adl bo bir klasr oluturacaktr...
Eer bu kodu u ekilde yazarsak, "mevcut alma dizini" iinde yeni bir dizin oluacaktr:
import os
os.mkdir("test")
Yani, mesela "mevcut alma dizini" masast ise bu "test" adl dizin masastnde oluacaktr...
sterseniz bu kodlar u ekle getirerek yeni oluturulan dizinin nerede olduunu da grebilirsiniz:
import os
print os.getcwd()
os.mkdir("test")
Bundan baka, eer isterseniz mevcut bir dizin yaps iinde baka bir dizin de oluturabilirsiniz.
Yani mesela "/home/kullanc_adnz/" dizini iinde "deneme" adl bo bir dizin oluturabilirsiniz:

----------------------------------------------------------------------------------------------------------------------Python Dersleri
72/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

import os
os.mkdir("/home/istihza/deneme")
Peki diyelim ki i ie birka tane yeni klasr oluturmak istiyoruz. Yani mesela
"/home/kullanc_adnz" dizini altnda yeni bir "Programlar" dizini, onun altnda da "Python" adl
yeni baka bir dizin daha oluturmak istiyoruz. Hemen deneyelim:
import os
os.mkdir("/home/istihza/Programlar/Python")
Ne oldu? yle bir hata kts elde ettik:
Traceback (most recent call last):
File "deneme.py", line 2, in ?
os.mkdir("/home/istihza/Programlar/Python")
OSError: [Errno 2] No such file or directory: '/home/istihza/Programlar/Python'
Demek ki bu ekilde oklu dizin oluturamyoruz. te bu ama iin elimizde makedirs() fonksiyonu
var. Hemen deneyelim yine:
import os
os.makedirs("/home/istihza/Programlar/Python")
Grdnz gibi, /home/kullanc_admz/ dizini altnda yeni bir "Programlar" dizini ve onun
altnda da yeni bir "Python" dizini olutu.
Buradan kan sonu, demek ki mkdir() fonksiyonu bize yalnzca bir adet dizin oluturma izni
veriyor.. Eer biz birden fazla, yani oklu yeni dizin oluturmak istiyorsak makedirs() fonksiyonunu
kullanmamz gerekiyor.
Kk bir rnek daha verip bu bahsi kapatalm:
import os
print os.getcwd()
os.makedirs("test/test1/test2/test3")
Tahmin ettiiniz gibi bu kod "mevcut alma dizini" altnda i ie "test", "test1", "test2" ve "test3"
adl dizinler oluturdu... Eer "test" ifadesinin soluna "/" iaretini eklerseniz, bu bo dizinler "root"
altnda oluacaktr...

----------------------------------------------------------------------------------------------------------------------Python Dersleri
73/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

rmdir() ve removedirs() fonksiyonlar


Bu fonksiyonlar bize mevcut dizinleri silme olana tanyor.. Yalnz, burada hemen bir uyar
yapalm: Bu fonksiyonlar ok dikkatli kullanmamz gerekiyor... Ne yaptnzdan, neyi
sildiinizden emin deilseniz bu fonksiyonlar kullanmayn! nk Python bu komutu verdiinizde
tek bir soru bile sormadan atr atr silecektir belirttiiniz dizini... Byle bir durumda, bir ift yal
gzle ekrana bakakalmak istemezsiniz, deil mi? Geri, bu komutlar yalnzca ii bo dizinleri
silecektir, ama yine de benden uyarmas!
Hemen bir rnek verelim. Diyelim ki "mevcut alma dizinimiz" olan masastnde "TEST" adl
bo bir dizin var ve biz bu dizini silmek istiyoruz:
import os
os.rmdir("TEST")
Bylece "TEST" dizini utu gitti... Haydi selametle!
Bu ilemin ardndan hl kendinizdeyseniz bir de u rnee bakn:
import os
os.rmdir("/home/istihza/TEST")
Bu kod ise /home/kullanc_ad dizini altndaki bo "TEST" dizinini uuracaktr...
Tpk mkdir() ve makedirs() fonksiyonlarnda olduu gibi, i ie birden fazla bo dizini silmek
istediimizde ise removedirs() fonksiyonundan yararlanyoruz:
import os
os.removedirs("test1/test2")
Yine hatrlatmakta fayda var: Neyi sildiinize mutlaka dikkat edin...
Python'da dizinleri nasl yneteceimizi, nasl dizin oluturup sileceimizi basite grdk. imdi de
bu "dizinleri ynetme" iini biraz irdeleyelim.
imdiye kadar hep bir dizin, onun altnda baka bir dizin, onun altnda da baka bir dizini nasl
oluturacamz altk... Peki ayn dizin altnda birden fazla dizin oluturmak istersek ne
yapacaz?
Bu ilemi ok kolay bir ekilde yle yapabiliriz:

----------------------------------------------------------------------------------------------------------------------Python Dersleri
74/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

import os
os.makedirs("test1/test2")
os.makedirs("test1/test3")
Bu kodlar "mevcut alma dizini" altnda "test1" adl bir dizin ile bunun altnda "test2" ve "test3"
adl baka iki adet dizin daha oluturacaktr.
Peki bu "test1", "test2" ve "test3" ifadelerinin sabit deil de deiken olmasn istersek ne
yapacaz. yle bir ey deneyelim:
import os
test1 = "Belgelerim"
test2 = "Hesaplamalar"
test3 = "Resimler"
os.makedirs(test1/test2)
os.makedirs(test1/test3)
Bu kodlar altrdmzda Python bize yle bir ey syler:
Traceback (most recent call last):
File "deneme.py", line 4, in ?
os.makedirs(test1/test2)
TypeError: unsupported operand type(s) for /: 'str' and 'str'
Peki neden byle oldu ve bu hata ne anlama geliyor?
Kod yazarken baz durumlarda "/" iareti programclar skntya sokabilir. nk bu iaret
Python'da hem "blme" ileci hem de "dizin ayrac" olarak kullanlyor... Biraz nce yazdmz
kodda Python bu iareti "dizin ayrac" olarak deil "blme ileci" olarak alglad ve sanki "test1"
ifadesini "test2" ifadesine blmek istiyormuuz gibi bir muamele yapt bize... Ayrca kullandmz
"os.makedirs" fonksiyonunu da grd iin ne yapmaya altmz anlayamad ve kafas
kart... Yani, "Arkadam, bir yandan dizin oluturmaya alyorsun, bir yandan da blme
yapmaya alyorsun... Karar ver!" dedi bize Python... Peki bu meseleyi nasl halledeceiz?
Bu meseleyi halletmek iin kullanmamz gereken baka bir fonksiyon var Python'da...
os.sep fonksiyonu
Bu fonksiyon, iletim sistemlerinin "dizin ayralar" hakknda bize bilgi veriyor... Eer yazdmz
----------------------------------------------------------------------------------------------------------------------Python Dersleri
75/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

bir programn farkl iletim sistemleri zerinde almasn istiyorsak bu fonksiyon epey iimize
yarayacaktr... nk her iletim sisteminin dizin ayrac birbiriyle ayn deil. Bunu u rnekle
gsterebiliriz:
Hemen bir Python komut satr ap u komutlar verelim:
>>>import os
>>>os.sep
'/'
Bu komutu GNU/Linux'ta verdiimiz iin komutun kts "/" eklinde oldu. Eer ayn komutu
Windows'ta verirsek sonu yle olacaktr:
>>>import os
>>>os.sep
'\\'
Peki bu os.sep fonksiyonu ne ie yarar? Yazdmz kodlarda dorudan "dizin ayrac" vermek yerine
bu fonksiyonu kullanrsak, programmz farkl iletim sistemlerinde altrrken, sistemin kendine
zg "dizin ayrac"nn kullanlmasn salam oluruz... Yani mesela:
import os
os.makedirs("test/test2")
komutu yerine;
import os
os.makedirs("test" + os.sep + "test2")
komutunu kullanrsak programmz farkl iletim sistemlerinde altrrken herhangi bir aksaklk
olmasn nlemi oluruz. nk burada os.sep ifadesi, ilgili iletim sistemi hangisiyle ona ait olan
dizin ayracnn otomatik olarak yerletirilmesini salayacaktr...
Bu os.sep fonksiyonu ayrca dizin adlarn "deiken" yapmak istediimizde de bize yardmc
olacaktr.. Hatrlarsanz yukarda yle bir kod yazmtk:
import os
test1 = "Belgelerim"
test2 = "Hesaplamalar"
test3 = "Resimler"
----------------------------------------------------------------------------------------------------------------------Python Dersleri
76/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

os.makedirs(test1/test2)
os.makedirs(test1/test3)
Yine hatrlarsanz bu kodu altrdmzda Python hata vermiti. nk Python burada "/" iaretini
blme ileci olarak alglamt. te bu hatay almamak iin os.sep fonksiyonundan faydalanabiliriz.
yle ki:
import os
test1 = "Belgelerim"
test2 = "Hesaplamalar"
test3 = "Resimler"
os.makedirs(test1)
os.makedirs(os.sep.join([test1,test2]))
os.makedirs(os.sep.join([test1,test3]))
Dikkat ederseniz, burada os.sep fonksiyonuna bir de "join" diye bir ifade ekledik. Bu ifade
kendisinden sonra gelecek dizin adlarnn "birletirilmesi" emrini veriyor... Bu fonksiyon sayesinde
"/" iaretine hi bulamadan, bamz derde sokmadan iimizi halledebiliyoruz. Ayrca burada
parantez ve keli parantezlerin nasl kullanldna da dikkat etmemiz gerekiyor...
Yukarda "test1", "test2" ve "test3" deikenlerinin adlarn dorudan kod iinde verdik... Tabii eer
istersek raw_input fonksiyonuyla dizin adlarn kullancya setirebileceimiz gibi, yle bir ey de
yapabiliriz:
import os
def dizinler(test1,test2,test3):
os.makedirs(test1)
os.makedirs(os.sep.join([test1,test2]))
os.makedirs(os.sep.join([test1,test3]))
Dikkat ederseniz, burada ncelikle os modln aryoruz. Daha sonra "dizinler" adl bir
fonksiyon oluturup parametre olarak "test1", "test2" ve "test3" adl deikenler belirliyoruz.
Ardndan "os.makedirs(test1)" komutuyla "test1" adl bir dizin oluturuyoruz. Tabii bu "test1" bir
deiken olduu iin adn daha sonradan biz belirleyeceiz. Alttaki satrda ise os.makedirs ve
os.sep.join fonksiyonlar yardmyla, bir nceki satrda oluturduumuz "test1" adl dizinin iinde
"test2" adl bir dizin daha oluturuyoruz. Burada os.sep.join fonksiyonu "/" iaretiyle uramadan
dizinleri birletirme imkan salyor bize... Hemen alttaki satrda da benzer bir ilem yapp
----------------------------------------------------------------------------------------------------------------------Python Dersleri
77/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

kodlarmz bitiriyoruz.
Bylece bir fonksiyon tanmlam olduk. imdi bu dosyay "deneme" adyla masastne
kaydedelim.. Bylelikle kendimize bir modl yapm olduk. imdi Python komut satrn aalm ve
u komutlar verelim:
>>>import deneme
>>>deneme.dizinler("Belgelerim", "Videolar", "Resimler")
Burada ncelikle "import deneme" satryla "deneme" adl modlmz ardk. Daha sonra
"deneme.dizinler..." satryla bu modl iindeki "dizinler" adl fonksiyonu ardk... Bylelikle
masastnde "Belgelerim" adl bir klasrn iinde "Videolar" ve "Resimler" adl iki klasr
oluturmu olduk...
Bu os.sep.join ifadesi ile ilgili son bir ey daha syleyip bu konuya bir nokta koyalm.
imdi Python komut satrn aarak u kodlar yazalm:
>>>import os
>>>os.sep.join(["Dizin1", "Dizin2"])
Enter'e bastmzda, bu komutlarn kts yle olur:
'Dizin1/Dizin2'
Ayn kodlar Windows zerinde verirsek de u kty alrz:
'Dizin1\\Dizin2'
Grdnz gibi farkl platformlar zerinde, os.sep fonksiyonunun kts birbirinden farkl oluyor.
Bu rnek, os.sep fonksiyonunun, yazdmz programlarn "tanabilirlii" (portability), yani "farkl
iletim sistemleri zerinde alabilme kabiliyeti" asndan ne kadar nemli olabileceini
gsteriyor...
Dosya lemleri
Bu blmde Python programlama dilini kullanarak dosyalar nasl yneteceimizi, yani nasl yeni
bir dosya oluturacamz, bu dosyaya nasl bir eyler yazabileceimizi ve buna benzer ilemleri
reneceiz. sterseniz laf hi uzatmadan konumuza geelim...

----------------------------------------------------------------------------------------------------------------------Python Dersleri
78/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Yeni bir dosya yaratma


imdi "mevcut alma dizini"nde yeni bir dosya yaratacaz. ncelikle mevcut alma dizinimizin
ne olduunu grelim. Hemen Python komut satrn ayoruz ve u komutu veriyoruz:
os.getcwd()
imdi acaba ka kii bu tuzaa dt merak ediyorum? Eer komut satrnda dorudan bu komutu
verdiyseniz hata mesajn da grmsnzdr... nk biliyorsunuz nce os modln ekmemiz
gerekiyor...
import os
os.getcwd()
imdi oldu... Biraz sonra oluturacamz dosya bu komutun kts olarak grnen dizin iinde
oluacaktr. Sayn ki bu dizin Masast olsun...
Artk yeni dosyamz oluturabiliriz. Bu i iin "open" adl bir fonksiyondan faydalanacaz. Bu
arada bir yanl anlalma olmamas iin hemen belirtelim. Bu fonksiyonu kullanmak iin os
modlnn ekilmesine gerek yok. Biraz nce os modln ekmemizin nedeni yalnzca
"os.getcwd()" fonksiyonunu kullanmakt... Bu noktay da belirttikten sonra komutumuzu veriyoruz:
open("vicdansiz_sabuha.txt","w")
Bylelikle masastnde "vicdansiz_sabuha" adl bir metin dosyas oluturmu olduk... imdi
verdiimiz bu komutu biraz inceleyelim. "open" fonksiyonunun ne olduu belli... Bir dosyay
amaya yaryor. Tabii ortada henz bir dosya olmad iin burada amak yerine yeni bir dosya
yaratmaya yarad... Parantez iindeki "vicdansiz_sabuha.txt"nin de ne olduu ak.. Yaratacamz
dosyann adn trnak iine almay unutmuyoruz. Peki bunlarn hepsini anladk da bu "w" ne oluyor?
Python'da dosyalar ynetirken, dosya izinlerini de belirtmemiz gerekir. Yani mesela bir dosyaya
yazma yetkisi vermek iin "w" kipini (mode) kullanyoruz. Bu harf ngilizce'de "yazma" anlamna
gelen "write" kelimesinin ksaltmas oluyor. Bunun dnda bir de "r" kipi ve "a" kipi bulunur. "r",
ngilizce'de "okuma" anlamna gelen "read" kelimesinin ksaltmas... "r" kipi oluturulan veya
alan bir dosyaya yalnzca "okuma" izni verildiini gsterir. Yani bu dosya zerinde herhangi bir
deiiklik yaplamaz. Deiiklik yapabilmek iin biraz nce gsterdiimiz "w" kipini kullanmak
gerekir. Bir de "a" kipi vardr, dedik. "a" da ngilizce'de "eklemek" anlamna gelen "append"
kelimesinden geliyor... "a" kipi nceden oluturduumuz bir dosyaya yeni veri eklemek iin
kullanlr. Bu u anlama gekiyor. rnein "vicdansz_sabuha.txt" adl dosyay "w" kipinde
----------------------------------------------------------------------------------------------------------------------Python Dersleri
79/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

oluturup iine bir eyler yazdktan sonra tekrar bu kiple ap iine bir eyler eklemek istersek
dosya iindeki eski verilerin kaybolduunu grrz... Dolaysyla dosya iindeki eski verileri
koruyup bu dosyaya yeni veriler eklemek istiyorsak "a" kipini kullanmamz gerekecek. Bu kiplerin
hepsini sras geldiinde greceiz. imdi tekrar konumuza dnelim.
Biraz nce;
open("vicdansiz_sabuha.txt", "w")
komutuyla "vicdansz_sabuha.txt" adnda "yazma yetkisi verilmi" bir dosya oluturduk
masastnde... Bu komutu bir deikene atamak, kullanm kolayl asndan epey faydal
olacaktr. Biz de imdi bu ilemi yapalm:
ilkdosyam = open("vicdansz_sabuha.txt","w"
Bu arada dikkatli olun, eer bilgisayarnzda nceden "vicdansiz_sabuha.txt" adl bir dosya varsa,
yukardaki komut size hi bir uyar vermeden eski dosyay silip zerine yazacaktr...
imdi baka bir rnek verelim:
ilkdosyam=open("vicdansiz_sabuha.txt", "r")
Dikkat ederseniz burada "w" kipi yerine "r" kipini kullandk. Biraz nce de akladmz gibi bu
kip dosyaya "okuma yetkisi verildiini" gsteriyor. Yani eer biz bir dosyay bu kipte aarsak dosya
iine herhangi bir veri girii yapma imkanmz olmaz. Ayrca bu kip yardmyla yeni bir dosya da
oluturamayz. Bu kip bize varolan bir dosyay ama imkan verir. Yani mesela:
ikincidosyam=open("deneme.txt","r")
komutunu verdiimizde eer bilgisayarda "deneme.txt" adl bir dosya yoksa bu adla yeni bir dosya
oluturulmayacak, bunun yerine Python bize hata mesaj gsterecektir.
Eer varolan bir dosyay ap iine yeni veriler yazmak istersek u kipi kullanmamz gerekir:
dosya = open("vicdansiz_sabuha.txt","a")
Ayrca "a" kipi "r" kipinin aksine bize yeni dosya oluturma imkan da verir.
Eer yazdnz kod iinde yukardaki kipten hibirini kullanmazsak, Python ntanml olarak
"r" kipini kullanacaktr. Tabii "r" kipinin yukarda bahsettiimiz zelliinden dolay,
bilgisayarmzda yeni bir dosya oluturmak istiyorsak, kip belirtmemiz, yani "w" veya "a"
kiplerinden birini kullanmamz gerekir...

----------------------------------------------------------------------------------------------------------------------Python Dersleri
80/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Bu arada, yukardaki rneklerde biz dosyamz "mevcut alma dizini" iinde oluturduk. Tabii ki
siz isterseniz tam yolu belirterek, dosyanz istediiniz yerde oluturabilirsiniz. Mesela:
dosya = open ("/home/kullanc_ad/deneme.txt","w")
komutu "/home/kullanc_ad/" dizini altnda, "yazma yetkisi verilmi", "deneme.txt" adl bir dosya
oluturacaktr.
Ayrca sadece ".txt" uzantl dosyalar deil, pek ok farkl dosya tipi de oluturabilirsiniz. Mesela
".odt" uzantl bir dosya oluturarak dosyann OpenOffice ile almasn salayabilirsiniz. Ya da
".html" uzantl bir dosya oluturarak internet taraycnzla alabilecek bir dosya yaratabilirsiniz.
Dosyaya Veri leme
imdi bilgisayarmzda halihazrda varolan veya bizim sonradan yarattmz bir dosyaya nasl
verii girii yapabileceimizi greceiz. Mesela "deneme.odt" adl bir dosya oluturarak iine
"Batsn bu dnya!" yazalm... Ama bu kez komut satrnda deil de metin zerinde yapalm bu
ilemi. Hemen bo bir kwrite belgesi ap iine unlar yazyoruz:
#/usr/bin/env/ python
#-*- coding: iso-8859-9
dosya = open("deneme.odt", "w")
dosya.write("Batsn bu dnya!...")
dosya.close()
lk iki satrn ne olduunu zaten bildiimiz iin geiyoruz... Aynen biraz nce grdmz ekilde
"dosya" adl bir deiken yaratp bu deikenin deeri olarak "open("deneme.odt", "w") satrn
belirledik. Bylelikle "deneme.odt" adnda, "yazma yetkisi verilmi" bir dosya oluturduk. Daha
sonra "dosya.write" fonksiyonu yardmyla "deneme.odt" dosyasnn iine "Batsn bu dnya!..."
yazdk... En son da "dosya.close()" emrini vererek dosyay kapattk. Aslnda GNU/Linux
kullanclar bu son "dosya.close()" satrn yazmasa da olur... Ama zellikle Windows zerinde
alrken, eklemelerin dosyaya ilenebilmesi iin dosyann kapatlmas gerekiyor... Ayrca bir
rivayete gre Python'un ileriki srmlerinde, btn platformlarda bu satr yazmak zorunlu olacak...
O yzden bu satr da yazmak en iyisi...
imdi de yle bir ey yapalm: Biraz nce oluturduumuz ve iine "Batsn bu dnya!..."
yazdmz dosyamza ikinci bir satr ekleyelim..

----------------------------------------------------------------------------------------------------------------------Python Dersleri
81/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

#!/usr/bin/env python
#-*- coding: iso-8859-9
dosya = open("deneme.odt","a")
dosya.write("\nBitsin bu rya...")
dosya.close()
Grdnz gibi bu kez dosyamz "a" kipiyle atk... Zaten "w" kipiyle aarsak eski dosyay
uurmu oluruz... O yzden Python'la programlama yaparken bu tip eylere ok dikkat etmek
gerekir.
Dosyamz "a" kipiyle atktan sonra "dosya.write" fonksiyonu yardmyla "Bitsin bu rya..."
satrn eski dosyaya ekledik. Ama burada dikkat ederseniz, "\n" iaretini kullandk... Bu da daha
nce bahsettiimiz "ka dizileri"nden biridir; dosyaya ekleyeceimiz ifadenin bir alt satra
yazlmasn salar. Eer bunu kullanmazsak eklemek istediimiz satr bir nceki satrn hemen
arkasna getirilecektir. Btn bunlardan sonra da "dosya.close()" fonksiyonu yardmyla dosyamz
kapattk.
Bir de u rnee bakalm:
#!/usr/bin/env python
#-*- coding: iso-8859-9
dosya = open("iir.odt", "w")
dosya.write("Btn gneler batmadan,\nBi trk daha syleyeyim bu yerde\n\t\t\t\t --Orhan
Veli--")
dosya.close()
Grdnz gibi, "iir" adl bir OpenOffice dosyas oluturup bu dosyaya yazma yetkisi verdik. Bu
dosyann iine yazlan verilere dikkat edin. kinci msray bir alt satra almak iin "\n" ifadesini
kullandk. Daha sonra "Orhan Veli" satrn sayfann sana doru kaydrmak iin "\t" ifadesini
kullandk. Bu ifade de tpk "\n" gibi bir "ka dizisi"dir; klavyedeki "tab" tuu gibi, cmleyi saa
kaydrr... Bizim rneimizde "\n" ve "\t" ifadelerini yan yana kullandk. Bylece ayn cmleyi hem
alt satra alm, hem de saa doru kaydrm olduk... Ayrca birka tane "\t" ifadesini yan yana
kullanarak cmleyi sayfann istediimiz noktasna getirdik...
sterseniz yukardaki kodu u ekilde ksaltabilirsiniz de:

----------------------------------------------------------------------------------------------------------------------Python Dersleri
82/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

#!/usr/bin/env python
#-*- coding: iso-8859-9
dosya = open("iir.odt", "w").write("Btn gneler batmadan,\nBi trk daha syleyeyim bu
yerde\n\t\t\t\t
--Orhan Veli--")
Yukardaki "write" fonksiyonu dnda ok yaygn kullanlmayan bir de "writelines" fonksiyonu
vardr. Bu fonksiyon birden fazla satr bir kerede dosyaya ilemek iin kullanlr. yle ki:
#!/usr/bin/env python
#-*- coding: iso-8859-9
dosya = open("iir2.odt", "w")
dosya.writelines(["Bilmezler yalnz yaamayanlar", "\nNasl korku verir sessizlik insana",
"\nnsan nasl konuur kendisiyle","\nNasl koar aynalara bir cana hasret","\nBilmezler..."])
dosya.close()
Burada parantez iindeki keli parantezlere dikkat edin. Aslnda oluturduumuz ey bir liste...
Dolaysyla bu fonksiyon bir listenin ieriini dorudan bir dosyaya yazdrmak iin faydal
olabilir... Ayn kodu "write" fonksiyonuyla yazmaya kalkrsanz alacanz ey bir hata mesaj
olacaktr...
Bir Dosyadan Veri Okuma
imdiye kadar nasl yeni bir dosya oluturacamz, bu dosyaya nasl veri gireceimizi ve bu
dosyay nasl kapatacamz rendik. imdi de yarattmz bir dosyadan nasl veri okuyacamz
reneceiz. Bu i iin de "read()", "readlines()" ve "readline()" fonksiyonlarndan
faydalanacaz.
u rnee bir bakalm:
>>>yeni = open("iir.odt","w")
>>>yeni.write("Sular ekilmeye balad kklerden...\nIsnmaz m acaba ellerimde kan?
\nAh,ne olur! Btn gneler batmadan\nBi trk daha syleyeyim bu yerde...")
>>>yeni.close()
>>>yeni=open("iir.odt")
>>>yeni.read()
'Sular \xc3\xa7ekilmeye ba\xc5\x9flad\xc4\xb1 k\xc3\xb6klerden...\nIs\xc4\xb1nmaz m\xc4\xb1
----------------------------------------------------------------------------------------------------------------------Python Dersleri
83/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

acaba ellerimde kan?


\nAh,ne olur! B\xc3\xbct\xc3\xbcn g\xc3\xbcne\xc5\x9fler batmadan
\nBi t\xc3\xbcrk\xc3\xbc daha s\xc3\xb6yleyeyim bu yerde...'
"yeni.read()" satrna kadar olan ksm zaten biliyoruz... Burada kullandmz "yeni.read()"
fonksiyonu "yeni" adl deikenin ieriini okumamz salyor. "Yeni" adl deikenin deeri
"iir.odt" adl bir dosya olduu iin, bu fonksiyon "iir.odt" adl dosyann ieriini bize
gsterecektir. Grdnz gibi bu komutun ktsnda Trke karakterler bozuk grnyor... Ayrca
kullandmz "\n" ifadesi de ktda yer alyor... Esasnda bu komut bize Python'un yazdmz
kodlar nasl grdn gsteriyor. Eer biz daha dzgn bir kt elde etmek istersek en son
satrdaki komutu u ekilde vermemiz gerekir:
print yeni.read()
Ayrca "read()" dnda bir de "readlines()" adl bir fonksiyon bulunur. Eer yukardaki komutu
yeni.readlines()
eklinde verecek olursak, ktnn bir liste olduunu grrz.
Bir de, eer bu "readlines" fonksiyonunun sonundaki "s" harfini atp;
yeni.readline()
eklinde bir kod yazarsak, dosya ieriinin yalnzca ilk satr okunacaktr. Python'un "readline()"
fonksiyonunu deerlendirirken kulland lt udur: "Dosyann bandan itibaren ilk '\n' ifadesini
grdn yere kadar oku".
Bunlarn dnda, eer istersek bir "for" dngs kurarak da dosyamz okuyabiliriz:
yeni = open("iir.odt")
for satir in yeni:
print satir
Dikkat ettiyseniz,
print yeni.readlines()
veya alternatif komutlarla dosya ieriini okurken yle bir ey oluyor:
Mesela iinde
Birinci satr
----------------------------------------------------------------------------------------------------------------------Python Dersleri
84/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

kinci satr
nc satr
yazan bir dosyamz olsun.
dosya.readline()
komutuyla bu dosyann ilk satrn okuyalm. Daha sonra tekrar bu komutu verdiimizde birinci
satrn deil, ikinci satrn okunduunu grrz. nk Python ilk okumadan sonra imleci (Evet,
biz grmesek de aslnda Python'un dosya iinde gezdirdii bir imle var!) dosyada ikinci satrn
bana kaydryor... Eer bir daha verirsek bu komutu, nc satr okunacaktr. Son bir kez daha bu
komutu verirsek, artk dosyann sonuna ulald iin, ekrana hi bir ey yazlmayacaktr. Byle bir
durumda dosyay baa sarmak iin u fonksiyonu kullanyoruz (Dosyamzn adnn "dosya"
olduunu varsayyoruz):
dosya.seek(0)
Bylece imleci tekrar dosyann en bana alm olduk.
Tabii siz isterseniz, bu imleci farkl noktalara da tayabilirsiniz. Mesela:
dosya.seek(10)
komutu imleci 10. karakterin bana getirecektir (Saymaya her zamanki gibi 0'dan balyoruz...)
Bu "seek()" fonksiyonu aslnda iki adet parametre alabiliyor. yle ki:
dosya.seek(5,0)
komutu imleci dosyann bandan itibaren 5. karakterin bulunduu noktaya getirir. Burada "5" says
imlecin kaydrlaca noktay, "0" says ise bu ilemin dosyann bandan sonuna doru olacan,
yani saymaya dosyann bandan balanacan gsteriyor...
dosya.seek(5,1)
komutu imlecin o anda bulunduu konumdan itibaren 5. karakterin olduu yere ilerlemesini salar.
Burada "5" says yine imlecin kaydrlaca noktay, "1" says ise imlecin o anda bulunduu
konumun lt alnacan gsteriyor.
Son olarak;
dosya.seek(-5,2)

----------------------------------------------------------------------------------------------------------------------Python Dersleri
85/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

komutu ise saymaya tersten balanacan, yani dosyann bandan sonuna doru deil de sonundan
bana doru ilerlenerek, imlecin sondan 5. karakterin olduu yere getirileceini gsterir.
Bu ifadeler biraz kark gelmi olabilir. Bu konuyu anlamann en iyi yolu bol bol uygulama
yapmak ve deneyerek grmektir...
sterseniz, yukardaki okuma fonksiyonlarna da belirli parametreler vererek dosya iinde okunacak
satrlar veya karakterleri belirleyebilirsiniz. Mesela:
yeni.readlines(3)
komutu dosya iinde, imlecin o anda bulunduu noktadan itibaren 3. karakterden sonrasn
okuyacaktr.
Peki o anda imlecin hangi noktada olduunu nereden bileceiz? Python'da bu ilem iin de bir
fonksiyon bulunur:
dosya.tell()
komutu yardmyla imlecin o anda hangi noktada bulunduunu grebilirsiniz. Hatta dosyay bir kez
dosya.read()
komutuyla tamamen okuttuktan sonra
dosya.tell()
komutunu verirseniz imle mevcut dosyann en sonuna gelecei iin, ekranda grdnz say ayn
zamanda mevcut dosyadaki karakter saysna eit olacaktr...
Dosyaya Deiken Yazdrma
Python'da dosya ilemleri yaparken bilmemiz gereken en nemli noktalardan biri de udur: "Python
ancak "karakter dizileri"ni (strings) dosyaya yazdrabilir. Saylar yazdramaz. Eer biz saylar da
yazdrmak istiyorsak nce bu saylar "karakter dizisi"ne evirmemiz gerekir. Bir rnek verelim:
>>>x = 50
>>>dosya = open("deneme.txt","w")
>>>dosya.write(x)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: argument 1 must be string or read-only character buffer, not int
----------------------------------------------------------------------------------------------------------------------Python Dersleri
86/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Grdnz gibi Python bize bir hata mesaj gsterdi. nk "x" deikeninin deeri bir "say".
Halbuki "karakter dizisi" olmas gerekiyor. Bu meseleyi zmek iin komutumuzu u ekilde
veriyoruz. En batan alrsak:
>>>x = 50
>>>dosya = open("deneme.txt","w")
>>>dosya.write(str(x))
Burada;
str(x)
komutuyla, bir say olan "x" deikenini "karakter dizisi"ne evirdik. Tabii ki bu ilemin tersi de
mmkn. Eer "x" bir karakter dizisi olsayd, u komutla onu sayya evirebilirdik:
int(x)
Dosya Silme
Peki yarattmz bu dosyalar nasl sileceiz? Python'da herhangi bir ekilde oluturduumuz bir
dosyay silmenin en kestirme yolu udur:
import os
os.remove("dosya/yolu")
Mesela, masastndeki "deneme.txt" dosyasn yle siliyoruz:
import os
os.remove("/home/kullanc_ad/Desktop/deneme.txt")
Eer masast zaten sizin mevcut alma dizininiz ise bu ilem ok daha basittir:
import os
os.remove("deneme.txt")

Dosyann Herhangi Bir Yerine Satr Ekleme


imdiye kadar hep dosya sonuna satr ekledik. Peki ya bir dosyann ortasna bir yere satr eklemek
istersek ne yapacaz?
imdi:
----------------------------------------------------------------------------------------------------------------------Python Dersleri
87/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Diyelim ki elimizde "deneme.txt" adl bir dosya var ve iinde unlar yazl:
Birinci Satr
kinci Satr
nc Satr
Drdnc Satr
Beinci Satr
Biz burada "kinci Satr" ile "nc Satr" arasna "Merhaba Python!" yazmak istiyoruz. nce bu
"deneme.txt" adl dosyay aalm:
>>>kaynak = open("deneme.txt")
Bu dosyay "okuma" kipinde atk, nk bu dosyaya herhangi bir yazma ilemi yapmayacaz.
Yapacamz ey, bu dosyadan veri okuyup baka bir hedef dosyaya yazmak olacak... O yzden
hemen bu hedef dosyamz oluturalm:
>>>hedef = open("test.txt","w")
Bu dosyay ise "yazma" modunda atk... nk kaynak dosyadan okuduumuz verileri buraya
yazdracaz.
imdi de, yapacamz "okuma ilemi"ni tanmlayalm:
>>>oku = kaynak.readlines()
Bylece "kaynak" dosya zerinde yapacamz satr okuma ilemini de tanmlam olduk...
imdi kaynak dosyadaki "birinci satr" ve "ikinci satr" verilerini alp hedef dosyaya yazdryoruz.
Bu i iin bir "for" dngs oluturacaz:
for satirlar in oku[:2]:
hedef.write(satirlar)
Burada biraz nce oluturduumuz "okuma ilemi" deikeni yardmyla "0" ve "1" no'lu satrlar
alp hedef adl dosyaya yazdrdk...
imdi eklemek istediimiz satr olan "Merhaba Python!" satrn ekleyeceiz:
hedef.write("Merhaba Python!\n")
Sra geldi kaynak dosyada kalan satrlar hedef dosyasna eklemeye...
for satirlar in oku[2:]:
----------------------------------------------------------------------------------------------------------------------Python Dersleri
88/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

hedef.write(satirlar)
Artk iimiz bittiine gre hedef ve kaynak dosyalar kapatalm:
>>>kaynak.close()
>>>hedef.close()
Bu noktadan sonra eer istersek kaynak dosyay silip adn da hedef dosyann adyla deitirebiliriz:
>>> os.remove("deneme.txt")
>>> os.rename("test.txt","deneme.txt")
Tabii bu son ilemleri yapmadan nce os modln armay unutmuyoruz...
Hatalarla Baetme
Giri
Programclar bir kod yazarken, yazlan kodlar iletecek kullanclar her zaman gz nnde
bulundurmal, program altrlrken kullanclarn ne gibi hatalar yapabileceklerini kestirmeye
almaldr. nk kullanclar her zaman programcnn istedii gibi davranmayabilir. Bu szleri
basit bir rnekle aklayalm. Diyelim ki bir kod yazdk ve kullancdan bir say girmesini istiyoruz.
Eer kullanc gerekten bir say girerse sorun yok, ancak tabii ki kullanclarn her zaman uslu uslu
say girmesini bekleyemeyiz ve beklememeliyiz. nk siz her ne kadar ak ak say girilmesini
isteseniz de kullanc bilerek veya bilmeyerek say yerine baka deerler de girebilir. Hatta hi bir
giri yapmadan "enter" tuuna bile basabilir. Yazdmz bu kodun, ok uzun bir programn paras
olduunu dnrsek, kullancnn yanl veri girii koskoca bir programn kmesine veya
durmasna yol aabilir. Bu tr durumlarda Python gerekli hata mesajn ekrana yazdrarak
kullancy uyaracaktr, ama tabii ki Python'un sunduu karmak hata mesajlarn kullancnn
anlamasn bekleyemeyiz.
Bylesi durumlar iin Python'da "try... except" ifadeleri kullanlr. te biz de bu blmde bu tr
ifadelerin ne zaman ve nasl kullanlacan anlamaya alacaz.

----------------------------------------------------------------------------------------------------------------------Python Dersleri
89/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Deiken smine likin Hatalar (NameError)


u rnee bir bakalm:
#!/usr/bin/env python
#-*- coding: utf-8 -*while True:
soru1 = input("Ltfen toplama ilemi iin bir say giriniz: ")
soru2 = input("Ltfen toplama ilemi iin ikinci sayy giriniz: ")
print soru1 + soru2
Eer iyi huylu bir kullancya denk gelirsek ne l... Sevgili kullancmz uslu uslu iki adet say
girecek, programmz da mutlu mesut bir ekilde bu iki sayy toplayp kibarca kullancya
bildirecektir... Ama ne yazk ki iler her zaman byle yrmez... Kullancmz program
altrdktan sonra bir say yerine bir harf girmeyi de tercih edebilir. Byle bir durumda ise
kullanc u hatay alr. (Diyelim ki kullanc "e" harfine basm olsun):
Traceback (most recent call last):
File "deneme.py", line 4, in ?
soru1 = input("Ltfen toplama ilemi iin bir say giriniz: ")
File "<string>", line 0, in ?
NameError: name 'e' is not defined
te bu noktadan sonra kullanc, program yazarnn kulaklarn nlatmaya balayacak, "Ne biim
program bu. Hemen kyor," diye szlanacaktr. Geri ald hata mesaj sorunun nerede olduunu
sylyor, ama tabii ki anlayana... Sizin bu noktada iyi bir programc olarak yapmanz gereken ey,
kullancnn hareketlerini nceden kestirip, onun alaca hata mesajlarn anlalr hale getirmek
olacaktr.
imdi ortaya kan hata mesajna bir bakalm. Bu mesajda nemli ksm "NameError: name 'e' is not
defined" yazan yer... Demek ki Python, kullancnn girdii "e" harfini deiken olarak alglam,
tabii ki ortada tanmlanm bir "e" deikeni olmad iin de byle bir hata mesaj vermi... Bu
sorunu u ekilde giderebiliriz:
#!/usr/bin/env python
#-*- coding: utf-8 -*while True:

----------------------------------------------------------------------------------------------------------------------Python Dersleri
90/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

try:
soru1 = input("Ltfen toplama ilemi iin bir say giriniz: ")
soru2 = input("Ltfen toplama ilemi iin ikinci sayy giriniz: ")
print soru1 + soru2
except NameError:
print "Say dedik sana! Harf deil! Tekrar dene..."
Artk kullanc say yerine harf girdiinde, programmz kmeyecek, say girmesi konusunda
kullancy nazike uyararak almaya devam edecektir.
sterseniz burada yaptmz eyi biraz aklayalm.. Aslnda yaptmz ey, yazdmz ilk kodlar
bir "try... except..." blou iine almaktan ibaret. Yazdmz bu kod ile Python'a kendi anlayaca
dilden yle demi olduk:
"Eer programn altrlmas srasnda deiken ismine ilikin bir hatayla karlarsan bu hatay
sineye ek ve ekrana, 'Say dedik sana!...' cmlesini yazdrp yoluna devam et..."
Biz yukardaki kodla kullanclarn yapabilecei bir hata tryle baetmi olduk, ama emin olun
kullanclar ok daha baka, ok daha karmak hatalar da yapabilirler...
Szdizimine likin Hatalar (SyntaxError)
Dediimiz gibi, kullanclarn yapabilecei hatalarn snr, hududu yok... Mesela yukardaki kodu
altran bir baka kullanc sadece say girmek yerine, nce bir say girip, "enter"e basmadan bir
tane de harf girmeyi uygun grebilir... Yani "3g" gibi bir ey yazabilir... O zaman da yle bir hata
alr:
Traceback (most recent call last):
File "deneme.py", line 5, in ?
soru1 = input("Ltfen toplama ilemi iin bir say giriniz: ")
File "<string>", line 1
3g
^
SyntaxError: unexpected EOF while parsing
Burada da nemli ksm, "SyntaxError: unexpected EOF while parsing"... Buradan anladmza
gre, Python bir "szdizimi hatas" vermi... Bu hatay da kodumuza u ekilde ekleyebiliriz:

----------------------------------------------------------------------------------------------------------------------Python Dersleri
91/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

#!/usr/bin/env python
#-*- coding: utf-8 -*while True:
try:
soru1 = input("Ltfen toplama ilemi iin bir say giriniz: ")
soru2 = input("Ltfen toplama ilemi iin ikinci sayy giriniz: ")
print soru1 + soru2
except NameError:
print "Say dedik sana! Harf deil! Tekrar dene..."
except SyntaxError:
print "Yazm hatas yaptnz! Ltfen bir daha deneyin..."
Bylelikle kullancdan kaynaklanabilecek iki hata trn ngrp her biri iin ayr uyar
verebiliyoruz.
Hata Kodu Vermeden Hata Yakalama
Tabii ki bir kullancnn yol acabilecei btn hatalar kestirmek mmkn deildir. O yzden, eer
hataya ynelik zel bir mesaj gstermek gibi bir kaygmz yoksa olas btn hatalar iin u kalb
kullanabiliriz:
try:
.....
except:
.....
Hemen bir rnek verelim:
try:
dosya = open("deneme.txt","r")
except:
print "dosya alamyor"
print 2 + 2
Grdnz gibi burada herhangi bir hata kodu belirtmedik. Ama olas bir hatay yakaladmz
iin programmz kmedi ve bir sonraki kod olan "print 2+2" ilemi yapld. sterseniz ayn kodu

----------------------------------------------------------------------------------------------------------------------Python Dersleri
92/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

bir de "try...except..." blou olmadan deneyelim:


dosya = open("deneme.txt","r")
print 2 + 2
Burada ise, herhangi bir hata yakalama ilemi yapmadmz iin programmz kt ve ikinci kod
olan "print 2 + 2" iletilemedi...
Yukarda anlattmz, "hata kodu vermeden hata yakalama ilemi" pratik ve kolay olsa bile her
zaman tercih edilmeyebilir. nk bu ekilde kullancya yapt hatayla ilgili bilgi veremiyoruz.
Dolaysyla bu kodlar ieren bir program altran kullanc ortada bir hata olduunu anlayacak,
ama hatann nereden kaynaklandn bilemeyecektir. nk yukarda, "dosya alamyor" diye bir
hata belirttik ama hata kodu yazmadmz iin bu dosyann neden alamadn belirtemedik...
Zira yukardaki kodda dosyann alamamasnn birka nedeni olabilir. Ama eer kodumuzu yle
verirsek en azndan kullancnn baz nlemler almasn salayabiliriz.. Yukardaki kodu
altrdmzda yle bir hata almtk:
Traceback (most recent call last):
File "deneme.py", line 3, in ?
dosya = open("deneme.txt","r")
IOError: [Errno 2] No such file or directory: 'deneme.txt'
imdi hatay tespit ettiimize gre u kodu yazabiliriz:
try:
dosya = open("deneme.txt","r")
except IOError:
print "'deneme.txt' adl dosya bulunamad. Ltfen klasrde bu adda bir dosya olduundan emin
olunuz."
print 2 + 2
Bylelikle kullancya daha aklayc bir bilgi vermi olduk. Artk kullanc hatann ne olduunu
bildii iin buna kar nlem de alabilir. Bir de, yukarda grnen hata mesajnda dikkat ederseniz
[Errno 2] diye bir ifade geiyor. Bunun ne olduunu anlamak iin u rnei verelim:
dosya = open("/usr/bin/deneme.txt","w")
Bu kodu altrdmzda u hatay alrz:

----------------------------------------------------------------------------------------------------------------------Python Dersleri
93/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Traceback (most recent call last):


File "deneme.py", line 3, in ?
dosya = open("/usr/bin/deneme.txt", "w")
IOError: [Errno 13] Permission denied: '/usr/bin/deneme.txt'
Grdnz gibi burada da "IOError" adl hata veriliyor, ama bu kez hata kodu [Errno 13].
Eer istersek, biz her iki hata kodu iin ayr mesajlar verebiliriz kullancya:
try:
dosya = open("/usr/bin/deneme.txt","r")
except IOError, (hatakodu, hataadi):
if hatakodu = = 2:
print "Byle bir dosya yok"
if hatakodu = = 13:
print "Bu dosyay okuma yetkiniz yok"
Burada dikkat ederseniz (hatakodu, hataadi) adnda iki adet parametre oluturduk. Bu isimleri tabii
ki siz kendinize gre de belirleyebilirsiniz. nemli olan, parantez iinde iki ayr parametre olmas...
Daha sonra da "if ifadeleri" yardmyla her iki koul iin ekrana yazdrlacak ktlar belirledik...
Hatalarla Baetmede "pass" fadesi"
Bazen yazdnz program hata verse bile siz kullancya herhangi bir hata mesaj gstermek
istemeyebilirsiniz. Byle bir durumda kullancnn sebep olduu hata sessizce geitirilecek,
programnz almaya devam edecektir.
Bir rnek verelim:
#!/usr/bin/env python
#-*- coding: utf-8 -*liste = ["elma", "armut", "karpuz", "kavun", "erik", "zm", "eftali", "muz"]
while True:
try:
s = raw_input("Ltfen bir meyve ad syleyiniz: ")
p = liste.index(s) + 1
print s, "listemizde", p, "no'lu srada bulunuyor"

----------------------------------------------------------------------------------------------------------------------Python Dersleri
94/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

except ValueError:
pass
Burada ncelikle, ieriinde baz meyveler olan bir liste yarattk. Ardndan da kullanclardan, "bir
meyve ad sylemelerini" istedik. Daha nceki blmlerden hatrlayacanz "liste.index()"
fonksiyonunu kullanarak kullancnn girdii meyve adnn listede kanc srada olduunu
sorguladk. Bildiiniz gibi Python'da liste eleri sralanrken hep sfrdan balanyor... Python'un
kendi i yaps asndan bu durum mantkl olabilir, ama insanlar saymaya bir'den balamay daha
mantkl bulacaklar iin biz kodumuza "+1" deerini ekleyerek Python'un listedeki eleri
sralamaya 0'dan deil de 1'den balamasn saladk. Bunun ardndan da, kullancnn girdii
deerin listede kanc srada olduunu ekrana yazdrdk. Tabii ki kullanc isim girerken, listede
olmayan bir eyi de syleyebilir. Byle bir durumda programmzn bu hatay sessiz sedasz
geitirmesi iin de "pass" ifadesini kullandk. Eer "try...except..." yapsn kullanmasaydk ne
olacan biliyorsunuz:
Traceback (most recent call last):
File "deneme.py", line 8, in ?
p = liste.index(s) + 1
ValueError: list.index(x): x not in list
Grdnz gibi, kullanc asndan tamamen anlamsz bir kelime yn kyor ortaya... stelik
programmz da bu noktada ilevini kaybedip kyor...
Karakter Dizilerinin Metotlar
Giri
Bu blmde, Python'daki karakter dizilerinin (strings) sahip olduklar "metot"lardan sz edeceiz.
Metotlar; Python'da bir karakter dizisinin, bir saynn, bir listenin veya szln niteliklerini
kolaylkla deitirmemizi veya bu veritiplerine yeni zellikler katmamz salayan kk
"paracklar"dr. Aslnda bu metotlar daha nceki derslerimizde de grmtk. rnein listeler
konusunu ilerken szn ettiimiz "paracklar" aslnda bu blmde bahsedeceimiz metotlara
birer rnek oluturur. Yani rnein, daha nce "append parac" olarak bahsettiimiz e,
listelerin bir metodudur. Artk Python'da yeterince ilerleme saladmza gre, daha nce kafa
kartrc olmamas iin kullanmaktan kandmz terimleri bundan sonra rahatlkla kullanabilir,

----------------------------------------------------------------------------------------------------------------------Python Dersleri
95/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

bunlar hakiki ekilleriyle renmeye giriebilir ve dolaysyla Python'un terim havuzunda gnl
rahatlyla kula atabiliriz...
Szn z, bu blmde nceden de aina olduumuz bir kavramn, yani metotlarn, karakter dizileri
zerindeki yansmalarn izleyeceiz. nceki yazlarmzda ilediimiz listeler ve szlkler
konusundan hatrlayacanz gibi, Python'da metotlar genel olarak u ablona sahip oluyorlar:
veritipi.metot
Dolaysyla Python'da metotlar gsterirken "noktal bir gsterme biiminden"den sz ediyoruz.
Daha nce szn ettiimiz "append" metodu da dikkat ederseniz bu ablona uyuyordu. Hemen bir
rnek hatrlayalm:
liste = ["elma", "armut", "karpuz"]
liste.append("kebap")
liste
["elma", "armut", "karpuz", "kebap"]
Grdnz gibi, noktal gsterme biimini uygulayarak kullandmz "append" metodu
yardmyla listemize yeni bir e ekledik.
te bu yazmzda, yukarda ksaca deindiimiz metotlar karakter dizilerine uygulayacaz.
Kullanlabilir Metotlar Listelemek
Dediimiz gibi, bu yazda karakter dizilerinin metotlarn inceleyeceiz. u halde isterseniz gelin
Python'un bize hangi metotlar sunduunu topluca grelim.
Mevcut metotlar listelemek iin birka farkl yntemden faydalanabiliriz. Bunlardan ilki yle
olabilir:
dir(str)
Burada dir() fonksiyonuna parametre (argman) olarak "str" adn geiyoruz. "str", ngilizce'de
karakter dizisi anlamna gelen "string" kelimesinin ksaltmas oluyor. Yeri gelmiken syleyelim:
Eer karakter dizileri yerine listelerin metotlarn listelemek isterseniz kullanacanz biim u
olacaktr:
dir(list)

----------------------------------------------------------------------------------------------------------------------Python Dersleri
96/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Szlklerin metotlarn listelemek isteyen arkadalarmz ise u ifadeyi kullanacaktr:


dir(dict)
Ama bizim u anda ilgilendiimiz konu karakter dizileri olduu iin derhal konumuza dnyoruz.
dir(str) fonksiyonu dnda, karakter dizilerini listemek iin u yntemden de yararlanabiliriz:
dir("")
Akas benim en ok tercih ettiim yntem de budur. Zira kullanlabilecek yntemler iinde en
pratik ve kolay olan bana buymu gibi geliyor!.. Burada grdnz gibi, dir() fonksiyonuna
parametre olarak bo bir karakter dizisi veriyoruz. Biliyorsunuz, Python'da karakter dizileri trnak
iaretleri yardmyla teki veritiplerinden ayrlyor. Dolaysyla ii bo dahi olsa, yan yana gelmi
iki adet trnak iareti, bir karakter dizisi oluturmak iin geerli ve yeterli art yerine getirmi
oluyor. sterseniz bunu bir de type() fonksiyonunu kullanarak test edelim (Bu fonksiyonu nceki
yazlarmzdan hatrlyor olmalsnz):
a= ""
type(a)
<type 'str'>
Demek ki gerekten de bir karakter dizisi oluturmuuz. u halde emin admlarla yolumuza devam
edebiliriz.
Karakter dizisi metotlarn listelemek iin kullanabileceimiz bir baka yntem de dir() fonksiyonu
iine parametre olarak dorudan bir karakter dizisi vermektir. Bu yntem, teki yntemler iinde en
makul yntem olmasa da, en fazla kodlama gerektiren yntem olmas asndan parmak andrmak
iin iyi bir yntem saylabilir:
dir("herhangibirkelime")
Dediim gibi, fonksiyon iinde dorudan bir karakter dizisi vermenin bir anlam yoktur. Ama
Python yine de sizi krmayacak ve teki yntemler yardmyla da elde edebileceiniz u kty
ekrana dkecektir:
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__ge__', '__getattribute__',
'__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__',
'__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__rmod__', '__rmul__', '__setattr__', '__str__', 'capitalize', 'center', 'count', 'decode', 'encode',
'endswith', 'expandtabs', 'find', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle',
'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit',
----------------------------------------------------------------------------------------------------------------------Python Dersleri
97/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
Grdnz gibi, Python'da karakter dizilerinin bir hayli metodu varm... Eer bu listeleme biimi
gznze biraz kark grndyse, elbette kty istediiniz gibi biimlendirmek sizin elinizde:
Mesela nceki bilgilerinizi de kullanp yle bir ey yaparak kty biraz daha okunakl hale
getirebilirsiniz:
for i in dir(""):
print i
Hatta ka adet metot olduunu da merak ediyorsanz yle bir yol izleyebilirsiniz. ("Elle tek tek
sayarm," diyenlere teessflerimi iletiyorum...)
print len(dir(""))
imdi sra geldi bu metotlar tek tek incelemeye... Yalnz ncelikle unu syleyelim: Bu blmde
"__xxx__" eklinde listelenmi metotlar incelemeyeceiz. Karakter dizisi metotlar dendii zaman
temel olarak anlalmas gereken ey, dir("") fonksiyonu ile listelenen metotlar arasnda "__xxx__"
eklinde GSTERLMEYEN metotlardr. "__xxx__" eklinde gsterilenler "zel metotlar" olarak
adlandrlyorlar ve bunlarn, bu yaznn kapsamna girmeyen, farkl kullanm alanlar var.
Bunu da syledikten sonra artk asl konumuza dnebiliriz:
capitalize metodu
Bu metot yardmyla karakter dizilerinin ilk harflerini bytmemiz mmkn oluyor. rnein:
"adana".capitalize()
Adana
Ya da deikenler yardmyla:
a = adana
a.capitalize()
Adana
Yalnz dikkat etmemiz gereken bir nokta var: Bu metot yardmyla birden fazla kelime ieren
karakter dizilerinin sadece ilk kelimesinin ilk harfini bytebiliyoruz:
a = "ltfen parolanz giriniz"
a.capitalize()
----------------------------------------------------------------------------------------------------------------------Python Dersleri
98/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Tabii, burada karakter dizimiz Trke harfler ierdii iin komutu print ile birlikte vermemiz daha
uygun olabilir:
print a.capitalize()
Bir rnek:
a = ["elma","armut","kebap","salata"]
for i in a:
print i.capitalize()
Elma
Armut
Kebap
Salata
upper metodu
Bu metot yardmyla tamam kk harflerden oluan bir karakter dizisinin btn harflerini
bytebiliyoruz:
"enflasyon".upper()
ENFLASYON
Yalnz bu metodun Trke karakterlerle ufak bir sorunu var. Yani bu metot, "" gibi Trke
karakterleri dorudan bytemiyor:
"eker".upper()
'\xc5\x9fEKER'
Burada u komut da ie yaramayacaktr:
print "eker".upper()
EKER
Bu metodun Trke karakterleri de bytebilmesi iin ufak bir ilem yapmamz gerekiyor.
ncelikle Python'un "locale" adl modln ie aktaryoruz (import). Ondan sonra da dil
ayarlarnda kk bir dzenlemeye gidiyoruz:
import locale
locale.setlocale(locale.LC_ALL,"")
Ardndan u komutu veriyoruz:
print u"eker".upper()
EKER
----------------------------------------------------------------------------------------------------------------------Python Dersleri
99/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Bu ekilde Trke karakter sorunumuzu halletmi olduk. Dikkat ederseniz, "eker" karakter
dizisinin bana "u" harfi koyduk. Bu Python'da "unicode" adl bir veritipine iaret ediyor. "unicode"
veritipini ilerleyen derslerimizde daha ayrntl olarak inceleyeceiz. imdilik, karakter dizilerinin
bana "u" harfi getirerek bunlar "unicode" adl bir veritipine dntrdmz bilmemiz yeterli
olacaktr. Ufak bir test yapalm:
a = "eker"
type(a)
<type 'str'>
b = u"eker"
type(b)
<type 'unicode'>
Bu test sayesinde tip farklln aka grebiliyoruz.

Yukardaki rnekte de grld gibi, baz durumlarda Trke karakterleri grntleyebilmek iin,
karakter dizilerini "unicode"ye dntrmemiz gerekiyor.

Birka rnek daha yapalm:


kelime = "usturupsuz"
kelime.upper()
USTURUPSUZ
kelime = u"trke szckler" #kelime deikenini "unicode" olarak tanmladmza dikkat edin.
kelime.upper()
TRKE SZCKLER
Burada yle bir hatrlatma yapalm: Eer komutlarmz Python komut satrndan (etkileimli
kabuk) veriyorsak, Trke karakterleri dzgn grntleyebilmek iin her oturumda sadece bir kez
u komutu vermemiz gerekiyor:
import locale
locale.setlocale(locale.LC_ALL,"")
Dediimiz gibi, bu komutu bir kez verdikten sonra, ayn oturum iinde bir daha bu komutu vermeye
gerek kalmadan ilemlerimizi yapabiliriz.
----------------------------------------------------------------------------------------------------------------------Python Dersleri
100/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

lower metodu
Bu metot "upper" metodunun yapt iin tam tersini yapyor. Yani byk harflerden oluan karakter
dizilerini kk harfli karakter dizilerine dntryor:
a = "ARMUT"
a.lower()
armut
Tpk upper metodunda olduu gibi burada da Trke karakterleri dzgn grntleyebilmek iin
bir kereliine u ilemi yapmamz gerekiyor:
import locale
locale.setlocale(locale.LC_ALL,"")
Ancak unu unutmayn, eer o anda ak olan komut satr oturumunda bu komutu nceden zaten
bir kez vermiseniz, o oturum boyunca bir daha bu komutu vermenize gerek yok.
imdi karakter dizimizi "unicode" olarak tanmlyoruz:
b = u"TRKE"
Artk metodumuzu kullanabiliriz:
print b.lower()
trke
swapcase metodu
Bu metot da karakter dizilerindeki harflerin bykl/kkl ile ilgilidir. Metodumuz bize, bir
karakter dizisinin o anda sahip olduu harflerin byklk ve kklk zellikleri arasnda gei
yapma imkan salyor. Yani, eer o anda bir harf bykse, bu metodu kullandmzda o harf
klyor; eer bu harf o anda kkse, bu metot o harfi byk harfe eviriyor. Grdnz gibi,
bu metodun ne yaptn, anlatarak aklamak zor oluyor. O yzden hemen birka rnek yapalm:
a = "kebap"
a.swapcase()
KEBAP
b = "KEBAP"
b.swapcase()
kebap
----------------------------------------------------------------------------------------------------------------------Python Dersleri
101/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

c = "KeBaP"
c.swapcase()
kEbAp
title metodu
Hatrlarsanz, yukarda bahsettiimiz metotlardan biri olan "capitalize" bir karakter dizisinin
yalnzca ilk harfini bytyordu. Bu "title" metodu ise bir karakter dizisi iindeki btn kelimelerin
ilk harflerini bytyor:
a = u"bin atl aknlarda ocuklar gibi endik. bin yaya dnte ok sinirliydik!"
print a.title()
Bin Atl Aknlarda ocuklar Gibi endik. Bin Yaya Dnte ok Sinirliydik!
Burada karakter dizimizin bana neden bir "u" harfi koyduumuzu artk biliyorsunuz. Tekrar
aklamaya gerek yok. Ayrca bu karakter dizisini yazdrmadan nce, mevcut konsol oturumu iinde
daha nce en az bir kez u komutlarn verilmi olmas gerektiini de biliyoruz:
import locale
locale.setlocale(locale.LC_ALL,"")
center metodu
Bu metot, karakter dizilerinin sanda ve solunda, programcnn belirledii sayda boluk brakarak
karakter dizisini iki yana yaslar:
"a".center(15)
'

'

stersek boluk yerine, kendi belirlediimiz bir karakteri de yerletirebiliriz:


"a".center(3,"#")
'#a#'
Grdnz gibi, parantez iinde belirttiimiz say braklacak boluktan ziyade, bir karakter
dizisinin ne kadar yer kaplayacan gsteriyor. Yani mesela yukardaki rnei gz nne alrsak,
asl karakter dizisi ("a") + 2 adet "#" iareti = 3 adet karakter dizisinin yerletirildiini gryoruz.
Eer karakter dizimiz, tek harf yerine harften olusayd, parantez iinde verdiimiz says hi
bir ie yaramayacakt. Byle bir durumda, "#" iaretini ktda gsterebilmek iin parantez iinde en

----------------------------------------------------------------------------------------------------------------------Python Dersleri
102/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

az 4 saysn kullanmamz gerekirdi.


ljust metodu
Bu metot, karakter dizilerinin sanda boluk brakarak, karakter dizisinin sola yaslanmasn salar:
"a".ljust(15)
'a

'

Tpk center metodunda olduu gibi, bunun parametrelerini de istediimiz gibi dzenleyebiliriz:
"a".ljust(3,"#")
'a##'
rjust metodu
Bu metot ise ljust'un tersidir. Yani karakter dizilerini saa yaslar:
"a".rjust(3,"#")
'##a'
zfill metodu
Yukarda bahsettiimiz ljust, rjust gibi metotlar yardmyla karakter dizilerinin san-solunu
istediimiz karakterlerle doldurabiliyorduk. Bu zfill metodu yardmyla da bir karakter dizisinin
soluna istediimiz sayda "0" yerletirebiliyoruz:
a = "8"
a.zfill(4)
0008
zfill metodunun kullanmyla ilgili yle bir rnek verebiliriz:
import time
while True:
for i in range(21):
time.sleep(1)
print str(i).zfill(2)
while i > 20:
continue
----------------------------------------------------------------------------------------------------------------------Python Dersleri
103/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Bu kodlarla ilgili bir tartma iin Pardus-Linux.Org forumundaki u adresi ziyaret edebilirsiniz:
replace metodu
Python'daki karakter dizisi metotlar iinde belki de en ok iimize yarayacak metotlardan birisi de
bu "replace" metodudur. "replace" kelimesi ngilizce'de "deitirmek, yerine koymak" gibi
anlamlara gelir. Dolaysyla anlamndan da anlalaca gibi bu metot yardmyla bir karakter dizisi
iindeki karakterleri baka karakterlerle deitiriyoruz. Metot u forml zerine iler:
karakter_dizisi.replace("eski_karakter","yeni_karakter")
Hemen bir rnek vererek durumu somutlatralm:
karakter = "Kahramanmaral Abdullah"
print karakter.replace("a","o")
Kohromonmorol Abdulloh
Grdnz gibi, replace metodu yardmyla karakter dizisi iindeki btn "a" harflerini kaldrp
yerlerine "o" harfini koyduk. Burada normalde "print" deyimini kullanmasak da olur, ama karakter
dizisi iinde Trke'ye zg harfler olduu iin, eer "print" deyimini kullanmazsak ktda bu
harfler bozuk grnecektir.
Bu metodu, isterseniz bir karakteri silmek iin de kullanabilirsiniz. O zaman yle bir ey
yapmamz gerekir:
karakter = "Adanal istihza"
karakter_dgs = karakter.replace("a","")
print karakter_dgs
Adnl istihz
Burada bir karakteri silmek iin ii bo bir karakter dizisi oluturduumuza dikkat edin.
replace metodunun, yukardaki formlde belirtmediimiz nc bir parametresi daha vardr.
Dikkat ettiyseniz, yukardaki kod rneklerinde replace metodu karakter dizisi iindeki bir karakteri,
dizi iinde getii her yerde deitiriyordu. Yani rnein "a.replace("b","c")" dediimizde, "a"
deikeninin saklad karakter dizisi iinde ne kadar "b" harfi varsa bunlarn hepsi "c"ye
dnyor. Bahsettiimiz nc parametre yardmyla, karakter dizisi iinde geen harflerin ka
tanesinin deitirileceini belirleyebiliyoruz:
----------------------------------------------------------------------------------------------------------------------Python Dersleri
104/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

karakter = "Adanal istihza"


karakter_dgs = karakter.replace("a","",2)
print karakter_dgs
Adnl istihza
Burada, "Adanal istihza" karakter dizisi iinde geen "a" harflerinden "2" tanesini siliyoruz.
"a" harfi ile "A" harfinin Python'un gznde birbirlerinden farkl iki karakterler olduunu
unutmayn...
startswith metodu
Bu metot yardmyla bir karakter dizisinin belirli bir harf veya karakterle balayp balamadn
denetleyebiliyoruz. rnein:
a = "elma"
a.startswith("e")
True
b = "armut"
a.startswith("c")
False
Grld gibi eer bir karakter dizisi parantez iinde belirtilen harf veya karakterle balyorsa,
yani bir karakter dizisinin ilk harfi veya karakteri parantez iinde belirtilen harf veya karakterse
"doru" anlamna gelen "True" ktsn; aksi halde ise "yanl" anlamna gelen "False" ktsn elde
ediyoruz.
Bu metot sayesinde karakter dizilerini ilk harflerine gre sorgulayp sonuca gre istediimiz
ilemleri yaptrabiliyoruz:
liste = ["elma","erik","ev","elbise","karpuz","armut","kebap"]
for i in liste:
if i.startswith("e"):
i.replace("e","i")
'ilma'
'irik'
----------------------------------------------------------------------------------------------------------------------Python Dersleri
105/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

'iv'
'ilbisi'
Sizin bu metodu kullanarak daha faydal kodlar yazacanza inanyorum...
endswith metodu
Bu metot, yukarda anlattmz startswith metodunun yapt iin tam tersini yapyor. Hatrlarsanz
startswith metodu ile, bir karakter dizisinin hangi harfle baladn denetliyorduk. te bu endswith
metodu ile ise karakter dizisinin hangi harfle bittiini denetleyeceiz. Kullanm startswith
metoduna ok benzer:
a = "elma"
a.endswith("a")
True
b = "armut"
a.endswith("a")
False
Bu metot yardmyla, cmle sonlarnda bulunan istemediiniz karakterleri ayklayabilirsiniz:
kd1 = "ekmek elden su glden!"
kd2 = "sakla saman gelir zaman!"
kd3 = "karga karga gak dedi..."
kd4 = "Vay vicdanszlar..."
for i in kd1,kd2,kd3,kd4:
if i.endswith("!"):
print i.replace("!","")
ekmek elden su glden
sakla saman gelir zaman
count metodu
"count" metodu bize bir karakter dizisi iinde bir karakterden ka adet bulunduunu denetleme
----------------------------------------------------------------------------------------------------------------------Python Dersleri
106/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

imkan verecek. Laf uzatmadan bir rnek verelim:


besiktas = "Sinan Paa Pasaj"
besiktas.count("a")
5
Demek ki "Sinan Paa Pasaj" karakter dizisi iinde 5 adet "a" harfi varm...
imdi bu metodun nerelerde kullanlabileceine ilikin bir rnek verelim. Bu rnekteki baz
noktalar henz derslerimizde ilemedik. Dolaysyla baz ksmlar anlayamazsanz dert etmeyin,
zira ilerde bu konularn hepsine deineceiz. imdilik aadaki kodun anlayabildiimiz ksmn
anlamaya alp, koddan elde ettiimiz sonuca odaklanalm. Aadaki almay komut satrna
deil, bir metin dzenleyici yardmyla dosyaya yazyoruz:
#-*-coding:utf8-*#Trke karakterlerin dzgn grntlenebilmesi iin u iki satr ekleyelim...
import locale
locale.setlocale(locale.LC_ALL,"")
while True:
soru = raw_input("Bir karakter dizisi giriniz: ").replace(" ","") #replace metodu,
karakterlerdeki boluklar silmemizi salyor.
karakter = list(unicode(soru)) #unicode'nin deikenlerle birlikte kullanmna dikkat edin
liste = [i for i in karakter if karakter.count(i) > 1] #burada "liste reteleri"nden
faydalanyoruz. Bu konuya ilerde deineceiz.
ortak = set(karakter) | set(liste) #Python'daki "set" fonksiyonu bize ksayoldan kme
ilemleri yapma imkan salyor.
for i in ortak:
print "%s harfinden = => %s tane"%(i, karakter.count(i))
Yukardaki almada kullancdan herhangi bir karakter dizisi girmesini istiyoruz. Kodlarmz bize,
kullancnn girdii karakter dizisi iinde her bir harften ka tane olduunu sylyor.
isalpha metodu
Bu metot yardmyla bir karakter dizisinin "alfabetik" olup olmadn denetleyeceiz. Peki
"alfabetik" ne demektir? Eer bir karakter dizisi iinde yalnzca alfabe harfleri (a, b, c gibi...) varsa

----------------------------------------------------------------------------------------------------------------------Python Dersleri
107/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

o karakter dizisi iin "alfabetik" diyoruz. Bir rnekle bunu dorulayalm:


a = "kezban"
a.isalpha()
True
Ama:
b = "k3zb6n"
b.isalpha()
False
isdigit metodu
Bu metot da isalpha metoduna benzer. Bunun yardmyla bir karakter dizisinin "saysal" olup
olmadn denetleyebiliriz. Saylardan oluan karakter dizilerine "say karakter dizileri" ad verilir.
rnein u bir "say karakter dizisi"dir:
a = "12345"
Metodumuz yardmyla bunu dorulayabiliriz:
a.isdigit()
True
Ama u karakter dizisi saysal deildir:
b = "123445b"
Hemen kontrol edelim:
b.isdigit()
False
isalnum metodu
Bu metot, bir karakter dizisinin "alfanmerik" olup olmadn denetlememizi salar. Peki
"alfanmerik" nedir?
Daha nce bahsettiimiz metotlardan hatrlayacaksnz:

----------------------------------------------------------------------------------------------------------------------Python Dersleri
108/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

"Alfabetik" karakter dizileri, alfabe harflerinden oluan karakter dizileridir.


"Saysal" karakter dizileri, saylardan oluan karakter dizileridir.
"Alfanmerik" karakter dizileri ise bunun birleimidir. Yani say ve harflerden oluan karakter
dizilerine alfanmerik karakter dizileri ad verilir. rnein u karakter dizisi alfanmerik bir
karakter dizisidir:
a = "123abc"
sterseniz hemen bu yeni metodumuz yardmyla bunu dorulayalm:
a.isalnum()
True
Eer denetleme sonucunda "True" alyorsak, o karakter dizisi alfanmeriktir. Bir de una bakalm:
b = "123abc>"
b.isalnum()
False
b deikeninin tuttuu karakter dizisinde alfanmerik karakterlerin yansra ("123abc"), alfanmerik
olmayan bir karakter dizisi de bulunduu iin (">"), b.isalnum() eklinde gsterdiimiz
denetlemenin sonucu "False" (yanl) olarak grnecektir.
Dolaysyla, bir karakter dizisi iinde en az bir adet alfanmerik olmayan bir karakter dizisi
bulunursa (bizim rneimizde "<"), o karakter dizisi alfanmerik olmayacaktr.
islower metodu
Bu metot, bize bir karakter dizisinin tamamnn kk harflerden oluup olumadn denetleme
imkan salayacak. Mesela:

kent = "istanbul"
kent.islower()
True
----------------------------------------------------------------------------------------------------------------------Python Dersleri
109/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Demek ki "kent" deikeninin deeri olan karakter dizisi tamamen kk harflerden oluuyormu.
Aadaki rnekler ise "False" (yanl) kts verecektir:
a = "stanbul"
a.lower()
False
b = "ADANA"
b.lower()
False
isupper metodu
Bu metot da islower metoduna benzer bir ekilde, karakter dizilerinin tamamnn byk harflerden
oluup olumadn denetlememizi salayacak:
a = "ADANA"
a.isupper()
True
istitle metodu
Daha nce rendiimiz metotlar arasnda "title" adl bir metot vard. Bu metot yardmyla tamam
kk harflerden oluan bir karakter dizisinin ilk harflerini bytebiliyorduk. te imdi
reneceimiz istitle metodu da bir karakter dizisinin ilk harflerinin byk olup olmadn kontrol
etmemizi salayacak:
a = "Karakter Dizisi"
a.istitle()
True

b = "karakter dizisi"
b.istitle()
False

----------------------------------------------------------------------------------------------------------------------Python Dersleri
110/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Grdnz gibi, eer karakter dizisinin ilk harfleri bykse bu metot True kts; aksihalde
"False" kts veriyor.
Bir de una bakalm:
c = "Gn Bugndr"
c.istitle()
False
Sizce neden byle oldu? Evet, tahmin ettiiniz gibi, karakter dizisinin iinde Trke'ye zg harfler
olduu iin metodumuz yanl sonu verdi. imdi bunu dzeltmeyi reneceiz. Ama nce
isterseniz Trke karakterlerin bazen nasl sonular dourabileceine bir rnek verelim:
d = "gn bugndr"
print d.title()
GN BugNdR
Grdnz gibi Trke karakterler, "title" metodunun tamamen saptmasna, ksa devre yapmasna
yol at!... Normalde title metodunun ne yapmas gerektiini biliyoruz:
e = "armut bir meyvedir"
e.title()
'Armut Bir Meyvedir'
Yukarda grdmz, Trke karakterler barndran rnekte ise title metodu karakter dizisi
iindeki kimi harfleri bytt, kimi harfleri ise kk brakt!...
Bu durumu nasl dzelteceimizi biliyorsunuz. Her oturumda en az bir kez u komutlar
altrmamz gerekiyor:
import locale
locale.setlocale(locale.LC_ALL,"")
Bu komutlar altrdktan sonra yukarda gsterdiimiz ve hata verdiini grdmz komutlar
tekrar altrmay deneyin. Bu defa metotlarn sorunsuz ilediini greceksiniz. Tabii ki Trke
harfler ieren karakter dizilerimizi "unicode" olarak tanmlamay unutmuyoruz.
isspace metodu
Bu metot ile, bir karakter dizisinin tamamen boluk karakterlerinden oluup olumadn kontrol
----------------------------------------------------------------------------------------------------------------------Python Dersleri
111/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

ediyoruz. Eer bir karakter dizisi tamamen boluk karakterinden oluuyorsa, bu metot True kts
verecektir. Aksi halde, alacamz kt False olacaktr:
a="

"

a.isspace()
True
a = "selam!"
a.isspace()
False
a = ""
a.isspace()
False
Son rnekten de grdmz gibi, bu metodun True kts verebilmesi iin karakter dizisi iinde en
az bir adet boluk karakteri olmas gerekiyor.
expandtabs metodu
Bu metot yardmyla bir karakter dizisi iindeki sekme boluklarn geniletebiliyoruz. rnein:
a = "elma\tbir\tmeyvedir"
print a.expandtabs(10)
elma

bir

meyvedir

find metodu
Bu metot, bir karakterin, karakter dizisi iinde hangi konumda yer aldn sylyor bize:
a = "armut"
a.find("a")
0
Bu metot karakter dizilerini soldan saa doru okur. Dolaysyla eer aradmz karakter birden
fazla sayda bulunuyorsa, ktda yalnzca en soldaki karakter grnecektir:
b = "adana"

----------------------------------------------------------------------------------------------------------------------Python Dersleri
112/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

a.find("a")
0
Grdnz gibi, find metodu yalnzca ilk "a" harfini gsterdi.
Eer aradmz karakter, o karakter dizisi iinde bulunmuyorsa, ktda "-1" sonucu grnecektir:
c = "mersin"
c.find("t")
-1
find metodu bize ayn zamanda bir karakter dizisinin belli noktalarnda arama yapma imkan da
sunar. Bunun iin yle bir szdizimini kullanabiliriz:
"karakter_dizisi".find("aranacak_karakter",balangn_noktas,biti_noktas)
Bir rnek verelim:
a = "adana"
Burada normal bir ekilde "a" harfini arayalm:
a.find("a")
0
Doal olarak find metodu karakter dizisi iinde ilk bulduu "a" harfinin konumunu syleyecektir.
Bizim rneimizde "a" harfi kelimenin banda getii iin ktda "0" ifadesini gryoruz. Demek
ki bu karakter dizisi iinedeki ilk "a" harfi "0'nc" konumdaym.
stersek yle bir arama yntemi de kullanabiliriz:
a.find("a",1,3)
Bu arama yntemi u sonucu verecektir:
2
Bu yntemle, "a" harfini, karakter dizisinin 1 ve 3. konumlarnda aryoruz. Bu biimin ileyii, daha
nceki derslerimizde grdmz dilimleme ilemine benzer:
a[1:3]
"da"
Bununla ilgili kendi kendinize baz denemeler yaparak, ileyii tam anlamyla kavrayabilirsiniz.
----------------------------------------------------------------------------------------------------------------------Python Dersleri
113/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

rfind metodu
Bu metot yukarda anlattmz find metodu ile ayn ii yapar. Tek farkl karakter dizilerini sadan
sola doru okumasdr. Yukardaki find metodu karakter dizilerini soldan saa doru okur... Mesela:
a = "adana"
a.find("a")
0
a.rfind("a")
4
Grdnz gibi, rfind metodu karakter dizisini sadan sola doru okuduu iin ncelikle en
sondaki "a" harfini dndrd.
index metodu
index metodu yukarda anlattmz find metoduna ok benzer. ki metot da ayn ii yapar:
a = "istanbul"
a.index("t")
2
Bu metot da bize, tpk find metodunda olduu gibi, konuma gre arama olana sunar:
b = "kahramanmara"
b.index("a",8,10)
9
Demek ki, "b" deikeninin tuttuu karakter dizisinin 8 ve 10 numaral konumlar arasnda "a" harfi
9. srada yer alyormu....
Peki bu index metodunun find metodundan fark nedir?
Hatrlarsanz find metodu aradmz karakteri bulamad zaman "-1" sonucunu veriyordu. index
metodu ise aranan karakteri bulamad zaman bir hata mesaj gsterir bize. rnein:
c = "istanbul"
c.index("m")
Traceback (most recent call last):
----------------------------------------------------------------------------------------------------------------------Python Dersleri
114/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

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


ValueError: substring not found
rindex metodu
rindex metodu da index metodu ile ayndr. Farklar, rindex metodunun karakter dizisini sadan sola
doru; index metodunun ise soldan saa doru okumasdr:
c = "adana"
c.index("a")
0
c.rindex("a")
4
join metodu
Bu metodu aklamak biraz zor ve kafa kartrc olabilir. O yzden aklama yerine dorudan bir
rnekle, bu metodun ne ie yaradn gstermeye alalm:
yle bir karakter dizimiz olsun:
a = "Linux"
imdi yle bir ilem yapalm:
".".join(a)
Elde edeceimiz kt yle olur:
L.i.n.u.x
Sanrm burada join metodunun ne i yaptn anladnz. "Linux" karakter dizisi iindeki btn
karakterlerin arasna birer tane "." (nokta) koydu. Tabii ki, nokta yerine baka karakterler de
kullanabiliriz:
"*".join(a)
L*i*n*u*x
Dikkat ederseniz join metodunun szdizimi teki metotlarnkinden biraz farkl. join metodunda

----------------------------------------------------------------------------------------------------------------------Python Dersleri
115/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

parantez iine dorudan deikenin kendisi yazdk. Yani a.join("*") gibi bir ey yazmyoruz.
Bu metot yardmyla ayrca listeleri de etkili bir biimde karakter dizisine evirebiliriz. Mesela
elimizde yle bir liste olsun:
a = ["python", "php", "perl", "C++", "Java"]
Bu listenin elerini karakter dizileri halinde ve belli bir lte gre sralamak iin u kodu
kullanyoruz:
"; ".join(a)
python; php; perl; C++; Java
stersek bu kodu bir deiken iinde depolayp kalc hale de getirebiliriz:
b = "; ".join(a)
print b
python; php; perl; C++; Java
En bataki "a" adl liste de bylece bozulmadan kalm olur:
print a
['python', 'php', 'perl', 'C++', 'Java']
translate metodu
Bu metot, karakter dizisi metotlar iindeki en karmak metotlardan birisi olmakla birlikte, zor
ileri halletmekte kullanlabilecek olmas asndan da bir hayli faydal bir metottur.
translate metodu yardmyla mesela ifreli mesajlar zebiliriz!.. Yalnz bu metodu "string"
modlndeki "maketrans" adl fonksiyonla birlikte kullanacaz. Bir rnek verelim:
Elimizde yle bir karakter dizisi olsun:
"tbyksr sn jcho elu gloglu"
Bu ifreli mesaj zmek iin de yle bir ipucumuz var diyelim:
t = => p
s = => o

----------------------------------------------------------------------------------------------------------------------Python Dersleri
116/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

m = => j
Elimizdeki ipucuna gre ifreli mesajdaki "t" harfinin karl "p" olacak. Alfabetik olarak
dnrsek;
"t" harfi, "p" harfine gre, 5 harf geride kalyor (p, r, s, , t)
"s" harfi "o" harfine gre 5 harf geride kalyor (o, , p, r, s)
"j" harfi "m" harfine gre 4 harf geride kalyor (j, k, l, m)
Bu karmn bizi bir yere gtrmeyecei ak. nk harfler arasnda ortak bir iliki bulamadk.
Peki ya alfabedeki Trke karakterleri yok sayarsak? Bir de yle deneyelim:
"t" harfi, "p" harfine gre, 4 harf geride kalyor (p, r, s, t)
"s" harfi "o" harfine gre 4 harf geride kalyor (o, p, r, s)
"j" harfi "m" harfine gre 4 harf geride kalyor (j, k, l, m)
Bylece karakterler arasndaki ilikiyi tespit etmi olduk. imdi hemen bir metin dzenleyici ap
kodlarmz yazmaya balayabiliriz:
#-*-coding:utf8-*Bu satr aklamaya gerek yok. Ne olduunu biliyoruz.
import string
Python modlleri arasndan "string" modln ie aktaryoruz (import)
metin = "tbyksr sn jcho elu gloglu"
ifreli metnimizi bir deikene atayarak sabitliyoruz.
kaynak= "defghijklmnoprstuvyzabc"
hedef = "abcdefghijklmnoprstuvyz"
Burada "kaynak", ifreli metnin yapsn; "hedef" ise alfabenin normal yapsn temsil ediyor.
"kaynak" adl deikende "d" harfinden balamamzn nedeni yukarda kefettiimiz harfler-aras
ilikidir. Dikkat ederseniz, "hedef"teki harfleri, "kaynak"taki harflere gre, her bir harf drt sra
geride kalacak ekilde yazdk. (d -> a, e ->b, gibi...) Dikkat edeceimiz bir baka nokta ise bunlar
yazarken Trke karakter kullanmamamz gerektiidir.
cevir = string.maketrans(kaynak,hedef)
Burada ise, yukarda tanmladmz harf kmeleri arasnda bir evrim ilemi balatabilmek iin
----------------------------------------------------------------------------------------------------------------------Python Dersleri
117/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

"string" modlnn "maketrans" adl fonksiyonundan yararlanyoruz. Bu komut, parantez iinde


gsterdiimiz kaynak deikenini hedef deikenine eviriyor; aslnda bu iki harf kmesi arasnda
bir iliki kuruyor. Bu ilem sonucunda kaynak ve hedef deikenleri arasndaki ilikiyi gsteren bir
forml elde etmi olacaz.
soncevir = metin.translate(cevir)
Bu komut yardmyla, yukarda "cevir" olarak belirlediimiz forml, "metin" adl karakter dizisine
uyguluyoruz.
print soncevir
Bu komutla da son darbeyi vuruyoruz.
imdi bu komutlara topluca bir bakalm:
#-*-coding:utf8-*import string
metin = "tbyksr sn jcho elu gloglu"
kaynak= "defghijklmnoprstuvyzabc"
hedef = "abcdefghijklmnoprstuvyz"
cevir = string.maketrans(kaynak,hedef)
soncevir = metin.translate(cevir)
print soncevir
Bu program komut satrndan altrdnzda ne elde ettiniz?
partition metodu
Bu metot yardmyla bir karakter dizisini belli bir lte gre e blyoruz. rnein:
a = "istanbul"
a.partition("an")
('ist', 'an', 'bul')
Eer partition metoduna parantez iinde verdiimiz lt karakter dizisi iinde bulunmuyorsa u
sonula karlarz:
a = "istanbul"
a.partition("h")
----------------------------------------------------------------------------------------------------------------------Python Dersleri
118/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

('istanbul', '', '')


rpartition metodu
Bu metot da partition metodu ile ayn ii yapar, ama yntemi biraz farkldr. partition metodu
karakter dizilerini soldan saa doru okur. rpartition metodu ise sadan sola doru.. Peki bu
durumun ne gibi bir sonucu vardr? Hemen grelim:
b = "istihza"
b.partition("i")
('', 'i', 'stihza')
Grdnz gibi, partition metodu karakter dizisini ilk "i" harfinden bld. imdi ayn ilemi
rpartition metodu ile yapalm:
b.rpartition("i")
('ist', 'i', 'hza')
rpartition metodu ise, karakter dizisini sadan sola doru okuduu iin ilk "i" harfinden deil, son
"i" harfinden bld karakter dizisini...
partition ve rpartition metotlar, ltn karakter dizisi iinde bulunmad durumlarda da farkl
tepkiler verir:
b.partition("g")
('istihza', '', '')
b.rpartition("g")
('', '', 'istihza')
Grdnz gibi, partition metodu bo karakter dizilerini saa doru yaslarken, rpartition metodu
sola doru yaslad.
strip metodu
Bu metot bir karakter dizisinin banda (solunda) ve sonunda (sanda) yer alan boluk ve yeni satr
(\n) gibi karakterleri siler.
a = " boluk "
a.strip()

----------------------------------------------------------------------------------------------------------------------Python Dersleri
119/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

'boluk'
b = "boluk\n"
b.strip()
'boluk'
rstrip metodu
Bu metot bir karakter dizisinin sadece sonunda (sanda) yer alan boluk ve yeni satr (\n) gibi
karakterleri siler.
a = "boluk "
a.rstrip()
'boluk'
b = "boluk\n"
b.rstrip()
'boluk'
lstrip metodu
Bu metot bir karakter dizisinin sadece banda (solunda) yer alan boluk ve yeni satr (\n) gibi
karakterleri siler.
a = "boluk "
a.rstrip()
'boluk'

b = "boluk\n"
b.rstrip()
'boluk'
splitlines metodu
Bu metot yardmyla, bir karakter dizisini satr kesme noktalarndan blerek, blnen eleri liste
----------------------------------------------------------------------------------------------------------------------Python Dersleri
120/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

haline getirebiliyoruz.
satir = "Adana'nn yollar tatan\nSen kardn beni batan"
print satir.splitlines()
["Adana'nn yollar tatan", 'Sen kardn beni batan']
split metodu
Bu metot biraz join metodunun yapt ii tersine evirmeye benzer. Hatrlarsanz join metodu
yardmyla bir listenin elerini etkili bir ekilde karakter dizisi halinde sralayabiliyorduk:
a = ["Debian", "Pardus", "Ubuntu", "SuSe"]
b = ", ".join(a)
print b
Debian, Pardus, Ubuntu, SuSe
te split metoduyla bu ilemi tersine evirebiliriz:
yeni = b.split(",")
print yeni
['Debian', ' Pardus', ' Ubuntu', ' SuSe']
Bylece her karakter dizisi farkl bir liste esi haline geldi:
yeni[0]
'Debian'
yeni[1]
'Pardus'

yeni[2]
'Ubuntu'
yeni[3]
'SuSe'
Bu metotta ayrca isterseniz ltn yansra ikinci bir parametre daha kullanabilirsiniz:
----------------------------------------------------------------------------------------------------------------------Python Dersleri
121/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

c = b.split(",", 1)
print c
['Debian', ' Pardus, Ubuntu, SuSe']
Grdnz gibi, parantez iinde "," ltnn yanna bir adet "1" says koyduk. kty dikkatle
incelediimizde split metodunun bu parametre yardmyla karakter dizisi iinde sadece bir adet
blme ilemi yaptn gryoruz. Yani oluan listenin bir esi "Debian", teki esi de "Pardus,
Ubuntu, SuSe" oldu. Bunu u ekilde daha ak grebiliriz:
c[0]
'Debian'
c[1]
' Pardus, Ubuntu, SuSe'
Grdnz gibi listenin 0. esi Debian'ken; listenin 1. esi "Pardus, Ubuntu, Suse" ls. Yani
bu l tek bir karakter dizisi eklinde tanmlanm.
Yukarda tanmladmz "yeni" adl listeyle "c" adl listenin uzunluklarn karlatrarak durumu
daha net grebiliriz:
len(yeni)
4
len(c)
2
Parantez iindeki "1" parametresini deitirerek kendi kendine denemeler yapmanz metodu daha
iyi anlamanza yardmc olacaktr.
rsplit metodu
Bu metot yukarda anlattmz split metoduna ok benzer. Hatta tamamen ayn ii yapar. Tek bir
farkla: split metodu karakter dizilerini soldan saa doru okurken; rsplit metodu sadan sola doru
okur. nce yle bir rnek verip bu iki metodun birbirine ne kadar benzediini grelim:
a = "www.python.quotaless.com"
a.split(".")
----------------------------------------------------------------------------------------------------------------------Python Dersleri
122/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

['www', 'python', 'quotaless', 'com']


a.rsplit(".")
['www', 'python', 'quotaless', 'com']
Bu rnekte ikisi arasndaki fark pek belli olmasa da, split metodu soldan saa doru okurken, rsplit
metodu sadan sola doru okuyor. Daha ak bir rnek verelim:
orneksplit = a.split(".", 1)
print orneksplit
['www', 'python.quotaless.com']
ornekrsplit = a.rsplit(".", 1)
print ornekrsplit
['www.python.quotaless', 'com']
Sanrm bu ekilde ikisi arasndaki fark daha belirgin oldu. yle deil diyorsanz bir de una bakn:
orneksplit[0]
'www'
ornekrsplit[0]
'www.python.quotaless'
Bylece Karakter Dizisi Metotlarn bitirmi olduk. Dikkat ederseniz metot listesi iindeki iki
metodu anlatmadk. Bunlar, encode ve decode metotlar... Bunlar "Python'da Unicode" konusunu
ilerken anlatmak zere imdilik bir kenara brakyoruz.
Bu konuyu iyice sindirebilmek iin kendi kendinize bolca rnek ve denemeler yapmanz, bu
konuyu arada srada tekrar etmenizi neririm.

Nesne Tabanl Programlama OOP (NTP)


Bu yazmzda ok nemli bir konuyu ilemeye balayacaz: Pythonda Nesne Tabanl
Programlama (Object Oriented Programming). Yabanclar bu ifadeyi OOP olarak ksaltyor.
Gelin isterseniz biz de bunu Trkede NTP olarak ksaltalm
imdilik bu Nesne Tabanl Programlamann ne olduu ve tanm bizi ilgilendirmiyor. Biz imdilik
----------------------------------------------------------------------------------------------------------------------Python Dersleri
123/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

iin teorisiyle pek uramayp pratiine bakacaz. NTPnin pratikte nasl ilediini anlarsak,
teorisini aratrp renmek de daha kolay olacaktr.
Neden Nesne Tabanl Programlama?
sterseniz nce kendimizi biraz yreklendirip cesaretlendirelim. u soruyu soralm kendimize:
Nesne Tabanl Programlama'ya hi girmesem olmaz m?
Bu soruyu cevaplandrmadan nce bak amz yle belirleyelim. Daha dorusu bu soruyu iki
farkl adan inceleyelim: NTP'yi renmek ve NTP'yi kullanmak...
Eer yukardaki soruya, "NTP'yi kullanmak" penceresinden bakarsak, cevabmz, "Evet," olacaktr.
Yani, "Evet, NTP'yi kullanmak zorunda deilsiniz". Bu bakmdan NTP'yle ilgilenmek
istemeyebilirsiniz, nk Python baka baz dillerin aksine NTP'yi dayatmaz. yi bir Python
programcs olmak iin NTP'yi kullanmasanz da olur. NTP'yi kullanmadan da gayet baarl
programlar yazabilirsiniz. Bu bakmdan nnzde bir engel yok.
Ama eer yukardaki soruya "NTP'yi renmek" penceresinden bakarsak, cevabmz, "Hayr",
olacaktr. Yani, "Hayr, NTP'yi renmek zorundasnz!". Bu bakmdan NTP'yle ilgilenmeniz
gerekir, nk siz NTP'yi kullanmasanz da bakalar bunu kullanyor. Dolaysyla, NTP'nin btn
erdemlerini bir kenara braksak dahi, srf bakalarnn yazd kodlar anlayabilmek iin bile olsa,
elinizi NTP'yle kirletmeniz gerekecektir... Bir de yle dnn: Gerek internet zerinde olsun,
gerekse basl yaynlarda olsun, Python'a ilikin pek ok kaynakta kodlar bir noktadan sonra NTP
yaps iinde ilenmektedir. Bu yzden zellikle balang seviyesini getikten sonra karnza
kacak olan kodlar anlayabilmek iin bile NTP'ye bir ainalnzn olmas gerekir.
Dolaysyla en bata sorduumuz soruya karlk ben de size u soruyu sormak isterim:
"Daha nereye kadar kaacaksnz bu NTP'den?"
Dikkat ederseniz, bildik anlamda NTP'nin faydalarndan, bize getirdii kolaylklardan hi
bahsetmiyoruz. Zira u anda iinde bulunduumuz noktada bunlar bilmenin bize pek faydas
dokunmayacaktr. nk daha NTP'nin ne olduunu dahi bilmiyoruz ki cicili bicili cmlelerle bize

----------------------------------------------------------------------------------------------------------------------Python Dersleri
124/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

anlatlacak "faydalar" zmseyebilelim... NTP'yi renmeye alan birine birka sayfa boyunca
"NTP yle iyidir, NTP byle hotur," demenin pek faydas olmayacaktr. nk byle bir aba,
konuyu anlatan kiiyi ister istemez okurun henz bilmedii kavramlar kullanarak baz eyleri
aklamaya almaya itecektir. Bu da okurun zihninde birtakm fantastik cmlelerin uumasndan
baka bir ie yaramayacaktr. Dolaysyla, NTP'nin faydalarn size burada bir rpda saymak
yerine, renme srecine brakyoruz bu "zmseme" iini... NTP'yi rendikten sonra, bu
programlama tekniinin Python deneyiminize ne tr bir katk salayacan, size ne gibi bir fayda
getireceini kendi gzlerinizle greceksiniz.
En azndan biz bu noktada unu rahatlkla syleyebiliriz: NTP'yi rendiinizde Python
Programlama'da bir anlamda "boyut atlam" olacaksnz. Sonunda zgveniniz artacak, orada
burada Python'a ilikin okuduunuz eyler zihninizde daha anlaml izler brakmaya balayacaktr.
Snflar
NTPde en nemli kavram snflardr. Zaten NTP denince ilk akla gelen ey de genellikle
snflar olmaktadr. Snflar yap olarak fonksiyonlara benzetilebilir. Hatrlarsanz, fonksiyonlar
yardmyla farkl deikenleri ve veri tiplerini, tekrar kullanlmak zere bir yerde toplayabiliyorduk.
te snflar yardmyla da farkl fonksiyonlar, veri tiplerini, deikenleri, metotlar
gruplandrabiliyoruz.
Snf Tanmlamak
ncelikle bir snf nasl tanmlayacamza bakmamz gerekiyor. Hemen, bir snf nasl
tanmlayacamz bir rnekle grmeye alalm:
Pythonda bir snf oluturmak iin u yapy kullanyoruz:
class IlkSinif:
Bylece snflar oluturmak iin ilk adm atm olduk. Burada dikkat etmemiz gereken baz
noktalar var:

Hatrlarsanz fonksiyonlar tanmlarken def paracndan yararlanyorduk. Mesela:


def deneme():

Snflar tanmlarken ise class paracndan faydalanyoruz:


class IlkSinif:

----------------------------------------------------------------------------------------------------------------------Python Dersleri
125/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Tpk fonksiyonlarda olduu gibi, isim olarak herhangi bir kelimeyi seebiliriz. Mesela
yukardaki fonksiyonda deneme adn semitik. Yine yukarda grdmz snf rneinde
de IlkSinif adn kullandk. Tabii isim belirlerken Trke karakter kullanamyoruz

Snf adlarn belirlerken kullanacamz kelimenin byk harf veya kk harf olmas nemli
deildir. Ama seilen kelimelerin ilk harflerini byk yazmak adettendir. Mesela "class Sinif"
veya "class HerhangiBirKelime". Grdnz gibi snf ad birden fazla kelimeden oluuyorsa
her kelimenin ilk harfi byk yazlyor. Bu bir kural deildir, ama her zaman adetlere uymak
yerinde bir davran olacaktr...

Son olarak, snfmz tanmladktan sonra parantez iareti kullanmak zorunda olmadmza
dikkat edin. En azndan imdilik... Bu parantez meselesine tekrar dneceiz.

lk adm attmza gre ilerleyebiliriz:


class IlkSinif:
mesele = "Olmak ya da olmamak"
Bylece eksiksiz bir snf tanmlam olduk. Aslnda tabii ki normalde snflar bundan biraz daha
karmaktr. Ancak yukardaki rnek, gerek hayatta bu haliyle karmza kmayacak da olsa, hem
yap olarak kurallara uygun bir snftr, hem de bize snflara ilikin pek ok nemli ipucu
vermektedir. Srasyla bakalm:
- lk satrda doru bir ekilde snfmz tanmladk.
- kinci satrda ise mesele adl bir deiken oluturduk.
Bylece ilk snfmz baaryla tanmlam olduk.
Snflar altrmak
imdi gzel gzel yazdmz bu snf nasl altracamza bakalm:
Herhangi bir Python programn nasl altryorsak snflar da yle altrabiliriz. Yani pek ok
farkl yntem kullanabiliriz. rnein yazdmz ey arayz olan bir Tkinter programysa "python
programad.py" komutuyla bunu altrabilir, yazdmz arayz grebiliriz. Hatta gerekli
ayarlamalar yaptktan sonra programn simgesine ift tklayarak veya GNU/Linux sistemlerinde
konsol ekrannda programn sadece adn yazarak altrabiliriz programmz. Eer komut
satrndan alan bir uygulama yazdysak, yine "python programad.py" komutuyla programmz
altrp konsol zerinden ynetebiliriz. Ancak bizim imdilik yazdmz kodun bir arayz yok.

----------------------------------------------------------------------------------------------------------------------Python Dersleri
126/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

stelik bu sadece NTP'yi renmek iin yazdmz, tam olmayan bir kod parasndan ibaret.
Dolaysyla snfmz tecrbe etmek iin biz imdilik dorudan Python komut satr iinden
alacaz.
u halde herkes kendi platformuna uygun ekilde Python komut satrn balatsn! Python'u
balattktan sonra btn platformlarda u komutu vererek bu kod parasn altrlabilir duruma
getirebiliriz:
>>>from sinif import *
Burada sizin bu kodlar sinif.py adl bir dosyaya kaydettiinizi varsaydm. Dolaysyla bu ekilde
dosyamz bir modl olarak ie aktarabiliyoruz (import). Bu arada Python'un bu modl dzgn
olarak ie aktarabilmesi iin komut satrn, bu modln bulunduu dizin iinde amak gerekir.
Python ie aktarlacak modlleri ararken ilk olarak o anda iinde bulunulan dizine bakaca iin
modlmz rahatlkla bulabilecektir.
GNU/Linux kullanclar komut satryla daha ili dl olduklar iin etkileimli kabuu modln
bulunduu dizinde nasl aacaklarn zaten biliyorlardr... Ama biz yine de hzlca zerinden
geelim...(Modln masastnde olduunu varsayyoruz):
ALT+F2 tularna basp alan pencereye "konsole" (KDE) veya "gnome-terminal" (GNOME)
yazyoruz. Ardndan konsol ekrannda "cd Desktop" komutunu vererek masastne eriiyoruz.
Windows kullanclarnn komut satrna daha az aina olduunu varsayarak biraz daha detayl
anlatalm bu ilemi...
Windows kullanclar ise Python komut satrn modln olduu dizin iinde amak iin u yolu
izleyebilir (yine modln masastnde olduunu varsayarsak...):
Balat > altr yolunu takip edip alan kutuya "cmd" yazyoruz (parantezler olmadan). Komut
ekran karmza gelecek. Muhtemelen iinde bulunduunuz dizin "C:\Documents and
Settings\sminiz" olacaktr. Orada u komutu vererek masastne geiyoruz:
cd Desktop
imdi de u komutu vererek Python komut satrn balatyoruz:
C:/python25/python
Tabii kullandnz Python srmnn 2.5 olduunu varsaydm. Sizde srm farklysa komutu ona

----------------------------------------------------------------------------------------------------------------------Python Dersleri
127/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

gre deitirmelisiniz.
Eer herhangi bir hata yapmadysanz karnza una benzer bir ekran gelmeli:
C:\Documents and Settings\Isminiz>c:/python25/Python
Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
imdi bu ekrandaki ">>>" satrndan hemen sonra u komutu verebiliriz:
from sinif import *
Artk snfmz altrmamzn nnde hi bir engel kalmad saylr. Bu noktada yapmamz
gereken tek bir ilem var: rnekleme
rnekleme (Instantiation)
imdi yle bir ey yazyoruz:
>>>deneme = IlkSinif()
Bylece oluturduumuz snf bir deikene atadk. NTP kavramlaryla konuacak olursak,
snfmz rneklemi olduk.
Peki bu "rnekleme" denen ey de ne oluyor? Hemen bakalm:
ngilizcede instantiation olarak ifade edilen rnekleme kavram sayesinde snfmz
kullanrken belli bir kolaylk salam oluyoruz. Grdnz gibi, rnekleme (instantiation)
aslnda ekil olarak yalnzca bir deiken atama ileminden ibarettir. Nasl daha nce grdmz
deikenler uzun ifadeleri ksaca adlandrmamz salyorsa, burada da rnekleme ilemi hemen
hemen ayn vazifeyi gryor. Yani bylece ilk satrda tanmladmz snfa daha kullanl bir isim
vermi oluyoruz. Dediimiz gibi, bu ileme rnekleme (instantiation) ad veriliyor. Bu
rneklemelerin her birine ise rnek (instance) deniyor. Yani, IlkSinif adl snfa bir isim verme
ilemine rnekleme denirken, bu ilem sonucu ortaya kan deikene de, rnek (instance)
diyoruz. Buna gre, burada deneme adl deiken, IlkSinif adl snfn bir rneidir (deneme
is an instance of the class IlkSinif). Daha soyut bir ifadeyle, rnekleme ilemi Class (snf)
nesnesini etkinletirmeye yarar. Yani snfn btnn alr ve onu paketleyip, istediimiz ekilde
kullanabileceimiz bir nesne haline getirir. yle de diyebiliriz:
Biz bir snf tanmlyoruz. Bu snfn iinde birtakm deikenler, fonksiyonlar, vb. olacaktr. Hayli
kaba bir benzetme olacak ama, biz bunlar bir internet sayfasnn ieriine benzetebiliriz. te biz bu
----------------------------------------------------------------------------------------------------------------------Python Dersleri
128/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

snf "rneklediimiz" zaman, snf ieriini bir bakma eriilebilir hale getirmi oluyoruz. Tpk bir
internet sayfasnn, "www...." eklinde gsterilen adresi gibi... Mesela www.python.quotaless.com
adresi iindeki btn bilgileri bir snf olarak dnrsek, "www.python.quotaless.com" ifadesi bu
snfn bir rneidir... Durum tam olarak byle olmasa bile, bu benzetme, "rnekleme" ilemine
ilikin en azndan zihnimizde bir kvlcm akmasn salayabilir.
Daha yerinde bir benzetme yle olabilir: "nsan" byk bir snf olarak kabul edelim. te
"siz" (yani Ahmet, Mehmet, vb...) bu byk snfn bir rnei, yani ete kemie brnm hali
oluyorsunuz... Buna gre "insan" snf insann ne tr zellikleri olduuna dair tanmlar
(fonksiyonlar, veriler) ieriyor. "Mehmet" rnei (instance) ise bu tanmlar, nitelikleri, zellikleri
tayan bir "nesne" oluyor...
p Toplama (Garbage Collection)
Peki biz bir snf rneklemezsek ne olur? Eer bir snf rneklemezsek, o rneklenmeyen snf
program tarafndan otomatik olarak "p toplama" (garbage collection) ad verilen bir srece tabi
tutulacaktr. Burada bu srecin ayrntlarna girmeyeceiz. Ama ksaca yle anlatabiliriz:
Python'da (ve bir ok programlama dilinde) yazdmz programlar iindeki "ie yaramayan" veriler
bellekten silinir. Bylece etkili bir hafza ynetimi uygulanm ve programlarn performans
artrlm olur. Mesela:
a=5
a=a+6
print a
11
Burada "a" deikeninin gsterdii "5" verisi, daha sonra gelen "a = a + 6" ifadesi nedeniyle boa
dm, skartaya km oluyor. Yani "a = a + 6" ifadesi nedeniyle, "a" deikeni artk "5" verisini
gstermiyor. Dolaysyla "5" verisi o anda bellekte bou bouna yer kaplam oluyor. nk "a = a
+ 6" ifadesi yznden, "5" verisine gnderme yapan, onu gsteren, bu veriye bizim ulamamz
salayacak hi bir iaret kalmam oluyor ortada. te Python, bir veriye iaret eden hi bir referans
kalmad durumlarda, yani o veri artk ie yaramaz hale geldiinde, otomatik olarak "p toplama"
ilemini devreye sokar ve bu rnekte "5" verisini pe gnderir. Yani artk o veriyi bellekte
tutmaktan vazgeer. te eer biz de yukarda olduu gibi snflarmz "rneklemezsek", bu snflara
hibir yerde iaret edilmedii, yani bu snf gsteren hibir "referans" olmad iin, snfmz
oluturulduu anda p toplama ilemine tabi tutulacaktr. Dolaysyla artk bellekte

----------------------------------------------------------------------------------------------------------------------Python Dersleri
129/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

tutulmayacaktr.
"p Toplama" ilemini de ksaca anlattmza gre artk kaldmz yerden yolumuza devam
edebiliriz...
Bu arada dikkat ettiyseniz snfmz rneklerken parantez kullandk. Yani yle yaptk:
deneme = IlkSinif()
Eer parantezleri kullanmazsak, yani "deneme = IlkSinif" gibi bir ey yazarsak, yaptmz ey
"rnekleme" olmaz. Byle yaparak snf sadece kopyalam oluruz... Bizim yapmak istediimiz bu
deil. O yzden, "parantezlere dikkat!" diyoruz...
Artk u komut yardmyla, snf rneimizin niteliklerine ulaabiliriz:
>>>deneme.mesele
Olmak ya da olmamak
Niteliklere Deinme (Attribute References)
Biraz nce nitelik diye bir eyden sz ettik. ngilizcede attribute denen bu nitelik kavram,
Pythondaki nesnelerin zelliklerine iaret eder. Python'un yazar Guido Van Rossum bu kavram
iin yle diyor:
"I use the word attribute for any name following a dot" (Noktadan sonra gelen btn isimler iin
ben "nitelik" kelimesini kullanyorum)
kaynak: http://docs.python.org/tut/node11.html
Bu tanma gre, rnein,
>>>deneme.mesele
dediimiz zaman, buradaki mesele; deneme adl snf rneinin (instance) bir nitelii (attribute)
oluyor. Biraz kark gibi mi? Hemen bir rnek yapalm o halde:
class Toplama:
a = 15
b = 20
c=a+b
1. lk satrda Toplama adl bir snf tanmladk. Bunu yapmak iin class paracndan
yararlandk.
2. Srasyla; a, b ve c adl adet deiken oluturduk. c deikeni a ve b deikenlerinin

----------------------------------------------------------------------------------------------------------------------Python Dersleri
130/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

toplamdr.
Bu snftaki a, b ve c deikenleri ise, Toplama snf rneinin (rnei biraz sonra
tanmlayacaz) birer nitelii oluyor. Bundan nceki rneimizde ise "mesele" adl deiken,
"deneme" adl snf rneinin bir nitelii idi...
Bu snf yazp kaydettiimiz dosyamzn adnn matematik.py olduunu varsayarsak;
from matematik import *
komutunu verdikten sonra unu yazyoruz:
>>>sonuc = Toplama()
Bylece Toplama adl snfmz rnekliyoruz. Bu ileme rnekleme (instantiation) ad
veriyoruz. sonuc kelimesine ise Python'cada rnek (instance) ad veriliyor. Yani sonuc,
Toplama snfnn bir rneidir, diyoruz
Artk,
sonuc.a
sonuc.b
sonuc.c
biiminde, "sonuc" rneinin niteliklerine tek tek eriebiliriz.
Peki kodlar yle altrrsak ne olur?
import matematik
Eer modl bu ekilde ie aktarrsak (import), snf rneinin niteliklerine ulamak iin u yapy
kullanmamz gerekir:
matematik.sonuc.a
matematik.sonuc.b
matematik.sonuc.c
Yani her defasnda dosya adn (ya da baka bir ifadeyle modln adn) da belirtmemiz gerekir.
Bu iki kullanm arasnda, zellikle saladklar gvenlik avantajlar/dezavantajlar asndan baka
baz temel farkllklar da vardr, ama imdilik konumuzu datmamak iin bunlara girmiyoruz
Ama temel olarak unu bilmekte fayda var: Genellikle tercih edilmesi gereken yntem "from modl

----------------------------------------------------------------------------------------------------------------------Python Dersleri
131/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

import *" yerine "import modl" biimini kullanmaktr. Eer "from modl import *" yntemini
kullanarak ie aktardnz modl iindeki isimler (deikenler, nitelikler), bu modl
kullanacanz dosya iinde de bulunuyorsa isim akmalar ortaya kabilir... Esasnda, "from
modl import *" yapsn sadece ne yaptmz ok iyi biliyorsak ve modlle ilgili belgelerde
modln bu ekilde ie aktarlmas gerektii bildiriliyorsa kullanmamz yerinde olacaktr. Mesela
Tkinter ile programlama yaparken rahatlkla "from Tkinter import *" yapsn kullanabiliriz, nk
Tkinter bu kullanmda problem yaratmayacak ekilde tasarlanmtr. Yukarda bizim verdiimiz
rnekte de "from modl import *" yapsn rahatlkla kullanyoruz, nk imdilik tek bir modl
zerinde alyoruz. Dolaysyla isim akmas yaratacak baka bir modlmz olmad iin "ne
yaptmz biliyoruz!"...
Yukarda anlattmz kod altrma biimleri tabii ki, bu kodlar komut ekranndan altrdnz
varsaymaktadr. Eer siz bu kodlar IDLE ile altrmak isterseniz, bunlar hazrladktan sonra F5
tuuna basmanz, veya Run > Run Module yolunu takip etmeniz yeterli olacaktr. F5e
bastnzda veya Run > Run Module yolunu takip ettiinizde IDLE sanki komut ekrannda from
matematik import * komutunu vermisiniz gibi davranacaktr.
Veya GNU/Linux sistemlerinde sistem konsolunda
python -i sinif.py
komutunu vererek de bu kod paralarn altrlabilir duruma getirebiliriz. Bu komutu
verdiimizde "from sinif import *" komutu otomatik olarak verilip hemen ardndan Python komut
satr alacaktr. Bu komut verildiinde ekranda greceiniz ">>>" iaretinden, Python'un sizden
hareket beklediini anlayabilirsiniz...
imdi isterseniz buraya kadar sylediklerimizi yle bir toparlayalm. Bunu da yukardaki rnek
zerinden yapalm:
class Toplama:
a = 15
b = 20
c=a+b
1. Toplama adl bir snf tanmlyoruz.
2. Snfmzn iine istediimiz kod paralarn ekliyoruz. Biz burada adet deiken ekledik. Bu

----------------------------------------------------------------------------------------------------------------------Python Dersleri
132/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

deikenlerin her birine, nitelik adn veriyoruz.


3. Bu kodlar kullanabilmek iin Python komut satrnda u komutu veriyoruz:
from matematik import *
Burada modl adnn (yani dosya adnn) matematik olduunu varsaydk.
4. imdi yapmamz gereken ey, Toplama adl snf rneklemek (instantiation). Yani bir nevi,
snfn kendisini bir deikene atamak. Bu deikene biz Pythoncada rnek (instance) adn
veriyoruz. Yani, sonuc" adl deiken, Toplama adl snfn bir rneidir diyoruz (sonuc is an
instance of Toplama).
>>>sonuc = Toplama()
5. Bu komutu verdikten sonra niteliklerimize eriebiliriz:
>>>sonuc.a
>>>sonuc.b
>>>sonuc.c
Dikkat ederseniz, niteliklerimize eriirken rnekten (instance), yani sonuc adl deikenden
yararlanyoruz.
imdi bir an bu snfmz rneklemediimizi dnelim. Dolaysyla bu snf yle kullanmamz
gerekecek:
>>>Toplama().a
>>>Toplama().b
>>>Toplama().c
Ama daha nce de anlattmz gibi, siz "Toplama().a" der demez snf altrlacak ve
altrldktan hemen sonra ortada bu snfa iaret eden herhangi bir referans kalmad iin Python
tarafndan "ie yaramaz" olarak alglanan snfmz p toplama ilemine tabi tutularak derhal
bellei terketmesi salanacaktr. Bu yzden bunu her altrdnzda yeniden bellee yklemi
olacaksnz snf. Bu da bir hayli verimsiz bir alma eklidir.
Bylelikle zor ksm geride brakm olduk. Artk nmze bakabiliriz. Zira en temel baz
kavramlar gzden geirdiimiz ve temelimizi oluturduumuz iin, daha kark eyleri anlamak
kolaylaacaktr.

----------------------------------------------------------------------------------------------------------------------Python Dersleri
133/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

__init__ Nedir?
Eer daha nce etrafta snflar ieren kodlar grmseniz, bu __init__ fonksiyonuna en azndan bir
gz ainalnz vardr. Genellikle u ekilde kullanldn grrz bunun:
def __init__(self):
Biz imdilik bu yapdaki __init__ ksmyla ilgileneceiz. selfin ne olduunu imdilik bir kenara
brakp, onu olduu gibi kabul edelim. e hemen bir rnekle balayalm. sterseniz kendimizce
ufack bir oyun tasarlayalm:
#!/usr/bin/env python
#-*- coding:utf8 -*class Oyun:
def __init__(self):
enerji = 50
para = 100
fabrika = 4
isci = 10
print "enerji:", enerji
print "para:", para
print "fabrika:", fabrika
print "ii:", isci
macera = Oyun()
Gayet gzel. Dikkat ederseniz "rnekleme" (instantiation) ilemini dorudan dosya iinde hallettik.
Komut satrna brakmadk bu ii.
imdi bu kodlar altracaz. Bir ka seeneimiz var:
1. zerinde altmz platforma gre Python komut satrn, yani etkileimli kabuu ayoruz.
Orada u komutu veriyoruz:
from deneme import *
Burada dosya adnn "deneme.py" olduunu varsaydk. Eer rnekleme ilemini dosya iinden
halletmemi olsaydk, "from deneme import *" komutunu vermeden nce "macera = Oyun()" satr
yardmyla ilk olarak snfmz rneklendirmemiz gerekecekti.
2. GNU/Linux sistemlerinde baka bir seenek olarak, ALT+F2 tularna basyoruz ve alan
----------------------------------------------------------------------------------------------------------------------Python Dersleri
134/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

pencerede "konsole" (KDE) veya "gnome-terminal" (GNOME) yazp enter'e bastktan sonra
atmz komut satrnda u komutu veriyoruz:
python -i deneme.py
3. Eer Windows'ta IDLE zerinde alyorsak, F5 tuuna basarak veya "Run>Run Module"
yolunu takip ederek kodlarmz altryoruz.
Bu kodlar yukardaki seeneklerden herhangi biriyle altrdmzda, __init__ fonksiyonu iinde
tanmlanm olan btn deikenlerin, yani niteliklerin, ilk alma esnasnda ekrana
yazdrldn gryoruz. te bu niteliklerin balang deeri olarak belirlenebilmesi hep __init__
fonksiyonu sayesinde olmaktadr. Dolaysyla yle bir ey diyebiliriz:
Pythonda bir programn ilk kez altrld anda ilemesini istediimiz eyleri bu __init__
fonksiyonu iine yazyoruz. Mesela yukardaki ufak oyun almasnda, oyuna baland anda bir
oyuncunun sahip olaca zellikleri __init__ fonksiyonu iinde tanmladk. Buna gre bu oyunda
bir oyuncu oyuna baladnda;
enerjisi 50,
paras 100
fabrika says 4,
ii says ise 10 olacaktr.
Yalnz hemen uyaralm: Yukardaki rnek aslnda pek de dzgn saylmaz. ok nemli eksiklikleri
var bu kodun. Ama imdi konumuz bu deil... Olayn i yzn kavrayabilmek iin yle bir rnek
vermemiz gerekiyordu. Bunu biraz sonra aklayacaz. Biz okumaya devam edelim...
Bir de Tkinter ile bir rnek yapalm. Zira snfl yaplarn en ok ve en verimli kullanld yer
arayz programlama almalardr:
from Tkinter import *
class Arayuz:
def __init__(self):
pencere = Tk()
dugme = Button(text="tamam")
dugme.pack()

----------------------------------------------------------------------------------------------------------------------Python Dersleri
135/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

uygulama = Arayuz()
Bu kodlar da yukarda saydmz yntemlerden herhangi biri ile altryoruz. Tabii ki bu kod da
eksiksiz deildir. Ancak imdilik amacmza hizmet edebilmesi iin kodlarmz bu ekilde
yazmamz gerekiyordu. Ama greceiniz gibi yine de alyor bu kodlar... Dikkat ederseniz burada
da rnekleme ilemini dosya iinden hallettik. Eer rnekleme satrn dosya iine yazmazsak,
Tkinter penceresinin almas iin komut satrnda "uygulama = Arayuz()" gibi bir satr yazmamz
gerekir.
Buradaki __init__ fonksiyonu sayesinde Arayuz adl snf her arldnda bir adet Tkinter
penceresi ve bunun iinde bir adet dme otomatik olarak oluacaktr. Zaten bu __init__
fonksiyonuna da ngilizcede ou zaman constructor (oluturan, ina eden, meydana getiren) ad
verilir. Geri __init__ fonksiyonuna "constructor" demek pek doru bir ifade saylmaz, ama biz
bunu imdi bir kenara brakalm. Sadece aklmzda olsun, __init__ fonksiyonu gerek anlamda bir
"constructor" deildir, ama ona ok benzer...
yle bir yanl anlalma olmamasna dikkat edin:
__init__ fonksiyonunun, varsaylan deerleri belirleme, yani ina etme zellii konumundan
kaynaklanmyor. Yani bu __init__ fonksiyonu, ilevini srf ilk srada yer ald iin yerine
getirmiyor. Bunu test etmek iin, isterseniz yukardaki kodlar __init__ fonksiyonunun adn
deitirerek altrmay deneyin. Ayn ilevi elde edemezsiniz Mesela __init__ yerine __simit__
deyin. almaz
__init__ konusuna biraz olsun k tuttuumuza gre artk en nemli bileenlerden ikincisine
gelebiliriz: self
self Nedir?
Bu kck kelime Pythonda snflarn en can alc noktasn oluturur. Esasnda ok basit bir
ilevi olsa da, bu ilevi kavrayamazsak neredeyse btn bir snf konusunu kavramak imkansz hale
gelecektir. Selfi anlamaya doru ilk adm atmak iin yukarda kullandmz kodlardan
faydalanarak bir rnek yapmaya alalm. Kodumuz yleydi:
class Oyun:

----------------------------------------------------------------------------------------------------------------------Python Dersleri
136/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

def __init__(self):
enerji = 50
para = 100
fabrika = 4
isci = 10
print "enerji:", enerji
print "para:", para
print "fabrika:", fabrika
print "ii:", isci
macera = Oyun()
Diyelim ki biz burada enerji, para, fabrika, ii deikenlerini ayr bir fonksiyon iinde kullanmak
istiyoruz. Yani mesela gster adl ayr bir fonksiyonumuz olsun ve biz bu deikenleri ekrana
yazdrmak istediimizde bu gster fonksiyonundan yararlanalm. Kodlarn u anki halinde olduu
gibi, bu kodlar tanmlansn, ama dorudan ekrana dklmesin. yle bir ey yazmay deneyelim.
Bakalm sonu ne olacak?
class Oyun:
def __init__(self):
enerji = 50
para = 100
fabrika = 4
isci = 10
def goster():
print "enerji:", enerji
print "para:", para
print "fabrika:", fabrika
print "ii:", isci
macera = Oyun()
ncelikle bu kodlarn sahip olduu niteliklere bir bakalm:
enerji, para, fabrika, ici ve goster()
Burada rneimiz (instance) macera adl deiken. Dolaysyla bu niteliklere u ekilde
ulaabiliriz:
macera.enerji

----------------------------------------------------------------------------------------------------------------------Python Dersleri
137/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

macera.para
macera.fabrika
macera.ici
macera.goster()
Hemen deneyelim. Ama o da ne? Mesela macera.goster() dediimizde yle bir hata alyoruz:
Traceback

(most

File

"<pyshell#0>",

recent
line

1,

call

last):

in

<module>

macera.goster()
TypeError: goster() takes no arguments (1 given)
Belli ki bir hata var kodlarmzda. goster() fonksiyonuna bir self ekleyerek tekrar deneyelim.
Belki dzelir
class Oyun:
def __init__(self):
enerji = 50
para = 100
fabrika = 4
isci = 10
def goster(self):
print "enerji:", enerji
print "para:", para
print "fabrika:", fabrika
print "ii:", isci
macera = Oyun()
Tekrar deniyoruz:
macera.goster()
Olmad Bu sefer de yle bir hata aldk:
enerji:
Traceback

(most

File

"<pyshell#0>",

recent
line

1,

call

last):

in

<module>

macera.goster()
File

"xxxxxxxxxxxxxxxxxxx",

line

9,

in

goster

----------------------------------------------------------------------------------------------------------------------Python Dersleri
138/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

print

"enerji:",

enerji

NameError: global name 'enerji' is not defined


Hmm Sorunun ne olduu az ok ortaya kt. Hatrlarsanz buna benzer hata mesajlarn
Fonksiyon tanmlarken global deikeni yazmadmz zamanlarda da alyorduk te self
burada devreye giriyor. Yani bir bakma, fonksiyonlardaki global ifadesinin yerini tutuyor. Daha
doru bir ifadeyle, burada "macera" adl snf rneini temsil ediyor. Artk kodlarmz
dzeltebiliriz:
class Oyun:
def __init__(self):
self.enerji = 50
self.para = 100
self.fabrika = 4
self.isci = 10
def goster(self):
print "enerji:", self.enerji
print "para:", self.para
print "fabrika:", self.fabrika
print "ii:", self.isci
macera = Oyun()
Grdnz gibi, kodlar iinde yazdmz deikenlerin, fonksiyon dndan da arlabilmesi iin,
yani bir bakma "global" bir nitelik kazanmas iin self olarak tanmlanmalar gerekiyor. Yani
mesela, enerji yerine self.enerji diyerek, bu enerji adl deikenin yalnzca iinde bulunduu
fonksiyonda deil, o fonksiyonun dnda da kullanlabilmesini salyoruz. yice somutlatrmak
gerekirse, __init__ fonksiyonu iinde tanmladmz enerji adl deiken, bu haliyle goster
adl fonksiyonun iinde kullanlamaz. Daha da nemlisi bu kodlar bu haliyle tam olarak
altramayz da. Mesela u temel komutlar iletemeyiz:
macera.enerji
macera.para
macera.isci
macera.fabrika
Eer biz enerji adl deikeni goster fonksiyonu iinde kullanmak istersek deikeni sadece
enerji deil, self.enerji olarak tanmlamamz gerekir. Ayrca bunu goster adl fonksiyon iinde

----------------------------------------------------------------------------------------------------------------------Python Dersleri
139/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

kullanrken de sadece enerji olarak deil, self.enerji olarak yazmamz gerekir. stelik mesela
"enerji" adl deikeni herhangi bir yerden armak istediimiz zaman da bunu nceden "self"
olarak tanmlam olmamz gerekir.
imdi tekrar deneyelim:
macera.goster
enerji: 50
para: 100
fabrika: 4
ii: 10
macera.enerji
50
macera.para
100
macera.fabrika
4
macera.isci
10
Snfn niteliklerine tek tek nasl eriebildiimizi gryorsunuz Bu arada, isterseniz "self"i,
"macera" rneinin yerini tutan bir kelime olarak da kurabilirsiniz zihninizde. Yani kodlar
altrrken "macera.enerji" diyebilmek iin, en bata bunu "self.enerji" olarak tanmlamamz
gerekiyor... Bu dnme tarz iimizi biraz daha kolaylatrabilir.
Bir de Tkinterli rneimize bakalm:
from Tkinter import *
class Arayuz:
def __init__(self):
pencere = Tk()
dugme = Button(text="tamam")
dugme.pack()

----------------------------------------------------------------------------------------------------------------------Python Dersleri
140/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

uygulama = Arayuz()
Burada tanmladmz dmenin bir i yapmasn salayalm. Mesela dmeye baslnca komut
ekrannda bir yaz ksn. nce yle deneyelim:
from Tkinter import *
class Arayuz:
def __init__(self):
pencere = Tk()
dugme = Button(text="tamam",command=yaz)
dugme.pack()
def yaz():
print "Hadi eyvallah!"
uygulama = Arayuz()
Tabii ki bu kodlar altrdmzda yle bir hata mesaj alrz:
Traceback
File

(most

recent

"xxxxxxxxxxxxxxxxxxxx",

uygulama
File

line

call
13,

last):
in

<module>

=
"xxxxxxxxxxxxxxxxxxxxxxxx",

dugme

Arayuz()
line

7,

in

__init__

Button(text="tamam",command=yaz)

NameError: global name 'yaz' is not defined


Bunun sebebini bir nceki rnekte renmitik. Kodlarmz u ekilde yazmamz gerekiyor:
from Tkinter import *
class Arayuz:
def __init__(self):
pencere = Tk()
dugme = Button(text="tamam",command=self.yaz)
dugme.pack()
def yaz(self):
print "Hadi eyvallah!"
uygulama = Arayuz()
Grdnz gibi, eer programn farkl noktalarnda kullanacamz deikenler veya fonksiyonlar
varsa, bunlar self neki ile birlikte tanmlyoruz. def self.yaz eklinde bir fonksiyon tanmlama

----------------------------------------------------------------------------------------------------------------------Python Dersleri
141/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

yntemi olmadna gre bu ilemi def yaz(self) eklinde yapmamz gerekiyor. Bu son rnek
aslnda yine de tam anlamyla kusursuz bir rnek deildir. Ama imdilik elimizden bu kadar
geliyor. Daha ok bilgimiz olduunda bu kodlar daha dzgn yazmay da reneceiz.
Bu iki rnek iinde, selflerle oynayarak olayn i yzn kavramaya aln. Mesela yaz()
fonksiyonundaki self parametresini silince ne tr bir hata mesaj alyorsunuz, command=self.yaz
iindeki self ifadesini silince ne tr bir hata mesaj alyorsunuz? Bunlar iyice inceleyip, selfin
nerede ne ie yaradn kavramaya aln.
Bu noktada kk bir sr verelim. Siz bu kelimeyi btn snfl kodlamalarda bu ekilde gryor
olsanz da aslnda illa ki self kelimesini kullanacaksnz diye bir kaide yoktur. Self yerine baka
kelimeler de kullanabilirsiniz. Mesela yukardaki rnei yle de yazabilirsiniz:
from Tkinter import *
class Arayuz:
def __init__(armut):
pencere = Tk()
dugme = Button(text="tamam",command=armut.yaz)
dugme.pack()
def yaz(armut):
print "Hadi eyvallah!"
uygulama = Arayuz()
Ama siz byle yapmayn. self kelimesinin kullanm o kadar yaygnlam ve yerlemitir ki, sizin
bunu kendi kodlarnzda dahi olsa deitirmeye kalkmanz pek ho karlanmayacaktr. Ayrca sizin
kodlarnz okuyan bakalar, ne yapmaya altnz anlamakta bir an da olsa tereddt edecektir.
Hatta birka yl sonra dnp siz dahi ayn kodlara baktnzda, Ben burada ne yapmaya
almm, diyebilirsiniz O yzden, self iyidir, self kullann!...
Sizi self kullanmaya ikna ettiimizi kabul edersek, artk yolumuza devam edebiliriz.
Hatrlarsanz yukarda ufack bir oyun almas yapmaya balamtk. Gelin isterseniz oyunumuzu
biraz ayrntlandralm. Elimizde imdilik unlar vard:
class Oyun:
def __init__(self):

----------------------------------------------------------------------------------------------------------------------Python Dersleri
142/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

self.enerji = 50
self.para = 100
self.fabrika = 4
self.isci = 10
def goster(self):
print "enerji:", self.enerji
print "para:", self.para
print "fabrika:", self.fabrika
print "ii:", self.isci
macera = Oyun()
Buradaki kodlar yardmyla bir oyuncu oluturduk. Bu oyuncunun oyuna baladnda sahip olaca
enerji, para, fabrika ve ii bilgilerini de girdik. Kodlarmz arasndaki goster() fonksiyonu
yardmyla da her an bu bilgileri grntleyebiliyoruz.
imdi isterseniz oyunumuza biraz hareket getirelim. Mesela kodlara yeni bir fonksiyon ekleyerek
oyuncumuza yeni fabrikalar kurma olana tanyalm:
class Oyun:
def __init__(self):
self.enerji = 50
self.para = 100
self.fabrika = 4
self.isci = 10
def goster(self):
print "enerji:", self.enerji
print "para:", self.para
print "fabrika:", self.fabrika
print "ii:", self.isci
def fabrikakur(self,miktar):
if self.enerji > 3 and self.para > 10:

----------------------------------------------------------------------------------------------------------------------Python Dersleri
143/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

self.fabrika = miktar + self.fabrika


self.enerji = self.enerji - 3
self.para = self.para 10
print miktar, "adet fabrika kurdunuz! Tebrikler!"
else:
print "Yeni fabrika kuramazsnz. nk yeterli enerjiniz/paranz yok!"
macera = Oyun()
Burada fabrikakur() fonksiyonuyla ne yapmaya altmz aslnda ok ak. Hemen bunun nasl
kullanlacan grelim:
macera.fabrikakur(5)
Bu komutu verdiimizde, 5 adet fabrika kurdunuz! Tebrikler! eklinde bir kutlama mesaj
gsterecektir bize programmz Kodlarmz iindeki "def fabrikakur(self,miktar)" ifadesinde
grdmz "miktar" kelimesi, kodlar altrrken vereceimiz parametreyi temsil ediyor. Yani
burada "5" saysn temsil ediyor. Eer "macera.fabrikakur()" fonksiyonunu kullanrken herhangi bir
say belirtmezseniz, hata alrsnz. nk kodlarmz tanmlarken fonksiyon iinde "miktar" adl bir
ifade kullanarak, kullancdan fonksiyona bir parametre vermesini beklediimizi belirttik.
Dolaysyla Python kullancdan parantez iinde bir parametre girmesini bekleyecektir. Eer
fonksiyon parametresiz altrlrsa da, Python'un beklentisi karlanmad iin, hata verecektir.
Burada dikkat edeceimiz nokta, kodlar iinde bir fonksiyon tanmlarken ilk parametrenin her
zaman "self" olmas gerektiidir. Yani "def fabrikakur(miktar)" deil, "def fabrikakur(self,miktar)"
dememiz gerekiyor.
imdi de u komutu verelim:
macera.goster()
Bu komut u kty verecektir:
enerji: 47
para: 90
fabrika: 9
ii: 10
Grdnz gibi oyuncumuz 5 adet fabrika kazanm, ama bu ilem enerjisinde ve parasnda bir
miktar kayba neden olmu (fabrika kurmay bedava m sandnz!).

----------------------------------------------------------------------------------------------------------------------Python Dersleri
144/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Yazdmz kodlara dikkatlice bakarsanz, oradaki "if" deyimi sayesinde oyuncunun enerjisi 3n
altna, paras da 10un altna derse yle bir mesaj verilecektir:
Yeni fabrika kuramazsnz. nk yeterli enerjiniz/paranz yok!
Art arda fabrikalar kurarak bunu kendiniz de test edebilirsiniz.
Miras Alma (Inheritance)
imdiye kadar bir oyuncu oluturduk ve bu oyuncuya oyuna balad anda sahip olaca baz
zellikler verdik. Oluturduumuz oyuncu isterse oyun iinde fabrika da kurabiliyor. Ama byle,
kendin al, kendin oyna tarz bir durumun skc olaca belli. O yzden gelin oyuna biraz hareket
katalm! Mesela oyunumuzda bir adet oyuncu dnda bir adet de dman olsun. O halde hemen bir
adet dman oluturalm:
class Dusman:
Dmanmzn gvdesini oluturduk. imdi sra geldi onun kolunu bacan oluturmaya, ona bir
kiilik kazandrmaya
Hatrlarsanz, oyunun banda oluturduumuz oyuncunun baz zellikleri vard. (enerji, para,
fabrika, ii gibi) sterseniz dmanmzn da buna benzer zellikleri olsun. Mesela dmanmz
da oyuncunun sahip olduu zelliklerin aynsyla oyuna balasn. Yani onun da;
enerjisi 50,
paras 100
fabrika says 4,
ii says ise 10
olsun. imdi hatrlarsanz oyuncu iin bunu yle yapmtk:
class Oyun:
def __init__(self):
enerji = 50
para = 100
fabrika = 4

----------------------------------------------------------------------------------------------------------------------Python Dersleri
145/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

isci = 10
imdi ayn eyi Dusman snf iin de yapacaz. Peki bu zellikleri yeniden tek tek dman
iin de yazacak myz? Tabii ki hayr. O halde nasl yapacaz bunu? te burada imdadmza Python
snflarnn miras alma zellii yetiiyor. Yabanclar bu kavrama inheritance adn veriyorlar.
Yani, nasl Msrdaki dedenizden size miras kaldnda dedenizin size brakt mirasn
nimetlerinden her ynyle yararlanabiliyorsanz, bir snf baka bir snftan miras aldnda da ayn
ekilde miras alan snf miras ald snfn zelliklerini kullanabiliyor. Az laf, ok i. Hemen bir
rnek yapalm. Yukarda Dusman adl snfmz oluturmutuk:
class Dusman:
Dusman snf henz bu haliyle hibir ey miras alm deil. Hemen miras aldralm. Bunun iin
snfmz yle tanmlamamz gerekiyor:
class Dusman(Oyun):
Bylelikle daha en bata tanmladmz Oyun adl snf, bu yeni oluturduumuz Dusman adl
snfa miras verdik. Dusman snfnn durumunu Pythoncada yle ifade edebiliriz:
Dusman snf Oyun snfn miras ald (Dusman inherits from Oyun)
Bu haliyle kodlarmz henz eksik. imdilik yle bir ey yazp snfmz kitabna uyduralm:
class Dusman(Oyun):
pass
dsman = Dusman()
Yukarda pass ifadesini neden kullandmz biliyorsunuz. Snf tanmladktan sonra iki nokta
st stenin ardndan aaya bir kod blou yazmamz gerekiyor. Ama u anda oraya yazacak bir
kodumuz yok. O yzden idareten oraya bir pass ifadesi yerletirerek gerekli kod blounu
geitirmi oluyoruz. O ksm bo brakamayz. Yoksa snfmz kullanlamaz durumda olur. Daha
sonra oraya yazacamz kod bloklarn hazrladktan sonra oradaki pass ifadesini sileceiz.
imdi bakalm bu snfla neler yapabiliyoruz?
Bu kodlar, yaznn banda anlattmz ekilde altralm. Dediimiz gibi, Dusman adl
snfmz daha nce tanmladmz Oyun adl snf miras alyor. Dolaysyla Dusman adl snf
Oyun adl snfn btn zelliklerine sahip. Bunu hemen test edelim:

----------------------------------------------------------------------------------------------------------------------Python Dersleri
146/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

dsman.goster()
enerji: 50
para: 100
fabrika: 4
ii: 10
Grdnz gibi, Oyun snfnn bir fonksiyonu olan gosteri Dusman snf iinden de
altrabildik. stelik Dusman iinde bu deikenleri tekrar tanmlamak zorunda kalmadan
stersek bu deikenlere teker teker de ulaabiliriz:
dsman.enerji
50
dsman.isci
10
Dusman snf ayn zamanda Oyun snfnn fabrikakur adl fonksiyonuna da eriebiliyor:
dsman.fabrikakur(4)
4 adet fabrika kurdunuz! Tebrikler!
Grdnz gibi dmanmz kendisine 4 adet fabrika kurdu!.. Dmanmzn durumuna bakalm:
dsman.goster()
enerji: 47
para: 90
fabrika: 8
ii: 10
Evet, dmanmzn fabrika says artm, enerjisi ve paras azalm. Bir de kendi durumumuzu
kontrol edelim:
macera.goster()
enerji: 50
para: 100
fabrika: 4
ii: 10
Dikkat ederseniz, Oyun ve Dusman snflar ayn deikenleri kullandklar halde birindeki
deiiklik brn etkilemiyor. Yani dmanmzn yeni bir fabrika kurmas bizim deerlerimizi
deiiklie uratmyor.

----------------------------------------------------------------------------------------------------------------------Python Dersleri
147/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

imdi yle bir ey yapalm:


Dmanmzn, oyuncunun zelliklerine ek olarak bir de ego adl bir nitelii olsun. Mesela
dmanmz bize her zarar verdiinde egosu bysn!...
nce yle deneyelim:
class Dusman(Oyun):
def __init__(self):
self.ego = 0
Bu kodlar altrdmzda hata alrz. nk burada yeni bir __init__ fonksiyonu
tanmladmz iin, bu yeni fonksiyon kendini Oyun snfnn __init__ fonksiyonunun zerine
yazyor. Dolaysyla Oyun snfndan miras aldmz btn nitelikleri kaybediyoruz. Bunu nlemek
iin yle bir ey yapmamz gerekir:
class Dusman(Oyun):
def __init__(self):
Oyun.__init__(self)
self.ego = 0
Burada Oyun.__init__(self) ifadesiyle Oyun adl snfn __init__ fonksiyonu iinde yer alan
btn nitelikleri, Dusman adl snfn __init__ fonksiyonu iine kopyalyoruz. Bylece self.ego
deikenini tanmlarken, enerji, para, vb. niteliklerin kaybolmasn engelliyoruz.
Aslnda bu haliyle kodlarmz dzgn ekilde alr. Kodlarmz altrdmzda biz ekranda
gremesek de aslnda ego adl nitelie sahiptir dmanmz. Ekranda bunu gremememizin
nedeni tabii ki kodlarmzda henz bu nitelii ekrana yazdracak bir print deyiminin yer
almamas sterseniz bu zellii daha nce de yaptmz gibi ayr bir fonksiyon ile halledelim:
class Dusman(Oyun):
def __init__(self):
Oyun.__init__(self)
self.ego = 0
def goster(self):
Oyun.goster(self)
print "ego:", self.ego

----------------------------------------------------------------------------------------------------------------------Python Dersleri
148/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

dsman = Dusman()
Tpk __init__ fonksiyonunda olduu gibi, burada da Oyun.goster(self) ifadesi yardmyla
Oyun snfnn goster() fonksiyonu iindeki deikenleri Dusman snfnn goster()
fonksiyonu iine kopyaladk. Bylece ego deikenini yazdrrken, teki deikenlerin de
yazdrlmasn saladk.
imdi artk dmanmzn btn niteliklerini istediimiz ekilde oluturmu olduk. Hemen
deneyelim:
dsman.goster()
enerji: 50
para: 100
fabrika: 4
ii: 10
ego: 0
Grdnz gibi dmanmzn zellikleri arasnda oyuncumuza ilave olarak bir de ego adl bir
nitelik var. Bunun balang deerini 0 olarak ayarladk. Daha sonra yazacamz fonksiyonda
dmanmz bize zarar verdike egosu byyecek. imdi gelin bu fonksiyonu yazalm:
class Dusman(Oyun):
def __init__(self):
Oyun.__init__(self)
self.ego = 0
def goster(self):
Oyun.goster(self)
print "ego:", self.ego
def fabrikayik(self,miktar):
macera.fabrika = macera.fabrika miktar
self.ego = self.ego + 2
print "Tebrikler. Oyuncunun", miktar, "adet fabrikasn yktnz!"
print "stelik egonuz da tavana vurdu!"

----------------------------------------------------------------------------------------------------------------------Python Dersleri
149/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

dsman = Dusman()
Dikkat ederseniz, "fabrikayik" fonksiyonu iindeki deikeni "macera.fabrika" eklinde yazdk.
Yani bir nceki "Oyun" adl snfn "rneini" (instance) kullandk. "Dusman" snfnn deil...
Neden? ok basit. nk kendi fabrikalarmz deil oyuncunun fabrikalarn ykmak istiyoruz!..
Burada, u kodu altrarak oyuncumuzun kurduu fabrikalar ykabiliriz:
dsman.fabrikayik(2)
Biz burada 2 adet fabrika ykmay tercih ettik
Kodlarmzn en son halini topluca grelim isterseniz:
class Oyun:
def __init__(self):
self.enerji = 50
self.para = 100
self.fabrika = 4
self.isci = 10
def goster(self):
print "enerji:", self.enerji
print "para:", self.para
print "fabrika:", self.fabrika
print "ii:", self.isci
def fabrikakur(self,miktar):
if self.enerji > 3 and self.para > 10:
self.fabrika = miktar + self.fabrika
self.enerji = self.enerji - 3
self.para = self.para 10
print miktar, "adet fabrika kurdunuz! Tebrikler!"
else:
print "Yeni fabrika kuramazsnz. nk yeterli enerjiniz/paranz yok!"
macera = Oyun()

----------------------------------------------------------------------------------------------------------------------Python Dersleri
150/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

class Dusman(Oyun):
def __init__(self):
Oyun.__init__(self)
self.ego = 0
def goster(self):
Oyun.goster(self)
print ego:, self.ego
def fabrikayik(self,miktar):
macera.fabrika = macera.fabrika miktar
self.ego = self.ego + 2
print Tebrikler. Oyuncunun, miktar, adet fabrikasn yktnz!
print stelik egonuz da tavana vurdu!
dsman = Dusman()
En son oluturduumuz fonksiyonda nerede Oyun snfn dorudan adyla kullandmza ve
nerede bu snfn rneinden (instance) yararlandmza dikkat edin. Dikkat ederseniz, fonksiyon
balklarn arrken dorudan snfn kendi adn kullanyoruz (mesela Oyun.__init__(self)).
Bir fonksiyon iindeki deikenleri arrken ise (mesela macera.fabrika), rnei (instance)
kullanyoruz. Eer bir fonksiyon iindeki deikenleri arrken de snf isminin kendisini
kullanmak isterseniz, ifadeyi Oyun().__init__(self) eklinde yazmanz gerekir. Ama siz byle
yapmayn... Yani deikenleri arrken rnei kullann.
Artk kodlarmz didiklenmek zere sizi bekliyor. Burada yaplan eyleri iyice anlayabilmek iin
kafanza gre kodlar deitirin. Neyi nasl deitirdiinizde ne gibi bir sonu elde ettiinizi dikkatli
bir ekilde takip ederek, bu konunun zihninizde iyice yer etmesini salayn.
Aslnda yukardaki kodlar daha dzenli bir ekilde de yazmamz mmkn. rnein, enerji, para,
fabrika gibi nitelikleri ayr bir snf halinde dzenleyip, teki snflarn dorudan bu snftan miras
almasn salayabiliriz. Bylece snfmz daha derli toplu bir grnm kazanm olur. Aadaki
kodlar iinde, isimlendirmeleri de biraz deitirerek standartlatrdmza dikkat edin:

----------------------------------------------------------------------------------------------------------------------Python Dersleri
151/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

class Oyun:
def __init__(self):
self.enerji = 50
self.para = 100
self.fabrika = 4
self.isci = 10
def goster(self):
print "enerji:", self.enerji
print "para:", self.para
print "fabrika:", self.fabrika
print "ii:", self.isci
oyun = Oyun()
class Oyuncu(Oyun):
def __init__(self):
Oyun.__init__(self)
def fabrikakur(self,miktar):
if self.enerji > 3 and self.para > 10:
self.fabrika = miktar + self.fabrika
self.enerji = self.enerji - 3
self.para = self.para - 10
print miktar, "adet fabrika kurdunuz! Tebrikler!"
else:
print "Yeni fabrika kuramazsnz. nk yeterli enerjiniz/paranz yok!"
oyuncu = Oyuncu()
class Dusman(Oyun):
def __init__(self):

----------------------------------------------------------------------------------------------------------------------Python Dersleri
152/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Oyun.__init__(self)
self.ego = 0
def goster(self):
Oyun.goster(self)
print "ego:", self.ego
def fabrikayik(self,miktar):
oyuncu.fabrika = oyuncu.fabrika - miktar
self.ego = self.ego + 2
print "Tebrikler. Oyuncunun", miktar, "adet fabrikasn yktnz!"
print "stelik egonuz da tavana vurdu!"
dusman = Dusman()
Bu kodlar hakknda son bir noktaya daha deinelim. Hatrlarsanz oyuna balarken oluturulan
niteliklerde deiiklik yapabiliyorduk. Mesela yukarda Dusman snf iin ego adl yeni bir
nitelik tanmlamtk. Bu nitelik sadece Dusman tarafndan kullanlabiliyordu, Oyuncu tarafndan
deil. Ayn ekilde, yeni bir nitelik belirlemek yerine, istersek varolan bir nitelii iptal de edebiliriz.
Diyelim ki Oyuncunun oyuna balarken fabrikalar olsun istiyoruz, ama Dusmann oyun
balangcnda fabrikas olsun istemiyoruz. Bunu yle yapabiliriz:
class Dusman(Oyun):
def __init__(self):
Oyun.__init__(self)
del self.fabrika
self.ego = 0
Grdnz gibi Dusman snf iin __init__ fonksiyonunu tanmlarken fabrika niteliini
del komutuyla siliyoruz. Bu silme ilemi sadece Dusman snf iin geerli oluyor. Bu ilem
teki snflar etkilemiyor. Bunu yle de ifade edebiliriz;
del komutu yardmyla fabrika adl deikene Dusman adl blgeden eriilmesini engelliyoruz.

----------------------------------------------------------------------------------------------------------------------Python Dersleri
153/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Dolaysyla bu deiiklik sadece o blgeyi etkiliyor. teki snflar ve daha sonra oluturulacak
yeni snflar bu ilemden etkilenmez. Yani aslnda del komutuyla herhangi bir eyi sildiimiz yok!
Sadece eriimi engelliyoruz.
Kk bir not: Burada blge olarak bahsettiimiz ey aslnda Pythoncada isim
alan (namespace) olarak adlandrlyor.
imdi bir rnek de Tkinter ile yapalm. Yukarda verdiimiz rnei hatrlyorsunuz:
from Tkinter import *
class Arayuz:
def __init__(self):
pencere = Tk()
dugme = Button(text="tamam",command=self.yaz)
dugme.pack()
def yaz(self):
print "Hadi eyvallah!"
uygulama = Arayuz()
Bu rnek gayet dzgn alsa da bu snf daha dzgn ve dzenli bir hale getirmemiz mmkn:
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
class Arayuz(Frame):
def __init__(self):
Frame.__init__(self)
self.pack()
self.pencerearaclari()
def pencerearaclari(self):
self.dugme = Button(self,text="tamam",command=self.yaz)
self.dugme.pack()

----------------------------------------------------------------------------------------------------------------------Python Dersleri
154/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

def yaz(self):
print "Hadi eyvallah!"
uygulama = Arayuz()
uygulama.mainloop()
Burada dikkat ederseniz, Tkinterin Frame adl snfn miras aldk. Buradan anlayacamz gibi,
miras alma (inheritance) zelliini kullanmak iin miras alacamz snfn o anda kullandmz
modl iinde olmas art deil. Burada olduu gibi, baka modllerin iindeki snflar da miras
alabiliyoruz. Yukardaki kodlar dikkatlice inceleyin. Bata biraz kark gibi grnse de aslnda
daha nce verdiimiz basit rneklerden hi bir fark yoktur.
Eski ve Yeni Snflar
imdiye kadar verdiimiz snf rneklerinde nemli bir konudan hi bahsetmedik. Python'da iki tip
snf vardr: Eski tip snflar ve yeni tip snflar. Ancak korkmanz gerektirecek kadar fark yoktur bu
iki snf tipi arasnda. Ayrca hangi snf tipini kullanrsanz kullann sorun yaamazsnz. Ama tabii
ki kendimizi yeni tipe altrmakta fayda var, nk muhtemelen Python'un sonraki srmlerinden
birinde (byk ihtimalle Python 3.0'da) eski tip snflar kullanmdan kaldrlacaktr.
Eski tip snflar ile yeni tip snflar arasndaki en byk fark udur:
Eski tip snflar yle tanmlanr:
class Deneme:
Yeni tip snflar ise yle tanmlanr:
class Deneme(object)
Grdnz gibi, eski tip snflarda baka bir snf miras alma zorunluluu yoktur. O yzden
snflar istersek parantezsiz olarak tanmlayabiliyoruz. Yeni tip snflarda ise her snf mutlaka
baka bir snf miras almaldr. Eer kodlarnz iinde gerekten miras almanz gereken baka bir
snf yoksa, ntanml olarak "object" adl snf miras almanz gerekiyor. Dolaysyla politikamz u
olacak:
"Ya bir snf miras al, ya da miras alman gereken herhangi bir snf yoksa, "object" adl snf miras
----------------------------------------------------------------------------------------------------------------------Python Dersleri
155/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

al..."
Dediimiz gibi, eski ve yeni snflar arasndaki en temel fark budur.
Aslnda daha en bata hi eski tip snflar anlatmadan dorudan yeni tip snflar anlatmakla ie
balayabilirdik. Ama bu pek doru bir yntem olmazd. nk her ne kadar eski tip snflar sonraki
bir Python srmnde tedavlden kaldrlacaksa da, etrafta eski snflarla yazlm bolca kod
greceksiniz. Dolaysyla sadece yeni tip snflar renmek mevcut tabloyu eksik alglamak
olacaktr...

Yukarda hatrlarsanz "pass" ifadesini kullanmtk. Snflarn yaps gerei bir kod blou
belirtmemiz gerektiinde, ama o anda yazacak bir eyimiz olmadnda srf bir "yer tutucu" vazifesi
grsn diye o "pass" ifadesini kullanmtk. Yine bu "pass" ifadesini kullanarak baka bir ey daha
yapabiliriz. u rnee bakalm:
class BosSinif(object):
pass
Bylece ii bo da olsa kurallara uygun bir snf tanmlam olduk. Ayrca dikkat ederseniz,
snfmz tanmlarken "yeni snf" yapsn kullandk. zel olarak miras alacamz bir snf
olmad iin dorudan "object" adl snf miras aldk. Yine dikkat ederseniz snfmz iin bir
"rnek" (instance) de belirtmedik. Hem snfn iini doldurma iini, hem de rnek belirleme iini
komut satrndan halledeceiz. nce snfmz rnekliyoruz:
>>>sinifimiz = BosSinif()
Grdnz gibi "BosSnf()" eklinde, parametresiz olarak rnekliyoruz snfmz. Zaten parantez
iinde bir parametre belirtirseniz hata mesaj alrsnz...
imdi bo olan snfmza "nitelikler" ekliyoruz:
>>>sinifimiz.sayi1 = 45
>>>sinifimiz.sayi2 = 55
>>>sinifimiz.sonuc = sinifimiz.sayi1 * sinifimiz.sayi2
>>>sinifimiz.sonuc
2475
----------------------------------------------------------------------------------------------------------------------Python Dersleri
156/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

stersek snfmzn son halini, Python snflarnn "__dict__" metodu yardmyla grebiliriz:
>>>sinifimiz.__dict__
{'sayi2': 55, 'sayi1': 45, 'sonuc': 2475}
Grdnz gibi snfn ierii aslnda bir szlkten ibaret... Dolaysyla szlklere ait u ilemler
snfmz iin de geerlidir:
>>>sinifimiz.__dict__.keys()
['sayi2', 'sayi1', 'sonuc']
>>>sinifimiz.__dict__.values()
[55, 45, 2475]
Buradan rendiimiz baka bir ey de, snflarn ieriinin dinamik olarak deitirilebileceidir.
Yani bir snf her eyiyle tanmladktan sonra, istersek o snfn niteliklerini etkileimli olarak
deitirebiliyoruz.
Sonu
Bylece "Nesne Tabanl Programlama" konusunun sonuna gelmi oluyoruz. Aslnda daha doru bir
ifadeyle, Nesne Tabanl Programlama'ya hzl bir giri yapm oluyoruz. nk NTP u birka
sayfada anlatlanlardan ibaret deildir. Bu yazmzda bizim yapmaya altmz ey, okuyucuya
NTP hakknda bir fikir vermektir. Eer okuyucu bu yaz sayesinde NTP hakknda hi deilse
birazck fikir sahibi olmusa kendimizi baarl sayacaz. Bu yazdaki ama NTP gibi etrefilli bir
konuyu okuyucunun gznde bir nebze de olsa sevimli klabilmek, konuyu kolay hazmedilir bir
hale getirmektir. Okuyucu bu yazdan sonra NTP'ye ilikin baka kaynaklar daha bir kendine
gvenle inceleme imkanna kavuacak ve okuduunu daha kolay anlayacaktr. Bir sonraki blmde
de NTP konusunu ilemeye devam edeceiz. Ama bu kez biraz daha ayrntya girerek...
Grafik Arayz Tasarm // Temel Bilgiler
Giri
Bir programlama dilini ne kadar iyi bilirseniz bilin, bu programlama diliyle ne kadar gl
programlar yazarsanz yazn, eer programnz kullanl bir arayze sahip deilse programnzn
kullanc dzeyinde pek ilgi ekmeyecei kesin... Belki bilgisayar kurtlar komut satrndan alan
programlar kullanmaktan gocunmayacaktr, hatta sizi takdir de edecektir, ama "son kullanc"
----------------------------------------------------------------------------------------------------------------------Python Dersleri
157/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

denen kesime hitap etmediiniz srece dikkati ekmeniz g... Bu dikkati ekme meselesi de
ounlukla ancak cicili bicili arayzler vastasyla alabiliyor. Diyelim ki konsol zerinde
muhteem iler yapan dehetengiz bir program yazdnz ve piyasann kucana attnz... "Son
kullanc", programnz kurup altrmay denediinde alacanz ilk tepki: "Ama bu program
almyoo!" eklinde olacaktr... Kzsak da kzmasak da ne yazk ki durum bu.. Dost ac syler!
Madem arayz denen ey bu kadar nemli u halde biz de bu blmde Python'da nasl grafik
arayzler tasarlayacamz inceleyelim.
Arayzler tasarlamak zere gelitirilmi deiik alternatifler arasnda biz en yaygn olan Tkinter'i
kullanacaz. Aslnda Tkinter Python iinde bir modl... Neyse... Laf daha fazla uzatmadan ie
koyulalm:
Pencere Oluturmak
Arayz denilen ey tabii ki penceresiz olmaz. Dolaysyla arayz programlamann ilk adm alan
bir pencere yaratmak olacaktr.
Bata sylediimiz gibi, arayz tasarlarken Tkinter modlnden faydalanacaz. Daha nceki
yazlardan, Python'da nasl modl import edildiini hatrlyorsunuz. imdi hemen Python komut
satrnda u komutu veriyoruz:
from Tkinter import *
Eer hibir ey olmadan alt satra geildiyse sorun yok. Demek ki sizde Tkinter modl ykl. Ama
eer bu komutu verdiinizde alt satra dmek yerine bir hata mesaj alyorsanz, sebebi gerekli
modln, yani Tkinter'in sizde ykl olmamasdr. Eer hal byleyse yapacamz ilem ok basit:
Gidip paket yneticisinden python-tk adl paketi kuracaz.
Modlle ilgili ksm sa salim atlattysanz, artk u komutu verebilirsiniz:
Tk()
Eer buraya kadar herhangi bir hata yapmadysak, ekrana prl prl bir arayz penceresi zpladn
grmemiz gerekiyor. ok gzel, deil mi? Ne yalan syleyeyim, ben bu pencereyi ilk grdmde
ok heyecanlanmtm... Neyse... Konumuza dnelim...
Grdnz gibi Tk() komutuyla nmze atlayan pencere, bir pencerenin sahip olmas gereken
btn temel zelliklere sahip. Yani pencerenin sa st kesinde pencereyi kapatmaya yarayan bir
arp iareti, onun solunda pencereyi bytp kltmemizi salayan karecik ve en solda da
----------------------------------------------------------------------------------------------------------------------Python Dersleri
158/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

pencereyi grev ubuuna indirmemizi salayan eksi iareti btn ilevselliiyle karmzda
duruyor. Ayrca farkedeceiniz gibi bu pencereyi istediimiz gibi boyutlandrmamz da mmkn.
Bu komutlar hangi platformda verdiinize bal olarak, pencerenin grn farkl olacaktr. Yani
mesela bu komutlar Windows'ta verdiyseniz, Windows'un renk ve ekil emasna uygun bir pencere
oluacaktr. Eer Gnome kullanyorsanz, pencerenin ekli emali, Gnome'nin renk ve ekil
emasna uygun olarak KDE'dekinden farkl olacaktr...
Yukarda verdiimiz Tk() komutuyla aslnda Tkinter modl iindeki Tk adl snf arm
olduk. Bu snfn neye benzediini merak eden arkadalar /usr/lib/python2.4/lib-tk/ klasr
iindeki Tkinter.py modl iinde class Tk satrn arayarak bunun ne menem bir ey olduuna
bakabilir (Gereksiz bilgi: "ne menem" ifadesinin dorusu aslnda "ne mene"... Ama hep "ne
menem" biiminde kullanla kullanla, yanl kullanm doru kullanm halini alm...)
Bu arada herhangi bir hayal krkl yaamak istemiyorsanz, yukardaki from Tkinter import *
ve Tk() komutlarn verirken byk-kk harfe dikkat etmenizi tavsiye ederim. nk Tkinter
ile tkinter ayn eyler deildir...
Eer bir arayz oluturacaksak srekli komut satrnda alamayz: Mutlaka yukarda verdiimiz
komutlar bir yere kaydetmemiz gerekir. Bunun iin hemen bo bir kwrite belgesi ap iine u
satrlar ekleyelim:
from Tkinter import *
Tk()
Eer bu dosyay bu ekilde kaydeder ve altrmay denersek almasn beklediimiz pencere
almayacaktr. Burada komut satrndan farkl olarak ilave bir satr daha eklememiz gerekiyor. Yani
kodumuzun grnm u ekilde olmal:
from Tkinter import *
Tk()
mainloop()
Buradaki mainloop() satr, bir dng yaratarak, kendisinden nce gelen kodlarla belirlenen
zelliklere gre bir pencere oluturulmasn salyor. Bu satrla yaratlan dng sayesinde de
oluturulan pencere (aksi belirtilmedike veya kullanc pencereyi kapatmadka) ekranda hep ak
kalabiliyor.
imdiye kadar Python'da Tkinter yardmyla bo bir pencere oluturmay rendik... Bu heyecan
----------------------------------------------------------------------------------------------------------------------Python Dersleri
159/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

iinde bu kodlar elli defa altrp elli defa bo bir pencere olumasn izlemi olabilirsiniz... Ama
bir sre sonra bo pencere sizi skmaya balayacaktr. O yzden, gelin isterseniz imdi de bu bo
pencereyi nasl dolduracamz renelim. Hemen yeni bir kwrite belgesi aarak iine u satrlar
ekliyoruz:
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
pencere = Tk()
lk iki satrn ne olduunu zaten biliyorsunuz, o yzden aklamaya gerek yok. Ondan sonra gelen
satrda da bildiiniz gibi Tkinter modln ardk. Bir alt satrda ise yaptmz ey daha nce
grdmz Tk() komutuna bir ad vermekten ibaret... Biz burada pencere adn tercih ettik..
Tabii ki siz isterseniz emmolunuzun adn da verebilirsiniz... Hi problem deil... Hatta hi isim
vermeseniz de olur. Ama kullanm kolayl asndan isimlendirmenin zararn deil, yararn
grrsnz... imdi kodlamaya kaldmz yerden devam ediyoruz:
etiket = Label(text=Elveda Zalim Dnya!)
etiket.pack()
mainloop()
Burada "etiket" adl yeni bir deiken oluturduk. Her zamanki gibi bu "etiket" ad zorunlu bir
isimlendirme deil. stediiniz ismi kullanmakta serbestsiniz. Ancak deikenin ismi nemli olmasa
da, ierii nemli... "Tk()" komutu yardmyla en bata oluturduumuz pencereyi bir kutu olarak
dnrsek, "etiket" adyla tanmladmz deiken de bu kutu zerine yaptrlacak bir etiket
olarak dnlebilir. Bahsettiimiz bu kutunun zerine etiketini yaptrmak iin "Label" adl zel
bir ilevden faydalanyoruz. (Bu arada "label" kelimesi ngilizce'de "etiket" anlamna geliyor)
"Label" ifadesini bu adla aklmza kazmamz gerekiyor. Daha sonra bu Label ifadesine parametre
olarak bir metin iliyoruz. Metnimiz "Elveda Zalim Dnya!". Metnimizin ad ise "text". "Label"
ifadesinde olduu gibi, "text" ifadesi de aklmza kazmamz gereken ifadelerden birisi. Bunu bu
ekilde renmemiz gerekiyor. Kendi kendinize baz denemeler yaparak bu satrda neleri deitirip
neleri deitiremeyeceinizi incelemenizi tavsiye ederim...
Bir alt satrda "etiket.pack()" ifadesini gryoruz. Bu satr, yukardaki satrn ilevli hale gelmesini
salyor. Yani kutu zerine etiketi yaptrdktan sonra bunu alp kargoya vermemize yaryor. Eer
bu satr kullanmazsak bir gzel hazrlayp etiketlediimiz kutu kargoya verilmemi olaca iin
----------------------------------------------------------------------------------------------------------------------Python Dersleri
160/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

kullancya ulamayacaktr.
En sondaki "mainloop()" ifadesini ise zaten tanyorsunuz: Yukarda yazdmz btn kodlarn
iletilerek bir pencere eklinde sunulmasn salyor.
Kodlarmzn son hali yle olmal:
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
pencere = Tk()
etiket = Label(text="Elveda Zalim Dnya!")
etiket.pack()
mainloop()
Grdnz gibi yine gayet k, iinde "Elveda Zalim Dnya!" yazan bir pencere elde ettik.
Yukarda yazdmz kodlar alternatif olarak u ekilde ksaltmamz da mmkn:
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
etiket = Label(Tk(), text = "GUI dediin her eve lazm!")
etiket.pack()
mainloop()
Burada dikkat ederseniz "Tk()" satrn alp dorudan "Label()" ifadesi iine bir parametre olarak
gmdk. Bunu yaparken "text" deikeniyle arasna bir virgl koyduumuza dikkat edin...
Pencere Bal
Bildiiniz gibi, gndelik yaamda karmza kan pencerelerde genellikle bir balk olur. Mesela
bilgisayarnz size bir hata mesaj gsterirken pencerenin tepesinde "Hata" ya da "Error" yazdn
grrsnz. Mesela u anda baktnz pencerenin en tepesinde, "Python (10. Blm)
Wiki.Pardus-Linux.Org Mozilla Firefox" yazyor. Eer istersek biz de oluturduumuz
pencerelerin tepesine byle ifadeler yerletirebiliriz. te bu ii yapmak, yani penceremizin baln
deitirmek iin "title" adl metottan yararlanmamz gerekiyor. Yani bunun iin yazdmz kodlara
una benzer bir satr eklemeliyiz:
----------------------------------------------------------------------------------------------------------------------Python Dersleri
161/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

pencere.title("Balk")
Hemen bu zellii bir rnekle gsterelim ki bu bilgi kafamzda somutlasn:
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
pencere = Tk()
baslik = pencere.title("Hi bir ie yaramayan bir pencereyim ben...")
etiket.pack()
etiket= Label(text="...ama en azndan bir balm var!")
mainloop()
Grdnz gibi pencereye balk eklemek son derece kolay... Tek bir satrla ii halledebiliyoruz.
stelik herhangi bir "paketleme" ilemi yapmamz da gerekmiyor.
Pencerelerle ilgili daha karmak zelliklere gemeden nce isterseniz burada bir durup imdiye
kadar rendiklerimizi ok ksa bir ekilde zetleyelim:
1. ncelikle "from Tkinter import *" diyerek gerekli modl yklememiz gerekiyor.
2. Ardndan " Tk()" yardmyla bo bir pencere oluturuyoruz. Kullanm kolayl asndan " Tk()"
ifadesini isimlendirerek bir deikene atamay tercih edebilirsiniz. rnein; kebap = Tk()
3. Bundan sonra pencere iine yazmak istediimiz ifadeyi ieren bir etiket hazrlamamz gerekiyor.
Bu etiketi alp "Tk()" isimli kutunun zerine yaptracaz. Bu i iin bize "Label()" adl ara
yardmc olacak. Bu fonksiyonun parametresi olarak yazacamz "text" adl deikene istediimiz
metni girebiliriz. Mesela: oyun = label(text="Bilgisayarnza virs bulam!")
4. Eer istersek en bataki "Tk()" ifadesini dorudan "Label()" aracnn bir parametresi olarak da
atayabiliriz. yle ki: oyun = Label(Tk(), text = "Sabit diski silmemiz gerekecek!")
5. Etiketimizi hazrladktan sonra paketleyip kargoya vermemiz gerekiyor. Grafik arayzn
kullancya ulamas iin bu gerekli... Bunun iin "xxx.pack()" ifadesini kullanacaz. Buradaki
"xxx" yerine, bir st satrda hazrladmz etiket iin kullandmz ismi yazacaz. Mesela:
oyun.pack()
6. Btn bu yazdmz kodlarn ilevli hale gelebilmesi iin ise en sona "mainloop()" ifadesini
yerletirmemiz gerekiyor.

----------------------------------------------------------------------------------------------------------------------Python Dersleri
162/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

7. Eer hazrladmz pencerenin bir de bal olsun istiyorsak "title" adl metottan yararlanyoruz.
u ana kadar yapabildiimiz tek ey bir pencere oluturup iine bir metin eklemek ve pencerede
basite bir balk oluturmak. Ama tabii ki bir sre sonra bu da bizi skacaktr. Hem sadece bu
zellikleri renerek heyecan verici arayzler hazrlamamz pek mmkn deil... En fazla,
arkadalarmza ufak tefek eek akalar yapabiliriz bu rendiklerimizle!
Yeri gelmiken, hazrladmz program, simgesi zerine ift tklayarak nasl altracamz
grelim imdi. Geri daha nceki blmlerden hatrlyoruz bu iin nasl yaplacan, ama biz yine
de tekrar hatrlatalm:
1. .py uzantl dosyamz, yani kodlarmz hazrlarken ilk satra #!/usr/bin/env python ifadesini
mutlaka yazyoruz.
2. Kaydettiimiz .py uzantl dosyaya sa tklayarak "zellikler"e giriyoruz
3. Burada "izinler" sekmesinde "altrlabilir" ifadesinin yanndaki kutucuu iaretliyoruz
4. "Tamam" diyerek kyoruz.
Bylece artk programmzn simgesi zerine ift tklayarak arayzmz altrabiliriz.
Renkler
Dikkat ettiyseniz imdiye dek oluturduumuz pencerelerde yazdmz yazlar hep siyah renkte.
Tabii ki, siz oluturduunuz pencereler iindeki metinlerin her daim siyah olmasn istemiyor
olabilirsiniz. ntanml renkleri deitirmek sizin en doal hakknz. Tkinter'le alrken renklerle
oynamak olduka basittir. Renk ilemleri Tkinter'de birtakm ifadeler vastasyla hallediliyor.
Python dilinde bu ifadelere "seenek" (option) ad veriliyor. Mesela daha nce rendiimiz ve
etiket iine metin yerletirmemizi salayan "text" ifadesi de bir "seenek"tir... imdi reneceimiz
seeneklerin kullanm da tpk bu "text" seeneinin kullanmna benzer.
fg seenei
Diyelim ki pencere iine yazdmz bir metni, daha fazla dikkat ekmesi iin krmz renkle
yazmak istiyoruz. te bu ilem iin kullanmamz gereken ey "fg" seenei... Bu ifade
ngilizce'deki "foreground" (nplan, nalan) kelimesinin ksaltmas oluyor. Hemen bir rnek
verelim:
#!/usr/bin/env python
#-*-coding:utf-8-*----------------------------------------------------------------------------------------------------------------------Python Dersleri
163/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

from Tkinter import *


pencere = Tk()
pencere.title("Hata!")
etiket = Label(text = "Hata: Bilinmeyen Hata 404", fg="red")
etiket.pack()
mainloop()
Grdnz gibi yaptmz tek ey "fg" seeneini etiketin iine yerletirmek. Burada krmz renk
iin kullandmz kelime, ngilizce'de "krmz" anlamna gelen "red" szc... Yani "insan"
dilinde kullanlan renkleri dorudan Tkinter'de de kullanabiliyoruz. Tabii bu noktada biraz ngilizce
bilmek iinizi bir hayli kolaylatracaktr. Tkinter'de kullanabileceimiz, ngilizce renk adlarndan
birka tanesini hemen sralayalm:
red = krmz
white = beyaz
black = siyah
yellow = sar
blue = mavi
brown = kahverengi
green = yeil
pink = pembe
Tkinter'de kullanlabilecek renk adlar bunlarla snrl deil. Eer mevcut renk listesini grmek
isterseniz, u adrese bir bakabilirsiniz: http://www.tcl.tk/man/tcl8.3/TkCmd/colors.htm
bg seenei
Bu da ngilizce'deki "background" (arkaplan, arkaalan) kelimesinin ksaltmas. Adndan da
anlalaca gibi pencereye yazdmz metnin arkaplan rengini deitirmeye yaryor. Kullanm
yle:
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
pencere = Tk()
pencere.title("Hata!")
----------------------------------------------------------------------------------------------------------------------Python Dersleri
164/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

etiket = Label(text = "Hata: Bilinmeyen Hata 404", bg="blue")


etiket.pack()
mainloop()
Yukarda verdiimiz renkleri bu seenek iin de kullanabilirsiniz. Ayrca bu seenek bir nceki "fg"
seeneiyle birlikte de kullanlabilir:
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
pencere = Tk()
pencere.title("Hata!")
etiket = Label(text = "Hata monitrle sandalyenin tam arasnda!", fg="red", bg="black")
etiket.pack()
mainloop()

Yaz Tipleri (Fonts)


Tkinter bize renklerin yansra yaz tipleriyle de oynama imkan veriyor. Hazrladmz
pencerelerdeki yaz tiplerini deitirmek iin, tpk renklerde olduu gibi, yine baz seeneklerden
faydalanacaz. Burada kullanacamz seenein ad, "font". Bunu kullanmak iin kodlarmz
arasna una benzer bir "seenek" eklememiz gerekiyor.
font= "Helvetica 14 bold"
Burada tahmin edebileceiniz gibi, "Helvetica" yaz tipini; "14" yaz boyutunu; "bold" ise yaznn
kaln olacan gsteriyor. rnek bir kullanm yledir:
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
pencere = Tk()
etiket = Label(text="Merhaba Dostlar!", font="Times 15 italic")
etiket.pack()
mainloop()
Burada yaz tipi olarak "Times"; yaz boyutu olarak "15"; yaz biimi olarak ise "italic", yani
----------------------------------------------------------------------------------------------------------------------Python Dersleri
165/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

"yatk" biim setik. "font" seenei ile birlikte kullanabileceimiz ifadeler unlardr:
italic = yatk
underline = alt izili
bold = kaln
overstrike = kelimenin st izili
Yaz tipi olarak ise unlar kullanabilirsiniz:
Century Schoolbook L
DejaVu Sans
DejaVu Sans
DejaVu Sans Condensed
DejaVu Sans Mono
DejaVu Serif
DejaVu Serif
Dingbats
FreeMono
FreeSans
FreeSerif
Nimbus Mono L
Nimbus Roman No9 L
Nimbus Sans L
Standard Symbols L
URW Bookman L
URW Chancery L
URW Gothic L
URW Palladio L
pardus
Bu listede birden fazla kelimeden oluan yaz tiplerini gsterirken kelimeleri birleik yazmamz
gerekiyor. Mesela "DejaVu Sans" semek iin "DejaVuSans" yazmamz lazm...
Metin Biimlendirme
Daha nceki yazlarmzda rendiimiz metin biimlemeye yarayan iaretleri Tkinter'de de
----------------------------------------------------------------------------------------------------------------------Python Dersleri
166/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

kullanabiliyoruz. Yani mesela yle bir ey yapabiliyoruz:


#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
pencere = Tk()
etiket = Label(text="Merhaba Dostlar!\n\tNaslsnz?", font="DejaVuSans 15 italic")
etiket.pack()
mainloop()
Grdnz gibi, daha nceki yazlarmzda rendiimiz "\n" ve "\t" ka dizilerini burada da
kullanabiliyoruz.
mleler
Arayzlerinizi olutururken farkl imle ekilleri kullanmak da isteyebilirsiniz. Bunun iin
kullanacamz seenek "cursor". Mesela:
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
pencere = Tk()
etiket = Label(text="Deneme 1,2,3...", cursor="bottom_side")
etiket.pack()
mainloop()
Burada, imleci pencere zerine getirdiimizde imlecin ters ok ekli aldn grrz.
Kullanlabilecek

imle

isimleri

iin

sayfaya

bakabilirsiniz:

http://www.dil.univ-

mrs.fr/~garreta/PythonBBSG/docs/Tkinter_ref.pdf
Burada 10. ve 11. sayfalarda hounuza gidebilecek imle isimlerini seebilirsiniz.
Pencere Boyutu
Diyelim ki iinde sadece bir "etiket" barndran bir pencere oluturduk:
#!/usr/bin/env python
#-*-coding:utf-8-*----------------------------------------------------------------------------------------------------------------------Python Dersleri
167/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

from Tkinter import *


pencere = Tk()
etiket = Label(text="Hata!")
etiket.pack()
mainloop()
Bu kodlar altrdmzda karmza kan pencere ok kk. O yzden pencerenin tepesindeki
eksi, kk kare ve arp iaretleri grnmyor. Bunlar grebilmek iin pencereyi elle
boyutlandrmamz gerekiyor. Tabii bu her zaman arzu edilecek bir durum deil. Bu gibi durumlar
engellemek ve penceremizi istediimiz boyutta oluturabilmemiz iin, Tkinter bize gayet kullanl
bir imkan sunuyor:
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
pencere = Tk()
pencere.geometry("100x100+15+100")
etiket = Label(text="Hata!")
etiket.pack()
mainloop()
Grdnz gibi, burada pencere.geometry ifadesinin karsna birtakm saylar ekleyerek
penceremizi boyutlandryoruz. lk iki rakam (100x100) penceremizin 100x100 boyutunda
olduunu; son iki rakam ise (+15+100) penceremizin ekrana gre soldan saa doru 15.
pozisyonda; yukardan aaya doru ise 100. pozisyonda alacan gsteriyor. Yani bu satr
sayesinde penceremizin hem boyutunu hem de konumunu deitirmi oluyoruz. Bu drt rakam
deitirerek kendi kendinize denemeler yapmanz tavsiye ederim.
imdi son bir zellikten bahsedip bu konuyu kapatalm... Grdnz gibi oluturduumuz bir
pencere ek bir abaya gerek kalmadan bir pencerenin sahip olabilecei btn temel nitelikleri
tayor. Buna pencerenin kullanc tarafndan serbeste boyutlandrlabilmesi de dahil... Ancak baz
uygulamalarda bu zellik anlamsz olaca iin (mesela hesap makinelerinde) kullancnn
pencereyi boyutlandrmasna engel olmak isteyebilirsiniz. Bu ii yapmak iin u kodu kullanyoruz:
pencere.resizable(width=FALSE, height=FALSE)
rnek bir uygulama yle olacaktr:
----------------------------------------------------------------------------------------------------------------------Python Dersleri
168/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
pencere = Tk()
pencere.resizable(width=FALSE, height=FALSE)
etiket = Label(text="Deneme 1,2,3...", cursor="bottom_side")
etiket.pack()
mainloop()
Grdnz gibi bu kodlar altrldnda ortaya kan pencere hibir ekilde boyutlandrma kabul
etmiyor...
Bylelikle Arayz Tasarm konusunun "Temel Bilgiler" ksmn bitirmi oluyoruz. Bir sonraki
blmde Tkinter'de "Pencere Aralarn" (widgets) kullanmay reneceiz.
Grafik Arayz Tasarm // Pencere Aralar (Widgets)
Giri
Herhangi bir pencere zerinde bulunan dmeler, etiketler, saa-sola, yukar-aa kayan ubuklar,
kutular, menler, vb. hepsi birden pencere aralarn, yani widget'leri, oluturuyor.
Aslnda imdiye kadar bu pencere aralarndan bir tanesini grdk. Bildiimiz bir pencere arac
olarak elimizde imdilik "Label" bulunuyor:
"Label" Pencere Arac
Daha nce de sylediimiz gibi bu kelime ngilizce'de "etiket" anlamna geliyor. Bu ara, anlamna
uygun olarak pencerelerin zerine etiket misali eler yaptrmamz salyor.
Hatrlayacanz gibi bu arac "Label()" eklinde kullanyorduk. sterseniz bununla ilgili olarak
hemen basit bir rnek verelim:
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
pencere = Tk()
etiket = Label(text = "Hata: Bellek Read Olamad! Bellei vurmam ister misiniz?")
----------------------------------------------------------------------------------------------------------------------Python Dersleri
169/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

etiket.pack()
mainloop()
Grdnz

gibi

yukardaki

kullanmda

"Label"

arac

bir

metnin

pencere

zerinde

grntlenmesini salyor.
"Button" Pencere Arac
Bu ara yardmyla pencerelerimize, tklandklarnda belli bir ilevi yerine getiren dmeler
ekleyebileceiz. Hemen bir rnek verelim:
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
pencere = Tk()
dugme = Button(text="TAMAM", command = pencere.quit)
dugme.pack()
mainloop()
Dikkat ederseniz, "Button" aracnn kullanm daha nce grdmz "Label" aracnn kullanmna
ok benziyor. Burada da parantez iinde baz parametreler kullandk. "text" parametresini zaten
biliyoruz: Kullancya gstermek istediimiz metni bu "text" parametresi yardmyla belirliyoruz.
Ayn parantez iinde grdmz "command" parametresi ise dme zerine tklandnda
iletilecek komutu gsteriyor. Biz burada "pencere.quit" komutunu vererek, dmeye tklandnda
pencerenin kapatlmasn istedik.
Dolaysyla bir satr iinde yeni zellik grm oluyoruz:
Button = Kullanacamz pencere arac ("button": "dme")
command = Oluturduumuz dmeye tklandnda altrlacak komut
xxx.quit = Dmeye tklandnda pencerenin kapatlmasn salayan komut.
Daha sonra gelen satrdaki ifade size tandk geliyor olmal: "dugme.pack()". Tpk daha nce
"etiket.pack()" ifadesinde grdmz gibi, bu ifade de hazrladmz pencere aracnn kargoya
verilmek zere "paketlenmesini" salyor.
En son satrdaki "mainloop()" ifadesinin ne ie yaradn artk sylemeye bile gerek yok...
Yukarda bahsettiimiz "command" parametresi ok gzel iler yapmanz salayabilir. Mesela
----------------------------------------------------------------------------------------------------------------------Python Dersleri
170/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

diyelim ki, "olutur" dmesine basnca bilgisayarda yeni bir dosya oluturan bir arayz tasarlamak
istiyoruz. O halde hemen bu dncemizi tatbik sahasna koyalm:
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
def olustur():
dosya = open("deneme.txt", "w")
pencere = Tk()
dugme = Button(text = "olutur", command=olustur)
dugme.pack()
mainloop()
Grdnz gibi, Tkinter modln ardktan sonra bir fonksiyon oluturduk. Tkinter dndan
bir komut altrmak istediimizde bu ekilde bir fonksiyon tanmlamamz gerekir.
Daha sonra her zaman yaptmz gibi, "Tk()" komutuyla penceremizi oluturduk. Button()
yardmyla da pencereye yerletireceimiz dmeyi meydana getirdik. Burada "command"
parametresine biraz nce oluturduumuz fonksiyonu atayarak dmeye basldnda yeni bir dosya
oluturulmasna zemin hazrladk. "text" parametresi yardmyla da dmemizin adn "olutur"
olarak belirledik. Ondan sonraki satrlar ise zaten artk ezbere biliyoruz.
Eer bu kodlar yazarken, yukardaki gibi bir fonksiyon oluturmadan;
dugme = Button(text = "olutur", command=open("deneme.txt","w"))
gibi bir satr oluturursanz, "deneme.txt" adl dosya dmeye henz basmadan oluacaktr...
sterseniz bu arayze bir de "k" dmesi ekleyebiliriz:
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
def olustur():
dosya = open("deneme.txt", "w")
pencere = Tk()
dugme = Button(text = "olutur", command=olustur)
dugme.pack()
----------------------------------------------------------------------------------------------------------------------Python Dersleri
171/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

dugme2 = Button(text = "k", command=pencere.quit)


dugme2.pack()
mainloop()
Burada yaptmz ey, ikinci bir dme oluturmaktan ibaret... Oluturduumuz "dugme2" adl
deiken iin de "dugme2.pack" ifadesini kullanmay unutmuyoruz.
Dmelerin pencere stnde byle alt alta grnmesini istemiyor olabilirsiniz. Herhalde yan yana
duran dmeler daha zarif grnecektir. Bunun iin kodumuza u eklemeleri yapmamz gerekiyor:
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
def olustur():
dosya = open("deneme.txt", "w")
pencere = Tk()
dugme = Button(text = "olutur", command=olustur)
dugme.pack(side=LEFT)
dugme2 = Button(text = "k", command=pencere.quit)
dugme2.pack(side=RIGHT)
mainloop()
Paketleme aamasnda dmelerden birine side=LEFT parametresini ekleyerek o dmeyi sola;
brne de side=RIGHT parametresini ekleyerek saa yaslyoruz.
"Entry" Pencere Arac
Bu ara yardmyla kullancnn metin girebilecei tek satrlk bir alan oluturacaz. Bu pencere
aracnn kullanm da dier aralarn kullanmna benzer. Hemen bir rnek verelim:
from Tkinter import *
pencere = Tk()
giris = Entry()
giris.pack()
mainloop()
Her zamanki gibi ilk nce Tkinter modln ararak ie baladk. Hemen ardndan da "pencere"
----------------------------------------------------------------------------------------------------------------------Python Dersleri
172/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

adn verdiimiz bo bir pencere oluturduk. Dediimiz gibi, "Entry" aracnn kullanm daha nce
szn ettiimiz pencere aralarnn kullanmna ok benzer. Dolaysyla "giris" adn verdiimiz
"Entry()" aracn rahatlkla oluturabiliyoruz. Bundan sonra yapmamz gereken ey, tabii ki, bu
pencere aracn paketlemek. Onu da "giris.pack()" satr yardmyla hallediyoruz. Son darbeyi ise
"mainloop" komutuyla vuruyoruz.
Grdnz gibi, kullancya tek satrlk metin girme imkan veren bir arayz oluturmu olduk.
sterseniz imdi bu pencereye birka dme ekleyerek daha ilevli bir hale getirelim arayzmz.
Mesela pencere zerinde program kapatmaya yarayan bir dme ve kullancnn yazd metni
silen bir dme bulunsun:
#!/usr/bin/env python
#-*- coding: utf-8 -*from Tkinter import *
def sil():
giris.delete(0,END)
pencere = Tk()
giris = Entry()
giris.pack()
dugme1 = Button(text = "KAPAT", command = pencere.quit)
dugme1.pack(side = LEFT)
dugme2 = Button(text = "SL", command = sil)
dugme2.pack(side = RIGHT)
mainloop()
Bu kodlar iinde bize yabanc olan tek ifade "giris.delete(0, END)". Bu komut, grnnden de
anlalaca gibi, "giris" deikeninin ieriini silmeye yaryor. Parantez iindeki "0, END" ifadesi,
metin kutusuna girilen kelimenin en bandan en sonuna kadar btn harflerin silinmesi emrini
veriyor. Eer "0, END" yerine, mesela "2, 4" gibi bir ifade koysaydk, girilen kelimenin 2. harfinden
itibaren 4. harfine kadar olan ksmn silinmesi emrini vermi olacaktk. Son bir altrma yaparak bu
arac da tamamlayalm:
#!/usr/bin/env python
#-*- coding:utf-8-*from Tkinter import *
----------------------------------------------------------------------------------------------------------------------Python Dersleri
173/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

def olustur():
dosya = open("deneme.txt","w")
metin = giris.get()
dosya.write(metin)
pencere = Tk()
giris = Entry()
giris.pack()
dugme = Button(text = "OLUTUR", command = olustur)
dugme.pack(side=LEFT)
dugme2 = Button(text = "IK", command = pencere.quit)
dugme2.pack(side=RIGHT)
mainloop()
Burada da bize yabanc olan tek ifade "giris.get()"... Bu ifade "Entry" pencere arac ile kullancdan
aldmz metni elimizde tutup saklamamz salyor. Burada bu ifadeyi nce "metin" adl bir
deikene atadk, sonra da bu metin deikeninin ieriini "dosya.write(metin)" komutunun
yardmyla bo bir dosyaya aktardk. Metin kutusunun ieriini barndran "deneme.txt" isimli
dosya /home klasrnzn altnda veya masastnde olumu olmal...
Bir rnek daha yapalm...
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
import random
def bas():
a = random.randint(1,100)
giris.delete(0,END)
giris.insert(0, a)
pencere = Tk()
giris = Entry(width=10)
giris.pack()

----------------------------------------------------------------------------------------------------------------------Python Dersleri
174/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

dugme = Button(text="bas", command=bas, width=2, height=0)


dugme.pack()
mainloop()
Grdnz gibi, bu uygulama 1 ile 100 arasnda rastgele saylar seiyor... Aslnda yaptmz
ilem ok basit:
ncelikle Python'un "random" adl modln ardk. Rastgele saylar seerken bize bu modl
yardmc olacak. Ardndan da bu rastgele saylar oluturup ekrana yazdrmamz salayacak
fonksiyonu oluturuyoruz. Bu fonksiyonda ncelikle rastgele saylarn hangi aralkta olacan
belirleyip bunu "a" adl bir deikene atyoruz. Bylece rastgele saylar ekrana yazdrmak iin
gereken altyapy oluturmu olduk. imdi bu noktada eer bir nlem almazsak ekrana baslacak
saylar yan yana sralanacaktr. Yani mesela diyelim ki ilk rastgele saymz 3 olsun. Bu 3 says
ekrana yazldktan sonra ikinci rastgele say ekrana gelmeden nce bu ilk saynn ekrandan
silinmesi gerekiyor. Btn saylar yan yana ekrana dizilmemeli. Bunun iin kodumuza u satr
ekliyoruz:
giris.delete(0,END)
Bu satr sayesinde, ilk say ekrana basldktan sonra ekrann 0. konumundan sonuncu konumuna
kadar btn her eyi siliyoruz. Bylelikle ikinci gelecek say iin yer am oluyoruz. sterseniz
yukardaki kodlar bu satr olmadan altrmay bir deneyebilirsiniz. Ondan sonra gelen satrn ne
ie yaradn anlamsnzdr: "a" deikenini 0. konuma yerletiriyoruz. Fonksiyonumuzu bylece
tamamlam olduk. Daha sonra normal bir ekilde "Entry" ve Button" adl pencere aralar
yardmyla dmelerimizi ve metin alanmz oluturuyoruz. Burada baz yeni "seenekler"
dikkatiniz ekmi olmal: Bunlar, "width" ve "height" adl seenekler... "width" seenei yardmyla
bir pencere aracnn geniliini; "height" seenei yardmyla ise o aracn yksekliini belirliyoruz.
"Checkbutton" Pencere Arac
"Checkbutton" denen ey, bildiimiz "onay kutusu"... Basite u ekilde oluturuyoruz bu onay
kutusunu:
#!/usr/bin/python
#-*-coding=utf-8-*from Tkinter import *
pencere = Tk()
----------------------------------------------------------------------------------------------------------------------Python Dersleri
175/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

onay = Checkbutton()
onay.pack()
mainloop()
Tabii ki muhtemelen bu onay kutumuzun, hatta kutularmzn birer ad olsun isteriz:
#!/usr/bin/python
#-*-coding=utf-8-*from Tkinter import *
pencere = Tk()
onay_el = Checkbutton(text="elma")
onay_el.pack()
onay_sa = Checkbutton(text="salatalk")
onay_sa.pack()
onay_do = Checkbutton(text="domates")
onay_do.pack()
onay_ka = Checkbutton(text="karnbahar")
onay_ka.pack()
mainloop()
Gayet gzel.. Ama grdnz gibi eler alt alta sralanrken hizal deiller. Dolaysyla gze pek
ho grnmyorlar. Eer istersek yle bir grnm verebiliriz onay kutularmza:
#!/usr/bin/python
#-*-coding=utf-8-*from Tkinter import *
pencere = Tk()
onay_el = Checkbutton(text="elma")
onay_el.pack(side=LEFT)
onay_sa = Checkbutton(text="salatalk")
onay_sa.pack(side=LEFT)
onay_do = Checkbutton(text="domates")
onay_do.pack(side=LEFT)
onay_ka = Checkbutton(text="karnbahar")
onay_ka.pack(side=LEFT)
----------------------------------------------------------------------------------------------------------------------Python Dersleri
176/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

mainloop()
eler byle yan yana dizildiklerinde fena grnmyorlar, ama biz yine de elerin dzgn ekilde
alt alta dizilmesini isteyebiliriz. Eer bu konuda srarcysak bu noktada farkl bir bilgiye ihtiyacmz
var.
Bildiiniz ve grdnz gibi, herhangi bir pencere arac oluturduktan sonra "pack" ifadesi
yardmyla pencere aracmz paketliyorduk. Aslnda bu "pack" ifadesi Tkinter'de "Geometri
Yneticisi" denen aralardan bir tanesidir. Geometri Yneticileri bir pencere aracnn nasl
grneceini, nerede duracan, yani ksaca o aracn eklini emalini belirlerler. Mesela "pack" adl
Pencere Yneticisine, yukarda grdmz gibi bir "side=LEFT" parametresi eklediimizde ilgili
pencere arac sola yaslanyor... Tkinter'de adet Geometri Yneticisi bulunur:
+ Pack Geometri Yneticisi
+ Grid Geometri Yneticisi
+ Place Geometri Yneticisi
Bu Geometri Yneticilerinin her birinin ayr zellikleri vardr ve bunlarn her biri belli bir ilevi
yerine getirmede daha baarldr. Pack ve Grid Geometri Yneticileri genel olarak hemen her ii
yapmamza izin verir. O yzden bu iki Ynetici gayet kullanldr. Place Geometri Yneticisi ise
pencere aralarn pencere zerinde yerli yerine oturtma konusunda ok ustadr. O yzden pencere
aralarn istediimiz ekilde pencere zerine konumlandrmak istediimiz zaman bu ii en kolay
Place Geometri Yneticisi yardmyla yapabiliriz.
Geometri Yneticileri ile ilgili olarak aklmzda tutmamz gereken en nemli ey ayn pencere
zerinde birbirinden farkl Yneticileri bir arada kullanmamaktr... Bunun ne demek olduunu
ilerde rneklerle gsterdiimiz zaman ok daha iyi anlayacaksnz.
Dediimiz gibi, pencere aralarn istediimiz ekilde dizmek iin en uygun geometri yneticisi
"place" adl olan... imdi bununla ilgili bir rnek grelim.. Mesela bir tane onay kutusu oluturup
bunu en sola yaslayalm:
from Tkinter import *
pencere = Tk()
onay = Checkbutton(text="Pardus")
onay.place(relx = 0.0, rely = 0.1)
mainloop()

----------------------------------------------------------------------------------------------------------------------Python Dersleri
177/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Grdnz gibi, bu place adl ynetici de tpk pack gibi alyor. Burada dikkatimizi eken "relx"
ve "rely" seenekleri onay kutusunun koordinatlarn gsteriyor. Buna gre onay kutumuz x
dzlemi zerinde 0.0 konumunda; y dzlemi zerinde ise 0.1 konumunda yer alyor. Yani yukardan
aaya 0.0; soldan saa 0.1 konumunda bulunuyor pencere aracmz.
Hemen Birka tane daha onay kutusu ekleyelim:
#!/usr/bin/python
#-*-coding=utf-8-*from Tkinter import *
pencere = Tk()
onay_pa = Checkbutton(text="Pardus")
onay_pa.place(relx = 0.0, rely = 0.1)
onay_de = Checkbutton(text="Debian")
onay_de.place(relx = 0.0, rely = 0.2)
onay_ub = Checkbutton(text="Ubuntu")
onay_ub.place(relx = 0.0, rely = 0.3)
onay_wix = Checkbutton(text="Windows XP")
onay_wix.place(relx = 0.0, rely = 0.4)
mainloop()
Dikkat ederseniz yukardaki btn onay kutularnn relx seenei 0.0 iken, rely seenekleri birer
birer artm... Bunun nedeni, btn onay kutularn sola yaslayp hepsini alt alta dizmek
isteyiimiz... Bu rnek relx ve rely seeneklerinin nasl kullanlaca konusunda iyi bir fikir vermi
olmal. Eer bir kolaylk salayacaksa, relx'i stun, rely'yi ise satr olarak dnebilirsiniz.
imdi de mesela "Pardus"u "Debian"n yanna, "Ubuntu"yu da "Windows XP"nin yanna gelecek
ekilde alt alta sralayalm:
#!/usr/bin/python
#-*-coding=utf-8-*from Tkinter import *
pencere = Tk()
onay_pa = Checkbutton(text="Pardus")
onay_pa.place(relx = 0.0, rely = 0.1)
onay_de = Checkbutton(text="Debian")
----------------------------------------------------------------------------------------------------------------------Python Dersleri
178/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

onay_de.place(relx = 0.4, rely = 0.1)


onay_ub = Checkbutton(text="Ubuntu")
onay_ub.place(relx = 0.0, rely = 0.2)
onay_wix = Checkbutton(text="Windows XP")
onay_wix.place(relx = 0.4, rely = 0.2)
mainloop()
Pardus'u 0.0 no'lu stunun 0.1 no'lu satrna; Debian' da 0.4 no'lu stunun 0.1 no'lu satrna
yerletirdik. Ayn ekilde Ubuntu'yu 0.0 no'lu stunun 0.2 no'lu satrna; Windows XP'yi de 0.4 no'lu
stunun 0.2 no'lu satrna yerletirdik.
Eer oluturduumuz bu onay kutularna biraz canllk katmak istersek, yani mesela kutunun seili
olup olmamasna gre baz iler yapmak istersek kullanmamz gereken baz zel kodlar var...
nce hemen yazmamz gereken ilk satrlar yazalm:
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
pencere = Tk()
Bunun hemen ardndan yle iki satr ekleyelim:
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
pencere = Tk()
d = IntVar()
d.set(0)
Burada "d=IntVar()" satryla yaptmz ey "d" adl bir deiken oluturup, bunun deeri olarak
"IntVar()" ifadesini belirlemek... Peki bu "IntVar()" denen ey de ne oluyor?
IntVar(), ngilizce "Integer Variable" (Say Deikeni) ifadesinin ksaltmas. Bu ifade yardmyla
deiken olarak bir say belirlemi oluyoruz. Bunun dnda Tkinter'de kullanacamz, buna benzer
iki ifade daha var: StringVar() ve DoubleVar()
StringVar() yardmyla karakter dizilerini; DoubleVar() yardmyla da Ondalk Saylar (kayan
noktal saylar floats) depolayabiliyoruz. Buraya kadar anlattklarmz biraz bulank gelmi
----------------------------------------------------------------------------------------------------------------------Python Dersleri
179/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

olabilir... Ama endieye hi gerek yok. d=IntVar() satrnn hemen altndaki d.set(0) ifadesi pek ok
eyi akla kavuturacak. O halde hemen bu satrn anlamn kavramaya alalm..
Aslnda d = IntVar() ifadesi yardmyla baladmz ii tamamlamamz salayan satr bu d.set(0)
satr... Bunun yardmyla "d=IntVar()" ifadesinin deeri olarak "0" setik. Yani bu satr bir onay
kutusu iin yazdmz dnrsek, onay kutusunun deerini "seili deil" olarak belirlemi olduk.
Bu iki satrdan sonra oluturacamz onay kutusu karmza ilk ktnda iaretlenmemi olacaktr.
Hemen grelim:
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
pencere = Tk()
d = IntVar()
d.set(0)
btn1 = Checkbutton(text="Pardus", variable=d)
btn1.place(relx=0.0,rely=0.1)
mainloop()
Burada dikkatimizi eken bir farkllk, "btn1" adl onay kutusunun "seenekleri" arasna "variable"
adl bir seenein girmi olmas... Bu seenein ilevini az ok anlam olmalsnz: Yukarda
belirlediimiz "d = IntVar()" ve "d.set(0)" ifadeleri ile "Checkbutton" pencere arac arasnda
balant kuruyor. Yani bu seenek yardmyla pencerece aracna, "deiken olarak d'yi kullan"
emrini veriyoruz.
Bu kodlar altrdmzda karmza iinde bir onay kutusu bulunan bir pencere alr. Bu
penceredeki onay kutusu "seilmemi" haldedir. sterseniz yukardaki kodlar iinde yer alan
"d.set(0)" ifadesini "d.set(1)" olarak deitirip kodlarmz yle altralm:
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
pencere = Tk()
d = IntVar()
d.set(1)
btn1 = Checkbutton(text="Pardus", variable=d)
----------------------------------------------------------------------------------------------------------------------Python Dersleri
180/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

btn1.place(relx=0.0,rely=0.1)
mainloop()
Grdnz gibi, bu defa oluan onay kutusu "seili" vaziyette... Eer yukardaki kodlar iindeki
"d.set()" satrn tamamen kaldrrsak, Tkinter varsaylan olarak d.set() iin "0" deerini atayacaktr.
Gelin imdi bu kodlar biraz gelitirelim. Mesela penceremizde bir "Entry" arac olsun ve onay
kutusunu setiimiz zaman bu "Entry" aracnda bizim belirlediimiz bir cmle grnsn... Bu
kodlar iinde greceimiz ".get" ifadesine aslnda pek yabanc saylmayz. Bunu daha nceden
"Entry" aracn kullanrken de grmtk. Bu ifade yardmyla bir deikeninin deerini sonradan
kullanmak zere depolayabiliyoruz. Aadaki rnei dikkatle inceleyin:
#!/usr/bin/python
#-*-coding=utf-8-*from Tkinter import *
pencere = Tk()
# Onay kutusu iin bir deiken oluturuyoruz
v = IntVar()
# Bu deikene deer olarak "0" atayalm
v.set(0)
# br onay kutusu iin baka bir deiken daha oluturuyoruz
z = IntVar()
# Bu deikene de "0" deerini atyoruz.
z.set(0)
# Bu kez bir karakter deikeni oluturalm
d = StringVar()
# Bu deikenin deeri "Pardus" olsun.
d.set("Pardus")
# Bir tane daha karakter deikeni oluturalm
e = StringVar()
# Bunun da deeri "Debian" olsun.
e.set("Debian")
# imdi onay kutularn seili hale getirdiimizde almasn istediimiz komut iin bir fonksiyon
oluturuyoruz:

----------------------------------------------------------------------------------------------------------------------Python Dersleri
181/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

def onay():
# Eer "v" deikeninin deeri "1" ise....
if v.get() = = 1:
# d.get() ile "d" deikeninin deerini alyoruz...
giris.insert(0,"Merhaba %s kullancs" %d.get())
# Yok eer "z" deikeninin deeri "1" ise...
elif z.get() = = 1:
giris.delete(0,END)
# e.get() ile "e" deikeninin deerini alyoruz...
giris.insert(0,"Merhaba %s kullancs" %e.get())
# Deikenlerin deer "1" deil, baka bir deer ise..."
else:
giris.delete(0,END)
# Aada "text" seeneinin deerinin "d.get()" olduuna dikkat edin.
onay_pa = Checkbutton(text=d.get(), variable=v, command=onay)
onay_pa.place(relx = 0.0, rely = 0.1)
# Aada "text" seeneinin deerinin "e.get()" olduuna dikkat edin.
onay_de = Checkbutton(text=e.get(), variable=z, command=onay)
onay_de.place(relx= 0.0, rely= 0.2)
giris = Entry(width=24)
giris.place(relx = 0.0, rely=0.0)
mainloop()

"Toplevel" Pencere Arac


Toplevel arac bizim ana pencere dnda farkl bir pencere daha amamz salar. Mesela bir ana
pencere stndeki dmeye bastnzda baka bir pencere daha alsn istiyorsanz bu ilevi
kullanmanz gerekiyor. En basit kullanm yledir:
#!/usr/bin/python
#-*-coding=utf-8-*-

----------------------------------------------------------------------------------------------------------------------Python Dersleri
182/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

from Tkinter import *


pencere = Tk()
pencere2 = Toplevel()
mainloop()
Bu kodlar altrdmzda ekranda ikinci bir pencerenin daha aldn grrz.
Diyelim ki bu ikinci pencerenin, bir dmeye basldnda almasn istiyoruz:
#!/usr/bin/python
#-*-coding=utf-8-*from Tkinter import *
pencere = Tk()
def ekle():
pencere2 = Toplevel()
btn_pen2 = Button(text="ekle", command=ekle)
btn_pen2.pack()
mainloop()
Grdnz gibi pencere2'nin aln bir fonksiyona baladk. Ardndan da ana pencere zerinde
btn_pen2 adl bir dme oluturduk ve bu dmeye "command" seenei yardmyla yukarda
tanmladmz fonksiyonu atayarak dmeye baslnca ikinci pencerenin almasn saladk.
Eer alan ikinci pencere zerinde de baka dmeler olsun istiyorsak u ekilde hareket etmemiz
gerekir:
#!/usr/bin/python
#-*-coding=utf-8-*from Tkinter import *
pencere = Tk()
def ekle():
pencere2 = Toplevel()
btn_pen = Button(pencere2,text="k", command=pencere2.destroy)
btn_pen.pack()
btn_pen2 = Button(pencere,text="ekle", command=ekle)
btn_pen2.pack()
mainloop()
----------------------------------------------------------------------------------------------------------------------Python Dersleri
183/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Yine grdnz gibi, ilk tanmladmz ekle fonksiyonu altnda bir dme oluturduk. Burada
yeni bir durum dikkatinizi ekmi olmal. Ekle fonksiyonu altnda yeni tanmladmz dmede
ilave olarak "text" seeneinden nce bir "pencere2" ifadesini gryoruz. Bunu yapmamzn nedeni
u: Elimizde "pencere" ve "pencere2" adnda iki adet pencere var. Byle bir durumda oluturulan
pencere aracnn hangi pencere zerinde gsterileceini Tkinter'e anlatmamz gerekiyor. Sadece bir
pencere varken pencereleri aka belirtmeye gerek olmuyordu, ama eer birden pencere var ve siz
oluturulan

dmenin

hangi

pencere

grntleneceini

belirtmezseniz,

rnein

bizim

durumumuzda Tkinter "ekle" adl dmeye her basta otomatik olarak ana pencere zerinde "k"
adl bir dme oluturacaktr. Anladnz gibi, eer aksi belirtilmemise, pencere aralar
otomatikman ana pencere zerinde alacaktr...
Diyelim ki "a", "b", "c" ve "d" adlarnda drt adet penceremiz var. te hangi dmenin hangi
pencerede grntleneceini belirlemek iin bu zellikten faydalanacaz:
btn1 = Button(a, text="btn1")
btn2 = Button(b, text="btn2")
btn3 = Button(c, text="btn3")
btn4 = Button(d, text="btn4")
yukardaki kodlarda yeni bir zellik olarak bir de "command=pencere2.destroy" seeneini
gryoruz. Aslnda ***.destroy komutu biraz ***.quit komutuna benziyor; grevi mevcut pencereyi
kapatmak. Peki burada pencere2.destroy komutu yerine pencere2.quit komutunu kullanamaz myz?
Tabii ki kullanabiliriz, ancak kullanrsak "k" dmesine bastmzda sadece pencere2 deil,
dorudan ana pencerenin kendisi de kapanacaktr. Eer ikinci pencerenin kapanp ana pencerenin
ak kalmasn istiyorsanz kullanmanz gereken komut ***.destroy; yok eer ikinci pencere
kapandnda ana pencere de kapansn istiyorsanz kullanmanz gereken komut ***.quit olmaldr.
btn_pen2 adl dmeyi ise, "text" seeneinin hemen nne yazdmz "pencere" ifadesinden de
anlayacanz gibi "pencere" adl pencerenin zerine yerletiriyoruz. Yukarda bahsettiimiz gibi
burada "pencere" ifadesini kullanmasanz da olur, nk zaten Tkinter siz belirtmesiniz de dmeyi
otomatik olarak ana pencere zerinde aacaktr. Tabii dmeyi ana pencerede deil de ikincil
pencereler zerinde amak isterseniz bunu Tkinter'e aka sylemeniz gerekir...
"Listbox" Pencere Arac
Bu ara bize pencereler zerinde bir "liste ieren kutu" hazrlama imkan veriyor. Hemen basit bir
----------------------------------------------------------------------------------------------------------------------Python Dersleri
184/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

"Listbox" kullanm rnei grelim:


liste = Listbox()
liste.pack()
Grdnz gibi, bu aracn da kullanm teki aralardan hi farkl deil... sterseniz bu arac bir de
balamnda grelim:
#!/usr/bin/python
#-*-coding=utf-8-*from Tkinter import *
pencere = Tk()
liste = Listbox()
liste.pack()
mainloop()
Bu haliyle pencerenin tamammn kaplad iin ok belirgin olmayabilir liste kutumuz... Ama
pencereye bir de dme eklersek liste kutusu daha rahat seilebilir hale gelecektir:
#!/usr/bin/python
#-*-coding=utf-8-*from Tkinter import *
pencere = Tk()
liste = Listbox()
liste.pack()
btn = Button(text="ekle")
btn.pack()
mainloop()
Hatta imdiye kadar rendiimiz baka zellikleri kullanarak daha k bir grnm de elde
edebiliriz:
#!/usr/bin/python
#-*-coding=utf-8-*from Tkinter import *
pencere = Tk()
liste = Listbox(bg="white")
----------------------------------------------------------------------------------------------------------------------Python Dersleri
185/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

liste.pack()
etiket = Label(text="#####################", fg="magenta", bg="light green")
etiket.pack()
btn = Button(text="ekle",bg="orange",fg="navy")
btn.pack()
etiket2 = Label(text="#####################", fg="magenta", bg="light green")
etiket2.pack()
mainloop()
Tabii ki siz pencere aralarn ve yaratclnz kullanarak ok daha ekici grnmler ve renkler
elde edebilirsiniz...
imdi liste kutumuza baz eler ekleyelim. Bunun iin u basit ifadeyi kullanacaz:
liste.insert(END,"e 1")
Tabii ki bunu bu ekilde tek bana kullanamayz. Hemen bu parac yukardaki kod iine
yerletirelim:
#!/usr/bin/python
#-*-coding=utf-8-*from Tkinter import *
pencere = Tk()
liste = Listbox(bg="white")
liste.insert(END,"e 1")
liste.pack()
etiket = Label(text="#####################", fg="magenta", bg="light green")
etiket.pack()
btn = Button(text="ekle",bg="orange",fg="navy")
btn.pack()
etiket2 = Label(text="#####################", fg="magenta", bg="light green")
etiket2.pack()
mainloop()
Grdnz gibi, bu parac, liste kutusunu tanmladmz satrn hemen altna ekledik. Biz liste
kutumuza ayn anda birden fazla e de eklemek isteyebiliriz. Bunun iin basite bir "for dngs"
----------------------------------------------------------------------------------------------------------------------Python Dersleri
186/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

kullanabiliriz:
linux_dagitimlari = ["Pardus", "Debian", "Ubuntu", "PclinuxOS", "TruvaLinux", "Gelecek Linux"]
for i in linux_dagitimlari:
liste.insert(END, i)
Hemen bu kodlar da yerli yerine koyalm:
#!/usr/bin/python
#-*-coding=utf-8-*from Tkinter import *
pencere = Tk()
liste = Listbox(bg="white")
liste.pack()
linux_dagitimlari = ["Pardus", "Debian", "Ubuntu", "PclinuxOS", "TruvaLinux", "Gelecek Linux"]
for i in linux_dagitimlari:
liste.insert(END, i)
etiket = Label(text="#################", fg="magenta", bg="light green")
etiket.pack()
btn = Button(text="ekle",bg="orange",fg="navy")
btn.pack()
etiket2 = Label(text="#################", fg="magenta", bg="light green")
etiket2.pack()
mainloop()
Gayet gzel bir liste kutusu oluturduk ve listemizdeki eleri de rahatlkla seebiliyoruz... Yalnz
dikkat ettiyseniz ana pencere zerindeki ekle dmesi u anda hibir ie yaramyor... Tabii ki onu
oraya bou bouna koymadk.. Hemen bu dmeye de bir ilev atayalm... Mesela, bu dmeye
basldnda ayr bir pencere alsn ve kullancdan girdi alarak ana penceredeki liste kutusuna
eklesin... Tabii ki bu yeni alan pencerede de bir giri kutusu ve bir de ilemi tamamlamak iin bir
dme olsun. Hemen ie koyulalm:
#!/usr/bin/python
#-*-coding=utf-8-*from Tkinter import *

----------------------------------------------------------------------------------------------------------------------Python Dersleri
187/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

pencere = Tk()
liste = Listbox(bg="white")
liste.pack()
linux_dagitimlari = ["Pardus", "Debian", "Ubuntu", "PclinuxOS", "TruvaLinux", "Gelecek Linux"]
for i in linux_dagitimlari:
liste.insert(END, i)
def yeni():
global giris
pencere2 = Toplevel()
giris = Entry(pencere2)
giris.pack()
btn2 = Button(pencere2, text="tamam",command=ekle)
btn2.pack()
def ekle():
liste.insert(END,giris.get())
giris.delete(0,END)
etiket = Label(text="#################", fg="magenta", bg="light green")
etiket.pack()
btn = Button(text="ekle",bg="orange",fg="navy", command=yeni)
btn.pack()
etiket2 = Label(text="#################", fg="magenta", bg="light green")
etiket2.pack()
mainloop()
sterseniz daha anlalr olmas iin para para ilerleyelim:
#!/usr/bin/python
#-*-coding=utf-8-*from Tkinter import *
pencere = Tk()
Bu ksm zaten biliyoruz... Herhangi bir aklamaya gerek yok...
liste = Listbox(bg="white")
----------------------------------------------------------------------------------------------------------------------Python Dersleri
188/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

liste.pack()
linux_dagitimlari = ["Pardus", "Debian", "Ubuntu", "PclinuxOS", "TruvaLinux", "Gelecek Linux"]
for i in linux_dagitimlari:
liste.insert(END, i)
Bu ksmda bildiiniz gibi nce "liste" adnda bir "liste kutusu" (Listbox) oluturduk. Liste
kutumuzun arkaplan rengini de beyaz olarak belirledik.
Ardndan da "linux_dagitimlari" adnda bir liste oluturduk ve tek tek elerini yazdk... Hemen alt
satrda bir "for dngs" yardmyla linux_dagitimlari adl listedeki btn eleri "liste" ad
verdiimiz "liste kutusu" iine yerletirdik.
def yeni():
global giris
pencere2 = Toplevel()
giris = Entry(pencere2)
giris.pack()
btn2 = Button(pencere2, text="tamam",command=ekle)
btn2.pack()
Burada yaptmz i basit bir fonksiyon oluturmaktan ibaret... nce "yeni" adl bir fonksiyon
oluturuyoruz. Ardndan "pencere2" adyla ana pencereden ayr bir pencere daha oluturuyoruz.. Bu
yeni pencere, ileride "ekle" tuuna bastmzda almasn istediimiz pencere oluyor... Alt satrda,
bu yeni pencere zerine yerletirmek iin "giris" adl bir "Entry" pencere arac oluturuyoruz.
Parantez iine "pencere2" yazmay unutmuyoruz, nk bu "Entry" aracnn olumasn istediimiz
yer ikinci pencere... Dikkat ettiyseniz fonksiyonu tanmlarken "global giris" adl bir satr daha
ekledik... Bu satrn amac, fonksiyon iindeki "giris" adl "Entry" aracn fonksiyon dnda da
kullanabilmek... nk bu "Entry" arac bize daha sonra da lazm olacak... "Entry" aracna benzer
ekilde bir de "btn2" adyla bir dme oluturuyoruz. Bunu da ikinci penceremize yerletiriyor,
adn "tamam" koyuyor ve komut olarak aada tanmlayacamz "ekle" fonksiyonunu seiyoruz.
def ekle():
liste.insert(END,giris.get())
giris.delete(0,END)
te bu parada da "ekle" adl bir fonksiyon oluturduk. Burada "liste.insert" ifadesi "liste" adl
"liste kutusuna" ekleme yapmamz salyor. Parantez iindeki "giris.get()" ifadesi size tandk
----------------------------------------------------------------------------------------------------------------------Python Dersleri
189/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

geliyor olmal.. nk ayn ifadeyi "Entry" pencere aracn anlatrken de grmtk... Hatrlarsanz
bu ifade sayesinde "Entry" aracna kullanc tarafndan girilen verileri daha sonra kullanmak
amacyla elimize tutabiliyorduk... te burada da bu ifade yardmyla "giris" adl "Entry" pencere
aracnn

ieriini

alp

"liste"

adl

"liste

kutusu"

iine

yerletiriyoruz. Alt

satrdaki

"giris.delete(0,END)" ifadesi ise "Entry" aracna kullanc tarafndan giri yapldktan sonra
kutunun boaltlmasn salyor.
etiket = Label(text="#################", fg="magenta", bg="light green")
etiket.pack()
btn = Button(text="ekle",bg="orange",fg="navy", command=yeni)
btn.pack()
etiket2 = Label(text="#################", fg="magenta", bg="light green")
etiket2.pack()
mainloop()
Bu son parada bilmediimiz hibir ey yok... Normal bir ekilde "etiket" ad verdiimiz "Label"
aracn tanmlyoruz... Burada "Label" aracn ssleme amacyla nasl kullandmza dikkat edin....
"fg" ve "bg" seeneklerini de nceki blmlerden hatrlyoruz. "fg" nplandaki rengi; "bg" ise
arkaplandaki rengi sememizi salyor. "magenta" ve "light green" ise kullanacamz renklerin
adlar oluyor. Bunun altnda ise basit bir "Button" arac tanmlyoruz. smini ve renklerini
belirledikten sonra da "command" seenei yardmyla yukarda tanmladmz "yeni" adl
fonksiyonu bu dmeye balyoruz. Bunun aasndaki "etiket2"nin ise "etiket" adl aratan hibir
fark yok...
Kodlarmz altrdmzda karmza gayet ho, stelik gzel de bir ilevi olan bir pencere
kyor. Burada "ekle" dmesine bastmzda karmza yeni bir pencere alyor. Bu yeni
pencerede, kullancnn giri yapabilmesi iin bir "Entry" arac, bir de ilemi tamamlayabilmesi iin
"Button" arac yer alyor. Kullanc "Entry" aracna bir veri girip "tamam" dmesine bastnda
"Entry" aracna girilen veri ana penceredeki "liste kutusu"na ekleniyor... Ayrca ilk veri giriinin
ardndan "Entry" arac iindeki alan tamamen boaltlyor ki kullanc rahatlkla ikinci veriyi
girebilsin... ok ho deil mi?!
Siz de burada kendinize gre deiiklikler yaparak zellikle ikinci pencereyi gze daha ho
grnecek bir hale getirebilirsiniz...
Burada dikkat ederseniz, ikinci pencerede, giri kutusuna hibir ey yazmadan "tamam" dmesine
----------------------------------------------------------------------------------------------------------------------Python Dersleri
190/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

basarsak ana penceredeki liste kutusuna bo bir satr ekleniyor. imdi yle bir kod yazalm ki,
kullanc eer ikinci penceredeki giri kutusuna hibir ey yazmadan "tamam" dmesine basarsa
giri kutusu iinde "Veri Yok!" yazs belirsin ve bu yaz ana penceredeki liste kutusuna eklenmesin:
Bunun iin kodlarmz iindeki "ekle" fonksiyonuna iki adet "if" koulu eklememiz gerekiyor...
def ekle():
if not giris.get():
giris.insert(END,"Veri Yok!")
if giris.get() != "Veri Yok!":
liste.insert(END,giris.get())
giris.delete(0,END)
Grdnz gibi "giris" boken "tamam" tuuna basldnda "Veri Yok!" ifadesi ekrana
yazdrlyor... Ancak burada yle bir problem var: Eer "Veri Yok!" ifadesi ekrana yazdrldktan
sonra kullanc bu ifadeyi silmeden bu ifadenin yanna bir eyler yazp "tamam"a basarsa "Veri
Yok!" ifadesiyle birlikte o yeni yazd eyler de listeye eklenecektir... Bunu engellemek iin
kodumuzu u hale getirebiliriz:
def ekle():
if not giris.get():
giris.insert(END,"Veri Yok!")
if not "Veri Yok!" in giris.get():
liste.insert(END,giris.get())
giris.delete(0,END)
Yani yle demi oluyoruz bu ifadelerle:
Eer "giris" adl "Entry" arac bo ise, ara iinde "Veri Yok!" ifadesini gster.
Eer "giris" adl "Entry" arac iinde "Veri Yok!" ifadesi bulunmuyorsa, "liste" adl "Listbox"
aracna "giris" iindeki btn veriyi yazdr...
Liste kutumuza elerimizi ekledik... Peki bu eleri silmek istersek ne yapacaz?
Niyetimiz liste kutusundan e silmek olduunu gre en bata bir silme dmesi oluturmamz
mantkl olacaktr:
btn_sil = Button()

----------------------------------------------------------------------------------------------------------------------Python Dersleri
191/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

btn_sil.pack()
Bu dmenin bir i yapabilmesi iin de bu dmeye bir fonksiyon atamamz gerekir:
def sil():
liste.delete(ACTIVE)
Burada grdnz gibi, silme ilemi iin "liste.delete" ifadesini kullanyoruz... Parantez iindeki
"ACTIVE" ifadesi ise liste kutusu iinden bir seim yapp "sil" dmesine basnca bu seili enin
silinmesini salayacak... Yani "aktif" olan e silinecek. Bu iki paray teki komutlarla birlikte bir
grelim bakalm:
#!/usr/bin/python
#-*-coding=utf-8-*from Tkinter import *
#!/usr/bin/python
#-*-coding=utf-8-*from Tkinter import *
pencere = Tk()
liste = Listbox(bg="white")
liste.pack()
linux_dagitimlari = ["Pardus", "Debian", "Ubuntu", "PclinuxOS", "TruvaLinux", "Gelecek Linux"]
for i in linux_dagitimlari:
liste.insert(END, i)
def yeni():
global giris
pencere2 = Toplevel()
giris = Entry(pencere2)
giris.pack()
btn2 = Button(pencere2, text="tamam",command=ekle)
btn2.pack()
def ekle():
if not giris.get():
giris.insert(END,"Veri Yok!")
if not "Veri Yok!" in giris.get():
----------------------------------------------------------------------------------------------------------------------Python Dersleri
192/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

liste.insert(END,giris.get())
giris.delete(0,END)
def sil():
liste.delete(ACTIVE)
etiket = Label(text="#################", fg="magenta", bg="light green")
etiket.pack()
btn = Button(text="ekle",bg="orange",fg="navy", command=yeni)
btn.pack()
btn_sil = Button(text="sil",bg="orange", fg="navy",command=sil)
btn_sil.pack()
etiket2 = Label(text="#################", fg="magenta", bg="light green")
etiket2.pack()
mainloop()
Tabii ki, sil dmesinin grnn pencere zerindeki teki elere uydurmak iin "fg" ve "bg"
seenekleri yardmyla ufak bir renk ayar yapmay da unutmadk...
Bylece bir pencere aracn daha bitirmi olduk... Gelelim sradaki pencere aracmza:
"Menu" Pencere Arac
Adndan da anlalaca gibi bu ara bize pencerelerimiz zerinde menler hazrlama olana
salyor... "Menu" pencere aracnn kullanm teki aralardan birazck daha farkldr, ama
kesinlikle zor deil... Hemen kck bir men hazrlayalm:
nce standart satrlarmz ekliyoruz:
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
pencere = Tk()
imdi menmz oluturmaya balayabiliriz...
menu = Menu(pencere)
Burada "menu" adl bir "Menu pencere arac" oluturduk... Ad "menu" olmak zorunda deil... Siz
istediiniz ismi kullanabilirsiniz... Ama tabii ki pencere aracmzn ad olan "Menu"yu
----------------------------------------------------------------------------------------------------------------------Python Dersleri
193/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

deitiremeyiz... Buraya kadar teki pencere aralarndan hibir fark yok...


Parantez iindeki "pencere" ifadesinden de anladmz gibi, bu pencere aracn ana pencere
zerinde oluturuyoruz. Hatrlayacanz gibi burada "pencere" diye ak ak belirtmesek de
Tkinter pencere aracmz otomatik olarak ana pencere zerinde oluturacaktr. Aslnda bu satr
yardmyla ana pencerenin en stnde, sonradan gelecek menler iin bir "men ubuu"
oluturmu oluyoruz.
pencere.config(menu=menu)
dosya = Menu(menu)
Burada "config" metodu yardmyla ncelikle "menu" adl arac "pencere"ye balyoruz. Parantez
iindeki ilk "menu" ifadesi, tpk teki pencere aralarnda grdmz "text" ifadesi gibi bir
"seenek"... ikinci "menu" ifadesi ise yukarda bizim "Menu" aracna kendi verdiimiz isim... Bu
isim herhangi bir kelime olabilirdi... Yani en bata mennn adn "kepap" olarak belirleseydik,
burada "menu=kebap" da diyebilirdik...
kinci satrda ise "dosya" adl baka bir "Menu pencere arac" daha oluturuyoruz. Hatrlarsanz ilk
Menu aracn olutururken parantez iine "pencere" yazarak arac pencereye balamtk. Bu kezse
aracmz bir nceki "menu"nn zerinde oluturuyoruz... Aslnda bu satr yardmyla bir nceki
aamada oluturduunuz "ara ubuu" zerinde "iner men" (drop-down menu) iin bir yer am
oluyoruz.
menu.add_cascade(label="Dosya",menu=dosya)
imdi yapmamz gereken, mennn aaya doru almasn yani "inmesini" salamak. Bu i iin
yukarda grdnz "add_cascade" metodunu kullanyoruz. Bu metodun "menu" adl "men ara
ubuuna" bal olduuna dikkat edin. Parantez iinde grdmz "label" ifadesi de tpk "text"
gibi, menye ad vermemizi salyor. Menmzn adn "Dosya" olarak belirledik. Parantez iindeki
dier ifade olan "menu" de "Dosya"nn hangi "ara ubuu" zerinde zerinde oluturulacan
gsteriyor...
dosya.add_command(label="A")
dosya.add_command(label="Kaydet")
dosya.add_command(label="Farkl Kaydet...")
dosya.add_command(label="k",command=pencere.quit)
mainloop()
----------------------------------------------------------------------------------------------------------------------Python Dersleri
194/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Burada grdmz ifadeler ise bir stte oluturduumuz "Dosya" adl mennn alt balklarn
oluturmamz salyor... Burada "add_command" metotlarnn "dosya" adl ara ubuuna
balandna dikkat edin... Bu satrlardan anladnz gibi, "Dosya" adl menmzn altnda "A",
"Kaydet", "Farkl Kaydet..." ve "k" gibi alt balklar olacak...
imdi kodlarmzn hepsini birlikte grelim:
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
pencere = Tk()
menu = Menu(pencere)
pencere.config(menu=menu)
dosya = Menu(menu)
menu.add_cascade(label="Dosya",menu=dosya)
dosya.add_command(label="A")
dosya.add_command(label="Kaydet")
dosya.add_command(label="Farkl Kaydet...")
dosya.add_command(label="k",command=pencere.quit)
mainloop()
Bu kodlar altrdnzda gayet gzel bir pencere elde etmi olacaksnz... Yalnz dikkat
ettiyseniz, "Dosya"ya bastktan sonra alan alt mennn en stnde "----------" gibi bir ey
gryoruz... Oraya tkladmzda ise btn men ieriinin tek bir grup halinde toplanp ayr bir
pencere oluturduunu gryoruz... Eer bu zellikten holanmadysanz, bu minik izgileri kodlar
arasna "tearoff=0" ifadesini ekleyerek yok edebilirsiniz ("tearoff=0" ifadesini "dosya" adl
deikeni olutururken ekliyoruz...):
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
pencere = Tk()
menu = Menu(pencere)
pencere.config(menu=menu)
dosya = Menu(menu, tearoff=0)

----------------------------------------------------------------------------------------------------------------------Python Dersleri
195/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

menu.add_cascade(label="Dosya",menu=dosya)
dosya.add_command(label="A")
dosya.add_command(label="Kaydet")
dosya.add_command(label="Farkl Kaydet...")
dosya.add_command(label="k",command=pencere.quit)
mainloop()
Konu belki biraz kark gelmi olabilir... Ama aslnda hi de yle deil... in mantn anlamak
iin yukardaki kodlarda geen u satrlar bize epeyce yardmc olabilir:
menu = Menu(pencere)
dosya = Menu(menu, tearoff=0)
menu.add_cascade(label="Dosya",menu=dosya)
Dikkat ettiyseniz, nce "Menu pencere aracn" oluturuyoruz. Bu ara ilk oluturulduunda,
parantez ii ifadeden anladmz gibi, "pencere" adl ana pencere zerine balanyor...
kinci satr vastasyla ikinci kez bir "Menu pencere arac" olutururken ise, parantez ii ifadeden
anlald gibi, oluturduumuz meny bir nceki "Menu pencere arac"na balyoruz.
nc satrda "inen men"y olutururken de, bunu bir nceki "Menu pencere arac" olan
"dosya"ya balyoruz...
Menlere baka alt menler de eklerken bu mantk ok daha kolay anlalyor... yle ki:
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
pencere = Tk()
menu = Menu(pencere)
pencere.config(menu=menu)
dosya = Menu(menu, tearoff=0)
menu.add_cascade(label="Dosya",menu=dosya)
dosya.add_command(label="A")
dosya.add_command(label="Kaydet")
dosya.add_command(label="Farkl Kaydet...")
dosya.add_command(label="k",command=pencere.quit)
----------------------------------------------------------------------------------------------------------------------Python Dersleri
196/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

yeni = Menu(dosya,tearoff=0)
dosya.add_cascade(label="Yeni",menu=yeni)
yeni.add_command(label="Metin Belgesi")
yeni.add_command(label="Resim Dosyas")
yeni.add_command(label="pdf dokman")
mainloop()
Grdnz gibi, bu kez "Menu pencere aracmz" ilk olarak "dosya" adl ara zerine balyoruz.
nk yeni pencere aracmz, bir nceki pencere arac olan "dosya"nn zerinde oluturulacak. Bir
sonraki satrda "add_command" metodunu kullanrken de alt menleri "yeni" adl "Menu pencere
arac" zerine balyoruz... nk bu alt menler "yeni"nin iinde yer alacak...
Ayn ekilde eer "Dosya" balnn yanna bir de mesela "Dzen" diye bir seenek eklemek
istersek yle bir blm ekliyoruz kodlarmz arasna:
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
pencere= Tk()
menu= Menu(pencere)
pencere.config(menu=menu)
dosya= Menu(menu, tearoff=0)
menu.add_cascade(label="Dosya",menu=dosya)
dosya.add_command(label="A")
dosya.add_command(label="Kaydet")
dosya.add_command(label="Farkl Kaydet...")
dosya.add_command(label="k",command=pencere.quit)
yeni= Menu(dosya,tearoff=0)
dosya.add_cascade(label="Yeni",menu=yeni)
yeni.add_command(label="Metin Belgesi")
yeni.add_command(label="Resim Dosyas")
yeni.add_command(label="pdf dokman")
dosya2= Menu(menu,tearoff=0)
----------------------------------------------------------------------------------------------------------------------Python Dersleri
197/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

menu.add_cascade(label="Dzen",menu=dosya2)
dosya2.add_command(label="Bul")
mainloop()

"Text" Pencere Arac


imdiye kadar bir pencerenin sahip olmas gereken pek ok zellii grdk. Hatta pencerelerimize
menler dahi ekledik... Btn bunlarn dnda renmemiz gereken ok nemli bir pencere arac
daha var. O da, "Text" adl pencere aracdr.. Bu ara sayesinde birden fazla satr ieren metinler
oluturabileceiz. En basit haliyle "Text" adl pencere aracn u ekilde oluturabiliriz:
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
pencere= Tk()
metin= Text()
metin.pack()
mainloop()
Oluturduumuz bu "Text" arac pek ok ilevi yerine getirebilecek durumdadr: Bu ara iine u
haliyle istediimiz uzunlukta metin girebiliriz, klavye ve fareyi kullanarak metni ynetebiliriz, hatta
oluturduumuz bu "Text" aracn olduka basit bir "metin editr" olarak da kullanabiliriz.
Eer oluturduumuz bu "Text" arac iine ntanml olarak herhangi bir metin yerletirmek istersek
u kodu kullanmamz gerekir:
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
pencere= Tk()
metin= Text(fg = "blue",font="Helvetica 13 bold")
metin.insert(END,"Srm 0.1.1")
metin.pack()
mainloop()
----------------------------------------------------------------------------------------------------------------------Python Dersleri
198/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

Grdnz gibi, "Text" aracn olutururken, nceki yazlarda rendiimiz ekilde "fg" seenei
yardmyla metni mavi yaptk. "font" seenei yardmyla ise yaz tipini, "Helvetica, 13, koyu ve
alt izili" olarak belirledik.
Kodlarmz iinde kullandmz "metin.insert" ifadesi de bize ntanml bir metin girme imkan
salad. Parantez iinde belirttiimiz "END" ifadesi ntanml olarak yerletireceimiz metnin
pencere aracnn neresinde yer alacan gsteriyor.
Yukarda verdiimiz kodu deitirerek isterseniz daha ekici bir grnm de elde edebilirsiniz:
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
pencere= Tk()
a= "Srm 0.1.1"
metin= Text(bg="orange",fg = "blue",font="Helvetica 13 bold")
metin.insert(END,a.center(112,"*"))
metin.pack()
mainloop()
Eer bir metin iinden herhangi bir blm almak isterseniz kullanmanz gereken ey "get"
ifadesidir. Bu "get" ifadesinin nasl kullanldn grelim imdi:
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
pencere= Tk()
metin= Text()
metin.pack()
metin.get(1.0,END)
mainloop()
Yukardaki rnei sadece "get" ifadesinin nasl kullanldn gstermek iin verdik... u haliyle bu
kod bizim beklentilerimizi karlayamaz... nk "get" ifadesi yardmyla metni aldk, ama
----------------------------------------------------------------------------------------------------------------------Python Dersleri
199/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

aldmz bu metni kullanmamz salayacak aralar henz penceremize yerletirmediimiz iin


"get" ifadesinin bize salad ilevi kullanamyoruz. imdilik burada una dikkat edelim:
"metin.get()" gibi bir ifade kullanrken parantez iinde belirttiimiz ilk say 1.0. Bu rakam metin
kutusunun ilk satrnn ilk stununa iaret ediyor. Burada ilk satrn 1'den; ilk stunun ise 0'dan
baladna dikkat edelim. Virglden sonra gelen "END" ifadesi ise "Text" arac iindeki metnin en
sonuna iaret ediyor. (ngilizce'de "END" kelimesi "SON" anlamna geliyor). Yani bu koda gre
"get" ifadesi yardmyla Text arac iindeki bir metni, en bandan en sonuna kadar alabiliyoruz.
sterseniz parantez iinde farkl saylar belirterek, alnacak metnin ilk ve son konumlarn
belirleyebiliriz. Mesela u koda bir bakalm:
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
pencere= Tk()
metin= Text()
metin.pack()
metin.get(1.0,1.5)
mainloop()
Burada ise "Text" aracnn birinci satr ve birinci stunundan, birinci satr ve beinci stununa
kadar olan aralktaki metin alnacaktr.
imdi henz hibir i yapmayan bu kodlar biraz ilevli bir hale getirelim:
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
pencere= Tk()
def al():
a= metin.get(1.0,END)
giris.insert(0, a)

----------------------------------------------------------------------------------------------------------------------Python Dersleri
200/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

metin= Text()
metin.pack()
btn= Button(text="al", command=al)
btn.pack()
giris= Entry()
giris.pack()
mainloop()
Burada ncelikle "Text" arac iindeki metnin tamamn alp (metin.get(1.0,END)) "giris" adl
pencere aracna yerletiren (giris.insert(0,a)) bir fonksiyon oluturduk. Dikkat ederseniz kullanm
kolayl asndan "metin.get(1.0,END)" ifadesini "a" adl bir deikene atadk.
Daha sonra "metin" adl "Text" aracmz ve "btn" adl "Button" aracmz oluturduk. "Button"
aracmza "komut" (command) olarak yukarda tanmladmz fonksiyonu gstererek "Button" ile
fonksiyon arasnda iliki kurduk.
En sonunda da "giris" adl "Entry" aracmz tamamlayarak kodumuzu sona erdirdik.
Bu kodlar altrdmzda karmza kan bo metin kutusuna herhangi bir ey yazp alttaki
dmeye basnca, metin kutusunun btn ierii dmenin hemen altndaki kk metin kutusuna
ilenecektir.
imdi daha karmak bir rnek yapalm:
Aadaki rnei dikkatlice inceleyin:
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
pencere= Tk()
def al():
metin2.insert(END,metin.get(2.0,END))

----------------------------------------------------------------------------------------------------------------------Python Dersleri
201/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

a= "Srm 0.1.1"
metin= Text(height=15,bg="black",fg = "white",font="Helvetica 13 bold")
metin.insert(END,a.center(112,"*"))
metin.pack()
metin2= Text(height=15,width=115, bg="light blue",fg="red")
metin2.pack()
btn= Button(text="al",command=al)
btn.pack()
mainloop()
Yukardaki kodlarda bir metni ve pencere aralarn nasl biimlendirdiimize dikkat edin. Ayrca
Python'da karakter dizilerine ait bir metot olan "center" yardmyla bir kelimenin soluna ve sana
nasl baka karakterler yerletirdiimizi inceleyin. Bu kodlar iinde kendinize gre baz denemeler
yaparak neyin ne ie yaradn daha iyi anlayabilirsiniz.
Yukarda bahsettiimiz "metnin koordinatlarn verme" yntemi her zaman tercih edilecek bir
durum deildir... Ne de olsa kullanclarnzdan satr/stun saymasn bekleyemezsiniz! Herhalde bu
gibi durumlarda en iyi yntem "seilen metnin alnmas" olacaktr. Bunu da basite u kodlar
yardmyla yapyoruz:
metin.get("sel.first","sel.last")
Burada "sel.first" ifadesi "seimin balang noktasn"; "sel.last" ifadesi ise "seimin biti
noktasn" gsteriyor.
imdi bu kod parasn bir balam iinde kullanalm:
#!/usr/bin/env python
#-*-coding:utf-8-*from Tkinter import *
pencere= Tk()
def al():
a= metin.get("sel.first","sel.last")
----------------------------------------------------------------------------------------------------------------------Python Dersleri
202/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

metin2.insert(END,a)
metin= Text(height=10,width=35,bg="white",fg ="blue",font="Helvetica 13 bold")
metin.pack()
metin2= Text(height=10,width=50, bg="black",fg="white")
metin2.pack()
btn= Button(text="al",command=al)
btn.pack()
mainloop()
Bu kodlar altrdmzda, stteki kutuya yazdmz metnin istediimiz bir ksmn setikten
sonra alttaki dmeye basarsak, seili ksm ikinci kutuya ilenecektir.

----------------------------------------------------------------------------------------------------------------------Python Dersleri
203/203
[08 Ekim 2008]
-----------------------------------------------------------------------------------------------------------------------

You might also like