Python Programlama Dili

Bölüm 1

Başlangıç Bilgileri

Top Navigasyon

Ders 3

1.10 - Literaller

Literaller, henüz hiçbir program öğesine bağlanmamış verilerdir. Literaller tipik olarak, klavyeden değer olarak girilirler, veya bir dosyadan okunurlar. Python veri tiplerinin en uygun olarak tanıtılması, literallerinin incelenmesidir.

1.10.1 - Sayısal Literaller

Python sayısal tipleri üç tanedir. Bunlar tamsayılar (integers), ondalıklı sayılar (floats) ve sanal sayılar (imaginary numbers) dan oluşurlar. Kompleks sayılar, bir tamsayı ile bir sanal sayının toplama işleminin sonucunda oluşurlar.

1.10.1.1 - Tamsayı Literalleri

Pyton tamsayı literalleri, on tabanlı sayılar (decimal) (varsayılan sayı temeli), sekiz tabanlı sayılar (octal), onaltı tabanlı sayılar (hex) ve iki tabanlı sayılardan (binary) oluşabilirler.

Python 3.4 dokümantasyonunda tamsayı literaller için verilen EBNF formülasyonu aşağıda görülmektedir:

integer        ::=  decimalinteger | octinteger | hexinteger | bininteger
decimalinteger ::= nonzerodigit digit* | "0"+
nonzerodigit ::= "1"..."9"
digit ::= "0"..."9"
octinteger ::= "0" ("o" | "O") octdigit+
hexinteger ::= "0" ("x" | "X") hexdigit+
bininteger ::= "0" ("b" | "B") bindigit+
octdigit ::= "0"..."7"
hexdigit ::= digit | "a"..."f" | "A"..."F"
bindigit ::= "0" | "1"

Tamsayı değerleri için bir üst sınır yoktur. Bu değerler, makinenin kullanılabilir belleğinin alabileceği kadar büyük olabilir.

Sıfırdan farklı on tabanlı tamsayılar sıfır ile başlayamazlar. Bu kısıt, Python 3 den önce kullanılan C-stili sekiz tabanlı sayılardan farklı olmaları için, konulmuştur. Bu nedenle, 077 geçersiz bir tamsayı literalidir, doğrusu 77 dir.

Varsayılan sayı sistemi olan on tabanlı sayı literalleri 1..9 arası bir sayı ile başlarlar, bu başlangıç sayıları, (ya 0..9 arası sayılardan istendiği kadar kullanılarak veya hiç ikinci sayı kullanmadan) veya en az bir sıfır kullanıp istendiği kadar sıfır eklenerek) devam eder.

Geçerli sayılar, 123, 47397, 16, 12000 vb... olabilir.

Sekiz tabanlı (oktal) sayılar, Önce bir 0 sayısı ile başlar, sonra bir küçük o veya büyük O oktal sayı öneki ile devam eder sonra, en az bir 0..7 arası oktal sayı belirtilir ve istendiği kadar oktal sayı eklenebilir.

Geçerli literaller 0o34, 0O4573296 vb... olabilir.

Hex ve binary sayı literalleri de aynı oktal sayı literalleri gibi oluşturulurlar. Bazı geçerli değerler,

0xFFFF, 0X12CC, 0xfcde, 0x0000, 0b10001, 0B101010 olabilir.

1.10.1.2 - Ondalıklı Sayı Literalleri

Ondalıklı sayı literalleri, aşağıda görüldüğü gibi tanımlanmışlardır.

floatnumber   ::=  pointfloat | exponentfloat
pointfloat ::= [intpart] fraction | intpart "."
exponentfloat ::= (intpart | pointfloat) exponent
intpart ::= digit+
fraction ::= "." digit+
exponent ::= ("e" | "E") ["+" | "-"] digit+

Artık nasıl okunduğunu bildiğimiz için sadece geçerli örnekler yapmamız yeterli olacaktır.

Geçerli örnekler,23.e-35, 04.78E8, 0.12, 0.0005 vb... olabilir.

Ondalıklı sayılarda başa 0 sayısı konulması yasaldır. Bu nedenle 04.78E8 geçerli bir ondalıklı literaldir ve değeri 4.78E8 dir.

