## 36. Son sıramız

Listeler ve stringler `[::]` kullanımı ile dilimlendirilebilirler. Bir eleman ya da karakter onun indeksi ile [indeks] şeklinde bir kullanımla bulunabilir. Bu özelliklerinden dolayı bu nesneler sıralı veri tipi olarak bilinirler. Python'da buna benzer başka sıralı veri tipleri de vardır; bunlardan en yaygın olanı, tüplerdir (tuples).

### Virgül güçlü bir şeydir

Büyük bir sayı yazarken virgül kullanmayı denediğimizi hatırlayın, bir başka örnek:

    >>> 1,000
    (1, 0)

Python virgülle ayrılmış iki değeri bir tüpün elemanları olarak kabul etti. Tüpü yazarken değerlerin etrafına parantez koyarak bunların tek bir nesne olduğunu belitti.

Not: Kendiniz deneme yaptığınızda (aynı sayılarla ya da farklı sayılarla) bir hata mesajıyla karşılaştıysanız bunu şimdilik önemsemeyin, buna dersin sonunda geri döneceğiz.

Daha ilginç bir örnek:

    >>> a = 1, 2, 3, 4, "yeter!"
    >>> print a
    (1, 2, 3, 4, 'yeter!')

    >>> a[0]
    1

    >>> a[1:4]
    (2, 3, 4)

    >>> a[-1]
    'yeter!'

Tüpleri, tüplerin içine de koyabiliriz, örnekler:

    >>> b = 1, 2, 3

    >>> c = 4, 5, b
    >>> print c
    (4, 5, (1, 2, 3))

    >>> d = 1, 2, (3, 4, 5)
    >>> print d
    (1, 2, (3, 4, 5))

Listeler ve tüpler kullandıkları parantez türleri dışında birbirlerine benzer şeyler gibi algılanmış olabilir. Ancak aralarında çok önemli bir fark vardır:

    >>> my_tuple = 1, 2, 3
    >>> my_list = [1, 2, 3]

    >>> print my_tuple
    (1, 2, 3)
    >>> print my_list
    [1, 2, 3]

    >>> my_list[1] = "new"
    >>> print my_list
    [1, 'new', 3]

    >>> my_tuple[1] = "new"
    Traceback (most recent call last):
      File "<input>", line 1, in ?
    TypeError: object does not support item assignment

Bir listede bir elemanın değerini değiştirerek veya yeni bir ekleme yaparak değişiklik yapılabilir, ancak bu durum tüpler için geçerli değildir. Tüplerde değişiklik yapılamaz bu nedenle tüpler sabit değerlerden oluşur denilir. Sayıların yanı sıra bir başka sabit veri tipi stringlerdir:

    >>> my_string = "abcd"
    >>> my_string[2]
    'c'
    >>> my_string[2] = "e"
    Traceback (most recent call last):
      File "<input>", line 1, in ?
    TypeError: object does not support item assignment

Tüpler sabit olduklarından, sözlüklerde anahtar olarak kullanabilirler.

### sözlükler, listeler ve tüpler

Python'un bir listedeki elemanların yerlerini nasıl girildiyse aynı sırada muhafaza ettiğini, ancak sözlüklerin içeriği yazdırıldığında bunların tesadüfi bir sıra ile yazdırıldığını daha önceden görmüştük. Bunu daha ayrıntılı olarak Reeborg'un dünyasında görebiliriz.

"Show/Hide world file" butonuna basın, daha sonra butonuna basın.

Bir kaç duvar yaratın ve dünya dosyasında nelerin değiştiğini gözlemleyin. Oluşturulan tüm duvarlar listenin bir elemanıdır ve bu elemanların değerleri de koordinatları gösteren birer tüptür. Oluşturulan yeni duvarlar listenin sonuna eklenirler. Üstüne tıklayarak bir duvarı sildiğinizde, listede yer aldığı pozisyondan kaldırılır. Hemen ardından sildiğiniz duvarı yeniden oluşturursanız, listenin sonuna eklenir.

Bir de biplere bakalım ve karşılaştırma yapalım. Herhangi bir köşede farenin sağ butonuna basarak istediğiniz sayıda bip yerleştirebilirsiniz. Biplerin sayısını değiştirdiğiniz zaman, değişiklik yerinde yapılacaktır. Eğer bip olmayan bir köşeye yeni bir bip eklerseniz yeni bip genellikle en sona eklenmeyecektir. (Bunu görebilmek için farklı köşelerde biplerinizin olması gerekebilir) Pek çok bip yerleştirin. Bip olan bir köşeyi seçin ve bip sayısını 0'a indirin, aynı anda dünya dosyasını da izleyin. Aynı duvarlarda olduğu gibi girdi kaybolur. Şimdi aynı köşeye yeniden bip yerleştirin. Yeni girdi listelerde olduğu gibi sona değil, orijinal yerine yerleştirilir. Bunun nedeni, sözlüklerdeki sıralamanın belirlenmesinde anahtarlar (bizim durumumuzda koordinatların olduğu tüpler) yerleştirilirken "hash" matematiksel fonksiyonunun kullanılmasındandır. Python bunu etkili bir şekilde kullanır, ancak bu bize tesadüfi gözükür.

