• Sonuç bulunamadı

Kaçı¸ s Dizileri (Escape Sequences)

Genel Tekrar

9.13 Kaçı¸ s Dizileri (Escape Sequences)

Hatırlarsanız ilk derslerimizin birinde ¸söyle bir örnek vermi¸stik:

>>> print("Ahmet, \"Bugün Adana’ya gidiyoruz,\" dedi.")

O derste, buradaki “\” i¸saretinin bir “kaçı¸s dizisi” oldu˘gundan söz etmi¸stik. Bu i¸saret, karakter dizisini ba¸slatan çift tırnak ile, cümle içinde geçen çift tırnakların birbirine karı¸smasını engel-liyordu. Aynı ¸sekilde, yeni bir satıra geçmemizi sa˘glayan “\n” i¸saretinin de bir kaçı¸s dizisi oldu˘gunu söylemi¸stik. Python’da bol miktarda kaçı¸s dizisi bulunur ve bunların her biri bir-birinden farklı görevleri yerine getirir.

Python’da temel olarak iki adet kaçı¸s dizisi vardır: “r” ve “\”. Bu bölümde bu kaçı¸s dizilerini ve bunların varyasyonlarını tek tek inceleyece˘giz:

“\”

Bu i¸saret hemen hemen bütün programlama dillerinin demirba¸sıdır. Bunun düz bölü de˘gil ters bölü oldu˘guna özellikle dikkat etmeliyiz...

Bu i¸saretin ne i¸se yaradı˘gını daha önceki derslerimizde görmü¸stük. Yukarıya da aldı˘gımız örne˘ge baktı˘gımızda bu i¸saretin görevi açıkça ortaya çıkıyor. “\” i¸sareti kendisinden sonra gelen herhangi bir karakterin özel bir anlamı oldu˘gunu gösterir. Mesela ¸su örne˘ge bakalım:

>>> print("Kezban, \"Nen var kuzum,\" dedi.")

Burada “\” i¸sareti, kendisinden sonra gelen çift tırnak karakterinin özel bir anlamı oldu˘gunu be-lirtiyor. Yani bu çift tırna˘gın, karakter dizisini ba¸slatan ve bitiren çift tırnaklardan farklı oldu˘gunu gösteriyor. Aynı i¸sareti öteki özel çift tırna˘gın da önüne yerle¸stirdi˘gimizde yukarıdaki karakter dizisini hatasız olarak ekrana yazdırabiliyoruz.

Mesela bu kaçı¸s dizisi “n” harfinden önce gelirse, bu harfin de özel bir anlamı oldu˘gunu belirte-cektir. “\n” adlı kaçı¸s dizisi yeni satıra geçilmesini sa˘glar:

>>> print("Bu birinci satır.\nBu da ikinci satır...")

Bu birinci satır.

Bu da ikinci satır...

Python’daki kaçı¸s dizileri genel olarak “\” i¸saretinin ba¸ska harflerle birle¸serek özel bir anlam olu¸sturmasıyla meydana getirilir. ¸Simdi bu “\” i¸saretinin yanına gelip özel bir anlam kazanan harfleri ve bu ¸sekilde ortaya çıkan kaçı¸s dizilerini inceleyelim...

“\t”

E˘ger “\” i¸saretini “t” harfinden önce getirirsek, ortaya çıkan i¸saret (“\t”), karakter dizisi içinde bir sekme (tab) olu¸sturacaktır:

>>> print("Aramızda \tda˘glar var...")

Aramızda da˘glar var...

E˘ger daha büyük bir sekmeye ihtiyacınız varsa, “\t” kaçı¸s dizisini birden fazla sayıda kullan-abilirsiniz:

>>> print("Uzak... \t\tçok uzak...")

Uzak... çok uzak...

Elbette birden fazla farklı kaçı¸s dizisini bir arada da kullanabiliriz:

>>> print("A¸sa˘gıda \n\thava nasıl?")

A¸sa˘gıda

hava nasıl?

Gördü˘günüz gibi “\t” adlı kaçı¸s dizisi bizi bo¸sluk tu¸suna üst üste birkaç kez basmaktan kur-tarıyor. Karakter dizimiz içinde sekmeye ihtiyacımız oldu˘gunda bu kaçı¸s dizisi epey i¸simize yarayacak.

¸

Simdi ba¸ska bir kaçı¸s dizisine bakalım.

“\\”

¸

Simdiye kadar ö˘grendi˘gimiz gibi, “\”, “\t” ve “\n” i¸saretlerini bir karakter dizisi içinde kul-landı˘gımızda her biri özel bir görevi yerine getiriyor. Peki ya biz yazdı˘gımız bir karakter dizisi içinde bu i¸saretleri göstermek istersek ne yapaca˘gız? Mesela “\n” ifadesinin kendisini bir karak-ter dizisi içine yazıp kullanıcılarımıza göskarak-teremez miyiz?

Elbette gösterebiliriz. E˘ger yazdı˘gımız bir karakter dizisi içinde bu kaçı¸s dizilerinin kendisini göstermek istersek ¸söyle bir yol tutuyoruz:

>>> print("Ö˘grendi˘gimiz karakter dizileri ¸sunlardır: \\n, \\t") Ö˘grendi˘gimiz karakter dizileri ¸sunlardır: \n, \t

Gördü˘günüz gibi, “\t”, “\n” veya “\” kaçı¸s dizisinin kendisini ekrana basabilmek için “\” i¸saretini çiftleyerek “\\” ¸seklinde yazmamız gerekiyor...

E˘ger sadece “\” i¸saretini göstermek istersek bazı noktalara dikkat etmemiz gerekiyor.

Mesela ¸su örne˘ge bakalım:

>>> print("demirba¸s kaçı¸s dizisi: \.")

demirba¸s kaçı¸s dizisi: \.

Gördü˘günüz gibi, e˘ger “\” i¸saretini tek ba¸sına kullanacaksak özel bir ¸sey yapmamıza gerek yok. Yalnız burada ¸suna dikkat etmemiz gerek: “\” i¸saretini çiftlemeden yazabilmemiz için, bu i¸saretin sa˘gına herhangi bir özel karakterin gelmemesi lazım. Bu ne demek? Hemen bir örnek verelim:

>>> print("demirba¸s kaçı¸s dizisi: \")

SyntaxError: EOL while scanning string literal

Bu örnek Python’un bize bir hata mesajı göstermesine neden oluyor... Bunun sebebi aslında

“\” i¸saretinin bu örnekte tek ba¸sına kullanılmıyor olması. Yani “\” i¸saretinden sonra karakter dizisinin biti¸s tırna˘gı geliyor... Bildi˘gimiz gibi, “\” i¸sareti çift veya tek tırnak ile birlikte kul-lanılırsa, Python bu tek veya çift tırna˘gı farklı bir ¸sekilde algılayacaktır. Mesela bu örnekte, kapanı¸s tırna˘gından hemen önce gelen “\” kaçı¸s dizisi nedeniyle Python bu kapanı¸s tırna˘gını sanki yokmu¸s gibi varsayacak ve bize hata mesajı gösterecektir... Bunun olmasını engellemek için, “\” i¸saretini çiftlememiz gerekiyor:

>>> print("demirba¸s kaçı¸s dizisi: \\")

demirbas kaçı¸s dizisi: \

Bir de ¸su örne˘ge bakalım:

>>> print("Ö˘grendi˘gimiz karakter dizileri ¸sunlardır: \, \\n, \\t")

¸

Simdiye kadar ö˘grendi˘gimiz karakter dizileri ¸sunlardır: \, \n, \t

Burada “\” kaçı¸s dizisini çiftlememize gerek kalmadı˘gına dikkat edin. Çünkü bu i¸saretten hemen sonra gelen virgül i¸sareti Python açısından özel anlam ta¸sıyan bir karakter de˘gildir.

Bu yüzden yukarıdaki karakter dizisinin ekrana basılmasında herhangi bir sorunla kar¸sıla¸ smıy-oruz. Ama “\” i¸saretini yukarıdaki örnekte en sona yerle¸stiremeyece˘gimize dikkat edin:

>>> print("Ö˘grendi˘gimiz karakter dizileri ¸sunlardır: \\n, \\t, \")

SyntaxError: EOL while scanning string literal

Bu hatayı almamızın nedeni, “\” i¸saretini en sona koydu˘gumuzda bu i¸saretin, karakter dizisini kapatan tırnak i¸saretleriyle çakı¸smasıdır... Yukarıda verdi˘gimiz print(“demirba¸s kaçı¸s dizisi:

\.”) örne˘ginde “\” i¸saretinden sonra bir “nokta” getirerek sorundan kaçtı˘gımıza dikkat edin...

Burada nokta koymak yerine bo¸sluk karakteri de koyabilirdik:

>>> print("demirba¸s kaçı¸s dizisi: \ ") demirba¸s kaçı¸s dizisi: \

Sözün özü, “\” i¸saretini tek ba¸sına kullandı˘gımızda sa˘gındaki karakterle çakı¸sma riski varsa, çözüm olarak “\” i¸saretini çiftleme yoluna gidiyoruz.

“\v”

E˘ger “\” i¸saretini “v” harfiyle birlikte kullanırsak “dü¸sey sekme” denen ¸seyi elde ederiz. Hemen bir örnek verelim:

>>> print("dü¸sey\vsekme")

dü¸sey sekme

Yalnız bu “\v” adlı kaçı¸s dizisi her i¸sletim sisteminde çalı¸smayabilir... Dolayısıyla, birden fazla platform üzerinde çalı¸smak üzere tasarladı˘gınız programlarınızda bu kaçı¸s dizisini kullanmanızı önermem.

“\b”

“\” kaçı¸s dizisinin, biraraya geldi˘ginde özel bir anlam kazandı˘gı bir ba¸ska harf de “b”dir... “\b”

kaçı¸s dizisini karakter dizisi biçimlendirme bölümünde bir örnek içinde kullanmı¸stık. Örne˘gimiz

¸

söyleydi:

>>> lider = input("¸Sampiyonun ismini giriniz: ")

>>> print("Bu senenin ¸sampiyonu", lider, "\b.", "Tebrikler.")

Burada “\b” adlı kaçı¸s dizisi, kendisinden önceki bir karakteri silme görevini üstleniyor. Bu örnekte “lider” de˘gi¸skeni ekrana yazdırılırken kendisinden sonra bir adet bo¸sluk karakteri ola-caktır çıktıda... ˙I¸ste “\b” kaçı¸s dizisi bu bo¸sluk karakterini siliyor. “\b” kaçı¸s dizisinin görevi klavyedeki “backspace” tu¸suyla aynıdır...

“\b” kaçı¸s dizisini bir örnekte daha görelim:

>>> print("merhaba\b")

Ne oldu? Bu karakter dizisi hiç bir ¸seyi de˘gi¸stirmedi, de˘gil mi? Çok normal. Çünkü bu kaçı¸s dizisi biraz kaprislidir. “\b” adlı kaçı¸s dizisi, çalı¸sabilmek için kendisinden sonra da en az bir karakter olmasını ister. Dolayısıyla yukarıdaki örnekte “\b” kaçı¸s dizisi görevini yerine getir-miyor, ama ¸su örnekte bu kaçı¸s dizisi görevini eksiksiz olarak yerine getirecektir:

>>> print("merhaba\b dünya")

merhab dünya

Burada “\b” kaçı¸s dizisinden sonra bo¸sluk karakteri var. Bu yüzden bu kaçı¸s dizisi böyle bir ortamda görevini yerine getirebiliyor. E˘ger sadece “print(“merhaba”)” yazıp “merhab” çıktısını elde etmek isterseniz ¸söyle bir hileye ba¸svurabilirsiniz:

>>> print("merhaba\b ")

merhab

Burada gördü˘günüz gibi, “\b” kaçı¸s dizisinden sonra bir bo¸sluk bırakarak kandırmaca yoluna gittik...

Bu kaçı¸s dizisini art arda yazarak tuhaf ¸seyler de yapabilirsiniz...

>>> print("merhaba\b\b ")

merha a

Burada “\b\b” kaçı¸s dizilerinin yaptı˘gı ¸sey, sola do˘gru iki karakter atlayıp, ula¸stı˘gı noktaya bir adet bo¸sluk karakteri yerle¸stirmektir. ¸Su örnekte durum biraz daha açık görünecektir:

>>> print("merhaba\b\bf")

merhafa

Yani bu karakter dizisini kullanarak ¸söyle saçma bir ¸sey de yapabilirsiniz:

>>> print("merhaba\b\b\b\b\b\b\bgülegüle")

gülegüle

Bu kodları ¸söyle yazarak biraz beyin jimnasti˘gi yapmak isteyebilirsiniz:

>>> print("merhaba{0}{1}".format("\b"*len(’merhaba’), "gülegüle"))

gülegüle

Gördü˘günüz gibi, bu karakter dizisi rahatlıkla suyu çıkarılabilecek bir araçtır...

“\r”

“\” i¸saretini birarada kullanaca˘gımız ba¸ska bir harfimiz ise “r” harfidir...

“\r” kaçı¸s dizisi, bir karakter dizisinin en ba¸sına gelmemizi sa˘glar. Mesela bu karakter dizisini kullanarak “tank” kelimesini “bank”a çevirebiliriz!

>>> print("tank\rb")

bank

“\a”

“\” kaçı¸s dizisini son olarak “a” harfi ile birlikte kullanaca˘gız. “\a” kaçı¸s dizisi bilgisayarımızın

“bip” sesi çıkarmasını sa˘glar:

>>> print("\a")

==bip!==

Tıpkı “\v” kaçı¸s dizisi gibi, bu kaçı¸s dizisi de her i¸sletim sisteminde çalı¸smayabilir. Örne˘gin bu kaçı¸s dizisinin GNU/Linux’ta çalı¸saca˘gının garantisi yoktur...

“r”

Bu karakter dizisi kimi durumlarda oldukça faydalı olabilecek bir araçtır. Diyelim ki bilgisa-yarımızda tam yolu “C:\test\rehber.txt” olan bir dosya var. Bu dosyanın tam yolunu print() fonksiyonu yardımıyla ekrana yazdırmak istersek ¸söyle bir çıktı alırız:

>>> print("C:\test\rehber.txt")

ehber.txtst

Burada olan ¸sey ¸su: Python, “C:\test\rehber.txt” içindeki “\t” ve “\r” ifadelerini birer kaçı¸s dizisi olarak algıladı. Dolayısıyla “C:”den sonra sanki sekme tu¸suna basılmı¸s gibi davrandıktan sonra,

“\r” kaçı¸s dizisi zannetti˘gi ¸seyin etkisiyle de karakter dizisinin ba¸sına dönüp “ehber.txt” kısmını oraya yapı¸stırdı... Bu örnek, Python’daki kaçı¸s dizilerini kullanmasak bile onları en azından tanımamız gerekti˘gini açık seçik gösteriyor. ˙I¸ste bu tür sürprizleri engellemek için “r” adlı kaçı¸s dizisinden yararlanaca˘gız. Bunun, daha önce gördü˘gümüz “\r” kaçı¸s dizisinden farklı oldu˘guna dikkat edin:

>>> print(r"C:\test\rehber.txt")

C:\test\rehber.txt

Gördü˘günüz gibi, “r” kaçı¸s dizisinin kullanım yeri öteki kaçı¸s dizilerine göre farklılık gösteriyor.

Bu kaçı¸s dizisini karakter dizisinin içinde de˘gil, dı¸sında kullanıyoruz. Bu kaçı¸s dizisinin görevi, karakter dizisi içinde geçen bütün kaçı¸s dizilerini etkisiz hale getirmektir... Dolayısıyla daha önce verdi˘gimiz ¸su örne˘gi:

>>> print("Ö˘grendi˘gimiz karakter dizileri ¸sunlardır: \\n, \\t, \\")

...¸söyle de yazabiliriz...

>>> print(r"Ö˘grendi˘gimiz karakter dizileri ¸sunlardır: \n, \t")

Burada kullandı˘gımız “r” kaçı¸s dizisi, karakter dizisi içindeki bütün kaçı¸s dizilerini etkisiz hale getirdi˘gi için, bizim cümle içinde geçen karakter dizilerini çiftlememize gerek kalmadı.

Ancak “r” adlı karakter dizisi “\” kaçı¸s dizisini etkisizle¸stiremez. Dolayısıyla ¸söyle bir yazım, hata almamıza yol açacaktır:

>>> print(r"Ö˘grendi˘gimiz karakter dizileri ¸sunlardır: \n, \t, \\, \")

Bu durumdan kurtulmanın tek yolu, en sona bir bo¸sluk karakteri yerle¸stirmektir:

>>> print(r"Ö˘grendi˘gimiz karakter dizileri ¸sunlardır: \n, \t, \\, \ ")

Böylece Python’daki kaçı¸s dizilerini gözden geçirmi¸s olduk. Gelin isterseniz kaçı¸s dizilerine

¸

söyle topluca bir göz atalım:

\n Yeni satır olu¸sturur.

\’ Tek tırnak içine aldı˘gımız karakter dizilerinde tek tırnak kullanmamızı sa˘glar.

\” Çift tırnak içine aldı˘gımız karakter dizilerinde çift tırnak kullanmamızı sa˘glar.

\a Sistemimizin “bip” sesi çıkarmasını sa˘glar (Her platformda çalı¸smaz).

\b Kendisinden önce gelen karakteri siler.

\r Karakter dizisinin en ba¸sına dönülmesini sa˘glar.

\t Karakter dizisi içinde sekme olu¸sturur.

\v Dü¸sey sekme olu¸sturur (Her platformda çalı¸smaz).

\\ Herhangi bir kaçı¸s dizisini etkisiz hale getirir.

r Karakter dizisi içinde geçen bütün kaçı¸s dizilerini etkisiz hale getirir.

BÖLÜM

10

Fonksiyonlar

Bir önceki bölümün tamamlanmasıyla birlikte Python’da “Temel Bilgiler” olarak adlandırabile-ce˘gimiz konuları bitirmi¸s olduk. Böylelikle artık Python programlama dilini “temel düzeyde”

bildi˘gimizi rahatlıkla iddia edebiliriz...

Bu bölümden itibaren Python’un derinliklerine do˘gru yolculu˘gumuza ba¸slayaca˘gız. Bu yolcu-luktaki ilk dura˘gımız “Python’da Fonksiyonlar” olacak... Peki nedir bu “fonksiyon” denen ¸sey?

En basit tanımıyla fonksiyon, birbiriyle ili¸skili deyimleri, kod parçalarını bir araya toplamamızı sa˘glayan bir “kod blo˘gu”dur. Python’daki fonksiyonlar bize i¸slerimizi otomatikle¸stirme imkanı sa˘glar. Fonksiyonların bu otomatikle¸stirme i¸sini nasıl yerine getirdi˘gini bu bölümde inceleye-ce˘giz. Bu bölümü bitirip fonksiyonlar konusunu ö˘grendi˘gimizde, Python’da ileriye do˘gru çok önemli ve büyük bir adım atmı¸s, deyim yerindeyse “level atlamı¸s” olaca˘gız...

Aslında fonksiyon bizim yabancısı oldu˘gumuz bir kavram de˘gil. ¸Simdiye kadar Python’da pek çok fonksiyon gördük ve kullandık. Örne˘gin, print() komutunun bir fonksiyon oldu˘gunu ta en ba¸sta söylemi¸stik... Aynı ¸sekilde, daha önceki derslerimizde gördü˘gümüz ve i¸slerimizi bir hayli kolayla¸stırmı¸s olan range(), len(), round(), str(), int(), list(), dict(), tuple() vb. de birer fonksiyondur. ˙I¸ste ¸simdi biz de bu bölümde buna benzer fonksiyonları nasıl olu¸ s-turabilece˘gimizi ö˘grenece˘giz... O halde isterseniz lafı daha fazla uzatmadan i¸se koyulalım...