Python’a Giriş

Bir önceki bölümde Python’ın komut satırına nasıl ulaşacağımızı görmüştük. Bu komut satırına teknik dilde etkileşimli kabuk (interactive shell) veya yorumlayıcı (interpreter) adı verilir.

Şimdi önceki bölümde anlattığımız yöntemlerden herhangi birini kullanarak Python’ın etkileşimli kabuğunu açalım ve şuna benzer bir ekranla karşılaşalım:

istihza@istihza:~$ python
Python 2.6.5 (r265:79063, Apr  3 2010, 01:57:29)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license"
for more information.
>>>

Komutlarımızı bu >>> işaretinden hemen sonra, hiç boşluk bırakmadan yazmaya başlayacağımızı daha önce söylemiştik. Şimdi isterseniz birkaç parmak alıştırması yapıp kendimizi Python’a ısındıralım.

Bu bölümde inceleyeceğimiz ilk komutumuzun adı print.

Karakter Dizileri

Python’daki en önemli komutlardan biri olan print‘i öğrendiğimize göre, bundan sonraki konuları daha rahat anlayabilmemiz için bazı kavramlardan söz etmemiz faydalı olabilir. Bu bölümde “karakter dizisi” diye bir şeyden söz edeceğiz. Yabancılar buna string adı veriyor...

Aslında biz karakter dizisinin ne olduğunu biliyoruz. Yukarıda print komutunu işlerken bu karakter dizilerini zaten kullandık. Oradaki örneklerden de göreceğiniz gibi, karakter dizileri, tırnak içinde gösterilen herhangi bir “şey”dir. Tanımından da anlaşılacağı gibi, tırnak içinde gösterebildiğimiz her şey bir karakter dizisi olabilir. Mesela şu örnekler birer karakter dizisidir:

"Python"

"Perl"

"Ruby"

"23"

"35"

"@falanca"

"c"

Karakter dizilerinin ayırt edici özelliği, tırnak işareti taşımalarıdır. Eğer yukarıdaki örnekleri tırnak işaretsiz olarak kullanırsak, artık bu öğeler birer karakter dizisi olmayacaktır... Yukarıdaki örneklerden de gördüğümüz gibi, bir karakter dizisinin ne kadar uzun veya ne kadar kısa olduğunun hiçbir önemi yok. Bir karakter dizisi tek bir karakterden oluşabileceği gibi, birden fazla karakterden de oluşabilir. Bu nedenle “c” de bir karakter dizisidir, “@falanca” da...

Python’da karakter dizilerini ekrana yazdırabilmek için print komutundan yararlanabileceğimizi biliyorsunuz. Mesela:

>>> print "k"

k

>>> print "456"

456

>>> print "Ruby"

Ruby

>>> print "İstanbul'un 5 günlük hava tahmini"

İstanbul'un 5 günlük hava tahmini

Etkileşimli kabukta çalışırken, istersek yukarıdaki örnekleri print komutunu kullanmadan da ekrana yazdırabiliriz:

>>> "Python"

'Python'

>>> "Perl"

'Perl'

>>> "Ruby"

'Ruby'

>>> "4243"

'4243'

Ancak bu durum sadece etkileşimli kabuk için geçerlidir. Yani ilerde kodlarımızı bir dosyaya kaydettiğimiz zaman, yukarıdaki kodların çıktı vermediğini, herhangi bir şeyi ekrana yazdırabilmek için mutlaka print komutundan yararlanmamız gerektiğini göreceğiz.

Şu örneğe bir bakalım:

>>> print "Python programlama dili"

Python yukarıdaki gibi bir komutla karşılaştığında iki basamaklı bir işlem gerçekleştirir. Önce “Python programlama dili” adlı karakter dizisini okur, ardından da print komutunun etkisiyle bu karakter dizisini ekrana basıp kullanıcıya gösterir. Yani şöyle bir çıktı verir:

Python programlama dili

Etkileşimli kabukta bir karakter dizisini print komutu olmadan kullandığımızda Python yalnızca birinci basamağı gerçekleştirmiş olur. Böyle bir durumda yaptığı tek şey bu karakter dizisini okumaktır. print komutunu kullanarak bu karakter dizisini kullanıcıya göstermediğimiz için ikinci basamak gerçekleşmez. Dolayısıyla elde ettiğimiz çıktı, söz konusu karakter dizisini kullanıcının değil, Python’ın ne şekilde gördüğünü gösterir. Yani Python bize şöyle bir şey söylemiş olur:

Sen şimdi etkileşimli kabuğa bir şeyler yazdın. Ben de bunu algıladım. Yazdığın şeyi algıladığımı göstermek için de, çıktıyı sana tek tırnak işaretleri içinde gösterdim. Ancak print gibi bir komut yardımıyla ekrana herhangi bir şey basmamış olman da dikkatimden kaçmadı değil!

Basit bir örnek verelim:

>>> "dünya"

'd\xc3\xbcnya'

Gördüğünüz gibi, “dünya” kelimesi içindeki Türkçe karakter (“ü”) çıktıda düzgün görünmüyor. Demek ki Python bizim girdiğimiz “dünya” adlı karakter dizisini “d\xc3\xbcnya” şeklinde görüyormuş... (Buradaki “\xc3\xbc” kısmı kullandığınız işletim sistemine göre farklılık gösterebilir.) Biz bu karakter dizisini kullanıcıya gösterebilmek için şöyle yazacağız:

