Python "ValueError: invalid literal for int() with base 10" hatası, input() ile alınan bir metin int() fonksiyonuna tam sayı biçiminde olmadığı hâlde verildiğinde oluşur. Çözüm, hatayı körlemesine bastırmak değil, beklenen veri biçimini belirleyip tam sayı için int(), ondalık için float() veya geçersiz girişte açıklayıcı geri bildirim seçmektir.
12 geçerli bir tam sayı metniyken 3.5, boş metin ve abc aynı dönüşümde kullanılamaz. Önce metnin neyi temsil ettiğini kontrol etmek, ardından uygun dönüşümü uygulamak gerekir.
Python ValueError: invalid literal for int() with base 10 ne anlama gelir?

input() ile alınan değer, ekranda sayı gibi görünse bile metindir. int() bu metni çözümlerken yalnızca geçerli tam sayı gösterimlerini doğrudan kabul eder. Örneğin 12, -4 ve +7 tam sayı biçimindedir; 3.5 ondalık ayırıcı içerir, boş metin hiç rakam içermez, abc ise sayı yerine harflerden oluşur. Bu değerlerde önce beklenen veri biçimini belirlemek, ardından uygun dönüşümü veya kullanıcıya açıklayıcı geri bildirim vermeyi seçmek gerekir.
Hata mesajındaki invalid literal, int() tarafından tam sayı olarak okunamayan metin parçası demektir. base 10 ifadesi, metnin onluk tabanda yorumlanmaya çalışıldığını anlatır. Bu, girilen değerin mutlaka 10 olması gerektiği anlamına gelmez; burada söz konusu olan sayının değeri değil, okuma biçimidir.
Dolayısıyla çözüm, try-except ile hatayı sessizce yok etmekten başlamaz. Önce girişin neyi temsil etmesi gerektiği netleştirilir, sonra int(), float() veya yeniden giriş isteme seçeneklerinden uygun olan kullanılır.
Hızlı teşhis için şu sırayı kullanabilirsin:
- Değer
input()ile mi geldi? Öyleyse önce metindir. - Beklenen biçim tam sayı mı, ondalık mı, yoksa boş bırakılabilir mi?
- Dönüşüm başarısızsa kullanıcıya beklenen biçim açıkça söyleniyor mu?
Bu ayrımı pekiştirmek için Python bilgi testi ile temel bilgini yoklayabilirsin.
12, 3.5 ve abc girdileri nasıl işlenir?
Üç girdiyi aynı akışta gözlemlemek için aşağıdaki örnek her değeri ayrı alır. Başarılı dönüşümde else bloğu, başarısız dönüşümde except ValueError bloğu çalışır.
for _ in range(3):
metin = input('Değer: ')
try:
sayi = int(metin)
except ValueError:
print(f'{metin!r}: tam sayıya dönüştürülemedi')
else:
print(f'{metin!r}: {sayi}')
Kullanıcı sırasıyla 12, 3.5 ve abc girdiğinde beklenen etkileşim şöyledir:
Değer: 12
'12': 12
Değer: 3.5
'3.5': tam sayıya dönüştürülemedi
Değer: abc
'abc': tam sayıya dönüştürülemedi
12 geçerli bir tam sayı metni olduğu için int() bunu 12 değerine dönüştürür. 3.5 ondalık bir değeri ifade eder ve doğrudan tam sayıya çevrilemez. abc ise tam sayı gösterimi değildir. Bu akış, programı durdurmadan hatalı girdiyi görünür tutar.
Ondalık değer gerçekten gerekiyorsa float(metin) seçilebilir. Tam sayı gerekiyorsa 3.5'i sessizce 3 yapmaya çalışmak yerine, beklenen biçimi açıklayıp kullanıcıdan yeniden giriş istemek daha doğru olur.
input(), veri türleri ve temel dönüşümleri çalışmak için ücretsiz Sıfırdan Temel Python video eğitiminden yararlanabilirsin.
int(), float(), doğrulama ve try-except ne zaman seçilir?

