Bazı Önemli Ayrıntılar

Şu noktaya kadar Python’la ilgili epey bilgi edindik. Artık Python’la az çok yönümüzü tayin etmeye yetecek kadar malzemeye sahibiz. Bu bölüme gelene kadar, kafa karışıklığına yol açmamak için bazı önemli ayrıntıları es geçmek zorunda kaldık. İşte bu bölümde şimdiye kadar işlediğimiz konular içinde değinmediğimiz, ama mutlaka bilmemiz gereken bu önemli ayrıntılardan söz edeceğiz. Bu bölümü tamamladıktan sonra Python’la ilgili en temel konuları epey ayrıntılı bir şekilde öğrenmiş olacaksınız. Bu da size ilerki konuları daha rahat anlayabilmeniz açısından sağlam bir temel kazandırmış olacak. Bu bölümün sonunda, eğer varsa, aklınızdaki şüphelerin ve belirsizliklerin büyük bir kısmı da aydınlığa kavuşmuş olacaktır. Üstelik bu bölümde, önceki bölümlerde öğrendiğimiz konularla ilgili de bolca örnek yapma fırsatı bulacağız. Hem eski bilgilerimizi tazeleyeceğimiz, hem de yeni şeyler öğreneceğimiz bu bölüme hakettiği ilgiyi göstermeniz halinde, önümüzdeki konuları çok daha rahat kavradığınızı farkedecek, kendinizden emin bir şekilde ilerleyebileceksiniz.

İşleçler (Operators)

Hatırlarsanız sayılar konusunu incelerken aritmetik işlemleri yapabilmek için “+”, “-”, “/” ve “*” gibi işaretlerden yararlanmıştık. Python’da aritmetik işlemler için kullandığımız bu yardımcı işaretlere işleç (operator) adı verilir. Bu işleçler bizim yabancısı olduğumuz bir kavram değildir. Bunları daha önce de bol bol kullandık, şimdiden sonra da bol bol kullanmaya devam edeceğiz. Dilerseniz bilgilerimizi tazelemek için birkaç örnek yapalım:

>>> print 456 + 654

1110

>>> print 456 - 654

-198

>>> print 45 / 56 #iki tamsayı birbirine bölünürse
... #sonuç da tamsayı olur.

0

>>> print 45.0 / 56 #sayılardan biri kayan noktalıysa
... #sonuç da kayan noktalıdır.

0.803571428571

>>> print 5 / 0 #bir sayının 0'a bölünmesi hataya yol açar.

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero

>>> print 45 * 76

3420

Bu işleçler aritmetik işlemleri yapmamızı sağladığı için bunlara özel olarak “aritmetik işleçler” (arithmetic operators) adı verilir. Bunların dışında, öğrenmemiz gereken birkaç aritmetik işleç daha var. İsterseniz onlara bir göz atalım:

“**” işleci

Önceki derslerimizin birinde şuna benzer bir örnek vermiştik:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

sayi = raw_input("Bir sayı girin. Ben size o \
sayının karesini söyleyeyim:\n")

sayi = int(sayi)

print "girdiğiniz sayı\t\t: %s" %(sayi)
print "girdiğiniz sayının karesi: %s" % (sayi * sayi)

Burada bir sayının karesini almak için o sayıyı kendisiyle çarptık. Ama Python’da bir sayının karesini almanın çok daha temiz bir yolu var:

>>> print 12 ** 2

144

“**” işleci Python’da bir sayının herhangi bir kuvvetini almamızı sağlar. Yukarıdaki komut 122 ifadesiyle eşdeğerdir. Eğer bir sayının üçüncü kuvvetini almak isterseniz yukarıdaki komutu şöyle yazmalısınız:

>>> print 12 ** 3

1728

Bu da 123 ifadesine eşdeğerdir.

% işleci

Diyelim ki şöyle bir bölme işlemi yaptınız:

>>> print 13 / 3

4

Gördüğünüz gibi bu bölme işleminin sonucu 4‘tür. Peki biz bu bölme işleminden kalan sayıyı bulmak istersek ne yapacağız? İşte bunun için Python’da “%” adlı bir işleç var:

>>> print 13 % 3

1

Demek ki 13 sayısı 3‘e bölündüğünde kalan 1 imiş...

