Süleyman ÖĞREKÇİ
suleymanogrekci.wordpress.com

String, Integer ve Float Veri Tipleri

Bu derste python veri tiplerine giriş yapıyoruz. Önceki derste name ve value kavramlarını anlamıştık, bir değişken tanımlarken bir isime bir değer ataması yaparız. Değer dediğimiz şeyler birer veridir aslında, bu verilerin de farklı çeşitleri vardır.

Bir veri üzerinde halihazırda tanımlı işlemlerin nasıl çıktılar üreteceği tamamen verinin tipine göre belirlidir. Bir önceki derste gördüğümüz gibi 2 ve "2" verilerinde çarpma işlemi farklı sonuçlar üretir, bunlardan birisi integer diğeri ise string veridir.

String Veri Tipi

Yazdırılabilir karakterlerin sıralanarak oluşturduğu verilere string tipi veriler denir. Tırnak işaretleri içine yazılan veriler (tek veya çift tırnak olabilir) python tarafından string veri tipi olarak değerlendirilir.

In [1]:
string1 = 'Merhaba dünya..'
string2 = "Merhaba dünya.."

Pythonda bir değişkenin tipini öğrenmek için type() komutunu kullanırız.

In [2]:
type(string1)
Out[2]:
str

String Verileri Yazdırma

String verileri genelde yazdırma amaçlı kullanırız, nasıl yazdırabileceğimize bakalım. print ifadesini kullanacağız.

In [3]:
print string1
Merhaba dünya..

Tek bir print ifadesi içinde birden fazla string tipi veriyi yazdırabiliriz, bunun farklı yolları var. Birincisi print içerisinde string verileri virgülle ayrılmış olarak sıralayabiliriz.

In [4]:
string3 = "Merhaba"
string4 = "dünya"
print string3, string4
Merhaba dünya

Başka bir örnek verelim, stringler illa değişken olarak önceden tanımlanmış olmak zorunda değil. Print ifadesi içinde doğrudan yazılabilir.

In [5]:
print string3, "yalan", string4,".."
Merhaba yalan dünya ..

Bu yöntemin bir sıkıntısı var, stringlerin arasına otomatik olarak bir boşluk ekliyor. Bazen bunu istemeyiz, yukarıdaki durumda olduğu gibi.

Böyle durumlarda başka bir yöntemi kullanabiliriz, mesela string toplama. Toplama ikili işlemi stringler üzerinde uygulandığında iki stringi yanyana ekleyerek yeni bir string çıktı üretir.

In [6]:
print string3 + "yalan" + string4 + ".."
Merhabayalandünya..

Gördüğünüz gibi gereksiz boşluk yok bu yöntemle, gerekli yerlere kendimiz boşluk ekleyebiliriz.

In [7]:
print string3 + " yalan " + string4 + ".."
Merhaba yalan dünya..

String verilerini biçimlendirmede en kullanışlı yöntemlerden biri de aşağıdaki örnekte gösterilmektedir.

In [8]:
print "%s yalan dünya.." % string3
Merhaba yalan dünya..

Buradaki %s ifadesine bir biçimleyici (formatter) denir, bulunduğu yere satır sonunda belirtilen string tipi veriyi yazdırır.

Bu yöntemle birden fazla string değişkeni kullanılacaksa parantez kullanılmalıdır, aşağıdaki gibi.

In [9]:
print "%s yalan %s.." % (string3, string4)
Merhaba yalan dünya..

String verilerde bazen bir karakterden fazla boşluk bırakmak, bir alt satıra geçmek, bazı özel karakterler yazmak gibi ihtiyaçlarımız olabilir. Bunları kaçış (escape) karakterleri denilen komutlarla yaparız.

Aşağıdaki örnekte dört karakter boşluk (tab boşluğu) eklemek için \t, bir alt satıra geçmek için \n, ve " karakterini yazdırmak için \" kaçış karakterlerini kullandık. Bunların dışındaki kaçış karakterlerini raştırıp öğrenin.

In [10]:
gunler = "Pts, Sl, Çrş, Prş, Cm, Cts, Pz"
aylar = "\nOcak\nŞubat\nMart\nNisan\nMayıs\nHaziran"

print "Haftanın günleri:", gunler
print "Bir yarım yıldaki aylar:", aylar

print """
Diğer yarım yıldaki aylar ise
Temmuz, Ağustos, Eylül,
Ekim, Kasım ve Aralık'tır.
"""

#bir liste yazdıralım
print """ \t *İlkbahar
\t *Yaz
\t *Sonbahar
\t *Kış
"""

