Python (4. Bölüm)
Pardus-Linux.org | Wiki sitesinden
Forum'da bu konunun tartışma adresi: http://forum.pardus-linux.org/viewtopic.php?t=10478&highlight=
Konu başlıkları |
Python'da Döngüler
Bir önceki bölümün sonunda hatırlarsanız basit bir hesap makinesi yapmıştık. Ancak dikkat ettiyseniz, o hesap makinesi programında toplama, çıkarma, çarpma veya bölme işlemlerinden birini seçip, daha sonra o seçtiğimiz işlemi bitirdiğimizde program kapanıyor, başka bir işlem yapmak istediğimizde ise programı yeniden başlatmamız gerekiyordu... Aynı şekilde kullanıcı adı ve parola soran bir program yazsak, şu anki bilgilerimizle her defasında programı yeniden başlatmak zorunda kalırız. Yani kullanıcı adı ve şifre yanlış girildiğinde bu kullanıcı adı ve şifreyi tekrar tekrar soramayız; programı yeniden başlatmamız gerekir... İşte bu bölümde Python'da yazdığımız kodları sürekli hale getirmeyi, tekrar tekrar döndürmeyi öğreneceğiz.
Kodlarımızı "sürekli döndürmemizi" sağlamada bize yardımcı olacak parçacıklara Python'da "döngü" (İngilizce: Loop) adı veriliyor... Bu bölümde iki tane döngüden bahsedeceğiz: "while" ve "for" döngüleri. Ayrıca bu bölümde döngüler dışında "break" ve "continue" ifadeleri ile range() ve len() fonksiyonlarına da değineceğiz.
while döngüsü
While döngüsü, yukarıda verilen tanıma tam olarak uyar. Yani yazdığımız bir programdaki kodların tamamı işletilince programın kapanmasına engel olur ve kod dizisinin en başa dönmesini sağlar. Şu küçücük örneği bir inceleyelim bakalım:
#!/usr/bin/ env python #-*- coding: latin-1 -*- a = 0 a = a + 1 print a
Bu minicik kodun yaptığı iş, birinci satırda "a" değişkeninin değerine bakıp ikinci satırda bu değere 1 eklemek, üçüncü satırda da bu yeni değeri ekrana yazdırmaktır.. Dolayısıyla bu kod parçasının vereceği çıktı da, "1" olacaktır. Bu çıktıyı verdikten sonra ise program sona erdirilecektir. Şimdi bu koda bazı eklemeler yapalım:
#!/usr/bin/env python
#-*- coding: latin-1 -*-
a=0
while a < 100:
a = a + 1
print a
Bu kodu çalıştırdığımızda, 1'den 100'e kadar olan sayıların ekrana yazdırıldığını görürüz.
Konuyu anlayabilmek için şimdi de satırları teker teker inceleyelim:
ilk satırda, "0" değerine sahip bir "a" değişkeni tanımladık.
ikinci ve üçüncü satırlarda, "a değişkeninin değeri 100 sayısından küçük olduğu müddetçe a değişkeninin değerine 1 ekle," cümlesini Python'caya çevirdik.
son satırda ise, bu yeni a değerini ekrana yazdırdık.
İşte bu noktada "while döngüsünün" faziletlerini görüyoruz. Bu döngü sayesinde programımız son satıra her gelişinde başa dönüyor. Yani:
a değişkeninin değerini kontrol ediyor
a'nın 0 olduğunu görüyor
a değerinin 100'den küçük olduğunu idrak ediyor
a değerine 1 ekliyor (0 + 1 = 1)
Bu değeri ekrana yazdırıyor (1)
Başa dönüp tekrar a değişkeninin değerini kontrol ediyor
a'nın şu anda 1 olduğunu görüyor
a değerinin hâlâ 100'den küçük olduğunu anlıyor
a değerine 1 ekliyor (1 + 1 = 2)
Bu değeri ekrana yazdırıyor (2)
Bu işlemi 99 sayısına ulaşana dek tekrarlıyor ve en sonunda bu sayıya da 1 ekleyerek vuslata eriyor...
Burada ilerleyebilmek için ihtiyacımız olacak bazı işlem yardımcılarına veya başka bir ifadeyle işleçlere (operators) değinelim:
Şimdiye kadar aslında bu işleçlerden birkaç tanesini gördük. Mesela:
+ işleci, toplama işlemi yapmamızı sağlıyor - işleci, çıkarma işlemi yapmamızı sağlıyor / işleci, bölme işlemi yapmamızı sağlıyor * işleci, çarpma işlemi yapmamızı sağlıyor > işleci, "büyüktür" anlamına geliyor < işleci, "küçüktür" anlamına geliyor
Bir de henüz görmediklerimiz, ama bilmemiz gerekenler var:
>= işleci, "büyük eşittir" anlamına geliyor <= işleci, "küçük eşittir" anlamına geliyor != işleci, "eşit değildir" anlamına geliyor (örn. "2 * 2 != 5") and işleci, "ve" anlamına geliyor or işleci, "veya" anlamına geliyor True işleci, "Doğru" anlamına geliyor False işleci, "Yanlış" anlamına geliyor
Bu işleçleri şu anda ezberlemenize gerek yok. Bunlar yalnızca size kılavuz olsun diye veriliyor... Yeri geldikçe bunları kullanacağımız için muhakkak aklınıza yerleşeceklerdir...
Şimdi konumuza geri dönebiliriz:
Bu konunun başında, bir önceki bölümde yazdığımız hesap makinesi programına değinmiştik. Şimdi bu programı görelim tekrar:
#!/usr/bin/env python
#-*- coding:latin-1 -*-
from __future__ import division
secenek1 = "(1) toplama"
secenek2 = "(2) çıkarma"
secenek3 = "(3) çarpma"
secenek4 = "(4) bölme"
print secenek1
print secenek2
print secenek3
print secenek4
soru = raw_input("Lütfen yapmak istediğiniz işlemin numarasını girin: ")
if soru == "1":
sayi1 = input("Lütfen toplama işlemi için ilk sayıyı girin: ")
print sayi1
sayi2 = input("Lütfen toplama işlemi için ikinci sayıyı girin: ")
print sayi1, "+", sayi2,":", sayi1 + sayi2
if soru == "2":
sayi3 = input("Lütfen çıkarma işlemi için ilk sayıyı girin: ")
print sayi3
sayi4 = input("Lütfen çıkarma işlemi için ikinci sayıyı girin: ")
print sayi3, "-", sayi4,":", sayi3 - sayi4
if soru == "3":
sayi5 = input("Lütfen çarpma işlemi için ilk sayıyı girin: ")
print sayi5
sayi6 = input("Lütfen çarpma işlemi için ikinci sayıyı girin: ")
print sayi5, "x", sayi6,":", sayi5 * sayi6
if soru == "4":
sayi7 = input("Lütfen bölme işlemi için ilk sayıyı girin: ")
print sayi7
sayi8 = input("Lütfen bölme işlemi için ikinci sayıyı girin: ")
print sayi7, "/", sayi8,":", sayi7 / sayi8
Dediğimiz gibi, program bu haliyle her defasında yalnızca bir kez işlem yapmaya izin verecektir. Yani mesela toplama işlemi bittikten sonra program sona erecektir. Ama eğer biz bu programda şu ufacık değişikliği yaparsak işler değişir:
#!/usr/bin/env python
#-*- coding:latin-1 -*-
from __future__ import division
while True:
secenek1 = "(1) toplama"
secenek2 = "(2) çıkarma"
secenek3 = "(3) çarpma"
secenek4 = "(4) bölme"
print secenek1
print secenek2
print secenek3
print secenek4
soru = raw_input("Lütfen yapmak istediğiniz işlemin numarasını girin: ")
if soru == "1":
sayi1 = input("Lütfen toplama işlemi için ilk sayıyı girin: ")
print sayi1
sayi2 = input("Lütfen toplama işlemi için ikinci sayıyı girin: ")
print sayi1, "+", sayi2,":", sayi1 + sayi2
if soru == "2":
sayi3 = input("Lütfen çıkarma işlemi için ilk sayıyı girin: ")
print sayi3
sayi4 = input("Lütfen çıkarma işlemi için ikinci sayıyı girin: ")
print sayi3, "-", sayi4,":", sayi3 - sayi4
if soru == "3":
sayi5 = input("Lütfen çarpma işlemi için ilk sayıyı girin: ")
print sayi5
sayi6 = input("Lütfen çarpma işlemi için ikinci sayıyı girin: ")
print sayi5, "x", sayi6,":", sayi5 * sayi6
if soru == "4":
sayi7 = input("Lütfen bölme işlemi için ilk sayıyı girin: ")
print sayi7
sayi8 = input("Lütfen bölme işlemi için ikinci sayıyı girin: ")
print sayi7, "/", sayi8,":", sayi7 / sayi8
Burada şu değişiklikleri yaptık:
İlk önce from __future__ import division satırı ile secenek1 = "(1) toplama" satırı arasına
while True:
ifadesini ekledik... Bu sayede programımıza şu komutu vermiş olduk:
"Doğru olduğu müddetçe aşağıdaki komutları çalıştırmaya devam et..."
Zira yukarıda verdiğimiz "işleç" tablosundan da hatırlayacağınız gibi "True" ifadesi "doğru" anlamına geliyor...
Peki ne doğru olduğu müddetçe? Neyin doğru olduğunu açıkça belirtmediğimiz için Python burada "her şeyi doğru" kabul ediyor... Yani bir nevi, "aksi belirtilmediği sürece aşağıdaki komutları çalıştırmaya devam et!" emrini yerine getiriyor.
İkinci değişiklik ise "while True:" ifadesinin altında kalan bütün satırları bir seviye sağa kaydırmak oldu... Eğer kwrite kullanıyorsanız, kaydıracağınız bölümü seçtikten sonra CTRL + i tuşlarına basarak bu kaydırma işlemini kolayca yapabilirsiniz. Bir seviye sola kaydırmak için ise CTRL + SHIFT + i tuşlarını kullanıyoruz.
Şu örneğe bir bakalım:
#!/usr/bin/env python
#-*- coding: latin-1 -*-
soru = raw_input("Arkadaşım sen deli misin?")
while soru != "hayır":
print "delisin sen deli! Kulakları küpeli!"
Dikkat ederseniz burada da işleçlerimizden birini kullandık. Kullandığımız işleç "eşit değildir" anlamına gelen "!=" işleci...
Bu programı çalıştırdığımızda sorulan soruya "hayır" cevabı vermezsek, program biz müdahale edene kadar ekrana "delisin sen deli! Kulakları küpeli" çıktısını vermeye devam edecektir... Çünkü biz Python'a şu komutu vermiş olduk bu kodla:
"Soru değişkeninin cevabı "hayır" olmadığı müddetçe ekrana "delisin sen deli! Kulakları küpeli" çıktısını vermeye devam et."
Eğer bu programı durdurmak istiyorsak CTRL+C'ye basmamız gerekir...
Aynı kodları bir de şu şekilde denerseniz "if" ile "while" arasındaki fark bariz bir biçimde ortaya çıkacaktır:
#!/usr/bin/env python
#-*- coding: latin-1 -*-
soru = raw_input("Arkadaşım sen deli misin?")
if soru != "hayır":
print "delisin sen deli! Kulakları küpeli!"
Şimdilik while döngüsüne ara verip bu konuda incelememiz gereken ikinci döngümüze geçiyoruz.
for döngüsü
Bir önceki konuda while döngülerini anlatırken yazdığımız şu kodu hatırlıyorsunuz:
#!/usr/bin/env python
#-*- coding: latin-1 -*-
a=0
while a < 100:
a = a + 1
print a
Bu kod yardımıyla ekrana 1'den 100'e kadar olan sayıları yazdırabiliyorduk. Aynı işlemi daha basit bir şekilde for döngüsü yardımıyla da yapabiliriz:
#!/usr/bin/env python
#-*- coding: latin-1 -*-
for zombi in range(1, 100):
print zombi
Ben burada değişken adı olarak zombi kelimesini kullandım, siz isterseniz Osman da diyebilirsiniz...
Yukarıdaki Pythonca kod Türkçe'de aşağı yukarı şu anlama gelir:
"1, 100 aralığındaki sayılara zombi adını verdikten sonra ekrana zombi'nin değerini yazdır."
for döngüsüyle ilgili şu örneğe de bir bakalım:
#!/usr/bin/env python
#-*- coding: latin-1 -*-
for kelimeler in "linux":
print kelimeler
Gördüğünüz gibi, for döngüsüyle yalnızca sayıları değil, karakter dizilerinin öğelerini de dökebiliyoruz ekrana.
Böylelikle Python'da while ve for döngülerini de öğrenmiş olduk. Bu arada dikkat ettiyseniz, for döngüsü için verdiğimiz ilk örnekte döngü içinde yeni bir fonksiyon kullandık. İsterseniz bu vesileyle biraz da hem döngülerde hem koşullu ifadelerde hem de başka yerlerde karşımıza çıkabilecek faydalı fonksiyonlara ve ifadelere değinelim:
range() fonksiyonu
Bu fonksiyon Python'da sayı aralıklarını belirtmemizi sağlar. Zaten İngilizce'de de bu kelime "aralık" anlamına gelir. Mesela:
print range(100)
komutu 0 ile 100 arasındaki sayıları yazdırmamızı sağlar. Başka bir örnek daha verelim:
print range(100,200)
komutu 100 ile 200 arasındaki sayıları döker.
Bir örnek daha:
print range(1,100,2)
Bu komut ise 1 ile 100 arasındaki sayıları 2'şer 2'şer atlayarak yazdırmamızı sağlar...
Hemen for döngüsüyle range fonksiyonunun birlikte kullanıldığı bir örnek verip başka bir fonksiyonu anlatmaya başlayalım:
#!/usr/bin/env python #-*- coding: latin-1 -*- for sarki in range (1, 15): print sarki, "mumdur"
len() fonksiyonu
Bu fonksiyon, karakter dizilerinin uzunluğunu gösterir. Mesela:
#!/usr/bin/env python #-*- coding: latin-1 -*- a = "Afyonkarahisar" print len(a)
Bu kod, "Afyonkarahisar" karakter dizisi içindeki harflerin sayısını ekrana dökecektir.
Bu fonksiyonu nerelerde kullanabiliriz? Mesela yazdığınız bir programa kullanıcıların giriş yapabilmesi için şifre belirlemelerini istiyorsunuz. Seçilecek şifrelerin uzunluğunu sınırlamak istiyorsanız bu fonksiyondan yararlanabilirsiniz. Hemen örnek bir kod yazalım:
#!/usr/bin/env python
#-*- coding: latin-1 -*-
a=raw_input("Lütfen bir şifre belirleyin: ")
if len(a) >= 6:
print "Seçtiğiniz şifre en fazla 5 karakterden oluşabilir!"
else:
print "Şifreniz etkinleştirilmiştir."
break ifadesi
break ifadesi program içinde bir noktada programı sona erdirmek gerektiği zaman kullanılır. Aşağıdaki örnek break ifadesinin ne işe yaradığını açıkça gösteriyor:
#!/usr/bin/env python
#-*- coding:latin-1 -*-
kullanici_adi = "kullanici"
parola = "sifre"
while True:
soru1 = raw_input("Kullanıcı adı: ")
soru2 = raw_input("Şifre: ")
if soru1 == kullanici_adi and soru2 == parola:
print "Kullanıcı adı ve şifreniz onaylandı. Programa hoşgeldiniz!"
break
else:
print "Kullanıcı adınız veya şifrenizden en az birisi onaylanmadı. Lütfen tekrar deneyiniz!"
Bu programda break ifadesi yardımıyla, kullanıcı adı ve şifre doğru girildiğinde şifre sorma işleminin durdurulması sağlanıyor. Yukarıdaki kodlar arasında, dikkat ederseniz, daha önce bahsettiğimiz işleçlerden birini daha kullandık. Kullandığımız bu işleç, "ve" anlamına gelen "and" işleci. Bu işlecin geçtiği satıra tekrar bakalım:
if soru1 == kullanici_adi and soru2 == parola:
print "Kullanıcı adı ve şifreniz onaylandı. Programa hoşgeldiniz!"
Burada şu Türkçe ifadeyi Python'caya çevirmiş olduk:
"Eğer soru1 değişkeninin değeri kullanici_ad değişkeniyle aynı ve soru2 değişkeninin değeri parola değişkeniyle aynı ise ekrana 'Kullanıcı adı ve şifreniz onaylandı. Programa hoşgeldiniz,' cümlesini yazdır..."
Burada dikkat edilmesi gereken nokta şu:
and işlecinin birbirine bağladığı soru1 ve soru2 değişkenlerinin ancak ikisi birden doğruysa o bahsedilen cümle ekrana yazdırılacaktır. Yani kullanıcı adı ve parola'dan biri yanlışsa "if" ifadesinin gerektirdiği koşul yerine gelmemiş olacaktır... Okulda mantık dersi almış olanlar bu "and" işlecini yakından tanıyor olmalılar... "And" işlecinin karşıtı "or" işlecidir. Bu işleç Türkçe'de "veya" anlamına gelir. Buna göre, "a veya b doğru ise" dediğiniz zaman, bu a veya b ifadelerinden birinin doğru olması yetecektir. Şayet "a ve b doğru ise" derseniz, burada hem a'nın hem de b'nin doğru olması gerekir...
continue ifadesi
Bu ifade ise döngü içinde bir bloğun es geçilip ondan sonraki bloğun çalıştırılmasını sağlar. Çok bilindik bir örnek verelim:
#!/usr/bin/env python
#-*- coding:latin-1 -*-
while True:
s = raw_input("Bir sayı girin: ")
if s == "iptal":
break
if len(s) <= 3:
continue
print "En fazla üç haneli bir sayı girebilirsiniz."
Burada eğer kullanıcı klavyede "iptal" yazarsa programdan çıkılacaktır. Bunu,
if s == "iptal":
break
satırıyla sağlamayı başardık.
Eğer kullanıcı tarafından girilen sayı üç haneli veya daha az haneli bir sayı ise, "continue" ifadesinin etkisiyle
print "En fazla üç haneli bir sayı girebilirsiniz."satırı es geçilecek ve en başa dönülecektir.
Eğer kullanıcının girdiği sayıdaki hane üçten fazlaysa ekrana:
print "En fazla üç haneli bir sayı girebilirsiniz."cümlesi yazdırılacaktır.
Önceki Bölüm: Koşula Bağlı Durumlar
Sonraki Bölüm: Listeler, Demetler, Sözlükler
Bu yazı Programlama bölümünün bir parçasıdır.
