while döngüsü

Programlamanın temel yapı taşlarından biri de bir komutlar grubunun tekrar tekrar işletilmesidir. Bu döngüler her zaman bir şart ile beraber kullanılır. Şart doğru olduğu sürece döngü tekrarlanır, yanlış hale geldiğinde durur.

Aşağıdaki döngü 1-9 arası rakamları ekrana basar.


In [2]:
a = 1
b = 10
while a<b:
    print a,
    a = a+1   # her adımda a'yı 1 arttır.


1 2 3 4 5 6 7 8 9
  • Döngüyü tanımlayan while kelimesinin ardından bir şart belirtilmelidir. Şart doğruysa while blokundaki komutlar işletilir.
  • while bloku içinde komutlar kaydırılmalıdır.
  • Blokun sonunda, while şartı tekrar değerlendirilir, doğruysa blok bir daha işletilir.
  • Döngü bloku içinde parametreler öyle değiştirilmelidir ki şart eninde sonunda yanlış olsun. Yukarıdaki örnekte, a 10 değerine geldiğinde a<b şartı yanlış olur ve döngü biter. Bu sağlanmazsa program sonsuz döngüye girer.
  • IPython Notebook'da sonsuz döngüye girdiğinizde Kernel menüsünden Interrupt seçerek, veya Ctrl-m ve ardından i tuşlarına basarak hesaplamayı durdurabilirsiniz.

Bu sefer 1-10 arası sayıların toplamını veren bir döngü yazalım:


In [3]:
a = 1
b = 10
toplam = 0
while a <= b:     # b'yi dahil etmek istediğimiz için küçükeşit kullandık
    toplam += a   # toplam = toplam + a 
    a += 1
print toplam


55

Alıştırmalar: Yukarıdaki programı değiştirerek şu işlemleri yapın.

  1. $1+3+5+\cdots+101$
  2. $1^2 + 2^2 + 3^2 + \cdots + 100^2$
  3. $\frac{1}{2} + \frac{1}{4} + \frac{1}{8} + \cdots + \frac{1}{2^{10}}$
  4. $1\times 2 \times 3 \times \cdots \times 20$

İçiçe döngüler

Sık sık döngü içinde döngüler kullanmak gerekecektir. Bunun için bir while bloku içinde başka while blokları yaratabiliriz.

Örnek olarak, $p=1,2,3,4,5,6$ olmak üzere, $1^p + 2^p + \cdots + 10^p$ toplamını hesaplayan bir program yazalım. Önce, verilen bir $p$ için bu toplamı hazırlayan yalınkat bir döngü yazmakla başlayalım.


In [4]:
p = 2
n = 1
toplam = 0
while n<=10:
    toplam += n**p
    n += 1
print toplam


385

Şimdi, bu n döngüsünün etrafına p döngüsünü "saralım".


In [6]:
p = 1
while p<=6:
    n = 1
    toplam = 0
    while n<=10:
        toplam += n**p
        n += 1
    print p, toplam
    p += 1


1 55
2 385
3 3025
4 25333
5 220825
6 1978405

İçiçe döngüleri en içten başlayarak aşama aşama oluşturmak daha kolaydır ve hataları engellemeye yardımcı olur.

Başka bir örnek: Kullanıcıdan bir sayı alarak, birden o sayıya kadar olan sayıların toplamını veren bir program yazalım. Kullanıcı -1 değeri girdiğinde program bitsin.


In [9]:
n = input("Üst sınır (-1 bitirir): ")
while n != -1:
    i = 1
    toplam = 0
    while i<=n:
        toplam += i
        i += 1
    print "1 + ... +",n,"=",toplam
    n = input("Üst sınır (-1 bitirir): ")


Üst sınır (-1 bitirir): 100
1 + ... + 100 = 5050
Üst sınır (-1 bitirir): 79874
1 + ... + 79874 = 3189967875
Üst sınır (-1 bitirir): -1

break ve continue

break komutu, bir çevrimin bitmesini beklemeden hemen döngünün sonlandırılmasını sağlar. Örnek olarak, yukarıdaki örneği farklı şekilde yazalım. Bir sonsuz döngü içinde kullanıcıdan girdi alalım, kullanıcı -1 girdiğinde döngüyü kıralım.


In [10]:
while True: # sonsuz döngü
    n = input("Üst sınır (-1 bitirir): ")
    if n==-1:
        break
    i = 1
    toplam = 0
    while i<=n:
        toplam += i
        i += 1
    print "1 + + ... +",n,"=",toplam


Üst sınır (-1 bitirir): 5
1 + + ... + 5 = 15
Üst sınır (-1 bitirir): 100
1 + + ... + 100 = 5050
Üst sınır (-1 bitirir): -1

Başka bir örnek olarak, verilen bir sayının asal olup olmadığını veren bir program yazalım. Verilen sayının kareköküne kadar bütün tamsayıları tek tek deneyip, verilen sayıyı bölen bir tane bulursak asal olmadığını, bulamazsak asal olduğunu anlarız.


In [12]:
n = input("Sayı: ")
asal = True  # Asal olduğunu varsayarak başlarız
i = 2
while i*i <= n:
    if n%i == 0:
        asal = False
        break  # döngüden çık
    i += 1

if asal:
    print n,"asal."
else:
    print n,"asal değil."


Sayı: 56
56 asal değil.

continue komutu, döngü blokunun geri kalanını işletmeden, blokun başına dönmeyi sağlar. Tekrarlama şartı yeniden değerlendirilir ve döngü buna göre yeniden başlatılır.

Örnek olarak, bir önceki programı negatif sayılar verildiğinde, işlem yapmadan, tekrar soracak şekilde değiştirelim.


In [ ]:
while True: # sonsuz döngü
    n = input("Üst sınır (-1 bitirir): ")
    if n==-1:
        break
    if n<0:
        print "Pozitif sayı girin."
        continue   # döngünün kalanını atla, başa dön
    i = 1
    toplam = 0
    while i<=n:
        toplam += i
        i += 1
    print "1 + + ... +",n,"=",toplam

for döngüsü

for ifadesi dizili nesneler (çokuz, dize, liste, vs.) üzerinden sırayla geçmeyi sağlar. Sözgelişi, bir listede bulunan sayıların toplamını bulabiliriz. Önce, bunu while ile nasıl yapacağımızı görelim.


In [24]:
L = [1, 4, 7, 2, 9, 45]
toplam = 0
i = 0
while i<len(L):
    toplam += L[i]
    i += 1
print toplam


68

Aynısını for ile yapmak daha sade ve daha "Pythonca" olur.


In [25]:
L = [1, 4, 7, 2, 9, 45]
toplam = 0
for x in L:
    toplam += x
print toplam


68

Yukarıda geliştirdiğimiz 1-N arası sayıların toplamı programını for ile şöyle yazarız.


In [16]:
N = input("Üst sınır: ")
toplam = 0
for x in range(N+1):
    toplam += x
print toplam


Üst sınır: 10
55

Başka örnekler


In [20]:
s = "Merhaba"
for c in s:
    print c,"-",


M - e - r - h - a - b - a -

In [21]:
T = ((1,2), (5,3), (-5, 9))
for a,b in T:
    print a, "+", b, "=", a+b


1 + 2 = 3
5 + 3 = 8
-5 + 9 = 4

break ve continue komutları for döngülerinde de aynen işler.