Kullanıcıyla ˙Ileti¸ sim: Veri Alı¸ s-Veri¸ si
4.2 input() fonksiyonu
Simdi raw_input() fonksiyonuna bir ara verip, kullanıcıdan bilgi almak için kullanabilece˘gimiz ikinci fonksiyondan biraz bahsedelim. Az sonra raw_input() fonksiyonuna geri dönece˘giz.
4.2 input() fonksiyonu
Tıpkı raw_input() fonksiyonunda oldu˘gu gibi, input() fonksiyonuyla da kullanıcılardan bazı bilgileri alabiliyoruz. ¸Su basit örne˘ge bir bakalım:
#!/usr/bin/env python
# coding: utf-8
-*-a = input("Lütfen bir sayı girin:")
b = input("Lütfen ba¸ska bir sayı daha girin:") print a + b
Kullanım açısından, görüldü˘gü gibi, raw_input() ve input() fonksiyonları birbirlerine çok benzer. Ama bunların arasında çok önemli bir fark vardır. Hemen yukarıda verilen kodları bir de raw_input() fonksiyonuyla yazmayı denersek bu fark çok açık bir ¸sekilde ortaya çıkacaktır:
#!/usr/bin/env python
# coding: utf-8
-*-a = raw_input("Lütfen bir sayı girin:")
b = raw_input("Lütfen ba¸ska bir sayı daha girin:") print a + b
Bu kodları yazarken input() fonksiyonunu kullanırsak, kullanıcı tarafından girilen sayılar birbirleriyle toplanacaktır. Diyelim ki ilk girilen sayı 25, ikinci sayı ise 40 olsun. Programın sonunda elde edece˘gimiz sayı 65 olacaktır.
Ancak bu kodları yazarken e˘ger raw_input() fonksiyonunu kullanırsak, girilen sayılar
birbirleriyle toplanmayacak, sadece yan yana yazılacaklardır. Yani elde edece˘gimiz ¸sey 2540 olacaktır.
Hatırlarsanız buna benzer bir ¸seyle “sayılar” konusunu i¸slerken de kar¸sıla¸smı¸stık. O zaman ¸su örnekleri vermi¸stik:
>>> print 25 + 50
75
>>> print "25" + "50"
2550
˙I¸ste raw_input() ile input() arasındaki fark, yukarıdaki iki örnek arasındaki farka benzer.
Yukarıdaki örneklerde, Python’ın sayılara ve karakter dizilerine nasıl davrandı˘gını görüyoruz.
E˘ger Python iki adet sayıyla kar¸sıla¸sırsa bu sayıları birbiriyle topluyor. Ama e˘ger iki adet karakter dizisiyle kar¸sıla¸sırsa, bu karakter dizilerini yanyana yazmakla yetiniyor...
Bütün bu açıklamalardan anlıyoruz ki raw_input() fonksiyonu kullanıcının girdi˘gi verileri
karakter dizisine dönü¸stürüyor. Bu durumu daha net görebilmek için dilerseniz ¸söyle bir örnek verelim:
#!/usr/bin/env python
# coding: utf-8
-*-sayi = raw_input("Bir sayı girin. Ben size o \ sayının karesini söyleyeyim:\n")
print "girdi˘giniz sayı\t\t: %s" %(sayi)
print "girdi˘giniz sayının karesi: %s" % (sayi * sayi)
Bu kodları çalı¸stırdı˘gınızda sayıyı giripENTER tu¸suna bastıktan sonra ¸söyle bir hata mesajı alacaksınız:
File "deneme.py", line 8, in <module>
print "girdi˘giniz sayının karesi: %s" % (sayi * sayi) TypeError: can’t multiply sequence by non-int of type ’str’
Bu durum, raw_input() fonksiyonunun kullanıcı verilerini karakter dizisi olarak almasından kaynaklanıyor. Karakter dizileri ile aritmetik i¸slem yapılamayaca˘gı için de hata vermekten ba¸ska çaresi kalmıyor. Burada tam olarak ne döndü˘günü anlayabilmek için etkile¸simli kabukta verdi˘gimiz ¸su örneklere bakalabilirsiniz:
>>> a = "12"
>>> b = "12"
>>> print a * b
TypeError: can’t multiply sequence by non-int of type ’str’
Gördü˘günüz gibi biraz öncekiyle aynı hatayı aldık. ˙Iki karakter dizisini birbiriyle çarpamaz, bölemez ve bu karakter dizilerini birbirinden çıkaramazsınız. Çünkü aritmetik i¸slemler ancak sayılar arasında olur. Karakter dizileri ile aritmetik i¸slem yapılmaz... Yukarıdaki örneklerin düzgün çıktı verebilmesi için o örnekleri ¸söyle yazmamız gerekir:
>>> a = 12
>>> b = 12
>>> print a * b
144
Dolayısıyla, yukarıda hata veren kodlarımızın da düzgün çalı¸sabilmesi için o kodları ¸söyle yazmamız gerek:
#!/usr/bin/env python
# coding: utf-8
-*-sayi = input("Bir sayı girin. Ben size o \ sayının karesini söyleyeyim:\n")
print "girdi˘giniz sayı\t\t: %s" %(sayi)
print "girdi˘giniz sayının karesi: %s" % (sayi * sayi)
raw_input()fonksiyonundan farklı olarak input() fonksiyonu kullanıcıdan gelen verileri oldu˘gu gibi alır. Yani bu verileri karakter dizisine dönü¸stürmez. Bu yüzden, e˘ger kullanıcı bir sayı girmi¸sse, input() fonksiyonu bu sayıyı oldu˘gu gibi alaca˘gı için, bizim bu sayıyla aritmetik i¸slem yapmamıza müsaade eder. Bu durumu daha iyi anlayabilmek için mesela a¸sa˘gıda raw_input() fonksiyonuyla yazdı˘gımız kodları siz bir de input() fonksiyonuyla yazmayı deneyin:
#!/usr/bin/env python
# coding: utf-8 -*-a = raw_input("isminiz: ") b = raw_input("soyisminiz: ") print a, b
E˘ger bu kodları input() fonksiyonuyla yazmayı denediyseniz, Python’ın ilk veri giri¸sinden sonra ¸söyle bir hata verdi˘gini görmü¸ssünüzdür:
SyntaxError: invalid syntax
Etkile¸simli kabukta ¸su komutu verdi˘ginizde de aynı hatayı aldı˘gınızı göreceksiniz:
>>> Ahmet
SyntaxError: invalid syntax
Burada hata almamak için ¸söyle yapmak gerek:
>>> "Ahmet"
’Ahmet’
Dolayısıyla Python’ın input() fonksiyonuyla bu hatayı vermemesi için de tek yol, kullanıcının ismini ve soyismini tırnak içinde yazması olacaktır. Ama tabii ki normal ¸sartlarda kimseden ismini ve soyismini tırnak içinde yazmasını bekleyemezsiniz.
Bütün bunlardan ¸sunu anlıyoruz:
input()fonksiyonu, kullanıcının geçerli bir Python komutu girmesini bekler. Yani e˘ger
kullanıcının girdi˘gi ¸sey Python’ın etkile¸simli kabu˘gunda hata verecek bir ifade ise, input()‘lu kodunuz da hata verecektir.
Dolayısıyla e˘ger biz programımız aracılı˘gıyla kullanıcılardan bazı sayılar isteyeceksek ve e˘ger biz bu sayıları i¸sleme sokacaksak (çıkarma, toplama, bölme gibi...) input() fonksiyonunu tercih edebiliriz. Ama e˘ger biz kullanıcılardan sayı de˘gil de karakter dizisi girmesini istiyorsak raw_input()fonksiyonunu kullanaca˘gız.
¸
Simdi dilerseniz bu bölümün en ba¸sında verdi˘gimiz fahrenhayta dönü¸stürme programını, yeni ö˘grendi˘gimiz bilgiler yardımıyla biraz geli¸stirelim:
#!/usr/bin/env python
# coding: utf-8
-*-santigrat = input("Santigrat cinsinden bir de˘ger girin: ") fahrenhayt = santigrat * (9.0/5.0) + 32
print ("%s santigrat derece %s fahrenhayta kar¸sılık gelir."
%(santigrat, fahrenhayt))
Böylece elimizde gayet ¸sık bir derece dönü¸stürme programı olmu¸s oldu.. Günün birinde santigrat dereceleri fayhrenhayta dönü¸stürmeniz gerekirse yukarıdaki programı
kullanabilirsiniz...