Professional Documents
Culture Documents
Srm 3.x
Frat zgl
20/07/2012
IINDEKILER
Temel Bilgiler
1.1
1.2
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3
FreeBSD'de Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.4
1.5
1.6
. . . . . . . . . . . . . . . . . . . . . . . .
1.7
Deikenler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.8
. . . . . . . . . . . . . . . . . . . . . . . . . .
1.9
. . . . . . . . . . . . . . . . . . . . . . . . . .
1.10
Python'da lk rnekler... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.11
2
5
7
8
11
13
15
18
19
22
29
35
2.1
Giri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2
if deyimi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3
elif deyimi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.4
else deyimi
2.5
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
35
38
40
43
49
3.1
3.2
3.3
range() Fonksiyonu
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Listeler
4.1
Giri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2
Listeleri Tanmlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.3
50
55
57
60
60
60
61
i
4.4
len() Fonksiyonu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.5
4.6
4.7
Listelerin Metotlar
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Demetler (Tuples)
86
5.1
Demetleri Tanmlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2
5.3
Demetlerin Metotlar
5.4
5.5
. . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Szlkler
Szlkleri Tanmlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.2
Szlklerin Metotlar
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Kmeler
97
99
112
7.1
Kme Oluturmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.2
Kmelerin Metotlar
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Hata Yakalama
112
114
125
125
129
. 130
. 131
. 132
. 134
. 134
. 135
8.1
try... except...
8.2
break Deyimi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.3
pass Deyimi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.4
continue Deyimi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.5
else... nally...
8.6
except... as... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.7
raise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.8
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Genel Tekrar
137
137
. 139
. 141
. 142
. 144
. 145
. 150
. 152
. 153
. 155
. 157
. 160
. 163
9.1
9.2
print() Fonksiyonunun Gc . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.3
9.4
9.5
9.6
9.7
9.8
9.9
9.10
9.11
9.12
enumerate() Fonksiyonu
9.13
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10 Fonksiyonlar
ii
87
90
91
92
93
97
6.1
10.1
65
71
73
74
Fonksiyon Tanmlamak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
169
169
10.2
Fonksiyonlarn Parametreleri
10.3
10.4
Sral Argmanlar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.5
simli Argmanlar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.6
10.7
10.8
Gml Fonksiyonlar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.9
174
177
. 179
. 180
. 181
. 187
. 190
. 190
. 194
. 198
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . .
11 Modller
201
11.1
11.2
os ve sys Modlleri
11.3
11.4
if __name__ == __main__ . . . . . . . . . . . . . . . . . . . . . . . . . .
201
. 207
. 221
. 223
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
226
226
228
. 230
. 230
. 230
. 232
. 235
. 236
12.1
12.2
12.3
12.4
Dosya Silmek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12.5
12.6
12.7
12.8
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
238
240
240
. 241
. 241
. 241
. 243
. 244
. 244
. 245
. 246
. 247
. 247
. 247
. 247
. 248
. 249
. 250
. 250
. 251
13.1
startswith Metodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13.2
endswith Metodu
13.3
islower Metodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13.4
isupper Metodu
13.5
replace Metodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13.6
join Metodu
13.7
split Metodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13.8
rsplit Metodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13.9
strip Metodu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
iii
251
251
. 252
. 253
. 253
. 254
. 254
. 254
. 254
. 255
. 256
. 256
. 256
. 257
. 257
. 258
. 258
. 258
. 258
. 259
. 259
. 262
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
iv
Uyar:
A
sa
gdaki bilgiler Pythonun 3.x srmleri iindir. E
ger kulland
gnz srm
Pythonun 2.x srmlerinden biriyse s
uradaki belgeleri inceleyebilirsiniz.
Not: E
ger gncel bir Python 3.x srmn anlatan, ama henz daha az bilgi ieren belgelerle
al
smak isterseniz istihza.com/beta/py3/icindekiler_python.html adresini ziyaret edebilirsiniz.
BLM
Temel Bilgiler
Python, Guido Van Rossum adl Hollandal bir programc tarafndan 90l yllarn ba
snda geli
stirilmeye ba
slanm
s bir programlama dilidir. Zannedildi
ginin aksine bu programlama dilinin ad
piton ylanndan gelmez... Guido Van Rossum bu programlama dilini, The Monty Python
adl bir Ingiliz komedi grubunun, Monty Pythons Flying Circus adl gsterisinden esinlenerek
adlandrm
str.
Python, pek ok dile kyasla
grenmesi kolay bir programlama dilidir. Bu yzden, e
ger daha
nce hi programlama deneyiminiz olmam
ssa, programlama maceranza Pythonla ba
slamay
tercih edebilirsiniz.
Python programlarnn en byk zelliklerinden birisi, C ve C++ gibi dillerin aksine, derlenmeye gerek olmadan al
strlabilmeleridir. Pythonda derleme i
slemi ortadan kaldrld
g iin,
Pythonla olduka hzl bir s
ekilde program geli
stirilebilir.
Ayrca Python programlama dilinin basit ve temiz szdizimi, onu pek ok programc tarafndan
tercih edilen bir dil haline getirmi
stir. Pythonun szdiziminin temiz ve basit olmas sayesinde
hem program yazmak, hem de ba
skas tarafndan yazlm
s bir program okumak ok kolaydr.
Pythonu kullanabilmek iin ncelikle onu bilgisayarmza kurmamz gerekiyor. Isterseniz sz
daha fazla uzatmadan Pythonu nereden ve nasl edinebilece
gimizi
grenelim.
python
yazp enter tu
suna bast
gnzda, e
ger kar
snza s
una benzer bir ekran geliyorsa, kurulu srm
2.xtir:
Python 2.6.1+ (r261:67515, Mar 2 2009, 13:10:18)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
Burada 2.6.1+ olarak grnen rakam Pythonun srmn gsteriyor. Bu ktya gre, sisteminizdeki Python srm 2.6.1. Yani sizde Pythonun 2.x numaral bir srm kurulu...
Sisteminizdeki Python srmn
grenmek iin s
yle bir yol da izleyebilirsiniz:
Yine komut satrnda:
python -V
E
ger bu komutun kts iinde python3 gibi bir s
ey gryorsanz, kurmanz gereken paket
odur... Yine Debian tabanl sistemlerde bu paketi s
u s
ekilde kurabilirsiniz:
sudo apt-get install python3
rne
gin Kubuntu, Debian tabanl bir GNU/Linux da
gtmdr. E
ger Kubuntunun Jaunty Jackalope veya daha st srmlerinden birini kullanyorsanz, yukardaki komut yardmyla python3
paketini sisteminize kurabilirsiniz.
Kulland
gnz da
gtmn depolarnda python3 paketini bulamazsanz, Python 3.xi kaynaktan
kurmanz gerekecektir. Bunun iin yapmanz gereken i
slemler s
yle:
1. ncelikle s
u adresi ziyaret ediyoruz: http://www.python.org/download
2. Bu adreste, zerinde Python 3.x.x compressed source tarball (for Linux, Unix or OS X)
yazan ba
glantya tklyoruz.
3. Ilgili .tgz dosyasn bilgisayarmza indiriyoruz.
4. Daha sonra, bu sk
strlm
s dosyay ayoruz.
5. Alan dosyann iine girip, orada srasyla a
sa
gdaki komutlar veriyoruz:
./configure
make
sudo make altinstall
Bylelikle Python 3.xi sistemimize kurmu
s olduk. Bu arada, yukardaki komutlar vermeden
nce tabii ki sistemimizde gcc ve make adl aralarn kurulu olmas gerekiyor...
Yukardaki kodlarda make install yerine make altinstall komutunu kulland
gmza dikkat
edin. Pythonun kaynak kodlaryla beraber gelen README dosyasnda s
yle bir ibare bulunur:
Installing multiple versions
On Unix and Mac systems if you intend to install multiple versions of Python using
the same installation prefix (prefix argument to the configure script) you must take
care that your primary python executable is not overwritten by the installation of
a different version. All files and directories installed using make altinstall contain
the major and minor version and can thus live side-by-side. make install also
creates ${prefix}/bin/python which refers to ${prefix}/bin/pythonX.Y. If you intend
to install multiple versions using the same prefix you must decide which version (if
any) is your primary version. Install that version using make install. Install all
other versions using make altinstall.
For example, if you want to install Python 2.5, 2.6 and 3.0 with 2.6 being the primary
version, you would execute make install in your 2.6 build directory and make
altinstall in the others.
Birden fazla srm ayn anda kurmak
Unix ve Mac sistemlerinde e
ger birden fazla Python srmn ayn nek ile (configure beti
gine verilen prefix argman) kuracaksanz, farkl bir Python srmne ait
al
strlabilir dosyann, birincil Python srmne ait al
strlabilir dosyay silip zerine yazmamasna dikkat etmelisiniz. make altinstall ile kurulum yapld
gnda btn
dosya ve dizinlerde ana ve alt srm numaralar da ierilecektir. Dolaysyla farkl
srmler yan yana varolabilecektir. make install komutu, ${nek}/bin/pythonX.Y
dosyasna ba
glant veren ${nek}/bin/python adl bir dosya olu
sturacaktr. E
ger
ayn neki kullanarak birden fazla srm kurmak istiyorsanz, hangi srmn (e
ger
olacaksa) birincil srmnz olaca
gna karar vermelisiniz. Birincil srmnz
make install ile kurun. teki btn srmleri ise make altinstall ile...
rne
gin Python 2.5, 2.6 ve 3.0 srmlerini kuracaksanz ve e
ger 2.6 srmnn
birincil srm olmasna karar vermi
sseniz, 2.6 srmnn in
sa dizini iinde make
install komutunu al
strn. teki srmleri ise make altinstall ile kurun.
Bu noktada bir uyar yapmadan gemeyelim: Python zellikle baz GNU/Linux da
gtmlarnda pek ok sistem aracyla sk skya ba
glantldr. Yani Python, kulland
gnz da
gtmn
belkemi
gi durumunda olabilir... Bu yzden Pythonu kaynaktan kurmak baz riskler ta
syabilir.
E
ger yukarda anlatld
g s
ekilde, sisteminize kaynaktan Python kuracaksanz, kar
s kar
sya
oldu
gunuz risklerin farknda olmalsnz...
Kurdu
gumuz yeni Pythonu nasl al
straca
gmz biraz sonra grece
giz. Ama nce Windows
kullanclarnn Python 3.xi nasl kuracaklarna bakalm.
Windows Kullanclar
Windows srmlerinin hibirinde Python kurulu olarak gelmez. O yzden Windows kullanclar,
Pythonu sitesinden indirip kuracak. Bunun iin s
u admlar takip ediyoruz:
1. http://www.python.org/download adresini ziyaret ediyoruz.
2. Orada, zerinde Python 3.x.x Windows installer (Windows binary does not include
source) yazan ba
glantya tklyoruz.
3. .msi uzantl dosyay bilgisayarmza indiriyoruz.
4. Inen dosyaya ift tklayp normal bir s
ekilde kurulumu gerekle
stiriyoruz.
5. E
ger ne yapt
gnzdan emin
de
gi
stirmemenizi neririm...
de
gilseniz,
kurulum
srasnda
varsaylan
ayarlar
Bu komutun ardndan s
una benzer bir ekranla kar
sla
sm
s olmalsnz:
Python 3.0.1+ (r301:69556, Feb 24 2009, 13:51:44)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
Grd
gnz gibi, kulland
gmz Python srm 3.0.1...
Burada, paket yneticisinden kurdu
gunuz paketin adnn python3 oldu
gunu varsayyorum.
D
sk bir ihtimal de olsa bu paketin ad sizde farkl olabilir. rne
gin Python3 sizin sisteminizde
farkl bir ad altnda geiyor olabilir. Mesela, python3.0 gibi...
E
ger paketin ad python3.0 ise komut satrnda s
u komutu vermelisiniz:
python3.0
Pythonu ne s
ekilde ba
slataca
gnz kesin olarak tespit etmek iin /usr/bin adl klasrn iinde
python programnn hangi adla yer ald
gna bakabilirsiniz. Bu klasrn iinde python
d
snda, adnda python geen hangi programlarn oldu
gunu kontrol edin. Mesela s
unlar olabilir: python3, python3.0, python3.0.1
E
ger Python3 kaynaktan kuranlardansanz, verece
giniz komut muhtemelen s
u olacaktr:
python3.0
E
ger sisteminizde ba
ska bir Python srm kurulu de
gilse veya siz kurulu olan srm daha
nceden YOLa eklememi
sseniz, yukardaki komutu verdi
ginizde Python3.0 al
smaya ba
slayacaktr. S
una benzer bir kt almalsnz:
Python 3.0.1 (r301:69561, Feb 13 2009, 20:04:18) [MSC v.1500 32 bit (Intel)] on
win32 Type "help", "copyright", "credits" or "license" for more information.
>>>
E
ger sisteminizde eski bir Python srm kuruluysa ve siz bu srm daha nceden YOLa
eklemi
sseniz, python komutunu verdi
ginizde Python3 yerine, sistemimizdeki eski Python
srm alacaktr.
nk Windowstaki btn Python srmlerinin al
strlabilir (exe)
dosyalar python.exe s
eklinde adlandrld
g iin, DOS ekrannda yazaca
gnz python komutu eski srm al
stracaktr. Dedi
gim gibi, e
ger eski srm nceden YOLa eklemi
sseniz,
yeni kurdu
gunuz Python3 YOLa eklemeyin. Bunun yerine, basit bir .bat dosyas yazmamz
yeterli olacaktr. Nasl m?
Notepad yardmyla bo
s bir metin belgesi an ve bu metin belgesinin iine s
u satr ekleyin:
@c:\python30\python.exe %*
S
imdi bu dosyay python3.bat adyla kaydedin ve daha nce YOLa ekledi
giniz eski srm
Pythonun bulundu
gu klasrn iine atn (mesela C:python26).
Artk cmd ile ula
st
gnz komut satrnda sadece python3 yazp entere basarak Python3
al
strabilirsiniz. Sadece python komutu verdi
ginizde ise sisteminizdeki eski srm Python
alacaktr. Tabii ki bu eski srm daha nceden YOLa eklemi
s iseniz...
Bu arada, olu
sturdu
gunuz .bat dosyasn Python26 klasrnn iine atmak yerine, Pythona
ili
skin .bat dosyalarn zel bir klasrde toplayp bu klasr YOLa ekleyerek de i
sinizi halledebilirsiniz. rne
gin benim Windows ykl bilgisayarmda Pythonun 2.5, 2.6 ve 3.0 srmleri
birlikte kurulu... Ben yol adn verdi
gim bir klasr olu
sturup bu klasr C: dizininin iine
attm. Daha sonra C:\yol dizinini YOLa ekledim. Ardndan Python2.5 ve Python3.0 srmleri
iin iki ayr .bat dosyas olu
sturdum. Bunlardan birini python25.bat, tekini de python3.bat
olarak adlandrdm. python25.bat dosyasnn ieri
gi s
yle:
@c:\python25\python.exe %*
Bu s
ekilde, cmd ile ula
st
gm komut satrnda python3 komutunu verdi
gimde Python3.0
srmnn ekran alyor:
Python 3.0.1 (r301:69561, Feb 13 2009, 20:04:18) [MSC v.1500 32 bit (Intel)] on
win32 Type "help", "copyright", "credits" or "license" for more information.
>>>
E
ger python25 komutunu verirsem, Python2.5 srmne ait komut ekran alyor:
Python 2.5.4 (r254:67916, Dec 23 2008, 15:10:54) [MSC v.1310 32 bit (Intel)] on
win32 Type "help", "copyright", "credits" or "license" for more information.
>>>
ve print() Fonksiyonu
1.4 Pythonun Etkile
simli Kabugu
Bir nceki blmde Pythonun farkl sistem ve durumlarda nasl al
strlaca
gn grm
s,
Pythonu anlatt
gmz s
ekilde al
strd
gnz zaman kar
snza s
una benzer bir ekrann gelece
gini
sylemi
stik:
Python 3.0.1+ (r301:69556, Feb 24 2009, 13:51:44)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
Grd
gnz gibi, print() adl fonksiyon, ekrana kt vermemizi, yani yaz yazdrmamz
sa
glyor... Bu arada, bu fonksiyon kelimesine fazla taklmayn. Ilerde bunun ne demek oldu
gunu ayrntl bir s
ekilde inceleyece
giz. S
imdilik print() ifadesinin bir fonksiyon
oldu
gunu bilmemiz yeterli olacaktr.
Burada dikkat etmemiz gereken baz noktalar var:
Komutumuzu >>> i
saretinden hemen sonra veriyoruz. Pythona yeni ba
slayanlarn en sk
yapt
g hatalardan bir tanesi, print()in psi ile >>> i
sareti arasnda bir bo
sluk brakmalardr. E
ger p harfi ile >>> i
sareti arasnda bo
sluk brakrsak, Python bize bir hata
mesaj gsterecektir. O yzden bo
sluklara dikkat ediyoruz...
print() fonksiyonunu olu
sturan btn harflerin kk oldu
guna dikkat edin. Python asndan, print ve Print kelimeleri birbirinden farkldr. Bizim fonksiyonumuzun ad print()tir.
Ba
ska bir s
ey de
gil...
print() fonksiyonunda, parantez iindeki ifadenin trnak iinde gsterildi
gine zellikle dikkat
ediyoruz. Burada ift veya tek trnak kullanmamz nemli de
gildir. Yani yukardaki kodu s
yle
de yazabiliriz:
Dikkat ederseniz, yukardaki hata mesajnda piton kelimesinin hemen altnda minik bir ok
i
sareti grnyor. Bu ok i
sareti, ortaya kan hatann nerede oldu
gu konusunda bize ipucu
veriyor. Buradaki hata, trnak i
saretlerinin kullanmndan kaynaklanyor. Biz cmlemize ift
trnak ile ba
sladk. Ama cmle iinde piton kelimesinde de birer adet ift trnak kullandk.
Ayrca cmlemizi de ift trnak ile bitirdik. I
ste bu noktada Pythonun kafasnn kar
smasna
neden olduk. Python byle bir yap ile kar
sla
st
gnda, piton kelimesinin ba
sndaki ift trnak nedeniyle cmlenin nerede ba
slayp nerede bitti
gini anlayamyor. Ilk ift trnaktan sonra
grd
g ikinci ift trna
gn cmle sonu oldu
gunu zannediyor. Ama piton kelimesinin sonunda da bir ift trnak oldu
gunu grnce bir s
eylerin ters gitti
gini d
snyor ve bize bir hata
mesaj gsteriyor. Zaten grd
gnz gibi, ok i
sareti de bu nc ift trna
gn oldu
gu yerde
duruyor. Yani Pythonun kafas tam olarak o noktada kar
sm
s... Bize d
sen grev, Pythonun
kafa kar
skl
gn gidermek. Bunu s
yle yapabiliriz:
>>> print(Python programlama dilinin ad "piton" ylanndan gelmez...)
Python programlama dilinin ad "piton" ylanndan gelmez...
Grd
gnz gibi, bu komutta, hatay nlemek iin cmlemize tek trnak ile ba
sladk ve cmlemizi tek trnak ile bitirdik. Cmle iindeki piton kelimesini ise ift trnak ile gstererek
kar
skl
g nledik. Bylece bu komutla istedi
gimiz kty alm
s olduk...
Demek ki, Pythonda ekrana kt verirken, trnak i
saretlerini dikkatli kullanyoruz.
Bu arada yukardaki kodlar iinde grnen >>> i
saretini siz yazmayacaksnz. Bu i
sareti
etkile
simli kabu
gun grnmn temsil etmek iin yerle
stirdik oraya... Siz ilk satr yazdktan
sonra do
gruca enter tu
suna basacaksnz.
S
imdi s
u cmleye bakalm:
Pythonu yazan ki
si Guido Van Rossum adl bir programcdr...
Acaba bu cmleyi, print() fonksiyonunu kullanarak ekrana nasl yazdrmalyz? Evet, tam
tahmin etti
giniz gibi:
>>> print("Pythonu yazan ki
si Guido Van Rossum adl bir programcdr...")
Pythonu yazan ki
si Guido Van Rossum adl bir programcdr...
Grd
gnz gibi, print() fonksiyonunu kullanmasak da ekrana kt alabiliyoruz. Ama bu
durum sizi yanltmasn. Bu zellik sadece etkile
simli kabu
ga mahsustur. Ilerde kodlarmz
dosyalara yazp kaydetti
gimiz zaman, ekrana kt verebilmek iin mutlaka print() fonksiyonunu kullanmamz gerekir. E
ger programlarmz iindeki cmleleri print() fonksiyonu ile
kullanmazsak, program al
strd
gmzda, yazd
gmz cmleyi Python grr, ama biz ve kullanclarmz gremeyiz!
Bu arada print() fonksiyonu ile veya onsuz yazd
gmz cmlelerdeki Trke karakterlerin ktda herhangi bir soruna sebep olmad
gna dikkat edin. print() fonksiyonu olmadan yazlan
cmlelerdeki Trke karakterlerin dzgn grnmesi, Python 3.x ile gelen bir zelliktir. E
ger
yukardaki cmleyi Pythonun 2.x srmlerinden birinde verseydik, s
yle bir tabloyla kar
sla
sacaktk:
>>> "Ltfen kullanc ad ve parolanz giriniz"
L\xc3\xbctfen kullan\xc4\xb1c\xc4\xb1 ad\xc4\xb1 ve parolan\xc4\xb1z\xc4\xb1 giriniz
Bunun d
snda, bu blmde
grendi
gimiz print() fonksiyonu da Python 3.xle birlikte mutasyon geiren zelliklerden biridir. Bu yazda
grendi
gimiz:
print("Merhaba Zalim Dnya!")
s
eklinde yazyorduk...
Bylece Pythonda print() fonksiyonunun ne oldu
gunu ve ne i
se yarad
gn
grenmi
s olduk. Ilerde kodlarmz dosyalara kaydetti
gimiz zaman bu fonksiyonu bol bol kullanaca
gz. Bu konuyu
bitirdi
gimize gre, artk yeni bir konuya geebiliriz.
Grd
gnz gibi, Python matematikten anlyor.. stelik yukardaki kodda bize yabanc gelecek hibir
ge yok. Tpk bildi
gimiz matematikte oldu
gu gibi, + i
sareti toplama anlamna
geliyor. Bir de s
una bakalm:
>>> 3457 - 2456
1001
Blme i
slemi iin ise / i
saretini:
>>> 5 / 2
2.5
Python iin, i
sleme alnan saylarn bykl
g kkl
g nemli de
gildir. Python ok byk
(veya ok kk) saylar hibir sorun karmadan arpabilir, toplayabilir, karabilir veya
blebilir...
Yalnz, birden fazla matematik i
slemini ayn anda yaparken bir konuya dikkat etmemiz gerekir.
Mesela size s
yle bir soru soralm: Sizce a
sa
gdaki i
slemin sonucu katr?:
>>> 5 * 2 + 4 / 2
E
ger yukardaki i
slemin sonucu bekledi
giniz gibi kmadysa, i
slem nceli
gi (operator precedence) denen kavram gzard etmi
ssiniz demektir. Matematik derslerinden hatrlad
gmz
i
slem nceli
gi kural Pythonda da geerlidir. Bu kurala gre; arpma ve blme i
slemleri,
toplama ve karma i
slemlerinden nce yaplr. Yani yukardaki ifadede nce 5 * 2 i
slemi,
ardndan 4 / 2 i
slemi yaplacak, daha sonra bu iki i
slemin sonucu birbiriyle toplanacaktr.
Pythonun kulland
g i
slem srasn de
gi
stirmek iin parantez i
saretlerinden yararlanabilirsiniz.
rne
gin yukardaki i
slemin 7 sonucunu vermesi iin ifadeyi s
yle dzenlemeniz gerekir:
>>> (5 * 2 + 4) / 2
7.0
Kalan 0 oldu
guna gre, demek ki 10 says 2ye tam blnyormu
s... Peki bu bilgi bizim
ne i
simize yarar? Mesela % adl i
slecin verdi
gi sonuca bakarak, saylarn ift mi yoksa tek mi
oldu
gunu denetleyebiliriz. herhangibirsay % 2 i
sleminin sonucu 0 ise o say ifttir. E
ger
sonu 1 ise o say tektir... E
ger ilkokul
grencilerine basit matematik kavramlarn
greten
bir program yazmay planlyorsanz bu i
sle i
sinize yarayacaktr. Hatta ileride bu i
slecin hi
tahmin etmedi
giniz yerlerde de i
sinize yarayaca
gn grrseniz s
a
srmayn...
// i
sleci
Pythonda kullanabilece
gimiz ba
ska bir i
sle ise s
udur: //. Bu i
sle, bir blme i
sleminde
sonucun sadece tamsay ksmn almamz sa
glar. Hemen bir rnek vererek durumu somutla
stralm:
>>> 9 // 2
4
Grd
gnz gibi, sonu tamsay s
eklinde. Yani sonucumuz ondalk ksm iermiyor. Normalde
9 says 2 saysna blnd
gnde s
u sonucu elde ederiz:
>>> 9 / 2
4.5
Ayn i
slemi 9 // 2 s
eklinde yapt
gmzda ise ondalk ksm atlr, ekrana sadece tamsay ksm
verilir... Ilk bak
sta bu i
sle ok manal gelmeyebilir, ama ileride mutlaka, ondalk say yerine
tamsay elde etmek istedi
giniz durumlarla kar
sla
sacaksnzdr.
** i
sleci
Bu i
sle, bir saynn kuvvetlerini hesaplamak iin kullanlr. sl saylar bulmak iin bu i
sleten
yararlanaca
gz. rne
gin:
>>> 2 ** 3
8
Ya da 15 saysnn 3. kuvvetini s
yle bulabiliriz:
>>> 15 ** 3
3375
Pythonda bunlarn d
snda daha pek ok i
sle bulunur. Ama ilerinde s
u anda en ok i
simize
yarayacak, en temel i
sleler bunlardr. Ilerde teki i
sleleri de inceleyece
giz.
S
u ana kadar Pythonun temellerine ili
skin pek ok s
ey syledik. rne
gin en temel
gelerden
biri olan print() fonksiyonunu ve bu fonksiyonun ne i
se yarad
gn
grendik. Bunun yansra
Pythonda saylarn kullanmna da s
yle bir gz gezdirdik. print() fonksiyonunu i
slerken,
bu fonksiyonun ekrana kt vermek iin kullanld
gn, bu fonksiyonla birlikte kulland
gmz
cmleleri trnak iine almamz gerekti
gini sylemi
stik. Yalnz bu blmde dikkatinizi ekti mi
bilmiyorum, ama farkettiyseniz yukardaki kodlarn hibirinde trnak i
sareti kullanmadk. S
imdi
gelin isterseniz bunun nedenlerini tart
salm...
Yani karakter dizisi; iinde bir veya daha fazla sayda karakter barndran bir dizidir.
Dolaysyla bir
seyin karakter dizisi olabilmesi iin birden fazla karakter ieriyor olmas s
art
de
gildir. Pythonda tek bir karakter dahi, karakter dizisi snfna girer. Bu sebeple a
sa
gdaki
Hatta bir s
eyin karakter dizisi olabilmesi iin harf olmas da gerekmez. Kabaca sylemek
gerekirse, trnak iinde gsterebilece
gimiz her s
ey bir karakter dizisir. Bo
sluk karakteri de
dahil...
Karakter dizilerini anladk saylr. Saylar ise zaten adndan tr rahatlkla anlayabiliyoruz.
Mesela s
u rnek bir saydr:
12354
Isterseniz bunu bir de print() fonksiyonu ile gsterelim. Zaten normalde hep bu s
ekli kullanmamz yararl olacaktr:
>>> print(12354 + 3444)
15798
Bir de s
una bakalm:
>>> print("12354 + 3444")
12354 + 3444
Grd
gnz gibi, bu defa ktmz farkl oldu. Neden? nk dedi
gimiz gibi, trnak i
sareti olmayan 12354 veya 3444 birer saydr, ama trnak i
sareti olan 12354 veya 3444 birer karakter dizisidir. Aritmetik i
slemleri saylarla yaplr, karakter dizileriyle de
gil... Dolaysyla Python,
Merhaba Zalim Dnyaya nasl davranyorsa, 12354 + 3444e de ayn s
ekilde davranyor.
Bunun iin Pythonu sulayamayz...
Hatta s
yle ilgin bir rnek de verebiliriz:
>>> print("12354" + "3444")
123543444
Grd
gnz gibi, iki tane karakter dizisiyle kar
sla
san Python (12354 ve 3444), art (+)
i
saretini bu iki karakter dizisini birle
stirmek iin kulland. E
ger art i
saretinin beraber kullanld
g
geler birer say olsayd, Python bunlar yan yana yazmak yerine, birbirleriyle toplayacakt.
Yukardaki rneklerin bize gsterdi
gi gibi, baz i
sleler, birlikte kullanldklar
gelerin tipine
gre farkl anlamlar ta
syabilir. Yukarda da s
ahit oldu
gumuz gibi, e
ger sz konusu olan s
ey
saylar ise, art i
sareti bir aritmetik i
slem yaplmasn sa
glayacaktr. Ama e
ger sz konusu
olan s
ey karakter dizileri ise, art i
sareti bu karakter dizilerini bir araya getirme grevi grecektir. Mesela daha nce arpma i
slemlerinde kulland
gmz * i
sareti de birlikte kullanld
g
yava
s adl karakter dizisinin kapan
s trna
gn koymadan nce bir bo
sluk brakarak emelimize
ula
stk... Python ktda o bo
sluk karakterini de grece
gi iin, iki tane yava
s kelimesi ktda
bo
sluklu olarak grnecektir.
Yalnz baz durumlarda karakter dizisinin sonuna byle bo
sluk eklemek mmkn olmayabilir.
E
ger yle bir durumla kar
sla
srsak, s
yle bir s
ey de yapabiliriz:
>>> print(("yava
s" + " ")*2)
yava
s yava
s
Grd
gnz gibi, burada sanki bir matematik i
slemi yapar gibi, parantezleri kullanarak
Pythona yol gsterdik. Matematikteki i
slem nceli
gi kuralnn burada nasl i
sledi
gine dikkat
edin.
Karakter dizileri (strings) tabii ki yukarda anlattklarmzla snrl de
gildir. Ama s
imdilik bizim
bilgimiz snrl oldu
gu iin, Pythondaki karakter dizilerinin btn imkanlarn burada nnze
seremiyoruz. Pythonla ilgili birka s
ey daha
grendikten sonra karakter dizilerini etkili bir
s
ekilde kullanmay da
grenece
giz. Zira karakter dizileri, Pythonun en gl oldu
gu alanlardan
birisidir.
Bu konuyu da bylece tamamlam
s olduk. Henz sylenmesi gereken her s
eyi syleyemedik,
ama Pythonda sa
glam bir temel atmammz sa
glayacak pek ok nemli bilgiyi konular arasna
serpi
stirdik. Bu ilk blmleri sindire sindire al
smak, ilerde kemikli konular daha kolay
gtmemizi sa
glayacaktr.
Bir sonraki blmde, Pythonda hareket kabiliyetimizi bir hayli artracak bir konuyu inceleyece
giz: De
gi
skenler
skenler
1.7 Degi
Bir nceki blmn sonunda da belirtti
gimiz gibi, de
gi
skenler Pythondaki esnekli
gimizi,
hareket kabiliyetimizi bir hayli artracak olmas bakmndan epey nemli bir konudur. Bu
konuyu i
sledikten sonra, artk asl al
sma alanmz olan dosyalara geebilecek kadar bilgi
sahibi olmu
s olaca
gz. Yani bu konuyu da atlattktan sonra gerek anlamda ilk programlarmz
yazmaya ba
slayabilece
giz.
Biz burada de
gi
sken kavramn tanmlamaya u
gra
smakla vakit kaybetmeyece
giz. Bir ksmmz bu kavrama zaten pek de yabanc de
giliz. br ksmmz ise verdi
gimiz ilk rnekte
bunun ne oldu
gunu, ne i
se yarad
gn derhal anlayacaktr... Dolaysyla bir an nce rneklerimize geelim:
Mesela s
u rne
ge bir bakalm:
>>> n = 10
>>> print(n)
10
Grd
gnz gibi, 10 de
gerini elde etmek iin n de
gi
skenini ekrana yazdrmamz yeterli
oluyor.
Bu s
ekilde bir de
gi
sken tanmladktan sonra, bu de
gi
skeni trl s
ekillerde kullanabiliriz.
rne
gin bu de
gi
skenle matematik i
slemleri yapabiliriz:
>>> print(n * 5)
50
Tabii ki yukardaki de
gi
skenle matematik i
slemleri yapabilmemiz, bu de
gi
skenin de
gerinin bir
say olmasndan kaynaklanyor. E
ger n de
gi
skeninin de
geri bir karakter dizisi olsayd yukardaki komuttan alaca
gmz kt ok farkl olacakt. Bakalm:
>>> n = "10"
Bylece n de
gerini yeniden tanmlam
s olduk. Artk n de
gi
skeninin de
geri 10 de
gil, 10...
Yani say de
gil, karakter dizisi. Bunu s
u s
ekilde teyit edebiliriz:
>>> print(n * 5)
10101010101010101010
Grd
gnz gibi, bu defa Python 5 adet 10u yan yana dizdi. Bunun sebebini biliyorsunuz.
Aritmetik i
slemleri saylarla yaplr, karakter dizileriyle de
gil...
Gelin isterseniz birka tane daha de
gi
sken tanmlayarak elimizi al
stralm:
>>> isim = "istihza"
Burada, de
geri istihza olan, isim adl bir de
gi
sken tanmladk. Buna s
yle ula
sabiliriz:
>>> print(isim)
istihza
Bu de
gi
skeni istersek ba
ska karakter dizileriyle birlikte kullanarak daha kar
sk i
slemler de
yapabiliriz. Mesela:
>>> print("Benim adm", isim)
Benim adm istihza
Burada, Benim adm adl karakter dizisinden sonra bir virgl koydu
gumuza ve isim adl
de
gi
skeni ne s
ekilde kulland
gmza dikkat edin. Bununla ilgili benzer bir rnek daha yapalm:
>>> konu = "de
gi
skenler"
>>> print("Bu dersimizin konusu", konu)
Bu dersimizin konusu de
gi
skenler
Elbette, de
gi
skenimizi sadece en sonda kullanmak zorunda de
giliz. Bunu aralara da yerle
stirebiliriz. rne
gin s
yle bir kod paras yazd
gmz d
snn:
Bu kodlarn kts s
yle olacaktr:
Bu siteye 12 Ekim 2007 tarihinden bu yana 123456789 defa tklanm
str.
Burada de
gi
skenlerle ilgili olarak dikkatimizi eken baz noktalar var:
De
gi
sken ad belirlerken Trke karakter kullanabiliyoruz. Grd
gnz gibi, ziyaret_sayisi
demek yerine, ziyaret_says diyebildik... Bu zellik Python3.0 ile gelen bir gzelliktir.
Pythonun 2.x srmlerinde ayn de
gi
skeni ziyaret_sayisi s
eklinde tanmlamamz gerekecekti.
E
ger de
gi
sken ad olarak birden fazla kelime kullanacaksak, kelimeler arasnda bo
sluk brakmyoruz. Kelimeleri biti
sik olarak yazabilece
gimiz gibi, burada grd
gmz s
ekilde kelimeler
arasna alt izgi i
sareti de koyabiliriz.
Ayrca yine virglleri nasl kulland
gmza zellikle dikkat ediyoruz...
Bunlarn d
snda de
gi
sken adlar ile ilgili birka kural daha vardr...
De
gi
sken adlar asla bir sayyla ba
slamaz. Kelimenin ortasnda veya sonunda say bulunabilir,
ama ba
snda bulunamaz... Mesela 3say geerli bir de
gi
sken ad de
gildir. Ama s3ay veya
say3 geerli birer de
gi
sken addr.
Ayrca, baz zel kelimeler vardr ki, bunlar de
gi
sken ad olarak kullanamayz. Bunlar s
yle
listelenebilir:
and, del, from, not, while, as, elif, global, or, with, assert, else, if, pass,
yield, break, except, import, print, class, exec, in, raise, continue, finally,
is, return, def, for, lambda, try
Elbette bu listeyi ezberlemenize gerek yok. Programnz de
gi
skenlerle ilgili anlamsz hatalar
verdi
ginde gelip bu listeyi kontrol edebilirsiniz... Ayrca etkile
simli kabukta s
u komutu vererek
de yukardaki listeyi elde edebilirsiniz:
>>> help("keywords")
Geri e
ger programlarnz Trke olarak yazyorsanz, yukardaki yasakl kelimelerden birine
toslamanz d
sk bir ihtimaldir. Ama yine de Pythonda bu tr yasakl kelimelerin oldu
gunu
bilmenin ilerde bize faydas dokunacaktr.
De
gi
skenler zellikle kullancyla etkile
sen, yani onlardan veri alp onlara veri veren programlar
yazd
gmzda daha ok i
simize yarayacaktr.
Grd
gnz gibi, komut satrnda yazd
gmz kodlar artk tek satr gemeye ba
slad. Bunlar
bir yere kaydedip oradan al
strsak daha iyi olacak. Hem zaten etkile
simli kabukta yazd
gmz
kodlar kalc olmuyor. Etkile
simli kabu
gu kapatt
gmz anda bunlar hafzadan siliniyor. Tabii
ki yazd
gmz programlar ba
skalaryla payla
sabilmek iin bunlar nce bir yere uygun s
ekilde
kaydetmi
s olmamz gerekiyor. Dolaysyla artk yava
s yava
s asl al
sma ortammza geebiliriz. nk bunu yapabilecek kadar temel bilgiye sahibiz s
u anda.
Kate iin s
u komutu:
kate
E
ger bir GNOME kullancsysak, Gediti al
strmak iin s
yle bir komut veriyoruz:
gedit
S
imdi kendi sistemimize uygun olarak Kwrite, Kate, Gedit veya IDLE programlarndan birini
ba
slatalm. (IDLE kullanclar File > New Window yolunu takip ederek bo
s bir sayfa amay
unutmuyorlar...)
At
gmz bo
s metin sayfasna s
u satr yazyoruz:
#!/usr/bin/env python3.0
Bu satr sadece GNU/Linux kullanclar iindir. Windows kullanclar bu satr yazmasa da olur...
Bu satr yazmamzn amac, GNU/Linuxta programmz al
straca
gmz zaman Pythonun
hangi srmn kullanmak istedi
gimizi aka belli etmektir... Bu satrn nemini biraz sonra
ayrntl olarak anlataca
gz. Ama s
imdi programmz yazmaya devam edelim. Ikinci satrmz
s
yle:
print("Merhaba Zalim Dnya!")
Programmz yazd
gmza gre sra geldi bu program bilgisayarmza kaydetmeye... Kulland
gmz metin dzenleyicinin kaydetme zelli
gini kullanarak bu dosyay ilk.py adyla (trnaklar olmadan) bilgisayarmza kaydedelim. Gelin isterseniz ilk programmz masastne
kaydedelim, ki ula
smas kolay olsun. Programmz kaydetti
gimize gre, artk bu program
al
strabiliriz. Kaydetti
gimiz bu program nasl al
straca
gmz bir sonraki blme brakalm...
Bu
nce kendi sistemimize uygun olarak bir konsol veya DOS ekran ayoruz. GNU/Linux KDE kullanclar ALT+F2 ile gelen pencerede konsole komutunu kullanarak komut satrna ula
sabilir.
GNOME kullanclarnn ayn i
s iin kullanmas gereken komut gnome-terminaldir. Windows
kullanclar ise Ba
slat > al
str yolunu takip ederek alan pencerede cmd komutuyla DOS
ekranna eri
sebilir.
Komut satrn ilk at
gnzda bulundu
gunuz dizin muhtemelen masast olmayacaktr.
Ama biz programmz masastne kaydetti
gimiz iin, ncelikle dizinimizi masast olarak
de
gi
stirmemiz gerekiyor. Btn platformlarda s
u komutu vererek masastne geebilirsiniz:
cd Desktop
E
ger her s
ey yolunda gitmi
sse konsol veya DOS ekranna s
u yaznn dkld
gn grece
giz:
Merhaba Zalim Dnya!
Tabii ki, e
ger siz .bat dosyasnn adn farkl bir s
ey yapm
ssanz o ismi kullanmanz gerekir.
Mesela benim Windows ykl bilgisayarmda, daha nce de syledi
gim gibi, Python2.5,
Python2.6 ve Python3.0 srmleri bir arada kurulu. Windowstaki Pythona ait btn al
strlabilir dosyalarn ad python.exe oldu
gu iin, ben Python 2.6 srmn YOLa ekledim. teki
srmler iin ise, python25.bat ve python3.bat adl iki ayr .bat dosyas yazdm. Dolaysyla
ben herhangi bir Python programn Python2.5 srmyle al
strmak istersem s
u komutu
veriyorum:
python25 program_ad.py
Tabii e
ger siz Pythonun etkile
simli kabu
gunu al
strmak iin python3 komutunu kullanyorsanz ilk.py adl program s
yle de al
strabilirsiniz:
python3 ilk.py
Dedi
gim gibi, i
sin z s
u: Pythonun etkile
simli kabu
gunu nasl ba
slatyorsanz, programlarnz
da yle al
stracaksnz. Yani e
ger etkile
simli kabu
gu:
python
komutuyla ba
slatyorsanz, ilk.py adl programmz al
strmak iin s
u komutu vereceksiniz:
python ilk.py
E
ger etkile
simli kabu
gu:
python3
komutuyla al
stryorsanz, programmz s
u komutla al
stracaksnz:
python3 ilk.py
E
ger etkile
simli kabu
gu al
strmak iin verdi
giniz komut:
python3.0
ise, ilk.pyyi s
yle al
stryoruz:
python3.0 ilk.py
Bylece dosyamza al
strma yetkisi vermi
s olduk. Bundan sonra programmz s
u komutla
al
strabiliriz:
./ilk.py
Peki ya biz programmz tpk teki programlar gibi sadece adn kullanarak al
strmak istiyorsak ne yapaca
gz?
Bunun iin programmz /usr/bin/ klasrnn iine atmamz gerekir. Programmz /usr/bin/
iine attktan sonra sadece s
u komutu vermemiz yeterli olacaktr:
ilk
deneme.py
Grd
gnz gibi, print(Merhaba Zalim Dnya! satrnda kapan
s parantezini koymay unuttuk ve programmz bu s
ekilde kaydettik. S
imdi program dosyamza ift tklad
gmzda
DOS ekran input() satrna ra
gmen anlk olarak ekranda grnp kaybolacaktr. Bu s
ekilde
sorunun nereden kaynakland
gn anlayamazsnz. Ama e
ger bu program komut satrndan
al
strrsanz, en azndan programdaki hata konusunda bir fikir sahibi olabilir, buna gre programa mdahale edebilirsiniz.
Bylece Python programlarmz nasl al
strabilece
gimiz
grenmi
s olduk. Artk hzla yolumuza
devam edebiliriz.
#!/usr/bin/env python3.0
a = "kalem"
b = "pergel"
c = "ikolata"
print("Bir", a, "bir", b, "bir de", c, "alaca
gm...")
Buradaki ilk satr sadece GNU/Linux kullanclar iindir. Windows kullanclar bu satr yazmayabilirler. Burada a, b ve c adl de
gi
skenlere srasyla kalem, pergel ve ikolata de
gerlerini nasl atad
gmza dikkat edin. De
gerlerimizi trnak iine almay unutmuyoruz.
nk bunlar birer karakter dizisidir.
En son satrda ise, ilk derslerde
grendi
gimiz print() fonksiyonunu gryoruz. Daha nce
tanmlad
gmz de
gi
skenleri, print() fonksiyonu iine tek tek yerle
stirdik. De
gi
sken adlarn
trnak iine almad
gmza dikkat edin. Ayrca bu kodlar yazarken, virglleri de yanl
s yerlere
koymamaya zen gsteriyoruz.
S
imdi artk bu kodlar .py uzantsyla kaydedebiliriz. Mesela deneme.py adyla kaydedelim
kodlarmz... Bylelikle elimizde, Pythonla yazlm
s bir program rne
gi olmu
s oldu. S
imdi bu
program al
straca
gz. Bunun iin, kulland
gmz i
sletim sistemine uygun olarak hemen bir
komut satr ayoruz. Komut satrn nasl aaca
gmz daha nceki derslerimizde anlatm
stk.
Ama isterseniz yine de ksaca de
ginelim:
GNU/Linuxta KDE masast ortamn kullananlar ALT+F2 tu
slarna basp, alan pencerede
konsole komutunu vererek; GNOME masast ortamn kullananlar ise ayn pencerede
gnome-terminal komutunu vererek bir komut satr aabilirler. Windows kullanclar ise
Ba
slat > al
str yolunu takip ederek, alan pencerede cmd komutunu verdikten sonra MSDOS ekranna ula
sabilir. Komut satrna ula
stktan sonra, orada s
u komutu verelim:
python3 deneme.py
Tabii e
ger program dosyanz masastne kaydettiyseniz:
cd Desktop
Yok e
ger Python 3.xin etkile
simli kabu
gunu sadece python komutuyla ayorsanz, tabii ki
verece
giniz komut s
u olacaktr:
python deneme.py
E
ger daha nceki derslerde aklad
gmz s
ekilde gerekli ayarlar yaparsanz, programmz
sadece adyla veya zerine ift tklayarak da al
strabilece
gimizi biliyorsunuz.
Kendimize uygun olan komutu verip yukardaki program al
strd
gmzda s
yle bir kt elde
edece
giz:
Bir kalem bir pergel bir de ikolata alaca
gm...
Gelin isterseniz bu kodlara yeni bir satr daha ekleyelim. Dosyann en son satrndan sonra
s
unu yazalm:
print("Fi
sini almayacak msn o
glum?")
Yani kodlarmz s
yle olmu
s oldu:
#!/usr/bin/env python3.0
a = "kalem"
b = "pergel"
c = "ikolata"
print("Bir", a, "bir", b, "bir de", c, "alaca
gm...")
print("Fi
sini almayacak msn o
glum?")
Bu kodlar al
strd
gmzda s
yle bir kt alrz:
Bir kalem bir pergel bir de ikolata alaca
gm...
Fi
sini almayacak msn o
glum!
Grd
gnz gibi, ikinci print() fonksiyonu ile verdi
gimiz kt otomatik olarak bir alt satrda
grnyor. o
gu zaman istedi
gimiz davran
s bu olacaktr. Ama bazen istedi
gimiz s
ey bu
olmayabilir. Bunun yerine, yeni eklenen satrn bir ncekiyle ayn satrda grnmesini isteyebiliriz. O zaman, Pythonun bize sundu
gu end adl ifadeden yararlanabiliriz:
#!/usr/bin/env python3.0
a = "kalem"
b = "pergel"
c = "ikolata"
print("Bir", a, "bir", b, "bir de", c, "alaca
gm...",
end="Fi
sini almayacak msn o
glum?")
Bu kodlarn kts s
yle olacaktr:
Bir kalem bir pergel bir de ikolata alaca
gm... Fi
sini almayacak msn
o
glum!istihza@istihza:~/Desktop$
Grd
gnz gibi, ktmz hibir s
ekilde biimlendirilmedi. yle ki, ktmz komut satrndaki
istihza@istihza:~/Desktop$ ifadesinin dahi gerisinde kald! Bu kullanmda ne bir bo
sluk
karakteri otomatik olarak eklenir, ne de otomatik olarak yeni satra geilir. Arzu etti
gimiz
i
saretleri kendimiz koymamz lazm. Mesela bu kodlar s
u s
ekilde yazarak daha dzgn bir
kt alabiliriz:
#!/usr/bin/env python3.0
a = "kalem"
b = "pergel"
c = "ikolata"
print("Bir", a, "bir", b, "bir de", c, "alaca
gm...",
end="Fi
sini almayacak msn o
glum?\n")
Bu defa ktmz s
yle olacak:
Bir kalem bir pergel bir de ikolata alaca
gm... Fi
sini almayacak msn o
glum!
Grd
gnz gibi, yeni bir satrda yer almasn istedi
gimiz ksmlara \n karakterini yerle
stirdik.
Ayrca bu uzun karakter dizisini belli noktalarda enter tu
suna basarak blmek istedi
gimizde
de \ i
saretinden yararlanyoruz. E
ger enter tu
suna basaca
gmz noktalarda bu ters bl
i
saretini kullanmazsak programmz hata verecektir... Bu ters bl i
saretleri ktda grnmez,
hatta bu i
saretlerin kt zerinde hibir etkisi yoktur. Bu i
saret yardmyla Pythona s
yle bir
s
ey sylemi
s oluyoruz:
enter tu
suna bast
gma bakma! Aslnda satr devam ediyor...
Bu kodlar al
strd
gmzda s
una benzer bir kt alrz:
istihza@istihza:~/Desktop$ python3 deneme.py
Python Hakknda:
Guido Van Rossum Pythonu geli
stirmeye 1990 ylnda ba
slam
s...
Yani aslnda Python iin nispeten yeni bir dil denebilir.
Ancak Pythonun ok uzun bir gemi
si olmasa da,
bu dil teki dillere kyasla kolay olmas, hzl olmas,
ayr bir derleyici programa ihtiya duymamas
ve bunun gibi pek ok nedenden tr o
gu kimsenin
gzdesi haline gelmi
stir. Ayrca Googlenin de Pythona zel bir nem
ve de
ger verdi
gini, ok iyi derecede Python bilenlere i
s olana
g
sundu
gunu da hemen syleyelim. Mesela bundan ksa bir sre nce
Pythonun yaratcs Guido Van Rossum Googlede i
se ba
slad...
Grd
gnz gibi, satrlar \ i
saretinin bulundu
gu yerlerden de
gil, \n i
saretinin oldu
gu noktalardan blnyor... Ayrca burada \n karakterini kelimeler arasna yerle
stirirken bo
sluk
brakmad
gmza da dikkat edin. nk \n karakteri kendisinden sonra gelen kelimeyi bir
alt satra alaca
g iin, e
ger kelimeler arasnda bo
sluk brakrsak, alt satra geen kelime, yeni
satrda girintili olarak grnecektir...
Yukarda da ifade etti
gimiz gibi, byle uzun cmlelerle al
srken, e
ger kendiniz enter tu
suna
basarak alt satra gemeye al
srsanz, programnz hata verecektir. Bunu nlemek iin \
i
saretinden yararlanmamz gerekir. Bu durum Pythonda tek ve ift trnak i
saretlerinin zelli
gidir.
E
ger karakter dizilerini yazarken alt satra gemek istiyorsanz bu i
si \n adl karakterle yapmanz gerekir. Dedi
gim gibi, aksi halde hata alrsnz...
Grd
gnz gibi yukardaki gibi bir kod yazabilmek iin epey takla atmamz gerekti... Ama
Pythonda areler tkenmez! Bunun gibi uzun cmlelerle al
srken i
simize yarayacak ba
ska
bir trnak tipi daha vardr Pythonda: trnak
trnak i
saretini kullanarak, ok uzun cmleleri sorunsuz ve dertsiz bir s
ekilde ekrana
yazdrabiliriz. Mesela yukardaki rnek zerinden gidelim:
#!/usr/bin/env python3.0
print("""
Python Hakknda:
""")
print("""Guido Van Rossum Pythonu geli
stirmeye 1990 ylnda ba
slam
s...
Yani aslnda Python iin nispeten yeni bir dil denebilir. Ancak
Pythonun ok uzun bir gemi
si olmasa da, bu dil teki dillere kyasla
kolay olmas, hzl olmas, ayr bir derleyici programa ihtiya duymamas
ve bunun gibi pek ok nedenden tr o
gu kimsenin gzdesi haline gelmi
stir.
Ayrca Googlenin de Pythona zel bir nem ve de
ger verdi
gini, ok iyi derecede
Python bilenlere i
s olana
g sundu
gunu da hemen syleyelim. Mesela bundan ksa
bir sre nce Pythonun yaratcs Guido Van Rossum Googlede i
se ba
slad...""")
Burada ( trnak) i
saretini nasl kulland
gmza dikkat edin. Bir tane bile \n karakteri
kullanmadan, klavyedeki enter tu
sunu kullanarak, istedi
gimiz yerden bldk cmlelerimizi.
Ayn s
eyi ift veya tek trnak ile yapmaya al
st
gmzda programmzn hata verdi
gini grrz...
Buraya kadar
grendi
gimiz bilgilere gre Pythonda adet trnak tipi kullanlabiliyor:
1. Tek trnak ()
2. ift trnak ()
3. trnak ()
Tek ve ift trnaklar ksa karakter dizilerinde kullanlmaya olduka uygundur. Elbette ksa karakter dizileriyle de trna
g kullanabilirsiniz.Ama ksa karakter dizileri iin trnak kullanm pek
yaygn de
gildir. Zaten mesela elma gibi ksa bir karakter dizisini elma s
eklinde yazmak
en basitinden irkin bir grnm sunacak, hi de pratik olmayacaktr...
Yukardaki kodlar ok dikkatli bir s
ekilde inceleyip, hangi kodun ne i
se yarad
gn anlamaya
al
smanz neririm. Hatta yukardaki kodlarda kendinize gre birtakm de
gi
siklikler yaparak,
kodlarn i
slevini daha iyi kavrayabilirsiniz.
Bu cmleyi en kolay s
u s
ekilde yazdrabiliriz:
>>> print("Bugn Adanaya gidiyoruz!")
Bugn Adanaya gidiyoruz!
Tahmin etti
giniz gibi, cmle iinde ift trnaklar oldu
gu iin, bu cmleyi en kolay s
u s
ekilde
yazdrrz:
>>> print("Bugn gnlerden Per
sembe," dedi Bihter Hanm)
Bugn gnlerden Per
sembe," dedi Bihter Hanm
Burada ba
sta ve sonda tek trnak i
saretlerini kullanyoruz...
Peki ya s
u cmle nasl yazdrlr?
Ahmet, "Bugn Adanaya gidiyoruz," dedi.
Burada hem tek trnak hem de ift trnak var. Acaba bu sorunu nasl a
saca
gz?
Bu sorunu en kolay, trnak i
saretlerini kullanarak zebiliriz:
>>> print("""Ahmet, "Bugn Adanaya gidiyoruz," dedi.""")
Grd
gnz gibi sorun kolayca zld. Peki ya biz burada trnak i
saretini kullanmak istemezsek ne olacak? Diyelim ki biz bu cmleyi mutlaka ift trnak kullanarak yazdrmak istiyoruz.
O zaman ne yapaca
gz?
Burada, Pythonun zel i
saretleri devreye girecek. Bu zel i
saretlere programlama dilinde
ka
s dizisi (escape sequence) ad verilir. Mesela \ i
sareti bunlardan biridir ve bizim yukardaki gibi bir problemden kamamz sa
glar. Hemen grelim nasl kullanld
gn bu i
saretin:
>>> print("Ahmet, \"Bugn Adanaya gidiyoruz,\" dedi.")
\ adl ka
s dizisini nasl kulland
gmz gryorsunuz. Ba
slang ve biti
s trnaklar d
snda
kalan btn ift trnak i
saretlerinin nne \ adl ka
s dizisini getiriyoruz.
E
ger yukardaki cmleyi ift trnak yerine mutlaka tek trnak kullanarak yazdrmak istiyor olsaydk, s
yle yapacaktk:
>>> print(Ahmet, "Bugn Adana\ya gidiyoruz," dedi.)
Pythonda \ karakterinden ba
ska pek ok ka
s dizisi vardr. Bunlar ilerleyen derslerde tek
tek inceleyece
giz.
Karakter dizileri zerinde yeterince al
stk saylr. Isterseniz biraz da saylarla ilgili rnekler
yapalm...
nceki derslerden hatrlad
gmz gibi, karakter dizileriyle saylar arasnda iki temel fark bulunuyordu:
1. Karakter dizileri trnak iinde gsterilir, saylar trnaksz...
2. Saylar, adlarndan anla
slaca
g gibi say de
gerli
gelerdir. Karakter dizileri ise say de
gerli
olabilecekleri gibi, olmayabilirler de...
nceki bilgilerimize dayanarak s
u rnekleri verebiliriz. Mesela a
sa
gdaki ifade bir saydr:
13
Ama s
u ifade bir say de
gildir:
"13"
Ancak s
yle bir yanlgya d
smeyelim. Say olup olmama zelli
gi yalnzca trnak i
saretleriyle
ilgili bir durum de
gildir. rne
gin a
sa
gdaki karakter dizisinin trnaklarn kesip ald
gmzda bir
say elde etmeyiz:
"elma"
Yani:
elma
gibi bir kullanm hata verecektir. nk bir ifadenin say olabilmesi iin, trnak i
sareti ta
smamasnn yansra, say de
gerli olmas da gerekir...
Isterseniz saylar (ve karakter dizilerini) kullanarak s
yle bir rnek yapalm:
#!/usr/bin/env python3.0
km = 10
m = 50000
print(m, "metre", m/1000, "kilometreye e
sittir.")
print(km, "kilometre", km*1000, "metreye e
sittir.")
Bu program s
yle bir kt verecektir:
50000 metre 50.0 kilometreye e
sittir.
10 kilometre 10000 metreye e
sittir.
E
ger km ve m de
gi
skenlerinin de
geri say de
gil de karakter dizisi olsayd, m/1000 veya
km*1000 i
slemlerini yapamazdk.
Bu arada, buradaki ktda 50.0 gibi ondalk de
ger ta
syan bir say elde etti
gimize dikkat edin.
E
ger ondalk say yerine tamsay elde etmek isterseniz, blme i
slemini s
u s
ekilde yapabilirsiniz:
m//1000
nceki derslerimizde // i
slecinden sz etmi
stik. Bu i
sle yukardaki gibi durumlarda olduka
faydal bir aratr.
Bu program al
strd
gmz zaman, ekrana s
yle bir kt verilecektir:
Merhaba, ben Python. Monty Python
Senin adn nedir?
Burada Python kullancya adn sordu ve cevap bekliyor. Kullanc kendi adn yazp enter
tu
suna bast
gnda programmz kapanacaktr. Tabii ki program bu haliyle bizi tatmin etmekten
ok uzak. En azndan, kullancnn adn
grenip ona kendi adyla hitap edebilsek ok iyi olur...
S
u kodlar bu dile
gimizi yerine getirecektir:
#!/usr/bin/env python3.0
print("Merhaba, ben Python. Monty Python")
isim = input("Senin adn nedir? ")
print("Merhaba", isim)
Bu program al
strd
gmzda, kullancya kendi adyla hitap edebildi
gimizi gryoruz. Bunu
yapabilmek iin, ncelikle input() fonksiyonunun kendisini bir de
gi
sken iinde depoladk. Kullanc ekrana ismini yazd
gnda input() fonksiyonu bu bilgiyi alp isim adl de
gi
sken iinde
saklayacaktr. Bylece bu veriyi daha sonra tekrar kullanabilece
giz. Hemen bir sonraki satrda
da bu veriyi kulland
gmza dikkat edin. Daha nceki derslerde
grendi
gimiz bilgilerden pek
farkl de
gil. Bu kodlardaki tek yenilik, araya bir input() fonksiyonunun yerle
stirilmi
s olmas.
Grd
gnz gibi, input() fonksiyonunun kullanm print() fonksiyonunun kullanmna biraz
benziyor.
Isterseniz kullancyla biraz sohbet edelim, ne dersiniz?
#!/usr/bin/env python3.0
print("Merhaba, ben Python. Monty Python")
isim = input("Senin adn nedir? ")
print("Merhaba", isim)
ya
s = input("Peki ya
sn ka diye sorsam?")
print("Hmmm... Ya
st de
giliz seninle!")
Bu say bir tamsaydr. Ingilizce olarak ifade etmek gerekirse, integer... Bunun bir tamsay
oldu
gunu s
u s
ekilde teyit edebiliriz:
>>> type(a)
<class int>
Burada ald
gmz class int kts, bize a de
gi
skeninin tuttu
gu saynn bir tamsay
oldu
gunu sylyor. int ifadesi, integer (tamsay) kelimesinin ksaltmasdr.
Bir de s
u sayya bakalm:
>>> b = 34.5
>>> type(b)
<class float>
Grd
gnz gibi, type() fonksiyonu bize meyve adl de
gi
skenin de
gerinin bir str yani
string yani karakter dizisi oldu
gunu bildirdi...
S
imdi de etkile
simli kabuktan kp a
sa
gdaki gibi bir program yazalm:
#!/usr/bin/env python3.0
kare = input("Bir say giriniz ltfen:")
print(kare)
print("Girdi
giniz verinin tipi
sudur:")
print(type(kare))
Burada, kullancdan bir say girmesini istedik. Kullanc bir veri girip enter tu
suna bast
gnda,
nce kullancnn girdi
gi verinin kendisi ekrana yazdrlacak, ardndan da bu verinin tipi ekrana
kt olarak verilecektir.
Yukardaki programdan ald
gmz ktnn gsterdi
gi gibi, input() fonksiyonu ile alnan verinin
tipi str, yani karakter dizisidir. Bizim yapmamz gereken s
ey, kullancdan ald
gmz bu karakter dizisini sayya dn
strmek olacaktr. Peki bu dn
strme i
slemi nasl olacak? Hemen
bakalm:
Diyelim ki elimizde s
yle bir say var (Bu arada, artk a
sa
gdaki kod paralarn denemek iin
etkile
simli kabu
gu kullanmann daha pratik oldu
gunu sylememe gerek yok...):
>>> a = 45
Grd
gnz gibi, 45 adl tamsayy, 45.0 adl bir ondalk sayya dn
strdk. S
imdi
type(45.0) komutu bize <class float> ktsn verecektir... E
ger ondalk bir sayy tamsayya evirmek istersek s
u komutu veriyoruz. Mesela ondalk saymz, 56.5 olsun:
>>> int(56.5)
56
Yukardaki rne
gi tabii ki s
yle de yazabiliriz:
>>> a = 56.5
>>> type(a)
56
Bu arada tekrar bir hatrlatma yapalm. Yukardaki ufak kod paralarn etkile
simli kabukta
al
strd
gmz iin print() fonksiyonunu kullanmamza gerek kalmadan ekrana kt alabiliyoruz. Daha nce de dedi
gimiz gibi, bu durum etkile
simli kabu
gun bir zelli
gidir. Yukardaki
kodlar s
u s
ekilde bir metin dosyasna yazarsak kt almamz mmkn olmaz:
#!/usr/bin/env python3.0
say = 56.5
type(say)
Bu program al
strd
gmzda ekranda hibir kt grnmeyecektir. Bu programn al
smas
iin print() fonksiyonunu kullanmamz lazm:
#!/usr/bin/env python3.0
say = 56.5
print(type(say))
Dn
strme i
slemini saylar arasnda yapabilece
gimiz gibi, saylar ve karakter dizileri arasnda
da yapabiliriz. rne
gin s
u bir karakter dizisidir:
>>> nesne = "45"
Yukardaki de
geri trnak iinde belirtti
gimiz iin bu de
ger bir karakter dizisidir. S
imdi bunu bir
tamsayya evirece
giz:
>>> int(nesne)
45
Hatta bir sayy karakter dizisine de evirebiliriz. Bunun iin string (karakter dizisi) kelimesinin ksaltmas olan str parac
gn kullanaca
gz:
>>> s = 6547
>>> str(s)
6547
Yalnz s
unu unutmayn: Bir karakter dizisinin sayya dn
strlebilmesi iin o karakter dizisinin
say de
gerli olmas lazm. Yani 45 de
gerini sayya dn
strebiliriz. nk 45 de
geri, trnaklardan tr bir karakter dizisi de olsa, neticede say de
gerli bir karakter dizisidir. Ama
Grd
gnz gibi, Python bu numaray yutmad!...
Neyse, olmayacak duaya amin demeyi brakp yolumuza devam edelim...
Gelin s
imdi daha byk bir i
slem yapalm. Kullancdan ald
gmz veriyi tamsayya evirelim...
A
sa
gdaki kodlar bir metin dosyasna yazyoruz:
#!/usr/bin/env python3.0
kare = int(input("Bir say giriniz ltfen:"))
print(kare)
print("Girdi
giniz verinin tipi
sudur:")
print(type(kare))
Grd
gnz gibi, type(kare) fonksiyonu bu defa class int kts verdi. Yukardaki kodlar
kafanz kar
strmasn. Istersek bu kodlar s
yle de yazabiliriz:
#!/usr/bin/env python3.0
kare = input("Bir say giriniz ltfen:")
say = int(kare)
print(say)
print("Girdi
giniz verinin tipi
sudur:")
print(type(say))
Bu kodlar bu s
ekilde al
strrsak hata verece
gini biliyoruz artk. O yzden yukardaki kodlarda
s
u de
gi
sikli
gi yapyoruz:
#!/usr/bin/env python3.0
kare = int(input("Bir say gir, ben sana o saynn karesini syleyeyim:"))
print(kare, "saysnn karesi: ", kare**2)
5654 veya 543.34 gibi bir karakter dizisini int() veya float() fonksiyonu yardmyla
tamsayya ya da ondalk sayya da dn
strebiliriz:
>>> int("5654")
>>> int("543.34")
>>> float("5654")
>>> float("543.34")
Ama elma gibi bir karakter dizisini ne int() ne de float() fonksiyonuyla tamsayya veya
ondalk sayya dn
strebiliriz!
Bu bilgileri, nemlerinden tr aklmzda tutmaya al
salm. Buraya kadar anlatlan konular hakknda zihnimizde belirsizlikler varsa veya baz noktalar tam olarak kavrayamadysak,
s
imdiye kadar
grendi
gimiz konular tekrar gzden geirmemiz bizim iin epey faydal olacaktr. Zira bundan sonraki blmlerde, yeni bilgilerin yansra, buraya kadar
grendi
gimiz s
eyleri
de yo
gun bir s
ekilde prati
ge dkece
giz. Bundan sonraki konular takip edebilmemiz asndan,
buraya kadar verdi
gimiz temel bilgileri iyice sindirmi
s olmak i
simizi bir hayli kolayla
stracaktr.
nemli bir konuyu daha geride brakt
gmza gre artk yeni bir blme geebiliriz...
BLM
Durumlar
Pythonda Ko
sula Bagl
2.1 Giri
s
Bu blmde yine ok nemli bir konuya de
ginece
giz: Pythonda ko
sula ba
gl durumlar.
Bu blm sonunda, programlarmza karar vermeyi
gretmi
s olaca
gz.
Bu blmde
grenece
gimiz bilgileri kullanarak, yazd
gmz bir programn, kullancdan gelen verinin
niteli
gine gre farkl i
slemler yapabilmesini sa
glayaca
gz.
Python programlama dilinde, ko
sullu durumlar belirtmek iin adet deyimden yararlanyoruz:
if deyimi
elif deyimi
else deyimi
2.2 if deyimi
E
ger daha nceden herhangi bir programlama dilini az da olsa kurcalama frsatnz olduysa, bir
programlama dilinde if deyimlerinin ne i
se yarad
gn az ok biliyorsunuzdur. Daha nceden
hi bir programclk deneyiminiz olmam
ssa da ziyan yok. Zira bu blmde if deyimlerinin ne
i
se yarad
gn ve nerelerde kullanld
gn enine boyuna tart
saca
gz.
Ingilizce bir kelime olan if, Trkede e
ger anlamna gelir. Anlamndan da karabilece
gimiz
gibi, bu kelime bir ko
sul bildiriyor. Yani e
ger bir s
ey filanca ise... ya da e
ger bir s
ey falanca
ise... gibi... I
ste biz Pythonda bir ko
sula ba
glamak istedi
gimiz durumlar if deyimi aracl
gyla
gsterece
giz.
Gelin isterseniz bu deyimi nasl kullanaca
gmza dair ufack bir rnek vererek i
se ba
slayalm:
ncelikle elimizde s
yle bir de
gi
sken olsun:
35
n = 255
Yukarda verdi
gimiz de
gi
skenin de
gerinin bir karakter dizisi de
gil, aksine bir say oldu
gunu
gryoruz. S
imdi bu de
gi
skenin de
gerini sorgulayalm:
if n > 10:
Bu ifadeyle Pythona s
yle bir s
ey demi
s oluyoruz:
E
ger saynn de
geri 10dan bykse...
Burada kulland
gmz i
saretlere dikkat edin. En sonda bir adet : i
saretinin oldu
gunu gzden
karmyoruz... Bu tr i
saretler Python iin ok nemlidir. Bunlar yazmay unutursak Python
gzmzn ya
sna bakmadan bize hata mesaj gsterecektir.
Dedik ki, if n > 10: ifadesi, e
ger bir saynn de
geri 10dan bykse... anlamna gelir. Bu
ifadenin eksik oldu
gu apak ortada. Yani belli ki bu cmlenin bir de devam olmas gerekiyor.
O halde biz de devamn getirelim:
if n > 10:
print("say 10dan byktr!")
yapn. Ksaca sylemek gerekirse; Pythonda girintileme ve girintilemede tutarllk ok nemlidir. zellikle byk programlarda, girintilemeler asndan tutarszlk gsterilmesi programn
al
smamasna sebep olabilir... Neyse... Konumuza devam edelim.
E
ger yukardaki if blo
gunu bir metin dzenleyici iine de
gil de do
grudan etkile
simli kabu
ga
yazm
ssanz baz s
eyler dikkatinizi ekmi
s olmal... Etkile
simli kabukta if say > 10: satrn
yazp enter tu
suna bast
gnzda s
yle bir grntyle kar
sla
sm
s olmalsnz:
>>> if n > 10:
...
Grd
gnz gibi, print() fonksiyonunu yazp entere bastktan sonra yine ... i
saretini
grdk. Python burada bizden yeni bir satr daha bekliyor. Ama bizim yazacak ba
ska bir
kodumuz olmad
g iin tekrar enter tu
suna basyoruz ve nihai olarak s
yle bir grnt elde
ediyoruz:
>>> if n > 10:
...
print("say 10dan byktr!")
...
say 10dan byktr!
>>>
if say == 10:
print("Girdi
giniz say 10dur!")
Grd
gnz gibi, art arda adet if blo
gu kullandk. Bu kodlara gre, e
ger kullancnn girdi
gi
say 10dan bykse, ilk if blo
gu i
sletilecek; e
ger say 10dan kkse ikinci if blo
gu i
sletilecek; e
ger say 10a e
sit ise nc if blo
gu i
sletilecektir... Peki ya kullanc muziplik yapp say
yerine harf yazarsa ne olacak? Byle bir ihtimal iin programmza herhangi bir denetleyici yerle
stirmedik. Dolaysyla e
ger kullanc say yerine harf girerse programmz hata verecek, yani
kecektir. Bu tr durumlara kar
s nasl nlem alaca
gmz ilerleyen derslerimizde grece
giz.
Biz s
imdilik bildi
gimiz yolda yryelim...
if deyimlerini kullanc ad veya parola denetlerken de kullanabiliriz. Mesela s
yle bir program
tasla
g yazabiliriz:
#!/usr/bin/env python3.0
print("""
Dnyann en geli
smi
s e.posta hizmetine
ho
sgeldiniz... Yalnz hizmetimizden
yararlanmak iin nce sisteme giri
s
yapmalsnz..
""")
parola = input("Parola: ")
if parola == "bilmiyorum":
print("Sisteme Ho
sgeldiniz!")
Grd
gnz gibi, programn ba
snda trnak i
saretlerinden yararlanarak uzun bir metni kullancya gsterdik. Bu blm, kendiniz gze ho
s gelecek bir s
ekilde ssleyebilirsiniz de...
E
ger kullanc, kendisine parola soruldu
gunda cevap olarak bilmiyorum yazarsa kullancy
sisteme alyoruz.
Daha nce de syledi
gimiz gibi, if deyimi d
snda Pythonda ko
sullu durumlar belirtmek iin
kulland
gmz, elif ve else adl iki deyim daha vardr. Bunlar if ile birlikte kullanlrlar. Gelin
isterseniz bu iki deyimden, ad elif olana bakalm...
elif ya
s > 18:
print("Eh, artk ya
s yava
s yava
s kemale eriyor!")
Yukardaki rne
gi elbette s
yle de yazabiliriz:
#!/usr/bin/env python3.0
ya
s = int(input("Ya
snz: "))
if ya
s == 18:
print("18 iyidir!")
if ya
s < 0:
print("Yok canm, daha neler!...")
if ya
s < 18:
print("Gen bir karde
simizsin!")
if ya
s > 18:
print("Eh, artk ya
s yava
s yava
s kemale eriyor!")
Yukardaki kodlar al
strd
gmzda, do
gru olan btn sonular listelenecektir. Yani mesela
kullanc 40 saysn girmi
sse, ekrana verilecek kt s
yle olacaktr:
verdi
giniz say 100den kktr.
verdi
giniz say 50den kktr.
if a < 100:
print("verdi
giniz say 100den kktr.")
elif a < 50:
print("verdi
giniz say 50den kktr.")
elif a == 100:
print("verdi
giniz say 100dr.")
elif a > 150:
print("verdi
giniz say 150den byktr.")
elif a > 100:
print("verdi
giniz say 100den byktr.")
Grd
gnz gibi, elif deyimlerini kulland
gmz zaman, ekrana yalnzca do
gru olan ilk sonu
veriliyor. Yukarda 40 says hem 100den hem de 50den kk oldu
gu halde, Python bu
saynn 100den kk oldu
gunu grr grmez sonucu ekrana basp, kodlarn geri kalann
incelemeyi brakyor. if deyimlerini arka arkaya sralad
gmzda ise, Python btn olaslklar
tek tek de
gerlendirip, geerli olan btn sonular ekrana dkyor...
Bir sonraki blmde else deyimini
grendi
gimiz zaman, elifin tam olarak ne i
se yarad
gn
ok daha iyi anlamanz sa
glayaca
gn d
snd
gm bir rnek verece
gim.
elifi de inceledi
gimize gre, ko
sul bildiren deyimlerin sonuncusuna gz atabiliriz: else
slemi yap
Veya s
yle bir durum:
if falanca:
bu i
slemi yap
elif filanca:
su i
slemi yap
Bu blmde grece
gimiz else deyimi, yukardaki tabloya bamba
ska bir boyut kazandryor.
Dikkat ederseniz s
imdiye kadar
grendi
gimiz deyimleri kullanabilmek iin ilgili btn durumlar
tanmlamamz gerekiyor. Yani:
e
ger byle bir durum varsa:
bunu yap
e
ger
syle bir durum varsa:
sunu yap
e
ger filancaysa:
syle git
e
ger falancaysa:
byle gel
gibi...
Ancak her durum iin bir if blo
gu yazmak bir sre sonra yorucu ve skc olacaktr. I
ste bu
noktada devreye else deyimi girecek. elsenin anlam kabaca s
udur:
e
ger yukardaki ko
sullarn hibiri gerekle
smezse...
Gelin isterseniz bununla ilgili s
yle bir rnek verelim:
#!/usr/bin/env python3.0
soru = input("Bir meyve ad syleyin bana:")
if soru == "elma":
print("evet, elma bir meyvedir...")
elif soru == "karpuz":
print("evet, karpuz bir meyvedir...")
elif soru == "armut":
print("evet, armut bir meyvedir...")
else:
print(soru, "gerekten bir meyve midir?")
E
ger kullanc soruya elma, karpuz veya armut cevab verirse, evet, ... bir meyvedir
kts verilecektir. Ama e
ger kullanc bu d
snda bir cevap verirse, ... gerekten bir
meyve midir? ktsn grrz... Burada else deyimi, programmza s
u anlam katyor:
E
ger kullanc yukarda belirlenen meyve adlarndan hi birini girmez, bunlarn yerine bamba
ska bir s
ey yazarsa, o zaman else blo
gu iinde belirtilen i
slemi gerekle
stir.
Dikkat ederseniz yukardaki kodlarda if deyimlerini art arda sralamak yerine ilk iften sonra
elif ile devam ettik. Peki s
yle bir s
ey yazarsak ne olur?
#!/usr/bin/env python3.0
soru = input("Bir meyve ad syleyin bana:")
if soru == "elma":
print("evet, elma bir meyvedir...")
if soru == "karpuz":
Bu kodlar bekledi
giniz sonucu vermeyecektir. Isterseniz yukardaki kodlar al
strp ne demek
istedi
gimi daha iyi anlayabilirsiniz. Pythonun do
gru sonucu vermesi iin bu tr durumlarda
else deyiminden nce elif deyimlerinden yararlanmalyz...
Yalnz bu dedi
gimizden, else ifadesi if ile birlikte kullanlmaz, anlam karlmamal. Mesela
s
yle bir rnek yaplabilir:
#!/usr/bin/env python3.0
soru = input("Programdan kmak istedi
ginize emin misiniz? \
Eminseniz e harfine basn : ")
if soru == "e":
print("Gle gle!")
else:
print("Peki, biraz daha sohbet edelim!")
=
=
=
=
=
"(1)
"(2)
"(3)
"(4)
"(5)
topla"
kar"
arp"
bl"
karesini hesapla"
#!/usr/bin/env python3.0
seenek1
seenek2
seenek3
seenek4
seenek5
=
=
=
=
=
"(1)
"(2)
"(3)
"(4)
"(5)
topla"
kar"
arp"
bl"
karesini hesapla"
Burada giri
s adl bir de
gi
sken olu
sturduk. Bu de
gi
skenin iinde barndrd
g de
geri kullanclarn grebilmesi iin print() fonksiyonu yardmyla bu de
gi
skeni ekrana yazdryoruz.
Devam edelim:
soru = input("Yapmak istedi
giniz i
slemin numarasn girin: ")
giri
s = """
(1) topla
(2) kar
(3) arp
(4) bl
(5) karesini hesapla
"""
print(giri
s)
soru = input("Yapmak istedi
giniz i
slemin numarasn girin: ")
Bu kodlar al
strd
gmzda, ekranda giri
s paragrafmz grnecek ve kullancya, yapmak istedi
gi i
slemin ne oldu
gu sorulacaktr. Henz kodlarmz eksik oldu
gu iin, kullanc hangi sayy
girerse girsin, programmz hi bir i
s yapmadan kapanacaktr. O halde yolumuza devam edelim:
if soru == "1":
grenmi
stik. Bu i
saret, iki s
eyin ayn de
gere sahip olup olmad
gn kar
sla
strmamz sa
glyor.
Biz burada 1in de
geri ile soru adl de
gi
skenin de
gerinin ayn olup olmad
gn sorguladk.
1in de
geri tabii ki 1dir, ama soru de
gi
skeninin de
geri kullanc tarafndan belirlenece
gi
iin henz bu de
gi
skenin de
gerinin ne oldu
gunu bilmiyoruz. Bizim programmzda kullanc
klavyeden 1, 2, 3, 4 veya 5 de
gerlerinden herhangi birini seebilir... Biz yukardaki
kod yardmyla, e
ger kullanc klavyede 1 tu
suna basarsa ne yaplaca
gn belirleyece
giz. O
halde devam edelim:
if soru == "1":
say1 = int(input("Toplama i
slemi iin ilk sayy girin: "))
say2 = int(input("Toplama i
slemi iin ikinci sayy girin: "))
print(say1, "+", say2, "=", say1 + say2)
Bu kodlar al
strp, klavyede 1 tu
suna bast
gmzda, bizden bir say girmemiz istenecektir.
Ilk saymz girdikten sonra bize tekrar bir say girmemiz sylenecek. Bu emre de uyup enter
tu
suna basnca, girdi
gimiz bu iki saynn topland
gn grece
giz... Fena saylmaz, de
gil mi?
S
imdi programmzn geri kalan ksmn yazyoruz. I
sin temelini kavrad
gmza gre birden fazla
kod blo
gunu ayn anda yazabiliriz:
elif soru == "2":
say3 = int(input("karma i
slemi iin ilk sayy girin: "))
say4 = int(input("karma i
slemi iin ikinci sayy girin: "))
print(say3, "-", say4, "=", say3 - say4)
elif soru == "3":
say5 = int(input("arpma i
slemi iin ilk sayy girin: "))
say6 = int(input("arpma i
slemi iin ikinci sayy girin: "))
print(say5, "x", say6, "=", say5 * say6)
elif soru == "4":
say7 = int(input("Blme i
slemi iin ilk sayy girin: "))
say8 = int(input("Blme i
slemi iin ikinci sayy girin: "))
print(say7, "/", say8, "=", say7 / say8)
elif soru == "5":
say9 = int(input("Karesini hesaplamak istedi
giniz sayy giriniz: "))
print(say9, "saysnn karesi =", say9 ** 2)
else:
print("Yanl
s giri
s.")
print("A
sa
gdaki seeneklerden birini giriniz:", giri
s)
E
ger byle bir durum varsa:
syle bir i
slem yap
Yok e
ger
syle bir durum varsa:
byle bir i
slem yap
E
ger bamba
ska bir durum varsa:
syle bir
sey yap
Bylelikle s
irin bir hesap makinesine sahip olmu
s olduk!... Hesap makinemiz pek yetenekli
de
gil, ama olsun... Henz bildiklerimiz bunu yapmamza msaade ediyor. Yine de ba
slangtan
bu noktaya kadar epey yol katetti
gimizi gryorsunuz.
S
imdi bu program al
strn ve neler yapabildi
gine gz atn. Bu arada kodlar da iyice inceleyin.
Program yeterince anladktan sonra, program zerinde kendinize gre baz de
gi
siklikler yapn,
yeni zellikler ekleyin. Eksikliklerini, zayf ynlerini bulmaya al
sn. Bylece bu dersten azami
fayday sa
glam
s olacaksnz.
Bu arada bu blmde yazd
gmz basit hesap makinesinin Python 2.x iin olan bir benzerini
zamannda http://www.istihza.com/kosul_elif.html adresinde vermi
stim. O kodlarla bu kodlar
kar
sla
strarak, Python 2.x ve 3.x srmleri arasndaki baz farklar grebilirsiniz...
BLM
S
imdiye kadar Pythonla baz ufak programlar yazabilecek dzeye geldik. Mesela
grendi
gimiz
bilgiler yardmyla bir nceki blmde ok basit bir hesap makinesi yapabilmi
stik. Yalnz o
hesap makinesinde farkettiyseniz ok nemli bir eksiklik vard. Hesap makinemizle hesap
yaptktan sonra programmz kapanyor, yeni hesap yapabilmek iin program yeniden ba
slatmamz gerekiyordu...
Mesela bununla ilgili s
yle bir rnek daha verelim:
#!/usr/bin/env python3.0
tuttu
gum_say = 23
bilbakalm = int(input("Aklmdan bir say tuttum. Bil bakalm ka tuttum?? "))
if bilbakalm == tuttu
gum_say:
print("Tebrikler! Bildiniz...")
else:
print("Ne yazk ki tuttu
gum say bu de
gildi...")
Burada tuttu
gum_say adl bir de
gi
sken belirledik. Bu de
gi
skenin de
geri 23. Kullancdan
tuttu
gumuz sayy tahmin etmesini istiyoruz. E
ger kullancnn verdi
gi cevap tuttu
gum_say
de
gi
skeninin de
geriyle aynysa (yani 23 ise), ekrana Tebrikler!... yazs dklecektir. Aksi
halde (else) Ne yazk ki... cmlesi ekrana dklecektir.
Bu program iyi, ho
s, ama ok nemli bir eksi
gi var. Bu program yalnzca bir kez kullanabiliyoruz. Yani kullanc yalnzca bir kez tahminde bulunabiliyor. E
ger kullanc bir kez daha tahminde bulunmak isterse program yeniden al
strmas gerekecek... Bunun hi iyi bir yntem
olmad
g ortada. Programmz srekli olarak ba
sa dnse ne iyi olurdu, de
gil mi? Yani kullanc
bir say tahmin ettikten sonra, e
ger bu say bizim tuttu
gumuz sayyla ayn de
gilse, kullancya
tekrar tahmin etme frsat verebilsek ok ho
s olurdu...
I
ste bu blmde, programlarmz nasl dng iine sokabilece
gimizi, yani nasl srekli
olarak al
smalarn sa
glayabilece
gimizi
grenece
giz.
49
Burada Pythona s
u emri vermi
s olduk:
a de
gi
skeninin de
geri 1 oldu
gu srece, ekrana bilgisayar ldrd! yazsn dk!
Bu program al
strd
gmzda Python verdi
gimiz emre sadakatle uyacak ve a de
gi
skeninin
de
geri 1 oldu
gu mddete de bilgisayarmzn ekranna bilgisayar ldrd! yazsn dkecektir. Programmzn iinde a de
gi
skeninin de
geri 1 oldu
gu ve bu de
gi
skenin de
gerini
de
gi
stirecek herhangi bir s
ey bulunmad
g iin Python hi sklmadan ekrana bilgisayar
ldrd! yazsn basmaya devam edecektir. E
ger siz durdurmazsanz bu durum sonsuza kadar
devam edebilir. Bu lgnl
ga bir son vermek iin klavyenizde CTRL+C veya CTRL+Z tu
slarna
basarak program durmaya zorlayabilirsiniz...
Burada programmz sonsuz bir dngye sokmu
s olduk (infinite loop). Esasnda sonsuz
dngler genellikle bir program hatasna i
saret eder. Yani o
gu durumda programcnn arzu
etti
gi s
ey bu de
gildir. O yzden do
gru yakla
sm, dngye soktu
gumuz programlarmz durduracak bir lt belirlemektir. Yani yle bir kod yazmalyz ki, a de
gi
skeninin 1 olan de
geri bir
noktadan sonra artk 1 olmasn ve bylece o noktaya ula
sld
gnda programmz dursun. Kullancnn CTRL+C tu
slarna basarak program durdurmak zorunda kalmas pek ho
s olmuyor...
Gelin isterseniz bu soyut ifadeleri biraz somutla
stralm. ncelikle s
u iki satr yazarak i
se
ba
slyoruz:
#!/usr/bin/env python3.0
a = 1
Ne oldu? Istedi
gimizi elde edemedik, de
gil mi? Programmz yine sonsuz dngye girdi... Bu
sonsuz dngy krmak iin CTRL+C (veya CTRL+Dye) basmamz gerekecek yine...
Sizce buradaki hata nereden kaynakland? Yani neyi eksik yaptk da programmz sonsuz
dngye girmekten kurtulamad? Aslnda bunun cevab ok basit. Biz yukardaki kodlar
yazarak Pythona s
u emri vermi
s olduk:
ann de
geri 10dan kk oldu
gu mddete ekrana bilgisayar yine ldrd!
yazsn bas!
a de
gi
skeninin de
geri 1. Yani 10dan kk... Dolaysyla Pythonun ekrana o kty basmasn
engelleyecek herhangi bir s
ey yok... S
imdi bu problemi nasl a
saca
gmz grece
giz:
#!/usr/bin/env python3.0
a = 1
while a < 10:
a = a + 1
print("bilgisayar yine ldrd!")
ann de
gerini yine 1 artryor ve ay 3 yapyor.
ann de
geri hl 10dan kk oldu
gu iin ekrana yine ilgili kty veriyor.
Ikinci dngy de bitiren Python yine ba
sa dnyor ve ann de
gerinin 3 oldu
gunu
gryor.
Yukardaki admlar tekrar eden Python, ann de
gerini 9 yapana kadar geliyor.
ann de
geri 9a ula
st
gnda Python ann de
gerini bir kez daha artrnca bu de
ger 10a
ula
syor.
Python ann de
gerinin artk 10dan kk olmad
gn gryor ve programdan kyor...
Yukardaki kodlar s
yle yazarsak belki durum daha anla
slr olabilir:
#!/usr/bin/env python3.0
a = 1
while a < 10:
a = a + 1
print(a)
say5 = int(input("arpma i
slemi iin ilk sayy girin: "))
say6 = int(input("arpma i
slemi iin ikinci sayy girin: "))
print(say5, "x", say6, "=", say5 * say6)
elif soru == "4":
say7 = int(input("Blme i
slemi iin ilk sayy girin: "))
say8 = int(input("Blme i
slemi iin ikinci sayy girin: "))
print(say7, "/", say8, "=", say7 / say8)
elif soru == "5":
say9 = int(input("Karesini hesaplamak istedi
giniz sayy giriniz: "))
print(say9, "saysnn karesi =", say9 ** 2)
else:
print("Yanl
s giri
s.")
print("A
sa
gdaki seeneklerden birini giriniz:", giri
s)
Burada girintilere zellikle dikkat ediyoruz. while dngsnn kendisi zaten girintili bir kod
yazmay gerektirdi
gi iin kendisinden sonra gelen btn kodlar da bir seviye sa
ga kaydrdk.
Ayrca burada yapt
gmz s
ey aslnda kullancya 9 kez hesap yapma hakk vermek oldu... a
de
gi
skeninin ilk de
geri 1 oldu
gu ve lt olarak belirledi
gimiz say 10 oldu
gu iin kullanc
ancak 9 kez art arda hesap yapabilir bu kodlara gre...
Aslnda burada bir problem var. Kullancya 9 kez art arda hesap yapma hakk veriyoruz, ama
ona istedi
gi zaman programdan kma hakk tanmyoruz. Bu kodlar al
stran bir kullanc
programdan kmak iin 9 kez hesap yapmak zorunda kalacaktr! Bunun iyi bir yntem olmad
g ak. O halde gelin bu soruna bir are bulalm. Mesela kullanc klavyedeki harfine
bast
gnda programdan kabilsin... A
sa
gdaki kodlar dikkatlice inceleyin:
#!/usr/bin/env python3.0
a = 1
while a == 1:
giri
s = """
(1) topla
(2) kar
(3) arp
(4) bl
(5) karesini hesapla
Programdan kmak iin "" harfine basnz...
"""
print(giri
s)
soru = input("Yapmak istedi
giniz i
slemin numarasn girin: ")
if soru == "1":
say1 = int(input("Toplama i
slemi iin ilk sayy girin: "))
say2 = int(input("Toplama i
slemi iin ikinci sayy girin: "))
print(say1, "+", say2, "=", say1 + say2)
elif soru == "2":
say3 = int(input("karma i
slemi iin ilk sayy girin: "))
say4 = int(input("karma i
slemi iin ikinci sayy girin: "))
print(say3, "-", say4, "=", say3 - say4)
Programmzn en ba
sndaki while dngsn nasl kurdu
gumuza dikkat edin. S
yle dedik:
a = 1
while a == 1:
nce ann de
gerini 1 olarak belirledik ve s
u emri verdik:
a de
gi
skeninin de
geri 1 oldu
gu mddete a
sa
gdaki kodlar al
str...
Dikkat ederseniz burada a = a + 1 gibi bir s
ey yazmadk. nk buna gerek kalmad. a
de
gi
skeninin de
gerini her dngde 1 artrmak yerine, a de
gi
skenin de
gerini, yeni ekledi
gimiz
elif blo
gu iinde de
gi
stirdik. Farkettiyseniz, bu yeni elif blo
gu iinde a = 0 diye bir satr
var. I
ste bu satr sayesinde, kullanc harfine bast
gnda a de
gi
skeninin de
geri de 0
olarak belirleniyor. Bizim en ba
sta belirledi
gimiz, programn al
smaya devam etme s
art a
= 1 oldu
gu iin, Python artk a de
gi
skeninin de
gerinin 1 de
gil 0 oldu
gunu grnce
programdan kyor... Ayrca programmzn en sonundaki else blo
gunda da ufak bir kozmetik
de
gi
siklik yaptk. Daha nce else blo
gunu s
yle yazm
stk:
else:
print("Yanl
s giri
s.")
print("A
sa
gdaki seeneklerden birini giriniz:", giri
s)
grenece
giz. O halde hi vakit kaybetmeden bu dngnn ne olup ne olmad
gna bir bakalm:
Isterseniz for dngsn do
grudan tarif etmeye al
smak yerine, basit bir rnek yardmyla
bu dngy kavramaya al
salm:
isim = "istihza"
for harfler in isim:
print(harfler)
Bu kodlar incelemeye ba
slamadan nce, isterseniz kodlarmz al
strp ne i
s yapt
gna bir
bakalm. Bu kodlar al
strd
gmz zaman s
yle bir kt elde edece
giz:
i
s
t
i
h
z
a
Grd
gnz gibi, yazd
gmz kodlar, isim de
gi
skeninin de
gerini alp her bir harfi alt alta
ekrana yazdrd. Peki bu nasl oldu? Hemen, yazd
gmz kodlar incelemeye koyulalm.
ncelikle, her zaman yapt
gmz gibi, bir de
gi
sken tanmlyoruz:
isim = "istihza"
Bu kodlar al
strd
gmz zaman, 1den 10a kadar olan saylarn ekrana basld
gn grrz.
Byle bir s
eyi for dngsn kullanarak, daha kolay bir s
ekilde yapabiliriz:
for saylar in range(10):
print(saylar)
...yukardaki kodlar s
u s
ekilde yazabilirsiniz:
for araya_nokta in "PYTHON":
print(araya_nokta, end=".")
print()
Bu komutu verdi
gimizde s
yle bir kt alrz:
range(0, 10)
Buradan anlad
gmza gre, range(10) komutu, ierisinde 0dan 10a kadar olan saylar
barndryor (10 says hari). Bu saylar listelemek iin s
yle bir komut vermemiz gerekir:
>>> list(range(10))
Burada, list() adl yeni bir fonksiyon daha gryoruz. Bu fonksiyonu bu derste incelemeyece
giz. list() fonksiyonu daha sonraki bir dersimizin konusu olacak. Biz s
imdilik bu fonksiyonun, listeleme grevi grd
gn bilelim. list() fonksiyonunun buradaki grevi, range()
fonksiyonu iindeki saylar listelemektir. Yukardaki komutu i
sletti
gimizde s
yle bir kt alaca
gz:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Bylece range() fonksiyonu yardmyla, 0dan 10a kadar olan saylar listelemi
s olduk. Burada
10 saysnn listede yer almad
gna dikkat edin. Ayrca, yukardaki komutu etkile
simli kabukta
yazd
gmz iin ba
sa print() komutunu eklemek zorunda kalmadk. Ama e
ger bu kodlar bir
dosya iine yazp kaydetmi
s olsaydk, ba
sa mutlaka print() fonksiyonunu eklememiz gerekecekti:
print(list(range(10)))
Burada, at
gmz btn parantezleri satr sonunda kapatmay unutmuyoruz... E
ger btn
parantezleri kapatmazsak programmz hata verecektir...
range() fonksiyonu baz ba
ska gzellikler de sunar bize. Mesela bu fonksiyonu kullanrken
mutlaka 0dan ba
slamak gibi bir mecburiyetimiz yoktur. rne
gin s
yle bir s
ey yazabiliriz:
>>> list(range(1, 11))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Grd
gnz gibi, yukardaki komut yardmyla 1den 10a kadar olan saylar yazdrabildik. Burada, range() fonksiyonunun saymaya katan ba
slayaca
gn nasl belirledi
gimize dikkat edin.
E
ger 2den 10a kadar olan btn saylar listelemek isteseydik s
yle bir s
ey yazacaktk:
>>> list(range(2, 11))
Burada ba
slang_de
geri olarak belirtti
gimiz yere, saymaya katan ba
slayaca
gmz yazyoruz. biti
s_de
gerine sayma i
sleminin hangi sayya kadar devam edece
gini yazaca
gz.
atlama_de
geri s
eklinde gsterdi
gimiz ifadeye ise, range() fonksiyonunun, ba
slang
de
gerinden biti
s de
gerine kadar olan saylar sralarken kaar kaar atlamas gerekti
gini yazmamz gerekiyor. range() fonksiyonunda ba
slang_de
gerinin varsaylan bir de
geri vardr.
Bu de
ger 0dr. Yani e
ger range() fonksiyonunu kullanarak 100e kadar sayacaksanz ve
list(range(100)) gibi bir kod yazm
ssanz, Python sizin 0dan ba
slamak istedi
ginizi varsayacaktr. biti
s_de
gerinin varsaylan bir de
geri yoktur. Bunu bizim belirlememiz gerekir. atlama_de
gerinin varsaylan de
geri ise 1dir. Yani e
ger herhangi bir atlama de
geri belirtmezseniz, Python sizin birer birer saymak istedi
ginizi varsayacaktr. Dolaysyla, list(range(100))
gibi bir kod yazd
gmzda Python bunu alttan alta s
u s
ekilde grecektir:
>>> list(range(0, 100, 1))
E
ger 0dan 100e kadar olan saylar iki
ser iki
ser atlayarak listelemek istiyorsanz ve bu iste
ginizi s
u s
ekilde belirtirseniz Pythonun kafasnn kar
smasna yol aarsnz:
>>> list(range(100, 2))
Ksacas, e
ger range() fonksiyonunun kaar kaar sayaca
gn da belirtmek istiyorsak, parantez
iine, gerekli btn saylar yazmalyz...
Bu arada, range(100, 2) gibi bir ifade yazarak saylar geriye do
gru listeleyemeyecek
olmamz, hi bir s
ekilde geriye do
gru sayamayaca
gmz anlamna gelmiyor. Elbette atlama_de
geri parametresine eksi de
gerli bir say vererek range() fonksiyonunun geriye do
gru
saymasn da sa
glayabiliriz:
>>> list(range(100, 2, -1))
...gibi...
Sanrm tekrar hatrlatmaya gerek yok. Yukardaki kodlar e
ger bir dosyaya yazp al
stracaksanz, ba
slarna print() fonksiyonunu da eklemeniz gerekir. Dolaysyla yukarda en son
verdi
gimiz rnek bir dosya iinde s
yle grnecektir:
Grd
gnz gibi, bir sr parantez i
sareti oldu kodlarmz iinde. Esasnda yukarda yapt
gmz i
slemleri yapabilmek iin farkl bir yol da izleyebiliriz. range() fonksiyonunu yukardaki
s
ekillerde kullanmak yerine, bunu bir for dngs iine de alabiliriz:
for i in range(0, 100, 2):
print(i)
Bu kodlar al
strd
gmzda s
yle bir kt elde ederiz:
0
2
4
6
8
10
12
14
16
18
Burada gerekle
sen sreci kabaca s
yle ifade edebiliriz:
0dan 10a kadar olan btn saylar tek tek tara ve bunlarn her birini ift_saylar olarak
adlandr. E
ger ift_saylar olarak adlandrd
gmz bu saylar iinde 2ye tam blnen saylar
varsa bunlar ekrana yazdr...
% i
slecinin ne i
se yarad
gn daha nceki derslerimizden hatrlyorsunuz....
BLM
Listeler
4.1 Giri
s
Bu blmde yine Pythonun ok nemli bir
gesinden bahsedece
giz. Bu dersimizin konusu
Pythonda Listeler.
Aslnda biz range() fonksiyonunu incelerken, ucundan da olsa listeleri grm
stk. Mesela s
u
rne
gi hatrlyorsunuz:
list(range(10))
Bu komut s
yle bir kt veriyordu:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
I
ste yukarda grd
gmz bu kt aslnda bir listedir... Teknik bir dille ifade etmek gerekirse,
listeler Pythondaki veri tiplerinden (data types) yalnzca bir tanesidir. S
imdiye kadar
grd
gmz veri tipleri arasnda saylar ve karakter dizileri vard... Dolaysyla, saylar,
karakter dizileri ve listeler Pythonda veri tipi ad verilen bir grubun yesidir. Bu
teknik terimleri elbette ezberlemek zorunda de
gilsiniz. Ama bilmenin zararn de
gil faydasn
grrsnz.
Pythonda listeler konusuna ksa bir giri
s yapt
gmza gre artk yava
s yava
s ayrntlara inmeye ba
slayabiliriz.
Burada hi bir
ge iermeyen bo
s bir liste tanmladk. Bunu ekrana basmak istersek s
yle
yapmamz gerekti
gini biliyorsunuz:
60
print(liste)
Tabii bo
s bir liste tanmlad
gmz iin elde etti
gimiz kt da bo
s bir liste oldu... Burada s
a
slacak
bir s
ey yok. S
imdi isterseniz gelin bo
s bir liste yerine, iinde birka
ge barndran daha i
slevli
bir liste yapalm:
diller = ["python", "php", "perl", "C++"]
Grd
gnz gibi, programlama dillerinin bazlarn sralad
gmz, diller adl bir liste olu
sturduk. Dikkat ederseniz, liste tanmlamak, de
gi
sken veya karakter dizisi tanmlamaya ok benziyor. Listeleri ba
ska veri tiplerinden ayran en nemli zellik, [] i
saretidir. Bu i
saret, arka
arkaya dizilmi
s
gelerin bir liste oldu
gunu gsterir. Yani [] i
sareti Pythonda listelerin ayrt
edici zelli
gidir. Gelin isterseniz elimiz al
ssn diye bir ba
ska liste daha tanmlayalm:
al
sveri
s = ["elma", "armut", "kabak", "ekmek", "ilek", "
seker", "
seftali"]
Bu listemizin
geleri ise tamsaylardan (integers) olu
smu
s.
lerinden olu
smu
s melez bir liste dahi tanmlayabiliriz:
Bylece i
sletim sistemlerinin adlarn ieren bir liste tanmlam
s olduk.
grendi
gimize gre bu listeyi s
u s
ekilde ekrana basabiliriz:
print(sistemler)
Buna hemen bir rnek verelim. Diyelim ki sistemler adl listedeki GNU/Linux
gesini almak
istiyoruz. S
yle bir s
ey deneyelim:
>>> print(sistemler[1])
Mac Os X
E
ger sra numaras olarak pozitif bir say yerine negatif bir say kullanrsak, liste soldan sa
ga
de
gil, sa
gdan sola, yani geriye do
gru taranacaktr:
>>> print(sistemler[-1])
Windows
>>> print(sistemler[-2])
Mac Os X
>>> print(sistemler[-3])
GNU/Linux
S
imdi mesela yukardaki listeden 1-3 aras
geleri alalm:
>>> print(isimler[1:3])
[Sonu Nigam, Kajol Devgan]
geyi ierirken 3.
geyi iermez... Bu arada, bu i
sleme Pythoncada dilimleme (slicing) ad
verilir. Gerekten de burada yapt
gmz s
ey bir listeyi dilimlemekten ibarettir...
Ayn listeden devam edelim:
>>> print(isimler[2:5])
[Kajol Devgan, Rani Mukherjee, Preity Zinta]
Liste
gelerine tek tek eri
sirken yapt
gmz gibi, burada da negatif saylardan yararlanabiliriz:
>>> print(isimler[0:-1])
Grd
gnz gibi, yukardaki komut bir listenin son
gesini krpmak iin gayet etkili bir yoldur.
Burada farkl saylarla kendi kendinize deneme yaparsanz Pythondaki dilimleme mekanizmasn daha iyi kavrayabilirsiniz.
Listelerdeki bu sra saylarnn baz varsaylan de
gerleri vardr. Mesela, e
ger ilk sayy belirtmezseniz, Python ilk sayy 0 varsayacaktr. Yani:
>>> print(isimler[:4])
[Udith Narayan, Sonu Nigam, Kajol Devgan, Rani Mukherjee]
Grd
gnz gibi, ilk sayy belirtmedi
gimizde Python sanki isimler[0:4] yazm
sz gibi
davrand. Peki ya ikinci sayy belirtmezsek ne olur?
>>> print(isimler[0:])
[Udith Narayan, Sonu Nigam, Kajol Devgan, Rani Mukherjee,
Preity Zinta, Lata Mangeshkar]
>>> print(isimler[0:6:2])
[Udith Narayan, Kajol Devgan, Preity Zinta]
Grd
gnz gibi, nc say olarak verdi
gimiz 2 sayesinde liste
gelerini birer atlayarak
ekrana yazdrdk. Burada farkl saylar deneyerek sistemi daha iyi anlayabilirsiniz.
Aslnda yukardaki son rne
gi, listelerin varsaylan de
gerlerinden yararlanarak daha basit bir
s
ekilde yazabilirsiniz:
>>> print(isimler[::2])
[Udith Narayan, Kajol Devgan, Preity Zinta]
Bildi
giniz gibi, e
ger ilk sayy belirtmezseniz Python 0 demek istedi
ginizi, ikinci sayy belirtmezseniz de listedeki
ge saysn kullanmak istedi
ginizi varsayacaktr. Dolaysyla bizim 0
ve 6y ayrca belirtmemiz s
art de
gil.
S
imdi verece
gimiz rne
gi dikkatlice inceleyin:
>>> print(isimler[::-1])
[Lata Mangeshkar, Preity Zinta, Rani Mukherjee, Kajol Devgan,
Sonu Nigam, Udith Narayan]
Grd
gnz gibi, nc say olarak negatif bir de
ger de verebiliyoruz. nc say olarak
-1 verdi
gimiz zaman Python listeyi geriye do
gru sralayacaktr. Dolaysyla yukardaki komutu kullanarak, herhangi bir listeyi ters evirebiliriz. Bu zellik bir yerlerde mutlaka i
sinize
yarayacaktr.
Hatrlarsanz bir nceki blmde s
yle iki tane listemiz vard:
>>> liste1 = ["kedi", 4, 3.5]
>>> liste2 = ["kuzu", 12, 15.4, ["salam", "sucuk"], liste1]
[salam, sucuk]
Grd
gnz gibi, son rnekte tek bir
ge de
gil, listenin kendisini alyoruz. nk liste2 adl
listenin nc
gesi bir listedir. ([salam, sucuk]). Mesela sadece salam
gesini almak
istersek s
yle bir yol izlememiz gerekir:
>>> print(liste2[3][0])
salam
E
ger liste2 listesinin drdnc
gesini tersten sralamak isterseniz s
yle bir s
ey yazmanz
gerekti
gini tahmin edebilirsiniz:
>>> print(liste2[4][::-1])
[3.5, 4, kedi]
Grd
gnz gibi, listemizde 10.
ge diye bir s
ey yok. nk bildi
giniz gibi listelerde saymaya 0dan ba
slyoruz. Yalnz farkettiyseniz len() fonksiyonu do
gal olarak saymaya sfrdan ba
slamyor. nk bu fonksiyon liste
gelerinin srasyla ilgilenmiyor. Bu fonksiyonun
ilgilendi
gi s
ey listedeki
gelerin says.. len() fonksiyonu bir listedeki
genin srasyla ilgili
herhangi bir bilgi vermez bize. Bu fonksiyonu kullanarak o listenin ka adet
gesi oldu
gunu
ge liste uzunlu
gunun bir eksi
gi olacaktr. Yani bizim rne
gimizde son
ge 10-1 s
eklinde
gsterilebilir... Yani aslnda yukardaki kodu s
yle de yazabiliriz:
>>> print(liste[10-1])
nlk
Yukardaki kod s
ununla e
sde
gerdir:
>>> print(list(range(10))
Hatta istersek for dngsn kullanarak da benzer bir sonu elde edebiliriz:
>>> for i in range(len(liste)):
...
print(i)
Gelin isterseniz s
imdiye kadar
grendiklerimizle az ok yararl bir program yazalm. Mesela
yukardaki listemizin
gelerini tek tek ekrana basalm ve her
genin solunda birer numara
gsterelim. Yani elde etmek istedi
gimiz kt s
yle bir s
ey olsun:
1. kitap
2. defter
3. kalem
4. silgi
5. tebe
sir
6. tahta
7. sra
8.
grenci
9. okul
10.nlk
ncelikle s
yle bir s
eyler deneyelim:
>>> for eleman in liste:
...
print(eleman)
kitap
defter
kalem
silgi
tebe
sir
tahta
sra
grenci
okul
nlk
Liste
gelerini ba
saryla ekrana yazdrdk. Ama bu kt bizim yapmaya al
st
gmz s
eyden
biraz uzak oldu. Demek ki kodlarmzda baz de
gi
siklikler yapmamz gerekiyor. Bir defa, bu
gelerin her birinin srasn da ekrana basabilmeliyiz. Yani 1. defter, 2. kalem, gibi...
>>> for i in range(len(liste)):
...
print(i, liste[i])
0
1
2
3
4
5
6
7
8
9
kitap
defter
kalem
silgi
tebe
sir
tahta
sra
grenci
okul
nlk
Biraz kar
sk m grnd gznze? Hi endi
selenmeyin. Burada ne yapt
gmz tane tane
anlataca
gz s
imdi... ncelikle s
u satra bakalm:
>>> for i in range(len(liste)):
...
Burada yapt
gmz s
ey, listedeki
ge saysn range() fonksiyonuna atamak. Yani aslnda s
yle
bir s
ey yazm
s olduk:
Elbette buraya her zaman 10 gibi sabit bir say yazamayabiliriz. nk burada kulland
gmz
listeyi kendimiz olu
sturduk ve ka
geden meydana geldi
gini biliyoruz, ama gerek hayatta
bir listeyi her zaman kendiniz hazrlamam
s olabilirsiniz. Mesela ba
skasnn olu
sturdu
gu bir
listeyi alp zerinde i
slem yapmanz gerekebilir. yle bir durumda o listenin ka
geden olu
stu
gunu kesin olarak bilemezsiniz. Hatta yazd
gnz bir programn i
sleyi
si srasnda srekli olarak
byyen bir liste de sz konusu olabilir. Bu tr durumlar iin en uygun yol, sabit bir say yazmaya al
smak yerine, bir forml kullanmak olacaktr. Bir listenin uzunlu
gunu bize verecek en
uygun forml len(liste) formldr... Dolaysyla s
yle bir s
ey yazmamz gerekir:
>>> for i in range(len(liste)):
...
S
imdi yazd
gmz kodlar incelemeye devam edelim. Ilk satrla beraber, ikinci satr olarak s
yle
bir s
ey yazdk:
>>> for i in range(len(liste)):
...
print(i, liste[i])
Grd
gnz gibi, bu kodlar, elimizdeki listenin uzunlu
gu kadar sayy ekrana basyor. Yani
sanki s
yle bir s
ey yazm
sz gibi:
>>> for i in range(10):
...
print(i)
S
imdi de kodlarmzn geri kalanna bakalm. nce tekrar topluca grelim kodlarmz:
>>> for i in range(len(liste)):
...
print(i, liste[i])
...veya...
>>> print(liste[2])
...gibi...
I
ste yukarda da aslnda bu kalba uygun bir kod yazdk... Birazck sadele
stirelim:
>>> for i in range(len(liste)):
...
print(liste[i])
kitap
defter
kalem
silgi
tebe
sir
tahta
sra
grenci
okul
nlk
Sanrm ne yapt
gmz artk anladnz. Grd
gnz gibi, range(len(liste)) komutu, listenin
uzunlu
gu kadar olan saylar ekrana basyor. I
ste biz bu saylar liste[i] s
eklinde tek tek kullanyoruz. Buradaki for dngs sayesinde range(len(liste)) komutunun retti
gi her bir say
tek tek liste[i] komutuna atanyor. liste[0], liste[1], liste[2], liste[3], gibi...
ktda grnen liste
gelerinin sol tarafnda her birinin srasnn da grnmesi iin kodlarmz
tabii ki s
yle yazdk:
>>> for i in range(len(liste)):
...
print(i, liste[i])
0
1
2
3
4
5
6
7
8
9
kitap
defter
kalem
silgi
tebe
sir
tahta
sra
grenci
okul
nlk
Yalnz, grd
gnz gibi kodlarmz henz elde etmek istedi
gimiz ktdan hl biraz farkl...
Bizim elde etmek istedi
gimiz kt s
yle bir s
eydi:
1. kitap
2. defter
3. kalem
4. silgi
5. tebe
sir
6. tahta
7. sra
8.
grenci
9. okul
10.nlk
1.
2.
3.
4.
5.
6.
7.
8.
9.
defter
kalem
silgi
tebe
sir
tahta
sra
grenci
okul
nlk
sep parac
gn nceki derslerimizden hatrlyorsunuz. Bu parack sayesinde
geler arasna
istedi
gimiz ifadeyi yerle
stirebiliyorduk. Biz yukardaki rnekte her bir
genin arasna . i
sareti
koymak iin kullandk bu parac
g...
Yalnz, her ne kadar yukardaki kodlarla son darbeyi vurdu
gumuzu sylesek de aslnda son
darbeyi henz vuramadk... Neden mi? nk ktda saymaya sfrdan ba
slanyor. Bizim
istedi
gimiz s
ey saymaya 0dan de
gil, 1den ba
slamakt. Saymaya 0dan ba
slamak Python
iin do
gal olsa da son kullanc asndan biraz tuhaf gelebilecek bir s
eydir... Iyi bir programc,
yazd
g programlarda mutlaka son kullancy da d
snmelidir. Sonuta sizin yazd
gnz program sizden ok, programlamadan hi bir s
ey anlamayan insanlar kullanacaktr. O yzden
son kullancy d
snmeniz gerekir... Bu sorunu da ufak bir kodla halledece
giz:
>>> for sondarbe in range(len(liste)):
...
print(sondarbe+1, liste[sondarbe], sep=". ")
1. kitap
2. defter
3. kalem
4. silgi
5. tebe
sir
6. tahta
7. sra
8.
grenci
9. okul
10.nlk
Grd
gnz gibi, sondarbe+1 s
eklinde bir kod yazarak sorunumuzu zebildik. Bylece
Python her bir sayya 1 ekleyecek, dolaysyla her bir
genin sras 1 say artrlacaktr. Bu
da bize yukardaki gibi, kullanc asndan daha do
gal grnen bir kt verecektir.
Bylece len() fonksiyonunu enine boyuna incelemi
s olduk. Yalnz bir noktay zellikle vurgulamakta fayda var: len() fonksiyonu sadece listelerle kullanlabilecek bir fonksiyon de
gildir.
len() fonksiyonunu, uzunlu
gu llebilecek her s
ey iin kullanabiliriz. Mesela karakter
dizilerinin de bir uzunlu
gu vardr. Hemen bir rnek verelim:
>>> a = "Kahramanmara
sl Abdullah"
>>> print(len(a))
24
Demek ki Kahramanmara
sl Abdullah karakter dizisinde 24 adet karakter varm
s. Bu 24
saysna iki kelime arasndaki bo
sluk karakterinin de dahil oldu
gunu unutmayn. nk
bo
slu
gun kendisi de bir karakterdir...
Hatta listelerin bir zelli
gi olarak grd
gmz dilimleme tekni
gi, karakter dizilerine de uygulanabilir. Buna da bir rnek verelim:
>>> a = "Kahramanmara
sl Abdullah"
>>> print(a[0])
K
S
imdilik burada bir nokta koyup konuyu kapatalm. Daha sonraki derslerimizde Karakter
Dizileri konusunu yeniden ve olduka ayrntl bir s
ekilde ele alaca
gz. O zaman karakter
dizilerinin btn zelliklerine tek tek bakaca
gz. Biz listeleri incelemeye devam edelim...
siklik Yapmak
4.5 Liste gelerinde
Degi
S
imdiye kadar listelerle ilgili pek ok s
ey
grendik saylr. Ama henz bir listenin
gelerini nasl
de
gi
stirebilece
gimizi bilmiyoruz. I
ste bu derste bu eksi
gimizi kapataca
gz. Yani bir listedeki
tanmlanm
s
geleri nasl de
gi
stirece
gimizi grece
giz. I
se bir liste tanmlayarak ba
slayalm:
>>> met = ["Kwrite", "Kate", "Emacs", "Vi", "Notepad"]
S
imdi listemizin son halini kontrol edelim:
>>> print(met)
[Vim, Kate, Emacs, Vi, Notepad]
Grd
gnz gibi, listemizin ilk
gesi olan Kwrite gitti, onun yerine Vim geldi. Pythonda
liste
gelerini de
gi
stirmenin ne kadar kolay oldu
gunu gryorsunuz. Siz de bu listenin ba
ska
gelerini de
gi
stirerek pratik yapabilirsiniz...
Bu noktada listelerin ilgin bir zelli
ginden sz edece
giz. S
imdi met adl listemizi ba
ska bir
de
gi
skene atayalm:
>>> yeni_liste = met
>>> print(met)
[Vim, Kate, Emacs, Vi, Notepad]
>>> print(yeni_liste)
[Vim, Kate, Emacs, Vi, Notepad]
Grd
gnz gibi yeni_liste ve met ayn nesneye atfta bulunuyor. Dolaysyla ikisi de ayn
kty veriyor. S
imdi s
yle bir i
slem yapalm:
>>> yeni_liste[0] = "IDLE"
S
imdi iki listeyi de yazdralm:
>>> print(yeni_liste)
[IDLE, Kate, Emacs, Vi, Notepad]
>>> print(met)
[IDLE, Kate, Emacs, Vi, Notepad]
Grd
gnz gibi, biz sadece yeni_liste adl listede de
gi
siklik yapt
gmz halde, bu de
gi
siklik
met adl listeyi de etkiledi... Buradan s
u sonucu karyoruz: Bir listeyi ba
ska bir de
gi
skene
atad
gnz zaman, aslnda o listeyi kopyalam
s olmuyorsunuz. Yapt
gnz s
ey, varolan bir nesneye, yani listeye ba
ska bir ad daha vermekten ibaret... Dolaysyla burada hem yeni_liste
hem de met ayn nesneyi gsteriyor. E
ger amacnz bir listeyi kopyalamaksa en basit s
ekilde
s
yle bir yol izleyebilirsiniz:
>>> yeni_liste = met[:]
Grd
gnz gibi, burada met adl listeyi kopyalamadan yeni_liste adl de
gi
skene atad
gmz
halde, yeni_listede sonradan yapt
gmz de
gi
siklik metin_dzenleyiciyi etkilemedi. nk
dedi
gimiz gibi, yukardaki yeni_listeyi de
gi
stirirken aslnda bir liste zerinde de
gi
siklik yapmadk. Biz burada bamba
ska bir liste olu
sturduk. O yzden iki listeden birinde yaplan de
gi
siklik tekini etkilemedi... Ama e
ger yeni_liste[1] = falanfilan s
eklinde bir de
gi
siklik yapsaydk,
bu de
gi
siklikten teki liste de etkilenecekti. nk burada zaten varolan bir liste zerinde
de
gi
siklik yapm
s oluyoruz. Bu ikisi arasndaki ayrma ok dikkat etmek gerekir.
S
imdi bir
genin bu listede bulunup bulunmad
gn sorgulayaca
gz:
>>> "elma" in liste
True
Bu in parac
gn for dnglerini i
slerken de grm
stk. Bu parac
gn oradaki i
sleviyle buradaki i
slevinin aslnda birbirine ok benzer oldu
gunu gryorsunuz... Bu parack her iki durumda da iinde anlam katyor cmleye...
Bu parac
g elbette sadece listelerle birlikte kullanmak zorunda de
giliz. Mesela bunu karakter
dizileriyle de kullanabiliriz:
>>> a = "Mehmet"
>>> "e" in a
True
Bu in parac
g ile birlikte kullanlan not parac
gn da burada anmamz olduka faydal olacaktr. not parac
g kodlarmza olumsuzluk anlam katar. Mesela yukardaki rne
gi not
kullanarak s
yle de yazabiliriz:
yeler = ["Ahmet", "Mehmet", "Selim", "Sleyman", "Ay
se",
"Fatma", "Hale", "Jale", "Lale"]
...veya s
u da olur:
>>> a = []
>>> dir(a)
Burada sa
gnda solunda __ i
sareti olmayanlar bizim ilgi alanmza giren metotlardr. tekiler
ise bizim s
u anda konumuz d
snda kalan zel metotlardr. Onlarla s
imdilik ilgilenmeyece
giz.
Peki dir(list) komutu ile ald
gmz listeyi Python programlama bilgimizi kullanarak ayklayabilir
miyiz? Yani sa
gnda solunda __ i
sareti olan metotlar hi gstermeden sadece ilgi alanmza
giren metotlar alabilir miyiz? Elbette alabiliriz. Bu rnek bize iyi bir pratik yapma imkan
sa
glayacak:
>>> for i in dir(list):
...
if "_" not in i:
...
print(i)
append
count
extend
index
insert
pop
remove
reverse
sort
Burada yapt
gmz s
ey Pythona s
u komutu vermek:
Ey Python! dir(list) komutunun ktsn ba
stan sona tara ve her bir
geyi i olarak
adlandr. Ardndan bu iler iinde _ i
saretini barndrmayanlar bul ve ekrana bas!
Peki ilgilendi
gimiz metotlarn ka adet oldu
gunu nasl bulursunuz? Elle sayarm! diyenleri
s
iddetle knyorum! Burada metot says az oldu
gu iin kod yazmak gereksiz grnebilir, ama
ya yzlerce
ge olsayd saymamz gereken... Onlar da elle mi sayacaktk? Elbette hayr! Gelin
s
imdi bu ilgilendi
gimiz
geleri numaralandralm:
>>> a = dir(list)
>>> b = []
>>> for i in a:
...
if "_" not in i:
...
b.append(i)
...
print(len(b), i, sep=".")
1.append
2.count
3.extend
4.index
5.insert
6.pop
7.remove
8.reverse
9.sort
Bu kodlar iinde s
imdiye kadar grmedi
gimiz tek s
ey append(). teki
gelerle daha nceki
derslerimizde pek ok rnek yapm
stk.
Burada ncelikle a = dir(list) s
eklinde bir de
gi
sken tanmladk. dir(list) komutunu a adl
bir de
gi
skene atamak bize kullanm kolayl
g sa
glad. Bylece dir(list) kodunu kullanmamz
gereken yerlerde uzun uzun bu komutu yazmaktansa ksaca a de
gi
skenini kullanabilece
giz.
Ardndan b = [] diyerek bo
s bir liste olu
sturduk. Bu bo
s liste iine ilgilendi
gimiz metotlar
yerle
stirece
giz.
Bir sonraki satrda ise basit bir for dngs yazdk. Bu dng yardmyla dir(list) komutunun
ktsn ba
stan sona tarayp, iinde _ i
sareti gemeyen
geleri bulduk.
Bu satrn ardndan b.append(i) gibi bir kod gryoruz. append() listelerin metotlarndan
biridir. Bu metodu ve di
gerlerini bir sonraki blmde ayrntl olarak inceleyece
giz. S
imdilik
s
u kadarn syleyelim: Bu metot bir listeye yeni
geler eklememizi sa
glar. Zaten burada yapt
g i
s de budur. b.append(i) komutu yardmyla, ilk ba
sta olu
sturdu
gumuz b adl bo
s listeye
btn ileri ekliyoruz. Bu ilerin ne oldu
gunu biliyorsunuz: Bir nceki satrda for dngs ile
belirledi
gimiz, _ i
sareti iermeyen
geler... Yani dir(list) kts iinde _ i
saretini ta
smayan
Burada append() metodunun kullanmyla ilgili bir rnek verdik. Yukardaki ktdan da
grd
gnz gibi, append()den ba
ska, listelerin daha pek ok metodu vardr. Bu metotlar
bize yapaca
gmz i
slerde byk kolaylklar sa
glar. Bu dersimizde listelerin metotlar konusuna
sa
glam bir giri
s yapt
gmza gre, artk bu metotlar tek tek incelemeye geebiliriz...
Hakikaten listemiz bo
s!
S
imdi bu bo
s listeye bir
ge ekleyelim:
>>> liste.append("Ubuntu")
S
imdi listemizi tekrar kontrol edelim:
>>> print(liste)
[Ubuntu]
Bu listeye s
imdi ba
ska bir
ge daha ekleyelim:
>>> liste.append("Debian")
Listemizin
gelerine tek tek eri
sebilece
gimizi biliyorsunuz:
>>> print(liste[0])
Ubuntu
...veya..
>>> print(liste[1])
Debian
Hatta liste
gelerini ters de evirebiliriz:
>>> print(liste[::-1])
[Debian, Ubuntu]
Peki ya bir
geyi de
gi
stirmek istersek...
>>> liste[1] = "Gentoo"
>>> print(liste)
[Debian, Gentoo]
Grd
gnz gibi, SuSe ve RedHat
gelerini bir liste olarak ekledik. Yalnz,
geleri bu s
ekilde ekledi
gimizde listenin durumu pek bekledi
giniz gibi olmayabilir:
>>> print(liste)
[Debian, Gentoo, [SuSe, RedHat]]
Grd
gnz gibi, SuSe ve RedHat
geleri listeye ayr bir liste olarak eklendi. Yani aslnda
yine listeye tek bir
ge eklenmi
s oldu:
>>> print(liste[2])
[SuSe, RedHat]
Demek ki listemizin nc
gesi buymu
s... Burada sadece SuSe
gesini almak isterseniz
s
yle bir s
ey yazmanz gerekti
gini biliyorsunuz:
>>> print(liste[2][0])
SuSe
E
ger append() metodunu kullanarak bir listeye birden fazla
ge eklemek isterseniz elbette
aresiz de
gilsiniz. for dngs ne gne duruyor?
>>> for s in ["Fedora", "Knoppix"]:
...
liste.append(s)
[Debian, Gentoo, [SuSe, RedHat], Fedora, Knoppix]
Dedi
gimiz gibi, for dngsn kullanarak bu s
ekilde birden fazla
geyi listeye ekleyebilirsiniz.
Ama isterseniz, bu i
slem iin retilmi
s ayr bir metottan da yararlanabilirsiniz. Bu yeni metodun
ad extend(). Bunu bir sonraki blmde grece
giz... Ama append() metodu ile ilgili olarak
sylememiz gerekenler henz bitmedi.
append() metodu liste metotlar iinde en ok kullanlan metottur. Dolaysyla listelerin ba
ska
hibir metodunu bilmeseniz de append() metodunu bilmeniz gerekir. Bu metodu kullanarak
baz rnekler vermeye devam edelim. Mesela s
u programa bakalm:
tek_saylar = []
ift_saylar = []
ba
sla = 1
bilgi = """Rastgele saylar giriniz.
Her say giri
ste enter tu
suna basnz.
I
slemi bitirmek iin "" tu
suna basnz:"""
print(bilgi)
while ba
sla == 1:
soru = input()
if soru == "":
ba
sla = 0
elif int(soru) % 2 == 0:
ift_saylar.append(soru)
else:
tek_saylar.append(soru)
print("Girdi
giniz s
u saylar ifttir: ", ift_saylar)
print("Girdi
giniz
su saylar ise tektir: ", tek_saylar)
I
slemi bitirmek iin "" tu
suna basnz:"""
print(bilgi)
while ba
sla == 1:
soru = input()
if soru == "":
ba
sla = 0
elif soru[0] not in kontrol:
print("ltfen bir say giriniz")
elif "." in soru:
print("yoksa ondalk bir say m girdiniz?")
elif int(soru) % 2 == 0:
ift_saylar.append(soru)
else:
tek_saylar.append(soru)
print("Girdi
giniz s
u saylar ifttir: ", ift_saylar)
print("Girdi
giniz
su saylar ise tektir: ", tek_saylar)
S
imdi artk bir sonraki metodumuzu incelemeye geebiliriz.
S
imdi extend() metodunu kullanarak, bu listeye yeni
geler ekleyece
giz:
>>> liste.extend(["Arch", "Ubuntu", "Kubuntu", "PCLinuxOs"])
[Debian, Gentoo, Fedora, Knoppix, Arch,
Ubuntu, Kubuntu, PCLinuxOs]
Grd
gnz gibi, append metodunun aksine, extend metodu ekledi
gimiz
geleri teker teker
yerle
stirdi listeye. stelik bizi herhangi bir for dngs kullanmak zorunda da brakmad.
Aslnda extend() metodunun yapt
g i
si sadece + i
saretini kullanarak da yapabilirsiniz.
Mesela s
u rne
ge bakalm:
>>> liste = ["Debian", "Gentoo", "Fedora", "Knoppix",
... "Arch", "Ubuntu", "Kubuntu", "PCLinuxOs"]
>>> yeni_liste = ["Mandriva", "Sabayon", "OpenSuSe"]
>>> liste = liste + yeni_liste
>>> print(liste)
[Debian, Gentoo, Fedora, Knoppix, Arch, Ubuntu,
Kubuntu, PCLinuxOs, Mandriva, Sabayon, OpenSuSe]
Grd
gnz gibi listemizin birinci srasna Mint adl
geyi yerle
stirdik. Bu metot da, tpk
append() metodunda oldu
gu gibi tek bir
ge yerle
stirmemize izin verir. Ama tabii ki for
dnglerinden yararlanarak bu kstlamay a
sabilece
ginizi biliyorsunuz:
>>> liste = ["elma", "armut", "kebap"]
>>> ekle = ["lahmacun", "pide", "
seftali"]
>>> for i in ekle:
...
liste.insert(0, i)
E
ger listede birden fazla Fedora varsa, Python soldan sa
ga do
gru, listede buldu
gu ilk Fedoray listeden karacaktr.
E
ger listedeki bir
geyi adna gre de
gil de srasna gre karmak isterseniz s
yle bir yol
izleyebilirsiniz:
>>> bir_liste.remove(bir_liste[3])
E
ger listede olmayan bir
geyi sorgularsanz Python bir hata mesaj gsterecektir.
Grd
gnz gibi, Python bu listemizi gzel gzel alfabe srasna koydu. Yalnz bu listede bir s
ey
dikkatinizi ekmi
s olmal. Listedeki hibir isim Trke karakter iermiyor! Bunu bilerek byle
yaptk. nk iinde Trke karakterler geen kelimeleri sralamak o kadar kolay de
gildir.
Isterseniz deneyelim:
>>> liste = ["Mehmet", "Ahmet", "
Sevket", "etin",
... "Cemal", "Seval", "Kezban"]
>>> liste.sort()
>>> print(liste)
[Ahmet, Cemal, Kezban, Mehmet, Seval,
etin,
Sevket]
Grd
gnz gibi, Python bu defa liste
gelerini alfabe srasna dizmekte ba
sarsz oldu. Burada
etin ve
Sevketin yerleri yanl
s... Peki bunu nasl dzeltece
giz?
Bu sorunu dzeltmek iin henz
grenmedi
gimiz baz
geler kullanmamz gerekecek:
>>> import locale
>>> locale.setlocale(locale.LC_ALL, "tr_TR.UTF8")
>>> liste = ["Mehmet", "Ahmet", "
Sevket", "etin",
... "Cemal", "Seval", "Kezban"]
>>> liste.sort(key=locale.strxfrm)
>>> print(liste)
Buradaki bilmedi
giniz
gelere taklmayn. Yeri geldi
ginde bunlar ayrntlaryla inceleyece
giz.
Burada bu kodu vermekteki amacm sort() metoduyla Trke karakter ieren szckleri de
sralayabilece
ginizi gstermek. Yalnz yukarda verdi
gim yntem GNU/Linux iin geerlidir.
Windowsta al
smayabilir...
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Elbette 0dan 10a kadar olan saylar ieren bir liste olu
sturmak iin saylar tek tek elle yazmaya gerek yok. Bu i
s iin range() metodundan yararlanabiliyoruz... S
imdi range() fonksiyonundan da yardm alarak olu
sturdu
gumuz bu listeyi ters evirelim:
>>> liste.reverse()
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Grd
gnz gibi, reverse() metodu listedeki
gelerin srasn tersine eviriyor. Aslnda biz bu
i
si reverse() metodunu kullanmadan da yapmay
grenmi
stik:
>>> liste[::-1]
Yalnz bu yntem ile reverse() metodunu kullanmak arasnda nemli bir fark var. reverse()
metodu, uyguland
g liste zerinde derhal de
gi
siklik yapyor. Yani bir listeye reverse() metodunu uygulayp liste
gelerinin srasn de
gi
stirdi
ginizde eski listeyi kaybetmi
s oluyorsunuz.
Artk eski listeye tekrar ula
smanzn imkan yoktur. Tabii yeni listeye tekrar reverse() metodunu uygularsanz eski listeye benzeyen ba
ska bir liste olu
sturabilirsiniz. Bu durumun aksine, liste[::-1] komutu liste zerinde herhangi bir de
gi
siklik yapmaz. Isterseniz bu yntemi uyguladktan sonra print(liste) komutunu vererek bunu do
grulayabilirsiniz. Bu komutu
verdi
ginizde kar
snza
geleri ters evrilmemi
s olan liste gelecektir. E
ger yukardaki yntem
yardmyla listeyi de
gi
stirmek isterseniz s
yle bir s
ey yapmanz gerekir:
>>> liste = liste[::-1]
Bu s
ekilde liste adl listemizi de
gi
stirebiliyoruz. Bu iki yntem arasndaki fark nemli bir
farktr. Bunu unutmamak gerekir.
Fena de
gil... Ama bu kodlarn bir sorunu var. Her cmleyi,
genin listede geti
gi say kadar
tekrar ediyor. Her
geyle ilgili cmleyi bir kez bassa ne iyi olurdu, de
gil mi?
Elbette bunu da yapmann yollar vardr. Bunun en kolay yolu Pythondaki set() fonksiyonunu
kullanmaktr. Bu fonksiyonu daha sonraki bir blmde detayl olarak inceleyece
giz. S
imdilik
sadece nasl kullanld
gna dikkat edelim yeter:
for i in set(liste):
print(i, "
gesi listede", liste.count(i), "kez geiyor...")
>>> liste.pop()
Metacity
S
imdi listeyi tekrar ekrana yazdrrsanz en sondaki Metacity
gesinin olmad
gn greceksiniz. pop() metodu bu
geyi listeden sildi. Silerken de ekrana kt olarak verdi... Demek
ki pop() metodu bir listedeki en son
geyi silip, sildi
gi
geyi ekranda gsteriyor. Elbette bu
metodu kullanarak illa son
geyi silece
giz diye bir kaide yok. E
ger istersek, pop() metodu
iinde, silmek istedi
gimiz liste
gesinin srasn belirterek, belirli bir
geyi de silebiliriz:
>>> liste.pop(0)
FVWM
Grd
gnz gibi pop() metodunu kullanabilmek iin silece
gimiz
genin listede kanc srada
bulundu
gunu bilmemiz gerekiyor. E
ger silece
giniz
genin adn biliyor, ancak srasn bilmiyorsanz s
yle bir s
ey yapabilirsiniz. (IceWM adl
geyi silmek istiyoruz...):
>>> liste.pop(liste.index("IceWM"))
Burada kulland
gmz index() metodu IceWM adl
genin listedeki srasn verecek, pop()
metodu ise index metodundan gelen bu sayy kullanarak IceWM adl
geyi listeden karacak
ve ekrana basacaktr...
BLM
Demetler (Tuples)
Grd
gnz gibi remove() metodunu kullanarak, geli
stirme_aralar adl liste zerinde
de
gi
siklik yapabildik. Mesela s
u yntemi kullanarak, liste
gelerinden birini silip yerine ba
ska
bir
ge de koyabiliriz:
>>> geli
stirme_aralar[1] = "Kwrite"
>>> print(geli
stirme_aralar)
[Drpython, Kwrite, Komodo, Eclipse]
Grd
gnz gibi, byle bir s
ey yapmaya al
st
gmzda Python bize bir hata mesaj gsteriyor.
86
Burada bo
s bir liste tanmladk. Demetler de buna benzer bir s
ekilde tanmlanr:
>>> demet = ()
Grd
gnz gibi, listelerdeki k
seli parantezlerin yerini demetlerde normal parantezler alyor...
Isterseniz yukarda tanmlad
gmz veri tiplerinin sa
glamasn yapalm:
>>> type(liste)
<class list>
Demek ki tanmlad
gmz s
ey gerekten de bir listeymi
s... Bir de s
una bakalm:
>>> type(demet)
<class tuple>
Burada grd
gmz tuple ifadesi Trkede demet anlamna geliyor. Demek ki burada
olu
sturdu
gumuz veri tipi gerekten de bir demetmi
s...
Daha nce dir(list) komutunu kullanarak, listelerin metotlarn sralamay
grenmi
stik. S
imdi
de demetlerin metotlarna bakalm:
>>> dir(tuple)
[__add__, __class__, __contains__, __delattr__, __doc__,
__eq__, __format__, __ge__, __getattribute__, __getitem__,
__getnewargs__, __gt__, __hash__, __init__, __iter__,
__le__, __len__, __lt__, __mul__, __ne__, __new__,
__reduce__, __reduce_ex__, __repr__, __rmul__, __setattr__
, __sizeof__, __str__, __subclasshook__, count, index]
>>> dir(())
Bylelikle
geli bir demet tanmlam
s olduk. Listelerle yapabildi
gimiz baz s
eyleri demetlerle
de yapabiliriz. Mesela:
>>> personel[0]
Mehmet
>>> personel[:-1]
(Mehmet, Ahmet)
>>> personel[::-1]
(Zeliha, Ahmet, Mehmet)
Ama tabii ki s
yle bir s
ey mmkn de
gildir:
>>> personel[1] = "
Ilkay"
Hemen bu a de
gi
skeninin tipini kontrol edelim:
>>> type(a)
<class tuple>
Grd
gnz gibi, parantezleri kullanmadan da demet tanmlayabiliyoruz. Bu demek oluyor ki,
aslnda bir de
gi
skene birden fazla de
ger atad
gmzda yapt
gmz s
ey bir demet tanmlamak.
Tek
geli bir de
gi
sken, iinde saklad
g verinin tipiyle anlr. Yani:
>>> hava = "ya
gmurlu"
>>> type(hava)
<class str>
Bir de s
una bakalm:
>>> hava = 10
>>> type(hava)
<class int>
Ya da:
>>> hava = 10, 15, 17
>>> type(hava)
<class tuple>
Elbette, e
ger istersek yukardaki demetlerin
gelerini parantez iinde de belirtiriz. Bu s
ekilde
hangi tr bir veri tipi tanmlad
gmz daha ak ve net bir s
ekilde belli etmi
s oluruz.
5.2 Tek geli
bir Demet Tanmlamak
Bir nceki blmde bir demetin nasl tanmlanaca
gn grdk. Yalnz tanmlad
gmz demetler
hep birden fazla
ge ieriyordu. nceki blmde tek
geli bir demetin nasl tanmlanaca
gn
Grd
gnz gibi hsrana u
gradk!... Basite tek bir
ge ieren bir demet tanmlamaya
al
srken, elde etti
gimiz s
ey bir str, yani karakter dizisi oldu... Demek ki tek bir
geyi
parantez iine almak yeterli olmuyormu
s... Peki ne yapaca
gz? Elbette elimiz kolumuz ba
gl
oturmayaca
gz. Bu tr durumlar iin Pythonun zel bir zm vardr. Grelim:
>>> a = ("tek",)
>>> type(a)
<class tuple>
Grd
gnz gibi, tek adl
genin yanna minik bir virgl i
sareti koyarak amacmza ula
sabildik... I
ste Pythonda tek
geli bir demet tanmlamann yolu budur. Gznze tuhaf grnm
s olabilir, ama zamanla al
srsnz...
a adl demeti parantezsiz olarak kullanmak istersek de buna benzer bir yol izlememiz gerekir:
>>> a = "tek",
>>> type(a)
<class tuple>
nk e
ger oraya o virgl koymazsak elde edece
gimiz s
ey bir karakter dizisi olacaktr...
nceki blmlerde demetler hakknda s
yle bir s
ey demi
stik: Demetler de
gi
stirilemeyen bir
veri tipidir. Gerekten de yledir... Ama de
gi
stirilemeyen bir veri tipi olan demetler,
ge
olarak, de
gi
stirilebilen veri tiplerini barndrabilir. Yani mesela s
yle bir s
ey yapabiliriz:
>>> a = (["elma", "armut", "erik"], 1, 2, 3)
Grd
gnz gibi, a adl demetimizin sfrnc
gesi bir liste. Buna s
u s
ekilde eri
sebiliriz:
>>> a[0]
E
ger bu listenin ilk
gesine eri
smek istersek ne yapmamz gerekti
gini biliyorsunuz:
>>> a[0][0]
Demetimizin sfrnc
gesi bir liste oldu
gu iin, listelerin sahip oldu
gu btn zellikleri ta
sr.
Yani listelerin metotlarn burada kullanabiliriz:
>>> a[0].append("kestane")
E
ger tek bir
ge ieren ve bu tek
gesi de bir liste olan bir demet tanmlamak istersek, her
zamanki gibi virglden yararlanaca
gz:
>>> a = (["elma", "armut", "erik"],)
Demek ki elma
gesi demet iinde sfrnc srada bulunuyormu
s. Bu arada grd
gnz
gibi, index() metodu bir
geyi ilk geti
gi noktada tespit eder ve ilk buldu
gu sra numarasn
verir. Dolaysyla ayn demet iinde geen teki elma
gesinin kanc srada oldu
guna bakmaz.
index() metodu,
ge ad d
snda ikinci bir argman daha alr. Yani parantez iinde belirtti
gimiz
ge adnn d
snda bir say da belirterek, o
genin kanc tekrarnn srasn elde etmek
istedi
gimizi belirleyebiliriz. Bu ne demek? Hemen bakalm:
>>> a = ("elma", "armut", "erik", "
seftali", "elma", "erik", "armut")
>>> a.index("elma", 2)
4
Burada yapt
gmz s
ey, birbirinden farkl veri tiplerini alp tek bir demet haline getirmekten
ibaret... I
ste bu i
sleme ksaca demetleme ad veriliyor. ok zel bir yan yok yani... Bu
i
slemin pek zel bir yan olmasa da bu i
slemin tersi olan demet zme (tuple unpacking)
i
sleminin gzel yanlar vardr:
>>> demet = ("elma", (1, 2, 3, 4), ["kestane", "armut", "ilek"])
>>> a, b, c = demet
I
ste burada yapt
gmz s
ey de demet zme i
slemine bir rnektir. a, b, c, = demet s
eklinde
demetimizi zdkten sonra artk s
u s
ekilde
gelere eri
sebiliriz:
>>> a
elma
>>> b
(1, 2, 3, 4)
>>> c
[kestane, armut, ilek]
Bu i
slemi normal bir de
gi
sken tanmlayarak da yapabilirsiniz:
>>> demet = 1, 2, 3, 4
>>> a, b, c, d = demet
>>> iter([])
<list_iterator object at 0x00E4B8F0>
Grd
gnz gibi burada ald
gmz hata farkl. Buradaki sorun e
sitli
gin sol ve sa
g tarafnda ayn
sayda
ge olmamasndan kaynaklanyor. Yoksa su karakter dizisi dnglenebilir bir nesne
oldu
gu iin
ge saysn tutturmamz yeterli olacaktr. Zaten ald
gmz hata, zme i
slemi iin
2den fazla de
ger gerekti
gini sylyor bize...
>>> a, b, c = "Can"
Peki ben a, b ve c de
gi
skenlerinin ne birden tek de
ger vermek istiyorsam ne yapaca
gm? diye soruyor olabilirsiniz... Yani mesela hem a, hem b, hem de c de
gi
skeninin
de
gerinin Can olmasn istersek bunu nasl yapaca
gz? S
yle yapaca
gz:
>>> a = b = c = "Can"
Ancak s
yle bir deneme sizi hsrana u
gratabilir:
>>> a = b = c = 1, 2, 3
Ald
gmz bu kt, neden istedi
gimiz gibi bir kt elde edemedi
gimizi aslnda aklyor.
Dikkat ederseniz ald
gmz ktnn veri tipi bir demettir. Isterseniz a de
gi
skenine type()
fonksiyonunu uygulayarak bunu kendiniz de do
grulayabilirsiniz. Zira yukarda yapt
gmz s
ey
aslnda bir nceki blmde
grendi
gimiz demetleme (tuple packing) i
sleminin ta kendisidir...
Demetleme i
slemini yaptktan sonra isterseniz bu demeti zebilirsiniz de...
>>> bir, iki, = a
>>> bir
1
>>> iki
2
>>>
3
S
imdiye kadar verdi
gimiz rneklerde e
sitli
gin sol ve sa
g tarafnn ayn sayda
ge iermesi
gerekiyordu. Peki ya diyelim ki elimizde s
yle bir demet var:
>>> fedailer = ("Ahmet", "Mehmet", "zcan", "Kezban", "Sreyya", "Cevat")
Yapmak istedi
gimiz s
ey bu demeti ilk, orta ve son olarak gruplandrmak olsun... Bu i
slemi
acaba nasl yapmalyz?
Iste
gimizi gerekle
stirmek iin iki yntem var nmzde. Birinci yntemde Pythondaki dilimleme (slicing) zelli
ginden yararlanabiliriz:
>>> ilk, orta, son = fedailer[:1], fedailer[1:-1], fedailer[-1]
geleri bu s
ekilde tanmladktan sonra ilk, orta ve son de
gi
skenlerini kullanarak her bir
grubu ayr ayr yazdrabiliriz.
Gelelim ikinci ynteme... Bu ikinci yntem Python 3.0 ile birlikte gelen bir zelliktir. Pythonun
3.0dan nceki srmlerinde bu zellik bulunmaz:
>>> ilk, *orta, son = fedailer
>>> ilk
Ahmet
>>> orta
[Mehmet, zcan, Kezban, Sreyya]
>>> son
Cevat
Grd
gnz gibi, Python 3.0 ile birlikte yukardaki i
slevi ok daha basit ve temiz bir s
ekilde
yerine getirebiliyoruz. Burada * i
saretinden yararland
gmza dikkat edin. Bu tr ifadelere
Pythonda starred expressions (yldzl ifadeler) ad verilir. Python 3.0 ile birlikte bu yldzl
ifadeler daha geni
s bir kullanm alanna kavu
stu. Hatta print() fonksiyonu iinde bile bu
yldzl ifadelerden yararlanabiliriz. Yldzl ifadelerin print() fonksiyonunda kullanm ile ilgili
rnekleri birka blm sonra grece
giz...
Yukardaki rnekte kulland
gmz yldzl ifade, ilk ve son adl de
gi
skenler ile belirlenen
gelerin d
snda kalan teki btn
geleri tanmlayabilmemizi sa
glad. Ayrca burada yldzl
ifade ile elde etti
gimiz ksmn bir liste oldu
guna da dikkat edin. Burada normal olarak liste
yerine demet verilmesi beklenebilirdi, ama kt zerinde daha kolay i
slem yaplabilmesi iin
Python geli
stiricileri buradaki yldzl ifadenin ktsnn liste veri tipinde olmasn uygun grm
slerdir... Gerekten de de
gi
stirilebilir (mutable) bir veri tipi olan listeler zerinde i
slem
yapmak, de
gi
stirilemeyen (immutable) bir veri tipi olan demetler zerinde i
slem yapmaktan
ok daha kolaydr.
Dnglenebilir nesneleri zme i
sleminin bu geni
sletilmi
s haline ili
skin btn zellikler ve bu
yeni i
slevin gerekeleri, http://www.python.org/dev/peps/pep-3132/ adresinde bulunan PEP
3132de aklanm
str... E
ger bu konuyla ilgili olarak Ingilizce kaynaklarda arama yapmak
isterseniz, kullanmanz gereken ifade Extended Iterable Unpacking olacaktr...
Bylelikle Pythonda demetler konusunu da bitirmi
s olduk. Bu blmde pek ok s
ey
grendik. Bu
grendiklerimizi birka kez gzden geirerek bilgilerimizi peki
stirme yoluna gitmemiz, ilerde grece
gimiz konular daha iyi kavrayabilmek bakmndan olduka faydal olacaktr.
BLM
Szlkler
Grd
gnz gibi, szlkleri kme parantezleri yardmyla teki veri tiplerinden ayrt ediyoruz.
Yukarda bo
s bir szlk tanmladk. Pythoncada szlkler dict parac
gyla gsterilir. Gelin
isterseniz basit bir tip denetlemesi yapalm:
>>> type({})
<class dict>
97
Burada szl
g nasl tanmlad
gmza ok dikkat edin. Dedi
gimiz gibi, szlklerin yaps teki
veri tiplerinden biraz farkldr. Isterseniz yukarda tanmlad
gmz szl
g biraz sadele
stirerek
incelemeyi kolayla
stralm:
>>> telefonlar = {"Ahmet": "0555 555 55 55"}
Burada s
yle bir yap gzmze arpyor:
{anahtar: de
ger}
Bu yapda anahtar ve de
ger kelimelerini kullanmamz tesadfi de
gildir. Python programlama dilinde szlkler bir anahtar-de
ger (key-value) ifti olarak tanmlanr. Yani her szlkte
en az bir anahtar, bir de de
ger bulunur. Szlkleri olu
stururken bu anahtar ve de
gerleri iki
nokta st ste i
sareti (:) ile ayrrz. Bizim rne
gimizde anahtara kar
slk gelen ifade Ahmet; de
gere kar
slk gelen ifade ise 0555 555 55 55tir. Szlklerin
gelerine ula
smak iin
anahtarlar kullanaca
gz. Bu aklamalarn biraz soyut gelebilece
gini d
snerek, durumu somutla
strmak iin bir rnek verelim. Yukardaki szlk zerinden gidelim. Szl
gmzdeki
Ahmet adl anahtarn de
gerini alalm:
>>> telefonlar["Ahmet"]
0555 555 55 55
Grd
gnz gibi, ortada listeler ve demetlere gre farkl bir durum var. Bir szl
gn
gelerine
ula
sma biimimiz, demetler ve listelerdeki yapdan farkl. Hatrlarsanz demetler ve listelerin
gelerine s
yle ula
syorduk:
liste[
genin_sra_numaras]
...veya...
demet[
genin_sra_numaras]
Listeler ve demetlerde,
geye ula
smak iin o
genin sra numarasn verirken, szlklerde ise
anahtarn kullanyoruz. ktda elde etti
gimiz s
ey ise o anahtarn de
geri oluyor... Yani Ahmet
anahtarn vererek, 0555 555 55 55 de
gerine ula
syoruz.
Hatrlarsanz giri
s blmnde szlklerin srasz bir veri tipi oldu
gundan sz etmi
stik. Szlklerin srasz olmasndan dolay,
gelere eri
smek iin sra numaras kullanamyoruz. Szlklerin
aksine listeler ve demetler sral birer veri tipi oldu
gu iin,
gelere sra numarasyla ula
sabiliyoruz.
Szlklerin srasz bir veri tipi olmas kendini ktda da gsterecektir. Yani bir szl
g tanmladktan sonra, o szl
g ekrana yazdrd
gmzda elde etti
gimiz kt
gelerin sras bakmndan
kar
sk olacaktr... Mesela s
u szl
g ele alalm:
>>> harfler = {"a": 1, "b": 2, "c": 3}
Bu szl
g ekrana yazdrd
gmzda s
yle bir kt alrz:
>>> harfler
{a: 1, c: 3, b: 2}
Grd
gnz gibi elde etti
gimiz ktda
gelerin sralamas szl
g tanmlarken kulland
gmz
ge sralamasndan farkl... E
ger tanmlad
gnz bir szlkteki
gelerin sralamas ktdakiyle
aynysa bu durum tamamen tesadften ibarettir. Szlkler srasz veri tipleri oldu
gu iin, szlklerle gvenli bir s
ekilde sralamaya dayal herhangi bir i
slem yapamayz...
Szlkleri tanmlamann ba
ska yollar da vardr. Yukardaki tanmlama ynteminin d
snda bir
de s
yle bir s
ey yapabiliriz:
>>> giyim = {}
>>> giyim["ayakkab"] = 2
>>> giyim["elbise"] = 1
>>> giyim["gmlek"] = 4
>>> giyim
{elbise: 1, ayakkab: 2, gmlek: 4}
Grd
gnz gibi, nce bo
s bir szlk tanmladktan sonra bu bo
s szl
ge daha sonradan teker
teker
ge ekleyebiliyoruz.
E
ger istersek nc bir yol olarak szlkleri dict parac
gn kullanarak da tanmlayabiliriz:
>>> dict({"a": 1, "b": 2})
Bu dict parac
gn farkl s
ekillerde de kullanabiliyoruz:
>>> dict(ahmet = "0533 344 44 44")
Burada iki
geli bir demetten olu
san bir listeyi dict parac
g yardmyla szl
ge dn
stryoruz...
Grd
gnz gibi, szlk tanmlamak iin pek ok farkl yntem bulunuyor. Siz bunlar iinde
kolaynza geleni veya o an kar
s kar
sya oldu
gunuz duruma en uygun yntemi benimseyeceksiniz...
Grd
gnz gibi szlklerin 11 adet metodu var bizim ilgilendi
gimiz... Sonraki sayfalarda bu
metotlar tek tek inceleyece
giz. Yalnz, dikkat ederseniz yukardaki listeyi elde etmek iin ok
fazla u
gra
syoruz. Ilerde kodlarmz belli ltlere gre szmek istedi
gimiz zaman bu iste
gimizi
tek satrla yerine getirmeyi de
grenece
giz:
>>> [i for i in dir(dict) if "_" not in i]
[clear, copy, fromkeys, get, items, keys, pop, popitem,
setdefault, update, values]
Isterseniz szl
gmz bo
saltmadan nce bu szlkle biraz al
salm:
Szl
gmzn
gelerine s
yle ula
syoruz:
>>> lig
{
sampiyon: Adana Demirspor, ikinci: Mersin
Idman Yurdu,
nc: Adana Genlerbirli
gi}
E
ger bu szl
gn
gelerine tek tek eri
smek istersek s
yle yapyoruz:
>>> lig["
sampiyon"]
Adana Demirspor
>>> lig["nc"]
Adana Genlerbirli
gi
S
imdi geldi bu szl
gn btn
gelerini silmeye:
>>> lig.clear()
S
imdi szl
gmzn durumunu tekrar kontrol edelim:
>>> lig
{}
Grd
gnz gibi artk lig adl szl
gmz bombo
s. clear() metodunu kullanarak bu szl
gn btn
gelerini sildik. Ama tabii ki bu s
ekilde szl
g silmi
s olmadk. Bo
s da olsa
bellekte hl lig adl bir szlk duruyor. E
ger siz ligi ortadan kaldrmak isterseniz del adl
bir paracktan yararlanmanz gerekir:
>>> del lig
Kontrol edelim:
>>> lig
NameError: name lig is not defined
Grd
gnz gibi artk lig diye bir s
ey yok... Bu szl
g bellekten tamamen kaldrdk.
clear() adl metodun ne oldu
gunu ve ne i
se yarad
gn grd
gmze gre ba
ska bir metoda
geebiliriz.
Biz bu szl
g kopyalamak istiyoruz. Hemen s
yle bir s
ey deneyelim:
>>> yedek_hava_durumu = hava_durumu
S
imdi hava_durumu adl szl
ge bir
ge ekleyelim:
Izmir: bulutlu}
S
imdi bir de yedek_hava_durumu adl szl
gn durumuna bakalm:
>>> yedek_hava_durumu
{
Istanbul: ya
gmurlu, Adana: gne
sli, Mersin: sisli,
Izmir: bulutlu}
Grd
gnz gibi, hava_durumu adl szl
ge yapt
gmz ekleme yedek_hava_durumu adl szl
g de etkiledi. Hatrlarsanz buna benzer bir durumla daha nce listeleri anlatrken de
kar
sla
sm
stk. nk varolan bir szl
g veya listeyi ba
ska bir de
gi
skene atad
gmzda aslnda
yapt
gmz s
ey bir kopyalama i
sleminden ziyade bellekteki ayn nesneye gnderme yapan iki
farkl isim belirlemekten ibaret. Yani szl
gmz bellekteki bir nesne olarak d
snrsek,
bu nesneye atfta bulunan, hava_durumu ve yedek_hava_durumu adl iki farkl isim belirlemi
s oluyoruz. E
ger istedi
gimiz s
ey bellekteki nesneden iki adet olu
sturmak ve bu iki farkl
nesneyi iki farkl isimle adlandrmak ise yukardaki yntemi kullanmak istemedi
giniz sonular
do
gurabilir. Yani amacnz bir szl
g yedekleyip orijinal szl
g korumaksa ve yukardaki
yntemi kullandysanz, hi farknda olmadan orijinal szl
g de de
gi
stirebilirsiniz. I
ste byle
durumlarda imdadmza szlklerin copy metodu yeti
secek. Bu metodu kullanarak varolan
bir szl
g gerek anlamda kopyalayabilir, yani yedekleyebiliriz...
>>> hava_durumu = {"
Istanbul": "ya
gmurlu", "Adana": "gne
sli",
... "
Izmir": "bulutlu"}
S
imdi bu szl
g yedekliyoruz. Yani kopyalyoruz:
>>> yedek_hava_durumu = hava_durumu.copy()
Izmir: bulutlu}
Grd
gnz gibi bu defa szlklerin birinde yaplan de
gi
siklik brn etkilemedi... copy
metodu sa
golsun!...
Grd
gnz gibi ncelikle elemanlar adl bir demet tanmladk. Daha sonra da adresler
adl bir szlk tanmlayarak, fromkeys() metodu yardmyla anahtar olarak elemanlar
demetindeki
gelerden olu
san, de
ger olarak ise Kadky ieren bir szlk meydana getirdik.
En ba
sta tanmlad
gmz elemanlar demeti liste de olabilirdi. Hatta tek ba
sna bir karakter
dizisi dahi yazabilirdik oraya...
Bu program al
strd
gmzda e
ger kullanc ing_szlk adyla belirtti
gimiz szlk iinde bulunan kelimelerden birini yazarsa, o kelimenin kar
sl
gn alacaktr. Diyelim ki kullancmz soruya
dil diye cevap verdi. Bu durumda ekrana dil kelimesinin szlkteki kar
sl
g olan language yazdrlacaktr. Peki ya kullanc szlkte tanml olmayan bir kelime yazarsa ne olacak?
yle bir durumda programmz hata verecektir. Programmz iin do
gru yol, hata vermektense,
kullancy kelimenin szlkte olmad
g konusunda bilgilendirmektir. Bunu klasik bir yakla
smla
s
u s
ekilde yapabiliriz:
ing_szlk = {"dil": "language", "bilgisayar": "computer", "masa": "table"}
sorgu = input("Ltfen anlamn
grenmek istedi
giniz kelimeyi yaznz:")
if sorgu not in ing_szlk:
print("Bu kelime veritabanmzda yoktur!")
else:
print(ing_szlk[sorgu])
Grd
gnz gibi, burada ok basit bir metot yardmyla btn dertlerimizi hallettik. Szlklerin get() adl metodu, parantez iinde iki adet argman alr. Birinci argman sorgulamak istedi
gimiz szlk
gesidir. Ikinci argman ise bu
genin szlkte bulunmad
g durumda
kullancya hangi mesajn gsterilece
gini belirtir. Buna gre, yukarda yapt
gmz s
ey, nce
sorgu de
gi
skenini szlkte aramak, e
ger bu
ge szlkte bulunamyorsa da kullancya, Bu
kelime veritabanmzda yoktur! cmlesini gstermekten ibarettir...
Gelin isterseniz bununla ilgili bir rnek daha yapalm.
Diyelim ki bir havadurumu program yazmak istiyoruz. Bu programda kullanc bir s
ehir ad
girecek. Program da girilen s
ehre ait havadurumu bilgilerini ekrana yazdracak. Bu program
klasik yntemle s
u s
ekilde yazabiliriz:
#!/usr/bin/env python3.0
soru = input("
Sehrinizin adn tamam kk harf olacak
sekilde yazn:")
if soru == "istanbul":
print("gk grltl ve sa
ganak ya
g
sl")
elif soru == "ankara":
print("ak ve gne
sli")
elif soru == "izmir":
print("bulutlu")
else:
print("Bu
sehre ili
skin havadurumu bilgisi bulunmamaktadr.")
Yukardaki, gayet geerli bir yntemdir. Ama biz istersek bu kodlar get metodu yardmyla
ok daha verimli ve sade bir hale getirebiliriz:
#!/usr/bin/env python3.0
soru = input("
Sehrinizin adn tamam kk harf olacak
sekilde yazn:")
cevap = {"istanbul": "gk grltl ve sa
ganak ya
g
sl",
"ankara": "ak ve gne
sli", "izmir": "bulutlu"}
print(cevap.get(soru,"Bu
sehre ili
skin havadurumu bilgisi bulunmamaktadr."))
gelerini do
grudan vermez. items() metodunu yaln bir s
ekilde kulland
gmzda elde etti
gimiz
s
eye Python dilinde grnm nesnesi (view object) ad verilir. rnek verelim:
>>> sepet = {"meyveler": ("elma", "armut"), "sebzeler": ("prasa", "fasulye")}
>>> sepet.items()
<dict_items object at 0xb7cee95c>
I
ste burada elde etti
gimiz ktya grnm nesnesi ad veriyorlar. Bu nesneler dinamik bir
yapdadr. Peki bu ne anlama geliyor? Hemen bakalm:
>>> a = sepet.items()
>>> len(a)
2
S
imdi a adl de
gi
skenin uzunlu
gunu tekrar kontrol edelim:
>>> len(a)
3
Grd
gnz gibi, sepet adl szl
gn ieri
gi de
gi
since sepet.items() metodunun ieri
gi de
otomatik olarak gncellendi. Bu, Python 3.0la gelen bir zelliktir. Pythonun 2.x srmlerinde
items() metodu daha farkl bir yapya sahipti ve yukardaki gibi otomatik gncellenme gibi bir
zellik de ta
smyordu...
Peki biz bu items() metoduyla elde etti
gimiz
geleri nasl grece
giz? Bunun birka yolu vardr.
En basitinden bu metot zerinde bir dng kurabiliriz:
>>> for i in sepet.items():
...
print(i)
...
(iecekler, (su, ayran,
salgam))
(meyveler, (elma, armut))
(sebzeler, (prasa, fasulye))
S
imdi bu szlkteki anahtarlar alalm:
S
imdi de bu
geleri ekrana yazdralm:
>>> list(anahtarlar)
[meyveler, sebzeler]
E
ger anahtarlar liste olarak de
gil de demet olarak almak istersek s
u komutu kullanaca
gz:
>>> tuple(anahtarlar)
(meyveler, sebzeler)
Alternatif olarak, sepet.keys() metodu zerinde bir for dngs kurmay da tercih edebiliriz.
Bu s
ekilde elde etti
gimiz kt grn
s olarak biraz daha temiz olacaktr:
>>> for i in sepet.keys():
...
print(i)
...
meyveler
sebzeler
Grd
gnz gibi keys() metodunu kullanmak da olduka kolaydr.
Grd
gnz gibi, szlkte zaten meyveler adl bir anahtar bulundu
gu iin, Python ayn ad
ta
syan ama de
gerleri farkl olan yeni bir meyveler anahtar olu
sturmad... Demek ki bu
metot yardmyla bir szlk iinde arama yapabiliyor, e
ger arad
gmz anahtar szlkte yoksa,
setdefault() metodu iinde belirtti
gimiz zellikleri ta
syan yeni bir anahtar-de
ger ifti olu
sturabiliyoruz.
Sto
gumuzda 5 adet elma, 10 adet armut, 6 kutu peynir, 15 adet de sosis var. Diyelim ki daha
sonraki zamanlarda bu sto
ga mal giri
s-k
s oldu ve sto
gun son hali s
yle:
>>> yeni_stok = {"elma": 3, "armut": 20, "peynir": 8, "sosis": 4, "sucuk": 6}
Yapmamz gereken s
ey, sto
gumuzu yeni bilgilere gre gncellemek olacaktr. I
ste bu i
slemi
update() metodu ile yapabiliriz:
>>>updatestok.update(yeni_stok)
>>> print(stok)
{peynir: 8, elma: 3, sucuk: 6, sosis: 4, armut: 20}
Grd
gnz gibi,
gelerin sras ktda kar
sk grnyor. Peki biz bu szl
gn
gelerini sral
olarak kt almak istersek ne yapmamz gerekir? Python byle bir s
eyi yapmak iin zel bir
ara sunmaz. Dolaysyla bizim bu i
slem iin ba
ska yollar aramamz gerekecek.
En basit s
ekilde yukardaki szl
g s
yle sralayabiliriz:
>>> for i in sorted(harfler):
...
print(i, harfler[i])
...
a 1
b 5
c 8
d 10
e 30
Grd
gnz gibi, sorted() fonksiyonu yardmyla demetin
gelerini alfabe srasna dizebildik.
Bu fonksiyonu listelerle birlikte de kullanabilirsiniz...
E
ger sralamak istedi
giniz demet, liste veya szlkte Trke karakterler varsa, bu metot o
demet, liste veya szl
g dzgn bir s
ekilde sralayamayacaktr. Hatrlarsanz listelerin sort()
metodunu incelerken de byle bir durumla kar
sla
sm
stk. Orada kulland
gmz yntemi burada
da kullanabiliriz:
>>> import locale
>>> locale.setlocale(locale.LC_ALL, "tr_TR.UTF8")
>>> demet = ("mehmet", "ahmet", "kezban", "celal", "i
gdem")
>>> print(sorted(demet, key=locale.strxfrm))
[ahmet, celal, i
gdem, kezban, mehmet]
1
5
8
10
30
Bu ktnn grntsn ho
sunuza gitmediyse, bu kty biraz biimlendirmek de elbette
mmkndr. Mesela her
genin arasna, bu
gelerin birbiriyle ba
glantl oldu
gunu gsterecek bir i
saret yerle
stirebiliriz:
>>> for i in sorted(harfler):
...
print(i, harfler[i], sep = " --> ")
...
a --> 1
b --> 5
c --> 8
d --> 10
e --> 30
Grd
gnz gibi, szlk
gelerini alfabe srasna dizmek o kadar da zor de
gil. Isterseniz yukardaki dngy nasl kurdu
gumuzu biraz inceleyelim:
Ilk satrda bildi
gimiz s
ekilde bir for dngs olu
sturuyoruz. Burada bir yenilik olarak sorted()
fonksiyonunu
grendik. Bu fonksiyon bize
geleri sralama imkan tanyor:
>>> for i in sorted(harfler):
...
I
ste yukardaki rnekte de szlklerin bu zelli
ginden faydalandk. S
u satr tekrar gzmzn
nne getirelim:
>>> print(i, harfler[i])
Burada nce szlkteki anahtarlar alfabe srasna dizip her birine i adn veriyoruz. Daha
sonra print() fonksiyonu iinde ncelikle bu ileri ekrana basyoruz. Bu ilerle birlikte ayrca
szlk[i] kodunu kullanarak, i adn verdi
gimiz her bir anahtarn de
gerini de a
gryoruz.
Satrn en sonundaki sep parac
gnn grevini biliyorsunuz zaten. Bu parack burada bize
estetik bir fayda sunuyor... Ve nihayet s
u kty elde ediyoruz:
a
b
c
d
e
-->
-->
-->
-->
-->
1
5
8
10
30
Silmek
6.2.13 Szlkten ge
Szlklerin metotlarn i
slerken pop() ve popitem() adl metotlar grm
stk. Bu metotlar
yardmyla szlkteki
geleri silebiliyorduk. Yalnz bu metotlar silinen
geleri de otomatik
olarak ekrana basyorlard. Bizim ihtiyacmz olan s
ey listelerdeki remove() metodu gibi bir
s
ey olabilir. Yani silinen
geyi dnya aleme duyurmadan silmek istiyor olabiliriz, de
gil mi?
E
ger byle bir iste
gimiz varsa bunu daha nce bir kez grd
gmz del deyimi yardmyla
yapabiliriz. Hatrlarsanz del deyimini btn bir listeyi ortadan kaldrmak iin kullanm
stk.
Istersek bu del deyimini szlkteki tek bir
geyi silmek iin de kullanabiliriz:
>>> stok = {peynir: 8, elma: 3, sucuk: 6, sosis: 4, armut: 20}
>>> del stok["peynir"]
Bu s
ekilde stoktaki peynir anahtarn de
geriyle birlikte silmi
s olduk...
Daha nceki konulardan hatrlad
gmz bir de clear() metodu var. Bu metot ise btn bir
listeyi bo
saltmak iin kullanlyor. clear() metodunun grevi elimize bo
s bir liste vermektir.
BLM
Kmeler
Yeni konumuz Pythonda kmeler. Ingilizcede buna set diyorlar... Kmeler Pythonda nispeten yeni saylabilecek bir aratr ve hem ok hzldr, hem de epey i
se yarar...
Kmeleri
grendi
gimizde, bunlarn kimi zaman hi tahmin bile edemeyece
gimiz yerlerde
i
simize yarad
gn grece
giz. Normalde uzun uzun kod yazmay gerektiren durumlarda
kmeleri kullanmak, bir-iki satrla i
simizi halletmemizi sa
glayabilir.
Kmeler, matematikten bildi
gimiz kme kavramnn sahip oldu
gu btn zellikleri ta
sr. Yani
kesi
sim, birle
sim ve fark gibi zellikler Pythondaki setler iin de geerlidir.
Bu arada hatrlarsanz listelerin count() metodunu anlatrken de kmelerden faydalanm
stk.
O blmde s
yle bir rnek vermi
stik:
>>> for i in set(liste):
...
print(i, "
gesi listede", liste.count(i), "kez geiyor...")
Bu rne
gi verdi
gimizde, set() fonksiyonunu henz
grenmedi
gimizi, ama hi endi
se etmememiz gerekti
gini, zira bunu sonraki blmlerde ayrntl olarak i
sleyece
gimizi sylemi
stik.
I
ste artk bu kmeler konusunu ayrntl olarak
grenme zaman geldi. Isterseniz s
imdi hi vakit
kaybetmeden i
simize bakalm...
Bu daha temiz bir grnt oldu. Elbette kme tanmlamak iin mutlaka liste kullanmak zorunda
de
giliz. Istersek demetleri de kme haline getirebiliriz:
112
Kulland
gmz karakter dizisinin byle uzun olmasna da gerek yok. Tek karakterlik dizilerden
bile kme olu
sturabiliriz:
>>> kardiz = "a"
>>> kume = set(kardiz)
Burada kmelerle ilgili ok nemli bir bilgi ediniyoruz. Dikkat ederseniz yukarda ald
gmz hata
mesaj, Dnglenebilir Nesneleri zme konusundan bahsederken, saylar kulland
gmzda
ald
gmz hatayla ayn.
Buradan anlyoruz ki, set() fonksiyonu parametre olarak bir
dnglenebilir nesne istiyor... Saylar dnglenebilir nesneler olmad
g iin, bunlar kullanarak
kme olu
sturamyoruz. Bu da aklmzn bir kenarnda bulunsun...
Peki szlkleri kullanarak kme olu
sturabilir miyiz? Evet, neden olmasn? Szlkler de birer
dnglenebilir nesne oldu
guna gre, bunlardan kme olu
sturmamzn nnde hibir engel yok:
>>> bilgi = {"i
sletim sistemi": "GNU", "sistem ekirde
gi": "Linux",
... "da
gtm": "Ubuntu GNU/Linux"}
>>> kume = set(bilgi)
{a, , D, g, i, h, m, l, o, n, P, r, t, y}
Burada bir s
ey dikkatinizi ekmi
s olmal. Bir karakter dizisini kme olarak tanmlayp ekrana
yazdrd
gmzda elde etti
gimiz kt, o karakter dizisi iindeki her bir karakteri tek bir kez
ieriyor. Yani mesela Python Programlama Dili iinde iki adet P karakteri var, ama ktda bu iki P karakterinin yalnzca biri grnyor. Buradan anlyoruz ki, kmeler ayn
geyi
birden fazla tekrar etmez. Bu ok nemli bir zelliktir ve pek ok yerde i
simize yarar. Ayn durum karakter dizisi d
snda kalan teki veri tipleri iin de geerlidir. Yani mesela e
ger bir listeyi
kme haline getiriyorsak, o listedeki
geler kme iinde yalnzca bir kez geecektir. Listede
ayn
geden iki- tane bulunsa bile, kmemiz bu
geleri teke indirecektir...
grendi
gimiz bu
bilgi sayesinde listelerin count metodunu anlatrken verdi
gimiz rne
gi ok daha iyi kavrayabilirsiniz. Isterseniz o rne
ge bir kez daha bakalm:
>>> liste = ["elma", "armut", "elma", "kebap", "
seker", "armut",
... "ilek", "a
ga", "
seker", "kebap", "
seker"]
>>> for i in set(liste):
...
print(i, "
gesi listede", liste.count(i), "kez geiyor...")
elma
gesi listede 2 kez geiyor...
eker
s
gesi listede 3 kez geiyor...
kebap
gesi listede 2 kez geiyor...
a
ga
gesi listede 1 kez geiyor...
ilek
gesi listede 1 kez geiyor...
armut
gesi listede 2 kez geiyor...
Hemen i
simize yarayacak metotlar alalm:
>>> for i in dir(set):
...
if "__" not in i:
...
print(i)
...
add
clear
copy
difference
difference_update
discard
intersection
intersection_update
isdisjoint
issubset
issuperset
pop
remove
symmetric_difference
symmetric_difference_update
union
update
Grd
gnz gibi kmelerin epey metodu var. Bu arada if __ not in i satrnda _ yerine __ kulland
gmza dikkat edin... Neden? nk e
ger sadece _ kullanrsak symmetric_difference ve symmetric_difference_update metotlar ktmzda yer almayacaktr...
Unutmadan syleyelim: Kmeler de, tpk listeler gibi, de
gi
stirilebilir (mutable) bir veri tipidir...
Bu s
ekilde aslnda listeyi kopyalamad
gmz, yalnzca ayn nesneye (range(100)) gnderme
yapan iki farkl isim olu
sturdu
gumuzu
grenmi
stik. Dolaysyla yukardaki gibi bir i
slem yapt
gmzda, listedeki de
gi
siklikler yedek adl nesneyi de etkileyecektir. E
ger istedi
gimiz buysa ne
ala!... Ama e
ger yapmak istedi
gimiz s
ey bu de
gilse, izlememiz gereken yntem farkl olacaktr.
Listeler ve szlkleri incelerken copy() adl bir metot
grenmi
stik. Bu metot ayn zamanda
kmelerle birlikte de kullanlabilir. stelik i
slevi de ayndr:
>>> tr = set("
s
g")
>>> yedek = tr.copy()
>>> tr
{, ,
s, , ,
g}
>>> yedek
{,
g, , , ,
s}
Burada bir s
ey dikkatinizi ekmi
s olmal. tr adl kmeyi yedek adyla kopyaladk, ama bu
iki kmenin ktlarna bakt
gmz zaman
ge sralamasnn birbirinden farkl oldu
gunu gryoruz. Bu da bize kmelerle ilgili ok nemli bir bilgi daha veriyor. Demek ki, tpk szlklerde
oldu
gu gibi, kmeler de srasz veri tipleriymi
s. Elde etti
gimiz ktda
geler rastgele diziliyor...
Dolaysyla
gelere sralarna gre eri
semiyoruz. Aynen szlklerde oldu
gu gibi...
Grd
gnz gibi, add() metodunu kullanarak, kmemize ilek adl yeni bir
ge ekledik. E
ger
kmede zaten varolan bir
ge eklemeye al
srsak kmede herhangi bir de
gi
siklik olmayacaktr. nk, daha nce de syledi
gimiz gibi, kmeler her bir
geyi tek bir sayda barndrr...
E
ger bir kmeye birden fazla
geyi ayn anda eklemek isterseniz for dngsnden yararlanabilirsiniz:
Burada yeni adl listeyi kmeye for dngs ile ekledik. Ama bu i
slemi yapmann ba
ska bir
yolu daha vardr. Bu i
slem iin Pythonda ayr bir metot bulunur. Bu metodun ad update()
metodudur. Sras gelince bu metodu da grece
giz...
Grd
gnz gibi, birinci kullanmda, k1de bulunup k2de bulunmayan
geleri elde ediyoruz.
Ikinci kullanmda ise bunun tam tersi. Yani ikinci kullanmda k2de bulunup k1de bulunmayan
geleri alyoruz...
Isterseniz uzun uzun difference() metodunu kullanmak yerine sadece eksi (-) i
saretini
kullanarak da ayn sonucu elde edebilirsiniz:
>>> k1 - k2
...veya...
>>> k2 - k1
>>> print(k1)
{2}
>>> print(k2)
{1, 3, 5}
Grd
gnz gibi, bu metot k1in k2den farkn ald ve bu fark kullanarak k1i yeniden olu
sturdu... k1 ile k2 arasndaki tek fark 2 adl
ge idi. Dolaysyla difference_update() metodunu uygulad
gmzda k1in
gelerinin silinip yerlerine 2 adl
genin geldi
gini gryoruz...
ge silmemizi sa
glayacak:
>>> hayvanlar = set(["kedi", "kpek", "at", "ku
s", "inek", "deve"])
>>> hayvanlar.discard("kedi")
>>> print(hayvanlar)
{kpek, ku
s, deve, inek, at}
E
ger kme iinde bulunmayan bir
ge silmeye al
srsak hi bir s
ey olmaz... Yani hata mesaj
almayz:
>>> hayvanlar.discard("ylan")
Burada etkile
simli kabuk sessizce bir alt satra geecektir. Bu metodun en nemli zelli
gi
budur. Yani olmayan bir
geyi silmeye al
st
gmzda hata vermemesi...
Peki discard() varken remove() metoduna ne gerek var? Ya da tersi... Bu iki metot ayn i
slevi
yerine getirse de aralarnda nemli bir fark vardr. Hatrlarsanz discard() metoduyla, kmede
olmayan bir
geyi silmeye al
srsak herhangi bir hata mesaj almayaca
gmz sylemi
stik.
E
ger remove() metodunu kullanarak, kmede olmayan bir
geyi silmeye al
srsak, discard()
metodunun aksine, hata mesaj alrz:
>>> hayvanlar.remove("fare")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: fare
Grd
gnz gibi, bu metot bize k1 ve k2nin kesi
sim kmesini veriyor. Dolaysyla bu iki kme
arasndaki ortak elemanlar bulmu
s oluyoruz...
Hatrlarsanz, difference() metodunu anlatrken, difference() kelimesi yerine - i
saretini
de kullanabilece
gimiz, sylemi
stik. Benzer bir durum intersection() metodu iin de geerlidir. Iki kmenin kesi
simini bulmak iin & i
saretinden yararlanabiliriz:
>>> k1 & k2
{1, 3}
Burada e
ger kullanc, parola belirlerken iinde Trke bir harf geen bir kelime yazarsa programmz kendisini Trke harf kullanmamas konusunda uyaracaktr. Bu kodlarda kmeleri
nasl kulland
gmza dikkat edin. Programda asl i
si yapan ksm s
u satrdr:
if set(tr) & set(parola):
print("Ltfen parolanzda Trke harfler kullanmayn!")
Burada aslnda s
yle bir s
ey demi
s oluyoruz:
E
ger set(tr) ve set(parola) kmelerinin kesi
sim kmesi bo
s de
gilse, kullancya Ltfen parolanzda Trke harfler kullanmayn! uyarsn gster!
set(tr) ve set(parola) kmelerinin kesi
sim kmesinin bo
s olmamas, kullancnn girdi
gi kelime
iindeki harflerden en az birinin tr adl de
gi
sken iinde geti
gi anlamna gelir... Burada basite, tr de
gi
skeni ile parola de
gi
skeni arasndaki ortak
geleri sorguluyoruz. E
ger kullanc
herhangi bir Trke harf iermeyen bir kelime girerse set(tr) ve set(parola) kmelerinin kesi
sim
kmesi bo
s olacaktr. Isterseniz kk bir deneme yapalm:
>>> tr = "
s
g
S
G
I"
>>> parola = "ilek"
>>> set(tr) & set(parola)
{}
Grd
gnz gibi, elde etti
gimiz kme bo
s... Dolaysyla byle bir durumda programmz kullancya herhangi bir uyar mesaj gstermeyecektir...
intersection() metodunu pek ok yerde kullanabilirsiniz. Hatta iki dosya arasndaki benzerlikleri bulmak iin dahi bu metottan yararlanabilirsiniz... Ilerde dosya i
slemleri konusunu
i
slerken bu metottan nasl yararlanabilece
gimizi de anlataca
gz...
Grd
gnz gibi, intersection_update() metodu k1in btn
gelerini sildi ve yerlerine k1
ve k2nin kesi
sim kmesinin elemanlarn koydu...
Grd
gnz gibi, a ve b kmesinin kesi
simi bo
s olmad
g iin, yani bu iki kme ortak en az
bir
ge barndrd
g iin, isdisjoint() metodu False (Yanl
s) kts veriyor. Burada temel
olarak s
u soruyu sormu
s oluyoruz:
a ve b ayrk kmeler mi?
Python da bize cevap olarak, Hayr de
gil, anlamna gelen False ktsn veriyor... nk a
ve b kmelerinin ortak bir eleman var (2).
Bir de s
una bakalm:
>>> a = set([1, 3, 5])
>>> b = set([2, 4, 6])
>>> a.isdisjoint(b)
True
Yani b kmesi a
Bu rne
gi verdikten sonra da s
yle bir s
ey demi
stik:
Burada yeni adl listeyi kmeye for dngs ile ekledik. Ama bu i
slemi yapmann ba
ska bir
yolu daha vardr. Bu i
slem iin Pythonda ayr bir metot bulunur.
I
ste bu metodu
grenmenin vakti geldi. Metodumuzun ad update(). Bu metot, bir kmeyi
gncellememizi sa
glar. Isterseniz yukardaki rne
gi, bu metodu kullanarak tekrar yazalm:
>>> kume = set(["elma", "armut", "kebap"])
>>> yeni = [1, 2, 3]
>>> kume.update(yeni)
>>> print(kme)
{1, 2, 3, elma, kebap, armut}
Grd
gnz gibi, for dngsn kullanmaya gerek kalmadan ayn sonucu elde edebildik...
E
ger a kmesinin b kmesinden farkn bulmak istersek s
yle yapyoruz:
>>> a.difference(b)
{2}
>>> print(a)
set([2, 4])
Grd
gnz gibi, a kmesinin eski
geleri gitti, yerlerine symmetric_difference() metoduyla
elde edilen kt geldi... Yani a kmesi, symmetric_difference() metodunun sonucuna gre
gncellenmi
s oldu...
BLM
Hata Yakalama
Bu blmde yine Python Programlama Dili ile ilgili ok nemli bir konudan sz edece
giz. Yeni
konumuz Pythonda Hata Yakalama. Bu blmde Pythonda hatalarla ba
setmeyi
grenece
giz...
Hatrlarsanz nceki blmlerde yazd
gmz programlarda, rne
gin kullanc bizim beklentimizin
aksine bir say yerine harf girerse programmz hata verip kyordu. Gelin isterseniz buna
basit bir rnek verelim:
Amacmz iki sayy toplayan bir program yazmak olsun:
topla1 = input("Ltfen toplama i
slemine girecek ilk sayy giriniz: ")
topla2 = input("Ltfen toplama i
slemine girecek ikinci sayy giriniz: ")
sonu = int(topla1) + int(topla2)
print(sonu)
Bu program al
strd
gmzda, programmz kullanc tarafndan girilen iki sayy toplayp ekrana
yazdracaktr. Burada i
slerin do
gru gitmesi kullancnn ekrana iki adet say yazmasna ba
gldr.
E
ger kullanc say yerine harf girerse Pythonun bize verece
gi kt s
una benzer bir s
ey olacaktr:
Traceback (most recent call last):
File "deneme.py", line 5, in <module>
sonu = int(topla1) + int(topla2)
ValueError: invalid literal for int() with base 10: f
Esasnda daha nceki bir blmde rnek olarak basit bir hesap makinesi yazarken de byle bir
sorunumuzun oldu
gunu sylemi
stik. Orada ayn zamanda sonraki bir derste bu sorunun kesin
zmn
grenece
gimizi de sylemi
stik. I
ste bu tr problemlerin zmn s
imdi inceleyece
gimiz blmde
grenece
giz...
Geen blmde s
yle bir rnek vermi
stik:
125
Bu program al
strd
gmzda e
ger kullanc srasyla iki tane say girerse ne ala!... Programmz
hi bir sorun kartmadan bu saylar toplayacaktr. Ama e
ger kullanc say girmek yerine,
mesela a harfine basarsa programmzn s
yle bir hata verece
gini biliyoruz:
Traceback (most recent call last):
File "deneme.py", line 5, in <module>
sonu = int(topla1) + int(topla2)
ValueError: invalid literal for int() with base 10: a
Bu hata mesaj bizim iin nemli baz bilgiler ieriyor. Burada bizim dikkat etmemiz gereken,
bu hatann son satr... Gryoruz ki hata mesajnn son satrnda ValueError ifadesi var. I
ste
hata mesajnn bizim i
simize yarayacak ksm bu. Demek ki kullanc say yerine harf girerse
Pythonun verdi
gi hata tr ValueError imi
s... S
imdi s
yle bir s
ey yazalm:
try:
topla1 = input("Ltfen toplama i
slemine girecek ilk sayy giriniz: ")
topla2 = input("Ltfen toplama i
slemine girecek ikinci sayy giriniz: ")
sonu = int(topla1) + int(topla2)
print(sonu)
except ValueError:
print("Yanl
s de
ger!")
Grd
gnz gibi, bu s
ekilde programmz her i
slem sonunda ba
sa dnp kullancya tekrar
say soruyor. Tabii e
ger kullanc harf yerine ba
ska bir veri girerse programmzn al
smas
sona eriyor. Bir de s
una bakalm:
while True:
try:
topla1 = input("Ltfen toplama i
slemine girecek ilk sayy giriniz: ")
topla2 = input("Ltfen toplama i
slemine girecek ikinci sayy giriniz: ")
Programmz al
strd
gmzda, kullanc ne tr bir veri girerse girsin programmz al
smasna
devam edecektir. E
ger kullanc iki adet say girerse bunlar toplayp sonucu ekrana yazdracak;
ama e
ger kullanc say yerine ba
ska bir s
ey girerse de nce kullancy yanl
s de
ger girdi
gi
konusunda uyaracak ve yine al
smasna devam edecektir.
Bu demek oluyor ki, try... except... blo
gu sayesinde programmz ValueError hatasyla
kar
sla
ssa bile kmeden al
smaya devam edebilecektir.
Buradan, Pythonda hata yakalama konusunun nemli bir faydasn
grenmi
s oluyoruz:
Bildi
giniz gibi, Pythonu kendi haline brakt
gnzda, kullanc iin pek bir s
ey ifade etmeyecek hata mesajlar retiyor. Bu mesajlar bir Python programcs iin ok s
ey ifade ediyor olsa
da, programmz kullanan kimselerin bu kriptik hata mesajlarn anlamasn bekleyemeyiz. O
yzden onlara bu tr bulank hata mesajlar yerine, yukarda grd
gmz try... except...
bloklarn kullanarak daha anlaml mesajlar gsterebiliriz... Ne de olsa yanl
s de
ger! gibi bir
ileti, ValueError: invalid literal for int() with base 10: a gibi, olduka bilgisayarvari bir hata
mesajna gre ok daha anlaml olacaktr son kullanc iin.
Isterseniz daha nce yapt
gmz basit hesap makinesine geri dnp, yukarda
grendi
gimiz
yeni bilgiyi o kodlara uygulayalm. Zira hesap makinemiz de, e
ger kullanc say yerine harf
girerse kyordu:
#!/usr/bin/env python3.0
while True:
giri
s = """
(1) topla
(2) kar
(3) arp
(4) bl
(5) karesini hesapla
Programdan kmak iin "" harfine basnz...
"""
print(giri
s)
soru = input("Yapmak istedi
giniz i
slemin numarasn girin: ")
try:
if soru == "1":
say1 = int(input("Toplama i
slemi iin ilk sayy girin: "))
say2 = int(input("Toplama i
slemi iin ikinci sayy girin: "))
print(say1, "+", say2, "=", say1 + say2)
elif soru == "2":
say3 = int(input("karma i
slemi iin ilk sayy girin: "))
say4 = int(input("karma i
slemi iin ikinci sayy girin: "))
print(say3, "-", say4, "=", say3 - say4)
elif soru == "3":
say5 = int(input("arpma i
slemi iin ilk sayy girin: "))
say6 = int(input("arpma i
slemi iin ikinci sayy girin: "))
print(say5, "x", say6, "=", say5 * say6)
elif soru == "4":
say7 = int(input("Blme i
slemi iin ilk sayy girin: "))
say8 = int(input("Blme i
slemi iin ikinci sayy girin: "))
print(say7, "/", say8, "=", say7 / say8)
elif soru == "5":
say9 = int(input("Karesini hesaplamak istedi
giniz sayy giriniz: "))
print(say9, "saysnn karesi =", say9 ** 2)
elif soru == "":
print("Tekrar gr
smek zere!")
a = 0
else:
print("Yanl
s giri
s.")
print("A
sa
gdaki seeneklerden birini giriniz:")
except ValueError:
print("Sadece say giriniz!")
Grd
gnz gibi, burada da yapt
gmz s
ey, kullancnn say yerine harf girmesi durumunda
Pythonun ValueError hatas verece
gini bildi
gimiz kodlar try... blo
gu iine almaktan
ibaret... ValueError hatas alnd
gnda kullancya gsterilecek mesaj ise except ValueError blo
gu iinde gsteriyoruz.
Yukarda grd
gmz try... except... bloklar konusunda nemli bir nokta vardr dikkat
etmemiz gereken... except ValueError s
eklinde bir ifade kulland
gmzda, Python yalnzca
ValueError hatalarn yakalayacaktr. Bir program ValueError d
snda da pek ok hata verebilir. Mesela yukarda tekrar verdi
gimiz hesap makinemizin bir sorunu daha var. Bu programda
blme i
slemi srasnda bir sayy 0a blmeye al
srsak programmz s
yle bir hata verecektir:
Traceback (most recent call last):
File "deneme.py", line 38, in <module>
print(say7, "/", say8, "=", say7 / say8)
ZeroDivisionError: int division or modulo by zero
Programlama dillerinde bir saynn sfra blnmesi programn kmesiyle sonulanr. O yzden
biz de yazd
gmz programlarda yaplan i
slemlerin bir a
samasnda herhangi bir saynn sfra
blnmedi
ginden emin olmalyz...
Yukardaki hata mesajnda bizi ilgilendiren ksm ZeroDivisionError. Dolaysyla hata mesajn
yakalarken bu ifadeyi kullanaca
gz. Yazaca
gmz kodun tasla
g s
yle olacak:
try:
...hata verece
gini bildi
gimiz kodlar...
except ZeroDivisionError:
...hata geldi
ginde kullancya gsterilecek mesaj veya yaplacak i
slem...
except ZeroDivisionError:
...ZeroDivisionError hatas ald
gmzda yapaca
gmz i
slem...
Grd
gnz gibi, birden fazla hatay ayn anda yakalamak istedi
gimizde, her bir hata iin ayr
bir except... blo
gu yazmamz yeterli oluyor. Elbette, yukardaki taslak, her bir hata mesaj
iin ayr bir i
slem yapmak istedi
gimizde geerli. E
ger hangi hatayla kar
sla
slrsa kar
sla
slsn
ayn mesaj gsterilecekse veya ayn i
slem yaplacaksa kodlarmz s
yle de yazabiliriz:
try:
...hata verece
gini bildi
gimiz kodlar...
except (ValueError, ZeroDivisionError):
...hata alnnca yaplacak i
slem...
Burada da, e
ger kullancnn girdi
gi parolann uzunlu
gu 5 karakterden azsa, Parola 5 karakterden az olmamal! uyars gsterilecektir. E
ger kullanc 5 karakterden uzun bir parola
belirlemi
sse, kendisine Parolanz belirlendi! mesajn gsterip, break deyimi yardmyla programdan kyoruz...
Burada e
ger kullancnn girdi
gi karakter 0 ise hibir s
ey yapmyoruz. Ama e
ger kullanc
0 d
snda herhangi bir karakter girerse, bu karakterleri alp listeye ekliyoruz. Bu kodlarla
Pythona s
yle bir s
ey sylemi
s oluyoruz:
E
ger kullanc 0 karakterini girerse grmezden gel. Hibir s
ey yapma!... Ama e
ger
girilen karakter 0 d
snda bir s
eyse bunu listeye ekle ve listeyi ekrana bas!
pass deyimini hata yakalama i
slemlerinde de kullanabiliriz. E
ger bir hata yakaland
gnda programmzn hi bir s
ey yapmadan yoluna devam etmesini istiyorsak bu deyim i
simize yarayacaktr:
try:
....bir
seyler...
except IndexError:
pass
Bu s
ekilde programmz IndexError hatasyla kar
sla
srsa hi bir s
ey yapmadan yoluna devam edecek, bylece kullancmz programda ters giden bir s
eyler oldu
gunu dahi anlamayacaktr!... Yazd
gnz programlarda bunun iyi bir s
ey mi yoksa kt bir s
ey mi oldu
guna programc olarak sizin karar vermeniz gerekiyor... E
ger bir hatann kullancya gsterilmesinin
gerekmedi
gini d
snyorsanz yukardaki kodlar kullann, ama e
ger verilen hata nemli bir
hataysa ve kullancnn bu durumdan haberdar olmas gerekti
gini d
snyorsanz, bu hatay
pass ile gei
stirmek yerine, kullancya hatayla ilgili makul ve anla
slr bir mesaj gstermeyi
d
snebilirsiniz...
Yukarda anlatlan durumlarn d
snda, pass deyimini kodlarnz henz taslak a
samasnda
oldu
gu zaman da kullanabilirsiniz. rne
gin, diyelim ki bir kod yazyorsunuz. Programn
gidi
satna gre, bir noktada yapmanz gereken bir i
slem var, ama henz ne yapaca
gnza
karar vermediniz. Byle bir durumda pass deyiminden yararlanabilirsiniz. Mesela birtakm
if deyimleri yazmay d
snyor olun:
if .....:
byle yap
elif .....:
syle yap
else:
pass
Burada e
ger kullanc klavyede iptal yazarsa programdan klacaktr. Bunu;
if s == "iptal":
break
satryla sa
glamay ba
sardk.
E
ger kullanc tarafndan girilen say haneli veya daha az haneli bir say ise, continue
ifadesinin etkisiyle:
>>> print("En fazla haneli bir say girebilirsiniz.")
cmlesi yazdrlacaktr.
Dolaysyla buradan anlad
gmza gre, continue deyiminin grevi kendisinden sonra gelen
her s
eyin es geilip dngnn ba
sna dnlmesini sa
glamaktr. Bu bilgiye gre, yukardaki programda e
ger kullanc, uzunlu
gu 3 karakterden az bir say girerse continue deyiminin etkisiyle
programmz dngnn en ba
sna geri gidiyor. Ama e
ger kullanc, uzunlu
gu 3 karakterden fazla bir say girerse, ekrana En fazla haneli bir say girebilirsiniz, cmlesinin yazdrld
gn
gryoruz.
Burada e
ger kullanc say yerine harf girerse ValueError hatas alrz. Bu hatay except ValueError: ifadesiyle yakalyoruz ve hata verildi
ginde kullancya uyar vererek programmzn
kmesini engelliyoruz. Ama biliyoruz ki, bu kodlar al
strd
gmzda Pythonun verebilece
gi
tek hata ValueError de
gildir. E
ger kullanc bir sayy 0a blmeye al
srsa Python ZeroDivisionError adl hatay verecektir. Dolaysyla bu hatay da yakalamak iin s
yle bir s
ey
yazabiliriz:
try:
blnen = int(input("blnecek say: "))
blen = int(input("blen say: "))
print(blnen/blen)
except ValueError:
print("hata!")
except ZeroDivisionError:
print("Bir sayy 0a blemezsiniz!")
Bu s
ekilde hem ValueError hatasn hem de ZeroDivisionError hatasn yakalam
s oluruz...
Bu kodlarn zelli
gi, except... bloklarnn tek bir try... blo
gunu temel almasdr. Yani biz
burada btn kodlarmz tek bir try... blo
gu iine tk
stryoruz. Bu blok iinde gerekle
sen
hatalar da daha sonra tek tek except... bloklar yardmyla yakalyoruz. Ama e
ger biz istersek bu kodlarda verilebilecek hatalar gruplamay da tercih edebiliriz:
try:
blnen = int(input("blnecek say: "))
blen = int(input("blen say: "))
except ValueError:
print("hata!")
else:
try:
print(blnen/blen)
except ZeroDivisionError:
print("Bir sayy 0a blemezsiniz!")
Burada yapt
gmz s
ey s
u: Ilk try... except... blo
gu yardmyla ncelikle int(input())
fonksiyonu ile kullancdan gelecek verinin say olup olmad
gn denetliyoruz. Ardndan bir
else... blo
gu aarak, bunun iinde ikinci try... except... blo
gumuzu devreye sokuyoruz. Burada da blme i
slemini gerekle
stiriyoruz. Kullancnn blme i
slemi srasnda 0
saysn girmesi ihtimaline kar
s da except ZeroDivisionError ifadesi yardmyla olas hatay
g
gslyoruz... Bu s
ekilde bir kodlamann bize getirece
gi avantaj, hatalar zerinde belli bir
kontrol sa
glamamza yardmc olmasdr. Yukardaki kodlar sayesinde hatalara bir nevi teker
teker gelin! mesaj vermi
s oluyoruz!... Bylelikle her blok iinde sadece almay bekledi
gimiz
hatay kar
slyoruz. Mesela yukarda ilk try... blo
gu iindeki dn
strme i
slemi yalnzca
ValueError hatas verebilir. else: blo
gundan sonraki try... blo
gunda yer alan i
slem ise
ancak ZeroDivisionError verecektir. Biz yukarda kulland
gmz yap sayesinde her bir hatay
tek tek ve yeri geldi
ginde kar
slyoruz. Bu durumun aksine, blmn ilk ba
snda verdi
gimiz
try... blo
gunda hem ValueError hem de ZeroDivisionError hatalarnn gerekle
sme ihtimali bulunuyor. Dolaysyla biz orada btn hatalar tek bir try... blo
gu iine sk
strm
s
oluyoruz. I
ste else: blo
gu bu sk
skl
g gidermi
s oluyor. Ancak sizi bir konuda uyarmak isterim: Bu yap, her akla geldi
ginde kullanlacak bir yap de
gildir. Byk programlarda bu tarz
bir kullanm kodlarnzn darmada
gn olmasna, kodlarnz zerindeki denetimi tamamen kaybetmenize yol aabilir. Sonunda da elinizde blk prk bir kod y
gn kalabilir... Zaten aka
sylemek gerekirse try... except... else... yapsnn ok geni
s bir kullanm alan yoktur. Bu yap ancak ok nadir durumlarda kullanlmay gerektirebilir. Dolaysyla bu l yapy
hi kullanmadan bir mr rahatlkla geirebilirsiniz...
try...
try...
except...
except...
else... yaplarnn d
snda, Pythonun bize sundu
gu bir ba
ska yap da
finally... yaplardr... Bunu s
yle kullanyoruz:
try:
...bir takm i
sler...
except birHata:
...hata alnnca yaplacak i
slemler...
finally:
...hata olsa da olmasa da yaplmas gerekenler...
finally.. blo
gunun en nemli zelli
gi, programn al
smas srasnda herhangi bir hata
gerekle
sse de gerekle
smese de i
sletilecek olmasdr. E
ger yazd
gnz programda mutlaka
ama mutlaka i
sletilmesi gereken bir ksm varsa, o ksm finally... blo
gu iine yazabiliriz.
finally... blo
gu zellikle dosya i
slemlerinde i
simize yarayabilir. Henz Pythonda dosyalarla
nasl al
saca
gmz
grenmedik, ama ben s
imdilik size en azndan dosyalarla al
sma prensibi
hakknda bir s
eyler syleyeyim.
Genel olarak Pythonda dosyalarla al
sabilmek iin ncelikle bilgisayarda bulunan bir dosyay
okuma veya yazma kipinde aarz. Dosyay atktan sonra bu dosyayla ihtiyacmz olan birtakm i
slemler gerekle
stiririz. Dosyayla i
simiz bittikten sonra ise dosyamz mutlaka kapatmamz gerekir. Ancak e
ger dosya zerinde i
slem yaplrken bir hata ile kar
sla
slrsa dosyamz
kapatma i
slemini gerekle
stirdi
gimiz blme hi ula
slamayabilir. I
ste finally... blo
gu byle
bir durumda i
simize yarayacaktr:
try:
dosya = open("dosyaad", "r")
...burada dosyayla baz i
slemler yapyoruz...
...ve anszn bir hata olu
suyor...
except IOError:
print("bir hata olu
stu!")
finally:
dosya.close()
Burada ValueError hatann addr. invalid literal for int() with base 10: a ise gsterilen
mesaj... Biz e
ger istersek bu hatann adn zelle
stirebilir, o ksma istedi
gimiz ba
ska bir ifade
yazabiliriz. Bunun iin except... as... bloklarndan yararlanaca
gz. Hemen bir rnek verelim:
try:
blnen = int(input("blnecek say: "))
blen = int(input("blen say: "))
print(blnen/blen)
except ZeroDivisionError as hata:
print("Sfra Blme Hatas. Python
su hata mesajn verdi:", hata)
8.7 raise
Bazen, yazd
gmz bir programda, kullancnn yapt
g bir i
slem normal s
artlar altnda hata vermeyecek olsa bile biz ona Python tarz bir hata mesaj gstermek isteyebiliriz. Byle bir durumda ihtiyacmz olan s
ey Pythonun bize sundu
gu raise adl deyimdir. Bu deyim yardmyla
duruma zg hata mesajlar retebiliriz. Bir rnek verelim:
blnen = int(input("blnecek say: "))
if blnen == 23:
raise Exception("Bu programda 23 saysn grmek istemiyorum!")
blen = int(input("blen say: "))
print(blnen/blen)
Burada e
ger kullanc 23 saysn girerse, kullancya bir hata mesaj gsterilip programdan
klacaktr... Biz bu kodlarda Exception adl genel hata mesajn kullandk. Burada Ex-
Burada, e
ger kullanc bir sayy 0a blmeye al
srsa, normal bir s
ekilde ZeroDivisionError
hatas verilecek ve programdan klacaktr. Ama bu hata mesajyla birlikte kullancya bir
sayy 0a blemezsiniz uyarsn da gsterme imkann elde edece
giz... Yani burada except
ZeroDivisionError blo
gunu herhangi bir hatay engellemek iin de
gil, hataya ilave bilgi eklemek iin kullanyoruz. Bunu yapmamz sa
glayan s
ey tabii ki bu kodlar iinde grnen raise
adl deyimdir...
Grd
gnz gibi, burada herhangi bir hata ad belirtmedik. Bylece Python, yazd
gmz programda hangi hata olu
sursa olu
ssun hepsini yakalayabilecektir.
Bu yntem gznze ok pratik grnm
s olabilir, ama aslnda hi de yle saylmaz. Hatta
olduka kt bir yntem oldu
gunu syleyebiliriz bunun. nk bu tarz bir kod yazmnn baz
dezavantajlar vardr. rne
gin bu s
ekilde btn hata mesajlarn ayn kefeye koyarsak, programmzda ne tr bir hata olu
sursa olu
ssun, kullancya hep ayn mesaj gstermek zorunda
kalaca
gz. Bu da, herhangi bir hata durumunda kullancy ne yapmas gerekti
gi konusunda
do
gru dzgn bilgilendiremeyece
gimiz anlamna geliyor. Yani kullanc bir hataya sebep
oldu
gunda tersli
gin nereden kaynakland
gn tam olarak kestiremeyecektir.
Ayrca, e
ger kendimiz bir program geli
stirirken srekli olarak bu tarz bir yazm benimsersek,
kendi kodlarmzdaki hatalar da maskelemi
s oluruz. Dolaysyla, Python yukardaki geni
s apl
except... blo
gu nedeniyle programmzdaki btn hatalar gizleyece
gi iin, programmzdaki
potansiyel aksaklklar grme imkanmz olmaz. Dolaysyla bu tr bir yapdan olabildi
gince
kanmakta fayda var...
BLM
Genel Tekrar
9.1 Pythonu Ba
slatma Seenekleri
E
ger bu noktaya kadar gelmi
sseniz, Pythonu ba
saryla kurmu
s ve al
strm
ssnz demektir... O yzden bu blmde Pythonun bilgisayarnza nasl kurulaca
gndan ve Pythonun
nasl al
strlaca
gndan bahsetmek yerine, bu konuyla ilgili baz ayrntlara de
ginmeye al
saca
gz. Bu blmn konusu, Pythonu ba
slatma seenekleri (startup options)... Yani bu
blmde, Pythonu al
strrken hangi seenekleri kullanabilece
gimizi ve bu seeneklerin ne
i
se yarad
gn
grenece
giz.
Ben bu blmde, sizin Pythonun etkile
simli kabu
guna ula
smak veya Python ile yazd
gnz
programlar al
strmak iin s
u komutu kulland
gnz varsayaca
gm:
python3
E
ger siz kendi sisteminizde Pythonu al
strmak iin ba
ska bir komut kullanyorsanz
(python3.0 gibi...), python3 grd
gnz yere, kendi kulland
gnz komutu yerle
stireceksiniz...
Ilk seene
gimizle ba
slayalm...
python3 -h
137
Pythonu -h seene
gi ile ba
slatt
gmzda kar
smza Pythonun yardm (help) ekran gelir. Buradan, Pythonu nasl al
straca
gnza, al
strrken hangi seenekleri kullanabilece
ginize ve
bu seeneklerin ne i
se yarad
gna dair ksa bilgilere eri
sebilirsiniz. I
ste biz de bu blmde, bu
yardm ekrannda grnen seeneklerin en nemli olanlarna ve s
u a
samada bizi ilgilendirenlerine de
ginece
giz...
Bu yardm ekranna s
u komut ile de eri
sebilirsiniz:
python --help
Burada - i
saretinin ift oldu
guna dikkat edin.
python3 -c
Bu seenek, Pythonu bir komutla al
strmamz sa
glar. Bu ne demek oluyor? Hemen s
yle bir
rnek verelim:
python3 -c "print(Merhaba Dnya)"
python3 -v
-v seene
gin grevi, Pythonun al
smaya ba
slad
g anda ve kapanrken hangi i
slemleri yapt
gn ayrntl olarak gstermektir. Kullanm s
yledir:
python3 -v
Bu komutu verdi
gimizde Pythonun etkile
simli kabu
gu ba
slayacak, ama kabuk ba
slarken
Pythonun arkaplanda neler kar
strd
g da ekrana dklecektir. Ayn s
ekilde, etkile
simli kabu
gu
CTRL+Z tu
s bile
simiyle kapatt
gmzda da, arkaplanda olup biten her s
ey ekrana dklecektir.
python3 -V
Bu seenekteki Vnin byk harf oldu
guna dikkat ediyoruz. Bu seene
gin kullanm s
yledir:
python3 -V
print("Merhaba")
print("Glegle")
E
ger bu dosyay s
u komutla al
strrsak:
python3 -x dosya.py
Ancak Pythonun 3.x srmyle birlikte, print bir fonksiyon halini ald. Dolaysyla artk
ekrana bir s
eyler yazdrmak iin s
yle yapyoruz:
>>> print("bir
seyler...")
print() fonksiyonundaki bu de
gi
siklik, Pythonun 2.xten 3.xe gei
sinde yaplan en nemli
yeniliklerden biridir. Ayrca print()in bir fonksiyon haline gelmesi ile birlikte bu fonksiyon
baz gl zellikler de kazand. I
ste biz de bu blmde yeni print() fonksiyonunun gcn
ortaya koymaya al
saca
gz.
Diyelim ki elimizde s
yle bir liste var:
>>> liste = ["elma", "armut", "kebap"]
E
ger Pythonun 2.x srmlerinden birini kullanyor olsaydk s
yle bir komut yazabilirdik:
>>> for i in liste:
...
print i
Bu komut bize s
yle bir kt verir:
elma
armut
kebap
Ayn i
slemi Python 3.x ile yapt
gmzda da tpatp ayn sonucu elde ederiz.
Python 2.xte, liste
gelerini byle alt alta de
gil de yan yana dizmek istersek s
yle bir yol
izliyorduk:
>>> for i in liste:
...
print i,
...
elma armut kebap
Grd
gnz gibi, inin yanna koydu
gumuz virgln herhangi bir etkisi olmad. Peki biz liste
armut,
kebap,
E
ger kulland
gnz konsol/terminal i
slem sonunda yeni satra gemiyorsa bu komutu s
yle de
yazabilirsiniz:
>>> print(*liste, sep=", ", end="\n")
Bu rnekte, print() fonksiyonu iinde belirtilen karakter dizilerinin her birinin arasna, sep
parametresi yardmyla bir virgl i
sareti koyuyoruz...
sep parametresi ile birlikte
grendi
gimiz end adl parametre ise, print() fonksiyonu iinde
belirtilen ifadenin ne s
ekilde bitece
gini gsteriyor. Biz yukardaki rnekte n i
saretini kullandk. Bylece print() fonksiyonu yardmyla ekrana bir s
eyler yazdrdktan sonra yeni satra
geebiliyoruz...
print() fonksiyonu sep ve end d
snda bir de file adl bir parametre alr. Bu parametre
yardmyla, ekrana yazdraca
gmz s
eyleri ekran yerine bilgisayarmzdaki bir dosyaya yazdrabiliriz:
>>> print("Merhaba Dostlar!", file=open("pydeneme.txt", "w"))
Bu zelli
gin ne kadar faydal olabilece
gini tahmin edebilirsiniz. Burada open() adl bir
fonksiyondan yararland
gmza dikkat edin. Bu fonksiyonu dosya i
slemleri konusunu i
slerken
daha detayl olarak inceleyece
giz. Ayn fonksiyona, hata yakalama konusunu i
slerken de
de
ginmi
stik... Bu arada, bilginiz olmas asndan, yukardaki open() fonksiyonu iinde kulland
gmz w parametresinin, bilgisayarmzda yeni bir dosya olu
sturmaya yarad
gn syleyelim... Hatrlarsanz, hata yakalama konusu iinde bu fonksiyona de
ginirken w yerine r
adl bir parametre kullanm
stk. O parametre dosyay okumak zere amamz sa
glyordu. w
parametresi ise dosyay yazmak zere amamz sa
glyor.
Gelin isterseniz bu file parametresini kullanarak az ok yararl bir uygulama yazalm:
ad = input("adnz: ")
soyad = input("soyadnz: ")
eposta = input("e.posta adresiniz: ")
print(ad, soyad, eposta, file=open("deneme.txt", "w"), sep="\n")
print("Girdi
giniz veriler dosyaya ba
saryla i
slendi!")
Burada kullancya adn, soyadn ve e.posta adresini soruyoruz. Ardndan kullancnn girdi
gi
bu verileri, deneme.txt adl bir dosyaya kaydediyoruz. sep parametresini nasl kulland
gmza dikkat edin. Kullancnn girdi
gi her bir verinin dosya iinde ayr bir satrda yer
almas iin, sep parametresine n de
gerini verdik...
9.3 Etkile
simli Kabugun
Hafzas
Pythondaki etkile
simli kabuk denen s
eyin ne oldu
gunu daha nce anlatm
stk. Etkile
simli
kabu
gun, Pythonun gcne g katan en nemli zelliklerden birisi oldu
gunu sylesek abartm
s olmayz. zellikle byle bir araca sahip olmayan diller zerinde al
sm
s arkada
slarm ne
demek istedi
gimi ok daha iyi anlayacaktr. Etkile
simli kabuk programclar arasnda o kadar
hayranlk uyandrm
str ki baz yazarlar srf etkile
simli kabu
gun bile Pythonu Javadan stn
klmaya yeterli oldu
gunu sylemekten ekinmemi
slerdir.
Bu blmde, etkile
simli kabu
gun ufak ama olduka pratik bir zelli
ginden sz edece
giz.
Diyelim ki etkile
simli kabukta baz aritmetik i
slemler yapyorsunuz... rne
gin s
yle bir i
slem
yaptnz:
>>> 54345345 * 45
2445540525
en son i
slemin de
gerini barndrr. Etkile
simli kabukta 54345345 * 45 i
slemini yaptktan ve
sonucu aldktan sonra s
u komutu verin:
>>> _
2445540525
Grd
gnz gibi b u komut size en son yapt
gnz i
slemin sonucu olan sayy veriyor. Dolaysyla
en son elde etti
giniz sayy mesela 25e blmek iin s
yle bir s
ey yapabilirsiniz:
>>> _ / 25
97821621.0
Burada _ i
sareti 2445540525 saysn hafzasnda tuttu
gu iin bu sayy pratik bir s
ekilde
ba
ska bir i
slem iinde kullanmamza imkan sa
glyor. stelik bu i
sleci sadece saylarla kullanmak zorunda da de
giliz. _ i
sleci her trl i
slemin sonucunu hafzasnda tutabilir. Mesela:
>>> "elma" + " armut"
elma armut
>>> _
elma armut
Hatta isterseniz bu i
sleci bir de
gi
skene dahi atayabilirsiniz:
>>> sondeger = _
elma
round()
max()
Evet, bu fonksiyon min() fonksiyonunun tam tersidir. Bir say dizisi iindeki en byk sayy
verir:
>>> max(45, 90, 43, 23, 3353)
3353
...veya...
>>> liste = [4234, 343543, 23323, 6161, 54564, 65675,
... 34243243, 4324, 4234]
>>> max(liste)
34243243
Python bu yntemin d
snda, bir saynn kuvvetini almak iin bize pow() adl bir fonksiyon daha
sunuyor. Yukardaki i
slemi pow() fonksiyonunu kullanarak s
yle yazabiliriz:
>>> pow(2, 3)
8
S
yle bir blme i
slemi yapt
gmz d
snelim:
>>> 10 / 2
5.0
Grd
gnz gibi burada bir ondalk say elde ediyoruz. E
ger elde etti
gimiz saynn ondalk
de
gil de tamsay olmasn istersek // i
slecinden yararlanmamz gerekti
gini biliyoruz:
>>> 10 // 2
5
Bir de s
yle bir i
slem yapt
gmz d
snelim:
>>> 10 % 2
0
Burada da 10 saysnn 2ye blmnden kalan sayy buluyoruz. Demek ki 10 says 2ye
blnd
gnde kalan 0 oluyormu
s. Burada % i
slecinin ne i
se yarad
gn saylar konusunu
i
slerken
grenmi
stik...
I
ste divmod() fonksiyonu yukarda bahsetti
gimiz bu iki i
slemi birle
stiriyor. Hemen bir rnekle
bunu somutla
stralm:
>>> divmod(10, 2)
(5, 0)
Grd
gnz gibi divmod() fonksiyonu ayn anda noktasz blme i
slemi yapyor ve blme i
sleminden kalan sayy gsteriyor...
sum()
S
imdi grece
gimiz sum() adl fonksiyon olduka yararl bir aratr. Bu fonksiyon bir say dizisini
alp bu dizinin toplamn verir bize. rne
gin:
>>> liste = [34, 43, 32, 23, 23232, 32]
>>> sum(liste)
23396
Burada oldu
gu gibi Bool kavramndan kar
sla
strma i
slemlerinde yararlanmann yansra, bir
s
eyin herhangi bir de
gere sahip olup olmad
gn denetlemek iin de Bool de
gerlerinden faydalanabiliriz. rne
gin:
>>> a = 23
>>> if a:
...
print("Evet, ann bir de
geri var!..")
...
Evet, ann bir de
geri var!..
Bir de s
u rne
ge bakalm:
>>> a = ""
>>> if a:
...
print("Evet, ann bir de
geri var!..")
... else:
...
print("Hayr, ann herhangi bir de
geri yok!")
...
Hayr, ann herhangi bir de
geri yok!"
Burada kulland
gmz if a: ifadesi, E
ger a do
gru ise... anlamna geliyor. Yani burada E
ger
ann Bool de
geri True ise... demi
s oluyoruz. Bu durumu daha ak bir s
ekilde gstermek iin
Bir de s
una bakalm:
>>> a = "karakter dizisi"
>>> bool(a)
True
a = ifadesinin False de
gerini vermesi bize Pythondaki Bool de
gerleri hakknda nemli
bir bilgi veriyor. Pythonda baz s
eyler her zaman False de
geri verir. rne
gin btn bo
s
veritipleri False de
gerine sahiptir. rne
gin:
>>> liste = []
>>> bool(liste)
False
>>> sozluk = {}
>>> bool(sozluk)
False
>>> demet = ()
>>> bool(demet)
False
>>> kume = set()
>>> bool(kume)
False
>>> True + 1
2
Burada Truenin de
geri 1 oldu
gu iin, True + 1 ifadesi 2 sonucunu veriyor. Bir de s
una
bakalm:
>>> False + 1
1
Liste, szlk,
Bunun d
snda zel olarak None de
geri de her zaman Falsedir:
>>> a = None
>>> bool(a)
False
Bo
s veritiplerinin False, dolu veritiplerinin True de
geri vermesinden yola karak s
yle bir uygulama yazabiliriz:
liste = []
print("""
Ltfen bir say girin. Her veri giri
sinden sonra Enter
tu
suna basn.
I
slemi bitirip programdan
kmak iin ise yine Enter tu
suna basn.""")
while True:
veri = input("Say: ")
if veri:
try:
say = int(veri)
liste.append(say)
except ValueError:
continue
else:
toplam = sum(liste)
print("girdi
giniz saylarn toplam: ", toplam)
print("tekrar gr
smek zere!")
break
S
imdi bu kodlar satr satr inceleyelim...
ncelikle liste = [] satr yardmyla bo
s bir liste olu
sturuyoruz. Kullancdan alaca
gmz verileri bu liste iinde toplayaca
gz.
Ardndan bir print() fonksiyonu iinde programmzn ne i
s yapaca
gn, kullancdan ne bekledi
gimizi anlatan bir karakter dizisi olu
sturuyoruz. Buna gre, kullanc ekrana bir say girecek
ve her veri giri
sinden sonra Enter tu
suna basacak. Ayrca i
slemin sonucunu alp programdan
kmak iin de yine Enter tu
suna basmas gerekecek...
Daha sonra bir while dngs olu
sturuyoruz. Burada kulland
gmz while True: ifadesine
dikkat edin. Bu ifade, bir kod dizisini srekli bir dngye sokmak iin kullanabilece
gimiz standart bir yoldur. Trke olarak sylemek gerekirse, while True: ifadesi Do
gru oldu
gu mddete... anlamna gelir. Bu sayede programmza s
u komutu vermi
s oluyoruz:
Do
gru oldu
gu mddete a
sa
gdaki komutlar al
strmaya devam et...
Peki ne do
gru oldu
gu mddete? Neyin do
gru oldu
gunu aka belirtmedi
gimiz iin Python
burada her s
eyi do
gru kabul ediyor... Yani bir nevi, aksi belirtilmedi
gi srece a
sa
gdaki
komutlar al
strmaya devam et! emrini yerine getiriyor.
Sonraki satrda veri = input(Say: ) kodu ile kullancdan veri alma i
slemini ba
slatyoruz. Burada henz kullancdan ald
gmz veriyi int() fonksiyonu yardmyla tamsayya evirmedi
gimize dikkat edin. E
ger daha bu a
samada dn
strme i
slemini yaparsak, daha sonra
kullancnn programdan kmak iin kullanaca
g Enter tu
sunu yakalayamayz. nk byle bir
durumda kullanc Enter tu
suna basarsa programmz hata verecektir.
Bundan sonraki admda if veri: satrn yazyoruz. Bunun, e
ger veri adl karakter dizisi True
de
gerine sahipse... anlamna geldi
gini biliyoruz. Zira bildi
giniz gibi, e
ger veri adl karakter
dizisi hibir s
ey iermezse, yani bo
ssa, sahip oldu
gu Bool de
geri False olacaktr. Yani e
ger
kullancmz hibir say girmeden Enter tu
suna basarsa, veri adl karakter dizisinin ieri
gi bo
s
olaca
g iin bu karakter dizisi False de
gerine sahip olacaktr. Dolaysyla e
ger kullancmz
bir say girip Enter tu
suna basarsa, veri adl karakter dizisinin Bool de
geri True olaca
g iin
if veri: blo
gu iindeki kodlar i
sletilecektir. Yok e
ger kullancmz herhangi bir say girmeden
Enter tu
suna basarsa a
sa
gdaki else: blo
gu iindeki kodlar al
strlacaktr...
if veri: kodunu yazdktan sonra bir try... except... blo
gu olu
sturuyoruz. Sayya
dn
strme i
slemini bu blok iinde gerekle
stirece
giz. say = int(veri) satr yardmyla,
kullancdan ald
gmz karakter dizisini sayya eviriyoruz.
Hemen ardndan gelen
liste.append(say) satr ise, kullancdan alp tamsayya evirdi
gimiz veriyi, en ba
sta olu
sturdu
gumuz listeye eklememizi sa
glyor.
Sonraki satrda ise except... blo
gumuzu yazyoruz. Bir nceki try... blo
gu iine yazd
gmz
int() fonksiyonunun, kullancnn say yerine harf girmesi durumunda ValueError hatas
verece
gini bildi
gimiz iin bu blok iinde bu hata tipini yakalyoruz. E
ger kullanc say yerine
harf girer ve ValueError hatas alnmasna yol aarsa, continue ifadesi yardmyla dngnn
en ba
sna geri gidiyoruz.
Sra geldi else: blo
gumuzu yazmaya... Kodlarmzn ba
snda if veri: s
eklinde bir s
ey
yazm
stk. Bu kod, kullancnn ekrana bir veri girip girmedi
gini denetliyordu. I
ste kullancnn
9.7 Bool Is
leleri (Boolean Operators)
Bu blmde Pythondaki Bool i
sleleri konusundan sz edece
giz. Burada de
ginece
gimiz
i
sleler and, or ve not adl Bool i
sleleridir... Bu i
slelere ayrca mantk i
sleleri (logical
operators) ad da verilir.
and
Bu kelime Trkede ve anlamna gelir. S
yle bir rnek verelim:
>>> a = 4
>>> b = 12
>>> a == 4 and b == 12
True
Burada kullancnn sisteme girebilmesi iin hem parolann hem de kullanc adnn nceden
belirledi
gimiz kullanc ad ve parolayla e
sle
smesi lazm. Bunlardan herhangi biri e
sle
smezse
kullanc sisteme alnmayacaktr.
or
Bu kelime veya anlamna gelir. and i
slecini anlatrken, bir sonucun True olabilmesi iin
her iki ko
sulun da True olmas gerekti
gini sylemi
stik. or i
slecinde ise, ko
sullardan herhangi
birinin True olmas, sonucun True olmas iin yeterli olacaktr. Mesela yukardaki rne
gi
or i
sleci ile yazarsak, kullanc ad veya paroladan herhangi birinin do
gru olmas, kullancnn
sisteme girmesi iin yeterli olacaktr:
kullanc_ad = "istihza"
parola = "parola"
print("""Sitemize ho
sgeldiniz! Hizmetlerimizden yararlanmak iin
ltfen kullanc adnz ve parolanz giriniz.""")
while True:
kull = input("kullanc ad: ")
par = input("parola: ")
if kull == kullanc_ad or par == parola:
print("Sisteme ho
sgeldiniz!")
break
else:
print("Kullanc adnz ve parolanz yanl
s! Ltfen tekrar deneyin.")
continue
Dedi
gimiz gibi, or i
slecinin True sonucu verebilmesi iin nermelerden herhangi birinin
True olmas yeterli olacaktr. E
ger nermelerden her ikisi de yanl
s ise sonucumuz False
olur:
>>> a = 12
>>> b = 2
>>> a == 12 or b == 4
True
>>> a == 5 or b == 43
False
not
Bu blmde i
sleyece
gimiz son i
slecimiz not adl Bool i
slecidir. Bu kelime de
gil anlamna gelir
ve cmleye olumsuzluk anlam katar. rne
gin:
try:
soru = int(input("bir ift say giriniz: "))
if not soru % 2 == 0:
print("ift say girmediniz!")
else:
print("ift say girdiniz!")
except ValueError:
print("Say... Sadece say...")
Burada, a de
gi
skeninin de
geri 2ye blnd
gnde kalan 0 de
gildir gibi bir nerme veriyoruz.
Python da cevap olarak bize True (Do
gru) diyor... nk gerekten de a de
gi
skeninin de
geri
olan 13 saysn 2ye bld
gmzde kalan say 0 de
gildir... Bir de s
una bakalm:
>>> a = 34
>>> not a % 2 == 0
False
Burada da, a de
gi
skeninin de
geri olan 34 says 2ye blnd
gnde kalan say 0 oldu
gu iin
Python, a 2ye blnd
gnde kalan say 0 de
gildir nermemize False (Yanl
s) cevabn
veriyor...
[e, l, m, a]
Grd
gnz gibi ncelikle bo
s bir liste olu
sturuyoruz. Ardndan da a adl de
gi
sken zerinde
bir for dngs kurarak bunun btn
gelerini append() metodu yardmyla listeye ekliyoruz. Ancak ayn i
slemi yapmann ok daha kolay ve verimli bir yolu vardr. Liste retelerini
kullanarak bu i
slemi tek satrda halledebiliriz:
>>> [i for i in a]
[e, l, m, a]
Burada liste retelerinin szdizimi ile for dnglerinin szdizimi arasndaki benzerli
ge dikkat
edin. Gerekten de liste reteleri grnm olarak for dnglerinin tek satra indirilmi
s hali
gibi grnr. S
u for dngsnn s
yle evrildi
gini d
snn:
for dngmz...
>>> for i in range(10):
...
print(i)
...veya...
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
E
ger bunu bir for dngs ile halletmek isteseydik s
yle yazacaktk bu kodlar:
>>> for i in isimler:
...
if i[0] == "A":
...
print(i)
...
Ay
se
Ali
Aycan
Ayhan
Ayla
Yapt
gmz i
slemden False sonucunu aldk. Demek ki listedeki btn saylar 20den byk
de
gilmi
s...
Pythondaki liste reteleri pek ok konuda i
slerimizi kolayla
strmamza yardmc olur. Mesela
bir dizi iindeki btn saylar hzl bir s
ekilde belli bir i
sleme tabi tutmak istersek liste retelerinden yararlanabiliriz:
>>> liste = [1, 2, 3, 4, 5, 6]
>>> [pow(i, 3) for i in liste]
[1, 8, 27, 64, 125, 216]
Pythonda yazd
gmz kodlarn ba
skalarnn da anlayabilmesini sa
glamak iin, programmzn
yorumlarla desteklenmesi tavsiye edilir. Elbette programnz yorumlarla desteklemeseniz de
programnz sorunsuz bir s
ekilde al
sacaktr. Ama program yorumlarla desteklemek en azndan nezaket gere
gidir.
Ayrca i
sin ba
ska bir boyutu daha var. Sizin yazd
gnz kodlar nasl ba
skalar okurken zorlanyorsa, kendi yazd
gnz kodlar okurken siz bile zorlanabilirsiniz... zellikle uzun sredir
ilgilenmedi
giniz eski programlarnz gzden geirirken byle bir sorunla kar
sla
sabilirsiniz. Programn iindeki bir kod paras, programn ilk yazl
snn zerinden 5-6 ay getikten sonra size
artk hibir s
ey ifade etmiyor olabilir... Kodlara bakp, Acaba burada ne yapmaya al
sm
sm?
diye d
snd
gnz zamanlar da olacaktr... I
ste bu tr skntlar ortadan kaldrmak veya en
aza indirmek iin kodlarmzn arasna aklayc notlar ekleyece
giz.
Pythonda yorumlar # i
sareti ile gsterilir. Yorumlarla desteklenmi
s rnek bir kod paras
s
yle olabilir:
#Bo
s bir liste olu
sturuyoruz. Bu liste
#kullancnn girdi
gi verileri tutacak
liste = []
#
Simdi kullancya adn soruyoruz...
ad = input("Ltfen adnz giriniz: ")
#Kullancdan ald
gmz veriyi listeye ekliyoruz.
liste.append(ad)
"Tebrikler.")
Buradaki \b i
sareti henz
grenmedi
gimiz bir ka
s dizisidir (escape sequence). Bu konuyu
birka blm sonra grece
giz.
Peki ya kullancnn girdi
gi kelimeyi trnak iine almak isterseniz ne yapacaksnz? I
ste bunu
yapmanz yukardaki yntemle imkanszdr.
Bu tr i
slemleri yapabilmek iin karakter dizilerinin format() adl metodunu devreye sokaca
gz. Yukardaki uygulamay temel alarak basit bir rnek verelim:
>>> lider = input("
Sampiyonun ismini giriniz: ")
>>> print("Bu senenin
sampiyonu {0}. Tebrikler.".format(lider))
Grd
gnz gibi, format() metodunun, daha nce
grendi
gimiz herhangi bir metottan
fark yok... rne
gin listeleri anlatrken liste metotlarndan da bahsetmi
stik. Liste metotlar liste.metot() s
eklinde kullanlyordu. format() metodu da byledir. Bu da karakter_dizisi.format() s
eklinde kullanlr.
Burada {0} s
eklinde gsterdi
gimiz ifade, format() metodunun parantezi iinde yer alan
istihza adl karakter dizisinin yerini tutuyor. Parantez iine ne yazarsanz, {0} ifadesinin
yerinde o grnecektir:
Grd
gnz gibi, al
sk oldu
gumuz s
ekilde saymaya sfrdan ba
slyoruz... (1980, Mays)
demetinin 0. ve 1.
gelerini karakter dizisi iine tek tek yerle
stiriyoruz. Burada nemli nokta
s
u: Karakter dizisi iinde belirledi
gimiz biimlendirme i
saretlerinin says kadar
geyi parantez
iindeki demete yazyoruz.
Bu arada, biimlendirme i
saretlerinin say srasna gre yazlmas s
art de
gil. Yani s
yle bir s
ey
de yapabiliriz:
>>> print("Yllardan {1}, aylardan {0}".format(1980, "Mays"))
Tabii bu s
ekilde elde etti
gimiz ktdaki
gelerin yeri de farkl olacaktr...
Yllardan Mays, aylardan 1980
En ba
staki rne
gimize geri dnelim:
>>> lider = input("
Sampiyonun ismini giriniz: ")
>>>print("Bu senenin
sampiyonu", lider, "Tebrikler.")
Burada lider de
gi
skenini karakter dizisi iinde mesela trnak iine alamyoruz... Ama artk
format() adl metodu bildi
gimize gre bu i
slemi yapmak bizim iin ocuk oyunca
g:
>>> lider = input("
Sampiyonun ismini giriniz: ")
>>> print("Bu senenin
sampiyonu {0}. Tebrikler.".format(lider))
Grd
gnz gibi, karakter biimlendirme i
saretleri bize epey esneklik kazandryor.
Bu metoda al
smak iin ok basit bir rnek daha verelim:
>>> print("{0}; {1} ve {2}i
seviyor!".format("Ali", "Ay
se", "Zeynep"))
Ali; Ay
se ve Zeynepi seviyor!
Grd
gnz gibi, format() metodu istedi
gimiz sayda
ge alabiliyor.
Biimleyici olarak sadece saylardan yararlanmak zorunda da de
giliz. E
ger istersek say yerine
daha anlaml kelimeler de kullanabiliriz:
>>> lider = input("
Sampiyonun ismini giriniz: ")
>>> ikinci = input("
Ikinci olan takmn ismini giriniz: ")
>>> print("
Sampiyon {bir}. {iki} ikinci oldu...".format(bir=lider, iki=ikinci))
Burada biimlendirme i
saretleri olarak bir ve iki de
gi
skenlerini kulland
gmza dikkat edin.
Daha sonra da format() metodunun parantezleri iinde bu bir ve iki adl de
gi
skenleri
tanmlyoruz...
S
yle bir rnek verelim:
>>> a = 10
>>> b = 3
>>> print("{0} ile {1} blnrse {2} elde edilir.".format(a, b, a/b))
10 ile 3 blnrse 3.33333333333 elde edilir.
Burada istersek . i
saretinden sonra gelen basamak saysn keyfimize gre ayarlayabiliriz:
E
ger noktadan sonra herhangi bir say olmasn istemezsek s
u kodlar kullanyoruz:
>>> print("{0} ile {1} blnrse {2:.0f} elde edilir.".format(a, b, a/b))
10 ile 3 blnrse 3 elde edilir.
Grd
gnz gibi, enumerate() fonksiyonunu do
grudan kulland
gmzda bize bir numaralandrma nesnesi (enumerate object) veriyor.
Bu nesnenin ieri
gini grmek iin list() fonksiyonunu kullanabiliriz. Hatrlarsanz range()
fonksiyonu iin de list()ten yararlanm
stk...
>>> list(enumerate("istihza"))
[(0, i), (1, s), (2, t), (3, i), (4, h), (5, z), (6, a)]
S
imdi bu kty dikkatle inceleyelim. Burada bir liste iinde her biri bir say ve harften olu
san,
iki
geli demetler gryoruz. Bu tabloyu daha net grebilmek iin for dnglerinden yararlanabiliriz:
>>>
...
...
(0,
(1,
(2,
(3,
(4,
(5,
(6,
for i in enumerate("istihza"):
print(i)
i)
s)
t)
i)
h)
z)
a)
Grd
gnz gibi, bir say ve bir harften olu
san iftler elde ediyoruz. Al
strma olsun diye,
enumerate() fonksiyonunu liste reteleri (list comprehensions) ile birlikte kullanalm:
>>> [i for i in enumerate("istihza")]
[(0, i), (1, s), (2, t), (3, i), (4, h), (5, z), (6, a)]
Hatta ve hatta artk format() gibi olduka esnek bir metodu da biliyor oldu
gumuza gre daha
karma
sk s
eyler de yapabiliriz:
>>> for i in enumerate("istihza"):
...
print("{0} : {1}".format(i[0], i[1]))
...
0 :
1 :
2 :
3 :
4 :
5 :
6 :
i
s
t
i
h
z
a
for k, v in enumerate("python"):
print("{0} : {1}".format(k, v))
p
y
t
h
o
n
Burada for k, v... satrndaki k harfi enumerate() fonksiyonu tarafndan retilen iki
geli
demetin birinci
gesini, v harfi ise o demetin ikinci
gesini temsil ediyor. Yani k sayy, v
ise harfi temsil ediyor... Daha sonra print() fonksiyonuyla
geleri ekrana yazdrrken de bu
harflerden yararlanyoruz...
Daha nce veri tiplerini anlatrken sk sk kulland
gmz bir kod parasn temel alarak
enumerate() ile ilgili bir rnek daha yapalm.
Hatrlarsanz len() fonksiyonunu anlatrken s
yle bir rnek vermi
stik:
>>> liste = ["kitap", "defter", "kalem", "silgi", "tebe
sir",
... "tahta", "sra", "
grenci", "okul", "nlk"]
>>> for sondarbe in range(len(liste)):
...
print(sondarbe+1, liste[sondarbe], sep=". ")
...
1. kitap
2. defter
3. kalem
4. silgi
5. tebe
sir
6. tahta
7. sra
8.
grenci
9. okul
10.nlk
2.
3.
4.
5.
6.
7.
8.
9.
kalem
silgi
tebe
sir
tahta
sra
grenci
okul
nlk
Yalnz, grd
gnz gibi burada bir eksiklik var. Listemizdeki saylar 0dan ba
slyor. Halbuki biz
saymaya 1den ba
slanmasn istiyoruz. enumerate() fonksiyonunu kullanarak bunu yapmak
ok basittir:
>>> for k, v in enumerate(liste, 1):
...
print(k, v, sep=". ")
...
1. kitap
2. defter
3. kalem
4. silgi
5. tebe
sir
6. tahta
7. sra
8.
grenci
9. okul
10. nlk
Grd
gnz gibi, enumerate() fonksiyonuna ikinci parametre olarak verdi
gimiz say, ilk
Bu kodlarla dict adl veri tipinin btn metotlarn numaralandrarak ekrana basyoruz...
9.13 Ka
s Dizileri (Escape Sequences)
Hatrlarsanz ilk derslerimizin birinde s
yle bir rnek vermi
stik:
>>> print("Ahmet, \"Bugn Adanaya gidiyoruz,\" dedi.")
O derste, buradaki \ i
saretinin bir ka
s dizisi oldu
gundan sz etmi
stik. Bu i
saret, karakter
dizisini ba
slatan ift trnak ile, cmle iinde geen ift trnaklarn birbirine kar
smasn engelliyordu. Ayn s
ekilde, yeni bir satra gememizi sa
glayan \n i
saretinin de bir ka
s dizisi
oldu
gunu sylemi
stik. Pythonda bol miktarda ka
s dizisi bulunur ve bunlarn her biri birbirinden farkl grevleri yerine getirir.
Pythonda temel olarak iki adet ka
s dizisi vardr: r ve \. Bu blmde bu ka
s dizilerini ve
bunlarn varyasyonlarn tek tek inceleyece
giz:
\
Bu i
saret hemen hemen btn programlama dillerinin demirba
sdr. Bunun dz bl de
gil ters
bl oldu
guna zellikle dikkat etmeliyiz...
Bu i
saretin ne i
se yarad
gn daha nceki derslerimizde grm
stk. Yukarya da ald
gmz
rne
ge bakt
gmzda bu i
saretin grevi aka ortaya kyor. \ i
sareti kendisinden sonra
gelen herhangi bir karakterin zel bir anlam oldu
gunu gsterir. Mesela s
u rne
ge bakalm:
>>> print("Kezban, \"Nen var kuzum,\" dedi.")
Burada \ i
sareti, kendisinden sonra gelen ift trnak karakterinin zel bir anlam oldu
gunu belirtiyor. Yani bu ift trna
gn, karakter dizisini ba
slatan ve bitiren ift trnaklardan farkl oldu
gunu
gsteriyor. Ayn i
sareti teki zel ift trna
gn da nne yerle
stirdi
gimizde yukardaki karakter
dizisini hatasz olarak ekrana yazdrabiliyoruz.
Mesela bu ka
s dizisi n harfinden nce gelirse, bu harfin de zel bir anlam oldu
gunu belirtecektir. \n adl ka
s dizisi yeni satra geilmesini sa
glar:
>>> print("Bu birinci satr.\nBu da ikinci satr...")
Bu birinci satr.
Bu da ikinci satr...
Pythondaki ka
s dizileri genel olarak \ i
saretinin ba
ska harflerle birle
serek zel bir anlam
olu
sturmasyla meydana getirilir. S
imdi bu \ i
saretinin yanna gelip zel bir anlam kazanan
harfleri ve bu s
ekilde ortaya kan ka
s dizilerini inceleyelim...
\t
E
ger \ i
saretini t harfinden nce getirirsek, ortaya kan i
saret (\t), karakter dizisi iinde
bir sekme (tab) olu
sturacaktr:
>>> print("Aramzda \tda
glar var...")
Aramzda
da
glar var...
E
ger daha byk bir sekmeye ihtiyacnz varsa, \t ka
s dizisini birden fazla sayda kullanabilirsiniz:
>>> print("Uzak... \t\tok uzak...")
Uzak...
ok uzak...
Grd
gnz gibi \t adl ka
s dizisi bizi bo
sluk tu
suna st ste birka kez basmaktan kurtaryor. Karakter dizimiz iinde sekmeye ihtiyacmz oldu
gunda bu ka
s dizisi epey i
simize
yarayacak.
S
imdi ba
ska bir ka
s dizisine bakalm.
\\
S
imdiye kadar
grendi
gimiz gibi, \, \t ve \n i
saretlerini bir karakter dizisi iinde kulland
gmzda her biri zel bir grevi yerine getiriyor. Peki ya biz yazd
gmz bir karakter dizisi
iinde bu i
saretleri gstermek istersek ne yapaca
gz? Mesela \n ifadesinin kendisini bir karakter dizisi iine yazp kullanclarmza gsteremez miyiz?
Elbette gsterebiliriz. E
ger yazd
gmz bir karakter dizisi iinde bu ka
s dizilerinin kendisini
gstermek istersek s
yle bir yol tutuyoruz:
>>> print("
grendi
gimiz karakter dizileri
sunlardr: \\n, \\t")
grendi
gimiz karakter dizileri
sunlardr: \n, \t
Grd
gnz gibi, \t, \n veya \ ka
s dizisinin kendisini ekrana basabilmek iin \ i
saretini
iftleyerek \\ s
eklinde yazmamz gerekiyor...
E
ger sadece \ i
saretini gstermek istersek baz noktalara dikkat etmemiz gerekiyor.
Mesela s
u rne
ge bakalm:
>>> print("demirba
s ka
s dizisi: \.")
demirba
s ka
s dizisi: \.
Grd
gnz gibi, e
ger \ i
saretini tek ba
sna kullanacaksak zel bir s
ey yapmamza gerek
yok. Yalnz burada s
una dikkat etmemiz gerek: \ i
saretini iftlemeden yazabilmemiz iin, bu
i
saretin sa
gna herhangi bir zel karakterin gelmemesi lazm. Bu ne demek? Hemen bir rnek
verelim:
>>> print("demirba
s ka
s dizisi: \")
SyntaxError: EOL while scanning string literal
Bu rnek Pythonun bize bir hata mesaj gstermesine neden oluyor... Bunun sebebi aslnda
\ i
saretinin bu rnekte tek ba
sna kullanlmyor olmas. Yani \ i
saretinden sonra karakter
dizisinin biti
s trna
g geliyor... Bildi
gimiz gibi, \ i
sareti ift veya tek trnak ile birlikte kullanlrsa, Python bu tek veya ift trna
g farkl bir s
ekilde alglayacaktr. Mesela bu rnekte,
kapan
s trna
gndan hemen nce gelen \ ka
s dizisi nedeniyle Python bu kapan
s trna
gn
sanki yokmu
s gibi varsayacak ve bize hata mesaj gsterecektir... Bunun olmasn engellemek
iin, \ i
saretini iftlememiz gerekiyor:
>>> print("demirba
s ka
s dizisi: \\")
demirbas ka
s dizisi: \
Bir de s
u rne
ge bakalm:
>>> print("
grendi
gimiz karakter dizileri
sunlardr: \, \\n, \\t")
Simdiye kadar
grendi
gimiz karakter dizileri
sunlardr: \, \n, \t
Burada \ ka
s dizisini iftlememize gerek kalmad
gna dikkat edin. nk bu i
saretten
hemen sonra gelen virgl i
sareti Python asndan zel anlam ta
syan bir karakter de
gildir.
Bu yzden yukardaki karakter dizisinin ekrana baslmasnda herhangi bir sorunla kar
sla
smyoruz. Ama \ i
saretini yukardaki rnekte en sona yerle
stiremeyece
gimize dikkat edin:
>>> print("
grendi
gimiz karakter dizileri
sunlardr: \\n, \\t, \")
SyntaxError: EOL while scanning string literal
>>> print("demirba
s ka
s dizisi: \ ")
demirba
s ka
s dizisi: \
Szn z, \ i
saretini tek ba
sna kulland
gmzda sa
gndaki karakterle ak
sma riski varsa,
zm olarak \ i
saretini iftleme yoluna gidiyoruz.
\v
E
ger \ i
saretini v harfiyle birlikte kullanrsak d
sey sekme denen s
eyi elde ederiz. Hemen
bir rnek verelim:
>>> print("d
sey\vsekme")
d
sey
sekme
Yalnz bu \v adl ka
s dizisi her i
sletim sisteminde al
smayabilir... Dolaysyla, birden fazla
platform zerinde al
smak zere tasarlad
gnz programlarnzda bu ka
s dizisini kullanmanz
nermem.
\b
\ ka
s dizisinin, biraraya geldi
ginde zel bir anlam kazand
g bir ba
ska harf de bdir... \b
ka
s dizisini karakter dizisi biimlendirme blmnde bir rnek iinde kullanm
stk. rne
gimiz
s
yleydi:
>>> lider = input("
Sampiyonun ismini giriniz: ")
>>> print("Bu senenin
sampiyonu", lider, "\b.",
"Tebrikler.")
Burada \b adl ka
s dizisi, kendisinden nceki bir karakteri silme grevini stleniyor. Bu
rnekte lider de
gi
skeni ekrana yazdrlrken kendisinden sonra bir adet bo
sluk karakteri olacaktr ktda... I
ste \b ka
s dizisi bu bo
sluk karakterini siliyor. \b ka
s dizisinin grevi
klavyedeki backspace tu
suyla ayndr...
\b ka
s dizisini bir rnekte daha grelim:
>>> print("merhaba\b")
Burada \b ka
s dizisinden sonra bo
sluk karakteri var. Bu yzden bu ka
s dizisi byle bir
ortamda grevini yerine getirebiliyor. E
ger sadece print(merhaba) yazp merhab ktsn
elde etmek isterseniz s
yle bir hileye ba
svurabilirsiniz:
>>> print("merhaba\b ")
merhab
Burada grd
gnz gibi, \b ka
s dizisinden sonra bir bo
sluk brakarak kandrmaca yoluna
gittik...
Bu ka
s dizisini art arda yazarak tuhaf s
eyler de yapabilirsiniz...
>>> print("merhaba\b\b ")
merha a
Burada \b\b ka
s dizilerinin yapt
g s
ey, sola do
gru iki karakter atlayp, ula
st
g noktaya bir
adet bo
sluk karakteri yerle
stirmektir. S
u rnekte durum biraz daha ak grnecektir:
>>> print("merhaba\b\bf")
merhafa
Bu kodlar s
yle yazarak biraz beyin jimnasti
gi yapmak isteyebilirsiniz:
>>> print("merhaba{0}{1}".format("\b"*len(merhaba), "glegle"))
glegle
Grd
gnz gibi, bu karakter dizisi rahatlkla suyu karlabilecek bir aratr...
\r
\ i
saretini birarada kullanaca
gmz ba
ska bir harfimiz ise r harfidir...
\r ka
s dizisi, bir karakter dizisinin en ba
sna gelmemizi sa
glar. Mesela bu karakter dizisini
kullanarak tank kelimesini banka evirebiliriz!
>>> print("tank\rb")
bank
\a
\ ka
s dizisini son olarak a harfi ile birlikte kullanaca
gz. \a ka
s dizisi bilgisayarmzn
bip sesi karmasn sa
glar:
>>> print("\a")
==bip!==
Tpk \v ka
s dizisi gibi, bu ka
s dizisi de her i
sletim sisteminde al
smayabilir. rne
gin bu
ka
s dizisinin GNU/Linuxta al
saca
gnn garantisi yoktur...
r
Bu karakter dizisi kimi durumlarda olduka faydal olabilecek bir aratr. Diyelim ki bilgisayarmzda tam yolu C:\test\rehber.txt olan bir dosya var. Bu dosyann tam yolunu print()
fonksiyonu yardmyla ekrana yazdrmak istersek s
yle bir kt alrz:
>>> print("C:\test\rehber.txt")
ehber.txtst
Burada olan s
ey s
u: Python, C:\test\rehber.txt iindeki \t ve \r ifadelerini birer ka
s dizisi
olarak alglad. Dolaysyla C:den sonra sanki sekme tu
suna baslm
s gibi davrandktan sonra,
\r ka
s dizisi zannetti
gi s
eyin etkisiyle de karakter dizisinin ba
sna dnp ehber.txt ksmn
oraya yap
strd... Bu rnek, Pythondaki ka
s dizilerini kullanmasak bile onlar en azndan
tanmamz gerekti
gini ak seik gsteriyor. I
ste bu tr srprizleri engellemek iin r adl ka
s
dizisinden yararlanaca
gz. Bunun, daha nce grd
gmz \r ka
s dizisinden farkl oldu
guna
dikkat edin:
>>> print(r"C:\test\rehber.txt")
C:\test\rehber.txt
Grd
gnz gibi, r ka
s dizisinin kullanm yeri teki ka
s dizilerine gre farkllk gsteriyor.
Bu ka
s dizisini karakter dizisinin iinde de
gil, d
snda kullanyoruz. Bu ka
s dizisinin grevi,
karakter dizisi iinde geen btn ka
s dizilerini etkisiz hale getirmektir... Dolaysyla daha
nce verdi
gimiz s
u rne
gi:
>>> print("
grendi
gimiz karakter dizileri
sunlardr: \\n, \\t, \\")
...
syle de yazabiliriz...
>>> print(r"
grendi
gimiz karakter dizileri
sunlardr: \n, \t")
Burada kulland
gmz r ka
s dizisi, karakter dizisi iindeki btn ka
s dizilerini etkisiz hale
getirdi
gi iin, bizim cmle iinde geen karakter dizilerini iftlememize gerek kalmad.
Ancak r adl karakter dizisi \ ka
s dizisini etkisizle
stiremez. Dolaysyla s
yle bir yazm,
hata almamza yol aacaktr:
>>> print(r"
grendi
gimiz karakter dizileri
sunlardr: \n, \t, \\, \")
Bylece Pythondaki ka
s dizilerini gzden geirmi
s olduk. Gelin isterseniz ka
s dizilerine
s
yle topluca bir gz atalm:
\n Yeni satr olu
sturur.
\ Tek trnak iine ald
gmz karakter dizilerinde tek trnak kullanmamz sa
glar.
\ ift trnak iine ald
gmz karakter dizilerinde ift trnak kullanmamz sa
glar.
\a Sistemimizin bip sesi karmasn sa
glar (Her platformda al
smaz).
\b Kendisinden nce gelen karakteri siler.
\r Karakter dizisinin en ba
sna dnlmesini sa
glar.
\t Karakter dizisi iinde sekme olu
sturur.
\v D
sey sekme olu
sturur (Her platformda al
smaz).
\\ Herhangi bir ka
s dizisini etkisiz hale getirir.
r Karakter dizisi iinde geen btn ka
s dizilerini etkisiz hale getirir.
BLM
10
Fonksiyonlar
Bir nceki blmn tamamlanmasyla birlikte Pythonda Temel Bilgiler olarak adlandrabilece
gimiz konular bitirmi
s olduk. Bylelikle artk Python programlama dilini temel dzeyde
bildi
gimizi rahatlkla iddia edebiliriz...
Bu blmden itibaren Pythonun derinliklerine do
gru yolculu
gumuza ba
slayaca
gz. Bu yolculuktaki ilk dura
gmz Pythonda Fonksiyonlar olacak... Peki nedir bu fonksiyon denen s
ey?
En basit tanmyla fonksiyon, birbiriyle ili
skili deyimleri, kod paralarn bir araya toplamamz
sa
glayan bir kod blo
gudur. Pythondaki fonksiyonlar bize i
slerimizi otomatikle
stirme imkan
sa
glar. Fonksiyonlarn bu otomatikle
stirme i
sini nasl yerine getirdi
gini bu blmde inceleyece
giz. Bu blm bitirip fonksiyonlar konusunu
grendi
gimizde, Pythonda ileriye do
gru ok
nemli ve byk bir adm atm
s, deyim yerindeyse level atlam
s olaca
gz...
Aslnda fonksiyon bizim yabancs oldu
gumuz bir kavram de
gil. S
imdiye kadar Pythonda pek
ok fonksiyon grdk ve kullandk. rne
gin, print() komutunun bir fonksiyon oldu
gunu ta
en ba
sta sylemi
stik... Ayn s
ekilde, daha nceki derslerimizde grd
gmz ve i
slerimizi bir
hayli kolayla
strm
s olan range(), len(), round(), str(), int(), list(), dict(), tuple()
vb. de birer fonksiyondur. I
ste s
imdi biz de bu blmde buna benzer fonksiyonlar nasl olu
sturabilece
gimizi
grenece
giz... O halde isterseniz laf daha fazla uzatmadan i
se koyulalm...
169
Ba
ska bir grup sayy toplamak istedi
gimizde ise bu kodlar en ba
stan tekrar yazmak zorunda
kalacaktk:
>>> lst2 = [10, 20, 56, 55]
>>> a2 = 0
>>> for v in lst2:
...
a2 = a2 + v
... print(a2)
E
ger sum() fonksiyonu olmasayd, program iinde ne zaman bir grup sayy toplamak istesek yukardaki kodlar her defasnda yeni ba
stan yazmanz gerekecekti... Ama Pythonun
bize sundu
gu sum() fonksiyonu sayesinde bu i
slemlerin hibirini yapmak zorunda kalmyoruz.
Programmz iinde bir grup sayy toplamak istedi
gimizde sadece sum() fonksiyonunu a
grmamz yeterli oluyor. Yani bu fonksiyon bir anlamda i
slerimizi otomatik bir hale getirmemizi
sa
glyor...
sum() olduka faydal bir fonksiyondur. Bu fonksiyon sayesinde, bir kere yazlm
s bir kod
parasn farkl yerlerde ve programlarda tekrar tekrar kullanabiliyoruz. Zaten fonksiyonlarn
ana grevlerinden biri de, bir kere yazlm
s kodlarn tekrar tekrar kullanlabilmesini sa
glamaktr.
Yabanclar buna code reusability adn veriyor...
sum() fonksiyonu, bir grup sayy kolay bir s
ekilde toplamamz sa
glayan bir aratr. Ancak Pythonda tpk bu sum() fonksiyonuna benzer s
ekilde bir liste iindeki btn saylar
arpan, do
grudan kullanabilece
gimiz zel bir fonksiyon bulunmaz. Ama biz istersek fonksiyonlar yardmyla kendimiz iin byle bir fonksiyon yazabiliriz. S
imdi bunu nasl yapaca
gmza
bakalm. Hem bylece fonksiyonlar konusuna da hzl bir giri
s yapm
s olalm.
Pythonda bir fonksiyonu kullanabilmek iin ncelikle o fonksiyonu tanmlamamz gerekir. Bu
tanmlama i
sini def adl bir parack yardmyla yapyoruz. Pythonda bir fonksiyon s
yle tanmlanr (Bu kodlar dosyaya kaydedelim):
def fonksiyon_ad():
grendi
gimize gre yolumuza devam edebiliriz...
Bu arada, bu blmn en ba
snda rnek olarak verdi
gimiz toplama i
slemi yapan kodlar da bir
fonksiyon haline getirelim isterseniz:
def topla():
a = 0
for i in [2, 3, 4]:
a = a + i
print(a)
Yukarda tanmlad
gmz arp() ve topla() adl fonksiyonlar bir dosyaya kaydedip
al
strd
gmzda Python bize ilgili i
slemlerin sonucunu verecektir. Yani arp() fonksiyonu
2, 3 ve 4 saylarnn arpmn, topla() fonksiyonu ise 2, 3 ve 4 saylarnn
toplamn gsterecektir. Burada fonksiyonlarn i
simizi nasl da kolayla
strd
gna dikkat edin.
Yukarda tanmlad
gmz arp() fonksiyonu sayesinde, bir grup sayy arpmak istedi
gimiz zaman, btn kodlar her defasnda yeni ba
stan yazmak yerine sadece arp() fonksiyonunu
a
grmamz yeterli olacaktr...
Burada, bir nceki yazmdan farkl olarak herhangi bir say belirtmedik. Onun yerine liste adl
bir de
gi
sken olu
sturup bunu fonksiyona parametre olarak verdik... Bu sayede fonksiyonumuz
herhangi bir say listesinin ieri
gini arpabilecek. Bir deneme yapalm:
saylar = [24, 56, 77, 87]
arp(saylar)
Yazd
gmz kodlar tam olarak s
yle grnecek:
def arp(liste):
a = 1
for i in liste:
a = i * a
print(a)
saylar = [24, 56, 77, 87]
arp(saylar)
Grd
gnz gibi fonksiyonlar, yazd
gmz kodlar bir araya toplamamz, gruplandrmamz da
sa
glamann yansra, yapaca
gmz i
slemler iin bir s
ablon olu
sturma vazifesi de gryor. Pek
ok kez kullanmamz gereken i
slevleri bir s
ablon haline getirerek, bu s
ablon zerinden, benzer i
slemleri tek bir komutla halledebiliyoruz. Ilerleyen derslerimizde modller konusunu
grendi
gimizde bu fonksiyonlar ok daha verimli bir biimde kullanabilece
giz.
Fonksiyonlar, yazd
gmz programlarda i
slerimizi bir hayli kolayla
strr. Fonksiyonlar olmasayd
bir program iinde defalarca yazmak zorunda kalaca
gmz kodlar bir kez fonksiyon olarak
tanmladktan sonra program iinde tekrar tekrar kullanabiliriz. E
ger kodlarda bir de
gi
siklik
yapmamz gerekirse sadece fonksiyon iinde de
gi
siklik yapmamz yeterli olacaktr. br trl,
program iinde oraya buraya da
glm
s kod paralarn tek tek bulup dzeltmemiz gerekecekti...
zellikle arayz tasarlarken fonksiyonlardan bolca yararlanaca
gz...
Fonksiyonlarla ilgili ok basit bir rnek verelim. Diyelim ki bir program yazdk ve programn bir
yerinde kullancdan say girmesini istiyoruz. Bunun, programmzn hata vermesine yol ama
potansiyeli ta
syan bir i
slem oldu
gunu varsayalm. Programn al
smas srasnda bir hatayla
kar
sla
sld
gnda kullancya genel bir hata mesaj gstermek istersek s
yle bir kod yazabiliriz:
try:
soru = input("gerekli sayy giriniz: ")
except:
print("Beklenmeyen bir hata olu
stu.")
print("Bu hatay, hata takip sistemine raporlaynz!..")
Bu verdi
gimiz ok basit bir rnektir, ama bu basit rnekte bile, fonksiyonlarn i
simizi ne kadar
kolayla
strabilece
gini grebiliyoruz. Burada kulland
gmz fonksiyon ncelikle bizi ayn s
eyleri
tekrar tekrar yazma zahmetinden kurtaryor. genelHata() adl fonksiyonu bir kez tanmladktan sonra, gereken yerlerde sadece bu fonksiyonu a
grarak i
simizi halledebiliyoruz. Ayrca
e
ger kullancya gstermek istedi
gimiz hata mesajnda de
gi
siklik yapmak istersek, sadece
fonksiyon iinde gerekli de
gi
siklikleri yapmamz yeterli olacaktr. E
ger burada fonksiyon kullanmasaydk, hata mesajlarn kodlar iinde tek tek bulup de
gi
stirmemiz gerekecekti...
Bu blmde grd
gmz rneklerden de bildi
gimiz gibi, yazd
gmz fonksiyonlara parametre
atayarak bunlar daha da esnek bir hale getirebiliyoruz:
def genelHata(eposta):
print("Beklenmeyen bir hata olu
stu.")
print("Bu hatay, {0} adresine raporlaynz!".format(eposta))
try:
soru = int(input("gerekli sayy giriniz: "))
except:
genelHata("abc123@abc.com")
try:
soru2 = int(input("ba
ska bir say giriniz: "))
except:
genelHata("123fds@cbc.com")
Bu programn al
smas esnasnda e
ger ilk try... except... blo
gu iinde bir hata meydana
gelirse kullancya Bu hatay abc123@abc.com adresine raporlaynz! mesaj; e
ger hata ikinci try... except... blo
gu iinde meydana gelirse de Bu hatay 123fds@cbc.com adresine
raporlaynz! mesaj gsterilecektir.
Bu arada dikkat ederseniz, genelHata() adl fonksiyondaki eposta parametresi aslnda bir
yer tutucu olmaktan te bir anlam ifade etmiyor. Yani oraya istedi
giniz bir kelimeyi yazabilirsiniz. Amacmz oraya bir parametre gelece
gini belirtmek. Tabii ki parametrelerimizi adlandrrken anlaml isimler yazmamz her zaman iin i
simizi kolayla
stracaktr... Bu parametre
meselesini bir sonraki blmde biraz daha ayrntl olacak inceleyece
giz.
Bu blmn son sz olarak fonksiyonlarn adlandrlmas konusunda birka s
ey syleyelim...
Fonksiyon adlarn kk harflerle yazmak adettendir. Yani:
def fonk():
Burada grld
g gibi, fonksiyon adlarn yazarken kk harfleri kullanyoruz. E
ger yazaca
gmz fonksiyonun ad birden fazla kelimeden olu
suyorsa, fonksiyon adn olu
sturan kelimeleri birbirinden _ i
sareti ile ayryoruz. Yani:
def fonksiyon_ad():
S
u rnekte ise 50 bir argmandr:
fonk(50)
de
gerlere ise argman ad veriliyor. Dolaysyla yukardaki fonksiyon hakknda s
yle bir
cmle kurabiliriz:
fonk adl fonksiyonun x parametresine argman olarak 50 de
gerini verdik...
Ancak parametre ile argman arasndaki bu farkllk o
gu zaman gzard edilir ve bu iki
kavram o
gunlukla birbiriyle e
s anlaml olarak kullanlr.
Dedi
gimiz gibi, bir nceki blmde parametreleri temel olarak nasl kullanabilece
gimizi
grenmi
stik. Bu blmde ise parametre kavramna biraz daha ayrntl olarak bakmaya al
saca
gz.
nce s
u ok basit fonksiyona bir bakalm:
def bas(kelime):
print("merhaba", kelime)
Burada bas() adl bir fonksiyon tanmladk. Bu fonksiyon tek bir parametre alyor. Fonksiyonumuzda bu parametreyi bir karakter dizisi iinde kullanyoruz. Bu fonksiyonu al
strd
gmzda,
bas() fonksiyonuna argman olarak verdi
gimiz kelime merhaba karakter dizisi ile birlikte
ekrana baslacaktr. Mesela bu fonksiyonu istihza argmanyla a
gralm:
bas("istihza")
Kodlarmz s
yle grnecek:
def bas(kelime):
print("merhaba", kelime)
bas("istihza")
Grd
gnz gibi, bas() fonksiyonuna verdi
gimiz istihza argman merhaba karakter dizisi
ile birlikte ekrana baslyor. Kodlarmz biraz geli
stirelim:
def bas(kelime):
print("merhaba", kelime)
soru = input("adnz nedir? ")
bas(soru)
E
ger bas() fonksiyonunu bu s
ekilde argmansz olarak yazp al
strrsak a
sa
gdakine benzer
bir hata alrz:
TypeError: bas() takes exactly 1 positional argument (0 given)
Bu hata mesaj s
yle evrilebilir: TipHatas: bas() tam tamna 1 adet sral argman alr (0
verilmi
s)
Demek ki bas() fonksiyonunu al
strabilmek iin 1 adet argman girmemiz gerekiyormu
s...
Ne bir eksik, ne bir fazla... Bu arada hata mesaj iinde geen sral argman (positional
argument) kavramndan da biraz sonra bahsedece
giz.
Fonksiyonlara istedi
gimiz sayda parametre verebiliriz. Ancak parametrelerimizi makul
sayda tutmak, fonksiyonun hangi parametrelere ihtiya duydu
gunu hatrlayabilmek asndan
nemlidir:
def deneme(bir, iki, liste, lt):
sonu = bir * iki
if bir and iki != lt:
liste.append(sonu)
else:
print("{0} ile arpmaya izin vermiyoruz!".format(lt))
print(liste)
Grd
gnz gibi, fonksiyonlara birden fazla parametre verebiliyoruz... Burada tanmlad
gmz
fonksiyon, bir, iki, liste ve lt olmak zere drt adet parametre alyor. Yani bu
fonksiyonu kullanabilmek iin fonksiyonumuzu drt adet argman ile a
grmamz gerekiyor.
Fonksiyonumuzun ieri
gine bakt
gmz zaman ilk olarak s
u satr gryoruz:
sonu = bir * iki
Buna gre, deneme() adl fonksiyondaki bir ve iki adl parametreler birbiriyle arplp
sonu adl de
gi
skeni olu
sturacak. Ardndan gelen satrda bir if... else... blo
gu gryoruz. E
ger bir ve iki parametrelerinin de
geri lt parametresinin de
gerine e
sit de
gilse,
bir nceki satrda belirledi
gimiz sonu adl de
gi
skenin de
gerini liste parametresine ekliyoruz. Burada and adl bool de
gerinin anlamna dikkat edin. sonu adl de
gi
skenin listeye
eklenebilmesi iin hem bir de
gerinin, hem de iki de
gerinin lte e
s olmamas gerekiyor.
Daha sonra else blo
gunu tanmlyoruz. Buna gre e
ger bir ve iki parametrelerinden herhangi birinin de
geri lte e
sitse, kullancya lt ile arpmaya izin vermiyoruz! s
eklinde
bir uyar gsteriyoruz. Son satrda ise liste adl parametrenin de
gerini ekrana basyoruz...
S
imdi sra geldi fonksiyonumuzu a
grmaya:
geler = []
deneme(23, 5,
geler, 4)
geler = []
deneme(23, 5,
geler, 4)
Burada ncelikle
geler adl bo
s bir liste olu
sturduk. nk deneme() fonksiyonunun
parametrelerinden birisi liste olmak zorunda... Ardndan da deneme() fonksiyonunu a
gryoruz. Fonksiyonumuzu drt adet argman ile a
grd
gmza dikkat edin. E
ger argman says
drtten az veya fazla olursa programmz hata verecektir.
Bu kodlar al
strd
gmzda ekrana, fonksiyon iinde belirtti
gimiz listenin
geleri baslacaktr.
Fonksiyonumuzu bir de s
u argmanlarla a
gralm:
def deneme(bir, iki, liste, lt):
sonu = bir * iki
if bir and iki != lt:
liste.append(sonu)
else:
print("{0} ile arpmaya izin vermiyoruz!".format(lt))
print(liste)
geler = []
deneme(23, 5,
geler, 5)
Bu defa s
yle bir kt alyoruz:
5 ile arpmaya izin vermiyoruz!
[]
Bu fonksiyonu s
u argmanlarla a
gralm:
bl(10, 2)
Bu program al
strd
gmzda s
u sonucu alrz:
5.0
Grd
gnz gibi, sonu iinde ondalk ksm da grnyor... E
ger tamsay s
eklinde bir sonu
elde etmek istersek fonksiyonumuzu s
yle a
graca
gz:
bl(10, 2, False)
Bu s
ekilde s
yle bir sonu alrz:
5
Fonksiyonumuza bakt
gmz zaman, bl() fonksiyonunun adet parametre ald
gn gryoruz. Ama sonuncu parametreye varsaylan bir de
ger atad
gmz iin, fonksiyonumuzu kullanrken sadece iki argman vermemiz yeterli olacaktr. E
ger nc parametreyi belirtmezsek, bu parametrenin de
geri True varsaylacaktr...
Bu arada, yukardaki fonksiyonu s
u s
ekilde tanmlayabilece
gimizi de biliyoruz:
def bl(bir, iki, kip=True):
sonu = bir / iki
if kip:
print(sonu)
if not kip:
print(int(sonu))
// ve / i
slelerinin farkn daha nceki derslerimizde grm
stk. // i
slecini kullanarak
blme i
slemi yapt
gmzda elde etti
gimiz sonu bir tamsay oluyor. Yani blme i
sleminin sonucu
ondalk ksm iermeyecek s
ekilde veriliyor...
Varsaylan de
gerli fonksiyonlar tanmlarken dikkat etmemiz gereken nemli bir kural var. Bu
tr fonksiyonlarda varsaylan de
gerin, parametre sralamasnda en sonda gelmesi gerekiyor.
Yani s
yle bir s
ey yazamayz:
def bl(kip = True, bir, iki):
E
ger varsaylan de
gerli argman en sona de
gil de ba
sa veya ortaya alrsak Python bize s
yle
bir hata verir:
SyntaxError: non-default argument follows default argument
Yani:
SzdizimiHatas: varsaylan de
gersiz argman, varsaylan de
gerli argmandan sonra geliyor
I
ste bu dersimizde bu sral argman (positional argument) ifadesinin neye kar
slk geldi
gini
grenece
giz.
Esasnda s
imdiye kadar verdi
giniz fonksiyon rneklerinde o
gunlukla sral argmanlardan
yararlandk. Sral argmanlar, bir fonksiyon iinde, bulundu
gu konuma, yani srasna gre
belirtilen argmanlardr. Bu ne demek oluyor? Daha nce yapt
gmz s
u rne
ge bakalm:
def deneme(bir, iki, liste, lt):
sonu = bir * iki
if bir and iki != lt:
liste.append(sonu)
else:
print("{0} ile arpmaya izin vermiyoruz!".format(lt))
print(liste)
geler = []
deneme(23, 5,
geler, 4)
geler = []
deneme(lt=23, bir=5, liste=
geler, iki=4)
Grd
gnz gibi, argmanlar isimleriyle a
grarak, yani isimli argmanlar kullanarak
kendimizi argmanlarn srasn ezberleme zahmetinden kurtarm
s oluyoruz...
Burada da kulland
gmz isimli argmanlar isimsiz argmanlardan sonra getirmeye dikkat ediyoruz. Aksi halde Python bize bir hata mesaj gsterecektir. Dolaysyla yukardaki fonksiyonu
a
sa
gdaki s
ekilde a
grmamz mmkn de
gildir:
deneme(lt=23, bir=5, liste=
geler, 4)
Buradaki sorun, isimli argmanlar olan lt, bir ve listenin; isimsiz bir argman olan 4ten
nce gelmesidir... Byle bir durumda programmz hata verecektir.
Ayn s
ekilde, yukarda tanmlad
gmz arp() fonksiyonunu da s
yle kullanyoruz:
li = [2, 3, 4]
arp(li)
...veya...
arp(2, 3, 4)
Bu fonksiyonlar yukardaki s
ekilde a
grmay denedi
gimizde Python bize hata mesaj gsterecektir.
arp() fonksiyonu s
yle bir hata verir:
TypeError: arp() takes exactly 1 positional argument (3 given)
Yani:
TipHatas: arp() tam tamna 1 adet sral argman alr (3 adet verilmi
s)
Yani:
TipHatas: sum en fazla 2 argman almay beklerken 3 argman alm
s
Grd
gnz gibi, ne sum() ne de arp() fonksiyonu kendilerine verilen 2, 3 ve 4 saylar
zerinde i
slem yapabiliyor. Biz burada sum() fonksiyonuna mdahale edemeyiz, ama istersek
arp() fonksiyonuna byle bir yetenek kazandrabiliriz.
ncelikle s
u basit fonksiyonu inceleyelim:
def bas(isim):
print("merhaba", isim)
E
ger tanmlad
gmz bu fonksiyonu Frat parametresiyle al
strrsak s
yle bir sonu alrz:
bas("Frat")
merhaba Frat
Grd
gnz gibi, birden fazla sayy birbiriyle arpabilmek iin bunlar nce bir liste haline
getirmemiz gerekiyor (demet haline de getirebiliriz...). arp(2, 3, 4) gibi bir s
ey yazd
gmzda
hata alaca
gmz biliyoruz. I
ste s
imdi bu engeli nasl a
saca
gmz grece
giz. Dikkatlice bakn:
def arp(*saylar):
a = 1
for i in saylar:
a = a * i
print(a)
arp(2, 3, 4)
Burada tek fark, parantez iindeki saylar parametresinin solundaki ufack bir * i
saretinden
ibaret. Bu yldz i
sareti, fonksiyonumuzun alabilece
gi kadar parametreyi alabilmesini sa
glar.
Hatta bu i
saret, fonksiyonumuzu parametresiz olarak da a
grmamza olanak tanr. Bu arada
ek bilgi olarak, bir fonksiyonun en fazla 255 parametre alabilece
gini syleyelim...
Yldz i
sareti, fonksiyona argman olarak verilen btn de
gerlerin bir demet haline getirilmesini
sa
glar. Bunu s
u s
ekilde teyit edebiliriz:
def arp(*saylar):
print(saylar)
arp(2, 3, 4)
Bu kodlar al
strd
gmzda s
yle bir kt elde ederiz:
(2, 3, 4)
ktdaki parantez i
saretlerinden de anlad
gmz gibi, bu fonksiyon bize bir demet veriyor...
Aslnda burada olan s
ey, basit bir demetleme (tuple packing) i
sleminden ibarettir. Yazd
gmz
fonksiyonlarda * i
saretini kulland
gmz zaman, Python fonksiyona argman olarak verilen
Yukardaki fonksiyon bir adet sral argman ve rastgele sayda isimsiz argman alyor. Bu
arada, isimsiz argman sz kafanz kar
strmasn. Aslnda isimsiz argman dedi
gimiz s
ey
sral argmann ta kendisidir... Ancak yldzl yaplarda sra sz konusu olmad
g iin, bu
argmanlar sral argman yerine isimsiz argman (non-keyword argument) olarak adlandryoruz. E
ger istersek yukardaki test fonksiyonunu s
yle de yazabiliriz:
def test(arg, *arglar):
print("Bu fonksiyondaki sral argmanmz
sudur: ", arg)
for i in arglar:
print("Bu fonksiyondaki isimsiz argmanlardan biri
sudur: ", i)
test("bir", "iki", "", "drt", "be
s")
Bu yldz i
saretini yukarda gsterdi
gimiz s
ekilde fonksiyonun tanmland
g srada kullanabilece
gimiz gibi, fonksiyonu a
grma a
samasnda da kullanabiliriz. Yani s
yle bir s
ey yazabiliriz:
def test(arg, *arglar):
print("Bu fonksiyondaki sral argmanmz
sudur: ", arg)
for i in arglar:
print("Bu fonksiyondaki isimsiz argmanlardan biri
sudur: ", i)
li = ["bir", "iki", "", "drt", "be
s"]
test(*li)
Tanmlad
gmz bu fonksiyonu s
u s
ekilde a
grabiliriz:
topla(bir=3, iki=5)
Bildi
giniz gibi, isimli argmanlar kullanmak, fonksiyon parametrelerini istedi
gimiz bir srada
kullanmamza olanak veriyor. Yani yukardaki topla() adl fonksiyonu s
u s
ekilde de a
grabiliyoruz:
topla(iki=5, bir=3)
Isimli argmanlar bizi parametre srasn ezberleme zahmetinden kurtaryor. Ama elbette istersek biz yukardaki fonksiyonu s
u s
ekilde de a
grabiliriz:
topla(3, 5)
Bu fonksiyonu bu s
ekilde a
grd
gmzda, bir ve iki adl parametreleri sral argman olarak
kullanm
s olduk. Dolaysyla, topla() fonksiyonuna verdi
gimiz 3 argman bir parametresinin; 5 argman ise iki adl parametrenin yerini tutmu
s oldu... Gelelim yldz i
saretinin
burada anlatt
gmz durumla ne ilgisi oldu
guna...
Grd
gnz gibi, tanmlad
gmz fonksiyonlarn parametrelerini hem isimli hem de sral argman olarak kullanabiliyoruz. Ancak baz durumlarda, kullancnn sadece isimli argmanlar
kullanmasna izin vermek istiyor olabiliriz... Mesela yukardaki rnekte s
yle bir kullanma
msaade etmek istemiyor olabiliriz:
topla(3, 5)
Kodlarmz bu s
ekilde yazd
gmzda, yldz i
saretinin sa
gnda kalan btn parametrelerin,
fonksiyonun a
grlmas esnasnda isimli argman olarak kullanlmalar gerekir. Dolaysyla
yukardaki topla() fonksiyonunu ancak s
u s
ekilde kullanabiliriz:
topla(bir=4, iki=6)
Yani sadece s
yle bir yazm bizi hsrana u
gratacaktr:
topla(4, 6)
TypeError: topla() takes exactly 0 positional arguments (2 given)
Burada ald
gmz hata mesaj bize s
yle diyor:
TipHatas: topla() tam tamna 0 adet sral argman alr (2 adet verilmi
s)
Grd
gnz gibi, topla() fonksiyonunu kullanabilmek iin mutlaka isimli argmanlar kullanmamz gerekiyor. Parametrelerin en ba
sna yerle
stirdi
gimiz * i
sareti sayesinde, bu i
saretin
sa
gnda kalan hi bir parametreyi isimsiz olarak kullanamyoruz...
Bu arada, hatrlarsanz, bu blmn en ba
snda s
yle bir fonksiyon yazm
stk:
def arp(*saylar):
a = 1
for i in saylar:
a = a * i
print(a)
arp(2, 3, 4)
Grd
gnz gibi, fonksiyonumuz 2, 3 ve 4 saylarn birbirleriyle arpmak yerine bu saylar
ekrana bast... Ama bizim istedi
gimiz s
ey bu de
gil. Burada yle bir kod yazalm ki, kullanc
argmanlar liste halinde de verse, tek tek de yazsa, arp() fonksiyonumuz btn saylar
birbiriyle arpabilsin...
def arp(*saylar):
a = 1
try:
for k in saylar[0]:
a = a * k
print(a)
except TypeError:
for v in saylar:
a = a * v
print(a)
Artk arp() fonksiyonuna argman olarak ister liste verelim, ister tek tek
ge yazalm,
fonksiyonumuz btn
geleri ba
saryla arpacak ve sonucu ekrana basacaktr... Yukardaki
kodlarda neler olup bitti
gini anlayabilmek iin isterseniz bu kodlar biraz daha yakndan inceleyelim. ncelikle saylar adl parametrenin ne kt verdi
gini kontrol edelim:
def arp(*saylar):
print(saylar)
S
imdi bu fonksiyonu bir liste ile a
gralm:
li = [2, 3, 4]
arp(li)
Buradan s
u kty alyoruz:
([2, 3, 4],)
Grd
gnz gibi, ktmz tek
geli bir demet... Bu demetin mevcut tek
gesi de bir liste... Bu
listenin
gelerine eri
smek iin fonksiyonumuzu s
yle yazmamz gerekiyor:
def arp(*saylar):
for k in saylar[0]:
print(k)
S
imdi fonksiyonumuzu a
gryoruz:
li = [2, 3, 4]
arp(li)
2
3
4
Grd
gnz gibi, bu s
ekilde listenin btn
gelerini tek tek aldk... Tek tek ald
gmz bu
geleri
birbirleriyle arpmak iin s
yle bir s
ey yazmamz gerekti
gini biliyoruz:
def arp(*saylar):
a = 1
for k in saylar[0]:
a = a * k
print(a)
li = [2, 3, 4]
arp(li)
Kodlarmz bu s
ekilde yazd
gmzda, e
ger arp() fonksiyonuna argman olarak bir liste
verirsek fonksiyonumuz sorunsuz bir s
ekilde al
sacaktr. Ama e
ger argman olarak tek tek
saylar yazarsak Python bize bir hata mesaj gsterecektir:
arp(2, 3, 4)
TypeError: int object is not iterable
Burada ncelikle defter adl bir szlk tanmladk. Adres bilgilerini bu szlk iine kaydece
giz. Daha sonra bu defter adl szlk iinde yer alacak alanlar belirliyoruz. Yazd
gmz
kodlara gre defter adl szlk iinde isim, soyisim ve telefon olmak zere farkl alan
bulunacak. Fonksiyon parametresi olarak belirledi
gimiz isim, soyisim ve telefon
gelerine kar
slk gelen de
gerler, defter adl szlkteki ilgili alanlara yerle
stirilecek.
Daha sonra gelen satrda s
yle bir kod gryoruz:
for k, v in defter.items():
print("{0}\t:\t{1}".format(k, v))
Grd
gnz gibi, yukardaki kod bize defter adl szl
gn anahtar ve de
ger iflerini ieren
birer demet veriyor. for k, v in defter.items() satr ile bu demetlerdeki
gelere tek tek
eri
sebiliyoruz. Burada k harfi, demetlerin ilk
gelerini, v harfi ise ikinci
gelerini temsil
ediyor. Alt satrdaki print({0}t:t{1}.format(k, v)) kodu yardmyla yapt
gmz s
ey, k ve
v ile temsil edilen
geleri biraz biimlendirerek ekrana basmaktan ibaret... Bu satr iinde
grd
gmz \t harflerinin ne i
se yarad
gn biliyoruz. Bunlar karakter dizileri iine sekme
(tab) eklemek iin kullanlan ka
s dizileridir.
Bu fonksiyona gre, isim, soyisim ve telefon alanlarn doldurarak fonksiyonu al
sr hale
getirebiliyoruz. S
imdi yukardaki fonksiyona s
yle bir ekleme yapalm:
Burada yapt
gmz eklemeler sayesinde adres_defteri() adl fonksiyona isim, soyisim
ve telefon parametrelerini yerle
stirdikten sonra istedi
gimiz sayda ba
ska isimli argmanlar
da belirtebiliyoruz. Burada **arglar parametresinin bir szlk (dictionary) oldu
guna zellikle
dikkat edin. Bu parametre bir szlk oldu
gu iin, szlklerin btn zelliklerine de do
gal olarak
sahiptir. Yukardaki kodlar s
u s
ekilde yazarak, arka planda neler olup bitti
gini daha ak bir
s
ekilde grebiliriz:
def adres_defteri(isim, soyisim, telefon, **arglar):
print("isim:\n\t", isim)
print("soyisim:\n\t", soyisim)
print("telefon:\n\t", telefon)
print("teki argmanlar:\n\t", arglar)
adres_defteri(isim="Frat",
soyisim="zgl",
telefon="02122121212",
eposta="firatozgul@frtzgl.com",
adres="
Istanbul",
cep="05994443322")
Bu kodlar al
strd
gmzda s
una benzer bir kt alaca
gz:
isim:
Frat
soyisim:
zgl
telefon:
02122121212
teki argmanlar:
{adres:
Istanbul,
eposta: firatozgul@frtzgl.com,
cep: 05994443322}
Grd
gnz gibi, arglar parametresi bize bir szlk veriyor. Dolaysyla s
yle bir kod yazmamz mmkn olabiliyor:
for i in arglar.keys():
defter[i] = arglar[i]
gelerin de
gerini srasyla 2, 1 ve 4 olarak ayarlyoruz. Dedi
gim gibi, yukardaki rnek
for i in arglar.keys()... satryla yapt
gmz s
eyden farkl de
gildir. S
yle d
snn:
defter = {}
defter["adres"] = "
Istanbul"
defter["eposta"] = "firatozgul@frtzgl.com"
defter["cep"] = "05994443322"
defter[i] dedi
gimiz s
ey, adres, eposta ve cep
gelerine; arglar[i] dedi
gimiz s
ey ise
Istanbul, firatozgul@frtzgl.com ve 05994443322
gelerine kar
slk geliyor.
Grd
gnz gibi, ift yldzl parametreler fonksiyonlara istedi
gimiz sayda isimli argman ekleme imkan tanyor bize... Dedi
gim gibi, bu parametreler bir szlk oldu
gu iin yukardaki
rne
gi s
u s
ekilde de yazabilirsiniz:
def adres_defteri(isim, soyisim, telefon, **arglar):
defter = {}
defter["isim"] = isim
defter["soyisim"] = soyisim
defter["telefon"] = telefon
for i in arglar.keys():
defter[i] = arglar[i]
for k, v in defter.items():
print("{0}\t:\t{1}".format(k, v))
szlk = {"eposta": "firatozgul@frtzgl.com",
"adres": "
Istanbul",
"cep": "05994443322"}
adres_defteri(isim="Frat",
soyisim="zgl",
telefon="02122121212",
**szlk)
Burada szl
g nceden tanmlad
gmza ve bunu fonksiyonu a
grrken do
grudan argman
olarak ekledi
gimize dikkat edin. Ayrca szlk argmann fonksiyona yazarken yine ift
yldzl yapy kullanmay da unutmuyoruz.
def deneme():
say = 5
print(say)
print(say)
Bu kod parasn al
strd
gmzda Python bize s
yle bir hata mesaj gsterecektir:
NameError: name say is not defined
Yani:
Grd
gnz gibi, say adl de
gi
skeni fonksiyon d
snda da kullanabilmek iin, bu de
gi
skeni
fonksiyonun d
snda da tanmlamamz gerekiyor. Yukarda iki farkl de
gerle gsterilen say
adl de
gi
skenler farkl isim alanlar iinde yer ald
g iin, ayn ada sahip olmalarna ra
gmen
birbirlerine kar
smyorlar. Aslnda isim alan kavram ok gzel bir zelliktir. Byk programlar yazarken isim alan kavramnn ok i
sinize yarad
gn greceksiniz. Bu kavram sayesinde
de
gi
skenlerin birbirine kar
smasn nleyebiliyoruz. Hele bir de ayn program zerinde farkl
ki
siler al
syorsa, bu isim alan zelli
gi hayat kurtarc olabilir...
Ancak baz durumlarda bir isim alan iinde yer alan bir de
gi
skene o isim alan d
sndan da
eri
sebilmeniz gerekebilir. Mesela s
yle bir s
ey yazmak isteyebilirsiniz:
def sor():
say1 = int(input("bir say: "))
say2 = int(input("ba
ska bir say: "))
def topla():
print(say1 + say2)
try:
sor()
except ValueError:
pass
else:
topla()
Yukardaki yapya gre, sor() fonksiyonu iinde geen say1 ve say2 adl de
gi
skenleri
topla() fonksiyonu iinde i
sleme tabi tutabilmemiz gerekiyor. Ancak burada bir problem
var. Pythonun yaps gere
gince, sor() ve topla() adl fonksiyonlar farkl isim alanlarna,
dolaysyla da farkl kapsamlara sahip... Bundan tr, bu iki fonksiyon iindeki de
gi
skenlere
d
sardan eri
semiyoruz. Zaten yukardaki kodlar al
strd
gmzda Python bize bununla ilgili bir
hata mesaj gsterecektir...
Yukardaki sorunu a
sabilmek iin Python bize global adl bir ara sunuyor... global deyimi
yardmyla, bir isim alan iindeki de
gi
skenlere o isim alan d
sndan da eri
sebiliyoruz. Mesela
yukardaki rne
gi s
yle yazalm:
def sor():
global say1
global say2
say1 = int(input("bir say: "))
say2 = int(input("ba
ska bir say: "))
def topla():
print(say1 + say2)
try:
sor()
except ValueError:
pass
else:
topla()
Bu kodlarn ba
sna ekledi
gimiz global say1 ve global say2 ifadeleri sayesinde say1 ve
say2 adl de
gi
skenlere fonksiyon d
sndan da eri
silebilmesini sa
glyoruz. Yukardaki kodlar
al
strd
gmzda artk programmz hatasz bir s
ekilde grevini yerine getirecektir. Say d
snda
bir de
ger girilmesi durumunda dahi programmzn kmemesi iin try... except... bloklarndan yararland
gmza dikkat ediyoruz...
Bu arada e
ger istersek yukardaki global say1 ve global say2 ifadelerini birle
stirebiliriz:
def sor():
global say1, say2
...
...
print(say1 * say2)
def bl():
try:
print(say1 / say2)
except ZeroDivisionError:
print("Bir sayy sfra blemezsiniz!")
print("""Topla >> 1
kar >> 2
arp >> 3
Bl
>> 4
k
s >> 5
""")
while True:
seenek = input("Yapmak istedi
giniz i
slem: ")
if seenek == "5":
break
else:
try:
sor()
except ValueError:
print("Yanl
s seenek!..")
else:
if seenek == "1":
topla()
elif seenek == "2":
kar()
elif seenek == "3":
arp()
elif seenek == "4":
bl()
Grd
gnz gibi, global deyimi epey i
se yaryor. Ancak size bu deyimle ilgili kt bir haberim
var. Bu deyim ne kadar faydalym
s gibi grnse de aslnda o
gu zaman i
sleri kar
strabiliyor.
S
yle bir rnek verelim:
a = 5
def de
gi
skeni_de
gi
stir():
a = 10
print("bu de
gi
sken fonksiyon iinde: ", a)
de
gi
skeni_de
gi
stir()
print("bu de
gi
sken fonksiyon d
snda: ", a)
Bu kodlar al
strd
gmzda s
yle bir kt alyoruz:
bu de
gi
sken fonksiyon iinde: 10
bu de
gi
sken fonksiyon d
snda: 5
Bir de s
una bakalm:
a = 5
def de
gi
skeni_de
gi
stir():
global a
a = 10
print("bu de
gi
sken fonksiyon iinde: ", a)
de
gi
skeni_de
gi
stir()
print("bu de
gi
sken fonksiyon d
snda: ", a)
Grd
gnz gibi, fonksiyon iindeki i
slem fonksiyonun d
s blgesini de etkiledi ve normalde
de
geri 5 olmas gereken a adl de
gi
skeni de
gi
sikli
ge u
gratt. global deyimi bu zelli
ginden tr hi beklenmedik bir anda programnz allak bullak edebilir. zellikle byk boyutlu
ve birden fazla ki
sinin zerinde al
st
g programlarda global deyimi zccaciye dkkanna fil
girmi
s gibi bir etki yaratabilir... O yzden Python programclar genellikle global deyimini kullanmaktan kanr. Hatta Python camiasnda s
yle bir sz vardr: E
ger yazd
gnz programda
global deyimini kullanmanz gerekti
gini d
snyorsanz, programnz gzden geirmenizin
zaman gelmi
s demektir!
Pythonda global yerine benimseyebilece
gimiz daha sa
glkl yollar vardr. Mesela snfl
yaplar kullanmak gibi... Hi endi
se etmeyin. Yeri geldi
ginde snfl yaplar da enine boyuna
inceleyece
gimizden emin olabilirsiniz. Peki global deyimini hangi durumlarda kullanmamzn
bir sakncas yoktur? Esasnda, dedi
gimiz gibi, en iyisi ki
sinin kendini global deyimine hi
al
strmamasdr. Ama e
ger u
gra
st
gnz kod ufak boyutlu bir s
eyse ve sizden ba
ska kimsenin
bu kodlar zerinde al
smayaca
gndan eminseniz, o anda kar
sla
st
gnz bir sorunu zmek iin
global deyimine ba
svurmay tercih edebilirsiniz... Elbette global deyimini kullanmak gnah
de
gildir! Sadece, bunu kullanmak iyi bir programclk tekni
gi olarak kabul edilmez...
dndrmesini nasl sa
glayaca
gz? Esasnda Pythondaki btn fonksiyonlar, biz belirtsek de
belirtmesek de mutlaka bir de
ger dndrr. S
u rne
gi inceleyelim:
def bas(kelime):
print(kelime)
a = bas("www.istihza.com")
print(a)
Bu kodlar al
strd
gmzda s
yle bir sonu elde edece
giz:
www.istihza.com
None
I
ste bu ktda grd
gmz None,
yazd
gmz fonksiyonun dn
s de
geridir.
www.istihza.com ise fonksiyon iinde yazd
gmz print() fonksiyonunun marifetidir ve
onun yapt
g s
ey returnun yapt
g s
eyden farkldr. return ile print() ayn s
eyler de
gildir
ve ayn i
slevi grmezler.
Yukardaki rne
ge gre, Pythondaki btn fonksiyonlar bir de
ger dndryor. zel olarak bir
dn
s de
geri belirtilmezse, fonksiyonun dndrece
gi de
ger None olacaktr. Eee, ne olmu
s?
dedi
ginizi duyar gibiyim... Konuyu biraz daha somutla
strmak iin s
yle bir rnek verelim:
def santtan_faha(sant):
fah = sant * (9/5) + 32
return fah
Burada kendisine verilen santigrat dereceyi fahrenhayta eviren bir uygulama yazdk... Bu
fonksiyonu s
u s
ekilde a
gryoruz:
print(santtan_faha(22))
Buradan s
u kty alyoruz:
71.6
Bu kodlar do
grudan bir dosyaya kaydedip al
strd
gmzda herhangi bir kt almayz. nk
sum() fonksiyonu kendi ba
sna herhangi bir de
geri ekrana basmaz. Bu fonksiyonun bir de
geri
ekrana basabilmesi iin s
yle bir s
ey yapmamz gerekir:
print(sum(li))
Bu fonksiyon bize s
u kty verir:
70.6
Ayn i
slemi,
def santtan_faha(sant):
fah = sant * (9.0/5.0) + 32
print(fah)
print(santtan_faha(22)-1)
Grd
gnz gibi bu defa Python bize bir hata mesaj veriyor:
TypeError: unsupported operand type(s) for -: NoneType and int
Yani:
TipHatas: - i
saretinin desteklemedi
gi i
sleyen tr/trleri: "NoneType" ve "int"
Burada bas() fonksiyonu www.istihza.com karakter dizisini ekrana basyor, ama None
de
gerini dndryor. Yukarda hata verdi
gini grd
gmz santtan_faha() fonksiyonunda
da zel olarak herhangi bir de
ger dndrmedi
gimiz iin bu fonksiyon otomatik olarak None
de
gerini dndryor. Dikkat ederseniz, bu defa fah de
gi
skenini dndrmek yerine do
grudan
print()i kullanarak ekrana bastk. Yani burada de
geri dndrmedik, ama ekrana basmakla
yetindik. Bu yzden santtan_faha() fonksiyonunun dn
s de
geri None oldu. Dolaysyla
biz print(santtan_faha(22)-1) komutuyla sanki s
yle bir i
slem yapyormu
s gibi olduk:
print(None - 1)
Pythonun etkile
simli kabu
gunda None - 1 komutunu verdi
ginizde s
u hatay alacaksnz:
TypeError: unsupported operand type(s) for -: NoneType and int
Grd
gnz gibi, biraz nceki fonksiyonumuzun verdi
gi hatayla ayn hatay aldk... nk
orada olan s
eyle burada olan s
ey tamamen ayndr. None de
gerinden 1 de
gerini karamayaca
gmz iin Python bize byle bir hata veriyor. Buradan return deyiminin ne i
se
yarad
gn az ok anlam
s olmalyz. Pythonda fonksiyon tanmlarken do
grudan fonksiyon
iinde herhangi bir de
geri print() ile ekrana basmak her zaman iyi bir yol olmayabilir. nk
daha nce de dedi
gimiz gibi, fonksiyonlar s
ablonlara benzer. O yzden fonksiyonlar ne kadar
genel tutarsak o kadar i
se yarar. Bir fonksiyonun grevi sadece bir de
geri ekrana basmak olmamal. Tanmlad
gmz fonksiyonlarda herhangi bir de
geri do
grudan ekrana basmak yerine o
de
geri dndrmeyi (return) tercih edersek, fonksiyondan dnen de
ger ile istedi
gimiz i
slemi
yapabiliriz. Artk dnen bu de
geri sonradan ekrana basmak veya bu de
gerle ba
ska i
slemler
yapmak tamamen size kalm
s bir s
ey olacaktr...
Mesela yukardaki fonksiyonla s
yle bir deneme yapalm:
def santtan_faha(sant):
fah = sant * (9.0/5.0) + 32
return fah
santigrat = 20
print("{0} santigrat {1} fahrenhayt eder".format(santigrat,
santtan_faha(santigrat)))
Bu fonksiyonu al
strd
gmzda istedi
gimiz kty alabiliriz. Ama e
ger fonksiyonu s
yle tanmlarsak sknt ya
sarz:
def santtan_faha(sant):
fah = sant * (9.0/5.0) + 32
print(fah)
santigrat = 20
print("{0} santigrat {1} fahrenhayt eder".format(santigrat,
santtan_faha(santigrat)))
Buradan alaca
gmz kt s
yle olacaktr:
68.0
20 santigrat None fahrenhayt eder
Grd
gnz gibi, fonksiyonumuzun dndrd
g None de
geri, karakter dizisinin iine yerle
sti...
Sonu olarak, return deyimi bir fonksiyonu genel amal bir hale getirmeye yardmc olan bir
aratr. Bu deyim yardmyla, tanmlad
gmz fonksiyonlarn bir de
ger dndrmesini sa
glyoruz.
Dndrlen bu de
geri daha sonra istedi
gimiz gibi kullanma zgrl
gne sahibiz...
grendi
gimiz dir() fonksiyonu yardmyla bu fonksiyonun iine bakalm:
>>> dir(sum)
[__call__, __class__, __delattr__, __doc__, __eq__, __format__,
__ge__, __getattribute__, __gt__, __hash__, __init__, __le__,
__lt__, __module__, __name__, __ne__, __new__, __reduce__,
__reduce_ex__, __repr__, __self__, __setattr__, __sizeof__,
__str__, __subclasshook__]
Bu s
ekilde sum() fonksiyonunun niteliklerini ekrana dkm
s olduk. Bunlar iinde bizi ilgilendiren, drdnc sradaki __doc__ niteli
gidir. S
imdi bu __doc__ niteli
gini nasl kullanaca
gmza
ve bu niteli
gin ne i
se yarad
gna bakalm. Bu komutu etkile
simli kabukta veriyoruz:
>>> print(sum.__doc__)
sum(iterable[, start]) -> value
Returns the sum of an iterable of numbers (NOT strings) plus the value
of parameter start (which defaults to 0). When the iterable is
empty, returns start.
Grd
gnz gibi, print(sum.__doc__) komutu bize sum() fonksiyonu hakknda ksa bir bilgi
veriyor. Tabii e
ger Ingilizce bilmiyorsanz bu ksa aklamalarn size pek faydas olmayacaktr.
Ama hi endi
se etmeyin! istihza.com bugnler iin var!...
Burada sum() fonksiyonunun __doc__ niteli
gini kullanarak, bu fonksiyon hakknda ksa da
olsa bilgi edinebiliyoruz. Bu __doc__ niteli
gi btn fonksiyonlarda vardr. Hatta kendi tanmlad
gmz fonksiyonlar dahi bu niteli
ge sahiptirler. Hemen bir fonksiyon tanmlayarak bu durumu teyit edelim:
def bo
s_fonksiyon():
pass
Grd
gnz gibi def ile ba
slayan satr yazp entere bast
gmzda etkile
simli kabu
gun >>>
i
sareti ... i
saretine dn
syor. Burada drt kez bo
sluk tu
suna basp girinti veriyoruz ve
pass satrn yazyoruz. Ardndan entere bast
gmzda i
saretin yine ... oldu
gunu gryoruz.
Etkile
simli kabuk burada bizden ba
ska kodlar bekliyor, ama bu fonksiyonda bizim yazaca
gmz
ba
ska kod yok. O yzden tekrar entere basarak >>> i
saretinin oldu
gu ba
slang konumuna
geri dnyoruz. Bylece etkile
simli kabukta fonksiyonumuzu tanmlam
s olduk. S
imdi yine etkile
simli kabukta s
u komutu vererek, yeni olu
sturdu
gumuz bu bo
s_fonksiyon adl fonksiyonun
iine, yani niteliklerine bakabiliriz:
>>> dir(bo
s_fonksiyon)
[__annotations__, __call__, __class__, __closure__, __code__,
__defaults__, __delattr__, __dict__, __doc__, __eq__, __format__,
__ge__, __get__, __getattribute__, __globals__, __gt__, __hash__,
__init__, __kwdefaults__, __le__, __lt__, __module__, __name__,
__ne__, __new__, __reduce__, __reduce_ex__, __repr__, __setattr__,
__sizeof__, __str__, __subclasshook__]
Grd
gnz gibi, bizim olu
sturdu
gumuz fonksiyonun da __doc__ adl bir niteli
gi var. Gelin
isterseniz biraz nce sum() fonksiyonuna yapt
gmz gibi, bo
s_fonksiyona da bu __doc__
niteli
gini uygulayalm:
>>> print(bo
s_fonksiyon)
None
Grd
gnz gibi, fonksiyonumuz None de
geri dndrd. nk fonksiyonumuzu henz belgelendirmedik. O yzden bu __doc__ niteli
gi bo
s grnyor. S
imdi bu fonksiyonu nasl belgelendirece
gimize bakalm:
def bo
s_fonksiyon():
"""Kullanm: bo
s_fonksiyon() Hi bir i
se yaramayan bo
s bir fonksiyondur.
None de
gerini dndrr."""
pass
print(bo
s_fonksiyon.__doc__)
Bu kodlar al
strd
gmzda ekrana s
u satrlar dklecektir:
Kullanm: bo
s_fonksiyon() Hi bir i
se yaramayan bo
s bir fonksiyondur.
None de
gerini dndrr.
Fonksiyonumuzu s
yle yazmamz gerekiyor:
def bo
s_fonksiyon():
"""belgelendirme dizisi..."""
Dedi
gimiz gibi, bir fonksiyonun belgelendirme dizisine ula
smak iin __doc__ niteli
gini kullanyoruz. Alternatif olarak bu dizilere ula
smak iin help() adl zel bir fonksiyondan da yararlan-
abiliriz:
>>> print(help(enumerate))
En ba
sta da syledi
gimiz gibi, belgelendirme dizilerinin kodlarmzn al
smas zerinde hi
bir etkisi yoktur. Ayrca bunlar yazmak mecburiyetinde de de
giliz. Bu zellik kodlarmz
daha anla
slr ve okunakl klmaya yarar. Bu sayede, yazd
gmz fonksiyonu okuyanlar veya
kullanacak olanlar fonksiyonun nasl kullanlaca
g hakknda bilgilenme imkan edinmi
s olurlar.
Elbette yazd
gmz belgelendirme dizilerinin faydas, bu dizilerin ne kadar dzgn yazld
gna
ba
gldr...
Ayrca belgelendirme dizilerinin sadece fonksiyonlara has bir zellik olmad
gn da belirtelim.
Bir sonraki blmde de grece
giniz gibi, belgelendirme dizileri modllerin de sahip oldu
gu bir
zelliktir. Dolaysyla modlleri belgelendirmek iin yine bu belgelendirme dizilerinden yararlanaca
gz...
BLM
11
Modller
201
Pythonda os adl bir modl bulunur. Bu modl Pythonun en temel ve en nemli modllerinden
bir tanesidir. S
imdi bir modln ne olup ne olmad
gn anlayabilmek iin etkile
simli kabukta
a
sa
gdaki komutu verelim. Bu komut yardmyla bu os adl modln iine bakaca
gz:
>>> dir(os)
Grd
gnz gibi, os modl iinde bir hayli ara bulunuyor. Peki bu os modl ne i
se yarar?
Ingilizce bilen arkada
slarm s
u komutu kullanarak bu modln belgelendirme dizisine ula
sabilir
(Belgelendirme dizilerinin ne oldu
gunu fonksiyonlar blmnde i
slemi
stik...):
>>> print(os.__doc__)
>>> import os
E
ger etkile
simli kabuk zerinde al
syorsanz, bu modl her oturumda bir kez ie aktarmak
yeterli olacaktr.
S
imdi s
u kodlara bakalm:
>>> import os
>>> if os.name == "posix":
...
print("Merhaba GNU/Linux kullancs... Stallmana benden selam syle!")
>>> elif os.name == "nt":
...
print("Merhaba Windows kullancs... Gatese benden selam syle!")
E
ger kulland
gnz sistem GNU/Linux ise yukardaki kodlar al
strd
gnzda Merhaba
GNU/Linux kullancs... kts verilecek, e
ger Windows kullanyorsanz Merhaba Windows
kullancs... kts verilecektir. Isterseniz bu kodlar biraz inceleyelim:
ncelikle os modln ie aktaryoruz. nk bu modl ve iindeki nitelikleri kullanabilmek
iin ilk yapmamz gereken s
ey bu modl ie aktarmaktr. Modl bir kez ie aktardktan
sonra dir(os) ktsnda grnen btn niteliklerden, metotlardan ve fonksiyonlardan faydalanabiliriz. os modl iinde, i
sletim sistemlerine ili
skin baz i
slemleri yerine getirmemizi
sa
glayacak aralar bulunur. E
ger os(dir) ktsna bakacak olursanz, orada name adl bir
ifade grrsnz. name kelimesinin anlam isimdir. Dolaysyla bu ifade bize kulland
gmz
i
sletim sisteminin ismini syleyecektir. os modl iinde s
u isimler tanmlanm
str:
posix, nt, mac, os2, ce, java, riscos
S
imdi etkile
simli kabukta os modln ie aktardktan sonra s
u komutu verin:
>>> print(os.name)
Bu komut, kulland
gnz i
sletim sistemine gre farkl ktlar verecektir. E
ger GNU/Linux
da
gtmlarndan birini kullanyorsanz yukardaki komuttan alaca
gnz kt posix olacaktr.
E
ger Windows kullanyorsanz bu komut size nt cevabn verir. Yok e
ger siz bir Macintosh
kullancsysanz bu komuttan alaca
gnz cevap mac olacaktr...
Bu ifadeler arasnda grnen os2, OS/2 adl i
sletim sistemini, ce Windows CE i
sletim sistemini, java JavaOS i
sletim sistemini, riscos ise RISC OS i
sletim sistemini temsil eder...
Burada os modl iindeki bir niteli
gi nasl kulland
gmza dikkat edin: os + . + name. Burada
modl_ad + nokta + istenen_nitelik yolunu izliyoruz.
Biz burada print(os.name) komutuyla aslnda Pythona s
yle bir emir vermi
s oluyoruz: os
adl modlnn name adl niteli
gi aracl
gyla bana kulland
gm i
sletim sisteminin adn
syle!
Gelin isterseniz yine os modl iinde yer alan aralardan biriyle ilgili bir rnek daha yapalm:
>>> print(os.getcwd())
Bu arada, e
ger os modlnn ieri
gini merak ediyorsanz, bu dosyay inceleyebilirsiniz.
Bu modln sisteminizde nerede bulundu
gunu
grenmek iin s
yle bir komuttan yararlanabilirsiniz:
>>> os.__file__
Burada yapt
gmz s
ey, os modlnn getcwd adl niteli
gini ie aktarmaktan ibarettir. Burada
modlmzn tek bir niteli
gini ie aktarm
s olduk. Ayrca kullanmda da s
yle bir fark ortaya
kt:
>>> print(getcwd())
/home/istihza/Desktop/
Grd
gnz gibi, bu defa getcwd()nin ba
sna os. ifadesini koymadk. Artk os.getcwd()
demek yerine sadece getcwd() komutunu kullanabiliyoruz. Ancak modlmz bu biimde
ie aktard
gmzda sadece belirtilen nitelik kullanlabilir durumda olacaktr. Yani bu durumda
os modlnn getcwd() niteli
gi d
sndaki hi bir niteli
gini kullanamyoruz. Mesela burada name
niteli
ginden yararlanamayaca
gz:
>>> print(name)
NameError: name name is not defined
E
ger getcwd() ile birlikte name niteli
gini de kullanmak istersek kodumuzu s
yle yazmamz
gerekir:
>>> from os import getcwd, name
Artk s
u komutlar al
sacaktr:
>>> print(getcwd())
>>> print(name)
Grd
gnz gibi, kullanmak istedi
gimiz her niteli
gi ayr ayr ie aktaryoruz. E
ger yazaca
gnz
programda bir modln sadece tek bir niteli
gini kullanacaksanz koca bir modln tamamn
ie aktarmak yerine, bu biimi tercih edebilirsiniz...
Biraz nce, bir modl bu import modl_ad biimiyle ie aktard
gmzda, o modln kendi
ismi de ie aktarlm
s olur, demi
stik. S
imdi bunun ne demek oldu
gunu grece
giz:
>>> dir(os)
NameError: name os is not defined
Grd
gnz gibi, modlmz from modl import modl_ad biiminde ie aktard
gmzda os
adn kullanamyoruz. nk, dedi
gimiz gibi, bu s
ekilde ie aktarmalarda modl ad aktarm
listesine dahil olmayacaktr.
Grd
gnz gibi, from os import * yapsn kulland
gmzda, modl ismini kullanmadan (yani
os. ksmn atarak), modle ait nitelikleri kullanabiliyoruz. Ancak bu yapnn ok nemli bir
riski vardr. Bir modl bu s
ekilde ie aktard
gmzda, o modle ait btn nitelikler do
grudan o
anda iinde al
st
gmz isim alanna dahil olacaktr. isim alan kavramn nceki derslerimizden hatrlyorsunuz. Isterseniz bu riski s
yle bir rnekle somutla
stralm.
Diyelim ki s
yle bir kodumuz var:
>>> name = "istihza.com"
E
ger biz bu kodun bulundu
gu bir programda from os import * komutunu verecek olursak
programmz darmada
gn ederiz... Nasl m? S
una bakn s
imdi:
>>> name = "istihza.com"
>>> print(name)
istihza.com
S
imdi os modln ie aktaryoruz:
>>> from os import *
>>> print(name)
posix
Grd
gnz gibi, os modln ie aktarmamzla birlikte nceden tanmlam
s oldu
gumuz name
adl de
gi
sken siliniverdi... Muhtemelen yazaca
gnz programlarda byle bir s
eyin ba
snza
gelmesini istemezsiniz... Bu tr durumlar engellemenin en iyi yolu modl import modl_ad
s
eklinde ie aktarmaktr:
>>> name = "istihza.com"
>>> print(name)
istihza.com
>>> import os
>>> print(os.name)
posix
>>> print(name)
istihza.com
Bu modl bu s
ekilde ie aktard
gmzda modln niteliklerine eri
smek iin her defasnda
modl adn da belirtmemiz gerekecek:
>>> multiprocessing.nitelik_ad
E
ger her defasnda multiprocessing yazmak zor geliyorsa modl s
u s
ekilde ie aktarmay
tercih edebiliriz:
>>> import multiprocessing as mp
11.2.1 os Modl
os Modl Pythonun en temel modllerinden bir tanesidir. Bu modle daha nce de
ginmi
stik.
Burada bu modl, biraz daha ayrntsna inerek incelemeye al
saca
gz.
Bildi
giniz gibi, bir modl kullanabilmek iin ncelikle o modl ie aktarmamz gerekiyor:
>>> import os
Yine bildi
giniz gibi, modllerimizi birka farkl s
ekilde ie aktarabiliyoruz. Ama mevcut yntemler iinde en sa
glkls import os biimidir.
Ie aktard
gmz bu modln ieri
gini grmek istersek, daha nce pek ok kez kulland
gmz
dir() fonksiyonundan yararlanabiliriz:
>>> dir(os)
...veya...
>>> print(os.__doc__)
E
ger Ingilizce biliyorsanz, yukardaki komutlarn ktlarna bakarak os modlnn ne i
se
yarad
gna dair baz bilgiler edinebilirsiniz. E
ger Ingilizce bilmiyorsanz ziyan yok. Biz size
yardmc olmaya al
saca
gz.
Gelin isterseniz s
imdi dir(os) komutu ile kar
smza gelen listedeki niteliklerin en nemlilerini
incelemeye koyulalm.
name Niteligi
name kelime olarak isim anlamna gelir. os modlne ait bir nitelik olan name, bize kulland
gmz i
sletim sisteminin adn verir. Bununla ilgili s
yle bir rnek verebiliriz:
>>> print(os.name)
Kulland
gmz i
sletim sistemine gre bu komuttan s
u ktlardan birini alrz:
posix, nt, mac, os2, ce, java, riscos
Demek ki ben s
u anda /home/istihza dizininin altnda al
syormu
sum. Elbette i
sletim sisteminize ve o anda bulundu
gunuz dizine ba
gl olarak bu komutun kts sizde farkl olacaktr.
rne
gin bu fonksiyonu Windows altnda al
strmak istersek...
>>> print("
Su anda bulundu
gunuz dizinin ad:\n", os.getcwd())
Su anda bulundu
gunuz dizinin ad:
C:\\Documents and Settings\\ISTIHZA
listdir Fonksiyonu
listdir kelimesi list directory (dizini listele) ifadesinin ksaltmasdr. Bu fonksiyonu kullanarak, istedi
gimiz bir dizinin ieri
gini gsterebiliriz:
>>> os.listdir("/home/istihza/")
Bu komut C:\Documents and Settings altnda bulunan btn dosyalar bir liste halinde verecektir. E
ger o anda iinde bulundu
gunuz dizinin ieri
gini listelemek isterseniz s
yle bir s
ey
yazabilirsiniz:
>>> mevcut_dizin = os.getcwd()
>>> os.listdir(mevcut_dizin)
S
u anda /usr/share/ dizini altnda bulundu
gum iin yukardaki kodlarn ktsnda bu dizinin
ieri
gini gryorum. S
imdi bulundu
gum dizini tekrar de
gi
stireyim:
>>> os.chdir("/etc/X11/")
>>> os.listdir(os.getcwd())
geldi
gim
iin,
curdir Niteligi
curdir Ingilizcede current directory (mevcut dizin) ifadesinin ksaltmasdr. Bu nitelik daha
nce
grendi
gimiz getcwd() fonksiyonuna ok benzer. Bu ikisi arasnda anlay
s fark vardr...
ncelikle curdir niteli
ginin ne kt verdi
gine bakalm:
>>> os.curdir
.
Grd
gnz gibi, bu komuttan bir nokta kts alyoruz... Peki bu ne i
se yaryor?
sistemlerinde mevcut dizini ifade etmek iin kullanlan basit karakter dizileri vardr.
nokta i
sareti de bunlardan biridir. Mesela bu karakter dizisini s
u s
ekilde kullanabiliriz:
I
sletim
I
ste bu
>>> os.listdir(".")
Bylece, programnzn al
strld
g i
sletim sistemi neyse, os.curdir yerine otomatik olarak
mevcut dizini temsil eden karakter dizisi yerle
stirilecek ve bylece mevcut dizinin ieri
gi
otomatik olarak ekrana dklecektir...
environ Niteligi
os modl iinde bulunan bu environ adl nitelik esasnda bir szlktr. Bu szlk sisteminizdeki evre de
gi
skenlerine ili
skin bilgileri tutar. Mesela environ niteli
gini kullanarak sistemdeki kullanc adn
grenebiliriz:
>>> os.environ["USER"] #Windowsta "USERNAME"
Bilgisayar ad:
>>> os.environ["COMPUTERNAME"] #GNU/Linuxta buna yakn olarak "LOGNAME" bulunur...
I
slemciye ili
skin bilgiler:
>>> os.environ["PROCESSOR_IDENTIFIER"] #GNU/Linuxta bulunmaz.
Dedi
gimiz gibi, environ esasnda bir szlktr. Dolaysyla bu szl
gn iindeki btn
de
gi
skenleri grmek iin s
yle bir yol izleyebilirsiniz:
>>> for k, v in os.environ.items():
...
print("{0} = {1}".format(k, v)
sep Niteligi
I
sletim sistemleri, dizinleri birbirinden ayrmak iin farkl i
saretler kullanr.
rne
gin
os.getcwd() komutunu verdi
gimizde, dizin ayralar asndan GNU/Linux ve Windowsta farkl
sonular alrz:
>>> os.getcwd()
/home/istihza/Desktop #GNU/Linux
C:\\Documents and Settings\\ISTIHZA\\Desktop #Windows
Grd
gnz gibi, dizin ayralar birbirinden farkl. E
ger yazd
gmz programlarda bu farkll
g
gz nnde bulundurmazsak, programlarmz farkl i
sletim sistemlerinde dzgn al
smayacaktr. Python bu riske kar
s bize os modl iinde sep adl bir nitelik sunar. Bu komut farkl
sistemlerde farkl ktlar verecektir:
>>> os.sep
/ #GNU/Linux
\\ #Windows
Bu s
ekilde Python uygun dizin ayracn otomatik olarak yerine yerle
stirecektir.
mkdir ve makedirs Fonksiyonlar
Bu blmde, os modl iinde yer alan iki nemli fonksiyondan sz edece
giz. Bunlar mkdir()
ve makedirs() fonksiyonlardr. Ilk olarak mkdir() fonksiyonuyla ba
slayalm.
mkdir() Fonksiyonu
os modl iinde yer alan mkdir adl fonksiyon yardmyla bilgisayarmzda yeni dizinler olu
sturabiliyoruz. rne
gin:
>>> os.mkdir("DENEME_D
IZ
IN
I")
Bylece o anda al
st
gmz dizin iinde DENEME_DIZINI adl yeni bir dizin olu
sturmu
s olduk.
mkdir() fonksiyonu sadece tek bir dizin olu
sturmamza izin verir. Yani bu fonksiyonu kullanarak birden fazla veya i ie gemi
s dizinler olu
sturamayz. Yani s
yle bir s
ey yapamayz:
>>> os.mkdir("deneme/test")
Ancak s
yle bir s
ey yapabiliriz:
>>> os.mkdir("deneme")
>>> os.mkdir("deneme/test")
mkdir() fonksiyonu GNU/Linuxta mode adl bir parametre daha alr. Bu fonksiyonu kullanarak
dizin olu
stururken mode adl parametreye 0755, 0644 gibi saylar vererek, olu
sturdu
gunuz
klasrn izinlerini belirleyebilirsiniz:
rne
gin s
u komut yardmyla GNU/Linuxta olu
sturdu
gunuz klasrn izinlerini 0755 olarak
ayarlayabilirsiniz:
>>> os.mkdir("dizin", 0755)
Son olarak, e
ger os.mkdir() fonksiyonunu kullanarak, halihazrda var olan bir dizin yaratmaya
al
srsanz, Python size bir hata mesaj gsterecektir.
Gelelim makedirs() fonksiyonuna...
makedirs() Fonksiyonu
rmdir() Fonksiyonu
Ancak e
ger silmek istedi
gimiz dizinin ii doluysa Python bize bir hata mesaj gsterecektir.
Dolaysyla bu fonksiyonu kullanarak ii dolu dizinleri silemeyiz. Ama diyelim ki elimizde ii
bo
s, ama i ie gemi
s dizinler varsa bu fonksiyon yardmyla bunlar silebiliriz.
Diyelim ki sistemimizde dizin1 adl bir dizin, bunun iinde de dizin2 adl bo
s bir dizin daha
var. Biz rmdir() fonksiyonunu kullanarak dizin1i silemeyiz. nk dizin1 bo
s de
gildir
(dizin1in iinde dizin2 var). Ama istersek dizin2yi silebiliriz. nk bu dizinin iin bo
s:
>>> os.rmdir("dizin1/dizin2")
Grd
gnz gibi, rmdir() fonksiyonu tek bir bo
s dizin zerinde i
slem yapabiliyor. Elbette bu
fonksiyonu bir for dngsne sokarak birden fazla bo
s dizini de silebilirsiniz...
Sra geldi removedirs() adl fonksiyona...
removedirs() Fonksiyonu
Diyelim ki sistemimizde documents adl bir dizin var ve biz bu dizinin adn belgeler olarak
de
gi
stirmek istiyoruz. I
ste burada os.rename() fonksiyonu i
simizi grecektir:
>>> os.rename("documents", "belgeler")
E
ger kulland
gmz sistem Windows ise Internet Explorer programn kullanarak istihza.com
adresine gidiyoruz. E
ger kulland
gmz sistem GNU/Linux ise ayn i
slemi Firefox kullanarak
yapyoruz...
Herhalde sylememize gerek yok... system adl bu fonksiyon, sistem komutlarn al
strd
g
iin, bu fonksiyonu kullanrken dikkatli olmamz gerekir...
os.path Modl
Aslnda Pythonda os.path veya path adl bir modl yoktur. Bunun yerine, GNU/Linux iin
posixpath ve Windows iin nt.path adl iki farkl modl bulunur. os.path ad bu iki modl
yerine kullanlan bir takma addr. Biz kulland
gmz sisteme gre do
grudan bu iki modlden
birini ie aktarmakla u
gra
smyoruz. Bizim yapmamz gereken tek s
ey os modln ie aktarp,
path niteli
gine ise os.path biimini kullanarak eri
smektir. Python kulland
gmz sistemi kendisi tespit edip, ntpath veya posixpath modllerinden birini otomatik olarak ie aktaracaktr.
S
imdi etkile
simli kabukta s
u komutu verelim:
>>> os.path.__file__
module (e.g. macpath, ntpath). Some of this can actually be useful on non-Posix
systems too, e.g. for manipulation of the pathname component of URLs.
Bu paragrafta, os.path modlnn, GNU/Linux iin yazlm
s posixpath modlne atfta bulunan bir takma ad oldu
gundan bahsediliyor. Buradaki aklamaya gre, os.path modl ba
ska
i
sletim sistemlerinde de macpath veya ntpath gibi modllere atfta bulunan bir takma addr
ayn zamanda... Buna benzer bir aklamay ntpath.py dosyasnda da bulabilirsiniz. E
ger bu
aklamaya etkile
simli kabuktan eri
smek isterseniz ne yapmanz gerekti
gini biliyorsunuz:
>>> print(os.path.__doc__)
Bu blmn ba
sndan beri anlatt
gmz s
eylerin os.py dosyas iinde nasl tanmland
gna
dikkat edin.
Yukardaki kod parasnda, biz etkile
simli kabukta import os komutu
verdi
gimizde, kulland
gmz i
sletim sistemine gre hangi modln path adyla a
grlaca
g
belirtiliyor. Buna gre, e
ger GNU/Linux kullanyorsak posixpath adl modl path takma adyla
a
grlyor. Ayn s
ekilde Windows kullanclar iin de ntpath adl modl path adyla ie aktarlyor...
S
imdi biraz pratik yapalm:
>>> import os
>>> dir(os.path)
os.path.exists
E
ger o anda al
slan dizin iinde falanca.txt adl bir dosya varsa True, yoksa False kts
alrz. Bu fonksiyonu uzak konumlardaki dosyalarn varl
gn kontrol etmek iin de kullanabiliriz:
>>> os.path.exists("/home/istihza/Desktop/deneme.py")
os.path.getsize
>>> os.path.isfile("falanca")
os.path.split
Grd
gnz gibi, bu fonksiyon yol ve dosya adn aykladktan sonra bunlar bize bir demet
olarak verdi...
os.path.join
...veya...
/home/istihza/Desktop/zel dosyalar/resimler
Bu ktdaki
geler, kulland
gnz i
sletim sistemine gre farkllk gsterebilir. rne
gin winver
adl nitelik sadece Windowsta al
sacaktr...
Bu blmde sys modlnn iindeki fonksiyon ve niteliklerden en nemli olanlarn i
slemeye
al
saca
gz. Burada i
sleyece
gimiz nitelik ve fonksiyonlar s
unlardr:
1. sys.argv
2. sys.executable
3. sys.exit
4. sys.getdefaultencoding
5. sys.path
6. sys.platform
O halde dilerseniz vakit kaybetmeden ilk
gemizle i
se koyulalm...
argv Niteligi
Bu nitelik sys modlnn en fazla kullanlan
gelerinden bir tanesidir. argv yap olarak aslnda
basit bir listeden ibarettir. Pythonu normal bir s
ekilde ba
slatp etkile
simli kabukta s
u komutu
verecek olursak alaca
gmz kt ii bo
s bir karakter dizisi ieren tek
geli bir liste olacaktr:
>>> sys.argv
[]
>>> len(sys.argv)
1
Grd
gnz gibi, elimizdeki s
ey bir listeden ibarettir... Peki bu sys.argv denen s
ey ne i
se
yarar?
sys.argv bize Pythonun hangi parametrelerle ba
slatld
gn gsterir. Dilerseniz bunu basite
test edelim. S
imdi bir Python dosyasna s
u kodlar yazalm:
import sys
print(sys.argv)
Daha sonra bu dosyay mesela deneme.py adyla kaydedelim ve komut satrna gidip bu
program al
stralm:
python3 deneme.py
[deneme.py]
Buradan grd
gmze gre python3 uygulamas deneme.py adl parametre ile al
strlm
s...
Dedi
gimiz gibi, sys.argv bir listedir. Dolaysyla bu listenin
gelerine rahatlkla eri
sebilirsiniz:
print(sys.argv[0])
deneme.py
Yardm blmne ho
sgeldiniz. Burada programn nasl kullanlaca
gna
ili
skin ksa bilgiler bulacaksnz.""")
E
ger kullancmz yazd
gmz program yardm parametresiyle birlikte a
grrsa, kendisine
programmza ili
skin yardm bilgileri sunuyoruz:
python3 deneme.py --yardm
Bu komut s
yle bir kt verecektir:
Yardm blmne ho
sgeldiniz. Burada programn nasl kullanlaca
gna
ili
skin ksa bilgiler bulacaksnz.
E
ger sys.argv adl listenin uzunlu
gu 2den azsa program parametresiz al
strlm
s demektir. E
ger uzunluk 2 ya da daha fazla ise kullancmz programmza en az bir adet parametre
eklemi
s demektir...
executable, getdefaultencoding ve platform
Bu blmde minik nitelikten/fonksiyondan bahsedece
giz. Bunlar sys.executable ve
sys.platform" adl nitelikler ile sys.getdefaultencoding() adl fonksiyondur. Bu
ge bize sistem hakknda baz bilgiler verir. nce sys.executable niteli
ginin ne verdi
gine
bakalm:
>>> sys.executable
Bu komut utf-8 kts verecektir. Pythonun 2.x srmlerinde bu komutun kts ascii idi...
Pythonun 3.x srmyle birlikte gelen utf-8 deste
gi sayesinde Ingiliz alfabesinde bulunmayan harflerle de i
slem yapabiliyoruz...
Son olarak sys.platform adl niteli
gin ktsna bakaca
gz:
>>> sys.platform
exit Fonksiyonu
exit kelimesi kmak anlamna geliyor. Adndan da anla
slaca
g gibi, bu fonksiyon Python
programndan kmamz sa
glar. Bunu s
u s
ekilde kullanyoruz:
sys.exit()
E
ger yazd
gmz bir programn herhangi bir a
samasnda program terketmemiz gerekirse
sys.exit() fonksiyonundan yararlanabiliriz:
import sys
say = "23"
while True:
soru = input("Bir say tutun: ")
if soru == say:
sys.exit()
else:
continue
Burada e
ger kullancnn girdi
gi say 23e e
sitse programdan klacaktr...
path Niteligi
Hatrlarsanz, nceki derslerimizde os.path adl bir modlden sz etmi
stik. S
imdi i
sleyece
gimiz sys.path modln daha nce i
sledi
gimiz os.path modlyle kar
strmamamz
gerekiyor. Isim olarak birbirlerine benzeseler de bu iki
genin grevleri birbirinden ok farkldr.
sys modlnn path niteli
gi bize Pythonun modlleri ie aktarma sistemiyle ilgili nemli bilgiler verir. Dilerseniz bu path niteli
gini anlatmaya ba
slamadan nce biraz modl ie aktarma
sisteminden sz edelim.
Pythonda import modl_ad komutunu verdi
gimizde, Python arad
gmz modl bulabilmek iin sistem zerinde birka farkl konuma bakar. Biz import modl_ad komutunu
verdi
gimizde Pythonun ilk bakaca
g yer o anda iinde bulundu
gumuz dizindir. Yani Python
ncelikle os.getcwd() ile elde edilen dizin adnn iini kontrol edecektir. E
ger arad
gmz modl
bu dizin iinde yoksa, Pythonun kendi iinde tanml olan zel dizinlerin ieri
gi kontrol edilecektir. E
ger aranan modl hi bir yerde bulunamazsa Python bize bir hata mesaj gsterecektir.
Pythonun, bir modl bulamamas durumunda verdi
gi hata s
yledir:
import falanca
ImportError: No module named falanca
Elbette bu de
gi
siklik kalc olmayacaktr. Programnz veya etkile
simli kabu
gu kapatt
gnzda
sys.path listesi zgn haline geri dnecektir.
Geen blmlerde sys.path konusunu anlatrken, Pythonun bir modl bulmak iin hangi
dizinlere bakt
gn sylemi
stik. Orada da dedi
gimiz gibi, Python arad
gmz bir modl bulabilmek iin nce o anda al
slan dizinin iine ardndan da sys.path iinde grnen dizinlere
bakar. E
ger arad
gmz modl bu dizinlerin hibirinde bulunamazsa, Python bize bir hata mesaj
gsterir. Dolaysyla kendi yazd
gmz modlleri pratik s
ekilde kullanabilmek iin en makul yol,
modllerimizi ve bu modlleri a
grmak iin kulland
gmz ana programmz ayn klasr iine
yerle
stirmektir. Yani bu bilgi.py adl dosyay ve bu modl ie aktarmak iin kulland
gmz
deneme.py adl dosyay ayn dizin iine koyarsak, bilgi adl modl ie aktarmak kolay
olacaktr...
Yukarda gsterdi
gimiz import bilgi komutunu verdikten sonra bilgi.py iindeki btn nitelikleri deneme.py adl dosyann iine aktarm
s oluyoruz. Artk bilgi adl modln bize sundu
gu btn olanaklardan yararlanabiliriz. Mesela bilgi.py iindeki isim adl niteli
ge eri
smek
iin s
yle bir s
ey yazabiliriz:
import bilgi
print(bilgi.isim)
Bu kodlarn kts s
u olacaktr:
istihza
Ayn s
ekilde bilgi modl iindeki isim adl niteli
ge eri
smek iin de bilgi.isim komutunu
veriyoruz..
Elbette modlmzn iine fonksiyon da yazabiliriz. Mesela daha nceki derslerimizin birinde
yazd
gmz arp() adl fonksiyonu bu modl iine yerle
stirelim:
isim = "istihza"
eposta = "kistihza[at]yahoo[nokta]com"
def arp(liste):
a = 1
for i in liste:
a = i * a
print(a)
Artk bilgi adl modlmzn, isim ve eposta adl niteliklerinin yansra, arp adl bir fonksiyonu da var... Bu fonksiyona s
u s
ekilde eri
sebilece
gimizi biliyorsunuz:
import bilgi
lis = [20, 45, 55]
bilgi.arp(lis)
Grd
gnz gibi, bizim tanmlad
gmz eposta, isim ve arp
geleri modlmzn iinde
grnyor. S
imdi bilgi.py adl dosyay ap iine s
yle bir ekleme yapalm:
telefon = "02121231212"
telefon = "02121231212"
def arp(liste):
a = 1
for i in liste:
a = i * a
return a
S
imdi etkile
simli kabukta bu modln ieri
gini tekrar kontrol edelim:
>>> dir(bilgi)
Grd
gnz gibi, modle yeni ekledi
gimiz telefon niteli
gi listede grnmyor. nk eklemeler modle otomatik olarak kaydedilmiyor. S
imdi modlmz tekrar ie aktarmay
deneyelim:
>>> import bilgi
>>>dir(bilgi)
Bu hata mesaj s
yle evrilebilir: NitelikHatas: module nesnesinin telefon adl bir niteli
gi
yok
Halbuki biz bu modle biraz nce telefon adl bir nitelik eklemi
stik...
E
ger bunun gibi durumlarda modlmz tekrar ie aktarmak istersek Pythondaki imp adl bir
modln reload adl fonksiyonundan yararlanmamz gerekir:
>>> import imp
>>> imp.reload(bilgi)
print(__name__)
Daha sonra ba
ska bir bo
s dosyaya s
u satr yazp test.py adyla kaydedelim:
import isim
S
imdi komut satrnda s
u komutu verelim:
python3 isim.py
Bu modl bu haliyle do
grudan al
strld
g zaman herhangi bir kt vermez (dosya adnn deneme.py oldu
gunu varsayyoruz):
python3 deneme.py
S
imdi bu dosyaya s
yle bir ekleme yapalm:
if __name__ == "__main__":
lis = [2, 3, 4]
print("deneme amal hesap i
sleminin sonucu: ", carp(lis))
a = 1
for i in liste:
a = i * a
return a
print(__name__)
if __name__ == "__main__":
lis = [2, 3, 4]
print("deneme amal hesap i
sleminin sonucu: ", carp(lis))
Bylece yazd
gmz modln al
sp al
smad
gn ufak bir kod parasyla test etmi
s olduk. Artk
bu modl gvenle ba
ska programlar iinden a
grabiliriz. Mesela test.py adl bir dosya
olu
sturup s
u kodlar yazmay deneyelim:
import deneme
lst = [20, 10, 30]
print("test.py modlnden a
grlarak yaplan hesap i
sleminin sonucu: ", deneme.carp(lst))
6000
S
yle:
isim = "istihza"
eposta = "kistihza[at]yahoo[nokta]com"
telefon = "02121231212"
def carp(liste):
a = 1
for i in liste:
a = i * a
return a
print("__name__ niteli
ginin de
geri: ", __name__)
if __name__ == "__main__":
lis = [2, 3, 4]
print("deneme amal hesap i
sleminin sonucu: ", carp(lis))
Burada modl ne s
ekilde al
strd
gmza ba
gl olarak __name__ niteli
ginin de
gerinin nasl
de
gi
sti
gine dikkat edin...
BLM
12
Pythonda Dosya Is
lemleri
Burada yapt
gmz s
ey, liste.txt adl dosyay amaktan ibaret. Yalnz biz burada, liste.txt
adl dosyann o anda al
st
gmz dizin iinde oldu
gunu varsaydk. Yani bu dosyann yukardaki
komutla alabilmesi iin s
u komutun ktsnda grnyor olmas lazm:
>>> os.listdir(os.curdir) #ya da os.listdir(os.getcwd())
E
ger bu dosya yukardaki komutun ktsnda grnmyorsa, open() fonksiyonu iinde bu
dosyann tam yolunu belirtmemiz gerekir:
>>> open("/home/istihza/Desktop/liste.txt")
...gibi...
226
Grd
gnz gibi, dosya bulunamad
gnda IOError adl bir hata alyoruz. Yazd
gmz programlarda sklkla bu hatay yakalamamz gerekecektir. Zira dosyalar ile u
gra
st
gmz programlarda,
bir dosyay aarken, ncelikle o dosyann sistemde var olup olmad
gn kontrol etmek iyi bir
yntemdir:
>>> try:
...
open("falanca.txt")
... except IOError:
...
print("Byle bir dosya yok!")
Bylece, e
ger sistemde falanca.txt adl bir dosya bulunmuyorsa, kullanclarmza mantkl
bir hata mesaj gstermi
s oluyoruz.
Pythonda bir dosyay okumak zere nasl aaca
gmz grdk. Ama henz dosyamz okumadk... Peki yukarda gsterildi
gi s
ekilde dosyalar atktan sonra bunlarn ieri
gini nasl
grntleyece
giz?
Okumak zere at
gmz dosyalarn ieri
gini grntlemenin en kolay yolu basit bir for
dngs kurmaktr. Bunu nasl yapaca
gmza bakalm. nce dosyamz ayoruz:
>>> dosya = open("python.txt")
E
ger bilgisayarnzda falanca.txt adl bir dosya varsa, bu komut varolan dosyay aacaktr.
E
ger byle bir dosya yoksa, bu ada sahip yeni bir dosya olu
sturulacaktr. Dolaysyla bu komutu
yeni bir dosya olu
sturmak iin de kullanabilirsiniz.
S
imdi bu falanca.txt adl dosyann iinde ne yazd
gn kontrol edelim:
>>> for satirlar in dosya:
...
print(satirlar)
Grd
gnz gibi, bu write() adl metodu do
grudan dosyann zerine uyguluyoruz...
Bu a
samada nemli bir noktadan bahsetmemiz gerekiyor. Pythonda dosya i
slemleri yaparken
temel olarak s
u a
samay takip etmemiz gerekir:
1. Dosyay amak
2. At
gmz dosya zerinde i
slem yapmak
3. Son olarak da dosyay kapatmak
Biz s
imdiye kadar bu listedeki ilk iki i
slemi yerine getirdik. Yani s
imdiye kadar Pythonla bir
dosyann nasl alaca
gn ve alan bu dosya zerinde nasl i
slem yaplaca
gn inceledik. S
imdi
grenmemiz gereken s
ey dosyay kapatmak olacaktr. Pythonda at
gmz bir dosyay kapatmak iin close() adl ba
ska bir metottan yararlanaca
gz:
>>> dosya.close()
Yukardaki rne
gi basitle
stirerek tekrar grelim:
metin = """Python, pek ok dile kyasla
grenmesi kolay bir programlama
dilidir. Bu yzden, e
ger daha nce hi programlama deneyiminiz olmam
ssa,
programlama maceranza Pythonla ba
slamay tercih edebilirsiniz."""
S
imdi bu de
gi
skeni kullanarak dosya i
slemlerimizi gerekle
stirelim:
>>> dosya = open("falanca.txt", "a")
>>> dosya.write(metin)
>>> dosya.close()
Burada open() adl fonksiyonu kullanarak ncelikle dosyamz atk. Daha sonra write()
metodu yardmyla dosya zerinde bir i
slem yaptk. En son da close() metodunu kullanarak
dosyamz kapattk. E
ger yazd
gmz uygulamalarda, at
gmz bir dosyay kapatmay ihmal
edersek, dosyamz zerinde yapt
gmz son de
gi
siklikler dosyada grnmeyebilir. Ayrca, kulland
gmz i
sletim sisteminin yntemlerini kullanarak (mesela dosyay seip delete tu
suna
basarak) ak olan bir dosyay silmeye al
smak bizi hsrana u
gratacaktr...
Gelin isterseniz bu noktada bir nefes alp, s
imdiye kadar
grendi
gimiz s
eyleri ok ksaca
zetleyelim:
1. Pythonda bir dosyay amak iin open() adl bir fonksiyondan yararlanyoruz.
2. E
ger dosyamz okumak zere aacaksak kip de
gi
stirme harfi olarak ryi kullanyoruz.
3. E
ger niyetimiz dosyaya yazmak ise kullanmamz gereken harf a olacaktr.
4. Bir dosyaya ekleme yapmak iin write() adl bir fonksiyondan yararlanyoruz.
5. zerinde i
slem yapt
gmz bir dosyay kapatmak iin ise close() fonksiyonunu kullanyoruz.
Yukardaki listeyi rneklerle anlatmamz gerekirse...
1:
>>> dosya = open("falanca.txt", "r") #dosyay okuma kipinde atk
2:
>>> dosya = open("falanca.txt", "a") #dosyay yazma kipinde atk
3:
>>> dosya.write("Merhaba Zalim Dnya!") #dosyaya ekleme yaptk
4:
>>> dosya.close() #dosyayla i
simizi bitirip dosyamz kapattk
grendi
gimize gre, Pythonda dosya i
slemleri konusunun ba
ska bir ynn incelemeye
geebiliriz...
Dosyay bu s
ekilde ba
saryla okuyabildik. S
imdi bu dosyay tekrar okumay deneyelim:
Ne oldu? Bo
s bir kt aldk, de
gil mi? Bu gayet normal. nk bir nceki admda dosyay
bir kez sonuna kadar okudu
gumuz iin, ayn dosyay ikinci kez okumaya al
st
gmzda, zaten
dosyann sonuna varm
s olmamzdan tr, Python bize bo
s bir kt verdi... Bunu, sonuna
geldi
gimiz bir kaseti tekrar dinlemeye al
smaya benzetebiliriz (kaset diye bir s
ey vard,
hatrlyorsunuz de
gil mi??).
E
ger sonuna geldi
gimiz bir kaseti tekrar dinlemek istersek, ncelikle bu kaseti ba
sa sarmamz
gerekir. Ayn s
ekilde Pythonda da bir dosyay sonuna kadar okuduktan sonra tekrar okumak istersek bu dosyay ba
sa sarmamz gerekecek. Bu i
s iin seek() adl bir metottan yararlanaca
gz. S
imdi dosyamz ba
sa saralm:
>>> f.seek(0)
S
imdi bu dosyann 10. baytna gidiyoruz:
>>> f.seek(10)
Dedi
gim gibi, bu komut, bizi alp dosyann 10. baytna gtrecektir. Dolaysyla bu komuttan
sonra a
sa
gdaki komutu verecek olursak, Python okumaya 10. bayttan ba
slar:
>>> for i in dosya:
...
print(i)
...
tr
ikinci satr
nc satr
ok kaba bir s
ekilde ifade edecek olursak, o
gunlukla 10. bayt demek 10. karakter demek
gibidir. Mesela yukardaki rnekte seek(10) komutu bizi 10. karakterin ba
sna gtrd... Ama
bunun her zaman byle olmayaca
gn da asla aklmzdan karmyoruz. nk her karakter 1
bayt de
gerinde olmayabilir. Baz karakterler 1den fazla bayttan olu
sur. Dolaysyla 1 bayt =
1 karakter s
eklindeki bir d
snce bizi yanl
s sonulara gtrr.
Dedi
gimiz gibi, seek() fonksiyonunu kullanarak bir metnin herhangi bir baytna gidebiliriz. Peki
o anda bir metnin kanc baytnda oldu
gumuzu nasl
greniriz? Tabii ki tell() adl metodu
kullanarak:
>>> dosya.tell()
Bildi
giniz gibi, biz r harfini kullansak da kullanmasak da Python o harf oraya yazlm
s gibi
davranacaktr...
S
imdi bu dosyamzn ieri
gine bakalm:
>>> for i in f:
...
print(i)
...
birinci satr
ikinci satr
nc satr
>>> print(f.read())
E
ger bu komutun kts bo
s ise, ya amaya al
st
gnz dosya bo
stur, ya da seek(0) metodunu
kullanarak dosyann en ba
sna sarmam
ssnzdr. E
ger dosyann bo
s olmad
gndan eminseniz
s
u komutu vererek dosyay en ba
sa sarn:
>>> seek(0)
S
imdi komutumuzu tekrar verelim:
>>> print(f.read())
birinci satr
ikinci satr
nc satr
Grd
gnz gibi, o anda dosyann hangi noktasnda oldu
gumuza ba
gl olarak dosyann farkl
ksmlar okunuyor... O anda dosyann kanc baytnda oldu
gumuzu
grenmek iin tell() adl
metottan yararlanmamz gerekti
gini biliyoruz:
>>> f.tell()
S
imdiye kadar dosyalarmz hep bir btn olarak okuduk. Ama e
ger istersek, readline() adl
bir metot yardmyla dosyamz satr satr da okuyabiliriz:
>>> print(f.readline())
birinci satr
Grd
gnz gibi bu komutla dosyann btnn bir anda de
gil, sadece ilk satr okuduk. S
imdi
ayn komutu tekrar verelim:
>>> print(f.readline())
ikinci satr
>>> print(f.readline(7))
birinci
Bu metodun kts bir listedir. Bu listede, dosya iindeki btn satrlar tek tek yer alr. Ayrca
dikkat ederseniz satr sonlarna i
saret eden n ka
s dizisi de ktda belirgindir. Elde etti
gimiz
kt bir liste oldu
gu iin, dosyadaki satrlara tek tek eri
sebiliriz:
>>> f.seek(0) #dosyamz ba
sa saralm...
>>> satrlar = f.readlines() #kolay eri
sim iin f.readlines() komutunu de
gi
skene atadk
>>> satrlar[1] #
simdi de tek tek satrlara eri
selim...
ikinci satr\n
>>> satrlar[2]
nc satr\n
>>> satrlar[0]
birinci satr\n
>>> f.close() #e
ger i
simiz bittiyse dosyamz kapatalm
Grd
gnz gibi, readlines() metodu her ko
sulda satr sonuna ula
syor. E
ger parametre
olarak verdi
gimiz say bir satrdan az sayda bayt ieriyorsa sadece bir satr kt olarak veriliyor. E
ger parametredeki say bir satrdaki bayt saysn a
syorsa, bu bayt says ikinci satrn
tamamn kar
slamasa bile, birinci satrla birlikte ikinci satrn tamam da ekrana dklyor...
Bu zelli
gi, bir satrndaki bayt saysn tam olarak bilmedi
giniz, ama dosyann bykl
gnden
tr tamamn da okumak istemedi
giniz dosyalar zerinde kullanabilirsiniz...
Grd
gnz gibi, open() fonksiyonu toplam parametre alyor. Ilk iki parametreyi daha nce
grm
stk. nc parametre olan encoding dosyann karakter kodlamasn belirlememizi
sa
glyor. E
ger biz at
gmz bir dosyada encoding parametresini belirtmezsek, Python otomatik
olarak varsaylan karakter kodlamasn kullanacaktr. encoding parametresini belirtmeden
at
gnz bir dosyann karakter kodlamasn iki s
ekilde
grenebilirsiniz:
1:
>>> dosya.encoding
utf-8
Grd
gnz gibi, yapt
gmz s
ey nceden bildi
gimiz a harfinin sa
gna bir adet b harfi eklemekten ibarettir... Yeni bir ikili dosya olu
sturabilmek iin de yine benzer bir yntem kullanyoruz:
>>> dosya = open("falanca.bin", "wb")
27429
Grd
gnz gibi, Python bu s
ekilde ikili dosya iindeki baytlar do
gal olarak tanyamyor...
Dolaysyla ikili dosyalar aarken, kullanaca
gmz kip de
gi
stirme harfine dikkat etmemiz
gerekiyor.
BLM
13
238
Grd
gnz gibi karakter dizilerinin ok sayda metodu var. Zaten daha nce de dedi
gimiz
gibi, karakter dizileri Python programlama dilinin en gl oldu
gu veri tiplerinden bir tanesidir.
Biz bu blmde, yukardaki liste iinde grnen metotlar arasnda, iinde _ i
sareti barndrmayanlar inceleyece
giz. Yani s
unlar:
>>> for i in dir(""):
...
if "_" not in i:
...
print(i)
...
capitalize
center
count
encode
endswith
expandtabs
find
format
index
isalnum
isalpha
isdecimal
isdigit
isidentifier
islower
isnumeric
isprintable
isspace
istitle
isupper
join
ljust
lower
lstrip
maketrans
partition
replace
rfind
rindex
rjust
rpartition
rsplit
rstrip
split
splitlines
startswith
strip
swapcase
title
translate
upper
zfill
Bu metotlar kar
sk olarak inceleyece
giz ilerleyen sayfalarda... Gelin isterseniz sz daha fazla
uzatmadan ilk metodumuzla ba
slayalm i
se...
Bu rnekten de anlad
gmza gre, tpk listelerde oldu
gu gibi karakter dizilerinde de,
gelerin
srasn belirterek bu
gelere tek tek eri
sebiliyoruz. rne
gin:
>>> kardiz = "python"
>>> kardiz[0] #karakter dizisinin ilk
gesini alyoruz...
p
>>> kardiz[-1] #karakter dizisinin son
gesini alyoruz...
n
>>> len(kardiz) #karakter dizisinin uzunlu
gunu lelim...
6
True
Grd
gnz gibi, karakter dizimiz ! karakteriyle bitti
gi iin yukardaki koddan True kts
aldk. E
ger karakter dizimiz ! karakteriyle bitmeseydi False kts alacaktk.
endswith() diye bir metot olmasayd, ayn i
slevi s
yle de yerine getirebilirdik:
>>> kardiz = "elveda zalim dnya!"
>>> kardiz[-1] == ("!")
True
Grd
gnz gibi, elma karakter dizisi iindeki e harfini a harfine dn
strdk. Ancak
burada nemli bir ayrntya dikkatinizi ekmek isterim. Hatrlarsanz karakter dizilerinden
ilk kez bahsetti
gimiz blmde, karakter dizilerinin de
gi
stirilemeyen (immutable) veri tipleri oldu
gunu sylemi
stik. Bu zellik burada da kar
smza kyor. Mesela yukardaki rnekte
elma karakter dizisi zerinde de
gi
siklik yapm
s gibi grnsek de, aslnda karakter dizisinde
herhangi bir de
gi
siklik olmad. Bunu s
u s
ekilde test edebiliriz:
>>> print(kardiz)
elma
Grd
gnz gibi, karakter dizimiz, replace() metoduyla e harfini a harfine dn
strm
s
olmamza ra
gmen oldu
gu gibi duruyor. I
ste bunun nedeni karakter dizilerinin de
gi
stirilemeyen
bir yapda olmasdr. Elbette bu kstlamay da a
smann bir yolu var:
>>> kardiz = kardiz.replace("e", "a")
>>> print(kardiz)
alma
Burada yapt
gmz s
ey, yeni verileri kardiz adl karakter dizisinin zerine yazmaktan ibarettir... Yani biz burada kardizin de
gi
stirilmi
s halini tekrar kardizin kendisine atyoruz. Bylece
sonu olarak karakter dizimiz zerinde de
gi
siklik yapm
s oluyoruz. Karakter dizilerinin de
gi
stirilemez olu
su olduka nemli bir konudur. Yazd
gmz kodlarn bekledi
gimiz s
ekilde al
sabilmesi
iin karakter dizilerinin bu zelli
gini mutlaka gz nnde bulundurmamz gerekir.
Sizlere kolaylk olmas asndan bu replace() metodunun formln de verelim:
karakter_dizisi.replace(eski_karakter, yeni_karakter)
Grd
gnz gibi, bu metodun kullanm teki metotlardan biraz farkl gibi grnyor. Ama
aslnda tekilerden pek bir fark yoktur. Metodu nasl kulland
gmza dikkat edin. Sanrm s
yle
bir rnek daha verirsek baz noktalar birazck aydnlatm
s oluruz:
>>> ", ".join(liste)
bugn, gnlerden, pazar
Bu rnekten de anlad
gmz gibi, join() metodu listedeki btn karakter dizilerini alyor, her
bir karakter dizisinin arasna , i
saretini yerle
stiriyor ve bu karakter dizilerini tek bir karakter
dizisi olarak birle
stiriyor.
Hatrlarsanz Genel Tekrar blmnde bu join() metoduyla ilgili olarak s
yle bir rnek vermi
stik:
>>> liste = ["elma", "armut", "kebap"]
>>> print(", ".join(liste))
elma, armut, kebap
Artk bu rne
gin nasl al
st
gn anlayabiliyoruz. Burada listemizin btn
gelerini alp her
bir
geyi tek bir karakter dizisi halinde birle
stirdik. Bu
geleri birle
stirirken de her bir
genin
arasna bir , i
sareti koyduk... Elbette e
ger istersek biz bu
geleri istedi
gimiz ba
ska bir i
saretle
de birle
stirebiliriz. Mesela:
>>> liste = ["elma", "armut", "kebap"]
>>> print(" -- ".join(liste))
elma -- armut -- kebap
E
ger karakter dizisinin tamamn tek bir liste halinde almak isterseniz s
yle bir kod kullanabilirsiniz:
>>> kardiz.split(",")
[gzel gnler grece
giz]
Elbette, split() metoduna argman olarak yalnzca virgl (,) vermek zorunda de
giliz:
>>> kardiz.split("g")
[, zel , nler , rece
giz]
S
yle bir rnek daha vererek bu metot hakkndaki bilgimizi peki
stirelim:
>>> site = "www.istihza.com"
>>> site.split(".")
[www, istihza, com]
Burada metodumuz, site adl karakter dizisi zerine sadece 1 kez blme i
slemi uygulad.
Buna gre, www ksmn bldkten sonra geri kalan ksm tek bir
ge olarak liste iine dahil
etti.
Bu rnekte ikisi arasndaki fark pek belli olmasa da, aslnda split() metodu karakter dizisini
soldan sa
ga do
gru okurken, rsplit() metodu sa
gdan sola do
gru okuyor. S
imdi daha ak bir
rnek verelim:
>>> site.split(".", 1)
[www, istihza.com]
Grd
gnz gibi, rstrip() metodu karakter dizisini sa
gdan sola do
gru okuyup, tek bir blme
i
slemi yaparak, sitenin com ksmn tek ba
sna, www.istihza ksmn ise birlikte tek bir
ge
olarak liste haline getirdi...
Bu metodun,
Grd
gnz gibi, bu metot yukardaki karakter dizisinin ba
sndaki ve sonundaki \n ve \t
ka
s dizilerini krpt. Bu metot ayn zamanda ba
staki ve sondaki bo
sluklar da siler:
>>> kardiz = " Vicdansz Sabuha "
>>> kardiz.strip()
Vicdansz Sabuha
E
ger bu metodu baz parametrelerle kullanrsak daha farkl bir sonu elde ederiz:
>>> kardiz = "Vicdansz Sabuha"
>>> kardiz.strip("ha")
Vicdansz Sabu
Burada strip() metodu, karakter dizimizin en sonunda yer alan ha harflerini sildi. E
ger bu
karakter dizisinin ba
snda da ha harfleri olsayd onlar da gidecekti...
>>> kardiz = "hayrsz Sabuha"
>>> kardiz.strip("ha")
yrsz Sabu
Hatta s
yle bir s
ey dahi mmkndr:
>>> kardiz.strip("ahy")
rsz Sabu
Bu rnekte do
gal olarak strip() metodu karakter dizisinin her iki tarafn da krpyordu. S
imdi
ayn rne
gi lstrip() ile yapalm:
>>> kardiz == "hayrsz Sabuha"
>>> kardiz.lstrip("ha")
yrsz Sabuha
Grd
gnz gibi, lstrip() metodu karakter dizisinin sadece ba
s tarafyla ilgilendi, son ksma
hi dokunmad.
Grd
gnz gibi, lstrip() metodunun aksine rstrip() metodu karakter dizisinin sadece son
tarafyla ilgilendi, ba
s tarafa hi ili
smedi.
Grd
gnz gibi, karakter dizimizin yalnzca ilk harfini bytt bu capitalize() adl metot...
Bu metodu (ve tabii ki teki btn metotlar) istersek do
grudan karakter dizisinin zerine de
uygulayabiliriz:
>>> "ilek".capitalize()
ilek
Bu arada, grd
gnz gibi bu metot Trke harfleri bytmekte zorlanmad. Ancak bunun
bir istisnas vardr. Bu metodun (ve birka ba
ska metodun) anla
samad
g tek bir Trke harf
bulunur: i harfi. Sorunu kendi gzlerinizle grn:
>>> a = "i
sletim sistemi"
>>> a.capitalize()
I
sletim sistemi
Bu metot, grd
gnz gibi, capitalize metodunun aksine karakter dizisinin sadece ilk harfini
bytmekle yetinmedi... Elbette bu metodu istersek do
grudan karakter dizisi zerine de uygulayabiliriz:
>>> "python programlama dili".title()
Python Programlama Dili
Grd
gnz gibi, tamam kk olan harfler, bu metot yardmyla tamam byk olacak s
ekilde
de
gi
sti. Bir de s
una bakalm:
>>> a = "PYTHON PROGRAMLAMA"
>>> a.swapcase()
python programlama
swapcase() metodu normal olarak grevini yerine getirdi ve byk harfleri kk harfe, kk
harfleri de byk harfe evirdi...
Bu metodun da i harfiyle sorunu oldu
gunu tahmin etmi
ssinizdir. Burada da kendi zmlerinizi kendiniz retebilirsiniz:
def tr_swapcase(kardiz):
"""Bir karakter dizisi iindeki byk-kk harfleri de
gi
stirir."""
depo = []
for elem in kardiz:
if "i" not in elem:
depo.append(elem.swapcase())
elif "i" in elem and elem.islower():
elem = elem.replace("i", "
I")
depo.append(elem.upper())
else:
depo.append(elem.lower())
return "".join(depo)
Grd
gnz gibi, e
ger karakter dizisi iindeki btn kelimelerin ilk harfleri bykse istitle()
metodu True kts veriyor. Aksi bir durumda ise False kts alyoruz...
Burada olan s
ey s
u: ljust() metodu, kendisine verilen 10 parametresinin etkisiyle 10 karakterlik bir alan olu
sturuyor. Bu 10 karakterlik alann iine nce 6 karakterlik yer kaplayan tel
no ifadesini, geri kalan 4 karakterlik bo
slu
ga ise . karakterini yerle
stiriyor. E
ger ljust()
metoduna verilen say karakter dizisinin uzunlu
gundan az yer tutarsa, karakter dizisinin
grn
snde herhangi bir de
gi
siklik olmayacaktr. rne
gin yukardaki rnekte karakter dizimizin uzunlu
gu 6. Dolaysyla kodumuzu s
u s
ekilde yazarsak bir sonu elde edemeyiz:
Grd
gnz gibi, karakter dizisinde herhangi bir de
gi
siklik olmad. ljust() metoduna
verdi
gimiz . karakterini grebilmemiz iin, verdi
gimiz say cinsli parametrenin en az karakter
dizisinin boyunun bir fazlas olmas gerekir:
>>> kardiz.ljust(7, ".")
tel no.
Grd
gnz gibi, bu metot karakter dizilerini s
k bir biimde sola hizalamamza yardmc
oluyor...
elma
armut
patlcan
grenece
giz:
count() metodu ilave olarak bir parametre daha alr. rnek zerinden aklamaya al
salm:
>>> kardiz.count("a", 0)
2
Burada 0 kts almamzn nedeni, karakter dizisinin 5. srasndan sonra herhangi bir a
harfinin bulunmamasdr.
Bu metot, arad
gmz harfin sadece ilk geti
gi sray verecektir. rne
gin yukardaki karakter
dizisinde a harfi iki kez geiyor. Ancak find() metodu yalnzca ilk a harfinin srasn syler:
>>> kardiz.find("a")
1
E
ger ikinci a harfinin srasn
grenmek isterseniz find() metodunu s
u s
ekilde kullanabilirsiniz:
>>> kardiz.find("a", 2)
3
Grd
gnz gibi, find() metoduna say de
gerli bir parametre vererek, bir harfin karakter
dizisi iindeki kanc tekrarn almak istedi
gimizi belirtebiliyoruz.
E
ger find() metodunu kullanarak, bir harfin geti
gi btn sra numaralarn almak isterseniz
s
yle bir s
ey yazabilirsiniz:
>>> for i in range(1, kardiz.count("a")+1):
...
print(kardiz.find("a", i))
...
1
3
E
ger find() metodu arad
gn karakteri bulamazsa -1 kts verecektir:
>>> kardiz.find("j")
-1
Grd
gnz gibi, bu metot ilk a harfini de
gil, ikinci a harfini verdi.
Bu metot da tpk find() metodu gibi, e
ger arad
gnz karakteri bulamazsa -1 kts verecektir...
E
ger bu metoda herhangi bir say de
gerli parametre verecek olursanz, s
yle bir kt alrsnz:
>>> kardiz.splitlines(1)
[birinci satr.\n, ikinci satr.\n, nc satr.\n, drdnc satr]
Ama:
>>> b = "k3zb6n"
>>> b.isalpha()
False
>>> a = "12345"
Ama s
u karakter dizisi saysal de
gildir:
>>> b = "123445b"
E
ger denetleme sonucunda True alyorsak, o karakter dizisi alfanmeriktir.
bakalm:
Bir de s
una
>>> b = "123abc>"
>>> b.isalnum()
False
b de
gi
skeninin tuttu
gu karakter dizisinde alfanmerik karakterlerin yansra (123abc), alfanmerik olmayan bir karakter dizisi de bulundu
gu iin (>), b.isalnum() s
eklinde gsterdi
gimiz denetlemenin sonucu False (yanl
s) olarak grnecektir.
Dolaysyla, bir karakter dizisi iinde en az bir adet alfanmerik olmayan bir karakter dizisi
bulunursa (bizim rne
gimizde <), o karakter dizisi alfanmerik olmayacaktr.
Ama s
u ise kayan noktal (floating-point) say cinsinden bir karakter dizisidir:
>>> a = "123.3"
>>> a.isdecimal()
False
Dedi
gimiz gibi, de
gi
skenler birer tanmlaycdr. Dolaysyla bir de
gi
sken adnn geerli olup
olmad
gn isidentifier() metodu yardmyla denetleyebiliriz:
>>> "1a".isidentifier()
False
Demek ki 1a ifadesini herhangi bir tanmlayc ad olarak kullanamyoruz. Yani bu ada sahip
bir de
gi
sken, fonksiyon ad veya modl ad olu
sturamyoruz. Ama mesela liste1 ifadesi
geerli bir tanmlaycdr. Hemen denetleyelim:
>>> "liste1".isidentifier()
True
>>> "dasd".isnumeric()
False
"
True
inde bo
>>> a = "" #karakter dizimiz tamamen bo
s. I
sluk karakteri bile yok...
>>> a.isspace()
False
>>> a = "fd"
>>> a.isspace()
False
Bu metodu s
yle bir i
s iin kullanabilirsiniz:
>>> for i in range(11):
...
print(str(i).zfill(2))
00
01
02
03
04
05
06
07
08
09
10
>>> a = "istanbul"
>>> a.partition("an")
(istanbul, , )
Grd
gnz gibi, partition() metodu karakter dizisini ilk i harfinden bld. S
imdi ayn
i
slemi rpartition() metodu ile yapalm:
>>> b.rpartition("i")
(ist, i, hza)
Grd
gnz gibi, partition() metodu bo
s karakter dizilerini sa
ga do
gru yaslarken,
rpartition() metodu sola do
gru yaslad.
szlk = {"a":"0",
"b":"1",
"c":"2",
"":"3",
"d":"4",
"e":"5",
"f":"6",
"g":"7",
"
g":"8",
"h":"9",
"":"a",
"i":"b",
"j":"c",
"k":"",
"l":"d",
"m":"e",
"n":"f",
"o":"g",
"":"h",
"p":"",
"r":"i",
"s":"j",
"
s":"k",
"t":"l",
"u":"m",
"":"n",
"v":"o",
"y":"",
"z":"p",
" ":" "}
kardiz = "python programlama dili"
ifreli = ""
s
for i in kardiz:
sifreli =
sifreli + szlk[i]
print(
sifreli)
Bu kodu al
strd
gmz zaman s
yle bir kt alrz:
l9gf ig7i0ed0e0 4bdb
Aslnda bu ktda python programlama dili yazyor. Biz yukardaki kodlar yardmyla karakter
dizimizi s
ifreledik. Python, yazd
gmz szl
g temel alarak p harfi grd
g yere harfini;
y harfi grd
g yere harfini, t grd
g yere l harfini... yerle
stiriyor. Bylece karakter
dizimizin plak gzle anla
slmasn engelleyecek bir kt veriyor bize. Isterseniz yukardaki
kodlar bir fonksiyon olarak tanmlayp ok daha verimli bir hale getirebiliriz:
szlk = {"a":"0",
"b":"1",
"c":"2",
"":"3",
"d":"4",
"e":"5",
"f":"6",
"g":"7",
"
g":"8",
"h":"9",
"":"a",
"i":"b",
"j":"c",
"k":"",
"l":"d",
"m":"e",
"n":"f",
"o":"g",
"":"
g",
"p":"h",
"r":"",
"s":"i",
"
s":"j",
"t":"k",
"u":"l",
"":"m",
"v":"n",
"y":"o",
"z":"",
" ":" "}
def sifrele(kardiz):
sifreli = ""
for i in kardiz:
sifreli =
sifreli + szlk[i]
return
sifreli
print(sifrele("python programlama dili"))
Burada yapt
gmz s
ey ok basit. ncelikle kaynak_dizi adnda bir karakter dizisi olu
sturduk.
Amacmz bir karakter dizisi iindeki karakterleri ba
ska karakterlere dn
strmek. I
ste bu kay-
nak_dizi adl karakter dizisi zgn kaynak dizimizin karakterlerini temsil ediyor. Alt satrdaki
hedef_dizi adl karakter dizisi ise, kaynak dizi iindeki karakterlerin dn
strlece
gi karakterleri gsteriyor. Bu iki karakter dizisini, bir stteki kodlarda szlk halinde yazm
stk. Buradaki kaynak_dizi adl karakter dizisi bir nceki kodlardaki szl
gn anahtarlarnn (keys),
hedef_dizi adl karakter dizisi ise szl
gn de
gerlerinin (values) yerini tutuyor.
Karakter dizilerimizi tanmladktan sonra str.maketrans() metodunu kullanarak bir eviri
nesnesi olu
sturaca
gz. Olu
sturaca
gmz bu eviri nesnesi, biraz nce tanmlad
gmz kaynak_dizi ve hedef_dizi adl karakter dizilerinin
gelerini birbiriyle e
sle
stirme vazifesi grecek. Zaten str.maketrans(kaynak_dizi, hedef_dizi) satr bu vazifeyi gzler nne seriyor...
Bu arada maketrans() metodunu, teki metotlardan farkl olarak str.maketrans() s
eklinde
kulland
gmza zellikle dikkat edin.
Hemen ardndan eviri i
slemine tabi tutaca
gmz karakter dizimizi yazdk. Bu karakter dizimiz
python programlama dili.
Daha sonra da sonu adl bir de
gi
sken iinde translate() metodundan faydalanarak
yukarda olu
sturdu
gumuz eviri_nesnesini bu metoda argman olarak veriyoruz. Bu metot,
kardiz adl karakter dizisini alp, yukarda eviri_nesnesi iinde belirledi
gimiz formle gre
eviri i
slemine tabi tutuyor ve ortaya s
ifrelenmi
s bir karakter dizisi karyor...
Esasnda bu yntem Pythonun 3.x srmnde de geerlidir. Yani yukardaki yntemi kullanarak hl karakter dizilerini biimlendirebiliriz. Ancak bu yntem artk eskimi
s olarak kabul
ediliyor ve yerini yava
s yava
s format() metoduna brakyor. Dolaysyla yeni yazd
gnz kodlarda % i
sareti yerine format() metodunu kullanmanz s
iddetle tavsiye edilir...
Gelelim bu metodun ayrntlarna...
Temel olarak format() metodunu nasl kullanaca
gmz biliyoruz. Basit bir rnek verelim:
>>> zaman = "Cumartesi"
>>> "Seninle {0} gn bulu
salm".format(zaman)
Seninle Cumartesi gn bulu
salm
Pythonun 3.0 srmnde, yukardaki kodlarda grnen {} alanlar iine mutlaka sra belirten
bir say yazmamz gerekiyordu. Ancak Pythonun 3.1 srmyle birlikte bu zorunluluk ortadan kaldrld. Yani Python 3.1den itibaren artk yukardaki kodlar s
yle de yazma imkanna
sahibiz:
>>> "Senin {} gn saat {}da bulu
salm".format(zaman, saat)
E
ger istersek yine {} iinde say belirtmekte zgrz. Ama artk bu bir zorunluluk de
gil...
Ama format() metodu iinde belirtilen parametrelerin do
gal srasn bozacaksak, sayy belirtmemiz gerekir:
>>> "{1} {0}yi seviyor!".format("Ali", "Ay
se")
Ay
se Aliyi seviyor!
format() metodu en basit haliyle yukardaki gibidir. Ancak bu metot bize ok daha geli
smi
s
zellikler de sunar. S
u rne
ge bir bakalm:
>>>
>>>
>>>
>>>
Grd
gnz gibi, {} alan iinde liste
gelerini dilimleme imkanna da sahibiz... Yukardaki
kodlar s
yle de yazabiliriz:
>>> "listenin ilk
gesi
sudur :", liste[0]
>>> "listenin ikinci
gesi
sudur :", liste[1]
>>> "listenin nc
gesi
sudur :", liste[2]
Burada {} alan iinde isim kullanarak kullanm daha kolay bir yap olu
sturdu
gumuza dikkat
edin.