Bu işleç, bir sayının tek mi yoksa çift mi olduğunu tespit etmeniz gerektiği durumlarda çok işinize yarayacaktır. Eğer bir sayının 2’ye bölümünden kalan sayı 0 ise o sayı çifttir. Aksi halde o sayı tektir:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

sayi = input("Bir sayı girin: ")

if sayi % 2 == 0:
    print "Girdiğiniz sayı çifttir."

else:
    print "Girdiğiniz sayı tektir."

Bu işlecin, arayüz tasarımı sırasında dahi işinize yaradığını göreceksiniz. O yüzden “Bölme işleminden kalan sayıyı bilsem ne olur, bilmesem ne olur,” diye düşünmeyin sakın...

Python’da işleçler yukarıdakilerle sınırlı değildir. Tıpkı yukarıdakiler gibi, önceki derslerimizden bildiğimiz ve matematikten de aşina olduğumuz birkaç işleç daha var:

== “eşittir” anlamına geliyor
> “büyüktür” anlamına geliyor
< “küçüktür” anlamına geliyor
>= “büyük eşittir” anlamına geliyor
<= “küçük eşittir” anlamına geliyor

Sayıları karşılaştırmamızı sağladıkları için bu işleçlere “karşılaştırma işleçleri” (comparison operators) adı verilir. Biz bu işleçleri önceki derslerimizde if, elif, ve else deyimleri ile birlikte kullanmıştık. Mesela:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

yas = int(raw_input("Yaşınız kaç? "))

if yas < 0:
    print "Yok canım, daha neler!?"

elif yas <= 30:
    print "Hmm.. Epey gençsin."

elif yas >= 60:
    print "Yaş kemale ermiş!"

elif yas > 30:
    print "Yaşlanıyorsun dostum!"

Bunlara ek olarak bu bölümde birkaç yeni işleç daha göreceğiz. Bu yeni işleçlere geçmeden önce isterseniz Python’a yeni başlayanların sıkça yaptığı bir hataya değinelim.

Python öğrenmeye yeni başlayanlar, özellikle ilk zamanlarda, “=” ve “==” işaretlerini birbirine karıştırır. Bu işaretler her ne kadar aynı anlama geliyormuş gibi görünse de aslında birbirlerinden çok farklıdır. Durumu birkaç örnekle açıklamaya çalışalım:

>>> sayi = 3456

Burada sayi adlı bir değişken tanımladık. Python’da değişkenleri tanımlarken, yani değişkenlere değer atarken “=” işaretinden yararlanıyoruz. Bu işaretin tek görevi bir değişkene değer atamaktır. Burada sayi adlı değişkene 3456 değerini atıyor.

Bir de şuna bakalım:

>>> sayi == 3456

True

Burada yaptığımız şey sayi adlı değişkene değer atamak değildir. Burada biz sayi değişkeninin değerini sorguluyoruz. Yani burada şöyle bir soru soruyoruz Python’a: “sayi adlı değişkenin değeri 3456 mı?”. Bu soruyu duyan Python bize bir cevap veriyor. Python’un cevabını biraz sonra tartışacağız...

Dediğimiz gibi, yukarıda yaptığımız şey bir değer atamak değil, değer sorgulamaktır. Olmayan bir şeyin değeri sorgulanamaz. Dolayısıyla şöyle bir işlem hata verecektir:

>>> meyve == "elma"

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'meyve' is not defined

Ama siz önce bir meyve değişkeni oluşturursanız, daha sonra bu değişkenin değerini sorgulayabilirsiniz:

>>> meyve = "elma"

>>> meyve == "elma"

True

Burada aldığımız True çıktısına takılmayın. Az sonra bunun ne demek olduğunu inceleyeceğiz.

Gördüğünüz gibi, “=” ve “==” işaretleri birbirlerinden çok farklı anlamlara geliyorlar. O yüzden bunları karıştırmamaya özen gösteriyoruz.

Hatırlarsanız “==” işlecini önceki derslerimizde şöyle bir örnek içinde kullanmıştık:

#!/usr/bin/env python
#-*- coding: utf-8 -*-

alinin_yasi = 23
aysenin_yasi = 23

if alinin_yasi == aysenin_yasi:
    print "Ali ile Ayşe aynı yaştadır!"