### Sekizli, onaltılı ve ikili tabanda sayılar

Not: Python'u öğrenmeye devam etmek için bu bölümü tam olarak anlamak zorunda değilsiniz.

Dersin başında kendiniz deneme yaptığınızda (aynı sayılarla ya da farklı sayılarla) bir hata mesajıyla karşılaştıysanız bunu şimdilik önemsemeyin demiştim. Bununla ilgili iki örnek daha verelim:

    >>> 1,023
    (1, 19)

    >>> 1,099
      File "<input>", line 1
        1, 099
             ^
    SyntaxError: invalid token

Python 0'la başlayan bir sayıyı sekiz tabanına göre yazılmış kabul eder.

Günlük hayatta kullandığımız sayılar 10 tabanındadır ve 10 rakam "0, 1, 2, 3, 4, 5, 6, 7, 8 ve 9" kullanılarak elde edilirler. Örneğin 345 aşağıdaki gibi açıklanır:

    345 = 3*100 + 4*10 + 5*1
    veya
    345 = 3*10*10 + 4*10 + 5*1
    veya
    345 = 3*10**2 + 4*10**1 + 5*10**0

[En sondakini anlamadıysanız, biraz daha matematik öğrenmeye ihtiyacınız var demektir. Daha önceden "**"'ın üssü anlamına geldiğini açıklamıştık.] Sekiz tabanında bir sayı ise sekiz tane rakam "0, 1, 2, 3, 4, 5, 6 ve 7" ile oluşturulur. 8 tabanında 23 (yada Python'da 023 yada "sıfır"23) şu anlama gelir:

    023 = 2*8 + 3*1 = 16 + 3 = 19 (10 tabanında)

Bu yukarıda elde ettiğimiz ilk sonucu açıklar. İkinci sonuçta hata ile karşılaşmamızın nedeni ise 9'un 8'li sayı sisteminde geçerli olmamasından dolayıdır.

Python'da 16 tabanına göre sayıları da kullanabilirsiniz, bu tabanda kullanılan semboller: "0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f" dir. Python'a sayının 16 tabanında olduğunu belirtmek için aşağıda olduğu gibi başına "0x" (sıfır ve x) koyarız.

    >>> 0x33
    51

    >>> 0xa
    10

    >>> 0xf
    15

    >>> 0x10
    16

    >>> 0x111
    273

    >>> 0x123
    291

Sonuncu örneği açıklayalım:

    0x123 = 1*16*16 + 2*16 + 3*1 = 256 + 32 + 3 = 291 (10 tabanında)

16'lı sayı sisteminde, "a" 10. sembol, "f" ise 15. semboldür. Yukarıdaki sonucun doğruluğunu kendiniz de kontrol edin.

Bu dersi, özellikle bu bölümü bitirmeden önce, ikili sayı sistemi hakkında da bir şeyler söyleyelim. İkili sayı sisteminde sayılar "0 ve 1" rakamları ile oluşturulur. Aşağıda bir ikili sayı ve onun 10 tabanına dönüştürülmesi verildi:

    101001 = 1*2**5 + 0*2**4 + 1*2**3 + 0*2**2 + 0*2**1 + 1*2**0
    veya
    101001 = 1*32 + 1*8 + 1*1 = 41 (10 tabanında)

İkili sayı sistemi çok önemlidir, aslında bilgisayarlar ikili sayı sistemi ile çalışırlar. Bir ampül ve onu açıp kapatmakta kullanılan bir anahtar düşünün. Eğer anahtarı açarsak akım lambaya ulaşır ve lamba yanar, eğer anahtarı kapatırsak akım lambaya ulaşmayacağından lamba sönecektir. İki durum söz konusudur: akım yok = 0; ve akım var =1.

Bilgisayarların içinde lambalar yoktur ama pek çok sayıda çok küçük kablolar ve anahtarlar vardır. [tabiyki başka elektronik parçalar da vardır ancak onlar şu an bizim için önemli değiller.] Herhangi bir anda bilgisayarın ne yaptığı hangi kablolardan (3., 5., ve 17. gibi)akım geçtiği ile açıklanabilir. Bu 0'larla (akım olmayan kablolar) ve 1'lerle (akım olan kablolar) temsil edilebilir. Bu durum ikili sayı sistemi ile gösterilebilin bir sayı olacaktır. Bilgisayar programları bu küçük anahtarları kontrol ederek akımın hangi kablolara ulaşması gerektiğini kontrol eder. Yani programcılıkta aslında yaptığınız iş her ne kadar farkına varmasanız da elektronik devrelerde akımı yönlendirmektir!

8, 2'nin kübü olduğundan, sekizli sayı sistemi ve benzer şekilde onaltılı sayı sistemi de bilgisayarlarda kullanılır. Onaltılı sayı sisteminde sayılar bizim için daha kısa olduğundan, ikili sayı sisteminden sonra en çok kullanılan sistemdir. Bunu oyun programları yazarken renk belirlemede kullanacağız!

An other kind of definition - - [Temporarily back to] An other kind of definition