Python ile Programlamaya Giris

Python ile Programlamaya Giris
Ders 5
String ile for Döngüsü
str degerlerinin elemenlarina, yani karakterlerine, tek tek ulasmanin yolunu
gördük. Eger tüm indeksleri birer kez sorgulamak istersek for anahtar
kelimesini kullanip for döngüsü kurarak ulasabiliriz.
Mesela s degiskeni asagidaki gibi verilsin.
>>> s = "Merhaba"
for döngüsü kullanarak s degiskenin her bir elemanini ch degiskenine
atan bir döngü olusturalim.
>> for ch in s:
print(ch)
M
e
r
h
a
b
a
Yukaridaki örnek for döngüsünün en basit halini gösteriyor. for anahtar
kelimesinden sonra bir degisken tanimliyoruz. Daha sonra in anahtar
kelimesini kullanip bir str degeri veriyoruz. Yukaridaki örnekte bu s
degiskenindeki str degeridir. Döngünün içinde bir satirlik print(ch) islemi
var. ch degiskeni s degiskenindeki her bir elemani temsil ediyor.
"Merhaba" str degerinin 7 elemani oldugu için döngünün içindeki
print(ch) fonksiyonu 7 defa farkli ch degerleri için çalisir. ch
degiskeninin degeri sirasiyla "M" , "e" , "r" , "h" , "a" , "b" ,
"a" olacaktir.
Asagidaki örnekte gösterilen seslileri_say fonksiyonu verilen str
degerinin içindeki sesli harflerin sayisini geri veriyor.
def seslileri_say(s):
sayac = 0
for ch in s:
if ch in "aeıioöuüAEIIOÖUÜ":
sayac = sayac + 1
return sayac
Bu fonksiyon "Merhaba" _str_degerindeki sesli harfleri bulup, yani "e", "a"
ve tekrar "a", sayisini veriyor.
>>> seslileri_say(s)
3
Akümülatör Degiskenler
Yukaridaki örnekte kulandigimiz sayac degiskenine programlamada
akümülatör denir. Akümülatör degiskenler istenilen degerleri toplamak için
kullanilir. Yukaridaki örnekte her sesli harf bulundugunda akümülatör bir
artiriliyor ve sonunda fonksiyon bu degeri geri veriyor.
Akümülatörlerin önemli bir özelligi de her zaman bir baslangiç degerinin
olmasidir. Yukaridaki örnekte sayac akümülatör degiskeninin baslangiç
degeri sifirdir.
Akümülatör degiskenler bildigimiz siradan degiskenlerdir. Sadece bizim bu
degiskene üstledigimiz görevinden dolayi özel bir isim almistir. Degiskenin
isminin sayac olmasinin özel bir nedeni yoktur. Degiskenin ismi
sesli_toplam gibi bir isim de olabilirdi.
Akümülatör degiskenler sadece sayaç olarak kullanilmak zorunda degildir.
Ayni sekilde bu degiskeni istenilen olaylari biriktirmek için de kullanabiliriz.
Mesela yukaridaki örnek verilen str degerinin sesli harflerinin sayisini veriyor.
Simdi buna benzer bir fonksiyon daha yazalim. Bu sefer fonksiyon verilen str
degerindeki sadece sesli harfleri geri versin.
def seslileri_ver(s):
sesliler = ''
for ch in s:
if ch in "aeıioöuüAEIIOÖUÜ":
sesliler = sesliler + ch
return sesliler
Akümülatörümüz sesliler degiskeni ve baslangiç deger bos bir str. Her
sesli harf bulundugunda degiskene bulunan sesli harf, yani ch degiskeninde
eger bir sesli harf varsa, ekleniyor.
>>> seslileri_ver("Merhaba")
'eaa'
>>> seslileri_ver("Programlak çok güzel")
'oaaoüe'
Asagida verilen örnek ögrendigimiz for döngüsünü ve akümülatör degisken
olgusunu kullanarak verilen bir amino asit dizisindeki yine verilen belli amino
asitleri seçiyor ve diger amino asitleri çikartarak yeni bir dizi olusturuyor.
def amino_asit_sec(fasta, aas):
yeni_fasta = ''
for amino_asit in fasta:
if amino_asit in aas:
yeni_fasta = yeni_fasta + amino_asit
return yeni_fasta
Amino asit dizisi asagidaki gibi verilsin.
fasta = "IKDLLVSSSTDLDTTLVLVNAIYFKGMWKTAFNAEDTREMP"
fasta degiskeninin her bir elemani bir amino asiti temsil ediyor. Asagidaki
örnekte dizideki sadece A, D, V ve K amino asitlerini kullanarak yeni bir dizi
temsili olusturabiliriz.
>>> amino_asit_sec(fasta, "ADVK")
'KDVDDVVAKKAAD'
while Döngüsü
Geçen ders for döngüsü ile bir str degerinin elemanlariyla islem yapmayi
ögrendik. Döngüler sadece str degerlerinin karakterlerini teker teker islemek
için degil, farkli islevleri yerine getirmek için de kullanilir. Bu ders while ile
kurulan döngüleri görecegiz.
while döngüsüne geçmeden önce if yapisinin en basit haline tekrar kisa bir
göz atalim.
if <kosul>:
<kosul saglanirsa çalistirilacak kisim>
if anahtar kelimesi her zaman bir kosul ile beraber kullanilir. Eger verilen kosul
saglanirsa if'in altinda ayni sütünda verilen satirlarin hepsi çalistirilir. Daha
dogrusu kosul saglanirsa if'in altinda ayni sütünda verilen satirlarin hepsi bir
defa çalistirilir.
Simdi while döngüsünün yapisina bakalim.
while <kosul>:
<kosul saglandigi sürece tekrar çalistirilacak kisim>
while döngüsü if yapisina çok benzer. if ile kosul saglanirsa bir defa
çalistirilir, while ile kosul saglandigi sürece çalistirilir.
Mesela num degiskeni asagidaki gibi verilsin.
num = 2
num degiskeninin degeri 100 den küçük oldugu sürece num degiskeninin
degerini ikiye katlayan program asagidaki gibidir.
while num < 100:
num = num * 2
print(num)
Programin tamami asagida tekrar verilmistir.
>>> num = 2
>>> while num < 100:
num = num * 2
print(num)
4
8
16
32
64
128
num degiskeninin ilk degeri 2 oldugundan while döngüsü ilk olarak
2 < 100 kosuluna bakar. Iki, yüzden küçük oldugu için altinda verilen ayni
sütundaki num = num * 2 ve print(num) satirlari çalistirilir. Daha
sonra kosul tekrar kontrol edilir. num degiskeninde bu sefer 4 degeri var.
4 < 100 oldugundan ayni iki satir tekrar çalistirilir ve num degiskeni
tekrar degismis olur. Bu döngü num 128 olana kadar devam eder.
128 < 100 kosulunun degeri False oldugundan döngüye tekrar
baslanmaz ve program akisina döngüye girmeden devam eder.
Alistirma: Eger num degiskeni ilk basta 10 olsaydi while döngüsü kaç defa
çalisirdi ve sonunda num degiskenin deger ne olurdu?
Alistirma: Eger num degiskeni ilk basta 100 olsaydi ne olurdu?
s degiskeni asagidaki gibi verilsin.
s = "Merhaba"
Daha önce gördügümüz for döngüsü ile str degerinin elemanlarini yazdiran
programi hatirlayalim.
for ch in s:
print(ch)
Bu program s 'nin harflerini her satirda bir harf olacak sekilde yaziyordu degil
mi? Simdi ayni islemi while döngüsü kullanarak yazalim. Bu sefer indeksi
saymak için bir degisken kullanmamiz gerekiyor.
i = 0
i degiskenini indeks olarak kullanacagiz.
while i < len(s):
print(s[i])
i = i + 1
len(s) ifadesi s degiskenindeki str degerinin uzunlugunu veriyor. i
indeks olarak kullaniliyor. Yukaridaki döngü buna göre i degiskeni
"Merhaba" degerinin uzunlugu olan 7 degerine kadar i = i + 1
ifadesinden dolayi birer birer artiriliyor.
while döngülerindeki kosul ifadesinin iyi tanimlanmasi çok önemlidir. Buna bir
örnek olarak asagidaki programa bakalim.
s = "Merhaba"
i = 0
while not (s[i] in "aeıioöuüAEIIOÖUÜ"):
print(s[i])
i = i + 1
Bu program s degerindeki ilk sesli harfi bulana geçen harfleri alt alta
yaziyor. Yani sadece "M" harfini yazacak ve döngüden çikacaktir çünkü
"M"'den sonra "e" sesli harfi geldiginden döngüye tekrar girmeyecektir.
Simdi ayni programi s = "xyz" için çalistiralim.
>>> s = "xyz"
>>> while not (s[i] in "aeıioöuüAEIIOÖUÜ"):
print(s[i])
i = i + 1
x
y
z
Traceback (most recent call last):
File "<pyshell#121>", line 1, in <module>
while not (s[i] in "aeıioöuüAEIIOÖUÜ"):
IndexError: string index out of range
Program "z" harfinden sonra hata veriyor. Neden? Çünkü i indeksinin
deger bir bir artirildigindan dolay i 'nin 3 degeri için s[3] olur. s[3]
ise tanimsizdir çünkü s degiskenindeki en son harfin indeksi 2 dir.
0
1
2
x
y
z
Yukaridaki örnegin dogru çalismasi için while döngüsüne ikinci bir kosul
eklememiz lazim. Bu kosul indeksin str degirinin uzunlugandan fazla
olmamasini garantilemesi için olacak.
while i < len(s) and not (s[i] in "aeıioöuüAEIIOÖUÜ"):
print(s[i])
i = i + 1
Artik program istenilen sekilde çalisiyor.
Alistirma: Yukarida i < len(s) karsilastirmasi ilk karsilastirma olarak
verilmis. Eger ikinci karsilastirma olarak, yani tüm kosul
not (s[i] in "aeıioöuüAEIIOÖUÜ") and i < len(s) seklinde
verilseydi ne olurdu?
while döngüsü için bir baska örnek daha verelim. soru_sor fonksiyonu
kullanicidan "evet" veya "hayir" cevabini alana kadar ayni soruyu sorsun.
def soru_sor(soru):
cevap = input(soru)
while not (cevap == "evet" or cevap == "hayir"):
cevap = input(soru)
return cevap
Ilk önce input fonksiyonu ile kullanicidan bir cevap aliyor. Eger cevap
"evet" veya "hayir" disinda bir deger ise döngüye giriyor ve ayni soruyu tekrar
soruyor. cevap degiskenindeki deger "evet" veya "hayir" disinda bir deger
oldugu sürece döngüden çikmiyor. Eger deger "evet" veya "hayir" oldugunda
program akisina devam ediyor ve return cevap ifadesinden dolayi
fonksiyon girilen cevabi, yani "evet" veya "hayir" degerini veriyor.
>>> soru_sor("Yoruldunuz mu? ")
Yoruldunuz mu? biraz
Yoruldunuz mu? olabilir
Yoruldunuz mu? evet
'evet'