Python’da Döngüler (loops)
3.3 range() Fonksiyonu
Bir önceki bölümde range() fonksiyonuna kısaca de˘ginmi¸s, konunun ayrıntısını bu bölüme bırakmı¸stık. ˙I¸ste ¸simdi burange() fonksiyonunun ne i¸se yaradı˘gını, ne tür özellikleri oldu˘gunu görece˘giz.
“range” kelimesi Türkçe’de “aralık” anlamına gelir. Adından da anla¸sılaca˘gı gibi, bu fonksiyon yardımıyla belli bir aralıktaki sayılar üzerinde i¸slem yapabilece˘giz. Bu fonksiyonla birkaç örnek yaparak i¸se ba¸slayalım. Mesela ¸su örne˘ge bakalım (Bu örne˘gi etkile¸simli kabukta yazabiliriz):
>>> range(10)
Bu komutu verdi˘gimizde ¸söyle bir çıktı alırız:
range(0, 10)
Buradan anladı˘gımıza göre, “range(10)” komutu, içerisinde 0’dan 10’a kadar olan sayıları barındırıyor (10 sayısı hariç). Bu sayıları listelemek için ¸söyle bir komut vermemiz gerekir:
>>> list(range(10))
Burada, list() adlı yeni bir fonksiyon daha görüyoruz. Bu fonksiyonu bu derste incelemeye-ce˘giz. list() fonksiyonu daha sonraki bir dersimizin konusu olacak. Biz ¸simdilik bu fonksiy-onun, “listeleme” görevi gördü˘günü bilelim. list() fonksiyonunun buradaki görevi, range() fonksiyonu içindeki sayıları listelemektir. Yukarıdaki komutu i¸sletti˘gimizde ¸söyle bir çıktı ala-ca˘gız:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Böylecerange() fonksiyonu yardımıyla, 0’dan 10’a kadar olan sayıları listelemi¸s olduk. Burada 10 sayısının listede yer almadı˘gına dikkat edin. Ayrıca, yukarıdaki komutu etkile¸simli kabukta yazdı˘gımız için ba¸sa print() komutunu eklemek zorunda kalmadık. Ama e˘ger bu kodları bir dosya içine yazıp kaydetmi¸s olsaydık, ba¸sa mutlakaprint() fonksiyonunu eklememiz gereke-cekti:
print(list(range(10)))
Burada, açtı˘gımız bütün parantezleri satır sonunda kapatmayı unutmuyoruz... E˘ger bütün parantezleri kapatmazsak programımız hata verecektir...
range() fonksiyonu bazı ba¸ska güzellikler de sunar bize. Mesela bu fonksiyonu kullanırken mutlaka 0’dan ba¸slamak gibi bir mecburiyetimiz yoktur. Örne˘gin ¸söyle bir ¸sey yazabiliriz:
>>> list(range(1, 11))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Gördü˘günüz gibi, yukarıdaki komut yardımıyla 1’den 10’a kadar olan sayıları yazdırabildik. Bu-rada,range() fonksiyonunun saymaya kaçtan ba¸slayaca˘gını nasıl belirledi˘gimize dikkat edin.
E˘ger 2’den 10’a kadar olan bütün sayıları listelemek isteseydik ¸söyle bir ¸sey yazacaktık:
>>> list(range(2, 11))
range() fonksiyonunun yetenekleri bunlarla sınırlı de˘gildir. Bu fonksiyon yardımıyla yazdırdı˘gımız sayılar birer birer artmak zorunda da de˘gildir. Yani illa “1, 2, 3, 4...” ¸seklinde ilerlemek zorunda de˘giliz. ˙Istersek “0, 2, 4, 6...” ¸seklinde de ilerleyebiliriz:
>>> list(range(0, 10, 2))
Burada bir nokta dikkatinizi çekmi¸s olmalı. Yukarıdaki kodda ba¸slangıç sayısı olan 0’ı da belirt-tik. Normalde, e˘ger saymaya sıfırdan ba¸slayacaksak, “0” sayısını ayrıca belirtmemize gerek yoktur. Ama yukarıdaki örnekte, yapmak istedi˘gimiz ¸seyi gerçekle¸stirebilmek için parantez içinde üç adet sayı belirtmemiz gerekiyor. Çünkü range() fonksiyonunun formülü ¸su ¸ sek-ildedir:
range(ba¸slangıç_de˘geri, biti¸s_de˘geri, atlama_de˘geri)
Burada “ba¸slangıç_de˘geri” olarak belirtti˘gimiz yere, saymaya kaçtan ba¸slayaca˘gımızı yazıy-oruz. “biti¸s_de˘geri”ne sayma i¸sleminin hangi sayıya kadar devam edece˘gini yazaca˘gız.
“atlama_de˘geri” ¸seklinde gösterdi˘gimiz ifadeye ise, range() fonksiyonunun, ba¸slangıç de˘gerinden biti¸s de˘gerine kadar olan sayıları sıralarken kaçar kaçar atlaması gerekti˘gini yaz-mamız gerekiyor. range() fonksiyonunda “ba¸slangıç_de˘geri”nin varsayılan bir de˘geri vardır.
Bu de˘ger 0’dır. Yani e˘ger range() fonksiyonunu kullanarak 100’e kadar sayacaksanız ve
“list(range(100))” gibi bir kod yazmı¸ssanız, Python sizin 0’dan ba¸slamak istedi˘ginizi varsay-acaktır. “biti¸s_de˘geri”nin varsayılan bir de˘geri yoktur. Bunu bizim belirlememiz gerekir. “at-lama_de˘geri”nin varsayılan de˘geri ise “1”dir. Yani e˘ger herhangi bir atlama de˘geri belirtmezs-eniz, Python sizin birer birer saymak istedi˘ginizi varsayacaktır. Dolayısıyla, “list(range(100))”
gibi bir kod yazdı˘gımızda Python bunu alttan alta ¸su ¸sekilde görecektir:
>>> list(range(0, 100, 1))
E˘ger 0’dan 100’e kadar olan sayıları iki¸ser iki¸ser atlayarak listelemek istiyorsanız ve bu is-te˘ginizi ¸su ¸sekilde belirtirseniz Python’un kafasının karı¸smasına yol açarsınız:
>>> list(range(100, 2))
Burada Python sizin ne yapmaya çalı¸stı˘gınızı anlayamaz. Parantez içinde ilk de˘ger olarak
“100”, ikinci de˘ger olarak ise 2 yazdı˘gınız için, Python bu 100 sayısını ba¸slangıç de˘geri; 2 sayısını ise biti¸s de˘geri olarak algılayacaktır. Dolayısıyla da Python bu durumda sizin 100’den 2’ye kadar olan sayıları listelemek istedi˘ginizi zannedecek,range() fonksiyonuyla bu ¸sekilde geriye do˘gru sayamayaca˘gımız için de bo¸s bir çıktı verecektir... Bu yüzden, Python’un ¸sa¸ sır-maması için yukarıdaki örne˘gi ¸su ¸sekilde yazmalıyız:
>>> list(range(0, 100, 2))
Kısacası, e˘gerrange() fonksiyonunun kaçar kaçar sayaca˘gını da belirtmek istiyorsak, parantez içine, gerekli bütün sayıları yazmalıyız...
Bu arada, “range(100, 2)” gibi bir ifade yazarak sayıları geriye do˘gru listeleyemeyecek olmamız, hiç bir ¸sekilde geriye do˘gru sayamayaca˘gımız anlamına gelmiyor. Elbette “at-lama_de˘geri” parametresine eksi de˘gerli bir sayı vererekrange() fonksiyonunun geriye do˘gru saymasını da sa˘glayabiliriz:
>>> list(range(100, 2, -1))
Hatta istersekrange() fonksiyonunun geriye do˘gru kaçar kaçar sayaca˘gını da belirtebiliriz:
>>> list(range(100, 2, -2))
...gibi...
Sanırım tekrar hatırlatmaya gerek yok. Yukarıdaki kodları e˘ger bir dosyaya yazıp çalı¸ stıra-caksanız, ba¸slarınaprint() fonksiyonunu da eklemeniz gerekir. Dolayısıyla yukarıda en son verdi˘gimiz örnek bir dosya içinde ¸söyle görünecektir:
print(list(range(0, 100, 2)))
Gördü˘günüz gibi, bir sürü parantez i¸sareti oldu kodlarımız içinde. Esasında yukarıda yap-tı˘gımız i¸slemleri yapabilmek için farklı bir yol da izleyebiliriz. range() fonksiyonunu yukarıdaki
¸
sekillerde kullanmak yerine, bunu birfor döngüsü içine de alabiliriz:
for i in range(0, 100, 2):
print(i)
Ayrıcarange() fonksiyonunu bir for döngüsü içine aldı˘gımızda,range() fonksiyonunun üret-ti˘gi sayılarla bazı yararlı i¸sler de yapabiliriz. Örne˘gin ¸suna bir bakın:
for çarp in range(10):
print(çarp * 2)
Bu kodları çalı¸stırdı˘gımızda ¸söyle bir çıktı elde ederiz:
0 2 4 6 8 10 12 14 16 18
Burada Python’un yaptı˘gı ¸sey, 0’dan 10’a kadar olan bütün sayıları tek tek 2 ile çarpmak oldu...
Ayrıcarange() fonksiyonunu “for” döngüsü içinde kullandı˘gımızdalist() fonksiyonunu kul-lanmamıza gerek kalmadı˘gına da dikkat edin.
for döngüsünü ve range() fonksiyonunu if deyimi ile birlikte kullanarak ¸söyle bir ¸sey da yapabiliriz:
for çift_sayılar in range(10):
if çift_sayılar % 2 == 0:
print(çift_sayılar)
Burada gerçekle¸sen süreci kabaca ¸söyle ifade edebiliriz:
0’dan 10’a kadar olan bütün sayıları tek tek tara ve bunların her birini “çift_sayılar” olarak adlandır. E˘ger çift_sayılar olarak adlandırdı˘gımız bu sayılar içinde 2’ye tam bölünen sayılar varsa bunları ekrana yazdır...
“%” i¸slecinin ne i¸se yaradı˘gını daha önceki derslerimizden hatırlıyorsunuz....
BÖLÜM
4
Listeler
4.1 Giri¸ s
Bu bölümde yine Python’un çok önemli bir ö˘gesinden bahsedece˘giz. Bu dersimizin konusu
“Python’da Listeler”.
Aslında bizrange() fonksiyonunu incelerken, ucundan da olsa listeleri görmü¸stük. Mesela ¸su örne˘gi hatırlıyorsunuz:
list(range(10))
Bu komut ¸söyle bir çıktı veriyordu:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
˙I¸ste yukarıda gördü˘gümüz bu çıktı aslında bir “liste”dir... Teknik bir dille ifade etmek gerekirse,
“listeler” Python’daki “veri tipleri”nden (data types) yalnızca bir tanesidir. Simdiye kadar¸ gördü˘gümüz veri tipleri arasında “sayılar” ve “karakter dizileri” vardı... Dolayısıyla, “sayılar”,
“karakter dizileri” ve “listeler” Python’da “veri tipi” adı verilen bir grubun üyesidir. Bu teknik terimleri elbette ezberlemek zorunda de˘gilsiniz. Ama bilmenin zararını de˘gil faydasını görürsünüz.
Python’da “listeler” konusuna kısa bir giri¸s yaptı˘gımıza göre artık yava¸s yava¸s ayrıntılara inm-eye ba¸slayabiliriz.