• Sonuç bulunamadı

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

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...