Ondalıklı literallerde sayılar işaret içermezler, -10 gibi bir sayı aslında bir ifadedir (expression) ve bir sayının tekli eksi işlemci ile işlem yapacağını belirtir. Örnek olarak 23.e-35 değeri aslında yasal olmasına karşın, bu değerin, alışılmış şekli ile 23.0e-35 olarak ifade edilmesi daha doğrudur. S.I (Systeme International d'Unités) bunun 2.3 X e-34 olarak belirtilmesini öngörür. Python eşdeğeri 2.3e-34 dür ve Python derleyicisi de bu literali böyle algılar. Aslında bu bir ifadedir ve 2.3 * (1.0 / 1.0e34) ifadesinin sonucudur. İfadede hiçbir sayısal değerin işaret taşımadığına dikkat ediniz. İfadeleri kısa süre sonra daha detaylı olarak inceleyeceğiz.

Ondalıkl sayılarda üst sınır, sadece yerleşik python derleyicisinin kapasitesine bağlı olarak tanımlanmıştır. Python derleyicileri çok büyük ondalıklı değerleri tanıyabilmekte bu da matematik çalışmalarında, python programlama diline büyük avantaj sağlamaktadır. Örnek olarak 5.6e5700 gibi Java ve başka programlama dillerinin sınırlarının çok dışındaki değerler ile Python derleyicisinde sorunsuzca işlem yapmak olanağı sağlanabilmektedir.

1.10.1.3 - Sanal (Imaginary) Sayı Literalleri

Sanal sayılar j veya J soneki ile belirtilir. Genel yöntem,

sanalsayı::= (ondalıklı_sayı_kısmı | tamsayı_kısmı) ("j" | "J")
      

şeklindedir. Geçerli sanal sayı literalleri, 10J , 21.7j, 3.0j, .16j, 1e7J gibi değerlerdir.

Kompleks sayıların oluşturulması için, ondalıklı bir sayı ile sanal bir sayının toplanması gerekir. Örnek olarak 3.0 + 4j gibi kompleks sayılar oluşturulabilir.

1.10.2 - Sözel Literaller

Sözel literaller, Byte veya String veri tiplerine ait literaller olabilirler. Byte ve String tipi literller birbirlerinin aynıdır. Byte veri tipi sadece ASCII karakterlerden oluşur.

Sözel literallerin EBNF kuralları:

stringliteral   ::=  [stringprefix](shortstring | longstring)
stringprefix ::= "r" | "u" | "R" | "U"
shortstring ::= "'" shortstringitem* "'" | '"'
shortstringitem* '"'
longstring ::= "'''" longstringitem* "'''" | '"""' longstringitem* '"""'
shortstringitem ::= shortstringchar | stringescapeseq
longstringitem ::= longstringchar | stringescapeseq
shortstringchar ::= <any source character except "\" or newline or the quote>
longstringchar ::= <any source character except "\">
stringescapeseq ::= "\" <any source character>
bytesliteral   ::=  bytesprefix(shortbytes | longbytes)
bytesprefix ::= "b" | "B" | "br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB"
shortbytes ::= "'" shortbytesitem* "'" | '"' shortbytesitem* '"'
longbytes ::= "'''" longbytesitem* "'''" | '"""' longbytesitem* '"""'
shortbytesitem ::= shortbyteschar | bytesescapeseq
longbytesitem ::= longbyteschar | bytesescapeseq
shortbyteschar ::= <any ASCII character except "\" or newline or the quote>
longbyteschar ::= <any ASCII character except "\">
bytesescapeseq ::= "\" <any ASCII character>

Sözcüklerle anlatılmak istenirse, sözel literaller bir takım öneklerle başyabilirler. Bu öneklerden B, b (Byte), r, R (Regexp = Regular Expressions =Düzenli Deyimler), u, U (Unicode) anlamındadır. Bu gibi özellikleri olmayan sözel verilerde önek kullanılmaz.

Sözel veriler, tek ('), çift(") ve üçlü (""") tırnak işaretleri arasında belirtilirler. Örnek olarak 'Ali' "Bahçekapı", """Ilgaz Dağı"""

Bu sınır işaretleri arasına ters şlaş (\) veya satırbaşı karakteri ile,

giremez. Bu karakterlere gerek varsa, bunların Python derleyicisinden saklanması gerekir. Saklama (kaçırma) (Kaçış) karakteri, ters slaş (\) karakteridir.

Örnek olarak, 'Haydarpaşa Limanı ("Müdürlük")' veya, 'Haydarpaşa Limanı ("""Müdürlük""")' yazılabilir. Fakat, 'Haydarpaşa Limanı('Müdürlük')' yazamayız, tek tırnağın, kaçırılması (escaped) yani 'Haydarpaşa Limanı (\'Müdürlük\'') şeklinde yazılması gerekir.

Kaçış karakterlerinin değişik işlevleri vardır.

Escape Sequence Meaning Notes
\newline Backslash and newline ignored  
\\ Backslash (\)  
\' Single quote (>>')  
\" Double quote (")  
\a ASCII Bell (BEL)  
\b ASCII Backspace (BS)  
\f ASCII Formfeed (FF)  
\n ASCII Linefeed (LF)  
\r ASCII Carriage Return (CR)  
\t ASCII Horizontal Tab (TAB)  
\v ASCII Vertical Tab (VT)  
\ooo Character with octal value ooo (1,3)
\xhh Character with hex value hh (2,3)