Seçim, girişte hangi sayısal biçimin kabul edileceğine bağlıdır. Tam sayı bekleniyorsa int(), ondalık değer korunacaksa float() kullanılır. Kullanıcı girdisi dönüşümden önce kurala göre incelenir; dönüşüm sırasında beklenen ValueError ise dar kapsamlı try-except ile anlaşılır bir geri bildirime çevrilir.
İşaret, çevresel boşluk ve ondalık ayırıcı kurallarını baştan belirle. isdigit() tek başına yeterli değildir; -4, +12, boşluk içeren veya ondalıklı biçimleri doğru değerlendirmeyebilir. int(float(metin)) de otomatik bir çözüm değildir. Örneğin 3.5 değeri 3 olur. Ondalık kısmın kaybedilmesi ya da yuvarlama kuralı ancak bilinçli olarak kararlaştırılmışsa uygulanmalıdır.
Aşağıdaki örnekte try-except yalnızca dönüşümün çevresinde kullanılır:
metin = input("Bir tam sayı girin: ").strip()
try:
sayi = int(metin)
except ValueError:
print("Lütfen tam sayı biçiminde bir değer girin.")
else:
print(f"Girdiğiniz tam sayı: {sayi}")
Örnek giriş: 12
Beklenen çıktı: Girdiğiniz tam sayı: 12. Bu örnekte strip() çevresel boşlukları temizler; boşlukları kabul etmek istemiyorsan bu kuralı dönüşümden önce ayrıca uygulamalısın.
| Yaklaşım | Ne zaman seçilir? | Örnek veri | Dikkat edilmesi gereken |
|---|---|---|---|
int() |
Tam sayı beklenen girişlerde. | '12', '-4' |
'3.5' ve '12.0' tam sayı metni değildir. İşaret ve boşluk kuralını belirle. |
float() |
Ondalık kısmın kabul edildiği ve korunması gereken girişlerde. | '3.5' |
Ondalık ayırıcının nokta mı virgül mü olacağını önceden kararlaştır. |
| Doğrulama | Dönüşümden önce beklenen biçimi kontrol etmek için. | '+12', '1,5' |
isdigit() işaretli, boşluklu ve ondalıklı biçimleri tek başına kapsamaz. |
try-except |
Dönüşüm sırasında beklenen ValueError için. |
'12abc' |
Yalnızca dönüşüm çağrısını sar; hatayı sessizce gizlemek yerine anlaşılır geri bildirim ver. |
Bu ayrımı ve temel dönüşümleri pekiştirmek için Python bilgi testi ile hangi yaklaşımın hangi girdiye uyduğunu sınayabilirsin.
Hatalı girdiyi gizlemeden nasıl teşhis edersin?
Teşhis, programın durmasını engellemekten ibaret değildir. Ham değeri, beklenen biçimi ve dönüşüm kararını birlikte incelemek gerekir.
“Hata, dönüşümden önce değerin beklenen veri biçiminde olup olmadığının kontrol edilmediğini gösterir.”
- Ham girdiyi görünür kıl:
repr(metin)veyaprint(repr(metin))kullanarak görünmeyen boşlukları da incele. - Veri sözleşmesini belirle: Girişin tam sayı, işaretli tam sayı veya ondalık değer olacağını açıkça yaz.
- Boşluk politikasını seç: Çevresel boşluklara izin veriyorsan yalnızca izin verilen biçimlendirmeyi
strip()ile temizle. Boş sonuçları dönüşümden önce ayır. - Sınır durumlarını ayrı test et:
'12','12.0','3.5','1,5','12abc', boş metin, yalnızca boşluk,'+12','-12','0012've' 12 'değerlerini tek tek dene.'12.0'ile'3.5'ondalık içerdiği için tam sayı metni olarak ele alınmamalıdır.' 12 'ise belirlediğin boşluk politikasına göre kabul edilmeli veya reddedilmelidir. - Uygun dönüşümü seç:
int()ya dafloat()çağrısını, yalnızca o dönüşümün çevresini kapsayan dar birtry-exceptiçine al. - Beklenen biçimi söyle: Kullanıcıya “Tam sayı girin” veya “Nokta kullanarak ondalık değer girin” gibi doğrudan bir açıklama ver; ham değeri sessizce yok sayma.
input(), veri türleri ve temel dönüşümleri adım adım çalışmak için ücretsiz Sıfırdan Temel Python video eğitimi yararlı bir başlangıç olabilir.
Sık Sorulan Sorular
int('3.5') neden hata verir ve ondalık değer hangi durumda float() ile ele alınmalıdır?
int(), ondalık ayırıcı içeren bir metni tam sayı biçimi olarak kabul etmez. Girdideki kesirli kısmın korunması gerekiyorsa float() kullanılmalıdır. Tam sayı zorunluysa 3.5 değerini sessizce dönüştürmek yerine kullanıcıdan tam sayı istenmelidir.
input() ile alınan boş veya yalnızca boşluk içeren giriş nasıl yönetilir?
Önce metni strip() ile temizleyip sonucun boş olup olmadığını kontrol edebilirsin. Çevresel boşluklara izin verilmiyorsa özgün metni reddetmelisin. Boş sonuçlarda dönüşüm yapmadan kullanıcıya beklenen giriş biçimini açıklamak daha uygundur.
int(float('3.5')) kullanmak her durumda doğru bir çözüm müdür?
Hayır. Bu ifade önce 3.5 değerini ondalığa çevirir, ardından tam sayıya dönüştürür ve sonucu 3 yapar. Ondalık kısmın atılması açıkça istenmiyorsa kullanılmamalıdır. Yuvarlama gerekiyorsa yuvarlama kuralı ayrıca tanımlanmalıdır.
Sağlam bir çözüm, dönüşüm fonksiyonunu veri biçimine göre seçer, kuralları önceden belirler ve hatalı girdiyi anlaşılır geri bildirimle görünür kılar.