Python'da Veri Tipleri ve Tipler Arası Dönüşüm Rehberi
Python'da her değerin bir tipi vardır ve işlem sonucu o tipe bağlıdır. Temel tipleri tanıyıp int(), float(), str() ile güvenle dönüştürmeyi, dönüşümün hata verdiği yerleri öğrenirsiniz.
Bir bakışta
- Değişkenin değil, değerin tipi vardır. type() bir değerin tipini söyler; aynı değişken sonradan başka tipte bir değer alabilir.
- Temel tipler, tek bir değeri temsil eder. int, float, str, bool ve None farklı türde bilgi taşır; liste ve sözlük gibi yapılar bunların üzerine kurulur.
- Dönüşüm otomatik olmaz, açıkça yazılır. Metin ile sayıyı toplamaya çalışmak hata verir; önce int() ya da float() ile çevirmek gerekir.
- Her dönüşüm başarılı olmaz. Tam sayıya çevrilemeyen bir metin ValueError üretir; kullanıcıdan gelen veride bunu yakalamak gerekir.
- Boş olmayan her metin bool olarak True çıkar. Bu yüzden onay kutusu değerini bool() ile çevirmek sık yapılan bir hatadır.
Önce tipi görün
Bir değerle ne yapabileceğiniz, tipine bağlıdır. Tipi öğrenmenin yolu type() fonksiyonudur:
yas = 42 oran = 3.5 ad = "Ayşe" aktif = True not_var = None
print(type(yas)) print(type(oran)) print(type(ad)) print(type(aktif)) print(type(not_var))
Çıktılar sırasıyla int, float, str, bool ve NoneType sınıflarını gösterir. Python'da tip değerin üzerindedir, değişkenin üzerinde değil: yas adı bir süre sonra metne bağlanabilir ve o andan itibaren davranışı metin gibi olur.
Bir değerin belirli bir tipte olup olmadığını koşulda sormak için isinstance() kullanılır: isinstance(yas, int) doğru ya da yanlış döner. Bu fonksiyon, bir sınıfın alt tiplerini de kapsadığı için type(x) == int karşılaştırmasından daha esnektir.
Temel tipler farklı türde bilgi taşır
Temel tipler
| Örnek değer | Ne için kullanılır | |
|---|---|---|
| int | 42 | Sayma, indeks, tam sayı hesapları |
| float | 3.5 | Ondalıklı ölçüm ve oranlar |
| str | "Ayşe" | Metin; ad, adres, mesaj |
| bool | True | Evet/hayır durumları ve koşullar |
| None | None | Henüz değer yok anlamı |
Temel tiplerin ayırt edici özellikleri
int tam sayıdır ve Python'da büyüklük sınırı yoktur; çok büyük sayılarla da hata almadan çalışabilirsiniz. float ondalıklı sayıdır; bilgisayarda ikili düzende tutulduğu için bazı ondalıklı toplamlar beklediğiniz kadar tam çıkmaz. Para gibi tam sonuç gereken hesaplarda bu yüzden standart kütüphanedeki decimal modülünün Decimal tipi tercih edilir.
str değiştirilemeyen bir metin dizisidir. Bir metnin bir karakterini yerinde değiştiremezsiniz; yeni bir metin üretirsiniz. Metinleri toplamak (birleştirmek) mümkündür, ama metin ile sayıyı toplamak hata verir.
bool yalnızca True ve False değerlerini alır. Python belgelerine göre bool, int tipinin bir alt tipidir ve sayısal bağlamda True bir, False sıfır gibi davranır. Belgeler bu davranışa güvenmeyip gerektiğinde açıkça int() yazmayı önerir.
None ise değerin yokluğunu gösterir. Hiçbir şey döndürmeyen bir fonksiyonun sonucu None olur; bu yüzden liste.sort() gibi yerinde çalışan metotların sonucunu bir değişkene atamak, değişkenin None olmasına yol açar.
Dönüşüm fonksiyonları: int(), float(), str()
Dönüşüm açıkça yazılır. Üç fonksiyon günlük işin çoğunu görür:
- int(): metni ya da ondalıklı sayıyı tam sayıya çevirir
- float(): metni ya da tam sayıyı ondalıklı sayıya çevirir
- str(): neredeyse her değeri metne çevirir
Örnekler:
int("42") sonucu 42 olur. float("3.5") sonucu 3.5 olur. str(42) sonucu "42" olur. int(3.5) sonucu 3 olur.
Son örnek önemlidir: float değeri int() ile çevirdiğinizde sayı yuvarlanmaz, ondalık kısım atılır. Negatif sayıda da aynı şekilde sıfıra doğru kesilir. Yuvarlama istiyorsanız round() ya da math modülündeki floor ve ceil fonksiyonlarını kullanırsınız.
Metin ile sayıyı yan yana yazdırmak için sayıyı önce str() ile çevirebilir ya da f-metin kullanabilirsiniz: f"Yaş: {yas}" ifadesi dönüşümü sizin yerinize yapar.
Dönüşüm fonksiyonu eldeki metne göre seçilir
Hangi fonksiyon?
- Metin yalnızca tam sayı içeriyorint(metin)Örneğin "42" tam sayı 42 olur.
- Metin ondalıklı sayı içeriyorfloat(metin)Örneğin "3.5" ondalıklı sayı olur.
- Ondalıklı metinden tam sayı gerekiyorint(float(metin))Önce float, sonra int; ondalık kısım atılır.
- Sayı metne eklenecekstr(sayı) ya da f-metin
Dönüşüm başarısız olduğunda
int("3.5") ifadesi hata verir. int() yalnızca tam sayı gibi yazılmış metni kabul eder; ondalık nokta içeren metin ValueError üretir. Aynı şekilde int("elma") ya da boş metin de ValueError ile sonuçlanır. Çözüm, önce float() ile çevirip sonra int() ile kesmektir: int(float("3.5")) sonucu 3 olur.
Veri kullanıcıdan, dosyadan ya da bir API'den geliyorsa dönüşümün başarısız olabileceğini baştan varsayın. Bunun için try/except bloğu kullanılır:
girdi = "3.5" try: sayi = float(girdi) except ValueError: sayi = None
Bu kalıp, hatayı yakalayıp programı düşürmeden bir varsayılan değer (burada None) üretir. Sonraki kodda sayi değerinin None olup olmadığını kontrol etmek gerekir.
float() belgelere göre "nan" ve "inf" gibi metinleri de kabul eder; bu metinler geçerli bir sayı olmayan özel değerlere dönüşür. Dışarıdan gelen veride bu değerlerin sessizce hesaba girmesini istemiyorsanız dönüşümden sonra ayrıca kontrol edin.
bool tuzağı: dolu metin her zaman True
bool() bir değerin koşulda nasıl davranacağını söyler. Sıfır, boş metin, boş liste ve None False sayılır; geri kalan her şey True sayılır.
Buradan çıkan sık hata şudur: bool("0") ve bool("False") ifadeleri True döner, çünkü her ikisi de boş olmayan metindir. Bir formdan ya da ayar dosyasından gelen "False" metnini bool() ile çevirirseniz beklediğinizin tersini alırsınız.
Doğrusu, metni açıkça karşılaştırmaktır:
deger = "False" aktif = deger.strip().lower() == "true"
Bu ifade yalnızca "true" yazılmışsa True üretir; diğer her şeyi False sayar. Hangi yazımları kabul edeceğinizi (evet, 1, true gibi) kendiniz tanımlarsınız.
Aynı doğruluk mantığı koşullarda işinize yarar: if liste: yazmak, listenin boş olmadığını kısaca kontrol eder. Ama sıfır değerinin geçerli bir sonuç olduğu durumlarda (örneğin bir sayaç) if sayac: ifadesi sıfırı yokluk gibi görür; orada sayac is not None demek daha doğrudur.
input() ile gelen her şey metindir
Başlangıçta en sık karşılaşılan dönüşüm hatası, kullanıcıdan alınan değerin sayı sanılmasıdır. input() fonksiyonu kullanıcı ne yazarsa yazsın bir str döndürür.
Hatalı kullanım:
a = input("Birinci sayı: ") b = input("İkinci sayı: ") print(a + b)
Kullanıcı 1 ve 2 yazarsa sonuç 3 değil, 12 olur; çünkü iki metin birleştirilmiştir. Doğrusu, girdiyi hesaba sokmadan önce çevirmektir:
a = int(input("Birinci sayı: ")) b = int(input("İkinci sayı: ")) print(a + b)
Bu sürüm kullanıcı sayı yazdığında doğru toplar. Kullanıcı harf yazarsa ValueError çıkar; bir önceki bölümdeki try/except kalıbı burada devreye girer.
Bölme işleminin her zaman float döndürdüğünü de not edin: iki tam sayıyı / ile böldüğünüzde sonuç tam gelse bile ondalıklıdır. Tam sayı bölümü gerekiyorsa // kullanılır.
Girdiyi çevirmeden toplamak metinleri birleştirir
Sık hata
Sağlam bir dönüşüm alışkanlığı
Başlangıç düzeyinden ileriye geçerken tip konusunu birkaç alışkanlığa bağlayın. Birincisi, değerin nereden geldiğini bilmek: kendi yazdığınız sabit mi, dışarıdan gelen metin mi? Dışarıdan gelen her değer önce metin kabul edilir ve doğrulanarak çevrilir.
İkincisi, dönüşümü tek bir yerde yapmaktır. Veriyi okuduğunuz noktada çevirin ve programın geri kalanında artık doğru tipte çalışın; her satırda yeniden çevirmek hataya açıktır.
Üçüncüsü, hata mesajını okumaktır. TypeError genellikle iki farklı tipin birlikte kullanıldığını söyler, ValueError ise tipin doğru, içeriğin yanlış olduğunu. İkisini ayırt etmek hatayı çok daha hızlı bulmanızı sağlar.
Dördüncüsü, küçük denemeler yapmaktır. Yorumlayıcıda type(int("42")) ya da type(str(42)) gibi ifadeleri çalıştırıp sonucu görmek, kuralları ezberlemekten daha kalıcıdır. Tip ipucu yazımına geçtiğinizde de şunu unutmayın: ipuçları çalışma anında dönüşüm yapmaz ve denetlenmez; okuyucu ve denetim araçları için yazılır.
Bu beceriyi Mindset programlarında nerede çalışırsınız
Python ile Programlama Eğitimi, sıfırdan başlayanlar için Python'a girişten sonra temel veri tiplerini ayrı bir modül olarak işler; ardından fonksiyonlar, veri yapıları, döngüler ve hatalar ve istisnalar konularına geçer.
Tip dönüşümünün hata yönetimiyle birleştiği yer de bu sıradadır: önce tipleri öğrenir, sonra dönüşümün başarısız olduğu durumları istisna mekanizmasıyla ele alırsınız.
İlgili Mindset programı
Python ile Programlama Eğitimi
Sık sorulan sorular
Python'da int("3.5") neden hata verir?
int() ondalık nokta içeren metni tam sayı olarak okuyamaz ve ValueError fırlatır. Önce float() ile ondalıklı sayıya, sonra int() ile tam sayıya çevirmeniz gerekir. Sonuçta ondalık kısım yuvarlanmaz, atılır; yuvarlama için round() kullanın.
type() ile isinstance() arasındaki fark nedir?
type() bir değerin tam tipini verir. isinstance() ise değerin belirli bir tipte ya da onun alt tiplerinde olup olmadığını doğru yanlış olarak söyler. Bool, int'in alt tipi olduğu için isinstance(True, int) doğru döner, type(True) == int ise yanlıştır.
None ile boş metin aynı şey midir?
Hayır. Boş metin bir str değeridir ve içi boştur; None ise değer olmadığını belirten ayrı bir sabittir. İkisi de koşulda False sayılır, ama None ile işlem yapmak (örneğin uzunluğunu almak) hata verirken boş metin ile yapılabilir.
Bir sayıyı metne neden çevirmem gerekir?
Sayıyı bir metnin içine koymak ya da metinle birleştirmek için gerekir. Python metin ile sayıyı + ile toplamanıza izin vermez ve TypeError verir. str() ya da f-metin kullanarak sayıyı metne çevirir, çıktıyı istediğiniz biçimde kurarsınız.
bool("False") neden True döner?
Çünkü bool() metnin ne yazdığına değil, boş olup olmadığına bakar. Boş olmayan her metin True sayılır. Bir ayar dosyasından gelen "False" yazısını doğru yorumlamak için metni açıkça "true" ile karşılaştırmak gerekir.