Sadece string literallerde tanımlı kaçış sekansları:

Escape Sequence Meaning Notes
\N{name} Character named name in the Unicode database (4)
\uxxxx Character with 16-bit hex value xxxx (5)
\Uxxxxxxxx Character with 32-bit hex value xxxxxxxx (6)

Notlar:

  1. Aynen standart C gibi üç oktal rakkam kabul edilir

  2. Standart C den faklı olarak, tam olarak iki hex rakkam gereklidir.

  3. Byte literallerinde, hex ve oktal kaçış karakterleri verilen değerde byte karakterlerini, karakter katarı (string) literallerde ise, verilen değerde unicode karakterlerini belirtir.

  4. Sürüm 3.3: İsim eşdeğerleri ( Unicode Name Aliases) desteği sağlanmıştır.

  5. Bazı suret (surrogate) kod kısımları içeren Unicode karakter kodları bu kaçış sekansı ile kullanılabilir. Tam olarak dört hex rakkamı gereklidir.

  6. Tüm Unicode değerleri bu yöntem ile kodlanabilir. Tam olarak sekiz hex rakkamı gereklidir.

Standart C den farklı olarak, tüm sözel verilerde ters slaş ile tanımlanmış olan tüm kaçış sekanslar sözel veri içinde bırakılabilir. String veriler için tanımlanmış kaçış sekansları, Byte veri türü için tanımsızdır.

Örnek olarak, r"\"" geçerli bir string literal iken, r"\" geçerli değildir. Çünkü, hiçbir sözel literal, tek sayıda kaçış karakteri ile bitemez. Bunun nedeni ters slaş karakterinin bir sonraki karakteri saklamasıdır. Ayrıca, bir terş slaş yazıp ardından klavyeden satırbaşı karakteri girip, sözel literalin bir kısmının alt satıra alınması, Python derleyicisince gözönüne alınmaz. Alt satıra geçmek için mutlaka '\n' şeklinde, açıkca bir alt satıra geçiş kaçış sekansı gereklidir.

Bazı örnekler yapalım. İlk örnek normal bir string (karakter katarı) örneği,

"Haydarpaşa Limanı"

Bu örnek tek satır üzerinde, arada boşluk var ve Türkçe karakter içeriyor. Bunların hepsi yasal ve bu geçerli bir sözel veri (string sözcüğü eşdeğeri olarak artık sözel veri deyimini kullanacağız. Byte cinsinden literaller zaten byte olarak belirtiliyor).

Eğer, bu sözel literalinin son harfini klavyemizde bulamazsak, Unicode eşdeğerini de kullanabiliriz. Unicode karakter giriş noktası (entry point = karakter kodu) = 0131 (Hex). Eşdeğer sözel literal:

'Haydarpaşa Liman\u0131'

Türkçe karakter klavyesi bulunmadığı zaman, Unicode eşdeğerleri girilebilir. Türkçe karakterlerin Unicode karşılıkları, charset.org adresinden bulunabilir.

Bir başka örnek,

'Haydarpaşa\nLimanı'

Python derleyicisi bu sözel literali,

Haydarpaşa
Limanı
    

olarak algılayacaktır.

Sözel literalleri kullanırken, sözel veri içinde tek büyük parantez {} kullanılmaması olacaktır. Python derleyicisi, bu tek parantezi, biçimlendirme olarak algıyacaktır. Eğer gerçekten büyük paranteze gerek varsa, bu durumda içiçe çift büyük parantez {{}} kullanılmalıdır. Örnek olarak,

'Aile Üyeleri {{Eş:Tüzel Varol, Çocuk:Melisa Varol'}}'
    

yazıldığında, Python derleyicisi bunu,

'Aile Üyeleri {Eş:Tüzel Varol, Çocuk:Melisa Varol'}'
    

olarak algılayacaktır.

