Değişkenler, değerleri saklamak için ayrılmış bellek konumlarıdır. Bir değişken oluşturduğunuzda hafızada yer ayırmanız anlamına gelir. Bir değişken değer türüne bağlı olarak belleğe yerleştirilir ve bellekten okunurken değişkenin değer türüne bağlı okuma yapılır. Bu nedenle, değişkenlere farklı veri türleri atayarak, bu değişkenlere tamsayı, ondalık veya karakter kaydedebilirsiniz. Bu bölüm, değişken kavramına ve Python değişken tiplerine ayrılmıştır.
3.1. Değişken tanımlama ve değer atama
Python değişkenleri, bellek alanını ayırmak için açık bildirime gerek duymaz. Başka bir deyişle C, C# ve Java dillerinde olduğu gibi değişkenin tipini önceden tanımlamaya gerek yoktur. Bu açıdan Javascript ve PHP dillerindeki tanımlamaya benzerdir. Bu konu öğrenciler tarafından değişken tipi yokmuş gibi algılanmaktadır!!! Bu kesinlikle yanlıştır. Değer tipi belirleme programlama dili yorumlaması sırasında atanan ilk değere göre belirlenir. Başka bir deyişle tip belirleme atama işlemi olduğunda otomatik olarak belirlenir. Değer atamak için çoğu programlama dilindeki gibi eşittir (=) işareti kullanılır. Örneğin,
1 2 3 4 5 6 |
sayac = 100 # Tamsayı atama (int) km = 1000.0 # Virgüllü sayı atama (float) ad = "Çorlu" # Katar (String) print(sayac) print(km) print(ad) |
Çıktısı:
1 2 3 |
100 1000.0 Çorlu |
Bir değişken tanımlayıp bir değer atadığımızda arka planda işletim sistemi tarafından belirlenen bellek adresleri uygulamamıza tahsis edilir. Bellek büyüklüğü tanımlanan veri türünün boyutu ile alakalıdır.
Örnekte, sayac değişkeni 2000 adresten başlayıp 32 bitlik yer kaplar. Başka bir deyişle 4 byte’lık yer kaplamıştır. Bu 32 bitlik yer içinde 100 sayısı tutulmaktadır. Biz sayı değişkenini çağırdığımızda 2000 adrese gidilip 32 bitlik okuma yapılır ve karşımıza bellekteki sayı çıkar. (Bu arada, 2000 adresi benim tarafımdan rastgele seçilmiş bir adrestir. Bu adres işletim sistemi tarafından belirlenir, tüm bilgisayarlarda farklı sonuçlar karşımıza çıkar. Kısacası dinamik bir işlemdir.) Python’da bir değişkenin hangi veri tipinde saklandığı bulmak type(değişken tipi) metodu kullanılır.
3.2. Çoklu atama
Python, aynı anda birden fazla değişkene tek bir değer atamanıza izin verir. Örneğin,
1 |
a = b = c = 1 |
Burada, 1 değeriyle bir tamsayı nesnesi oluşturulur ve üç değişkenin tümü aynı bellek konumuna atanır. Birden çok değişkene birden çok nesne atayabilirsiniz. Örneğin,
1 |
d, e, f = 1, 2, "Çorlu" |
Burada, 1 ve 2 değerlerine sahip iki tamsayı nesnesi, sırasıyla a ve b değişkenlerine atanır ve “Çorlu” değerine sahip bir dize nesnesi, değişken c’ye atanır. Değerleri görüntüleyecek olursak,
1 2 3 4 5 6 |
print(a) print(b) print(c) print(d) print(e) print(f) |
1 2 3 4 5 6 |
1 1 1 10 20 Çorlu |
Şimdi bu değişkenlerin bellek adreslerine bakalım. Bunun için id(değişken adı) fonksiyonu kullanacağız.
1 2 3 4 5 6 |
print(id(a)) print(id(b)) print(id(c)) print(id(d)) print(id(e)) print(id(f)) |
1 2 3 4 5 6 |
1907410672 1907410672 1907410672 1907410960 1907411280 2890668904736 |
Çıktı olarak a, b, c değişkenleri aynı bellek adresini kullandıklarını görülür. Burası değişken konusunun en önemli kısımlarından biridir. Nesneye yönelik dillerde değer tabanlı atama ve adres tabanlı atama olmak üzere iki konu vardır. Adres tabanlı bir atama yapılınca iki değişken biri değişse de diğer değişkende etkilenir. Aslında değişiklik yapılan adres aynıdır. Özellikle nesne yönelimli programlama bölümünde bu konu biraz daha ayrıntılı bir şekilde anlatılacaktır. Diğer taraftan değer tabanlı atamada değişkenler farklı bellek bölgelerini işaret ettiği için değişken üzerinde yapılan değişiklikler birbirinden etkilenmez.
3.3. Standart veri tipleri
Bellekte saklanan veriler birçok türde olabilir. Örneğin, bir kişinin yaşı sayısal bir değer olarak saklanır ve onun adresi karakter katarı olarak saklanır. Python’un beş standart veri türü vardır.
- Sayılar (Numbers)
- Katar (String)
- Liste (List)
- Tuple
- Dictionary
Bu bölümde veri tipleri hakkında genel bilgi verilecektir. Veri tipleri üzerine olan metotlar ileri bölümlerde anlatılacaktır.
3.3.1. Sayılar
Sayı veri türleri sayısal değerleri saklar. Değişkene ilk değer atandığında nesne oluşur. Bu aşamada uygun sayı veri tipi tespit edilir ve nesne oluşturulur.
1 2 3 |
sayi_1 = 10 sayi_2 = 20 sayi_3 = 30 |
Nesne olduğu için çalışma anında bellekten silinebilir. Bu işlem için, del ifadesi kullanılır. Örneğin,
1 2 |
del var_1 del var_2, var_3 |
Belleği daha etkin kullanımı için gereksiz değişkenlerinizi del komutu silebilirsiniz. Python 4 farklı veri tipini destekler.
- int (signed integers): 100
- float (floating point real values): 100.232
- complex (karmaşık sayılar): 3.14j
3.3.2. Katarlar (Strings)
Python’daki katarlar, tırnak işaretlerinde temsil edilen bitişik bir karakter kümesi olarak tanımlanır. Python, tek veya çift tırnak çiftlerine izin verir. Artı (+) işareti, katar birleştirme yaparken yıldız işareti (*) tekrarlama sağlar.
C# ve Java gibi dillerde alt katarları bulmak için SubString gibi metotlar kullanılır. Örneğin üçüncü karakterden başla 4 karakter okuyup bir katar çıktısı elde etmek için bu tür metotlar kullanılabilir. Python, alt küme ulaşımı çok daha kolaylaştırmaktadır. [] ve [:] işleçleri kullanılarak alt katarlara ulaşılabilinir. Örnekler,
1 2 3 4 5 6 7 8 |
str = 'Merhaba Python!' print(str) # Tüm katarı yazar print(str[0]) # İlk karakteri yazar print(str[2:5]) # 3 ile 5. karakter arasını yazar. print(str[2:]) # 3. karakterden başlayarak son karaktere kadar yazar. print(str * 2) # 2 kere yazar print(str + " yeni string") # Birleştirme işlemi yapar |
Çıktı:
1 2 3 4 5 6 |
Merhaba Python! M rha rhaba Python! Merhaba Python!Merhaba Python! Merhaba Python! yeni string |
(+) karakteri toplama ve (*) karakteri çarpma işlemi için kullanılır. Programlama dillerinde bu karakterlere veri tipine göre işlevler kazandırılmıştır. (Örneğin string veri tipinde birleştirme, int veya float görürse toplama) Hatta C# bu tür karakterlere yeni işlevler kazandırmayı görmüştük (Operator Overloading).
3.3.3. Listeler (Lists)
Listeler, Python’un bileşik veri tipidir. Bir liste, virgülle ayrılmış ve köşeli parantez ([]) içine alınmış öğeler içerir. Aslında listeler birçok programlama dilinde gördüğümüz diziler (arrays) benzerdir. Fakat, Python daha esnek bir yapı sunar. Şöyle ki, bir liste içine birden farklı veri tipi tanımlayabilirsiniz.
Listede saklanan değerlere, listenin başlangıcında 0’dan başlayan ve -1’in sonuna kadar gider. ([] ve [:]) işleçleri kullanılarak erişilebilir. Artı (+) işareti liste birleştirme ve yıldız işareti (*) tekrarlama işlevi olur. Örneğin,
1 2 3 4 5 6 7 8 |
list1 = [ 'abcd', 786 , 2.23, 'Çorlu', 70.2 ] list2 = [123, 'Merhaba'] print(list1) # Tüm listeyi yazar print(list1[0]) # İlk öğeyi yazar print(list1[1:3]) # 2. öğe ile 3. öğeyi yazar print(list1[2:]) # 3. öğeden sonrasını yazar print(list2 * 2) # İki kere yazar print(list1 + list2) # İki listeyi birleştirir |
1 2 3 4 5 6 |
['abcd', 786, 2.23, 'Çorlu', 70.2] abcd [786, 2.23] [2.23, 'Çorlu', 70.2] [123, 'Merhaba', 123, 'Merhaba'] ['abcd', 786, 2.23, 'Çorlu', 70.2, 123, 'Merhaba'] |
3.3.4. Tuples
Bir tuple, listeye benzer bir veri türüdür. Bir tuple, virgülle ayrılmış bir dizi değerden oluşur. Ancak listelerden farklı olarak, köşeli parantez yerine parantezler (( )) içine alınır. Listelere göre farkı sadece okunabilir (read-only) modda olmasıdır. Öğe sayısı arttırılamaz ve güncellenemezler. Örneğin,
1 2 3 4 5 6 7 8 |
tuple1 = ('abcd', 786 , 2.23, 'Çorlu', 70.2) tuple2 = (123, 'Merhaba') print(tuple1) # Tüm tuple öğelerini yazar print(tuple1[0]) # İlk öğeyi yazar print(tuple1[1:3]) # 2. öğe ile 3. öğeyi yazar print(tuple1[2:]) # 3. öğeden sonrasını yazar print(tuple2 * 2) # İki kere yazar print(tuple1 + tuple2) # İki tupleyi birleştirir |
1 2 3 4 5 6 |
('abcd', 786, 2.23, 'Çorlu', 70.2) abcd (786, 2.23) (2.23, 'Çorlu', 70.2) (123, 'Merhaba', 123, 'Merhaba') ('abcd', 786, 2.23, 'Çorlu', 70.2, 123, 'Merhaba') |
Bu örnek tuplenin listeler ile benzer taraflarını gösterir. Şimdi bir güncelleme işlemi deneyelim.
1 2 3 4 |
tuple = ( 'abcd', 786 , 2.23, 'Çorlu', 70.2 ) list = [ 'abcd', 786 , 2.23, 'Çorlu', 70.2 ] tuple[2] = 1000 # Tuple güncellenemez. Hatalı satır. list[2] = 1000 # List güncellenebilir. |
3. satır sebebiyle yorumlayıcı hata mesajı verecektir.
3.3.5. Sözlük (Dictionary)
Python’un sözlükleri bir çeşit hash tablo türüdür. Birçok programlama dilinde (C#, Java, Perl) bulunan ve anahtar-değer çiftlerinden oluşan ilişkisel diziler ya da hash gibi çalışırlar. Bir sözlük anahtarı hemen hemen her Python tipi olabilir, ancak genellikle sayılar veya dizelerdir. Diğer taraftan değerler, herhangi bir rastgele Python nesnesi olabilir. Sözlüklere küme parantezleri ({}) ile çevrelenir ve değerler köşeli parantezler ([]) kullanılarak atanabilir ve erişilebilir.
Sözlüklerin en büyük avantajı anahtar üzerinden aramayı hızlandırmasıdır. Dizi üzerinde arama için tüm öğeler kontrol edilmelidir. Bunun için bir döngüye ve if kontrolüne ihtiyaç vardır. Zaman karmaşıklığı olarak O(N)’lik bir süreyi kapsar. Sözlüklerde ise anahtar girdi olarak bir hash fonksiyonuna verilir ve sunulan bir bellek bölgesine değer yerleştirilir. Bir veri aranmak istendiğinde anahtar kullanılıp aynı hash fonksiyonuna gönderilir ve değerin bellekte yeri bulunmuş olur. Bilgisayar Mühendislikleri Bölümlerinde “Veri yapıları” derslerinde bunun teorisi daha geniş bir şekilde anlatılır. Sonuç olarak arama süresi zaman karmaşıklığı O(1) seviyesine indirgenmiş olur ki teorik olarak bu en hızlı arama süresidir. Basit bir örnekle veriyi belleğe kaydetme ve tekrar erişme olayına bakalım.
1 2 3 4 5 6 7 8 9 10 11 12 |
dict1 = {} #boş bir dictinary dict1['one'] = "Anahtar değeri string olarak one - Değer kısmı" dict1[2] = "Anahtar değeri int olarak 2 - Değer kısmı" dict2 = {'name': 'Çorlu','code':5901, 'dept': 'Bilgisayar Mühendisliği'} #anahtar ve değer verileri ilk atama aşamasında alınıyor. print(dict1['one']) # One anahtarının değerini döndürür print(dict1[2]) # 2 anahtarının değerini döndürür print(dict2) # Tüm sözlüğü yazar print(dict2.keys()) # Tüm anahtarları yazar print(dict2.values()) # Tüm değerleri yazar |
1 2 3 4 5 |
Anahtar değeri string olarak one - Değer kısmı Anahtar değeri int olarak 2 - Değer kısmı {'name': 'Çorlu', 'code': 5901, 'dept': 'Bilgisayar Mühendisliği'} dict_keys(['name', 'code', 'dept']) dict_values(['Çorlu', 5901, 'Bilgisayar Mühendisliği']) |
3.4. Veri dönüşümleri
Bazı durumlarda, veri türleri arasında dönüşüm gerçekleştirmeniz gerekebilir. Türler arasında dönüştürmek için, yalnızca tür adını fonksiyon olarak kullanırsınız. Bir veri türünden diğerine dönüştürme gerçekleştirmek için birkaç fonksiyon vardır. Bu fonksiyonlar, dönüştürülen değeri temsil eden yeni bir nesne döndürür.
Fonksiyon | Tanımı |
int(x [,base]) | x değerini tam sayıya dönüştürür. base kısmı taban dönüşümü için kullanılan seçimlik bir parametredir. Örneğin 2 tabanında sayının karşılığı bulmak için base kısmına 2 yazılır. |
float(x) | x değerini float bir sayıya dönüştürür. |
complex(real [,imag]) | Kompleks bir sayı üretir. |
str(x) | x değerini string değere dönüştürür. |
repr(x) | x değerini bir ifade string’e dönüştürür. |
eval(str) | Bir string’i değerlendirir ve bir nesne döndürür. |
tuple(s) | tuple’ye dönüştürür. |
list(s) | List’e dönüştürür. |
set(s) | Bir set’e dönüştürür. |
dict(d) | Bir sözlük yaratır. d (key, value) ilişkisi barındıran bir veri olmalıdır. |
frozenset(s) | Bir frozen set’e dönüştürür. |
chr(x) | Bir sayıyı karaktere çevirir. |
unichr(x) | Bir sayıyı unicode karakterine çevirir. |
ord(x) | Tek bir karakteri sayısına çevirir. |
hex(x) | Bir sayının hexadecimal karşılığına (string) çevirir. |
oct(x) | Bir sayıyı oktal karşılığına (string) çevirir. |