Looplara Giris

Oncelikle klavyemde Turkce karakter olmadigi icin bu sekilde yazmak zorunda kaldigimi belirteyim.

Looplari anlatmadan once looplara neden ihtiyac duydugumuzu anlatmak isterim. Mesela su ana kadar ogrendiklerimizle kullanicidan 10 tane input alip bunlarin ortalamasini hesaplayalim ve bunu standart outputa basalim:


In [1]:
input1 = int(input("Data 1: "))
input2 = int(input("Data 2: "))
input3 = int(input("Data 3: "))
input4 = int(input("Data 4: "))
input5 = int(input("Data 5: "))
input6 = int(input("Data 6: "))
input7 = int(input("Data 7: "))
input8 = int(input("Data 8: "))
input9 = int(input("Data 9: "))
input10 = int(input("Data 10: "))
print((input1 + input2 + input3 + input4 + input5 + input6 + input7 + input8 + input9 + input10) / 10)


Data 1: 20
Data 2: 10
Data 3: 20
Data 4: 10
Data 5: 20
Data 6: 10
Data 7: 20
Data 8: 10
Data 9: 20
Data 10: 10
15.0

Bunu yapmanin daha kolay bir yolu olmasaydi programlama kopyala yapistirdan ibaret hale gelirdi. Biz bunu kolaylastirmak icin looplari yani donguleri kullaniyoruz. Python'da anlatacagimiz 2 loop var. Bunlar for ve while looplar. Gelin yukaridaki kodu iki loopu da ayri ayri kullanarak yazalim. Ilk olarak while loop ile baslayalim:


In [2]:
i = 0
inputList = []
while i < 10:
    inputList.append(int(input('Data ' + str(i + 1) + ': ')))
    i += 1
i = 0
total = 0
while i < 10:
    total += inputList[i]
    i += 1
print(total / 10)


Data 1: 20
Data 2: 10
Data 3: 20
Data 4: 10
Data 5: 20
Data 6: 10
Data 7: 20
Data 8: 10
Data 9: 20
Data 10: 10
15.0

Gordugunuz gibi daha kolaylasti. Aslinda suan satir olarak pek bir fark yok ama 1000 input almamiz gerektigini dusunelim. Tabii 1000 inputu dosyadan okumak daha mantikli ama simdilik oraya girmiyorum. 1000 input aldigimizda while loopta "i < 10"lari "i < 1000" yapmamiz yeterli olurdu. Ama ustteki kod 1000 satirdan uzun olurdu ve ayni seylerin tekrarindan olusurdu.

Simdi de aynisini for loopla yapalim:


In [3]:
total = 0
for i in range(10):
    total += int(input('Data ' + str(i + 1) + ': '))
print(total / 10)


Data 1: 20
Data 2: 10
Data 3: 20
Data 4: 10
Data 5: 20
Data 6: 10
Data 7: 20
Data 8: 10
Data 9: 20
Data 10: 10
15.0

Bu sefer yukaridaki gibi liste olusturup ikinci bir loop yapmaktansa direkt olarak total'e ekleme yaptim. Yukaridaki liste olusturma islemini, yaygin kullanilan bir islem oldugu icin, gosterme amaciyla yapmistim. While loopta da direkt olarak totale ekleme yaparak tek loopla isi halledebilirdik.

Functionlar

Peki herseyi boyle her seferinde satir satir mi yazmak zorundayiz. Yani bir kod olusturup onu ihtiyacimiz oldugunda cagirma ihtimalimiz yok mu? Tabii ki var. Fonksiyon tanimlayarak bu islemi yapabiliriz. Ancak fonksiyon tanimlarken genel amacli ve en az 2 ya da 3 kez kullanilacak kodlari fonksiyona cevirmemiz gerektigini belirteyim. Eger boyle bir durum yoksa fonksiyon tanimlamanin tek anlami ilerideki potansiyel kullanimlari garakti altina almak olur. Gelin simdi bir liste alip o listedeki elemanlarin ortalamasini hesaplayan bir fonksiyon tanimlayalim:


