Python (4. Bölüm)

Pardus-Linux.org | Wiki sitesinden

Git ve: kullan, ara

Forum'da bu konunun tartışma adresi: http://forum.pardus-linux.org/viewtopic.php?t=10478&highlight=


Konu başlıkları

Python'da Döngüler

Bir önceki bölümün sonunda hatırlarsanız basit bir hesap makinesi yapmıştık. Ancak dikkat ettiyseniz, o hesap makinesi programında toplama, çıkarma, çarpma veya bölme işlemlerinden birini seçip, daha sonra o seçtiğimiz işlemi bitirdiğimizde program kapanıyor, başka bir işlem yapmak istediğimizde ise programı yeniden başlatmamız gerekiyordu... Aynı şekilde kullanıcı adı ve parola soran bir program yazsak, şu anki bilgilerimizle her defasında programı yeniden başlatmak zorunda kalırız. Yani kullanıcı adı ve şifre yanlış girildiğinde bu kullanıcı adı ve şifreyi tekrar tekrar soramayız; programı yeniden başlatmamız gerekir... İşte bu bölümde Python'da yazdığımız kodları sürekli hale getirmeyi, tekrar tekrar döndürmeyi öğreneceğiz.

Kodlarımızı "sürekli döndürmemizi" sağlamada bize yardımcı olacak parçacıklara Python'da "döngü" (İngilizce: Loop) adı veriliyor... Bu bölümde iki tane döngüden bahsedeceğiz: "while" ve "for" döngüleri. Ayrıca bu bölümde döngüler dışında "break" ve "continue" ifadeleri ile range() ve len() fonksiyonlarına da değineceğiz.

while döngüsü

While döngüsü, yukarıda verilen tanıma tam olarak uyar. Yani yazdığımız bir programdaki kodların tamamı işletilince programın kapanmasına engel olur ve kod dizisinin en başa dönmesini sağlar. Şu küçücük örneği bir inceleyelim bakalım:

#!/usr/bin/ env python
#-*- coding: latin-1 -*-
a = 0
a = a + 1
print a

Bu minicik kodun yaptığı iş, birinci satırda "a" değişkeninin değerine bakıp ikinci satırda bu değere 1 eklemek, üçüncü satırda da bu yeni değeri ekrana yazdırmaktır.. Dolayısıyla bu kod parçasının vereceği çıktı da, "1" olacaktır. Bu çıktıyı verdikten sonra ise program sona erdirilecektir. Şimdi bu koda bazı eklemeler yapalım:

#!/usr/bin/env python
#-*- coding: latin-1 -*-
a=0
while a < 100:
        a = a + 1
        print a 

Bu kodu çalıştırdığımızda, 1'den 100'e kadar olan sayıların ekrana yazdırıldığını görürüz.

Konuyu anlayabilmek için şimdi de satırları teker teker inceleyelim:

ilk satırda, "0" değerine sahip bir "a" değişkeni tanımladık.
ikinci ve üçüncü satırlarda, "a değişkeninin değeri 100 sayısından küçük olduğu müddetçe a değişkeninin değerine 1 ekle," cümlesini Python'caya çevirdik.
son satırda ise, bu yeni a değerini ekrana yazdırdık.

İşte bu noktada "while döngüsünün" faziletlerini görüyoruz. Bu döngü sayesinde programımız son satıra her gelişinde başa dönüyor. Yani:

a değişkeninin değerini kontrol ediyor
a'nın 0 olduğunu görüyor
a değerinin 100'den küçük olduğunu idrak ediyor
a değerine 1 ekliyor (0 + 1 = 1)
Bu değeri ekrana yazdırıyor (1)
Başa dönüp tekrar a değişkeninin değerini kontrol ediyor
a'nın şu anda 1 olduğunu görüyor
a değerinin hâlâ 100'den küçük olduğunu anlıyor
a değerine 1 ekliyor (1 + 1 = 2)
Bu değeri ekrana yazdırıyor (2)
Bu işlemi 99 sayısına ulaşana dek tekrarlıyor ve en sonunda bu sayıya da 1 ekleyerek vuslata eriyor...