>>> print "dünya"

dünya

Yazdığımız Python programlarını dosyaya kaydedip çalıştırdığımızda yukarıda anlattıklarımızın ne demek olduğunu çok daha net bir şekilde anlayacağız. O yüzden, eğer yukarıdaki açıklamalar size kafa karıştırıcı geldiyse hiç endişe etmenize gerek yok. Okumaya devam edebilirsiniz.

Karakter dizilerini göstermek için tırnak işaretlerinden yararlanıyoruz demiştik. Python’da karakter dizilerini göstermek için farklı tırnak tiplerini kullanabilirsiniz. Örneğin çift tırnak kullanabilirsiniz:

>>> print "Python güçlü bir programlama dilidir."

veya tek tırnak:

>>> print 'Python güçlü bir programlama dilidir.'

Bu tırnak tiplerini önceki örneklerimizde görmüştük. Ama Python bize bunların dışında bir tırnak alternatifi daha sunar. Üç tırnak:

>>> print """Python güçlü bir programlama dilidir."""

Gördüğünüz gibi, karakter dizileriyle birlikte üç farklı tırnak çeşidi kullanabiliyoruz. Hangi tırnak çeşidini kullandığınızın çok fazla bir önemi yok. Önemli olan, karakter dizisini hangi tırnakla açtıysanız o tırnakla kapatmanızdır.

Bu tırnak tipleri içinde en yaygın kullanılan çift tırnaktır. Tabii siz istediğiniz tırnak biçimini kullanmakta özgürsünüz. Yalnız önceki bölümde, duruma göre kullanılan tırnak tipinin önem kazandığını gösteren şöyle bir örnek verdiğimizi biliyorsunuz:

>>> print "İstanbul'un 5 günlük hava tahmini"

Burada “İstanbul’un 5 günlük hava tahmini” bir karakter dizisidir. Bu karakter dizisini göstermek için çift tırnaklardan yararlandık. İstersek elbette bu karakter dizisini tek tırnak ile de gösterebiliriz. Ancak İstanbul’un kelimesi içinde geçen kesme işaretinden ötürü, kullanılan tırnakların birbirine karışması gibi bir tehlike söz konusu. Yani, daha önce de gördüğümüz gibi, şöyle bir kullanım Python’ın kafasının karışmasına yol açacaktır:

>>> print 'İstanbul'un 5 günlük hava tahmini'

Bu kullanımda, Python karakter dizisini kapatan tırnağın hangisi olduğunu anlayamayacak, o yüzden de şöyle bir hata mesajı verecektir:

  File "<stdin>", line 1
    print 'İstanbul'un 5 günlük hava tahmini'
                     ^
SyntaxError: invalid syntax

Dikkat ederseniz hata çıktısındaki İstanbul’un kelimesinin sonunda minik bir ok işareti var. İşte bu ok, hata üreten sorunlu bölgeyi gösteriyor.

Böyle bir hata mesajı almamak için kaçış dizilerinden yararlanmamız gerektiğini söylemiştik:

>>> print 'İstanbul\'un 5 günlük hava tahmini'

Biraz sonra kaçış dizilerinden ayrıntılı olarak söz edeceğiz. O yüzden yukarıdaki kullanımın kafanızı karıştırmasına izin vermeyin.

Eğer bunların hiçbiriyle uğraşmak istemezseniz üç tırnaktan da yararlanabilirsiniz:

>>> print """Ahmet'in öğretmeni Cem Bey, "ödevini yapmadan gelme!" dedi."""

Gördüğünüz gibi, üç tırnak işareti sayesinde karakter dizisi içinde hem tek tırnak, hem de çift tırnak kullanabildik. Zira yukarıdaki karakter dizisine tek tırnakla başlasak Ahmet’in kelimesi içindeki kesme işareti, çift tırnakla başlasak “ödevini yapmadan gelme!” ifadesi içindeki çift tırnak işaretleri bize sorun yaratacak... Bu engellere takılmadan, kodumuzu düzgün bir şekilde ekrana yazdırabilmek için üç tırnak işaretlerini kullanmayı tercih ettik.

Üç tırnak işaretinin marifetleri yukarıdakilerle sınırlı değildir. Bu tırnak tipi, kimi durumlarda işimizi bir hayli kolaylaştırır. Mesela kullanıcılarımıza şöyle bir çıktı göstermemiz gerektiğini varsayalım:

Günün mönüsü
------------
Makarna .... 6 TL
Çorba....... 3 TL
Tatlı....... 2 TL

Böyle bir çıktı vermenin en kolay yolu üç tırnak işaretlerinden yararlanmaktır:

>>> print """
... Günün mönüsü
... ------------
... Makarna .... 6 TL
... Çorba....... 3 TL
... Tatlı....... 2 TL
... """

