Python Programlamaya Giriş 2 - Sayılar, Aritmetik, Temel Veri Yapıları

Python Programlamaya Giriş
Author

Kaan Öztürk

Published

December 11, 2017

Yeni başlayanlar için Python programlamayı anlatan yazı dizimizin ikinci bölümünde sayıları, aritmetik işlemlerini, ve Python’daki temel veri tiplerini (listeler, çokuzlar, dizeler, sözlükler) işliyoruz.

Bu yazıda sadece kısa ve işlevsel bir giriş yapıyoruz. Sonraki bölümlerimizde veri yapılarının kullanımından daha fazla bahsedeceğiz.

Sayılar ve aritmetik

Python’da öntanımlı (built-in) üç çeşit sayı var: Tamsayılar, reel sayılar, ve karmaşık sayılar. Reel sayılar bilgisayarda kayan nokta (floating point) biçiminde temsil edilir. Bilimsel hesaplama yapanlar için kayan nokta temsilini iyi anlamak çok mühim, ama bunu daha sonraya bırakalım.

Bu üç sayı tipiyle öntanımlı olarak yedi aritmetik işlem yapılabilir: Toplama (+), çıkarma (-), çarpma (*), bölme (/), tamsayı bölme (//), kalan (%), ve üs alma (**).

2 + 3
5
7 - 12.4
-5.4
5.25 * 6.25
32.8125
25 / 8
3.125
25 // 8
3
25 % 8
1
0.5 ** 1.2
0.43527528164806206

Tamsayılarda üst sınır yoktur; bellek yettiğince büyük sayılara çıkılabilir.

3**1000
1322070819480806636890455259752144365965422032752148167664920368226828597346704899540778313850608061963909777696872582355950954582100618911865342725257953674027620225198320803878014774228964841274390400117588618041128947815623094438061566173054086674490506178125480344405547054397038895817465368254916136220830268563778582290228416398307887896918556404084898937609373242171846359938695516765018940588109060426089671438864102814350385648747165832010614366132173102768902855220001

Reel sayılarda ise üst sınırı aşma (overflow) problemi, başka dillerde olduğu gibi mevcuttur.

2.9**1000
OverflowError: (34, 'Numerical result out of range')

Karmaşık sayıları yazarken sanal birimi 1j veya 1J olarak yazarız. Ayrıca fonksiyon çağrısı complex(a,b) bize a+bj sayısını verir.

z = 1 + 3j
z ** 2
(-8+6j)
z * 1j
(-3+1j)
z - (3 - 1.3j)
(-2+4.3j)
z - complex(3, -1.3)
(-2+4.3j)

İki farklı tipte sayı aynı işlemde kullanılırsa, hangi tip daha genelse sonuç o tipte verilir. Tamsayı ve reel sayı kullanılırsa sonuç reeldir; reel sayı ve karmaşık sayı kullanılırsa sonuç karmaşıktır.

1 + 4
5
1 + 4.0
5.0
1 + 4 + 0j
(5+0j)
type(1+4), type(1+4.0), type(1+4+0j)
(int, float, complex)

Değişken atamaları

Python’da değişkenlerin tiplerini (int, float, vs.) önceden beyan etmek gerekmez. Değişken isimleri, atamanın sağ tarafındaki ifadeye işaret eden bir isimdir sadece.

x = -2      # bir tamsayı
y = 3/4 * 2 # reel sayı
z = "Merhaba"+"Dünya" # dize
x,y,z
(-2, 1.5, 'MerhabaDünya')

Çoklu atamalar yapmak mümkündür:

x, y, z = -2, 1.5, "Merhaba Dünya"
x,y,z
(-2, 1.5, 'Merhaba Dünya')

Bu usulü kullanarak iki değişkenin değerini, bir ara değişken kullanmadan değiştokuş etmek mümkün olur.

x,y = y,x
x,y
(1.5, -2)

Python 3 ile değişken isimlerinde herhangi Unicode karakterleri kullanabilirsiniz.

kağıt_sayısı = 5
ölçü = 0.3

Bir değişkeni del komutuyla bellekten silebiliriz.

del z
print(z)
NameError: name 'z' is not defined

İşlem öncelikleri

İşlemlerin bazıları diğerlerinden daha önce yapılır. Önceliklerde okulda öğrendiğimiz kurallar genelikle geçerlidir. Aynı ifade içinde önce üs alma, sonra çarpma, bölme ve kalan bulma işlemleri, sonra da toplama ve çıkarma işlemi yapılır. Aynı öncelik sınıfında bulunan işlemler, soldan sağa sırayla yapılır. Öncelik sırasını değiştirmek için parantez kullanılır.

2 + 3*4, (2+3)*4
(14, 20)
4 + 3**2, (4+3)**2
(13, 49)
3*4/2*6, 3*4/(2*6)
(36.0, 1.0)

Öncelik sırası kavramı aritmetik işlem olsun olmasın, dildeki her türlü operatör için de geçerlidir. Tam bir liste için Python referans sayfalarına bakabilirsiniz.

Atama (=) işlemi en düşük önceliğe sahiptir. Bir değişkene bir değer ataması yaparken önce eşit işaretinin sağ tarafının değeri hesaplanır. Değişkene değer atama işlemi en son yapılır. Python’da bir atama başka bir ifadenin parçası olamaz.

x = 1
x = 3*x + 5
x
8
(x=3)*x+5
SyntaxError: invalid syntax (<ipython-input-27-5aaaedf6169a>, line 1)

Öntanımlı veri yapıları

Sayılara ek olarak, Python diline dahil birkaç öntanımlı veri yapısı var. Bunları daha sonraki bölümlerde daha ayrıntılı işleyeceğiz. Şimdilik, pratik kullanıma yetecek kadar tanıtalım.

Dizeler

Bir dize (string), karakterlerin (harf, rakam, ve diğer işaretler) birleşiminden oluşur. Tek tırnak veya çift tırnak içinde olmalıdır.

Dizenin içindeki karakterlere indeksleme işlemi [] ile erişilebilir. İndeks değerleri sıfırdan başlar; birinci karakter için 0, ikinci karakter için 1, vs. Negatif indeksler sondan başlayarak saymak için kullanılabilir: Son karakter için -1, sondan bir önceki için -2, vs. gibi.

isim = "Albert Einstein"
isim[0] # İlk karakter
'A'
isim[1] # İkinci karakter
'l'
isim[-1] # Son karakter
'n'
isim[-2] # Sondan bir önceki karakter
'i'

Çokuzlar

Bir çokuz (tuple) çeşitli nesneleri yuvarlak parantezler içinde birleştirir. Çokuz elemanlarının aynı tipten olması gerekmez. Dizelerde kullanılan indeksleme kuralları çokuzlarda da geçerlidir.

a = (3.14, 2, 'Albert', 3+4j, (7.25,-23))
a[0]  # birinci eleman
3.14
a[-1][0] # Son elemanın birinci elemanı
7.25

Çokuzlar atamada kullanılırsa, her eleman birebir eşleştirilerek atama yapılır.

(x, y, z) = (-1.25, 42, "Merhaba")
x
-1.25
y
42
z
'Merhaba'

Virgülle ayrılmış bir ifade otomatik olarak çokuza dönüştürülür, yani yukarıdaki örneği

x, y, z = -1.25, 42, "Merhaba"

şeklinde de yazabilirsiniz. Yukarıda bahsettiğimiz çoklu atama bu şekilde çalışır.

Dizelerle çokuzların ortak özellikleri değiştirilemez (immutable) olmalarıdır. Elemanlarına yeni değerler atayamazsınız.

z = "Merhaba"
z[0] = "m"
TypeError: 'str' object does not support item assignment
a = (1,2,3)
a[0] = -1
TypeError: 'tuple' object does not support item assignment

Listeler

Liste, köşeli parantez içinde, virgülle ayrılmış elemanları birleştiren br yapıdır. Çokuzlar gibi listelerde de elemanlar farklı tiplerde olabilir. Dizeler ve çokuzlar için geçerli olan eleman indeksleme işlemleri listelerde de aynen geçerlidir. Listelerin çokuzlardan farkı değiştirilebilir (mutable) olmalarıdır, yani elemanlarına tekrar atama yapılabilir.

liste = [5, "merhaba", (2,3,1), [-1,0,2]]
liste[0] = 4.1  # birinci elemanı değiştir
liste[-1][0] = 12 # son elemanın birinci elemanını değiştir
liste
[4.1, 'merhaba', (2, 3, 1), [12, 0, 2]]
liste[1] = "naber" # İkinci elemana başka bir dize ata.
liste
[4.1, 'naber', (2, 3, 1), [12, 0, 2]]
del liste[2] # Üçüncü elemanı sil
liste
[4.1, 'naber', [12, 0, 2]]

Ancak, listenin bir elemanı değiştirilemez bir tipteyse, o elemanın alt elemanlarını silemez veya onlara atama yapamazsınız.

liste[1][0] = "h"
TypeError: 'str' object does not support item assignment

Sözlükler

Dize, çokuz, ve liste tipleri sıralı tip (sequence type) olarak anılır, çünkü birinci elemandan son elemana kadar iyi tanımlanmış bir düzenleri mevcuttur. Sözlük (dictionary) tipi ise sıralı değildir. Sözlükler, listelerin genelleştirilmiş halidir: Listelerde elemanların referanslarının sıfırdan başlayan tamsayılar olması gerekirken, sözlüklerde ise çok değişik veri tipleri her şey referans olarak kullanılabilir. Bu tür veri tipleri hash table, hash map, veya associative array olarak da bilinirler.

d = {-1.75: "merhaba", "isim":"Einstein"}
d[-1.75]
'merhaba'
d["isim"]
'Einstein'
d[(2,3)] = [1,2,3.14159]
d
{-1.75: 'merhaba', 'isim': 'Einstein', (2, 3): [1, 2, 3.14159]}
d[-2.25] = 3 + 5j
d[1+2j] = 42
d["isim"] = "Eisenstein"
d
{-1.75: 'merhaba',
 'isim': 'Eisenstein',
 (2, 3): [1, 2, 3.14159],
 -2.25: (3+5j),
 (1+2j): 42}
del d["isim"]
d
{-1.75: 'merhaba', (2, 3): [1, 2, 3.14159], -2.25: (3+5j), (1+2j): 42}

Sözlük yaratırken süslü parantezler {} kullanırız. Sözlük elemanlarına ise, çokuzlar ve listelerdeki gibi, köşeli parantez içinde referans değerini yazarak erişiriz. Yeni referans değerlerine sahip sözlük elementleri yaratabilir, istemediğimiz elemanları del komutuyla silebiliriz.

Sözlüklerde referans olarak sadece değiştirilemez tipler kullanılabilir (sayılar, dizeler, çokuzlar). Listeler kullanılamaz.

d[ [1,2,3] ] = 5
TypeError: unhashable type: 'list'