Burada ilerleyebilmek için ihtiyacımız olacak bazı işlem yardımcılarına veya başka bir ifadeyle işleçlere (operators) değinelim:

Şimdiye kadar aslında bu işleçlerden birkaç tanesini gördük. Mesela:

+ 	işleci, toplama işlemi yapmamızı sağlıyor
- 	 işleci, çıkarma işlemi yapmamızı sağlıyor
/ 	 işleci, bölme işlemi yapmamızı sağlıyor
* 	işleci, çarpma işlemi yapmamızı sağlıyor
>      işleci, "büyüktür" anlamına geliyor
<      işleci, "küçüktür" anlamına geliyor

Bir de henüz görmediklerimiz, ama bilmemiz gerekenler var:

>= 	işleci, "büyük eşittir" anlamına geliyor
<= 	işleci, "küçük eşittir" anlamına geliyor
!= 	 işleci, "eşit değildir" anlamına geliyor (örn. "2 * 2 != 5")
and     işleci, "ve" anlamına geliyor
or 	  işleci, "veya" anlamına geliyor
True 	işleci, "Doğru" anlamına geliyor
False	işleci, "Yanlış" anlamına geliyor

Bu işleçleri şu anda ezberlemenize gerek yok. Bunlar yalnızca size kılavuz olsun diye veriliyor... Yeri geldikçe bunları kullanacağımız için muhakkak aklınıza yerleşeceklerdir...

Şimdi konumuza geri dönebiliriz:

Bu konunun başında, bir önceki bölümde yazdığımız hesap makinesi programına değinmiştik. Şimdi bu programı görelim tekrar:

#!/usr/bin/env python
#-*- coding:latin-1 -*-

from __future__ import division

secenek1 = "(1) toplama"
secenek2 = "(2) çıkarma"
secenek3 = "(3) çarpma"
secenek4 = "(4) bölme"

print secenek1
print secenek2 
print secenek3
print secenek4


soru = raw_input("Lütfen yapmak istediğiniz işlemin numarasını girin: ")

if soru == "1":
	sayi1 = input("Lütfen toplama işlemi için ilk sayıyı girin: ")
	print sayi1
	sayi2 = input("Lütfen toplama işlemi için ikinci sayıyı girin: ")
	print sayi1, "+", sayi2,":", sayi1 + sayi2

if soru == "2":
	sayi3 = input("Lütfen çıkarma işlemi için ilk sayıyı girin: ")
	print sayi3
	sayi4 = input("Lütfen çıkarma işlemi için ikinci sayıyı girin: ")
	print sayi3, "-", sayi4,":", sayi3 - sayi4

if soru == "3":
	sayi5 = input("Lütfen çarpma işlemi için ilk sayıyı girin: ")
	print sayi5
	sayi6 = input("Lütfen çarpma işlemi için ikinci sayıyı girin: ")
	print sayi5, "x", sayi6,":", sayi5 * sayi6

if soru == "4":
	sayi7 = input("Lütfen bölme işlemi için ilk sayıyı girin: ")
	print sayi7
	sayi8 = input("Lütfen bölme işlemi için ikinci sayıyı girin: ")
	print sayi7, "/", sayi8,":", sayi7 / sayi8

Dediğimiz gibi, program bu haliyle her defasında yalnızca bir kez işlem yapmaya izin verecektir. Yani mesela toplama işlemi bittikten sonra program sona erecektir. Ama eğer biz bu programda şu ufacık değişikliği yaparsak işler değişir:

#!/usr/bin/env python
#-*- coding:latin-1 -*-

from __future__ import division

