Temel Veri Türleri

Bir programlama dilindeki türleri yani types ya da data types bilmek oldukça önemlidir. Tür, bir nesnenin bellekte ne kadar yer kapladığını, o nesneye ait bellekteki verinin (1 ve 0’ların) hangi format ile nasıl yorumlanması gerektiğini, hangi operatörler ile işleme girebileceğini belirten temel bir özelliktir. Bu bağlamdaki “nesne” terimini “nesne yönelimli programlama” daki “nesne” ile karıştırmamak lazım. Buradaki nesne yani object kaba tabirle, kodumuzda erişebildiğimiz, bellekte duran şeylerdir. Python’da değişkenlerin gösterdikleri, aslında birer nesnedir. C ile Python arasında bu kavramlarda ufak nüans farklılıkları olabilir. Zamanla daha detaylandırırız.

Python temel türler açısından oldukça minimalist bir dildir. C’de 10’dan fazla temel tür var iken (hoş, aynı türün laciverdi çoğu… ) Python’da 6 adet temel tür bulunmaktadır.

Python’un, dinamik tür sistemine sahip olduğunu tekrar hatırlayalım. Yani bir değişkenin türü, o değişkene atanan “şeyin” türüne göre değişmektedir. En basitinden C dilinde int x = 5; yazıp, önce C derleyicisine x in türünün int olduğunu belirtmemiz gerekir ve bu tür artık değişmez. Python’da ise xi tanıtmamıza gerek yoktur, x = 5 ile bunu yapabiliriz. Fakat herhangi bir t anında bir değişken sadece bir türde olabilir ama zaman içerisinde türü değişebilir.

# x'in türü değişmekte sürekli ve bu Python'da geçerlidir.

x = 5
x = 3.14
x = "alper"

Python’da type() isimli bir built-in fonksiyon vardır. [1] Biz bu fonksiyonla bir değişkenimizin türünü öğrenebiliriz. Üstteki kodu, interaktif modda yani REPL ile çalıştırdığımızda aşağıdaki çıktıyı alırız:

>>> x = 5
>>> type(x)
<class 'int'>
>>> x = 3.14
>>> type(x)
<class 'float'>
>>> x = "alper"
>>> type(x)
<class 'str'>

x in türü gördüğünüz üzere atamaya göre değişmektedir.

1 - int

Python’da, C’nin aksine tam sayıları tutan tek bir tür vardır, o da int. unsigned int, long gibi türler yoktur. Python’daki int türü istediğimiz kadar uzun olabilmektedir. Yani tutması gereken değer için bellekte kaç byte harcaması gerekiyorsa o kadar harcar. Bu durum, özellikle C gibi dillerden geliyorsanız biraz garip gelebilir, özellikle de arka planda nasıl yapılabileceğini düşündüğünüz zaman. Ama yavaş yavaş bunları da göreceğiz.

Dikkat

Tabii Python’da her ne kadar int türünün bir sınırı yoksa da Python implementasyonları kendi limitlerinden dolayı buna bir sınır getirebilmektedir.

2 - float

Kayar noktalı sayıları yani floating point numbers dediğimiz sayıları ifade etmek için float türü kullanılır. Python’da C dilinin aksine float ve double şeklinde iki farklı tür yoktur. Python’nun floatu C/C++/Java/C#’ın double ına karşılık gelmektedir. Python’daki float türü IEEE 754 double precision floating-point number türüdür, FP64 ya da float64 olarak da ifade edilebilir. Numerik anlamda bu türün 8 byte ile ifade edildiğini düşünebiliriz. Ama Python’daki nesneler C’deki gibi “yalın” olmadığı için bellekte daha fazla yer kaplayacaktır, ileride değineceğiz.

# Anlamaya çalışmayın
import sys
x = 3.14
print("x bellekte:",sys.getsizeof(x), "byte yer kaplıyor.") #Bende 24 byte çıktı!

Float sayılarda Python’a özgü olmayan bir problem vardır o da yuvarlama hataları yani rounding errorstür. Float sayıların hepsi “tam olarak” bu formatlarla gösterilemez. Böyle bir durumda sayı, gösterimi mümkün olan yakın bir sayıya yuvarlanır ama bu da nümerik bir hata oluşturur. Burada oluşan hata, uygulamanıza göre anlamsız ya da çok kritik olabilir. Bu hata durumu sayıyı belleğe ilk kez depolarken çıkabileceği gibi aritmetik işlemler sonucu da çıkabilir.

0.3 + 0.1 # 0.4
0.3 - 0.1 # 0.19999999999999998 yuvarlama hatası var.
0.3 - 0.1 == 0.2 # False! Yuvarlama hatasından dolayı

Tüyo

Float sayıları karşılaştırmak için diğer dillerde de kullanılan bir teknik olan sayıların tam eşitliği değil, bellirli bir yakınlıkta (epsilon) olup olmadığı tekniği kullanılabilir. Sayılar “yeterince” aynı ise, aynı denilebilir. Ya da Python’da Python 3.5 ile gelen math.isclose() kullanılabilir.