#özel karakterler için
print "3'21\" ifadesi \nÜç Dakika yirmi bir Saniye \nolarak okunur."
Haftanın günleri: Pts, Sl, Çrş, Prş, Cm, Cts, Pz
Bir yarım yıldaki aylar: 
Ocak
Şubat
Mart
Nisan
Mayıs
Haziran

Diğer yarım yıldaki aylar ise
Temmuz, Ağustos, Eylül,
Ekim, Kasım ve Aralık'tır.

 	 *İlkbahar
	 *Yaz
	 *Sonbahar
	 *Kış

3'21" ifadesi 
Üç Dakika yirmi bir Saniye 
olarak okunur.

Bu örnekte yeni birşey daha gördük, birden fazla satırdan oluşan string verilerini nasıl tek print ifadesi ile yazdıracağımızı. Gördüğümüz gibi bunun için ardışık üç tane tırnak işareti kullanırız.

String Verileri İçin Metodlar

Python nesne yönelimli bir programlama dilidir, pythonda herşey bir nesnedir, stringler de. OOP konusuna geçince bunlar daha iyi anlaşılacak, ama şimdilik her nesne üzerinde tanımlı işlemler ve fonksiyonlar var demekle yetinelim. Bunlara metod diyoruz.

Bir nesne üzerinde tanımlı bir metodu kullanmak için nesne.metod() gibi bir komut kullanırız, örneğin string verileri üzerinde tanımlı bir upper metodu vardır, bu metod bir stringi büyük harfle yeniden tanımlar.

In [11]:
print string3.upper()
MERHABA

Bir nesne üzerinde kullanılabilir metodları dir komutuyla öğrenebiliriz. Aşağıda gördüğünüz gibi bir string veri için çok sayıda metod var, bunların ne işe yaradığı üzerinde durmayacağız. Hepsini araştırıp ne işe yaradığını öğrenin, gerektiği durumlar olacak ileride.

In [12]:
dir(string3)
Out[12]:
['__add__',
 '__class__',
 '__contains__',
 '__delattr__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__getitem__',
 '__getnewargs__',
 '__getslice__',
 '__gt__',
 '__hash__',
 '__init__',
 '__le__',
 '__len__',
 '__lt__',
 '__mod__',
 '__mul__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__rmod__',
 '__rmul__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '_formatter_field_name_split',
 '_formatter_parser',
 'capitalize',
 'center',
 'count',
 'decode',
 'encode',
 'endswith',
 'expandtabs',
 'find',
 'format',
 'index',
 'isalnum',
 'isalpha',
 'isdigit',
 'islower',
 'isspace',
 'istitle',
 'isupper',
 'join',
 'ljust',
 'lower',
 'lstrip',
 'partition',
 'replace',
 'rfind',
 'rindex',
 'rjust',
 'rpartition',
 'rsplit',
 'rstrip',
 'split',
 'splitlines',
 'startswith',
 'strip',
 'swapcase',
 'title',
 'translate',
 'upper',
 'zfill']

Pythonda bir komut için yardım bilgisi (docstring) görüntülemek için help(komut) komutu kullanılabilir, Jupyter notebook ile bir komut hakkında yardım bilgisini görüntülemek için sonuna bir soru işareti eklemek yeterli.

In [13]:
help(string3.swapcase)
Help on built-in function swapcase:

swapcase(...)
    S.swapcase() -> string
    
    Return a copy of the string S with uppercase characters
    converted to lowercase and vice versa.

String İndisleme

string verileri karakterlerin sıralanmasıyla oluşturulur demiştik, string veriyi bir sayı dizisi gibi düşünüsek bu karakterlerin string verinin terimleri olur. Sayı dizilerinde olduğu gibi her terimin bir indisi vardır, fakat 1 ile değil 0 ile başlar. Yani string[0] komutu stringin ilk karakterini verir.

In [14]:
print string1
print string1[0]
print string1[1]
print string1[2]
print string1[3]
Merhaba dünya..
M
e
r
h

İndisler yardımıyla tek bir karakter yerine ardışık karakter dizilerini de elde edebiliriz, köşeli parantezler içinde iki nokta üst üste kullanarak yaparız bunu. Bu işleme dilimleme denir.

In [15]:
print string1[3:8]
print string1[5:]
print string1[:13]
haba 
ba dünya..
Merhaba düny

Pythonda indisleme iki türlüdür; baştan sonra, ya da sondan başa doğru. Yukarıdaki örnekler baştan sona indisleme ile ilgiliydi.

