Kendi programlarımız içinde kullanabileceğimiz Python modülleri, oldukça fazladır ve birçok önemli özellikler sunar. E-posta veya bir ev sayfasının içeriğini indirmek gibi. Bu bölümde bakacağımız modül, bize ekranda kaplumbağalar yaratmamamızı; bu kaplumbağaları kullanarak ekranda şekiller ve desenler çizmemizi sağlayacak.
Kamplumbağalar oldukça eğlendiricidir, fakat bu bölümün gerçek amacı: Biraz daha Python öğrenmek, hesaplamalı düşünmeyi geliştirmek veya “bir bilgisayar bilimcisi gibi düşünmeyi” öğrenmektir. Bu bölümde işlenen Python’un büyük bir kısmı daha sonra derinlemesine tekrar incelenecektir.
Bir kamplumbağa yaratan ve bununla bir dikdörtgen çizen birkaç satırlık Python programı yazalım. (İlk yarattığımız kamplumbağaya atayacağımız değişkeni ahmet olarak adlandıracağız. Daha önceki bölümdeki değişken isimlendirme kurallarını kullanarak eğer istersek farklı bir isimde seçebiliriz.)
1 2 3 4 5 6 7 8 9 10 11 import turtle # Kamplumbağalar yaratmamazı sağlar. wn = turtle.Screen() # Kamplumbağalar için bir pencere aç (oyun alanı) yaratır. ahmet = turtle.Turtle() # Bir tane kamplumbağa yarat ve bunu ahmet'e ata ahmet.forward(50) # ahmet'e 50 birim ilerlemesini söyle ahmet.left(90) # ahmet'in 90 derece dönmesini söyle ahmet.forward(30) # Dikdörtgenin ikinci kenarını tamamla. wn.mainloop() # Kullanıcının pencereyi kapatmasını bekle.
Bu programı çalıştırdığınızda, aşağıdaki gibi yeni bir pencere çıkacaktır:
Bu progamı anlayabilmemiz için birkaç şeyi açıklayalım:
İlk satır bize turtle isimli modülü Python’a yüklememizi söyler. Bu modül bize iki yeni farklı yeni tür kullanmamıza izin verir: Turtle ve Screen type. turtle.Turtle içindeki nokta bize, “Turtle türü turtle modülü içinde tanımlanmıştır” anlamını verir. ( Unutmayınız ki Python büyük harf ve küçük harf ayrımı yapar; bu yüzden, küçük harfle (t) başlayan modül ismi , büyük harfle başlayan Turtle modül isminden farklıdır. Şansımıza Turtle isimli bir modül Python’da yoktur.)
Eğer screen (ekran) denilen şeyi yaratır ve bunu açarsak (ekran yerine, pencere demeyi tercih edeceğim), bu pencereye wn değişkenini atar. Her pencerenin içinde çizim yapabileceğimiz alana kanvas (tuval) denir.
3’üncü satırda bir kamplumbağa oluştururuz. ahmet değişkeni bu kamplumbağaya işaret eder.
Bu üç satırı halllettikten sonra, kamplumbağımıza kanvas üzerinde çizim yaptırabiliriz.
5-7 satırlar arasında, ahmet nesnesini hareket ettiriyoruz ve döndürüyoruz. Biz bunu yaparken ahmet‘in yöntemlerini çalıştırıyoruz (C.n: yöntemi bir fonksiyon gibi düşünebilirsiniz.) ya da etkinleştiriyoruz. Bütün kamplumbağalar bütün bu komutlara nasıl cevap vereceğini biliyor.
Son satırında bir amacı vardır: wn değişkeni yukarıda gösterilen pencereye işaret eder. mainloop yöntemini etkinleştirdiğimizde, pencere bir kullanıcıdan bir eylem bekleyen konuma girer ( bu bir düğmeye basma, fareyi hareket ettirip, düğmeye basmak olabilir.) Kullanıcı pencereyi kapattığında program sona erecektir.
Bir nesne farklı yöntemlere — birşey yapabilen şeyler— ve niteliklere (bazen özellik diye de isimlendirilir.) Örneğin, her kamplumbağa bir renk özelliğine sahiptir. ahmet.color("red") ise bir yöntem etkinleştirmesi ile, ahmeti ve çizimleri kırmızı yapacaktır. (Dikkat ediniz ki color‘un hecelenmesi Amerikan İngilizcesi gibidir. Ç.n: İngiliz İngilizcesinde color , colour diye yazılır.)
Kamplumbağ’nın rengi. pencere içindeki yeri, hangi yöne baktığı ve diğer özellikleri; kalemin çizgi genişliği gibi parçalar kamplumbağa’nın anlık durumudur. Benzer olarak, pencere nesnesinin bir rengi, başlık çubuğunda bir ismi, büyüklüğü ve ekran üzerinde bir yeri vardır. Bunlar, pencere nesnesinin durumunun bölümleridir.
Kamplumbağa ve pencere nesnesini değiştirmeye yarayan epeyce yöntem vardır. Biz şimdilik birkaçını göstereceğiz. Diğer önceki örnekten farklı olan satırları aşağıdaki programda yorumladık ( ve bu kamplumbağa için farklı bir değişken ismi kullandık.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import turtle wn = turtle.Screen() wn.bgcolor("lightgreen") # Pencerenin rengini ayarla wn.title("Hello, tamer!") # Pencerenin başlığını ayarla tamer = turtle.Turtle() tamer.color("blue") # tamer'a rengini değiştirmesini söyle tamer.pensize(3) # tamer'a kalem genişliğini ayarlamasını söyle tamer.forward(50) tamer.left(120) tamer.forward(50) wn.mainloop()
Bu programı çalıştırdığımızda yeni bir pencere ortaya çıkar ve bu pencereyi kapatana kadar ekranda kalmaya devam eder.
Bu programı genişletelim ...
Bir program içinde birçok farklı tamsayı olabileceği gibi, birçok kamplumbağa’da olabilir. Bunlardan herbirine örnek (instance) denir. Her örnek’in kendine ait nitelikleri (özellikleri ) ye yöntemleri vardır. Böylece, ahmet siyah ince bir kalem ile çizebilir ve kanvas üzerinde bir konum üzerinde olabilir, bunun gibi tamer‘de kalın bir pembe ile kendi yönünde gidebilir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 import turtle wn = turtle.Screen() # Pencereyi ve özelliklerini oluştur. wn.bgcolor("lightgreen") wn.title("Ahmet ve Tamer") tamer = turtle.Turtle() # tamer'i ve ona ait özellikleri oluştur. tamer.color("hotpink") tamer.pensize(5) ahmet = turtle.Turtle() # ahmet'i oluştur. tamer.forward(80) # tamer'e eşkenarlı üçgen çizdir. tamer.left(120) tamer.forward(80) tamer.left(120) tamer.forward(80) tamer.left(120) # üçgen'i tamamla. tamer.right(180) # tamer'i kendi çevresinde 180 derece döndür. tamer.forward(80) # onu origin'den uzaklaştır. ahmet.forward(50) # ahmet'e kara çizdir. ahmet.left(90) ahmet.forward(50) ahmet.left(90) ahmet.forward(50) ahmet.left(90) ahmet.forward(50) ahmet.left(90) wn.mainloop()
Aşağıdaki şekil, ahmet‘in dikdörtgeni tamamladığında ve tamer‘ın da üçgeni tamamladığındaki resmi göstermektedir.
Burda bazı Bir bilgisayar bilimcisi gibi nasıl düşünülür gözlemleri:
Bir kare çizmek bile, oldukça sıkıcıydı. Hareket etme ve dönme adımlarını dörtkere açıkça tekrar etmek zorunda kaldık. Eğer bir altıgen, sekizgen veya 42 kenarı olan bir poligon çizmek isteseydik, bu çok daha kötü olurdu.
Bir kodu alıp onu tekrar ettirmek (döngüye koymak) programların temel yapı taşıdır.
Python’un for döngüsü bunu bizim için çözer. Örneğin, arkadaşlarımızın herbirini partimize davet edecek bir e-posta göndermek istiyoruz. Henüz nasıl e-posta göndereceğimizi bilmiyoruz, şimdilik herbir arkadaşımız için bir mesajı ekranda yazacağız.
1 2 3 4 for f in ["Ahmet","Aysun","Burak","Ayşe","Zeki","Temel","Perihan"]: davet = "Merhaba " + f + ". lütfen Cumartesi günü partime gelin." print(davet) # daha fazla kod buraya eklenebilir.
Bu kodu çalıştırdığımızda, aşağıdaki çıktı gibi olur:
Merhaba Ahmet. lütfen Cumartesi günü partime gelin. Merhaba Aysun. lütfen Cumartesi günü partime gelin. Merhaba Burak. lütfen Cumartesi günü partime gelin. Merhaba Ayşe. lütfen Cumartesi günü partime gelin. Merhaba Zeki. lütfen Cumartesi günü partime gelin. Merhaba Temel. lütfen Cumartesi günü partime gelin. Merhaba Perihan. lütfen Cumartesi günü partime gelin.
Program çalışırken, Python hangi çümlenin işleneceğini takip eder. Biz buna programın yürütme akışının kontrol akışı diyeceğiz. insanlar programı çalıştırdıklarında, sıradaki her bir cümleye parmağıyla işaret eder. Kontrol akışını, “Python’un hareket eden parmağı” olarak düşünebilirsiniz.
Şimdiye kadar program akışının yukarıdan aşağıya doğru satır satır olduğunu görmüştük. For döngüsü bunu değiştirir.
Bir kare çizmek için, aynı şeyi dört kere yapmamız gerekebilir— kamplumbağayı hareket ettir ve döndür. ahmet‘in bir karenin dört kenarını çizmesini sağlamak için 8 satır yazdık. Yalnızca 3 satır kullanarak, aynı şeyi yapabiliriz.
1 2 3 for i in [0,1,2,3] ahmet.forward(50) ahmet.left(90)
Bazı gözlemler:
Bazı satırlardan tasarruf etmemiz kolaylık olmasına rağmen, bu çok önemli değildir. Bundan çok daha önemlisi, kendini tekrarlayan bir kalıp bulduk ve kalıbı tekrar kullanmak için programımızı yeniden düzenledik. Bu kalıpları bulmak ve bu kalıplar etrafında programımızı düzenlemek hesaplamalı düşünmede can alıcı yetenektir.
[0,1,2,3] değerleri döngü gövdesinin 4 kere yürütülmesi için verilmiştir. Biz herhangi dört değerde kullanabilirdik, fakat bunlar genelde kullanılan değerlerdir. Gerçekte o kadar yaygındırlar ki, Python’un kendine ait range fonksiyonu vardır.
1 2 3 4 for i in range(4): # i=0, sonra 1, sonra 2 ve 3 için gövde yürütülür (çalıştırılır.) for x in range(10): # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]'ın herbir değerini x'e atar.
Bilgisayar programcıları saymaya 0’dan başlamayı severler.
range fonksiyonu, for içideki döngü değişkeni için bir değerler dizisi oluşturur. Her zaman 0’dan başlarlar ve yurakıdaki durumlar için 4 ve 10’u bu diziye dahil etmezler.
ahmet‘in en son dünüşünde 360 dereceyi tamamlaması için yaptığımız küçük kurnazlık bize şimdi karşılığını verdi. Eğer bunu yapmamış olsaydık, karenin dördüncü kenarı için döngüyü kullanamamış olacaktık. Diğer kenarlardan farklı bir durum oluşacaktı. Mümkün olduğunca kodumuzu özel bir durum için değil, genel bir motife uyacak şekilde yazmaya çalışmalıyız.
Birşeyi dört kere tekrar etmek için, iyi bir Python programcısı şunu yapacaktı:
1 2 3 for i in range(4): ahmet.forward(50) ahmet.left(90)
tamer'in de eşkenar üçgen çizmesi için for döngüsünü de kullanabilir. Bu programda hangi değişikleri yapmanız gerektiğini görebilmeniz gerekir.
Fakat şimdilik, eğer aşağıdaki değişikliği yapsaydanız, ne görürdünüz.
1 2 3 4 for c in ["yellow", "red", "purple", "blue"]: ahmet.color(c) forward(50) ahmet.left(90)
Değişken listeyede atanabilir. Böylece listeler yalnızca for döngüsü için değil, daha genel durumlar için kullanılabilir. Yukarıdaki kode şu şekilde yazılabilir:
1 2 3 4 5 6 # Assign a list to a variable clrs = ["yellow", "red", "purple", "blue"] for c in clrs: ahmet.color(c) ahmet.forward(50) ahmet.left(90)
Kamplumbağ yöntemleri negatif açı veya uzaklık kullanabilir. Örneğin, tamer.forward(-100) tamer’i geriye doğru hareket ettirecek ve tamer.left(-30) ise tamer’i sağ döndürecektir. Ayrıca, bir çemberde 360 derece olduğundan, onu 30 derece sola döndürmek, tamer‘i aynı yöne çevirecek ve bu sanki onu 330 derece sağ’a çevirmek ile aynı anlama gelecektir (Ekrandaki canlandırmayı kullanarak, tamer‘in saat yönününde mi yoksa saat yönünün tersin de mi hareket ettiğini söyleyebileceksiniz.)
Bu size, hem sağa hem de sola dönme yöntemlerinin ikisine birden ihtiyacınız olmadığını aklınıza getirir. Aynı zamand backward yöntemi de vardır (Eğer biraz uçuk iseniz, ahmet.backward(-100) komutunu ahmet‘i ileriye hareket ettirmek için kullanabilirsiniz).
Bizim konumuzda yapıyı ve aralarındaki bağlantıları daha iyi anlamak, Bilgisayar bilimcisi gibi düşünmenin bir parçasıdır. Eğer kamplumbağalar ile oynayacaksak, geometri ve sayı düzlemi hakkında basit temel konulara bir göz atmak; sol, sağ, ileri, geri, negatif ve pozitif açılar arasındaki bağlantıları farketmek iyi bir başlangıç olabilir.
Kamplumbağ kalemi çizgi çizmek için kullanabileceği gibi( pendown: kalem aşağı) , isterse kullanmayabilir de (penup: kalem yukarı) . Bu, kamplumbağanın çizgi çizmeden başka yerlere hareket etmesine olanak verir. Bu yöntemler:
1 2 3 ahmet.penup() # kalem kaldırıldı. ahmet.forward(100) # Çizgi çizilmeden ahmet'i hareket ettirir. ahmet.pendown() # kalem yeniden konuldu.
Her kamplumbağaya farklı bir şekil verebiliriz. Halihazırda tanımlanmış yöntemler: arrow, blank, circle, classic, square, triangle, turtle bunlardan birkaçıdır.
1 ahmet.shape("turtle")
Kamplumbağanın canlandırmasını (animasyon) hızlandırabilir veya yavaşlatabiliriz ( Canlandırma, kamplumbağanın ne kadar hızlı döneceğini veya ileri hareket edeceğini kontrol eder.) Hızlandırma ayarlamaları 1 (en yavaş) ve 10 (en hızlı) arasında ayarlanabilir. Eğer biz hızı 0’a ayarlarsak, bunun özel bir anlamı vardır: Canlandırma yapma ve en hızlı gidebileceğin kadar hızlı git.
1 ahmet.speed(10)
Kamplumbağa kendi ayakizini kanvas üzerinde oluşturabilir ve başka bir yere hareket ettiğinde bu ayakizi kalacaktır. Kalem yukarı (penup) olsa bile, iz bırakma çalışır.
Bu yeni özellikleri gösteren bir örnek yapalım:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import turtle wn = turtle.Screen() wn.bgcolor("lightgreen") tess = turtle.Turtle() tess.shape("turtle") tess.color("blue") tess.penup() # This is new size = 20 for i in range(30): tess.stamp() # Leave an impression on the canvas size = size + 3 # Increase the size on every iteration tess.forward(size) # Move tess along tess.right(24) # ... and turn her wn.mainloop()
Dikkatli olun! Kaçkere döngü gövdesi yürütüldü? Ekranda kaç tane kamplumbağa resmi görüyorsunuz. Bir tanesi hariç bütün ekranda gördüğünüz kamplumbağa izleri stamp yönergesi tarafından oluşturulmuştur. Fakat program yalnızca bir tane kamplumbağa örneklemesi içerir. Hangisinin gerçek tamer olduğunu bulabilir misiniz? (İpucu: Eğer emin değilseniz, for döngüsünden sonra tamer‘in rengini değiştiren bir satırlık kod yazın; veya kalemi aşağıya indiren ve çizgi çizen, veya onun şeklini değiştiren bir kod yazın.)
`` Biz Python’un kamplumbağlarından hoşlanırız`` cümlesini 1000 kere yazan program yazınız.
Cep telefonunuza ait 3 tane özellik ve 3 tane yöntem veriniz.
tamer kamplumbağınız yüzünü doğuya doğru 0 derecee ile çevirmiş olsun. Eğer tamer.left(3645) komutu verirsek, tamer ne yapar ve hangi yöne doğru bakar?
xs = [12, 10, 32, 3, 66, 17, 42, 99, 20] şeklinde bir atama yaptığınızı düşünelim.
Aşağıdaki düzgün çokgenleri for döngüsü kullanarak kamplumbağaya çizdiriniz ( düzgün çokgen her kenarı ve her açısı aynı olan demektir.)
Bir sarhoş karson rastgele bir dönüş yapıyor ve 100 adım atıyor; daha sonra yeniden rastgele dönüş yapıyor ve 100 adım atıyor; ve bu böyle devam ediyor. Bir sosyal bilim öğrencisi, 100 adım alınmadan herbir dönüş öncesi bu açıları kaydediyor. Onun deneysel veriler: [160, -43, 270, -97, -43, 200, -940, 17, -86]. Kamplumbağayı kullanarak sarhoş arkadaş tarafından alınan yolu çiziniz.
Yukarıdaki programı zenginleştirin: Sarhoş korsan etrafta gezindikten sonra, yöneldiği yönü söyleyen bir program yazınız ( Onun 0 dereceden başladığını farzedin.)
Eğer 18 kenarı olan bir düzgün çokgen çizerseniz, kamplumbağa her köşede kaç derecelik bir açıyla dönmelidir?
Aşağıdaki herbir satırı, Python’un etkileşimli komut satırından girerek ne yapacağını tahmin ediniz ve sonucu kaydediniz:
>>> import turtle >>> wn = turtle.Screen() >>> tess = turtle.Turtle() >>> tess.right(90) >>> tess.left(3600) >>> tess.right(-90) >>> tess.speed(10) >>> tess.left(3600) >>> tess.speed(0) >>> tess.left(3645) >>> tess.forward(-100)
Aşağıdaki şekli çizen bir Python programı yazınız:
İpucu:
Aşağıdaki şekle benzer bir yüz çizecek program yazınız.
Bir kamplumbağa yaratınız ve bu kamplumbağayı bir değişkene atayınız. Bu değişkenin tipini komut satırından sorunuz. Ne cevap alıyorsunuz?
Kamplumbağaların hangi takıma aittirler? Kamplumbağa’nın Anadolu’da yaşayan cinsine ne denir?
Python hangi takıma aittir? Bir yıla mıdır? Zehirli midir?