Arcade Türü Oyun Programlamayı ve Bilgisayar Bilimleri Öğrenin

Arcade Türü Oyun Programlamayı
ve Bilgisayar Bilimleri Öğrenin

Chapter 7: Listelere Giriş

7.1 Veri Türleri

Video: Listelere Giriş

Şu ana kadar bu kitapta dört veri türü gösterildi:

Python değerin türünü type fonksiyonuyla gösterebilir. Kuşkusuz, bu bizim yapacağımız programlamada çok aşırı kullanışlı değildir, fakat şu ana kadar gördüğümüz verilerin türlerini göstermek için bu seferlik bu fonksiyonu kullanmak iyi olacaktır. Alttakileri IDLE kabuğuna girin. (Yeni bir pencere açıp bunları bir program şeklinde yazmayın; çalışmaz.)
type(3)
type(3.145)
type("Selam millet")
type(True)
Çıktı:
>>> type(3)
<class 'int'>

>>> type(3.145)
<class 'float'>

>>> type("Selam millet")
<class 'str'>

>>> type(True)
<class 'bool'>

type fonksiyonunu bir değişkene uygulayarak bu fonksiyonu o değişkenin tuttuğu verinin türünü öğrenmek için kullanmak da mümkündür.

x=3
type(x)

Bu bölümde tanıtılan iki yeni veri tipi Listeler(Lists) ve Demetler(Tuples)dir. Etkileşimli Python kabuğunda alttaki komutları çalıştırmayı deneyin ve ne gösterdiklerine bakın:

type(  (2,3,4,5) )
type(  [2,3,4,5] )

7.2 Listelerle Çalışmak

IDLE'nin komut satırını kullanarak bu örnekleri deneyin. Bir liste oluşturmak ve onu ekrana yazdırmak için, şunları deneyin:

>>> x=[1,2]
>>> print (x)
[1, 2]

Bir dizideki tek bir elemanı yazdırmak için:

>>> print (x[0])
1

Listelerin konumlarının(indislerinin) sıfırdan başladığına dikkat edin. Yani 10 öğeye sahip bir liste [10] noktasında bir öğeye sahip değildir. Noktalar [0] ile [9] aralığındadır. 10 öüeli bir dizi oluşturmak ve 10 numaralı öğeye ulaşamamak çok kafa karıştırıcı olabilmektedir.

Program bir listenin tek bir öğesine yeni değerler atayabilir. Altta yer alan durumda, ilk noktada yer alan sıfır (bir değil) 22 olarak atanmıştır.

>>> x[0]=22
>>> print (x)
[22, 2]

Ayrıca, bir Python programı "demet" oluşturabilir. Bu veri türü tıpkı listeler gibi çalışır, fahat iki istisnası vardır. Birincisi, köşeli parantez yerine parantezlerle oluşturulur. İkincisi, oluşturulan bir demeti değiştirmek mümkün değildir. Aşağı bakın:

>>> x=(1,2)
>>> print (x)
(1, 2)
>>> print (x[0])
1
>>> x[0]=22
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    x[0]=22
TypeError: 'tuple' object does not support item assignment
>>>

Üstteki kodun çıktısında görüldüğü gibi, listelerde yapabildiğimiz atama işlemini demetlerde yapamıyoruz.

dizi(array) nesnelerin bir listesidir. Bilgisayar biliminde çok önemli olan bir veri yapısı türüdür. Python'daki "liste" veri türü dizi veri yapısına oldukça benzerdir.

7.3 Liste Boyunca Yinelemek(İterasyon)

Video: Liste Boyunca İterasyon

Program ekrana yazdırma gibi amaçlarla listedeki her öğeyi itere etmeye(Ç.N sırayla döngüye sokuyoruz) ihtiyaç duyarsa, for döngülerinin bunu yapabilen iki türü bulunur.