In [16]:
print string3
print string3[-1]
print string3[-2]
print string3[-3]
print string3[-4]
print string3[-5]
print string3[-6]
print string3[-7]
Merhaba
a
b
a
h
r
e
M

Bu durumda dilimleme de benzer şekilde yapılır.

In [17]:
print string4
print string4[-5:-1]
print string4[-3:]
print string4[:-2]
dünya
üny
nya
dün

Integer ve Float veri tipleri

Üzerinde aritmetik işlemler yapılabilen sayılar için integer ve float veri tiplerinden faydalanırız. Trınak işareti kullanmadan bir sayı python tarafından integer olarak algılanır. Ondalıklı sayılar pythonda float veri tipi olatak adlandırılır, tanımlamak için virgül değil nokta kullanırız.

In [18]:
veri1 = 5
veri2 = 3.5

Yukarıda tanımladığımız değişkenlerden ilki bir integer, ikincisi ise bir float verisidir.

In [19]:
type(veri1)
Out[19]:
int
In [20]:
type(veri2)
Out[20]:
float

Integer veya float olarak tanımlanmış bir veriyi str() komutuyla string tipine çevirebiliriz. int() komutu da bunun tam tersini yapar, string tipindeki bir veriyi integer tipine dönüştürür, eğer mümkünse.

Aşağıdaki örneği inceleyin, bu örnekte yeni birşeyler göreceksiniz, boş satırlar. Python program kodlarında boş satırların bir anlamı yoktur, kolay okumak için kodlarınız arasına boş satırlar koyabilirsiniz. Yalnız dikkat edin; tüm satırın boş olması anlamsızdır ama belirli sayıda boşluk (tab gibi) python için anlamlıdır, gerekmedikçe kullanmayın.

In [21]:
a = 2
b = 0
c = 9

d = str(a) + 2*str(b) + str(c)

print d, "yazarken de iki", b, "var."
print c, "un yanındaakii", b, "solda", b, ", sildiniz. Kaldı mı", c, "?"
print a, "nin yanında bir", b, "var, onu da sildiniz. Kaldı mı", a, "?"
print "Toplayın ne yapar?", a+c, "yapar."
print d, "un içerisindeki iki", b, "ı da sildiniz. Ne kaldı?"
print str(a) + str (c), "kaldı."
print a + c, "ile", str(a) + str(c), "u toplayın", a + c + int(str(a) + str(c)), "yapar."
2009 yazarken de iki 0 var.
9 un yanındaakii 0 solda 0 , sildiniz. Kaldı mı 9 ?
2 nin yanında bir 0 var, onu da sildiniz. Kaldı mı 2 ?
Toplayın ne yapar? 11 yapar.
2009 un içerisindeki iki 0 ı da sildiniz. Ne kaldı?
29 kaldı.
11 ile 29 u toplayın 40 yapar.

Integer ve float ile aritmetik işlemler yaparken şuna dikkat etmeliyiz, iki integerin bölümü pythonda bir integer sonuç döndürür. Bu durum python 3x versiyonlarında böyle değildir, dikkat etin.

Aşağıdaki örneği uygulayın, ayrıca toplama ve çarpma dışında pythonda tanımlı olan aritmetik işlemleri araştırıp öğrenin.

In [22]:
nufus = 125
tavuk = 220
gunluk_toplam_yumurta = 143
gunluk_yumurta_orani = float(gunluk_toplam_yumurta) / tavuk

print "Köyümüzde", nufus, "insan ve", tavuk, "tavuk yaşamaktadır."
print "Günde toplam", gunluk_toplam_yumurta, "kadar yumurta alıyoruz."
print "Dolayısıyla bir tavuk günde ortalama", gunluk_yumurta_orani, "yumurta veriyor."
print "Diğer yandan kişi başına", nufus / tavuk, "tane tavuk düşüyor."
print "Sonuç olarak kişi başına günde", (nufus / tavuk) * gunluk_yumurta_orani, "düşer."

print "Bu işte bir yanlışlık var, bir de şöyle deneyelim"
#ipucu: nufus ve tavuk değişkenleri integer, dikkat et!!