Burada da “==” işlecini kullanarak Ali’nin yaşı ile Ayşe’nin yaşını birbiriyle karşılaştırıyoruz. Yukarıdaki örnekte eğer if alinin_yasi = aysenin_yasi gibi bir şey yazarsak Python bize bir hata mesajı gösterecektir. Çünkü daha önce de dediğimiz gibi “=” işareti değer atamaya yarar. Bu örnekte bizim yapmamız gereken şey değer atamaktan ziyade iki değeri karşılaştırmak olmalıdır. Eğer siz burada “==” yerine “=” işlecini kullanacak olursanız Python ne yapmaya çalıştığınızı anlayamayacaktır.

Burada şöyle bir soru akla geliyor: “Biz eşitlik karşılaştırması yapmak için “==” işlecini kullanıyoruz. Peki eşitsizlik karşılaştırması için herhangi bir işleç var mı?

Elbette var. Python’da iki değerin eşitsizliğini sorgulamak için, “eşit değildir,” anlamına gelen ”!=” işlecinden yararlanıyoruz. Mesela bu işleci kullanarak yukarıdaki örneği şöyle yazabiliriz:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

alinin_yasi = 30
aysenin_yasi = 23

if alinin_yasi != aysenin_yasi:
    print "Ali ile Ayşe aynı yaşta değildir!"

Burada şu Türkçe cümleyi Pythonca’ya çevirmiş olduk:

Eğer alinin_yasi adlı değişkenin değeri aysenin_yasi adlı değişkenin değerine eşit değilse, ekrana ‘Ali ile Ayşe aynı yaşta değildir!’ cümlesini yazdır!

Gelin bununla ilgili bir örnek daha verelim konuyu daha net kavramak için:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

parola_ilk = raw_input("Parolanızı giriniz: ")
parola_tekrar = raw_input("Aynı parolayı tekrar giriniz: ")

if parola_ilk != parola_tekrar:
    print "Parolalar eşleşmiyor!"

else:
    print "Programa hoşgeldiniz!"

Burada, karşılaştırma işleçlerinden biri olan ”!=” işlecini kullanarak parola_ilk ve parola_tekrar adlı değişkenlerin değerini karşılaştırıyoruz. Eğer parola_ilk‘in değeri parola_tekrar‘ın değerine eşit değilse Parolalar eşleşmiyor! çıktısı veriyoruz. Aksi halde, yani bu iki değer birbirine eşitse kullanıcıyı içeri alıyoruz. Gördüğünüz gibi ”!=” işleci oldukça kullanışlı bir araç.

Bool Değerler

İngilizce’de, anlamını bütün programcıların çok iyi bilmesi gereken “true” ve “false” diye iki kelime vardır. “True” kelimesinin anlamı “doğru”, “False” kelimesinin anlamı ise “yanlış”tır. Bilgisayar mantığında her şey ya doğrudur, ya da yanlış... Dolayısıyla herhangi bir şey bilgisayar açısından ya True ya da False değere sahiptir.

Hatırlarsanız yukarıda “==” işlecini incelerken, bu işlecin iki değer arasında karşılaştırma yaptığını söylemiştik. Bunu söylerken de şöyle bir örnek vermiştik:

>>> sayi == 3456

True

Bu örnek bize True çıktısı veriyor. Dediğimiz gibi, İngilizce’de “true” doğru demektir. Dolayısıyla yukarıdaki çıktıya göre sayi adlı değişkenin değeri gerçekten de 3456.

Bir de şu örneklere bakalım:

>>> a = 3

>>> a == 3

True

>>> a == 4

False

Burada öncelikle a adlı bir değişken tanımladık. Bu değişkenin değeri 3. Bir sonraki satırda a değişkeninin değerini sorguluyoruz. Burada sorduğumuz soru şu: “a değişkeninin değeri 3 mü?”. a değişkeninin değeri 3 olduğu için burada True yani “doğru” çıktısını aldık. Bir sonraki satırda ise a == 4 gibi bir ifade görüyoruz. Bu da şu anlama geliyor: “a değişkeninin değeri 4 mü?”. a değişkeninin değeri 4 olmadığı için bu kez False, yani “yanlış” çıktısı alıyoruz.

Dediğimiz gibi, bilgisayar dilinde istisnasız her şey ya True [doğru] ya da False [yanlış]’tur. İşte bu iki değere Bool Değerler adı verilir ve bu sistem bilgisayarın temelini oluşturur.

