Python’da Döngüler
7.1 while Döngüsü
sekilde kullanıcı adı ve parola soran bir program yazsak, ¸su anki bilgilerimizle her defasında programı yeniden ba¸slatmak zorunda kalırız. Yani kullanıcı adı ve parola yanlı¸s girildi˘ginde bu kullanıcı adı ve parolayı tekrar tekrar soramayız; programı yeniden ba¸slatmamız gerekir. ˙I¸ste bu bölümde Python’da yazdı˘gımız kodları sürekli hale getirmeyi, tekrar tekrar döndürmeyi ö˘grenece˘giz.
Kodlarımızı sürekli döndürmemizi sa˘glamada bize yardımcı olacak parçacıklara Python’da döngü (˙Ingilizce: Loop) adı veriliyor. Bu bölümde iki tane döngüden bahsedece˘giz: while ve fordöngüleri. Ayrıca bu bölümde döngüler dı¸sında break ve continue deyimleri ile range() ve len()fonksiyonlarına da de˘ginece˘giz. Böylece ilerleyen bölümlerde i¸sleyece˘gimiz daha karma¸sık konuları biraz daha kolay anlamamızı sa˘glayacak temeli edinece˘giz. ˙Isterseniz lafı daha fazla uzatmadan yola koyulalım ve ilk olarak while döngüsüyle i¸se ba¸slayalım...
7.1 while Döngüsü
Yazdı˘gımız kodları tekrar tekrar döndürmemizi sa˘glayan, programımıza bir süreklilik katan ö˘gelere döngü adı verilir. while döngüsü, yukarıda verilen tanıma tam olarak uyar. Yani yazdı˘gımız bir programdaki kodların tamamı i¸sletilince programın kapanmasına engel olur ve kod dizisinin en ba¸sa dönmesini sa˘glar. Ne demek istedi˘gimizi anlatmanın en iyi yolu bununla ilgili bir örnek vermek olacaktır. O halde ¸su küçücük örne˘gi bir inceleyelim bakalım:
#!/usr/bin/ env python
# coding: utf-8 -*-a = 0
a = a + 1 print a
Bu minicik kodun yaptı˘gı i¸s, birinci satırdaa de˘gi¸skeninin de˘gerine bakıp ikinci satırda bu de˘gere 1 eklemek, üçüncü satırda da bu yeni de˘geri ekrana yazdırmaktır. Dolayısıyla bu kod parçasının verece˘gi çıktı da 1 olacaktır. Bu çıktıyı verdikten sonra ise program sona erecektir.
76
Bu arada ufak bir ipucu verelim size. Python yukarıda gördü˘günüza = a + 1 satırını ¸su
¸
sekilde yazmanıza da izin verir:
a += 1
E˘gera = a - 1 gibi bir ¸sey yazmı¸s olsaydık, bunu da ¸su ¸sekilde kısaltabilirdik:
a -= 1
a = a * 2 veya a = a / 2 gibi ifadeler de ¸söyle kısaltılabilir:
a *= 2 ve:
a /= 2
Bu kısaltmalar son derece önemlidir, çünkü yazdı˘gınız Python programlarının performansını artırıcı etkileri vardır. O yüzden kodlarınızda mümkün oldu˘gunca bu kısaltmaları kullanmaya çalı¸sın.
¸
Simdi yukarıdaki koda bazı eklemeler yapalım:
#!/usr/bin/env python
# coding: utf-8 -*-a = 0
while a < 100:
a += 1 print a
Bu kodu çalı¸stırdı˘gımızda, 1’den 100’e kadar olan sayıların ekrana yazdırıldı˘gını görürüz.
Konuyu anlayabilmek için ¸simdi de satırları teker teker inceleyelim:
˙Ilk satırda, 0 de˘gerine sahip bira de˘gi¸skeni tanımladık.
˙Ikinci ve üçüncü satırlarda, “a de˘gi¸skeninin de˘geri 100 sayısından küçük oldu˘gu müddetçe a de˘gi¸skeninin de˘gerine 1 ekle,” cümlesini Pythonca’ya çevirdik.
Son satırda ise, bu yenia de˘gerini ekrana yazdırdık.
˙I¸ste bu noktada while döngüsünün faziletlerini görüyoruz. Bu döngü sayesinde programımız son satıra her geli¸sinde ba¸sa dönüyor. Yani:
a de˘gi¸skeninin de˘gerini kontrol ediyor,
a de˘gerinin 0 oldu˘gunu görüyor,
a de˘gerinin 100’den küçük oldu˘gunu idrak ediyor,
a de˘gerine 1 ekliyor (0 + 1 = 1),
Bu de˘geri ekrana yazdırıyor (1),
Ba¸sa dönüp tekrar a de˘gi¸skeninin de˘gerini kontrol ediyor,
a de˘gerinin ¸su anda 1 oldu˘gunu görüyor,
a de˘gerinin hâlâ 100’den küçük oldu˘gunu anlıyor,
a de˘gerine 1 ekliyor (1 + 1 = 2),
Bu de˘geri ekrana yazdırıyor (2),
Bu i¸slemi 99 sayısına ula¸sana dek tekrarlıyor ve en sonunda bu sayıya da 1 ekleyerek vuslata eriyor.
Gördü˘günüz gibi, while döngüsünü anlamak ve kullanmak hiç de zor de˘gil. ˙Isterseniz alı¸stırma olması bakımından bir örnek daha verelim:
#!/usr/bin/env python
kull_ad = raw_input("Kullanıcı adı: ") par = raw_input("Parola: ")
if kull_ad == kullanici_adi and par == parola:
print "Programa ho¸sgeldiniz!"
a = 2
elif not kull_ad or not par:
print "Bu alanları bo¸s bırakamazsınız!"
else:
print "Kullanıcı adı veya parolanız hatalı."
Burada öncelikle de˘geri 1 olana adlı bir de˘gi¸sken tanımladık. Bu de˘gi¸skenin de˘geri 1 oldu˘gu müddetçe programımız çalı¸smaya devam edecek.
Bir sonraki satırdakullanici_adi ve parola adlı iki de˘gi¸sken daha tanımlıyoruz. E˘ger kullanıcı, bu de˘gi¸skenlerin de˘gerini do˘gru girerse sisteme giri¸s yapabilecek.
Daha sonra da while döngümüzü tanımlıyoruz. Burada yaptı˘gımız ¸seye dikkat edin. while a
== 1 ifadesi ile Python’a ¸sunu söylemi¸s oluyoruz:
“a de˘gi¸skeninin de˘geri 1 oldu˘gu müddetçe a¸sa˘gıdaki kodları çalı¸stırmaya devam et!“ Bu satırın ardından normal bir ¸sekilde raw_input() fonksiyonlarımız yardımıyla kullanıcıdan kullanıcı adı ve parola bilgilerini istiyoruz.
Ardından gelen if deyimini nasıl yazdı˘gımıza dikkat edin. Burada ¸söyle bir ¸sey demi¸s olduk:
“E˘ger kull_ad de˘gi¸skeninin de˘geri kullanici_adi de˘gi¸skeninin de˘geriyle VE par de˘gi¸skeninin de˘geri parola de˘gi¸skeninin de˘geriyle aynıysa...“
Buradakiand (VE) i¸slecinin görevini biliyorsunuz. Bu sayede kullanıcının hem kullanıcı adı hem de parola bilgisini do˘gru girmesini isteyebiliyoruz.
Bu arada, buradaki if blo˘gunun içinde görünena = 2 ifadesi de çok önemli. Bu ifade ile, en ba¸sta belirledi˘gimiza de˘gi¸skeninin 1 olan de˘gerini 2‘ye getiriyoruz. Böylecea de˘gi¸skeninin de˘geri artık 1 olmamı¸s oluyor. Böylece kullanıcımız kullanıcı adı ve parola bilgilerini do˘gru girdi˘ginde while döngüsü sona eriyor. E˘ger buradaa de˘gi¸skeninin de˘gerini 1 dı¸sında bir de˘gere ayarlamazsak, kullanıcı adı ve parola do˘gru girildi˘gi halde programımız kullanıcı adı ve parola sormaya devam edecektir.
Sonraki satırda gördü˘gümüz elif blo˘gunda ise kullanıcı adı ve parola alanlarının bo¸s bırakılıp bırakılmadı˘gını denetliyoruz. E˘ger kullanıcımız, kullanıcı adı VEYA (or) parola bilgilerinden herhangi birini bo¸s bırakırsa kendisine Bu alanları bo¸s bırakamazsınız! uyarısı gösteriyoruz.
elseblo˘gunda ise kullanıcı adı ve parolanın yanlı¸s girilmesi halinde kullanıcıya nasıl bir uyarı gösterece˘gimizi belirliyoruz.
Yukarıdaki kodlar istedi˘gimiz i¸slemi rahatlıkla yerine getirmemizi sa˘glar. Bu açıdan yukarıdaki kodlar tamamen do˘gru ve geçerli bir Python programıdır. Ancak e˘ger istersek yukarıdaki kodları biraz sadele¸stirme ve profesyonel bir görünüm kazandırma imkanına da sahibiz.
¸
kull_ad = raw_input("Kullanıcı adı: ") par = raw_input("Parola: ")
if kull_ad == kullanici_adi and par == parola:
print "Programa ho¸sgeldiniz!"
quit()
elif not kull_ad or not par:
print "Bu alanları bo¸s bırakamazsınız!"
else:
print "Kullanıcı adı veya parolanız hatalı."
Burada önceki kodlara göre bazı farklılıklar dikkatimizi çekiyor. Mesela önceki kodlarda yer alana de˘gi¸skenini burada artık kullanmıyoruz. Çünkü bu de˘gi¸skene ihtiyacımız kalmadı.
Bunun yerine while döngümüzü ¸su ¸sekilde yazdık:
while True:
Hatırlarsanız geçen bölümde Bool de˘gerleri incelerken True kelimesinin “do˘gru” anlamına geldi˘gini söylemi¸stik. Dolayısıyla burada gördü˘gümüzwhile True ifadesi ¸su anlama geliyor:
“Do˘gru oldu˘gu müddetçe a¸sa˘gıdaki kodları çalı¸stırmaya devam et!“
Peki ne do˘gru oldu˘gu müddetçe? Neyin do˘gru oldu˘gunu açıkça belirtmedi˘gimiz için Python burada her ¸seyi do˘gru kabul ediyor. Yani bir nevi, “aksi belirtilmedi˘gi sürece a¸sa˘gıdaki komutları çalı¸stırmaya devam et!” emrini yerine getiriyor.
Bunun dı¸sında farklı olarak ilk if blo˘gu içindekia = 2 satırını da kaldırdık. Programın en ba¸sındakia de˘gi¸skenini kaldırdı˘gımız için artık bu satıra da ihtiyacımız yok. Onun yerine, quit()adlı bir fonksiyon kullanıyoruz. Siz bu fonksiyonu ilk derslerimizden hatırlıyor olmalısınız. Bu fonksiyon Python’un etkile¸simli kabu˘gundan çıkmamızı sa˘glıyordu...
whiledöngüsünü yeni ö˘grenenlerin en sık yaptı˘gı hatalardan biri, döngüyü sona erdirecek bir ko¸sul belirtmeyi unutmaktır.
¸
Su örne˘ge bir bakalım:
#!/usr/bin/env python
# coding: utf-8
-*-soru = raw_input("Python mu Ruby mi?") while soru != "Python":
print "Yanlı¸s cevap!"
Dikkat ederseniz burada da i¸sleçlerimizden birini kullandık. Kullandı˘gımız i¸sleç “e¸sit de˘gildir”
anlamına gelen ”!=” i¸sleci. Ancak burada döngüyü sona erdirecek bir ko¸sul belirlemedik...
Bu programı çalı¸stırdı˘gımızda sorulan soruya Python cevabı vermezsek, program biz
müdahale edene kadar ekrana Yanlı¸s cevap! çıktısını vermeye devam edecek, yani sonsuz bir döngüye girecektir. Çünkü biz Python’a ¸su komutu vermi¸s olduk bu kodla:
“soru de˘gi¸skeninin cevabı Python olmadı˘gı müddetçe ekrana ‘Yanlı¸s cevap!’ çıktısını vermeye devam et!“
E˘ger bu programı durdurmak istiyorsakCTRL+C tu¸slarına basmamız gerekir.
Yukarıdaki kodların i¸sletili¸sini sınırlamak için ¸söyle bir ¸sey yazabiliriz:
#!/usr/bin/env python
# coding: utf-8 -*-olcut = 0
soru = raw_input("Python mu Ruby mi?") while olcut <= 10:
olcut += 1
if soru != "Python":
print "Yanlı¸s cevap!"
Bu kodlar sayesinde, e˘ger kullanıcının verdi˘gi cevap “Python” de˘gilse, ekrana on kez “Yanlı¸s cevap!” çıktısı verilecektir. Bu kodlar içindeki en önemli satırolcut += 1‘dir. Çünkü bu kod, whiledöngüsünün her ba¸sa dönü¸sündeolcut de˘gi¸skeninin de˘gerini 1 artırarak 10’a
yakla¸stırıyor. E˘ger bu satırı yazmazsak,olcut de˘gi¸skeninin de˘geri her zaman 0 olmaya devam edecek, bu nedenle de döngümüz sürekli çalı¸smaya devam edecektir.
¸
Simdilik while döngüsüne ara verip bu konuda incelememiz gereken ikinci döngümüze geçiyoruz.