Resmi Python 3 Klavuzu
Srm 3
Guido van Rossum
ve Python gelitirme ekibi
(eviren: Frat zgl)
15.12.2015
NDEKLER
1 tahnz Kabartalm
2 Python Yorumlaycsnn Kullanm
2.1 Yorumlaycnn Balatlmas . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 Yorumlayc ve evresi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
4
6
3 Pythona Teknik Olmayan bir Giri
3.1 Python Hesap Makinesi Olarak Kullanmak . . . . . . . . . . . . . . . . . . . .
3.2 Programlama Yolunda lk Admlar . . . . . . . . . . . . . . . . . . . . . . . . . .
7
7
15
4 Baka Kontrol Ak Aralar
4.1 if Deyimleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2 for Deyimleri . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.3 range() Fonksiyonu . . . . . . . . . . . . . . . . . . . . . . . .
4.4 Dnglerde break ve continue Deyimleri ve else Cmlecikleri
4.5 pass Deyimleri . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.6 Fonksiyonlarn Tanmlanmas . . . . . . . . . . . . . . . . . . .
4.7 Fonksiyonlarnn Tanmlanmasna Dair Baka Bilgiler . . . . . .
4.8 Perde Aras: Kodlama Tarz . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
17
17
17
18
19
20
21
22
28
.
.
.
.
.
.
.
.
30
30
35
35
36
37
38
40
40
.
.
.
.
42
43
46
46
48
7 Girdi ve kt
7.1 ktlar k Biimlendirme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
52
52
5 Veri Yaplar
5.1 Listeler Hakknda Daha Fazlas . . . . . . .
5.2 del Deyimi . . . . . . . . . . . . . . . . . .
5.3 Demetler ve Diziler . . . . . . . . . . . . .
5.4 Kmeler . . . . . . . . . . . . . . . . . . .
5.5 Szlkler . . . . . . . . . . . . . . . . . . .
5.6 Dng Kurma Teknikleri . . . . . . . . . .
5.7 Koullu Durumlar Hakknda Daha Fazlas .
5.8 Dizilerin teki Tiplerle Karlatrlmas . .
6 Modller
6.1 Modller Hakknda Daha Fazlas .
6.2 Standart Modller . . . . . . . . .
6.3 dir() Fonksiyonu . . . . . . . . .
6.4 Paketler . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
7.2
Dosya Okuma ve Yazma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8 Hatalar ve stisnalar
8.1 Sz Dizimi Hatalar . . . . . . . . . . . . . .
8.2 stisnalar . . . . . . . . . . . . . . . . . . . .
8.3 stisnalarn Yakalanmas . . . . . . . . . . .
8.4 stisnalarn Tetiklenmesi . . . . . . . . . . .
8.5 Kullanc Tanml stisnalar . . . . . . . . . .
8.6 Toparlama lemlerinin Tanmlanmas . . .
8.7 nceden Tanmlanm Toparlama lemleri
9 Snar
9.1 simler ve Nesneler Hakknda Birka Sz
9.2 Pythonda Etki ve sim Alanlar . . . . . .
9.3 Snara lk Bak . . . . . . . . . . . . .
9.4 eitli Notlar . . . . . . . . . . . . . . . .
9.5 Miras Alma . . . . . . . . . . . . . . . . .
9.6 Gizli Deikenler . . . . . . . . . . . . . .
9.7 Birka ey . . . . . . . . . . . . . . . . .
9.8 stisnalar da Birer Snftr . . . . . . . . .
9.9 Yrycler . . . . . . . . . . . . . . . .
9.10 reteler . . . . . . . . . . . . . . . . . .
9.11 rete fadeler . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
55
.
.
.
.
.
.
.
60
60
60
61
63
64
65
66
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
67
67
68
70
74
76
77
78
79
80
81
81
10 Standart Ktphanede Ksa Bir Gezinti
10.1 letim Sistemi Arayz . . . . . . . . . . . . . . . .
10.2 Dosyalarda Joker Karakterler . . . . . . . . . . . .
10.3 Komut Satr Argmanlar . . . . . . . . . . . . . .
10.4 Hata kts Ynlendirme ve Program Sonlandrma
10.5 Karakter Dizisi Desen Eletirme . . . . . . . . . .
10.6 Matematik . . . . . . . . . . . . . . . . . . . . . . .
10.7 nternet Eriimi . . . . . . . . . . . . . . . . . . . .
10.8 Tarihler ve Zamanlar . . . . . . . . . . . . . . . . .
10.9 Veri Sktrma . . . . . . . . . . . . . . . . . . . . .
10.10 Performans lme . . . . . . . . . . . . . . . . . .
10.11 Kalite Kontrol . . . . . . . . . . . . . . . . . . . .
10.12 Piller de Dahil . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
83
83
83
84
84
84
85
85
86
86
87
87
88
.
.
.
.
.
.
.
.
89
89
90
91
91
92
93
93
94
12 Sanal Ortamlar ve Paketler
12.1 Giri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12.2 Sanal Ortamlar Oluturmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12.3 Paketleri pip ile Ynetmek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
96
96
96
97
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
11 Standart Ktphanede Ksa Bir Gezinti Blm II
11.1 kt Biimlendirme . . . . . . . . . . . . . . . .
11.2 ablonlar . . . . . . . . . . . . . . . . . . . . . .
11.3 kili Veri Kaytlaryla almak . . . . . . . . . .
11.4 ok Katmanl Programlama . . . . . . . . . . .
11.5 Loglama . . . . . . . . . . . . . . . . . . . . . .
11.6 Zayf Atar . . . . . . . . . . . . . . . . . . . .
11.7 Listelerle almaya Ynelik Aralar . . . . . . .
11.8 Ondalk Kayan Nokta Aritmetii . . . . . . . . .
ii
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
13 Ya imdi?
100
14 Etkileimli Girdi Dzenleme ve Eski Kodlar Getirme
102
14.1 Kod Tamamlama ve Eski Kodlar Dzenleme . . . . . . . . . . . . . . . . . . . . 102
14.2 Etkileimli Kabuun Alternatieri . . . . . . . . . . . . . . . . . . . . . . . . . . 102
15 Kayan Noktal Saylarla Aritmetik lemler: Sorunlar ve Kstlamalar
103
15.1 Temsil Hatas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
16 Ek
109
16.1 Etkileimli Kip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
Dizin
111
iii
iv
Resmi Python 3 Klavuzu, Srm 3
Python renmesi kolay, gl bir programlama dilidir. Verimli, yksek seviyeli veri yaplarna
sahip bu dil, nesne tabanl programlamay da basit ama etkili bir tarzda ele alr. Pythonn zarif
sz dizimi ve dinamik veri tipleri, dilin yorumlanan yaps ile birletiinde, onu pek ok alanda
ve ou platformda, betik yazma ve hzl uygulama gelitirme konusunda ideal bir dil haline
getirir.
Pythonn yorumlaycs ve kapsaml standart ktphanesi [Link]
adresindeki Python web sitesinden belli bal btn platformlar iin kaynak kod veya
ikili paket halinde cretsiz olarak indirilip zgrce datlabilir. Ad geen web sitesi ayn
zamanda pek ok cretsiz nc ahs Python modllerini, programlar, aralar ve ilave
belgeleri barndrmann yansra, bunlara nerelerden ulaabileceinizi gsteren balantlar
da ierir.
Pythonn yorumlaycs, C veya C++ dillerinde (ya da Cden arlabilen baka dillerde)
yazlm fonksiyonlar ve veri tipleri araclyla kolayca geniletilebilir. Python ayn zamanda
zelletirilebilen uygulamalar iin bir eklenti dili olmaya da uygundur.
Bu klavuzda Python dilinin ve sisteminin temel kavramlar ile zellikleri, okura teknik
olmayan bir dille sunulmutur. rendiklerinizi deneyebilmek iin elinizin altnda bir
Python yorumlaycsnn bulunmas elbette iyi olur, ama buradaki btn rnekler kendi
iinde bamszdr. Bu sayede bu klavuzu internete veya bilgisayara ihtiya duymadan da
okuyabilirsiniz.
Standart nesnelerin ve modllerin aklamalar iin Standart Python Ktphanesine
bakabilirsiniz. Python Dil Referansnda bu dil daha teknik bir ekilde tanmlanmtr. C
veya C++ dillerinde uzant yazabilmek iin Python Yorumlaycsnn Geniletilmesi ve Baka
Uygulamalara litirilmesi ile Python/C API Referans Klavuzu balkl belgeleri okuyabilirsiniz.
Ayrca etrafta Python derinlemesine ele alan eitli kitaplar da bulunmaktadr.
Bu klavuzda, dilin tek tek her zelliini, hatta yaygn kullanlan zelliklerinin hepsini, tm
ayrntlaryla ele almak gayesi gdlmemitir. Ama bu klavuzda Pythonn en dikkate
deer zelliklerinin pek ou sunulmu olup, bu klavuz size dilin havas ve tarz hakknda
epeyce kir verecektir. Bu klavuzu bitirdikten sonra Python modllerini ve programlarn
okuyup yazabilmenin yansra, Standart Python Ktphanesinde ele alnan eitli ktphane
modlleri hakknda daha fazla bilgi edinmeye de hazr hale geleceksiniz.
Ayrca szlk ksm da gz atmaya deerdir.
NDEKLER
BLM 1
tahnz Kabartalm
Eer bilgisayarlarla bolca har neir oluyorsanz, otomatikletirmek isteyeceiniz birtakm
ilerle gnn birinde mutlaka karlarsnz. rnein ok sayda metin dosyas zerinde bir
arama-deitirme ilemi gerekletirmek veya bir dizi fotoraf dosyasn karmak bir ekilde
adlandrp yeniden dzenlemek isteyebilirsiniz. Belki de kendi ihtiyalarnza zg ufak bir
veritaban ya da belli bir amaca ynelik grak arayzl uygulama veya basit bir oyun yazmak
istiyorsunuzdur.
Eer siz profesyonel bir yazlm gelitirici iseniz, belki de eitli C/C++/Java ktphaneleri ile
almanz gerekiyor, ancak o bildik yazma/derleme/test etme/yeniden derleme dngsn
ok hantal buluyorsunuzdur. Belki de yukarda bahsi geen ktphane iin bir test takm
yazyorsunuzdur, ama test kodlarn yazmak size angarya geliyordur. Ya da belki, bir eklenti
dili kullanabilecek bir program yazmsnzdr, ama uygulamanz iin batan aa yeni bir
eklenti dili tasarlayp gereklemek istemiyorsunuzdur.
Eer yleyse Python tam size gre bir dildir.
Yukarda bahsi geen ilerin bazlar iin Unix kabuk betikleri veya Windows toplu i dosyalar
yazabilirsiniz, ancak kabuk betikleri daha ziyade dosyalar bir yerden bir yere tamaya ve
metin verileri zerinde deiiklik yapmaya yarar; bunlar grak arayzl uygulamalar veya
oyunlar iin pek elverili deildir. Elbette bu iler iin C/C++/Java programlar da yazabilirsiniz,
ancak programn daha ilk taslan karmak bile ok fazla gelitirme almasna girimenizi
gerektirecektir. Pythonn ise kullanm daha kolaydr; Windows, Mac, OS X ve Unix iletim
sistemlerinde alr; iinizi daha abuk bir ekilde halletmenize yardmc olur.
Pythonn kullanm basit olsa da, byk programlar iin, kabuk betikleri veya toplu
i dosyalarnn sunabileceinden ok daha fazla yap ve destek sunan drt drtlk bir
programlama dilidir. te yandan Python Cye kyasla daha fazla hata denetimine imkan tanr
ve epey yksek seviyeli bir dil olarak, bnyesinde esnek diziler ve szlkler gibi yksek seviyeli
veri tiplerini barndrr. Python, sahip olduu daha genel amal veri tipleri sayesinde Awk
ya da hatta Perle gre daha geni bir problem sahasna hitap etmekle birlikte, pek ok ey
Pythonda en az bu programlama dillerindeki kadar kolaydr.
Python, programlarnz, baka Python programlarnda yeniden kullanabileceiniz birtakm
modllere blmenize de izin verir. Pythonda, programlarnz iin temel olarak alabileceiniz
(veya Python ile programlamay renmeye balamada rnek olarak kullanabileceiniz) ok
sayda hazr modl bulunur. Bunlar arasnda dosya giri-k, sistem arlar ve soket
desteinin yansra, Tk gibi grak kullanc arayz takmlar iin arayzler sunan modller
dahi vardr.
Python yorumlanan bir dildir; bu sayede, herhangi bir derleme ve balama ilemi de
gerekmedii iin, program gelitirme esnasnda zamandan epey tasarruf edebilirsiniz.
Resmi Python 3 Klavuzu, Srm 3
Yorumlaycy etkileimli olarak kullanabilirsiniz.
Bu da dilin zelliklerine ilikin
deneme almalarn kolayca yapabilmenizi, tek kullanmlk programlar yazabilmenizi
veya aadan-yukarya (bottom-up) program gelitirme srasnda fonksiyonlarnz test
edebilmenizi salar. Python ayn zamanda kullanl bir hesap makinesi olma ilevi de grr.
Python, programlarnz daha z ve daha okunakl bir ekilde yazabilmenizi salar. Python ile
yazlan programlar C, C++ veya Java ile yazlm muadillerinden genellikle ok daha ksadr.
Bunun eitli sebepleri vardr:
Yksek seviyeli veri tipleri sayesinde karmak ilemleri tek bir deyimle ifade
edebilirsiniz;
Deyimler, balang ve biti parantezleri yerine girintileme ile gruplanr;
Deikenleri veya argmanlar nceden bildirmenize gerek yoktur.
Python geniletilebilir bir dildir: Eer C biliyorsanz, gerek kritik ilemleri azami hzla
gerekletirmek, gerekse Python programlarn yalnzca ikili formda mevcut bulunan
ktphanelere (mesela reticiye zg bir grak ktphanesine) balamak amacyla Python
yorumlaycsna yeni bir gml fonksiyon veya modl eklemek basit bir itir. Artk bu
dile iyiden iyiye sndktan sonra, Pythonn yorumlaycsn C ile yazlm bir uygulamaya
balayabilir, bunu o uygulama iin bir eklenti veya komut dili olarak kullanabilirsiniz.
Bu arada bu dil, adn BBCde yaymlanan Monty Pythons Flying Circus adl gsteriden
alr; srngenlerle bir ilgisi yoktur. Dolaysyla belgelerinizde Monty Python skelerine atfta
bulunmanza izin veriyoruz; hatta izin vermekle kalmyor, bunu tevik de ediyoruz!
Artk hepiniz Python merak ettiinize gre, bu dili biraz daha ayrntl bir ekilde incelemeye
balayabiliriz. Bir dili renmenin en iyi yolu onu kullanmak olduu iin, klavuzu okurken sizi
Python yorumlaycsn kurcalamaya davet ediyoruz.
Bir sonraki blmde yorumlaycy kullanmann inceliklerini gstereceiz. Vereceimiz bilgiler
olduka yavan olsa da bunlar daha sonra sunulacak rnekleri deneyebilmeniz asndan
nem tayor.
Klavuzun geri kalannda, basit ifadeler, deyimler ve veri tipleri ile balanarak, fonksiyonlar ve
modller de ele alndktan sonra nihayet istisnalar ve kullanc tarafndan tanmlanan snar
gibi ileri dzey kavramlara da deinilerek, Python dili ve sisteminin eitli zellikleri rnekler
yoluyla sunulacaktr.
BLM 2
Python Yorumlaycsnn Kullanm
2.1 Yorumlaycnn Balatlmas
Python yorumlaycs, mevcut olduu makinelerde, genellikle /usr/local/bin/python3.5
dizininde kuruludur. Unix kabuunun arama yoluna /usr/local/bin satrn eklemeniz
halinde; kabukta
python3.5
komutunu vererek yorumlaycy balatabilirsiniz.1 Yorumlaycnn yer ald dizinin hangisi
olduu kurulum srasndaki bir seenekle belirlendii iin, baka konumlar da mmkndr.
Bu dizinin hangisi olabileceini etrafnzda Python bilen birilerine veya sistem yneticinize
sorabilirsiniz. (rn. /usr/local/python da yaygn bir alternatif konumdur.)
Windows makinelerinde Python genellikle C:\Python35 dizinine kurulur, ama kurulum
programn altrdnzda siz bunu deitirebilirsiniz. Python kurduunuz dizini yola
eklemek iin DOS komut satrnda aadaki komutu verebilirsiniz:
set path=%path%;C:\python35
Birincil komut satrnda dosya sonu karakterinin (Unixte Control-D, Windowsta Control-Z)
girilmesi, yorumlaycnn sfr k durumu ile (yani hatasz bir ekilde) kapanmasn salar.
Eer bu ie yaramazsa, yorumlaycdan kmak iin u komutu verebilirsiniz: quit().
Yorumlayc, readline yazlmn destekleyen sistemlerde etkileimli dzenleme, nceki kodlar
getirme ve kod tamamlama gibi satr dzenleme zelliklerine sahiptir. Komut satr
dzenleme zelliinin var olup olmadn anlamann herhalde en hzl yolu, karlatnz
ilk Python komut satrnda Control-P tularna basmak olacaktr.
Eer bir bip sesi
duyarsanz komut satr dzenleme zellii etkin demektir. Tularn kullanmna ilikin
giri mahiyetindeki bilgiler iin Etkileimli Girdi Dzenleme ve Eski Kodlar Getirme balkl
eke bakabilirsiniz. Eer hibir ey olmazsa veya ktda ^P grrseniz, komut satr
dzenleme zelliinden faydalanamayacaksnz demektir; bu durumda yapabileceiniz tek
ey, klavyedeki geri tuunu kullanarak mevcut satrdan karakterleri silebilmek olacaktr.
Yorumlaycnn alma ekli bir bakma Unix kabuuna benzer: Yorumlayc, standart girdi bir
tty cihazna balyken altrldnda, komutlar etkileimli olarak okur ve yrtr; standart
girdi olarak bir dosya ad veya dosya argman ile altrldnda ise, o dosyadaki betii okur
ve yrtr.
1
Unixte, Python 3.x yorumlaycsnn altrlabilir dosyas ntanml olarak python adyla kurulmaz. Bunun
amac, sistemde ayn anda kurulu olabilecek Python 2.x altrlabilir dosyasyla herhangi bir akmay
engellemektir.
Resmi Python 3 Klavuzu, Srm 3
Yorumlaycy balatmann ikinci bir yolu da python -c komut [arg] ...
yapsn
kullanmaktr. Bylece, kabuktaki -c seeneine benzer ekilde, komut iindeki deyim(ler)
yrtlr. Python deyimleri genellikle boluklar ya da kabuk iin zel anlam olan baka
karakterler ierdiinden, komutu btnyle tek trnak iine alsanz iyi olur.
Baz Python modlleri ayn zamanda betik olarak da kullanlabilir. Bu modller python -m
modl [arg]... eklinde altrlabilir. Bylece modln kaynak dosyas, sanki dosyann
tam konumunu ve adn komut satrna yazmsnz gibi yrtlecektir.
Bir betik dosyas kullanlrken, bazen betii altrdktan hemen sonra etkileimli kipe gemek
faydal olabilir. Bu i betik adndan nce -i seenei getirilerek yaplabilir.
Komut satrna ilikin btn seenekler Komut Satr ve evresi adresinde aklanmtr.
2.1.1 Argman Atama
Yorumlaycya gnderilen betik ad ve ilave argmanlar, eer yorumlayc bunlar tandysa,
karakter dizilerinden oluan bir listeye dntrlp sys modl iindeki argv deikenine
atanr. Ad geen bu listeye import sys komutuyla eriebilirsiniz. Bu listenin uzunluu
en az birdir. Yani yorumlayc herhangi bir betik ad ve argman olmadan altrldnda
[Link][0] bo bir karakter dizisi olacaktr. Betik ad (yani standart girdi) - olarak
verildiinde, [Link][0] - olarak ayarlanr. -c komut yaps kullanldnda [Link][0]
-c olarak ayarlanr. -m modl yaps kullanldnda ise [Link][0] modln tam yolu
ve tam ad olarak ayarlanr. -c komut veya -m modl yapsndan sonra getirilen seenekler
Python yorumlaycsnn seenek ileme mekanizmas tarafndan dikkate alnmasa da, bunlar
yine de komut veya modl tarafndan kullanlmak zere [Link] listesine yerletirilir.
2.1.2 Etkileimli Kip
Komutlar bir tty cihazndan okunuyorsa, yorumlayc etkileimli kipte demektir. Bu kipte
komutlarmz genellikle adet byktr iareti ile (>>>) gsterilen birincil komut isteminden
hemen sonra yazyoruz. Devam satrlar iin ise, ntanml olarak adet nokta ile (...)
gsterilen ikincil komut istemi devreye girecektir. Yorumlayc, birincil komut istemini ekrana
basmadan nce, srm numaras ve telif hakkna dair birtakm bilgiler ieren bir karlama
mesaj gsterir:
$ python3.5
Python 3.5 (default, Sep 16 2015, 09:25:04)
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
Devam satrlarna ise, birden fazla satr ieren bir yapya girilirken ihtiya duyulur. Bir rnek
olarak, u if deyimine bir gz atalm:
>>> dnya_dzdr = True
>>> if dnya_dzdr:
...
print("Dikkat edin de dmeyin!")
...
Dikkat edin de dmeyin!
Etkileimli kip hakknda daha fazla bilgi iin Etkileimli Kip blmne baknz.
2.1. Yorumlaycnn Balatlmas
Resmi Python 3 Klavuzu, Srm 3
2.2 Yorumlayc ve evresi
2.2.1 Kaynak Dosyalarnn Dil Kodlamas
Python kaynak dosyalar ntanml olarak UTF-8 ile kodlanm gibi ilem grr. Bu dil
kodlamasnda, dnyadaki ou dilin karakterleri karakter dizilerinde, tanm adlarnda ve
yorumlarda ayn anda kullanlabilir. Ancak standart ktphanede tanm adlar iin yalnzca
ASCII karakterler kullanlr. Tanabilir olmas istenen her kodda uyulmas gereken bir
kaidedir bu. Btn bu karakterleri dzgn bir ekilde grntleyebilmek iin, kullandnz
metin dzenleyicinin de, dosyann UTF-8 olduunu anlayabilmesi ve dosyadaki btn
karakterleri destekleyen bir yaz tipi kullanmas gerekir.
Bunun yansra, kaynak dosyalar iin farkl bir dil kodlamas belirtmek de mmkndr.
Kaynak dosyasnn dil kodlamasn tanmlamak iin, #! ile balayan baka bir zel yorum
satr daha eklemeniz gerekir:
# -*- coding: dil_kodlamasinin_adi -*-
Bu bildirim sayesinde kaynak dosyadaki her ey, UTF-8 yerine, belirttiiniz dil kodlamasna
sahipmi gibi deerlendirilecektir. Kullanabileceiniz dil kodlamalarnn listesine Python
Ktphane Referansndaki codecs blmnden ulaabilirsiniz.
rnein, eer tercih ettiiniz metin dzenleyici UTF-8 ile kodlanm dosyalar desteklemiyorsa
ve baka bir dil kodlamas kullanmanz dayatyorsa (mesela Windows-1252), u satr
yazabilirsiniz:
# -*- coding: cp-1252 -*-
Bylece Windows-1252 adl karakter kmesi iindeki btn karakterleri kaynak dosyanzda
kullanabilirsiniz. Dil kodlamasn ayarlayan bu zel yorum satr, dosya iindeki ilk veya ikinci
satr olmak zorundadr.
Blm 2. Python Yorumlaycsnn Kullanm
BLM 3
Pythona Teknik Olmayan bir Giri
Aadaki rneklerde neyin komut, neyin bu komutun kts olduunu, komut istemcilerinin
(>>> ve ...) varl veya yokluu ile ayrt edebilirsiniz: rnei denemek iin, komut istemcisini
ekranda grdkten sonra, rnek kodun tamamn komut istemcisinin hemen ardndan
yazmanz gerekiyor. Komut istemcisinin olmad satrlarsa yorumlaycnn verdii ktlar
temsil ediyor. Herhangi bir rnekte, eer satr banda yalnzca ikincil komut istemcisini
gryorsanz tekrar ENTER tuuna basn. Bu ekilde, birden fazla satra yaylan komutlar
sona erdirmi oluyoruz.
Bu klavuzdaki rneklerin pek ounda, hatta etkileimli komut istemcisinde bile, yorum
satrlar greceksiniz. Pythonda yorumlar diyez karakteri (#) ile balar ve satr sonuna kadar
devam eder. Yorumlar satr banda yer alabilecei gibi, boluk ya da koddan sonra da
gelebilir, ama karakter dizilerinin iinde yer alamaz. Diyez iareti bir karakter dizisinin iinde
getiinde, alelade bir diyez iareti olarak ilem grecektir. Yorumlar, yalnzca yazdnz
kodlar aklama amac tad, Python tarafndan ileme alnmad iin, aadaki rnekleri
denerken yorumlar yazmasanz da olur.
Birka rnek verelim:
# bu ilk yorumumuz
varan = 1 # bu da ikinci yorumumuz
# ... bu da ncs!.
metin = "# Trnak iinde gsterildii iin bu bir yorum deildir."
3.1 Python Hesap Makinesi Olarak Kullanmak
Gelin imdi birka basit Python komutu deneyelim. Yorumlaycy balatalm ve birincil komut
istemcisinin (>>>) grntlenmesini bekleyelim. (ok srmez.)
3.1.1 Saylar
Yorumlaycy basit bir hesap makinesi niyetine kullanabilirsiniz. Yorumlayc, ekrana
yazdnz ifadenin sonucunu size kt olarak verecektir. Pythonda ifadelerin sz dizimi gayet
yalndr: +, -, * ve / ileleri tpk baka dillerdeki gibi alr (rnein Pascal veya C). Gruplama
ilemleri iin ise parantezlerden (()) yararlanabilirsiniz. Mesela:
>>> 2 + 2
4
>>> 50 - 5*6
Resmi Python 3 Klavuzu, Srm 3
20
>>> (50 - 5*6) / 4
5.0
>>> 8 / 5 # blme her zaman kayan noktal bir say dndrr
1.6
Tam saylar (rn. 2, 4, 20) int tipindeyken, ondalk ksm olan saylar ise (rn. 5.0, 1.6) float
tipindedir. Klavuzun ilerleyen blmlerinde say tiplerine ilikin daha fazla bilgi vereceiz.
Blme ilemi (/) her zaman oat tipinde bir deer dndrr. taban blme ilemi yaparak
(ondalk ksmn atlmas suretiyle) tam say sonu elde etmek iin // ilecini kullanabilirsiniz.
Blme ileminden kalan hesaplamak iin ise % ileci kullanlr:
>>> 17 / 3 # klasik blme ilemi 'float' dndrr.
5.666666666666667
>>>
>>> 17 // 3 # taban blme ileminde ondalk ksm atlr
5
>>> 17 % 3 # % ileci blme ileminden kalan sayy verir
2
>>> 5 * 3 + 2 # sonu * blen + kalan
17
Pythonda bir saynn kuvvetlerini hesaplamak iin ** ilecini kullanabilirsiniz1 :
>>> 5 ** 2
25
>>> 2 ** 7
128
# 5'in karesi
# 2'nin 7. kuvveti
Eittir iareti (=) bir deikene deer atamak iin kullanlr. Sonrasnda, herhangi bir kt
verilmeden alt satra geilir:
>>> genilik = 20
>>> ykseklik = 5 * 9
>>> genilik * ykseklik
900
Eer bir deiken tanml deilse (yani kendisine bir deer atanmamsa), bunu kullanmaya
almak hata almanza yol aacaktr:
>>> n # tanmsz bir deikene erimeye alyoruz.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'n' is not defined
Pythonda kayan noktal saylar btnyle desteklenir: Eer bir ilecin ilenenleri birbirinden
farkl tipte ise, tam say deerli ilenenler kayan noktal sayya dntrlr:
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
Etkileimli kipte ekrana en son baslan ifade _ deikenine atanr. Bu sayede Python hesap
1
** ileci - ilecine gre daha yksek bir ncelie sahip olduu iin, -3**2 ilemi -(3**2) eklinde
yorumlanacak ve dolaysyla bu ilem -9 sonucunu verecektir. Bunu nleyip 9 sonucunu elde etmek isterseniz,
ilemi (-3)**2 eklinde yazabilirsiniz.
Blm 3. Pythona Teknik Olmayan bir Giri
Resmi Python 3 Klavuzu, Srm 3
makinesi olarak kullanrken, ilemlerin srekliliini salamanz bir nebze kolaylaacaktr.
rnein:
>>> vergi = 12.5 / 100
>>> fiyat = 100.50
>>> fiyat * vergi
12.5625
>>> fiyat + _
113.0625
>>> round(_, 2)
113.06
Ancak bu deikene salt okunur muamelesi yapmalsnz. Yani bu deikene kendiniz bir
deer atamamalsnz. Bu ekilde, asl _ ile ayn ad tayan baka bir lokal deiken
oluturmu olursunuz.
Bu da, _ adl gml deikenin sahip olduu zel ilevin
kaybolmasna yol aar.
Python; int ve float veri tiplerine ek olarak, Decimal ve Fraction gibi baka say tiplerini de
destekler. Python ayrca karmak saylar da ntanml olarak destekler. Pythonda karmak
saylarn sanal ksmlarn gstermek iin j veya J soneki kullanlr (rn. 3+5j).
3.1.2 Karakter Dizileri
Python, saylarn yansra, karakter dizileri zerinde de ilem yapabilir. Karakter dizilerini
birka farkl ekilde gsterebilirsiniz. Karakter dizileri tek trnak (...) veya ift trnak
("...") iine alnabilir. Her iki kullanm da ayn neticeyi verecektir2 . Trnak iaretlerini
kurtarabilmek (yani karakter dizileri iinde trnak iaretlerini kullanabilmek) iin \ iaretinden
yararlanabilirsiniz.
>>> 'adana mersin' # tek trnak iaretleri
'adana mersin'
>>> 'Mersin\'e' # tek trna \' ile kurtaryoruz...
"Mersin'e"
>>> "Mersin'e" # ...tek trnak yerine ift trnak da olur
"Mersin'e"
>>> '"Evet," dedi.'
'"Evet," dedi.'
>>> "\"Evet,\" dedi."
'"Evet," dedi.'
>>> '"Adana\'ya," dedi.'
'"Adana\'ya," dedi.'
Yorumlayc etkileimli kipteyken karakter dizisi ktlar trnak iinde gsterilir; zel
karakterler ise nlerine ters taksim iaretleri getirilerek kurtarlr. Bazen girilen deer
kan deerden farkl grnse de (ktda kullanlan trnak iaretleri girilenden farkl olabilir),
iki karakter dizisi birbirine edeerdir. Eer karakter dizisi iinde tek trnak iaretleri
geiyor, ama ift trnak iaretleri gemiyorsa karakter dizisini ift trnak ile tanmlyoruz.
Tersi durumda ise karakter dizisini tek trnak iaretlerini kullanarak tanmlyoruz. print()
fonksiyonu, karakter dizisini iine alan trnaklar atarak ve kurtarlan karakterlerle zel
karakterleri de ekrana basarak daha okunakl bir kt retilmesini salar.
Baka dillerin aksine, \n gibi zel karakterler, tek trnakla (...) kullanldnda da, ift trnakla ("...")
kullanldnda da ayn anlama sahip olacaktr. Bu ikisi arasndaki tek fark, tek trnak kullanrken " iaretini
kurtarmak zorunda olmamanz, ama \ iaretini kurtarmak zorunda olmanz; ift trnak kullanrken ise iaretini
kurtarmak zorunda olmamanz, ama \" iaretini kurtarmak zorunda olmanzdr.
2
3.1. Python Hesap Makinesi Olarak Kullanmak
Resmi Python 3 Klavuzu, Srm 3
>>> '"Adana\'ya," dedi.'
'"Adana\'ya," dedi.'
>>> print('"Adana\'ya," dedi.')
"Adana'ya," dedi.
>>> s = 'lk satr.\nkinci satr.' # \n alt satra geirir
>>> s # print() yoksa, \n ktda grnr
'lk satr.\nkinci satr.'
>>> print(s) # print() varsa, \n alt satra geirir
lk satr.
kinci satr.
Eer nnde \ iareti tayan karakterlerin zel karakter olarak ilem grmesini
istemiyorsanz, ilk trnak iaretinden nce r karakterini getirerek ham karakter dizilerinden
yararlanabilirsiniz.
>>> print('C:\kullanc\nihat') # burada \n satr ba anlamnda!
C:\kullanc
ihat
>>> print(r'C:\kullanc\nihat') # trnaktan nceki r'ye dikkat
C:\kullanc\nihat
Karakter dizileri birden fazla satra da yaylabilir. Bunun iin trnak iaretlerinden
yararlanabilirsiniz: """...""" veya .... Satr boluklar karakter dizisi ktlarna
otomatik olarak yansr, ama bunu engellemek iin satr sonuna bir adet \ iareti
yerletirebilirsiniz. Aadaki rnee bakalm:
print("""\
Kullanm: falanca [SEENEKLER]
-h
Kullanma ilikin bu mesaj grntler
-H bilgisayarad
Balanlacak bilgisayarn ad
""")
Bu rnek aadaki kty retir (ilk satrdaki boluun ktda grnmediine dikkat edin):
Kullanm: falanca [SEENEKLER]
-h
Kullanma ilikin bu mesaj grntler
-H bilgisayarad
Balanlacak bilgisayarn ad
Karakter dizileri, + ileci yardmyla birletirilebilir (yani birbirine eklenebilir) ve * ileci ile
yinelenebilir:
>>> # nce 2 kez 'an', ardndan da bir kez 'as'
>>> 2 * 'an' + 'as'
'ananas'
Art arda gelen iki veya daha fazla karakter dizisi (yani trnak iine alnm diziler) otomatik
olarak birletirilir.
>>> 'Py' 'thon'
'Python'
Ancak bu zellik yalnzca karakter dizileri iin geerlidir. Deikenler veya ifadeler iin deil:
>>> nek = 'Py'
>>> nek 'thon' # bir deiken ile bir karakter dizisi birletirilemez
...
SyntaxError: invalid syntax
>>> ('an' * 2) 'as'
10
Blm 3. Pythona Teknik Olmayan bir Giri
Resmi Python 3 Klavuzu, Srm 3
...
SyntaxError: invalid syntax
Eer deikenleri birbiriyle ya da deikenleri karakter dizileriyle birletirmek istiyorsanz +
ilecini kullann:
>>> nek + 'thon'
'Python'
Bu durum zellikle uzun karakter dizilerini blmek istediinizde iinize yarayacaktr:
>>> metin = ('Birka karakter dizisini birletirmek iin '
'bunlar parantez iine aln.')
>>> metin
'Birka karakter dizisini birletirmek iin bunlar parantez iine aln.'
Karakter dizileri, ilk karakterin sra numaras 0 olacak ekilde indekslenebilir (karakterlerine
ayrlabilir). Tek bir karakter iin char benzeri ayr bir veri tipi yoktur. Tek bir karakter,
uzunluu 1 olan bir karakter dizisi muamelesi grecektir:
>>> kelime = 'Python'
>>> kelime[0] # 0 konumundaki karakter
'P'
>>> kelime[5] # 5 konumundaki karakter
'n'
Saymaya sadan balamak iin sra numaras olarak eksi saylar da kullanlabilir:
>>> kelime[-1]
'n'
>>> kelime[-2]
'o'
>>> kelime[-6]
'P'
# son karakter
# sondan bir nceki karakter
-0 ile 0 ayn ey olduu iin, eksi deerli sra numaralar -1den balar.
ndekslemeye ek olarak, dilimleme de desteklenir. ndeksleme tek tek karakterleri almaya
yararken, dilimleme karakter dizisinin belli bir blmn almanz salar:
>>> kelime[0:2] # 0'dan (0 dahil) 2 konumuna kadar karakterler (2 hari)
'Py'
>>> kelime[2:5] # 2'den (2 dahil) 5 konumuna kadar karakterler (5 hari)
'tho'
Burada balang deerinin her zaman dahil olduuna, biti deerinin ise darda kaldna
dikkat edin. Bu ekilde s[:i] + s[i:] her zaman s deerine eit olacaktr:
>>> kelime[:2] + kelime[2:]
'Python'
>>> kelime[:4] + kelime[4:]
'Python'
Dilimleme indekslerinin, kullanm kolayl salayan baz ntanml deerleri vardr: Eer
ilk indeksi yazmazsanz, bu indeksin varsaylan deeri sfr olacaktr, eer ikinci indeksi
yazmazsanz bunun deeri de ntanml olarak dilimlenen karakter dizisinin uzunluu
olacaktr.
3.1. Python Hesap Makinesi Olarak Kullanmak
11
Resmi Python 3 Klavuzu, Srm 3
>>> kelime[:2] # balangtan 2 konumuna kadar karakterler (2 hari)
'Py'
>>> kelime[4:] # 4 konumundan (4 dahil) en sona kadar karakterler
'on'
>>> kelime[-2:] # sondan bir ncekinden (dahil) en sona kadar karakterler
'on'
Dilimlemenin nasl altn aklnzda tutmak iin, ilk karakterin sol kenarnn 0 olduunu
varsayarak, sra numaralarnn karakterlerin ara ksmna iaret ettiini dnebilirsiniz.
Bu durumda, n karaktere sahip bir karakter dizisinin son karakterinin sa kenar n sra
numarasna sahip olacaktr. rnein:
+---+---+---+---+---+---+
| P | y | t | h | o | n |
+---+---+---+---+---+---+
0
1 2
3
4 5
6
-6 -5 -4 -3 -2 -1
lk sradaki saylar, karakter dizisi iinde 0dan 6ya kadar olan konumlar verir; ikinci sra ise
bunlara karlk gelen eksi deerli konumlar gsterir. i den j ye kadar olan dilim, srasyla i
ve j olarak iaretlenen kenarlar arasndaki btn karakterleri ierir.
Art deerli sra numaralarnn her ikisi de karakter dizisinin snrlar iinde ise, bu sra
numaralarnn fark, dilimin uzunluunu verir. rnein kelime[1:3] ifadesinin uzunluu 2
olacaktr.
Karakter dizisinin uzunluunu aan bir sra numaras kullanmaya alrsanz yorumlayc hata
verecektir:
>>> kelime[42] # kelimede yalnzca 6 karakter var
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: string index out of range
Ama dilimleme ileminde, aralk dnda kalan sra numaralar kullanldnda bu durum
sessizce geitirilecektir:
>>> kelime[4:42]
'on'
>>> kelime[42:]
''
Pythonda karakter dizileri zerinde deiiklik yaplamaz; bunlar deitirilemeyen veri
tipleridir. Bu yzden, karakter dizisi iinde sra numaras belirtilen bir konuma deer atamaya
almak hata ile sonulanacaktr:
>>> kelime[0] = 'J'
...
TypeError: 'str' object does not support item assignment
>>> kelime[2:] = 'py'
...
TypeError: 'str' object does not support item assignment
Eer karakter dizisini deitirmek istiyorsanz, yapmanz gereken ey yeni bir karakter dizisi
oluturmaktr:
12
Blm 3. Pythona Teknik Olmayan bir Giri
Resmi Python 3 Klavuzu, Srm 3
>>> 'J' + kelime[1:]
'Jython'
>>> kelime[:2] + 'py'
'Pypy'
len() adl gml bir fonksiyon, bize karakter dizilerinin uzunluunu verir:
>>> s = 'ekoslavakyallatramadklarmz'
>>> len(s)
33
Ayrca bkz.:
Metin Dizisi Tipi - str Karakter dizileri dizi tiplerine rnektir. Bunlar bu tiplerin destekledii
ortak ilemleri destekler.
Karakter Dizisi Metotlar Karakter dizileri, temel dntrme ve arama ilemlerine ilikin
ok sayda metoda sahiptir.
Karakter Dizisi Biimlendirme Burada, [Link]()
biimlendirme ilemlerine ilikin bilgiler verilmitir.
metodu
ile
karakter
dizisi
printf Tarz Karakter Dizisi Biimlendirme % ilecinin sol taraftaki ileneninin karakter
dizileri ve Unicode dizileri olduu durumlarda kullanlan eski biimlendirme ilemleri
burada daha ayrntl olarak ele alnmtr.
3.1.3 Listeler
Python, eitli deerleri gruplandrmak iin kullanlan birtakm birleik veri tiplerini de tanr.
Bunlarn en yeteneklisi listeler olup, bunlar keli parantezler iinde birbirinden virglle
ayrlm deerler (eler) dizisi eklinde gsterilir. Listeler farkl tipteki eleri barndrabilir,
ama genellikle elerin hepsi ayn tiptendir.
>>> kareler = [1, 4, 9, 16, 25]
>>> kareler
[1, 4, 9, 16, 25]
Karakter dizilerinde (ve teki btn gml dizi tiplerinde) olduu gibi listeler de indekslenip
dilimlenebilir:
>>>
1
>>>
25
>>>
[9,
kareler[0]
# indeksleme eyi dndrr
kareler[-1]
kareler[-3:] # dilimleme yeni bir liste dndrr
16, 25]
Btn dilimleme ilemleri, istenen eleri ieren yeni bir liste dndrecektir. Yani aadaki
dilim, listenin yeni bir kopyasn (s kopya) dndrr:
>>> kareler[:]
[1, 4, 9, 16, 25]
Listeler ayrca birletirme gibi ilemleri de destekler:
>>> kareler + [36, 49, 64, 81, 100]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
3.1. Python Hesap Makinesi Olarak Kullanmak
13
Resmi Python 3 Klavuzu, Srm 3
Deitirilemeyen bir veri tipi olan karakter dizilerinin aksine listeler deitirilebilen bir veri
tipidir. Yani bunlarn ieriini deitirmek mmkndr:
>>>
>>>
64
>>>
>>>
[1,
kpler = [1, 8, 27, 65, 125] # burada bir hata var
4 ** 3 # 4 saysnn kp 65 deil, 64'tr!
kpler[3] = 64 # imdi yanl deeri deitiriyoruz
kpler
8, 27, 64, 125]
Ayrca, append() metodunu kullanarak (ilerde metotlardan daha ayrntl sz edeceiz)
listenin sonuna yeni eler de ekleyebilirsiniz:
>>>
>>>
>>>
[1,
[Link](216) # 6'nn kpn ekliyoruz
[Link](7 ** 3) # imdi de 7'nin kpn
kpler
8, 27, 64, 125, 216, 343]
Dilimlenmi ksmlara da deer atayabilirsiniz. Bu ilem listenin boyutunu deitirebilecei
gibi, listeyi tamamen temizleyebilir de:
>>> harfler = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> harfler
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> # baz deerleri deitiriyoruz
>>> harfler[2:5] = ['C', 'D', 'E']
>>> harfler
['a', 'b', 'C', 'D', 'E', 'f', 'g']
>>> # imdi de bunlar kaldryoruz
>>> harfler[2:5] = []
>>> harfler
['a', 'b', 'f', 'g']
>>> # btn elerin yerine bo bir liste yerletirerek listeyi temizliyoruz
>>> harfler[:] = []
>>> harfler
[]
Gml len() fonksiyonu ayn zamanda listelere de uygulanabilir:
>>> harfler = ['a', 'b', 'c', 'd']
>>> len(harfler)
4
Listeleri i ie geirmek (yani baka listeleri ieren listeler oluturmak) de mmkndr.
rnein:
>>> a = ['a', 'b', 'c']
>>> n = [1, 2, 3]
>>> x = [a, n]
>>> x
[['a', 'b', 'c'], [1, 2, 3]]
>>> x[0]
['a', 'b', 'c']
>>> x[0][1]
'b'
14
Blm 3. Pythona Teknik Olmayan bir Giri
Resmi Python 3 Klavuzu, Srm 3
3.2 Programlama Yolunda lk Admlar
Elbette Python, iki ile ikiyi toplamaktan daha karmak ilemler iin de kullanabiliriz. Mesela
Fibonacci serilerinin ilk alt-dizilerini u ekilde yazabiliriz:
>>>
...
...
>>>
...
...
...
1
1
2
3
5
8
# Fibonacci serileri:
# iki enin toplam bir sonraki eyi verir
a, b = 0, 1
while b < 10:
print(b)
a, b = b, a+b
Bu rnekle birlikte baz yeni zellikler gryoruz.
lk satr oklu atamaya bir rnektir: a ve b deikenleri ayn anda 0 ve 1 deerlerini
stleniyor. Son satrda bu zellikten yine yararlanyoruz. Grdnz gibi, herhangi bir
atama ilemi gereklemeden nce sa taraftaki ifadeler ileme alnyor. Sa taraftaki
ifadeler soldan saa doru ilem gryor.
while dngs, koul (bizim rneimizde b < 10) true olduu mddete yrtlmeye
devam ediyor. Pythonda, tpk Cdeki gibi, sfr harici btn tam say deerler truedur.
Sfr ise falsetur. Ayrca koul, bir karakter dizisi veya liste deeri de olabilir. Hatta bu
her trl dizi olabilir. Sfr harici bir uzunlua sahip her ey true, bo diziler ise falsetur.
Bu rnekte kullanlan test basit bir karlatrma ilemidir. Standart karlatrma
ileleri C ile ayn ekilde yazlr: < (kktr), > (byktr), == (eittir), <= (kk eittir),
>= (byk eittir) ve != (eit deildir).
Dngnn gvdesi girintili bir ekilde yazlr: Pythonda deyimleri gruplandrma
yntemi girintilemedir. Etkileimli komut satrnda her bir girintilenmi satr iin,
sekme tuuna veya boluk tuuna/tularna basmanz gerekir. Gerek hayatta bir metin
dzenleyici yardmyla daha karmak Python kodlar yazacaksnz. Btn kaliteli metin
dzenleyicilerde otomatik girintileme zellii bulunur. Etkileimli kabukta bir birleik
deyim yazdnzda, kodun tamamlandn gstermek iin ENTER tuuna basarak bo
satr brakmalsnz (nk ayrtrc (parser), koda ait son satrn hangisi olduunu
kestiremez). Basit bir kod blou iindeki her bir satr ayn miktarda girintilenmelidir.
print() fonksiyonu, kendisine verilen argman(lar)n deerini ekrana basar. Bu
fonksiyon, birden fazla argman, kayan noktal deerleri ve karakter dizilerini ekrana
basarken (daha nce verdiimiz hesap makinesi rneklerinde olduu gibi) bunlar
dmdz ekrana basmakla yetinmez, bu deerlere birbirinden farkl ekilde muamele
eder. Karakter dizileri trnaklar olmadan baslr ve eler arasna birer boluk
yerletirilir. Bylece bu deerleri gze hitap edecek ekilde biimlendirebilirsiniz.
rnein:
>>> i = 256*256
>>> print('i u deere sahiptir:', i)
i u deere sahiptir: 65536
3.2. Programlama Yolunda lk Admlar
15
Resmi Python 3 Klavuzu, Srm 3
kt sonunda satr bana geilmesini nlemek veya kty farkl bir karakter dizisi ile
sonlandrmak iin end denen bir isimli argmandan yararlanabilirsiniz:
>>> a, b = 0, 1
>>> while b < 1000:
...
print(b, end=',')
...
a, b = b, a+b
...
1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,
16
Blm 3. Pythona Teknik Olmayan bir Giri
BLM 4
Baka Kontrol Ak Aralar
Python, daha nce gsterdiimiz while deyiminin yansra, baz farkllklar olmakla birlikte,
baka dillerden aina olduumuz kontrol ak deyimlerine de yer verir.
4.1 if Deyimleri
Herhalde yukarda andmz bu deyimlerin en bilineni if deyimleridir. rnein:
>>> x = int(input("Ltfen bir tamsay girin: "))
Ltfen bir tamsay girin: 42
>>> if x < 0:
...
x = 0
...
print('Eksi deer sfra dntrld')
... elif x == 0:
...
print('Sfr')
... elif x == 1:
...
print('Tek')
... else:
...
print('ok')
...
ok
Kodlarnz iinde elif ksm hi olmayabilecei gibi, birden fazla elif de kullanabilirsiniz.
else ksm ise tercihe baldr. elif ismi else if ifadesinin ksaltmas olup, sizi haddinden
fazla girintileme yapmaktan kurtarr. if ... elif ... elif ... takm, baka dillerde bulunan
switch veya case deyimlerinin yerini tutar.
4.2 for Deyimleri
Pythondaki for deyimi, C veya Pascaldan biliyor olabileceiniz benzerlerinden biraz farkldr.
Pythondaki for deyimi, (Pascaldaki gibi) daima saylardan oluan bir aritmetik dizi zerinde
yrmek veya (Cdeki gibi) kullancya hem bir yrme basama hem de durma koulu
belirleme imkan vermek yerine, herhangi bir diziye (liste veya karakter dizisi) ait elerin
dizi iinde getikleri sray gzeterek, bu eler zerinde yrr. rnein:
>>> # Birka karakter dizisini lelim:
... kelimeler = ['arnavut', 'evket', 'ipetpet']
>>> for k in kelimeler:
...
print(k, len(k))
17
Resmi Python 3 Klavuzu, Srm 3
...
arnavut 7
evket 6
ipetpet 8
Dng iindeyken, zerinde yrdnz dizide deiiklik yapmanz gerekirse (rnein belirli
eleri ikilemek isterseniz), ilk nce dizinin bir kopyasn almanz neririz. Dizi zerinde
yrme ilemi dizinin otomatik olarak bir kopyasn almaz. Dilimleme, zellikle bu tr
ilemleri bir hayli kolaylatrr:
>>> for k in kelimeler[:]: # Listenin dilimlenmi bir kopyas zerinde dng kuruyoruz.
...
if len(k) > 7:
...
[Link](0, k)
...
>>> kelimeler
['ipetpet', 'arnavut', 'evket', 'ipetpet']
4.3 range() Fonksiyonu
Eer bir say dizisi zerinde yrmeniz gerekirse gml range() fonksiyonu iinizi
kolaylatracaktr. Bu fonksiyon yardmyla aritmetik diziler retebilirsiniz:
>>> for i in range(5):
...
print(i)
...
0
1
2
3
4
Fonksiyonda parametre olarak belirttiiniz biti deeri hibir zaman retilen diziye girmez.
Yani range(10) komutu, uzunluu 10 olan bir dizinin her bir esinin geerli sra numarasn
gsterecek ekilde, 0dan balayarak 10 adet deer retir. Say araln farkl bir say ile
balatmak veya farkl bir art (ya da hatta azal) miktar belirtmek de mmkndr. Bu
miktara basamak dendii de olur:
range(5, 10)
5'ten 9'a kadar
range(0, 10, 3)
0, 3, 6, 9
range(-10, -100, -30)
-10, -40, -70
Bir dizideki elerin sra numaralar zerinde yrmek iin range() ve len() fonksiyonlarn
u ekilde birletirebilirsiniz:
>>> a = ['Ayeciin', 'kck', 'bir', 'kuzucuu', 'varm']
>>> for i in range(len(a)):
...
print(i, a[i])
...
0 Ayeciin
1 kck
18
Blm 4. Baka Kontrol Ak Aralar
Resmi Python 3 Klavuzu, Srm 3
2 bir
3 kuzucuu
4 varm
Ancak buna benzer ou durumda enumerate() fonksiyonunu kullanmak daha pratik
olacaktr (bkz. Dng Kurma Teknikleri ).
Eer sadece aral ekrana basacak olursanz, grdnz ey sizi artabilir:
>>> print(range(10))
range(0, 10)
range() fonksiyonunun dndrd nesne pek ok ynden sanki bir listeymi gibi davransa
da, aslnda liste deildir. Bu, ilgili dizinin, zerinde yrdnzde elde edeceiniz btn
elerini ieren bir nesnedir, ama aslnda bu nesne listeyi gerekten oluturmaz, bylece
bellekten tasarruf salar.
Biz bu tr nesnelere zerinde yrnebilir nesneler diyoruz. Bu nesneler, e stou tkenene
kadar elerini pe pee alabilecekleri bir ey bekleyen fonksiyonlar ve yaplar iin uygun
bir hedeftir. for deyiminin, nesneler zerinde yrme ilemi yapabilmemizi salayan bir
yryc (iterator ) olduunu grmtk. Bu tr nesnelere bir baka rnek de list()
fonksiyonudur. Bu fonksiyon, zerinde yrnebilir nesnelerden listeler oluturur:
>>> list(range(5))
[0, 1, 2, 3, 4]
lerleyen sayfalarda, zerinde yrnebilir nesneler dndren ve bu nesneleri argman olarak
alan daha baka fonksiyonlar da greceiz.
4.4 Dnglerde break ve continue Deyimleri ve else Cmlecikleri
break deyimi, tpk Cde olduu gibi, dorudan doruya iinde bulunduu for veya while
dngsnden klmasn salar.
Dng deyimlerinde bir else cmlecii de bulunabilir. Bu cmlecik, listenin son esine
ulalmasyla (for ile) veya koulun false olmasyla (while ile) dng sona erdiinde yrtlr.
Ancak dng break deyimi ile sona erdirilmise bu cmlecik devreye girmez. Asal saylar
bulan aadaki dngde bu duruma bir rnek gryorsunuz:
>>> for n in range(2, 10):
...
for x in range(2, n):
...
if n % x == 0:
...
print(n, 'eittir', x, '*', n//x)
...
break
...
else:
...
# arpan bulunamadnda dng sona eriyor
...
print(n, 'asal saydr')
...
2 asal saydr
3 asal saydr
4 eittir 2 * 2
5 asal saydr
6 eittir 2 * 3
7 asal saydr
4.4. Dnglerde break ve continue Deyimleri ve else Cmlecikleri
19
Resmi Python 3 Klavuzu, Srm 3
8 eittir 2 * 4
9 eittir 3 * 3
(Yanl grmediniz. Bu doru bir kodlamadr. Dikkatli bakn: burada else cmlecii for
dngsne aittir, if deyimine deil.)
else cmlecikleri bir dng iinde kullanldklarnda, if deyimlerindeki else cmleciklerine
kyasla try deyimlerindeki else cmleciklerine daha ok benzerlik gsterir.
try
deyimlerindeki else cmlecikleri herhangi bir istisna olumad durumlarda alrken,
dnglerdeki else cmlecikleri ise herhangi bir break durumu olumadnda alr. try
deyimi ve istisnalara ilikin daha fazla bilgi iin bkz. stisnalarn Yakalanmas .
Cden esinlenen continue deyimi, dngde bir sonraki tura geilmesini salar:
>>>
...
...
...
...
Bir
Bir
Bir
Bir
Bir
Bir
Bir
Bir
for say in range(2, 10):
if say % 2 == 0:
print("Bir ift sayya rastland:", say)
continue
print("Bir sayya rastland:", say)
ift sayya rastland: 2
sayya rastland: 3
ift sayya rastland: 4
sayya rastland: 5
ift sayya rastland: 6
sayya rastland: 7
ift sayya rastland: 8
sayya rastland: 9
4.5 pass Deyimleri
pass deyimi hibir ey yapmaz. Yazdnz kodlarn sz diziminin bir deyim kullanlmasn
gerektirdii, ama programnzn herhangi bir ey yaplmasn gerektirmedii durumlarda
bunu kullanabilirsiniz. Mesela:
>>> while True:
...
pass # Klavyeden kesme sinyali (Ctrl+C) bekliyoruz
...
pass deyimi sklkla, asgari snf yaplar oluturmak iin kullanlmaktadr:
>>> class BenimBoSnfm:
...
pass
...
pass deyimi bunun dnda, yeni bir kod zerinde allrken fonksiyon veya koullu yaplarn
gvdeleri iinde bir yer tutucu olarak da kullanlabilir. Bu sayede, kodlarnzn daha soyut
ksmlar zerinde kafa yorabilirsiniz. pass deyimi Python tarafndan sessizce grmezden
gelinir:
>>> def initlog(*arglar):
...
pass # Bu ksm daha sonra yazarz!
...
20
Blm 4. Baka Kontrol Ak Aralar
Resmi Python 3 Klavuzu, Srm 3
4.6 Fonksiyonlarn Tanmlanmas
Snr kullanc tarafndan belirlenecek ekilde Fibonacci dizilerini ekrana dken bir fonksiyon
oluturalm:
>>>
...
...
...
...
...
...
...
>>>
...
0 1
def fib(n):
# n'e kadar olan Fibonacci dizilerini yazdryoruz
"""n'e kadar olan Fibonacci dizilerini ekrana basar."""
a, b = 0, 1
while a < n:
print(a, end=' ')
a, b = b, a+b
print()
# Biraz nce tanmladmz bu fonksiyonu aralm imdi de:
fib(2000)
1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
def szc fonksiyonun tanmlanma srecini balatr. Sonra da fonksiyonun ad ve kabul
edilecek parametrelerin listesi parantez iinde belirtilir. Fonksiyonun gvdesini oluturan
deyimler bir sonraki satra girintili bir ekilde yazlr.
sterseniz fonksiyon gvdesinin ilk deyimi olarak bir karakter dizisi de kullanabilirsiniz. Bu
karakter dizisi, fonksiyonun belgelendirme dizisi (ya da belge dizisi ) olacaktr. (Belge dizilerine
ilikin daha fazla bilgiyi Belgelendirme Dizileri ksmnda bulabilirsiniz). Belge dizilerinden
otomatik olarak evrimii veya basl belgeler reten ya da kullanclarn kodlara etkileimli
bir biimde gz atabilmesine imkan tanyan eitli aralar bulunmaktadr. Yazdnz kodlarda
belge dizilerini kullanmanz iyi bir alkanlktr. Dolaysyla bunu kendinize adet edinin.
Bir fonksiyon yrtldnde, bu fonksiyonun lokal deikenlerini barndran yeni bir simge
tablosu oluur. Daha ak bir dille ifade etmek gerekirse, bir fonksiyon iindeki btn
deiken atama ilemleri, bu deikenlerin deerini lokal simge tablosunda depolayacaktr.
Bu deikenlerin deerlerine erimek gerektiinde ilk olarak lokal simge tablosuna, daha
sonra d taraftaki fonksiyonlarn lokal simge tablolarna, sonra global simge tablosuna, en
son da gml isimlerin bulunduu tabloya baklacaktr. Global deikenlere (bunlar global
deyimi ile belirtmedike), dorudan fonksiyon iinden yeni deer atayamazsnz, ama bu
deikenlerin varolan deerini fonksiyon iinde kullanabilirsiniz.
Fonksiyon arlrken kullanlan asl parametreler (argmanlar), fonksiyonun arlmas
esnasnda, arlan fonksiyonun lokal simge tablosuna dahil edilir. Dolaysyla argmanlar
deer ile arma esasna gre atanr (burada deer her zaman nesneye atfta bulunur,
nesnenin deerine deil)1 . Bir fonksiyon baka bir fonksiyonu ardnda, bu arma ilemi
iin yeni bir simge tablosu oluturulur.
Fonksiyonun tanmlanmas, bu fonksiyonun adn mevcut simge tablosuna iler. Fonksiyon
adnn deeri, yorumlayc tarafndan, kullanc tanml bir fonksiyon olarak tannan bir veri
tipine sahiptir. Bu deer baka bir isme atanabilir, bylece bu isim de bir fonksiyon olarak
kullanlabilir. Yukarda bahsi geen yeniden adlandrmaya ilikin genel mekanizma yle iler:
>>> fib
<function fib at 10042ed0>
>>> f = fib
1
Aslnda nesneye atf yoluyla arma daha iyi bir tanm olurdu, nk eer verilen deer deitirilebilir bir
nesne ise, fonksiyonu aran yap, arlan yapnn nesne zerinde yapt btn deiiklikleri grecektir (mesela
listeye yeni eklenen eler).
4.6. Fonksiyonlarn Tanmlanmas
21
Resmi Python 3 Klavuzu, Srm 3
>>> f(100)
0 1 1 2 3 5 8 13 21 34 55 89
Eer baka dillerden geliyorsanz, fibin bir fonksiyon olmadn, nk bunun herhangi bir
deer dndrmediini, dolaysyla bir prosedr olduunu savunabilirsiniz. Aslnda return
deyimi iermeyen fonksiyonlar bile bir deer dndrr. Geri olduka yavan bir deerdir
bu. Bu deere None ad verilir (bu gml bir isimdir). Eer dndrlecek tek deer None
ise, yorumlayc normalde bu deeri size gstermez. Ama eer gerekten bu deeri grmek
isterseniz print() fonksiyonunu kullanabilirsiniz:
>>> fib(0)
>>> print(fib(0))
None
Fibonacci serilerindeki saylar ekrana basmak yerine bunlar bir liste halinde dndren bir
fonksiyon yazmak da basit bir itir:
>>>
...
...
...
...
...
...
...
...
>>>
>>>
[0,
def fib2(n): # n'e kadar olan Fibonacci dizilerini dndryoruz
"""n'e kadar olan Fibonacci dizilerini ieren bir liste dndrr."""
sonu = []
a, b = 0, 1
while a < n:
[Link](a)
# aaya bakn
a, b = b, a+b
return sonu
f100 = fib2(100)
# fonksiyonu aryoruz
f100
# sonucu yazdryoruz
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
Bu rnek, her zaman olduu gibi, Pythona ilikin baz yeni bilgiler ieriyor:
return deyimi fonksiyondan bir deer dndrr. return deyimi, eer herhangi bir
argman almadan, tek bana kullanlrsa None deerini dndrr. Fonksiyondan
return olmadan kldnda da None dndrlr.
[Link](a) deyiminde, sonu adl liste nesnesinin bir metodunu arm
oluyoruz.
Metotlar, nesnelere ait fonksiyonlar olup [Link] eklinde
adlandrlr. Burada nesne herhangi bir nesne olabilir (bu bir ifade de olabilir) ve
metotad da nesnenin ait olduu veri tipi iinde tanmlanm herhangi bir metodun
addr. Farkl veri tipleri iin farkl metotlar tanmlanmtr. Farkl veri tiplerinin metotlar
ayn ada sahip olabilir. Bu isimler birbirine karmaz. (Snar kullanarak kendi nesne
tiplerinizi ve metotlarnz tanmlamanz da mmkndr. Bunun iin Snar blmne
bakn) rnekte gsterilen append() metodu liste nesneleri iin tanmlanmtr; bu metot
listenin en sonuna yeni bir e ekler. Bu rnekte bu metot sonu = sonu + [a]
ifadesine edeerdir, ama ondan daha hzl alr.
4.7 Fonksiyonlarnn Tanmlanmasna Dair Baka Bilgiler
Deiken sayda argmana sahip fonksiyonlar tanmlamak da mmkndr. Bunun farkl
yntemi bulunur (bu farkl yntemleri birlikte de kullanabilirsiniz).
22
Blm 4. Baka Kontrol Ak Aralar
Resmi Python 3 Klavuzu, Srm 3
4.7.1 ntanml Argman Deerleri
En kullanl yntem bir veya daha fazla argman iin ntanml bir deer belirtmektir.
Bylece izin verilenden daha az argmanla arlabilecek bir fonksiyon oluturabilirsiniz.
Mesela:
def tamam_m(soru, deneme=4, sitem='Evet veya hayr ltfen!'):
while True:
onay = input(soru)
if onay in ('e', 'hh', 'evet'):
return True
if onay in ('h', 'ck', 'yok', 'hayr'):
return False
deneme = deneme - 1
if deneme < 0:
raise OSError('dik kafal kullanc')
print(sitem)
Bu fonksiyon eitli ekillerde arlabilir:
Yalnzca zorunlu
musunuz?)
argman
belirtilerek:
tamam_m(Gerekten kmak istiyor
Tercihe bal argmanlardan biri belirtilerek: tamam_m(Dosyann zerine yazlsn
m?, 2)
Hatta argmanlarn tamam belirtilerek:
m?, 2, evet mi diyorsun hayr m!)
tamam_m(Dosyann zerine yazlsn
Bu rnekte ayrca in szcn de gryoruz. Bu szck bir dizinin belirli bir deeri ierip
iermediini denetler.
ntanml deerler, fonksiyon tanmland anda, tanmn etki alan iinde ilem grr. Yani
i = 5
def f(arg=i):
print(arg)
i = 6
f()
Bu kod 5 deerini basacaktr.
nemli uyar: ntanml deer yalnzca bir kez ilem grr. Eer ntanml deer, liste,
szlk veya ou snfn rnei gibi deitirilebilen bir nesne ise farkl bir durum ortaya kar.
Mesela aadaki fonksiyon, art arda gelen arlarda kendisine verilen argmanlar biriktirir:
def f(a, L=[]):
[Link](a)
return L
print(f(1))
print(f(2))
print(f(3))
Bu kodlar u kty verir:
4.7. Fonksiyonlarnn Tanmlanmasna Dair Baka Bilgiler
23
Resmi Python 3 Klavuzu, Srm 3
[1]
[1, 2]
[1, 2, 3]
Eer ntanml deerin art arda gelen arlar arasnda paylalmasn istemiyorsanz,
fonksiyonu yukardaki yerine yle yazabilirsiniz:
def f(a, L=None):
if L is None:
L = []
[Link](a)
return L
4.7.2 simli Argmanlar
Fonksiyonlar ayn zamanda, isimli_arg=deer eklinde isimli argmanlar kullanlarak da
arlabilir. rnek olarak aadaki fonksiyonu ele alalm:
def papaan(voltaj, durum='mefta olmu', olay='vnlayamaz.', cins='Norve Mavisi'):
print("-- Bak arkada!", voltaj, "volt elektrik bile verseler", end=' ')
print("bu papaan bir yere", olay)
print("-- Ne tatl bi ty yuma deil mi u", cins)
print("-- Yahu sen ne diyorsun, bu ku", durum, "!")
Bu fonksiyon bir adet zorunlu argmana (voltaj), adet de tercihe bal argmana sahiptir
(durum, olay ve cins). Bu fonksiyon u yntemlerden herhangi biri kullanlarak arlabilir:
papaan(1000) # 1 tane konumlu argman
papaan(voltaj=1000) # 1 tane isimli argman
papaan(voltaj=1000000, olay='VINLAYAMAZ.') # 2 tane isimli argman
papaan(olay='VINLAYAMAZ.', voltaj=1000000) # 2 tane isimli argman
papaan('bir milyon', 'tahtal ky boylam', 'zplayamaz.') # 3 tane konumlu argman
papaan('bin', durum='nallar dikmi') # 1 tane konumlu, 1 tane isimli argman
Ancak aadaki btn arlar geersizdir:
papaan() # zorunlu argman belirtilmemi
papaan(voltaj=5.0, 'l') # isimli bir argmann ardndan isimsiz bir argman getirilmi
papaan(110, voltaj=220) # ayn argman iin birden fazla deer verilmi
papaan(aktr='John Cleese') # bilinmeyen bir isimli argman kullanlm
Fonksiyonlar arlrken, isimli argmanlar konumlu argmanlardan sonra getirilmelidir.
Belirtilen btn isimli argmanlar, fonksiyonun kabul ettii argmanlarla elemelidir (rn.
papaan fonksiyonunda aktr geerli bir argman deildir). simli argmanlarn sras nemli
deildir. Ayn ey zorunlu argmanlar iin de geerlidir (rn. papaan(voltaj=1000) ifadesi
de dorudur). Hibir argmana birden fazla deer atanamaz. Bu kstlama nedeniyle hata
veren bir rnek yle olabilir:
>>> def fonksiyon(a):
...
pass
...
>>> fonksiyon(0, a=0)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: function() got multiple values for keyword argument 'a'
24
Blm 4. Baka Kontrol Ak Aralar
Resmi Python 3 Klavuzu, Srm 3
Fonksiyonun argman listesinin en sonunda **isim biimli bir parametre varsa, bu
parametre, konumlu parametreler darda kalacak ekilde, btn isimli argmanlar bir
szlk iinde toplar (bkz. Eletirme Tipleri - dict). Yukarda bahsettiimiz ey, ayrca *isim
biimli bir baka parametre eidiyle birlikte de kullanlabilir (bunu bir sonraki alt blmde
aklayacaz). *isim parametresi, parametre listesinde normal bir ekilde tanmlanan
parametrelerin sandaki konumlu argmanlar bir demet iinde toplar. (*isim, **isimden
nce getirilmelidir.) rnein, eer yle bir fonksiyon tanmlayacak olursak:
def peynirci(tr, *argmanlar, **isimli_argmanlar):
print("-- Acaba sizde", tr, "var m ?")
print("-- Maalesef hi", tr, "kalmad")
for arg in argmanlar:
print(arg)
print("-" * 40)
anahtarlar = sorted(isimli_argmanlar.keys())
for anahtar in anahtarlar:
print(anahtar, ":", isimli_argmanlar[anahtar])
Bu fonksiyon yle arlabilir:
peynirci("Limburger peyniri", "Beyefendi, bu ok cvk.",
"Evet, beyefendi, evet, gerekten, ama GEREKTEN, cvk.",
dkkan_sahibi="Michael Palin",
mteri="John Cleese",
ske="Peynir Dkkan Skeci")
Buradan u kty alrz:
-- Acaba sizde hi Limburger peyniri var m?
-- Maalesef, hi Limburger peyniri kalmad
Beyefendi, bu ok cvk.
Evet, beyefendi, evet, gerekten, ama GEREKTEN, cvk."
---------------------------------------mteri: "John Cleese",
dkkan_sahibi: "Michael Palin",
ske: "Peynir Dkkan Skeci")
simli argmanlar oluturan isim listesinin, isimli argman szlnn keys() metodu
yardmyla alfabe srasna dizildikten sonra ekrana basldna dikkat edin. Eer byle
yapmazsak, argmanlarn ekrana basl sras belirsiz olacaktr.
4.7.3 Snrsz Argman Listeleri
Son olarak, en nadir kullanlan seenek, snrsz sayda argmanla arlabilecek fonksiyonlar
tanmlamaktr.
Bu argmanlar bir demet iine yerletirilecektir (bkz.
Demetler ve
Diziler ).
Sanrsz saydaki argmanlar tanmlamadan nce baka hi bir argman
belirtmeyebileceiniz gibi, bir veya daha fazla sayda normal argman da belirtebilirsiniz.
def birden_fazla_eyi_yazdr(dosya, ayra, *argmanlar):
[Link]([Link](argmanlar))
Normalde bu deiken sayl argmanlar, fonksiyona verilen btn sahipsiz argmanlar
toparlad iin normal parametre listesinin sonunda yer alr. *argmanlar parametresinden
sonra, yalnzca isimleriyle arlabilecek argmanlar getirebilirsiniz, yani bu parametreden
4.7. Fonksiyonlarnn Tanmlanmasna Dair Baka Bilgiler
25
Resmi Python 3 Klavuzu, Srm 3
sonra getireceiniz argmanlar konumlu argman olarak deil, sadece isimli argman olarak
kullanabilirsiniz.
>>> def birletir(*argmanlar, ayra="/"):
...
return [Link](argmanlar)
...
>>> birletir("dnya", "mars", "vens")
'dnya/mars/vens'
>>> birletir("dnya", "mars", "vens", ayra=".")
'[Link]'
4.7.4 Argman Listelerinin zlmesi
Tersi bir durum, argmanlarn halihazrda bir liste veya demet iinde bulunduu, ama
bunlarn, konumlu argmanlarn ayr ayr bulunmasn gerektiren bir fonksiyon arsnda
kullanlmak zere zlmesi gerektii durumlarda ortaya kar. rnein, gml range()
fonksiyonu ayr birer balang ve biti argman bekler. Eer bunlar ayr olarak mevcut
deilse, argmanlar liste veya demetten karmak iin fonksiyonunuzu * ilecini kullanarak
yazabilirsiniz:
>>>
[3,
>>>
>>>
[3,
list(range(3, 6)) # fonksiyonu normalde ayr argmanlarla byle aryoruz
4, 5]
argmanlar = [3, 6]
list(range(*argmanlar)) # argman listesini zp fonksiyonu aryoruz
4, 5]
Ayn ekilde szlklerin de ** ileci yardmyla isimli argmanlar sunmas salanabilir:
>>> def papaan(voltaj, durum='mefta olmu', olay='vnlayamaz.'):
...
print("-- ", voltaj, "volt verseler", end=' ')
...
print("bu papaan bir yere", olay)
...
print("Bu ku", durum, "!")
...
>>> d = {"voltaj": "Drt milyon", "durum": "kuyruu titretmi", "olay": "VINLAYAMAZ."}
>>> papaan(**d)
-- Drt milyon volt verseler bu papaan bir yere VINLAYAMAZ. Bu ku kuyruu titretmi !
4.7.5 Lambda fadeleri
lambda szc kullanlarak kk, isimsiz fonksiyonlar oluturulabilir. Mesela u fonksiyon
iki argmann toplamn dndrr: lambda a,b:a+b. Lambda fonksiyonlar, fonksiyon
nesnelerinin gerektii her yerde kullanlabilir. Bunlar sz dizimleri gerei tek bir ifade ile
snrldr. Anlam bakmndan ise, normal bir fonksiyon tanm yerine kullanlabilecek bir
sz dizimi enisi olmaktan ibaretlerdir. ie fonksiyon tanmlarnda olduu gibi, lambda
fonksiyonlar da, iinde bulunduklar etki alanndaki deikenlere atfta bulunabilir:
>>>
...
...
>>>
>>>
42
>>>
43
26
def artr(n)
return lambda x: x + n
f = artr(42)
f(0)
f(1)
Blm 4. Baka Kontrol Ak Aralar
Resmi Python 3 Klavuzu, Srm 3
Yukardaki rnekte, fonksiyon dndrmek iin lambda ifadelerinden yararlanyoruz.
Kk bir fonksiyonu argman olarak kullanmak gerektiinde de lambda ifadelerinden
yararlanabilirsiniz:
>>> iftler = [(1, 'bir'), (2, 'iki'), (3, ''), (4, 'drt')]
>>> [Link](key=lambda ift: ift[1])
>>> iftler
[(1, 'bir'), (4, 'drt'), (2, 'iki'), (3, '')]
4.7.6 Belgelendirme Dizileri
Belgelendirme dizilerinin ierii ve biimine ilikin baz yerlemi kurallardan sz edelim
imdi de.
Kodlarnzn ilk satr her zaman, nesnenin amacna dair ksa ve net bir zet iermelidir. Daha
ksa olmas iin, (eer isim, fonksiyonun ileyiini tarif eden bir il deilse) burada nesnenin
ad veya tipi aka belirtilmemelidir, zira bunlara baka vastalarla da eriebiliyoruz. Bu satr
byk hare balamal ve nokta ile sona ermelidir.
Eer belgelendirme dizisinde birden fazla satr varsa ikinci satr bo braklmal, bylece zet
ksm, aklamann geri kalanndan grnt itibariyle ayrlmaldr. Sonraki satrlar, nesnenin
arlmasna ilikin kaideleri, yan etkilerini, vb. tarif eden bir veya daha fazla paragraftan
olumaldr.
Pythonn ayrtrcs (parser), birden fazla satrdan oluan karakter dizilerinden girintileri
karmaz, bu yzden belgelendirme dizilerini ileyen aralar, eer gerekiyorsa bu girintileri
kendileri karmaldr. Bu ilem aadaki kaideye gre gerekletirilir. Karakter dizisinin
ilk satrndan sonra gelen ilk bo olmayan satr, btn belgelendirme dizisinin girintileme
miktarn belirler. (lk satr kullanamayz, nk bu satr genellikle karakter dizisinin
al trnaklarna bitiiktir. Bu yzden bunun girintileme yaps karakter dizisine baklarak
anlalamaz.) Bu girintilemenin boluk edeeri, karakter dizisinin btn satrlarnn
balangcndan itibaren karlp atlr. Daha az girintilenmi satr olmamaldr, ama eer
olursa bunlarn nndeki btn boluklar karlmaldr. Sekmelerin geniletilmesinin
ardndan, boluklarn birbirine eit olup olmad test edilmelidir (normalde 8 vuruluk boluk
temel alnr).
Aada birden fazla satrdan oluan bir belge dizisi rnei gryorsunuz:
>>> def fonksiyonum():
...
"""Hibir ey yapmyoruz, sadece belgelendiriyoruz..
...
...
Yo, yo, gerekten hibir ey yapmyoruz.
...
"""
...
pass
...
>>> print(fonksiyonum.__doc__)
Hibir ey yapmyoruz, sadece belgelendiriyoruz..
Yo, yo, gerekten hibir ey yapmyoruz.
4.7.7 Fonksiyon Aklamalar
Fonksiyon aklamalar, kulllanc tarafndan tanmlanan fonksiyonlar tarafndan kullanlan,
tamamen istee bal, zorunlu olmayan metaveri bilgileridir (daha fazla bilgi iin bkz. PEP
4.7. Fonksiyonlarnn Tanmlanmasna Dair Baka Bilgiler
27
Resmi Python 3 Klavuzu, Srm 3
484).
Aklamalar, fonksiyonun __annotations__ nitelii iinde bir szlk olarak tutulur ve
fonksiyonun baka ksmlar zerinde herhangi bir etkiye sahip deildir.
Parametre
aklamalar, parametre adnn ardndan getirilen iki nokta st ste iaretinden sonra,
aklamann deerini ileten bir ifade eklinde tanmlanr. Dn aklamalar -> iaretinin
ardndan, parametre listesi ile def deyiminin bitiini gsteren iki nokta st ste iareti arasna
getirilen bir ifade eklinde tanmlanr. Aadaki rnekte bir konumlu argman, bir isimli
argman ve aklamal bir dn deeri bulunmaktadr:
>>> def f(jambon: str, yumurtalar: str = 'yumurtalar') -> str:
...
print("Aklamalar:", f.__annotations__)
...
print("Argmanlar:", jambon, yumurtalar)
...
return jambon + ' ve ' + yumurtalar
...
>>> f('sucuk')
Aklamalar: {'jambon': <class 'str'>, 'dn deeri': <class 'str'>, 'yumurtalar': <class 'str'>}
Argmanlar: sucuk yumurtalar
'sucuk ve yumurtalar'
4.8 Perde Aras: Kodlama Tarz
Daha uzun, daha karmak Python kodlar yazmaya hazr hale gelmek zere olduunuza gre,
kodlama tarzndan bahsetmenin imdi tam sras. ou dil farkl tarzlar kullanlarak yazlabilir
(veya daha zl bir ifadeyle, biimlendirilebilir ). Ancak bu tarzlarn bazlar dierlerinden
daha okunakldr. Kodlarnz bakalar iin daha okunakl hale getirmeye almak her zaman
doru bir dnce eklidir. Gzel bir kodlama tarz benimsemek bu konuda size epey yararl
olacaktr.
Python iin, PEP 8 pek ok proje tarafndan benimsenen bir slup klavuzu halini almtr.
Bu klavuzca tevik edilen kodlama tarz bir hayli okunakl ve gze ho grnen bir tarzdr.
Her Python gelitiricisi bir noktada bu klavuzu okumaldr. Burada biz sizin iin bu klavuzun
nemli noktalarn aykladk:
4 bolukluk girintileme kullann, sekme kullanmaktan kann.
4 boluk, az girinti (daha fazla i ie gemi yaplar retilmesini kolaylatrr) ile fazla
girinti (daha okunakldr) arasnda makul bir orta yoldur. Sekmeler kafa karklna yol
at iin en iyisi sekmelerden kanmaktr.
Satrlar 79 karakteri gemeyecek ekilde ayarlanmaldr.
Bu, kk ekranlarda alan kullanclar asndan faydaldr ve geni ekranlarda da
birden fazla kod dosyasnn yan yana alabilmesini olanakl klar.
Fonksiyonlar ile snar ve fonksiyonlar iindeki byk kod bloklarn ayrmak iin bo
satrlardan yararlann.
Mmknse yorumlarnz ayr satrlarda gsterin.
Belge dizilerini kullann.
leler arasnda ve virgllerden sonra boluk koyun, ama parantezli yaplarn iinde
boluk kullanmayn: a = f(1, 2) + g(3, 4).
28
Blm 4. Baka Kontrol Ak Aralar
Resmi Python 3 Klavuzu, Srm 3
Snarnz ve fonksiyonlarnz tutarl bir ekilde isimlendirin.
Kabul grm
uygulama, snf adlarnn lkHarfleriniBykYazarken, fonksiyon ve metot adlarnn
btn harerini kk yazmak ve kelimeler_arasna_alt_izgi_yerletirmektir.
Metotlarn ilk argman iin her zaman self adn kullann (snar ve metotlar hakknda
daha fazla bilgi iin bkz. Snara lk Bak ).
Eer yazdnz kodlarn uluslararas ortamlarda kullanlmasn hedeiyorsanz nadir
karakter kodlamalarn kullanmayn. Pythonn ntanml karakter kodlamas olan UTF-8
ve hatta saf ASCII her durumda en iyi sonular verecektir.
Ayn ekilde, farkl bir dil konuan insanlarn, kodlarnz en ufak bir okuma veya
dzenleme ihtimali varsa tanm adlarnda ASCII d karakterler kullanmayn.
4.8. Perde Aras: Kodlama Tarz
29
BLM 5
Veri Yaplar
Bu blmde hem nceden renmi olduumuz baz konular daha ayrntl bir ekilde ele
alacaz, hem de bunlara yeni birtakm bilgiler ilave edeceiz.
5.1 Listeler Hakknda Daha Fazlas
Liste veri tipinin, nceki blmlerde grdklerimiz dnda baka metotlar da bulunur. Liste
nesnelerinin btn metotlarn yle sralayabiliriz:
[Link](x )
Listenin en sonuna e ekler. ununla ayn ii yapar: a[len(a):] = [x].
[Link](L )
Kendisine parametre olarak verilen bir listedeki btn eleri ilk listeye ekleyerek o
listeyi geniletir. ununla ayn ii yapar: a[len(a):] = L.
[Link](i, x )
Bir eyi, belirtilen konuma yerletirir. lk argman, nne yeni bir e yerletirilecek
liste esinin srasn gsterir. Dolaysyla [Link](0, x) komutu eyi listenin en
bana yerletirir. [Link](len(a), x) komutu da [Link](x) ile ayn ii yapar.
[Link](x )
Listede geen, x deerine sahip ilk eyi listeden karr. Eer bu deere sahip bir e
yoksa bir hata mesaj gsterilir.
[Link]([i ])
Belirtilen konumdaki eyi listeden karr ve karlan bu eyi dndrr. Eer
herhangi bir sra numaras belirtilmezse, [Link]() komutu listenin son esini listeden
karacak ve bu eyi dndrecektir. (Metodun formlndeki i harni iine alan keli
parantezler ilgili parametrenin tercihe bal olduunu gsterir, oraya sizin de keli
parantez koymanz gerektiini deil. Bu gsterimle Python Ktphane Referansnda
sklkla karlaacaksnz.)
[Link]()
Listedeki btn eleri listeden karr. una edeerdir: del a[:].
[Link](x )
Listede, x deerine sahip ilk enin srasn dndrr. Eer bu deere sahip bir e
yoksa bir hata mesaj gsterilir.
[Link](x )
x deerinin listede ka kez getiini dndrr.
30
Resmi Python 3 Klavuzu, Srm 3
[Link](key=None, reverse=False )
Liste elerini, ayn liste zerinde alfabe srasna dizer (argmanlar kullanarak, sralama
ltlerini belirleyebilirsiniz. Argmanlarn aklamalar iin sorted() fonksiyonunu
inceleyebilirsiniz).
[Link]()
Liste elerinin srasn, ayn liste zerinde ters evirir.
[Link]()
Listenin s kopyasn dndrr. una edeerdir: a[:].
Liste metotlarnn ounu bir arada gsteren bir rnek verelim:
>>> a = [66.25, 333, 333, 1, 1234.5]
>>> print([Link](333), [Link](66.25), [Link]('x'))
2 1 0
>>> [Link](2, -1)
>>> [Link](333)
>>> a
[66.25, 333, -1, 333, 1, 1234.5, 333]
>>> [Link](333)
1
>>> [Link](333)
>>> a
[66.25, -1, 333, 1, 1234.5, 333]
>>> [Link]()
>>> a
[333, 1234.5, 1, 333, -1, 66.25]
>>> [Link]()
>>> a
[-1, 1, 66.25, 333, 333, 1234.5]
>>> [Link]()
1234.5
>>> a
[-1, 1, 66.25, 333, 333]
insert, remove veya sort gibi, liste zerinde sadece deiiklik yapan metotlarn ekrana
herhangi bir dn deeri basmadn farketmisinizdir. Bu metotlar ntanml None deerini
dndrr1 . Pythondaki btn deitirilebilir veri yaplar iin bir tasarm ilkesidir bu.
5.1.1 Listelerin Yn Olarak Kullanlmas
Liste metotlar sayesinde listeler, eklenen son enin eriilen ilk e olduu (son giren ilk
kar) birer yn olarak kolayca kullanlabilir. Ynn en stne bir e eklemek iin append()
metodunu kullanyoruz. Ynn en stndeki eye erimek iin ise, pop() metodunu e
srasn aka belirtmeden kullanyoruz. Mesela:
>>>
>>>
>>>
>>>
[3,
>>>
7
yn = [3, 4, 5]
[Link](6)
[Link](7)
yn
4, 5, 6, 7]
[Link]()
Baka
dillerde,
deiiklie
urayan
nesne
de
dndrlyor
d->insert("a")->remove("b")->sort(); eklinde metotlar birbirine zincirlenebilir.
5.1. Listeler Hakknda Daha Fazlas
olabilir,
bylece
31
Resmi Python 3 Klavuzu, Srm 3
>>>
[3,
>>>
6
>>>
5
>>>
[3,
yn
4, 5, 6]
[Link]()
[Link]()
yn
4]
5.1.2 Listelerin Kuyruk Olarak Kullanlmas
Listeleri, eklenen ilk enin eriilen ilk e olduu (ilk giren ilk kar) bir kuyruk olarak
kullanmak da mmkn olsa bile, listeler bu ama iin pek verimli deildir. Listenin sonuna
e ekleme ve listenin sonundan e atma ilemleri hzl olsa da, listenin bana e
yerletirme veya listenin bandan e atma ilemleri yavatr (nk bu durumda teki
btn elerin bir sra kaydrlmas gerekir).
Bir kuyruk oluturmak iin, [Link] metodu kullanlabilir. Bu metot, listelerin
her iki tarafnda hzl bir ekilde e ekleme ve atma ilemleri yaplmasn salayacak ekilde
tasarlanmtr. Mesela:
>>> from collections import deque
>>> kuyruk = deque(["Eric", "John", "Michael"])
>>> [Link]("Terry")
# Terry geldi
>>> [Link]("Graham")
# Graham geldi
>>> [Link]()
# imdi ilk gelen e gidiyor
'Eric'
>>> [Link]()
# imdi de ikinci gelen e gidiyor
'John'
>>> kuyruk
# Geli sralarna gre kuyruun geri kalan eleri
deque(['Michael', 'Terry', 'Graham'])
5.1.3 Liste reticiler
Liste reticileri kullanarak ksa yoldan listeler oluturabiliriz. Liste reticilerin yaygn
kullanld uygulama alan, her esinin, baka bir dizinin veya zerinde yrnebilir nesnenin
her bir esine uygulanan baz ilemlerin sonucu olduu yeni listeler retmek veya belirli bir
koulu karlayan elerden meydana gelen bir altdizi oluturmaktr.
rnein, saylarn karesinden oluan bir liste oluturmak istediimizi varsayalm:
>>>
>>>
...
...
>>>
[0,
kareler = []
for x in range(10):
[Link](x**2)
kareler
1, 4, 9, 16, 25, 36, 49, 64, 81]
Bu ilemin, dng tamamlandktan sonra da varln srdren x adl bir deiken
oluturduuna (veya bu ad tayan bir deikenin zerine yazdna) dikkat edin. Karelerin
listesini, herhangi bir olumsuz etkiye yol amayacak ekilde yle hesaplayabiliriz:
kareler = list(map(lambda x: x**2, range(10)))
32
Blm 5. Veri Yaplar
Resmi Python 3 Klavuzu, Srm 3
Bunun edeeri udur:
kareler = [x**2 for x in range(10)]
Son yazdmz kod daha ksa ve okunakldr.
Liste reticilerde keli parantez iinde bir ifade, bunun ardndan bir for cmlecii, sonra da
arzu edilen sayda for ya da if cmlecii bulunur. Sonu; ifadenin, kendisini takip eden for
ve if cmleciklerinin gerektirdii ekilde iletilmesinin ardndan ortaya kan yeni bir liste
olacaktr. rnein aadaki liste retici, iki listenin ayn olmayan elerini bir araya getiriyor:
>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
bu kodlar una edeerdir:
>>> bileimler = []
>>> for x in [1,2,3]:
...
for y in [3,1,4]:
...
if x != y:
...
[Link]((x, y))
...
>>> bileimler
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
for ve if deyimlerinin her iki kod parasnda da ayn srada yer aldna dikkat edin.
Eer ifade bir demet ise (mesela bir nceki rnekteki (x, y)), bunun parantez iinde
gsterilmesi gerekir.
>>> vek = [-4, -2, 0, 2, 4]
>>> # deerlerin iki katndan oluan yeni bir liste oluturalm.
>>> [x*2 for x in vek]
[-8, -4, 0, 4, 8]
>>> # listeyi szerek eksi deerli saylar atalm
>>> [x for x in vek if x >= 0]
[0, 2, 4]
>>> # btn elere bir fonksiyon uygulayalm
>>> [abs(x) for x in vek]
[4, 2, 0, 2, 4]
>>> # her bir e zerine bir metot uygulayalm
>>> tazemeyveler = [' muz', ' ahududu ', 'brtlen ']
>>> [[Link]() for meyve in tazemeyveler]
['muz', 'ahududu ', 'brtlen']
>>> # (say, karesi) eklinde 2 eli demetlerden oluan bir liste retelim
>>> [(x, x**2) for x in range(6)]
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
>>> # demetin parantez iinde gsterilmesi gerekir, aksi halde hata alrz
>>> [x, x**2 for x in range(6)]
File "<stdin>", line 1, in ?
[x, x**2 for x in range(6)]
^
SyntaxError: invalid syntax
>>> # iki adet 'for' ieren bir liste retici kullanarak listeyi dzletirelim
>>> vek = [[1,2,3], [4,5,6], [7,8,9]]
>>> [say for e in vec for say in e]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Liste reticiler karmak ifadeler ve i ie gemi fonksiyonlar da ierebilir:
5.1. Listeler Hakknda Daha Fazlas
33
Resmi Python 3 Klavuzu, Srm 3
>>> from math import pi
>>> [str(round(pi, i)) for i in range(1, 6)]
['3.1', '3.14', '3.142', '3.1416', '3.14159']
5.1.4 e Liste reticiler
Bir liste retici iindeki ilk ifade, baka bir liste retici de dahil olmak zere herhangi bir
ifadeden oluuyor olabilir.
Her birinin uzunluu 4 olan 3 adet listeden oluacak ekilde yazlm u 3x4 matris rneine
bir bakalm:
>>> matris = [
...
[1, 2, 3, 4],
...
[5, 6, 7, 8],
...
[9, 10, 11, 12],
... ]
Aadaki liste retici, matrisin satr ve stunlarn transpoze edecektir:
>>> [[satr[i] for satr in matrix] for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
nceki blmde grdmz gibi, i ie gemi liste reticiler, kendisinden sonra gelen for
dngsnn gerektirdii ekilde iletilmektedir. Dolaysyla bu rnek una edeerdir:
>>> transpoze = []
>>> for i in range(4):
...
[Link]([satr[i] for satr in matris])
...
>>> transpoze
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
Ayn ekilde yukardaki kod ununla da edeerdir:
>>> transpoze = []
>>> for i in range(4):
...
# aadaki 3 satrda i ie liste reticiler oluturulmutur
...
transpoze_satr = []
...
for satr in matris:
...
transpoze_satr.append(satr[i])
...
[Link](transpoze_satr)
...
>>> transpoze
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
Gerek programlarda, karmak ak deyimleri yerine gml fonksiyonlar tercih etmelisiniz.
Bu tr durumlarda zip() fonksiyonu epey iinize yarar:
>>> list(zip(*matris))
[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]
Bu satrdaki yldza ilikin ayrntlar iin bkz. Argman Listelerinin zlmesi .
34
Blm 5. Veri Yaplar
Resmi Python 3 Klavuzu, Srm 3
5.2 del Deyimi
Bir listeden e silmek iin o enin deerini belirtmek yerine srasn belirtebilmenizin de bir
yntemi var: del deyimini kullanmak. Bu deyim, sildii eyi dndren pop() metodundan
farkldr. del deyimi ayrca (daha nce listenin bir parasn bo bir listeye atayarak yaptmz
gibi) listelerin bir parasn veya tamamn silmek iin de kullanlabilir. Mesela:
>>>
>>>
>>>
[1,
>>>
>>>
[1,
>>>
>>>
[]
a = [-1, 1, 66.25, 333, 333, 1234.5]
del a[0]
a
66.25, 333, 333, 1234.5]
del a[2:4]
a
66.25, 1234.5]
del a[:]
a
del deyimi, deikenleri tamamen ortadan kaldrmak iin de kullanlabilir:
>>> del a
Bu andan sonra a ismine atfta bulunursanz hata mesaj alrsnz (en azndan bu isme baka
bir deer atanana kadar). leride del deyiminin baka kullanm alanlarn da greceiz.
5.3 Demetler ve Diziler
Listelerin ve karakter dizilerinin, indeksleme ve dilimleme gibi pek ok ortak ynnn
olduunu grmtk. Bunlar dizi adl veri tipine iki rnektir (bkz. Dizi Tipleri - liste, demet,
aralk). Python evrilmeye devam eden bir dil olduu iin, bu dile ilerde dizi nitelikli baka
veri tipleri de ilave edilebilir. Bunlarn dnda dizi nitelikli baka bir standart veri tipi daha
bulunur. Bu veri tipinin ad demet tir.
Demetler, birbirinden virgl ile ayrlm birtakm deerlerden oluur. rnein:
>>> t = 12345, 54321, 'selam!'
>>> t[0]
12345
>>> t
(12345, 54321, 'selam!')
>>> # Demetler i ie geirilebilir:
... u = t, (1, 2, 3, 4, 5)
>>> u
((12345, 54321, 'selam!'), (1, 2, 3, 4, 5))
>>> # Demetler deitirilemez:
... t[0] = 88888
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> # ama bunlar deitirilebilen nesneler ierebilir::
... v = ([1, 2, 3], [3, 2, 1])
>>> v
([1, 2, 3], [3, 2, 1])
5.2. del Deyimi
35
Resmi Python 3 Klavuzu, Srm 3
Grdnz gibi, demetlerin ktlar her zaman parantez iinde gsteriliyor. Bylece
i ie gemi demetler doru bir ekilde grntlenebiliyor. Demetler parantez iinde
yazlabilecei gibi, parantezsiz olarak da yazlabilir, ancak (zellikle demet daha byk bir
ifadenin parasyla) ou durumda parantezleri kullanmanz gerekecektir. Bir demetin belirli
bir esine deer atamak mmkn olmasa da, listeler gibi deitirilebilen nesneler ieren
demetler oluturabilirsiniz.
Demetler listelere benzer gibi grnse de, bu ikisi genellikle farkl durumlarda ve
birbirlerinden farkl amalarla kullanlr. Demetler deitirilemeyen nesnelerdir. Bunlar
genellikle birbirinden farkl tiplerde eyi dizi halinde ierir.
Demetlerin elerine
demet zme (bu blmn ilerleyen sayfalarna baknz) veya indeksleme araclyla (ya
da namedtuplesta olduu gibi nitelikler araclyla) eriilebilir. Listeler deitirilebilen
nesnelerdir. Bunlarn eleri genellikle ayn tiptedir ve bu elere liste zerinde yrnerek
eriilir.
e iermeyen veya tek bir e ieren demetlerin oluturulmasnda zel bir durum sz
konusudur. Bunun iin sz dizimine baz enteresan zellikler eklenmitir. Bo demetler, bir
ift bo parantez yardmyla oluturulabilir. Tek eli bir demet ise bu enin yanna bir virgl
getirilerek oluturulur (tek bir deeri parantez iine almak yeterli deildir). Bu sz dizimi irkin
olsa da pratiktir. Mesela:
>>> bo = ()
>>> tek_eli = 'merhaba',
>>> len(bo)
0
>>> len(tek_eli)
1
>>> tek_eli
('merhaba',)
# <-- sondaki virgle dikkat
t = 12345, 54321, selam! ifadesi demetlemeye bir rnektir. Yani burada 12345, 54321
ve selam! deerleri bir demet iinde bir araya getirilmi. Bu ilemin tersini yapmak da
mmkndr:
>>> x, y, z = t
Buna, anlamna uygun bir ekilde, dizi zme denir ve eitliin sa tarafnda yer alan her trl
diziye uygulanabilir. Dizi zme ilemi, eittir iaretinin sol tarafnda, dizi iindeki e says
kadar deiken olmasn gerektirir. Esasnda oklu deer atama dediimiz ey, demetleme ve
dizi zme ilemlerinin birleiminden ibarettir.
5.4 Kmeler
Pythonda kmeler iin de ayr bir veri tipi bulunur. Kmeler, tekrar eden eler iermeyen,
srasz bir yndr. Kmeler temel olarak yelik kontrol ve tekrar eden girdilerin elenmesi
iin kullanlr. Kme nesneleri ayrca, birleim, kesiim, fark ve simetrik fark gibi matematik
ilemlerini de destekler.
Kme oluturmak iin ssl parantezler veya set() fonksiyonu kullanlabilir. Not: Bo bir
kme oluturabilmek iin {} iaretini deil set() fonksiyonunu kullanmalsnz. {} iareti bo
bir szlk oluturur. Szlk veri tipini bir sonraki blmde ele alacaz.
te size ksa birka rnek:
36
Blm 5. Veri Yaplar
Resmi Python 3 Klavuzu, Srm 3
>>> sepet = {'elma', 'portakal', 'elma', 'armut', 'portakal', 'muz'}
>>> print(sepet)
# tekrarlayan elerin karldn gryorsunuz
{'portakal', 'muz', 'armut', 'elma'}
>>> 'portakal' in sepet
# hzlca yelik kontrol
True
>>> 'atal otu' in sepet
False
>>> #
...
>>> a
>>> b
>>> a
{'a',
>>> a
{'r',
>>> a
{'a',
>>> a
{'a',
>>> a
{'r',
ki farkl kelime iindeki, tekrar etmeyen harfler zerinde kme ilemleri yapalm
= set('abrakadabra')
= set('alakazam')
'r',
- b
'd',
| b
'k',
& b
'k'}
^ b
'd',
'b', 'k', 'd'}
'b'}
# a'daki her bir harf bir kez
# a'da olan, b'de olmayan harfler
# a'da veya b'de bulunan harfler
'r', 'd', 'b', 'm', 'z', 'l'}
# a'da ve b'de bulunan harfler
'b', 'm', 'z', 'l'}
# a ve b'de ortak olmayan harfler
liste reticiler ile benzer ekilde, kme reticiler de bulunur:
>>> a = {x for x in 'abrakadabra' if x not in 'abk'}
>>> a
{'r', 'd'}
5.5 Szlkler
Pythonn bnyesinde bulunan, kullanl veri tiplerinden bir tanesi de szlklerdir (bkz.
Eleme Tipleri - szlk). Szlkler baz baka dillerde ilikili bellekler (associative
memories) veya ilikili diziler (associative arrays) adyla da geebilir. elerine belli bir say
aralna gre eriilen dizilerin aksine, szlklerin elerine anahtarlar yardmyla eriilir. Bu
anahtarlar deitirilemeyen veri tiplerinden herhangi birisi olabilir. Karakter dizileri ve saylar
her zaman iin anahtar olarak kullanlabilir. Hatta, yalnzca karakter dizileri, saylar veya
demetlerden olumak kaydyla demetler de anahtar olarak kullanlabilir. Ama eer bir demet,
dorudan veya dolayl olarak herhangi bir deitirilebilir nesne ieriyorsa, bu durumda bu
demet bir anahtar olarak kullanlamaz. Listeler ise anahtar olarak kullanlamaz, nk listeler
zerinde, e sras ile deer atama, dilime deer atama veya append() ve extend() gibi
metotlar yoluyla dorudan deiiklik yaplabilir.
Szlkler anahtar:deer iftlerinden oluan srasz bir veri tipi olarak dnlebilir. Bu
veri tipinde (ayn szlk iindeki) anahtarlar benzersiz olmaldr. Bir ift ssl parantez
yardmyla bo bir szlk oluturabiliriz: {}. Ssl parantezler arasna, birbirlerinden virglle
ayrlm anahtar:deer iftlerinden oluan bir liste yerletirerek, ilk anahtar:deer iftlerini
szlnze ilave edebilirsiniz. Zaten szlkler de ktda byle grnr.
Bir szlk zerinde yaplabilecek balca ilemler bir anahtar iinde deer depolamak ve
anahtar vererek bu deeri almaktr. Ayrca del deyimini kullanarak bir anahtar:deer iftini
silmek de mmkndr. Halihazrda kullanmda olan bir anahtara deer atarsanz, anahtarn
eski deeri kaybolacaktr. Szlkte varolmayan bir anahtar kullanarak deer almaya almak
hataya yol aacaktr.
5.5. Szlkler
37
Resmi Python 3 Klavuzu, Srm 3
Szlkler zerinde list([Link]()) ileminin uygulanmas, szlk iinde geen btn
anahtarlar, rastgele bir sra ile listeleyecektir (eer anahtarlarn sral olarak gelmesini
isterseniz sorted([Link]()) komutunu kullanabilirsiniz)2 . Eer tek bir anahtarn szlkte
olup olmadn kontrol etmek istiyorsanz, in szcn kullann.
Szlkleri kullanarak yle ufak bir rnek verelim:
>>> tel = {'ahmet': 4098, 'mehmet': 4139}
>>> tel['selin'] = 4127
>>> tel
{'mehmet': 4139, 'selin': 4127, 'ahmet': 4098}
>>> tel['ahmet']
4098
>>> del tel['mehmet']
>>> tel['aye'] = 4127
>>> tel
{'selin': 4127, 'aye': 4127, 'ahmet': 4098}
>>> list([Link]())
['aye', 'selin', 'ahmet']
>>> sorted([Link]())
['ahmet', 'aye', 'selin']
>>> 'selin' in tel
True
>>> 'ahmet' not in tel
False
dict() adl ina fonksiyonunu kullanarak, anahtar-deer iftlerinden oluan dizilerden
dorudan szlkler meydana getirebilirsiniz.
>>> dict([('mehmet', 4139), ('selin', 4127), ('ahmet', 4098)])
{'mehmet': 4139, 'ahmet': 4098, 'selin': 4127}
Ayrca rastgele anahtar ve deer deyimlerinden szlkler oluturmak iin szlk reticiler de
kullanlabilir:
>>> {x: x**2 for x in (2, 4, 6)}
{2: 4, 4: 16, 6: 36}
Eer anahtarlar basit karakter dizileri ise, anahtar-deer iftlerini isimli argmanlardan
faydalanarak belirlemek kimi zaman daha kolay olabilir:
>>> dict(mehmet=4139, selin=4127, ahmet=4098)
{'mehmet': 4139, 'ahmet': 4098, 'selin': 4127}
5.6 Dng Kurma Teknikleri
Szlkler zerinde dng kurulurken, items() metodu yardmyla ayn anda hem anahtar
hem de buna karlk gelen deer elde edilebilir.
>>> padiahlar = {"sleyman": "kanuni", "mehmet": "fatih"}
>>> for k, v in [Link]():
...
print(v, "sultan", k)
[Link]() komutu, szlk grnm [dictionary view] adl bir nesne dndrr. Bu nesne, yelik testi
ve yrme gibi ilemleri destekler, ancak bunun ierii orijinal szlkten bamsz deildir; bu yalnzca bir
grntden ibarettir.
2
38
Blm 5. Veri Yaplar
Resmi Python 3 Klavuzu, Srm 3
...
kanuni sultan sleyman
fatih sultan mehmet
Bir dizi zerinde dng kurulurken, enumerate() fonksiyonu yardmyla ayn anda hem e
sras hem de buna karlk gelen deer elde edilebilir.
>>> for i, v in enumerate(['ta', 'kat', 'makas']):
...
print(i, v)
...
0 ta
1 kat
2 makas
Ayn anda iki veya daha fazla dizi zerinde dng kurmak iin, zip() fonksiyonu kullanlarak
girdiler birbirleri ile eletirilebilir.
>>> sorular = ['isminiz', 'isteiniz', 'sevdiiniz renk']
>>> cevaplar = ['Frat', 'huzur', 'mavi']
>>> for s, c in zip(sorular, cevaplar):
...
print('{0} nedir? Cevabm {1}.'.format(s, c))
...
isminiz nedir? Cevabm Frat.
steiniz nedir? Cevabm huzur.
Sevdiiniz renk nedir? Cevabm mavi.
Bir dizinin tersi zerinde dng kurabilmek iin, bu dizi nce dz olarak belirtilir ve ardndan
reversed() fonksiyonu arlr.
>>> for i in reversed(range(1, 10, 2)):
...
print(i)
...
9
7
5
3
1
Bir dizi zerinde sral bir dzende dng kurabilmek iin sorted() fonksiyonunu
kullanyoruz. Bu fonksiyon, kaynak dizi zerinde herhangi bir deiiklik yapmadan, yeni, sral
bir liste dndrr.
>>> sepet = {'elma', 'portakal', 'elma', 'armut', 'portakal', 'muz'}
>>> for f in sorted(set(sepet)):
...
print(f)
...
armut
elma
muz
portakal
Bir listeyi, zerinde dng kurduunuz esnada deitirmek bazen daha cazipmi gibi gelebilir;
ancak bunun yerine yeni bir liste oluturmak ou zaman hem daha basittir hem de daha
gvenlidir.
>>> import math
>>> ham_veriler = [56.2, float('NaN'), 51.7, 55.3, 52.5, float('NaN'), 47.8]
>>> szlm_veriler = []
5.6. Dng Kurma Teknikleri
39
Resmi Python 3 Klavuzu, Srm 3
>>> for deer in ham_veriler:
...
if not [Link](deer):
...
szlm_veriler.append(deer)
...
>>> szlm_veriler
[56.2, 51.7, 55.3, 52.5, 47.8]
5.7 Koullu Durumlar Hakknda Daha Fazlas
while ve if deyimlerinde kullanlan koul yaplarnda sadece karlatrmalar deil ileler de
yer alabilir.
in ve not in adl karlatrma ileleri bir deerin bir dizi iinde geip gemediini kontrol
eder. is ve is not adl ileler ise iki nesnenin gerekten ayn nesne olup olmadn kontrol
eder. Bu durum yalnzca, listeler gibi deitirilebilen nesneler iin bir anlam tar. Btn
karlatrma ileleri ayn ncelie sahiptir. Yani bunlar btn saysal ilelerden dk
nceliktedir.
Karlatrma ifadeleri zincirleme kullanlabilir. rnein, a < b == c komutu ann bden
kk olup olmadn, bnin de cye eit olup olmadn sorgular.
Karlatrma ifadeleri and ve or adl Bool ileleri kullanlarak birletirilebilir. Ayrca
bir karlatrmann (veya herhangi bir baka Bool ifadesinin) kts not yardmyla
olumsuzlanabilir. Bunlar, karlatrma ilelerine gre daha dk ncelie sahiptir. Bunlar
arasnda not ileci en yksek ncelie, or ileci ise en dk ncelie sahiptir. Dolaysyla
A and not B or C ifadesi A (and (not B)) or C ifadesine etir. Her zaman olduu gibi,
istenen dizilimi elde etmek iin parantezlerden yararlanlabilir.
and ve or adl Bool ilelerine ksa devre ileleri de denir. Bunlarn argmanlar soldan saa
doru ilenir ve kt belirlenir belirlenmez ilem durur. rnein eer A ve C true, ama B
false ise, A and B and C ifadesinde C ksm ileme alnmaz. Bir Bool olarak deil de genel
bir deer olarak kullanldnda ksa devre ilelerinin dn deeri en son ileme alnan
argman olacaktr.
Bir karlatrmann veya baka bir Bool ifadesinin sonucunu bir deikene atamak da
mmkndr. rnein:
>>> kardiz1, kardiz2, kardiz3 = '', 'Trakya', 'Kvrtma Havas'
>>> bo_olmayan_deer = kardiz1 or kardiz2 or kardiz3
>>> bo_olmayan_deer
'Trakya'
Cnin aksine, Pythonda ifade ortasnda atama yaplamayacana dikkat edin. C programclar
bu zellie dudak bkebilir, ama aslnda bu, C programlarnda sklkla karlalan bir sorun
tipinin ortaya kmasn engellemektedir. Yani bu sayede == kullanlmak istenirken yanllkla
= yazlmasnn nne geilmi olmaktadr.
5.8 Dizilerin teki Tiplerle Karlatrlmas
Dizi nesneleri, ayn dizi tipine sahip baka nesnelerle de karlatrlabilir. Bu karlatrmada
szlk sralamas kullanlr. Buna gre ilk iki e karlatrlr. Eer bunlar birbirinden
farklysa karlatrmann sonucu belli olmu olur. Eer bunlar birbirine eitse sonraki iki
40
Blm 5. Veri Yaplar
Resmi Python 3 Klavuzu, Srm 3
e karlatrlr ve dizinin sonuna gelinene kadar bu byle devam eder. Eer karlatrlan
iki e ayn veri tipine sahip diziler ise, szlk srasna gre karlatrma zyinelemeli olarak
yrtlr. Eer iki dizinin btn eleri eitse, bu iki dizi eit kabul edilir. Eer bir dizi,
baka bir dizinin ba taraftan alt dizisi ise, ksa dizi kk (az) olandr. Karakter dizileri, her
bir karakterin Unicode kod konumuna karlk gelen sayya gre sralanr. Ayn tipteki diziler
arasnda karlatrmaya ilikin birka rnek verelim:
(1, 2, 3)
< (1, 2, 4)
[1, 2, 3]
< [1, 2, 4]
'ABC' < 'C' < 'Pascal' < 'Python'
(1, 2, 3, 4)
< (1, 2, 4)
(1, 2)
< (1, 2, -1)
(1, 2, 3)
== (1.0, 2.0, 3.0)
(1, 2, ('aa', 'ab'))
< (1, 2, ('abc', 'a'), 4)
Nesnelerin uygun karlatrma metotlarna sahip olmas kaydyla, farkl tipteki nesneler <
veya > ileleri ile karlatrlabilir. rnein kark tipteki saylar, saysal deerlerine gre
karlatrlr. Dolaysyla 0 ile 0.0 birbirine eittir. Aksi durumda, rastgele bir sralama vermek
yerine, yorumlayc TypeError istisnasn tetikleyecektir.
5.8. Dizilerin teki Tiplerle Karlatrlmas
41
BLM 6
Modller
Pythonn yorumlaycsn kapatp tekrar atnzda, daha nce yapm olduunuz
tanmlamalar (fonksiyonlar ve deikenler) kaybolacaktr. Bu yzden, eer uzunca bir
program yazmak istiyorsanz, yorumlaycya gnderilecek girdiyi hazrlamak iin bir metin
dzenleyici kullanmak ve girdi olarak yorumlaycya bu dosyay verdikten sonra yorumlaycy
altrmak daha mantkl olacaktr.
Bahsettiimiz bu ileme betik oluturma denir.
Kodlarnz uzadka, bakm iini kolaylatrmak iin kodlarnz birka dosyaya blmeyi tercih
edebilirsiniz. Ayrca, yazdnz yardmc bir fonksiyonu, ieriindeki tanmlar her bir
programa tek tek kopyalamadan birka farkl programda birden kullanmak da isteyebilirsiniz.
Python bu ihtiyalarnz karlamak iin, size tanmlarnz bir dosyaya yerletirip, daha sonra
bunlar bir betik iinde veya yorumlaycnn etkileimli bir oturumunda kullanma imkan
sunar. te bu tr dosyalara modl ad verilir. Bir modl iindeki tanmlar baka modllerin
veya ana (main) modln (bir betik iinden veya etkileimli kabuktayken eriebildiiniz en
tepedeki deikenler btn) iine aktarlabilir.
Modller, Python tanmlarn ve deyimlerini ieren dosyalardr. Dosya ad ise, modl adnn
.py uzants eklenmi halidir. Bir modl iinde, modln adna (bir karakter dizisi olarak)
__name__ adl global bir deikenin deeri araclyla eriebiliriz. Mesela, o anda iinde
bulunduunuz dizinde, herhangi bir metin dzenleyici kullanarak, [Link] adyla bir dosya
oluturun; iine de unlar yazn:
# Fibonacci saylar modl
def fib(n):
# n'e kadar olan Fibonacci dizilerini yazdryoruz
a, b = 0, 1
while b < n:
print(b, end=' ')
a, b = b, a+b
print()
def fib2(n): # n'e kadar olan Fibonacci dizilerini dndryoruz
sonu = []
a, b = 0, 1
while b < n:
[Link](b)
a, b = b, a+b
return sonu
imdi Python yorumlaycsn an ve bu modl aadaki komut yardmyla ie aktarn:
>>> import fibo
42
Resmi Python 3 Klavuzu, Srm 3
Bu komut, fibo iinde tanmlanan fonksiyonlarn adlarn mevcut simge tablosuna dorudan
ilemez, oraya yalnzca modl ad olan fiboyu yerletirir. te bu modl adn kullanarak
fonksiyonlara eriebilirsiniz:
>>> [Link](1000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'
Eer modl iindeki bir fonksiyonu sk sk kullanacaksanz, bunu lokal bir isme atayabilirsiniz:
>>> fib = [Link]
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377
6.1 Modller Hakknda Daha Fazlas
Modller fonksiyon tanmlarnn yansra altrlabilir deyimler de ierebilir. Bu deyimlerin
amac modl ilk kullanma hazrlamaktr. Bunlar yalnzca, modl ad bir ie aktarma deyimi
iinde ilk kez getiinde iletilir1 . (Bunlar ayrca dosya bir betik olarak altrldnda da
iletilir.)
Her modln kendi zel simge tablosu bulunur. Bu tablo, modl iinde tanmlanan
btn fonksiyonlar tarafndan kullanlan bir global simge tablosu olarak ilev grr.
Dolaysyla bir modln yazar, kullanclarn global deikenleriyle yanllkla akma
endiesi tamadan modl iinde global deikenler kullanabilir. te yandan, eer yaptnz
iin sonularndan eminseniz, bir modln global deikenlerine, o modln fonksiyonlarna
eriirken kullandnz yntemi ([Link]) kullanarak mdahale edebilirsiniz.
Modller baka modlleri de ie aktarabilir. Adet olduu zere, btn import deyimleri bir
modln (dolaysyla bir betiin) en bana yerletiriliyor olsa da aslnda bu zorunlu deildir.
e aktarlan modl adlar, ie aktaran modln global simge tablosuna yerletirilir.
Bir modl iindeki isimleri, ie aktaran modln simge tablosuna dorudan dahil etmek iin
import deyimini farkl bir ekilde kullanabiliriz. Mesela:
>>> from fibo import fib, fib2
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377
Bu komut, ie aktarlan elerin alnd modln adn lokal simge tablosuna eklemez
(dolaysyla bu rnekte fibo ad tanmlanmam olacaktr).
Bir modl iinde tanmlanan btn isimleri almaya yarayan bir ie aktarma biimi de bulunur:
>>> from fibo import *
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377
Bu yntemle, alt izgi (_) ile balayanlar hari btn isimler ie aktarlr. ou durumda
Python programclar bu kolaylktan yararlanmaz, nk bu yntem yorumlaycnn iine
1
Fonksiyon tanmlar da aslnda iletilen birer deyimdir. Modl seviyesindeki bir fonksiyon tanmnnn
altrlmas fonksiyon adn modln global simge tablosuna yerletirir.
6.1. Modller Hakknda Daha Fazlas
43
Resmi Python 3 Klavuzu, Srm 3
bilinmeyen birtakm isimleri dahil ederek, muhtemelen daha nce tanmlam olduunuz baz
eyleri gizleyecektir.
Kodlarn okunmasn gletirdii iin, genellikle bir modln veya paketin iindeki her eyi *
ile ie aktarmaya iyi gzle baklmaz. Ancak etkileimli oturumlarda, yazacanz kod miktarn
azaltmak iin bu yntemden yararlanabilirsiniz.
Not: Performans artrmak iin, her modl, yorumlayc oturumu bana yalnzca bir kez ie
aktarlr. Dolaysyla, eer modlleriniz zerinde deiiklik yaparsanz yorumlaycy yeniden
balatmanz gerekir. Ya da, eer etkileimli olarak test ettiiniz yalnzca tek bir modl varsa
[Link]() fonksiyonunu kullanabilirsiniz. yle: import imp; [Link](modlad).
6.1.1 Modllerin Betik Olarak altrlmas
Python modllerini u komutla altrdnzda:
python [Link] <argmanlar>
modl iindeki kod, sanki siz bunu ie aktarmsnz gibi iletilecektir. Ancak bu durumda
__name__ deikeninin deeri "__main__" olarak ayarlanacaktr. Dolaysyla u kodu
modlnzn en sonuna yerletirdiinizde:
if __name__ == "__main__":
import sys
fib(int([Link][1]))
Dosyanzn hem bir betik olarak hem de ie aktarlabilir bir modl olarak kullanlabilmesine
olanak tanm olursunuz. nk bu ekilde komut satrnda girilen argmanlar ayrtran
kodlar yalnzca modln ana (main) dosya olarak iletildii durumlarda altrlacaktr:
$ python [Link] 50
1 1 2 3 5 8 13 21 34
Eer modl ie aktarlrsa bu kodlar almaz:
>>> import fibo
>>>
Bu yntem genellikle bir modl iin kullanl bir arayz sunmak amacyla veya test
maksadyla kullanlr (bir modln betik olarak altrlmas test takmnn iletilmesini
salayacaktr).
6.1.2 Modllerin Aranma Yolu
Mesela falanca adl bir modl ie aktarldnda Python yorumlaycs ilk olarak bu ada
sahip bir gml modl arar. Eer byle bir modl bulamazsa, [Link] deikeni iinde
tanmlanan dizin listesinde [Link] adl bir dosya arar. [Link] deikeninin ntanml
deerleri u konumlardan alnr:
Girilen betii ieren dizin (veya eer herhangi bir dosya belirtilmemise mevcut alma
dizini).
PYTHONPATH (PATH adl kabuk deikeni ile ayn sz dizimine sahip olan ve dizin
adlarndan oluan bir liste).
44
Blm 6. Modller
Resmi Python 3 Klavuzu, Srm 3
Kurulumda belirlenen ntanml dizin.
Not: Sembolik balar destekleyen dosya sistemlerinde, girilen betii ieren dizin, sembolik
ba takip edildikten sonra hesaplanr. Dier bir deyile sembolik ba ieren dizin modln
aranma yoluna eklenmez.
lk deerler atandktan sonra [Link] deerini baka Python programlar araclyla
deitirebilirsiniz. altrlan betii ieren dizin, standart ktphaneyi ieren yolun nne,
arama yolunun en bana yerletirilir. Bylece ktphane yolunda bulunan ayn adl
modllerin yerine bu dizindeki betikler yklenecektir. Eer bu deiiklii farknda olmadan
yaptysanz programnz hata verecektir. Daha fazla bilgi iin bkz. Standart Modller .
6.1.3 Derlenmi Python Dosyalar
Modllerin daha hzl yklenebilmesi iin Python her bir modln derlenmi
halini _pycache__ dizini iinde, [Link] adyla nbellee alr.
Burada,
srm derlenmi dosyann biimini gsterir.
Bu genellikle Pythonn srm
numarasn ierir.
rnein CPythonn 3.3 srmnde [Link] derlenmi hali
__pycache__/[Link] olarak nbellee alnacaktr.
Bu adlandrma
emas sayesinde Pythonn farkl datm ve srmlerine ait derlenmi modller bir arada
bulunabilecektir.
Python, kaynak dosyann deitirilme tarihini derlenmi dosyannkiyle karlatrarak
derlenmi dosyann gncel olup olmadn, yeniden derlenmesinin gerekip gerekmediini
belirler. Tamamen otomatik bir sretir bu. Ayrca derlenmi modller platformdan
bamszdr.
Dolaysyla ayn ktphane, farkl mimarilere sahip sistemler arasnda
paylalabilir.
Python u iki durumda nbellei kontrol etmez: lk olarak, eer modl dorudan komut
satrndan ykleniyorsa kaynak dosyay her defasnda yeniden derler ve dosyann derlenmi
halini saklamaz. kincisi, eer ortada kaynak modl yoksa nbellei kontrol etmez.
Programnz kaynak dosyas olmadan (yalnzca dosyann derlenmi halini) databilmek iin,
derlenmi modl kaynak dizin iine yerletirmeniz ve kaynak modl de oradan karmanz
gerekir.
Uzmanlar iin baz ipular verelim:
Derlenmi bir modln boyutunu kltmek iin Python komut satrnda -O veya
-OO seeneklerini kullanabilirsiniz. -O seenei assert deyimlerini, -OO seenei
ise hem assert deyimlerini hem de __doc__ dizilerini siler. Ama baz programlar
bunlarn varlna ihtiya duyuyor olabileceinden tr, bu seenei yalnzca yaptnz
iin sonularnn farkndaysanz kullanmalsnz. Optimize edilmi modller optetiketi tar ve genellikle boyut olarak daha kktr. Ancak gelecekteki srmlerde
optimizasyonun nitelikleri deiebilir.
Bir programn .pyc dosyasndan okunmas, .py dosyasndan okunmasna kyasla
onun daha hzl almasn salamaz. .pyc dosyalar yalnzca modln daha hzl
yklenmesini salar.
compileall modl, bir dizin iindeki btn modller iin .pyc dosyalar oluturabilir.
Buna dair karar srelerine ilikin bir ak emasyla birlikte, bu srece ilikin daha fazla
ayrnty PEP 3147de bulabilirsiniz.
6.1. Modller Hakknda Daha Fazlas
45
Resmi Python 3 Klavuzu, Srm 3
6.2 Standart Modller
Python; Python Ktphane Referans (bundan byle Ktphane Referans olarak anlacaktr)
adl ayr bir belge iinde tarif edilen bir standart modl ktphanesiyle birlikte gelir. Baz
modller yorumlaycnn iine gml vaziyettedir. Bu modller, dilin ekirdeinin bir
paras olmasalar da, iletim sistemlerine ilikin sistem arlar gibi temel ilemlere eriim
salamak veya performans artrmak amacyla dilin iine gmlm olup, bu tr ilemlere
eriilebilmesini salar. Bu modllerin hangileri olduu yaplandrmaya ilikin bir tercih
olup, hangi iletim sistemini kullandnza da baldr. rnein winreg modl yalnzca
Windows sistemlerinde bulunur. Bunlar arasnda zellikle bir modl zel ilgiyi hakediyor. Bu
modl, btn Python yorumlayclarna gml vaziyette bulunan sys modldr. sys.ps1
ve sys.ps2 deikenleri birincil ve ikincil komut istemi olarak kullanlacak karakter dizilerini
tanmlar.
>>> import sys
>>> sys.ps1
'>>> '
>>> sys.ps2
'... '
>>> sys.ps1 = 'C> '
C> print('Mymy!')
Mymy!
C>
Bu iki deiken, yorumlayc yalnzca etkileimli kipte iken tanmlanabilir.
[Link] deikeni, yorumlaycnn modl arama yolunu belirleyen, karakter dizilerinden
olumu bir listedir. Bu listenin ntanml deeri, PYTHONPATH adl evre deikeninden veya
PYTHONPATH tanml deilse gml bir ntanml deerden elde edilen yoldur. Bu yolu,
standart liste ilemleri araclyla deitirebilirsiniz:
>>> import sys
>>> [Link]('/ufs/guido/lib/python')
6.3 dir() Fonksiyonu
Gml dir() fonksiyonu, bir modl iinde hangi isimlerin tanml olduunu bulmak iin
kullanlr. Bu fonksiyon karakter dizilerinden oluan sral bir liste dndrr:
>>> import fibo, sys
>>> dir(fibo)
['__name__', 'fib', 'fib2']
>>> dir(sys)
['__displayhook__', '__doc__', '__excepthook__', '__loader__', '__name__',
'__package__', '__stderr__', '__stdin__', '__stdout__',
'_clear_type_cache', '_current_frames', '_debugmallocstats', '_getframe',
'_home', '_mercurial', '_xoptions', 'abiflags', 'api_version', 'argv',
'base_exec_prefix', 'base_prefix', 'builtin_module_names', 'byteorder',
'call_tracing', 'callstats', 'copyright', 'displayhook',
'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix',
'executable', 'exit', 'flags', 'float_info', 'float_repr_style',
'getcheckinterval', 'getdefaultencoding', 'getdlopenflags',
'getfilesystemencoding', 'getobjects', 'getprofile', 'getrecursionlimit',
'getrefcount', 'getsizeof', 'getswitchinterval', 'gettotalrefcount',
46
Blm 6. Modller
Resmi Python 3 Klavuzu, Srm 3
'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info',
'intern', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path',
'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1',
'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit',
'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout',
'thread_info', 'version', 'version_info', 'warnoptions']
Eer dir() fonksiyonunu argmansz kullanrsanz, o anda tanmlam olduunuz isimlerin
listesini alrsnz:
>>> a = [1, 2, 3, 4, 5]
>>> import fibo
>>> fib = [Link]
>>> dir()
['__builtins__', '__name__', 'a', 'fib', 'fibo', 'sys']
Burada btn isim trlerinin listelendiine dikkat edin: deikenler, modller, fonksiyonlar,
vb.
dir(), gml fonksiyonlarn ve deikenlerin isimlerini listelemez. Eer bu isimleri de
listelemek isterseniz, bunlar builtins adl bir standart modl iinde tanmlanmtr:
>>> import builtins
>>> dir(builtins)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException',
'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning',
'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError',
'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning',
'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False',
'FileExistsError', 'FileNotFoundError', 'FloatingPointError',
'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError',
'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError',
'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError',
'MemoryError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented',
'NotImplementedError', 'OSError', 'OverflowError',
'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError',
'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning',
'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError',
'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError',
'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError',
'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning',
'ValueError', 'Warning', 'ZeroDivisionError', '_', '__build_class__',
'__debug__', '__doc__', '__import__', '__name__', '__package__', 'abs',
'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable',
'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits',
'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit',
'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr',
'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass',
'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview',
'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property',
'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice',
'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars',
'zip']
6.3. dir() Fonksiyonu
47
Resmi Python 3 Klavuzu, Srm 3
6.4 Paketler
Paketler, noktal modl adlar kullanarak Pythonn modl isim alann yaplandrmann bir
yntemidir. rnein, A.B modl ad, A adl bir paket iindeki B adl bir alt modle iaret
eder. Nasl modllerin kullanm farkl modllerin yazarlarn birbirlerinin global deiken
adlarn dert etmekten kurtaryorsa, noktal modl adlarnn kullanm da, NumPy veya
Python Grntleme Ktphanesi gibi birden fazla modlden oluan paketlerin yazarlarn
da birbirlerinin modl adlarn dert etmekten kurtarr.
Diyelim ki, ses dosyalarnn ve ses verilerinin tek elden ilenebilmesini salayan bir dizi modl
(yani bir paket) tasarlamak istiyorsunuz. Etrafta pek ok farkl ses dosyas biimi bulunur
(bunlar genellikle uzantlarna baklarak ayrt edilir. rnein: .wav, .aiff, .au). Dolaysyla
farkl dosya biimleri arasndaki dntrme ilemleri iin zaman iinde byyen bir modl
yn oluturup bunun bakmn yapmanz gerekiyor olabilir. stelik ses verileri zerinde
gerekletirmeniz gerekebilecek pek ok farkl ilem de bulunur (kartrma, yank ekleme,
ekolayzr fonksiyonu uygulama, yapay stereo efekti oluturma gibi). Yani baka eylere
ek olarak, bu ilemleri gerekletirmek iin de modl stne modl yazmak durumunda
kalacaksnz. Sz konusu paket iin muhtemel bir yapnn nasl olabileceini gsterelim
(hiyerarik dosya sistemi olarak gsterilmitir):
ses/
__init__.py
biimler/
__init__.py
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
...
efektler/
__init__.py
[Link]
[Link]
[Link]
...
filtreler/
__init__.py
[Link]
[Link]
[Link]
...
Tepe paket
Ses paketinin ilk deerlerini belirler
Dosya biimi dnmleri iin alt paket
Ses efektleri iin alt paket
Filtreler iin alt paket
Python bu paketi ie aktarrken [Link] iinde geen dizinlerde bir arama yaparak paketin
alt dizinlerini arar.
__init__.py dosyalar, Pythonn dizinlere paket ieriyormu gibi davranmasn salamak iin
gereklidir. Bylece string gibi yaygn bir isme sahip dizinlerin, daha sonra modln arama
yolunda geen ntanml modlleri farknda olmadan gizlemesi nlenmi olur. En basit
haliyle __init__.py bo bir dosya olabilecei gibi, paketin balang kodlarn altrabilir
veya biraz sonra greceimiz __all__ deikenini tanmlayabilir.
Paketi kullananlar paket iinden modlleri tek tek ie aktarabilir. rnein:
48
Blm 6. Modller
Resmi Python 3 Klavuzu, Srm 3
import [Link]
Bu kod, [Link] adl alt modl ykler. Daha sonra bu modl tam adyla
kullanmak gerekir.
[Link](giri, k, gecikme=0.7, azaltm=4)
Alt modl ie aktarmann bir baka yntemi de udur:
from [Link] import yank
Bu kod da yank adl alt modl ykler ve bunu paket n eki olmadan kullanmnza sunar.
Dolaysyla bu modl yle kullanabiliriz:
[Link](giri, k, gecikme=0.7, azaltm=4)
Baka bir yntem ise, istenen fonksiyon veya deikeni dorudan ie aktarmaktr:
from [Link] import yankfiltresi
Bu kod yine yank alt modln ykler, ancak bu kez yankfiltresi() adl fonksiyonu
dorudan kullanmmza sunar:
yankfiltresi(giri, k, gecikme=0.7, azaltm=4)
from paket import e yaps kullanlrken burada e paketin bir alt modl (veya alt
paketi) olabilecei gibi, paket iinde tanmlanm baka bir isim de (mesela bir fonksiyon,
snf veya deiken) olabilir. import deyimi ilk olarak ilgili enin paket iinde tanml olup
olmadn kontrol eder. Eer deilse bu enin bir modl olduunu varsayar ve bunu
yklemeye alr. Eer eyi bulamazsa ImportError adl istisnay tetikler.
Yukardakinin aksine, import [Link] gibi bir sz dizimi kullanldnda, en
sonuncu e hari btn eler bir paket olmaldr. Son e bir modl veya paket olabilir,
ama nceki e iinde tanmlanm bir snf veya fonksiyon ya da bir deiken olamaz.
6.4.1 Bir Paket iinden * ile Aktarma
Peki kullanc from [Link] import * gibi bir kod yazdnda ne olur? Aslnda arzu
edilen, dosya sisteminin taranarak paket iinde hangi alt modllerin bulunduunun tespit
edilmesi ve bulunan her eyin ie aktarlmasdr. Ancak byle bir ilem ok uzun zaman
alabilir ve ayrca alt modllerin ie aktarlmas, alt modln yalnzca ak bir ekilde ie
aktarld durumlarda ortaya kmas gereken, istenmeyen yan etkilerin grlmesine yol
aabilir.
Byle bir durumda tek zm, paket yazarnn paket ieriine ilikin ak bir dizin
oluturmasdr. import deyimi aadaki kaideyi takip eder: Eer bir paketin __init__.py
dosyas iinde __all__ adl bir liste tanmlanmsa, from paket import * gibi bir kodla
karlaldnda bu liste iindeki modl adlar ieri aktarlr. Paketin yeni bir srm
ktnda bu listeyi gncellemek paket yazarnn sorumluluundadr. Paket yazarlar,
eer paketlerinden * ile ie aktarma yaplmasn gereksiz gryorlarsa elbette bu zellii
kullanmayabilirler. rnein, ses/efektler/__init__.py dosyas yle bir kod ierebilir:
__all__ = ["yank", "surround", "reverse"]
6.4. Paketler
49
Resmi Python 3 Klavuzu, Srm 3
Bylece from [Link] import * komutu ses paketindeki belirli alt modl ie
aktaracaktr.
Eer __all__ tanml deilse from [Link] import * deyimi [Link] adl paketin
iindeki btn alt modlleri mevcut isim alanna aktarmaz. Bu kodun yapt tek ey,
(__init__.py dosyas iinde olabilecek herhangi bir balatma kodunu da altrarak)
[Link] paketinin ie aktarlmasn salamak ve paket iinde tanmlanm hangi isimler
varsa onlar ie aktarmaktr. Buna __init__.py tarafndan tanmlanan btn isimler (ve
aka yklenen alt modller) dahildir. Bu ayrca, paketin, nceki import deyimleri araclyla
ak bir ekilde yklenmi olan alt modllerini de kapsar. Mesela u koda bir bakalm:
import [Link]
import [Link]
from [Link] import *
Bu rnekte yank ve surround modlleri, from...import deyimi altrldnda,
[Link] paketi iinde tanmlanm olduklar iin mevcut isim alanna aktarlr. (Bu ayrca
__all__ tanmlandnda da alr.)
Baz modller, import * yaps kullanldnda yalnzca belli ablonlara uyan isimler ie
aktarlacak ekilde tasarlanm olsa da, ciddi kodlarda bu yapnn kullanlmas kt bir
alkanlk olarak kabul edilir.
Ancak, from Paket import belirli_bir_altmodl yapsn kullanmann hibir sakncas
olmadn da unutmayn! Aslnda, modln, farkl paketlerden ayn ada sahip alt modlleri
kullanmas gerekmedike modl ie aktarmann nerilen yntemi budur.
6.4.2 Paket i Atar
Paketlerinizi alt paketler eklinde yaplandrarak (rnekteki ses paketinde olduu gibi), komu
paketlerin alt modllerine erimek iin mutlak ie aktarmalardan yararlanabilirsiniz. rnein
eer [Link] modlnn, [Link] paketi iindeki yank modln
kullanmas gerekirse, from [Link] import yank kodu kullanlabilir.
Eer isterseniz ie aktarma deyimini from modl import isim eklinde kullanarak bal ie
aktarmalar da yazabilirsiniz. Bu ie aktarma ilemlerinde, bal ie aktarmada yer alan mevcut
ve st paketleri gstermek iin isimlerin nne nokta iaretleri getirilir. rnein surround
modl iinde unu kullanabilirsiniz:
from . import yank
from .. import biimler
from ..filtreler import ekolayzr
Greceli ie aktarmalarn mevcut modln ismini temel aldna dikkat edin. Ana modln
ismi her zaman __main__ olduu iin, bir Python uygulamasnda ana modl olarak
kullanlmas planlanan modllerde daima mutlak ie aktarmadan yararlanlmaldr.
6.4.3 oklu Dizinler iindeki Paketler
Paketler baka bir zel nitelie daha sahiptir: __path__. Bu niteliin ilk deeri, o dosya
iindeki kod iletilmeden nce paketin __init__.py dosyasn tutan dizini ieren bir listedir.
Bu deikenin deeri deitirilebilir. Yaptnz deiiklikler, paket iinde yer alan modl ve
alt paketlere ilikin gelecekteki aramalar etkileyecektir.
50
Blm 6. Modller
Resmi Python 3 Klavuzu, Srm 3
Bu zellie genellikle pek ihtiya duyulmasa da, bir paket iinde yer alan modl saysn
geniletmek iin bu zellikten yararlanlabilir.
6.4. Paketler
51
BLM 7
Girdi ve kt
Bir programn ktsn sunmann birka yolu bulunur: Veriler okunakl bir ekilde ekrana
baslabilecei gibi, daha sonra kullanlmak zere bir dosyaya da yazlabilir. te bu blmde,
elimizdeki imkanlarn bazlarna deineceiz.
7.1 ktlar k Biimlendirme
imdiye kadar deerleri yazdrmann iki yntemini rendik: ifade deyimleri ve print()
fonksiyonu. (nc bir yol da dosya nesnelerinin write() metodunu kullanmaktr. Standart
kt dosyas [Link] olarak belirtilebilir. Buna ilikin daha fazla bilgi iin Ktphane
Referansna bakabilirsiniz.)
Muhtemelen, birbirlerinden bolukla ayrlm deerleri ekrana basmakla yetinmeyecek,
programnzn ktsn daha esnek bir ekilde biimlendirebilmek isteyeceksiniz.
Programnzn ktsn biimlendirmenin iki yntemi vardr: Bunlardan ilki, karakter dizilerini
tamamen elle dzenlemektir. Karakter dizisi dilimleme ve birletirme ilemlerini kullanarak
aklnza gelebilecek her trl dizilimi oluturabilirsiniz. Karakter dizisi adl veri tipinin,
karakter dizilerini istediiniz stun geniliine gre ayarlamanz salayacak birtakm faydal
metotlar bulunur. Burada bunlardan ksaca sz edeceiz. kinci yntem ise [Link]()
metodunu kullanmaktr.
string modl, birtakm deerleri karakter dizilerine dntrme imkan sunan Template
adl bir snf ierir.
Ama u soru hala cevapsz duruyor: Peki biz deerleri karakter dizilerine nasl evireceiz?
Neyse ki Python bize herhangi bir deeri karakter dizisine dntrmek iin baz yntemler
sunuyor: Bu ama iin, ilgili deeri repr() veya str() fonksiyonuna parametre olarak
vermemiz yeterli olacaktr.
str() fonksiyonu deerleri insanlar tarafndan okunabilecek bir ekilde temsil ederken,
repr() fonksiyonu ise deerleri yorumlayc tarafndan okunabilecek ekilde temsil eder (eer
edeer bir sz dizimi bulamazsa da SyntaxError istisnasn tetikler). nsanlar tarafndan
okunabilecek ekilde temsil edilemeyen nesneler iin str() fonksiyonu repr() ile ayn deeri
dndrecektir. Saylar veya liste ve szlk yaplar gibi deerler her iki fonksiyonda da ayn
ekilde temsil edilir. Karakter dizileri ise iki farkl ekilde temsil edilebilir.
Birka rnek verelim:
>>> s = 'Merhaba dnya.'
>>> str(s)
'Merhaba dnya.'
52
Resmi Python 3 Klavuzu, Srm 3
>>> repr(s)
"'Merhaba dnya.'"
>>> str(1/7)
'0.14285714285714285'
>>> x = 10 * 3.25
>>> y = 200 * 200
>>> s = "x'in deeri " + repr(x) + ", y'nin deeri ise " + repr(y) + "'dir..."
>>> print(s)
x'in deeri 32.5, y'nin deeri ise 40000'dir...
>>> # repr() karakter dizisi ktlarna trnaklar ve ters blleri ekler:
... merhaba = 'merhaba dnya\n'
>>> merhabak = repr(merhaba)
>>> print(merhabak)
'merhaba dnya\n'
>>> # repr() fonksiyonuna argman olarak her trl Python nesnesi verilebilir:
... repr((x, y, ('adana', 'mersin')))
"(32.5, 40000, ('adana', 'mersin'))"
Aada saylarn kareleri ve kplerinden meydana gelen bir tablo oluturmann iki farkl
yntemini gryorsunuz:
>>> for x in range(1, 11):
...
print(repr(x).rjust(2), repr(x*x).rjust(3), end=' ')
...
# Bir nceki satrda 'end' parametresinin kullanmna dikkat
...
print(repr(x*x*x).rjust(4))
...
1
1
1
2
4
8
3
9 27
4 16
64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
>>> for x in range(1, 11):
...
print('{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x))
...
1
1
1
2
4
8
3
9 27
4 16
64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
(lk rnekte her bir stun arasndaki bir adet boluun print() fonksiyonunun ileyii gerei
eklendiine dikkat edin. Bu fonksiyon, kendisine verilen argmanlar arasna her zaman bir
adet boluk yerletirir).
Bu rnekte, karakter dizisi nesnelerinin [Link]() metodunu gryoruz. Bu metot
karakter dizilerini, belirlenen genilikteki bir alan iinde, sol tarafa boluk eklemek suretiyle
7.1. ktlar k Biimlendirme
53
Resmi Python 3 Klavuzu, Srm 3
saa yaslar. Buna benzer ekilde [Link]() ve [Link]() metotlar da vardr. Bu
metotlar karakter dizisi zerinde herhangi bir deiiklik yapmaz; bunlarn yapt tek ey,
yeni bir karakter dizisi dndrmekten ibarettir. Eer girilen karakter dizisi ok uzunsa bu
metotlar karakter dizisini krpp ksaltmak yerine karakter dizisini olduu gibi dndrr. Bu
durum tablodaki stun yapsn altst edecektir, ancak bu, deeri krpp sizi yanltmaktan
ok daha iyi bir alternatiftir. (Eer istediiniz ey karakter dizisinin krplmas ise, bunun iin
[Link](n)[:n] gibi bir ey yazarak dilimleme ileminden yararlanabilirsiniz.)
Bir baka metot olan [Link]() ise, say deerli bir karakter dizisinin sol tarafna sfr
ekleyerek bunu kaydrr. Bu metot art ve eksi iaretlerini de tanr:
>>> '12'.zfill(5)
'00012'
>>> '-3.14'.zfill(7)
'-003.14'
>>> '3.14159265359'.zfill(5)
'3.14159265359'
[Link]() metodunun temel kullanm yledir:
>>> print('Pamuk {} ve yedi {}'.format('prenses', 'cceler'))
Pamuk prenses ve yedi cceler
Buradaki ssl parantezler ve ilerindeki karakterler (bunlara biimlendirme alanlar ad
verilir), [Link]() metoduna gnderilen nesneler ile deitirilir. [Link]() metoduna
gnderilen nesnenin konumunu belirtmek iin ssl parantezler iinde saylar kullanlabilir.
>>> print('{0} ve {1}'.format('dner', 'turu'))
dner ve turu
>>> print('{1} ve {0}'.format('dner', 'turu'))
turu ve dner
Eer [Link]() metodunda isimli argmanlar kullanlrsa bunlarn deerlerine argmann
ad kullanlarak atfta bulunulabilir.
>>> print('Bu {yemek} kesinlikle {nasl}.'.format(
...
yemek='dner', nasl='berbat'))
Bu dner kesinlikle berbat.
Konumlu ve isimli argmanlar istediiniz ekilde sralayabilirsiniz:
>>> print('{0}, {1} ve {dieri}.'.format('Atos', 'Portos', dieri='Aramis'))
Atos, Portos ve Aramis
Biimlendirmeden nce deeri dntrmek iin !a (ascii() fonksiyonunu uygular), !s
(str() fonksiyonunu uygular) ve !r (repr() fonksiyonunu uygular) kullanlabilir:
>>> import math
>>> print("PI'nin yaklak deeri: {}.".format([Link]))
PI'nin yaklak deeri: 3.14159265359.
>>> print("PI'nin yaklak deeri: {!r}.".format([Link]))
PI'nin yaklak deeri: 3.141592653589793.
Alan adnn ardndan, istenirse : ve bir biim dzenleyici getirilebilir. Bylelikle deerin
nasl biimlendirileceini daha esnek bir ekilde kontrol edebilirsiniz. Aadaki rnek, Pinin
deerini noktadan sonra basamak olacak ekilde yuvarlar.
54
Blm 7. Girdi ve kt
Resmi Python 3 Klavuzu, Srm 3
>>> import math
>>> print("PI'nin yaklak deeri: {0:.3f}.".format([Link]))
PI'nin yaklak deeri: 3.142.
: ifadesinin ardndan bir tamsay getirilirse, o alana en az bu deer kadar
karakterin sabilecei bir boluk ayrlacaktr. Bu yntem zellikle tablolarn grnnn
gzelletirilmesine yarar.
>>> tablo = {'kke': 4127, 'Selami': 4098, 'Kezban': 7678}
>>> for isim, tel in [Link]():
...
print('{0:10} ==> {1:10d}'.format(isim, tel))
...
Kezban
==>
7678
kke
==>
4127
Selami
==>
4098
Eer elinizde blmek istemediiniz, ok uzun bir biimlendirme dizisi varsa, biimlendirilecek
deikenleri konumlarna gre deil de isimlerine gre kullanabilseniz ne iyi olurdu, deil mi?
te bu ilem parametre olarak bir szlk verilerek ve bu szln elerine erimek iin de
keli parantezler [] kullanlarak yaplabilir:
>>> tablo = {'kke': 4127, 'Selami': 4098, 'Kezban': 8637678}
>>> print('Selami: {0[Selami]:d}; kke: {0[kke]:d}; '
...
'Kezban: {0[Kezban]:d}'.format(tablo))
Selami: 4098; kke: 4127; Kezban: 8637678
Ayn ey, ** iaretleri yardmyla tablonun isimli argman olarak verilmesiyle de yaplabilir.
>>> tablo = {'kke': 4127, 'Selami': 4098, 'Kezban': 8637678}
>>> print('Selami: {Selami:d}; kke: {kke:d}; Kezban: {Kezban:d}'.format(**tablo))
Selami: 4098; kke: 4127; Kezban: 8637678
Bu zellik, btn lokal deikenleri iinde barndran bir szlk dndren vars() gml
fonksiyonuyla birlikte kullanldnda epey iinize yarayacaktr.
[Link]() ile karakter dizisi biimlendirme hakknda en geni bilgi iin bkz. Biimlendirme
Dizilerinin Sz Dizimi
7.1.1 Eski Karakter Dizisi Biimlendirme Yntemi
Karakter dizisi biimlendirme ilemleri iin % ileci de kullanlabilir. Bu ile, sol tarafndaki
argman sprintf() tarzna ok benzer bir ekilde yorumlayarak sa taraftaki argmana
uygular ve bu biimlendirme ileminin ortaya kard karakter dizisini dndrr. Mesela:
>>> import math
>>> print("PI'nin yaklak deeri: %5.3f." % [Link])
PI'nin yaklak deeri: 3.142.
Daha fazla bilgiye printf Tarz Karakter Dizisi Biimlendirme blmnden ulaabilirsiniz.
7.2 Dosya Okuma ve Yazma
open() fonksiyonu bir dosya nesnesi dndrr. Bu fonksiyon yaygn olarak iki argmanla
kullanlr: open(dosyaad, okuma_kipi).
7.2. Dosya Okuma ve Yazma
55
Resmi Python 3 Klavuzu, Srm 3
>>> f = open('idosyas', 'w')
lk argman, dosya adn gsteren bir karakter dizisidir. kinci argman ise, dosyann ne
ekilde kullanlacan gsteren birka karakterden oluur. Eer dosya yalnzca okunacaksa
kip r olabilir. Yalnzca yazma ilemi yaplacaksa w (ayn isimli dosya varsa silinecektir) ve
dosyaya ekleme yaplacaksa da a kullanlabilir. Dosyaya yazlan her veri otomatik olarak
dosya sonuna eklenecektir. r+ dosyay hem okuma hem de yazma ilemleri iin aar.
kip argmann yazmasanz da olur. Eer bu argman kullanlmazsa r kullanmsnz gibi
davranlacaktr.
Normal artlar altnda dosyalar metin kipinde alr. Buna gre, dosyadan okuduunuz
ve dosyaya yazdnz veri bir karakter dizisidir. Bu veriler belirli bir dil kodlamasna gre
kodlanr. Eer dil kodlamas belirtilmemise, ntanml deerin ne olaca platforma baldr
(bkz. open()) Kipe eklenen b har dosyay ikili kipte aar. Bylelikle veriler bayt nesneleri
biiminde okunur ve yazlr. Metin iermeyen btn dosyalar iin bu kip kullanlmaldr.
Metin kipinde, okuma ilemi esnasndaki ntanml davran platforma zg satr sonlarnn
(Unixte \n, Windowsta \r\n) \nye dntrlmesidir.
Metin kipinde yazma ilemi
gerekletirilirken ntanml davran, dosyada geen \n iaretlerini tekrar platforma zg
satr sonlarna dntrmektir. Perde arkasnda gerekleen bu veri deitirme ilemi metin
dosyalarnda bir sorun kartmaz, ancak bu ilem JPEG veya EXE dosyalar gibi ikili veriler
ieren dosyalar bozacaktr. Dolaysyla bu tr dosyalar okuyup yazarken ikili kip kullanmaya
zen gstermelisiniz.
7.2.1 Dosya Nesnelerinin Metotlar
Bu blmdeki rneklerin geri kalannda, f adl bir dosya nesnesinin halihazrda oluturulmu
olduu varsaylacaktr.
Bir dosyann ieriini okumak iin [Link](boyut) komutu altrlr, bylece verinin istenen
miktar okunur ve okunan veriler bir karakter dizisi ya da bayt nesnesi olarak dndrlr.
boyut, belirtilmesi zorunlu olmayan say deerli bir argmandr. Eer boyut argman
yazlmazsa veya eksi bir deer verilirse dosyann btn ierii okunacak ve dndrlecektir.
Bu esnada dosya boyutunun bilgisayarnzn bellek kapasitesini amas tamamen sizin
sorununuzdur. Eer boyut parametresini belirtirseniz, dosyadan en fazla boyut deerinin
gsterdii kadar veri okunacak ve dndrlecektir. Eer dosyann sonuna gelinmise
[Link]() komutu bo bir karakter dizisi dndrecektir ().
>>> [Link]()
'Dosyann hepsi bu kadar.\n'
>>> [Link]()
''
[Link]() dosyadan tek bir satr okur. Yeni satr karakterini (\n) karakter dizisinin
sonunda brakr. Ama eer dosya yeni satr karakteri ile bitmiyorsa dosyann son satrna
bu karakteri yerletirmez. Bylelikle dn deerinin ne anlama geldii aka anlalm
olur. Yani, eer [Link]() bo bir karakter dizisi dndrmse dosyann sonuna ulalm
demektir. Bo satr ise \n ile (yani yalnzca satr ba karakteri ieren bir karakter dizisi ile)
gsterilir.
>>> [Link]()
'Dosyann ilk satr bu.\n'
>>> [Link]()
'kinci satr ise bu\n'
56
Blm 7. Girdi ve kt
Resmi Python 3 Klavuzu, Srm 3
>>> [Link]()
''
Dosyadan satr okumak iin dosya nesnesi zerinde dng de kurabilirsiniz. Bu yntem
bellee yk bindirmez, hzldr ve kodunuzun basit olmasn salar:
>>> for satr in f:
...
print(satr, end='')
...
Dosyann ilk satr bu.
kinci satr ise bu
Eer bir dosyadaki btn satrlar okuyup bir listeye atmak istiyorsanz list(f) veya
[Link]() komutunu da kullanabilirsiniz.
[Link](karakter_dizisi) kodu karakter dizisinin ieriini dosyaya yazar ve yazlan
karakterlerin saysn dndrr.
>>> [Link]('Bu bir denemedir\n')
17
Eer karakter dizisi dnda bir ey yazmak isterseniz, bunu ncelikle karakter dizisine
evirmeniz gerekir:
>>> deer = ('cevap', 42)
>>> s = str(deer)
>>> [Link](s)
13
[Link]() fonksiyonu, dosya nesnesinin dosya iindeki mevcut konumunu veren bir tam say
dndrr. kili kipte bu say dosyann bandan mevcut konuma kadar olan baytlarn says
iken, metin kipinde ise mulak bir saydr.
Dosya nesnesinin konumunu deitirmek iin [Link](uzaklk, nereden_itibaren)
komutunu kullanabilirsiniz. Konum, referans noktasna uzaklk eklenerek hesaplanr.
Referans noktas ise nereden_itibaren argmannn deerine gre belirlenir.
nereden_itibaren argmanna 0 deeri verilirse, konum dosyann bandan itibaren
hesaplanr. 1 deeri mevcut dosya konumunu, 2 deeri ise referans noktas olarak dosyann
en sonunu alr. nereden_itibaren argman yazlmayabilir. Bu ekilde bu argmann
ntanml deeri 0 olacak, bylece referans noktas dosyann en ba olacaktr.
>>> f = open('idosyas', 'rb+')
>>> [Link](b'0123456789abcdef')
16
>>> [Link](5)
# Dosyada 6. bayt konumuna gidiyoruz
5
>>> [Link](1)
b'5'
>>> [Link](-3, 2) # Sondan 3. bayta gidiyoruz.
13
>>> [Link](1)
b'd'
Metin dosyalarnda (kipi gsteren karakter dizisinde b olmadan alan dosyalar), yalnzca
dosyann bandan itibaren arama yaplabilir (bunun istisnas seek(0, 2) komutuyla
dosyann en sonuna gitmektir) ve geerli tek uzaklk deeri, [Link]() komutundan dnen
deer veya sfrdr. Bunun dnda hibir uzaklk deeri tanmlanmamtr.
7.2. Dosya Okuma ve Yazma
57
Resmi Python 3 Klavuzu, Srm 3
Dosyayla iiniz bittiinde dosyay kapatp, ak dosya tarafndan megul edilen btn sistem
kaynaklarn serbest brakmak iin [Link]() fonksiyonunu arn. [Link]() arldktan
sonra dosya nesnesinin kullanlmaya allmas otomatik olarak baarsz olacaktr.
>>> [Link]()
>>> [Link]()
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ValueError: I/O operation on closed file
Dosya nesneleri zerinde alrken with szcn kullanmak iyi bir alkanlktr. Bu sayede,
kod blou sona erdikten sonra, arada bir yerde bir istisna dahi tetiklense, dosya dzgn bir
ekilde kapatlr. Ayrca bu yntem, ayn ii gren try-finally bloklar yazmaya kyasla ok
daha ksadr.
>>> with open('idosyas', 'r') as f:
...
okunan_veri = [Link]()
>>> [Link]
True
Dosya nesnelerinin, isatty() ve [Link]() gibi baz baka metotlar da bulunsa
da bunlar nadiren kullanlr. Dosya nesnelerine ilikin eksiksiz bir klavuz iin Ktphane
Referansna bakabilirsiniz.
7.2.2 Yaplandrlm Verilerin json ile Kaydedilmesi
Karakter dizileri kolayca dosyaya yazlabilir ve dosyadan okunabilir. read() metodu yalnzca
karakter dizisi dndrd iin, saylar biraz daha fazla aba gerektirir. Saylarn int() gibi
bir fonksiyona gnderilmesi gerekecektir. Bu fonksiyon mesela 123 gibi bir karakter dizisini
alp bunun say deeri olan 123 dndrr. ie gemi listeler ve szlkler gibi daha
karmak veri tiplerini kaydetmek istediinizde ayrtrma ve diziye dntrme (serializing)
ilemlerini elle yapmak epey dolambal olacaktr.
Python, karmak veri tiplerini dosyaya yazmak iin kullanclar srekli kod yazp hata
ayklamakla uratrmak yerine, gzde bir veri deiim biimi olan JSON (JavaScript Nesne
Gsterimi)u kullanmalarna olanak tanr. json adl standart bir modl araclyla Pythonn
veri yaplarn alp bunlar karakter dizisi olarak temsil edilecek ekilde dntrebilirsiniz.
Bu ileme diziye dntrme ad verilir. Verilerin karakter dizisi biimli temsilden geri
dntrlmesi ilemine ise diziden dntrme denir. Diziye dntrme ve diziden
dntrme ilemleri srasnda nesneyi temsil eden karakter dizileri bir dosya veya veri iinde
saklanabilecei gibi, a balants zerinden uzak bir makineye de gnderilebilir.
Not: JSON biimi, modern uygulamalar tarafndan veri dnmne izin vermek iin yaygn
ekilde kullanlmaktadr. Pek ok programc JSONu halihazrda bildii iin, farkl sistemlerin
birlikte alabilmesini temin asndan bu iyi bir seim olmutur.
Eer elinizde x adl bir nesne varsa, bunun JSON karakter dizisi olarak temsil edilen biimini
basit bir kod paras yardmyla grntleyebilirsiniz:
>>> [Link]([1, 'basit', 'liste'])
'[1, "basit", "liste"]'
dumps() fonksiyonunun baka bir eidi olan dump() fonksiyonu, bir nesneyi diziye
dntrp metin dosyasna gnderir. Dolaysyla eer f, zerine yazlmak zere alm bir
58
Blm 7. Girdi ve kt
Resmi Python 3 Klavuzu, Srm 3
metin dosyas ise yle bir kod yazabiliriz:
[Link](x, f)
fin, okunmak zere alm bir metin dosyas olduunu varsayarsak, nesneyi eski haline geri
kodlamak iin yle bir ey yazabiliriz:
x = [Link](f)
Bu basit diziye dntrme teknii listelerin ve szlklerin stesinden gelebilse de rastgele
snf rneklerini JSON ile diziye dntrmek ilave aba gerektirir. json modlnn
klavuzunda buna ilikin bir aklama var.
Ayrca bkz.:
pickle - pickle modl
JSON un aksine pickle, her trden karmak Python nesnelerini diziye dntrmek iin
kullanlabilecek bir protokoldr. Dolaysyla bu modl Pythona zgdr ve baka dillerde
yazlm uygulamalarla iletiim kurmak iin kullanlamaz. Bu modl ayrca yaps gerei
gvenli deildir: Gvenilir olmayan bir kaynaktan gelen pickle verilerini diziden dntrmek,
eer bu veriler kabiliyetli bir saldrgan tarafndan tasarlanmsa, kodlarn denetlenmeden
altrlmasna sebep olabilir.
7.2. Dosya Okuma ve Yazma
59
BLM 8
Hatalar ve stisnalar
imdiye kadar hata mesajlarndan yalnzca sz etmekle yetindik, ancak eer u ana kadar
verdiimiz rnekleri denediyseniz muhtemelen bu hata mesajlarnn bazlarn kendiniz de
bizzat grm olmalsnz. Pythonda birbirinden farkl (en az) iki tr hata bulunur: sz dizimi
hatalar ve istisnalar.
8.1 Sz Dizimi Hatalar
Henz bu dili renme aamasndayken, Pythonn herhalde en sk, ayrtrma hatalar adyla
da bilinen sz dizimi hatalarndan yakndna ahit olmusunuzdur:
>>> while True print('Merhaba dnya')
File "<stdin>", line 1, in ?
while True print('Merhaba dnya')
^
SyntaxError: invalid syntax
Burada ayrtrc, sorunlu satr ekrana basacak ve hatann satrda ilk tespit edildii
yeri gsteren kk bir ok iareti grntleyecektir. Hata, oktan nce gelen eden
kaynaklanyor (veya hata hi deilse o noktada tespit edilmi). Bizim rneimizde hata
print() fonksiyonunun bulunduu noktada tespit ediliyor. Hatann sebebi ise bu eden
nce getirilmesi gereken iki nokta st ste (:) iaretinin unutulmu olmas. Eer girdiler
bir betikten geliyorsa, nereye bakmanz gerektiini anlayabilmeniz iin dosya ad ve satr
numaras da ekrana baslr.
8.2 stisnalar
Deyim veya ifadeler sz dizimi bakmndan doru da olsalar, yrtlmeye alldklarnda
yine de hata olumasna yol aabilirler. Yrtme esnasnda tespit edilen hatalara istisna
ad verilir ve bunlar mutlak surette lmcl deildirler. Biz birazdan Pythonda bu tr
hatalar nasl yakalayabileceimizi reneceiz. Ancak pek ok istisna, programlar tarafndan
yakalanamaz ve aadaki gibi hata mesajlarnn grntlenmesine yol aar:
>>> 10 * (1/0)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ZeroDivisionError: division by zero
>>> 4 + ipetpet*3
60
Resmi Python 3 Klavuzu, Srm 3
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name 'ipetpet' is not defined
>>> '2' + 2
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: Can't convert 'int' object to str implicitly
Neler olup bittiini bize hata mesajnn son satr gsterir. stisnalarn pek ok farkl tr
vardr. stisnann tr, mesajn bir paras olarak ekrana baslr. Yukardaki rneklerde biz
u istisna trleri ile karlatk: ZeroDivisionError, NameError ve TypeError. stisna tr
olarak ekrana baslan karakter dizisi, ayn zamanda, tetiklenen gml istisnann da addr.
Btn gml istisnalar bu yapda olsa da, kullanc tarafndan tanmlanan istisnalar bu
biime uymak zorunda deildir (ama tabii uysalar iyi olur). Standart istisna adlar gml
tanmlayclar arasnda yer alr (ama bunlar tutulmu (reserved) szcklerden deildir).
Mesaj satrnn geri kalannda ise, istisna trne ve buna neyin sebep olduuna bal olarak
birtakm ayrntlar verilir.
Hata mesajndan nce gelen ksm istisnann meydana geldii ortam, bir yn izi biiminde
gsterir. Bu ksm genel olarak, kaynak koddaki satrlarn listelendii birtakm yn izlerinden
meydana gelir, ancak burada standart girdiden okunan satrlar grntlenmeyecektir.
Gml stisnalar blmnde gml istisnalar ve bunlarn anlamlar listelenmitir.
8.3 stisnalarn Yakalanmas
Python size, kendi belirlediiniz istisnalar yakalayan programlar yazma imkan sunar. Mesela
aadaki rnee bakalm. Bu rnekte kullancdan, girilen deer tam say olana kadar veri
girii yapmas bekleniyor. Burada kullancnn program istedii zaman kesmesine de izin
veriyoruz (Control-C ile veya iletim sistemi hangi klavye tularn destekliyorsa onunla). Bu
ekilde, KeyboardInterrupt adl istisna tr tetiklenerek kullanc kaynakl bir kesme sinyali
retilecektir.
>>> while True:
...
try:
...
x = int(input("Ltfen bir say girin: "))
...
break
...
except ValueError:
...
print("Olmad! Bu geerli bir say deil.
...
Tekrar deneyin...")
try deyimi yle iler.
lk olarak try cmlecii (try ile except szckleri arasnda kalan deyimler) iletilir.
Eer herhangi bir istisna meydana gelmezse except cmlecii es geilir ve try deyiminin
ileyii tamamlanr.
Eer try cmleciinin ileyii srasnda bir istisna meydana gelirse cmleciin geri kalan
es geilir. Bu durumda, eer bu istisnann tr ile except szcnn ardndan gelen
istisna ad birbirini tutuyorsa, except cmlecii iletilir ve try deyiminin ardndan
program ilemeye devam eder.
8.3. stisnalarn Yakalanmas
61
Resmi Python 3 Klavuzu, Srm 3
Eer except cmleciindeki istisna adyla birbirini tutmayan bir istisna meydana
gelirse, daha dtaki try deyimleri kontrol edilir. Eer bu istisnay yakalayan bir kod
bulunamazsa, yakalanmam istisna denen durum ortaya km olur ve daha nce
gsterdiimiz gibi programn ileyii durur.
Farkl istisnalar yakalayabilmek iin, try deyimleri iine birden fazla except cmlecii
yerletirebilirsiniz. Ancak bu durumda da yalnzca tek bir istisna yakalama blou iletilecektir.
stisna yakalama bloklar yalnzca ilgili try cmlecii iinde meydana gelen istisnalar
yakalayabilir. Ayn try deyimi iindeki br istisna yakalama bloklar iinde meydana gelen
istisnalar ise yakalayamaz. except cmlecikleri iinde parantezli demetler kullanarak birden
fazla istisna ad da belirtebilirsiniz. rnein:
... except (RuntimeError, TypeError, NameError):
...
pass
exceptten sonra istisna ad belirtmezseniz, meydana gelebilecek btn hata trlerini
yakalarsnz. Ancak bu yntem ok dikkatlice kullanlmaldr, zira bu ekilde kodlarnzdaki
programlama hatalarn gzden karmanz iten bile deildir! lgili istisnay tetiklemeden
nce ekrana bir hata mesaj basmak iin de bu yntemden yararlanabilirsiniz (bu yntem
ayrca istisnay bir fonksiyon araclyla yakalamanza da izin verir.) Mesela:
import sys
try:
f = open('[Link]')
s = [Link]()
i = int([Link]())
except OSError as hata:
print("letim sistemi hatas: {0}".format(hata))
except ValueError:
print("Veri tam sayya dntrlemedi.")
except:
print("Beklenmeyen bir hata olutu:", sys.exc_info()[0])
raise
Tercihe bal olarak, try ... except deyimi iinde else cmlecikleri de kullanlabilir. Eer
byle bir cmlecik kullanacaksanz, bunu btn except cmleciklerinden sonra getirmelisiniz.
Bu cmlecik, try cmlecii iinde herhangi bir istisna tetiklenmediinde altrlacak kodu
belirtmek iin kullanlabilir. rnein:
for arg in [Link][1:]:
try:
f = open(arg, 'r')
except IOError:
print('alamayan dosya:', arg)
else:
print(arg, 'dosyas', len([Link]()), 'satrdan olumaktadr.')
[Link]()
else cmleciklerini kullanmak, try cmleciklerine ilave kod eklemekten iyidir, nk bu
sayede try... except deyimi ile koruduunuz kod blou iinde tetiklenmesini beklemediiniz
bir istisnay yanllkla yakalama riskini ortadan kaldrm olursunuz.
Bir istisna ortaya ktnda, bu istisna ayn zamanda belli bir deere de sahip olabilir. Buna o
istisnann argman ad verilir. Argmann olup olmamas ve tipi istisnann trne baldr.
except cmleciklerinde istisna adndan sonra bir deiken de belirtilebilir. Bu deiken
62
Blm 8. Hatalar ve stisnalar
Resmi Python 3 Klavuzu, Srm 3
istisnann rneine (instance) balanr ve argmanlar [Link] yaps iinde saklanr.
Kullanm kolayl asndan istisnann rneinde __str__() metodu da tanmldr, bylece
argmanlar, .args ksmn yazmaya gerek olmadan dorudan ekrana baslabilir. Ayrca
istisna tetiklenmeden nce rneklendirilebilir ve istenirse buna eitli nitelikler de ilave
edilebilir.
>>> try:
...
raise Exception('adana', 'mersin')
... except Exception as rnek:
...
print(type(rnek))
# istisnann rnei
...
print([Link])
# .args iinde saklanan argmanlar
...
print(rnek)
# __str__ sayesinde argmanlar dorudan baslabilir,
...
# istisnann alt snflar araclyla __str__'nin ieriini deitirebi
...
x, y = [Link]
# argmanlar zyoruz
...
print('x =', x)
...
print('y =', y)
...
<class 'Exception'>
('adana', 'mersin')
('adana', 'mersin')
x = adana
y = mersin
Eer bir istisnann argmanlar varsa, bunlar yakalanmam istisnalarda mesajn son ksm
(ayrnt) olarak ekrana baslr.
stisna yakalama bloklar, try cmleciinin hemen altnda gerekleen istisnalar yakalamakla
kalmaz, ayn zamanda try cmlecii iinde (dolayl olarak bile olsa) arlan fonksiyonlarda
meydana gelen istisnalar da yakalar. Mesela:
>>> def bu_kod_hata_verir():
...
x = 1/0
...
>>> try:
...
bu_kod_hata_verir()
... except ZeroDivisionError as hata:
...
print('alma zaman hatas yakalanyor:', hata)
...
alma zaman hatas yakalanyor: int division or modulo by zero
8.4 stisnalarn Tetiklenmesi
raise deyimi, programcnn belirli bir istisnay tetikleyebilmesini salar. Mesela:
>>> raise NameError("SelamDostum')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: SelamDostum
raise ifadesinin ald argman, tetiklenecek istisnann ne olduunu gsterir. Bu argman ya
bir istisna rnei ya da bir istisna snf (Exception snfndan treyen bir snf) olmaldr.
Bir istisnann tetiklenip tetiklenmediini tespit etmek istiyor, ama bu istisnay yakalamak
istemiyorsanz, raise deyimini tek bana kullanarak istisnay tetikleyebilirsiniz:
8.4. stisnalarn Tetiklenmesi
63
Resmi Python 3 Klavuzu, Srm 3
>>> try:
...
raise NameError("SelamDostum')
... except NameError:
...
print('Buralardan bir istisna geti!')
...
raise
...
Buralardan bir istisna geti!
Traceback (most recent call last):
File "<stdin>", line 2, in ?
NameError: SelamDostum
8.5 Kullanc Tanml stisnalar
Yeni istisna snar oluturarak programlarnzda kendi istisnalarnz yaratabilirsiniz (Python
snar hakknda daha fazla bilgi iin bkz. Snar ). stisnalar dorudan veya dolayl olarak
Exception adl snftan tretilmelidir. rnein:
>>> class zelHata(Exception):
...
def __init__(self, deer):
...
[Link] = deer
...
def __str__(self):
...
return repr([Link])
...
>>> try:
...
raise zelHata(2*2)
... except zelHata as e:
...
print('zel hata olutu, deer:', [Link])
...
zel hata olutu, deer: 4
>>> raise zelHata('eyvah!')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
__main__.zelHata: 'eyvah!'
Bu rnekte Exception snfnn ntanml __init__() metodunun zerine yazlarak ierii
deitirilmitir. __init__() metodunun yeni hali sadece deer adl bir nitelik oluturuyor.
Bu ilem, ntanml olarak oluturulan args niteliinin yerine geer.
stisna snar, baka snarn yapabildii her eyi yapacak ekilde tanmlanabilir, ancak
bunlar genellikle sade tutulur ve hata yakalama bloklar tarafndan ilenerek hata hakknda
bilgi alnabilmesini salayan birtakm nitelikler sunmakla yetinilir. Birka farkl hatay
tetikleyebilen bir modl olutururken, yaygn uygulama, o modl tarafndan tanmlanan
istisnalar iin bir taban snf oluturmak ve farkl hata koullarna ynelik zel istisna snar
oluturmak amacyla bu snftan miras almaktr:
class Hata(Exception):
"""Bu modldeki istisnalar iin bir taban snf."""
pass
class GirdiHatas(Hata):
"""Girdideki hatalar iin retilen istisna.
Nitelikleri:
ifade -- Hatann olutuu girdi ifadesi
64
Blm 8. Hatalar ve stisnalar
Resmi Python 3 Klavuzu, Srm 3
"""
mesaj -- hatann aklamas
def __init__(self, ifade, mesaj):
[Link] = ifade
[Link] = mesaj
class AktarmHatas(Hata):
"""Bir ilem, izin verilmeyen bir durum aktarm gerekletirmeye altnda
tetiklenir.
Nitelikleri:
nceki -- aktarmn balangcndaki durum
sonraki -- gerekletirilmek istenen yeni durum
mesaj -- lgili aktarma neden izin verilmediine dair aklama
"""
def __init__(self, nceki, sonraki, mesaj):
[Link] = nceki
[Link] = sonraki
[Link] = mesaj
ou istisna, standart istisna adlarna benzer bir ekilde, sonu Error (Hata) ile bitecek ekilde
tanmlanr.
Pek ok standart modl, tanmladklar fonksiyonlarda meydana gelebilecek hatalar
bildirmek iin kendi istisnalarn tanmlar. Snara ilikin daha fazla bilgi Snar blmnde
sunulmutur.
8.6 Toparlama lemlerinin Tanmlanmas
try deyimi, her koulda iletilmesi gereken toparlama faaliyetlerini tanmlamak iin tercihe
bal baka bir cmlecie daha sahiptir. rnein:
>>> try:
...
raise KeyboardInterrupt
... finally:
...
print('Gle gle dnya!')
...
Gle gle dnya!
KeyboardInterrupt
Traceback (most recent call last):
File "<stdin>", line 2, in ?
nally cmlecii, bir istisna olusun veya olumasn, her zaman try deyiminden klmadan
nce iletilir. try cmlecii iinde bir istisna olutuunda ve bu istisna except cmlecii ile
yakalanmadnda (veya bu istisna except ya da else cmlecii iinde olutuunda), finally
cmlecii iletildikten sonra yeniden tetiklenir. finally cmlecii, break, continue veya
return deyimi araclyla try deyimininin herhangi bir cmleciinden klrken k yolunda
da iletilir. Daha karmak bir rnek verelim:
>>> def bl(x, y):
...
try:
...
sonu = x / y
...
except ZeroDivisionError:
8.6. Toparlama lemlerinin Tanmlanmas
65
Resmi Python 3 Klavuzu, Srm 3
...
print("say sfra blnemez!")
...
else:
...
print("sonu:", sonu)
...
finally:
...
print("finally cmlecii iletiliyor")
...
>>> bl(2, 1)
sonu: 2.0
finally cmlecii iletiliyor
>>> bl(2, 0)
say sfra blnemez!
finally cmlecii iletiliyor
>>> bl("2", "1")
finally cmlecii iletiliyor
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "<stdin>", line 3, in bl
TypeError: unsupported operand type(s) for /: 'str' and 'str'
Grdnz gibi, finally cmlecii her ne olursa olsun iletiliyor. ki karakter dizisinin
birbirine blnmeye allmas ile tetiklenen TypeError istisnas, except cmlecii tarafndan
yakalanmad iin, finally cmleciinin yrtlmesinin ardndan tetikleniyor.
Gerek hayattaki uygulamalarda finally cmlecii, kaynan baarl bir ekilde kullanlp
kullanlamadna baklmakszn, harici kaynaklar (dosyalar veya a balantlar gibi) serbest
brakmak iin kullanlr.
8.7 nceden Tanmlanm Toparlama lemleri
Baz nesneler, nesneyi kullanan ilemin baarl olup olmamasna baklmakszn, artk nesneye
ihtiya kalmadnda yerine getirilecek baz standart toparlama ilemleri tanmlar. Bir dosyay
ap ieriini ekrana basmaya alan aadaki rnee bakalm.
for satr in open("[Link]"):
print(satr, end="")
Bu kodlardaki sorun, kodun bu ksmnn yrtlmesi sona erdiinde dosyay belirsiz bir sre
boyunca ak brakyor olmasdr. Basit betiklerde bu durum bir sorun tekil etmez, ancak
byk uygulamalarda banz aryabilir. te bu tr durumlarda with deyimi, dosya benzeri
nesnelerin, kullanm srasnda derhal ve doru bir ekilde toparlanmasn temin edecek
biimde kullanlmalarn salar.
with open('[Link]') as f:
for satr in f:
print(satr, end="")
Deyim iletildikten sonra f adl dosya her halkarda kapatlacaktr. Hatta satrlarn iletilmesi
srasnda bir problem ortaya ksa dahi... Dosya benzeri nesnelerin, nceden tanmlanm
toparlama ilemlerine sahip olup olmad kendi belgelerinde belirtilecektir.
66
Blm 8. Hatalar ve stisnalar
BLM 9
Snar
Pythonn snf mekanizmas, baka programlama dillerine kyasla, sz dizimi ve anlam
yaps bakmndan snara dair ok az yenilik getirir. Pythondaki snar C++ ve Modula-3
dillerindeki snf yaplarnn bir karmdr. Python snar nesne tabanl programlamann
btn standart zelliklerini tar. rnein miras alma mekanizmas birden fazla taban
snfn kullanlmasna izin verir, tretilmi bir snf, miras ald taban snfn veya snarn
herhangi bir metodunun ieriini deitirebilir ve metotlar, taban snftaki metotlar ayn
adla arabilir. Nesneler snrsz sayda ve trde veri ierebilir. Tpk modller gibi, snar
da Pythonn dinamik yapsndan payna deni alr. Buna gre, snar alma zamannda
oluturulur ve oluturulduktan sonra bunlar zerinde deiiklik yaplabilir.
C++ terimleriyle konuacak olursak, normalde snf yeleri (veri yeleri de buna dahil olmak
zere) public, yani darya ak (bunun istisnas iin bkz. Gizli Deikenler ), btn ye
fonksiyonlar ise virtual, yani soyuttur. Modula-3te olduu gibi, nesnenin yelerine metotlar
iinden erimenin basit bir yolu yoktur. Metot fonksiyonunun ilk argman nesneyi temsil
eder ve bu argman, fonksiyonun tanmlanmas esnasnda aka belirtilir. Ancak fonksiyon
arlrken bu ilk argman gizlidir. Smalltalkta olduu gibi, snarn kendisi de birer nesnedir.
Bu zellik, ie aktarma ve yeniden adlandrma ilevlerinin anlamsal altyapsn oluturur.
C++ ve Modula-3n aksine gml tipler kullanc tarafndan taban snf eklinde miras
alnp geniletilebilir. Ayrca, C++taki gibi, zel bir sz dizimine sahip ou gml ile
(aritmetik ileler, sra belirtme ileleri, vb.) snf rneklerinde kullanlmak zere yeniden
tanmlanabilir.
(Genel kabul grm terminoloji eksikliinden tr, snardan bahsederken zaman zaman
Smalltalk ve C++ kavramlarn kullanacaz. Nesne tabanl programlamaya ilikin anlam yaps
C++a kyasla Pythona daha yakn olduu iin Modula-3 kavramlarn kullanabilirdik, ama
muhtemelen bu dili ok az kii duymutur.)
9.1 simler ve Nesneler Hakknda Birka Sz
Her nesne benzersiz olup, ayn nesneye (birden fazla etki alan iinde) birden fazla isim
balanabilir. Baka dillerde buna farkl adlandrma (aliasing) diyorlar. Pythonn bu zellii
ilk bakta pek takdir edilmeyebilir. Zaten deitirilemeyen temel veri tipleri (saylar, karakter
dizileri, demetler) ile alrken bu zellii gnl rahatlyla grmezden gelebilirsiniz. Ancak
farkl adlandrma; listeler, szlkler ve dier pek ok veri tipi gibi deitirilebilen nesneler
sz konusu olduunda, Python kodlarnn anlam yaps zerinde muhtemelen sizi artacak
bir etki ortaya karacaktr. Farkl adlandrma baz ynlerden iaretilere (pointer) benzedii
iin bu zellii kullanmak genellikle programn yararnadr. rnein, bir nesneyi argman
olarak atamak, gerekleme gerei atanan ey yalnzca bir iareti olduu iin, hantal bir ilem
67
Resmi Python 3 Klavuzu, Srm 3
deildir. Argman olarak atanan bu nesne bir fonksiyon tarafndan deiiklie uratlrsa,
nesneyi aran fonksiyon bu deiiklii grecektir. Bu zellik sayesinde, Pascaldaki gibi iki
farkl argman atama mekanizmasna gerek duyulmam olur.
9.2 Pythonda Etki ve sim Alanlar
Snara gemeden nce Pythondaki etki alan kurallarna ilikin birka sz sylesek iyi
olacak. Snf tanmlamalar srasnda isim alanlar zerinde birtakm ince iler dner. Neler
dndn btnyle kavrayabilmek iin de etki alanlarnn ve isim alanlarnn nasl ilediini
bilmeniz gerekir. Bu arada, bu konuyu bilmek ileri dzey Python programclar asndan da
faydaldr.
e baz tanmlarla balayalm.
sim alan isimler ile nesneler arasnda bir eletirmedir. ou isim alan, mevcut durumda
Python szlkleri olarak gereklenmitir, ancak bu durumu herhangi bir ekilde farketmeniz
mmkn deildir (performans dnda). Ayrca bu yap ileride deiebilir de. sim alanlarna
rnek olarak unlar verebiliriz: abs() gibi fonksiyonlar ve gml istisna adlarn da iine
alan gml isimler, bir modl iinde yer alan global isimler ve bir fonksiyon arldnda
oluturulan lokal isimler. Bir nesnenin sahip olduu nitelikler de bir bakma birer isim alan
oluturur. sim alanlar ile ilgili olarak bilinmesi gereken nemli bir nokta da farkl isim
alanlarnda yer alan isimler arasnda kesinlikle herhangi bir balant olmamasdr. rnein
iki farkl modl iinde byt adl bir fonksiyon tanmlayabilirsiniz. Bunlar birbirine karmaz,
nk bu modlleri kullananlar, fonksiyonun bana modl adn da ekleyeceklerdir.
Bu arada nitelik kavramn, noktadan sonra gelen her trl isim iin kullanyoruz. rnein,
[Link] adl ifadede real kelimesi, z nesnesinin bir niteliidir. Dorusunu sylemek
gerekirse, modllerin iindeki isimlere atfta bulunduunuzda aslnda niteliklere atfta
bulunmu olursunuz. Mesela [Link] ifadesinde modlad bir modl
nesnesi, fonksiyonad ise bunun niteliidir. Bu durumda, modln nitelikleri ile modlde
tanmlanan global isimler arasnda birebir iliki sz konusudur. Zira bunlar birbiriyle ayn
isim alann paylar! 1
Nitelikler salt okunur olabilecei gibi bunlarn zerinde deiiklik de yaplabilir.
Deitirilebilme zelliini kullanarak, niteliklere birtakm deerler atayabilirsiniz. Modl
niteliklerinin deitirilebilir zellikte olmas sayesinde [Link] = 42 gibi bir kod
yazmak mmkndr. zerinde deiiklik yaplabilen bu nitelikleri ayn zamanda del deyimi
ile silebilirsiniz de. rnein del [Link] komutu, modlad olarak adlandrlan
nesneden cevap niteliini silecektir.
sim alanlar farkl anlarda oluturulur ve bunlarn mr birbirinden farkldr. Gml
isimleri ieren isim alan, Python yorumlaycs balatldnda oluturulur ve asla silinmez.
Bir modln global isim alan modl tanm okunduunda oluturulur. Normal artlar
altnda modllere ait isim alanlar da yorumlaycdan klana kadar varolmaya devam eder.
Yorumlaycnn en tepesinde iletilen deyimler, bunlar bir betik dosyasndan okunmu veya
etkileimli olarak altrlm da olsa, __main__ adl bir modln paras olarak kabul edilir.
Dolaysyla bunlarn da kendilerine ait bir global isim alan vardr. (Gml isimler de aslnda
ayr bir modl iinde yer alr. Bu modle builtins ad verilir.)
1
Bir ey hari. Modl nesnelerinin, modln isim alann gereklemek iin kullanlan szl dndren
__dict__ adnda, gizli bir salt okunur nitelii vardr. __dict__ bir nitelik olsa da global bir isim deildir.
Aktr ki, bu nitelii kullanmak isim alan gereklemesine ilikin soyutlamann ruhuna aykrdr. kme sonras
(post-mortem) hata ayklama gibi ilemler dnda bu niteliin kullanmndan kanlmaldr.
68
Blm 9. Snar
Resmi Python 3 Klavuzu, Srm 3
Bir fonksiyonun lokal isim alan fonksiyon arldnda oluturulur ve fonksiyon bir deer
dndrdnde veya fonksiyon iinde yakalanmayan bir istisna tetiklendiinde silinir.
(Aslnda burada olan eyi silmek yerine unutmak diye tabir etmek daha doru olurdu.)
Elbette, zyinelemeli fonksiyonlarn da kendilerine ait bir lokal isim alan vardr.
Bir Python programnda, bir isim alannn dorudan eriilebilir durumda olduu kod
blgesine etki alan ad verilir. Burada dorudan eriilebilir ifadesi ile kastedilen ey, bana
modl ad gibi bir tanmlayc getirilmeden arlan bir ismin, isim alan iinden eriilebilir
durumda olmasdr.
Etki alanlar statik olarak belirlense de, dinamik olarak kullanlr. alma esnasnda herhangi
bir zamanda, isim alanlarna dorudan eriebileceiniz, i ie gemi en az etki alan
bulunur:
En i taraftaki etki alan: Bu etki alan arama srasnda ilk baklan yerdir ve lokal isimleri
ierir.
D taraftaki btn fonksiyonlarn etki alanlar: Bu etki alan, arama srasnda en yakn
etki alanndan balanarak da doru taranr ve lokal olmayan isimlerle birlikte global
olmayan isimleri de ierir.
Sondan bir nceki etki alan: Bu etki alan mevcut modln global isimlerini ierir.
En d etki alan: Bu etki alan gml isimleri barndrr ve en son taranr.
Eer bir isim global olarak bildirilirse, bu isme yaplan btn atar ve atamalar dorudan
modln global isimlerini ieren orta etki alanna ynlendirilir. En iteki etki alannn
dnda yer alan deikenleri yeniden balamak iin nonlocal adl deyim kullanlabilir. Bu
deikenler, eer nonlocal olarak bildirilmezlerse salt okunur olurlar (bu deikenin deeri
deitirilmeye alldnda en i etki alannda yeni bir lokal deiken oluturulur ve d
taraftaki ayn adl deiken deimeden kalr).
Genellikle lokal etki alan, (kod metnindeki) mevcut fonksiyonda yer alan lokal isimlere atfta
bulunur. Fonksiyonlarn d tarafndaki lokal etki alan, global etki alanyla ayn isim alanna,
yani modln isim alanna atfta bulunur. Bir snf tanmlandnda da, lokal etki alanna yeni
bir isim alan daha eklenmi olur.
Bir fonksiyonun etki alannn, o fonksiyonun yazld kod blgesinde belirlendiini anlamak
nemlidir: Fonksiyon nereden veya hangi adla arlm olursa olsun, eer bir fonksiyon
bir modl iinde tanmlanmsa, o fonksiyonun global etki alan o modln isim alandr.
te yandan, asl isim aramas, alma esnasnda dinamik olarak gerekletirilir. Ancak dilin
tanm, derleme srasnda statik isim zmlemeye doru evrilmektedir. Dolaysyla dinamik
isim zmlemeye bel balamasanz iyi olur! (Aslnda lokal deikenler imdiden statik olarak
belirlenmektedir.)
Pythona zg bir tuhak, eer herhangi bir global deyimi etkin deilse, isimlere deer
atama ileminin her zaman en iteki etki alanna ynlenmesidir. Deer atamalar verileri
kopyalamaz, bunlar yalnzca isimleri nesnelere balar. Ayn ey silme ilemleri iin de
geerlidir: del x deyimi, lokal etki alannn atfta bulunduu isim alanyla xin balantsn
keser. Aslnda yeni isimler oluturan btn ilemler lokal etki alann kullanr. zellikle de
import deyimleri ve fonksiyon tanmlar modl veya fonksiyon adn lokal etki alanna balar.
global deyimi, belirli deikenlerin global etki alannda yer aldn ve oraya balanmas
gerektiini belirtmek iin kullanlabilir. nonlocal deyimi ise belirli deikenlerin, d taraftaki
bir etki alannda yer aldn ve oraya balanmas gerektiini belirtir.
9.2. Pythonda Etki ve sim Alanlar
69
Resmi Python 3 Klavuzu, Srm 3
9.2.1 Etki ve sim Alanlarna rnek
Aadaki rnek; farkl etki ve isim alanlarna nasl atfta bulunulaca ile birlikte, global ve
nonlocal szcklerinin, deikene deer balama ilemlerini nasl etkilediini gsteriyor:
def etki_alan_testi():
def local_olarak_ata():
deiken = "local deiken"
def nonlocal_olarak_ata():
nonlocal deiken
deiken = "nonlocal deiken"
def global_olarak_ata():
global deiken
deiken = "global deiken"
deiken = "deiken testi"
local_olarak_ata()
print("local olarak belirlendikten sonra:", deiken)
nonlocal_olarak_ata()
print("nonlocal olarak belirlendikten sonra:", deiken)
global_olarak_ata()
print("global olarak belirlendikten sonra:", deiken)
etki_alan_testi()
print("global etki alanndayken:", deiken)
rnek kodun kts yle olur:
local olarak belirlendikten sonra: deiken testi
nonlocal olarak belirlendikten sonra: nonlocal deiken
global olarak belirlendikten sonra: nonlocal deiken
Global etki alanndayken: global deiken
local deer atama ileminin etki_alan_testi iindeki deiken in deerini deitirmediine
dikkat edin (ntanml davran budur) . nonlocal deer atama ilemi etki_alan_testi iindeki
deiken in deerini deitirir, global deer atama ilemi ise deikenin modl seviyesindeki
deerini deitirir.
Ayrca global deer atama ileminden nce deiken iin nceden balanm bir deer
olmadn da gryorsunuz.
9.3 Snara lk Bak
Pythondaki snar; birka yeni sz dizimi, adet yeni nesne tipi ve bir miktar da yeni anlam
yapsyla karmza kar.
9.3.1 Snf Tanmlamann Sz Dizimi
Snar en basit haliyle yle tanmlanr:
class SnfAd:
<deyim-1>
.
.
70
Blm 9. Snar
Resmi Python 3 Klavuzu, Srm 3
.
<deyim-N>
Fonksiyon tanmlarnda olduu gibi (def deyimleri), snf tanmlarnn da herhangi bir etkiye
sahip olabilmesi iin ncelikle yrtlmesi gerekir. (Arzu ederseniz snf tanmlarn if
deyimleri veya fonksiyon gvdeleri iine de yerletirebilirsiniz.)
Uygulamada, bir snf tanm iindeki deyimler genellikle fonksiyon tanmlar olacaktr, ancak
burada teki deyimlerin kullanlmasna da izin verilir. stelik bazen bunun yararn da
grrsnz. Bu konuya daha sonra geleceiz. Normal artlar altnda, snf iindeki fonksiyon
tanmlar, metotlara ilikin arma kurallarnca belirlenen, zel bir argman listesi biimine
sahiptir. Buna da daha sonra deineceiz.
Bir snfn tanm okunduunda yeni bir isim alan oluturulur ve bu isim alan o snfn lokal
etki alan olur. Dolaysyla lokal deikenlere yaplan btn atamalar bu yeni isim alanna
ynelir. zellikle de snf iinde bir fonksiyon tanmlandnda bu yeni fonksiyonun ad bu
etki alanna balanr.
Snf tanmndan normal olarak kldnda (snfn sonuna eriildiinde), bir snf nesnesi
oluturulur. Bu nesne temel olarak, snfn tanmlanmas ile oluturulan isim alannn ieriini
tpk bir kapsl gibi sarmalayan bir yapdr. Bir sonraki blmde snf nesneleri hakknda daha
fazla bilgi vereceiz. Snftan kldnda, snf tanmlanmadan hemen nce etkin durumda
olan asl lokal etki alan yeniden etkin duruma getirilir ve snf nesnesi, bu etki alan iinde,
snf tanm satrnda belirtilen snf adna balanr (yukardaki rnekte SnfAd).
9.3.2 Snf Nesneleri
Snf nesneleri iki ilem trn destekler: niteliklere atf ve rneklendirme.
Niteliklere atf, btn nitelik atar iin kullanlan standart sz dizimini, yani [Link] yapsn
kullanr. Geerli nitelik adlar, snf nesnesi oluturulduu srada snfn isim alannda bulunan
btn adlardr. Dolaysyla eer snf tanm yle grnyorsa:
class Snfm:
"""Basit bir rnek snf"""
i = 12345
def f(self):
return 'merhaba dnya'
Bu durumda Snfm.i ve Snfm.f, srasyla bir tam say ve bir fonksiyon nesnesi
dndren, geerli nitelik atar olacaktr. Snf niteliklerine deer de atanabilir, dolaysyla
[Link] deerini atama yoluyla deitirebilirsiniz. __doc__ da, snfa ait belge dizisini
dndren geerli bir niteliktir. Yukardaki rnekte bu nitelik "Basit bir rnek snf"
deerini dndrr.
Snf rneklendirme ileminde fonksiyonlara ilikin gsterim ekli kullanlr. Snf nesnesinin,
snfn yeni bir rneini dndren parametresiz bir fonksiyon olduunu varsayabilirsiniz.
Mesela (yukardaki snftan hareketle):
x = Snfm()
Bu kod, snfn yeni bir rneini oluturur ve bu nesneyi x adl bir lokal deikene atar.
rneklendirme ilemi (yani bir snf nesnesinin arlmas) bo bir nesne oluturur. Snf
nesnelerini, belirli bir balang deerine sahip olacak ekilde oluturmak yaygn bir
uygulamadr. Bu amala, snf iinde __init__() adl zel bir metot tanmlanabilir. yle:
9.3. Snara lk Bak
71
Resmi Python 3 Klavuzu, Srm 3
def __init__(self):
[Link] = []
Bir snfta __init__() metodu tanmlandnda snf rneklendirme ilemi, yeni oluturulan
snf rnei iin __init__() metodunu otomatik olarak altrr. Dolaysyla bir balang
deerine sahip yeni bir snf rnei yle elde edilebilir:
x = Snfm()
Tabii ki, daha fazla esneklik salamak iin __init__() metoduna argman da verilebilir. Bu
durumda snf rneklendirme ilecine atanan argmanlar __init__() metoduna gnderilir.
rnein:
>>> class KarmakSay:
...
def __init__(self, gerelksm, sanalksm):
...
self.r = gerelksm
...
self.i = sanalksm
...
>>> x = KarmakSay(3.0, -4.5)
>>> x.r, x.i
(3.0, -4.5)
9.3.3 rnek Nesneleri
Peki rnek nesneleri ile neler yapabiliriz? rnek nesnelerinin tand tek ilem tr nitelik
atardr. ki tr geerli nitelik ad vardr: veri nitelikleri ve metotlar.
Veri nitelikleri Smalltalktaki rnek deikenlerine, C++taki veri yelerine karlk gelir. Veri
niteliklerinin nceden bildirilmesine gerek yoktur. Tpk lokal deikenler gibi, bunlar da bir
balang deeri atanr atanmaz varlk sahasna kar. Mesela x, yukarda oluturulan Snfm
adl snfn bir rnei ise, aadaki kod paras 16 deerini ekrana basacak ve ardnda hibir
iz brakmadan kaybolacaktr:
[Link] = 1
while [Link] < 10:
[Link] = [Link] * 2
print([Link])
del [Link]
rneklere ilikin baka bir nitelik atf da metottur. Metot, bir nesneye ait bir fonksiyondur.
(Pythonda metot kavram snf rneklerine zg deildir. Baka nesne tipleri de metotlara
sahip olabilir. rnein liste nesnelerinin append, insert, remove, sort ve bunun gibi metotlar
vardr. Ancak aadaki tartmada, aksi aka belirtilmedike, metot kavramn, yalnzca snf
rnei nesnelerinin metotlar anlamna gelecek ekilde kullanacaz.)
Bir rnek nesnesinin geerli metot adlarnn neler olduu onun snfna baldr. Tanm
gerei, bir snfn, fonksiyon nesnesi olan btn nitelikleri, ayn zamanda o snfn rneklerinin
metotlardr. Dolaysyla bizim rneimizde, Snfm.f bir fonksiyon olduu iin, x.f geerli
bir metot atfdr, ama Snfm.i bir fonksiyon olmad iin, x.i geerli bir metot atf deildir.
Ancak x.f ile Snfm.f ayn eyler deildir. x.f bir metot nesnesidir, fonksiyon nesnesi deil.
9.3.4 Metot Nesneleri
Genellikle bir metot, balandktan hemen sonra arlr:
72
Blm 9. Snar
Resmi Python 3 Klavuzu, Srm 3
x.f()
Snfm rneinde bu, merhaba dnya karakter dizisini dndrr. Ancak bir metodu
hemen armak gerekli deildir: x.f bir metot nesnesidir. Bu nesne daha sonraki bir
zamanda arlmak zere saklanabilir de. Mesela:
xf = x.f
while True:
print(xf())
Bu kodlar sonsuza kadar merhaba dnya basmaya devam edecektir.
Peki bir metot arldnda tam olarak neler olur? f() metodunun fonksiyon tanmnda bir
argman tanmlanm olsa da, yukarda x.f()nin argmansz arldn farketmisinizdir.
Peki argmana ne oldu? Elbette, bir argman bekleyen bir fonksiyon argmansz arlrsa
Python bir istisna tetikler. Hatta argman aslnda kullanlmyor bile olsa...
Aslnda cevab tahmin etmisinizdir: metotlara ilikin zel bir durum, nesnenin kendisinin,
fonksiyona ilk argman olarak atanyor olmasdr. rneimizde x.f() ars Snfm.f(x)
ile birebir ayndr. Genel olarak, metodun n sayda argman listesi ile arlmas; ilgili
fonksiyonun, metot nesnesinin ilk argmann nne yerletirilmesi ile oluturulan bir
argman listesi ile arlmasyla ayn eydir.
Eer metotlarn nasl ilediini hala anlamadysanz, gereklemeye bakmak ileri belki akla
kavuturabilir. Veri nitelii olmayan bir rnek niteliine atfta bulunduunuzda bunun ait
olduu snfta bir arama ilemi gerekletirilir. Eer isim, geerli bir snf niteliine, yani bir
fonksiyon nesnesine iaret ediyorsa, rnek nesnesi ile arama srasnda bulunan fonksiyon
nesnesi (daha dorusu bu nesnenin iaretileri) bir soyut nesne iinde birletirilerek bir
metot nesnesi oluturulur. Buna metot nesnesi denir. Metot nesnesi bir argman listesi ile
arldnda rnek nesnesi ile argman listesi kullanlarak yeni bir argman listesi meydana
getirilir ve fonksiyon nesnesi bu yeni argman listesi ile arlr.
9.3.5 Snf ve rnek Deikenleri
Genel olarak konumak gerekirse, rnek deikenleri, her bir rnee zg veriler iinken; snf
deikenleri ise snfn btn rnekleri tarafndan paylalan nitelikler ve metotlar iindir:
class Kpek:
tr = 'kanin' # btn rnekler tarafndan paylalan snf deikeni
def __init__(self, isim):
[Link] = isim # her bir rnee zg olan rnek deikeni
>>> d = Kpek('Fino')
>>> e = Kpek('Badem')
>>> [Link] # btn kpeklerce paylalr
'kanin'
>>> [Link] # btn kpeklerce paylalr
'kanin'
>>> [Link] # d'ye zgdr
'Fino'
>>> [Link] # e'ye zgdr
'Badem'
9.3. Snara lk Bak
73
Resmi Python 3 Klavuzu, Srm 3
simler ve Nesneler Hakknda Birka Sz blmnde tartld gibi, listeler ve szlkler
gibi deitirilebilen nesneler sz konusu olduunda paylalan veriler artc etkiler
gsterebilir. rnein, aadaki kodlarda yer alan numaralar listesi bir snf deikeni
olarak kullanlmamaldr, nk bu durumda tek bir liste btn Kpek rnekleri tarafndan
paylalacaktr:
class Kpek:
numaralar = [] # bir snf deikeninin yanl kullanm
def __init__(self, isim):
[Link] = isim
def numara_ekle(self, numara):
[Link](numara)
>>> d = Kpek('Fino')
>>> e = Kpek('Badem')
>>> d.numara_ekle('yerde yuvarlan')
>>> e.numara_ekle('l taklidi yap')
>>> [Link] # beklenmedik ekilde btn kpekler tarafndan paylalr
['yerde yuvarlan', 'l taklidi yap']
Snfn tasarmnn doru olabilmesi iin, yukardaki yerine, rnek deikeni kullanlmaldr:
class Kpek:
def __init__(self, isim):
[Link] = isim
[Link] = [] # her kpek iin yeni, bo bir liste oluturur
def numara_ekle(self, numara):
[Link](numara)
>>> d = Kpek('Fino')
>>> e = Kpek('Badem')
>>> d.numara_ekle('yerde yuvarlan')
>>> e.numara_ekle('l taklidi yap')
>>> [Link]
['yerde yuvarlan']
>>> [Link]
['l taklidi yap']
9.4 eitli Notlar
Veri nitelikleri, ayn ada sahip metot niteliklerinin zerine yazar. Byk programlarda
tespit edilmesi g hatalara yol aabilecek istenmeyen isim akmalarn engellemek iin,
akma ihtimalini en aza indirmenizi salayacak bir kural belirlemeniz akllca olacaktr.
Belirleyebileceiniz kurallara rnek olarak; metot adlarnn byk hare yazlmas, veri nitelii
adlarna benzersiz bir karakter dizisi eklinde (belki de yalnzca bir alt izgi) nek getirilmesi
veya metotlar iin il, veri nitelikleri iin ise isimlerin kullanlmas verilebilir.
Veri niteliklerine, metotlarn yansra, ilgili nesneyi kullanan herkes (istemciler) tarafndan
atfta bulunulabilir. Dier bir deyile, snar saf soyut veri tipleri gereklemek iin
kullanlamaz. Aslnda Pythondaki hibir ey verilerin gizlenebilmesine imkan tanmaz.
74
Blm 9. Snar
Resmi Python 3 Klavuzu, Srm 3
Verilerin gizlenmesi tamamen zerinde uzlalm birtakm kurallara dayanr. (te yandan,
C ile yazlm olan Python gereklemesi, gerektiinde gerekleme ayrntlarn tamamen
gizleyip bir nesneye eriimi kontrol edebilir. C ile yazlm Python eklentileri bu zellikten
yararlanabilir.)
stemciler veri niteliklerini dikkatli kullanmaldr. Zira istemciler, metotlara ait sabitleri ve
bunlarn veri niteliklerini deiiklie uratarak bunlar kullanlmaz hale getirebilir. stemciler,
isim akmalarndan kandklar mddete, metotlarn geerliliini etkilemeden, rnek
nesnelerine kendi veri niteliklerini ekleyebilir. Burada da isimlendirmeye ilikin birtakm
kurallar belirlemek banzn armasn engelleyebilir.
Metotlar iinden veri niteliklerine (ve baka metotlara!) atfta bulunmann basit bir yolu
yoktur. Bizce bu durum metotlarn okunaklln artrmaktadr: Bylece, bir metodu
incelerken lokal deikenlerle rnek deikenlerini birbirine kartrmazsnz.
Bir metodun ilk argman genellikle self olarak adlandrlr. Bu genel kabul grm bir
adlandrmadan te bir ey deildir. self adnn Python asndan zel hibir anlam yoktur.
Ancak eer bu yerleik kural takip etmezseniz kodlarnzn baka Python programclar
tarafndan okunmas zorlaabilir. Ayrca baz snf tarama programlar da bu yerleik kural
temel alacak ekilde yazlm olabilir.
Bir snf nitelii durumundaki herhangi bir fonksiyon nesnesi, o snfn rnekleri iin bir metot
olma vazifesi grr. Fonksiyon tanmnn snf tanm iinde gemesi zorunlu deildir. lgili
fonksiyon nesnesini snf iinde bir lokal deikene atamak da kabul edilebilir. Mesela:
# Snfn dnda tanmlanan fonksiyon
def f1(self, x, y):
return min(x, x+y)
class C:
f = f1
def g(self):
return 'merhaba dnya'
h = g
Burada f, g ve hnin hepsi C snfnn, fonksiyon nesnelerine atfta bulunan nitelikleridir ve
sonu olarak bunlarn hepsi C snfnn rnekleri iin birer metot olma vazifesi grr. Burada
h ile g ise birbiriyle tamamen ayndr. Ancak bu kullanm, program okuyanlarn kafasn
kartrmaktan baka bir ie yaramayacaktr.
Metotlar, self argmannn metot niteliklerini kullanarak baka metotlar arabilir:
class anta:
def __init__(self):
[Link] = []
def ekle(self, x):
[Link](x)
def ikikezekle(self, x):
[Link](x)
[Link](x)
Metotlar, sradan fonksiyonlar gibi global isimlere atfta bulunabilir. Bir metodun global
etki alan, o metodun tanmn ieren modldr. (Bir snf asla global etki alan olarak
kullanlmaz.) Bir metot iinde global veri kullanmann pek anlam olmasa da, global etki
alan kullanmnn pek ok geerli sebebi vardr. Bir defa, global etki alanna aktarlan
fonksiyonlar ve modller, metotlarn yansra, fonksiyonlar ve bunun iinde tanmlanan
snar tarafndan da kullanlabilir. Genellikle metodu ieren snfn kendisi bu global etki
9.4. eitli Notlar
75
Resmi Python 3 Klavuzu, Srm 3
alannda tanmlanmtr. Bir sonraki blmde bir metodun neden kendi snfna atfta
bulunmak isteyeceine dair iyi sebepler gstereceiz.
Her deer bir nesnedir, dolaysyla her deerin bir snf vardr (tipi de denebilir). Bu deer,
nesne.__class__ olarak saklanr.
9.5 Miras Alma
Elbette bir dilde snf diye adlandrlan bir zellik eer miras almay desteklemiyorsa, o
zellie snf demek pek yerinde bir adlandrma olmayacaktr. Tretilmi bir snf tanmnn
sz dizimi yle grnr:
class TretilmiSnfAd(TabanSnfAd):
<deyim-1>
.
.
.
<deyim-N>
TabanSnfAd ad, tretilmi snf tanmn ieren etki alan iinde tanmlanmaldr. Taban
snf ad yerine herhangi bir baka ifade de kabul edilir. Bu zellik, rnein, taban snf baka
bir modl iinde tanmlanmsa faydal olacaktr:
class TretilmiSnfAd([Link]):
Tretilmi bir snfn tanm tpk taban snfnki gibi iler. Snf nesnesi oluturulduunda
taban snf hatrlanr. Bu zellik nitelik atarn zmek iin kullanlr: Eer talep edilen bir
nitelik snf iinde bulunamazsa, arama taban snf iinde ilerler. Eer taban snfn kendisi
baka bir snftan tretilmise bu kural zyinelemeli olarak iletilir.
Tretilmi
snarn
rneklendirilmesi
konusunda
zel
bir
durum
yoktur:
TretilmiSnfAd() snfn yeni bir rneini oluturur. Metot atar yle zlr:
lgili snf nitelii, gerekiyorsa taban snf zincirinde aa doru inilerek aranr ve eer bu
ilem bir fonksiyon nesnesi verirse metot atf geerli olmu olur.
Tretilmi snar taban snarnn metotlarnn zerine yazabilir. nk metotlar; ayn snf
iindeki baka bir metodu arrken herhangi bir ncelik elde etmez. Ayn taban snf iinde
tanmlanm baka bir metodu aran bir taban snfn bir metodu, onun zerine yazan bir
tretilmi snfn metodunu arabilir. (C++ programclar iin; Pythondaki btn metotlar
esasnda virtual, yani soyuttur.)
Taban snf iindeki bir metodu deiiklie uratan tretilmi snf iindeki bir metot aslnda
ayn isimli taban snf metodunu deitirmek yerine onu geniletmek istiyor olabilir. Taban
snf metodunu dorudan armann basit bir yolu udur: [Link](self,
argmanlar) kodunu altrmak. Bu, zaman zaman istemciler iin de faydaldr. (Ancak bu
kodlar yalnzca taban snf TabanSnfAd olarak global etki alanndan ulalabilir olduunda
alr.)
Pythonn miras alma ile birlikte alan iki adet gml fonksiyonu vardr:
Bir rnein tipini kontrol etmek iin isinstance() kullanlr: isinstance(obj, int)
kodu, nesne.__class__ int veya intten treyen baka bir snf olduunda True
olacaktr.
76
Blm 9. Snar
Resmi Python 3 Klavuzu, Srm 3
Snfn miras alnm olup olmadn kontrol etmek iin issubclass() kullanlr:
issubclass(bool, int) kodu, bool intin bir alt snf olduu iin Truedur. Ancak,
issubclass(float, int) Falsetur, nk float intin bir alt snf deildir.
9.5.1 oklu Miras Alma
Python, bir tr oklu miras almay da destekler. Birden fazla taban snfa sahip bir snf yle
tanmlanr:
class TretilmiSnfAd(Taban1, Taban2, Taban3):
<deyim-1>
.
.
.
<deyim-N>
En basit durumlarda, ou ama iin, ebeveyn snftan miras alnan niteliklerin aranmas
ilemini derinlik ncelikli, soldan saa, hiyeraride bir akma olduu durumlarda ayn snf
iinde iki kez arama yaplmayan bir yap olarak dnebilirsiniz. Dolaysyla, eer bir nitelik
TretilmiSnfAd adl snfta bulunamazsa, bu nitelik Taban1 snfnda aranacak, daha
sonra (zyinelemeli olarak) Taban1 adl snfn taban snarna baklacak ve eer orada da
bulunamazsa, Taban2 adl snfa ve dierlerine geilecektir.
Esasnda, durum bundan biraz daha karmaktr. Metot zmleme sras, ortak super()
fonksiyonu arlarn desteklemek iin dinamik olarak deiecektir. Bu yaklam oklu miras
almay destekleyen baz baka dillerde call-next metodu olarak bilinir ve tek miras almay
destekleyen dillerdeki super() arlarndan daha gldr.
oklu miras almaya ilikin btn durumlar bir veya daha fazla elmas yaps gsterdii iin
(ebeveyn snarn en az bir tanesinin, en dip snftan oklu yollar araclyla eriilebildii
durum) dinamik sralama gereklidir. rnein, btn snar object snfndan miras
alr. Dolaysyla oklu mirasa ilikin her durum, object snfna erimek iin birden
fazla yol sunar. Taban snara birden fazla sayda eriilmesini engellemek iin, dinamik
algoritma, arama ilemini, her bir snfta belirlenen soldan saa sralamay muhafaza
edecek, ebeveyn snf yalnzca bir kez aracak ve monotonik (yani bir snfn, ebeveynlerin
ncelik srasn etkilemeden alt snf olarak arlabilmesi) olacak ekilde dorusallatrr.
Bu zellikler, birlikte ele alndklarnda, oklu miras alma zelliini destekleyen gvenilir
ve geniletilebilir snar tasarlanmasn mmkn klar.
Daha fazla ayrnt iin bkz.
[Link]
9.6 Gizli Deikenler
Nesne dndan eriilemeyen gizli rnek deikenleri Pythonda bulunmaz. Ancak pek ok
Python programcs tarafndan uyulan genel kabul grm bir kural vardr: Buna gre,
banda bir alt izgi bulunan isimler (rn. _falanca) APInin darya kapal ksm olarak
deerlendirilir (bu bir fonksiyon, metot veya veri yesi olabilir). Bu isimler, gereklemeye
ilikin bir teferruat olarak kabul edilir ve her an deiebilecekleri varsaylr.
Snf iine gizlenmi yeler kullanmay gerektiren baz durumlar olabilecei iin (alt snar
tarafndan tanmlanan isimlerle isim akmasn nlemek gibi), isim bulandrma ad verilen
bir mekanizmaya snrl da olsa destek verilmitir. Buna gre, __falanca biimindeki bir
tanmlayc (n taraftan en az iki alt izgi, arka taraftan en fazla bir alt izgi) kod iinde getii
9.6. Gizli Deikenler
77
Resmi Python 3 Klavuzu, Srm 3
yerde _snfad__falanca olarak deitirilir. Burada snfad, nndeki alt izgi(ler) atlm
mevcut snf ismidir. Bu bulandrma ilemi, tanmlaycnn, bir snf tanm iinde getii
srece, sz dizimsel konumuna baklmakszn yaplr.
sim bulandrma, alt snarn, snf ii metot arlarn bozmadan metotlarn zerine
yazmasn salamak asndan faydaldr. Mesela:
class Eleme:
def __init__(self, yrnebilir_nesne):
self.e_listesi = []
self.__gncelle(yrnebilir_nesne)
def gncelle(self, yrnebilir_nesne):
for e in yrnebilir_nesne:
self.e_listesi.append(e)
__gncelle = gncelle
# orijinal gncelle() metodunun gizli kopyas
class ElemeAltSnf(Eleme):
def gncelle(self, anahtarlar, deerler):
# gncelle() iin yeni bir imza oluturuyoruz
# ama __init__()'i bozmuyoruz
for e in zip(anahtarlar, deerler):
self.e_listesi.append(e)
Bulandrma kurallarnn ounlukla kazalar engellemek iin tasarlandn unutmayn. Gizli
olmas dnlen deikenlere erimek veya deitirmek yine de mmkndr. Bu durum,
hata ayklayc gibi zel durumlarda yararl bile olabilir.
exec() veya eval() fonksiyonlarna verilen parametrelerin, aran snfn snf adn mevcut
snf adna eklemediine dikkat edin. Bu durum, global deyiminin etkisinin, bayt olarak
birlikte derlenmi kodlarla snrl olmasna benzer. Ayn kstlama getattr(), setattr() ve
delattr() ile birlikte, dorudan __dict__e atfta bulunulan durumlar iin de geerlidir.
9.7 Birka ey
Bazen, Pascaldaki record (kayt) veya Cdeki struct (yap) tiplerine benzer bir veri tipi
kullanarak birka isimli veri esini bir araya getirmek faydal olabilir. Bo bir snf
tanmlamak bu i iin gayet uygun olacaktr:
class alan:
pass
mehmet = alan() # Bo bir alan kayd oluturuyoruz
# Kayttaki alanlar dolduruyoruz
[Link] = 'Mehmet z'
[Link] = 'bilgisayar laboratuvar'
[Link] = 1000
Belirli bir soyut veri tipi bekleyen bir Python kod parasna, o veri tipinin metotlarn
taklit edecek ekilde veri tipi yerine, genellikle bir snf verilebilir. rnein, bir dosya
nesnesinden gelen baz verileri biimlendiren bir fonksiyonunuz varsa, verileri karakter dizisi
78
Blm 9. Snar
Resmi Python 3 Klavuzu, Srm 3
tamponundan alan read() ve readline() adl metotlara sahip bir snf tanmlayabilir, bunu
argman olarak atayabilirsiniz.
rnek metodu nesnelerinin de nitelikleri vardr: m.__self__, m() metoduna sahip bir rnek
nesnesidir. m.__func__ ise bu metoda karlk gelen fonksiyon nesnesidir.
9.8 stisnalar da Birer Snftr
Kullanc tarafndan tanmlanan istisnalar da birer snf gibi ilem grr. Bu mekanizma
kullanlarak, istisnalar iin geniletilebilir hiyerarik yaplar oluturmak mmkndr.
raise deyimi iin yeni, iki adet geerli (semantik) biim bulunur:
raise Snf
raise rnek
lk biimde Snf type snfnn veya bundan treyen bir snfn rnei olmaldr. lk biim
aadakinin ksaltlm halidir:
raise Snf()
except cmlecii iinde belirtilen bir snf, kendisiyle ayn ad tayan bir snf ile veya o
snfn bir taban snf ile eleir. (Ama bunun tersi geerli deildir. Yani tretilmi bir snfn
belirtildii except cmlecii bir taban snf ile elemez). rnein aadaki kodlar srasyla B,
C, D basacaktr:
class B(Exception):
pass
class C(B):
pass
class D(C):
pass
for snf in [B, C, D]:
try:
raise snf()
except D:
print("D")
except C:
print("C")
except B:
print("B")
Eer except cmlecikleri ters evrilirse (except B ilk olacak ekilde), ekrana B, B, B baslr.
nk eleen ilk except cmlecii tetiklenecektir.
Yakalanmam bir istisna nedeniyle bir hata mesaj baslrken, istisnann snf ismi baslr,
ardndan iki nokta st ste ve bir boluk getirilir. Son olarak da gml str() fonksiyonuyla
karakter dizisine dntrlen snf rnei baslr.
9.8. stisnalar da Birer Snftr
79
Resmi Python 3 Klavuzu, Srm 3
9.9 Yrycler
imdiye kadar ou kapsayc nesne zerinde for deyimi yardmyla dng kurulabileceini
farketmisinizdir:
for e in [1, 2, 3]:
print(e)
for e in (1, 2, 3):
print(e)
for anahtar in {'bir':1, 'iki':2}:
print(anahtar)
for karakter in "123":
print(karakter)
for satr in open("[Link]"):
print(satr, end="")
Bu eriim tarz ak, z ve kolaydr. Yryclerin kullanmna Pythonn her kesinde
rastlayabilirsiniz. Perde arkasnda, for deyimi kapsayc nesne zerinde iter() fonksiyonunu
arr. Fonksiyon, kapsayc nesne iindeki elere birer birer erien __next__() adl
bir metot tanmlayan bir yryc nesnesi dndrr. Artk eriilecek e kalmadnda
__next__() metodu StopIteration istisnasn tetikler ve bylece for dngs sona erer.
__next__() metodunu next() gml fonksiyonunu kullanarak arabilirsiniz. Aadaki
rnek bunun nasl altn gsterir:
>>> s = 'abc'
>>> it = iter(s)
>>> it
<iterator object at 0x00A1DB50>
>>> next(it)
'a'
>>> next(it)
'b'
>>> next(it)
'c'
>>> next(it)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
next(it)
StopIteration
Yryc protokolnn ileyiini rendiinize gre kendi snarnza yryc davrann
kolaylkla ekleyebilirsiniz. Bunun iin, __next__() metoduna sahip bir nesne dndren
bir __iter__() metodu tanmlyoruz. Eer snfta __next__() metodu tanmlanmsa,
__iter__() metodu yalnzca self dndrebilir:
class Tersi:
"""Bir dizi zerinde ters dng kurmaya yarayan bir yryc."""
def __init__(self, veri):
[Link] = veri
[Link] = len(veri)
def __iter__(self):
return self
def __next__(self):
if [Link] == 0:
raise StopIteration
[Link] = [Link] - 1
80
Blm 9. Snar
Resmi Python 3 Klavuzu, Srm 3
return [Link][[Link]]
>>> tersi = Tersi('kars')
>>> iter(tersi)
<__main__.Tersi object at 0x00A1DB50>
>>> for karakter in tersi:
...
print(karakter)
...
s
r
a
k
9.10 reteler
reteler yryc (iterator) oluturmaya yarayan basit ve gl aralardr. Bunlar bildiimiz
fonksiyonlar gibi yazlr, ama veri dndrmek gerektiinde (return yerine) yield deyimi
kullanlr. rete zerinde next() fonksiyonunun her arlnda rete kald yerden
devam eder (btn veri deerlerini ve en son iletilen deyimin hangisi olduunu hatrlar).
u rnek, retelerin ne kadar kolay oluturulabileceini gstermektedir:
def tersi(veri):
for sra in range(len(veri)-1, -1, -1):
yield veri[sra]
>>> for karakter in tersi('golf'):
...
print(karakter)
...
f
l
o
g
nceki blmde akland gibi, reteler ile yaplabilecek her ey snf tabanl yryclerle
de yaplabilir. retelerin bu kadar ksa ve z olmasn salayan ey __iter__() ve
__next__() metotlarnn otomatik olarak oluturulmasdr.
retelerin nemli bir zellii de lokal deikenlerin ve yrtme durumunun arlar arasnda
otomatik olarak kaydediliyor olmasdr. Bu zellik fonksiyonun yazln kolaylatrr ve
[Link] ve [Link] gibi rnek deikenlerini kullanma yaklamna gre daha ok daha
anlalrdr.
Otomatik metot oluturma ve program durumunun kaydedilmesinin yansra, reteler sona
erdiinde otomatik olarak StopIteration istisnasn tetiklerler. Btn bu zellikler bir araya
gelerek, yryclerin oluturulmasn en az normal fonksiyonlar yazmak kadar kolay hale
getirir.
9.11 rete fadeler
Liste reticilere benzer bir sz dizimi yardmyla, ama keli parantezler yerine normal
parantezler kullanarak, ksa yoldan ifade biimli basit reteler yazabilirsiniz. Bu tr ifadeler,
retelerin, iinde bulunduklar fonksiyon tarafndan hemen kullanlacaklar durumlar iin
9.10. reteler
81
Resmi Python 3 Klavuzu, Srm 3
tasarlanmtr. rete ifadeler, tam teekkll rete tanmlarna gre daha az yer tutmakla
birlikte yetenekleri daha kstldr. Ama bu yaplar, edeer liste reticilere kyasla daha bellek
dostudurlar.
rnekler:
>>> sum(i*i for i in range(10))
285
# karelerin toplam
>>> xvek = [10, 20, 30]
>>> yvek = [7, 5, 3]
>>> sum(x*y for x,y in zip(xvek, yvek))
260
# i arpm
>>> from math import pi, sin
>>> sins_tablosu = {x: sin(x*pi/180) for x in range(0, 91)}
>>> tek_kelimeler = set(kelime
for satr in sayfa
for kelime in [Link]())
>>> snf_birincisi = max(([Link], [Link]) for renci in mezunlar)
>>> veri = 'golf'
>>> list(veri[i] for i in range(len(veri)-1, -1, -1))
['f', 'l', 'o', 'g']
82
Blm 9. Snar
BLM 10
Standart Ktphanede Ksa Bir Gezinti
10.1 letim Sistemi Arayz
os modl, iletim sistemi ile iletiim kurmamz salayacak onlarca fonksiyona sahiptir:
>>> import os
>>> [Link]() # Mevcut alma dizinini dndrr
'C:\\Python35'
>>> [Link]('/sunucu/gnlkler') # Mevcut alma dizinini deitirir
>>> [Link]('mkdir bugn') # Sistem kabuunda mkdir komutunu altrr
0
Burada from os import * yerine import os biimini kullanmaya zen gsterin. Bylece
[Link]() fonksiyonunun, ok farkl bir ileyii olan gml open() fonksiyonunun zerini
rtmesini nlemi olursunuz.
Gml dir() ve help() fonksiyonlar, os gibi kapsaml modller zerinde alrken
etkileimli kabukta yardm alabilmenizi salar:
>>> import os
>>> dir(os)
<modldeki btn fonksiyonlarn listesini dndrr>
>>> help(os)
<modln belge dizileri kullanlarak oluturulan ayrntl bir klavuz sayfas dndrr>
shutil modl, gnlk dosya ve dizin ynetimi ilemleri asndan kullanm daha kolay olan
yksek seviyeli bir arayz sunar:
>>> import shutil
>>> [Link]('[Link]', '[Link]')
'[Link]'
>>> [Link]('/ina/altrlabilirdosyalar', 'kurulumdizini')
'kurulumdizini'
10.2 Dosyalarda Joker Karakterler
glob modl, dizinler iinde joker karakterleri kullanarak arama yapp bu aramalardan dosya
listeleri oluturmanz salayan bir fonksiyon sunar:
83
Resmi Python 3 Klavuzu, Srm 3
>>> import glob
>>> [Link]('*.py')
['[Link]', '[Link]', '[Link]']
10.3 Komut Satr Argmanlar
Yardmc fonksiyonlar ieren betikler genellikle komut satr argmanlarn ilemeye ihtiya
duyar. Komut satr argmanlar sys modlnn argv nitelii iinde bir liste halinde tutulur.
rnein aadaki kt, python [Link] bir iki ifadesinin komut satrnda altrlmas
sonucu elde edilmitir:
>>> import sys
>>> print([Link])
['[Link]', 'bir', 'iki', '']
getopt modl, Unixteki getopt() fonksiyonuna benzer bir ekilde [Link] listesini iler.
argparse modl ise size daha gl ve esnek bir komut satr ileme kabiliyeti sunar.
10.4 Hata kts Ynlendirme ve Program Sonlandrma
sys modl stdin, stdout ve stderr gibi birtakm niteliklere de sahiptir. stderr ; stdout
ynlendirilmi bile olsa, uyar ve hata mesajlarn grnr hale getirmek iin kullanlabilir.
>>> [Link]('Dikkat, log dosyas bulunamad. Yeni bir tane oluturuluyor\n')
Dikkat, log dosyas bulunamad. Yeni bir tane oluturuluyor
Bir betii sonlandrmann en kesin yntemi [Link]() komutunu kullanmaktr.
10.5 Karakter Dizisi Desen Eletirme
re modl, ileri dzey karakter dizisi ileme ilemleri iin dzenli ifade aralar sunar. Dzenli
ifadeler; karmak eletirme ve deitirme ilemlerine ynelik hem ksa ve z, hem de verimli
zmlere sahiptir.
>>> import re
>>> [Link](r'\bg[\w]*', 'gzlerin gzlerime deince felaketim olurdu alardm')
['gzlerin', 'gzlerime']
>>> [Link](r'(\b[a-z]+) \1', r'\1', 'gnlerden bir bir gn')
'gnlerden bir gn'
Ancak eer yapmak istediiniz ey basit bir ilemse, okumas ve hatalarn ayklamas daha
kolay olduu iin karakter dizisi metotlarn tercih etmek gerekir.
>>> 'bilmezler yanlz yaamayanlar'.replace('yanlz', 'yalnz')
'bilmezler yalnz yaamayanlar'
84
Blm 10. Standart Ktphanede Ksa Bir Gezinti
Resmi Python 3 Klavuzu, Srm 3
10.6 Matematik
math modl, kayan noktal saylarla aritmetik ilem yaparken, arka plandaki C ktphane
fonksiyonlarna eriebilmenizi salar.
>>> import math
>>> [Link]([Link] / 4)
0.70710678118654757
>>> [Link](1024, 2)
10.0
random modl rastgele seimler yapabilmenizi salayan aralar sunar:
>>> import random
>>> [Link](['elma', 'armut', 'muz'])
'elma''
>>> [Link](range(100), 10)
# elere dokunmadan, numune alyoruz
[30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
>>> [Link]()
# rastgele bir kayan noktal say
0.17970987693706186
>>> [Link](6)
# range(6) aralnda rastgele seilen bir tamsay
4
statistics modl, saysal verilerin temel istatistiksel zelliklerini (ortalama, medyam,
deikenlik, vb.) hesaplar.
>>> import statistics
>>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]
>>> [Link](data)
1.6071428571428572
>>> [Link](data)
1.25
>>> [Link](data)
1.3720238095238095
SciPy projesi <[Link] nmerik hesaplamalar iin pek ok baka modl de
barndrr.
10.7 nternet Eriimi
nternete erimek ve internet protokolleri ile ilem yapabilmek iin kullanabileceiniz baz
modller de vardr. Bunlarn iinde en basit iki tanesi URLlerden veri ekmek iin kullanlan
[Link] ve [Link] gndermek iin kullanlan smtplib modlleridir:
>>> from [Link] import urlopen
>>> with urlopen('[Link] as cevap:
...
for satr in cevap:
...
satr = [Link]('utf-8') #kili verileri metin olarak kodluyoruz.
...
if 'EST' in satr or 'EDT' in satr: # Dou Standart Saati'ni aryoruz
...
print(satr)
<BR>Nov. 25, 09:43:32 PM EST
>>> import smtplib
>>> sunucu = [Link]('localhost')
10.6. Matematik
85
Resmi Python 3 Klavuzu, Srm 3
>>>
...
...
...
...
...
>>>
[Link]('kahin@[Link]', 'jsezar@[Link]',
"""Kime: jsezar@[Link]
Kimden: kahin@[Link]
Mart'n 15'inden sakn!
""" )
[Link]()
(kinci rnek iin localhostta alan bir mail sunucusu gerektiine dikkat edin.)
10.8 Tarihler ve Zamanlar
datetime modl tarihler ve zamanlar zerinde hem basit hem de karmak ekillerde
oynayabilmenizi salayacak snar sunar. Tarih ve zaman deerleri ile aritmetik ilemler
yaplabilse de, bunlara ilikin fonksiyonlarn gayesi, biimlendirme ve dzenleme ilemlerine
ynelik olarak ktdan verimli bir ekilde e ayklamaktr. Bu modl ayrca zaman dilimlerini
ayrt edebilen nesneleri de destekler.
>>> # tarihleri oluturmak ve biimlendirmek son derece kolaydr
>>> from datetime import date
>>> uan = [Link]()
>>> uan
[Link](2003, 12, 2)
>>> [Link]("%m-%d-%y. %d %b %Y, %B aynn %d. gnne gelen bir %A gndr.")
'12-02-03. 02 Ara 2003, Aralk aynn 02. gnne gelen bir Sal gndr.'
>>> # tarihlerle takvime ilikin aritmetik ilemler yaplabilir
>>> doumgn = date(1964, 7, 31)
>>> ya = uan - doumgn
>>> [Link]
14368
10.9 Veri Sktrma
zlib, gzip, bz2, lzma, zipfile ve tarfile gibi modller araclyla yaygn veri arivleme ve
sktrma biimleri dorudan desteklenmektedir.
>>> import zlib
>>> s = b'dal kalkar kartal sarkar dal sarkar kartal kalkar'
>>> len(s)
49
>>> t = [Link](s)
>>> len(t)
34
>>> [Link](t)
b'dal kalkar kartal sarkar dal sarkar kartal kalkar'
>>> zlib.crc32(s)
3211303476
86
Blm 10. Standart Ktphanede Ksa Bir Gezinti
Resmi Python 3 Klavuzu, Srm 3
10.10 Performans lme
Baz Python kullanclar, ayn probleme farkl yaklamlarn karlatrmal performansn
renmeye kar derin bir alaka duyar. Python, buna ilikin sorularnz derhal cevaplamanz
salayacak bir lm arac sunar.
Argmanlar birbiriyle deitirmeye ilikin geleneksel yaklam yerine demetleme ve demet
zme zelliini kullanmak grnze cazip grnebilir. timeit modl, bu ekilde kk de
olsa bir performans avantaj elde edildiini bize hemencecik gsterecektir:
>>> from timeit import Timer
>>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
0.57535828626024577
>>> Timer('a,b = b,a', 'a=1; b=2').timeit()
0.54962537085770791
timeit modlnn bize sunduu ince hassasiyet dzeyinin aksine, profile ve pstats
modlleri, daha byk kod bloklarndaki zaman asndan kritik blmleri tespit etmeye
yarayan aralar sunar.
10.11 Kalite Kontrol
Yksek kaliteli yazlmlar gelitirmek iin benimsenen yaklamlardan biri de her bir fonksiyon
iin, daha bunlar gelitirildii srada testler yazmak ve gelitirme srecinde bu testleri sk sk
altrmaktr.
doctest modl, bir modl tarayp, programn belge dizilerine gmlm testlerin
salamasn yapmanza yarayan birtakm aralar sunar. Test yapsnn oluturulmas, rnek
bir komutun, ktlaryla birlikte belge dizisine yaptrlmasndan ibarettir. Bu ekilde hem
kullancya bir rnek sunularak belgelendirme iyiletirilmi olur hem de doctest modl
sayesinde kod ile belgelendirmenin birbiriyle uyumlu kalmas salanr:
def ortalama(deerler):
"""Saylardan oluan bir listenin aritmetik ortalamasn hesaplar.
>>> print(ortalama([20, 30, 70]))
40.0
"""
return sum(deerler) / len(deerler)
import doctest
[Link]()
# gml testlerin otomatik olarak salamasn yapar
unittest modl doctest modl kadar zahmetsiz deildir, ama ayr bir dosyada daha
kapsaml testlerin tutulabilmesine olanak tanr:
import unittest
class statistikFonksiyonlarnnTesti([Link]):
def test_ortalama(self):
[Link](ortalama([20, 30, 70]), 40.0)
[Link](round(ortalama([1, 5, 7]), 1), 4.3)
with [Link](ZeroDivisionError):
10.10. Performans lme
87
Resmi Python 3 Klavuzu, Srm 3
average([])
with [Link](TypeError):
ortalama(20, 30, 70)
[Link]() # Komut satrndan arldnda btn testler alr
10.12 Piller de Dahil
Python piller de dahil eklinde tabir edilen bir felsefeyi benimser. Bunu grmek iin dildeki
byk paketlerin ne kadar karmak ve ne kadar gl yeteneklere sahip olduuna bakmak
yeterli olacaktr. rnein:
[Link] ve [Link] modlleri uzaktan yordam arlarn neredeyse
ocuk oyunca haline getirir. Modllerin ad sizi yanltmasn. XML bilmeniz veya XML
ile uramanz gerekmiyor.
email paketi, MIME ve baka RFC 2822 tabanl mesaj belgeleri de dahil olmak zere,
[Link] mesajlarn ynetmek iin kullanlan bir ktphanedir. Yalnzca mesaj alp
gndermeye yarayan smtplib ve poplib ktphanelerinin aksine, email paketi (ekler de
dahil olmak zere) karmak mesaj yaplar oluturmak veya bu yaplar zmek ya da
internet kodlama ve balk protokolleri gereklemek iin eksiksiz bir alet takm sunar.
json paketi, bu gzde veri aktarm biimini ayrtrmak iin gl bir destek salar.
csv modl de yaygn bir veri taban ve hesap izelgesi biimi olan csv ile dorudan
okuma ve yazma ilemleri gerekletirilmesine imkan tanr. XML ileme destei ise
[Link], [Link] ve [Link] paketleri ile salanmaktadr. Btn bu
modller ve paketler Python uygulamalar ile baka aralar arasndaki veri alveriini
byk lde kolaylatrr.
sqlite3 modl, SQLite veritaban ktphanesi iin, standarttan biraz farkl bir
SQL szdizimi araclyla gncellenebilecek
ve eriilebilecek kalc bir veritaban sunan bir arayzdr.
Uluslararaslatrma, gettext, locale ve codecs gibi birtakm modller araclyla
desteklenir.
88
Blm 10. Standart Ktphanede Ksa Bir Gezinti
BLM 11
Standart Ktphanede Ksa Bir Gezinti Blm II
Bu ikinci turda, profesyonel programlama ihtiyalarnza yant veren daha ileri dzey
modlleri ele alacaz. Bu modllerin kk betiklerde kullanldn pek grmezsiniz.
11.1 kt Biimlendirme
reprlib modl; repr() modlnn, byk veya ok i ie gemi kapsayc veri tiplerini
ksaltlm bir ekilde gsterecek ekilde tasarlanm halidir.
>>> import reprlib
>>> [Link](set('ekoslavakyallatramadklarmz'))
"{'a', 'c', 'd', 'e', 'f', 'g', ...}"
pprint modl, hem gml hem de kullanc tanml nesnelerin yorumlayc tarafndan
okunabilecek bir biinde ekrana baslmas ilemini daha ayrntl bir ekilde kontrol
edebilmenizi salar. Eer kt bir satrdan uzunsa, zarif yazdrc, veri yapsn daha belirgin
hale getirmek iin karakter dizisine satr boluklar ve girintiler ekler:
>>> import pprint
>>> t = [[[['siyah', 'camgbei'], 'beyaz', ['yeil', 'krmz']], [['eflatun',
...
'sar'], 'mavi']]]
...
>>> [Link](t, width=30)
[[[['siyah', 'camgbei'],
'beyaz',
['yeil', 'krmz']],
[['eflatun', 'sar'],
'mavi']]]
textwrap modl, metindeki paragraar, belirli bir ekran geniliine sacak ekilde
biimlendirir:
>>> import textwrap
>>> belge = """wrap() metodu fill() metoduna benzer, ancak farkl olarak,
... hizalanan satrlar ayrmak iin, yeni satrlar ieren tek bir byk karakter
... dizisi yerine karakter dizilerinden oluan bir liste dndrr."""
...
>>> print([Link](belge, width=40))
wrap() metodu fill() metoduna benzer, ancak farkl
olarak hizalanan satrlar ayrmak iin, yeni satrlar
ieren tek bir byk karakter dizisi yerine karakter
dizilerinden oluan bir liste dndrr.
89
Resmi Python 3 Klavuzu, Srm 3
locale modl, yerele zg veri biimlerini barndran bir veritabanna eriim salar. Locale
modlnn format fonksiyonuna ait gruplama nitelii sayesinde, saylar grup ayralar ile
dorudan biimlendirilebilir.
>>> import locale
>>> [Link](locale.LC_ALL, 'Turkish_Turkey.1252')
'Turkish_Turkey.1252'
>>> yerel = [Link]() # yerelletirmeleri ieren szlk
>>> x = 1234567.8
>>> [Link]("%d", x, grouping=True)
'1.234.567'
>>> locale.format_string("%s %.*f", (yerel['currency_symbol'],
...
yerel['frac_digits'], x), grouping=True)
'TL 1.234.567,80'
11.2 ablonlar
string modl, son kullanclar tarafndan dzenlenmeye uygun, basit bir sz dizimine sahip,
esnek bir Template snf ierir. Bu snf, kullanclarn, uygulamay deitirmek zorunda
kalmadan uygulamalarn zelletirebilmesine izin verir.
Biimlendirici; $ ve geerli Python tanmlayclar (alfanmerik karakterler ve alt izgiler)
ile oluturulan yer tutucu adlarn ierir. Yer tutucuyu ssl parantez iine alarak, araya
gereksiz boluk yerletirmek zorunda kalmadan bunun ardndan baka alfanmerik harer
de getirebilirsiniz. $ iaretini kullanabilmek iin $$ yazabilirsiniz:
>>> from string import Template
>>> t = Template('${kurum}la $sebep yararna 100.000$$ gndermitir.')
>>> [Link](kurum='Filanca', sebep='yoksullar')
'Filancala yoksullar yararna 100.000 $ gndermitir.'
Eer yer tutucu bir szlk veya isimli argman iinde verilmemise, substitute() metodu
KeyError istisnasn tetikleyecektir. Mektup ve adres birletirme tarz uygulamalarda,
kullanc tarafndan girilen veriler eksik olabilir. Bu durumda safe_substitute() metodunu
kullanmak daha uygun olacaktr. Bu metot, eer eksik veri varsa, o veriye karlk gelen yer
tutucuyu olduu gibi brakr:
>>> t = Template("Ltfen $kitap adl kitab $sahibi Bey'e iade ediniz.")
>>> d = dict(kitap='Tutunamayanlar')
>>> [Link](d)
Traceback (most recent call last):
...
KeyError: 'sahibi'
>>> t.safe_substitute(d)
"Ltfen Tutunamayanlar adl kitab $sahibi Bey'e iade ediniz."
Template snfn miras yoluyla kullanarak farkl bir ayra (delimiter) da belirtebilirsiniz.
rnein, bir fotoraf taraycs iin toplu adlandrma uygulamas yazyorsanz, gncel tarih,
fotoraarn sra numaras veya dosya biimi gibi yer tutucular iin yzde iaretini kullanmay
tercih edebilirsiniz:
>>> import time, [Link]
>>> fotodosyalar = ['img_1074.jpg', 'img_1076.jpg', 'img_1077.jpg']
>>> class TopluAdlandr(Template):
...
delimiter = '%'
90
Blm 11. Standart Ktphanede Ksa Bir Gezinti Blm II
Resmi Python 3 Klavuzu, Srm 3
>>> bm = input('Yeniden adlandrma stili: (%d-tarih %n-sra %f-biim): ')
Yeniden adlandrma stili: (%d-tarih %n-sra %f-biim): Aye_%n%f
>>> t = TopluAdlandr(bm)
>>> tarih = [Link]('%d%b%y')
>>> for i, dosyaad in enumerate(fotodosyalar):
...
kk, uzant = [Link](dosyaad)
...
yeniad = [Link](d=tarih, n=i, f=uzant)
...
print('{0} --> {1}'.format(dosyaad, yeniad))
img_1074.jpg --> Aye_0.jpg
img_1076.jpg --> Aye_1.jpg
img_1077.jpg --> Aye_2.jpg
ablon oluturmaya ilikin bir baka kullanm alan da, programn yaps ile farkl kt
biimlerine ilikin ayrntlar birbirinden ayrmaktr. Bu ekilde XML dosyalar, dz metin
raporlar ve HTML web raporlar iin zel ablonlar oluturabilirsiniz.
11.3 kili Veri Kaytlaryla almak
struct modl, deiken uzunluktaki ikili kayt biimleriyle alabilmenizi salamak iin
pack() ve unpack() adl iki fonksiyon sunar.
Aadaki rnek, zipfile modln
kullanmadan, bir ZIP dosyasndaki balk bilgileri zerinde nasl dng kurulabileceine dair
bir rnek sunmaktadr. "H" ve "I" pack kodlar, srasyla iki ve drt baytlk iaretsiz saylar
temsil eder. "<" ileci bunlarn standart boyutta olduunu ve little-endian bayt dzenine
sahip olduunu gsterir:
import struct
with open('[Link]', 'rb') as f:
data = [Link]()
start = 0
for i in range(3): # ilk 3 dosya baln gsteriyoruz
start += 14
fields = [Link]('<IIIHH', data[start:start+16])
crc32, comp_size, uncomp_size, filenamesize, extra_size = fields
start += 16
filename = data[start:start+filenamesize]
start += filenamesize
extra = data[start:start+extra_size]
print(filename, hex(crc32), comp_size, uncomp_size)
start += extra_size + comp_size # bir sonraki bala geiyoruz
11.4 ok Katmanl Programlama
ok katmanl programlama, sra bakmndan birbirine bal olmayan grevleri birbirinden
ayrmak iin kullanlan bir tekniktir. Katmanlar, teki grevler arkaplanda almaya devam
ederken kullancdan girdi alabilen uygulamalarn donmamas iin kullanlabilir. Buna bir
11.3. kili Veri Kaytlaryla almak
91
Resmi Python 3 Klavuzu, Srm 3
rnek, baka bir katmanda devam eden hesaplamalarla paralel bir ekilde girdi/kt ilemleri
yapmaktr.
Aadaki kod, ana program almaya devam ederken, threading adl yksek seviyeli
modln, arkaplandaki grevleri nasl yrtebildiini gsteriyor:
import threading, zipfile
class EzamanszSktrma([Link]):
def __init__(self, girendosya, kandosya):
[Link].__init__(self)
[Link] = girendosya
[Link] = kandosya
def run(self):
f = [Link]([Link], 'w', zipfile.ZIP_DEFLATED)
[Link]([Link])
[Link]()
print('Arkaplanda u dosyann sktrlma ilemi tamamland:', [Link])
arkaplan = EzamanszSktrma('[Link]', '[Link]')
[Link]()
print('Ana program arkaplanda almaya devam ediyor.')
[Link]()
# Arkaplandaki grevin bitmesi bekleniyor
print('Ana program arkaplandaki grev tamamlanana kadar bekledi.')
ok katmanl uygulamalarn balca zorluu, verileri veya baka kaynaklar paylaan
katmanlar koordine etmektir. Bunu kolaylatrmak iin threading modl, kilitler, olaylar,
koul deikenleri ve semaforlar gibi bir dizi temel senkronizasyon aralar sunar.
Bu aralar ne kadar gl olsa da, ufak tasarm hatalar, tespit etmesi g problemlere yol
aabilir. Dolaysyla, grev kooardinasyonuna ilikin tercih edilen yaklam, bir kaynaa btn
eriimi tek bir katmanda toplamak ve teki katmanlardan gelen istemleri queue modl
araclyla bu katmana yollamaktr. Katmanlar aras iletiim ve koordinasyon iin Queue
nesnelerini kullanan uygulamalar daha kolay tasarlanmakta, daha okunakl ve daha gvenilir
olmaktadr.
11.5 Loglama
logging modl, tam teekkll ve esnek bir loglama sistemi sunar. En basit haliyle, log
mesajlar bir dosyaya ya da [Link] gnderilir:
import logging
[Link]('Hata ayklamaya ilikin bilgiler')
[Link]('Bilgi mesaj')
[Link]('Uyar:%s adl ayar dosyas bulunamad', '[Link]')
[Link]('Hata meydana geldi')
[Link]('Kritik hata -- sistem kapatlyor')
Bu kodlar u kty retir:
WARNING:root:Uyar: [Link] adl ayar dosyas bulunamad
ERROR:root:Hata meydana geldi
CRITICAL:root:Kritik hata -- sistem kapatlyor
92
Blm 11. Standart Ktphanede Ksa Bir Gezinti Blm II
Resmi Python 3 Klavuzu, Srm 3
ntanml olarak bilgi ve hata ayklama mesajlar gizlenir ve kt standart hata akna
ynlendirilir. Dier kt seenekleri arasnda mesajlarn, veri iletilerinin, soketlerin [Link]
araclyla veya bir HTTP sunucusuna ynlendirilmesi yer alr. Yeni ltreler, mesaj nceliine
bal olarak farkl ynlendirme yaplar belirlemenizi salar: DEBUG, INFO, WARNING, ERROR, and
CRITICAL.
Loglama sistemi dorudan Python iinden ayarlanabilir veya uygulamay deitirmek zorunda
kalmadan, zelletirilmi loglama ilemleri iin, kullanc tarafndan dzenlenebilen bir ayar
dosyasndan yklenebilir.
11.6 Zayf Atar
Python, otomatik bellek ynetimi uygular (ou nesne iin atf sayma ve dngleri ortadan
kaldrmak iin p toplama) Bellekteki bir nesneye son atf da ortadan kalktktan ksa bir sre
sonra bellek serbest braklr.
Bu yaklam ou uygulamada baaryla iler, ancak kimi zaman nesneleri, ancak baka bir
ey tarafndan kullanlmakta olduunda takip etmek gerekebilir. Ne yazk ki, bu nesneleri
takip etmek, bu nesnelere bir atf oluturaca iin, bu ilem bu nesneleri kalc hale getirir.
te weakref modl, herhangi bir atf oluturmadan nesneleri takip etmeyi salayacak
aralar sunar. Artk nesneye ihtiya kalmadnda, bu nesne zayf atf tablosundan otomatik
olarak karlr ve zayf atf nesneleri iin bir fonksiyon ars tetiklenir. Bu zellii kullanan
uygulamalar arasnda, oluturmas zahmetli olan nbellekleme nesneleri yer alr:
>>> import weakref, gc
>>> class A:
...
def __init__(self, deer):
...
[Link] = deer
...
def __repr__(self):
...
return str([Link])
...
>>> a = A(10)
# bir atf oluturuyoruz
>>> d = [Link]()
>>> d['birinci'] = a
# atf oluturmaz
>>> d['birinci']
# Eer hala canlysa nesneyi getirir
10
>>> del a
# tek atf da siliyoruz
>>> [Link]()
# p toplama ilemini balatyoruz
0
>>> d['birinci']
# e otomatik olarak silinir
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
d['birinci']
# e otomatik olarak silinir
File "C:/python35/lib/[Link]", line 46, in __getitem__
o = [Link][key]()
KeyError: 'birinci'
11.7 Listelerle almaya Ynelik Aralar
Veri yaplarna ilikin ihtiyalarnzn ounu gml liste tipi ile karlayabilirsiniz. Ancak
bazen, performans konusunda farkl getirileri-gtrleri olan alternatif gereklemelere de
ihtiya duyabilirsiniz.
11.6. Zayf Atar
93
Resmi Python 3 Klavuzu, Srm 3
array modl, yalnzca homojen verileri, listelere kyasla daha sk bir ekilde saklayan
array() adl bir nesne sunar. Aadaki rnek, Python int nesnelerinden oluan bildik bir
listedeki her bir e bana 16 bayt yerine, iki baytlk iaretsiz ikili saylar (tip kodu "H") olarak
tutulan bir say dizisi gstermektedir:
>>> from array import array
>>> a = array('H', [4000, 10, 700, 22222])
>>> sum(a)
26932
>>> a[1:3]
array('H', [10, 700])
collections modl, listelere benzeyen, ama ba tarafa e ekleme ve ba taraftan e silme
ilemlerini listelere kyasla daha hzl, ortadan e bakma ilemlerini ise daha yava yapan
bir deque() nesnesi sunar. Bu nesneler, sra yaplarn ve enine aa arama algoritmalarn
gereklemeye gayet uygundur:
>>> from collections import deque
>>> d = deque(["grev1", "grev2", "grev3"])
>>> [Link]("grev4")
>>> print([Link](), "yrtlyor")
grev1 yrtlyor
aranmayan = deque([balang_nodu])
def enine_arama(aranmayan):
nod = [Link]()
for m in gen_moves(node):
if is_goal(m):
return m
[Link](m)
Alternatif liste gereklemelerine ilave olarak, ktphanede ayrca, sral listeleri maniple
etmeye yarayan bisect modl gibi aralar da bulunur:
>>> import bisect
>>> puanlar = [(100, 'perl'), (200, 'tcl'), (400, 'lua'), (500, 'python')]
>>> [Link](puanlar, (300, 'ruby'))
>>> puanlar
[(100, 'perl'), (200, 'tcl'), (300, 'ruby'), (400, 'lua'), (500, 'python')]
heapq modl, bildik listelere dayanarak bek gereklemeyi salayan fonksiyonlara sahiptir.
En dk deerli e her zaman sfr konumunda tutulur. Bu zellik, tekrar tekrar en kk
eye erien, ama tam liste sralamas gerekletirmek istemeyen uygulamalar iin yararldr.
>>> from heapq import heapify, heappop, heappush
>>> veri = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0]
>>> heapify(veri)
# listeyi bek srasna diziyoruz
>>> heappush(veri, -5)
# yeni bir e ekliyoruz
>>> [heappop(veri) for i in range(3)] # en kk eyi getiriyoruz
[-5, 0, 1]
11.8 Ondalk Kayan Nokta Aritmetii
decimal modl, ondalk kayan noktal saylarla aritmetik ilemleri iin Decimal adl bir veri
tipi sunar. Gml float snfnn ikili kayan noktal say gereklemesine kyasla bu snf
94
Blm 11. Standart Ktphanede Ksa Bir Gezinti Blm II
Resmi Python 3 Klavuzu, Srm 3
zellikle unlar iin yararldr:
Mali uygulamalar ve kesin ondalk temsil gerektiren dier kullanmlar * Hassasiyet
zerinde denetim
Hukuki veya kanuni gereklilikleri karlamak iin yuvarlama zerinde kontrol
Grnen ondalk ksmlarn takibi veya
Kullancnn, sonularn elle yaplan hesaplamalarla uyumasn bekledii uygulamalar.
rnein, 70 centlik bir telefon faturas zerine %5 vergi hesaplamas, ondalk kayan noktal
saylarla ikili kayan noktal saylarda birbirinden farkl sonular verir. Eer sonular en yakn
cente yuvarlanrsa bu fark daha belirgin olur:
>>> from decimal import *
>>> round(Decimal('0.70') * Decimal('1.05'), 2)
Decimal('0.74')
>>> round(.70 * 1.05, 2)
0.73
Decimal snfnn ktsnda sondaki sfrlar korunur, bylece iki adet anlaml basamaa
sahip arplanlardan drt adet anlaml basamak otomatik olarak karlr. Decimal modl,
matematik ilemlerini elle yaplm gibi hesaplar ve ikili kayan noktal saylarn ondalk
miktarlar tam olarak temsil edemedii durumlarda ortaya kabilecek sorunlar nler.
Tam temsil, Decimal snfnn lekli hesaplamalar ve ikili kaynak saylar iin uygun olmayan
eitlik testlerini hesaplayabilmesini salar.
>>> Decimal('1.00') % Decimal('.10')
Decimal('0.00')
>>> 1.00 % 0.10
0.09999999999999995
>>> sum([Decimal('0.1')]*10) == Decimal('1.0')
True
>>> sum([0.1]*10) == 1.0
False
decimal modl, gerektii kadar hassasiyetle aritmetik ilemler yaplabilmesini salar.
>>> getcontext().prec = 36
>>> Decimal(1) / Decimal(7)
Decimal('0.142857142857142857142857142857142857')
11.8. Ondalk Kayan Nokta Aritmetii
95
BLM 12
Sanal Ortamlar ve Paketler
12.1 Giri
Python uygulamalar, standart ktphanede bulunmayan paketler ve modllerden sklkla
faydalanacaktr. Uygulamalar bazen bir ktphanenin belirli bir srmne ihtiya duyar,
nk bu uygulamalarn alabilmesi iin belirli bir hatann giderilmi olmas gerekiyordur
veya bu uygulamalar ktphane arayznn eski bir srm kullanlarak yazlmtr.
Bu durum, tek bir Python kurulumunun btn uygulamalarn gereksinimlerine cevap
veremeyebileceini gstermektedir. Eer A uygulamas belirli bir modln 1.0 srmne
ihtiya duyuyor, ama B uygulamas ayn modln 2.0 srmne ihtiya duyuyorsa, bu
durumda gereklilikler birbiriyle akacak ve modln 1.0 veya 2.0 srmnn kurulmas
uygulamalardan birinin alamaz hale gelmesine yol aacaktr.
Bu sorunun zm, Pythonn belirli bir srm ile birlikte ilave baz paketlerin de kurulu
olduu, kendi iinde bamsz bir dizin yapsna sahip bir sanal ortam (ngilizcede genellikle
ksaca virtualenv denir) oluturmaktr.
Bu ekilde, farkl uygulamalar farkl sanal ortamlar kullanabilir. Biraz nce verdiimiz akan
gereklilikler rneinde bir zme ulamak iin, uygulama A, ilgili modln 1.0 srmnn
kurulu olduu, kendine ait bir sanal ortam iinde alrken, uygulama B de ayn modln 2.0
srmn ieren baka bir sanal ortamda alabilir. Eer uygulama B, ilgili ktphanenin 3.0
srmne ykseltilmesini gerektirirse, bu durum uygulama Ann iinde bulunduu ortam
etkilemeyecektir.
12.2 Sanal Ortamlar Oluturmak
Sanal ortamlar oluturmak ve bu ortamlar ynetmek iin kullanlan betiin ad pyvenvdir.
pyvenv genellikle sisteminizdeki en yeni Python srmn kullanacaktr. Bu betik ayn
zamanda srm numaras da ierdii iin, eer sisteminizde birden fazla Python srm
varsa, pyvenv-3.4 veya istediiniz baka bir srm altrarak belirli bir Python srmn
de seebilirsiniz.
Bir sanal ortam oluturmak iin, bu ortam hangi dizine yerletireceinize karar verin ve
pyvenv komutunu o dizin yoluyla birlikte altrn:
pyvenv kilavuz-ort
Bu komut, eer yoksa kilavuz-ort adl bir dizin ile birlikte, Python yorumlaycsnn, standart
ktphanenin ve eitli destekleyici dosyalarn bir kopyasn ieren alt dizinler oluturacaktr.
96
Resmi Python 3 Klavuzu, Srm 3
Bir sanal ortam oluturduktan sonra bunu etkinletirmeniz gerekir.
Bunun iin Windowsta u komutu kullanyoruz:
kilavuz-ort/Scripts/activate
Unix ve MacOS zerinde ise unu:
source kilavuz-ort/bin/activate
(Bu betik bash kabuu iin yazlmtr. Eer csh veya fish kabuklarn kullanyorsanz,
yukardaki yerine [Link] ve [Link] gibi alternatieri kullanmalsnz.)
Sanal ortam etkinletirildikten sonra komut satrnz, hangi sanal ortam kullandnz
gsterecek ekilde deiiklie urayacak ve python komutu verdiinizde sanal ortam iine
kurulan zel Python srm almaya balayacaktr. Mesela:
-> source ~/ortamlar/kilavuz-ort/bin/activate
(kilavuz-ort) -> python
Python 3.4.3+ (3.4:c7b9645a6f35+, May 22 2015, 09:31:25)
...
>>> import sys
>>> [Link]
['', '/usr/local/lib/[Link]', ...,
'~/ortamlar/kilavuz-ort/lib/python3.4/site-packages']
>>>
12.3 Paketleri pip ile Ynetmek
Bir sanal ortam etkinletirdikten sonra, pip adl bir program yardmyla paketleri
kurabilir, gncelleyebilir ve kaldrabilirsiniz.
pip program, ntanml olarak,
<[Link] adresinde yer alan Python Paket Dizinindeki paketleri
kurar. Python Paket Dizinine web taraycnz araclyla gz atabilir veya pipin snrl arama
zelliini kullanabilirsiniz:
(kilavuz-ort) -> pip search astronomy
skyfield
- Elegant astronomy for Python
gary
- Galactic astronomy and gravitational dynamics.
novas
- The United States Naval Observatory NOVAS astronomy library
astroobs
- Provides astronomy ephemeris to plan telescope observations
PyAstronomy
- A collection of astronomy related tools for Python.
...
pip birka alt komuta da sahiptir: search (arama), install (kurma), uninstall (kaldrma),
freeze (zel listeleme), vb. (pip hakknda eksiksiz bir klavuz iin Python Modllerinin
Kurulmas balkl blme baknz).
Bir paketin en yeni srmn, o paketin ismini belirterek kurabilirsiniz:
-> pip install novas
Collecting novas
Downloading [Link] (136kB)
Installing collected packages: novas
Running [Link] install for novas
Successfully installed novas-[Link]
12.3. Paketleri pip ile Ynetmek
97
Resmi Python 3 Klavuzu, Srm 3
Bir paket isminin ardndan == iaretini ve srm numarasn belirterek bir paketin belirli bir
srmn de kurabilirsiniz:
-> pip install requests==2.6.0
Collecting requests==2.6.0
Using cached [Link]
Installing collected packages: requests
Successfully installed requests-2.6.0
Eer bu komutu tekrar altrrsanz, pip talep ettiiniz srmn zaten kurulu olduunu
farkedecek ve herhangi bir ilem yapmayacaktr. Farkl bir srm numaras belirterek o
srm kurabilir veya pip install --upgrade komutu ile, ilgili paketi en son srmne
gncelleyebilirsiniz:
-> pip install --upgrade requests
Collecting requests
Installing collected packages: requests
Found existing installation: requests 2.6.0
Uninstalling requests-2.6.0:
Successfully uninstalled requests-2.6.0
Successfully installed requests-2.7.0
pip uninstall komutu bir veya birden fazla paket ad ile birlikte kullanldnda, belirtilen
paketler sanal ortamdan kaldrlacaktr.
pip show komutu, belirli bir paket hakknda bilgi grntlemenizi salar:
(kilavuz-ort) -> pip show requests
--Metadata-Version: 2.0
Name: requests
Version: 2.7.0
Summary: Python HTTP for Humans.
Home-page: [Link]
Author: Kenneth Reitz
Author-email: me@[Link]
License: Apache 2.0
Location: /Users/akuchling/ortamlar/kilavuz-ort/lib/python3.4/site-packages
Requires:
pip list komutu, sanal ortamda kurulu btn paketleri gsterecektir:
(kilavuz-ort) -> pip list
novas ([Link])
numpy (1.9.2)
pip (7.0.3)
requests (2.7.0)
setuptools (16.0)
pip freeze komutu da kurulu paketlere ilikin benzer bir liste retecek, ancak bu komut
pip list komutundan farkl olarak, pip install komutu ile birlikte kullanlmaya msait
bir biime sahip kt verecektir. Bu listenin bir [Link] dosyasna gnderilmesi
yaygn bir uygulamadr:
(kilavuz-ort) -> pip freeze > [Link]
(kilavuz-ort) -> cat [Link]
novas==[Link]
98
Blm 12. Sanal Ortamlar ve Paketler
Resmi Python 3 Klavuzu, Srm 3
numpy==1.9.2
requests==2.7.0
Daha sonra bu [Link] dosyasn srm kontrol sisteminize gnderip,
uygulamanzn bir paras olarak databilirsiniz. Bylece kullanclarnz gerekli btn
paketleri install -r komutuyla kurabilir:
-> pip install -r [Link]
Collecting novas==[Link] (from -r [Link] (line 1))
...
Collecting numpy==1.9.2 (from -r [Link] (line 2))
...
Collecting requests==2.7.0 (from -r [Link] (line 3))
...
Installing collected packages: novas, numpy, requests
Running [Link] install for novas
Successfully installed novas-[Link] numpy-1.9.2 requests-2.7.0
pip daha pek ok seenee sahiptir. pipe ilikin eksiksiz bir belgelendirme iin Python
Modllerinin Kurulmas balkl blme baknz. Bir paket yazp bu paketi Python Paket
Dizini araclyla sunmak isterseniz, Python Modllerinin Datlmas balkl klavuza
bavurabilirsiniz.
12.3. Paketleri pip ile Ynetmek
99
BLM 13
Ya imdi?
Bu klavuzu okuduktan sonra herhalde Python kullanmaya olan ilginiz pekimitir. yle
ki, Python gerek hayatta karlatnz sorunlar zmede kullanmak iin sabrszlanyor
olmalsnz. Peki Python hakknda daha fazla bilgi edinmek iin acaba buradan sonraki
duranz neresi olmal?
Bu klavuz, Python belgelerini ieren kmenin bir parasdr. Bu kmedeki baka belgelerse
unlardr:
Pythonn Standart Ktphanesi:
Standart ktphane iindeki veri tipleri, fonksiyonlar ve modller hakknda eksiksiz
(ama ksa ve z) referans materyalleri sunan bu klavuza mutlaka gz atn. Standart
Python datm iinde pek ok ilave kod bulunur. Unix posta kutularn okumak, HTTP
ile belgeleri almak, rastgele saylar retmek, komut satr seeneklerini ayrtrmak, CGI
programlar yazmak, veri sktrmak ve daha baka pek ok grev iin modller bulunur.
Ktphane Referansna gz gezdirmek elinizdeki imkanlara dair size bir kir verecektir.
Python Modllerinin Kurulmas blmnde, baka Python kullanclar tarafndan
yazlm ilave modllerin nasl kurulacana dair bilgiler bulacaksnz.
Pythonn Dil Referans: Bu blmde Pythonn sz dizimi ve anlam yaps hakknda
ayrntl aklamalar yer alr. Ar bir metin olsa da, dilin kendisine dair eksiksiz bir
klavuz olmas bakmndan faydaldr.
Baka Python kaynaklar:
[Link] Resmi Python Web Sitesi. Bu adreste, Python kodlar, belgeleri
ve internetteki Pythona ilikin sayfalara balantlar bulacaksnz. Bu web sitesi,
Avrupa, Japonya ve Avustralya gibi dnyann pek ok blgesinde yanslara sahiptir.
Bulunduunuz cora konuma bal olarak, yanslar ana siteden daha hzl olabilir.
[Link] Python belgelerine hzl eriim.
[Link] Python Paket Dizini.
nceleri Peynir Dkkan olarak
isimlendirilen bu site, kullanclar tarafndan oluturulmu, indirilebilir Python
modllerini ieren bir dizindir. Kodlarnz yaymlamak istediinizde bunlar burada
kaydettirebilirsiniz. Bylece bakalar da kodlarnz bulabilir.
[Link]
The Python Cookbook; kod
rnekleri, byk modller ve faydal betiklerden oluan geni bir koleksiyondur Dikkati
eken kod katklar yine Python Cookbook adn tayan bir kitapta toplanmtr.
(OReilly & Associates, ISBN 0-596-00797-3.)
100
Resmi Python 3 Klavuzu, Srm 3
[Link] sitesi, konferanslar ve kullanc grubu toplantlarndaki Pythona
ilikin videolara balantlar ierir.
[Link] Bilimsel Python projesi; hzl dizi hesaplamalar ve maniplasyonu
art lineer cebir, Fourier dnmleri, non-lineer zcler, rastgele say dalmlar,
istatistik analiz ve benzeri konularda paketler ierir.
Pythona ilikin sorularnz ve sorun bildirimleriniz iin, [Link] adl haber grubuna
yazabilir veya bunlar python-list@[Link] adresindeki posta listesine gnderebilirsiniz.
Haber grubu ve posta listesi aa aktr, dolaysyla bir kiiye yolladnz mesajlar otomatik
olarak brlerine de gidecektir. Burada hergn yzlerce mesaj gnderilmekte, sorular
sorulmakta (ve cevaplar verilmekte), yeni zellikler talep edilmekte ve yeni modller
duyurulmaktadr. Posta listesi arivlerine [Link] adresinden
ulaabilirsiniz.
Buraya mesaj gndermeden nce Sk Sorulan Sorular listesine (SSS) mutlaka gz gezdirin.
SSSde tekrar tekrar sorulan sorular cevaplandrlm olduundan, soracanz sorunun
cevabn burada da bulabilirsiniz.
101
BLM 14
Etkileimli Girdi Dzenleme ve Eski Kodlar Getirme
Korn kabuu ve GNU Bash kabuundakine benzer ekilde Python yorumlaycsnn baz
srmleri mevcut girdi satrn dzenlemeyi ve gemi eleri deitirmeyi destekler. Bu
zellik, eitli dzenleme tarzlarn destekleyen GNU Readline ktphanesi kullanlarak
gereklenmitir. Bu ktphanenin kendine ait bir klavuzu var, o yzden bu klavuzun ieriini
burada tekrarlamayacaz.
14.1 Kod Tamamlama ve Eski Kodlar Dzenleme
Deiken ve modl ismi tamamlama ilevi, bu ilev Tab tuu kullanlarak yerine getirilecek
ekilde, yorumlayc balatldnda otomatik olarak etkinletirilir. Bu ilev iin Python deyim
isimlerine, mevcut lokal deikenlere ve mevcut modl adlarna baklr. karakter_dizisi.a
gibi noktal ifadelerde ifade en son "." iaretine kadar iletilir ve ardndan elde edilen
nesnenin niteliklerine baklarak tamamlama nerilir. Eer ifadenin iinde __getattr__()
metoduna sahip bir nesne varsa, bu zellik, uygulama tarafndan tanmlanan bir kodu
yrtebilir. Ayrca ntanml yaplandrmaya gre, kod gemii, kullanc dizini altndaki
.python_history adl bir dosyaya yazlr. Bu gemi, etkileimli yorumlaycnn bir sonraki
oturumunda da kullanlabilir durumda olacaktr.
14.2 Etkileimli Kabuun Alternatieri
Bu kolaylk, yorumlaycnn eski srmleriyle karlatrldnda ileriye doru atlm
muazzam bir admdr.
Ancak olmas gereken baka eyler de yok deil: rnein
devam satrlarnda uygun miktarda girintileme kendiliinden yaplabilse ho olurdu
(ayrtrc bir sonraki admda girinti gerekip gerekmediini anlayabiliyor). Kod tamamlama
mekanizmasnda yorumlaycnn simge tablosundan faydalanlabilir. Kapan parantezlerini,
trnak iaretlerini, vb. kontrol eden (hatta neren) bir komut da faydal olabilirdi.
Uzun bir sredir ortalkta olan gelimi bir alternatif etkileimli yorumlayc IPythondr.
Bu ara, sekme ile kod tamamlama, nesne inceleme ve gelimi gemi ynetimi gibi
zellikler barndrr. Ayrca, IPython batan aa zelletirilebilir ve baka uygulamalara da
ilitirilebilir. Bir baka benzer gelimi etkileimli ortam da bpythondr.
102
BLM 15
Kayan Noktal Saylarla Aritmetik lemler: Sorunlar ve
Kstlamalar
Kayan noktal saylar bilgisayar donanmnda 2 tabanl (ikili) kesirler olarak temsil edilir.
rnein u onlu kesir:
0.125
1/10 + 2/100 + 5/1000 deerine, ayn ekilde u ikili kesir ise
0.001
0/2 + 0/4 + 1/8 deerine sahiptir. Bu iki kesirin deerleri eittir. Bunlarn arasndaki tek gerek
fark, ilkinin 10 tabanndaki kesirli gsterime gre, ikincisinin ise 2 tabanndakine gre yazlm
olmasdr.
Ne yazk ki ou onlu kesir, ikili kesir olarak tam anlamyla temsil edilemez. Bunun bir sonucu
olarak, girdiiniz onlu kayan noktal saylar, bilgisayarda depolanan asl ikili kayan noktal
saylar tarafndan genellikle ancak yaklak olarak temsil edilebilir.
Bu problemi ilk olarak 10 tabannda anlamak daha kolaydr. 1/3 kesirine bakalm. Bunu 10
tabanl bir kesir biiminde yaklak olarak yle temsil edebilirsiniz:
0.3
ya da daha iyisi,
0.33
ya da daha iyisi,
0.333
bu byle devam eder gider... Ne kadar hane eklerseniz ekleyin, sonu asla tam olarak 1/3
olmayacak, ama her defasnda 1/3e biraz daha yaklaan bir say elde edilecektir.
Ayn ekilde 2 tabannda ka hane eklerseniz ekleyin, onlu 0.1 deeri 2 tabanl bir kesir
olarak tam anlamyla temsil edilemeyecektir. 2 tabannda 1/10 sonsuza kadar tekrar eden
bir kesirdir:
0.0001100110011001100110011001100110011001100110011...
Hangi bitte durursanz durun elde ettiiniz ey yaklak bir deer olacaktr. Bugnk
makinelerin ounda kayan noktal saylar, pay en anlaml bitten balayarak ilk 53 biti
kullanacak ekilde ve payda ise ikinin kuvveti olacak ekilde ikili bir kesir kullanlmak suretiyle
103
Resmi Python 3 Klavuzu, Srm 3
yaklak olarak hesaplanr. 1/10 rneinde, ikili kesir 3602879701896397 / 2 ** 55 olup,
1/10un gerek deerine ok yakndr, ama yine de tam olarak eit deildir.
Pek ok kullanc, deerlerin gsterili ekli nedeniyle bu hesaplamann yaklak olduunun
farknda deildir. Python, makine tarafndan depolanan yaklak ikili deerin gerek ondalk
deerine yakn bir ondalk say basar. Eer Python 0.1 iin depolanan yaklak ikili deerin
gerek ondalk deerini basacak olsayd, ou makinede yle bir gsterimi tercih etmesi
gerekecekti:
>>> 0.1
0.1000000000000000055511151231257827021181583404541015625
Ancak bu kt, ou kimse asndan haddinden fazla basamak ieriyor. Bu nedenle Python
byle bir durumda yuvarlak bir deer gstererek basamak saysnn makul dzeyde kalmasn
salar:
>>> 1 / 10
0.1
Ancak unutmayn, ekranda grnen sonu 1/10un tam deeriymi gibi dursa da aslnda
depolanan deer temsil edilebilen en yakn ikili kesirdir.
lgin bir ekilde, ayn en yakn ikili kesiri paylaan farkl pek ok onlu say vardr. rnein, 0.1,
0.10000000000000001 ve 0.1000000000000000055511151231257827021181583404541015625
saylarnn hepsinin yaklak deeri 3602879701896397 / 2 ** 55 saysdr.
Bu onlu
deerlerin hepsi ayn yaklak deere paylat iin, eval(repr(x)) == x sabiti muhafaza
edilerek bunlarn herhangi biri grntlenebilir.
Gemite Python komut istemcisi ve gml repr() fonksiyonu 17 anlaml basamaa sahip
olan 0.10000000000000001 deerini tercih ediyordu. Ama artk Python, 3.1 srmnden bu
yana (ou sistemde) bunlarn en ksasn seip 0.1 deerini grntleyebiliyor.
Bu zellik aslnda ikili kayan noktal saylarn doasnda olan bir eydir. Yani bu Pythondan
kaynaklanan bir kusur (bug) deildir, ayn zamanda bu sizin kodunuzdan kaynaklanan bir
kusur da deildir. Kayan noktal saylarla aritmetik ilemler yapabilen donanm paralarn
destekleyen btn dillerde ayn eyi grrsnz (baz diller fark ntanml olarak veya en
azndan btn kt kiplerinde grntlemiyor olsa bile).
Gze daha ho grnen bir kt iin, snrl sayda anlaml basamak retmek amacyla
karakter dizisi biimlendirmeden yararlanabilirsiniz:
>>> format([Link], '.12g')
'3.14159265359'
# 12 anlaml basamak verir
>>> format([Link], '.2f')
'3.14'
# noktadan sonra 2 basamak verir
>>> repr([Link])
'3.141592653589793'
Aslnda bunun dpedz bir yanlsama olduunu kavramak nemlidir. Yaptnz ey, gerek
makine deerinin grntsn yuvarlamaktan baka bir ey deildir.
Bir yanlg baka bir yanlgnn kapsn aralar. rnein, 0.1 aslnda tam olarak 1/10 olmad
iin, adet 0.1 deerini toplamak da tam olarak 0.3 deerini vermeyecektir:
>>> .1 + .1 + .1 == .3
False
104
Blm 15. Kayan Noktal Saylarla Aritmetik lemler: Sorunlar ve Kstlamalar
Resmi Python 3 Klavuzu, Srm 3
Ayrca 0.1, 1/10un gerek deerine yaklaamad iin, 0.3 de 3/10un gerek deerine
yaklaamaz.
Dolaysyla round() fonksiyonu yardmyla ilgili deeri ilem ncesinde
yuvarlamak fayda etmeyecektir:
>>> round(.1, 1) + round(.1, 1) + round(.1, 1) == round(.3, 1)
False
Saylar arzu edilen kesin deerlerine yaklatrlamasa da round() fonksiyonu kullanlarak
ilem sonras yuvarlama yaplabilir ve bylece kesin olmayan deerler birbirleriyle
karlatrlabilir:
>>> round(.1 + .1 + .1, 10) == round(.3, 10)
True
kili kayan noktal aritmetik ilemlerin byle daha pek ok artc yn vardr. 0.1 deeri
ile ilgili problem aada Temsil Hatas blmnde btn ayrntlaryla anlatlmtr. Sklkla
karlalan baka artc eylere ilikin daha btnlkl bir anlatm iin The Perils of Floating
Point adl makaleyi inceleyebilirsiniz.
Makalenin sonlarna doru ifade edildii gibi, bu durumun basit bir zm yoktur. Ama siz
yine de lzumsuz yere kayan noktal saylardan rkmeyin! Pythondaki kayan noktal ilemlere
dair hatalar kayan noktal saylara ilikin donanmdan miras alnmtr ve bu hatalar ou
makinede ilem bana 2**53te 1den fazla deildir. ou grev iin bu kadar hassasiyet
yeter de artar bile, ancak yle ya da byle, bunun onlu aritmetik olmadn ve btn
kayan noktal ilemlerin yeni bir yuvarlama hatasndan muzdarip olabileceini aklmzdan
karmamalyz.
Srad vakalar bulunsa da, kayan noktal aritmetiin kullanmna ilikin ou gndelik
durumda, nihai sonularnzn grnmn, istediiniz onlu basamaa sahip olacak ekilde
yuvarlarsanz beklediiniz kty elde edebilirsiniz. Genellikle str() yetecektir. Daha ince
ayar iin ise Biimlendirme Dizilerinin Sz Dizimi iinde anlatlan, [Link]() metodunun
biim dzenleyicilerini inceleyebilirsiniz.
Kesin onlu temsil gerektiren durumlarda, onlu aritmetii muhasebe uygulamalar ve
yksek kesinlik isteyen uygulamalara uygun olacak ekilde gerekleyen decimal modln
kullanabilirsiniz.
Kesin aritmetiin bir baka biimi de fractions modl araclyla desteklenir. Bu modlde
aritmetik ilemleri, rasyonel saylara dayanlarak gereklenir (dolaysyla 1/3 gibi saylar kesin
olarak temsil edilebilir).
Eer siz kayan noktal say ilemlerini youn bir biimde kullanyorsanz, Nmerik Python
paketine ve SciPy projesi ile birlikte gelen matematik ve istatistik ilemlere ilikin dier
paketlere gz atabilirsiniz. Bkz. <[Link]
Python, bir kayan noktal saynn kesin deerini gerekten bilmeniz gereken nadir durumlar
iin size yardmc olabilecek aralar sunar. float.as_integer_ratio() metodu bir kayan
noktal saynn deerini bir kesir olarak ifade eder:
>>> x = 3.14159
>>> x.as_integer_ratio()
(3537115888337719, 1125899906842624)
Oran kesin olduu iin, bu deer zgn deeri kaypsz olarak yeniden oluturmak iin
kullanlabilir:
105
Resmi Python 3 Klavuzu, Srm 3
>>> x == 3537115888337719 / 1125899906842624
True
[Link]() metodu kayan noktal saylar onaltl dzende (16 taban) ifade eder ve
bilgisayarda depolanan kesin deeri verir.
>>> [Link]()
'0x1.921f9f01b866ep+1'
Bu hassas onaltl temsil, kayan noktal sayy kesin olarak yeniden meydana getirmek iin
kullanlabilir:
>>> x == [Link]('0x1.921f9f01b866ep+1')
True
Temsil kesin olduu iin, bu yntemler, deerleri farkl Python srmleri arasnda gvenilir
bir ekilde tamak (platform bamszl) ve ayn biimi destekleyen baka dillerle (Java ve
C99 gibi) verileri paylaabilmek asndan faydaldr.
Baka bir faydal ara da [Link]() fonksiyonudur. Bu fonksiyon toplama ilemi srasnda
hassasiyet kaybn azaltmaya yardmc olur. Ayrca deerler byyen toplama eklendike
kayp basamaklar takip eder. Bu fonksiyon, hatalarn son toplam etkileyecek kadar
ylmasn engelledii iin, genel doruluk dzeyini artrabilir.
>>> sum([0.1] * 10) == 1.0
False
>>> [Link]([0.1] * 10) == 1.0
True
15.1 Temsil Hatas
Bu blmde, 0.1 rnei ayrntl olarak aklanacak ve buna benzer durumlara ilikin
kesinlik analizlerini kendi kendinize nasl yapacanz gsterilecektir. kili kayan noktal temsil
konusunu, temel olarak bildiiniz varsaylmtr.
Temsil hatas ; baz (aslnda ou) onlu kesirlerin ikili (2 taban) kesir olarak tam temsil
edilemeyecei gereini ifade eder. Pythonn (veya Perl, C, C++, Java, Fortran ve pek ok
baka dilin) beklediiniz tam onlu sayy ounlukla gsterememesinin balca sebebi budur.
Peki ama neden? 1/10, ikili bir kesir olarak tam temsil edilemez. Bugnk hemen hemen
btn makineler (Kasm 2000) IEEE-754te tarif edilen kayan noktal aritmetii kullanr
ve hemen hemen btn platformlar Pythonn kayan noktal saylarn IEEE-754deki ift
hassasiyete eletirir. 754 ift, 53 bitlik hassasiyet ierir. Dolaysyla bilgisayar, girilen deeri,
J /2**N olacak ekilde 0.1i en yakn kesire dntrmeye altrr (burada J tam olarak 53
bitten oluan bir tam saydr.) Aadaki kodu
1 / 10 ~= J / (2**N)
yle yazdmzda:
J ~= 2**N / 10
ve J nin tam tamna 53 bit ierdii dnldnde (>= 2**52 ama < 2**53), N iin en iyi
deer 56 olacaktr:
106
Blm 15. Kayan Noktal Saylarla Aritmetik lemler: Sorunlar ve Kstlamalar
Resmi Python 3 Klavuzu, Srm 3
>>> 2**52 <=
True
2**56 // 10
< 2**53
Yani, J yi tam 53 bit ile brakan tek N deeri 56dr. Bu durumda J iin en olas deer ise
yuvarlanan blm olur:
>>> q, r = divmod(2**56, 10)
>>> r
6
Kalan, 10un yarsndan fazla olduu iin, en iyi yaklak deer yuvarlama ile elde edilebilir:
>>> q+1
7205759403792794
Dolaysyla 1/10un 754 ift hassasiyet dahilinde en olas yaklak deeri udur:
7205759403792794 / 2 ** 56
Hem blneni hem de bleni ikiye blmek kesiri aadaki deere sadeletirecektir:
3602879701896397 / 2 ** 55
Ancak biz burada yuvarlama ilemi yaptmz iin, bu deer 1/10dan birazck byk olacaktr.
Eer yuvarlamasaydk blm 1/10dan birazck daha kk olacakt. Ancak hibir koulda tam
olarak 1/10 olamayacakt!
Dolaysyla bilgisayar 1/10u asla grmez: Aslnda grd ey, tam olarak yukarda verilen
kesirdir. Yani 754 ift hassasiyet iin olabilecek en yakn deer.
>>> 0.1 * 2 ** 55
3602879701896397.0
Eer biz kesiri 10**55 ile arparsak, sonucu 55 onlu basamaa kadar grebiliriz:
>>> 3602879701896397 * 10 ** 55 // 2 ** 55
1000000000000000055511151231257827021181583404541015625
Bu, bilgisayarda depolanan gerek saynn 0.1000000000000000055511151231257827021181583404541015
onlu deerine eit olduu anlamna gelmektedir. Pek ok dil, tam onlu deeri grntlemek
yerine (Pythonn eski srmleri de dahil), sonucu 17 anlaml basamaa yuvarlar.
>>> format(0.1, '.17f')
'0.10000000000000001'
fractions ve decimal modlleri bu hesaplamalar kolaylatrr:
>>> from decimal import Decimal
>>> from fractions import Fraction
>>> Fraction.from_float(0.1)
Fraction(3602879701896397, 36028797018963968)
>>> (0.1).as_integer_ratio()
(3602879701896397, 36028797018963968)
>>> Decimal.from_float(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')
15.1. Temsil Hatas
107
Resmi Python 3 Klavuzu, Srm 3
>>> format(Decimal.from_float(0.1), '.17')
'0.10000000000000001'
108
Blm 15. Kayan Noktal Saylarla Aritmetik lemler: Sorunlar ve Kstlamalar
BLM 16
Ek
16.1 Etkileimli Kip
16.1.1 Hata Yakalama
Yorumlayc, bir hata olutuunda ekrana bir hata mesaj ile birlikte bir yn izi (stack trace)
basar. Daha sonra, eer etkileimli kipte iseniz, birincil komut istemine dner. Eer girdi bir
dosyadan geliyorsa, yn izini ekrana bastktan sonra sfr harici bir k durumu vererek
kapanr. (try deyimleri iindeki except cmlecikleri tarafndan yakalanan istisnalar bu
balamda birer hata olarak deerlendirilmez.) Baz hatalar ise mutlak surette lmcldr
ve sfr harici bir k durumu vererek programn kapanmasna yol aar. Byle bir ey,
programn ileyiinden kaynaklanan bir tutarszlk olumas halinde ve bellek yetersizliinden
kaynaklanan baz durumlarda ortaya kar. Btn hata mesajlar standart hata akna yazlr.
Yrtlen komutlardan gelen normal ktlar ise standart ktya gnderilir.
Birincil veya ikincil komut isteminde kesme karakterinin (genellikle Control-C veya Delete)
verilmesi girdiyi iptal eder ve birincil komut istemine dnlmesini salar. Kesme karakterinin
bir komutun ileyii esnasnda verilmesi KeyboardInterrupt adl istisnay tetikler. Bu istisna
try deyimleri yardmyla yakalanabilir.
16.1.2 altrlabilir Python Betikleri
BSD benzeri Unix sistemlerinde Python betikleri, tpk kabuk betikleri gibi, betiin en bana
#!/usr/bin/env python3.5
satrnn yerletirilip dosyaya altrma yetkisinin verilmesi ile dorudan altrlabilir
hale getirilebilir (burada yorumlaycnn, kullancya ait PATH deikeni iinde yer aldn
varsayyoruz). Dosyann ilk iki karakteri #! olmaldr. Baz platformlarda ilk satr, Windows
tarz satr sonu (\r\n) ile deil de, Unix tarz satr sonu ile (\n) bitmek zorundadr. Diyez
veya kare adl karakter (#) Pythonda yorum satrlarnn banda da kullanlr.
chmod komutu kullanlarak betie altrma kipi veya izni verilebilir.
$ chmod +x betik_adi.py
Windows sistemlerinde altrma kipi diye bir kavram bulunmaz. Python kurulum program
.py dosyalarn otomatik olarak [Link] ile ilikilendirir, bylece Python dosyalarna ift
tkladnzda bu dosya bir betik olarak altrlr. Dosya uzants .pyw de olabilir. Bu
durumda, normal artlarda arkaplanda beliren komut penceresi grnmez.
109
Resmi Python 3 Klavuzu, Srm 3
16.1.3 Etkileimli Balang Dosyas
Python etkileimli bir ekilde kullanrken, yorumlaycnn her alnda baz standart
komutlarn yrtlmesini salamak ou durumda ilerinizi kolaylatrabilir. Bu i iin,
PYTHONSTARTUP adl bir evre deikeninin deerini, ihtiya duyduunuz balang komutlarn
ieren bir dosya ad olacak ekilde ayarlayabilirsiniz. Unix kabuklarndaki .profile zelliine
benzer bir eydir bu.
Bu dosya, Python komutlarnn bir betikten okunduu ve komut kayna olarak /dev/ttynin
aka belirtildii durumlarda deil, yalnzca etkileimli oturumlarda okunacaktr (eer
/dev/tty aka belirtilmezse etkileimli oturumda olduunuz varsaylacaktr).
Dosya,
etkileimli komutlar ile ayn isim alan iinde yrtlr. Bylece bu dosya iinde tanmlanan
veya ie aktarlan nesneler, etkileimli kabukta bu dosyann adn belirtmeye gerek olmadan
kullanlabilecektir. Bu dosya araclyla ayrca sys.ps1 ve sys.ps2 olarak belirtilen istemcileri
de deitirebilirsiniz.
Mevcut dizin iindeki baka bir balang dosyasn da okumak istiyorsanz,
bu isteinizi global balang dosyasnda if [Link](.[Link]):
exec(open(.[Link]).read()) gibi bir kod yardmyla yerine getirebilirsiniz. Eer
balang dosyanz bir betik iinde kullanmak istiyorsanz, bunu betik iinde aka
belirtmelisiniz:
import os
dosya_ad = [Link]('PYTHONSTARTUP')
if dosya_ad and [Link](dosya_ad):
with open(dosyad) as fobj:
balang_dosyas = [Link]()
exec(balang_dosyas)
16.1.4 zelletirme Modlleri
Python, kendisini zelletirebilmeniz iin sitecustomize ve usercustomize adl iki adet kanca
(hook) sunar size. Bunlarn nasl altn grmek iin, ncelikle kullancya ait site-packages
dizininin yerini tespit etmeniz gerekir. Bunun iin Python balatp u komutu verin:
>>> import site
>>> [Link]()
'/home/user/.local/lib/python3.5/site-packages'
Artk bu dizin iinde [Link] adl bir dosya oluturabilir, iine istediiniz her eyi
koyabilirsiniz. Bu dosya, yorumlaycy -s seenei ile balatarak otomatik ie aktarma
zelliini devre d brakmadnz srece Python her altnda devreye girecektir.
sitecustomize dosyas da ayn ekilde iler, ancak bu dosya genellikle bilgisayarn yneticisi
tarafndan, sistem genelini etkileyen site-packages dizini iinde oluturulur ve usercustomize
dosyasndan nce ie aktarlr.
Daha fazla ayrnt iin site modlnn belgelerine
bakabilirsiniz.
110
Blm 16. Ek
Dizin
-> (dn aklamalarnda deer atama PATH, 44, 109
Python yiletirme nerileri
iareti), 27
PEP 3147, 45
evre deikeni
PEP 484, 27
PATH, 44, 109
PEP 8, 28
PYTHONPATH, 44, 46
PYTHONPATH, 44, 46
PYTHONSTARTUP, 110
PYTHONSTARTUP, 110
__all__, 49
aklamalar
fonksiyon, 27
arama
yolu, modl, 44
tarz
kodlama, 28
yolu
modl arama, 44
belge dizileri, 21, 27
belgelendirme dizileri, 21, 27
deyim: *, 25
deyim: **, 26
deyim: for, 17
fonksiyon
aklamalar, 27
gml: help, 83
gml: open, 55
json
modl, 58
karakter dizileri, belgelendirme, 21, 27
kodlama
tarz, 28
modl
arama yolu, 44
modl: builtins, 47
modl: sys, 46
modl
json, 58
nesne: dosya, 55
nesne: metot, 72
111