13. Beni dinle yoksa ... else ...

Programlamayı öğrenmek eğlenceli olabilir, ancak tüm zamanınızı bilgisayarın karşısında harcamayın. Eğer yağmur yağıyorsa çalışmaya devam edin, yağmıyorsa dışarıya çıkın ve oynayın. (Evet, büyükbaba sende!)


Seçimleri yapmak

If ile başlayan cümle ile biraz eğlenelim.

If yağmur yağarsa,
... çalışmaya devam et,
değilse,
... dışarı çık ve oyna!

Bu küçük bir bilgisayar programı gibi gözükmeye başladı. Şimdi onu bir Python programı gibi yazalım.

if it_rains():
    keep_reading()
else:
    go_outside_and_play()

Yeni bir Python komutu öğrendiniz, else. Eğer yağmur yağıyorsa, okumaya devam edin, yağmıyorsa ne yapacağınızı biliyorsunuz.


Reeborg görüyor

Reeborg biplerin yanında olduğunu anlamasının yanı sıra, önünde yolunu kapatan bir duvar olup olmadığını da görebilir. Kafasını sağa yada sola çevirip orada bir duvar olup olmadığını da görebilir. Aşağıdaki şartları kullanarak bunları test edebilirsiniz.

front_is_clear()  # True eğer duvar yoksa, False eğer duvar varsa
left_is_clear()   # True eğer solunda duvar yoksa, False eğer solunda duvar varsa
right_is_clear()  # True eğer sağında duvar yoksa, False eğer sağında duvar varsa

İlkini Reeborg'un dünyasını keşfetmek için kullanalım. Reeborg eğer önünde engel yoksa bir adım ileriye gidecek, varsa sola dönecek. Aşağıdaki program ile bunu yaptırabiliriz:

if front_is_clear():
    move()
else:
    turn_left()
      
turn_off()

Aşağıdaki resimlerde programın iki farklı durumda çalıştırılmış halini görüyorsunuz. Eğer bu programı denerseniz  else komutundan sonraki : 'yı unutmayın!.

start if lead to end if

start if lead to end if

Şimdi bu programı 20 kez üst üste tekrarlatalım:

def move_or_turn():
    if front_is_clear():
        move()
    else:
        turn_left()

repeat(move_or_turn, 20)      
turn_off()

Aşağıdaki küçük dünyada bu programın uygulanmış halini görüyorsunuz.

around

Bu programı daha ilginç bir hale getirebiliriz. Reeborg eğer önünde engel yoksa dans edecek (4 kez sola dönerek) sonra bir adım ileriye gidecek, varsa sola dönecek ve bir bip bırakacak Aşağıdaki program ile bunu yaptırabiliriz:

def dance():
    repeat(turn_left, 4)
def move_or_turn():
    if front_is_clear():
        dance()
        move()
    else:
        turn_left()
        put_beeper()

repeat(move_or_turn, 18)      
turn_off()

Reeborg'un bu görevi yerine getirmek için yeterli sayıda bip'i olduğundan emin olun. Reeborg'a yeterli sayıda bip vermek için beepers button butonunu kullanabilirsiniz.

dance() ve move()komutlarının ait oldukları if 'den sonra aynı düzeyde içe girik yazıldıklarına dikkat edin, bu şekildeki yazım onların aynı bloğa ait olduğunu gösterir. Benzer şekilde turn_left() ve put_beeper() komutları da ait oldukları else den sonra  içe girik yazılmışlardır. Program çalıştırıldığında ne olduğunu aşağıdaki şekilden görebilirsiniz.

around

Peki aşağıda olduğu gibi, put_beeper() komutunu turn_left()komutu ile hizalamak yerine   else ile hizalarsak ne olur.

def dance():
    repeat(turn_left, 4)
def move_or_turn():
    if front_is_clear():
        dance()
        move()
    else:
        turn_left()
    put_beeper()

repeat(move_or_turn, 18)      
turn_off()

Bu durumda move_or_turn() tanımlaması önce if/else deki durumlardan birini yerine getirecek yani dans edip bir adım atacak veya sola dönecek sonrada bir şarta bağlı olmayan put_beeper()komutunu yerine getirecektir. Dolayısıyla put_beeper()komutu move_or_turn()her çalıştırıldığında bir şarta bağlı olmaksızın yerine getirilecektir. Program bu hali ile çalıştırıldığında ne olduğunu aşağıdaki şekilden görebilirsiniz.

around

Şekilden de gördüğünüz gibi her adım atıldıktan sonra bir bip bırakılmıştır. Köşelerde ise iki tane bip vardır. İlki dans edip adım attıktan sonra, ikincisi sola döndükten sonra koyulmuştur, yani put_beeper()komutu move_or_turn()her çalıştırıldığında bir şarta bağlı olmaksızın yerine getirilmiştir.

Şimdi put_beeper()'ı aşağıdaki gibi en başa hizalayalım:

def dance():
    repeat(turn_left, 4)
def move_or_turn():
    if front_is_clear():
        dance()
        move()
    else:
        turn_left()
put_beeper()

repeat(move_or_turn, 18)      
turn_off()

Yani artık move_or_turn() tanımlamasına ait olmasın. Bu haliyle put_beeper() ilk yerine getirilecek komut olur, daha sonra  move_or_turn()18 kez tekrarlanır. Sonuç aşağıdaki gibi olur:

around

İçe girik yazma ile Reeborg'a pek çok bilgi verilebiliyor, boşluklar işe yarıyor. Python'un bu özelliğinden dolayı yazılan programlar kolay okunur olur ve programlar daha kolay anlaşılır. 


Engel atlama

Reeborg engel atlamada oldukça iyi bir duruma geldi. Artık uzun ve kısa mesafeli yarışlara katılıyor. Bir bip'e ulaştığında yarışı tamamladığını biliyor. Aşağıda iki yarış pistini görüyorsunuz, dünya dosyaları hurdles1.wld ve hurdles2.wld.

hurdles start


hurdles start

Yarışların 20 birimden daha uzun olmadığını varsayarak aşağıdaki gibi bir tanımlama yapın:

def move_jump_or_finish():
    if next_to_a_beeper(): # yarışın sonu
        turn_off()
    else:
        if front_is_clear(): # engel yok, yarış devam ediyor
            move()
        else:
            jump_one_hurdle()

uygun bir jump_one_hurdle() tanımlamasıyla Reeborg'a yalnızca aşağıdaki komutu vererek yarışı tamamlamasını sağlayabilirsiniz.
repeat(move_jump_or_finish, 20).

İlave testler eklendikçe kodun daha da içeriye girerek yazıldığına dikkat edin.

previous  Reeborg kendi kendine karar verebilseydi ... - home - If, else, if, else, ....next