Normal olarak, sözel veriler satır atlamazlar. Fakat, eğer sözel veriler üç tırnak (""" veya ''') içinde belirtilmişse, kaçış sekansına gerek kalmadan satır atlatılabilir veya veri içinde "" '' kullanılabilir. Örnek olarak,

"""
Baba Adı : Tufan Özgür
Ana Adı : Hatice Özgür
Çocuklar : Nisa Özgür "En Büyük Çocuk"
: Ziya Özgür
"""

yasal bir sözel literaldir.

Python programlama dili, sözel verilerin işlenmesi için çok sayıda öntanımlı fonksiyon içermektedir. Bunları kısa süre sonra uygulayacağız.

1.10.3 - Liste Tipi Literaller (Lists)

Liste tipi literaller, Python programlama dilinin üstünlüğü olarak kullanıma sunulan, dizilere benzer bileşik (kompozit) veri gruplarından biridir. Listeler, istenilen uzunlukta olabilen, istenilen tipte veri içerebilen, verilerin birbirlerinden virgül ile ayrıldığı, köşeli parantez içinde belirtilen liste (List) tipi verilerdir. Örnek,

[56,128,'Çarşıkapı',128]
    

Yukarıdaki örnekte görüldüğü gibi, liste elemanları her veri tipinde olabilir ve bazı elemanlar birbirinin aynı olabilir. Liste tipi verilere eleman eklenip çıkarılabilir. Yani, liste tipi parçalanabilir (mutable) bir veri tipidir. Liste tipi verilere eleman eklenmesi, cıkarılması listelerden alt listeler yaratılması için hazır fonksiyonlar ve bildirimler bulunmaktadır. Bunları ileride inceleyeceğiz.

1.10.4 - Topluluk Tipi Literaller (Tuples)

Topluluk tipi literaller, Python programlama dilinin topluluk (tuples) veri tipinde verilerdir. Topluluk tipi aynen liste tipine benzer, fakat değiştirilemez (immutable) türde bir veri tipidir. Topluluk litteralleri, parantez içinde belirtilir. Örnek,

(108,25.6,'Beyazıt',108)
    

Yukarıdaki örnekte görüldüğü gibi, topluluk veri tipi, liste veri tipine çok benzer fakat sonradan değiştirilemez. Topluluk tipinin uygulamalarını ileride inceleyeceğiz.

1.10.5 - Sözlük Tipi Literaller (Dictionaries)

Sözlük (dictionary) veri tipi, JavaScriptteki ilişkisel diziler (associative arrays) lere benzerler. Sözlük literalleri büyük parantezler arasında verilen, anahtar:veri ... sekanslarıdır. Örnek,

{'Oyun1':'Romeo ve Juliet,'Oyun2':'Julius Caesar','Oyun3:'Hamlet')
    

Sözlük veri tipi değiştirilebilir (mutable) bir veri tipidir. Sözlük tipinin uygulamalarını ileride inceleyeceğiz.

1.10.6 - Küme Tipi Literaller (Sets)

Küme veri tipi, Python gibi genel amaçlı programlama dillerinde çok az bulunan bir veri tipidir. Python küme tipi, tam olarak matematikteki kümeler gibi hareket eder. Üyeler sonsuz sayıda olabilir, yerleşim belirli bir kurala bağlı değildir ve bir kümede birbirinin aynı iki eleman olamaz. Örnek,

set([23,69,87,23]);
    

şeklinde tanıtılmış olan bir küme literali, Python derleyicisi tarafından,

{23,69,87}
    

olarak algılanacaktır. Bu şekilde, Pythpon küme veri tipi, Python derleyicisine göre, bir tür, değer bileşeni olmayan ve sadece anahtar kısımlarını içeren bir sözlük tipi olarak algılandığı düşünülebilir.

Python küme verileri değiştirilebilir (mutable) veri tiplerindedir. Yani bir küme, tanımlandıktan sonra elemanları eklenebilir, çıkarılabilir veya tanımlı bir kümeden yenialt kümeler oluşturulabilir.

Python programlama dilinde değiştirilebilir nitelikte olan kümeler yanında değiştirilemez nitelikte olan donmuş kümeler (frozensets) veri tipi de bulunmaktadır. Bu veri tiplerinin uygulamalarını ileride yapacağız.

1.10.7 - Mantıksal Literaller (Boolean)

Python matıksal değer literalleri, True veya False değerleridir. Bunların yanında, 1 ve 0 Python Boolean değerlerini doğru ve yanlış olarak belirtirler. Ayrıca, boş liste([]) gibi boş değerler, None değeri yanlış (False) olarak değerlendirilirler. Diğer tüm değerler doğru (True) olarak değerlendirilir.

İlişkisel işlemciler, mantıksal değerleri (doğru veya yanlış) geri döndürürler.