Şimdi biraz daha ayrıntıya girelim. Yukarıda a değişkeninin değerinin başka bir değere eşit olup olmadığını sorguladık. Yani, “a 3 mü?”, “a 4 mü?” gibi sorular sorduk ve buna uygun cevaplar aldık. Bunun yanısıra, başlıbaşına a‘nın kendisini de doğruluk ve yanlışlık açısından sorgulayabiliriz. Mesela şöyle sorular sorabiliriz: “a doğru mu?” veya “a yanlış mı?”. Python’da böyle bir soru sorabilmek için bool() adlı bir fonksiyondan yararlanacağız:

>>> a = 3

>>> bool(a)

True

Python’da eğer herhangi bir şey, herhangi bir değere sahipse o şey True, yani doğrudur. Ama eğer o şey hiç bir değere sahip değilse, False, yani yanlıştır. Biraz kafa karıştırıcı gelmiş olabilir bu tanım. Örnekler durumu daha net anlatacaktır:

>>> a = ""

>>> bool(a)

False

>>> a = "elma"

>>> bool(a)

True

>>> a = " "

>>> bool(a)

True

İlk örnekte a boş bir karakter dizisidir. Yani burada a değişkeni hiç bir değere sahip değil. Dolayısıyla bu değişken False‘tur. İkinci örnekte ise a değişkenin “elma” diye bir değeri var. Bu yüzden bu değişken True‘dur. Üçüncü örnek sizi biraz şaşırtmış olabilir. Ama hiç şaşırtmasın. Çünkü burada a değersiz değil. Bu değişkenin bir değeri var. O da boşluk karakteri! Yani burada a, bir adet boşluk karakteri barındıran bir karakter dizisidir. Unutmayın, boş bir karakter dizisi ile boşluk karakteri içeren bir karakter dizisi birbiriyle aynı şey değildir. Dilerseniz bu durumu kendi gözlerimizle görelim:

>>> a = ""

>>> b = " "

>>> a == b

False

Gördüğünüz gibi, a ile b birbirine eşit değil. Çünkü a boş bir karakter dizisi iken, b bir adet boşluk karakterinden oluşan bir karakter dizisidir... Bu ayrımı asla gözden kaçırmayın.

Dilerseniz bununla ilgili küçük bir örnek verelim:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

soru = raw_input("Adınız: ")

if bool(soru) == True:
    print "Teşekkürler"
else:
    print "Bu soruyu boş geçemezsiniz!"

Bu örnekte eğer kullanıcı soruya herhangi bir cevap verirse ekrana Teşekkürler çıktısı verilir. Ama eğer kullanıcı soruyu cevaplamadan ENTER tuşuna basarsa o zaman Bu soruyu boş geçemezsiniz çıktısı alır.

Gördüğünüz gibi burada bool() fonksiyonunu kullandık. Buradaki if bool(soru) == True: ifadesi şu anlama gelir: “Eğer soru değişkeninin bool değeri True ise...

Yukarıdaki kodları Python’da çok daha kolay yazabiliriz aslında. Zaten Python programcıları yukarıdaki gibi bir şey yazacakları zaman başka bir yol tutmayı tercih ederler. Görelim:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

soru = raw_input("Adınız: ")

if soru:
    print "Teşekkürler"
else:
    print "Bu soruyu boş geçemezsiniz!"

Gördüğünüz gibi, hiç bool() fonksiyonunu araya sokmadan, sadece if soru: diyerek amacımıza ulaşıyoruz. Bu ifade de “Eğer soru değişkeninin bool değeri True ise...” anlamına gelir.

Eğer yukarıdakinin tersini yapmak isterseniz not işlecinden yararlanabilirsiniz (Bu işleci biraz sonra ayrıntılı olarak inceleyeceğiz):

#!/usr/bin/env python
# -*- coding: utf-8 -*-

soru = raw_input("Adınız: ")

if not soru:
    print "Bu soruyu boş geçemezsiniz!"
else:
    print "Teşekkürler"

Burada şöyle demiş oluyoruz: “Eğer soru değişkeninin bool değeri True değil ise...

Bir önceki bölümde şu işleçleri görmüştük:

Aritmetik İşleçler

+ Toplama işlemi yapar
- Çıkarma işlemi yapar
/ Bölme işlemi yapar
* Çarpma işlemi yapar

Karşılaştırma İşleçleri

== “eşittir” anlamına geliyor
!= “eşit değildir” anlamına geliyor
> “büyüktür” anlamına geliyor
< “küçüktür” anlamına geliyor
>= “büyük eşittir” anlamına geliyor
<= “küçük eşittir” anlamına geliyor