Burada ilk üç tırnak işaretini koyduktan sonra ENTER tuşuna bastık. Alt satıra geçildiğinde >>> işaretinin ... işaretine döndüğüne dikkat edin. Bu işaret Python’ın bizden komut girmeye devam etmemizi beklediğini gösteriyor. Biz de bu beklentiye uyarak, “Günün mönüsü” satırını yazıyoruz. Tekrar ENTER tuşuna bastığımızda yine ... işaretini görüyoruz ve hemen “———-” satırını yazıyoruz. Yazacağımız kodlar bitene kadar böyle devam ediyoruz. İşimiz bittiğinde de kapanış tırnaklarını koyup ENTER tuşuna basarak çıktıyı alıyoruz:

Günün mönüsü
------------
Makarna .... 6 TL
Çorba....... 3 TL
Tatlı....... 2 TL

Normalde, tek tırnak veya çift tırnak ile başladığımız bir karakter dizisinde kapanış tırnağını koymadan ENTER tuşuna basarsak hata alırız:

>>> print "Günün Mönüsü
  File "<stdin>", line 1
    print "Günün Mönüsü
                      ^
SyntaxError: EOL while scanning string literal

Burada “Günün Mönüsü” karakter dizisine çift tırnakla başladık, ama tırnağı kapatmadan ENTER tuşuna bastığımız için Python bize bir hata mesajı gösterdi. Aynı şey tek tırnak için de geçerlidir. Ama yukarıda da gördüğünüz gibi üç tırnak farklıdır:

