• Sonuç bulunamadı

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.