Arcade Türü Oyun Programlamayı
ve Bilgisayar Bilimleri ÖğreninChapter 7: Listelere Giriş
7.1 Veri Türleri
Şu ana kadar bu kitapta dört veri türü gösterildi:
- String (string ifadesi normal insanların yazı olarak düşündüğü "string of characters"in kısaltılmasıdır.)
- Integer
- Floating point
- Boolean
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)
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] |
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
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
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=" ")
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ğer | Karakter | Değer | Karakter | Değer | Karakter | Değer | Karakter |
40 | ( | 61 | = | 82 | R | 103 | g |
41 | ) | 62 | > | 83 | S | 104 | h |
42 | * | 63 | ? | 84 | T | 105 | i |
43 | + | 64 | @ | 85 | U | 106 | j |
44 | , | 65 | A | 86 | V | 107 | k |
45 | - | 66 | B | 87 | W | 108 | l |
46 | . | 67 | C | 88 | X | 109 | m |
47 | / | 68 | D | 89 | Y | 110 | n |
48 | 0 | 69 | E | 90 | Z | 111 | o |
49 | 1 | 70 | F | 91 | [ | 112 | p |
50 | 2 | 71 | G | 92 | \ | 113 | q |
51 | 3 | 72 | H | 93 | ] | 114 | r |
52 | 4 | 73 | I | 94 | ^ | 115 | s |
53 | 5 | 74 | J | 95 | _ | 116 | t |
54 | 6 | 75 | K | 96 | ` | 117 | u |
55 | 7 | 76 | L | 97 | a | 118 | v |
56 | 8 | 77 | M | 98 | b | 119 | w |
57 | 9 | 78 | N | 99 | c | 120 | x |
58 | : | 79 | O | 100 | d | 121 | y |
59 | ; | 80 | P | 101 | e | 122 | z |
60 | < | 81 | Q | 102 | f |
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.
- İşlediğimiz dört veri türünü listeleyin ve her birine birer örnek verin.
- 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])
- Bu kodun çıktısı ne olacaktır?
my_list=[5,2,6,8,101] for my_item in my_list: print (my_item)
- 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)
- Bu kodun çıktısı ne olacaktır?
word = "İstanbul Teknik" for letter in word: print (letter)
- 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])
- Bu kodun çıktısı ne olacaktır?
s="0123456789" print (s[1]) print (s[:3]) print (s[3:])
- Kullanıcıdan string alacak bir kod yazın. Stringin uzunluğunu ekrana yazdırın. Stringin ilk harfini ekrana yazdırın.
- 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.
- 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.
English version by Paul Vincent Craven
Spanish version by Antonio Rodríguez Verdugo
Russian version by Vladimir Slav
Turkish version by Güray Yildirim
Portuguese version by Armando Marques Sobrinho and Tati Carvalho
Dutch version by Frank Waegeman
Hungarian version by Nagy Attila
Finnish version by Jouko Järvenpää
French version by Franco Rossi
Korean version by Kim Zeung-Il
Chinese version by Kai Lin