while True:
	
	secenek1 = "(1) toplama"
	secenek2 = "(2) çıkarma"
	secenek3 = "(3) çarpma"
	secenek4 = "(4) bölme"

	print secenek1
	print secenek2 
	print secenek3
	print secenek4

	soru = raw_input("Lütfen yapmak istediğiniz işlemin numarasını girin: ")	

	if soru == "1":
                sayi1 = input("Lütfen toplama işlemi için ilk sayıyı girin: ")
		print sayi1
		sayi2 = input("Lütfen toplama işlemi için ikinci sayıyı girin: ")
		print sayi1, "+", sayi2,":", sayi1 + sayi2
	
	if soru == "2":
		sayi3 = input("Lütfen çıkarma işlemi için ilk sayıyı girin: ")
		print sayi3
		sayi4 = input("Lütfen çıkarma işlemi için ikinci sayıyı girin: ")
		print sayi3, "-", sayi4,":", sayi3 - sayi4
	
	if soru == "3":
		sayi5 = input("Lütfen çarpma işlemi için ilk sayıyı girin: ")
		print sayi5
		sayi6 = input("Lütfen çarpma işlemi için ikinci sayıyı girin: ")
		print sayi5, "x", sayi6,":", sayi5 * sayi6
	
	if soru == "4":
		sayi7 = input("Lütfen bölme işlemi için ilk sayıyı girin: ")
		print sayi7
		sayi8 = input("Lütfen bölme işlemi için ikinci sayıyı girin: ")
		print sayi7, "/", sayi8,":", sayi7 / sayi8

Burada şu değişiklikleri yaptık:

İlk önce from __future__ import division satırı ile secenek1 = "(1) toplama" satırı arasına

while True:

ifadesini ekledik... Bu sayede programımıza şu komutu vermiş olduk:

"Doğru olduğu müddetçe aşağıdaki komutları çalıştırmaya devam et..."

Zira yukarıda verdiğimiz "işleç" tablosundan da hatırlayacağınız gibi "True" ifadesi "doğru" anlamına geliyor...

Peki ne doğru olduğu müddetçe? Neyin doğru olduğunu açıkça belirtmediğimiz için Python burada "her şeyi doğru" kabul ediyor... Yani bir nevi, "aksi belirtilmediği sürece aşağıdaki komutları çalıştırmaya devam et!" emrini yerine getiriyor.

İkinci değişiklik ise "while True:" ifadesinin altında kalan bütün satırları bir seviye sağa kaydırmak oldu... Eğer kwrite kullanıyorsanız, kaydıracağınız bölümü seçtikten sonra CTRL + i tuşlarına basarak bu kaydırma işlemini kolayca yapabilirsiniz. Bir seviye sola kaydırmak için ise CTRL + SHIFT + i tuşlarını kullanıyoruz.

Şu örneğe bir bakalım:

#!/usr/bin/env python
#-*- coding: latin-1 -*-
soru = raw_input("Arkadaşım sen deli misin?")
while soru != "hayır":
	print "delisin sen deli! Kulakları küpeli!"

Dikkat ederseniz burada da işleçlerimizden birini kullandık. Kullandığımız işleç "eşit değildir" anlamına gelen "!=" işleci...

Bu programı çalıştırdığımızda sorulan soruya "hayır" cevabı vermezsek, program biz müdahale edene kadar ekrana "delisin sen deli! Kulakları küpeli" çıktısını vermeye devam edecektir... Çünkü biz Python'a şu komutu vermiş olduk bu kodla:

"Soru değişkeninin cevabı "hayır" olmadığı müddetçe ekrana "delisin sen deli! Kulakları küpeli" çıktısını vermeye devam et."

Eğer bu programı durdurmak istiyorsak CTRL+C'ye basmamız gerekir...

Aynı kodları bir de şu şekilde denerseniz "if" ile "while" arasındaki fark bariz bir biçimde ortaya çıkacaktır:

#!/usr/bin/env python
#-*- coding: latin-1 -*-
soru = raw_input("Arkadaşım sen deli misin?")
if soru != "hayır":
	print "delisin sen deli! Kulakları küpeli!"

Şimdilik while döngüsüne ara verip bu konuda incelememiz gereken ikinci döngümüze geçiyoruz.

for döngüsü

Bir önceki konuda while döngülerini anlatırken yazdığımız şu kodu hatırlıyorsunuz:

#!/usr/bin/env python
#-*- coding: latin-1 -*-
a=0
while a < 100:
        a = a + 1
        print a 

Bu kod yardımıyla ekrana 1'den 100'e kadar olan sayıları yazdırabiliyorduk. Aynı işlemi daha basit bir şekilde for döngüsü yardımıyla da yapabiliriz:

#!/usr/bin/env python
#-*- coding: latin-1 -*-
for zombi in range(1, 100):
        print zombi

Ben burada değişken adı olarak zombi kelimesini kullandım, siz isterseniz Osman da diyebilirsiniz...

Yukarıdaki Pythonca kod Türkçe'de aşağı yukarı şu anlama gelir:

"1, 100 aralığındaki sayılara zombi adını verdikten sonra ekrana zombi'nin değerini yazdır."

for döngüsüyle ilgili şu örneğe de bir bakalım:

#!/usr/bin/env python
#-*- coding: latin-1 -*-
for kelimeler in "linux":
        print kelimeler

Gördüğünüz gibi, for döngüsüyle yalnızca sayıları değil, karakter dizilerinin öğelerini de dökebiliyoruz ekrana.

Böylelikle Python'da while ve for döngülerini de öğrenmiş olduk. Bu arada dikkat ettiyseniz, for döngüsü için verdiğimiz ilk örnekte döngü içinde yeni bir fonksiyon kullandık. İsterseniz bu vesileyle biraz da hem döngülerde hem koşullu ifadelerde hem de başka yerlerde karşımıza çıkabilecek faydalı fonksiyonlara ve ifadelere değinelim:

range() fonksiyonu

Bu fonksiyon Python'da sayı aralıklarını belirtmemizi sağlar. Zaten İngilizce'de de bu kelime "aralık" anlamına gelir. Mesela:

print range(100)

komutu 0 ile 100 arasındaki sayıları yazdırmamızı sağlar. Başka bir örnek daha verelim:

print range(100,200)

komutu 100 ile 200 arasındaki sayıları döker.

Bir örnek daha:

print range(1,100,2)

Bu komut ise 1 ile 100 arasındaki sayıları 2'şer 2'şer atlayarak yazdırmamızı sağlar...

Hemen for döngüsüyle range fonksiyonunun birlikte kullanıldığı bir örnek verip başka bir fonksiyonu anlatmaya başlayalım:

#!/usr/bin/env python
#-*- coding: latin-1 -*-
for sarki in range (1, 15):
	print sarki, "mumdur"

len() fonksiyonu

Bu fonksiyon, karakter dizilerinin uzunluğunu gösterir. Mesela:

#!/usr/bin/env python
#-*- coding: latin-1 -*-
a = "Afyonkarahisar"
print len(a)

Bu kod, "Afyonkarahisar" karakter dizisi içindeki harflerin sayısını ekrana dökecektir.

Bu fonksiyonu nerelerde kullanabiliriz? Mesela yazdığınız bir programa kullanıcıların giriş yapabilmesi için şifre belirlemelerini istiyorsunuz. Seçilecek şifrelerin uzunluğunu sınırlamak istiyorsanız bu fonksiyondan yararlanabilirsiniz. Hemen örnek bir kod yazalım:

#!/usr/bin/env python
#-*- coding: latin-1 -*-
a=raw_input("Lütfen bir şifre belirleyin: ")
if len(a) >= 6:
        print "Seçtiğiniz şifre en fazla 5 karakterden oluşabilir!"
else:
        print "Şifreniz etkinleştirilmiştir."

