Tıpkı raw_input() fonksiyonunda olduğu gibi, input() fonksiyonuyla da kullanıcılardan bazı bilgileri alabiliyoruz.
Şu basit örneğe bir bakalım:
Kullanım açısından, görüldüğü 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 şekilde ortaya çıkacaktır:
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ğimiz sayı 65 olacaktır.
Ancak bu kodları yazarken eğer raw_input() fonksiyonunu kullanırsak, girilen sayılar birbirleriyle toplanmayacak, sadece yan yana yazılacaklardır. Yani elde edeceğimiz şey 2540 olacaktır.
Hatırlarsanız buna benzer bir şeyle sayılardan bahsederken de karşılaşmıştık. O zaman şu örnekleri vermiştik:
İşte raw_input() ile input() arasındaki fark, yukarıdaki iki örnek arasındaki farka benzer. Yukarıdaki örneklerde, Pythonun sayılara ve karakter dizilerine nasıl davrandığını görüyoruz. Eğer Python iki adet sayıyla karşılaşırsa, bu sayıları birbiriyle topluyor. İki adet karakter dizisiyle karşılaşırsa, bu karakter dizilerini birleştiriyor. Bir sayı, bir de karakter dizisi ile karşılaşırsa (sayılarla karakter dizileri arasında herhangi bir birleştirme işlemi veya aritmetik işlem yapılamayacağı için) hata veriyor:
Bütün bu açıklamalardan anlıyoruz ki raw_input() fonksiyonu kullanıcının girdiği verileri karakter dizisine dönüştürüyor.
Bu durumu daha net görebilmek için dilerseniz şöyle bir örnek verelim:
Bu kodları çalıştırdığınızda sayıyı girip ENTER tuşuna bastıktan sonra şöyle bir hata mesajı alacaksınız:
Bu durum, raw_input() fonksiyonunun kullanıcı verilerini karakter dizisi olarak almasından kaynaklanıyor. Karakter dizileri ile aritmetik işlem yapılamayacağı için de hata vermekten başka çaresi kalmıyor. Burada tam olarak ne döndüğünü anlayabilmek için etkileşimli kabukta verdiğimiz şu örneklere bakabilirsiniz:
Gördüğünüz gibi biraz öncekiyle benzer bir hata aldık. İki karakter dizisini birbiriyle çarpamaz, bölemez ve bu karakter dizilerini birbirinden çıkaramazsınız. Çünkü aritmetik işlemler ancak sayılar arasında olur. Karakter dizileri ile aritmetik işlem yapılmaz. Yukarıdaki örneklerin düzgün çıktı verebilmesi için o örnekleri şöyle yazmamız gerekir:
Dolayısıyla, yukarıda hata veren kodlarımızın da düzgün çalışabilmesi için o kodları şöyle yazmamız gerek:
raw_input() fonksiyonundan farklı olarak input() fonksiyonu kullanıcıdan gelen verileri olduğu gibi alır. Yani bu verileri karakter dizisine dönüştürmez. Bu yüzden, eğer kullanıcı bir sayı girmişse, input() fonksiyonu bu sayıyı olduğu gibi alacağı için, bizim bu sayıyla aritmetik işlem yapmamıza müsaade eder. Bu durumu daha iyi anlayabilmek için mesela aşağıda raw_input() fonksiyonuyla yazdığımız kodları siz bir de input() fonksiyonuyla yazmayı deneyin:
Eğer bu kodları input() fonksiyonuyla yazmayı denediyseniz, Pythonun ilk veri girişinden sonra şöyle bir hata verdiğini görmüşsünüzdür:
Etkileşimli kabukta şu komutu verdiğinizde de aynı hatayı aldığınızı göreceksiniz:
Burada hata almamak için şöyle yapmak gerek:
Dolayısıyla Pythonun 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 şartlarda kimseden ismini ve soyismini tırnak içinde yazmasını bekleyemezsiniz.
Bütün bunlardan şunu anlıyoruz:
input() fonksiyonu, kullanıcının geçerli bir Python komutu girmesini bekler. Yani eğer kullanıcının girdiği şey Pythonun etkileşimli kabuğunda hata verecek bir ifade ise, input()lu kodunuz da hata verecektir.
Dolayısıyla eğer biz programımız aracılığıyla kullanıcılardan bazı sayılar isteyeceksek ve eğer biz bu sayıları işleme sokacaksak (çıkarma, toplama, bölme gibi...) input() fonksiyonunu tercih edebiliriz. Ama eğer biz kullanıcılardan sayı değil de karakter dizisi girmesini istiyorsak raw_input() fonksiyonunu kullanacağız.
Şimdi dilerseniz bu bölümde verdiğimiz fahrenhayta dönüştürme programını, yeni öğrendiğimiz bilgiler yardımıyla biraz geliştirelim:
Böylece elimizde gayet şık bir derece dönüştürme programı olmuş oldu. Günün birinde santigrat dereceleri fayhrenhayta dönüştürmeniz gerekirse yukarıdaki programı kullanabilirsiniz...
Şu basit örneğe bir bakalım:
Kod:
[COLOR=White][B]#!/usr/bin/env python # -*- coding: utf-8 -*- a = input("Lütfen bir sayı girin:") b = input("Lütfen başka bir sayı daha girin:") print a + b[/B][/COLOR]
Kullanım açısından, görüldüğü 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 şekilde ortaya çıkacaktır:
Kod:
[COLOR=White][B]#!/usr/bin/env python # -*- coding: utf-8 -*- a = raw_input("Lütfen bir sayı girin:") b = raw_input("Lütfen başka bir sayı daha girin:") print a + b[/B][/COLOR]
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ğimiz sayı 65 olacaktır.
Ancak bu kodları yazarken eğer raw_input() fonksiyonunu kullanırsak, girilen sayılar birbirleriyle toplanmayacak, sadece yan yana yazılacaklardır. Yani elde edeceğimiz şey 2540 olacaktır.
Hatırlarsanız buna benzer bir şeyle sayılardan bahsederken de karşılaşmıştık. O zaman şu örnekleri vermiştik:
Kod:
[COLOR=White][B]>>> 25 + 50 75 >>> "25" + "50" 2550[/B][/COLOR]
İşte raw_input() ile input() arasındaki fark, yukarıdaki iki örnek arasındaki farka benzer. Yukarıdaki örneklerde, Pythonun sayılara ve karakter dizilerine nasıl davrandığını görüyoruz. Eğer Python iki adet sayıyla karşılaşırsa, bu sayıları birbiriyle topluyor. İki adet karakter dizisiyle karşılaşırsa, bu karakter dizilerini birleştiriyor. Bir sayı, bir de karakter dizisi ile karşılaşırsa (sayılarla karakter dizileri arasında herhangi bir birleştirme işlemi veya aritmetik işlem yapılamayacağı için) hata veriyor:
Kod:
[COLOR=White][B]>>> "34" + 34 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: cannot concatenate 'str' and 'int' objects[/B][/COLOR]
Bütün bu açıklamalardan anlıyoruz ki raw_input() fonksiyonu kullanıcının girdiği verileri karakter dizisine dönüştürüyor.
Bu durumu daha net görebilmek için dilerseniz şöyle bir örnek verelim:
Kod:
[COLOR=White][B]#!/usr/bin/env python # -*- coding: utf-8 -*- soru = "Bir sayı girin, o sayının karesini söyleyeyim:" sayi = raw_input(soru) print "girdiğiniz sayı: %s" %(sayi) print "girdiğiniz sayının karesi: %s" % (sayi ** 2)[/B][/COLOR]
Bu kodları çalıştırdığınızda sayıyı girip ENTER tuşuna bastıktan sonra şöyle bir hata mesajı alacaksınız:
Kod:
[COLOR=White][B]Traceback (most recent call last): File "deneme.py", line 8, in <module> print "girdiğiniz sayının karesi: %s" % (sayi ** 2) TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'[/B][/COLOR]
Bu durum, raw_input() fonksiyonunun kullanıcı verilerini karakter dizisi olarak almasından kaynaklanıyor. Karakter dizileri ile aritmetik işlem yapılamayacağı için de hata vermekten başka çaresi kalmıyor. Burada tam olarak ne döndüğünü anlayabilmek için etkileşimli kabukta verdiğimiz şu örneklere bakabilirsiniz:
Kod:
[COLOR=White][B]>>> a = '12' >>> b = '2' >>> a ** b Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'str'[/B][/COLOR]
Gördüğünüz gibi biraz öncekiyle benzer bir hata aldık. İki karakter dizisini birbiriyle çarpamaz, bölemez ve bu karakter dizilerini birbirinden çıkaramazsınız. Çünkü aritmetik işlemler ancak sayılar arasında olur. Karakter dizileri ile aritmetik işlem yapılmaz. Yukarıdaki örneklerin düzgün çıktı verebilmesi için o örnekleri şöyle yazmamız gerekir:
Kod:
[COLOR=White][B]>>> a = 12 >>> b = 2 >>> print a ** b 144[/B][/COLOR]
Dolayısıyla, yukarıda hata veren kodlarımızın da düzgün çalışabilmesi için o kodları şöyle yazmamız gerek:
Kod:
[COLOR=White][B]#!/usr/bin/env python # -*- coding: utf-8 -*- soru = "Bir sayı girin, o sayının karesini söyleyeyim:" sayi = input(soru) print "girdiğiniz sayı: %s" %(sayi) print "girdiğiniz sayının karesi: %s" % (sayi ** 2)[/B][/COLOR]
raw_input() fonksiyonundan farklı olarak input() fonksiyonu kullanıcıdan gelen verileri olduğu gibi alır. Yani bu verileri karakter dizisine dönüştürmez. Bu yüzden, eğer kullanıcı bir sayı girmişse, input() fonksiyonu bu sayıyı olduğu gibi alacağı için, bizim bu sayıyla aritmetik işlem yapmamıza müsaade eder. Bu durumu daha iyi anlayabilmek için mesela aşağıda raw_input() fonksiyonuyla yazdığımız kodları siz bir de input() fonksiyonuyla yazmayı deneyin:
Kod:
[COLOR=White][B]#!/usr/bin/env python # -*- coding: utf-8 -*- isim = raw_input("isminiz: ") soyisim = raw_input("soyisminiz: ") print isim, soyisim[/B][/COLOR]
Eğer bu kodları input() fonksiyonuyla yazmayı denediyseniz, Pythonun ilk veri girişinden sonra şöyle bir hata verdiğini görmüşsünüzdür:
Kod:
[COLOR=White][B]SyntaxError: invalid syntax[/B][/COLOR]
Etkileşimli kabukta şu komutu verdiğinizde de aynı hatayı aldığınızı göreceksiniz:
Kod:
[COLOR=White][B]>>> Ahmet SyntaxError: invalid syntax[/B][/COLOR]
Burada hata almamak için şöyle yapmak gerek:
Kod:
[COLOR=White][B]>>> "Ahmet" 'Ahmet'[/B][/COLOR]
Dolayısıyla Pythonun 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 şartlarda kimseden ismini ve soyismini tırnak içinde yazmasını bekleyemezsiniz.
Bütün bunlardan şunu anlıyoruz:
input() fonksiyonu, kullanıcının geçerli bir Python komutu girmesini bekler. Yani eğer kullanıcının girdiği şey Pythonun etkileşimli kabuğunda hata verecek bir ifade ise, input()lu kodunuz da hata verecektir.
Dolayısıyla eğer biz programımız aracılığıyla kullanıcılardan bazı sayılar isteyeceksek ve eğer biz bu sayıları işleme sokacaksak (çıkarma, toplama, bölme gibi...) input() fonksiyonunu tercih edebiliriz. Ama eğer biz kullanıcılardan sayı değil de karakter dizisi girmesini istiyorsak raw_input() fonksiyonunu kullanacağız.
Şimdi dilerseniz bu bölümde verdiğimiz fahrenhayta dönüştürme programını, yeni öğrendiğimiz bilgiler yardımıyla biraz geliştirelim:
Kod:
[COLOR=White][B]#!/usr/bin/env python # -*- coding: utf-8 -*- santigrat = input("Santigrat cinsinden bir değer girin: ") fahrenhayt = santigrat * (9.0/5.0) + 32 print ("%s santigrat derece %s fahrenhayta karşılık gelir." %(santigrat, fahrenhayt))[/B][/COLOR]
Böylece elimizde gayet şık bir derece dönüştürme programı olmuş oldu. Günün birinde santigrat dereceleri fayhrenhayta dönüştürmeniz gerekirse yukarıdaki programı kullanabilirsiniz...