>>> print """Günün Mönüsü
...

Üç tırnak işareti, karakter dizileri içinde geçen farklı tipte tırnakları atlatmamızı sağlamanın yanısıra, bize karakter dizilerimizi birden fazla satıra bölme imkanı da tanıyor. Aynı şeyi tek veya çift tırnakla yapamıyoruz. İlerde bu özellikten sık sık faydalandığımızı göreceksiniz.

Karakter dizilerine ilişkin önemli bir konu da bu karakter dizilerinin birbirleriyle nasıl birleştirileceğidir. Mesela bir kimsenin adı ile soyadını birleştirmek istersek ne yapmalıyız?

>>> print "Fırat" + "Özgül"

FıratÖzgül

Gördüğünüz gibi, “+” işaretini kullanarak iki karakter dizisini birleştirebiliyoruz. Ancak burada bir sorun var. Çıktıda isim ve soyisim birbirine bitişik olarak görünüyor. Bu problemi çözmek için şöyle bir şey yapabilirsiniz:

>>> print "Fırat" + " " + "Özgül"

Fırat Özgül

Burada “Fırat” ile “Özgül” karakter dizileri arasına boş bir karakter dizisi yerleştirdik. Böylece çıktımız tam istediğimiz gibi olmuş oldu.

Python karakter dizilerini birleştirebilmemiz için bize başka imkanlar da tanır. Mesela şu örneğe bir bakın:

>>> print "İstanbul" "Çeliktepe"

İstanbulÇeliktepe

Gördüğünüz gibi, iki karakter dizisini, araya herhangi bir işaret koymadan da birleştirebiliyoruz. Ancak burada da biraz öncekine benzer bir sorunla karşı karşıyayız. Karakter dizilerimiz yine birbirine bitişik görünüyor. Biraz önceki yöntemi kullanarak bu karakter dizilerini ayırmamız mümkün:

>>> print "İstanbul" " " "Çeliktepe"

Hatta yukarıdaki gibi bir çıktı alabilmek için şöyle bir şeyler de yapabilirsiniz:

>>> print "İstanbul " + "Çeliktepe"

veya:

>>> print "İstanbul " "Çeliktepe"

Burada ayrı bir boş karakter dizisi eklemek yerine, “İstanbul” adlı karakter dizisinin kapanış tırnağını koymadan önce bir boşluk bırakıyoruz...

Elbette Python’da çareler tükenmez. Dilerseniz yukarıdaki bütün her şeyi unutup şöyle bir şey yazmayı da tercih edebilirsiniz:

>>> print "Fırat", "Özgül"

Fırat Özgül

Burada da karakter dizilerini birbirlerinden virgülle ayırmayı tercih ettik. Bu son kullanım sıklıkla karşımıza çıkacak. O yüzden bu kullanımı aklımızda tutmamız gerekiyor.

Karakter dizilerinden ve bunların inceliklerinden ileride de söz etmeye devam edeceğiz. Ama isterseniz bu konuya şimdilik bir ara verelim ve Python’da farklı bir konuya giriş yapalım.

Python’da Sayılar ve Matematik İşlemleri

Şimdiye kadar Python’da bazı şeyler öğrendik. Ancak öğrendiklerimiz henüz dört dörtlük bir program yazmaya yetmiyor. Ama bu durum, Python’ı şimdilik basit bir hesap makinesi niyetine kullanabilmemize engel değil.

Örneğin:

>>> 2 + 5

7

... veya:

>>> 5 - 2

3

... ya da:

>>> 2 * 5

10

... hatta:

>>> 6 / 2

3

İsterseniz bunların başına print komutu ekleyerek de kullanabilirsiniz bu kodları. Bir örnek verelim:

>>> print 234 + 546

780

Aritmetik işlemler yapabilmek için kullandığımız işaretlerin size mantıklı gelmiş olduğunu zannediyorum. Toplama işlemi için “+”, çıkarma işlemi için “-”, çarpma işlemi için “*”, bölme işlemi için ise “/” işaretlerini kullanmak gayet makul duruyor, değil mi?

Gördüğünüz gibi sayıları yazarken tırnak işaretlerini kullanmıyoruz. Eğer tırnak işareti kullanırsak Python yazdıklarımızı sayı olarak değil karakter dizisi olarak algılayacaktır. Bu durumu birkaç örnekle görelim:

>>> print 25 + 50

75

Bu komut, 25 ve 50’yi toplayıp sonucu çıktı olarak verir. Şimdi aşağıdaki örneğe bakalım:

>>> print "25 + 50"

25 + 50

Bu komut 25 ile 50’yi toplamak yerine, ekrana 25 + 50 şeklinde bir çıktı verecektir. Peki, şöyle bir komut verirsek ne olur?

>>> print "25" + "50"

Böyle bir komutla karşılaşan Python derhal “25” ve “50” karakter dizilerini (bu sayılar tırnak içinde olduğu için Python bunları sayı olarak algılamaz) yan yana getirip birleştirecektir. Yani şöyle bir şey yapacaktır:

>>> print "25" + "50"

2550

Uzun lafın kısası, “25” ifadesi ile “Çeliktepe” ifadesi arasında Python açısından hiç bir fark yoktur. Bunların ikisi de karakter dizisi sınıfına girer. Ancak tırnak işareti olmayan 25 ile “Çeliktepe” ifadeleri Python dilinde ayrı anlamlar taşır. Çünkü bunlardan biri sayı öteki ise karakter dizisidir (string).

Şimdi aritmetik işlemlere geri dönelim. Öncelikle şu komutun çıktısını inceleyelim:

>>> print 5 / 2

2

Ama biz biliyoruz ki 5’i 2’ye bölerseniz 2 değil 2,5 çıkar. Aynı komutu bir de şöyle deneyelim:

>>> print 5.0 / 2

2.5

Gördüğünüz gibi bölme işlemini oluşturan bileşenlerden birinin yanına ”.0” koyulursa sorun çözülüyor. Böylelikle Python bizim sonucu kayan noktalı sayı olarak görmek istediğimizi anlıyor. Bu ”.0” ifadesini istediğimiz sayının önüne koyabiliriz. Birkaç örnek görelim:

>>> print 5 / 2.0

2.5

>>> print 5.0 / 2.0

2.5

Python’da aritmetik işlemler yapılırken alıştığımız matematik kuralları geçerlidir. Yani mesela aynı anda bölme çıkarma, toplama, çarpma işlemleri yapılacaksa işlem öncelik sırası, önce bölme ve çarpma sonra toplama ve çıkarma şeklinde olacaktır. Örneğin:

>>> print 2 + 6 / 3 * 5 - 4

işleminin sonucu 8 olacaktır. Tabii biz istersek parantezler yardımıyla Python’ın kendiliğinden kullandığı öncelik sırasını değiştirebiliriz. Bu arada yapacağımız aritmetik işlemlerde sayıları kayan noktalı sayı cinsinden yazmamız işlem sonucunun kesinliği açısından büyük önem taşır. Eğer her defasında ”.0” koymaktan sıkılıyorsanız, şu komutla Python’a, “Bana her zaman kesin sonuçlar göster,” mesajı gönderebilirsiniz:

>>> from __future__ import division

Not

Burada “__” işaretini klavyedeki alt çizgi tuşuna iki kez art arda basarak yapabilirsiniz.

Artık bir sonraki Python oturumuna kadar bütün işlemlerinizin sonucu kayan noktalı sayı olarak gösterilecektir. Bu arada dilerseniz konuyla ilgili bazı ufak tefek teknik bilgiler verelim. Böylece karşılaştığımız örnekleri daha kolay anlayabiliriz. Mesela yukarıda sayılardan bahsettik. Python’da sayılar çeşit çeşittir:

Tamsayılar (integers)
Tamsayılar, herhangi bir ondalık kısım barındırmayan sayılardır. Mesela 3, 5, 6, 100, 1450, -56, -3 vb...
Kayan Noktalı Sayılar (floating point numbers)
Ondalık bir kısım da barındıran sayılardır. Mesela 3.4, 5.5, 6.4, vb... Bu arada ondalık kısmı virgülle değil noktayla gösterdiğimize dikkat edin.
Uzun Sayılar (long integers)
-2.147.483.648 ile 2.147.483.647 arasında kalan sayılardır.
Karmaşık Sayılar (complex numbers)
Karmaşık sayılar bir gerçel, bir de sanal kısımdan oluşan sayılardır. Mesela 34.3j, 2j+4, vb...

Bu sayılar içinde en sık karşılaşacaklarımız tamsayılar ve kayan noktalı sayılardır. Eğer özel olarak matematikle ilgili işler yapmıyorsanız uzun sayılar ve karmaşık sayılar pek karşınıza çıkmaz.

Hatırlarsanız, karakter dizilerinden bahsederken, print‘li ve print‘siz kullanımdan söz etmiştik. Orada sözünü ettiğimiz durum sayılar için de geçerlidir. Mesela şu örneğe bakalım:

>>> 12 - 3.3

8.6999999999999993

Herhalde beklediğiniz çıktı bu değildi. Bu çıktı, 12 - 3.3 işlemini Python’ın nasıl gördüğünü gösteriyor. Eğer bu işlemi insanların anlayabileceği bir biçime getirmek istersek şöyle yazmamız gerekir:

>>> print 12 - 3.3

8.7

İlerde yeri geldiğinde sayılardan daha ayrıntılı bir şekilde bahsedeceğiz. O yüzden sayılar konusunu şimdi bir kenara bırakıp çok önemli başka bir konuya değinelim.

Değişkenler

Kabaca, bir veriyi kendi içinde depolayan birimlere değişken adı veriyorlar. Ama şu anda aslında bizi değişkenin ne olduğundan ziyade neye yaradığı ilgilendiriyor. O yüzden hemen bir örnekle durumu açıklamaya çalışalım. Mesela;

>>> n = 5

ifadesinde n bir değişkendir. Bu n değişkeni 5 verisini sonradan tekrar kullanılmak üzere depolar. Python komut satırında n = 5 şeklinde değişkeni tanımladıktan sonra print n komutunu verirsek ekrana yazdırılacak veri 5 olacaktır. Yani:

>>> n = 5
>>> print n

5

Bu n değişkenini alıp bununla aritmetik işlemler de yapabiliriz:

>>> n * 2

10

>>> n / 2.0

2.5

Hatta bu n değişkeni, içinde bir aritmetik işlem de barındırabilir:

>>> n = 34 * 45
>>> print n

1530

Şu örneklere bir göz atalım:

>>> a = 5
>>> b = 3
>>> print a * b

15

>>> print "a ile b'yi çarparsak", a * b, "elde ederiz"

a ile b'yi çarparsak 15 elde ederiz

Burada değişkenleri karakter dizileri arasına nasıl yerleştirdiğimize, virgülleri nerede kullandığımıza dikkat edin.

Aynı değişkenlerle yaptığımız şu örneğe bakalım bir de:

>>> print a, "sayısı", b, "sayısından büyüktür"

Gördüğünüz gibi, aslında burada yaptığımız şey, karakter dizilerini birbiriyle birleştirmekten ibarettir. Hatırlarsanız bir önceki bölümde iki karakter dizisini şu şekilde birleştirebileceğimizi öğrenmiştik:

>>> print "Fırat", "Özgül"

İşte yukarıda yaptığımız şeyin de bundan hiçbir farkı yoktur. Dikkatlice bakın:

>>> print a, "sayısı", b, "sayısından büyüktür"

Yukarıdaki kod şununla eşdeğerdir:

>>> print 5, "sayısı", 3, "sayısından büyüktür"

Biz burada doğrudan sayıları yazmak yerine, bu sayıları tutan değişkenleri yazdık...

Değişkenleri kullanmanın başka bir yolu da özel işaretler yardımıyla bunları karakter dizileri içine gömmektir. Şu örneğe bir bakalım:

>>> print "%s ile %s çarpılırsa %s elde edilir" %(3, 5, 3*5)

Bu da oldukça kullanışlı bir tekniktir. Burada, parantez içinde göstereceğimiz her bir öğe için karakter dizisi içine “%s” işaretini ekliyoruz. Karakter dizisini yazdıktan sonra da “%” işaretinin ardından parantez içinde bu değişkenleri teker teker tanımlıyoruz. Buna göre birinci değişkenimiz 3, ikincisi 5, üçüncüsü ise bunların çarpımı...

Bir de şu örneği inceleyelim:

>>> print "%s ve %s iyi bir ikilidir." %("Python", "Django")

Görüleceği gibi, bu kez değişkenlerimiz tamsayı yerine karakter dizisi olduğu için parantez içinde değişkenleri belirtirken tırnak işaretlerini kullanmayı unutmuyoruz.

Kaçış Dizileri

Önceki bölümlerde “kaçış dizisi” diye bir şeyden söz ettik. Hatta bununla ilgili bir örnek de yaptık. İsterseniz o örneği hatırlayalım:

>>> print 'İstanbul\'un 5 günlük hava tahmini'

İşte bu karakter dizisi içinde kullandığımız “\” işareti bir kaçış dizisidir. Bu kaçış dizisinin buradaki görevi, İstanbul’un kelimesi içinde geçen kesme işaretinin, karakter dizisini açan ve kapatan tırnak işaretleriyle karışmasını önlemek. Python bir karakter dizisiyle karşılaştığında, bu karakter dizisini soldan sağa doğru okur. Mesela yukarıdaki örnekte önce tek tırnak işaretini görüyor ve bir karakter dizisi tanımlayacağımızı anlıyor. Ardından karakter dizisi içindeki kesme işaretine rastlıyor ve bu işaretin karakter dizisinin bitişini gösteren kesme işareti olduğunu, yani karakter dizisinin sona erdiğini zannediyor. Ancak okumaya devam ettiğinde, karakter dizisine birleşik bir halde “un 5 günlük hava tahmini” diye bir şeyle karşılaşıyor ve işte bu noktada kafası allak bullak oluyor. Bizim İstanbul’un kelimesindeki kesme işaretinin sol tarafına yerleştirdiğimiz “\” kaçış dizisi Python’a, bu kesme işaretini görmezden gelme emri veriyor. Böylece karakter dizimiz hatasız bir şekilde ekrana basılıyor...

Dilerseniz bununla ilgili birkaç örnek daha yapalım:

>>> print "1 numaralı oyuncudan gelen cevap: "Sola dön!""

Bu karakter dizisi içinde “Sola dön!” ifadesi var. Biz yukarıdaki karakter dizisini tanımlarken çift tırnaktan yararlandığımız için, karakter dizisi içindeki bu “Sola dön!” ifadesi çakışmaya sebep oluyor. İstersek yukarıdaki karakter dizisini şu şekilde yazabiliriz:

>>> print '1 numaralı oyuncudan gelen cevap: "Sola dön!"'

Bu komut sorunsuz bir şekilde yazdırılır. Ama eğer karakter dizisini çift tırnakla tanımlamanız gerekirse, kaçış dizilerinden yararlanabilirsiniz:

>>> print "1 numaralı oyuncudan gelen cevap: \"Sola dön!\""

Burada iki adet kaçış dizisi kullandığımıza dikkat edin. Bunun nedeni, karakter dizisi içinde başlangıç ve bitiş tırnaklarıyla karışabilecek iki adet tırnak işareti olmasıdır... Ayrıca kaçış dizisini, sorunlu tırnağın soluna koyduğumuza da dikkat edin.

Hatırlarsanız kaçış dizilerinden ilk bahsettiğimiz yerde şöyle bir örnek de vermiştik:

>>> print "Python'da önemli komutlardan biri de "print" komutudur."

Bu komutun hata vereceğini biliyoruz. Çünkü karakter dizisini çift tırnak içinde tanımladık. Dolayısıyla karakter dizisi içinde geçen çift tırnaklı “print” ifadesi çakışmaya yol açtı. Bu sorunu aşmak için karakter dizisini şöyle yazıyoruz:

>>> print "Python'da önemli komutlardan biri de \"print\" komutudur."

Burada kaçış dizilerini çift tırnaklı “print” kelimesine nasıl uyguladığımıza dikkat edin. Her bir çift tırnağın soluna bir adet “\” işareti yerleştirdik. Böylece hatadan kıvrak hareketlerle kaçmış olduk...

“\” işareti yalnızca tırnak işaretleriyle birlikte kullanılmaz. Bu işaret başka karakterlerle birlikte de kullanılarak farklı amaçlara hizmet edebilir.

Şu örneğe bir bakın:

>>> print "birinci satır\nikinci satır"

Burada “\” işaretini “n” harfiyle birlikte kullandık. “\” işareti “n” harfiyle birlikte kullanıldığında özel bir anlam ifade eder. Yukarıdaki kod şöyle bir çıktı verir:

birinci satır
ikinci satır

Gördüğünüz gibi, karakter dizisini iki satıra böldük. Bunu yapmamızı sağlayan şey “\n” adlı kaçış dizisidir. Bu kaçış dizisi yeni bir satıra geçmemizi sağlar. Daha belirgin bir örnek verelim:

>>> print "Yolun sonu\n"

Bu komut, “Yolun sonu” karakter dizisini çıktı olarak verdikten sonra bir satır boşluk bırakacaktır.

Hatırlarsanız önceki bölümde, print komutunu kullanmadan herhangi bir karakter dizisi yazdığımızda elde ettiğimiz çıktının Python’ın bakış açısını yansıttığını söylemiştik. Bu durumu çok daha net anlayabilmemizi sağlayacak bir örnek verelim:

>>> """
... Günün mönüsü
... ------------
... Makarna..... 6 TL
... Çorba....... 3 TL
... Tatlı....... 2 TL
... """

Bu örneği hatırlıyorsunuz. Daha önce aynı örneği print komutu ile birlikte kullanmıştık.

Bu kodlar şöyle bir çıktı verir:

'\nGünün mönüsü\n------------\nMakarna..... 6 TL\nÇorba.......
3 TL\nTatlı....... 2 TL\n'

Gördüğünüz gibi, çıktıda “\n” adlı kaçış dizileri de görünüyor. Demek ki Python üç tırnak yardımıyla girdiğimiz kodları böyle görüyormuş. Bu çıktıdan şunu da anlıyoruz: Demek ki biz üç tırnak yerine tek tırnak kullanmak istesek aynı çıktıyı elde etmek için şöyle gibi bir komut vermemiz gerekecek:

>>> print '\nGünün mönüsü\n------------\nMakarna..... 6 TL\nÇorba....... \
... 3 TL\nTatlı....... 2 TL\n'

Günün mönüsü
------------
Makarna..... 6 TL
Çorba....... 3 TL
Tatlı....... 2 TL

Buradan, üç tırnak işaretlerinin kimi durumlarda hayatımızı ne kadar da kolaylaştırabileceğini anlayabilirsiniz...

Bu arada, yukarıdaki komutlarda bir şey dikkatinizi çekmiş olmalı. >>> print '\nGünün mönüsü\n--- ile başlayan komutun ilk satırının sonunda, ENTER tuşuna basıp yeni satıra geçmeden önce “\” adlı kaçış dizisini kullandık. Elbette istersek bu iki satırı tek bir satırda da yazabiliriz. Ancak görüntü açısından kodların bu şekilde sağa doğru uzaması hoş değil. Kötü bir kod görünümü ortaya çıkmaması için, bu kaçış dizisini kullanarak kodlarımızı iki satıra bölmeyi tercih ettik.

Not

Python’da doğru kod yazmak kadar, yazdığınız kodların düzgün görünmesi ve okunaklı olması da önemlidir. Bu yüzden yazdığımız programlarda satır uzunluğunun mümkün olduğunca 79 karakterden fazla olmamasına dikkat ediyoruz. Eğer yazdığımız bir satır 79 karakterden uzun olacaksa satırı uygun bir yerinden bölüp yeni bir satıra geçmemiz gerekir. Bu durum teknik bir zorunluluk değildir, ancak okunaklılığı artırdığı için uyulması tavsiye edilir. Örneğin biz de yukarıdaki örnekte kodlarımızın sağa doğru çirkin bir şekilde uzamaması için satırı uygun bir yerinden bölüp alt satıra geçtik.

Bu kaçış dizisini kullanmamızın amacı, Python’ın herhangi bir hata vermeden alt satıra geçmesini sağlamak. Eğer orada o kaçış dizisini kullanmazsak, ENTER tuşuna bastığımız anda Python hata verecektir. “\” işareti, alt satıra geçilmiş de olsa kodların ilk satırdan devam etmesi gerektiğini gösteriyor. Bu durumu belirgin bir şekilde gösteren bir örnek verelim:

>>> print 'mer\
... haba'

merhaba

Gördüğünüz gibi, “merhaba” kelimesini “mer” hecesinden bölüp “\” işareti ile alt satıra geçtiğimiz halde, çıktımız “merhaba” oldu. Eğer amacınız “merhaba” kelimesini “mer” ve “haba” olarak bölmekse şöyle bir şey yapabilirsiniz:

>>> print """mer
... haba"""

mer
haba

Eğer üç tırnak kullandığınız halde, “merhaba” kelimesinin bölünmesini istemiyorsanız yine “\” kaçış dizisinden yararlanabilirsiniz:

>>> print """mer\
... haba"""

merhaba

Eğer üç tırnak yerine çift veya tek tırnak kullanarak “merhaba” kelimesini ortadan bölmek isterseniz elbette “\n” adlı kaçış dizisinden yararlanabilirsiniz:

>>> print "mer\nhaba"

mer
haba

>>> print 'mer\nhaba'

mer
haba

Not

Çok uzun bir karakter dizisini iki satıra bölmek için “\” işaretini kullanırken, bu işaretin satırdaki son karakter olmasına özen gösterin. Yani “\” işaretini koyar koymaz ENTER tuşuna basmalısınız. “\” işaretinden sonra boşluk bile olmamalı.

Bütün bu örneklerden şunu anlıyoruz: Python’da temel olarak tek bir kaçış dizisi var. O da “\” işareti... Bu işaret farklı karakterlerle bir araya gelerek, değişik anlamlar ortaya çıkarabiliyor. Mesela bu karakter dizisi tırnak işaretiyle birlikte kullanıldığında, karakter dizisini başlatıp bitiren tırnaklarla çakışılmasını önlüyor. Eğer bu kaçış dizisini “n” harfiyle birlikte kullanırsak, karakter dizilerini bölüp alt satıra geçebiliyoruz. Eğer bu kaçış dizisini tek başına kullanırsak, bir karakter dizisini herhangi bir yerinden bölüp alt satıra geçtiğimiz halde, o karakter dizisi çıktıda tek satır olarak görünüyor. Bütün bunların dışında bu kaçış dizisi “t” harfiyle de yan yana gelebilir. O zaman da şöyle bir anlam kazanır:

>>> print "Uzak... \t Çok uzak"

Uzak...      Çok uzak

Bu kaçış dizisinin görevi karakter dizisi içindeki karakterler arasına mesafe koymak. Bu kaçış dizisi de kimi yerlerde hayatınızı kolaylaştırabilir. “\” kaçış dizisi başka karakterlerle de bir araya gelebilir. Ancak en önemlilerini zaten yukarıda verdik. Programlama maceramızda en çok işimize yarayacak olanlar bunlardır.

Yukarıdakilerin dışında, Python’da şablona uymayan önemli bir kaçış dizisi daha bulunur. Bu kaçış dizisinin adı “r“‘dir. Bu kaçış dizisinin hem görünüşü hem de kullanımı yukarıdaki kaçış dizilerinden biraz farklıdır. Dilerseniz bu kaçış dizisini anlatmadan önce size şöyle bir soru sorayım:

Acaba aşağıdaki karakter dizisini nasıl yazdırırız?

“C:\Documents and Settings\nergis\test”

İsterseniz bu karakter dizisini önce şöyle yazdırmayı deneyelim:

>>> print "C:\Documents and Settings\nergis\test"

C:\Documents and Settings
ergis   est

Gördüğünüz gibi Python bize tuhaf bir çıktı verdi. Sizce neden böyle oldu?

Cevap aslında çok basit. Karakter dizisinde kalın harflerle gösterdiğimiz kısımlara dikkat edin: C:\Documents and Settings\nergis\test

Burada “nergis” ve “test” kelimelerinin başındaki harfler, dizin ayracı olan “\” işareti ile yan yana geldiği için Python bunları birer kaçış dizisi olarak algılıyor. Bu durumdan kurtulmak için birkaç seçeneğimiz var. İstersek yukarıdaki karakter dizisini şöyle yazabiliriz:

>>> print "C:\\Documents and Settings\\nergis\\test"

Burada “\” işaretlerini çiftleyerek sorunun üstesinden gelebiliyoruz. Ama eğer istersek yukarıdaki soruna çok daha temiz bir çözüm de bulabiliriz. İşte böyle bir duruma karşı Python’da “r” adlı bir kaçış dizisi daha bulunur. Bunu şöyle kullanıyoruz:

>>> print r"C:\Documents and Settings\nergis\test"

Gördüğünüz gibi, “r” adlı kaçış dizisi, karakter dizisi içinde geçen bütün kaçış dizilerini etkisiz hale getiriyor. Bu kaçış dizisi özellikle dizin adlarını yazdırırken çok işinize yarayacaktır. İsterseniz bununla ilgili şöyle bir örnek daha verelim. Diyelim ki şu cümleyi ekrana yazdırmak istiyoruz:

Python'daki kaçış dizileri şunlardır: \, \n, \t

Bu cümleyi şöyle yazdıramayız:

>>> print "Python'daki kaçış dizileri şunlardır: \, \n, \t"

Python'daki kaçış dizileri şunlardır: \,
,

Gördüğünüz gibi çıktı hiç de beklediğimiz gibi değil. Çünkü Python karakter dizisi içinde geçen kaçış dizilerini işleme sokuyor ve buradaki her bir kaçış dizisinin görevini yerine getirmesine izin veriyor. Bu kaçış dizilerinin etkisizleştirilebilmesi için şu kodu yazabilirsiniz:

print "Python'daki kaçış dizileri şunlardır: \\, \\n, \\t"

Ama burada “r” kaçış dizisini kullanırsak çok daha temiz bir kod görünümü elde etmiş oluruz:

print r"Python'daki kaçış dizileri şunlardır: \, \n, \t"

“r” adlı kaçış dizisi, karakter dizisi içindeki kaçış dizilerinin görevlerini yerine getirmesine engel olacaktır.

Dilerseniz şimdiye kadar gördüğümüz kaçış dizilerini şöyle bir özetleyelim:

\
ENTER tuşuna basılarak alt satıra kaydırılan karakter dizilerinin çıktıda tek satır olarak görünmesini sağlar.
\’
Karakter dizilerini başlatıp bitiren tek tırnaklarla, karakter dizisi içinde geçen tek tırnakların karışmasını engeller.
\”
Karakter dizilerini başlatıp bitiren çift tırnaklarla, karakter dizisi içinde geçen çift tırnakların karışmasını engeller.
\n
Yeni bir satıra geçilmesini sağlar.
\t
Karakter dizileri içinde sekme (TAB) tuşuna basılmış gibi boşluklar oluşturulmasını sağlar.
r
Karakter dizileri içinde geçen kaçış dizilerini etkisiz hale getirir.

Şimdi dilerseniz bölüm sorularına geçelim ve bu konuyu kapatalım.

Bölüm Soruları

1. Python’ın 2.x sürümünü mü yoksa 3.x sürümünü mü kullandığınızı tespit edin. Eğer hangi sürümü kullanmanız gerektiği konusunda tereddütleriniz varsa http://www.istihza.com/blog/hangisinden-baslamali-python-2x-mi-yoksa-3x-mi.html/ adresindeki makalemizi inceleyin.

2. Aşağıdakilerden hangisi bir karakter dizisi değildir?

"python"

www.google.com

'23'

"""@%&"""

'''istihza'''

3. Aşağıdaki tabloyu ekrana çıktı olarak verin:

Yıllara Göre Asgari Ücret
-------------------------
2005........ 488,70 YTL
2006........ 531,00 YTL
2007........ 585,00 YTL
2008........ 638,70 YTL
2009........ 666,00 TL
2010........ 760,50 TL

4. Aşağıdaki karakter dizilerini farklı yöntemler kullanarak birleştirin ve tek bir cümle elde edin:

"Ahmet"
"yarın Ankara'ya"
"gidecek"

Sizce en kolay ve kullanışlı yöntem hangisi?

5. Aşağıdaki işlemin sonucunu önce kafanızdan sonra da Python’la hesaplayın. Eğer Python’dan aldığınız sonuç beklediğiniz gibi değilse nedenini bulmaya çalışın.

2 + 3 x 7

6. Aşağıdaki ifadeyi üç tırnak işareti kullanmadan ekrana çıktı olarak verin:

Bilmezler yalnız yaşamayanlar,
Nasıl korku verir sessizlik insana.
                            O.Veli

7. Aşağıdaki değişkenleri kullanarak “Depoda 10 kilo elma, 20 kilo da armut kaldı” cümlesini elde edin:

elma = 10
armut = 20

8. Aşağıdaki cümleleri, farklı tırnak tiplerini kullanarak yazdırın:

Doktor Kemal'in yaptığı açıklamaya göre, "Endişe edecek hiçbir şey yok!"
Python'daki en kullanışlı tırnak tiplerinden biri de "üç tırnak" (""") işaretidir.