In [4]:
def average(myList):
    total = 0
    for i in myList:
        total += i
    return total / len(myList)

avg1 = average([10, 12, 15, 22, 17, 14, 15, 16, 18])
avg2 = average([55, 44, 22, 11, 55, 65, 76, 88, 11, 45, 66, 21, 55, 11, 18, 99])
print(avg1, avg2)


15.444444444444445 46.375

Ornekler

Simdi gelin ogrendiklerimizle 2 ornek cozup konuyu bitirelim.

Ilk ornegimiz kullanicidan boslukla ayrilmis 2 sayiyi input olarak alip bunlari kartezyen duzlemdeki x ve y olarak dusunerek egimi hesaplamak. Hesapladigimiz bu egimi kullanarak bircok noktayi input olarak alip bu noktalari kesmek icin orijinden kac dogru cekmemiz gerektigini bulalim:


In [9]:
noktalar = []
for i in range(5):
  myInput = input('Nokta ' + str(i + 1) + ': ')
  myInput = myInput.split(' ')
  noktalar.append(myInput)
  
def egim(noktalar):
  egimler = []
  for i in noktalar:
    egim = int(i[1]) / int(i[0])
    egimler.append(egim)
  return egimler
  
def dogruSayisi(egimler):
  esit = 0
  for i in range(len(egimler)):
    for j in range(i + 1, len(egimler)):
      print(egimler[i], egimler[j])
      if egimler[i] == egimler[j]:
        esit += 1
        break
  return len(egimler) - esit

print(egim(noktalar))
print(dogruSayisi(egim(noktalar)))


Nokta 1: 5 6
Nokta 2: 6 7
Nokta 3: 7 8
Nokta 4: 8 9
Nokta 5: 9 10
[1.2, 1.1666666666666667, 1.1428571428571428, 1.125, 1.1111111111111112]
1.2 1.1666666666666667
1.2 1.1428571428571428
1.2 1.125
1.2 1.1111111111111112
1.1666666666666667 1.1428571428571428
1.1666666666666667 1.125
1.1666666666666667 1.1111111111111112
1.1428571428571428 1.125
1.1428571428571428 1.1111111111111112
1.125 1.1111111111111112
5

Simdi de bir matrix uzerinde ilerleyen bir robot kodlayalim. Robot her engelle karsilastiginda sola donuyor. Matrixin koseleri de engel kabul ediliyor. Boyle buyrun:


In [5]:
l = [[True, False, True, True], \
[False, True, True, False], \
[True, True, True, True], \
[False, False, True, True]]

def hareket(myList, konum, yon):
  if yon == 'K':
    if konum[0] != 0 and myList[konum[0]-1][konum[1]]:
      return ((konum[0]-1, konum[1]), 'K')
    else:
      return (konum[0], konum[1]), 'B'
      
  
  elif yon == 'G':
    if konum[0] != len(myList) - 1 and myList[konum[0]+1][konum[1]]:
      return ((konum[0]+1, konum[1]), 'G')
    else:
      return (konum[0], konum[1]), 'D'
    
  elif yon == 'B':
    if konum[1] != 0 and myList[konum[0]][konum[1]-1]:
      return ((konum[0], konum[1]-1), 'B')
    else:
      return (konum[0], konum[1]), 'G'
    
  elif yon == 'D':
    if konum[1] != len(myList) - 1 and myList[konum[0]][konum[1]+1]:
      return ((konum[0], konum[1]+1), 'D')
    else:
      return (konum[0], konum[1]), 'K'
      
myHareket = hareket(l, (2, 3), 'K')
for i in range(254):
  myHareket = hareket(l, myHareket[0], myHareket[1])
print(myHareket)


((2, 0), 'G')

Kapanis

Dersimiz burada bitiyor. Umarim anlattiklarim anlasilabilmistir. Anlamadiginiz herhangi yer olursa email adresimden her zaman iletisim kurabilirsiniz. Elimden geldigince yardimci olmaya calisirim.


In [ ]: