Bana kod yazmayı öğret baba – Bölüm 4
“Şimdi biraz fonksiyona benzeyen ama çok daha enteresan işler beceren yeni bir şey öğrenelim,” demiştik en son. “If” yani “eğer” denen olgudan bahsediyoruz. Kendisi o kadar kullanışlı ve yaygın bir şeydir ki kendisinin bulunmadığı bir bilgisayar programı henüz ne gördüm ne de yazdım.
Bir önceki derste kaldığımız yerden devam edelim. Varsayalım, kullanıcının yaşını öğrendikten sonra kendisine yaşına bağlı olmak üzere iltifat etmek istiyoruz. Compilerımızı henüz bookmark’lamamış olanlarımız varsa buradan buyursun.
string_yas = input("Yasiniz?") integer_yas = int(string_yas) if integer_yas <= 30: print("Cok gencsiniz") else: print("Yok canim en fazla 30 gosteriyorsunuz") print("Valla bak")
Şu kodu yazıp çalıştırdıysanız ve de bir iki sayı girerek deneme yaptıysanız asın bayrakları dostlar. Hayatınızın ilk “if”ini yani “eğer”ini yazdınız. Ama asmadan önce, perde arkasında neler yaşanıyor bir bakalım. Mikrofonlarımız yine compiler’da. Bakalım bu ufak programı çalıştırırken kendisi neler düşünüyor.
Başlıyoruz. Satır 1 ve ekrana “yasınız” yazıp kullanıcıdan bir girdi alalım. (Bu esnada kullanıcı 24 yazıp enter’a basar). “24” geldi ben de string_yas değişkenin değerini “24” yaptım, kendisini de string olarak belledim. İkinci satıra geçelim. Çok enteresan daha az önce kaydettiğimiz string_yas’a int() fonksiyonu uygulamak suretiyle yeni bir integer_yas değişkeni oluşturmamız istenmiş. Tamamdır integer_yas için hafızada yer açtım. Kendisinin değerini 24 ve türünü integer yaptım. Üçüncü satıra geçelim. Ooooo if gelmiş. İçinde de integer_yas 30’dan küçük mü diye soruyor. Evet 24 30’dan küçükmüş. O zaman if’in içinde hesapladığım boolean “true” çıktı. Bu durumda if’in egemenlik alanına girip yoluma oradan devam edeceğim. if’in içine girdim ve dördüncü satırdayım. Ekrana “Çok gençsiniz” yazmam istendi. Yaptım. Beşinci satıra geçelim. Hooop dur burada (burada bir acı fren sesi hayal edin). Bir dakika şimdi bu beşinci satırda if’in egemenlik alanı bitmiş. Burada az önce içine girdiğim if’ın zıttı “else” (yoksa) var. Ona girmeden atlayıp geçmem lazım. Bakıyorum, altıncı satır da else’in egemenlik alanı dahilinde ve onu da atlamam lazım. Yedinci satıra bakalım. Ohh be, else’in egemenlik alanı burada bitmiş. Rahat rahat yolumuza devam edelim. Ekrana “Valla bak” yazıyorum ve bitti hele şükür.
Şimdi ne yaptığımıza bir bakalım. Üçüncü satırda if kullanarak compiler’a bir soru sorduk. If içine yazdığımız sorunun cevabı doğruysa compiler’in if’in egemenlik alanına girip dördüncü satırdaki komutu yapmasını istedik. Eğer if’ın içindeki sorunun cevabı yanlışsa bu sefer compiler’ın “else”in egemenlik alanına girmesini istedik. Yani eğer kullanıcı olarak 24 değil de 34 girsek compiler’imiz şöyle düşünecekti:
Maalesef 34, 30’dan küçük değilmiş. O zaman if’in içinde hesapladığım boolean “false” çıktı. Bu durumda if’in egemenlik alanını atlayacağım. Bakalım if’in arkasından gelen else (yoksa) veya elif (eğer yoksa) var mı. Else varmış. O zaman onun egemenlik alanına gireceğim.
Yaptığımız iş kısa ve öz olarak “kodun akışını kontrol etmek.” Aynen bir trafik polisi gibi, “sen sağdan devam et,” “sen bekleme yapma, sola dön,” falan diyoruz akıp giden koda. Tabi trafik polisi akışı kontrol ederken kafasına göre bir kural uyguluyor muhtemelen. Bizim kuralımız ise gayet açık seçik bir matematiksel denklemle ifade ediliyor. Mesela, yukarıdaki kodun akışı şu şekilde oluyor:
- Eğer girilen yaş 30’dan küçük veya 30’a eşitse takip etmen gerek satırlar: 1->2->4->7
- Eğer girilen yaş 30’dan büyükse takip etmen gerek satırlar: 1->2->6->7
Kod akışını kontrol ederek çok ufak da olsa bir zeka parıltısı gösteren yapay zeka yarattık dostlar. Size yaşınızı soruyor ve verdiğiniz cevaba göre değişik iltifatlarda bulunuyor. Tabiki Siri’ler, Alexa’lar, bilgisayar oyunlarındaki karakterler veya kompleks AI’ların hiç biri bu kadar basit bir kod akışına sahip değil. Ama her şeyin temelindeki mantık çok da farklı değil. Kod akışı kontrolüyle yönlendirilen birer program hepsi. Kim bilir, belki bizler de öyleyizdir? 🙂
Tatavayı keselim ve detaylara inmeye başlayalım.
Dördüncü kural: İki nokta üst üsteyi gördüğünüz anda, bir girinti içeriden birinin egemenlik alanı başlar.
Bu kuralımızı anlatmak için bir önceki örneğimizi biraz zenginleştirelim.
string_yas = input("Yasiniz?") integer_yas = int(string_yas) if integer_yas <= 30: print("Cok gencsiniz") print("Ustelik kustahsiniz da") x = integer_yas/3 print("Bu arada yasinizin ucte biri " + str(x) + "'mis.") else: print("Yok canim en fazla 30 gosteriyorsunuz") x = integer_yas - 1 print("Hani belki " + str(x) + " falan.") print("Valla bak")
Kerata espri falan da yapıyor bakın.
Şimdi egemenlik alanı diye bahsettiğimiz, tamamen şahsımın bir tarafından uydurduğu terimin ne olduğunu anlayalım. If, else veya sonradan öğreneceğimiz for, while gibi akışı kontrol etmemizi sağlayan tüm komutlar bir “:” işaretiyle noktalanırlar. Sonra bir alt satırdan bir girinti yapılarak yazılmaya başlanan yeni kodda kendilerinin egemenlik alanı başlar. Egemenlik alanı o komutun kuralları çerçevesinde uygulanan kodların bölgesidir.
Gördüğünüz üzere yeşil kısım if’in egemenlik bölgesiyken, kırmızı olan else’inki. Yeşil bölgeye girerken iki tane boşluk yaparak bir girinti yaptık ve kodumuzu yazmaya başladık. Bu kısımda yazacağımız her kod “if integer_yas <= 30″un egemenlik bölgesindeydi yani ancak o denklem tutarsa uygulacaktı. If’in içinde işimiz bittiğindeyse artık geri gidip normal kod akışına dönmemizin zamanı gelmişti ve ikinci siyah oku takip ederek if’in egemenlik alanını sonlandırdık, yani sıfır girinti seviyesine geri çıktık. Else ise arkada sırtlan gibi bekliyordu. Bir önceki if’in kurallarına uymayan kod akışları onun egemenlik alanına düşecekti. Python’un kuralları böyle söylüyordu.
Birazcık bu “girinti” yani ingilizcesi “indentation” muhabbetini açalım. Python’da indentation olayının tek sebebi if’lerin, else’lerin, for’ların, while’ların egemenlik alanlarının sınırlarını Python’a iletmek. Baştan paragraf başı yapmadan başladığımız kısım 0 girinti seviyesidir ve yazdığımız kodun ana akışı bu seviyeden devam eder. Sonrasında gelen akış kontrol komutlarının her biri bizi birer birer içeri götürür kendi bölgelerine. Aynı girinti seviyesinde birbirini takip eden tüm satırlar aynı komutun egemenlik alanında yer alır. Kullandığınız compiler’ların çoğu akıllıdır. Kodunuza bir “:” eklediğiniz anda bir sonraki satırda bir girinti yapacağınızı hisseder. Bir sonraki satıra geçmek için enter’a bastığınız anda ise kendiliğinden bir girinti yapacaktır. İşte enter’a bastıktan sonra compilerin beni götürdüğü yer.
Peki ya if’in arkasından girinti yapmazsam? Veya fazladan girinti yaparsam? Kendisi bu konuda biraz asabidir. “Indentation error’u” patlatıverir.
Eğer bir gün Python’da program yazmaya başlarsanız muhtemelen en çok denk geleceğiniz hata işte bu “indentation error” olacaktır. Python indentation meselesine biraz fazla takıntılıdır ve de compiler’dan compiler’a bu girinti miktarları değişir. Bazıları ” ” şeklinde 4 boşlukken, bazıları ” ” gibi iki boşlukludur (bizimki de öyle misal). O yüzden bir yerden kod örneği kopyalayıp yapıştırırsanız %90 ihtimalle bu hatayla karşılaşırsınız. Python çoğu dile göre gevşek yazım (syntax) kurallarına sahipken indentation konusunda hata veren nadir dillerden biridir. Ama olsun, indentation’a dikkat etmek her zaman iyidir, programlama dili farketmeksizin.
Ödev 4.1: Kullanıcıdan 100’den küçük bir sayı girmesini isteyen, eğer girerse kullanıcıya teşekkür eden, girmezse “ayıp oluyor” diyen bir program yazın.
Python’a soru sorma işlerine ikinci dersimizde başlamıştık hatırlarsınız. Onları hatırlayarak if içinde başka neler sorabiliyoruz biraz hatırlayalım. Mesela eşitlik sorgulayabiliyoruz.
x = input("Bir sayi girin") y = int(x) if y == 3: print("3 girmissiniz") else: print("3 girmemissiniz")
Tersini de yapabiliyoruz. Bu da eşitsizlik sorusu.
x = input("Bir sayi girin") y = int(x) if y != 3: print("3 girmemissiniz") else: print("3 girmissiniz")
If içerisinde integer’ları ve/veya float’ları birbiriyle karşılıştırırken pek çok opsiyonumuz var. Mesela:
x = 3.4 y = 27 if x < y: print("x y'den kucuk") if x <= y: print("x y'den kucuk veya y'ye esit") if x > y: print("x y'den buyuk") if x >= y: print("x y'den buyuk veya y'ye esit") if x == y: print("x y'ye esit") if x != y: print("x y'den farkli")
String’leri de karşılaştırabiliriz. Neden olmasın?
x = "merhaba" y = "merhaba " if x == y: print("x y'ye esit") if x != y: print("x y'den farkli")
Ödev 4.2: 49.162, 4833.4124, (599.1764 + 5) * 4 üçlüsünden hangi ikisi birbirine eşittir? Bu soruyu cevaplayan bir kod yazın.
Dikkat ederseniz if’i başta else ile beraber kullandık. İkinci kısımdaki örneklerdeyse if tek başınaydı. Kod akışını kontrol eden bir trafik polisi olarak if için pek çok opsiyonumuz mevcut. İster arabaları kenara çekip alkol muayenesinden geçiririz, diğerlerine dokunmayız. İster arabaları ayrı yola, minibüsleri ayrı yola, kamyonları ayrı yola yönlendiririz. Bir bakalım bakalım neler yapabiliyoruz.
- If tek başına: Sadece belli bir koşul gerçekleştiğinde çalıştırmak istediğiniz bir mantık var. Yani sadece arabaları kenara çekiyorsunuz. Mesela kullanıcıdan bir sayı isteyelim. Sayı büyükse ekrana bir sayı yazalım ve başka bir şey yapmayalım.
x = input("Kucuk bir sayi girin lutfen.") y = int(x) if y > 100: print("Cok buyuk bu ya")
Ödev 4.3: Yukarıdaki gibi kullanıcıdan küçük bir sayı girmesini isteyen, eğer girilen sayı 100’den büyükse girilen sayıyı 100’e bölüp sonucunu ekrana “Kusura bakma 100’e böldüm ben bunu” diyerek yazan bir kod yazın..
Ödev 4.4: Yukarıdaki gibi kullanıcıdan küçük bir sayı girmesini isteyen, eğer girilen sayı 100’den büyükse kendisinden tekrar sayı girmesini isteyen ve sonunda en son girilen sayıyı ekrana yazan bir kod yazın.
- If-else kombinasyonu: Adı üstünde “eğer-yoksa” kombinasyonu. Belli bir koşul gerçekleşirse A olayını, gerçekleşmezse B olayını gerçekleştirmek istiyoruz. Yani arabaları sağa, diğer tüm taşıtları sola çektiriyoruz. Mesela önceki kodu biraz değiştirip eğer kullanıcı istediğimiz sayıyı girerse kendisine teşekkür edelim.
x = input("Kucuk bir sayi girin lutfen.") y = int(x) if y > 100: print("Cok buyuk bu ya") else: print("Tesekkurler yeteri kadar kucuk.")
Ödev 4.5: Kullanıcıdan iki defa sayı girmesini isteyen, eğer iki sayı birbirine eşitse ekrana “Aynı sayıyı girmişsiniz”, değilse “Farklı sayılar bunlar” yazan bir kod yazın.
- If-elif ve belki else kombinasyonu: Buradaki elif arkadaşınız olan değil (yoksa e’yi büyük yazardık), else-if’in yani “yoksa-eğer”in kısaltılması. Kombinasyonumuz da şöyle işliyor: Eğer (if) A koşulu gerçekleşiyorsa bunu yap, yoksa eğer (elif) B koşulu gerçekleşiyorsa şunu yap, yoksa eğer C koşulu gerçekleşiyorsa onu yap…. Hemen bir örneğe başvuralım.
x = input("Kucuk bir sayi girin lutfen.") y = int(x) if y > 100: print("Cok buyuk bu ya. 100'den buyuk.") elif y > 50: print("Fena degil. 100'den kucuk ama 50'den buyuk.") elif y > 20: print("Hic fena degil. 50'den kucuk ama 20'den buyuk.") else: print("Temem.")
Yazdığımız programın yaptığı şeyi şöyle özetleyebiliriz:
- Eğer kullanıcının girdiği sayı 100’den büyükse, ekrana “Çok büyük bu ya. 100’den büyük.” yaz.
- Yoksa eğer kullanıcının girdiği sayı 50’den büyükse, ekrana “Fena değil. 100’den küçük ama 50’den büyük.” yaz.
- Yoksa eğer kullanıcının girdiği sayı 20’den büyükse, ekrana “Hiç fena değil. 50’den küçük ama 20’den büyük.” yaz.
- Yoksa ekrana “Temem.” yaz.
Kısa ve öz olarak ikiden fazla farklı koşul altında programımızdan farklı şeyler yapmasını istiyorsak if, elif, elif, else gibi bir kombinasyon kullanabiliriz. Dikkat etmemiz gereken en önemli şey compiler’in if’leri elif’leri teker teker sırasıyla değerlendirdiğidir.
Ödev 4.6: Kullanıcıdan iki defa sayı girmesini isteyen, ve ekrana “Birinci sayı ikinciden daha büyük”, “İkinci sayı birinci sayıdan daha büyük” veya “iki sayı birbirine eşit” yazan bir program yazın.
Ödev 4.7: Kullanıcadan bir sayı girmesini isteyen, girilen sayı 1000’den küçükse kaç basamaklı olduğunu ekrana yazan, değilse “Sayı 1000’den büyük” yazan bir program yazın.
Burada biraz durup soluklanalım ve if’lerin içinde kullanabileceğimiz fantastik şeyleri bir sonraki derse bırakalım. Tabi bu arada ödevleri yapmayı veya en azından yapmaya çalışmayı unutmayalım. Ödev demişken, bir önceki dersin çözümleri işte burada. Beşinci derste görüşmek üzere!
Ödev 3.1 çözüm:
x = input("Birinci sayiyi alayim.") x = int(x) y = input("Ikinci sayiyi alayim.") y = int(y) print("Birinci girdiğiniz sayı " + str(x) + ", ikinci girdiğiniz sayı " + str(y) + ", bu sayıların çarpımı da " + str(x * y) + ".")
Hafız Lakyab
Yazar: Hafız Lakyab (tümünü gör)
- Dev Kütleli Bir Kara Deliğin Olması Gereken Yer, Galaksisinin Merkezi midir? - 17 Eylül 2019
- Bana kod yazmayı öğret baba – Bölüm 9 - 10 Mart 2019
- Bana kod yazmayı öğret baba – Bölüm 8 - 24 Şubat 2019
- Bana kod yazmayı öğret baba – Bölüm 7 - 10 Şubat 2019
- Bana kod yazmayı öğret baba – Bölüm 6 - 27 Ocak 2019