Tüyo

Eğer yuvarlama hataları uygulamamız için kritikse bu durumda Python’da bulunan decimal modülüne bakmak iyi olacaktır. Fakat bu modül ile yapılan işlemler, işlemcilerin içerisinde IEEE 754 float işlemlere göre daha yavaş çalışabilir.

Tüyo

Yine konu dışı olacak ama ihtiyaca göre fixed point de tercih edilebilir. Burada yapılan işlemler aslında tam sayı işlemleridir. Günümüzdeki işlemcilerde float sayılarla da pek bir performans kaybı olmadan çalışılabilse de fixed point işlemlerin performans açısından tepe nokta olabilir.

Çok eski işlemcilerde floatin point unit denilen donanımda hızlandırılmış float hesaplama desteği yoktu, örneğin 8086 işlemcilerde. Microsoft mesela DOS için Microsoft Binary Format (MBF) isminde bir format “uydurmuştu” ve bellekte bu sayıları tutmak için bu formatı kullanıyordu. Donanımda hızlandırma desteği olmadığı sürece float sayıları IEEE gibi standart formatlarda tutmanın pek de bir anlamı olmayabilir, yazılım tarafındaki hazır kütüphanelerin getirebileceği diğer avantajları da yok sayarsak elbette.

3 - bool

bool türü, True ve False tutabilen bir türdür. Geçmişi taa George Boola dayanmaktadır. True ve False anahtar sözcüktür ve büyük harfle başlar.

>>> x = True
>>> type(x)
<class 'bool'>

Python’da bool türü aritmetik işlemlere sokulabilir. Bu durumda True, 1 olarak işleme girer, False ise 0 olarak işleme girer. İki bool değeri kendi aralarında işleme sokulursa sonuç int türden elde edilir.

a = True
b = 3 * a + 1  # 4
>>> x = True + True
>>> x
2
>>> type(x)
<class 'int'>

4 - str

str, String yani yazı türüdür. Sabit kısmına sonra bakacağız ama C’dekinin aksine '' ile "" arasında bir fark yoktur. Python’da char türü bulunmamaktadır. 'alper' ile "alper" aynıdır. Peki hangisini kullanmalıyız? Fark etmez, Python dünyasında pek genel geçer bir kabul yoktur.

5 - complex

Karmaşık yani imajiner sayıları yani imaginer number içerikleri göstermek için kullanılan bir türdür. C diline C99 ile gellen _Complex e benzer.

Pyton’da karmaşık sayılarda i değil, mühendislik camiasında kullanılan j kullanılmaktadır. a = j dersen normal değişken ataması olur. Bu durumda a = 1j demen gerekecektir, 1 ile j arasında boşluk olmamalı.

Örnek:

>>> x = 4 + 3j
>>> type(x)
<class 'complex'>

6 - NoneType

Python’da None adında bir değer vardır, hiçlik ve yokluk anlamında kullanılır. None bir anahtar sözcüktür. NoneType olan tek şey de Nonedır.

>>> x = None
>>> type(x)
<class 'NoneType'>

Bu None işi, diğer dillerdeki nul ya da nil gibi kavramlara benzemektedir.

Değeri None olan bir değişken interaktif modda komut satırında yazdırılmamaktadır. Yani adını yazıp ENTER tuşuna basınca bir çıktı oluşmamaktadır ama print() ile yazdırılabilmektedir. Bu durumda ekrana None yazısı çıkar.

>>> x = None
>>> type(x)
<class 'NoneType'>
>>> x
>>> print(x)
None

Çeşitli Sorular

Python’da türlerin default değeri var mı?

Bu soru Python’da bir miktar anlamsız çünkü bildirim (declaration) yok C’de olduğu gibi tür sisteminden dolayı ama ileride sınıfsal olduğunu göreceğiz orada default değerler var, float() dersek mesela bir varsayılan değer geliyor.

>>> x = float()
>>> print(x)
0.0

Özet

Özetle:

>>> a = 4
>>> type(a)
<class 'int'>

>>> a = 3.14
>>> type(a)
<class 'float'>

>>> a = 'Alper'
>>> type(a)
<class 'str'>

>>> a = False
>>> type(a)
<class 'bool'>

>>> a = 3j+4
>>> type(a)
<class 'complex'>

>>> a = None
>>> type(a)
<class 'NoneType'>

Elbette bu Python’da kullanacağımız türler bundan çok daha fazladır. Ama burada temel yani fundamental types olanları gördük.


💭 Yorumlar

Yorum altyapısı giscus tarafından (evet tarafından!) sağlanmaktadır. Yorum yazabilmek için GitHub hesabınız üzerinden giriş yapmanız gerekmektedir. Yorumlar, Github Discussions üzerinde saklanmaktadır.

841c2d6a-ab7c-4c39-b6ea-ea639d25f953