Kapak: Levent Güler
Python 3 için Türkçe Kılavuz
Sürüm 3
Yazan: Fırat Özgül
30.08.2018
İÇİNDEKİLER
1
Bu Kitap Hakkında
1
1.1
Bu Kitabı Nereden İndirebilirim?
1
1.2
Bu Kitaptan Nasıl Yararlanabilirim?
1
1.3
Nereden Yardım Alabilirim?
2
1.4
Projeye Nasıl Yardımcı Olabilirim?
2
1.5
Kullanım Koşulları
2
2
Python Hakkında
4
2.1
Python Nedir?
4
2.2
Neden Programlama Öğrenmek İsteyeyim?
4
2.3
Neden Python?
5
2.4
Python Nasıl Telaffuz Edilir?
6
2.5
Platform Desteği
6
2.6
Farklı Python Sürümleri
6
2.7
Hangi Seriyi Öğrenmeliyim?
7
3
Python Nasıl Kurulur?
8
3.1
GNU/Linux Kullanıcıları
8
3.2
Windows Kullanıcıları
13
3.3
Python Kurulum ve Çalışma Dizini
14
4
Python Nasıl Çalıştırılır?
15
4.1
GNU/Linux Kullanıcıları
15
4.2
Windows Kullanıcıları
20
4.3
Hangi Komut Hangi Sürümü Çalıştırıyor? . .
22
4.4
Sistem Komut Satırı ve Python Komut Satırı
22
5
Etkileşimli Python
24
5.1
Etkileşimli Kabukta İlk Adımlar
25
5.2
Etkileşimli Kabuğun Hafızası
48
6
print() Fonksiyonu
50
6.1
Nedir, Ne İşe Yarar?
50
6.2
Nasıl Kullanılır?
51
6.3
Bir Fonksiyon Olarak print()
55
6.4
print() Fonksiyonunun Parametreleri
56
6.5
Birkaç Pratik Bilgi
66
i
7
Kaçış Dizileri
74
7.1
Ters Taksim (\)
76
7.2
Satır Başı (\n)
78
7.3
Sekme (\t)
81
7.4
Zil Sesi (\a)
82
7.5
Aynı Satır Başı (\r)
83
7.6
Düşey Sekme (\v)
84
7.7
İmleç Kaydırma (\b)
84
7.8
Küçük Unicode (\u)
85
7.9
Büyük Unicode (\U)
86
7.10
Uzun Ad (\N)
87
7.11
Onaltılı Karakter (\x)
88
7.12
Etkisizleştirme (r)
89
7.13
Sayfa Başı (\f)
91
7.14
Kaçış Dizilerine Toplu Bakış
92
8
Programları Kaydetme ve Çalıştırma
93
8.1
GNU/Linux
93
8.2
Windows
95
9
Çalışma Ortamı Tavsiyesi
97
9.1
Windows Kullanıcıları
97
9.2
GNU/Linux Kullanıcıları
99
9.3
Metin Düzenleyici Ayarları
99
9.4
MS-DOS Komut Satırı Ayarları
101
9.5
Program Örnekleri
101
10
Yorum ve Açıklama Cümleleri
105
10.1
Yorum İşareti
106
10.2
Yorum İşaretinin Farklı Kullanımları .
107
11
Kullanıcıdan Bilgi Almak
110
11.1
input() Fonksiyonu
110
11.2
Tip Dönüşümleri
113
11.3
eval() ve exec() Fonksiyonları
124
11.4
format() Metodu
128
12
Koşullu Durumlar
134
12.1
Koşul Deyimleri
135
12.2
Örnek Uygulama
146
13
İşleçler
148
13.1
Aritmetik İşleçler
148
13.2
Karşılaştırma İşleçleri
154
13.3
Bool İşleçleri
155
13.4
Değer Atama İşleçleri
163
13.5
Aitlik İşleçleri
166
13.6
Kimlik İşleçleri
167
13.7
Uygulama Örnekleri
170
14
Döngüler (Loops)
181
14.1
while Döngüsü
182
14.2
for Döngüsü
189
ii
14.3
İlgili Araçlar
195
14.4
Örnek Uygulamalar
202
15
Hata Yakalama
214
15.1
Hata Türleri
215
15.2
try... except
217
15.3
try... except... as
220
15.4
try... except... else
221
15.5
try... except... 1nally
223
15.6
raise
223
15.7
Bütün Hataları Yakalamak
224
15.8
Örnek Uygulama
225
16
Karakter Dizileri
227
16.1
Karakter Dizilerinin Öğelerine Erişmek
228
16.2
Karakter Dizilerini Dilimlemek
235
16.3
Karakter Dizilerini Ters Çevirmek
237
16.4
Karakter Dizilerini Alfabe Sırasına Dizmek .
239
16.5
Karakter Dizileri Üzerinde Değişiklik Yapmak .
241
16.6
Üç Önemli Fonksiyon
245
16.7
Notlar
251
17
Karakter Dizilerinin Metotları
253
17.1
replace()
253
17.2
split(), rsplit(), splitlines()
255
17.3
lower()
261
17.4
upper()
264
17.5
islower(), isupper()
266
17.6
endswith()
267
17.7
startswith()
268
18
Karakter Dizilerinin Metotları (Devamı)
270
18.1
capitalize()
270
18.2
title()
272
18.3
swapcase()
275
18.4
casefold()
276
18.5
strip(), lstrip(), rstrip()
276
18.6
join()
279
18.7
count()
281
18.8
index(), rindex()
285
18.9
1nd, r1nd()
288
18.10 center()
289
18.11 rjust(), ljust()
290
18.12 z1ll()
291
18.13 partition(), rpartition()
292
18.14 encode()
293
18.15 expandtabs()
293
19
Karakter Dizilerinin Metotları (Devamı)
294
19.1
str.maketrans(), translate()
294
19.2
isalpha()
305
19.3
isdigit()
306
iii
19.4
isalnum()
306
19.5
isdecimal()
307
19.6
isidenti1er()
307
19.7
isnumeric()
307
19.8
isspace()
308
19.9
isprintable()
308
20
Karakter Dizilerini Biçimlendirmek
310
20.1
% İşareti ile Biçimlendirme (Eski Yöntem)
312
20.2
format() Metodu ile Biçimlendirme (Yeni Yöntem) .
324
21
f-string
333
21.1
Kullanım
333
22
Listeler ve Demetler
336
22.1
Listeler
337
22.2
Demetler
371
23
Listelerin ve Demetlerin Metotları
376
23.1
Listelerin Metotları
376
23.2
Demetlerin Metotları
387
24
Sayma Sistemleri
389
24.1
Onlu Sayma Sistemi
389
24.2
Sekizli Sayma Sistemi
390
24.3
On Altılı Sayma Sistemi
392
24.4
İkili Sayma Sistemi
394
24.5
Sayma Sistemlerini Birbirine Dönüştürme
395
24.6
Sayma Sistemlerinin Birbirlerine Karşı Avantajları .
398
25
Sayılar
400
25.1
Sayıların Metotları
401
25.2
Aritmetik Fonksiyonlar
404
26
Temel Dosya İşlemleri
408
26.1
Dosya Oluşturmak
408
26.2
Dosyaya Yazmak
409
26.3
Dosya Okumak
411
26.4
Dosyaları Otomatik Kapatma
413
26.5
Dosyayı İleri-Geri Sarmak
414
26.6
Dosyalarda Değişiklik Yapmak
416
26.7
Dosyaya Erişme Kipleri
420
27
Dosyaların Metot ve Nitelikleri
423
27.1
closed Niteliği
423
27.2
readable() Metodu
423
27.3
writable() Metodu
424
27.4
truncate() Metodu
424
27.5
mode Niteliği
425
27.6
name Niteliği
426
27.7
encoding Niteliği
426
28
İkili (Binary) Dosyalar
427
iv
28.1
İkili Dosyalarla Örnekler
428
29
Basit bir İletişim Modeli
436
29.1
8 Bitlik bir Sistem
436
29.2
Hata Kontrolü
438
29.3
Karakterlerin Temsili
440
30
Karakter Kodlama (Character Encoding)
443
30.1
Giriş
443
30.2
ASCII
446
30.3
UNICODE
453
30.4
Konu ile ilgili Fonksiyonlar
462
31
Baytlar (Bytes) ve Bayt Dizileri (Bytearrays)
467
31.1
Giriş
467
31.2
Eskisi ve Yenisi
469
31.3
Bayt Tanımlamak
470
31.4
bytes() Fonksiyonu
471
31.5
Baytların Metotları
471
31.6
Bayt Dizileri
473
31.7
Bayt Dizilerinin Metotları
474
32
Sözlükler
476
32.1
Sözlük Tanımlamak
477
32.2
Sözlük Öğelerine Erişmek
478
32.3
Sözlüklerin Yapısı
482
32.4
Sözlüklere Öğe Eklemek
485
32.5
Sözlük Öğeleri Üzerinde Değişiklik Yapmak
488
32.6
Sözlük Üreteçleri (Dictionary Comprehensions)
488
33
Sözlüklerin Metotları
490
33.1
keys()
490
33.2
values()
491
33.3
items()
492
33.4
get()
493
33.5
clear()
494
33.6
copy()
495
33.7
fromkeys()
496
33.8
pop()
497
33.9
popitem()
497
33.10 setdefault()
498
33.11 update()
498
34
Kümeler ve Dondurulmuş Kümeler
500
34.1
Kümeler
500
34.2
Dondurulmuş Kümeler (Frozenset)
516
35
Fonksiyonlar
517
35.1
Fonksiyon Nedir ve Ne İşe Yarar?
517
35.2
Fonksiyon Tanımlamak ve Çağırmak
521
35.3
Fonksiyonların Yapısı
525
35.4
Fonksiyonlar Ne İşe Yarar?
528
35.5
Parametreler ve Argümanlar
532
v
35.6
return Deyimi
541
35.7
Örnek bir Uygulama
543
35.8
Fonksiyonların Kapsamı ve global Deyimi
547
36
Gömülü Fonksiyonlar
552
36.1
abs()
552
36.2
round()
553
36.3
all()
554
36.4
any()
555
36.5
ascii()
556
36.6
repr()
557
36.7
bool()
558
36.8
bin()
558
36.9
bytes()
558
36.10 bytearray()
561
36.11 chr()
562
36.12 list()
562
36.13 set()
563
36.14 tuple()
563
36.15 frozenset()
563
36.16 complex()
564
36.172oat()
564
36.18 int()
564
36.19 str()
565
36.20 dict()
566
36.21 callable()
567
36.22 ord()
567
36.23 oct()
567
36.24 hex()
567
36.25 eval(), exec(), globals(), locals(), compile() .
568
36.26 copyright()
571
36.27 credits()
572
36.28 license()
572
36.29 dir()
572
36.30 divmod()
572
36.31 enumerate()
573
36.32 exit()
574
36.33 help()
574
36.34 id()
575
36.35 input()
576
36.36 format()
576
36.371lter()
576
36.38 hash()
579
36.39 isinstance()
579
36.40 len()
580
36.41 map()
580
36.42 max()
581
36.43 min()
583
36.44 open()
583
36.45 pow()
587
36.46 print()
588
vi
36.47 quit()
588
36.48 range()
589
36.49 reversed()
591
36.50 sorted()
591
36.51 slice()
597
36.52 sum()
598
36.53 type()
599
36.54 zip()
599
36.55 vars()
600
37
İleri Düzey Fonksiyonlar
602
37.1
Lambda Fonksiyonları
602
37.2
Özyinelemeli (Recursive) Fonksiyonlar
606
38
Modüller
619
38.1
Modül Nedir?
619
38.2
Hazır Modüller
621
38.3
Modüllerin İçe Aktarılması
622
38.4
Kendi Tanımladığımız Modüller . .
630
38.5
Üçüncü Şahıs Modülleri
638
38.6
__all__ Listesi
640
38.7
Modüllerin Özel Nitelikleri
642
39
Nesne Tabanlı Programlama (OOP)
652
39.1
Giriş
652
39.2
Sını2ar
653
39.3
Sını2ar Ne İşe Yarar?
654
39.4
Sınıf Tanımlamak
662
39.5
Sınıf Nitelikleri
663
39.6
Sını2arın Örneklenmesi
665
39.7
Örnek Nitelikleri
671
39.8
__init__ Fonksiyonu ve self
671
39.9
Örnek Metotları
677
40
Nesne Tabanlı Programlama (Devamı)
684
40.1
Sınıf Metotları
684
40.2
@classmethod Bezeyicisi ve cls . .
689
40.3
Alternatif İnşacılar
692
40.4
Statik Metotlar
701
40.5
@staticmethod Bezeyicisi
701
41
Nesne Tabanlı Programlama (Devamı)
705
41.1
Nesneler
705
41.2
Nesne Nedir?
705
41.3
Basit Bir Oyun
707
41.4
Her Şey Bir Nesnedir
717
41.5
Birinci Sınıf Öğeler
718
42
Nesne Tabanlı Programlama (Devamı)
721
42.1
Sınıf Üyeleri
721
42.2
@property Bezeyicisi
731
43
Nesne Tabanlı Programlama (Devamı)
742
vii
43.1
Miras Alma
742
43.2
Taban Sını2ar
744
43.3
Alt Sını2ar
746
43.4
Miras Alma Türleri
748
43.5
super()
754
43.6
object Sınıfı
757
44
Nesne Tabanlı Programlama (Devamı)
760
44.1
Tkinter Hakkında
760
44.2
Prosedürel Bir Örnek
761
44.3
Sını2ı Bir Örnek
766
44.4
Çoklu Miras Alma
768
44.5
Dahil Etme
771
45
Nesne Tabanlı Programlama (Devamı)
773
45.1
İnşa, İlklendirme ve Sonlandırma
773
46
Paketler
775
46.1
Paket Nedir?
775
46.2
Paket Türleri
776
46.3
Paketlerin İçe Aktarılması
778
46.4
Kendi Oluşturduğumuz Paketler
781
47
Düzenli İfadeler
790
47.1
Düzenli İfadelerin Metotları
791
47.2
Metakarakterler
798
47.3
Eşleşme Nesnelerinin Metotları .
814
47.4
Özel Diziler
816
47.5
Düzenli İfadelerin Derlenmesi . .
818
47.6
Düzenli İfadelerle Metin/Karakter Dizisi Değiştirme İşlemleri
820
47.7
Sonuç
824
48
Sqlite ile Veritabanı Programlama
825
48.1
Giriş
825
48.2
Neden Sqlite?
825
48.3
Sqlite’ın Yapısı
826
48.4
Yardımcı Araçlar
827
48.5
Yeni Bir Veritabanı Oluşturmak .
828
48.6
Varolan Bir Veritabanıyla Bağlantı Kurmak
830
48.7
İmleç Oluşturma
830
48.8
Tablo Oluşturma
831
48.9
Şartlı Tablo Oluşturma
832
48.10 Tabloya Veri Girme
833
48.11 Verilerin Veritabanına İşlenmesi .
834
48.12 Veritabanının Kapatılması
835
48.13 Parametreli Sorgular
836
48.14 Tablodaki Verileri Seçmek
837
48.15 Seçilen Verileri Almak
838
48.16 Veri Süzme
843
48.17 Veritabanı Güvenliği
844
48.18 Bölüm Soruları
849
viii
49
Önemli Standart Kütüphane Modülleri
851
49.1
os Modülü
851
49.2
sys Modülü
869
49.3
random Modülü
881
49.4
datetime Modülü
885
49.5
time Modülü
896
49.6
json Modülü
900
49.7
sched modülü
903
49.8
threading Modülü . .
906
49.9
timeit Modülü
939
49.10 curses Modülü
945
50
Üçüncü Taraf Modüller
974
50.1
django Paketi
974
51
Katkıda Bulunanlar
978
51.1
Barbaros Akkurt . .
979
51.2
Şebnem Duyar
980
51.3
Onur Eker
980
51.4
Emre Erözgün
980
51.5
Tayfun Yaşar
980
51.6
Metin Hırçın
980
51.7
Ahmet Öztekin
980
51.8
Mesut İdiz
981
51.9
Levent Civa
981
51.10 Fırat Ekinci
981
51.11 Talha Kesler
981
51.12 Ömer Gök
981
51.13 Yunus Emre Bulut
981
51.14 Erhan Paşaoğlu . .
981
51.15 Cemre Efe Karakaş
982
51.16 Salim Yıldırım
982
51.17 Çağatay Genlik
982
51.18 Valeh Asadlı
982
51.19 Halit Turan Arıcan .
982
51.20 Levent Güler
982
51.21 Yaşar Celep
983
51.22 Uğur Uyar
983
51.23 Serdar Çağlar
983
51.24 Ahmet Onur Yıldırım
983
51.25 Anıl İlginoğlu
984
51.26 Hüseyin Ulaş Yeltürk
984
51.27 Nuri Acar
984
51.28 Azat Fırat Çimen
984
51.29 Aykut Kardaş
984
51.30 Sezer Bozkır
984
51.31 Alican Uzunhan
984
51.32 Özgür Özer
985
51.33 Kerim Yıldız
985
51.34 Muhammed Yılmaz
985
51.35 Ahmet Erdoğan
985
51.36 Abdurrahman Dursun
985
ix
51.37 Tahir Uzelli
986
51.38 Mehmet Akbay
986
51.39 Mehmet Çelikyontar
986
51.40 Savaş Zengin
986
51.41 Tuncay Güven
986
51.42 Cafer Uluç
986
51.43 Nikita Türkmen
986
51.44 Axolotl Axolotl
986
x
BÖLÜM 1
Bu Kitap Hakkında
Elinizdeki kitap, Python programlama dili için kapsamlı bir Türkçe kaynak oluşturma
projesi olan istihza.com‘un bir ürünüdür. Bu kitabın amacı, herhangi bir sebeple Python
programlama diline ilgi duyan, bu programlama dilini öğrenmek isteyen kişilere bu dili
olabildiğince hızlı, ayrıntılı ve kolay bir şekilde öğretmektir.
Bu kitabın hedef kitlesi, programlamayı hiç bilmeyen kişilerdir. Bu sebeple, bu kitapta ders
konularını olabildiğince ayrıntılı ve basitleştirilmiş bir şekilde ele almaya çalıştık. Ancak
eğer geçmişten gelen bir programlama deneyiminiz varsa, üstelik programlamaya ilişkin
kavramlara da aşinaysanız, bu kitabı sıkıcı bulabilirsiniz. Öyle bir durumda, bu belgelerin
yerine, Python programlama diline ait resmi kılavuzun , yine istihza.com projesinin bir ürünü
olan Türkçe çevirisini takip etmeyi tercih edebilirsiniz. Fakat öğreneceğiniz ilk programlama
dili Python ise, resmi kılavuzu anlamak size epey zor gelecektir.
Bu Kitabı Nereden İndirebilirim?
Bu kitabı İnternet üzerinden takip edebileceğiniz gibi, depodan PDF veya EPUB biçimlerinde
bilgisayarınıza da indirebilirsiniz. Ancak bu kitabın henüz yazılma aşamasında olduğunu ve
içeriğinin sık sık güncellendiğini aklınızdan çıkarmayın. Dolayısıyla, bilgisayarınıza indirdiğiniz
PDF ve EPUB belgeleri güncelliğini çabucak yitirecektir. O yüzden, eğer mümkünse, kitabı
çevrim içi kaynağından takip etmeniz veya bu mümkün değilse, PDF/EPUB belgelerini sık sık
yeniden indirmeniz daha mantıklı olacaktır.
Bu Kitaptan Nasıl Yararlanabilirim?
Elinizdeki kitap, epey uzun ve ayrıntılı makalelerden oluşuyor. Dolayısıyla bu kitabı elinize
alıp bir roman gibi okumaya çalışırsanız, sıkılıp öğrenme azminizi kaybedebilirsiniz. Bu kitabı
sıkılmadan ve bıkkınlığa düşmeden takip edebilmeniz için size birkaç öneride bulunalım.
Programlama dillerini, sanki tarih, coğrafya veya felsefe çalışıyormuşsunuz gibi, kitaba
gömülüp harıl harıl okuyarak öğrenemezsiniz. Programlama dillerini öğrenebilmek için sizin
de etkin bir şekilde öğrenme sürecine katılmanız gerekir. Yani bu kitaptaki makalelere kafanızı
gömmek yerine, bol bol örnek kod yazmaya çalışırsanız, öğrendiğiniz şeyler zihninizde daha
kolay yer edecektir. Birincisi bu.
İkincisi, kimse sizden bu kitaptaki her ayrıntıyı ezberlemenizi beklemiyor. Maharet, bir
konuya ilişkin bütün ayrıntıları akılda tutabilmekte değildir. İyi bir programcı, bir konuya dair
nasıl araştırma yapacağını ve kaynaklardan nasıl faydalanacağını bilir. Bir yazılım geliştirici
1
Python 3 için Türkçe Kılavuz, Sürüm 3
adayı olarak sizin de öğrenmeniz gereken şey, gördüğünüz bütün konuları en ince ayrıntısına
kadar ezberlemeye kalkışmaktan ziyade, o konuya ilişkin ilk aşamada 1kir sahibi olmaya
çalışmaktır. Python’da ilerledikçe, zaten belli alanlara ilgi duyacak, kendinizi o alanlarda
geliştirmeye çalışacaksınız. Elbette çok uğraştığınız konulara ilişkin ayrıntılar da daha kolay
aklınızda kalacaktır. Üstelik bir projeye ilişkin gerekliliklerin sizi yönlendirmesiyle, belli
konularda daha ayrıntılı araştırma yapma fırsatı da bulacaksınız.
Üçüncüsü, bir konuyu çalışırken yeterince anlayamadığınızı hissederseniz, lütfen dudağınızı
büzüp bir duvar köşesine kıvrılarak kendi kendinizi yılgınlığa düşürmeyin. Eğer bir konuyu
anlamadıysanız, okuyup geçin. Okuyup geçmek içinize sinmiyorsa, aşağıda belirttiğimiz
şekilde yardım isteyin.
Nereden Yardım Alabilirim?
Bu kitapta Python programlama diline ilişkin konuları olabildiğince temiz ve anlaşılır bir dille
anlatmaya çalıştık. Ancak yine de bazı konular zihninizde tam olarak yer etmeyebilir. Üstelik
kimi zaman, bir konuyu daha iyi anlayabilmek ya da bir sorunun üstesinden gelebilmek için
bilen birilerinin yardımına da ihtiyaç duyabilirsiniz. İşte böyle durumlarda istihza.com’un
forum alanına uğrayarak başka Python programcılarından yardım isteyebilirsiniz.
Forum alanı hem bilgi edinmek, hem de bildiklerinizi paylaşmak için oldukça elverişli bir
ortamdır. Foruma ilk girişiniz muhtemelen yardım istemek için olacaktır. Ama ilerleyen
zamanlarda Python bilginiz arttıkça bir de bakacaksınız ki yardım ararken yardım eder
duruma gelmişsiniz. İşte forum; kendinizdeki değişimi görmek, bilgi düzeyinizdeki artışı takip
etmek ve hatta yeni şeyler öğrenmek için bulunmaz bir fırsattır.
Projeye Nasıl Yardımcı Olabilirim?
Bu kitabın amacı, kitabı okuyanlara Python programlama dilini doğru ve ayrıntılı bir şekilde
öğretmek olduğu kadar, bu programlama dilini öğretirken düzgün ve anlaşılır bir Türkçe de
kullanmaktır. Bu bakımdan, kitapta bulabileceğiniz kod hatalarıyla birlikte, kitaptaki anlatım,
yazım ve noktalama hatalarını da GitHub’daki veri havuzunda düzelterek ya da bir konu
açarak istihza.com projesine önemli bir katkıda bulunmuş olursunuz.
Ayrıca bkz.:
Projeye bu şekilde katkıda bulunanların listesini Katkıda Bulunanlar başlıklı sayfada
görebilirsiniz.
Bunun dışında, projeye destek olmanın bir başka yolu, forum alanında sorulan soruları
cevaplamaya çalışmaktır. Bu şekilde hem projeye destek olmuş, hem başkalarına yardım
etmiş, hem de kendi bilginizi artırmış olursunuz.
Kullanım Koşulları
Bu kitaptaki bilgiler, istihza.com’un öteki kısımları gibi, Creative Commons lisansı altındadır.
Bu lisansa göre, bu kitaptaki bütün bilgilerden herkes ücretsiz olarak yararlanabilir. Eğer
isterseniz burada gördüğünüz belgelerin çıktısını alabilir, tanıdığınız veya tanımadığınız
herkesle gönül rahatlığıyla paylaşabilirsiniz.
Ancak bu belgeleri başka bir yerde
2
Bölüm 1. Bu Kitap Hakkında
Python 3 için Türkçe Kılavuz, Sürüm 3
kullanacaksanız, istihza.com adresini kaynak olarak göstermeli ve bu belgeleri kesinlikle
satmamalısınız. Arzu ederseniz belgeleri çoğaltıp ücretsiz olarak dağıtabilirsiniz.
1.5. Kullanım Koşulları
3
BÖLÜM 2
Python Hakkında
Eğer yaşamınızın bir döneminde herhangi bir programlama dili ile az veya çok ilgilendiyseniz,
Python adını duymuş olabilirsiniz. Önceden bir programlama dili deneyiminiz hiç olmamışsa
dahi, Python adının bir yerlerden kulağınıza çalınmış olma ihtimali bir hayli yüksek. Bu
satırları okuyor olduğunuza göre, Python adını en az bir kez duymuş olduğunuzu ve bu şeye
karşı içinizde hiç değilse bir merak uyandığını varsayabiliriz.
Peki, en kötü ihtimalle kulak dolgunluğunuz olduğunu varsaydığımız bu şey hakkında acaba
neler biliyorsunuz?
İşte biz bu ilk bölümde, fazla teknik ayrıntıya kaçmadan, Python hakkında kısa kısa bilgiler
vererek Python’ın ne olduğunu ve bununla neler yapabileceğinizi anlatmaya çalışacağız.
Python Nedir?
Tahmin edebileceğiniz gibi Python (C, C++, Perl, Ruby ve benzerleri gibi) bir programlama
dilidir ve tıpkı öteki programlama dilleri gibi, önünüzde duran kara kutuya, yani bilgisayara
hükmetmenizi sağlar.
Bu programlama dili Guido Van Rossum adlı Hollandalı bir programcı tarafından 90’lı yılların
başında geliştirilmeye başlanmıştır. Çoğu insan, isminin Python olmasına aldanarak, bu
programlama dilinin, adını piton yılanından aldığını düşünür. Ancak zannedildiğinin aksine
bu programlama dilinin adı piton yılanından gelmez. Guido Van Rossum bu programlama
dilini, The Monty Python adlı bir İngiliz komedi grubunun, Monty Python’s Flying Circus adlı
gösterisinden esinlenerek adlandırmıştır. Ancak her ne kadar gerçek böyle olsa da, Python
programlama dilinin pek çok yerde bir yılan 1gürü ile temsil edilmesi neredeyse bir gelenek
halini almıştır.
Dediğimiz gibi, Python bir programlama dilidir. Üstelik pek çok dile kıyasla öğrenmesi
kolay bir programlama dilidir. Bu yüzden, eğer daha önce hiç programlama deneyiminiz
olmamışsa, programlama maceranıza Python’la başlamayı tercih edebilirsiniz.
Neden Programlama Öğrenmek İsteyeyim?
Günlük yaşamınıza şöyle bir bakın. Gerek iş yerinizde olsun, gerek evde bilgisayar başında
olsun, belli işleri tekdüze bir şekilde tekrar ettiğinizi göreceksiniz. Mesela sürekli olarak yazılı
belgelerle uğraşmanızı gerektiren bir işte çalışıyor olabilirsiniz. Belki de her gün onlarca
belgeyi açıp bu belgelerde birtakım bilgiler arıyor, bu bilgileri düzeltiyor, yeniliyor veya
4
Python 3 için Türkçe Kılavuz, Sürüm 3
siliyorsunuzdur. Bu işlemlerin ne kadar vakit alıcı ve sıkıcı olduğunu düşünün. Eğer bir
programlama dili biliyor olsaydınız, bütün bu işlemleri sizin yerinize bu programlama dili
hallediyor olabilirdi.
İşte Python programlama dili böyle bir durumda devreye girer. Her gün saatler boyunca
uğraştığınız işlerinizi, yalnızca birkaç satır Python kodu yardımıyla birkaç saniye içinde
tamamlayabilirsiniz.
Ya da şöyle bir durum düşünün: Çalıştığınız iş yerinde PDF belgeleriyle bolca haşır neşir
oluyor olabilirsiniz. Belki de yüzlerce sayfalık kaşeli ve imzalı belgeyi PDF haline getirmeniz
gerekiyordur. Üstelik sizden bu belgeleri mümkün olduğunca tek parça halinde PDF’lemeniz
isteniyor olabilir. Ama o yüzlerce sayfayı tarayıcıdan geçirirken işin tam ortasında bir aksilik
oluyor, makine arızalanıyor ve belki de ister istemez belgeniz bölünüyordur.
İşte Python programlama dili böyle bir durumda da devreye girer. Eğer Python programlama
dilini öğrenirseniz, İnternet’te saatlerce ücretsiz PDF birleştirme programı aramak veya
profesyonel yazılımlara onlarca dolar para vermek yerine, belgelerinizi birleştirip işinizi
görecek programı kendiniz yazabilirsiniz.
Elbette Python’la yapabilecekleriniz yukarıda verdiğimiz basit örneklerle sınırlı değildir.
Python’ı kullanarak masaüstü programlama, oyun programlama, taşınabilir cihaz
programlama, web programlama ve ağ programlama gibi pek çok alanda çalışmalar
yürütebilirsiniz.
Neden Python?
Python programlarının en büyük özelliklerinden birisi, C ve C++ gibi dillerin aksine,
derlenmeye gerek olmadan çalıştırılabilmeleridir. Python’da derleme işlemi ortadan
kaldırıldığı için, bu dille oldukça hızlı bir şekilde program geliştirilebilir.
Ayrıca Python programlama dilinin basit ve temiz söz dizimi, onu pek çok programcı
tarafından tercih edilen bir dil haline getirmiştir. Python’ın söz diziminin temiz ve basit olması
sayesinde hem program yazmak, hem de başkası tarafından yazılmış bir programı okumak,
başka dillere kıyasla çok kolaydır.
Python’ın yukarıda sayılan özellikleri sayesinde dünya çapında ün sahibi büyük kuruluşlar
(Google, YouTube ve Yahoo! gibi) bünyelerinde her zaman Python programcılarına ihtiyaç
duyuyor. Mesela pek çok büyük şirketin Python bilen programcılara iş imkanı sağladığını,
Python’ın baş geliştiricisi Guido Van Rossum’un 2005 ile 2012 yılları arasında Google’da
çalıştığını,
2012 yılının sonlarına doğru ise Dropbox şirketine geçtiğini söylersek, bu
programlama dilinin önemi ve geçerliliği herhalde daha belirgin bir şekilde ortaya çıkacaktır.
Python programlama dili ve bu dili hakkıyla bilenler sadece uluslararası şirketlerin ilgisini
çekmekle kalmıyor. Python son zamanlarda Türkiye’deki kurum ve kuruluşların da dikkatini
çekmeye başladı. Bu dil artık yavaş yavaş Türkiye’deki üniversitelerin müfredatında da
kendine yer buluyor.
Sözün özü, pek çok farklı sebepten, başka bir programlama dilini değil de, Python
programlama dilini öğrenmek istiyor olabilirsiniz.
2.3. Neden Python?
5
Python 3 için Türkçe Kılavuz, Sürüm 3
Python Nasıl Telaffuz Edilir?
Python programlama dili üzerine bu kadar söz söyledik. Peki yabancı bir kelime olan python‘ı
nasıl telaffuz edeceğimizi biliyor muyuz?
Geliştiricisi Hollandalı olsa da python İngilizce bir kelimedir. Dolayısıyla bu kelimenin
telaffuzunda İngilizcenin kuralları geçerli. Ancak bu kelimeyi hakkıyla telaffuz etmek, ana dili
Türkçe olanlar için pek kolay değil. Çünkü bu kelime içinde, Türkçede yer almayan ve telaffuzu
peltek s’yi andıran [th] sesi var. İngilizce bilenler bu sesi think (düşünmek) kelimesinden
hatırlayacaklardır. Ana dili Türkçe olanlar think kelimesini genellikle [tink] şeklinde telaffuz
eder. Dolayısıyla python kelimesini de [paytın] şeklinde telaffuz edebilirsiniz.
Python kelimesini tamamen Türkçeleştirerek [piton] şeklinde telaffuz etmeyi yeğleyenler de
var. Elbette siz de dilinizin döndüğü bir telaffuzu tercih etmekte özgürsünüz.
Bu arada, eğer python kelimesinin İngilizce telaffuzunu dinlemek istiyorsanız howjsay.com
adresini ziyaret edebilir, Guido Van Rossum’un bu kelimeyi nasıl telaffuz ettiğini merak
ediyorsanız da http://goo.gl/bx9iJu adresindeki tanıtım videosunu izleyebilirsiniz.
Platform Desteği
Python programlama dili pek çok farklı işletim sistemi ve platform üzerinde çalışabilir.
GNU/Linux, Windows, Mac OS X, AS/400, BeOS, MorphOS, MS-DOS, OS/2, OS/390, z/OS,
RiscOS, S60, Solaris, VMS, Windows CE, HP-UX, iOS ve Android gibi, belki adını dahi
duymadığınız pek çok ortamda Python uygulamaları geliştirebilirsiniz. Ayrıca herhangi bir
ortamda yazdığınız bir Python programı, üzerinde hiçbir değişiklik yapılmadan veya ufak
değişikliklerle başka ortamlarda da çalıştırılabilir.
Biz bu belgelerde Python programlama dilini GNU/Linux ve Microsoft Windows işletim sistemi
üzerinden anlatacağız. Ancak sıkı sıkıya bel bağlayacağımız özel bir GNU/Linux dağıtımı
veya Windows sürümü yok. Bu yüzden, hangi GNU/Linux dağıtımını veya hangi Windows
sürümünü kullanıyor olursanız olun, buradaki bilgiler yardımıyla Python programlama dilini
öğrenebilir, öğrendiklerinizi kendi işletim sisteminize uyarlayabilirsiniz.
Not:
Bu satırların yazarının, Ubuntu, CentOs, Windows
7
ve Windows 10
kurulu
bilgisayarlara erişimi olduğu için, bu kitaptaki ekran görüntüleri genellikle bu işletim
sistemlerinden alınmış olacaktır.
Farklı Python Sürümleri
Eğer daha önce Python programlama dili ile ilgili araştırma yaptıysanız, şu anda piyasada iki
farklı Python serisinin olduğu dikkatinizi çekmiş olmalı. 04.05.2018 tarihi itibariyle piyasada
olan en yeni Python sürümleri Python 2.7.11 ve Python 3.5.1‘dir.
Eğer bir Python sürümü 2 sayısı ile başlıyorsa (mesela 2.7.11), o sürüm Python 2.x serisine
aittir. Yok eğer bir Python sürümü 3 sayısı ile başlıyorsa (mesela 3.5.1), o sürüm Python 3.x
serisine aittir.
Peki neden piyasada iki farklı Python sürümü var ve bu bizim için ne anlama geliyor?
6
Bölüm 2. Python Hakkında
Python 3 için Türkçe Kılavuz, Sürüm 3
Python programlama dili 1990 yılından bu yana geliştirilen bir dil. Bu süre içinde pek çok
Python programı yazıldı ve insanların kullanımına sunuldu. Şu anda piyasada Python’ın 2.x
serisinden bir sürümle yazılmış pek çok program bulunuyor. 3.x serisi ise ancak son yıllarda
yaygınlık kazanmaya başladı.
Not: Biz bu kitapta kolaylık olsun diye Python’ın 3.x serisini Python3; 2.x serisini ise Python2
olarak adlandıracağız.
Python3, Python2’ye göre hem çok daha güçlüdür, hem de Python2’nin hatalarından
arındırılmıştır. Python3’teki büyük değişikliklerden ötürü, Python2 ile yazılmış bir program
Python3 altında çalışmayacaktır. Aynı durum bunun tersi için de geçerlidir. Yani Python3
kullanarak yazdığınız bir program Python2 altında çalışmaz.
Dediğimiz gibi, piyasada Python2 ile yazılmış çok sayıda program var. İşte bu sebeple Python
geliştiricileri uzun bir süre daha Python2’yi geliştirmeye devam edecek. Elbette geliştiriciler
bir yandan da Python3 üzerinde çalışmayı ve bu yeni seriyi geliştirmeyi sürdürecek.
Farklı Python serilerinin var olmasından ötürü, Python ile program yazarken hangi seriye
ait sürümlerden birini kullandığınızı bilmeniz, yazacağınız programın kaderi açısından büyük
önem taşır.
Hangi Seriyi Öğrenmeliyim?
Dediğimiz gibi, şu anda piyasada iki farklı Python serisi var: Python3 ve Python2. Peki acaba
hangi seriye ait bir sürümü öğrenmelisiniz?
[Kısa cevap]
Python3’ü öğrenmelisiniz.
[Uzun cevap]
Eğer Python programlama diline yeni başlıyorsanız Python3’ü öğrenmeniz daha doğru
olacaktır.
Ama eğer Python programlama dilini belirli bir proje üzerinde çalışmak
üzere öğreniyorsanız, hangi sürümü öğrenmeniz gerektiği, projede kullanacağınız yardımcı
modüllerin durumuna bağlıdır.
Zira şu anda piyasada bulunan bütün Python
modülleri/programları henüz Python3’e aktarılmış değil.
Eğer projenizde kullanmayı planladığınız yardımcı modüller halihazırda Python3’e
aktarılmışsa Python3’ü öğrenebilirsiniz. Ancak eğer bu modüllerin henüz Python3 sürümü
çıkmamışsa sizin de Python2 ile devam etmeniz daha uygun olabilir. Ama her halükarda
Python3’ün bu dilin geleceği olduğunu ve günün birinde Python2’nin tamamen tedavülden
kalkacağını da aklınızın bir köşesinde bulundurun.
2.7. Hangi Seriyi Öğrenmeliyim?
7
BÖLÜM 3
Python Nasıl Kurulur?
Python ile program yazabilmemiz için bu programlama dilinin bilgisayarımızda kurulu olması
gerekiyor. Bu programlama dilini kurmanızın gerekip gerekmediği, kullandığınız işletim
sistemine bağlıdır. Biz burada hem GNU/Linux hem de Windows kullanıcılarının durumunu
sırasıyla ve ayrı ayrı inceleyeceğiz. Dilerseniz öncelikle GNU/Linux kullanıcılarının durumuna
bakalım:
Not: Bu kitap boyunca bazı konuların GNU/Linux ve Windows kullanıcıları için ayrı ayrı
anlatıldığını göreceksiniz. Ancak konular bu şekilde ayrılmış da olsa, ben size her ikisini
de okumanızı tavsiye ederim. Çünkü bu bölümlerde her iki kullanıcı grubunun da ilgisini
çekebilecek bilgilere rastlayacaksınız. Ayrıca bu bölümler farklı kullanıcı gruplarına hitap
ediyor olsa da, aslında bu bölümlerin birbirini tamamlayıcı nitelikte olduğunu göreceksiniz.
GNU/Linux Kullanıcıları
GNU/Linux dağıtımlarına Python programlama dilini kurarken bazı noktaları göz önünde
bulundurmamız gerekiyor. İşte bu bölümde bu önemli noktaların neler olduğunu
inceleyeceğiz.
Kurulu Python Sürümü
Hemen hemen bütün GNU/Linux dağıtımlarında Python programlama dili kurulu olarak gelir.
Örneğin Ubuntu’da Python zaten kuruludur.
Ancak burada şöyle bir durum var:
Daha önce de belirttiğimiz gibi, şu anda piyasada iki farklı Python serisi bulunuyor. Bunlardan
birinin Python’ın 2.x serisi, ötekinin ise 3.x serisi olduğunu biliyorsunuz.
Sisteminizde kurulu olan Python sürümünü denetlemek için komut satırında öncelikle şu
komutu vermeyi deneyin (büyük ‘V’ ile):
python -V
Eğer bu komuttan Python 2.x.y şeklinde bir çıktı alıyorsanız, yani x ve y’den önceki kısım 2 ile
başlıyorsa sisteminizde Python2 kuruludur.
8
Python 3 için Türkçe Kılavuz, Sürüm 3
Ancak python -V komutundan Python 2.x.y şeklinde bir çıktı almanız sisteminizde sadece
Python2’nin kurulu olduğunu göstermez. Sisteminizde Python2 ile birlikte Python3 de
halihazırda kurulu olabilir. Örneğin Ubuntu GNU/Linux’un 12.10 sürümünden itibaren hem
Python2, hem de Python3 sistemde kurulu vaziyettedir.
Kullandığınız GNU/Linux dağıtımında durumun ne olduğunu denetlemek için yukarıdaki
komutu bir de python3 -V şeklinde çalıştırmayı deneyebilirsiniz. Eğer bu komut size bir hata
mesajı yerine bir sürüm numarası veriyorsa sisteminizde Python3 de kuruludur.
Sisteminizdeki Python sürümlerine ilişkin daha kesin bir rapor için ise şu komutu
kullanabilirsiniz:
ls -g {,/usr{,/local}}/bin | grep python
Buradan aldığınız çıktıyı inceleyerek de sisteminizde birden fazla Python sürümünün kurulu
olup olmadığını görebilirsiniz. [Bununla ilgili bir tartışma için bkz. http://goo.gl/RnRRc ]
Ayrıca kullandığınız GNU/Linux dağıtımında whereis python gibi bir komut vererek de
sistemde kurulu Python sürümleri hakkında bilgi edinebilirsiniz.
Eğer sisteminizde Python3
kuruluysa ve siz de kurulu olan Python3
sürümünden
memnunsanız herhangi bir şey yapmanıza gerek yok. Farklı bir Python sürümü kurmaya
çalışmadan yolunuza devam edebilirsiniz.
Paket Deposundan Kurulum
Sistemlerinde öntanımlı olarak herhangi bir Python3
sürümü kurulu olmayan veya
sistemlerinde kurulu öntanımlı Python3
sürümünden memnun olmayan GNU/Linux
kullanıcılarının, Python3’ü elde etmek için tercih edebileceği iki yol var: Birincisi ve benim
size önereceğim yol, öncelikle kullandığınız dağıtımın paket yöneticisini kontrol etmenizdir.
Python3 sisteminizde kurulu olmasa bile, dağıtımınızın depolarında bu sürüm paketlenmiş
halde duruyor olabilir. O yüzden sisteminize uygun bir şekilde paket yöneticinizi açıp
orada ‘python’ kelimesini kullanarak bir arama yapmanızı öneririm. Örneğin Ubuntu
GNU/Linux dağıtımının paket depolarında Python3 var. Dolayısıyla Ubuntu kullanıcıları, eğer
sistemlerinde zaten kurulu değilse (ki muhtemelen kuruludur), bu paketi Ubuntu Yazılım
Merkezi aracılığıyla veya doğrudan şu komutla kurabilir:
sudo apt-get install python3
Bu komut, Python3’ü bütün bağımlılıkları ile beraber bilgisayarınıza kuracaktır.
Kaynaktan Kurulum
Peki ya kullandığınız dağıtımın depolarında Python3 yoksa veya depodaki Python3 sürümü
eskiyse ve siz daha yeni bir Python3 sürümü kullanmak istiyorsanız ne yapacaksınız?
Eğer dağıtımınızın depolarında Python3 paketini bulamazsanız veya depodaki sürüm sizi
tatmin etmiyorsa, Python3’ü kaynaktan derlemeniz gerekecektir. Python3’ü kaynaktan
derlerken iki seçeneğiniz var: Python3’ü root hakları ile kurmak veya Python3’ü yetkisiz
kullanıcı olarak kurmak. Normal şartlar altında eğer kullandığınız sistemde root haklarına
sahipseniz Python3’ü yetkili kullanıcı olarak kurmanızı tavsiye ederim.
3.1. GNU/Linux Kullanıcıları
9
Python 3 için Türkçe Kılavuz, Sürüm 3
root Hakları İle Kurulum
Python’ı kurmadan önce sistemimizde bulunması gereken bazı programlar var. Aslında bu
programlar olmadan da Python kurulabilir, ancak eğer bu programları kurmazsanız Python’ın
bazı özelliklerinden yararlanamazsınız. Bu programlar şunlardır:
1. tcl-dev
2. tk-dev
3. zlib1g-dev
4. ncurses-dev
5. libreadline-dev
6. libdb-dev
7. libgdbm-dev
8. libzip-dev
9. libssl-dev
10. libsqlite3-dev
11. libbz2-dev
12. liblzma-dev
Bu programları, kullandığınız GNU/Linux dağıtımının paket yöneticisi aracılığıyla
kurabilirsiniz. Yalnız paket adlarının ve gerekli paket sayısının dağıtımlar arasında farklılık
gösterebileceğini unutmayın. Yukarıdaki liste Ubuntu için geçerlidir. Mesela yukarıda tcl-dev
olarak verdiğimiz paket adı başka bir dağıtımda sadece tcl olarak geçiyor ya da yukarıdaki
paketlerin bazıları kullandığınız dağıtımda halihazırda kurulu olduğu için sizin daha az
bağımlılık kurmanız gerekiyor olabilir.
Ubuntu’da yukarıdaki paketlerin hepsini şu komutla kurabilirsiniz:
sudo apt-get install tcl-dev tk-dev
zlib1g-dev ncurses-dev libreadline-dev
libdb-dev libgdbm-dev libzip-dev libssl-dev
libsqlite3-dev libbz2-dev liblzma-dev
Not: Farklı GNU/Linux dağıtımlarında, Python3’ü kaynaktan derleme işleminden önce
halihazırda kurulu olması gereken paketlerin listesi için http://goo.gl/zfLpX adresindeki
tabloyu inceleyebilirsiniz.
Yukarıdaki programları kurduktan sonra https://www.python.org/ftp/python/3.5.1 adresine
gidiyoruz. Bu adreste, üzerinde ‘Python-3.5.1.tar.xz’ yazan bağlantıya tıklayarak sıkıştırılmış
kurulum dosyasını bilgisayarımıza indiriyoruz.
Daha sonra bu sıkıştırılmış dosyayı açıyoruz. Açılan klasörün içine girip, orada ilk olarak şu
komutu veriyoruz:
./configure
Bu komut, Python programlama dilinin sisteminize kurulabilmesi için gereken hazırlık
aşamalarını gerçekleştirir.
Bu betiğin temel olarak yaptığı iş, sisteminizin Python
10
Bölüm 3. Python Nasıl Kurulur?
Python 3 için Türkçe Kılavuz, Sürüm 3
programlama dilinin kurulmasına uygun olup olmadığını, derleme işlemi için gereken
yazılımların sisteminizde kurulu olup olmadığını denetlemektir. Bu betik ayrıca, bir sonraki
adımda gerçekleştireceğimiz inşa işleminin nasıl yürüyeceğini tarif eden Make1le adlı bir
dosya da oluşturur.
Bu arada bu komutun başındaki ./ işareti, o anda içinde bulunduğunuz dizinde yer alan
con1gure adlı bir betiği çalıştırmanızı sağlıyor. Eğer yalnızca configure komutu verirseniz,
işletim sistemi bu betiği PATH dizinleri içinde arayacak ve bulamayacağı için de hata
verecektir.
./configure komutu hatasız olarak tamamlandıktan sonra ikinci olarak şu komutu veriyoruz:
make
Burada aslında ./configure komutu ile oluşan Make1le adlı dosyayı make adlı bir program
aracılığıyla çalıştırmış oluyoruz. make bir sistem komutudur. Bu komutu yukarıdaki gibi
parametresiz olarak çalıştırdığımızda make komutu, o anda içinde bulunduğumuz dizinde
bir Make1le dosyası arar ve eğer böyle bir dosya varsa onu çalıştırır. Eğer bir önceki
adımda çalıştırdığımız ./configure komutu başarısız olduysa, dizinde bir Make1le dosyası
oluşmayacağı için yukarıdaki make komutu da çalışmayacaktır. O yüzden derleme işlemi
sırasında verdiğimiz komutların çıktılarını takip edip, bir sonraki aşamaya geçmeden önce
komutun düzgün sonlanıp sonlanmadığından emin olmamız gerekiyor.
make komutunun yaptığı iş, Python programlama dilinin sisteminize kurulması esnasında
sistemin çeşitli yerlerine kopyalanacak olan dosyaları inşa edip oluşturmaktır. Bu komutun
tamamlanması, kullandığınız bilgisayarın kapasitesine bağlı olarak biraz uzun sürebilir.
make komutu tamamlandıktan sonra, komut çıktısının son satırlarına doğru şöyle bir uyarı
mesajı görebilirsiniz:
Python build finished, but the necessary bits
to build these modules were not found: [burada
eksik olan modül veya modüllerin adları sıralanır]
Burada Python, sistemimizde bazı paketlerin eksik olduğu konusunda bizi uyarıyor. Uyarı
mesajında bir veya daha fazla paketin eksik olduğunu görebilirsiniz. Eğer öyleyse, eksik
olduğu bildirilen bütün paketleri kurmamız gerekiyor.
Gerekli paketi ya da paketleri kurduktan sonra make komutunu tekrar çalıştırıyoruz. Endişe
etmeyin, make komutunu ikinci kez verdiğimizde komutun tamamlanması birincisi kadar uzun
sürmez. Eğer bu komutu ikinci kez çalıştırdığınızda yukarıdaki uyarı mesajı kaybolduysa şu
komutla yolunuza devam edebilirsiniz:
sudo make altinstall
Daha önce kaynaktan program derlemiş olan GNU/Linux kullanıcılarının eli, make
komutundan sonra make install komutunu vermeye gitmiş olabilir. Ama burada bizim make
install yerine make altinstall komutunu kullandığımıza dikkat edin. make altinstall
komutu, Python kurulurken klasör ve dosyalara sürüm numarasının da eklenmesini sağlar.
Böylece yeni kurduğunuz Python, sistemdeki eski Python3 sürümünü silip üzerine yazmamış
olur ve iki farklı sürüm yan yana varolabilir. Eğer make altinstall yerine make install
komutunu verirseniz sisteminizde zaten varolan eski bir Python3 sürümüne ait dosya ve
dizinlerin üzerine yazıp silerek o sürümü kullanılamaz hale getirebilirsiniz. Bu da sistemde
beklenmedik problemlerin ortaya çıkmasına yol açabilir. Bu önemli ayrıntıyı kesinlikle gözden
kaçırmamalısınız.
Ayrıca bkz.:
3.1. GNU/Linux Kullanıcıları
11
Python 3 için Türkçe Kılavuz, Sürüm 3
Python3’ün
kaynaktan
kurulumu
ile
ilgili
bir
tartışma
için
bkz.
http://www.istihza.com/forum/viewtopic.php?f=50&t=544
Derleme aşamalarının hiçbirinde herhangi bir hata mesajı almadıysanız kurulum başarıyla
gerçekleşmiş ve sisteminize Python programlama dilinin 3.x sürümü kurulmuş demektir.
Yetkisiz Kullanıcı Olarak Kurulum
Elbette sudo make altinstall komutunu verip Python’ı kurabilmek için root haklarına sahip
olmanız gerekiyor. Ama eğer kullandığınız sistemde bu haklara sahip değilseniz Python’ı bu
şekilde kuramazsınız. Kısıtlı haklara sahip olduğunuz bir sistemde Python’ı ancak kendi ev
dizininize ($HOME) kurabilirsiniz.
Eğer Python’ı yetkisiz kullanıcı olarak kuracaksanız, öncelikle yukarıda bahsettiğimiz Python
bağımlılıklarının sisteminizde kurulu olup olmadığını kontrol etmeniz lazım. Kullandığınız
sistemde herhangi bir Python sürümü halihazırda kuruluysa, bu bağımlılıklar da muhtemelen
zaten kuruludur.
Ama değilse, bunları kurması için ya sistem yöneticisine ricada
bulunacaksınız, ya da bu bağımlılıkları da tek tek kendi ev dizininize kuracaksınız. Eğer sistem
yöneticisini bu bağımlılıkları kurmaya ikna edemezseniz, internet üzerinden bulabileceğiniz
bilgiler yardımıyla bu bağımlılıkları tek tek elle kendiniz kurabilirsiniz. Ancak bu işlemin epey
zaman alacağını ve süreç sırasında pek çok başka bağımlılıkla da karşılacağınızı söyleyebilirim.
O yüzden ne yapıp edip sistem yöneticisini bağımlılıkları kurmaya ikna etmenizi tavsiye
ederim... Tabii sistem yöneticisini bu bağımlılıkları kurmaya ikna edebilirseniz, istediğiniz
Python sürümünü de kurmaya ikna edebileceğinizi düşünebiliriz! Ama biz burada sizin
Python’ı kendinizin kuracağını varsayarak yolumuza devam edelim.
Python’ı yetkisiz olarak kurmak, root haklarıyla kurmaya çok benzer. Aralarında yalnızca
bir-iki ufak fark vardır. Mesela Python’ı yetkisiz kullanıcı olarak kurarken,
./configure
komutunu şu şekilde vermeniz gerekiyor:
./configure --prefix=$HOME/python
Python’ı root haklarıyla kurduğunuzda Python /usr dizini altına kurulacaktır. Ancak siz
yetkisiz kullanıcı olduğunuz için /usr dizinine herhangi bir şey kuramazsınız. İşte bu yüzden,
con1gure betiğine verdiğimiz -pre1x parametresi yardımıyla Python’ı, yazma yetkimiz olan
bir dizine kuruyoruz. Mesela yukarıdaki komut Python’ın /usr dizinine değil, ev dizininiz içinde
python adlı bir klasöre kurulmasını sağlayacaktır. Elbette siz python yerine farklı bir dizin
adı da belirleyebilirsiniz. Burada önemli olan nokta, -pre1x parametresine vereceğiniz dizin
adının, sizin yazmaya yetkili olduğunuz bir dizin olmasıdır.
Bu komutu çalıştırdıktan sonra make komutunu normal bir şekilde veriyoruz. Bunun ardından
da make install (veya duruma göre make altinstall) komutuyla Python’ı ev dizinimize
kuruyoruz. Burada make install komutunu sudo‘suz kullandığımıza dikkat edin. Çünkü,
dediğimiz gibi, siz yetkili kullanıcı olmadığınız için sudo komutunu kullanamazsınız.
Python’ı bu şekilde ev dizininiz altında bir klasöre kurduğunuzda Python ile ilgili bütün
dosyaların bu klasör içinde yer aldığını göreceksiniz. Bu klasörü dikkatlice inceleyip neyin
nerede olduğuna aşinalık kazanmaya çalışın. Eğer mümkünse root hakları ile kurulmuş bir
Python sürümünü inceleyerek, dosyaların iki farklı kurulum türünde nerelere kopyalandığını
karşılaştırın.
Böylece Python programlama dilini bilgisayarımıza nasıl kuracağımızı öğrenmiş olduk.
Ama bu noktada bir uyarı yapmadan geçmeyelim: Python özellikle bazı GNU/Linux
dağıtımlarında pek çok sistem aracıyla sıkı sıkıya bağlantılıdır. Yani Python, kullandığınız
12
Bölüm 3. Python Nasıl Kurulur?
Python 3 için Türkçe Kılavuz, Sürüm 3
dağıtımın belkemiği durumunda olabilir. Bu yüzden Python’ı kaynaktan derlemek bazı
riskler taşıyabilir. Eğer yukarıda anlatıldığı şekilde, kaynaktan Python derleyecekseniz, karşı
karşıya olduğunuz risklerin farkında olmalısınız. Ayrıca GNU/Linux üzerinde kaynaktan
program derlemek konusunda tecrübeli değilseniz ve eğer yukarıdaki açıklamalar size kafa
karıştırıcı geliyorsa, mesela ‘Ben bu komutları nereye yazacağım?’ diye bir soru geçiyorsa
aklınızdan, kesinlikle dağıtımınızla birlikte gelen Python sürümünü kullanmalısınız. Python
sürümlerini başa baş takip ettiği için, ben size Ubuntu GNU/Linux’u denemenizi önerebilirim.
Ubuntu’nun depolarında Python’ın en yeni sürümlerini rahatlıkla bulabilirsiniz. Ubuntu’nun
resmi sitesine ubuntu.com adresinden, yerel Türkiye sitesine ise forum.ubuntu-tr.net
adresinden ulaşabilirsiniz. Eğer şu anda kullandığınız GNU/Linux dağıtımından vazgeçmek
istemiyorsanız, sabit diskinizden küçük bir bölüm ayırıp bu bölüme sadece Python
çalışmalarınız için Ubuntu dağıtımını da kurmayı tercih edebilirsiniz.
Yalnız küçük bir uyarı daha yapalım. Kaynaktan kurulum ile ilgili bu söylediklerimizden,
Python’ın GNU/Linux’a kesinlikle kaynaktan derlenerek kurulmaması gerektiği anlamı
çıkmamalı. Yukarıdaki uyarıların amacı, kullanıcının Python’ı kaynaktan derlerken sadece
biraz daha dikkatli olması gerektiğini hatırlatmaktır. Örneğin bu satırların yazarı, kullandığı
Ubuntu sisteminde Python3’ü kaynaktan derleyerek kullanmayı tercih ediyor ve herhangi bir
problem yaşamıyor.
Bu önemli uyarıları da yaptığımıza göre gönül rahatlığıyla yolumuza devam edebiliriz.
Kurduğumuz yeni Python’ı nasıl çalıştıracağımızı biraz sonra göreceğiz. Ama önce Windows
kullanıcılarının Python3’ü nasıl kuracaklarına bakalım.
Windows Kullanıcıları
Windows sürümlerinin hiçbirinde Python kurulu olarak gelmez. O yüzden Windows
kullanıcıları, Python’ı sitesinden indirip kuracak.
Bunun için öncelikle http://www.python.org/downloads adresine gidiyoruz.
Bu adrese gittiğinizde, üzerinde ‘Download Python 3.5.1‘ ve ‘Download 2.7.11’ yazan, yan yana
iki düğme göreceksiniz. Daha önce de söylediğimiz gibi, eğer bir Python sürüm numarası ‘2’
ile başlıyorsa o sürüm 2.x serisine, yok eğer ‘3’ ile başlıyorsa 3.x serisine aittir. Dolayısıyla ilk
düğme Python3 sürümünü, ikinci düğme ise Python2 sürümünü içerir.
Biz bu kitapta Python’ın 3.x serisini anlatacağımız için (yeni Python sürümleri çıktığında
o düğmeler üzerinde yazan sürüm numaraları değişecek de olsa), ‘3’ ile başlayan sürüm
numarasını içeren düğmeye tıklamaya özen gösteriyoruz. Bu düğmeye tıkladığınızda
bilgisayarınıza .exe uzantılı kurulum dosyası inecek. Bu dosyaya çift tıklayarak kurulum
programını başlatabilirsiniz.
Not:
Eğer indireceğiniz Python sürümünün mimarisini ve sürümünü kendiniz
seçmek isterseniz https://www.python.org/ftp/python/3.5.1 adresinden kendinize uygun olan
sürümü bulup indirebilirsiniz.
Kurulum dosyasına çift tıkladığınızda karşınıza ilk gelen ekranda, pencerenin alt tarafında şu
kutucukları göreceksiniz:
1. Install launcher for all users (recommended)
2. Add Python 3.5 to PATH
3.2. Windows Kullanıcıları
13
Python 3 için Türkçe Kılavuz, Sürüm 3
Burada ilk kutucuk zaten seçilidir. Bunu bu şekilde bırakabilirsiniz. İkinci kutucuk ise
Python’ı yola eklememizi, böylece yalnızca python komutu vererek Python’ı başlatabilmemizi
sağlayacak. O yüzden oradaki ikinci kutucuğu da işaretliyoruz.
Aynı pencerenin üst tarafında ise şu seçenekleri göreceksiniz:
1. -> Install Now
2. -> Customize Installation
Burada ‘Install Now’ yazan kısma tıklayarak kurulumu başlatıyoruz.
Eğer Python’ın bilgisayarda nereye kurulacağını ve başka birtakım kurulum özelliklerini
değiştirmek istiyorsanız ‘Customize Installation’ yazılı kısma tıklayabilirsiniz. Ben bu kitapta
sizin ‘Install Now’ yazan kısma tıklayarak kurulum yaptığınızı varsayacağım.
Not: Python’ın resmi sitesinde dolaşırken kurulum dosyaları arasında, ‘web-based installer’
(web tabanlı kurulum betiği) adlı bir kurulum dosyası görebilirsiniz. Bu kurulum dosyası,
Python’ın çalışması için gereken dosyaları kurulum esnasında internetten indirip kuran,
1MB’dan küçük bir kurulum programı içerir. Dolayısıyla eğer kurulumu bu dosyadan
yapacaksanız, kesintisiz bir internet bağlantısına ihtiyacınız olacak.
Uyarı: Eğer Windows’ta Python’ı kurmaya çalışırken hata alıyorsanız, muhtemelen işletim
sisteminiz güncel değildir. Örneğin Windows 7’de Python kurabilmeniz için, SP1 (Service
Pack 1) kurulu olmalıdır. Windows güncellemelerini kurduktan sonra Python’ı kurmayı
tekrar deneyin.
Python Kurulum ve Çalışma Dizini
Python programlama dilini, kullandığımız işletim sistemine nasıl kurabileceğimizi bilmek
kadar önemli bir konu da Python’ı hangi dizine kurduğumuzu bilmektir. Zira programcılık
maceramız boyunca karşılaşacağımız bazı sorunlar, Python’ın kurulu olduğu dizine gitmemizi
gerektirecek, üstelik kendi yazdığımız bazı programlarda da Python’ın kurulu olduğu dizinde
çeşitli işlemler yapmak ihtiyacı duyacağız. Ayrıca bazı durumlarda, o anda çalışan Python
sürümünün hangi konumdan çalıştığını tespit etmemiz de gerekebilir.
İşte bu sebeplerden, Python’ın hangi dizine kurulduğunu mutlaka biliyor olmamız lazım.
Python’ın, işletim sisteminizde hangi dizine kurulduğu, Python’ı nasıl kurduğunuza bağlı
olarak farklılık gösterir.
GNU/Linux dağıtımlarında Python genellikle /usr/lib/python3.5
dizininde kurulur. Ama
elbette, eğer siz Python’ı kaynaktan derlediyseniz, derleme sırasında con1gure betiğine
verdiğiniz -pre1x parametresi yardımıyla Python’ın kurulum dizinini kendiniz de belirlemiş
olabilirsiniz.
Windows’ta Python programlama dilini aynen bu kitapta gösterdiğimiz şekilde kurduysanız,
Python %LOCALAPPDATA%\Programs\Python dizini içine kurulacaktır. Ancak eğer kurulum
penceresinde
‘Customize Installation’ düğmesine basarak kurulumu özelleştirdiyseniz
ve
‘Install for all users’ seçeneğini işaretlediyseniz Python
%PROGRAMFILES% veya
%PROGRAMFILES(x86) adlı çevre değişkenlerinin işaret ettiği dizin içine kurulacaktır.
14
Bölüm 3. Python Nasıl Kurulur?
BÖLÜM 4
Python Nasıl Çalıştırılır?
Bir önceki bölümde, Python’ı farklı platformlara nasıl kuracağımızı bütün ayrıntılarıyla
anlattık. Bu bölümde ise kurduğumuz bu Python programını hem GNU/Linux’ta hem de
Windows’ta nasıl çalıştıracağımızı göreceğiz. Öncelikle GNU/Linux kullanıcılarının Python’ı
nasıl çalıştıracağına bakalım.
GNU/Linux Kullanıcıları
Geçen bölümlerde gördüğünüz gibi, Python3’ü GNU/Linux sistemleri üzerine farklı şekillerde
kurabiliyoruz. Bu bölümde, her bir kurulum türü için Python3’ün nasıl çalıştırılacağını ayrı
ayrı inceleyeceğiz.
Kurulu Python3’ü Kullananlar
Eğer sisteminizde zaten Python3 kurulu ise komut satırında yalnızca şu komutu vererek
Python3’ü başlatabilirsiniz:
python
Ancak daha önce de dediğimiz gibi,
04.05.2018
tarihi itibariyle pek çok GNU/Linux
dağıtımında öntanımlı olarak Python2 kuruludur. Dolayısıyla python komutunu verdiğinizde
çalışan sürüm muhtemelen Python2 olacaktır. Bu yüzden sistemimizde öntanımlı olarak
hangi sürümün kurulu olduğuna ve python komutunun hangi sürümü başlattığına çok dikkat
etmelisiniz.
Yine daha önce de söylediğimiz gibi, sisteminizde hem Python2 hem de Python3 zaten
kurulu durumda olabilir. O yüzden yukarıdaki komutu bir de python3 şeklinde vermeyi
deneyebilirsiniz.
Örneğin Ubuntu GNU/Linux dağıtımının
12.10
sürümünden itibaren python komutu
Python2’yi; python3 komutu ise Python3’ü çalıştırıyor.
Python3’ü Depodan Kuranlar
Dediğimiz gibi,
04.05.2018 tarihi itibariyle GNU/Linux dağıtımlarında öntanımlı Python
sürümü ağırlıklı olarak Python2’dir. Dolayısıyla python komutu Python’ın 2.x sürümlerini
çalıştırır. Bu durumdan ötürü, herhangi bir çakışmayı önlemek için GNU/Linux dağıtımları
Python3 paketini farklı bir şekilde adlandırma yoluna gider. Şu anda piyasada bulunan
15
Python 3 için Türkçe Kılavuz, Sürüm 3
dağıtımların ezici çoğunluğu Python3 paketini ‘python3’ şeklinde adlandırıyor. O yüzden
GNU/Linux kullanıcıları, eğer paket yöneticilerini kullanarak Python kurulumu gerçekleştirmiş
iseler, komut satırında şu komutu vererek Python3’ü başlatabilirler:
python3
Bu komutun ardından şuna benzer bir ekranla karşılaşmış olmalısınız:
istihza@ubuntu:~$
# python3 Python 3.5.1 (default,
04.05.2018,
12:24:55)
[GCC 4.4.7
20120313
(Red Hat 4.4.7-3)] on linux Type “help”, “copyright”, “credits” or “license” for more
information. >>>
Eğer yukarıdaki ekranı gördüyseniz Python’la programlama yapmaya hazırsınız demektir.
Değilse, geriye dönüp işlerin nerede ters gittiğini bulmaya çalışabilirsiniz.
Bu aşamada işlerin nerede ters gitmiş olabileceğine dair birkaç ipucu verelim:
1. Python3 kurulurken paket yöneticinizin herhangi bir hata vermediğinden, programın
sisteminize başarıyla kurulduğundan emin olun. Bunun için Python3’ün kurulu paketler
listesinde görünüp görünmediğini denetleyebilirsiniz.
2. python3 komutunu doğru verdiğinize emin olun. Python programlama diline özellikle
yeni başlayanların en sık yaptığı hatalardan biri python kelimesini yanlış yazmaktır.
Python yerine yanlışlıkla pyhton, pyton veya phyton yazmış olabilirsiniz. Ayrıca python3
komutunun tamamen küçük har2erden oluştuğuna dikkat edin. Python ve python
bilgisayar açısından aynı şeyler değildir.
3. Kullandığınız dağıtımın Python3 paketini adlandırma politikası yukarıda anlattığımızdan
farklı olabilir. Yani sizin kullandığınız dağıtım, belki de Python3 paketini farklı bir şekilde
adlandırmıştır. Eğer durum böyleyse, dağıtımınızın yardım kaynaklarını (wiki, forum, irc,
yardım belgeleri, kullanıcı listeleri, vb.) kullanarak ya da istihza.com/forum adresinde
sorarak Python3’ün nasıl çalıştırılacağını öğrenmeyi deneyebilirsiniz.
Gelelim Python3’ü kaynaktan derlemiş olanların durumuna...
Python3’ü root Olarak Derleyenler
Eğer Python3’ü önceki bölümlerde anlattığımız şekilde kaynaktan root hakları ile
derlediyseniz python3 komutu çalışmayacaktır. Bunun yerine şu komutu kullanmanız
gerekecek:
python3.5
Not:
Kurduğunuz Python3 sürümünün 3.5
olduğunu varsayıyorum. Eğer farklı bir
Python3 sürümü kurduysanız, elbette başlatıcı komut olarak o sürümün adını kullanmanız
gerekecektir. Mesela: python3.0 veya python3.1. Bu arada python3.5 komutunda 35
sayısının rakamları arasında bir adet nokta işareti olduğunu gözden kaçırmıyoruz...
Tıpkı paket deposundan kurulumda olduğu gibi, eğer yukarıdaki komut Python’ı çalıştırmanızı
sağlamıyorsa, kurulum esnasında bazı şeyler ters gitmiş olabilir. Örneğin kaynaktan
kurulumun herhangi bir aşamasında bir hata almış olabilirsiniz ve bu da Python’ın
kurulumunu engellemiş olabilir.
Gördüğünüz gibi, Python’ı kaynaktan derleyenler Python programlama dilini çalıştırabilmek
için Python’ın tam sürüm adını belirtiyor. Dilerseniz bu şekilde çalışmaya devam edebilirsiniz.
16
Bölüm 4. Python Nasıl Çalıştırılır?
Python 3 için Türkçe Kılavuz, Sürüm 3
Bunun hiçbir sakıncası yok. Ancak ben size kolaylık açısından, /usr/bin/ dizini altına py3
adında bir sembolik bağ yerleştirmenizi tavsiye ederim. Böylece sadece py3 komutunu
vererek Python3’ü başlatabilirsiniz.
Peki bunu nasıl yapacağız?
Python kaynaktan derlendiğinde çalıştırılabilir dosya /usr/local/bin/ dizini içine Python3.5
(veya kurduğunuz Python3 sürümüne bağlı olarak Python3.0
ya da Python3.1 ) adıyla
kopyalanır. Bu nedenle Python3’ü çalıştırabilmek için python3.5 komutunu kullanmamız
gerekir. Python3’ü çalıştırabilmek için mesela sadece py3 gibi bir komut kullanmak istiyorsak
yapacağımız tek şey /usr/local/bin/ dizini içindeki python3.5
adlı dosyaya /usr/bin dizini
altından, py3
adlı bir sembolik bağ oluşturmak olacaktır. Bunun için ln komutunu
kullanacağız:
ln -s /usr/local/bin/python3.5 /usr/bin/py3
Tabii bu komutu yetkili kullanıcı olarak vermeniz gerektiğini söylememe herhalde gerek
yoktur. Bu komutu verdikten sonra artık sadece py3 komutu ile Python programlama dilini
başlatabilirsiniz.
Çok Önemli Bir Uyarı
Bir önceki adımda anlattığımız gibi Python3’ü resmi sitesinden indirip kendiniz derlediniz.
Gayet güzel. Ancak bu noktada çok önemli bir konuya dikkatinizi çekmek isterim. En baştan
beri söylediğimiz gibi, Python programlama dili GNU/Linux işletim sistemlerinde çok önemli
bir yere sahiptir. Öyle ki bu programlama dili, kullandığınız dağıtımın belkemiği durumunda
olabilir.
Örneğin Ubuntu GNU/Linux dağıtımında pek çok sistem aracı Python ile yazılmıştır. Bu
yüzden, sistemdeki öntanımlı Python sürümünün ne olduğu ve dolayısıyla python komutunun
hangi Python sürümünü çalıştırdığı çok önemlidir. Çünkü sisteminizdeki hayati bazı araçlar,
python komutunun çalıştırdığı Python sürümüne bel bağlamış durumdadır. Dolayısıyla sizin
bu python komutunun çalıştırdığı Python sürümüne dokunmamanız gerekir.
Mesela eğer kullandığınız işletim sisteminde python komutu Python’ın 2.x sürümlerinden
birini çalıştırıyorsa sembolik bağlar veya başka araçlar vasıtasıyla python komutunu Python’ın
başka bir sürümüne bağlamayın. Bu şekilde bütün sistemi kullanılmaz hale getirirsiniz.
Elbette eğer kurulum aşamasında tarif ettiğimiz gibi, Python3’ü make install yerine make
altinstall komutu ile kurmaya özen gösterdiyseniz, sonradan oluşturduğunuz bağ dosyasını
silip python komutunu yine sistemdeki öntanımlı sürüme bağlayabilirsiniz. Bu şekilde her
şey yine eski haline döner. Ama eğer Python’ı make install komutuyla kurmanızdan ötürü
sistemdeki öntanımlı Python sürümüne ait dosyaları kaybettiyseniz sizin için yapılacak fazla
bir şey yok... Sistemi tekrar eski kararlı haline getirmek için kan, ter ve gözyaşı dökeceksiniz...
Aynı şekilde, kullandığınız dağıtımda python3
komutunun öntanımlı olarak belirli bir
Python sürümünü başlatıp başlatmadığı da önemlidir. Yukarıda python komutu ile ilgili
söylediklerimiz python3 ve buna benzer başka komutlar için de aynen geçerli.
Örneğin, Ubuntu GNU/Linux dağıtımında python komutu sistemde kurulu olan Python 2.x
sürümünü; python3 komutu ise sistemde kurulu olan Python 3.x sürümünü çalıştırdığından,
biz kendi kurduğumuz Python sürümleri için, sistemdeki sürümlerle çakışmayacak isimler
seçtik. Mesela kendi kurduğumuz Python3 sürümünü çalıştırmak için py3 gibi bir komut tercih
ettik.
4.1. GNU/Linux Kullanıcıları
17
Python 3 için Türkçe Kılavuz, Sürüm 3
İyi bir test olarak, Python programlama dilini kendiniz kaynaktan derlemeden önce şu
komutun çıktısını iyice inceleyebilirsiniz:
ls -g {,/usr{,/local}}/bin | grep python
Bu komut iki farklı Python sürümünün kurulu olduğu sistemlerde şuna benzer bir çıktı verir
(çıktı kırpılmıştır):
dh_python2
dh_python3
pdb2.7 -> ../lib/python2.7/pdb.py
pdb3.2 -> ../lib/python3.2/pdb.py
py3versions -> ../share/python3/py3versions.py
python -> python2.7
python2 -> python2.7
python2.7
python3 -> python3.2
python3.2 -> python3.2mu
python3.2mu
python3mu -> python3.2mu
pyversions -> ../share/python/pyversions.py
Yatık har2erle gösterdiğimiz kısımlara dikkat edin. Gördüğünüz gibi python ve python2
komutları bu sistemde Python’ın 2.7 sürümünü çalıştırıyor. python3 komutu ise Python’ın 3.2
sürümünü... Dolayısıyla yukarıdaki çıktıyı aldığımız bir sistemde kendi kurduğumuz Python
sürümlerine ‘python’, ‘python2’ veya ‘python3’ gibi isimler vermekten kaçınmalıyız.
Sözün özü, bir GNU/Linux kullanıcısı olarak sistemdeki öntanımlı hiçbir Python sürümünü
silmemeli, öntanımlı sürüme ulaşan komutları değiştirmemelisiniz. Eğer mesela sisteminizde
python3 komutu halihazırda bir Python sürümünü çalıştırıyorsa, siz yeni kurduğunuz Python
sürümüne ulaşmak için öntanımlı adla çakışmayacak başka bir komut adı kullanın. Yani
örneğin sisteminizde python3
komutu Python’ın 3.2
sürümünü çalıştırıyorsa, siz yeni
kurduğunuz sürümü çalıştırmak için py3 gibi bir sembolik bağ oluşturun. Bırakın öntanımlı
komut (python, python3 vb.) öntanımlı Python sürümünü çalıştırmaya devam etsin.
Asla unutmayın. Siz bir programcı adayı olarak, program yazacağınız işletim sistemini enine
boyuna tanımakla yükümlüsünüz. Dolayısıyla işletim sisteminizi kararsız hale getirecek
davranışları bilmeli, bu davranışlardan kaçınmalı, yanlış bir işlem yaptığınızda da nasıl geri
döneceğinizi bilmelisiniz. Hele ki bir programı kaynaktan derlemeye karar vermişseniz...
Bu ciddi uyarıyı da yaptığımıza göre gönül rahatlığıyla yolumuza devam edebiliriz.
Python3’ü Ev Dizinine Kuranlar
Eğer Python3’ü kısıtlı kullanıcı hakları ile derleyip ev dizininize kurduysanız yukarıdaki
komutlar Python’ı çalıştırmanızı sağlamayacaktır. Python3’ü ev dizinine kurmuş olan
kullanıcılar Python3’ü çalıştırabilmek için, öncelikle komut satırı aracılığıyla Python3’ü
kurdukları dizine, oradan da o dizin altındaki bin/ klasörüne ulaşacak ve orada şu komutu
verecek:
./python3.5
Diyelim ki Python3’ü $HOME/python adlı dizine kurdunuz.
Önce şu komutla
$HOME/python/bin adlı dizine ulaşıyoruz:
18
Bölüm 4. Python Nasıl Çalıştırılır?
Python 3 için Türkçe Kılavuz, Sürüm 3
cd $HOME/python/bin
Ardından da şu komutu veriyoruz:
./python3.5
Not: Komutun başındaki ./ işaretinin ne işe yaradığını artık adınız gibi biliyorsunuz...
Not: Elbette ben burada kurduğunuz Python sürümünün 3.5 olduğunu varsaydım. Eğer
farklı bir sürüm kurduysanız yukarıdaki komutu ona göre yazmanız gerekiyor.
Eğer isterseniz bu şekilde çalışmaya devam edebilirsiniz. Ancak her defasında Python’ın
kurulu olduğu dizin altına gelip orada ./python3.5 komutunu çalıştırmak bir süre sonra
eziyete dönüşecektir. İşlerinizi kolaylaştırmak için şu işlemleri takip etmelisiniz:
1. ev dizininizin altında bulunan .pro1le (veya kullandığınız dağıtıma göre .bash_pro1le ya da
.bashrc) adlı dosyayı açın.
2. Bu dosyanın en sonuna şuna benzer bir satır yerleştirerek Python’ı çalıştırmamızı sağlayan
dosyanın bulunduğu dizini yola ekleyin:
export PATH=$PATH:$HOME/python/bin/
3.
$HOME/python/bin/ satırı Python3’ün çalıştırılabilir dosyasının hangi dizin altında
olduğunu gösteriyor. Ben burada Python3’ün çalıştırılabilir dosyasının $HOME/python/bin
dizini içinde olduğunu varsaydım. O yüzden de $HOME/python/bin/ gibi bir satır yazdım.
Ama eğer Python3’ün çalıştırılabilir dosyası sizde farklı bir dizindeyse bu satırı ona göre
yazmalısınız.
4. Kendi sisteminize uygun satırı dosyaya ekledikten sonra dosyayı kaydedip çıkın. Dosyada
yaptığımız değişikliğin etkin hale gelebilmesi için şu komutu verin:
source .profile
Elbette eğer sizin sisteminizdeki dosyanın adı .bash_pro1le veya .bashrc ise yukarıdaki
komutu ona göre değiştirmelisiniz.
5.
Daha sonra $HOME/python/bin/python3.5
adlı dosyaya $HOME/python/bin/ dizini
altından mesela py3 gibi bir sembolik bağ verin:
ln -s $HOME/python/bin/python3.5 $HOME/python/bin/py3
6. Bilgisayarınızı yeniden başlatın.
7. Artık hangi konumda bulunursanız bulunun, şu komutu vererek Python3’ü başlatabilirsiniz:
py3
Burada da eğer yukarıdaki komut Python3’ü çalıştırmanızı sağlamıyorsa, bazı şeyleri
eksik veya yanlış yapmış olabilirsiniz. Yardım almak için istihza.com/forum adresine
uğrayabilirsiniz.
Python3’ü başarıyla kurup çalıştırabildiğinizi varsayarak yolumuza devam edelim.
4.1. GNU/Linux Kullanıcıları
19
Python 3 için Türkçe Kılavuz, Sürüm 3
GNU/Linux’ta Farklı Sürümleri Birlikte Kullanmak
Daha önce de dediğimiz gibi, şu anda piyasada iki farklı Python serisi bulunuyor: Python2 ve
Python3. Çok uzun zamandan beri kullanımda olduğu için, Python2 Python3’e kıyasla daha
yaygın. Eğer hem Python2 ile yazılmış programları çalıştırmak, hem de Python3 ile geliştirme
yapmak istiyorsanız, sisteminizde hem Python2’yi hem de Python3’ü aynı anda bulundurmayı
tercih edebilirsiniz. Peki bunu nasıl yapacaksınız?
En başta da söylediğimiz gibi, hemen hemen bütün GNU/Linux dağıtımlarında Python2 kurulu
olarak gelir. Dolayısıyla eğer sisteminize ek olarak Python3’ü de kurduysanız (kaynaktan
veya paket deposundan), başka herhangi bir şey yapmanıza gerek yok. Yukarıda anlattığımız
yönergeleri takip ettiyseniz, konsolda python komutu verdiğinizde Python2 çalışacak, python3
(veya py3) komutunu verdiğinizde ise Python3 çalışacaktır.
Ama eğer sisteminizde Python2 bile kurulu değilse, ki bu çok çok düşük bir ihtimaldir,
Python2’yi paket yöneticiniz yardımıyla sisteminize kurabilirsiniz. Şu anda piyasada olup da
paket deposunda Python bulundurmayan GNU/Linux dağıtımı pek azdır.
GNU/Linux’ta Python’ı nasıl çalıştıracağımızı ve farklı Python sürümlerini bir arada nasıl
kullanacağımızı öğrendiğimize göre, Windows kullanıcılarının durumuna bakabiliriz.
Windows Kullanıcıları
Windows kullanıcıları Python3’ü iki şekilde başlatabilir:
1. Başlat > Tüm Programlar > Python3.5 > Python (Command Line) yolunu takip ederek.
2. Komut satırında python komutunu vererek.
Eğer birinci yolu tercih ederseniz, Python’ın size sunduğu komut satırına doğrudan ulaşmış
olursunuz. Ancak Python komut satırına bu şekilde ulaştığınızda bazı kısıtlamalarla karşı
karşıya kalırsınız. Doğrudan Python’ın komut satırına ulaşmak yerine önce MS-DOS komut
satırına ulaşıp, oradan Python komut satırına ulaşmak özellikle ileride yapacağınız çalışmalar
açısından çok daha mantıklı olacaktır. O yüzden komut satırına bu şekilde ulaşmak yerine
ikinci seçeneği tercih etmenizi tavsiye ederim. Bunun için önceki bölümlerde gösterdiğimiz
şekilde komut satırına ulaşın ve orada şu komutu çalıştırın:
python
Bu komutu verdiğinizde şuna benzer bir ekranla karşılaşacaksınız:
C:\Users\istihza> python3 Python 3.5.1 (v3.5.1:c0e311e010fc, 04.05.2018, 12:24:55) [MSC
v.1600 32 bit (Intel)] on win32 Type “help”, “copyright”,
“credits” or “license” for more
information. >>>
Eğer bu komut yukarıdakine benzer bir ekran yerine bir hata mesajı verdiyse kurulum
sırasında bazı adımları eksik veya yanlış yapmış olabilirsiniz.
Yukarıdaki komut
çalışmıyorsa, muhtemelen kurulum sırasında Add python3.5
to path kutucuğunu
işaretlemeyi unutmuşsunuzdur. Eğer öyleyse, kurulum dosyasını tekrar çalıştırıp, ilgili adımı
gerçekleştirmeniz veya Python’ı kendiniz YOL’a eklemeniz gerekiyor.
python komutunu başarıyla çalıştırabildiğinizi varsayarak yolumuza devam edelim.
20
Bölüm 4. Python Nasıl Çalıştırılır?
Python 3 için Türkçe Kılavuz, Sürüm 3
Windows’ta Farklı Sürümleri Birlikte Kullanmak
Daha önce de dediğimiz gibi, şu anda piyasada iki farklı Python serisi bulunuyor: Python2 ve
Python3. Çok uzun zamandan beri kullanımda olduğu için, Python2 Python3’e kıyasla daha
yaygın. Eğer hem Python2 ile yazılmış programları çalıştırmak, hem de Python3 ile geliştirme
yapmak istiyorsanız, sisteminizde hem Python2’yi hem de Python3’ü aynı anda bulundurmayı
tercih edebilirsiniz. Peki bunu nasıl yapacaksınız?
Windows’ta bu işlemi yapmak çok kolaydır. python.org/download adresine giderek farklı
Python sürümlerini bilgisayarınıza indirebilir ve bunları bilgisayarınıza normal bir şekilde
kurabilirsiniz. Bu şekilde sisteminize istediğiniz sayıda farklı Python sürümü kurabilirsiniz.
Peki bu farklı sürümlere nasıl ulaşacaksınız?
Python, bilgisayarımızdaki farklı Python sürümlerini çalıştırabilmemiz için bize ‘py’ adlı özel
bir program sunar.
Not: Py programı yalnızca Windows’a özgüdür. GNU/Linux’ta böyle bir program bulunmaz.
Py programını çalıştırmak için, daha önce gösterdiğimiz şekilde sistem komut satırına
ulaşıyoruz ve orada şu komutu veriyoruz:
py
Bu komutu verdiğinizde (teorik olarak) sisteminize en son kurduğunuz Python sürümü
çalışmaya başlayacaktır. Ancak bu her zaman böyle olmayabilir. Ya da aldığınız çıktı
beklediğiniz gibi olmayabilir. O yüzden bu komutu verdiğinizde hangi sürümün başladığına
dikkat edin.
Eğer sisteminizde birden fazla Python sürümü kurulu ise, bu betik yardımıyla istediğiniz
sürümü başlatabilirsiniz. Mesela sisteminizde hem Python’ın 2.x sürümlerinden biri, hem de
Python’ın 3.x sürümlerinden biri kurulu ise, şu komut yardımıyla Python 2.x’i başlatabilirsiniz:
py -2
Python 3.x’i başlatmak için ise şu komutu veriyoruz:
py -3
Eğer sisteminizde birden fazla Python2 veya birden fazla Python3 sürümü kurulu ise, ana ve
alt sürüm numaralarını belirterek istediğiniz sürüme ulaşabilirsiniz:
py -2.6
py -2.7
py -3.4
py -3.5
Bu arada dikkat ettiyseniz, Python programlarını başlatabilmek için hem python hem de py
komutunu kullanma imkanına sahibiz. Eğer sisteminizde tek bir Python sürümü kurulu ise,
Python’ı başlatmak için python komutunu kullanmak isteyebilir, farklı sürümlerin bir arada
bulunduğu durumlarda ise py ile bu farklı sürümlere tek tek erişmek isteyebilirsiniz.
4.2. Windows Kullanıcıları
21
Python 3 için Türkçe Kılavuz, Sürüm 3
Böylece Python’la ilgili en temel bilgileri edinmiş olduk. Bu bölümde öğrendiklerimiz
sayesinde Python programlama dilini bilgisayarımıza kurabiliyor ve bu programlama dilini
başarıyla çalıştırabiliyoruz.
Hangi Komut Hangi Sürümü Çalıştırıyor?
Artık Python programlama dilinin bilgisayarımıza nasıl kurulacağını ve bu programlama
dilinin nasıl çalıştırılacağını biliyoruz. Ancak konunun öneminden ötürü, tekrar vurgulayıp,
cevabını bilip bilmediğinizden emin olmak istediğimiz bir soru var: Kullandığınız işletim
sisteminde acaba hangi komut, hangi Python sürümünü çalıştırıyor?
Bu kitapta anlattığımız farklı yöntemleri takip ederek, Python programlama dilini
bilgisayarınıza farklı şekillerde kurmuş olabilirsiniz. Örneğin Python programlama dilini,
kullandığınız GNU/Linux dağıtımının paket yöneticisi aracılığıyla kurduysanız, Python’ı
başlatmak için python3 komutunu kullanmanız gerekebilir. Aynı şekilde, eğer Python’ı
Windows’a kurduysanız, bu programlama dilini çalıştırmak için python komutunu kullanıyor
olabilirsiniz. Bütün bunlardan farklı olarak, eğer Python’ın kaynak kodlarını sitesinden indirip
derlediyseniz, Python’ı çalıştırmak için kendi belirlediğiniz bambaşka bir adı da kullanıyor
olabilirsiniz. Örneğin belki de Python’ı çalıştırmak için py3 gibi bir komut kullanıyorsunuzdur...
Python programlama dilini çalıştırmak için hangi komutu kullanıyor olursanız olun, lütfen bir
sonraki konuya geçmeden önce kendi kendinize şu soruları sorun:
1. Kullandığım işletim sisteminde Python programı halihazırda kurulu mu?
2. Kullandığım işletim sisteminde toplam kaç farklı Python sürümü var?
3. python komutu bu Python sürümlerinden hangisini çalıştırıyor?
4. python3 komutu çalışıyor mu?
5. Eğer çalışıyorsa, bu komut Python sürümlerinden hangisini çalıştırıyor?
6. Kaynaktan derlediğim Python sürümünü çalıştırmak için hangi komutu kullanıyorum?
Biz bu kitapta şunları varsayacağız:
1. Kullandığınız işletim sisteminde Python’ın
2.x sürümlerini python komutuyla
çalıştırıyorsunuz.
2. Kullandığınız işletim sisteminde Python’ın
3.x sürümlerini python3
komutuyla
çalıştırıyorsunuz.
Bu kitaptan yararlanırken, bu varsayımları göz önünde bulundurmalı, eğer bunlardan farklı
komutlar kullanıyorsanız, kodlarınızı ona göre ayarlamalısınız.
Sistem Komut Satırı ve Python Komut Satırı
Buraya kadar Python programlama dilini nasıl çalıştıracağımız konusundaki bütün bilgileri
edindik. Ancak programlamaya yeni başlayanların çok sık yaptığı bir hata var: Sistem komut
satırı ile Python komut satırını birbirine karıştırmak.
Asla unutmayın, kullandığınız işletim sisteminin komut satırı ile Python’ın komut satırı
birbirinden farklı iki ortamdır. Yani Windows’ta cmd, Ubuntu’da ise Ctrl+Alt+T ile ulaştığınız
ortam sistem komut satırı iken, bu ortamı açıp python3 (veya python ya da py3) komutu
22
Bölüm 4. Python Nasıl Çalıştırılır?
Python 3 için Türkçe Kılavuz, Sürüm 3
vererek ulaştığınız ortam Python’ın komut satırıdır. Sistem komut satırında sistem komutları
(mesela cd, ls, dir, pwd) verilirken, Python komut satırında, biraz sonra öğrenmeye
başlayacağımız Python komutları verilir. Dolayısıyla python3 (veya python ya da py3)
komutunu verdikten sonra ulaştığınız ortamda cd Desktop ve ls gibi sistem komutlarını
kullanmaya çalışmanız sizi hüsrana uğratacaktır.
4.4. Sistem Komut Satırı ve Python Komut Satırı
23
BÖLÜM 5
Etkileşimli Python
Şu ana kadar öğrendiklerimiz sayesinde Python programlama dilinin farklı sistemlere
nasıl kurulacağını ve nasıl çalıştırılacağını biliyoruz.
Dolayısıyla Python’ı bir önceki
bölümde anlattığımız şekilde çalıştırdığımız zaman şuna benzer bir ekranla karşılaşacağımızın
farkındayız:
istihza@ubuntu:~$
# python3 Python 3.5.1 (default,
04.05.2018,
12:24:55)
[GCC 4.4.7
20120313
(Red Hat 4.4.7-3)] on linux Type “help”, “copyright”, “credits” or “license” for more
information. >>>
Biz şimdiye kadar bu ekrana Python komut satırı demeyi tercih ettik. Dilerseniz bundan
sonra da bu adı kullanmaya devam edebilirsiniz. Ancak teknik olarak bu ekrana etkileşimli
kabuk (interactive shell ) adı verildiğini bilmemizde fayda var. Etkileşimli kabuk, bizim Python
programlama dili ile ilişki kurabileceğimiz, yani onunla etkileşebileceğimiz bir üst katmandır.
Etkileşimli kabuk, asıl programımız içinde kullanacağımız kodları deneme imkanı sunar bize.
Burası bir nevi test alanı gibidir. Örneğin bir Python kodunun çalışıp çalışmadığını denemek
veya nasıl çalıştığını, ne sonuç verdiğini görmek istediğimizde bu ekran son derece faydalı bir
araç olarak karşımıza çıkar. Bu ortam, özellikle Python’a yeni başlayanların bu programlama
diline aşinalık kazanmasını sağlaması açısından da bulunmaz bir araçtır. Biz de bu bölümde
etkileşimli kabuk üzerinde bazı çalışmalar yaparak, Python’a alışma turları atacağız.
Bu arada, geçen bölümde söylediğimiz gibi, bu ortamın sistem komut satırı adını verdiğimiz
ortamdan farklı olduğunu aklımızdan çıkarmıyoruz. O zaman da dediğimiz gibi, sistem komut
satırında sistem komutları, Python komut satırında (yani etkileşimli kabukta) ise Python
komutları verilir. Mesela echo %PATH%, cd Desktop, dir ve ls birer sistem komutudur. Eğer
bu komutları etkileşimli kabukta vermeye kalkışırsanız, bunlar birer Python komutu olmadığı
için, Python size bir hata mesajı gösterecektir. Mesela Python’ın etkileşimli kabuğunda cd
Desktop komutunu verirseniz şöyle bir hata alırsınız:
>>> cd Desktop
File "<stdin>", line 1
cd Desktop
^
SyntaxError: invalid syntax
Çünkü cd Desktop bir Python komutu değildir. O yüzden bu komutu Python’ın etkileşimli
kabuğunda veremeyiz. Bu komutu ancak ve ancak kullandığımız işletim sisteminin komut
satırında verebiliriz.
Ne diyorduk? Etkileşimli kabuk bir veya birkaç satırlık kodları denemek/test etmek için gayet
uygun bir araçtır. İsterseniz konuyu daha fazla lafa boğmayalım. Zira etkileşimli kabuğu
24
Python 3 için Türkçe Kılavuz, Sürüm 3
kullandıkça bunun ne büyük bir nimet olduğunu siz de anlayacaksınız. Özellikle derlenerek
çalıştırılan programlama dilleri ile uğraşmış olan arkadaşlarım, etkileşimli kabuğun gücünü
gördüklerinde göz yaşlarına hakim olamayacaklar.
Farklı işletim sistemlerinde py3, py -3, python3 veya python komutunu vererek Python’ın
komut satırına nasıl erişebileceğimizi önceki derslerde ayrıntılı olarak anlatmıştık. Etkileşimli
kabuğa ulaşmakta sıkıntı yaşıyorsanız eski konuları tekrar gözden geçirmenizi tavsiye ederim.
Etkileşimli kabuk üzerinde çalışmaya başlamadan önce dilerseniz önemli bir konuyu açıklığa
kavuşturalım: Etkileşimli kabuğu başarıyla çalıştırdık. Peki bu kabuktan çıkmak istersek
ne yapacağız? Elbette doğrudan pencere üzerindeki çarpı tuşuna basarak bu ortamı terk
edebilirsiniz. Ancak bu işlemi kaba kuvvete başvurmadan yapmanın bir yolu olmalı, değil mi?
Etkileşimli kabuktan çıkmanın birkaç farklı yolu vardır:
1. Pencere üzerindeki çarpı düğmesine basmak (kaba kuvvet)
2. Önce Ctrl+Z tuşlarına, ardından da Enter tuşuna basmak (Windows)
3. Ctrl+Z tuşlarına basmak (GNU/Linux)
4. Önce F6 tuşuna, ardından da Enter tuşuna basmak (Windows)
5. quit() yazıp Enter tuşuna basmak (Bütün işletim sistemleri)
6. import sys; sys.exit() komutunu vermek (Bütün işletim sistemleri)
Siz bu farklı yöntemler arasından, kolayınıza hangisi geliyorsa onu seçebilirsiniz. Bu satırların
yazarı, Windows’ta 2 numaralı; GNU/Linux’ta ise 3 numaralı seçeneği tercih ediyor.
Etkileşimli Kabukta İlk Adımlar
Python’da etkileşimli kabuğu nasıl çalıştıracağımızı ve bu ortamı nasıl terk edeceğimizi
öğrendiğimize göre artık etkileşimli kabuk aracılığıyla Python programlama dilinde ilk
adımlarımızı atmaya başlayabiliriz.
Şimdi kendi sistemimize uygun bir şekilde etkileşimli kabuğu tekrar çalıştıralım. Etkileşimli
kabuğu çalıştırdığımızda ekranda görünen >>> işareti Python’ın bizden komut almaya hazır
olduğunu gösteriyor. Python kodlarımızı bu >>> işaretinden hemen sonra, hiç boşluk
bırakmadan yazacağız.
Buradaki ‘hiç boşluk bırakmadan’ kısmı önemli. Python’a yeni başlayanların en sık yaptığı
hatalardan biri >>> işareti ile komut arasında boşluk bırakmalarıdır. Eğer bu şekilde boşluk
bırakırsanız yazdığınız kod hata verecektir.
İsterseniz basit bir deneme yapalım. >>> işaretinden hemen sonra, hiç boşluk bırakmadan
şu komutu yazalım:
>>> "Merhaba Zalim Dünya!"
Bu arada yukarıdaki kodlar içinde görünen >>> işaretini siz yazmayacaksınız. Bu işareti
etkileşimli kabuğun görünümünü temsil etmek için yerleştirdik oraya. Siz “Merhaba Zalim
Dünya!” satırını yazdıktan sonra doğruca Enter düğmesine basacaksınız.
Bu komutu yazıp Enter tuşuna bastığımızda şöyle bir çıktı almış olmalıyız:
'Merhaba Zalim Dünya!'
5.1. Etkileşimli Kabukta İlk Adımlar
25
Python 3 için Türkçe Kılavuz, Sürüm 3
Böylece yarım yamalak da olsa ilk Python programımızı yazmış olduk...
Muhtemelen bu kod, içinizde en ufak bir heyecan dahi uyandırmamıştır. Hatta böyle bir kod
yazmak size anlamsız bile gelmiş olabilir. Ama aslında şu küçücük kod parçası bile bize Python
programlama dili hakkında çok önemli ipuçları veriyor. Gelin isterseniz bu tek satırlık kodu
biraz inceleyelim...
Karakter Dizilerine Giriş
Dediğimiz gibi, yukarıda yazdığımız küçücük kod parçası sizi heyecanlandırmamış olabilir,
ama aslında bu kod Python programlama dili ve bu dilin yapısı hakkında çok önemli bilgileri
içinde barındırıyor.
Teknik olarak söylemek gerekirse, yukarıda yazdığımız “Merhaba Zalim Dünya!” ifadesi bir
karakter dizisidir. İngilizcede buna string adı verilir ve programlama açısından son derece
önemli bir kavramdır bu. Kavramın adından da rahatlıkla anlayabileceğiniz gibi, bir veya daha
fazla karakterden oluşan öğelere karakter dizisi (string) diyoruz.
Karakter dizileri bütün programcılık maceramız boyunca karşımıza çıkacak. O yüzden bu
kavramı ne kadar erken öğrenirsek o kadar iyi.
Peki bir verinin karakter dizisi olup olmamasının bize ne faydası var? Yani yukarıdaki cümle
karakter dizisi olmuş olmamış bize ne?
Python’da, o anda elinizde bulunan bir verinin hangi tipte olduğunu bilmek son derece
önemlidir. Çünkü bir verinin ait olduğu tip, o veriyle neler yapıp neler yapamayacağınızı
belirler. Python’da her veri tipinin belli başlı özellikleri vardır. Dolayısıyla, elimizdeki
bir verinin tipini bilmezsek o veriyi programlarımızda etkin bir şekilde kullanamayız. İşte
yukarıda örneğini verdiğimiz “Merhaba Zalim Dünya!” adlı karakter dizisi de bir veri tipidir.
Python’da karakter dizileri dışında başka veri tipleri de bulunur. Biraz sonra başka veri
tiplerini de inceleyeceğiz.
Dikkat ederseniz “Merhaba Zalim Dünya!” adlı karakter dizisini tırnak içinde gösterdik. Bu da
çok önemli bir bilgidir. Eğer bu cümleyi tırnak içine almazsak programımız hata verecektir:
>>> Merhaba Zalim Dünya!
File "<stdin>", line 1
Merhaba Zalim Dünya!
^
SyntaxError: invalid syntax
Zaten tırnak işaretleri, karakter dizilerinin ayırt edici özelliğidir. Öyle ki, Python’da tırnak
içinde gösterdiğiniz her şey bir karakter dizisidir. Örneğin şu bir karakter dizisidir:
>>> "a"
Gördüğünüz gibi, tırnak içinde gösterilen tek karakterlik bir öğe de Python’da karakter dizisi
sınıfına giriyor.
Mesela şu, içi boş bir karakter dizisidir:
>>> ""
Şu da içinde bir adet boşluk karakteri barındıran bir karakter dizisi...
26
Bölüm 5. Etkileşimli Python
Python 3 için Türkçe Kılavuz, Sürüm 3
>>> " "
Bu ikisi arasındaki farka dikkat ediyoruz: Python’da ‘boş karakter dizisi’ ve ‘bir adet boşluktan
oluşan karakter dizisi’ birbirlerinden farklı iki kavramdır. Adından da anlaşılacağı gibi, boş
karakter dizileri içlerinde hiçbir karakter (başka bir deyişle ‘öğe’) barındırmayan karakter
dizileridir. Bir (veya daha fazla) boşluktan oluşan karakter dizileri ise içlerinde boşluk karakteri
barındıran karakter dizileridir. Yani bu karakter dizilerinden biri boş, öteki ise doludur. Ama
neticede her ikisi de karakter dizisidir. Şu anda oldukça anlamsız bir konu üzerinde vakit
kaybediyormuşuz hissine kapılmış olabilirsiniz, ama emin olun, Python programlama diline
yeni başlayanların önemli tökezleme noktalarından biridir bu söylediğimiz şey...
Dilerseniz biz karakter dizilerine elimizin alışması için birkaç örnek verelim:
>>> "Elma"
'Elma'
>>> "Guido Van Rossum"
'Guido Van Rossum'
>>> "Python programlama dili"
'Python programlama dili'
>>> "ömnhbgfgh"
'ömnhbgfgh'
>>> "$5&"
'$5&'
>>> ""
''
>>> " "
' '
>>> " "
' '
Yukarıdaki örneklerin hepsi birer karakter dizisidir. Dikkat ettiyseniz yukarıdaki karakter
dizilerinin hepsinin ortak özelliği tırnak içinde gösteriliyor olmasıdır. Dediğimiz gibi, tırnak
işaretleri karakter dizilerinin ayırt edici özelliğidir.
Peki bir verinin karakter dizisi olup olmadığından nasıl emin olabilirsiniz?
Eğer herhangi bir verinin karakter dizisi olup olmadığı konusunda tereddütünüz varsa, type()
adlı bir fonksiyondan yararlanarak o verinin tipini sorgulayabilirsiniz. Bu fonksiyonu şöyle
kullanıyoruz:
>>> type("Elma")
<class 'str'>
5.1. Etkileşimli Kabukta İlk Adımlar
27
Python 3 için Türkçe Kılavuz, Sürüm 3
Not: Bu ‘fonksiyon’ kelimesinin kafanızı karıştırmasına izin vermeyin. İlerde fonksiyonları
oldukça ayrıntılı bir şekilde inceleyeceğimiz için, type() ifadesinin bir fonksiyon olduğunu
bilmeniz şimdilik yeterli olacaktır. Üstelik fonksiyon konusunu ayrıntılı bir şekilde anlatma
vakti geldiğinde siz fonksiyonlara dair pek çok şeyi zaten öğrenmiş olacaksınız.
Burada amacımız “Elma” adlı öğenin tipini denetlemek. Denetlenecek öğeyi type()
fonksiyonunun parantezleri arasında belirttiğimize dikkat edin. (Fonksiyonların parantezleri
içinde belirtilen değerlere teknik dilde parametre adı verilir.)
Yukarıdaki çıktıda bizi ilgilendiren kısım, sondaki ‘str’ ifadesi. Tahmin edebileceğiniz gibi,
bu ifade string kelimesinin kısaltmasıdır. Bu kelimenin Türkçede karakter dizisi anlamına
geldiğini söylemiştik. O halde yukarıdaki çıktıya bakarak, “Elma” öğesinin bir karakter dizisi
olduğunu söyleyebiliyoruz.
type() fonksiyonu yardımıyla kendi kendinize bazı denemeler yaparak konuyu iyice
sindirmenizi tavsiye ederim. Mesela “½{656$#gfd” ifadesinin hangi sınıfa girdiğini kontrol
etmekle başlayabilirsiniz.
Peki karakter dizileri ile neler yapabiliriz? Şu anda Python bilgimiz kısıtlı olduğu için karakter
dizileri ile çok fazla şey yapamayız, ama ilerde bilgimiz arttıkça, karakter dizileriyle sıkı fıkı
olacağız.
Esasında, henüz bilgimiz kısıtlı da olsa karakter dizileriyle yine de ufak tefek bazı şeyler
yapamayacak durumda değiliz. Mesela şu anki bilgilerimizi ve görür görmez size tanıdık
gelecek bazı basit parçaları kullanarak, karakter dizilerini birbirleriyle birleştirebiliriz:
>>> "istihza" + ".com"
'istihza.com'
Burada + işaretini kullanarak karakter dizilerini nasıl birleştirebildiğimize dikkat edin. İki
karakter dizisini + işareti ile birleştirdiğimizde karakter dizilerinin arasında boşluk olmadığına
özellikle dikkatinizi çekmek isterim. Bu durumu şu örnekte daha net görebiliriz:
>>> "Fırat" + "Özgül"
'FıratÖzgül'
Gördüğünüz gibi, bu iki karakter dizisi, arada boşluk olmadan birbiriyle bitiştirildi. Araya
boşluk eklemek için birkaç farklı yöntemden yararlanabilirsiniz:
>>> "Fırat" + " " + "Özgül"
'Fırat Özgül'
Burada iki karakter dizisi arasına bir adet boşluk karakteri yerleştirdik. Aynı etkiyi şu şekilde
de elde edebilirsiniz:
>>> "Fırat" + " Özgül"
Burada da Özgül karakter dizisinin başına bir adet boşluk yerleştirerek istediğimiz çıktıyı elde
ettik.
Bu arada, karakter dizilerini birleştirmek için mutlaka + işareti kullanmak zorunda değilsiniz.
Siz
+ işaretini kullanmasanız da Python sizin karakter dizilerini birleştirmek istediğinizi
28
Bölüm 5. Etkileşimli Python
Python 3 için Türkçe Kılavuz, Sürüm 3
anlayacak kadar zekidir:
>>> "www" "." "google" "." "com"
'www.google.com'
Ancak gördüğünüz gibi, + işaretini kullandığınızda kodlarınız daha okunaklı oluyor.
+ işareti dışında karakter dizileri ile birlikte * (çarpı) işaretini de kullanabiliriz. O zaman şöyle
bir etki elde ederiz:
>>> "w" * 3
'www'
>>> "yavaş " * 2
'yavaş yavaş '
>>> "-" * 10
'----------'
>>> "uzak" + " " * 5 + "çok uzak..."
'uzak
çok uzak...'
Gördüğünüz gibi, çok basit parçaları bir araya getirerek karmaşık çıktılar elde edebiliyoruz.
Mesela son örnekte “uzak” adlı karakter dizisine önce 5 adet boşluk karakteri (" " * 5),
ardından da “çok uzak...” adlı karakter dizisini ekleyerek istediğimiz çıktıyı aldık.
Burada + ve * adlı iki yeni araç görüyoruz. Bunlar aslında sayılarla birlikte kullanılan birer
aritmetik işleçtir. Normalde + işleci toplama işlemleri için, * işleci ise çarpma işlemleri için
kullanılır. Ama yukarıdaki örneklerde, + işaretinin ‘birleştirme’; * işaretinin ise ‘tekrarlama’
anlamından ötürü bu iki işleci bazı durumlarda karakter dizileri ile birlikte de kullanabiliyoruz.
Bunların dışında bir de - (eksi) ve / (bölü) işleçleri bulunur. Ancak bu işaretleri karakter dizileri
ile birlikte kullanamıyoruz.
Karakter dizilerini sonraki bir bölümde bütün ayrıntılarıyla inceleyeceğiz. O yüzden şimdilik
bu konuya bir ara verelim.
Sayılara Giriş
Dedik ki, Python’da birtakım veri tipleri bulunur ve karakter dizileri de bu veri tiplerinden
yalnızca biridir. Veri tipi olarak karakter dizilerinin dışında, biraz önce aritmetik işleçler
vesilesiyle sözünü ettiğimiz, bir de ‘sayı’ (number) adlı bir veri tipi vardır.
Herhalde sayıların ne anlama geldiğini tarif etmeye gerek yok. Bunlar bildiğimiz sayılardır.
Mesela:
>>> 23
23
>>> 4567
4567
5.1. Etkileşimli Kabukta İlk Adımlar
29
Python 3 için Türkçe Kılavuz, Sürüm 3
>>> 2.3
2.3
>>> (10+2j)
(10+2j)
Python’da sayıların farklı alt türleri bulunur. Mesela tamsayılar, kayan noktalı sayılar,
karmaşık sayılar...
Yukarıdaki örnekler arasında geçen 23 ve 4567 birer tamsayıdır. İngilizcede bu tür sayılara
integer adı verilir.
2.3 ise bir kayan noktalı sayıdır (2oating point number veya kısaca 2oat ). Bu arada kayan
noktalı sayılarda basamak ayracı olarak virgül değil, nokta işareti kullandığımıza dikkat edin.
En sonda gördüğümüz 10+2j sayısı ise bir karmaşık sayıdır (complex). Ancak eğer
matematikle yoğun bir şekilde uğraşmıyorsanız karmaşık sayılar pek karşınıza çıkmaz.
Sayıları temel olarak öğrendiğimize göre etkileşimli kabuğu basit bir hesap makinesi niyetine
kullanabiliriz:
>>> 5 + 2
7
>>> 25 * 25
625
>>> 5 / 2
2.5
>>> 10 - 3
7
Yukarıdaki örneklerde kullandığımız aritmetik işleçlerden biraz önce bahsetmiştik. O yüzden
bunlara yabancılık çektiğinizi zannetmiyorum. Ama biz yine de bu işleçleri ve görevlerini
şöylece sıralayalım:
İşleç
Görevi
+
toplama
-
çıkarma
*
çarpma
/
bölme
Yukarıdaki örneklerde bir şey dikkatinizi çekmiş olmalı: Karakter dizilerini tanımlarken tırnak
işaretlerini kullandık. Ancak sayılarda tırnak işareti yok. Daha önce de dediğimiz gibi, tırnak
işaretleri karakter dizilerinin ayırt edici özelliğidir. Python’da tırnak içinde gösterdiğiniz her
şey bir karakter dizisidir. Mesela şu örneklere bakalım:
>>> 34657
34657
30
Bölüm 5. Etkileşimli Python
Python 3 için Türkçe Kılavuz, Sürüm 3
Bu bir sayıdır. Peki ya şu?
>>> "34657"
'34657'
Bu ise bir karakter dizisidir. Dilerseniz biraz önce öğrendiğimiz type() fonksiyonu yardımıyla
bu verilerin tipini sorgulayalım:
>>> type(34657)
<class 'int'>
Buradaki ‘int’ ifadesi İngilizce “integer”, yani tamsayı kelimesinin kısaltmasıdır. Demek ki
34657 sayısı bir tamsayı imiş. Bir de şuna bakalım:
>>> type("34657")
<class 'str'>
Gördüğünüz gibi, 34657 sayısını tırnak içine aldığımızda bu sayı artık sayı olma özelliğini
yitiriyor ve bir karakter dizisi oluyor. Şu anda bu çok önemsiz bir ayrıntıymış gibi gelebilir
size, ama aslında son derece önemli bir konudur bu. Bu durumun etkilerini şu örneklerde
görebilirsiniz:
>>> 23 + 65
88
Burada normal bir şekilde iki sayıyı birbiriyle topladık.
Bir de şuna bakın:
>>> "23" + "65"
'2365'
Burada ise Python iki karakter dizisini yan yana yazmakla yetindi; yani bunları birleştirdi.
Python açısından “23” ve 23 birbirinden farklıdır. “23” bir karakter dizisi iken, 23 bir sayıdır.
Aynı şey “65” ve 65 için de geçerlidir. Yani Python açısından “65” ile “Merhaba Zalim Dünya!”
arasında hiç bir fark yoktur. Bunların ikisi de karakter dizisi sınıfına girer. Ancak 65 ile “65”
birbirinden farklıdır. 65 bir sayı iken, “65” bir karakter dizisidir.
Bu bilgi, özellikle aritmetik işlemlerde büyük önem taşır. Bunu dilerseniz şu örnekler üzerinde
gösterelim:
>>> 45 + "45"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'
Gördüğünüz gibi, yukarıdaki kodlar hata veriyor. Bunun sebebi bir sayı (45 ) ile bir karakter
dizisini (“45” ) birbiriyle toplamaya çalışmamızdır. Asla unutmayın, aritmetik işlemler ancak
sayılar arasında yapılır. Karakter dizileri ile herhangi bir aritmetik işlem yapılamaz.
Bir de şuna bakalım:
5.1. Etkileşimli Kabukta İlk Adımlar
31
Python 3 için Türkçe Kılavuz, Sürüm 3
>>> 45 + 45
90
Bu kodlar ise düzgün çalışır. Çünkü burada iki sayıyı aritmetik işleme soktuk ve başarılı olduk.
Son olarak şu örneği verelim:
>>> "45" + "45"
'4545'
Burada + işlecinin toplama anlamına gelmediğine dikkat edin. Bu işleç burada iki karakter
dizisini birleştirme görevi üstleniyor. Yani yukarıdaki örneğin şu örnekten hiçbir farkı yoktur:
>>> "istihza." + "com"
'istihza.com'
Bu iki örnekte de yaptığımız şey karakter dizilerini birbiriyle birleştirmektir.
Gördüğünüz gibi, + işlecinin sağındaki ve solundaki değerler birer karakter dizisi ise bu işleç
bu iki değeri birbiriyle birleştiriyor. Ama eğer bu değerler birer sayı ise + işleci bu değerleri
birbiriyle aritmetik olarak topluyor.
* işleci de + işlecine benzer bir iş yapar. Yani eğer * işleci bir sayı ve bir karakter dizisi ile
karşılaşırsa, o karakter dizisini, verilen sayı kadar tekrarlar. Örneğin:
>>> "w" * 3
'www'
Burada * işleci bir karakter dizisi (“w” ) ve bir sayı (3 ) arasında işlem yaptığı için, karakter
dizisini, ilgili sayı kadar tekrarlıyor. Yani “w” karakter dizisini 3 kez tekrarlıyor.
Bir de şuna bakalım:
>>> 25 * 3
75
Burada ise * işleci iki adet sayı arasında işlem yaptığı için bu değerleri birbiriyle aritmetik
olarak çarpıyor ve 75 değerini elde etmemizi sağlıyor.
Gördüğünüz gibi, o anda elimizde bulunan verilerin tipini bilmek gerçekten de büyük önem
taşıyor. Çünkü eğer elimizdeki verilerin tipini bilmezsek nasıl sonuçlar elde edeceğimizi de
kestiremeyiz.
Böylece karakter dizileri ile sayılar arasındaki farkı öğrenmiş olduk. Bu bilgiler size
önemsizmiş gibi gelebilir, ama aslında karakter dizileri ile sayılar arasındaki farkı anlamak,
Python programlama dilinin önemli bir bölümünü öğrenmiş olmak demektir. İleride
yazacağınız en karmaşık programlarda bile, bazen programınızın çalışmamasının (veya daha
kötüsü yanlış çalışmasının) nedeninin karakter dizileri ile sayıları birbirine karıştırmanız
olduğunu göreceksiniz. O yüzden burada öğrendiğiniz hiçbir bilgi kırıntısını baştan
savmamanızı (ve sabırsızlık ya da acelecilik etmemenizi) tavsiye ederim.
32
Bölüm 5. Etkileşimli Python
Python 3 için Türkçe Kılavuz, Sürüm 3
Değişkenler
Şimdi şöyle bir durum düşünün: Diyelim ki sisteme kayıt için kullanıcı adı ve parola
belirlenmesini isteyen bir program yazıyorsunuz. Yazacağınız bu programda, belirlenebilecek
kullanıcı adı ve parolanın toplam uzunluğu 40 karakteri geçmeyecek.
Bu programı yazarken ilk aşamada yapmanız gereken şey, kullanıcının belirlediği kullanıcı adı
ve parolanın uzunluğunu tek tek denetlemek olmalı.
Mesela kullanıcı şöyle bir kullanıcı adı belirlemiş olsun:
firat_ozgul_1980
Kullanıcının belirlediği parola ise şu olsun:
rT%65#$hGfUY56123
İşte bizim öncelikle kullanıcıdan gelen bu verilerin teker teker uzunluğunu biliyor olmamız
lazım, ki bu verilerin toplam 40 karakter sınırını aşıp aşmadığını denetleyebilelim.
Peki bu verilerin uzunluğunu nasıl ölçeceğiz? Elbette bunun için verilerdeki har2eri elle
tek tek saymayacağız. Bunun yerine, Python programlama dilinin bize sunduğu bir aracı
kullanacağız. Peki nedir bu araç?
Hatırlarsanız birkaç sayfa önce type() adlı bir fonksiyondan söz etmiştik. Bu fonksiyonun
görevi bir verinin hangi tipte olduğunu bize bildirmekti. İşte tıpkı type() gibi, Python’da
len() adlı başka bir fonksiyon daha bulunur. Bu fonksiyonun görevi ise karakter dizilerinin
(ve ileride göreceğimiz gibi, başka veri tiplerinin) uzunluğunu ölçmektir. Yani bu fonksiyonu
kullanarak bir karakter dizisinin toplam kaç karakterden oluştuğunu öğrenebiliriz.
Biz henüz kullanıcıdan nasıl veri alacağımızı bilmiyoruz. Ama şimdilik şunu söyleyebiliriz:
Python’da kullanıcıdan herhangi bir veri aldığımızda, bu veri bize bir karakter dizisi olarak
gelecektir. Yani kullanıcıdan yukarıdaki kullanıcı adı ve parolayı aldığımızı varsayarsak, bu
veriler bize şu şekilde gelir:
"firat_ozgul_1980"
ve:
"rT%65#$hGfUY56123"
Gördüğünüz gibi, elde ettiğimiz veriler tırnak içinde yer alıyor. Yani bunlar birer karakter
dizisi.
Şimdi gelin yukarıda bahsettiğimiz len() fonksiyonunu kullanarak bu karakter
dizilerinin uzunluğunu ölçelim.
Dediğimiz gibi, len() de tıpkı type() gibi bir fonksiyondur. Dolayısıyla len() fonksiyonunun
kullanımı type() fonksiyonunun kullanımına çok benzer. Nasıl type() fonksiyonu bize,
kendisine verdiğimiz parametrelerin tipini söylüyorsa, len() fonksiyonu da kendisine
verdiğimiz parametrelerin uzunluğunu söyler.
Dikkatlice bakın:
>>> len("firat_ozgul_1980")
16
>>> len("rT%65#$hGfUY56123")
5.1. Etkileşimli Kabukta İlk Adımlar
33
Python 3 için Türkçe Kılavuz, Sürüm 3
17
Demek ki “1rat_ozgul_1980” adlı karakter dizisinde 16 ; “rT%65#$hGfUY56123” adlı karakter
dizisinde ise 17 karakter varmış. Bizim istediğimiz şey bu iki değerin toplam uzunluğunun 40
karakteri aşmaması. Bunu denetlemek için yapmamız gereken şey bu iki değerin uzunluğunu
birbiriyle toplamak olmalı. Yani:
>>> len("firat_ozgul_1980") + len("rT%65#$hGfUY56123")
Buradan alacağımız sonuç 33 olacaktır. Demek ki kullanıcı 40 karakter limitini aşmamış. O
halde programımız bu kullanıcı adı ve parolayı kabul edebilir...
Bu arada, belki farkettiniz, belki de farketmediniz, ama burada da çok önemli bir durumla
karşı karşıyayız. Gördüğünüz gibi len() fonksiyonu bize sayı değerli bir veri gönderiyor. Gelin
isterseniz bunu teyit edelim:
>>> type(len("firat_ozgul_1980"))
<class 'int'>
len() fonksiyonunun bize sayı değerli bir veri göndermesi sayesinde bu fonksiyondan elde
ettiğimiz değerleri birbiriyle toplayabiliyoruz:
>>> len("firat_ozgul_1980") + len("rT%65#$hGfUY56123")
33
Eğer len() fonksiyonu bize sayı değil de mesela karakter dizisi verseydi, bu fonksiyondan elde
ettiğimiz değerleri yukarıdaki gibi doğrudan birbiriyle aritmetik olarak toplayamazdık. Öyle
bir durumda, bu iki veriyi birbiriyle toplamaya çalıştığımızda, + işleci 16 ve 17 değerlerini
birbiriyle toplamak yerine bu değerleri birbiriyle birleştirerek bize ‘1617’ gibi bir sonuç
verecekti.
Her zaman söylediğimiz gibi, Python’da veri tipi kavramını çok iyi anlamak ve o anda elimizde
bulunan bir verinin hangi tipte olduğunu bilmek çok önemlidir. Aksi halde programlarımızda
hata yapmamız kaçınılmazdır.
Eğer yukarıda anlattığımız şeyleri kafa karıştırıcı bulduysanız hiç endişe etmeyin. Birkaç
bölüm sonra input() adlı bir fonksiyondan bahsettiğimizde şimdi söylediğimiz şeyleri çok
daha net anlayacaksınız.
Biraz sonra len() fonksiyonundan bahsetmeye devam edeceğiz, ama isterseniz ondan önce
çok önemli bir konuya değinelim.
Biraz önce şöyle bir örnek vermiştik:
>>> len("firat_ozgul_1980")
16
>>> len("rT%65#$hGfUY56123")
17
>>> len("firat_ozgul_1980") + len("rT%65#$hGfUY56123")
34
Bölüm 5. Etkileşimli Python
Python 3 için Türkçe Kılavuz, Sürüm 3
Bu kodlar, istediğimiz şeyi gayet güzel yerine getiriyor. Ama sizce de yukarıdaki kodlarda çok
rahatsız edici bir durum yok mu?
Dikkat ederseniz, yukarıdaki örneklerde kullandığımız verileri, program içinde her
ihtiyaç duyduğumuzda tekrar tekrar yazdık.
Böylece aynı program içinde iki kez
“1rat_ozgul_1980” ; iki kez de “rT%65#$hGfUY56123” yazmak zorunda kaldık. Halbuki bu
verileri programlarımızın içinde her ihtiyaç duyduğumuzda tekrar tekrar yazmak yerine bir
değişkene atasak ve gerektiğinde o değişkeni kullansak çok daha iyi olmaz mı? Herhalde
olur...
Peki nedir bu değişken dediğimiz şey?
Python’da bir program içinde değerlere verilen isimlere değişken denir. Hemen bir örnek
verelim:
>>> n = 5
Burada 5 sayısını bir değişkene atadık. Değişkenimiz ise n. Ayrıca 5 sayısını bir değişkene
atamak için = işaretinden yararlandığımıza da çok dikkat edin. Buradan, = işaretinin Python
programlama dilinde değer atama işlemleri için kullanıldığı sonucunu çıkarıyoruz.
n = 5 gibi bir komut yardımıyla 5 değerini n adlı değişkene atamamız sayesinde artık ne
zaman 5 sayısına ihtiyaç duysak bu n değişkenini çağırmamız yeterli olacaktır:
>>> n
5
>>> n * 10
50
>>> n / 2
2.5
Gördüğünüz gibi, 5
değerini bir değişkene atadıktan sonra, bu 5
değerini kullanmamız
gereken yerlerde sadece değişkenin adını kullandığımızda değişkenin değerini Python
otomatik olarak yerine koyabiliyor. Yani n = 5 komutuyla n adlı bir değişken tanımladıktan
sonra, artık ne zaman 5 sayısına ihtiyaç duysak n değişkenini çağırmamız yeterli olacaktır.
Python o 5 değerini otomatik olarak yerine koyar.
Şimdi de pi adlı başka bir değişken tanımlayalım:
>>> pi = 3.14
Bu pi değişkeninin değeri ile n değişkeninin değerini toplayalım:
>>> pi + n
8.14
Gördüğünüz gibi, değerleri her defasında tekrar yazmak yerine bunları bir değişkene atayıp,
gereken yerde bu değişkeni kullanmak çok daha pratik bir yöntem.
Aynı şeyi programımız için de yapabiliriz:
>>> kullanıcı_adı = "firat_ozgul_1980"
>>> parola = "rT%65#$hGfUY56123"
5.1. Etkileşimli Kabukta İlk Adımlar
35
Python 3 için Türkçe Kılavuz, Sürüm 3
= işaretini kullanarak ilgili değerlere artık birer ad verdiğimiz, yani bu değerleri birer
değişkene atadığımız için, bu değerleri kullanmamız gereken yerlerde değerlerin kendisini
uzun uzun yazmak yerine, belirlediğimiz değişken adlarını kullanabiliriz. Mesela:
>>> len(kullanıcı_adı)
16
>>> len(parola)
17
>>> len(kullanıcı_adı) + len(parola)
33
>>> k_adı_uzunluğu = len(kullanıcı_adı)
>>> type(k_adı_uzunluğu)
<class 'int'>
Gördüğünüz gibi, değişken kullanımı işlerimizi bir hayli kolaylaştırıyor.
Değişken Adı Belirleme Kuralları
Python programlama dilinde, değişken adı olarak belirleyebileceğimiz kelime sayısı
neredeyse sınırsızdır. Yani hemen hemen her kelimeyi değişken adı olarak kullanabiliriz.
Ama yine de değişken adı belirlerken dikkat etmemiz gereken bazı kurallar var. Bu kuralların
bazıları zorunluluk, bazıları ise yalnızca tavsiye niteliğindedir.
Şimdi bu kuralları tek tek inceleyelim:
1. Değişken adları bir sayı ile başlayamaz. Yani şu kullanım yanlıştır:
>>> 3_kilo_elma = "5 TL"
2. Değişken adları aritmetik işleçlerle başlayamaz. Yani şu kullanım yanlıştır:
>>> +değer = 4568
3. Değişken adları ya bir alfabe har1yle ya da _ işaretiyle başlamalıdır:
>>> _değer = 4568
>>> değer = 4568
4. Değişken adları içinde Türkçe karakterler kullanabilirsiniz. Ancak ileride beklenmedik uyum
sorunları çıkması ihtimaline karşı değişken adlarında Türkçe karakter kullanmaktan kaçınmak
isteyebilirsiniz.
5. Aşağıdaki kelimeleri değişken adı olarak kullanamazsınız:
['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class',
'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for',
'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not',
'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
Bunlar Python’da özel anlam ifade eden kelimelerdir. Etkileşimli kabuk zaten bu kelimeleri
değişken adı olarak kullanmanıza izin vermez. Örneğin:
36
Bölüm 5. Etkileşimli Python
Python 3 için Türkçe Kılavuz, Sürüm 3
>>> elif = "hoş kız"
File "<stdin>", line 1
elif = "hoş kız"
^
SyntaxError: invalid syntax
>>> as = "kare"
File "<stdin>", line 1
as = "kare"
^
SyntaxError: invalid syntax
>>> False = 45
File "<stdin>", line 1
SyntaxError: assignment to keyword
Ama ilerde göreceğimiz gibi, programlarınızı bir dosyaya yazarken bu kelimeleri değişken adı
olarak kullanmaya çalışırsanız programınız tespit etmesi çok güç hatalar üretecektir.
Bu arada elbette yukarıdaki listeyi bir çırpıda ezberlemeniz beklenmiyor sizden. Python
programlama dilini öğrendikçe özel kelimeleri bir bakışta tanıyabilecek duruma geleceksiniz.
Ayrıca eğer isterseniz şu komutları vererek, istediğiniz her an yukarıdaki listeye ulaşabilirsiniz:
>>> import keyword
>>> keyword.kwlist
['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class',
'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for',
'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not',
'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
Size bir soru: Acaba bu listede kaç tane kelime var?
Bu soru karşısında listedeki kelimeleri tek tek elle saymaya kalkışan arkadaşlarıma
teessü2erimi iletiyorum... Bu tür işler için hangi aracı kullanabileceğimizi artık çok iyi biliyor
olmalısınız:
>>> len(keyword.kwlist)
33
Bu kodları şöyle yazabileceğimizi de biliyorsunuz:
>>> yasaklı_kelimeler = keyword.kwlist
>>> len(yasaklı_kelimeler)
33
Bu arada, yukarıdaki kodların bir kısmını henüz anlayamamış olabilirsiniz. Hiç endişe
etmeyin. Yukarıdaki kodları vermemizin sebebi değişken adı olarak kullanılamayacak
kelimelere kısa yoldan nasıl ulaşabileceğinizi gösterebilmek içindir. Bir-iki bölüm sonra
burada yazdığımız kodları rahatlıkla anlayabilecek düzeye geleceksiniz.
Yukarıda verdiğimiz kodların çıktısından anladığımıza göre, toplam 33 tane kelime varmış
değişken adı belirlerken kullanmaktan kaçınmamız gereken...
5.1. Etkileşimli Kabukta İlk Adımlar
37
Python 3 için Türkçe Kılavuz, Sürüm 3
6.
Yukarıdaki kelimeler dışında, Python programlama diline ait fonksiyon ve benzeri
araçların adlarını da değişken adı olarak kullanmamalısınız. Örneğin yazdığınız programlarda
değişkenlerinize type veya len adı vermeyin. Çünkü ‘type’ ve ‘len’ Python’a ait iki önemli
fonksiyonun adıdır. Eğer mesela bir değişkene type adını verirseniz, o programda artık
type() fonksiyonunu kullanamazsınız:
>>> type = 3456
Bu örnekte type adında bir değişken tanımladık. Şimdi mesela “elma” kelimesinin tipini
denetlemek için type() fonksiyonunu kullanmaya çalışalım:
>>> type("elma")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
Gördüğünüz gibi, artık type() fonksiyonu çalışmıyor. Çünkü siz ‘type’ kelimesini bir değişken
adı olarak kullanarak, type() fonksiyonunu kullanılamaz hale getirdiniz.
Bu durumdan kurtulmak için etkileşimli kabuğu kapatıp tekrar açabilirsiniz. Ya da eğer
etkileşimli kabuğu kapatmak istemiyorsanız şu komut yardımıyla type değişkenini ortadan
kaldırmayı da tercih edebilirsiniz:
>>> del type
Böylece, (tahmin edebileceğiniz gibi delete (silmek) kelimesinin kısaltması olan) del
komutuyla type değişkenini silmiş oldunuz. Artık ‘type’ kelimesi yine type() fonksiyonunu
çağıracak:
>>> type("elma")
<class 'str'>
7. Değişken adlarını belirlerken, değişkeni oluşturan kelimeler arasında boşluk bırakılamaz.
Yani şu kullanım yanlıştır:
>>> kullanıcı adı = "istihza"
Yukarıdaki değişkeni şu şekilde tanımlayabiliriz:
>>> kullanıcı_adı = "istihza"
Ya da şöyle:
>>> kullanıcıAdı = "istihza"
8.
Değişken adları belirlerken, değişken adının, değişkenin değerini olabildiğince
betimlemesine dikkat etmemiz kodlarımızın okunaklılığını artıracaktır. Örneğin:
>>> personel_sayısı = 45
Yukarıdaki, tanımladığı değere uygun bir değişken adıdır. Şu ise kurallara uygun bir değişken
adı olsa da yeterince betimleyici değildir:
>>> sayı = 45
9. Değişken adları ne çok kısa, ne de çok uzun olmalıdır. Mesela şu değişken adı, kodları
okuyan kişiye, değişken değerinin anlamı konusunda pek 1kir vermez:
38
Bölüm 5. Etkileşimli Python
Python 3 için Türkçe Kılavuz, Sürüm 3
>>> a = 345542353
Şu değişken adı ise gereksiz yere uzundur:
>>> türkiye_büyük_millet_meclisi_milletvekili_sayısı = 550
Değişken adlarının uzunluğunu makul seviyede tutmak esastır:
>>> tbmm_mv_sayısı = 550
Yukarıda verdiğimiz bütün bu örnekler bize, Python’da değişkenlerin, değerlere atanmış
adlardan ibaret olduğunu gösteriyor. Değişkenler, yazdığımız programlarda bize çok büyük
kolaylık sağlar. Mesela 123432456322 gibi bir sayıyı ya da “Türkiye Cumhuriyeti Çalışma ve
Sosyal Güvenlik Bakanlığı” gibi bir karakter dizisini gerektiği her yerde tek tek elle yazmak
yerine, bunları birer değişkene atayarak, gerektiğinde sadece bu değişken adını kullanmak
çok daha mantıklı bir iştir.
Ayrıca zaten ileride kullanıcıdan veri almaya başladığınızda, aldığınız bu verileri, yazdığınız
programda kullanabilmek için mutlaka bir değişkene atamanız gerekecek. O yüzden
Python’daki değişken kavramını şimdiden iyi tanıyıp anlamakta büyük fayda var.
Uygulama Örnekleri
Gelin isterseniz yukarıda verdiğimiz bilgileri pekiştirmek için birkaç ufak alıştırma yapalım,
alıştırma yaparken de sizi yine Python programlama diline ilişkin çok önemli bazı yeni
bilgilerle tanıştıralım.
Diyelim ki aylık yol masrafımızı hesaplayan bir program yazmak istiyoruz. Elimizdeki verilerin
şunlar olduğunu varsayalım:
1. Cumartesi-Pazar günleri çalışmıyoruz.
2. Dolayısıyla ayda 22 gün çalışıyoruz.
3. Evden işe gitmek için kullandığımız vasıtanın ücreti 1.5 TL
4. İşten eve dönmek için kullandığımız vasıtanın ücreti 1.4 TL
Aylık yol masrafımızı hesaplayabilmek için gidiş ve dönüş ücretlerini toplayıp, bunları
çalıştığımız gün sayısıyla çarpmamız yeterli olacaktır. Elimizdeki bu bilgilere göre aylık yol
masrafımızı hesaplamak için şöyle bir formül üretebiliriz:
masraf = gün sayısı x (gidiş ücreti + dönüş ücreti)
Dilerseniz hemen bunu bir Python programı haline getirelim:
>>> 22 * (1.5 + 1.4)
63.8
Demek ki bir ayda 63.8 TL’lik bir yol masrafımız varmış.
Bu arada, yukarıdaki örnekte bir şey dikkatinizi çekmiş olmalı. Aritmetik işlemi yaparken bazı
sayıları parantez içine aldık. Python’da aritmetik işlemler yapılırken alıştığımız matematik
kuralları geçerlidir. Yani mesela aynı anda bölme, çıkarma, toplama ve çarpma işlemleri
yapılacaksa işlem öncelik sırası önce bölme ve çarpma, sonra toplama ve çıkarma şeklinde
olacaktır. Elbette siz parantezler yardımıyla bu işlem sırasını değiştirebilirsiniz.
5.1. Etkileşimli Kabukta İlk Adımlar
39
Python 3 için Türkçe Kılavuz, Sürüm 3
Bu anlattıklarımıza göre, eğer yukarıda yol masrafını hesaplayan programda parantezleri
kullanmazsak, işlem öncelik kuralları gereğince Python önce 22 ile 1.5 ‘i çarpıp, çıkan sonucu
1.4
ile toplayacağı için elde ettiğimiz sonuç yanlış çıkacaktır. Bizim burada doğru sonuç
alabilmemiz için önce 1.5 ile 1.4 ‘ü toplamamız, çıkan sonucu da 22 ile çarpmamız gerekiyor.
Bu sıralamayı da parantezler yardımıyla elde ediyoruz.
Yine dikkat ederseniz, yukarıdaki örnek programda aslında çok verimsiz bir yol izledik.
Gördüğünüz gibi, bu programda bütün değerleri tek tek elle kendimiz giriyoruz. Örneğin
çalışılan gün sayısına karşılık gelen 22 değerini başka bir yerde daha kullanmak istesek aynı
sayıyı tekrar elle doğrudan kendimiz girmek zorundayız. Mesela yılda kaç gün çalıştığımızı
hesaplayalım:
>>> 22 * 12
264
Gördüğünüz gibi, burada da 22 sayısına ihtiyaç duyduk. Aslında değerleri bu şekilde her
defasında tekrar tekrar elle girmek hem hata yapma riskini artırdığı, hem de bize fazladan
iş çıkardığı için tercih edilmeyen bir yöntemdir. Bunun yerine, 22 sayısına bir isim verip,
gereken yerlerde bu ismi kullanmak daha mantıklı olacaktır. Yani tıpkı kullanıcı ve parola
örneğinde olduğu gibi, burada da verileri öncelikle bir değişkene atamak çok daha akıllıca bir
iştir:
>>> gün = 22
>>> gidiş_ücreti = 1.5
>>> dönüş_ücreti = 1.4
>>> gün * (gidiş_ücreti + dönüş_ücreti)
63.8
Bütün değerleri birer değişkene atadığımız için, artık bu değişkenleri istediğimiz yerde
kullanabiliriz. Mesela yılda toplam kaç gün çalıştığımızı bulmak istersek, ilgili değeri elle
yazmak yerine, yukarıda tanımladığımız gün değişkenini kullanabiliriz:
>>> gün * 12
264
İlerleyen zamanda aylık çalışılan gün sayısı değişirse sadece gün değişkeninin değerini
değiştirmemiz yeterli olacaktır:
>>> gün = 23
>>> gün * (gidiş_ücreti + dönüş_ücreti)
66.7
>>> gün * 12
276
Eğer bu şekilde değişken atamak yerine, değerleri gerektiği her yerde elle yazsaydık, bu
değerlerde herhangi bir değişiklik yapmamız gerektiğinde program içinde geçen ilgili bütün
değerleri bulup tek tek değiştirmemiz gerekecekti:
>>> 23 * (1.6 + 1.5)
71.3
40
Bölüm 5. Etkileşimli Python
Python 3 için Türkçe Kılavuz, Sürüm 3
>>> 23 * 12
276
Değişken kavramı şu anda gözünüze pek anlamlı görünmemiş olabilir. Ama programlarımızı
ilerde dosyaya kaydettiğimiz zaman bu değişkenler çok daha kullanışlı araçlar olarak
karşımıza çıkacaktır.
Dilerseniz bir örnek daha yaparak yukarıdaki bilgilerin kafamıza iyice yerleşmesiniz
sağlayalım. Mesela bir dairenin alanını (yaklaşık olarak) hesaplayan bir program yazalım.
Öncelikle çap adlı bir değişken tanımlayarak dairenin çapını belirleyelim:
>>> çap = 16
Bu değeri kullanarak dairemizin yarıçapını hesaplayabiliriz. Bunun için çap değişkeninin
değerinin yarısını almamız yeterli olacaktır:
>>> yarıçap = çap / 2
pi sayısını 3.14159 olarak alalım.
>>> pi = 3.14159
Bir dairenin alan formülü (pi)r2‘dir:
>>> alan = pi * (yarıçap * yarıçap)
Son olarak alan değişkeninin değerini ekrana yazdırabiliriz:
>>> alan
201.06176
Böylece bir dairenin alanını yaklaşık olarak hesaplamış olduk. Dilerseniz programımızı bir de
derli toplu olarak görelim:
>>> çap = 16
>>> yarıçap = çap / 2
>>> pi = 3.14159
>>> alan = pi * (yarıçap * yarıçap)
>>> alan
201.06176
Görüyorsunuz ya, değişkenler işimizi nasıl da kolaylaştırıyor. Eğer yukarıdaki programda
değişken kullanmasaydık kodlarımız şöyle görünecekti:
>>> 3.14159 * ((16/2) * (16/2))
201.06176
Bu kodlar tek kullanımlıktır. Eğer yukarıdaki örnekte mesela dairenin çapını değiştirmeniz
gerekirse, iki yerde elle değişiklik yapmanız gerekir. Ama değişkenleri kullandığımızda sadece
çap değişkeninin değerini değiştirmeniz yeterli olacaktır. Ayrıca değişken kullanmadığınızda,
ilgili değeri program boyunca aklınızda tutmanız gerekir. Örneğin çap değişkenini kullanmak
yerine, gereken her yerde 16
değerini kullanacaksanız, bu 16
değerini sürekli aklınızda
5.1. Etkileşimli Kabukta İlk Adımlar
41
Python 3 için Türkçe Kılavuz, Sürüm 3
tutmanız lazım. Ama bu değeri en başta bir değişkene atarsanız, 16 değerini kullanmanız
gereken yerlerde, akılda tutması daha kolay bir ifade olan çap ismini kullanabilirsiniz.
Bu arada yeri gelmişken sizi yeni bir işleçle daha tanıştıralım. Şimdiye kadar Python’da
toplama (+ ), çıkarma (-), çarpma (* ), bölme (/ ) ve değer atama (=) işleçlerini gördük. Ama
yukarıda verdiğimiz son örnek, başka bir işleç daha öğrenmemizi gerektiriyor...
Yukarıdaki şu örneğe tekrar bakalım:
alan = pi * (yarıçap * yarıçap)
Burada yarıçap değişkeninin karesini alabilmek için bu değeri kendisiyle çarptık. Aslında
gayet mantıklı ve makul bir yöntem. Kare bulmak için değeri kendisiyle çarpıyoruz. Eğer
bir sayının küpünü bulmak isteseydik o sayıyı üç kez kendisiyle çarpacaktık:
>>> 3 * 3 * 3
27
Peki ya bir sayının mesela beşinci kuvvetini hesaplamak istersek ne yapacağız? O sayıyı beş
kez kendisiyle mi çarpacağız? Bu ne kadar vasat bir yöntem, değil mi?
Elbette bir sayının herhangi bir kuvvetini hesaplamak için o sayıyı kendisiyle kuvvetince
çarpmayacağız. Python’da bu tür ‘kuvvet hesaplamaları’ için ayrı bir işleç (ve fonksiyon)
bulunur.
Öncelikle kuvvet hesaplarını yapmamızı sağlayan işleçten söz edelim.
Python’da ** adlı bir işleç bulunur. Bu işlecin görevi bir sayının kuvvetini hesaplamamızı
sağlamaktır. Örneğin bir sayının 2. kuvvetini, ya da başka bir deyişle karesini hesaplamak
istersek şöyle bir kod yazabiliriz:
>>> 12 ** 2
144
Burada 12 sayısının 2. kuvvetini, yani karesini hesapladık. Bu bilgiyi yukarıdaki formüle
uygulayalım:
>>> alan = pi * (yarıçap ** 2)
Bu işleci herhangi bir sayının herhangi bir kuvvetini hesaplamak için kullanabiliriz elbette.
Mesela 23 sayısının küpünü (yani 3. kuvvetini) hesaplayalım:
>>> 23 ** 3
12167
Aynı işleçten, bir sayının karekökünü hesaplamak için de yararlanabilirsiniz. Neticede bir
sayının 0.5 ‘inci kuvveti, o sayının kareköküdür:
>>> 144 ** 0.5
12.0
Gördüğünüz gibi, kuvvet hesaplama işlemleri için bu işleç son derece kullanışlı bir araç
vazifesi görüyor. Ama eğer istersek aynı iş için özel bir fonksiyondan da yararlanabiliriz. Bu
fonksiyonun adı pow().
Peki bu fonksiyonu nasıl kullanacağız?
42
Bölüm 5. Etkileşimli Python
Python 3 için Türkçe Kılavuz, Sürüm 3
Daha önce öğrendiğimiz type() ve len() fonksiyonlarını nasıl kullanıyorsak pow() fonksiyonu
da aynı şekilde kullanacağız.
type() ve len() fonksiyonlarını birtakım parametreler ile birlikte kullanıyorduk hatırlarsanız.
Aynı şekilde pow() fonksiyonu da birtakım parametreler alır.
Daha önce öğrendiğimiz fonksiyonları tek bir parametre ile birlikte kullanmıştık. pow()
fonksiyonu ise toplam üç farklı parametre alır. Ama genellikle bu fonksiyon yalnızca iki
parametre ile kullanılır.
Bu fonksiyonu şöyle kullanıyoruz:
>>> pow(12, 2)
144
>>> pow(23, 3)
12167
>>> pow(144, 0.5)
12.0
Gördüğünüz gibi, pow() fonksiyonunun ilk parametresi asıl sayıyı, ikinci parametresi ise bu
sayının hangi kuvvetini hesaplamak istediğimizi gösteriyor.
Bu arada, fonksiyonun parantezleri içinde belirttiğimiz parametreleri birbirinden virgül ile
ayırdığımızı gözden kaçırmayın.
Dediğimiz gibi, pow() fonksiyonu, pek kullanılmayan üçüncü bir parametre daha alır. Bu
fonksiyonun üçüncü parametresi şöyle kullanılır. Dikkatlice bakın:
>>> pow(16, 2, 2)
0
Bu komut şu anlama gelir:
16 sayısının 2 ‘nci kuvvetini hesapla ve çıkan sayıyı 2 ‘ye bölüp, bölme işleminden
kalan sayıyı göster!
16 sayısının 2. kuvveti 256 sayısıdır. 256 sayısını 2 ‘ye böldüğümüzde, bölme işleminin kalanı
0 ‘dır. Yani 256 sayısı 2 ‘ye tam bölünür...
Bir örnek daha verelim:
>>> pow(11, 3, 4)
3
Demek ki, 11 sayısının 3. kuvveti olan 1331 sayısı 4 ‘e bölündüğünde, bölme işleminden kalan
sayı 3 imiş...
Dediğimiz gibi, pow() fonksiyonu genellikle sadece iki parametre ile kullanılır. Üçüncü
parametrenin kullanım alanı oldukça dardır.
5.1. Etkileşimli Kabukta İlk Adımlar
43
Python 3 için Türkçe Kılavuz, Sürüm 3
Değişkenlere Dair Bazı İpuçları
Değişkenin ne demek olduğunu öğrendiğimize göre, değişkenlere dair bazı ufak ipuçları
verebiliriz.
Aynı Değere Sahip Değişkenler Tanımlama
Şimdi size şöyle bir soru sormama izin verin: Acaba aynı değere sahip iki değişkeni nasıl
tanımlayabiliriz? Yani mesela değeri 4 sayısı olan iki farklı değişkeni nasıl belirleyeceğiz?
Aklınıza şöyle bir çözüm gelmiş olabilir:
>>> a = 4
>>> b = 4
Böylece ikisi de 4 değerine sahip a ve b adlı iki farklı değişken tanımlamış olduk. Bu tamamen
geçerli bir yöntemdir. Ancak Python’da bu işlemi yapmanın daha kolay bir yolu var. Bakalım:
>>> a = b = 4
Bu kodlar bir öncekiyle tamamen aynı işlevi görür. Yani her iki kod da 4 değerine sahip a ve
b değişkenleri tanımlamamızı sağlar:
>>> a
4
>>> b
4
Bu bilgiyi kullanarak mesela bir yıl içindeki her bir ayın çektiği gün sayısını ay adlarına
atayabilirsiniz:
>>> ocak = mart = mayıs = temmuz = ağustos = ekim = aralık = 31
>>> nisan = haziran = eylül = kasım = 30
>>> şubat = 28
Böylece bir çırpıda değeri 31 olan yedi adet değişken, değeri 30 olan dört adet değişken,
değeri 28
olan bir adet değişken tanımlamış olduk. Bu değişkenlerin değerine nasıl
ulaşacağınızı biliyorsunuz:
>>> ocak
31
>>> haziran
30
>>> şubat
28
>>> mayıs
31
44
Bölüm 5. Etkileşimli Python
Python 3 için Türkçe Kılavuz, Sürüm 3
>>> ekim
31
>>> eylül
30
Eğer Python’ın aynı anda birden fazla değişkene tek bir değer atama özelliği olmasaydı
yukarıdaki kodları şöyle yazmamız gerekirdi:
>>> ocak = 31
>>> şubat = 28
>>> mart = 31
>>> nisan = 30
>>> mayıs = 31
>>> haziran = 30
>>> temmuz = 31
>>> ağustos = 31
>>> eylül = 30
>>> ekim = 31
>>> kasım = 30
>>> aralık = 31
Bu değişkenleri nasıl bir program içinde kullanacağınız tamamen sizin hayal gücünüze kalmış.
Mesela bu değişkenleri kullanarak aylara göre doğalgaz faturasını hesaplayan bir program
yazabiliriz.
Hemen son gelen doğalgaz faturasını (örn. Mart ayı) elimize alıp inceliyoruz ve bu faturadan
şu verileri elde ediyoruz:
Mart ayı doğalgaz faturasına göre sayaçtan ölçülen hacim 346 m3. Demek ki bir ayda toplam
346 m3 doğalgaz harcamışız.
Fatura tutarı 273.87 TL imiş. Yani 346 m3 doğalgaz tüketmenin bedeli 273.87 TL. Buna göre
değişkenlerimizi tanımlayalım:
>>> aylık_sarfiyat = 346
>>> fatura_tutarı = 273.87
Bu bilgiyi kullanarak doğalgazın birim 1yatını hesaplayabiliriz. Formülümüz şöyle olmalı:
>>> birim_fiyat = fatura_tutarı / aylık_sarfiyat
>>> birim_fiyat
0.7915317919075144
Demek ki doğalgazın m3 1yatı (vergilerle birlikte yaklaşık) 0.79 TL’ye karşılık geliyormuş.
Bu noktada günlük ortalama doğalgaz sar1yatımızı da hesaplamamız gerekiyor:
>>> günlük_sarfiyat = aylık_sarfiyat / mart
>>> günlük_sarfiyat
11.161290322580646
Demek ki Mart ayında günlük ortalama 11 m3 doğalgaz tüketmişiz.
Bütün bu bilgileri kullanarak Nisan ayında gelecek faturayı tahmin edebiliriz:
5.1. Etkileşimli Kabukta İlk Adımlar
45
Python 3 için Türkçe Kılavuz, Sürüm 3
>>> nisan_faturası = birim_fiyat * günlük_sarfiyat * nisan
>>> nisan_faturası
265.03548387096777
Şubat ayı faturası ise şöyle olabilir:
>>> şubat_faturası = birim_fiyat * günlük_sarfiyat * şubat
>>> şubat_faturası
247.36645161290326
Burada farklı değişkenlerin değerini değiştirerek daha başka işlemler de yapabilirsiniz.
Örneğin pratik olması açısından günlük_sar1yat değişkeninin değerini
15
yaparak
hesaplamalarınızı buna göre güncelleyebilirsiniz.
Gördüğünüz gibi, aynı anda birden fazla değişken tanımlayabilmek işlerimizi epey
kolaylaştırıyor.
Değişkenlerle ilgili bir ipucu daha verelim...
Değişkenlerin Değerini Takas Etme
Diyelim ki, işyerinizdeki personelin unvanlarını tuttuğunuz bir veritabanı var elinizde. Bu
veritabanında şuna benzer ilişkiler tanımlı:
>>> osman = "Araştırma Geliştirme Müdürü"
>>> mehmet = "Proje Sorumlusu"
İlerleyen zamanda işvereniniz sizden Osman ve Mehmet’in unvanlarını değiştirmenizi talep
edebilir. Yani Osman’ı Proje Sorumlusu, Mehmet’i de Araştırma Geliştirme Müdürü yapmanızı
isteyebilir sizden.
Patronunuzun bu isteğini Python’da çok rahat bir biçimde yerine getirebilirsiniz. Dikkatlice
bakın:
>>> osman, mehmet = mehmet, osman
Böylece tek hamlede bu iki kişinin unvanlarını takas etmiş oldunuz. Gelin isterseniz
değişkenlerin son durumuna bakalım:
>>> osman
'Proje Sorumlusu
>>> mehmet
'Araştırma Geliştirme Müdürü'
Gördüğünüz gibi, osman değişkeninin değerini mehmet ‘e; mehmet değişkeninin değerini ise
osman‘a başarıyla verebilmişiz.
Yukarıdaki yöntem Python’ın öteki diller üzerinde önemli bir üstünlüğüdür.
Başka
programlama dillerinde bu işlemi yapmak için geçici bir değişken tanımlamanız gerekir. Yani
mesela:
46
Bölüm 5. Etkileşimli Python
Python 3 için Türkçe Kılavuz, Sürüm 3
>>> osman = "Araştırma Geliştirme Müdürü"
>>> mehmet = "Proje Sorumlusu"
Elimizdeki değerler bunlar. Biz şimdi Osman’ın değerini Mehmet’e; Mehmet’in değerini ise
Osman’a aktaracağız. Bunun için öncelikle bir geçici değişken tanımlamalıyız:
>>> geçici = "Proje Sorumlusu"
Bu sayede “Proje Sorumlusu” değerini yedeklemiş olduk. Bu işlem sayesinde, takas sırasında
bu değeri kaybetmeyeceğiz.
Şimdi Osman’ın değerini Mehmet’e aktaralım:
>>> mehmet = osman
Şimdi elimizde iki tane Araştırma Geliştirme Müdürü olmuş oldu:
>>> mehmet
'Araştırma Geliştirme Müdürü'
>>> osman
'Araştırma Geliştirme Müdürü'
Gördüğünüz gibi, mehmet = osman kodunu kullanarak mehmet değişkeninin değerini osman
değişkeninin değeriyle değiştirdiğimiz için “Proje Sorumlusu” değeri ortadan kayboldu. Ama
biz önceden bu değeri geçici adlı değişkene atadığımız için bu değeri kaybetmemiş olduk.
Şimdi Osman’a geçici değişkeni içinde tuttuğumuz “Proje Sorumlusu” değerini verebiliriz:
>>> osman = geçici
Böylece istediğimiz takas işlemini gerçekleştirmiş olduk. Son durumu kontrol edelim:
>>> osman
'Proje Sorumlusu
>>> mehmet
'Araştırma Geliştirme Müdürü'
Basit bir işlem için ne kadar büyük bir zaman kaybı, değil mi? Ama dediğimiz gibi, Python’da
bu şekilde geçici bir değişken atamakla uğraşmamıza hiç gerek yok. Sadece şu formülü
kullanarak değişkenlerin değerini takas edebiliriz:
a, b = b, a
Bu şekilde a değişkeninin değerini b değişkenine; b değişkeninin değerini ise a değerine
vermiş oluyoruz. Eğer bu işlemi geri alıp her şeyi eski haline döndürmek istersek, tahmin
edebileceğiniz gibi yine aynı yöntemden yararlanabiliriz:
b, a = a, b
Böylece değişkenler konusunu da oldukça ayrıntılı bir şekilde incelemiş olduk. Ayrıca bu
esnada len() ve pow() adlı iki yeni fonksiyon ile ** adlı bir işleç de öğrendik.
Hazır lafı geçmişken, len() fonksiyonunun bazı kısıtlamalarından söz edelim. Dediğimiz
5.1. Etkileşimli Kabukta İlk Adımlar
47
Python 3 için Türkçe Kılavuz, Sürüm 3
gibi, bu fonksiyonu kullanarak karakter dizileri içinde toplam kaç adet karakter bulunduğunu
hesaplayabiliyoruz. Örneğin:
>>> kelime = "muvaffakiyet"
>>> len(kelime)
12
Yalnız bu len() fonksiyonunu sayıların uzunluğunu ölçmek için kullanamıyoruz:
>>> len(123456)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'int' has no len()
Gördüğünüz gibi, len() fonksiyonu, şu ana kadar öğrendiğimiz veri tipleri arasında yalnızca
karakter dizileri ile birlikte kullanılabiliyor. Bu fonksiyonu sayılarla birlikte kullanamıyoruz.
Bu bölümün başında, o anda elimizde bulunan bir verinin tipini bilmemizin çok önemli
olduğunu ve Python’da bir verinin tipinin, o veri ile neler yapıp neler yapamayacağınızı
belirlediğini söylediğimizi hatırlıyorsunuz, değil mi? İşte len() fonksiyonu bu duruma çok
güzel bir örnektir.
len() fonksiyonu sayılarla birlikte kullanılamaz. Dolayısıyla eğer elinizdeki verinin bir sayı
olduğunu bilmezseniz, bu sayıyı len() fonksiyonu ile birlikte kullanmaya çalışabilir ve bu
şekilde programınızın hata vererek çökmesine yol açabilirsiniz.
Ayrıca daha önce de söylediğimiz gibi, len() fonksiyonunu doğru kullanabilmek için, bu
fonksiyonun bize sayı değerli bir çıktı verdiğini de bilmemiz gerekir.
len() fonksiyonu ile ilgili bu durumu da bir kenara not ettikten sonra yolumuza kaldığımız
yerden devam edelim.
Etkileşimli Kabuğun Hafızası
Bir önceki bölümde Python’ın etkileşimli kabuğunun nasıl kullanılacağına dair epey örnek
verdik ve etkileşimli kabuk üzerinden Python’ın bazı temel araçlarına kısa bir giriş yaptık.
Şimdi isterseniz yeri gelmişken Python’ın etkileşimli kabuğunun bir başka yeteneğinden daha
söz edelim.
Etkileşimli kabukta _ adlı işaret (alt çizgi işareti), yapılan son işlemin veya girilen son öğenin
değerini tutma işlevi görür. Yani:
>>> 2345 + 54355
56700
Eğer bu işlemin ardından _ komutunu verirsek şöyle bir çıktı alırız:
>>> _
56700
Gördüğünüz gibi, _ komutu son girilen öğeyi hafızasında tutuyor. Bu özellikten çeşitli
şekillerde yararlanabilirsiniz:
48
Bölüm 5. Etkileşimli Python
Python 3 için Türkçe Kılavuz, Sürüm 3
>>> _ + 15
56715
Burada _ komutunun değeri bir önceki işlemin sonucu olan 56715
değeri olduğu için,
_ komutuna 15 eklediğimizde 56715 değerini elde ediyoruz. _ komutunun değerini tekrar
kontrol edelim:
>>> _
56715
Gördüğünüz gibi, _ komutunun değeri artık 56715 sayısıdır...
_ komutu yalnızca sayıları değil, karakter dizilerini de hafızasında tutabilir:
>>> "www"
'www'
>>> _
'www'
>>> _ + ".istihza.com"
'www.istihza.com'
Bu işaret öyle çok sık kullanılan bir araç değildir, ama zaman zaman işinizi epey kolaylaştırır.
Yalnız, unutmamamız gereken şey, bu özelliğin sadece etkileşimli kabuk ortamında geçerli
olmasıdır. _ komutunun etkileşimli kabuk ortamı dışında herhangi bir geçerliliği yoktur.
Aslında burada söylenecek daha çok şey var. Ama biz şimdilik bunları sonraki konulara
bırakacağız. Zira bu bölümdeki amacımız size konuların her ayrıntısını vermekten ziyade,
Python’a ısınmanızı sağlamaktır.
5.2. Etkileşimli Kabuğun Hafızası
49
BÖLÜM 6
print() Fonksiyonu
Geçen bölümde bir yandan Python’ın etkileşimli kabuğunu yakından tanıyıp bu vesileyle bazı
önemli fonksiyon ve araçları öğrenirken, öbür yandan bu öğrendiklerimizi kullanarak örnek
programlar yazdık. Gördüğünüz gibi, azıcık bir bilgiyle dahi az çok işe yarar programlar
yazmak mümkün olabiliyor. Daha yararlı programlar yazabilmek için henüz öğrenmemiz
gereken pek çok şey var. İşte bu bölümde, ‘daha yararlı programlar yazmamızı’ sağlayacak
çok önemli bir araçtan söz edeceğiz. Öneminden dolayı ayrıntılı bir şekilde anlatacağımız bu
aracın adı print() fonksiyonu.
Elbette bu bölümde sadece print() fonksiyonundan bahsetmeyeceğiz. Bu bölümde print()
fonksiyonunun yanısıra Python’daki bazı önemli temel konuları da ele alacağız. Mesela bu
bölümde Python’daki karakter dizilerine ve sayılara ilişkin çok önemli bilgiler vereceğiz. Ayrıca
print() fonksiyonu vesilesiyle Python’daki ‘fonksiyon’ konusuna da sağlam bir giriş yapmış,
bu kavram ile ilgili ilk bilgilerimizi almış olacağız. Sözün özü, bu bölüm bizim için, deyim
yerindeyse, tam anlamıyla bir dönüm noktası olacak.
O halde isterseniz lafı daha fazla uzatmadan işe print() fonksiyonunun ne olduğu ve ne işe
yaradığını anlatarak başlayalım.
Nedir, Ne İşe Yarar?
Şimdiye kadar etkileşimli kabukta gerek karakter dizilerini gerekse sayıları doğrudan ekrana
yazdık. Yani şöyle bir şey yaptık:
>>> "Python programlama dili"
'Python programlama dili'
>>> 6567
6567
Etkileşimli kabuk da, ekrana yazdığımız bu karakter dizisi ve sayıyı doğrudan bize çıktı
olarak verdi. Ancak ilerde Python kodlarımızı bir dosyaya kaydedip çalıştırdığımızda da
göreceğiniz gibi, Python’ın ekrana çıktı verebilmesi için yukarıdaki kullanım yeterli değildir.
Yani yukarıdaki kullanım yalnızca etkileşimli kabukta çalışır. Bu kodları bir dosyaya kaydedip
çalıştırmak istediğimizde hiçbir çıktı alamayız. Python’da yazdığımız şeylerin ekrana çıktı
olarak verilebilmesi için print() adlı özel bir fonksiyondan yararlanmamız gerekir.
O halde gelin bu print() fonksiyonunun ne işe yaradığını ve nasıl kullanıldığını anlamaya
çalışalım:
50
Python 3 için Türkçe Kılavuz, Sürüm 3
print() de tıpkı daha önce gördüğümüz type(), len() ve pow() gibi bir fonksiyondur.
Fonksiyonları ilerde daha ayrıntılı bir şekilde inceleyeceğimizi söylemiştik hatırlarsanız. O
yüzden fonksiyon kelimesine takılarak, burada anlattığımız şeylerin kafanızı karıştırmasına,
moralinizi bozmasına izin vermeyin.
print() fonksiyonunun görevi ekrana çıktı vermemizi sağlamaktır. Hemen bununla ilgili bir
örnek verelim:
>>> print("Python programlama dili")
Python programlama dili
Bildiğiniz gibi burada gördüğümüz “Python programlama dili” bir karakter dizisidir. İşte
print() fonksiyonunun görevi bu karakter dizisini ekrana çıktı olarak vermektir. Peki
bu karakter dizisini print() fonksiyonu olmadan yazdığımızda da ekrana çıktı vermiş
olmuyor muyuz? Aslında olmuyoruz. Dediğimiz gibi, ilerde programlarımızı dosyalara
kaydedip çalıştırdığımızda, başında print() olmayan ifadelerin çıktıda görünmediğine şahit
olacaksınız.
Daha önce de dediğimiz gibi, etkileşimli kabuk bir test ortamı olması açısından rahat bir
ortamdır. Bu sebeple bu ortamda ekrana çıktı verebilmek için print() fonksiyonunu
kullanmak zorunda değilsiniz. Yani başında print() olsa da olmasa da etkileşimli kabuk
ekrana yazdırmak istediğiniz şeyi yazdırır. Ama iyi bir alışkanlık olması açısından, ekrana
herhangi bir şey yazdıracağınızda ben size print() fonksiyonunu kullanmanızı tavsiye
ederim.
print() son derece güçlü bir fonksiyondur. Gelin isterseniz bu güçlü ve faydalı fonksiyonu
derin derin incelemeye koyulalım.
Nasıl Kullanılır?
Yukarıda verdiğimiz örnekte ilk gözümüze çarpan şey, karakter dizisini print()
fonksiyonunun parantezleri içine yazmış olmamızdır. Biz bir fonksiyonun parantezleri içinde
belirtilen öğelere ‘parametre’ dendiğini geçen bölümde öğrenmiştik. Tıpkı öğrendiğimiz öteki
fonksiyonlar gibi, print() fonksiyonu da birtakım parametreler alır.
Bu arada print() fonksiyonunun parantezini açıp parametreyi yazdıktan sonra, parantezi
kapatmayı unutmuyoruz. Python programlama diline yeni başlayanların, hatta bazen
deneyimli programcıların bile en sık yaptığı hatalardan biri açtıkları parantezi kapatmayı
unutmalarıdır.
Elbette, eğer istersek burada doğrudan “Python programlama dili” adlı karakter dizisini
kullanmak yerine, önce bu karakter dizisini bir değişkene atayıp, sonra da print()
fonksiyonunun parantezleri içinde bu değişkeni kullanabiliriz. Yani:
>>> dil = "Python programlama dili"
>>> print(dil)
Python programlama dili
Bu arada, hem şimdi verdiğimiz, hem de daha önce yazdığımız örneklerde bir şey dikkatinizi
çekmiş olmalı. Şimdiye kadar verdiğimiz örneklerde karakter dizilerini hep çift tırnakla
gösterdik. Ama aslında tek seçeneğimiz çift tırnak değildir. Python bize üç farklı tırnak
seçeneği sunar:
6.2. Nasıl Kullanılır?
51
Python 3 için Türkçe Kılavuz, Sürüm 3
1. Tek tırnak (‘ ‘)
2. Çift tırnak (” ”)
3. Üç tırnak (“”” “””)
Dolayısıyla yukarıdaki örneği üç farklı şekilde yazabiliriz:
>>> print('Python programlama dili')
Python programlama dili
>>> print("Python programlama dili")
Python programlama dili
>>> print("""Python programlama dili""")
Python programlama dili
Gördüğünüz gibi çıktılar arasında hiçbir fark yok.
Peki çıktılarda hiçbir fark yoksa neden üç farklı tırnak çeşidi var?
İsterseniz bu soruyu bir örnek üzerinden açıklamaya çalışalım. Diyelim ki ekrana şöyle bir
çıktı vermek istiyoruz:
Python programlama dilinin adı "piton" yılanından gelmez
Eğer bu cümleyi çift tırnaklar içinde gösterirsek programımız hata verecektir:
>>> print("Python programlama dilinin adı "piton" yılanından gelmez")
File "<stdin>", line 1
print("Python programlama dilinin adı "piton" yılanından gelmez")
^
SyntaxError: invalid syntax
Bunun sebebi, cümle içinde geçen ‘piton’ kelimesinin de çift tırnaklar içinde gösterilmiş
olmasıdır. Cümlenin, yani karakter dizisinin kendisi de çift tırnak içinde gösterildiği için
Python, karakter dizisini başlatan ve bitiren tırnakların hangisi olduğunu ayırt edemiyor.
Yukarıdaki cümleyi en kolay şu şekilde ekrana yazdırabiliriz:
>>> print('Python programlama dilinin adı "piton" yılanından gelmez')
Python programlama dilinin adı "piton" yılanından gelmez
Burada karakter dizisini tek tırnak içine aldık. Karakter dizisi içinde geçen ‘piton’ kelimesi
çift tırnak içinde olduğu için, karakter dizisini başlatıp bitiren tırnaklarla ‘piton’ kelimesindeki
tırnakların birbirine karışması gibi bir durum söz konusu değildir.
Bir de şöyle bir örnek verelim: Diyelim ki aşağıdaki gibi bir çıktı elde etmek istiyoruz:
İstanbul'un 5 günlük hava durumu tahmini
Eğer bu karakter dizisini tek tırnak işaretleri içinde belirtirseniz Python size bir hata mesajı
gösterecektir:
52
Bölüm 6. print() Fonksiyonu
Python 3 için Türkçe Kılavuz, Sürüm 3
>>> print('İstanbul'un 5 günlük hava durumu tahmini')
File "<stdin>", line 1
print('İstanbul'un 5 günlük hava durumu tahmini')
^
SyntaxError: invalid syntax
Bu hatanın sebebi ‘İstanbul’un’ kelimesi içinde geçen kesme işaretidir. Tıpkı bir önceki
örnekte olduğu gibi, Python karakter dizisini başlatan ve bitiren tırnakların hangisi olduğunu
kestiremiyor. Python, karakter dizisinin en başındaki tek tırnak işaretinin ardından
‘İstanbul’un’ kelimesi içindeki kesme işaretini görünce karakter dizisinin burada sona erdiğini
zannediyor. Ancak karakter dizisini soldan sağa doğru okumaya devam edince bir yerlerde
bir terslik olduğunu düşünüyor ve bize bir hata mesajı göstermekten başka çaresi kalmıyor.
Yukarıdaki karakter dizisini en kolay şöyle tanımlayabiliriz:
>>> print("İstanbul'un 5 günlük hava durumu tahmini")
İstanbul'un 5 günlük hava durumu tahmini
Burada da, karakter dizisi içinde geçen kesme işaretine takılmamak için karakter dizimizi çift
tırnak işaretleri içine alıyoruz.
Yukarıdaki karakter dizilerini düzgün bir şekilde çıktı verebilmek için üç tırnak işaretlerinden
de yararlanabiliriz:
>>> print("""Python programlama dilinin adı "piton" yılanından gelmez""")
Python programlama dilinin adı "piton" yılanından gelmez
>>> print("""İstanbul'un 5 günlük hava durumu tahmini""")
İstanbul'un 5 günlük hava durumu tahmini
Bütün bu örneklerden sonra kafanızda şöyle bir düşünce uyanmış olabilir:
Görünüşe göre üç tırnak işaretiyle her türlü karakter dizisini hatasız bir şekilde
ekrana çıktı olarak verebiliyoruz. O zaman ben en iyisi bütün karakter dizileri için
üç tırnak işaretini kullanayım!
Elbette, eğer isterseniz pek çok karakter dizisi için üç tırnak işaretini kullanabilirsiniz.
Ancak Python’da karakter dizileri tanımlanırken genellikle tek tırnak veya çift tırnak işaretleri
kullanılır. Üç tırnak işaretlerinin asıl kullanım yeri ise farklıdır. Peki nedir bu üç tırnak
işaretlerinin asıl kullanım yeri?
Üç tırnak işaretlerini her türlü karakter dizisiyle birlikte kullanabiliyor olsak da, bu tırnak
tipi çoğunlukla sadece birden fazla satıra yayılmış karakter dizilerini tanımlamada kullanılır.
Örneğin şöyle bir ekran çıktısı vermek istediğinizi düşünün:
[H]=========HARMAN========[-][o][x]
|
|
|
Programa Hoşgeldiniz!
|
|
Sürüm 0.8
|
|
Devam etmek için herhangi
|
|
bir düğmeye basın.
|
|
|
|=================================|
6.2. Nasıl Kullanılır?
53
Python 3 için Türkçe Kılavuz, Sürüm 3
Böyle bir çıktı verebilmek için eğer tek veya çift tırnak kullanmaya kalkışırsanız epey eziyet
çekersiniz. Bu tür bir çıktı vermenin en kolay yolu üç tırnakları kullanmaktır:
>>> print("""
... [H]=========HARMAN========[-][o][x]
... |
|
... |
Programa Hoşgeldiniz!
|
... |
Sürüm 0.8
|
... |
Devam etmek için herhangi
|
... |
bir düğmeye basın.
|
... |
|
... |=================================|
... """)
Burada bazı şeyler dikkatinizi çekmiş olmalı. Gördüğünüz gibi, üç tırnaklı yapı öteki tırnak
tiplerine göre biraz farklı davranıyor. Şimdi şu örneğe bakın:
>>> print("""Game Over!
Buraya çok dikkatli bakın. Karakter dizisine üç tırnakla başladıktan sonra, kapanış tırnağını
koymadan Enter tuşuna bastığımızda >>> işareti ... işaretine dönüştü. Python bu şekilde
bize, ‘yazmaya devam et!’ demiş oluyor. Biz de buna uyarak yazmaya devam edelim:
>>> print("""Game Over!
... Insert Coin!""")
Game Over!
Insert Coin!
Kapanış tırnağı koyulmadan Enter tuşuna basıldığında >>> işaretinin ... işaretine dönüşmesi
üç tırnağa özgü bir durumdur. Eğer aynı şeyi tek veya çift tırnaklarla yapmaya çalışırsanız
programınız hata verir:
>>> print("Game Over!
File "<stdin>", line 1
print("Game Over!
^
SyntaxError: EOL while scanning string literal
...veya:
>>> print('Game Over!
File "<stdin>", line 1
print("Game Over!
^
SyntaxError: EOL while scanning string literal
Üç tırnak işaretlerinin tırnak kapanmadan Enter tuşuna basıldığında hata vermeme özelliği
sayesinde, bu tırnak tipi özellikle birden fazla satıra yayılmış karakter dizilerinin gösterilmesi
için birebirdir.
Gelin isterseniz üç tırnak kullanımına ilişkin bir örnek daha verelim:
>>> print("""Python programlama dili Guido Van Rossum
... adlı Hollandalı bir programcı tarafından 90’lı
54
Bölüm 6. print() Fonksiyonu
Python 3 için Türkçe Kılavuz, Sürüm 3
... yılların başında geliştirilmeye başlanmıştır. Çoğu
... insan, isminin "Python" olmasına bakarak, bu programlama
... dilinin, adını piton yılanından aldığını düşünür.
... Ancak zannedildiğinin aksine bu programlama dilinin
... adı piton yılanından gelmez.""")
Python programlama dili Guido Van Rossum
adlı Hollandalı bir programcı tarafından 90'lı
yılların başında geliştirilmeye başlanmıştır. Çoğu
insan, isminin "Python" olmasına bakarak, bu programlama
dilinin, adını piton yılanından aldığını düşünür.
Ancak zannedildiğinin aksine bu programlama dilinin
dı piton yılanından gelmez.
Elbette eğer istersek bu metni önce bir değişkene atamayı da tercih edebiliriz:
>>> python_hakkinda = """Python programlama dili Guido Van Rossum
... adlı Hollandalı bir programcı tarafından 90’lı
... yılların başında geliştirilmeye başlanmıştır. Çoğu
... insan, isminin "Python" olmasına bakarak, bu programlama
... dilinin, adını piton yılanından aldığını düşünür.
... Ancak zannedildiğinin aksine bu programlama dilinin
... adı piton yılanından gelmez."""
>>> print(python_hakkinda)
Python programlama dili Guido Van Rossum
adlı Hollandalı bir programcı tarafından 90'lı
yılların başında geliştirilmeye başlanmıştır. Çoğu
insan, isminin "Python" olmasına bakarak, bu programlama
dilinin, adını piton yılanından aldığını düşünür.
Ancak zannedildiğinin aksine bu programlama dilinin
dı piton yılanından gelmez.
Siz yukarıdaki çıktıyı tek veya çift tırnak kullanarak nasıl ekrana yazdırabileceğinizi
düşünedurun, biz önemli bir konuya geçiş yapalım!
Bir Fonksiyon Olarak print()
print() ifadesinin bir fonksiyon olduğunu söylemiştik hatırlarsanız. Dediğimiz gibi,
fonksiyonlarla ilgili ayrıntılı açıklamaları ilerleyen derslerde vereceğiz. Ancak şimdi dilerseniz
bundan sonra anlatacaklarımızı daha iyi kavrayabilmemiz için, fonksiyonlar hakkında
bilmemiz gereken bazı temel şeyleri öğrenmeye çalışalım.
Gördüğünüz gibi, print() fonksiyonunu şöyle kullanıyoruz:
>>> print("Aramak istediğiniz kelimeyi yazın: ")
Burada print() bir fonksiyon, “Aramak istediğiniz kelimeyi yazın:” adlı karakter dizisi ise bu
fonksiyonun parametresidir. Daha önce len() adlı başka bir fonksiyon daha öğrenmiştik
hatırlarsanız. Onu da şöyle kullanıyorduk:
>>> len("elma")
Burada da len() bir fonksiyon, “elma” adlı karakter dizisi ise bu fonksiyonun parametresidir.
Aslında biçim olarak print() ve len() fonksiyonlarının birbirinden hiçbir farkı olmadığını
6.3. Bir Fonksiyon Olarak print()
55
Python 3 için Türkçe Kılavuz, Sürüm 3
görüyorsunuz.
Daha önce söylediğimiz ve bu örneklerden de anladığımız gibi, bir fonksiyonun parantezleri
içinde belirtilen öğelere parametre adı veriliyor. Mesela aşağıdaki örnekte print()
fonksiyonunu tek bir parametre ile kullanıyoruz:
>>> print('En az 8 haneli bir parola belirleyin.')
print() fonksiyonu, tıpkı pow() fonksiyonu gibi, birden fazla parametre alabilir:
>>> print('Fırat', 'Özgül')
Fırat Özgül
Bu örnekte bizim için çıkarılacak çok dersler var. Bir defa burada print() fonksiyonunu iki
farklı parametre ile birlikte kullandık. Bunlardan ilki Fırat adlı bir karakter dizisi, ikincisi ise
Özgül adlı başka bir karakter dizisi. Python’ın bu iki karakter dizisini nasıl birleştirdiğine dikkat
edin. print() fonksiyonu bu iki karakter dizisini çıktı olarak verirken aralarına da birer boşluk
yerleştirdi. Ayrıca, geçen derste de vurguladığımız gibi, parametrelerin birbirinden virgül ile
ayrıldığını da gözden kaçırmıyoruz.
Gelin bununla ilgili bir iki örnek daha verelim elimizin alışması için:
>>> print("Python", "Programlama", "Dili")
Python Programlama Dili
>>> print('Fırat', 'Özgül', 'Adana', 1980)
Fırat Özgül Adana 1980
Bu arada dikkatinizi önemli bir noktaya çekmek istiyorum. Yukarıdaki örneklerde bazen tek
tırnak, bazen de çift tırnak kullandık. Daha önce de söylediğimiz gibi, hangi tırnak tipini
kullandığımız önemli değildir. Python hangi tırnak tipini kullandığımızdan ziyade, tırnak
kullanımında tutarlı olup olmadığımızla ilgilenir. Yani Python için önemli olan, karakter
dizisini hangi tırnakla başlatmışsak, o tırnakla bitirmemizdir. Yani şu tip kullanımlar geçerli
değildir:
>>> print("karakter dizisi')
>>> print('karakter dizisi")
Karakter dizisini tanımlamaya başlarken kullandığımız tırnak tipi ile karakter dizisini
tanımlamayı bitirirken kullandığımız tırnak tipi birbirinden farklı olduğu için bu iki kullanım
da hata verecektir.
print() Fonksiyonunun Parametreleri
Şimdiye kadar verdiğimiz örneklerde belki çok da belli olmuyordur, ama aslında print()
fonksiyonu son derece güçlü bir araçtır. İşte şimdi biz bu fonksiyonun gücünü gözler
önüne seren özelliklerini incelemeye başlayacağız. Bu bölümü dikkatle takip etmeniz, ilerde
yapacağımız çalışmaları daha rahat anlayabilmeniz açısından büyük önem taşır.
56
Bölüm 6. print() Fonksiyonu
Python 3 için Türkçe Kılavuz, Sürüm 3
sep
print() fonksiyonu ile ilgili olarak yukarıda verdiğimiz örnekleri incelediğimizde, bu
fonksiyonun kendine özgü bir davranış şekli olduğunu görüyoruz. Mesela bir önceki bölümde
verdiğimiz şu örneğe bakalım:
>>> print('Fırat', 'Özgül')
Fırat Özgül
Burada print() fonksiyonunu iki farklı parametre ile birlikte kullandık. Bu fonksiyon,
kendisine verdiğimiz bu parametreleri belli bir düzene göre birbiriyle birleştirdi. Bu düzen
gereğince print(), kendisine verilen parametreleri birleştirirken, parametreler arasına bir
boşluk yerleştiriyor. Bunu daha net görmek için şöyle bir örnek daha verelim:
>>> print("Python", "PHP", "C++", "C", "Erlang")
Python PHP C++ C Erlang
Gördüğünüz gibi, print() fonksiyonu gerçekten de, kendisine verilen parametreleri
birleştirirken, parametrelerin her biri arasına bir boşluk yerleştiriyor. Halbuki bu boşluğu
biz talep etmedik! Python bize bu boşluğu eşantiyon olarak verdi. Çoğu durumda istediğimiz
şey bu olacaktır, ama bazı durumlarda bu boşluğu istemeyebiliriz. Örneğin:
>>> print("http://", "www." , "istihza.", "com")
http:// www. istihza. com
Ya da boşluk karakteri yerine daha farklı bir karakter kullanmak istiyor da olabiliriz. Peki böyle
bir durumda ne yapmamız gerekir?
İşte bu noktada bazı özel araçlardan yararlanarak print() fonksiyonunun öntanımlı davranış
kalıpları üzerinde değişiklikler yapabiliriz.
Peki nedir print() fonksiyonunu özelleştirmemizi sağlayacak bu araçlar?
Hatırlarsanız, Python’da fonksiyonların parantezleri içindeki değerlere parametre adı
verildiğini söylemiştik. Mesela print() fonksiyonunu bir ya da daha fazla parametre ile
birlikte kullanabileceğimizi biliyoruz:
>>> print("Mehmet", "Öz", "İstanbul", "Çamlıca", 156, "/", 45)
Mehmet Öz İstanbul Çamlıca 156 / 45
print() fonksiyonu içinde istediğimiz sayıda karakter dizisi ve/veya sayı değerli parametre
kullanabiliriz.
Fonksiyonların bir de daha özel görünümlü parametreleri vardır.
Mesela print()
fonksiyonunun sep adlı özel bir parametresi bulunur. Bu parametre print() fonksiyonunda
görünmese bile her zaman oradadır. Yani diyelim ki şöyle bir kod yazdık:
>>> print("http://", "www." , "google.", "com")
Burada herhangi bir sep parametresi görmüyoruz. Ancak Python yukarıdaki kodu aslında
şöyle algılar:
6.4. print() Fonksiyonunun Parametreleri
57
Python 3 için Türkçe Kılavuz, Sürüm 3
>>> print("http://", "www." , "google.", "com", sep=" ")
sep ifadesi, İngilizcede separator (ayırıcı, ayraç) kelimesinin kısaltmasıdır. Dolayısıyla
print() fonksiyonundaki bu sep parametresi, ekrana basılacak öğeler arasına hangi
karakterin yerleştirileceğini gösterir. Bu parametrenin öntanımlı değeri bir adet boşluk
karakteridir (” “ ). Yani siz bu özel parametrenin değerini başka bir şeyle değiştirmezseniz,
Python bu parametrenin değerini bir adet boşluk karakteri olarak alacak ve ekrana basılacak
öğeleri birbirinden birer boşlukla ayıracaktır. Ancak eğer biz istersek bu sep parametresinin
değerini değiştirebiliriz. Böylece Python, karakter dizilerini birleştirirken araya boşluk değil,
bizim istediğimiz başka bir karakteri yerleştirebilir. Gelin şimdi bu parametrenin değerini
nasıl değiştireceğimizi görelim:
>>> print("http://", "www." , "istihza.", "com", sep="")
http://www.istihza.com
Gördüğünüz gibi, karakter dizilerini başarıyla birleştirip, geçerli bir internet adresi elde ettik.
Burada yaptığımız şey aslında çok basit. Sadece sep parametresinin ‘bir adet boşluk karakteri’
olan öntanımlı değerini silip, yerine ‘boş bir karakter dizisi’ değerini yazdık. Bu iki kavramın
birbirinden farklı olduğunu söylediğimizi hatırlıyorsunuz, değil mi?
Gelin bir örnek daha yapalım:
>>> print("T", "C", sep=".")
T.C
Burada Python’a şöyle bir emir vermiş olduk:
“T” ve “C” karakter dizilerini birbiriyle birleştir! Bunu yaparken de bu karakter
dizilerinin arasına nokta işareti yerleştir!
sep parametresinin öteki parametrelerden farkı her zaman ismiyle birlikte kullanılmasıdır.
Zaten teknik olarak da bu tür parametrelere ‘isimli parametreler’ adı verilir. Örneğin:
>>> print("Adana", "Mersin", sep="-")
Adana-Mersin
Eğer burada sep parametresinin ismini belirtmeden, doğrudan parametrenin değerini
yazarsak, bu değerin öteki parametrelerden hiçbir farkı kalmayacaktır:
>>> print("Adana", "Mersin", "-")
Adana Mersin -
Gelin isterseniz bu parametreyle ilgili bir örnek daha yapalım:
‘Bir mumdur iki mumdur...’ diye başlayan türküyü biliyorsunuzdur. Şimdi bu türküyü
Python’la nasıl yazabileceğimizi görelim!
>>> print("bir", "iki", "üç", "dört", "on dört", sep="mumdur")
birmumdurikimumdurüçmumdurdörtmumduron dört
Burada bir terslik olduğu açık! Karakter dizileri birbirlerine sıkışık düzende birleştirildi.
Bunların arasında birer boşluk olsa tabii daha iyi olurdu. Ancak biliyorsunuz sep
58
Bölüm 6. print() Fonksiyonu
Python 3 için Türkçe Kılavuz, Sürüm 3
parametresinin öntanımlı değerini silip, yerine “mumdur” değerini yerleştirdiğimiz için,
Python’ın otomatik olarak yerleştirdiği boşluk karakteri kayboldu. Ama eğer istersek o boşluk
karakterlerini kendimiz de ayarlayabiliriz:
>>> print("bir", "iki", "üç", "dört", "on dört", sep=" mumdur ")
bir mumdur iki mumdur üç mumdur dört mumdur on dört
Gördüğünüz gibi, sep parametresine verdiğimiz “mumdur” değerinin sağında ve solunda
birer boşluk bırakarak sorunumuzu çözebildik. Bu sorunu çözmenin başka bir yolu daha
var. Hatırlarsanız etkileşimli kabukta ilk örneklerimizi verirken karakter dizilerini birleştirmek
için + işaretinden de yararlanabileceğimizi söylemiştik. Dolayısıyla sep parametresini şöyle
de yazabiliriz:
>>> print("bir", "iki", "üç", "dört", "on dört", sep=" " + "mumdur" + " ")
Burada da, “mumdur” adlı karakter dizisinin başında ve sonunda birer boşluk bırakmak
yerine, gerekli boşlukları + işareti yardımıyla bu karakter dizisine birleştirdik. Hatta istersek +
işlecini kullanmak zorunda olmadığımızı dahi biliyorsunuz:
>>> print("bir", "iki", "üç", "dört", "on dört", sep=" " "mumdur" " ")
Ama gördüğünüz gibi bir problemimiz daha var. Türkünün sözleri şu şekilde olmalıydı:
bir mumdur iki mumdur üç mumdur dört mumdur on dört mumdur
Ama sondaki ‘mumdur’ kelimesi yukarıdaki çıktıda yok. Normal olan da bu aslında. sep
parametresi, karakter dizilerinin arasına bir değer yerleştirir. Karakter dizilerinin son tarafıyla
ilgilenmez. Bu iş için print() fonksiyonu başka bir parametreye sahiptir.
Bu arada, yukarıdaki örneklerde hep karakter dizilerini kullanmış olmamız sizi yanıltmasın.
sep parametresi yalnızca karakter dizilerinin değil sayıların arasına da istediğiniz bir değerin
yerleştirilmesini sağlayabilir. Mesela:
>>> print(1, 2, 3, 4, 5, sep="-")
1-2-3-4-5
Ancak sep parametresine değer olarak yalnızca karakter dizilerini ve None adlı özel bir
sözcüğü verebiliriz. (None sözcüğünden ileride söz edeceğiz):
>>> print(1, 2, 3, 4, 5, sep=0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: sep must be None or a string, not int
Gördüğünüz gibi, sep parametresine bir sayı olan 0 değerini veremiyoruz.
Peki bu parametreye None değeri verirsek ne olur? Bu parametreye None değeri
verildiğinde, print() fonksiyonu bu parametre için öntanımlı değeri (yani bir adet boşluk)
kullanır:
>>> print('a', 'b', sep=None)
a b
6.4. print() Fonksiyonunun Parametreleri
59
Python 3 için Türkçe Kılavuz, Sürüm 3
Eğer amacınız parametreleri birbirine bitiştirmekse, yani sep parametresinin öntanımlı değeri
olan boşluk karakterini ortadan kaldırmaksa, sep parametresine boş bir karakter dizisi
vermeniz gerektiğini biliyorsunuz:
>>> print('a', 'b', sep='')
ab
print() fonksiyonunun sep parametresini bütün ayrıntılarıyla incelediğimize göre, bu
fonksiyonun bir başka özel parametresinden söz edebiliriz.
end
Bir önceki bölümde şöyle bir laf etmiştik:
print() fonksiyonun sep adlı özel bir parametresi bulunur. Bu parametre
print() fonksiyonunda görünmese bile her zaman oradadır.
Aynı bu şekilde, print() fonksiyonunun end adlı özel bir parametresi daha bulunur. Tıpkı
sep parametresi gibi, end parametresi de print() fonksiyonunda görünmese bile her zaman
oradadır.
Bildiğiniz gibi, sep parametresi print() fonksiyonuna verilen parametreler birleştirilirken
araya hangi karakterin gireceğini belirliyordu. end parametresi ise bu parametrelerin sonuna
neyin geleceğini belirler.
print() fonksiyonu öntanımlı olarak, parametrelerin sonuna ‘satır başı karakteri’ ekler. Peki
bu satır başı karakteri (veya ‘yeni satır karakteri’) denen şey de ne oluyor?
Dilerseniz bunu bir örnek üzerinde görelim.
Şöyle bir kodumuz olsun:
>>> print("Pardus ve Ubuntu birer GNU/Linux dağıtımıdır.")
Bu kodu yazıp Enter tuşuna bastığımız anda print() fonksiyonu iki farklı işlem gerçekleştirir:
1. Öncelikle karakter dizisini ekrana yazdırır.
2. Ardından bir alt satıra geçip bize >>> işaretini gösterir.
İşte bu ikinci işlem, karakter dizisinin sonunda bir adet satır başı karakteri olmasından,
daha doğrusu print() fonksiyonunun, satır başı karakterini karakter dizisinin sonuna
eklemesinden kaynaklanır. Bu açıklama biraz kafa karıştırıcı gelmiş olabilir. O halde biraz
daha açıklayalım. Şu örneğe bakın:
>>> print("Pardus\nUbuntu")
Pardus
Ubuntu
Burada “Pardus” ve “Ubuntu” karakter dizilerinin tam ortasında çok özel bir karakter dizisi
daha görüyorsunuz. Bu karakter dizisi şudur: \n. İşte bu özel karakter dizisine satır başı
karakteri (newline) adı verilir. Bu karakterin görevi, karakter dizisini, bulunduğu noktadan
bölüp, karakter dizisinin geri kalanını bir alt satıra geçirmektir. Zaten çıktıda da bu işlevi
yerine getirdiğini görüyorsunuz. Karakter dizisi “Pardus” kısmından sonra ikiye bölünüyor ve
bu karakter dizisinin geri kalan kısmı olan “Ubuntu” karakter dizisi bir alt satıra yazdırılıyor.
Bunu daha iyi anlamak için bir örnek daha verelim:
60
Bölüm 6. print() Fonksiyonu
Python 3 için Türkçe Kılavuz, Sürüm 3
>>> print("birinci satır\nikinci satır\nüçüncü satır")
birinci satır
ikinci satır
üçüncü satır
Peki size bir soru sorayım: Acaba yukarıdaki kodları daha verimli bir şekilde nasıl yazabiliriz?
Evet, doğru tahmin ettiniz... Tabii ki sep parametresini kullanarak:
>>> print("birinci satır", "ikinci satır", "üçüncü satır", sep="\n")
birinci satır
ikinci satır
üçüncü satır
Burada yaptığımız şey çok basit. sep parametresinin değerini \n, yani yeni satır karakteri
(veya satır başı karakteri) olarak değiştirdik. Böylece karakter dizileri arasına birer \n karakteri
yerleştirerek her bir karakter dizisinin farklı satıra yazdırılmasını sağladık.
İşte end parametresinin öntanımlı değeri de bu \n karakteridir ve bu parametre print()
fonksiyonunda görünmese bile her zaman oradadır.
Yani diyelim ki şöyle bir kod yazdık:
>>> print("Bugün günlerden Salı")
Burada herhangi bir end parametresi görmüyoruz. Ancak Python yukarıdaki kodu aslında
şöyle algılar:
>>> print("Bugün günlerden Salı", end="\n")
Biraz önce de dediğimiz gibi, bu kodu yazıp Enter tuşuna bastığımız anda print() fonksiyonu
iki farklı işlem gerçekleştirir:
1. Öncelikle karakter dizisini ekrana yazdırır.
2. Ardından bir alt satıra geçip bize >>> işaretini gösterir.
Bunun ne demek olduğunu anlamak için end parametresinin değerini değiştirmemiz yeterli
olacaktır:
>>> print("Bugün günlerden Salı", end=".")
Bugün günlerden Salı.>>>
Gördüğünüz gibi, end parametresinin öntanımlı değeri olan \n karakterini silip yerine .
(nokta) işareti koyduğumuz için, komutu yazıp Enter tuşuna bastığımızda print() fonksiyonu
satır başına geçmedi. Yeni satıra geçebilmek için Enter tuşuna kendimiz basmalıyız. Elbette,
eğer yukarıdaki kodları şöyle yazarsanız, print() fonksiyonu hem karakter dizisinin sonuna
nokta ekleyecek, hem de satır başına geçecektir:
>>> print("Bugün günlerden Salı", end=".\n")
Bugün günlerden Salı.
Şimdi bu öğrendiklerimizi türkümüze uygulayalım:
6.4. print() Fonksiyonunun Parametreleri
61
Python 3 için Türkçe Kılavuz, Sürüm 3
>>> print("bir", "iki", "üç", "dört", "on dört",
... sep=" mumdur ", end=" mumdur\n")
Not: Burada kodlarımızın sağa doğru çirkin bir şekilde uzamasını engellemek için “on dört”
karakter dizisini yazıp virgülü koyduktan sonra Enter tuşuna basarak bir alt satıra geçtik.
Bir alt satıra geçtiğimizde >>> işaretinin ... işaretine dönüştüğüne dikkat edin. Python’da
doğru kod yazmak kadar, yazdığımız kodların düzgün görünmesi de önemlidir. O yüzden
yazdığımız her bir kod satırının mümkün olduğunca 79 karakteri geçmemesini sağlamalıyız.
Eğer yazdığınız bir satır 79 karakteri aşıyorsa, aşan kısmı yukarıda gösterdiğimiz şekilde alt
satıra alabilirsiniz.
end parametresi de, tıpkı sep parametresi gibi, her zaman ismiyle birlikte kullanılması
gereken bir parametredir. Yani eğer end parametresinin ismini belirtmeden sadece değerini
kullanmaya çalışırsak Python ne yapmaya çalıştığımızı anlayamaz.
Yine tıpkı sep parametresi gibi, end parametresinin değeri de sadece bir karakter dizisi veya
None olabilir:
>>> print(1, 2, 3, 4, 5, end=0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: end must be None or a string, not int
Gördüğünüz gibi, end parametresine bir sayı olan 0 değerini veremiyoruz.
Eğer bu parametreye None değeri verirsek, tıpkı sep parametresinde olduğu gibi, print()
fonksiyonu bu parametre için öntanımlı değeri (yani satır başı karakteri) kullanır:
>>> print('a', 'b', end=None)
a b
Eğer amacınız yeni satıra geçilmesini engellemekse, yani end parametresinin öntanımlı
değeri olan \n kaçış dizisini ortadan kaldırmaksa, end parametresine boş bir karakter dizisi
vermelisiniz:
>>> print('a', 'b', end='')
a b>>>
1le
Not: Burada henüz öğrenmediğimiz bazı şeyler göreceksiniz. Hiç endişe etmeyin. Bunları
ilerde bütün ayrıntılarıyla öğreneceğiz. Şimdilik konu hakkında biraz olsun 1kir sahibi
olmanızı sağlayabilirsek kendimizi başarılı sayacağız.
print() fonksiyonunun sep ve end dışında üçüncü bir özel parametresi daha bulunur. Bu
parametrenin adı 1le‘dır. Görevi ise, print() fonksiyonuna verilen karakter dizisi ve/veya
sayıların, yani parametrelerin nereye yazılacağını belirtmektir.
62
Bölüm 6. print() Fonksiyonu
Python 3 için Türkçe Kılavuz, Sürüm 3
Bu parametrenin öntanımlı değeri sys.stdout ‘tur. Peki bu ne anlama geliyor? sys.stdout,
‘standart çıktı konumu’ anlamına gelir. Peki ‘standart çıktı konumu’ ne demek?
Standart çıktı konumu; bir programın, ürettiği çıktıları verdiği yerdir. Aslında bu kavramın ne
demek olduğu adından da anlaşılıyor:
standart çıktı konumu = çıktıların standart olarak verildiği konum.
Mesela Python öntanımlı olarak, ürettiği çıktıları ekrana verir. Eğer o anda etkileşimli kabukta
çalışıyorsanız, Python ürettiği çıktıları etkileşimli kabuk üzerinde gösterir. Eğer yazdığınız
bir programı komut satırında çalıştırıyorsanız, üretilen çıktılar komut satırında görünür.
Dolayısıyla Python’ın standart çıktı konumu etkileşimli kabuk veya komut satırıdır. Yani
print() fonksiyonu yardımıyla bastığınız çıktılar etkileşimli kabukta ya da komut satırında
görünecektir.
Şimdi bu konuyu daha iyi anlayabilmek için birkaç örnek yapalım.
Normal şartlar altında print() fonksiyonunun çıktısını etkileşimli kabukta görürüz:
>>> print("Ben Python, Monty Python!")
Ben Python, Monty Python!
Ama eğer istersek print() fonksiyonunun, çıktılarını ekrana değil, bir dosyaya yazdırmasını
da sağlayabiliriz. Mesela biz şimdi print() fonksiyonunun deneme.txt adlı bir dosyaya çıktı
vermesini sağlayalım.
Bunun için sırasıyla şu kodları yazalım:
>>> dosya = open("deneme.txt", "w")
>>> print("Ben Python, Monty Python!", file=dosya)
>>> dosya.close()
Herhangi bir çıktı almadınız, değil mi? Evet. Çünkü yazdığımız bu kodlar sayesinde print()
fonksiyonu, çıktılarını deneme.txt adlı bir dosyaya yazdırdı.
Gelin isterseniz yukarıdaki kodları satır satır inceleyelim:
1. Öncelikle deneme.txt adlı bir dosya oluşturduk ve bu dosyayı dosya adlı bir değişkene
atadık. Burada kullandığımız open() fonksiyonuna çok takılmayın. Bunu birkaç bölüm sonra
inceleyeceğiz. Biz şimdilik bu şekilde dosya oluşturulduğunu bilelim yeter. Bu arada open
fonksiyonunun da biçim olarak type(), len(), pow() ve print() fonksiyonlarına ne kadar
benzediğine dikkat edin. Gördüğünüz gibi open() fonksiyonu da tıpkı type(), len(), pow()
ve print() fonksiyonları gibi birtakım parametreler alıyor. Bu fonksiyonun ilk parametresi
“deneme.txt” adlı bir karakter dizisi. İşte bu karakter dizisi bizim oluşturmak istediğimiz
dosyanın adını gösteriyor. İkinci parametre ise “w” adlı başka bir karakter dizisi. Bu da
deneme.txt dosyasının yazma kipinde (modunda) açılacağını gösteriyor. Ama dediğim gibi,
siz şimdilik bu ayrıntılara fazla takılmayın. İlerleyen derslerde, bu konuları adınızı bilir gibi
bileceğinizden emin olabilirsiniz.
2. Oluşturduğumuz bu deneme.txt adlı dosya, o anda bulunduğunuz dizin içinde oluşacaktır.
Bu dizinin hangisi olduğunu öğrenmek için şu komutları verebilirsiniz:
>>> import os
>>> os.getcwd()
Bu komutun çıktısında hangi dizinin adı görünüyorsa, deneme.txt dosyası da o dizinin
içindedir. Mesela bendeki çıktı /home/istihza/Desktop. Demek ki oluşturduğum deneme.txt
6.4. print() Fonksiyonunun Parametreleri
63
Python 3 için Türkçe Kılavuz, Sürüm 3
adlı dosya masaüstündeymiş. Ben bu komutları Ubuntu üzerinde verdim. Eğer Windows
üzerinde verseydim şuna benzer bir çıktı alacaktım: C:\Users\istihza\Desktop
3. Ardından da normal bir şekilde print() fonksiyonumuzu çalıştırdık. Ama gördüğünüz gibi
print() fonksiyonu bize herhangi bir çıktı vermedi. Çünkü, daha önce de söylediğimiz gibi,
print() fonksiyonunu biz ekrana değil, dosyaya çıktı verecek şekilde ayarladık. Bu işlemi, 1le
adlı bir parametreye, biraz önce tanımladığımız dosya değişkenini yazarak yaptık.
4. Son komut yardımıyla da, yaptığımız değişikliklerin dosyada görünebilmesi için ilk başta
açtığımız dosyayı kapatıyoruz.
Şimdi deneme.txt adlı dosyayı açın. Biraz önce print() fonksiyonuyla yazdırdığımız “Ben
Python, Monty Python!” karakter dizisinin dosyaya işlenmiş olduğunu göreceksiniz.
Böylece print() fonksiyonunun standart çıktı konumunu değiştirmiş olduk. Yani print()
fonksiyonunun 1le adlı parametresine farklı bir değer vererek, print() fonksiyonunun
etkileşimli kabuğa değil dosyaya yazmasını sağladık.
Tıpkı sep ve end parametreleri gibi, 1le parametresi de, siz görmeseniz bile her zaman
print() fonksiyonunun içinde vardır. Yani diyelim ki şöyle bir komut verdik:
>>> print("Tahir olmak da ayıp değil", "Zühre olmak da")
Python bu komutu şöyle algılar:
>>> print("Tahir olmak da ayıp değil", "Zühre olmak da",
... sep=" ", end="\n", file=sys.stdout)
Yani kendisine parametre olarak verilen değerleri ekrana yazdırırken sırasıyla şu işlemleri
gerçekleştirir:
1. Parametrelerin arasına birer boşluk koyar (sep=" "),
2. Ekrana yazdırma işlemi bittikten sonra parametrelerin sonuna satır başı karakteri ekler
(end="\n")
3. Bu çıktıyı standart çıktı konumuna gönderir (file=sys.stdout).
İşte biz burada 1le parametresinin değeri olan standart çıktı konumuna başka bir değer
vererek bu konumu değiştiriyoruz.
Gelin isterseniz bununla ilgili bir örnek daha yapalım. Mesela kişisel bilgilerimizi bir dosyaya
kaydedelim. Öncelikle bilgileri kaydedeceğimiz dosyayı oluşturalım:
>>> f = open("kişisel_bilgiler.txt", "w")
Bu kodlarla, kişisel_bilgiler.txt adını taşıyan bir dosyayı yazma kipinde (w) açmış ve bu dosyayı
f adlı bir değişkene atamış olduk. Şimdi bilgileri yazmaya başlayabiliriz:
>>> print("Fırat Özgül", file=f)
>>> print("Adana", file=f)
>>> print("Ubuntu", file=f)
İşimiz bittiğinde dosyayı kapatmayı unutmuyoruz. Böylece bütün bilgiler dosyaya yazılmış
oluyor:
>>> f.close()
Oluşturduğumuz kişisel_bilgiler.txt adlı dosyayı açtığımızda, print() fonksiyonuna verdiğimiz
parametrelerin dosyaya yazdırıldığını görüyoruz.
64
Bölüm 6. print() Fonksiyonu
Python 3 için Türkçe Kılavuz, Sürüm 3
En başta da söylediğim gibi, bu bölümde henüz öğrenmediğimiz bazı şeylerle karşılaştık. Eğer
yukarıda verilen örnekleri anlamakta zorlandıysanız hiç endişe etmenize gerek yok. Birkaç
bölüm sonra burada anlattığımız şeyler size çocuk oyuncağı gibi gelecek...
2ush
Şimdiye kadar print() fonksiyonunun sep, end ve 1le adlı özel birtakım parametreleri
olduğunu öğrendik. print() fonksiyonunun bunların dışında başka bir özel parametresi daha
bulunur. Bu parametrenin adı 2ush. İşte şimdi biz print() fonksiyonunun bu 2ush adlı
parametresinden söz edeceğiz.
Bildiğiniz gibi, print() gibi bir komut verdiğimizde Python, yazdırmak istediğimiz bilgiyi
standart çıktı konumuna gönderir. Ancak Python’da bazı işlemler standart çıktı konumuna
gönderilmeden önce bir süre tamponda bekletilir ve daha sonra bekleyen bu işlemler topluca
standart çıktı konumuna gönderilir. Peki ilk başta çok karmaşıkmış gibi görünen bu ifade ne
anlama geliyor?
Aslında siz bu olguya hiç yabancı değilsiniz. 1le parametresini anlatırken verdiğimiz şu örneği
tekrar ele alalım:
>>> f = open("kişisel_bilgiler.txt", "w")
Bu komutla kişisel_bilgiler.txt adlı bir dosyayı yazma kipinde açtık. Şimdi bu dosyaya bazı
bilgiler ekleyelim:
>>> print("Fırat Özgül", file=f)
Bu komutla kişisel_bilgiler.txt adlı dosyaya ‘Fırat Özgül’ diye bir satır eklemiş olduk.
Şimdi bilgisayarınızda oluşan bu kişisel_bilgiler.txt dosyasını açın. Gördüğünüz gibi dosyada
hiçbir bilgi yok. Dosya şu anda boş görünüyor. Halbuki biz biraz önce bu dosyaya ‘Fırat Özgül’
diye bir satır eklemiştik, değil mi?
Python bizim bu dosyaya eklemek istediğimiz satırı tampona kaydetti. Dosyaya yazma
işlemleri sona erdiğinde ise Python, tamponda bekleyen bütün bilgileri standart çıktı
konumuna (yani bizim durumumuzda f adlı değişkenin tuttuğu kişisel_bilgiler.txt adlı
dosyaya) boşaltacak.
Dosyaya başka bilgiler de yazalım:
>>> print("Adana", file=f)
>>> print("Ubuntu", file=f)
Dosyaya yazacağımız şeyler bu kadar. Artık yazma işleminin sona erdiğini Python’a bildirmek
için şu komutu veriyoruz:
>>> f.close()
Böylece dosyamızı kapatmış olduk. Şimdi kişisel_bilgiler.txt adlı dosyaya çift tıklayarak
dosyayı tekrar açın. Orada ‘Fırat Özgül’, ‘Adana’ ve ‘Ubuntu’ satırlarını göreceksiniz.
Gördüğünüz gibi, gerçekten de Python dosyaya yazdırmak istediğimiz bütün verileri önce
tamponda bekletti, daha sonra dosya kapatılınca tamponda bekleyen bütün verileri dosyaya
boşalttı. İşte 2ush parametresi ile, bahsettiğimiz bu boşaltma işlemini kontrol edebilirsiniz.
Şimdi dikkatlice inceleyin:
6.4. print() Fonksiyonunun Parametreleri
65
Python 3 için Türkçe Kılavuz, Sürüm 3
>>> f = open("kişisel_bilgiler.txt", "w")
Dosyamızı oluşturduk. Şimdi bu dosyaya bazı bilgiler ekleyelim:
>>> print("Merhaba Dünya!", file=f, flush=True)
Gördüğünüz gibi, burada 2ush adlı yeni bir parametre kullandık. Bu parametreye verdiğimiz
değer True. Şimdi dosyaya çift tıklayarak dosyayı açın. Gördüğünüz gibi, henüz dosyayı
kapatmadığımız halde bilgiler dosyaya yazıldı. Bu durum, tahmin edebileceğiniz gibi, 2ush
parametresine True değeri vermemiz sayesindedir. Bu parametre iki değer alabilir: True ve
False. Bu parametrenin öntanımlı değeri False‘tur. Yani eğer biz bu parametreye herhangi
bir değer belirtmezsek Python bu parametrenin değerini False olarak kabul edecek ve
bilgilerin dosyaya yazılması için dosyanın kapatılmasını bekleyecektir. Ancak bu parametreye
True değerini verdiğimizde ise veriler tamponda bekletilmeksizin standart çıktı konumuna
gönderilecektir.
Yazdığınız bir programda, yapmak istediğiniz işin niteliğine göre, bir dosyaya yazmak
istediğiniz bilgilerin bir süre tamponda bekletilmesini veya hiç bekletilmeden doğrudan
dosyaya yazılmasını isteyebilirsiniz. İhtiyacınıza bağlı olarak da 2ush parametresinin değerini
True veya False olarak belirleyebilirsiniz.
Birkaç Pratik Bilgi
Buraya gelene kadar print() fonksiyonu ve bu fonksiyonun parametreleri hakkında epey
söz söyledik. Dilerseniz şimdi de, programcılık maceranızda işinize yarayacak, işlerinizi
kolaylaştıracak bazı ipuçları verelim.
Yıldızlı Parametreler
Şimdi size şöyle bir soru sormama izin verin: Acaba aşağıdaki gibi bir çıktıyı nasıl elde ederiz?
L.i.n.u.x
Aklınıza hemen şöyle bir cevap gelmiş olabilir:
>>> print("L", "i", "n", "u", "x", sep=".")
L.i.n.u.x
Yukarıdaki, gerçekten de doğru bir çözümdür. Ancak bu soruyu çözmenin çok daha basit bir
yolu var. Şimdi dikkatle bakın:
>>> print(*"Linux", sep=".")
L.i.n.u.x
Konuyu açıklamaya geçmeden önce bir örnek daha verelim:
>>> print(*"Galatasaray")
G a l a t a s a r a y
Burada neler döndüğünü az çok tahmin ettiğinizi zannediyorum. Son örnekte de gördüğünüz
gibi, “Galatasaray” karakter dizisinin başına eklediğimiz yıldız işareti; “Galatasaray” karakter
66
Bölüm 6. print() Fonksiyonu
Python 3 için Türkçe Kılavuz, Sürüm 3
dizisinin her bir öğesini parçalarına ayırarak, bunları tek tek print() fonksiyonuna yolluyor.
Yani sanki print() fonksiyonunu şöyle yazmışız gibi oluyor:
>>> print("G", "a", "l", "a", "t", "a", "s", "a", "r", "a", "y")
G a l a t a s a r a y
Dediğimiz gibi, bir fonksiyona parametre olarak verdiğimiz bir karakter dizisinin başına
eklediğimiz yıldız işareti, bu karakter dizisini tek tek öğelerine ayırıp, bu öğeleri yine tek tek ve
sanki her bir öğe ayrı bir parametreymiş gibi o fonksiyona gönderdiği için doğal olarak yıldız
işaretini ancak, birden fazla parametre alabilen fonksiyonlara uygulayabiliriz.
Örneğin len() fonksiyonu sadece tek bir parametre alabilir:
>>> len("Galatasaray")
11
Bu fonksiyonu birden fazla parametre ile kullanamayız:
>>> len("Galatasaray", "Fenerbahçe", "Beşiktaş")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: len() takes exactly one argument (3 given)
Hata mesajında da söylendiği gibi, len() fonksiyonu yalnızca tek bir parametre alabilirken,
biz 3 parametre vermeye çalışmışız...
Dolayısıyla yıldızlı parametreleri len() fonksiyonuna uygulayamayız:
>>> len(*"Galatasaray")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: len() takes exactly one argument (11 given)
Bir parametrenin başına yıldız eklediğimizde, o parametreyi oluşturan bütün öğeler tek tek
fonksiyona gönderildiği için, sanki len() fonksiyonuna 1 değil de, 11 ayrı parametre vermişiz
gibi bir sonuç ortaya çıkıyor.
Yıldızlı parametreleri bir fonksiyona uygulayabilmemiz için o fonksiyonun birden fazla
parametre alabilmesinin yanısıra, yapısının da yıldızlı parametre almaya uygun olması
gerekir. Mesela open(), type() ve biraz önce bahsettiğimiz len() fonksiyonlarının yapısı
yıldızlı parametre almaya uygun değildir. Dolayısıyla yıldızlı parametreleri her fonksiyonla
birlikte kullanamayız, ama print() fonksiyonu yıldızlı parametreler için son derece uygun bir
fonksiyondur:
>>> print(*"Galatasaray")
G a l a t a s a r a y
>>> print(*"TBMM", sep=".")
T.B.M.M
>>> print(*"abcçdefgğh", sep="/")
6.5. Birkaç Pratik Bilgi
67
Python 3 için Türkçe Kılavuz, Sürüm 3
a/b/c/ç/d/e/f/g/ğ/h
Bu örneklerden de gördüğünüz gibi, print() fonksiyonuna verdiğimiz bir parametrenin
başına yıldız eklediğimizde, o parametre tek tek parçalarına ayrılıp print() fonksiyonuna
gönderildiği için, sonuç olarak sep parametresinin karakter dizisi öğelerine tek tek
uygulanmasını sağlamış oluyoruz.
Hatırlarsanız sep parametresinin öntanımlı değerinin bir adet boşluk karakteri olduğunu
söylemiştik. Yani aslında Python yukarıdaki ilk komutu şöyle görüyor:
>>> print(*"Galatasaray", sep=" ")
Dolayısıyla, yıldız işareti sayesinde “Galatasaray” adlı karakter dizisinin her bir öğesinin
arasına bir adet boşluk karakteri yerleştiriliyor. Bir sonraki “TBMM” karakter dizisinde ise, sep
parametresinin değerini nokta işareti olarak değiştirdiğimiz için “TBMM” karakter dizisinin
her bir öğesinin arasına bir adet nokta işareti yerleştiriliyor. Aynı şekilde “abcçdefgğh”
karakter dizisinin her bir öğesini tek tek print() fonksiyonuna yollayarak, sep parametresine
verdiğimiz / işareti yardımıyla her öğenin arasına bu / işaretini yerleştirebiliyoruz.
Yıldızlı parametrelerle ilgili tek kısıtlama, bunların sayılarla birlikte kullanılamayacak
olmasıdır:
>>> print(*2345)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: print() argument after * must be a sequence, not int
Çünkü yıldızlı parametreler ancak ve ancak dizi özelliği taşıyan veri tipleriyle birlikte
kullanılabilir. Mesela karakter dizileri bu türden bir veri tipidir. İlerde dizi özelliği taşıyan ve
bu sayede yıldızlı parametrelerle birlikte kullanılabilecek başka veri tiplerini de öğreneceğiz.
Yukarıda verdiğimiz örnekler bize yıldızlı parametrelerin son derece kullanışlı araçlar
olduğunu gösteriyor. İleride de bu parametrelerden bol bol yararlanacağız. Biz şimdi bu
konuyu burada kapatıp başka bir şeyden söz edelim.
sys.stdout’u Kalıcı Olarak Değiştirmek
Önceki başlıklar altında verdiğimiz örneklerden de gördüğünüz gibi, print() fonksiyonunun
1le parametresi yardımıyla Python’ın standart çıktı konumunu geçici olarak değiştirebiliyoruz.
Ama bazı durumlarda, yazdığınız programlarda, o programın işleyişi boyunca standart dışı
bir çıktı konumu belirlemek isteyebilirsiniz. Yani standart çıktı konumunu geçici olarak
değil, kalıcı olarak değiştirmeniz gerekebilir. Mesela yazdığınız programda bütün çıktıları bir
dosyaya yazdırmayı tercih edebilirsiniz. Elbette bu işlemi her defasında 1le parametresini,
çıktıları yazdırmak istediğiniz dosyanın adı olarak belirleyerek yapabilirsiniz. Tıpkı şu örnekte
olduğu gibi:
>>> f = open("dosya.txt", "w")
>>> print("Fırat Özgül", file=f)
>>> print("Adana", file=f)
>>> print("Ubuntu", file=f)
>>> f.close()
68
Bölüm 6. print() Fonksiyonu
Python 3 için Türkçe Kılavuz, Sürüm 3
Gördüğünüz gibi, her defasında 1le parametresine f değerini vererek işimizi hallettik. Ama
bunu yapmanın daha pratik bir yöntemi var. Dilerseniz yazdığınız programın tüm işleyişi
boyunca çıktıları başka bir konuma yönlendirebilirsiniz. Bunun için hem şimdiye kadar
öğrendiğimiz, hem de henüz öğrenmediğimiz bazı bilgileri kullanacağız.
İlk önce şöyle bir kod yazalım:
>>> import sys
Bu kod yardımıyla sys adlı özel bir ‘modülü’ programımıza dahil etmiş, yani içe aktarmış olduk.
Peki ‘modül’ nedir, ‘içe aktarmak’ ne demek?
Aslında biz bu ‘modül’ ve ‘içe aktarma’ kavramlarına hiç de yabancı değiliz. Önceki derslerde,
pek üzerinde durmamış da olsak, biz Python’daki birkaç modülle zaten tanışmıştık. Mesela
os adlı bir modül içindeki getcwd() adlı bir fonksiyonu kullanarak, o anda hangi dizinde
bulunduğumuzu öğrenebilmiştik:
>>> import os
>>> os.getcwd()
Aynı şekilde keyword adlı başka bir modül içindeki kwlist adlı değişkeni kullanarak, hangi
kelimelerin Python’da değişken adı olarak kullanılamayacağını da listeleyebilmiştik:
>>> import keyword
>>> keyword.kwlist
İşte şimdi de, os ve keyword modüllerine ek olarak sys adlı bir modülden söz ediyoruz.
Gelin isterseniz öteki modülleri şimdilik bir kenara bırakıp, bu sys denen modüle dikkatimizi
verelim.
Dediğimiz gibi, sys modülü içinde pek çok önemli değişken ve fonksiyon bulunur. Ancak bir
modül içindeki değişken ve fonksiyonları kullanabilmek için o modülü öncelikle programımıza
dahil etmemiz, yani içe aktarmamız gerekiyor. Bunu import komutuyla yapıyoruz:
>>> import sys
Artık sys modülü içindeki bütün fonksiyon ve değişkenlere ulaşabileceğiz.
sys modülü içinde bulunan pek çok değişken ve fonksiyondan biri de stdout adlı değişkendir.
Bu değişkenin değerine şöyle ulaşabilirsiniz:
>>> sys.stdout
Bu komut şuna benzer bir çıktı verir:
<_io.TextIOWrapper name='<stdout>' mode='w' encoding='cp1254'>
Bu çıktıdaki name=’<stdout>’ kısmına dikkat edin. Bu ifadeye birazdan geri döneceğiz. Biz
şimdi başka bir şeyden söz edelim.
Hatırlarsanız etkileşimli kabuğu nasıl kapatabileceğimizi anlatırken, etkileşimli kabuktan
çıkmanın bir yolunun da şu komutları vermek olduğunu söylemiştik:
>>> import sys; sys.exit()
Bu komutu tek satırda yazmıştık, ama istersek şöyle de yazabiliriz elbette:
6.5. Birkaç Pratik Bilgi
69
Python 3 için Türkçe Kılavuz, Sürüm 3
>>> import sys
>>> sys.exit()
Dedik ya, sys modülü içinde pek çok değişken ve fonksiyon bulunur. Nasıl stdout sys modülü
içindeki değişkenlerden biri ise, exit() de sys modülü içinde bulunan fonksiyonlardan biridir.
Biz ‘modüller’ konusunu ilerleyen derslerde ayrıntılı bir şekilde inceleyeceğiz. Şimdilik
modüllere ilişkin olarak yalnızca şunları bilelim yeter:
1. Python’da modüller import komutu ile içe aktarılır. Örneğin sys adlı modülü içe aktarmak
için import sys komutunu veriyoruz.
2. Modüller içinde pek çok faydalı değişken ve fonksiyon bulunur. İşte bir modülü içe
aktardığımızda, o modül içindeki bu değişken ve fonksiyonları kullanma imkanı elde ederiz.
3.
sys modülü içindeki değişkenlere bir örnek stdout ; fonksiyonlara örnek
ise exit() fonksiyonudur.
Bir modül içindeki bu değişken ve fonksiyonlara
‘modül_adı.değişken_ya_da_fonksiyon’ formülünü kullanarak erişebiliriz. Örneğin:
>>> sys.stdout
>>> sys.exit()
4. Hatırlarsanız bundan önce de, open() fonksiyonu ile dosya oluşturmayı anlatırken,
oluşturulan dosyanın hangi dizinde olduğunu bulabilmek amacıyla, o anda içinde
bulunduğumuz dizini tespit edebilmek için şu kodları kullanmıştık:
>>> import os
>>> os.getcwd()
Burada da os adlı başka bir modül görüyoruz. İşte os da tıpkı sys gibi bir modüldür ve tıpkı
sys modülünde olduğu gibi, os modülünün de içinde pek çok yararlı değişken ve fonksiyon
bulunur. getcwd() adlı fonksiyon da os modülü içinde yer alan ve o anda hangi dizin altında
bulunduğumuzu gösteren bir fonksiyondur. Elbette, yine tıpkı sys modülünde olduğu gibi,
os modülü içindeki bu yararlı değişken ve fonksiyonları kullanabilmek için de öncelikle bu os
modülünü içe aktarmamız, yani programımıza dahil etmemiz gerekiyor. os modülünü import
komutu aracılığıyla uygun bir şekilde içe aktardıktan sonra, modül içinde yer alan getcwd()
adlı fonksiyona yine ‘modül_adı.fonksiyon’ formülünü kullanarak erişebiliyoruz.
Modüllere ilişkin şimdilik bu kadar bilgi yeter. Modülleri bir kenara bırakıp yolumuza devam
edelim...
Eğer sys.exit() komutunu verip etkileşimli kabuktan çıktıysanız, etkileşimli kabuğa tekrar
girin ve sys modülünü yeniden içe aktarın:
>>> import sys
Not: Bir modülü aynı etkileşimli kabuk oturumu içinde bir kez içe aktarmak yeterlidir. Bir
modülü bir kez içe aktardıktan sonra, o oturum süresince bu modül içindeki değişken ve
fonksiyonları kullanmaya devam edebilirsiniz. Ama tabii ki etkileşimli kabuğu kapatıp tekrar
açtıktan sonra, bir modülü kullanabilmek için o modülü tekrar içe aktarmanız gerekir.
Şimdi şu kodu yazın:
>>> f = open("dosya.txt", "w")
70
Bölüm 6. print() Fonksiyonu
Python 3 için Türkçe Kılavuz, Sürüm 3
Bu kodun anlamını biliyorsunuz. Burada dosya.txt adlı bir dosyayı yazma kipinde açmış
olduk. Tahmin edebileceğiniz gibi, çıktılarımızı ekran yerine bu dosyaya yönlendireceğiz.
Şimdi de şöyle bir kod yazalım:
>>> sys.stdout = f
Bildiğiniz gibi, sys.stdout değeri Python’ın çıktıları hangi konuma vereceğini belirliyor. İşte
biz burada sys.stdout ‘un değerini biraz önce oluşturduğumuz f adlı dosya ile değiştiriyoruz.
Böylece Python bütün çıktıları f değişkeni içinde belirttiğimiz dosya.txt adlı dosyaya
gönderiyor.
Bu andan sonra yazacağınız her şey dosya.txt adlı dosyaya gidecektir:
>>> print("deneme metni", flush=True)
Gördüğünüz gibi, burada 1le parametresini kullanmadığımız halde çıktılarımız ekrana değil,
dosya.txt adlı bir dosyaya yazdırıldı. Peki ama bu nasıl oldu? Aslında bunun cevabı çok basit:
Biraz önce sys.stdout = f komutuyla sys.stdout ‘un değerini f değişkeninin tuttuğu dosya
ile değiştirdik. Bu işlemi yapmadan önce sys.stdout‘un değeri şuydu hatırlarsanız:
<_io.TextIOWrapper name='<stdout>' mode='w' encoding='cp1254'>
Ama sys.stdout = f komutundan sonra her şey değişti. Kontrol edelim:
>>> print(sys.stdout, flush=True)
Elbette bu komuttan herhangi bir çıktı almadınız. Çıktının ne olduğunu görmek için dosya.txt
adlı dosyayı açın. Orada şu satırı göreceksiniz:
<_io.TextIOWrapper name='dosya.txt' mode='w' encoding='cp1254'>
Gördüğünüz gibi, özgün stdout çıktısındaki name=’<stdout>’ değeri name=’dosya.txt’ olmuş.
Dolayısıyla artık bütün çıktılar dosya.txt adlı dosyaya gidiyor...
Bu arada, yukarıdaki çıktıda görünen name, mode ve encoding değerlerine şu şekilde
ulaşabilirsiniz:
>>> sys.stdout.name
>>> sys.stdout.mode
>>> sys.stdout.encoding
Burada sys.stdout.name komutu standart çıktı konumunun o anki adını verecektir.
sys.stdout.mode komutu ise standart çıktı konumunun hangi kipe sahip olduğunu gösterir.
Standart çıktı konumu genellikle yazma kipinde (w) bulunur. sys.stdout.encoding kodu
ise standart çıktı konumunun sahip olduğu kodlama biçimini gösterir. Kodlama biçimi,
standart çıktı konumuna yazdıracağınız karakterlerin hangi kodlama biçimi ile kodlanacağını
belirler. Kodlama biçimi Windows’ta genellikle ‘cp1254’, GNU/Linux’ta ise ‘utf-8’dir. Eğer
bu kodlama biçimi yanlış olursa, mesela dosyaya yazdıracağınız karakterler içindeki Türkçe
har2er düzgün görüntülenemez. Eğer burada söylediklerimiz size şu anda anlaşılmaz
geliyorsa, söylediklerimizi dikkate almadan yolunuza devam edebilirsiniz. Birkaç bölüm sonra
bu söylediklerimiz size daha fazla şey ifade etmeye başlayacak nasıl olsa.
Peki standart çıktı konumunu eski haline döndürmek isterseniz ne yapacaksınız? Bunun için
etkileşimli kabuktan çıkıp tekrar girebilirsiniz. Etkileşimli kabuğu tekrar açtığınızda her şeyin
eski haline döndüğünü göreceksiniz. Aynı şekilde, eğer bu kodları bir program dosyasına
yazmış olsaydınız, programınız kapandığında her şey eski haline dönecekti.
6.5. Birkaç Pratik Bilgi
71
Python 3 için Türkçe Kılavuz, Sürüm 3
Peki standart çıktı konumunu, etkileşimli kabuktan çıkmadan veya programı kapatmadan eski
haline döndürmenin bir yolu var mı? Elbette var. Dikkatlice bakın:
>>> import sys
>>> f = open("dosya.txt", "w")
>>> sys.stdout, f = f, sys.stdout
>>> print("deneme", flush=True)
>>> f, sys.stdout = sys.stdout, f
>>> print("deneme")
deneme
Uyarı: Eğer yukarıdaki kodları çalıştıramıyorsanız, aynı etkileşimli kabuk oturumunda
önceden verdiğiniz kodlar bu kodların doğru çıktı vermesini engelliyor olabilir. Bu sorunu
aşmak için, etkileşimli kabuğu kapatıp tekrar açın ve yukarıdaki komutları tekrar verin.
Aslında burada anlayamayacağınız hiçbir şey yok. Burada yaptığımız şeyi geçen bölümlerde
değişkenlerin değerini nasıl takas edeceğimizi anlatırken de yapmıştık. Hatırlayalım:
>>> osman = "Araştırma Geliştirme Müdürü"
>>> mehmet = "Proje Sorumlusu"
>>> osman, mehmet = mehmet, osman
Bu kodlarla Osman ve Mehmet’in unvanlarını birbiriyle takas etmiştik. İşte yukarıda
yaptığımız şey de bununla aynıdır. sys.stdout, f = f, sys.stdout dediğimizde f değerini
sys.stdout ‘a, sys.stdout ‘un değerini ise f ‘ye vermiş oluyoruz. f, sys.stdout = sys.stdout,
f dediğimizde ise, bu işlemin tam tersini yaparak her şeyi eski haline getirmiş oluyoruz.
Python’ın bize sunduğu bu kolaylıktan faydalanarak değişkenlerin değerini birbiriyle kolayca
takas edebiliyoruz. Eğer böyle bir kolaylık olmasaydı yukarıdaki kodları şöyle yazabilirdik:
>>> import sys
>>> f = open("dosya.txt", "w")
>>> özgün_stdout = sys.stdout
>>> sys.stdout = f
>>> print("deneme", flush=True)
>>> sys.stdout = özgün_stdout
>>> print("deneme")
deneme
Gördüğünüz gibi, sys.stdout ‘un değerini kaybetmemek için, sys.stdout değerini f adlı
dosyaya göndermeden önce şu kod yardımıyla yedekliyoruz:
>>> özgün_stdout = sys.stdout
sys.stdout ‘un özgün değerini özgün_stdout değişkenine atadığımız için, bu değere sonradan
tekrar ulaşabileceğiz. Zaten yukarıdaki kodlardan da gördüğünüz gibi, sys.stdout ‘un özgün
değerine dönmek istediğimizde şu kodu yazarak isteğimizi gerçekleştirebiliyoruz:
>>> sys.stdout = özgün_stdout
Böylece stdout değeri eski haline dönmüş oluyor ve bundan sonra yazdırdığımız her şey
yeniden ekrana basılmaya başlıyor.
...ve böylece uzun bir bölümü daha geride bıraktık. Bu bölümde hem print() fonksiyonunu
bütün ayrıntılarıyla incelemiş olduk, hem de Python programlama diline dair başka çok
72
Bölüm 6. print() Fonksiyonu
Python 3 için Türkçe Kılavuz, Sürüm 3
önemli kavramlardan söz ettik. Bu bakımdan bu bölüm bize epey şey öğretti. Artık
öğrendiğimiz bu bilgileri de küfemize koyarak başımız dik bir şekilde yola devam edebiliriz.
6.5. Birkaç Pratik Bilgi
73
BÖLÜM 7
Kaçış Dizileri
Python’da karakter dizilerini tanımlayabilmek için tek, çift veya üç tırnak işaretlerinden
faydalandığımızı geçen bölümde öğrenmiştik. Python bir verinin karakter dizisi olup
olmadığına bu tırnak işaretlerine bakarak karar verdiği için, tek, çift ve üç tırnak işaretleri
Python açısından özel bir önem taşıyor. Zira Python’ın gözünde bir başlangıç tırnağı ile bitiş
tırnağı arasında yer alan her şey bir karakter dizisidir.
Örneğin ilk olarak bir “ işareti koyup ardından “elma şeklinde devam ettiğinizde, Python ilk
tırnağı gördükten sonra karakter dizisini tanımlayabilmek için ikinci bir tırnak işareti aramaya
başlar. Siz “elma” şeklinde kodunuzu tamamladığınızda ise Python bellekte “elma” adlı bir
karakter dizisi oluşturur.
Bu noktada size şöyle bir soru sormama izin verin: Acaba tırnak işaretleri herhangi bir metin
içinde kaç farklı amaçla kullanılabilir?
İsterseniz bu sorunun cevabını örnekler üzerinde vermeye çalışalım:
Ahmet, “Bugün sinemaya gidiyorum,” dedi.
Burada tırnak işaretlerini, bir başkasının sözlerini aktarmak için kullandık.
‘book’ kelimesi Türkçede ‘kitap’ anlamına gelir.
Burada ise tırnak işaretlerini bazı kelimeleri vurgulamak için kullandık.
Bir de şuna bakalım:
Yarın Adana’ya gidiyorum.
Burada da tırnak işaretini, çekim eki olan ‘-(y)a’ ile özel isim olan ‘Adana’ kelimesini birbirinden
ayırmak için kesme işareti görevinde kullandık.
Şimdi yukarıda verdiğimiz ilk cümleyi bir karakter dizisi olarak tanımlamaya çalışalım:
>>> 'Ahmet, "Bugün sinemaya gidiyorum," dedi.'
Burada karakter dizisini tanımlamaya tek tırnak işareti ile başladık. Böylece Python bu
karakter dizisini tanımlama işlemini bitirebilmek için ikinci bir tek tırnak işareti daha aramaya
koyuldu ve aradığı tek tırnak işaretini cümlenin sonunda bularak, karakter dizisini düzgün bir
şekilde oluşturabildi.
Dediğimiz gibi, Python’ın gözünde tırnak işaretleri bir karakter dizisini başka veri tiplerinden
ayırt etmeye yarayan bir ölçüttür. Ama biz insanlar, yukarıda verdiğimiz örnek cümlelerden
de göreceğiniz gibi, programlama dillerinden farklı olarak, tırnak işaretlerini bir metin içinde
daha farklı amaçlar için de kullanabiliyoruz.
74
Python 3 için Türkçe Kılavuz, Sürüm 3
Şimdi yukarıdaki karakter dizisini şöyle tanımlamaya çalıştığımızı düşünün:
>>> "Ahmet, "Bugün sinemaya gidiyorum," dedi."
İşte burada Python’ın çıkarları ile bizim çıkarlarımız birbiriyle çatıştı. Python karakter
dizisini başlatan ilk çift tırnak işaretini gördükten sonra, karakter dizisini tanımlama işlemini
bitirebilmek için ikinci bir tırnak işareti daha aramaya koyuldu. Bu arayış sırasında da ‘Bugün’
kelimesinin başındaki çift tırnak işaretini gördü ve karakter dizisinin şu olduğunu zannetti:
>>> "Ahmet, "
Buraya kadar bir sorun yok. Bu karakter dizisi Python’ın sözdizimi kurallarına uygun.
Karakter dizisi bu şekilde tanımlandıktan sonra Python cümlenin geri kalanını okumaya
devam ediyor ve herhangi bir tırnak işareti ile başlamayan ve kendisinden önce gelen öğeden
herhangi bir virgül işareti ile ayrılmamış ‘Bugün’ kelimesini görüyor. Eğer bir kelime tırnak
işareti ile başlamıyorsa bu kelime ya bir değişkendir ya da sayıdır. Ama ‘Bugün’ kelimesi
ne bir değişken, ne de bir sayı olduğu, üstelik önceki öğeden de virgülle ayrılmadığı için
Python’ın hata vermekten başka çaresi kalmıyor. Çünkü biz burada ‘Bugün’ kelimesinin
baş tarafındaki çift tırnak işaretini karakter dizisi tanımlamak için değil, başkasının sözlerini
aktarmak amacıyla kullandık. Ancak elbette bir programlama dili bizim amacımızın ne
olduğunu kestiremez ve hata mesajını suratımıza yapıştırır:
File "<stdin>", line 1
"Ahmet, "Bugün sinemaya gidiyorum," dedi."
^
SyntaxError: invalid syntax
Peki biz böyle bir durumda ne yapmalıyız?
Bu hatayı engellemek için karakter dizisini tanımlamaya çift tırnak yerine tek tırnakla ya da üç
tırnakla başlayabiliriz:
>>> 'Ahmet, "Bugün sinemaya gidiyorum," dedi.'
... veya:
>>> """Ahmet, "Bugün sinemaya gidiyorum," dedi."""
Böylece karakter dizisini başlatan işaret ‘Bugün sinemaya gidiyorum,’ cümlesinin başındaki ve
sonundaki işaretlerden farklı olduğu için, Python okuma esnasında bu cümleye takılmaz ve
doğru bir şekilde, karakter dizisini kapatan tırnak işaretini bulabilir.
Bu yöntem tamamen geçerli ve mantıklıdır. Ama eğer istersek, aynı karakter dizisini çift
tırnakla tanımlayıp, yine de hata almayı engelleyebiliriz. Peki ama nasıl?
İşte burada ‘kaçış dizileri’ adı verilen birtakım araçlardan faydalanacağız.
Peki nedir bu ‘kaçış dizisi’ denen şey?
Kaçış dizileri, Python’da özel anlam taşıyan işaret veya karakterleri, sahip oldukları bu özel
anlam dışında bir amaçla kullanmamızı sağlayan birtakım araçlardır. Mesela yukarıda da
örneklerini verdiğimiz gibi, tırnak işaretleri Python açısından özel anlam taşıyan işaretlerdir.
Normalde Python bu işaretleri karakter dizilerini tanımlamak için kullanır. Ama eğer siz
mesela bir metin içinde bu tırnak işaretlerini farklı bir amaçla kullanacaksanız Python’ı bu
durumdan haberdar etmeniz gerekiyor. İşte kaçış dizileri, Python’ı böyle bir durumdan
haberdar etmemize yarayan araçlardır.
75
Python 3 için Türkçe Kılavuz, Sürüm 3
Python’da pek çok kaçış dizisi bulunur. Biz burada bu kaçış dizilerini tek tek inceleyeceğiz. O
halde hemen işe koyulalım.
Ters Taksim (\)
Yukarıda verdiğimiz örneklerde, çift tırnakla gösterdiğimiz karakter dizilerinin içinde de çift
tırnak işareti kullanabilmek için birkaç farklı yöntemden yararlanabildiğimizi öğrenmiştik.
Buna göre, eğer bir karakter dizisi içinde çift tırnak işareti geçiyorsa, o karakter dizisini tek
tırnakla; eğer tek tırnak geçiyorsa da o karakter dizisini çift tırnakla tanımlayarak bu sorunun
üstesinden gelebiliyorduk. Ama daha önce de söylediğimiz gibi, ‘kaçış dizileri’ adı verilen
birtakım araçları kullanarak, mesela içinde çift tırnak geçen karakter dizilerini yine çift tırnakla
tanımlayabiliriz.
Dilerseniz, kaçış dizisi kavramını açıklamaya geçmeden önce bununla ilgili birkaç örnek
verelim. Bu sayede ne ile karşı karşıya olduğumuz, zihnimizde biraz daha belirginleşebilir:
>>> print('Yarın Adana\'ya gidiyorum.')
Yarın Adana'ya gidiyorum.
Bir örnek daha verelim:
>>> print("\"book\" kelimesi Türkçede \"kitap\" anlamına gelir.")
"book" kelimesi Türkçede "kitap" anlamına gelir.
Burada da cümle içinde çift tırnak işaretlerini kullandığımız halde, \ işaretleri sayesinde
karakter dizilerini yine çift tırnakla tanımlayabildik.
Bir de şu örneğe bakalım:
>>> print("Python programlama dilinin adı \"piton\" yılanından gelmez")
Bütün bu örneklerde, karakter dizisini hem çift tırnakla tanımlayıp hem de karakter
dizisi içinde çift tırnak işaretlerini kullandığımız halde, herhangi bir hata almadığımızı
görüyorsunuz. Yukarıdaki kodlarda hata almamızı önleyen şeyin \ işareti olduğu belli. Ama
dilerseniz bu işaretin, hata almamızı nasıl önlediğini anlatmadan önce son bir örnek daha
verelim.
Hatırlarsanız önceki sayfalarda şöyle bir karakter dizisi ile karşılaşmıştık:
>>> print('İstanbul'un 5 günlük hava durumu tahmini')
File "<stdin>", line 1
print('İstanbul'un 5 günlük hava durumu tahmini')
^
SyntaxError: invalid syntax
Burada da ‘İstanbul’un’ kelimesi içinde geçen tırnak işareti nedeniyle karakter dizisini tek
tırnak kullanarak tanımlayamıyorduk. Bu karakter dizisini hatasız bir şekilde tanımlayabilmek
için ya çift tırnak ya da üç tırnak kullanmamız gerekiyordu:
>>> print("İstanbul'un 5 günlük hava durumu tahmini")
İstanbul'un 5 günlük hava durumu tahmini
76
Bölüm 7. Kaçış Dizileri
Python 3 için Türkçe Kılavuz, Sürüm 3
... veya:
>>> print("""İstanbul'un 5 günlük hava durumu tahmini""")
İstanbul'un 5 günlük hava durumu tahmini
Tıpkı önceki örneklerde olduğu gibi, yukarıdaki karakter dizisini de aslında tek tırnakla
tanımlayıp hata oluşmasını önleyebiliriz. Hemen görelim:
>>> print('İstanbul\'un 5 günlük hava durumu tahmini')
İstanbul'un 5 günlük hava durumu tahmini
Bütün örneklerde \ işaretini kullandığımızı görüyorsunuz. İşte bu tür işaretlere Python’da
kaçış dizisi (escape sequence) adı verilir. Bu işaretler karakter dizilerini tanımlarken
oluşabilecek hatalardan kaçmamızı sağlar. Peki bu \ işareti nasıl oluyor da karakter dizisini
tanımlarken hata almamızı önlüyor? Gelin bu süreci adım adım tarif edelim:
Python bir karakter dizisi tanımladığımızda, karakter dizisini soldan sağa doğru okumaya
başlar. Mesela yukarıdaki örnekte ilk olarak karakter dizisini tanımlamaya tek tırnakla
başladığımızı görür.
Python karakter dizisini başlatan bu tek tırnak işaretini gördüğü zaman, soldan sağa doğru
ilerleyerek karakter dizisini bitirecek olan tek tırnak işaretini aramaya başlar.
Soldan sağa doğru ilerlerken ‘İstanbul’un’ kelimesi içinde geçen kesme işaretini görür ve
karakter dizisinin burada sona erdiğini düşünür. Ancak karakter dizisini sona erdiren işaret
bu olmadığı için Python’ın hata vermekten başka çaresi kalmaz.
İşte biz ‘İstanbul’un’ kelimesi içinde geçen bu kesme işaretinin sol tarafına bir adet \ işareti
yerleştirerek Python’a, ‘Aradığın işaret bu değil. Sen karakter dizisini okumaya devam et. Biraz
sonra aradığın tırnağı bulacaksın!’ mesajı vermiş, yani orada tırnak işaretini farklı bir amaçla
kullandığımız konusunda Python’ı bilgilendirmiş oluruz.
Şurada da aynı durum sözkonusu:
>>> print("Python programlama dilinin adı \"piton\" yılanından gelmez")
Tıpkı bir önceki örnekte olduğu gibi, burada da Python karakter dizisini soldan sağa doğru
okumaya başlıyor, karakter dizisini başlatan çift tırnak işaretini görüyor ve bunun üzerine
Python karakter dizisini bitirecek olan çift tırnak işaretini aramaya koyuluyor.
Karakter dizisini soldan sağa doğru okuduğu sırada, karakter dizisi içinde geçen ‘piton’
kelimesini görüyor. Eğer burada bir önlem almazsak Python bu kelimenin başındaki çift tırnak
işaretini, karakter dizisini sona erdiren tırnak olarak algılar ve durum aslında böyle olmadığı
için de hata verir.
Bu hatayı önlemek için ‘piton’ kelimesinin başındaki çift tırnağın soluna bir adet \ işareti
yerleştirerek Python’a, ‘Aradığın tırnak bu değil!’ mesajı veriyoruz. Yani bir bakıma, \ adlı
kaçış dizisi kendisini tırnak işaretine siper edip Python’ın bu tırnağı görmesine mani oluyor...
Bunun üzerine Python bu çift tırnak işaretini görmezden gelerek, soldan sağa doğru okumaya
devam eder ve yol üzerinde ‘piton’ kelimesinin sonundaki çift tırnak işaretini görür. Eğer
burada da bir önlem almazsak Python yine bir hata verecektir.
Tıpkı biraz önce yaptığımız gibi, bu tırnak işaretinin de soluna bir adet \ işareti yerleştirerek
Python’a, ‘Aradığın tırnak bu da değil. Sen yine okumaya devam et!’ mesajı veriyoruz.
7.1. Ters Taksim (\)
77
Python 3 için Türkçe Kılavuz, Sürüm 3
Bu mesajı alan Python karakter dizisini soldan sağa doğru okumaya devam ediyor ve sonunda
karakter dizisini bitiren çift tırnak işaretini bularak bize hatasız bir çıktı veriyor.
Böylece \ işareti üzerinden hem kaçış dizilerinin ne olduğunu öğrenmiş, hem de bu kaçış
dizisinin nasıl kullanılacağına dair örnekler vermiş olduk. Ancak \ kaçış dizisinin yetenekleri
yukarıdakilerle sınırlı değildir. Bu kaçış dizisini, uzun karakter dizilerini bölmek için de
kullanabiliriz. Şimdi şu örneği dikkatlice inceleyin:
>>> print("Python 1990 yılında Guido Van Rossum \
... tarafından geliştirilmeye başlanmış, oldukça \
... güçlü ve yetenekli bir programlama dilidir.")
Python 1990 yılında Guido Van Rossum tarafından geliştirilmeye
başlanmış, oldukça güçlü ve yetenekli bir programlama dilidir.
Normal şartlar altında, bir karakter dizisini tanımlamaya tek veya çift tırnakla başlamışsak,
karakter dizisinin kapanış tırnağını koymadan Enter tuşuna bastığımızda Python bize bir hata
mesajı gösterir:
>>> print("Python 1990 yılında Guido Van Rossum
File "<stdin>", line 1
print("Python 1990 yılında Guido Van Rossum
^
SyntaxError: EOL while scanning string literal
İşte \ kaçış dizisi bizim burada olası bir hatadan kaçmamızı sağlar. Eğer Enter tuşuna
basmadan önce bu işareti kullanırsak Python tıpkı üç tırnak işaretlerinde şahit olduğumuz
gibi, hata vermeden bir alt satıra geçecektir. Bu sırada, yani \ kaçış dizisini koyup Enter tuşuna
bastığımızda >>> işaretinin ... işaretine dönüştüğünü görüyorsunuz. Bu işaretin, Python’ın
bize verdiği bir ‘Yazmaya devam et!’ mesajı olduğunu biliyorsunuz.
Satır Başı (\n)
Python’daki en temel kaçış dizisi biraz önce örneklerini verdiğimiz \ işaretidir. Bu kaçış dizisi
başka karakterlerle birleşerek, farklı işlevlere sahip yeni kaçış dizileri de oluşturabilir. Aslında
bu olguya yabancı değiliz. Önceki sayfalarda bu duruma bir örnek vermiştik. Hatırlarsanız
print() fonksiyonunu anlatırken end parametresinin ön tanımlı değerinin \n, yani satır başı
karakteri olduğunu söylemiştik.
Not: Satır başı karakterine ‘yeni satır karakteri’ dendiği de olur.
Satır başı karakterini ilk öğrendiğimizde bu karakteri anlatırken bazı örnekler de vermiştik:
>>> print("birinci satır\nikinci satır\nüçüncü satır")
birinci satır
ikinci satır
üçüncü satır
Gördüğünüz gibi, \n adlı kaçış dizisi, bir alt satıra geçilmesini sağlıyor. İşte aslında \n kaçış
dizisi de, \ ile ‘n’ har1nin birleşmesinden oluşmuş bir kaçış dizisidir. Burada \ işaretinin
78
Bölüm 7. Kaçış Dizileri
Python 3 için Türkçe Kılavuz, Sürüm 3
görevi, ‘n’ har1nin özel bir anlam kazanmasını sağlamaktır. \ işareti ile ‘n’ har1 birleştiğinde
‘satır başı karakteri’ denen özel bir karakter dizisi ortaya çıkarıyor.
Gelin bu kaçış dizisi ile ilgili bir örnek verelim. Şimdi şu kodları dikkatlice inceleyin:
>>> başlık = "Türkiye'de Özgür Yazılımın Geçmişi"
>>> print(başlık, "\n", "-"*len(başlık), sep="")
Türkiye'de Özgür Yazılımın Geçmişi
----------------------------------
Burada, başlık adlı değişkenin tuttuğu “Türkiye’de Özgür Yazılımın Geçmişi” adlı karakter
dizisinin altını çizdik.
Dikkat ederseniz, başlığın altına koyduğumuz çizgiler başlığın
uzunluğunu aşmıyor. Yazdığımız program, başlığın uzunluğu kadar çizgiyi başlığın altına
ekliyor. Bu programda başlık ne olursa olsun, programımız çizgi uzunluğunu kendisi
ayarlayacaktır. Örneğin:
>>> başlık = "Python Programlama Dili"
>>> print(başlık, "\n", "-"*len(başlık), sep="")
Python Programlama Dili
-----------------------
>>> başlık = "Alışveriş Listesi"
>>> print(başlık, "\n", "-"*len(başlık), sep="")
Alışveriş Listesi
-----------------
Gelin isterseniz bu kodlardaki print() satırını şöyle bir inceleyelim. Kodumuz şu:
>>> print(başlık, "\n", "-"*len(başlık), sep="")
Burada öncelikle başlık adlı değişkeni print() fonksiyonunun parantezleri içine yazdık.
Böylece başlık değişkeninin değeri ekrana yazdırılacak.
print() fonksiyonunun ikinci parametresinin \n adlı kaçış dizisi olduğunu görüyoruz. Bu
kaçış dizisini eklememiz sayesinde Python ilk parametreyi çıktı olarak verdikten sonra bir alt
satıra geçiyor. Bu parametrenin tam olarak ne işe yaradığını anlamak için, yukarıdaki satırı
bir de o parametre olmadan çalıştırmayı deneyebilirsiniz:
>>> print(başlık, "-"*len(başlık), sep="")
Alışveriş Listesi-----------------
print()
fonksiyonunun üçüncü parametresinin ise şu olduğunu görüyoruz:
"-"*len(başlık).
İşte başlık değişkeninin altına gerekli sayıda çizgiyi çizen kodlar bunlardır. Burada len()
fonksiyonunu nasıl kullandığımıza çok dikkat edin. Bu kod sayesinde başlık değişkeninin
uzunluğu (len(başlık)) sayısınca - işaretini ekrana çıktı olarak verebiliyoruz.
Yukarıdaki kodlarda print() fonksiyonunun son parametresi ise sep=’‘. Peki bu ne işe
yarıyor? Her zaman olduğu gibi, bu kod parçasının ne işe yaradığını anlamak için programı
bir de o kodlar olmadan çalıştırmayı deneyebilirsiniz:
>>> print(başlık, "\n", "-"*len(başlık))
7.2. Satır Başı (\n)
79
Python 3 için Türkçe Kılavuz, Sürüm 3
Alışveriş Listesi
-----------------
Gördüğünüz gibi, başlık değişkeninin tam altına gelmesi gereken çizgi işaretleri sağa kaymış.
Bunun nedeni sep parametresinin öntanımlı değerinin bir adet boşluk karakteri olmasıdır.
sep parametresinin öntanımlı değeri nedeniyle çizgilerin baş tarafına bir adet boşluk
karakteri ekleniyor çıktıda. O yüzden bu çizgiler sağa kaymış görünüyor. İşte biz yukarıdaki
kodlarda sep parametresinin öntanımlı değerini değiştirip, boşluk karakteri yerine boş bir
karakter dizisi yerleştiriyoruz. Böylece çizgiler çıktıda sağa kaymıyor.
Satır başı karakteri, programlama maceramız sırasında en çok kullanacağımız kaçış
dizilerinden biri ve hatta belki de birincisidir. O yüzden bu kaçış dizisini çok iyi öğrenmenizi
tavsiye ederim.
Ayrıca bu kaçış dizisini (ve tabii öteki kaçış dizilerini) tanıyıp öğrenmeniz, yazacağınız
programların selameti açısından da büyük önem taşır. Eğer bir karakter dizisi içinde
geçen kaçış dizilerini ayırt edemezseniz Python size hiç beklemediğiniz çıktılar verebilir.
Hatta yazdığınız programlar kaçış dizilerini tanımıyor olmanızdan ötürü bir anda hata verip
çökebilir. Peki ama nasıl?
Şimdi şu örneğe dikkatlice bakın:
Diyelim ki bilgisayarınızın ‘C:\’ dizinindeki ‘nisan’ adlı bir klasörün içinde yer alan masra2ar.txt
adlı bir dosyayı yazdığınız bir program içinde kullanmanız gerekiyor. Mesela bu dosyayı, tam
adresiyle birlikte kullanıcılarınıza göstermek istiyorsunuz.
İlk denememizi yapalım:
>>> print("C:\nisan\masraflar.txt")
Buradan şöyle bir çıktı aldık:
C:
isan\masraflar.txt
Gördüğünüz gibi, bu çıktıyı normal yollardan vermeye çalıştığımızda Python bize hiç de
beklemediğimiz bir çıktı veriyor. Peki ama neden?
Python’da karakter dizileri ile çalışırken asla aklımızdan çıkarmamamız gereken bir şey var:
Eğer yazdığımız herhangi bir karakter dizisinin herhangi bir yerinde \ işaretini kullanmışsak,
bu işaretten hemen sonra gelen karakterin ne olduğuna çok dikkat etmemiz gerekir. Çünkü
eğer dikkat etmezsek, farkında olmadan Python için özel anlam taşıyan bir karakter dizisi
oluşturmuş olabiliriz. Bu da kodlarımızın beklediğimiz gibi çalışmasını engeller.
Yukarıdaki sorunun kaynağını anlamak için "C:\nisan\masraflar.txt" adlı karakter dizisine
çok dikkatlice bakın. Python bu karakter dizisinde bizim ‘\nisan’ olarak belirttiğimiz kısmın
başındaki \n karakterlerini bir kaçış dizisi olarak algıladı. Çünkü \n adlı karakter dizisi, ‘satır
başı kaçış dizisi’ adını verdiğimiz, Python açısından özel anlam taşıyan bir karakter dizisine
işaret ediyor. Zaten yukarıdaki tuhaf görünen çıktıya baktığınızda da, bu kaçış dizisinin olduğu
noktadan itibaren karakter dizisinin bölünüp yeni bir satıra geçildiğini göreceksiniz. İşte
biz yukarıdaki örnekte alelade bir dizin adı belirttiğimizi zannederken aslında hiç farkında
olmadan bir kaçış dizisi üretmiş oluyoruz. Bu nedenle, daha önce de söylediğimiz gibi,
karakter dizileri içinde farkında olarak veya olmayarak kullandığımız kaçış dizilerine karşı
her zaman uyanık olmalıyız. Aksi takdirde, yukarıda olduğu gibi hiç beklemediğimiz çıktılarla
karşılaşabiliriz.
80
Bölüm 7. Kaçış Dizileri
Python 3 için Türkçe Kılavuz, Sürüm 3
Esasen yukarıdaki problem bir dereceye kadar (ve yerine göre) ‘masum bir kusur’ olarak
görülebilir. Çünkü bu hata programımızın çökmesine yol açmıyor. Ama bir karakter dizisi
içindeki gizli kaçış dizilerini gözden kaçırmak, bazı durumlarda çok daha yıkıcı sonuçlara
yol açabilir.
Mesela yukarıdaki sorunlu dizin adını ekrana yazdırmak yerine open()
fonksiyonunu kullanarak, bu karakter dizisi içinde belirttiğimiz masra2ar.txt adlı dosyayı
açmaya çalıştığımızı düşünün:
>>> open("C:\nisan\masraflar.txt")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 22] Invalid argument: 'C:\nisan\\masraflar.txt'
Eğer sorunun gözden kaçan bir kaçış dizisinden kaynaklandığını farkedemezseniz, bu sorunu
çözebilmek için saatlerinizi ve hatta günlerinizi harcamak zorunda kalabilirsiniz. Çünkü
yukarıdaki hata mesajı sorunun nedenine dair hiçbir şey söylemiyor. Ancak ve ancak
yukarıdaki karakter dizisi içinde sinsice gizlenen bir \n kaçış dizisi olduğu gözünüze çarparsa
bu sorunu çözme yolunda bir adım atabilirsiniz.
Diyelim ki sorunun ‘\nisan’ ifadesinin başındaki \n karakterlerinin Python tarafından bir kaçış
dizisi olarak algılanmasından kaynaklandığını farkettiniz. Peki bu sorunu nasıl çözeceksiniz?
Bu sorunun birkaç farklı çözüm yolu var. Biz şimdilik sadece ikisini göreceğiz. Bu bölümün
sonuna vardığınızda öteki çözüm yolunu da öğrenmiş olacaksınız.
Yukarıdaki problemi, ilgili kaçış dizisi içindeki ters taksim işaretini çiftleyerek çözebilirsiniz:
>>> open("C:\\nisan\masraflar")
Tabii tutarlılık açısından karakter dizisi içindeki bütün ters taksim işaretlerini çiftlemek
mantıklı olacaktır:
>>> open("C:\\nisan\\masraflar")
Bunun dışında, bu örnek için, dizin adlarını ters taksim yerine düz taksim işaretiyle ayırmayı
tercih edebilirsiniz:
>>> open("C:/nisan/masraflar")
Dediğimiz gibi, üçüncü (ve aslında daha kullanışlı olan) yöntemi biraz sonra inceleyeceğiz. Biz
şimdilik kaçış dizilerini anlatmaya devam edelim.
Sekme (\t)
Python’da \ işareti sadece ‘n’ har1yle değil, başka har2erle de birleşebilir. Örneğin \ işaretini
‘t’ har1yle birleştirerek yine özel bir anlam ifade eden bir kaçış dizisi elde edebiliriz:
>>> print("abc\tdef")
abc def
Burada \t adlı kaçış dizisi, “abc” ifadesinden sonra sanki Tab (sekme) tuşuna basılmış gibi bir
etki oluşturarak “def” ifadesini sağa doğru itiyor. Bir de şu örneğe bakalım:
7.3. Sekme (\t)
81
Python 3 için Türkçe Kılavuz, Sürüm 3
>>> print("bir", "iki", "üç", sep="\t")
bir
iki
üç
Bir örnek daha:
>>> print(*"123456789", sep="\t")
1
2
3
4
5
6
7
8
9
Gördüğünüz gibi, parametreler arasında belli aralıkta bir boşluk bırakmak istediğimizde \t
adlı kaçış dizisinden yararlanabiliyoruz.
Tıpkı \n kaçış dizisinde olduğu gibi, karakter dizilerinde \t kaçış dizisinin varlığına karşı da
uyanık olmalıyız:
>>> open("C:\nisan\masraflar\toplam_masraf.txt")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 22] Invalid argument: 'C:\nisan\\masraflar\toplam_masraf.txt'
Burada da \n ile yaşadığımız soruna benzer bir durum var. Biz toplam_masraf.txt adlı
bir dosyaya atıfta bulunmaya çalışıyoruz, ama Python bu ifadenin başındaki ‘t’ har1nin,
kendisinden önce gelen \ işareti ile birleşmesinden ötürü, bunu \t kaçış dizisi olarak algılıyor
ve ona göre davranıyor.
Belki yukarıdaki kodları şöyle yazarsak durumu anlamak daha kolay olabilir:
>>> print("C:\nisan\masraflar\toplam_masraf.txt")
C:
isan\masraflar
oplam_masraf.txt
Gördüğünüz gibi, Python \n kaçış dizisini gördüğü noktada alt satırın başına geçiyor ve \t kaçış
dizisini gördüğü noktada da önceki ve sonraki öğeler arasında bir sekme boşluğu bırakıyor.
Bu durumu engellemek için ne yapmanız gerektiğini biliyorsunuz: Ya ters taksim işaretlerini
çiftleyeceksiniz:
>>> print("C:\\nisan\\masraflar\\toplam_masraf.txt")
Ya da dizin adı ayracı olarak düz taksim işaretini kullanacaksınız:
>>> print("C:/nisan/masraflar/toplam_masraf.txt")
Daha önce de söylediğimiz gibi, üçüncü ve daha pratik olan yolu biraz sonra göreceğiz.
Şimdilik sadece biraz sabır...
Zil Sesi (\a)
\ işaretinin birleştiğinde farklı bir anlam türettiği bir başka harf de ‘a’ har1dir.
\ işareti ‘a’
har1yle birleşerek !bip! benzeri bir zil sesi üretilmesini sağlayabilir:
>>> print("\a")
!bip!
82
Bölüm 7. Kaçış Dizileri
Python 3 için Türkçe Kılavuz, Sürüm 3
İsterseniz yukarıdaki komutu şu şekilde yazarak, kafa şişirme katsayısını artırabilirsiniz:
>>> print("\a" * 10)
Bu şekilde !bip! sesi 10
kez tekrar edilecektir. Ancak bu kaçış dizisi çoğunlukla sadece
Windows üzerinde çalışacaktır. Bu kaçış dizisinin GNU/Linux üzerinde çalışma garantisi
yoktur. Hatta bu kaçış dizisi bütün Windows sistemlerinde dahi çalışmayabilir. Dolayısıyla
bu kaçış dizisinin işlevine bel bağlamak pek mantıklı bir iş değildir.
Tıpkı \n ve \t kaçış dizilerinde olduğu gibi bu kaçış dizisinin varlığına karşı da uyanık olmalıyız.
Burada da mesela ‘C:\aylar’ gibi bir dizin adı tanımlamaya çalışırken aslında \a kaçış dizisini
oluşturuyor olabilirsiniz farkında olmadan.
Aynı Satır Başı (\r)
Bu kaçış dizisi, bir karakter dizisinde aynı satırın en başına dönülmesini sağlar. Bu kaçış
dizisinin işlevini tanımına bakarak anlamak biraz zor olabilir. O yüzden dilerseniz bu kaçış
dizisinin ne işe yaradığını bir örnek üzerinde göstermeye çalışalım:
>>> print("Merhaba\rZalim Dünya!")
Zalim Dünya!
Burada olan şey şu: Normal şartlar altında, print() fonksiyonu içine yazdığımız bir karakter
dizisindeki bütün karakterler soldan sağa doğru tek tek ekrana yazdırılır:
>>> print("Merhaba Zalim Dünya!")
Merhaba Zalim Dünya!
Ancak eğer karakter dizisinin herhangi bir yerine \r adlı kaçış dizisini yerleştirirsek, bu kaçış
dizisinin bulunduğu konumdan itibaren aynı satırın başına dönülecek ve \r kaçış dizisinden
sonra gelen bütün karakterler satır başındaki karakterlerin üzerine yazacaktır. Şu örnek daha
açıklayıcı olabilir:
>>> print("Merhaba\rDünya")
Dünyaba
Burada, “Merhaba” karakter dizisi ekrana yazdırıldıktan sonra \r kaçış dizisinin etkisiyle satır
başına dönülüyor ve bu kaçış dizisinden sonra gelen “Dünya” karakter dizisi “Merhaba”
karakter dizisinin üzerine yazıyor. Tabii “Dünya” karakter dizisi içinde 5 karakter, “Merhaba”
karakter dizisi içinde ise 7 karakter olduğu için, “Merhaba” karakter dizisinin son iki karakteri
(“ba” ) dışarda kalıyor. Böylece ortaya “Dünyaba” gibi bir şey çıkıyor.
Önceki kaçış dizilerinde olduğu gibi, bu kaçış dizisini de farkında olmadan karakter dizisi
içinde kullanırsanız beklemediğiniz çıktılar alırsınız:
>>> print("C:\ülke\türkiye\iller\rize\nüfus.txt")
izeülke
ürkiye\iller
üfus.txt
7.5. Aynı Satır Başı (\r)
83
Python 3 için Türkçe Kılavuz, Sürüm 3
Burada farkında olmadan sadece bir değil, üç kaçış dizisi birden oluşturduk!
Düşey Sekme (\v)
Eğer \ işaretini ‘v’ har1yle birlikte kullanırsak düşey sekme denen şeyi elde ederiz. Hemen bir
örnek verelim:
>>> print("düşey\vsekme")
düşey
sekme
Yalnız bu \v adlı kaçış dizisi her işletim sisteminde çalışmayabilir. Dolayısıyla, birden
fazla platform üzerinde çalışmak üzere tasarladığınız programlarınızda bu kaçış dizisini
kullanmanızı önermem.
İmleç Kaydırma (\b)
\ kaçış dizisinin, biraraya geldiğinde özel bir anlam kazandığı bir başka harf de b’dir. \b kaçış
dizisinin görevi, imleci o anki konumundan sola kaydırmaktır. Bu tanım pek anlaşılır değil. O
yüzden bir örnek verelim:
>>> print("yahoo.com\b")
Bu kodu çalıştırdığınızda herhangi bir değişiklik görmeyeceksiniz. Ama aslında en sonda
gördüğümüz \b kaçış dizisi, imleci bir karakter sola kaydırdı. Dikkatlice bakın:
>>> print("yahoo.com\b.uk")
Gördüğünüz gibi,
\b kaçış dizisinin etkisiyle imleç bir karakter sola kaydığı için,
‘com’
kelimesinin son har1 silindi ve bunun yerine \b kaçış dizisinden sonra gelen .uk karakterleri
yerleştirildi. Dolayısıyla biz de şu çıktıyı aldık:
yahoo.co.uk
Bir örnek daha verelim...
Bildiğiniz gibi, print() fonksiyonu, kendisine verilen parametreler arasına birer boşluk
yerleştirir:
>>> print('istihza', '.', 'com')
istihza . com
Biz bu öğeleri birbirine bitiştirmek için şöyle bir yol izleyebileceğimizi biliyoruz:
>>> print('istihza', '.', 'com', sep='')
istihza.com
İşte aynı etkiyi \b kaçış dizisini kullanarak da elde edebiliriz:
84
Bölüm 7. Kaçış Dizileri
Python 3 için Türkçe Kılavuz, Sürüm 3
>>> print('istihza', '\b.', '\bcom')
istihza.com
Gördüğünüz gibi, \b kaçış dizisi, ‘.’ ve ‘com’ parametrelerinden önce imleci birer karakter sola
kaydırdığı için, parametreler arasındaki boşluk karakterleri ortadan kalktı.
Bu kaçış dizisini kullanarak şöyle gereksiz işler peşinde de koşabilirsiniz:
>>> print('istihza\b\b\bsn')
istisna
Burada \b kaçış dizisini üst üste birkaç kez kullanarak imleci birkaç karakter sola kaydırdık ve
‘sn’ har2erini ‘hz’ har2erinin üzerine bindirdik. Böylece ‘istihza’ kelimesi ‘istisna’ kelimesine
dönüşmüş oldu...
Daha fazla uzatmadan, bu kaçış dizisinin Python’da çok nadir kullanıldığı bilgisini vererek
yolumuza devam edelim...
Küçük Unicode (\u)
Tıpkı bundan önceki kaçış dizileri gibi, karakter dizileri içindeki varlığı konusunda dikkatli
olmamız gereken bir başka kaçış dizisi de \u adlı kaçış dizisidir. Eğer bu kaçış dizisini tanımaz
ve dikkatli kullanmazsak, yazdığımız programlar tespit etmesi çok güç hatalar üretebilir.
Örneğin şöyle bir çıktı vermek istediğinizi düşünün:
Dosya konumu: C:\users\zeynep\gizli\dosya.txt
Bu çıktıyı normal yollardan vermeye çalışırsak Python bize bir hata mesajı gösterecektir:
>>> print("Dosya konumu: C:\users\zeynep\gizli\dosya.txt")
File "<stdin>", line 1
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in
position 16-18: truncated \uXXXX escape
Belki sağda solda ‘UNICODE’ diye bir şey duymuşsunuzdur. Eğer şimdiye kadar böyle bir
şey duymadıysanız veya duyduysanız bile ne olduğunu bilmiyorsanız hiç ziyanı yok. Birkaç
bölüm sonra bunun ne anlama geldiğini bütün ayrıntılarıyla anlatacağız. Biz şimdilik sadece
şunu bilelim: UNICODE, karakterlerin, har2erin, sayıların ve bilgisayar ekranında gördüğümüz
öteki bütün işaretlerin her biri için tek ve benzersiz bir numaranın tanımlandığı bir sistemdir.
Bu sistemde, ‘kod konumu’ (code point ) adı verilen bu numaralar özel bir şekilde gösterilir.
Örneğin ‘ı’ har1 UNICODE sisteminde şu şekilde temsil edilir:
u+0131
Aynı şekilde ‘a’ har1 bu sistemde şu kod konumu ile gösterilir:
u+0061
Python programlama dilinde ise, yukarıdaki kod konumu düzeni şöyle gösterilir:
\\u0131
7.8. Küçük Unicode (\u)
85
Python 3 için Türkçe Kılavuz, Sürüm 3
Gördüğünüz gibi, Python UNICODE sistemindeki her bir kod konumunu gösterebilmek için,
önce \u şeklinde bir kaçış dizisi tanımlıyor, ardından UNICODE sisteminde + işaretinden sonra
gelen sayıyı bu kaçış dizisinin hemen sağına ekliyor. Gelin kendi kendimize birkaç deneme
çalışması yapalım:
>>> '\u0130'
'İ'
>>> '\u0070'
'p'
>>> "\ufdsf"
File "<stdin>", line 1
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in
position 0-4: truncated \uXXXX escape
Gördüğünüz gibi, eğer \u kaçış dizisinden sonra doğru bir kod konumu belirtmezsek Python
bize bir hata mesajı gösteriyor...
Bu hata mesajının, biraz önce print("Dosya konumu: C:\users\zeynep\gizli\dosya.txt")
kodunu yazdıktan sonra aldığımız hata ile aynı olduğuna dikkat edin. Tıpkı \ufdsf örneğinde
olduğu gibi, \users ifadesi de varolan bir UNICODE kod konumuna karşılık gelmediği için,
Python’ın hata vermekten başka çaresi kalmıyor.
Biz bu örnekte ‘users’ kelimesini kullanmaya çalışıyoruz, ama ‘u’ har1nden hemen önce gelen
\ kaçış dizisi nedeniyle, hiç farkında olmadan Python açısından önemli bir karakter dizisi (\u)
meydana getirmiş oluyoruz. O yüzden, böyle can sıkıcı hatalarla karşılaşmamak için olası
kaçış dizilerine karşı her zaman uyanık olmamız gerekiyor.
Pekı biz bu kaçış dizisi yüzünden, yazdığımız programlarda Dosya konumu:
C:\users\zeynep\gizli\dosya.txt”) gibi bir çıktı veremeyecek miyiz?
Verebileceğimizi, ama bunun bir yolu yordamı olduğunu biliyorsunuz. Biz yine de tekrar
edelim:
>>> print("Dosya konumu: C:\\users\\zeynep\\gizli\\dosya.txt")
Dosya konumu: C:\users\zeynep\gizli\dosya.txt
Gördüğünüz gibi, karakter dizisi içinde geçen bütün \ işaretlerini çiftleyerek sorunumuzu
çözdük. Buradaki gibi bir sorunla karşılaşmamak için, dizin adlarını ayırırken ters taksim
işareti yerine düz taksim işaretini kullanmayı da tercih edebilirsiniz:
>>> print("Dosya konumu: C:/users/zeynep/gizli/dosya.txt")
Biraz sonra bu sorunu halletmenin üçüncü ve daha kolay bir yönteminden daha söz edeceğiz.
Ama biz şimdilik bu kaçış dizisini bir kenara bırakıp başka bir kaçış dizisini incelemeye geçelim.
Büyük Unicode (\U)
Bu kaçış dizisi biraz önce gördüğümüz \u adlı kaçış dizisiyle hemen hemen aynı anlama
gelir. Bu kaçış dizisi de, tıpkı \u gibi, UNICODE kod konumlarını temsil etmek için kullanılır.
86
Bölüm 7. Kaçış Dizileri
Python 3 için Türkçe Kılavuz, Sürüm 3
Ancak U ile gösterilen kod konumları u ile gösterilenlere göre biraz daha uzundur. Örneğin,
hatırlarsanız u kaçış dizisini kullanarak ‘ı’ har1nin UNICODE kod konumunu şöyle temsil
ediyorduk:
>>> '\u0131'
'ı'
Eğer aynı kod konumunu U adlı kaçış dizisi ile göstermek istersek şöyle bir şey yazmamız
gerekir:
>>> '\U00000131'
Gördüğünüz gibi, burada \U kaçış dizisinden sonra gelen kısım toplam 8 haneli bir sayıdan
oluşuyor. u kaçış dizisinde ise bu kısmı toplam 4 haneli bir sayı olarak yazıyorduk. İşte \u
kaçış dizisi ile U kaçış dizisi arasındaki fark budur. u kaçış dizisi hakkında söylediğimiz öteki
her şey U kaçış dizisi için de geçerlidir.
Uzun Ad (\N)
UNICODE sistemi ile ilgili bir başka kaçış dizisi de \N adlı kaçış dizisidir.
Dediğimiz gibi, UNICODE sistemine ilişkin ayrıntılardan ilerleyen derslerde söz edeceğiz, ama
bu sistemle ilgili ufak bir bilgi daha verelim.
UNICODE sisteminde her karakterin tek ve benzersiz bir kod konumu olduğu gibi, tek ve
benzersiz bir de uzun adı vardır. Örneğin ‘a’ har1nin UNICODE sistemindeki uzun adı şudur:
LATIN SMALL LETTER A
Bir karakterin UNICODE sistemindeki uzun adını öğrenmek için unicodedata adlı bir
modülden yararlanabilirsiniz:
>>> import unicodedata
>>> unicodedata.name('a')
LATIN SMALL LETTER A
>>> unicodedata.name('Ş')
LATIN CAPITAL LETTER S WITH CEDILLA
Bu arada, daha önce de söylediğimiz gibi, bu ‘modül’ kavramına şimdilik takılmayın. İlerde
modülleri ayrıntılı olarak inceleyeceğiz. Şimdilik unicodedata denen şeyin, (tıpkı daha önce
örneklerini gördüğümüz os, sys ve keyword gibi) bir modül olduğunu ve bu modül içindeki
name adlı bir fonksiyonu kullanarak, parantez içinde belirttiğimiz herhangi bir karakterin
UNICODE sistemindeki uzun adını elde edebileceğimizi bilelim yeter.
İşte \N kaçış dizisi bu uzun isimleri, Python programlarımızda kullanma imkanı verir bize.
Bu kaçış dizisini, karakterlerin UNICODE sistemindeki uzun adları ile birlikte kullanarak asıl
karakterleri elde edebiliriz. Dikkatlice bakın:
>>> print("\N{LATIN SMALL LETTER A}")
a
7.10. Uzun Ad (\N)
87
Python 3 için Türkçe Kılavuz, Sürüm 3
>>> print("\N{LATIN CAPITAL LETTER S WITH CEDILLA}")
ş
>>> print("\Nisan")
File "<stdin>", line 1
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in
position 0-1: malformed \N character escape
Gördüğünüz gibi, herhangi bir karşılığı olmayan bir uzun ad belirttiğimizde Python bize
bir hata mesajı gösteriyor. Çünkü Python \N kaçış dizisinin hemen ardından { işaretinin
getirilmesini ve sonra da UNICODE sistemi dahilinde geçerli bir uzun ad belirtilmesini
bekliyor. Yukarıdaki örnekte \N kaçış dizisinden sonra { işareti yok. Zaten \N kaçış dizisinin
hemen ardından gelen ‘isan’ ifadesi de doğru bir uzun ada işaret etmiyor. Dolayısıyla da
Python’ın bize hata mesajı göstermekten başka çaresi kalmıyor...
\u, \U ve \N kaçış dizileri, UNICODE sistemi ile ilgili çalışmalar yapmak isteyen programcılar
için Python programlama dilinin sunduğu faydalı araçlardan yalnızca birkaçıdır. Ancak bu
araçların sizin işinize yaramayacağını asla düşünmeyin. Zira \u, \U ve \N kaçış dizileri ile ilgili
yukarıdaki durum hiç beklemediğiniz bir anda sizi de vurabilir. Çünkü bu kaçış dizilerinin
oluşturduğu risk hiç de öyle nadir karşılaşılacak bir sorun değildir.
Bildiğiniz gibi Windows 7’de kullanıcının dosyalarını içeren dizin adı C:\Users\kullanıcı_adı
şeklinde gösteriliyor.
Dolayısıyla Windows kullananlar UNICODE kaçış dizilerinden
kaynaklanan bu tuzağa her an düşebilir. Ya da eğer adınız ‘u’ veya ‘n’ har1 ile başlıyorsa yine
bu tuzağa düşme ihtimaliniz epey yüksek olacak, C:\Users\umut veya C:\Users\Nihat gibi bir
dizin adı belirtirken çok dikkatli olmanız gerekecektir. Zira özellikle dosyalar üzerinde işlem
yaparken, bu tür dizin adlarını sık sık kullanmak durumunda kalacaksınız. Bu yüzden, alelade
bir kelime yazdığınızı zannederken hiç farkında olmadan bir kaçış dizisi tanımlıyor olma
ihtimalini her zaman göz önünde bulundurmalı ve buna uygun önlemleri almış olmalısınız.
Onaltılı Karakter (\x)
‘x’ har1 de \ işareti ile birleştiğinde özel anlam kazanarak bir kaçış dizisi meydana getirir.
\x kaçış dizisini kullanarak, onaltılı (hexadecimal ) sayma sistemindeki bir sayının karakter
karşılığını gösterebilirsiniz. Dikkatlice bakın:
>>> "\x41"
'A'
Onaltılı sayma sistemindeki 41
sayısı
‘A’ har1ne karşılık gelir. Eğer hangi karakterlerin
hangi sayılara karşılık geldiğini merak ediyorsanız http://www.ascii.cl/ adresindeki tabloyu
inceleyebilirsiniz. Bu tabloda ‘hex’ sütunu altında gösterilen sayılar onaltılı sayılar olup,
‘symbol’ sütununda gösterilen karakterlere karşılık gelirler. Örneğin
‘hex’ sütunundaki
4E sayısı ‘symbol’ sütunundaki ‘N’ har1ne karşılık gelir. Bu durumu Python’la da teyit
edebilirsiniz:
>>>"\x4E"
N
88
Bölüm 7. Kaçış Dizileri
Python 3 için Türkçe Kılavuz, Sürüm 3
Eğer sayılarla karakterler arasındaki bağlantının tam olarak ne olduğunu bilmiyorsanız hiç
endişe etmeyin. Birkaç bölüm sonra sayılarla karakterler arasında nasıl bir bağ olduğunu
gayet ayrıntılı bir şekilde anlatacağız. Biz şimdilik yalnızca \x karakter dizisinin özel bir
kaçış dizisine karşılık geldiğini ve bu kaçış dizisini karakter dizileri içinde kullanırken dikkatli
olmamız gerektiğini bilelim yeter:
>>> print("C:\Users\Ayşe\xp_dosyaları")
File "<stdin>", line 1
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in
position 2-4: truncated \UXXXXXXXX escape
Gördüğünüz gibi, Python
\x ifadesinden sonra onaltılı bir sayı belirtmenizi bekliyor.
Halbuki biz burada \x ifadesini ‘xp_dosyaları’ adlı dizini gösterebilmek için kullanmıştık.
Ama görünüşe göre yanlışlıkla Python için özel bir anlam ifade eden bir karakter dizisi
oluşturmuşuz...
Etkisizleştirme (r)
Dediğimiz gibi, Python’daki en temel kaçış dizisi \ işaretidir. Bu işaret bazı başka har2erle
birleşerek yeni kaçış dizileri de oluşturabilir.
Python’da \ işaretinin dışında temel bir kaçış dizisi daha bulunur. Bu kaçış dizisi ‘r’ har1dir.
Şimdi bu kaçış dizisinin nasıl kullanılacağını ve ne işe yaradığını inceleyelim:
Şöyle bir çıktı vermek istediğimizi düşünün:
Kurulum dizini: C:\aylar\nisan\toplam masraf
Bildiğimiz yoldan bu çıktıyı vermeye çalışırsak neler olacağını adınız gibi biliyorsunuz:
>>> print("Kurulum dizini: C:\aylar\nisan\toplam masraf")
Kurulum dizini: C:ylar
isan
oplam masraf
Not: Eğer Windows üzerinde çalışıyorsanız bu komutu verdikten sonra bir !bip! sesi de
duymuş olabilirsiniz...
Python tabii ki, karakter dizisi içinde geçen ‘\aylar’, ‘\nisan’, ve ‘\toplam masraf’ ifadelerinin
ilk karakterlerini yanlış anladı! \a, \n ve \t gibi ifadeler Python’ın gözünde birer kaçış dizisi.
Dolayısıyla Python \a karakterlerini görünce bir !bip! sesi çıkarıyor, \n karakterlerini görünce
satır başına geçiyor ve \t karakterlerini görünce de Tab tuşuna basılmış gibi bir tepki veriyor.
Sonuç olarak da yukarıdaki gibi bir çıktı üretiyor.
Daha önce bu durumu şöyle bir kod yazarak engellemiştik:
>>> print("Kurulum dizini: C:\\aylar\\nisan\\toplam masraf")
Kurulum dizini: C:\aylar\nisan\toplam masraf
Burada, \ işaretlerinin her birini çiftleyerek sorunun üstesinden geldik. Yukarıdaki yöntem
doğru ve kabul görmüş bir çözümdür. Ama bu sorunun üstesinden gelmenin çok daha basit
7.12. Etkisizleştirme (r)
89
Python 3 için Türkçe Kılavuz, Sürüm 3
ve pratik bir yolu var. Bakalım:
>>> print(r"Kurulum dizini: C:\aylar\nisan\toplam masraf")
Kurulum dizini: C:\aylar\nisan\toplam masraf
Gördüğünüz gibi, karakter dizisinin baş kısmının dış tarafına bir adet r har1 yerleştirerek
sorunun üstesinden geliyoruz. Bu kaçış dizisinin, kullanım açısından öteki kaçış dizilerinden
farklı olduğuna dikkat edin. Öteki kaçış dizileri karakter dizisinin içinde yer alırken, bu kaçış
dizisi karakter dizisinin dışına yerleştiriliyor.
Bu kaçış dizisinin tam olarak nasıl işlediğini görmek için dilerseniz bir örnek daha verelim:
>>> print("Kaçış dizileri: \, \n, \t, \a, \\, r")
Kaçış dizileri: \,
,
, , \, r
Burada da Python bizim yapmak istediğimiz şeyi anlayamadı ve karakter dizisi içinde geçen
kaçış dizilerini doğrudan ekrana yazdırmak yerine bu kaçış dizilerinin işlevlerini yerine
getirmesine izin verdi. Tıpkı biraz önceki örnekte olduğu gibi, istersek kaçış dizilerini
çiftleyerek bu sorunu aşabiliriz:
>>> print("Kaçış dizileri: \\, \\n, \\t, \\a, \\\, r")
Kaçış dizileri: \, \n, \t, \a, \\, r
Ama tabii ki bunun çok daha kolay bir yöntemi olduğunu biliyorsunuz:
>>> print(r"Kaçış dizileri: \, \n, \t, \a, \\, r")
Kaçış dizileri: \, \n, \t, \a, \\, r
Gördüğünüz gibi, karakter dizisinin başına getirdiğimiz r kaçış dizisi, karakter dizisi içinde
geçen kaçış dizilerinin işlevlerini yerine getirmesine engel olarak, istediğimiz çıktıyı elde
etmemizi sağlıyor.
Bu arada bu kaçış dizisini, daha önce öğrendiğimiz \r adlı kaçış dizisi ile karıştırmamaya dikkat
ediyoruz.
Python’daki bütün kaçış dizilerinden söz ettiğimize göre, konuyu kapatmadan önce önemli bir
ayrıntıdan söz edelim.
Python’da karakter dizilerinin sonunda sadece çift sayıda \ işareti bulunabilir. Tek sayıda
\ işareti kullanıldığında karakter dizisini bitiren tırnak işareti etkisizleşeceği için çakışma
sorunu ortaya çıkar. Bu etkisizleşmeyi, karakter dizisinin başına koyduğunuz ‘r’ kaçış dizisi
de engelleyemez. Yani:
>>> print("Kaçış dizisi: \")
Bu şekilde bir tanımlama yaptığımızda Python bize bir hata mesajı gösterir. Çünkü kapanış
tırnağının hemen öncesine yerleştirdiğimiz \ kaçış dizisi, Python’ın karakter dizisini kapatan
tırnak işaretini görmezden gelmesine yol açarak bu tırnağı etkisizleştiriyor. Böylece sanki
karakter dizisini tanımlarken kapanış tırnağını hiç yazmamışız gibi bir sonuç ortaya çıkıyor:
>>> print("Kaçış dizisi: \")
File "<stdin>", line 1
print("Kaçış dizisi: \")
90
Bölüm 7. Kaçış Dizileri
Python 3 için Türkçe Kılavuz, Sürüm 3
^
SyntaxError: EOL while scanning string literal
Üstelik bu durumu, r adlı kaçış dizisi de engelleyemiyor:
>>> print(r"Kaçış dizisi: \")
File "<stdin>", line 1
print(r"Kaçış dizisi: \")
^
SyntaxError: EOL while scanning string literal
Çözüm olarak birkaç farklı yöntemden yararlanabilirsiniz.
Mesela karakter dizisini
kapatmadan önce karakter dizisinin sonundaki \ işaretinin sağına bir adet boşluk karakteri
yerleştirmeyi deneyebilirsiniz:
>>> print("Kaçış dizisi: \ ")
Veya kaçış dizisini çiftleyebilirsiniz:
>>> print("Kaçış dizisi: \\")
Ya da karakter dizisi birleştirme yöntemlerinden herhangi birini kullanabilirsiniz:
>>> print("Kaçış dizisi: " + "\\")
>>> print("Kaçış dizisi:", "\\")
>>> print("Kaçış dizisi: " "\\")
Böyle bir durumla ilk kez karşılaştığınızda bunun Python programlama dilinden kaynaklanan
bir hata olduğunu düşünebilirsiniz, ancak bu durum Python’ın resmi internet sitesinde ‘Sıkça
Sorulan Sorular’ bölümüne alınacak kadar önemli bir tasarım tercihidir: http://goo.gl/i3tkk
Sayfa Başı (\f)
\f artık günümüzde pek kullanılmayan bir kaçış dizisidir. Bu kaçış dizisinin görevi, özellikle
eski yazıcılarda, bir sayfanın sona erip yeni bir sayfanın başladığını göstermektir. Dolayısıyla
eski model yazıcılar, bu karakteri gördükleri noktada mevcut sayfayı sona erdirip yeni bir
sayfaya geçer.
Bu kaçış dizisinin tam olarak ne işe yaradığını test etmek için şu kodları çalıştırın:
>>> f = open("deneme.txt", "w")
>>> print("deneme\fdeneme", file=f)
>>> f.close()
Şimdi bu kodlarla oluşturduğunuz deneme.txt adlı dosyayı LibreOWce veya Microsoft Word
gibi bir programla açın. ‘deneme’ satırlarının iki farklı sayfaya yazdırıldığını göreceksiniz. Bu
arada, eğer Microsoft Word dosyayı açarken bir hata mesajı gösterirse, o hata mesajına birkaç
kez ‘tamam’ diyerek hata penceresini kapatın. Dosya normal bir şekilde açılacaktır.
Dediğimiz gibi, bu kaçış dizisi artık pek kullanılmıyor. Ama yine de bu kaçış dizisine karşı
da uyanık olmalısınız. Çünkü bu kaçış dizisi de beklemediğiniz çıktılar almanıza yol açabilir.
Mesela şu örneğe bir bakalım:
7.13. Sayfa Başı (\f)
91
Python 3 için Türkçe Kılavuz, Sürüm 3
>>> "\fırat"
'\x0cırat'
Gördüğünüz gibi, siz aslında ‘\fırat’ yazmak isterken, Python bu kelimenin baş tarafındaki \f
karakter dizisini bir kaçış dizisi olarak değerlendirip ona göre bir çıktı verdi.
Bütün bu anlattıklarımızın ardından, kaçış dizilerinin, birleştirildikleri karakterlerin farklı bir
anlam yüklenmesini sağlayan birtakım işaretler olduğunu anlıyoruz. Örneğin \ işareti ‘ (tek
tırnak) işareti ile bir araya gelerek, tek tırnak işaretinin karakter dizisi tanımlama dışında başka
bir anlam yüklenmesini sağlıyor. Aynı şekilde yine \ işareti “ (çift tırnak) işareti ile birleşerek
çift tırnak işaretinin de karakter dizisi tanımlama dışında bir anlama kavuşmasını sağlıyor.
Böylece tırnak işaretlerini karakter dizileri içinde rahatlıkla kullanabiliyoruz.
Ya da yine \ işareti ‘n’ har1 ile bir araya gelip, bu har1n satır başına geçilmesini sağlayan bir
kaçış dizisi oluşturmasını mümkün kılıyor. Veya aynı işaret ‘t’ har1yle birleşip, öğeler arasında
sekme oluşturulmasını sağlayabiliyor. Bu araçlar sayesinde ekrana yazdırdığımız bir metnin
akışını kontrol etme imkanına kavuşuyoruz.
Kaçış Dizilerine Toplu Bakış
Biraz sonra bu önemli konuyu kapatacağız. Ama dilerseniz kapatmadan önce, bu bölümde
öğrendiğimiz kaçış dizilerini şöyle bir topluca görelim:
Kaçış Dizisi
Anlamı
\’
Karakter dizisi içinde tek tırnak işaretini kullanabilmemizi sağlar.
\”
Karakter dizisi içinde çift tırnak işaretini kullanabilmemizi sağlar.
\\
Karakter dizisi içinde \ işaretini kullanabilmemizi sağlar.
\n
Yeni bir satıra geçmemizi sağlar.
\t
Karakterler arasında sekme boşluğu bırakmamızı sağlar.
\u
UNICODE kod konumlarını gösterebilmemizi sağlar.
\U
UNICODE kod konumlarını gösterebilmemizi sağlar.
\N
Karakterleri UNICODE adlarına göre kullanabilmemizi sağlar.
\x
Onaltılı sistemdeki bir sayının karakter karşılığını gösterebilmemizi sağlar.
\a
Destekleyen sistemlerde, kasa hoparlöründen bir ‘bip’ sesi verilmesini
sağlar.
\r
Aynı satırın başına dönülmesini sağlar.
\v
Destekleyen sistemlerde düşey sekme oluşturulmasını sağlar.
\b
İmlecin sola doğru kaydırılmasını sağlar
\f
Yeni bir sayfaya geçilmesini sağlar.
r
Karakter dizisi içinde kaçış dizilerini kullanabilmemizi sağlar.
Kaçış dizileriyle ilgili son olarak şunu söyleyebiliriz: Kaçış dizileri, görmezden gelebileceğiniz,
‘öğrenmesem de olur,’ diyebileceğiniz önemsiz birtakım işaretler değildir. Bu konu
boyunca verdiğimiz örneklerden de gördüğünüz gibi, kaçış dizileri, kullanıcıya göstereceğiniz
metinlerin biçimini doğrudan etkiliyor. Bütün bu örnekler, bu kaçış dizilerinin yersiz
veya yanlış kullanılmasının ya da bunların bir metin içinde gözden kaçmasının, yazdığınız
programların hata verip çökmesine, yani programınızın durmasına sebep olabileceğini de
gösteriyor bize.
Böylece bir bölümü daha bitirmiş olduk. Artık Python’la ‘gerçek’ programlar yazmamızın
önünde hiçbir engel kalmadı.
92
Bölüm 7. Kaçış Dizileri
BÖLÜM 8
Programları Kaydetme ve Çalıştırma
Bu noktaya kadar bütün işlerimizi Python’ın etkileşimli kabuğu üzerinden hallettik. Her ne
kadar etkileşimli kabuk son derece kullanışlı bir ortam da olsa, bizim asıl çalışma alanımız
değildir. Daha önce de dediğimiz gibi, etkileşimli kabuğu genellikle ufak tefek Python kodlarını
test etmek için kullanacağız. Ama asıl programlarımızı tabii ki etkileşimli kabuğa değil,
program dosyasına yazacağız.
Ne dedik? Özellikle küçük kod parçaları yazıp bunları denemek için etkileşimli kabuk
mükemmel bir ortamdır. Ancak kodlar çoğalıp büyümeye başlayınca bu ortam yetersiz
gelmeye başlayacaktır. Üstelik tabii ki yazdığınız kodları bir yere kaydedip saklamak
isteyeceksiniz. İşte burada metin düzenleyiciler devreye girecek.
Python kodlarını yazmak için istediğiniz herhangi bir metin düzenleyiciyi kullanabilirsiniz.
Hatta Notepad bile olur. Ancak Python kodlarını ayırt edip renklendirebilen bir metin
düzenleyici ile yola çıkmak her bakımdan hayatınızı kolaylaştıracaktır.
Not: Python kodlarınızı yazmak için Microsoft Word veya OpenOWce.Org OOWriter gibi,
belgeleri ikili (binary) düzende kaydeden programlar uygun değildir. Kullanacağınız metin
düzenleyici, belgelerinizi düz metin (plain text ) biçiminde kaydedebilmeli.
Biz bu bölümde farklı işletim sistemlerinde, metin düzenleyici kullanılarak Python
programlarının nasıl yazılacağını ve bunların nasıl çalıştırılacağını tek tek inceleyeceğiz.
Daha önce de söylediğimiz gibi, hangi işletim sistemini kullanıyor olursanız olun, hem
Windows hem de GNU/Linux başlığı altında yazılanları okumalısınız.
Dilerseniz önce GNU/Linux ile başlayalım:
GNU/Linux
Eğer kullandığınız sistem GNU/Linux’ta Unity veya GNOME masaüstü ortamı ise başlangıç
düzeyi için Gedit adlı metin düzenleyici yeterli olacaktır.
Eğer kullandığınız sistem GNU/Linux’ta KDE masaüstü ortamı ise Kwrite veya Kate adlı metin
düzenleyicilerden herhangi birini kullanabilirsiniz. Şu aşamada kullanım kolaylığı ve sadeliği
nedeniyle Kwrite önerilebilir.
İşe yeni bir Gedit belgesi açarak başlayalım. Yeni bir Gedit belgesi açmanın en kolay yolu
Alt+F2 tuşlarına bastıktan sonra çıkan ekranda:
93
Python 3 için Türkçe Kılavuz, Sürüm 3
gedit
yazıp Enter düğmesine basmaktır.
Eğer Gedit yerine mesela Kwrite kullanıyorsanız, yeni bir Kwrite belgesi oluşturmak için Alt+F2
tuşlarına bastıktan sonra:
kwrite
komutunu vermelisiniz. Elbette kullanacağınız metin düzenleyiciye, komut vermek yerine,
dağıtımınızın menüleri aracılığıyla da ulaşabilirsiniz.
Python kodlarımızı, karşımıza çıkan bu boş metin dosyasına yazıp kaydedeceğiz.
Aslında kodları metin dosyasına yazmakla etkileşimli kabuğa yazmak arasında çok fazla fark
yoktur. Dilerseniz hemen bir örnek vererek ne demek istediğimizi anlatmaya çalışalım:
1. Boş bir Gedit ya da Kwrite belgesi açıyoruz ve bu belgeye şu kodları eksiksiz bir şekilde
yazıyoruz:
tarih = "02.01.2012"
gün = "Pazartesi"
vakit = "öğleden sonra"
print(tarih, gün, vakit, "buluşalım", end=".\n")
2. Bu kodları yazıp bitirdikten sonra dosyayı masaüstüne randevu.py adıyla kaydedelim.
3. Sonra işletim sistemimize uygun bir şekilde komut satırına ulaşalım.
4.
Ardından komut satırı üzerinden masaüstüne gelelim. (Bunun nasıl yapılacağını
hatırlıyorsunuz, değil mi?)
5. Son olarak şu komutla programımızı çalıştıralım:
python3 randevu.py
Şöyle bir çıktı almış olmalıyız:
02.01.2012 Pazartesi öğleden sonra buluşalım.
Eğer bu çıktı yerine bir hata mesajı alıyorsanız bunun birkaç farklı sebebi olabilir:
1. Kodlarda yazım hatası yapmış olabilirsiniz. Bu ihtimali bertaraf etmek için yukarıdaki
kodlarla kendi yazdığınız kodları dikkatlice karşılaştırın.
2. Kodlarınızı kaydettiğiniz randevu.py adlı dosyanın adını yanlış yazmış olabilirsiniz.
Dolayısıyla python3 randevu.py komutu, var olmayan bir dosyaya atıfta bulunuyor
olabilir.
3. python3 randevu.py komutunu verdiğiniz dizin konumu ile randevu.py dosyasının
bulunduğu dizin konumu birbirinden farklı olabilir. Yani siz randevu.py dosyasını
masaüstüne kaydetmişsinizdir, ama python3 randevu.py komutunu yanlışlıkla başka
bir dizin altında veriyor olabilirsiniz. Bu ihtimali ortadan kaldırmak için, önceki derslerde
öğrendiğimiz yöntemleri kullanarak hangi dizin altında bulunduğunuzu kontrol edin.
O anda içinde bulunduğunuz dizinin içeriğini listeleyerek, randevu.py dosyasının
orada görünüp görünmediğini kontrol edebilirsiniz. Eğer program dosyanız bu listede
görünmüyorsa, elbette python3 randevu.py komutu çalışmayacaktır.
94
Bölüm 8. Programları Kaydetme ve Çalıştırma
Python 3 için Türkçe Kılavuz, Sürüm 3
4. Geçen derslerde anlattığımız şekilde Python3’ü kaynaktan root haklarıyla derlemenize
rağmen, derleme sonrasında /usr/bin/ dizini altına python3
adlı bir sembolik bağ
oluşturmadığınız için python3 komutu çalışmıyor olabilir.
5. Eğer Python3’ü yetkisiz kullanıcı olarak derlediyseniz, $HOME/python/bin/ dizini altında
hem python3 adlı bir sembolik bağ oluşturmuş, hem de $HOME/python/bin/ dizinini
YOL’a (PATH ) eklemiş olmanız gerekirken bunları yapmamış olabilirsiniz.
6. Asla unutmayın, Python’ın etkileşimli kabuğunu başlatmak için hangi komutu
kullanıyorsanız, randevu.py dosyasını çalıştırmak için de aynı komutu kullanacaksınız.
Yani eğer Python’ın etkileşimli kabuğunu python3.5 gibi bir komutla çalıştırıyorsanız,
programınızı da python3.5 randevu.py şeklinde çalıştırmanız gerekir. Aynı şekilde,
eğer etkileşimli kabuğu mesela python (veya py3) gibi bir komutla çalıştırıyorsanız,
programınızı da python randevu.py (veya py3 randevu.py) şeklinde çalıştırmalısınız.
Neticede etkileşimli kabuğu çalıştırırken de, bir program dosyası çalıştırırken de aslında
temel olarak Python programlama dilini çalıştırmış oluyorsunuz. Python programını
çalıştırırken bir dosya adı belirtmezseniz, yani Python’ı başlatan komutu tek başına
kullanırsanız etkileşimli kabuk çalışmaya başlar. Ama eğer Python’ı başlatan komutla
birlikte bir program dosyası ismi de belirtirseniz, o belirttiğiniz program dosyası
çalışmaya başlar.
Kodlarınızı düzgün bir şekilde çalıştırabildiğinizi varsayarak yolumuza devam edelim...
Gördüğünüz gibi, kod dosyamızı çalıştırmak için python3 komutundan yararlanıyoruz. Bu
arada tekrar etmekte fayda var: Python’ın etkileşimli kabuğunu çalıştırmak için hangi
komutu kullanıyorsanız, dosyaya kaydettiğiniz programlarınızı çalıştırmak için de aynı komutu
kullanacaksınız.
Gelelim Windows kullanıcılarına...
Windows
Daha önce de söylediğimiz gibi, Python kodlarımızı yazmak için istediğimiz bir metin
düzenleyiciyi kullanabiliriz. Hatta Notepad’i bile kullansak olur. Ancak Notepad’den biraz
daha gelişmiş bir metin düzenleyici ile başlamak işinizi kolaylaştıracaktır.
Python programlama dilini öğrenmeye yeni başlayan Windows kullanıcıları için en uygun
metin düzenleyici IDLE’dır. Başlat > Tüm Programlar > Python3.5 > IDLE (Python GUI) yolunu
takip ederek IDLE’a ulaşabilirsiniz.
IDLE’ı açtığınızda şöyle bir ekranla karşılaşacaksınız:
Aslında bu ekran size bir yerlerden tanıdık geliyor olmalı. Dikkat ederseniz beyaz ekranın en
sonunda bordo renkli bir >>> işareti var. Evet, tahmin ettiğiniz gibi, burası aslında Python’ın
etkileşimli kabuğudur. Yani o siyah etkileşimli kabuk ekranında ne yapabilirseniz burada da
aynı şeyi yapabilirsiniz. Dilerseniz kendi kendinize bazı denemeler yapın. Ama şu anda biz
IDLE’ın bu özelliğini değil, metin düzenleyici olma özelliğini kullanacağız. O yüzden yolumuza
devam ediyoruz.
8.2. Windows
95
Python 3 için Türkçe Kılavuz, Sürüm 3
Not: Dediğimiz gibi, yukarıda görünen ekran aslında Python’ın etkileşimli kabuğudur.
Dolayısıyla biraz sonra göstereceğimiz kodları buraya yazmayacağız. Python programlama
diline yeni başlayanların en sık yaptığı hatalardan biri de, kaydetmek istedikleri kodları
yukarıda görünen ekrana yazmaya çalışmalarıdır.
Unutmayın, Python’ın etkileşimli
kabuğunda ne yapabiliyorsanız, IDLE’ı açtığınızda ilk karşınıza çıkan ekranda da onu
yapabilirsiniz.
Python’ın etkileşimli kabuğunda yazdığınız kodlar etkileşimli kabuğu
kapattığınızda nasıl kayboluyorsa, yukarıdaki ekrana yazdığınız kodlar da IDLE’ı kapattığınızda
kaybolur...
Bir önceki ekranda sol üst köşede File [Dosya] menüsü görüyorsunuz. Oraya tıklayın ve menü
içindeki New Window [Yeni Pencere] düğmesine basın. Şöyle bir ekranla karşılaşacaksınız:
İşte Python kodlarımızı bu beyaz ekrana yazacağız. Şimdi bu ekrana şu satırları yazalım:
tarih = "02.01.2012"
gün = "Pazartesi"
vakit = "öğleden sonra"
print(tarih, gün, vakit, "buluşalım", end=".\n")
Bu noktadan sonra yapmamız gereken şey dosyamızı kaydetmek olacak. Bunun için File >
Save as yolunu takip ederek programımızı masaüstüne randevu.py adıyla kaydediyoruz.
Şu anda programımızı yazdık ve kaydettik. Artık programımızı çalıştırabiliriz. Bunun için
IDLE’da Run > Run Module yolunu takip etmeniz veya kısaca F5 tuşuna basmanız yeterli
olacaktır. Bu iki yöntemden birini kullanarak programınızı çalıştırdığınızda şöyle bir çıktı elde
edeceksiniz:
02.01.2012 Pazartesi öğleden sonra buluşalım.
Tebrikler! İlk Python programınızı yazıp çalıştırdınız... Eğer çalıştıramadıysanız veya
yukarıdaki çıktı yerine bir hata mesajı aldıysanız muhtemelen kodları yazarken yazım hatası
yapmışsınızdır. Kendi yazdığınız kodları buradaki kodlarla dikkatlice karşılaştırıp tekrar
deneyin.
Şimdi gelin isterseniz yukarıda yazdığımız kodları şöyle bir kısaca inceleyelim.
Programımızda üç farklı değişken tanımladığımıza dikkat edin. Bu değişkenler tarih, gün ve
vakit adlı değişkenlerdir. Daha sonra bu değişkenleri birbiriyle birleştiriyoruz. Bunun için
print() fonksiyonundan nasıl yararlandığımızı görüyorsunuz. Ayrıca print() fonksiyonunu
kullanış biçimimize de dikkat edin. Buradaki end parametresinin anlamını ve bunun ne işe
yaradığını artık gayet iyi biliyorsunuz. end parametresi yardımıyla cümlenin en sonuna bir
adet nokta yerleştirip, \n adlı kaçış dizisi yardımıyla da bir alt satıra geçiyoruz.
Böylece basit bir Python programının temel olarak nasıl yazılıp bir dosyaya kaydedileceğini
ve bu programın nasıl çalıştırılacağını öğrenmiş olduk.
96
Bölüm 8. Programları Kaydetme ve Çalıştırma
BÖLÜM 9
Çalışma Ortamı Tavsiyesi
Bu bölümde, Python programları geliştirirken rahat bir çalışma ortamı elde edebilmek için
yapmanız gerekenleri sıralayacağız. Öncelikle Windows kullanıcılarından başlayalım.
Windows Kullanıcıları
Windows’ta bir Python programı yazıp kaydettikten sonra bu programı komut satırından
çalıştırabilmek için, MS-DOS’u açıp, öncelikle cd komutuyla programın bulunduğu dizine
ulaşmamız gerekir.
İlgili dizine ulaştıktan sonra programımızı python program_adı
komutuyla çalıştırabiliriz. Ancak bir süre sonra, programı çalıştırmak için her defasında
programın bulunduğu dizine ulaşmaya çalışmak sıkıcı bir hal alacaktır. Ama bu konuda
çaresiz değiliz.
Windows 7, istediğimiz dizin altında bir MS-DOS ekranı açabilmemiz için bize çok güzel bir
kolaylık sunuyor. Normal şartlar altında mesela masaüstünde bir MS-DOS ekranı açabilmek
için şu yolu izlemeniz gerekiyor:
1. Windows logolu tuşa ve R tuşuna birlikte bas,
2. Açılan pencereye cmd yazıp Enter düğmesine bas,
3. Bu şekilde ulaştığın MS-DOS ekranında cd Desktop komutunu ver.
Bu üç adımla, MS-DOS ekranı üzerinden masaüstüne ulaşmış oluyoruz. Ama aslında bunun
çok daha kolay bir yolu var: Masaüstüne sağ tıklarken Shift tuşunu da basılı tutarsanız, sağ-tık
menüsünde ‘Komut penceresini burada aç’ adlı bir satır görürsünüz. İşte bu satıra tıklayarak,
MS-DOS komut satırını tek harekette masaüstü konumunda çalıştırabilirsiniz. Elbette bu
özellik sadece masaüstü için değil, bütün konumlar için geçerlidir. Yani bilgisayarınızda
herhangi bir yere sağ tıklarken Shift tuşunu da basılı tutarak o konumda bir MS-DOS
penceresi açabilirsiniz.
Ayrıca, herhangi bir klasör açıkken dosya tarayıcısının adres çubuğuna cmd yazıp
Enter düğmesine basarak da, o klasörün bulunduğu konumda bir komut ekranı
açabilirsiniz. Örneğin eğer o anda önünüzde ‘İndirilenler’ (veya ‘Karşıdan Yüklenenler’)
dizini açıksa, adres çubuğuna (aşağıdaki resimde kırmızı ile gösterilen bölge) cmd yazarak
C:\Users\Kullanıcı\Downloads> konumunda bir komut ekranı açabilirsiniz.
İkinci olarak, çalışma kolaylığı açısından Windows’ta dosya uzantılarının her zaman
görünmesini sağlamanızı da tavsiye ederim. Windows ilk kurulduğunda hiçbir dosyanın
uzantısı görünmez. Yani mesela deneme.txt adlı bir dosya Windows ilk kurulduğunda
deneme şeklinde görünecektir.
Bu durumda, bir dosyanın uzantısını değiştirmek
97
Python 3 için Türkçe Kılavuz, Sürüm 3
istediğinizde bazı sıkıntılar yaşarsınız.
Örneğin, masaüstünde bir metin dosyası
oluşturduğunuzu varsayalım. Diyelim ki amacınız bu dosyanın içine bir şeyler yazıp daha
sonra mesela bu dosyanın uzantısını .bat veya .py yapmak olsun. Böyle bir durumda,
dosya uzantılarını göremediğiniz için, metin dosyasının uzantısını değiştirmeye çalıştığınızda
deneme.bat.txt gibi bir dosya adı elde edebilirsiniz. Tabii ki bu dosya bir .bat dosyası değil, bir
.txt, yani metin dosyasıdır. Dolayısıyla aslında dosya uzantısını değiştirememiş oluyorsunuz.
Yukarıdaki nedenlerden ötürü, ben size şu yolu takip ederek dosya uzantılarını her zaman
görünür hale getirmenizi öneririm:
1. Başlat > Denetim Masası yolunu takip ederek denetim masasına ulaşın,
2. Denetim masasında ‘Görünüm ve Kişiselleştirme’ seçeneğine tıklayın,
3. Açılan menünün sağ tarafında ‘Klasör Seçenekleri’ satırına tıklayın,
4. Açılan pencerede ‘Görünüm’ sekmesine tıklayın,
5. ‘Gelişmiş Ayarlar’ listesinde
‘Bilinen dosya türleri için uzantıları gizle’ seçeneğinin
yanındaki onay işaretini kaldırın,
6. Uygula ve Tamam düğmelerine basarak bütün pencereleri kapatın,
7. Artık bütün dosyalarınızın uzantısı da görüneceği için, uzantı değiştirme işlemlerini çok
daha kolay bir şekilde halledebilirsiniz.
98
Bölüm 9. Çalışma Ortamı Tavsiyesi
Python 3 için Türkçe Kılavuz, Sürüm 3
GNU/Linux Kullanıcıları
Eğer KDE temelli bir GNU/Linux dağıtımı kullanıyorsanız, yazıp kaydettiğiniz Python
programını barındıran dizin açıkken F4
tuşuna bastığınızda, komut satırı o dizin altında
açılacaktır.
Unity ve GNOME kullanıcılarının ise benzer bir kolaylığa ulaşmak için nautilus-open-terminal
adlı betiği sistemlerine kurmaları gerekiyor. Eğer Ubuntu kullanıyorsanız bu betiği şu komutla
kurabilirsiniz:
sudo apt-get install nautilus-open-terminal
Bu betiği kurduktan sonra bilgisayarınızı yeniden başlatın veya şu komutu verin:
killall nautilus
Artık komut satırını hangi dizin altında başlatmak istiyorsanız o dizine sağ tıklayın. Menüler
arasında Open in Terminal [Uçbirimde aç] adlı bir seçenek göreceksiniz. Buna tıkladığınızda
o dizin altında bir komut satırı penceresi açılacaktır.
Metin Düzenleyici Ayarları
Daha önce de söylediğimiz gibi, Python ile program yazmak için istediğiniz metin düzenleyiciyi
kullanabilirsiniz. Ama kodlarınızın kusursuz görünmesi ve hatasız çalışması için kullandığınız
metin düzenleyicide birtakım ayarlamalar yapmanız gerekir. İşte bu bölümde bu ayarların
neler olduğunu göstereceğiz.
Eğer programlarınızı IDLE ile yazıyorsanız aslında bir şey yapmanıza gerek yok. IDLE Python
ile program yazmak üzere tasarlanmış bir düzenleyici olduğu için bu programın bütün ayarları
Python ile uyumludur. Ama eğer IDLE dışında bir metin düzenleyici kullanıyorsanız bu
düzenleyicide temel olarak şu ayarları yapmanız gerekir:
1. Sekme genişliğini [TAB width ] 4 olarak ayarlayın.
2. Girinti genişliğini [Indent width ] 4 olarak ayarlayın.
3. Girintilemede sekme yerine boşluk kullanmayı tercih edin [Use spaces instead of tabs]
4. Tercih edilen kodlama biçimini [Preferred encoding] utf-8 olarak ayarlayın.
Özellikle son söylediğimiz ‘kodlama biçimi’ ayarı çok önemlidir. Bu ayarın yanlış olması
halinde, yazdığınız programı çalıştırmak istediğinizde şöyle bir hata alabilirsiniz:
SyntaxError: Non-UTF-8 code starting with '\xfe' in file deneme.py on line 1,
but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
Eğer yazdığınız bir program böyle bir hata mesajı üretiyorsa, ilk olarak metin düzenleyicinizin
kodlama biçimi (encoding) ayarlarını kontrol edin. Metin düzenleyiciler genellikle tercih
edilen kodlama biçimini aşağıdaki örnek resimde görüldüğü gibi, durum çubuğunda sürekli
olarak gösterir.
9.2. GNU/Linux Kullanıcıları
99
Python 3 için Türkçe Kılavuz, Sürüm 3
Ancak kodlama biçimi doğru bir şekilde utf-8 olarak ayarlanmış metin düzenleyicilerde,
özellikle internet üzerinden kod kopyalanıp yapıştırılması sırasında bu ayar siz farkında
olmadan değişebilir. Böyle bir durumda da program çalışırken yukarıda bahsedilen hatayı
alabilirsiniz. Dolayısıyla, programınızı yazdığınız metin düzenleyicinin kodlama ayarlarının siz
farkında olmadan değişme ihtimaline karşı uyanık olmanız gerekir.
Elbette piyasada yüzlerce metin düzenleyici olduğu için yukarıda bahsedilen ayarların her
metin düzenleyicide nasıl yapılacağını tek tek göstermemiz mümkün değil. Ancak iyi bir
metin düzenleyicide yukarıdaki ayarların hepsi bulunur. Tek yapmanız gereken, bu ayarların,
kullandığınız metin düzenleyicide nereden yapıldığını bulmak. Eğer kullandığınız metin
düzenleyiciyi ayarlamakta zorlanıyorsanız, her zamanki gibi istihza.com/forum adresinde
sıkıntınızı dile getirebilirsiniz.
‘Kodlama biçimi’ kavramından söz etmişken, Python’la ilgili önemli bir konuya daha değinelim.
En başta da söylediğimiz gibi, şu anda piyasada Python iki farklı seri halinde geliştiriliyor.
Bunlardan birinin 2.x serisi, öbürünün de 3.x serisi olduğunu biliyoruz. Python’ın 2.x serisinde
Türkçe karakterlerin gösterimi ile ilgili çok ciddi problemler vardı. Örneğin Python’ın 2.x
serisinde şöyle bir kod yazamıyorduk:
print("Günaydın Şirin Baba!")
Bu kodu bir dosyaya kaydedip, Python’ın 2.x serisine ait bir sürümle çalıştırmak istediğimizde
Python bize şöyle bir hata mesajı veriyordu:
SyntaxError: Non-ASCII character '\xc3' in file
test.py on line 1, but no encoding declared;
see http://www.python.org/peps/pep-0263.html for details
Bunun sebebi, Python’ın 2.x sürümlerinde ASCII adlı kodlama biçiminin kullanılıyor olmasıdır.
Zaten hata mesajına baktığımızda da, Python’ın ASCII olmayan karakterlerin varlığından
şikayet ettiğini görüyoruz.
Yukarıdaki kodların çalışabilmesi için programımıza şöyle bir ekleme yapmamız gerekiyordu:
# -*- coding: utf-8 -*-
print("Günaydın Şirin Baba!")
Buradaki ilk satıra dikkat edin. Bu kodlarla yaptığımız şey, Python’ın ASCII adlı kodlama biçimi
yerine UTF-8 adlı kodlama biçimini kullanmasını sağlamaktır. ASCII adlı kodlama biçimi
Türkçe karakterleri gösteremez, ama UTF-8 adlı kodlama biçimi Türkçe karakterleri çok rahat
bir şekilde gösterebilir.
Not: Kodlama biçimlerinden, ileride ayrıntılı bir şekilde söz edeceğiz. O yüzden bu
anlattıklarımızda eğer anlamadığınız yerler olursa bunlara takılmanıza gerek yok.
Python’ın 3.x serisinin gelişi ile birlikte Python’da öntanımlı olarak ASCII yerine UTF-8
kodlama biçimi kullanılmaya başlandı. Dolayısıyla yazdığımız programlara # -*- coding:
utf-8 -*- satırını eklememize gerek kalmadı. Çünkü zaten Python UTF-8 kodlama biçimini
100
Bölüm 9. Çalışma Ortamı Tavsiyesi
Python 3 için Türkçe Kılavuz, Sürüm 3
öntanımlı olarak kendisi kullanıyor. Ama eğer UTF-8 dışında başka bir kodlama biçimine
ihtiyaç duyarsanız yine bu satırdan yararlanabilirsiniz.
Örneğin GNU/Linux dağıtımlarının geleneksel olarak UTF-8
kodlama biçimi ile arası
iyidir.
Dolayısıyla eğer GNU/Linux üzerinde Python programları geliştiriyorsanız bu
satırı hiç yazmadan bir ömür geçirebilirsiniz. Ama Windows işletim sistemleri UTF-8 ‘i
desteklemekle birlikte, bu destek GNU/Linux’taki kadar iyi değildir. Dolayısıyla zaman zaman
Windows’ta UTF-8 dışında başka bir kodlama biçimini kullanmanız gerekebilir. Örneğin
yazdığınız bir programda Türkçe karakterleri göremiyorsanız, programınızın ilk satırını şöyle
düzenleyebilirsiniz:
# -*- coding: cp1254 -*-
Burada UTF-8 yerine cp1254 adlı kodlama biçimini kullanmış oluyoruz. Windows işletim
sisteminde cp1254 adlı kodlama biçimi UTF-8 ‘e kıyasla daha fazla desteklenir.
MS-DOS Komut Satırı Ayarları
Eğer yukarıda anlattığımız bütün ayarları doğru bir şekilde yapmanıza rağmen, özellikle
MS-DOS komut satırında hala Türkçe karakterleri düzgün görüntüleyemiyorsanız,
kullandığınız Windows sürümünün komut satırı, öntanımlı olarak Türkçe karakterleri
gösteremeyen bir yazı tipine ayarlanmış olabilir.
Dolayısıyla Türkçe karakterleri
gösterebilmek için öncelikle uygun bir yazı tipi seçmeniz gerekir. Bunun için şu basamakları
takip ediyoruz:
1. Komut satırını açıyoruz,
2. Açılan pencerenin başlık çubuğuna sağ tıklayarak, ‘özellikler’ menüsüne giriyoruz,
3. ‘Yazı tipi’ sekmesinde yazı tipi olarak ‘Lucida Console’u (veya varsa ‘Consolas’ı) seçiyoruz,
4. ‘Tamam’ düğmesine basıyoruz.
5. Eğer önünüze bir onay penceresi açılırsa, ‘Özellikleri aynı başlıkla ileride oluşturulacak
pencereler için kaydet’ seçeneğini işaretleyip ‘Tamam’a bastıktan sonra çıkıyoruz.
6. Bu
işlemin
nasıl
yapılacağını
gösteren
bir
videoyu
http://media.istihza.com/videos/ms-dos.swf adresinden izleyebilirsiniz.
Böylece MS-DOS komut satırı için Türkçe karakterleri gösterebilen bir yazı tipi belirlemiş
olduk. Ancak bu, Türkçe karakterleri düzgün görüntülemeye yetmeyebilir. Eğer Türkçe
karakterler hala düzgün görünmüyorsa, kullandığınız sistemde MS-DOS’un dil kodlaması
Türkçe karakterleri görüntülemeye uygun olmayabilir. Türkçe karakterleri gösterebilen bir
dil kodlaması belirlemek için komut satırında şu komutu verin:
chcp 1254
CP1254, Türkçe karakterleri de içeren bir dil kodlamasıdır. Bu komutu verdikten sonra artık
Türkçe karakterleri düzgün görüntüleyebiliyor olmanız lazım.
Program Örnekleri
Yukarıda Python ve programlamaya ilişkin pek çok teknik bilgi verdik. Bunları öğrenmemiz,
işlerimizi kuru kuruya ezberleyerek değil, anlayarak yapmamızı sağlaması açısından büyük
9.4. MS-DOS Komut Satırı Ayarları
101
Python 3 için Türkçe Kılavuz, Sürüm 3
önem taşıyordu. Ancak yukarıda pratiğe yönelik pek bir şey sunamadık. İşte bu bölümde
pratik eksikliğimizi biraz olsun kapamaya dönük örnekler yapacağız.
Hatırlarsanız Python’la tanışmamızı sağlayan ilk örneğimiz ekrana basit bir “Merhaba Zalim
Dünya!” cümlesi yazdırmaktı. Bu ilk örneği etkileşimli kabukta verdiğimizi hatırlıyorsunuz:
>>> "Merhaba Zalim Dünya!"
Ama artık programlarımızı dosyaya kaydetmeyi öğrendiğimize göre bu kodları etkileşimli
kabuğa yazmak yerine bir dosyaya yazmayı tercih edebiliriz. Bu sayede yazdığımız kodlar
kalıcılık kazanacaktır.
Hemen bir deneme yapalım. Boş bir metin belgesi açıp oraya şu satırı yazalım:
"Merhaba Zalim Dünya!"
Şimdi de bu dosyayı daha önce anlattığımız şekilde masaüstüne deneme.py adıyla kaydedip
programımızı çalıştıralım.
Ne oldu? Programınız hiçbir çıktı vermeden kapandı, değil mi?
Hemen hatırlayacağınız gibi, print() fonksiyonu içine alınmayan ifadelerin ekrana çıktı
olarak verilebilmesi sadece etkileşimli kabuğa özgü bir durumdur. Programlarımızı dosyadan
çalıştırırken, print() fonksiyonu içine alınmayan ifadeler ekranda görünmeyecektir.
Yukarıdaki örnek bu durumun bir göstergesidir. Dolayısıyla yukarıdaki ifadenin ekrana çıktı
olarak verilebilmesi için o kodu şöyle yazmamız gerekiyor:
print("Merhaba Zalim Dünya!")
Programınızı bu şekilde tekrar çalıştırdığınızda şöyle bir çıktı alıyoruz:
Merhaba Zalim Dünya!
Bu oldukça basit bir örnekti. Şimdi biraz daha karmaşık bir örnek verelim.
Yine hatırlayacağınız gibi, önceki bölümlerden birinde aylık yol masrafımızı hesaplayan bir
program yazmıştık.
Orada elimizdeki verilerin şunlar olduğunu varsaymıştık:
1. Cumartesi-Pazar günleri çalışmıyoruz.
2. Dolayısıyla ayda 22 gün çalışıyoruz.
3. Evden işe gitmek için kullandığımız vasıtanın ücreti 1.5 TL
4. İşten eve dönmek için kullandığımız vasıtanın ücreti 1.4 TL
Elimizdeki bu bilgilere göre aylık yol masrafımızı hesaplamak için de şöyle bir formül
üretmiştik:
masraf = gün sayısı x (gidiş ücreti + dönüş ücreti)
Gelin şimdi yukarıdaki bilgileri kullanarak programımızı dosyaya yazalım:
gün = 22
gidiş_ücreti = 1.5
dönüş_ücreti = 1.4
masraf = gün * (gidiş_ücreti + dönüş_ücreti)
102
Bölüm 9. Çalışma Ortamı Tavsiyesi
Python 3 için Türkçe Kılavuz, Sürüm 3
print(masraf)
Tıpkı öncekiler gibi, bu programı da masaüstüne deneme.py adıyla kaydedelim ve
komut satırında masaüstünün bulunduğu konuma giderek python3 deneme.py komutuyla
programımızı çalıştıralım. Programı çalıştırdığımızda şöyle bir çıktı alıyoruz:
63.8
Programımız gayet düzgün çalışıyor. Ancak gördüğünüz gibi, elde ettiğimiz çıktı çok
yavan. Ama eğer isterseniz yukarıdaki programa daha profesyonel bir görünüm de
kazandırabilirsiniz. Dikkatlice inceleyin:
gün = 22
gidiş_ücreti = 1.5
dönüş_ücreti = 1.4
masraf = gün * (gidiş_ücreti + dönüş_ücreti)
print("-"*30)
print("çalışılan gün sayısı\t:", gün)
print("işe gidiş ücreti\t:", gidiş_ücreti)
print("işten dönüş ücreti\t:", dönüş_ücreti)
print("-"*30)
print("AYLIK YOL MASRAFI\t:", masraf)
Bu defa programımız şöyle bir çıktı verdi:
------------------------------
çalışılan gün sayısı
: 22
işe gidiş ücreti
: 1.5
işten dönüş ücreti
: 1.4
------------------------------
AYLIK YOL MASRAFI
: 63.8
Gördüğünüz gibi, bu kodlar sayesinde kullanıcıya daha ayrıntılı bilgi vermiş olduk. Üstelik
elde ettiğimiz çıktı daha şık görünüyor.
Yukarıdaki kodlarda şimdiye kadar öğrenmediğimiz hiçbir şey yok. Yukarıdaki kodların
tamamını anlayabilecek kadar Python bilgimiz var. Bu kodlarda çok basit parçaları bir araya
getirerek istediğimiz çıktıyı nasıl elde ettiğimizi dikkatlice inceleyin. Mesela elde etmek
istediğimiz çıktının görünüşünü güzelleştirmek için iki yerde şu satırı kullandık:
print("-"*30)
Böylece 30 adet - işaretini yan yana basmış olduk. Bu sayede elde ettiğimiz çıktı daha derli
toplu bir görünüme kavuştu. Ayrıca kodlarımız içinde \t adlı kaçış dizisinden de yararlandık.
Böylelikle ekrana basılan çıktılar alt alta düzgün bir şekilde hizalanmış oldu.
Bu arada, yukarıdaki kodlar sayesinde değişken kullanımının işlerimizi ne kadar
kolaylaştırdığına da birebir tanık olduk. Eğer değişkenler olmasaydı yukarıdaki kodları şöyle
yazacaktık:
print("-"*30)
print("çalışılan gün sayısı\t:", 22)
print("işe gidiş ücreti\t:", 1.5)
print("işten dönüş ücreti\t:", 1.4)
9.5. Program Örnekleri
103
Python 3 için Türkçe Kılavuz, Sürüm 3
print("-"*30)
print("AYLIK YOL MASRAFI\t:", 22 * (1.5 + 1.4))
Eğer günün birinde mesela çalışılan gün sayısı değişirse yukarıdaki kodların iki farklı yerinde
değişiklik yapmamız gerekecekti. Bu kodların çok büyük bir programın parçası olduğunu
düşünün. Kodların içinde değer arayıp bunları tek tek değiştirmeye kalkışmanın ne kadar
hataya açık bir yöntem olduğunu tahmin edebilirsiniz. Ama değişkenler sayesinde, sadece
tek bir yerde değişiklik yaparak kodlarımızı güncel tutabiliriz. Mesela çalışılan gün sayısı 20 ‘ye
düşmüş olsun:
gün = 20
gidiş_ücreti = 1.5
dönüş_ücreti = 1.4
masraf = gün * (gidiş_ücreti + dönüş_ücreti)
print("-"*30)
print("çalışılan gün sayısı\t:", gün)
print("işe gidiş ücreti\t:", gidiş_ücreti)
print("işten dönüş ücreti\t:", dönüş_ücreti)
print("-"*30)
print("AYLIK YOL MASRAFI\t:", masraf)
Gördüğünüz gibi, sadece en baştaki gün adlı değişkenin değerini değiştirerek istediğimiz
sonucu elde ettik.
Kendiniz isterseniz yukarıdaki örnekleri çeşitlendirebilirsiniz.
Gördüğünüz gibi, Python’da az da olsa işe yarar bir şeyler yazabilmek için çok şey bilmemize
gerek yok. Sırf şu ana kadar öğrendiklerimizi kullanarak bile ufak tefek programlar
yazabiliyoruz.
104
Bölüm 9. Çalışma Ortamı Tavsiyesi
BÖLÜM 10
Yorum ve Açıklama Cümleleri
Python’la ilgili şimdiye kadar öğrendiğimiz bilgileri kullanarak yazabileceğimiz en karmaşık
programlardan biri herhalde şöyle olacaktır:
isim
= "Fırat"
soyisim = "Özgül"
işsis
= "Ubuntu"
şehir
= "İstanbul"
print("isim
: ", isim,
"\n",
"soyisim
: ", soyisim, "\n",
"işletim sistemi: ", işsis,
"\n",
"şehir
: ", şehir,
"\n",
sep="")
Yukarıdaki kodları rahatlıkla anlayabildiğinizi zannediyorum. Ama isterseniz yine de bu
kodları satır satır inceleyelim:
İlk olarak isim, soyisim, işsis ve şehir adında dört farklı değişken tanımladık. Bu değişkenlerin
değeri sırasıyla Fırat, Özgül, Ubuntu ve İstanbul.
Daha sonra da tanımladığımız bu değişkenleri belli bir düzen içinde kullanıcılarımıza
gösterdik, yani ekrana yazdırdık. Elbette bu iş için print() fonksiyonunu kullandık. Bildiğiniz
gibi, print() birden fazla parametre alabilen bir fonksiyondur. Yani print() fonksiyonunun
parantezleri içine istediğimiz sayıda öğe yazabiliriz.
Eğer print() fonksiyonunun yukarıdaki kullanımı ilk bakışta gözünüze anlaşılmaz
göründüyse, fonksiyonda geçen ve ne işe yaradığını anlayamadığınız öğeleri, bir de çıkartarak
yazmayı deneyebilirsiniz bu fonksiyonu.
Python’la yazılmış herhangi bir programın tam olarak nasıl işlediğini anlamanın en iyi
yolu program içindeki kodlarda bazı değişiklikler yaparak ortaya çıkan sonucu incelemektir.
Örneğin print() fonksiyonunda sep parametresinin değerini boş bir karakter dizisi
yapmamızın nedenini anlamak için, fonksiyondaki bu sep parametresini kaldırıp, programı
bir de bu şekilde çalıştırmayı deneyebilirsiniz.
Yukarıdaki örnekte bütün öğeleri tek bir print() fonksiyonu içine yazdık. Ama tabii eğer
isterseniz birden fazla print() fonksiyonu da kullanabilirsiniz. Şöyle:
isim
= "Fırat"
soyisim = "Özgül"
işsis
= "Ubuntu"
şehir
= "İstanbul"
105
Python 3 için Türkçe Kılavuz, Sürüm 3
print("isim
: ", isim)
print("soyisim
: ", soyisim)
print("işletim sistemi: ", işsis)
print("şehir
: ", şehir)
Yukarıdaki kodlarla ilgili birkaç noktaya daha dikkatinizi çekmek istiyorum:
Birincisi, gördüğünüz gibi kodları yazarken biraz şekil vererek yazdık. Bunun sebebi kodların
görünüş olarak anlaşılır olmasını sağlamak. Daha önce de dediğimiz gibi, Python’da
doğru kod yazmak kadar, yazdığınız kodların anlaşılır olması da önemlidir. Bu sebepten,
Python’la kod yazarken, mesela kodlarımızdaki her bir satırın uzunluğunun 79 karakteri
geçmemesine özen gösteriyoruz. Bunu sağlamak için, kodlarımızı yukarıda görüldüğü şekilde
belli noktalardan bölmemiz gerekebilir.
Esasında yukarıdaki kodları şöyle de yazabilirdik:
isim = "Fırat"
soyisim = "Özgül"
işsis = "Ubuntu"
şehir = "İstanbul"
print("isim: ", isim, "\n", "soyisim: ", soyisim, "\n",
"işletim sistemi: ", işsis, "\n", "şehir: ", şehir, "\n", sep="")
Ancak bu şekilde kod yapısı biraz karmaşık görünüyor. Ayrıca parantez içindeki öğeleri yan
yana yazdığımız için, isim:, soyisim:, işletim sistemi: ve şehir: ifadelerini alt alta düzgün bir
şekilde hizalamak da kolay olmayacaktır.
Belki bu basit kodlarda çok fazla dikkati çekmiyordur, ama özellikle büyük boyutlu
programlarda kodlarımızı hem yapı hem de görüntü olarak olabildiğince anlaşılır bir hale
getirmek hem kodu okuyan başkaları için, hem de kendimiz için büyük önem taşır.
Unutmayın, bir programı yazdıktan 5-6 ay sonra geri dönüp baktığınızda kendi yazdığınız
kodlardan siz dahi hiçbir şey anlamadığınızı farkedebilirsiniz!
Bir program yazarken kodların olabildiğince okunaklı olmasını sağlamanın bir kaç yolu vardır.
Biz bunlardan bazılarını yukarıda gördük. Ancak bir programı okunaklı hale getirmenin en iyi
yolu kodlar içine bazı yorum cümleleri ekleyerek kodları açıklamaktır.
İşte bu bölümde, Python programlama dili ile yazdığımız kodlara nasıl yorum ve açıklama
cümleleri ekleyeceğimizi inceleyeceğiz.
Yorum İşareti
Programcılıkta en zor şey başkasının yazdığı kodları okuyup anlamaktır. Hatta yazılmış
bir programı düzeltmeye çalışmak, bazen o programı sıfırdan yazmaktan daha zor olabilir.
Bunun nedeni, program içindeki kodların ne işe yaradığını anlamanın zorluğudur. Programı
yazan kişi kendi düşünüşüne göre bir yol izlemiş ve programı geliştirirken karşılaştığı sorunları
çözmek için kimi yerlerde enteresan çözümler üretmiş olabilir. Ancak kodlara dışarıdan bakan
birisi için o programın mantık düzenini ve içindeki kodların tam olarak ne yaptığını anlamak
bir hayli zor olacaktır. Böyle durumlarda, kodları okuyan programcının en büyük yardımcısı,
programı geliştiren kişinin kodlar arasına eklediği notlar olacaktır. Tabii programı geliştiren
kişi kodlara yorum ekleme zahmetinde bulunmuşsa...
Python’da yazdığımız kodları başkalarının da anlayabilmesini sağlamak için, programımızın
106
Bölüm 10. Yorum ve Açıklama Cümleleri
Python 3 için Türkçe Kılavuz, Sürüm 3
yorumlarla desteklenmesi tavsiye edilir. Elbette programınızı yorumlarla desteklemeseniz
de programınız sorunsuz bir şekilde çalışacaktır. Ama programı yorumlarla desteklemek en
azından nezaket gereğidir.
Ayrıca işin başka bir boyutu daha var. Sizin yazdığınız kodları nasıl başkaları okurken
zorlanıyorsa, kendi yazdığınız kodları okurken siz bile zorlanabilirsiniz. Özellikle uzun süredir
ilgilenmediğiniz eski programlarınızı gözden geçirirken böyle bir sorunla karşılaşabilirsiniz.
Programın içindeki bir kod parçası, programın ilk yazılışının üzerinden 5-6 ay geçtikten
sonra size artık hiçbir şey ifade etmiyor olabilir. Kodlara bakıp, ‘Acaba burada ne yapmaya
çalışmışım?’ diye düşündüğünüz zamanlar da olacaktır. İşte bu tür sıkıntıları ortadan
kaldırmak veya en aza indirmek için kodlarımızın arasına açıklayıcı notlar ekleyeceğiz.
Python’da yorumlar # işareti ile gösterilir. Mesela bu bölümün ilk başında verdiğimiz kodları
yorumlarla destekleyelim:
isim
= "Fırat"
soyisim = "Özgül"
işsis
= "Ubuntu" #işletim sistemi
şehir
= "İstanbul"
#isim, soyisim, işsis ve şehir adlı değişkenleri
#alt alta, düzgün bir şekilde ekrana basıyoruz.
#Uygun yerlerde alt satıra geçebilmek için "\n"
#adlı kaçış dizisini kullanıyoruz.
print("isim
: ", isim,
"\n",
"soyisim
: ", soyisim, "\n",
"işletim sistemi: ", işsis,
"\n",
"şehir
: ", şehir,
"\n",
sep="") #parametreler arasında boşluk bırakmıyoruz.
Burada dikkat edeceğimiz nokta her yorum satırının başına
# işaretini koymayı
unutmamaktır.
Yazdığımız yorumlar Python’a hiç bir şey ifade etmez. Python bu yorumları tamamen
görmezden gelecektir. Bu yorumlar bilgisayardan ziyade kodları okuyan kişi için bir anlam
taşır.
Elbette yazdığınız yorumların ne kadar faydalı olacağı, yazdığınız yorumların kalitesine
bağlıdır. Dediğimiz gibi, yerli yerinde kullanılmış yorumlar bir programın okunaklılığını artırır,
ama her tarafı yorumlarla kaplı bir programı okumak da bazen hiç yorum girilmemiş bir
programı okumaktan daha zor olabilir! Dolayısıyla Python’da kodlarımıza yorum eklerken
önemli olan şey, kaş yapmaya çalışırken göz çıkarmamaktır. Yani yorumlarımızı, bir
kodun okunaklılığını artırmaya çalışırken daha da bozmayacak şekilde yerleştirmeye dikkat
etmeliyiz.
Yorum İşaretinin Farklı Kullanımları
Yukarıda yorum (# ) işaretini kullanarak, yazdığımız Python kodlarını nasıl açıklayacağımızı
öğrendik. Python’da yorum işaretleri çoğunlukla bu amaç için kullanılır. Yani kodları
açıklamak, bu kodları hem kendimiz hem de kodları okuyan başkaları için daha anlaşılır hale
getirmek için... Ama Python’da # işareti asıl amacının dışında bazı başka amaçlara da hizmet
edebilir.
10.2. Yorum İşaretinin Farklı Kullanımları
107
Python 3 için Türkçe Kılavuz, Sürüm 3
Etkisizleştirme Amaçlı
Dediğimiz gibi, yorum işaretinin birincil görevi, tabii ki, kodlara açıklayıcı notlar eklememizi
sağlamaktır. Ama bu işaret başka amaçlar için de kullanılabilir. Örneğin, diyelim ki yazdığımız
programa bir özellik eklemeyi düşünüyoruz, ama henüz bu özelliği yeni sürüme eklemek
istemiyoruz. O zaman şöyle bir şey yapabiliriz:
isim
= "Fırat"
soyisim = "Özgül"
işsis
= "Ubuntu"
şehir
= "İstanbul"
#uyruğu = "T.C"
print("isim
: ", isim,
"\n",
"soyisim
: ", soyisim, "\n",
"işletim sistemi: ", işsis,
"\n",
"şehir
: ", şehir,
"\n",
#"uyruğu
: ", uyruğu, "\n",
sep="")
Burada, programa henüz eklemek istemediğimiz bir özelliği, yorum içine alarak şimdilik iptal
ediyoruz yani etkisizleştiriyoruz (İngilizcede bu yorum içine alma işlemine comment out
deniyor). Python yorum içinde bir kod bile yer alsa o kodları çalıştırmayacaktır. Çünkü Python
# işareti ile başlayan satırların içeriğini görmez (#!/usr/bin/env python3 ve # -*- coding:
utf-8 -*- satırları hariç).
Peki eklemek istemediğimiz özelliği yorum içine almaktansa doğrudan silsek olmaz mı?
Elbette olur. Ama programın daha sonraki bir sürümüne ilave edeceğimiz bir özelliği yorum
içine almak yerine silecek olursak, vakti geldiğinde o özelliği nasıl yaptığımızı hatırlamakta
zorlanabiliriz! Hatta bir süre sonra programımıza hangi özelliği ekleyeceğimizi dahi unutmuş
olabiliriz. ‘Hayır, ben hafızama güveniyorum!’ diyorsanız karar sizin.
Yorum içine alarak iptal ettiğiniz bu kodları programa ekleme vakti geldiğinde yapacağınız tek
şey, kodların başındaki # işaretlerini kaldırmak olacaktır. Hatta bazı metin düzenleyiciler
bu işlemi tek bir tuşa basarak da gerçekleştirme yeteneğine sahiptir. Örneğin IDLE ile
çalışıyorsanız, yorum içine almak istediğiniz kodları fare ile seçtikten sonra Alt+3 tuşlarına
basarak ilgili kodları yorum içine alabilirsiniz. Bu kodları yorumdan kurtarmak için ise ilgili
alanı seçtikten sonra Alt+4 tuşlarına basmanız yeterli olacaktır (yorumdan kurtarma işlemine
İngilizcede uncomment diyorlar).
Süsleme Amaçlı
Bütün bunların dışında, isterseniz yorum işaretini kodlarınızı süslemek için dahi
kullanabilirsiniz:
#######################################################
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
#
FALANCA v.1
#
#
Yazan: Keramet Su
#
#
Lisans: GPL v2
#
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
#######################################################
isim
= "Fırat"
soyisim = "Özgül"
108
Bölüm 10. Yorum ve Açıklama Cümleleri
Python 3 için Türkçe Kılavuz, Sürüm 3
işsis
= "Ubuntu"
şehir
= "İstanbul"
print("isim
: ", isim,
"\n",
"soyisim
: ", soyisim, "\n",
"işletim sistemi: ", işsis,
"\n",
"şehir
: ", şehir,
"\n",
sep="")