Şimdi de mantık işleçlerini (logical operators) inceleyeceğiz. Bir önceki bölümde henüz Bool kavramını öğrenmemiş olduğumuz için mantık işleçlerinden bahsedememiştik. Ama artık bu kavramı bildiğimize göre rahatlıkla mantık işleçlerini işleyebiliriz.

Mantık İşleçleri

and “VE” anlamına geliyor
or “VEYA” anlamına geliyor
not “DEĞİL” anlamına geliyor

Bu işleçler, lisede mantık dersi almış olanlara hiç yabancı gelmeyecektir.

Peki ne işe yarar bu mantık işleçleri?

İsterseniz uzun uzun açıklama yapmak yerine bir örnek verelim:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

kullanici_adi = raw_input("Kullanıcı adınız: ")
parola = raw_input("Parola: ")

if kullanici_adi == "ahmet" and parola == "ah12345678":
    print "Programa hoşgeldiniz!"
else:
    print "Kullanıcı adınız ya da parolanız yanlış"

Burada “and” işlecinin ne işe yaradığı apaçık anlaşılıyor. Yukarıdaki kodlarda, kullanıcının programa kabul edilmesini, hem kullanıcı adının hem de parolanın doğru girilmesi şartına bağlıyoruz. Eğer kullanıcı adı ve paroladan herhangi biri yanlışsa kullanıcı programa giriş izni elde edemez.

Yukarıdaki kodları bir de şöyle yazalım:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

kullanici_adi = raw_input("Kullanıcı adınız: ")
parola = raw_input("Parola: ")

if kullanici_adi == "ahmet" or parola == "ah12345678":
    print "Programa hoşgeldiniz!"
else:
    print "Kullanıcı adınız ya da parolanız yanlış"

Burada “and” yerine “or” kullandığımıza dikkat edin. Bu şekilde kullanıcının programa giriş yapabilmesi için kullanıcı adı veya paroladan birini doğru girmesi yeterli olacaktır.

Dilerseniz etkileşimli kabukta birkaç ufak örnekle durumu daha net anlamaya çalışalım:

>>> True and True

True

Dediğimiz gibi, iki True değer birbirine “and” ile bağlanırsa sonuç True olacaktır.

>>> True and False

False

Eğer değerlerden biri bile False ise sonuç da False olacaktır.

>>> False and False

False

Elbette her iki değerin de False olduğu durumda sonuç da False‘tur.

>>> True or False

True

Eğer iki değer birbirine “or” ile bağlanırsa ve eğer bu değerlerden sadece biri bile True ise sonuç da True olacaktır.

>>> False or False

False

“or” ile birbirine bağlanmış iki değerin ikisi de False ise sonuç da False‘tur.

>>> True or True

True

Elbette her iki değer de True ise sonuç da True olacaktır.

Gelelim “not” işlecine... Bu işleç “değil” anlamına gelir. Yani bu işleç cümleye olumsuz bir anlam katar. Birkaç örnek verelim:

>>> kullanici_adi = "ahmet"

>>> not kullanici_adi

False

Burada Python’a şöyle bir şey söylemiş olduk:

kullanici_adi değişkeninin bool değeri True değildir

O da bize şu cevabı verdi:

Hayır, dostum. Yanılıyorsun! Çünkü kullanıcı_adi değişkeni bir değere sahip olduğu için True’dur.

Hatırlarsanız yukarıda şöyle bir örnek vermiştik:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

soru = raw_input("Adınız: ")

if not soru:
    print "Bu soruyu boş geçemezsiniz!"
else:
    print "Teşekkürler"

Burada if not soru ifadesine dikkat edin. Burada Python’a şunu diyoruz:

Eğer soru değişkeninin bool değeri True değil ise...

Yukarıdaki örnekte eğer kullanıcı “Adınız” sorusunu boş geçerse soru değişkeninin değeri şöyle olacaktır:

soru = ""

Python’da boş karakter dizilerinin False olduğunu biliyoruz. Dolayısıyla eğer kullanıcı soruyu boş geçerse if not soru: satırı işletilecektir...

Dönüştürme İşlemleri

Programcılık maceramız sırasında, verileri birbirine dönüştürmemiz gereken durumlarla sıkça karşılaşacağız. Mesela pek çok durumda bir sayıyı karakter dizisine ve eğer mümkünse bir karakter dizisini de sayıya dönüştürmek zorunda kalacaksınız. Şimdi dilerseniz bu duruma çok basit bir örnek verelim:

Bildiğiniz gibi, Python’da iki tamsayıyı birbirine bölersek elde edeceğimiz çıktı da tamsayı olacaktır. Yani:

>>> print 23 / 3

7

Burada iki adet tamsayı olduğu için Python bize sonucu da tamsayı olarak gösterir. Yani ondalık kısmı atar. Bunu önlemek için, işleme giren sayılardan birini kayan noktalı sayı olarak tanımlamamız yeterlidir:

>>> print 23.0 / 3

7.66666666667

Peki buna benzer bir şeyi aşağıdaki programda nasıl yaparız?

#!/usr/bin/env python
# -*- coding: utf-8 -*-

bolen = input("Bölme işlemi için ilk sayıyı girin: ")
bolunen = input("Bölme işlemi için ikinci sayıyı girin: ")

print "Bölme işleminin sonucu:", bolen / bolunen

Biraz önce, sayıları kendimiz girdiğimiz için, bunların sağına birer ”.0” işareti koyarak sorunu çözüyorduk. Ama şimdi sayıları kullanıcıdan alıyoruz. Dolayısıyla yukarıdaki programın hassas bir sonuç verebilmesi için burada bir dönüştürme işlemi yapmamız gerekiyor. Bu dönüştürme işlemi için float() adlı bir fonksiyondan yararlanacağız:

>>> a = 23

>>> float(a)

23.0

Gördüğünüz gibi, float() fonksiyonu 23 sayısını 23.0 şeklinde bir kayan noktalı sayıya dönüştürdü... Şimdi şuna bakın:

>>> a = 23

>>> b = 3

>>> a / b

7

>>> float(a) / b

7.666666666666667

Gördüğünüz gibi, bölme işlemine giren sayılardan birini bu float() fonksiyonu ile kayan noktalı sayıya döndürerek hassas bir çıktı alabildik. Gelin şimdi bu işlemi yukarıdaki programa uygulayalım:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

bolen = input("Bölme işlemi için ilk sayıyı girin: ")
bolunen = input("Bölme işlemi için ikinci sayıyı girin: ")

print "Bölme işleminin sonucu:", float(bolen) / bolunen

Artık bölme işleminin sonucunu hassas bir şekilde alabileceğiz...

Elbette Python’da float() gibi başka fonksiyonlar da vardır. Mesela int() fonksiyonu bunlardan biridir.

Hatırlarsanız, input() ve raw_input() fonksiyonlarını incelerken, input() fonksiyonuyla yapabileceğimiz her şeyi aslında raw_input() fonksiyonuyla da yapabileceğimizi söylemiştik. İşte bu int() fonksiyonu bize bu konuda yardımcı olacak. Dilerseniz önce bu fonksiyonu etkileşimli kabukta biraz inceleyelim:

>>> a = "23"

Bildiğiniz gibi yukarıdaki a değişkeni bir karakter dizisidir. Şimdi bunu sayıya çevirelim:

>>> int(a)

23

Böylece “23” karakter dizisini sayıya çevirmiş olduk. Ancak tahmin edebileceğiniz gibi her karakter dizisi sayıya çevrilemez. int() fonksiyonu yalnızca sayı değerli karakter dizilerini sayıya dönüştürebilir:

>>> kardiz = "elma"

>>> int(kardiz)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'elma'

Gördüğünüz gibi, “elma” karakter dizisi sayı olarak temsil edilemeyeceği için Python bize bir hata mesajı gösteriyor. Ama “23” gibi bir karakter disini sayı olmaktan çıkaran tek şey tırnak işaretleri olduğu için, bu karakter dizisi sayı olarak temsil edilebiliyor... Gelin isterseniz bu bilgiyi şu örneğe uygulayalım:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

ilk_sayi = int(raw_input("İlk sayıyı girin: "))
ikinci_sayi = int(raw_input("İkinci sayıyı girin: "))

toplam = ilk_sayi + ikinci_sayi

print "Bu iki sayının toplamı: ", toplam

Gördüğünüz gibi, burada yaptığımız şey çok basit. raw_input() fonksiyonunu tümden int() fonksiyonu içine aldık:

int(raw_input("İlk sayıyı girin: "))

Burada özellikle kapanış tırnaklarını eksik yazmamaya özen gösteriyoruz. Python’a yeni başlayanların en sık yaptığı hatalardan biri de açılmış tırnakları kapatmayı unutmaktır.

Böylece input() fonksiyonunun prangasından kurtulmuş olduk! Artık raw_input() fonksiyonuyla da aritmetik işlemler yapabiliyoruz. Nihayet input() gibi tehlikeli bir fonksiyondan yakayı sıyırdığımıza göre bu durumu bir örnekle kutlayabiliriz:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

sayi = int(raw_input("Bir sayı girin. Ben size bu sayının "
                     "istediğiniz kuvvetini hesaplayayım: "))

kuvvet = int(raw_input("Şimdi de %s sayısının kaçıncı kuvvetini "
                       "hesaplamak istediğinizi söyleyin: "
                       %sayi))

print "%s sayısının %s. kuvveti %s olur." %(sayi, kuvvet,
                                            sayi ** kuvvet)

Burada, yazdığımız kodların nasıl işlediğine dikkat etmenin yanısıra, kodları görünüş açısından nasıl düzenlediğimize ve satırları nasıl böldüğümüze de dikkat edin. Daha önce de dediğim gibi, Python görünüşe de önem veren zarif bir dildir.

Peki yukarıda yaptığımız şeyin tersi mümkün mü? Yani acaba bir sayıyı karakter dizisine çevirebilir miyiz? Bu sorunun yanıtı evettir. Bu işlem için de str() adlı fonksiyondan yararlanacağız:

>>> a = 23

>>> str(a)

'23'

Gelin isterseniz şimdiye kadar gördüğümüz dönüştürme fonksiyonlarını topluca görelim:

float() Herhangi bir sayıyı veya sayı değerli karakter dizisini kayan noktalı sayıya dönüştürür.
int() Herhangi bir sayıyı veya sayı değerli karakter dizisini tamsayıya dönüştürür.
str() Herhangi bir sayıyı karakter dizisine dönüştürür.

Bu fonksiyonları iyi öğrenmelisiniz, çünkü Python maceranızda bunlar bol bol karşınıza çıkacak...

Bu bölümü kapatmadan önce dilerseniz Python’daki küçük ama önemli bir fonksiyondan daha söz edelim: type() fonksiyonu.

type() fonksiyonu, herhangi bir değerin hangi tipte olduğunu sorgulamamızı sağlar. Örneğin:

>>> i = 23

>>> type(i)

<type 'int'>

“int”, integer (tamsayı) kelimesinin kısaltmasıdır. Demek ki i değişkeni bir integer, yani tamsayı imiş... Bir de şuna bakalım:

>>> s = "elma"

>>> type(s)

<type 'str'>

“str” de string (karakter dizisi) kelimesinin kısaltmasıdır. Dolayısıyla s değişkeni bir karakter dizisidir.

>>> f = 14.3

>>> type(f)

<type 'float'>

“float”, floating point number (kayan noktalı sayı) kelimesinin kısaltmasıdır. Yani f değişkeni bir kayan noktalı sayıdır.

Bu konuyu da bitirdiğimize göre artık bölüm sorularına geçebiliriz.

Bölüm Soruları

1. Aşağıdaki örnekte if ve elif deyimlerini farklı sıralarda yerleştirdiğinizde nasıl bir sonuç elde edeceğinizi düşünün. Şöyle bir kod yazımı ne tür sorunların ortaya çıkmasına yol açar? Mesela aşağıdaki kodları çalıştıran bir kullanıcı cevap olarak 60 üzeri bir sayı girerse nasıl bir çıktı alır? Çıktının beklediğimiz gibi olmamasının nedeni nedir?

#!/usr/bin/env python
# -*- coding: utf-8 -*-

yas = int(raw_input("Yaşınız kaç? "))

if yas < 0:
    print "Yok canım, daha neler!?"

elif yas <= 30:
    print "Hmm.. Epey gençsin."

elif yas > 30:
    print "Yaşlanıyorsun dostum!"

elif yas >= 60:
    print "Yaş kemale ermiş!"

2. Aşağıdaki işlemlerin sonucu nedir?

>>> True or False

>>> True and False

>>> True and (True or False)

>>> True or (False and True)

>>> True or (False and False)

>>> (False or False) and (False or True)

3. Geçen bölümde yaptığımız basit hesap makinesinde input() fonksiyonunu kullanmıştık. Siz o hesap makinesini raw_input() fonksiyonunu kullanarak yeniden yazın.