print "Diğer yandan kişi başına", float(nufus) / float(tavuk), "tane tavuk düşüyor."
print "Yani kelle başı", (float(nufus) / float(tavuk)) * gunluk_yumurta_orani, "yumurta!"
Köyümüzde 125 insan ve 220 tavuk yaşamaktadır.
Günde toplam 143 kadar yumurta alıyoruz.
Dolayısıyla bir tavuk günde ortalama 0.65 yumurta veriyor.
Diğer yandan kişi başına 0 tane tavuk düşüyor.
Sonuç olarak kişi başına günde 0.0 düşer.
Bu işte bir yanlışlık var, bir de şöyle deneyelim
Diğer yandan kişi başına 0.568181818182 tane tavuk düşüyor.
Yani kelle başı 0.369318181818 yumurta!

Örnekte gördüğümüz gibi bir integer verisini float() komutuyla float tipine dönüştürebiliriz. Bunun yerine nüfus değerini 125 yerine 125.0 olarak tanımlayabiliriz, böylece bir integeri float verisi olarak kayıt etmiş oluruz.

In [23]:
nufus_yeni = 125.0
type(nufus_yeni)
Out[23]:
float

Daha önce gördüğümüz %s string biçimleyiciye benzer şekilde %d ve %f biçimleyiciler de vardır, aşağıdaki örneği inceleyin.

In [24]:
isim = 'Süleyman'
soyisim = 'Öğrekçi'
yas = 32
boy = 170 #santimetre cinsinden
kilo = 68 #kilogram cinsinden

print "Merhaba, benim adım %s." % isim
print "Ad-Soyad: %s %s." % (isim, soyisim)
print "%d yaşındayım." % yas
print "Boyum %d cm, kilom ise %d kg." % (boy, kilo)

#VKİ = kilo / boy^2 olarak hesaplanır.
print "Vücut kitle indeksim de %f oluyor." % (float(kilo) / (float(boy)/100) ** 2)

print "." * 20 #bu kullanıma dikkat et

yanlisbilgi1 = "Bir %s için VKİ" % 'Erkek'
yanlisbilgi2 = "%d ile %d arasında olmalıdır." % (20, 25)
yalan1 = "%d yaşında bir %s olan" % (yas, 'Erkek')
yalan2 = "%s %s gayet sağlıklı bir insandır." #Bu haliyle biraz eksik gibi sanki

print yanlisbilgi1, yanlisbilgi2
print yalan1, yalan2 % (isim, soyisim) #Burada eksikler tamamlandı
Merhaba, benim adım Süleyman.
Ad-Soyad: Süleyman Öğrekçi.
32 yaşındayım.
Boyum 170 cm, kilom ise 68 kg.
Vücut kitle indeksim de 23.529412 oluyor.
....................
Bir Erkek için VKİ 20 ile 25 arasında olmalıdır.
32 yaşında bir Erkek olan Süleyman Öğrekçi gayet sağlıklı bir insandır.

Kullanıcıdan Veri Alma (Input)

Yazdığımız programlarda sıklıkla kullanıcıdan bazı değerleri girmesini isteriz, bunun için pythonda raw_input() komutu vardır. Bu komut kullanıcı girişini bir string olarak değerlendirir.

In [25]:
giris1 = raw_input("Birşeyler yaz:")
print "Yazdığın şey \"%s\". " % giris1
print "Bana göre bu verinin tipi aşağıdaki gibi:"
type(giris1)
Birşeyler yaz: suleyman123Yazdığın şey "suleyman123". 
Bana göre bu verinin tipi aşağıdaki gibi:
Out[25]:
str

Daha önce gördüğümüz yöntemlerle bu stringi integer veya float tipine dönüştürebilir ve sonra istediğimiz işlemleri yapabiliriz. Aşağıdaki örneği inceleyin.

In [26]:
isim = raw_input("İsim:")
soyisim = raw_input("Soy İsim:")
yas = int(raw_input("Yaş:"))
boy = int(raw_input("Boy:")) #santimetre cinsinden
kilo = int(raw_input("Kilo:")) #kilogram cinsinden

print "Merhaba, benim adım %s." % isim
print "Ad-Soyad: %s %s." % (isim, soyisim)
print "%d yaşındayım." % yas
print "Boyum %d cm, kilom ise %d kg." % (boy, kilo)

#VKİ = kilo / boy^2 olarak hesaplanır.
print "Vücut kitle indeksim de %f oluyor." % (float(kilo) / (float(boy)/100) ** 2)
İsim: SuleymanSoy İsim: OgrekciYaş: 32Boy: 170Kilo: 67Merhaba, benim adım Suleyman.
Ad-Soyad: Suleyman Ogrekci.
32 yaşındayım.
Boyum 170 cm, kilom ise 67 kg.
Vücut kitle indeksim de 23.183391 oluyor.