Python input(): Kullanıcıdan Veri Alma, Dönüştürme ve Doğrulama
input() kullanıcının yazdığını her zaman metin olarak verir; sayı için çevirmek, hatalı girişi yakalamak sizin işinizdir. Rehber okuma, dönüştürme ve doğrulamayı küçük örneklerle anlatır.
Bir bakışta
- input her zaman metin döndürür. Sayı yazılsa bile dönen değer str'dir; sayı için int ya da float ile çevrilir.
- Çevirme hatalı girişte ValueError üretir. try ve except ValueError ile korumak, programın düşmesini önler.
- Geçersiz girişte soruyu tekrarlayan döngü kurulur. while içinde dönüştür, doğrula ve ancak geçerliyse break ile çık.
- Dönüşüm doğrulama değildir. Sayı olması anlamlı olduğu anlamına gelmez; aralık kontrolü ayrıca yapılır.
- Otomatik çalışan betiklerde input kullanılmaz. Bekleyen kimse yoksa program kilitlenir; değerler argüman ya da dosyadan alınır.
input() ne yapar ve ne döndürür
input, programı durdurup kullanıcının klavyeden bir satır yazmasını bekleyen yerleşik işlevdir. Python belgelerine göre verilen metin (prompt) sonuna satır sonu eklenmeden ekrana yazılır; sonra işlev bir satır okur, sonundaki satır sonunu atar ve geriye metin olarak döndürür.
ad = input('Adınız: ') print('Merhaba, ' + ad)
Kullanıcı ne yazarsa yazsın dönen değer her zaman metindir (str). Sayı yazsa bile Python bunu sayı olarak değil, rakamlardan oluşan bir metin olarak görür. Yeni başlayanların en sık takıldığı yer burasıdır: yaş sorup girişi doğrudan başka bir sayıyla toplamaya çalışmak hata verir ya da beklenmedik biçimde metin birleştirir.
Giriş akışı kapandıysa, örneğin program bir dosyadan yönlendirilen girişle çalışırken satır kalmadıysa, belgelerin ifadesiyle EOFError oluşur. Etkileşimli kullanımda bu nadirdir, ama komut satırı araçlarında hesaba katılması gerekir.
Güvenli giriş okuma, aşama aşama kurulur
Her aşama bir öncekinin çıktısına dayanır
- Okuinput ile metin olarak al, baştaki ve sondaki boşlukları temizle
- ÇevirSayı gerekiyorsa int ya da float ile dönüştür
- DoğrulaAralık ve anlam kontrolü yap, geçersizse yeniden sor
Metni sayıya çevirmek: int ve float
Sayı gerekiyorsa dönen metni int ya da float ile çevirirsiniz. Tam sayılar için int, ondalıklı sayılar için float kullanılır.
yas_metni = input('Yaşınız: ') yas = int(yas_metni)
fiyat = float(input('Birim değer: ')) toplam = fiyat * adet
Kısa yazım için input'u doğrudan int'in içine koymak yaygındır: yas = int(input('Yaşınız: ')). Bu hem kısa hem okunaklıdır, ancak kullanıcı sayı olmayan bir şey yazarsa program ValueError ile durur. Bu yüzden gerçek bir uygulamada çevirmeyi koruma altına almanız gerekir.
Ondalık ayırıcıya dikkat: float, nokta ile yazılmış ondalıkları tanır. Türkçe alışkanlıkla virgül yazan bir kullanıcıdan gelen girişi çevirmeden önce virgülü noktaya dönüştürmek (giris.replace(',', '.')) gerekebilir. Aksi halde yine ValueError alırsınız.
Metin işlemleri de girişle iç içedir: kullanıcı ad yazarken başına ya da sonuna boşluk koyabilir. strip yöntemi bunları temizler, lower ya da upper ise büyük küçük harf farkını ortadan kaldırarak karşılaştırmayı kolaylaştırır; evet mi hayır mı sorusunu cevap.strip().lower() ile okumak yaygın bir kalıptır.
Hatalı girişte try/except ve tekrar sorma döngüsü
Kullanıcı yanlış yazabilir; program bunu bekleyerek yazılmalıdır. Standart kalıp, geçerli giriş gelene kadar soruyu tekrar eden bir while döngüsü içinde dönüşümü try ile korumaktır.
while True: metin = input('Yaşınız: ') try: yas = int(metin) except ValueError: print('Lütfen rakamlarla bir sayı girin.') continue if yas < alt_sinir or yas > ust_sinir: print('Değer beklenen aralığın dışında.') continue break
Döngü iki türlü hatayı ayrı ele alır. Önce sayı olmayan giriş ValueError ile yakalanır ve kullanıcıya anlaşılır bir mesaj verilir. Sonra çevirme başarılı olsa bile değerin anlamlı olup olmadığına bakılır; negatif yaş ya da kabul edilmeyen bir seçenek gibi. İkisi de geçilirse break ile döngüden çıkılır.
Bunu bir işleve çevirmek iyi bir pratiktir: sayi_oku(soru, alt, ust) adlı tek bir işlev tüm uygulamada tekrar tekrar kullanılabilir ve doğrulama kuralı bir yerde yaşar. Burada önemli olan except'i yalnızca beklenen ValueError ile sınırlamaktır, çünkü çıplak except gerçek programlama hatalarını da gizler.
Korumasız dönüşüm yerine doğrulamalı döngü yazılır
Aynı giriş, farklı sonuç
Birden fazla değer ve menü girişi
Tek satırda birden çok değer almak gerekirse girişi bölebilirsiniz. split yöntemi metni boşluklara göre parçalar ve bir liste verir; liste üreteciyle her parçayı sayıya çevirmek yaygın bir kalıptır.
parcalar = input('Sayıları aralarında boşluk bırakarak yazın: ').split() sayilar = [float(p) for p in parcalar] print(sum(sayilar))
Burada giriş "boşlukla ayrılmış değerler" biçiminde beklenir; çevirme döngüsü yine ValueError üretebileceğinden aynı koruma gerekir. Virgülle ayrılmış girişlerde split(',') kullanılır.
Menü tabanlı programlarda giriş sayı ya da kısa komut olur. Seçenekleri bir sözlükte tutmak, uzun bir if-elif zincirinden daha temizdir: kullanıcının yazdığı anahtarı sözlükte arar, bulamazsa tekrar sorarsınız. Böylece yeni bir seçenek eklemek yalnızca sözlüğe bir satır eklemek demektir.
Şifre gibi ekranda görünmemesi gereken girişler için input uygun değildir; standart kütüphanedeki getpass modülü yazılanları ekrana yansıtmaz. Ancak gerçek uygulamalarda parola yönetimini kendi yazdığınız betikle değil, ilgili güvenlik altyapısıyla çözmek gerekir.
Küçük bir uygulama: hesaplama aracı
Öğrendiklerinizi birleştiren küçük bir örnek: kullanıcıdan birim değer ve adet alıp toplam hesaplayan bir araç.
def sayi_oku(soru): while True: try: return float(input(soru).strip().replace(',', '.')) except ValueError: print('Geçerli bir sayı girin.')
birim = sayi_oku('Birim değer: ') adet = sayi_oku('Adet: ') print(f'Toplam: {birim * adet:.{hane}f}')
Bu kısa kod bölümün bütün fikirlerini içerir: giriş metin olarak okunur, boşluklar temizlenir, virgül noktaya çevrilir, dönüşüm try ile korunur ve geçersiz girişte yeniden sorulur. sayi_oku işlevi return ile değeri döndürdüğü için başka yerlerde de kullanılabilir. Sonuç f-string ile biçimlendirilir.
Programı kendi başınıza geliştirirken şu sırayı izleyin: önce girişi alıp yalnızca ekrana yazdırarak dönen değeri görün, sonra dönüşümü ekleyin, sonra hatalı girişleri deneyip korumayı kurun. Her aşamada programı bilerek yanlış girişle çalıştırmak, sağlamlığı en çabuk ölçen testtir.
Sık yapılan hatalar
Giriş okuma kodunda tekrar eden birkaç hata vardır:
- input'tan gelen sayıyı çevirmeden kullanmak: metinle sayı toplanamaz, çarpma ise metni tekrarlar ve sessizce yanlış sonuç verir.
- Çevirmeyi hiç korumamak: kullanıcı beklenmedik bir şey yazdığında programın hata ile kapanması kötü deneyimdir.
- except'i fazla geniş yazmak: yalnızca ValueError yakalayın, aksi halde klavye kesintisi gibi durumlar da yutulur.
- Karşılaştırmada büyük küçük harfi ve boşluğu unutmak: strip ve lower ile giriş normalleştirilmelidir.
- Kontrolü yalnızca dönüşümde bırakmak: sayı olması, anlamlı bir sayı olduğu anlamına gelmez; aralık ve kural kontrolü ayrıca yapılır.
- Girişi iş mantığıyla iç içe yazmak: okuma işlevi ayrı, hesap işlevi ayrı olursa hesabı test etmek için klavyeden değer girmeniz gerekmez.
Son madde özellikle önemlidir. Etkileşimsiz çalışan betiklerde, zamanlanmış görevlerde ya da bir sunucuda input çağrısı programı sonsuza dek bekletir veya EOFError üretir. Bu yüzden kalıcı araçlarda değerler komut satırı bağımsız değişkenlerinden ya da dosyadan alınır, input yalnızca gerçekten kullanıcı etkileşimi olan yerlerde kalır.
Bu beceriyi Mindset programlarında nerede çalışırsınız
Python ile Programlama Eğitimi Python'a Giriş ve Temel Veri Tipleri modüllerini, Data Science Bootcamp ise Python'a Giriş, Türler ve Değişkenler ile Temel İfadeler modüllerini içerir. Kullanıcıdan veri alma ve türü doğru çevirme, bu başlıkların ilk uygulamalı alıştırmasıdır. Betik yazmaya yeni başlayan bir analist ya da veri meraklısı için etkileşimli küçük araçlar, değişken ve tür kavramlarını pekiştirmenin pratik yoludur.
İlgili Mindset programı
Python ile Programlama Eğitimi
Sık sorulan sorular
input() neden her zaman metin döndürür?
Çünkü klavyeden okunan şey bir satır karakterdir ve Python bunu yorumlamaz. Belgelerin ifadesiyle satır okunur, sondaki satır sonu atılır ve metin olarak döndürülür. Sayı olarak kullanmak için int ya da float ile açıkça çevirmeniz gerekir; bu bilinçli bir tasarımdır ve giriş doğrulamasını sizin kontrolünüze bırakır.
Kullanıcı sayı yerine harf girerse ne olur?
int ya da float çağrısı ValueError oluşturur ve korumanız yoksa program durur. Çözüm, dönüşümü try ve except ValueError ile sarıp geçerli bir değer gelene kadar while döngüsünde soruyu yinelemektir. Böylece kullanıcıya anlaşılır bir uyarı verir ve programı kapatmadan devam edersiniz.
Virgüllü ondalık sayı nasıl okunur?
float, noktalı yazımı tanır; virgüllü girişte ValueError alırsınız. Dönüştürmeden önce giris.replace(',', '.') ile virgülü noktaya çevirmek yaygın çözümdür. Ancak binlik ayırıcı da kullanılabilecek bir arayüz tasarlıyorsanız belirsizlik doğar; bu durumda biçimi açıkça belirtmek ya da ayrı bir ayrıştırma işlevi yazmak daha güvenlidir.
Birden fazla değeri tek input ile almak mümkün mü?
Evet, giriş metnini split ile parçalayıp her parçayı çevirirsiniz. Boşlukla ayrılmış değerler için split(), virgülle ayrılmış için split(',') kullanılır. Parçaların her birinin dönüşümü ayrı ayrı hata verebileceğinden tüm liste üretecini try bloğuna almak ve bozuk girişte baştan sormak gerekir.
input kullanmadan veri nasıl alınır?
Etkileşim olmayan programlarda komut satırı bağımsız değişkenleri, bir dosya ya da ortam değişkenleri kullanılır. Zamanlanmış çalışan ya da sunucuda koşan betikte input çağrısı bekleyecek kimse olmadığı için programı kilitler. Etkileşimli kısım ile iş mantığını ayırmak, aynı kodun her iki ortamda çalışmasını kolaylaştırır.
İlgili rehberler
İlgili eğitimler
Kategori: Yazılım Geliştirme