break ifadesi

break ifadesi program içinde bir noktada programı sona erdirmek gerektiği zaman kullanılır. Aşağıdaki örnek break ifadesinin ne işe yaradığını açıkça gösteriyor:

#!/usr/bin/env python
#-*- coding:latin-1 -*-

kullanici_adi = "kullanici"
parola = "sifre"
while True:
	soru1 = raw_input("Kullanıcı adı: ")
	soru2 = raw_input("Şifre: ")
	if soru1 == kullanici_adi and soru2 == parola:
		print "Kullanıcı adı ve şifreniz onaylandı. Programa hoşgeldiniz!"
		break
	else:
		print "Kullanıcı adınız veya şifrenizden en az birisi onaylanmadı. Lütfen tekrar deneyiniz!"

Bu programda break ifadesi yardımıyla, kullanıcı adı ve şifre doğru girildiğinde şifre sorma işleminin durdurulması sağlanıyor. Yukarıdaki kodlar arasında, dikkat ederseniz, daha önce bahsettiğimiz işleçlerden birini daha kullandık. Kullandığımız bu işleç, "ve" anlamına gelen "and" işleci. Bu işlecin geçtiği satıra tekrar bakalım:

if soru1 == kullanici_adi and soru2 == parola:
        print "Kullanıcı adı ve şifreniz onaylandı. Programa hoşgeldiniz!"

Burada şu Türkçe ifadeyi Python'caya çevirmiş olduk:

"Eğer soru1 değişkeninin değeri kullanici_ad değişkeniyle aynı ve soru2 değişkeninin değeri parola değişkeniyle aynı ise ekrana 'Kullanıcı adı ve şifreniz onaylandı. Programa hoşgeldiniz,' cümlesini yazdır..."
Burada dikkat edilmesi gereken nokta şu: and işlecinin birbirine bağladığı soru1 ve soru2 değişkenlerinin ancak ikisi birden doğruysa o bahsedilen cümle ekrana yazdırılacaktır. Yani kullanıcı adı ve parola'dan biri yanlışsa "if" ifadesinin gerektirdiği koşul yerine gelmemiş olacaktır... Okulda mantık dersi almış olanlar bu "and" işlecini yakından tanıyor olmalılar... "And" işlecinin karşıtı "or" işlecidir. Bu işleç Türkçe'de "veya" anlamına gelir. Buna göre, "a veya b doğru ise" dediğiniz zaman, bu a veya b ifadelerinden birinin doğru olması yetecektir. Şayet "a ve b doğru ise" derseniz, burada hem a'nın hem de b'nin doğru olması gerekir...

continue ifadesi

Bu ifade ise döngü içinde bir bloğun es geçilip ondan sonraki bloğun çalıştırılmasını sağlar. Çok bilindik bir örnek verelim:

#!/usr/bin/env python
#-*- coding:latin-1 -*-
while True:
              	s = raw_input("Bir sayı girin: ")
		if s == "iptal":
			break
		if len(s) <= 3: 
			continue
		print "En fazla üç haneli bir sayı girebilirsiniz."

Burada eğer kullanıcı klavyede "iptal" yazarsa programdan çıkılacaktır. Bunu,

if s == "iptal":
    		break

satırıyla sağlamayı başardık.

Eğer kullanıcı tarafından girilen sayı üç haneli veya daha az haneli bir sayı ise, "continue" ifadesinin etkisiyle

print "En fazla üç haneli bir sayı girebilirsiniz."
satırı es geçilecek ve en başa dönülecektir.

Eğer kullanıcının girdiği sayıdaki hane üçten fazlaysa ekrana:

print "En fazla üç haneli bir sayı girebilirsiniz."
cümlesi yazdırılacaktır.


Önceki Bölüm: Koşula Bağlı Durumlar
Sonraki Bölüm: Listeler, Demetler, Sözlükler

Bu yazı Programlama bölümünün bir parçasıdır.