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...