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:
#!/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
Kod:
#!/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
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:
>>> 25 + 50 75 >>> "25" + "50" 2550
Kod:
>>> "34" + 34 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: cannot concatenate 'str' and 'int' objects
Bu durumu daha net görebilmek için dilerseniz şöyle bir örnek verelim:
Kod:
#!/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)
Kod:
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'
Kod:
>>> 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'
Kod:
>>> a = 12 >>> b = 2 >>> print a ** b 144
Kod:
#!/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)
Kod:
#!/usr/bin/env python # -*- coding: utf-8 -*- isim = raw_input("isminiz: ") soyisim = raw_input("soyisminiz: ") print isim, soyisim
Kod:
SyntaxError: invalid syntax
Kod:
>>> Ahmet
SyntaxError: invalid syntax
Kod:
>>> "Ahmet" 'Ahmet'
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:
#!/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))