Her öğeyi bir döngüye sokmanın ilk yöntemi "for-each" döngüsünü kullanmaktır. Bu döngü türü nesnelerin tamamını alır ve her seferinde bir tane öğeyi döngüye sokar. Bu döngü, her öğenin bir kopyasını alıp onu işlemek için bir değişkende tutar.

Komutun formatı:
for öğe_değişkeni in liste_adı:

Bazı örneklere bakalım:
my_list=[101,20,10,50,60]
for item in my_list:
    print( item )
Çıktı:
101
20
10
50
60

Stringler listelerde saklanabilir:
my_list=["Kaşık", "Çatal", "Bıçak"]
for item in my_list:
    print( item )
Çıktı:
Kaşık
Çatal
Bıçak

Listeler başka listeleri bile barındırabilir. Bu ana listedeki her öğeyi yinelemeye alacaktır, fakat alt listelerde bu olay geçerli olmaz.
my_list=[ [2,3], [4,3], [6,7] ]
for item in my_list:
    print( item )
Çıktı:
[2,3]
[4,3]
[6,7]

İterasyonun bir diğer yolu ise listeyi bir indeks değişkeni ile döngüye almak ve her öğenin bir kopyasını almak yerine listeye direk erişmektir. İndeks değişkenini kullanmak için, program 0'dan listenin uzunluğuna kadar sayar. On öğe varsa, döngü 0'dan 9'a toplam on öğe için dönecektir.

Listenin uzunluğu len fonksiyonu (Ç.N length = uzunluk) kullanılarak bulunabilir. Bunu range fonksiyonuyla birleştirmek programa bütün liste üzerinde döngü kurma imkanı verir.
my_list=[101,20,10,50,60]
for i in range( len(my_list) ):
    print( my_list[i] )
Çıktı:
101
20
10
50
60

Bu yöntem daha karmaşık fakat aynı zamanda daha güçlüdür. Biz kopyalar yerine direk listenin öğeleriyle uğraşacağımız için, liste değişebilir. for-each döngüsü orijinal liste üzerinde değişikliğe izin vermez.

7.4 Listeye Ekleme Yapmak

Listeye yeni öğeler (demete değil) append (Ç.N append = ilave etmek) komutu ile eklenebilir. Örneğin:
my_list=[2,4,5,6]
print(my_list)
my_list.append(9)
print(my_list)
Çıktı:
[2,4,5,6]
[2,4,5,6,9]

Video: Liste Boyunca İterasyon

Yan not: Ekleme sırasında performans kaygısı varsa, listelerin nasıl yorumlandığını anlamak önemlidir. Örneğin, bir liste array(dizi) veri türünde yorumlanıyorsa, buna bir öğe eklemek biraz da tam dolu bir yumurta kartonuna yumurta eklemeye benzer. Yeni yumurta kartonu on üç nokta ile yapılır. Daha sonra on iki öğe taşınır. Ondan sonra da on üçüncü yumurta eklenir. Son olarak eski yumurta kartonu geri dönüşüme gönderilir. Bu işlem fonksiyonun sahne arkasında gerçekleşebildiği için, programcılar bunu unutabilmekte s ve bilgisayara bütün işi yaptırmaktadır. Bilgisayara basitçe yeterli sayıda yumurta alan bir yumurta kartonuyla başlamasını söylemek çok daha etkili olacaktır. Neyse ki, Python listeyi bir dizi veri türü olarak yorumlamaz. Fakat önümüzdeki dönemde yer alan veri yapıları dersine dikkat etmek önemlidir ve bunların tamamının nasıl çalıştığı orda öğrenilecektir.

Geçici bir başlangıçtan bir liste oluşturmak için, boş bir liste oluşturmak ve sonra append fonksiyonunu kullanmak gereklidir. Bu örnek kullanıcı girişini baz alan bir liste oluşturuyor:
my_list=[] # Boş liste
for i in range(5):
    userInput = input( "Bir tamsayı girin: ")
	userInput = int( userInput )
    my_list.append(userInput)
	print(my_list)
Çıktı:
Bir tamsayı girin: 4
[4]
Bir tamsayı girin: 5
[4, 5]
Bir tamsayı girin: 3
[4, 5, 3]
Bir tamsayı girin: 1
[4, 5, 3, 1]
Bir tamsayı girin: 8
[4, 5, 3, 1, 8]

Programın belirli bir uzunlukta bir dizi oluşturması gerekirse ve öğelerin tamamı aynı değerde olacaksa, bunu yapmanın alttaki kodta olduğu gibi basit bir püf noktası vardır:

# 100 tane sıfırdan oluşan bir dizi oluştur.
my_list = [0] * 100

7.5 Listelerin Toplanması veya Değiştirilmesi

Video: Listenin Toplanması

Dizinin o ana kadar olan toplamını oluşturmak çok yapılan bir işlemdir. İşte nasıl yapıldığı:

# Toplanacak dizinin kopyası:
myArray = [5,76,8,5,3,3,56,5,23]

# Başlangıç toplamı sıfır olmalı
arrayTotal = 0

# 0'dan dizinin içerisindeki eleman sayısına 
# kadar döngü:
for i in range( len(myArray) ):
	# 0. elemanını ekle, sonra 1, sonra 2 vs.
	arrayTotal += myArray[i]
	
# Sonucu yazdır
print( arrayTotal )

Aynı şey eleman sayısını range fonksiyonuna aktarmak yerine bir dizinin iterasyonu için for döngüsü kullanılarak da yapılabilir:

# Toplanacak dizinin kopyası
myArray = [5,76,8,5,3,3,56,5,23]

# Başlangıç toplamı sıfır olmalı
arrayTotal = 0

# Dizideki her öğeyi item isimli değişkene kopyalayarak 
# dizi boyunca döngü kur. 
for item in myArray:
	# Her öğeyi ekle
	arrayTotal += item
	
# Sonucu yazdır
print( arrayTotal )

Dizinin içerisindeki öğeler aynı zamanda for döngüsü kullanılarak da değiştirilebilir:

# Değiştirilecek dizinin kopyası
myArray = [5,76,8,5,3,3,56,5,23]

# 0'dan dizideki eleman sayısına kadar 
# döngü kur:
for i in range( len(myArray) ):
	# Öğeyi onu ikiye katlayarak değiştir
	myArray[i] = myArray[i] * 2
	
# Sonucu yazdır
print( myArray )

Fakat, v2 dizinin içerisindeki elemanları ikiye katlama olayında işe yaramayacaktır. Neden? Çünkü burada item dizideki elamanın bir kopyasıdır. Alttaki kod kopyayı ikiye katlar, fakar orijinal dizi elemanını değiştirmez.

# Diziy değiştirmek için kopyala
myArray = [5,76,8,5,3,3,56,5,23]

# myArray dizisinin her elemanını döngüye al
for item in myArray:
	# Bu öğeyi ikiye katlıyor, fakat diziyi değiştirmiyor
	# çünkü item değişkeni dizideki tek bir öğenin kopyası.
	item = item * 2
	
# Sonucu yazdır
print( myArray )

7.6 Stringleri Bölmek

Video: Stringleri Bölmek

Stringler aynı zamanda listelerdir. Attaki kodu x'in iki versiyonuyla da çalıştırın:

x="Bu örnek bir string"
#x="0123456789"

print ("x=",x)

# Tek bir karaktere erişmek
print ("x[0]=",x[0])
print ("x[1]=",x[1])

# Sağ taraftan erişmek
print ("x[-1]=",x[-1])

# 0-5 arasına erişmek
print ("x[:6]=",x[:6])
# 6 ve sonrasına erişmek
print ("x[6:]=",x[6:])
# 6-8 arasına erişmek
print ("x[6:9]=",x[6:9])

Python'da stringler bazı matematiksel operatörlerle de kullanılabilirler. Alttaki kodu deneyip Python'un ne yaptığını inceleyin:

a="Selam"
b="Millet"
c="!"
print (a+b)
print (a+b+c)
print (3*a)
print (a*3)
print ((a*2)+(b*2))

Stringlerin uzunluğunu (length) öğrenmek mümkündür. Bunu diğer bütün dizi çeşitleriyle yapmak da mümkündür.

a="Selam Millet"
print (len(a))

b=[3,4,5,6,76,4,3,3]
print (len(b))

Strinler birer dizi olduğu için program her karakteri tıpkı dizilerde olduğu gibi iterasyona alabilir:

for character in "Bu bir testtir.":
    print (character)

Alıştırma: Alttaki kodla başlayın:

months="JanFebMarAprMayJunJulAugSepOctNovDec"

n=int(input("Ay numarasını giriniz: "))

Üç harfli ay kısaltmalarını kullanıcının girdiği sayı için ona gösterin. (Stringin başlangıç pozisyonunu hesaplayın, daha sonra az önce öğrendiğimiz stringin belirli bir kısmını yazmak için edindiğimiz bilgiyi kullanın.)

7.7 Gizli Kodlar

Bu kod bir stringin bütün harflerini ayrı ayrı yazdırıyor:

plain_text="Bu bir testtir. ABC abc"

for c in plain_text:
    print (c, end=" ")

Video: Gizli Kodlar

Birgisayarlar aslında bir stringin harflerini saklamazlar, bilgisayarlar bir sayı serisi saklarlar. Her sayı bir harfi temsil eder. Bilgisayarın harfleri çevirirken kullandığı tabloya American Standard Code for Information Interchange (ASCII) denmektedir. Bundan başka birçok tablo olmakla birlikte, bu tablolar Kiril Alfabesi, Çin yazı karakterleri ve diğer uluslararası karakterleri desteklemek için kullanılır. Varsayılan olarak, Python ASCII kullanır.

ASCII çizelgesi 0-255 arası sayıları kapsar. Her harf hafızanın bir byte'ıyla temsil edilir. ASCII çizelgesinin kısmi bir kopyası alttadır:
DeğerKarakterDeğerKarakterDeğerKarakterDeğerKarakter
40(61=82R103g
41)62>83S104h
42*63?84T105i
43+64@85U106j
44,65A86V107k
45-66B87W108l
46.67C88X109m
47/68D89Y110n
48069E90Z111o
49170F91[112p
50271G92\113q
51372H93]114r
52473I94^115s
53574J95_116t
54675K96`117u
55776L97a118v
56877M98b119w
57978N99c120x
58:79O100d121y
59;80P101e122z
60<81Q102f

ASCII hakkında daha fazla bilgi için göz atabilirsiniz:
http://en.wikipedia.org/wiki/ASCII

Alttaki kod kümesi önceki örnekte yer alan her öğeyi onun ASCII çizelgesindeki sayı karşılığına çevirir.

plain_text="Bu bir testtir. ABC abc"

for c in plain_text:
    print (ord(c), end=" ")

Bu program her ASCII karakterini alır ve ona bir ekler. Daha sonr yeni ASCII değerini yazdırır, en son da yeni değeri tekrar harfe çevirir.

plain_text="Bu bir testtir. ABC abc"

for c in plain_text:
    x=ord(c)
    x=x+1
    c2=chr(x)
    print (c2, end="")

Alttaki listelenen kod her ASCII değerini alıp ona bir ekliyor. Daha sonra onları tekrar harfe çerviriyor.

# Sample Python/Pygame Programs
# Simpson College Computer Science
# http://programarcadegames.com/
# http://simpson.edu/computer-science/

# Explanation video: http://youtu.be/sxFIxD8Gd3A

plain_text = "This is a test. ABC abc"

encrypted_text = ""
for c in plain_text:
    x = ord(c)
    x = x + 1
    c2 = chr(x)
    encrypted_text = encrypted_text + c2
print(encrypted_text)

Son olarak, son kod her ASCII değerini alıyor ve ondan bir eksiltiyor. Daha sonra değeri geri bir harfe çeviriyor. Bu program, önceki programın çıktısından beslenmesiyle önceki örnekte şifrelenen yazının kod çözücüsü olarak görev yapıyor.

# Sample Python/Pygame Programs
# Simpson College Computer Science
# http://programarcadegames.com/
# http://simpson.edu/computer-science/

# Explanation video: http://youtu.be/sxFIxD8Gd3A

encrypted_text = "Uijt!jt!b!uftu/!BCD!bcd"

plain_text = ""
for c in encrypted_text:
    x = ord(c)
    x = x - 1
    c2 = chr(x)
    plain_text = plain_text + c2
print(plain_text)

7.8 İlişkilendirilebilir Diziler (Sözlükler)

Python dizi indisleri olarak sayıları kullanmakla kısıtlanmamıştır. İlişkilendirilebilir diziler (ilişkili diziler, sözlükler, associative array) kullanılması da mümkündür. İlişkilendirilebilir bir dizi şu şekilde çalışır:

# Boş bir ilişkili dizi oluştur
# (Süslü parantezlere dikkat edin.)
x={}

# Ona bir şeyler ekle
x["fred"]=2
x["scooby"]=8
x["wilma"]=1

# Bir öğeyi getir ve ekrana yazdır
print (x["fred"])

Bu derste ilişkilendirilebilir dizilere gerçekte ihtiyacımız olmayacak, fakat bunun mümkün olduğunu göstermenin önemli olduğunu düşünüyorum.

7.9 Tekrar

Çoktan seçmeli bir test için buraya tıklayın.

After taking the review quiz and answering the questions below, try working on the Loopy Lab. Next, try taking Test 1 from the . Testi çözdükten ve alttaki soruları yanıtladıktan sonra, Loopy Lab'ı çalışmayı deneyin. Sonrasında, örnek testlerden Test 1'i çözmeyi deneyin.

  1. İşlediğimiz dört veri türünü listeleyin ve her birine birer örnek verin.
  2. Bu kodun çıktısı ne olacaktır?
    my_list=[5,2,6,8,101]
    print(my_list[1])
    print(my_list[4])
    print(my_list[5])
    
  3. Bu kodun çıktısı ne olacaktır?
    my_list=[5,2,6,8,101]
    for my_item in my_list:
        print (my_item)
    
  4. Bu kodun çıktısı ne olacaktır?
    my_list1=[5,2,6,8,101]
    my_list2=(5,2,6,8,101)
    my_list1[3]=10
    print(my_list1)
    my_list2[2]=10
    print(my_list2)
    
  5. Bu kodun çıktısı ne olacaktır?
    word = "İstanbul Teknik"
    for letter in word:
        print (letter)
    
  6. Bu kodun çıktısı ne olacaktır?
    my_text="Hızlı kahverengi tilki şımarık köpeklerin üstüne atladı."
    print ("3'üncü nokta: "+my_text[3])
    print ("-1'inci nokta: "+my_text[-1])
    
  7. Bu kodun çıktısı ne olacaktır?
    s="0123456789"
    print (s[1])
    print (s[:3])
    print (s[3:])
    
  8. Kullanıcıdan string alacak bir kod yazın. Stringin uzunluğunu ekrana yazdırın. Stringin ilk harfini ekrana yazdırın.
  9. Kullanıcıdan liste içerisinde beş sayı alacak bir döngü yazın ve bu sayıların her birini bir dizi oluşturup ona ekleyin. Daha sonra bu diziyi yazdırın.
  10. Alttaki şekilde bir dizi üreten bir program yazın ve daha sonra ortalamasını yazdırın:
    my_list=[3,12,3,5,3,4,6,8,5,3,5,6,3,2,4]
    

You are not logged in. Log in here and track your progress.